[Alba-desarrollo] SVN Alba r4311 - in prosistem/alba/trunk/dist: . symfony-0.6.3/lib/vendor symfony-1.0.0 symfony-1.0.0/data symfony-1.0.0/data/bin symfony-1.0.0/data/config symfony-1.0.0/data/data symfony-1.0.0/data/generator symfony-1.0.0/data/generator/sfPropelAdmin symfony-1.0.0/data/generator/sfPropelAdmin/default symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton/actions symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton/config symfony-1.0.0/data/generator/sfPropelAdmin/default/template symfony-1.0.0/data/generator/sfPropelAdmin/default/template/actions symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates symfony-1.0.0/data/generator/sfPropelCrud symfony-1.0.0/data/generator/sfPropelCrud/default symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/actions symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/config symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/lib symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/templates symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/validate symfony-1.0.0/data/generator/sfPropelCrud/default/template symfony-1.0.0/data/generator/sfPropelCrud/default/template/actions symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates symfony-1.0.0/data/i18n symfony-1.0.0/data/modules symfony-1.0.0/data/modules/default symfony-1.0.0/data/modules/default/actions symfony-1.0.0/data/modules/default/templates symfony-1.0.0/data/skeleton symfony-1.0.0/data/skeleton/app symfony-1.0.0/data/skeleton/app/app symfony-1.0.0/data/skeleton/app/app/config symfony-1.0.0/data/skeleton/app/app/i18n symfony-1.0.0/data/skeleton/app/app/lib symfony-1.0.0/data/skeleton/app/app/modules symfony-1.0.0/data/skeleton/app/app/templates symfony-1.0.0/data/skeleton/app/web symfony-1.0.0/data/skeleton/batch symfony-1.0.0/data/skeleton/controller symfony-1.0.0/data/skeleton/module symfony-1.0.0/data/skeleton/module/m

commits en pressenter.com.ar commits en pressenter.com.ar
Lun Feb 26 22:45:52 CET 2007


odule symfony-1.0.0/data/skeleton/module/module/actions symfony-1.0.0/data/skeleton/module/module/config symfony-1.0.0/data/skeleton/module/module/lib symfony-1.0.0/data/skeleton/module/module/templates symfony-1.0.0/data/skeleton/module/module/validate symfony-1.0.0/data/skeleton/module/test symfony-1.0.0/data/skeleton/project symfony-1.0.0/data/skeleton/project/apps symfony-1.0.0/data/skeleton/project/batch symfony-1.0.0/data/skeleton/project/cache symfony-1.0.0/data/skeleton/project/config symfony-1.0.0/data/skeleton/project/data symfony-1.0.0/data/skeleton/project/data/model symfony-1.0.0/data/skeleton/project/data/sql symfony-1.0.0/data/skeleton/project/doc symfony-1.0.0/data/skeleton/project/lib symfony-1.0.0/data/skeleton/project/lib/model symfony-1.0.0/data/skeleton/project/log symfony-1.0.0/data/skeleton/project/plugins symfony-1.0.0/data/skeleton/project/test symfony-1.0.0/data/skeleton/project/test/bootstrap symfony-1.0.0/data/skeleton/project/test/functional symfony-1.0.0/data/skeleton/project/test/unit symfony-1.0.0/data/skeleton/project/web symfony-1.0.0/data/skeleton/project/web/css symfony-1.0.0/data/skeleton/project/web/images symfony-1.0.0/data/skeleton/project/web/js symfony-1.0.0/data/skeleton/project/web/uploads symfony-1.0.0/data/skeleton/project/web/uploads/assets symfony-1.0.0/data/tasks symfony-1.0.0/data/web symfony-1.0.0/data/web/errors symfony-1.0.0/data/web/sf symfony-1.0.0/data/web/sf/calendar symfony-1.0.0/data/web/sf/calendar/lang symfony-1.0.0/data/web/sf/calendar/skins symfony-1.0.0/data/web/sf/calendar/skins/aqua symfony-1.0.0/data/web/sf/prototype symfony-1.0.0/data/web/sf/prototype/css symfony-1.0.0/data/web/sf/prototype/js symfony-1.0.0/data/web/sf/sf_admin symfony-1.0.0/data/web/sf/sf_admin/css symfony-1.0.0/data/web/sf/sf_admin/images symfony-1.0.0/data/web/sf/sf_admin/js symfony-1.0.0/data/web/sf/sf_default symfony-1.0.0/data/web/sf/sf_default/css symfony-1.0.0/data/web/sf/sf_default/images symfony-1.0.0/data/web/sf/sf_default/images/icons symfony-1.0.0/data/web/sf/sf_web_
debug symfony-1.0.0/data/web/sf/sf_web_debug/css symfony-1.0.0/data/web/sf/sf_web_debug/images symfony-1.0.0/data/web/sf/sf_web_debug/js symfony-1.0.0/doc symfony-1.0.0/lib symfony-1.0.0/lib/action symfony-1.0.0/lib/addon symfony-1.0.0/lib/addon/bridge symfony-1.0.0/lib/addon/creole symfony-1.0.0/lib/addon/creole/database symfony-1.0.0/lib/addon/creole/drivers symfony-1.0.0/lib/addon/creole/i18n symfony-1.0.0/lib/addon/creole/storage symfony-1.0.0/lib/addon/propel symfony-1.0.0/lib/addon/propel/builder symfony-1.0.0/lib/addon/propel/database symfony-1.0.0/lib/addon/propel/generator symfony-1.0.0/lib/addon/propel/validator symfony-1.0.0/lib/cache symfony-1.0.0/lib/config symfony-1.0.0/lib/controller symfony-1.0.0/lib/database symfony-1.0.0/lib/debug symfony-1.0.0/lib/exception symfony-1.0.0/lib/filter symfony-1.0.0/lib/generator symfony-1.0.0/lib/helper symfony-1.0.0/lib/i18n symfony-1.0.0/lib/i18n/Gettext symfony-1.0.0/lib/log symfony-1.0.0/lib/log/sfLogger symfony-1.0.0/lib/request symfony-1.0.0/lib/response symfony-1.0.0/lib/storage symfony-1.0.0/lib/test symfony-1.0.0/lib/user symfony-1.0.0/lib/util symfony-1.0.0/lib/validator symfony-1.0.0/lib/vendor symfony-1.0.0/lib/vendor/creole symfony-1.0.0/lib/vendor/creole/common symfony-1.0.0/lib/vendor/creole/drivers symfony-1.0.0/lib/vendor/creole/drivers/mssql symfony-1.0.0/lib/vendor/creole/drivers/mssql/metadata symfony-1.0.0/lib/vendor/creole/drivers/mysql symfony-1.0.0/lib/vendor/creole/drivers/mysql/metadata symfony-1.0.0/lib/vendor/creole/drivers/mysqli symfony-1.0.0/lib/vendor/creole/drivers/mysqli/metadata symfony-1.0.0/lib/vendor/creole/drivers/odbc symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters symfony-1.0.0/lib/vendor/creole/drivers/odbc/metadata symfony-1.0.0/lib/vendor/creole/drivers/oracle symfony-1.0.0/lib/vendor/creole/drivers/oracle/metadata symfony-1.0.0/lib/vendor/creole/drivers/pgsql symfony-1.0.0/lib/vendor/creole/drivers/pgsql/metadata symfony-1.0.0/lib/vendor/creole/drivers/sqlite symfony-1.0.0/lib/vendor/creole/drivers/sqlite/metadata
 symfony-1.0.0/lib/vendor/creole/metadata symfony-1.0.0/lib/vendor/creole/util symfony-1.0.0/lib/vendor/creole/util/sql symfony-1.0.0/lib/vendor/lime symfony-1.0.0/lib/vendor/pake symfony-1.0.0/lib/vendor/pake/tasks symfony-1.0.0/lib/vendor/patch symfony-1.0.0/lib/vendor/phing symfony-1.0.0/lib/vendor/phing/filters symfony-1.0.0/lib/vendor/phing/filters/util symfony-1.0.0/lib/vendor/phing/input symfony-1.0.0/lib/vendor/phing/lib symfony-1.0.0/lib/vendor/phing/listener symfony-1.0.0/lib/vendor/phing/mappers symfony-1.0.0/lib/vendor/phing/parser symfony-1.0.0/lib/vendor/phing/system symfony-1.0.0/lib/vendor/phing/system/io symfony-1.0.0/lib/vendor/phing/system/lang symfony-1.0.0/lib/vendor/phing/system/util symfony-1.0.0/lib/vendor/phing/tasks symfony-1.0.0/lib/vendor/phing/tasks/ext symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube symfony-1.0.0/lib/vendor/phing/tasks/ext/pearpackage symfony-1.0.0/lib/vendor/phing/tasks/ext/phpdoc symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2 symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest symfony-1.0.0/lib/vendor/phing/tasks/ext/svn symfony-1.0.0/lib/vendor/phing/tasks/system symfony-1.0.0/lib/vendor/phing/tasks/system/condition symfony-1.0.0/lib/vendor/phing/types symfony-1.0.0/lib/vendor/phing/types/selectors symfony-1.0.0/lib/vendor/phing/util symfony-1.0.0/lib/vendor/phing/util/regexp symfony-1.0.0/lib/vendor/phpmailer symfony-1.0.0/lib/vendor/phpmailer/language symfony-1.0.0/lib/vendor/propel symfony-1.0.0/lib/vendor/propel/adapter symfony-1.0.0/lib/vendor/propel/logger symfony-1.0.0/lib/vendor/propel/map symfony-1.0.0/lib/vendor/propel/om symfony-1.0.0/lib/vendor/propel/util symfony-1.0.0/lib/vendor/propel/validator symfony-1.0.0/lib/vendor/propel-generator symfony-1.0.0/lib/vendor/propel-generator/bin symfony-1.0.0/lib/vendor/propel-generator/classes symfony-1.0.0/lib/vendor/propel-generator/classes/propel symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine symfony-1.0.0/lib/vendor/propel-generator/classe
s/propel/engine/builder symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5 symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mssql symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysql symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysqli symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/oracle symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/pgsql symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/sqlite symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/transform symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing symfony-1.0.0/lib/vendor/propel-generator/pear symfony-1.0.0/lib/vendor/propel-generator/resources symfony-1.0.0/lib/vendor/propel-generator/resources/dtd symfony-1.0.0/lib/vendor/propel-generator/resources/xsd symfony-1.0.0/lib/vendor/propel-generator/resources/xsl symfony-1.0.0/lib/vendor/propel-generator/templates symfony-1.0.0/lib/vendor/propel-generator/templates/conf symfony-1.0.0/lib/vendor/propel-generator/templates/data symfony-1.0.0/lib/vendor/propel-generator/templates/data/dtd symfony-1.0.0/lib/vendor/propel-generator/templates/data/dump symfony-1.0.0/lib/vendor/propel-generator/templates/om symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4 symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5 symfony-1.0.0/lib/vendor/propel-generator/templates/sql symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql symfony-1.0.
0/lib/vendor/propel-generator/templates/sql/base/mysql symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mssql symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mysql symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/oracle symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/pgsql symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mssql symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mysql symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/oracle symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/pgsql symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/sqlite symfony-1.0.0/lib/view symfony-1.0.0/lib/view/escaper symfony-1.0.0/licenses
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Message-Id: <20070226203049.20DCD6EC350 en tom.pressenter.com.ar>
Date: Mon, 26 Feb 2007 17:30:49 -0300 (ART)
X-pressenter_com_ar-MailScanner: Found to be clean
X-pressenter_com_ar-MailScanner-From: www-data en tom.pressenter.com.ar

Author: ftoledo
Date: 2007-02-26 17:16:50 -0300 (Mon, 26 Feb 2007)
New Revision: 4311

Added:
   prosistem/alba/trunk/dist/symfony-0.6.3/lib/vendor/pake
   prosistem/alba/trunk/dist/symfony-0.6.3/lib/vendor/phing
   prosistem/alba/trunk/dist/symfony-1.0.0/
   prosistem/alba/trunk/dist/symfony-1.0.0/COPYRIGHT
   prosistem/alba/trunk/dist/symfony-1.0.0/LICENSE
   prosistem/alba/trunk/dist/symfony-1.0.0/README
   prosistem/alba/trunk/dist/symfony-1.0.0/data/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/create_sandbox.sh
   prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/release.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/sf_sandbox.tgz
   prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/symfony
   prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/symfony.bat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/symfony.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/autoload.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/bootstrap_compile.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/config_handlers.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/constants.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/core_compile.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/factories.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/filters.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/generator.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/i18n.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/logging.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/mailer.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/module.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/php.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/security.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/settings.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/config/view.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/data/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/data/SANDBOX_README
   prosistem/alba/trunk/dist/symfony-1.0.0/data/data/error_messages.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/data/exception.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/data/exception.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/data/data/mime_types.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/data/mime_types.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton/actions/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton/actions/actions.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton/config/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton/config/generator.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/actions/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/actions/actions.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_actions.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_footer.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_form.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_header.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_messages.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_filters.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_actions.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_footer.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_header.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_messages.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_td_actions.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_td_stacked.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_td_tabular.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_th_stacked.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_th_tabular.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/editSuccess.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/listSuccess.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/actions/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/actions/actions.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/config/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/config/generator.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/lib/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/lib/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/templates/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/templates/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/validate/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/validate/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/actions/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/actions/actions.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/editSuccess.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/listSuccess.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/showSuccess.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/af.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/af_ZA.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/am.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/am_ET.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_AE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_BH.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_DZ.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_EG.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_IN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_IQ.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_JO.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_KW.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_LB.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_LY.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_MA.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_OM.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_QA.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_SA.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_SD.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_SY.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_TN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_YE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/be.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/be_BY.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bg.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bg_BG.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bn.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bn_IN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ca.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ca_ES.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cs.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cs_CZ.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cy.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cy_GB.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/da.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/da_DK.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_AT.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_BE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_CH.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_DE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_LU.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/el.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/el_GR.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_AU.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_BE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_BW.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_CA.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_GB.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_HK.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_IE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_IN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_MT.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_NZ.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_PH.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_PK.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_SG.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_US.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_US_POSIX.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_VI.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_ZA.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_ZW.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/eo.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_AR.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_BO.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_CL.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_CO.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_CR.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_DO.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_EC.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_ES.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_GT.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_HN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_MX.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_NI.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PA.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PR.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PY.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_SV.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_US.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_UY.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_VE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/et.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/et_EE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/eu.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/eu_ES.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fa.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fa_AF.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fa_IR.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fi.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fi_FI.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fo.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fo_FO.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_BE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_CA.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_CH.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_FR.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_LU.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ga.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ga_IE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gl.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gl_ES.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gu.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gu_IN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gv.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gv_GB.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/he.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/he_IL.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hi.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hi_IN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hr.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hr_HR.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hu.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hu_HU.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hy.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hy_AM.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hy_AM_REVISED.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/id.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/id_ID.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/in.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/in_ID.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/is.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/is_IS.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/it.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/it_CH.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/it_IT.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/iw.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/iw_IL.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ja.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ja_JP.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ja_JP_TRADITIONAL.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kk.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kk_KZ.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kl.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kl_GL.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kn.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kn_IN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ko.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ko_KR.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kok.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kok_IN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kw.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kw_GB.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lt.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lt_LT.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lv.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lv_LV.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mk.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mk_MK.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ml.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ml_IN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mr.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mr_IN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ms.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ms_BN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ms_MY.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mt.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mt_MT.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nb.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nb_NO.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nl.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nl_BE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nl_NL.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nn.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nn_NO.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/no.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/no_NO.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/no_NO_NY.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/om.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/om_ET.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/om_KE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/or.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/or_IN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pa.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pa_IN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pl.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pl_PL.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ps.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ps_AF.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pt.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pt_BR.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pt_PT.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ro.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ro_RO.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/root.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ru.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ru_RU.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ru_UA.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sh.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sh_YU.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sk.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sk_SK.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sl.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sl_SI.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_DJ.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_ET.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_KE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_SO.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sq.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sq_AL.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Cyrl.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Cyrl_YU.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Latn.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Latn_YU.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_YU.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sv.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sv_FI.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sv_SE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sw.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sw_KE.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sw_TZ.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ta.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ta_IN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/te.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/te_IN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/th.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/th_TH.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/th_TH_TRADITIONAL.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ti.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ti_ER.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ti_ET.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/tr.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/tr_TR.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/uk.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/uk_UA.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/vi.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/vi_VN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_CN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_HK.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hans.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hans_CN.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hans_SG.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant_HK.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant_MO.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant_TW.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_MO.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_SG.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_TW.dat
   prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/actions/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/actions/actions.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/defaultLayout.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/disabledSuccess.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/error404Success.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/indexSuccess.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/loginSuccess.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/moduleSuccess.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/secureSuccess.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/unavailableSuccess.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/app.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/cache.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/config.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/factories.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/filters.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/i18n.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/logging.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/routing.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/security.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/settings.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/view.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/i18n/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/i18n/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/lib/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/lib/myUser.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/modules/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/modules/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/templates/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/templates/layout.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/web/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/web/index.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/web/index_dev.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/batch/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/batch/default.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/batch/rotate_log.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/controller/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/controller/controller.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/actions/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/actions/actions.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/config/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/config/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/lib/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/lib/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/templates/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/templates/indexSuccess.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/validate/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/validate/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/test/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/test/actionsTest.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/apps/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/apps/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/batch/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/batch/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/cache/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/cache/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/config.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/databases.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/propel.ini
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/properties.ini
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/rsync_exclude.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/schema.yml
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/data/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/data/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/data/model/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/data/model/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/data/sql/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/data/sql/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/doc/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/doc/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/lib/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/lib/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/lib/model/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/lib/model/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/log/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/log/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/plugins/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/plugins/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/symfony
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/bootstrap/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/bootstrap/functional.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/bootstrap/unit.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/functional/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/functional/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/unit/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/unit/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/.htaccess
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/css/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/css/main.css
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/images/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/images/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/js/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/js/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/robots.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/uploads/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/uploads/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/uploads/assets/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/uploads/assets/.sf
   prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeBase.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeEnvironment.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeGenerator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeMisc.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePlugins.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePropel.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePropelAdminGenerator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePropelCrudGenerator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeSymfony.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeTest.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeUpgrade.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/errors/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/errors/error500.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/errors/unavailable.php
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/calendar-setup.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/calendar-system.css
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/calendar.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-af.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-bg.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ca.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-cs.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-da.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-de.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-el.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-en.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-es.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-eu.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-fi.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-fr.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-he.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-hr.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-hu.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-it.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ja.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ko.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-lt.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-lv.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-nl.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-no.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-pl.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-pt.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-pt_BR.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ro.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ru.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sk.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sl.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sq.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sr.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sv.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-tr.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-zh.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/active-bg.gif
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/dark-bg.gif
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/hover-bg.gif
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/menuarrow.gif
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/normal-bg.gif
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/rowhover-bg.gif
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/status-bg.gif
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/theme.css
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/title-bg.gif
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/today-bg.gif
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/css/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/css/input_auto_complete_tag.css
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/builder.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/controls.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/dragdrop.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/effects.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/index.html
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/prototype.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/scriptaculous.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/slider.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/unittest.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/css/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/css/main.css
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/add.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/cancel.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/date.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/default_icon.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/delete.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/delete_icon.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/edit.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/edit_icon.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/error.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/filter.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/first.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/help.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/last.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/list.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/next.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/ok.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/previous.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/reset.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/save.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/tick.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/js/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/js/collapse.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/js/double_list.js
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/css/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/css/ie.css
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/css/pngfix.htc
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/css/screen.css
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/bg_body.jpg
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/bg_sfTAlert.jpg
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/bg_sfTLock.jpg
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/bg_sfTMessage.jpg
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/cancel48.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/colour16.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/db16.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/disabled48.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/edit16.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/folder16.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/linkOut16.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/lock48.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/ok48.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/reload16.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/tools48.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/sfTLogo.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/trans.gif
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/css/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/css/main.css
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/close.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/comment.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/config.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/database.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/error.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/info.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/memory.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/reload.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/sf.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/time.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/toggle.gif
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/warning.png
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/js/
   prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/js/main.js
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/01-Introducing-Symfony.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/02-Exploring-Symfony-s-Code.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/03-Running-Symfony.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/04-The-Basics-of-Page-Creation.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/05-Configuring-Symfony.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/06-Inside-the-Controller-Layer.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/07-Inside-the-View-Layer.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/08-Inside-the-Model-Layer.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/09-Links-and-the-Routing-System.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/10-Forms.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/11-Ajax-Integration.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/12-Caching.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/13-I18n-and-L10n.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/14-Generators.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/15-Unit-and-Functional-Testing.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/16-Application-Management-Tools.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/17-Extending-Symfony.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/18-Performance.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/19-Mastering-Symfony-s-Configuration-Files.txt
   prosistem/alba/trunk/dist/symfony-1.0.0/doc/LICENSE
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/VERSION
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfAction.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfActionStack.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfActionStackEntry.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfActions.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfComponent.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfComponents.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/bridge/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/bridge/sfEzComponentsBridge.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/bridge/sfZendFrameworkBridge.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/database/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/database/sfCreoleDatabase.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/drivers/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/drivers/sfDebugConnection.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/i18n/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/i18n/sfMessageSource_Creole.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/storage/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/storage/sfCreoleSessionStorage.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfExtensionObjectBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfExtensionPeerBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfMapBuilderBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfMultiExtendObjectBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfObjectBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfPeerBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/database/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/database/sfPropelDataRetriever.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/database/sfPropelDatabase.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/generator/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/generator/sfPropelAdminGenerator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/generator/sfPropelCrudGenerator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelAutoload.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelBehavior.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelData.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelDatabaseSchema.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelManyToMany.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelPager.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/validator/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/validator/sfPropelUniqueValidator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/sfData.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/sfMail.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/sfPager.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfCache.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfFileCache.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfFunctionCache.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfProcessCache.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfSQLiteCache.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfAutoloadConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfCacheConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfCompileConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfConfig.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfConfigCache.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfDatabaseConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfDefineEnvironmentConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfFactoryConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfFilterConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfGeneratorConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfLoader.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfLoggingConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfPhpConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfRootConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfRoutingConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfSecurityConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfSimpleYamlConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfValidatorConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfViewConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfYamlConfigHandler.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfConsoleController.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfController.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfFrontWebController.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfRouting.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfWebController.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfDatabase.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfDatabaseManager.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfMySQLDatabase.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfPDODatabase.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfPostgreSQLDatabase.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfDebug.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfTimer.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfTimerManager.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfWebDebug.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfActionException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfAutoloadException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfCacheException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfConfigurationException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfContextException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfControllerException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfDatabaseException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfError404Exception.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfFactoryException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfFileException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfFilterException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfForwardException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfInitializationException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfParseException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfRenderException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfSecurityException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfStopException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfStorageException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfValidatorException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfViewException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfBasicSecurityFilter.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfCacheFilter.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfCommonFilter.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfExecutionFilter.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFillInFormFilter.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFilter.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFilterChain.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFlashFilter.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfRenderingFilter.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfSecurityFilter.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfWebDebugFilter.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfAdminGenerator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfCrudGenerator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfGenerator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfGeneratorManager.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/AssetHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/CacheHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/DateFormHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/DateHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/DebugHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/EscapingHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/FormHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/HelperHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/I18NHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/JavascriptHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/NumberHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/ObjectAdminHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/ObjectHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/PartialHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/TagHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/TextHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/UrlHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/ValidationHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/sfRichTextEditor.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/sfRichTextEditorFCK.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/sfRichTextEditorTinyMCE.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/MO.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/PO.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/TGettext.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfChoiceFormat.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfCultureInfo.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfDateFormat.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfDateTimeFormatInfo.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfI18N.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfIMessageSource.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageCache.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageFormat.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_MySQL.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_SQLite.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_XLIFF.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_gettext.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfNumberFormat.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfNumberFormatInfo.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/util.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogManager.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger/sfFileLogger.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger/sfWebDebugLogger.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/sfConsoleRequest.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/sfRequest.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/sfWebRequest.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/sfConsoleResponse.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/sfResponse.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/sfWebResponse.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfMySQLSessionStorage.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfPDOSessionStorage.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfPostgreSQLSessionStorage.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfSessionStorage.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfSessionTestStorage.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfStorage.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/symfony.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/test/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/test/sfTestBrowser.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/sfBasicSecurityUser.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/sfSecurityUser.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/sfUser.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/Spyc.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfBrowser.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfContext.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfCore.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfDomCssSelector.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfFillInForm.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfFinder.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfInflector.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfMixer.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfParameterHolder.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfToolkit.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfYaml.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfCallbackValidator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfCompareValidator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfDateValidator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfEmailValidator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfFileValidator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfHtmlValidator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfNumberValidator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfRegexValidator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfStringValidator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfUrlValidator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfValidator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfValidatorManager.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/CallableStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/Connection.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/Creole.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/CreoleTypes.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/IdGenerator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/PreparedStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/ResultSet.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/ResultSetIterator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/SQLException.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/Statement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/ConnectionCommon.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/PreparedStatementCommon.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/ResultSetCommon.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/StatementCommon.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLCallableStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLConnection.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLIdGenerator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLPreparedStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLResultSet.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLTypes.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/metadata/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/metadata/MSSQLDatabaseInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/metadata/MSSQLTableInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLConnection.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLIdGenerator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLPreparedStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLResultSet.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLTypes.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/metadata/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/metadata/MySQLDatabaseInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/metadata/MySQLTableInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiConnection.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiIdGenerator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiPreparedStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiResultSet.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/metadata/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/metadata/MySQLiDatabaseInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/metadata/MySQLiTableInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCCachedResultSet.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCConnection.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCIdGenerator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCPreparedStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCResultSet.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCResultSetCommon.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCTypes.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/README
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/CodeBaseAdapter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/MySQLAdapter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/ODBCAdapter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/metadata/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/metadata/ODBCDatabaseInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/metadata/ODBCTableInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8Connection.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8IdGenerator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8PreparedStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8ResultSet.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8Statement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8Types.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/metadata/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/metadata/OCI8DatabaseInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/metadata/OCI8TableInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLConnection.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLIdGenerator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLPreparedStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLResultSet.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLResultSetIterator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLTypes.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/metadata/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/metadata/PgSQLDatabaseInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/metadata/PgSQLTableInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteConnection.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteIdGenerator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLitePreparedStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteResultSet.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteResultSetIterator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteStatement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteTypes.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/metadata/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/metadata/SQLiteDatabaseInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/metadata/SQLiteTableInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/ColumnInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/DatabaseInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/ForeignKeyInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/IndexInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/PrimaryKeyInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/TableInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/Blob.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/Clob.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/Lob.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/sql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/sql/SQLStatementExtractor.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/lime/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/lime/lime.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeApp.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeColor.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeException.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeFileTask.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeFinder.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeFunction.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeGetopt.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeGlobToRegex.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeNumberCompare.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeTask.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeYaml.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/pakePearTask.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/pakePhingTask.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/pakeSimpletestTask.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/patch/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/patch/propel-generator-1.patch
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/BuildEvent.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/BuildException.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/BuildListener.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/IntrospectionHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Phing.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Project.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/ProjectComponent.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/RuntimeConfigurable.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Target.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Task.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/TaskAdapter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/TaskContainer.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/UnknownElement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/BaseFilterReader.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/BaseParamFilterReader.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ChainableReader.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ExpandProperties.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/HeadFilter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/LineContains.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/LineContainsRegexp.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/PrefixLines.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ReplaceRegexp.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ReplaceTokens.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/StripLineBreaks.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/StripLineComments.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/StripPhpComments.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TabToSpaces.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TailFilter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TidyFilter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TranslateGettext.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/XsltFilter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/util/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/util/ChainReaderHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/util/IniFileTokenReader.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/DefaultInputHandler.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/InputHandler.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/InputRequest.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/MultipleChoiceInputRequest.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/PropertyFileInputHandler.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/YesNoInputRequest.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/lib/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/lib/Capsule.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/lib/Zip.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/AnsiColorLogger.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/BuildLogger.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/DefaultLogger.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/NoBannerLogger.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/PearLogger.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/XmlLogger.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/defaults.properties
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/FileNameMapper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/FlattenMapper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/GlobMapper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/IdentityMapper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/MergeMapper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/RegexpMapper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/AbstractHandler.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/AbstractSAXParser.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/DataTypeHandler.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ExpatParseException.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ExpatParser.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/Location.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/NestedElementHandler.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ProjectConfigurator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ProjectHandler.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/RootHandler.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/TargetHandler.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/TaskHandler.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/BufferedReader.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/BufferedWriter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/ConsoleReader.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FileReader.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FileSystem.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FileWriter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FilterReader.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/IOException.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/PhingFile.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/Reader.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/StringReader.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/TokenReader.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/UnixFileSystem.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/Win32FileSystem.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/WinNTFileSystem.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/Writer.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/Character.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/EventObject.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/FileNotFoundException.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/NullPointerException.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/SecurityException.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Message.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Properties.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Register.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Timer.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/defaults.properties
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/CapsuleTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/CreoleSQLExecTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/CreoleTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ExtractBaseTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/MailTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/PackageAsPathTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/PearPackageTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/PhpLintTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/SmartyTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/TarTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/UntarTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/UnzipTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/XmlLintTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ZendCodeAnalyzerTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ZipTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageMerger.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageMergerTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageReportTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageReportTransformer.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageSetupTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/IoncubeComment.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/IoncubeEncoderTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/IoncubeLicenseTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/pearpackage/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/pearpackage/Fileset.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpdoc/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpdoc/PHPDocumentorTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/BatchTest.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/FormatterElement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2ReportTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2ResultFormatter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2Task.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2TestRunner.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2Util.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PlainPHPUnit2ResultFormatter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/SummaryPHPUnit2ResultFormatter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/XMLPHPUnit2ResultFormatter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestCountResultFormatter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestFormatterElement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestPlainResultFormatter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestResultFormatter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestSummaryResultFormatter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/SvnBaseTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/SvnExportTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/SvnLastRevisionTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AdhocTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AdhocTaskdefTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AdhocTypedefTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AppendTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AvailableTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ChmodTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ConditionTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/CopyTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/CvsPassTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/CvsTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/DeleteTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/EchoTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ExecTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ExitTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ForeachTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/IfTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/IncludePathTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/InputTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/MatchingTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/MkdirTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/MoveTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PhingCallTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PhingTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PhpEvalTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PropertyPromptTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PropertyTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ReflexiveTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ResolvePathTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/SequentialTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TaskdefTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TouchTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TstampTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TypedefTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/UpToDateTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/WarnTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/XsltTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/AndCondition.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/Condition.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/ConditionBase.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/ContainsCondition.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/EqualsCondition.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/IsFalseCondition.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/IsSetCondition.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/IsTrueCondition.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/NotCondition.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/OrCondition.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/OsCondition.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/ReferenceExistsCondition.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/AbstractFileSet.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Commandline.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/DataType.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Description.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/DirSet.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/FileList.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/FileSet.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/FilterChain.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Mapper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Parameter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Parameterizable.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Path.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/PatternSet.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/PhingFilterReader.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Reference.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/RegularExpression.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/TokenReader.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/TokenSource.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/defaults.properties
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/AndSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/BaseExtendSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/BaseSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/BaseSelectorContainer.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ContainsRegexpSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ContainsSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/DateSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/DependSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/DepthSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ExtendFileSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ExtendSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/FileSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/FilenameSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/MajoritySelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/NoneSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/NotSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/OrSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/PresentSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectorContainer.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectorScanner.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectorUtils.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SizeSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/TypeSelector.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/DirectoryScanner.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/ExtendedFileStream.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/FileUtils.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/LogWriter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/PathTokenizer.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/SourceFileScanner.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/StringHelper.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/PregEngine.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/Regexp.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/RegexpEngine.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/class.phpmailer.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/class.smtp.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-br.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ca.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-cz.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-de.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-dk.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-en.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-es.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-fi.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-fo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-fr.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-hu.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-it.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ja.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-nl.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-no.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-pl.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ro.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ru.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-se.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-tr.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/CHANGELOG
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/INSTALL
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/LICENSE
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/bin/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/bin/propel-gen
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/bin/propel-gen.bat
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build-propel.xml
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build.properties-sample
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build.xml
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build.xml-local
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/EngineException.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/DataModelBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/ClassTools.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/OMBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/ObjectBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/PeerBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicObjectBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicPeerBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexObjectBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexPeerBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodeBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodePeerBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionObjectBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionPeerBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5InterfaceBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5MapBuilderBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5MultiExtendObjectBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodeBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodePeerBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/DDLBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/DataSQLBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mssql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDDLBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDataSQLBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDDLBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDataSQLBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysqli/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDDLBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDataSQLBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/oracle/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDDLBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDataSQLBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/pgsql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDDLBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDataSQLBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/sqlite/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDDLBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDataSQLBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/AppData.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Column.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/ConstraintNameGenerator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Database.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Domain.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/ForeignKey.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/IDMethod.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/IdMethodParameter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Index.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Inheritance.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/NameFactory.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/NameGenerator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/PhpNameGenerator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/PropelTypes.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Rule.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Table.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Unique.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Validator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/XMLElement.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/transform/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/transform/XmlToAppData.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/transform/XmlToData.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/DefaultPlatform.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/MssqlPlatform.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/MysqlPlatform.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/MysqliPlatform.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/OraclePlatform.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/PgsqlPlatform.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/Platform.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/SqlitePlatform.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/AbstractPropelDataModelTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelCreoleTransformTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataDTDTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataDumpTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataModelTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataSQLTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelGraphvizTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelOMTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelOldOMTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelOldSQLTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelSQLExec.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelSQLTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/default.properties
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/BuildPropelGenPEARPackageTask.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/build-pear-package.xml
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/build.properties
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/pear-build.xml
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/pear-propel-gen
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/pear-propel-gen.bat
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/dtd/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/dtd/database.dtd
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/xsd/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/xsd/custom_datatypes.xsd
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/xsd/database.xsd
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/xsl/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/xsl/database.xsl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/README
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/conf/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/conf/Control.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/conf/xml.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dtd/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dtd/dataset.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dtd/table.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dump/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dump/bottom.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dump/row.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dump/top.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionNode.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionNodePeer.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionObject.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionPeer.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Interface.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/MapBuilder.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/MultiExtendObject.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Node.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/NodePeer.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Object.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Peer.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionNode.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionNodePeer.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionObject.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionPeer.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Interface.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/MapBuilder.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/MultiExtendObject.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Node.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/NodePeer.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Object.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Peer.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/columns.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/drop.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/foreignkey.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/index.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/primarykey.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/table.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/tablefk.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/unique.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/columns.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/database-end.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/database-start.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/drop.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/foreignkey.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/index.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/primarykey.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/table.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/tablefk.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/unique.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/columns.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/drop.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/foreignkey.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/index.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/primarykey.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/sequence.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/table.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/tablefk.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/unique.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/columns.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/drop.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/foreignkey.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/index.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/primarykey.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/sequence.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/table.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/tablefk.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/unique.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/columns.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/drop.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/foreignkey.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/index.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/table.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/tablefk.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/unique.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/Control.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mssql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mssql/unix.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mssql/windows.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mysql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mysql/createdb.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/oracle/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/oracle/createdb.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/pgsql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/pgsql/createdb.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mssql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mssql/row.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mssql/val.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mysql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mysql/row.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mysql/val.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/oracle/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/oracle/row.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/oracle/val.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/pgsql/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/pgsql/row.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/pgsql/val.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/sqlite/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/sqlite/row.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/sqlite/val.tpl
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/Propel.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/PropelException.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBAdapter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBMSSQL.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBMySQL.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBMySQLi.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBNone.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBOracle.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBPostgres.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBSQLite.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBSybase.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/logger/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/logger/BasicLogger.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/logger/MojaviLogAdapter.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/ColumnMap.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/DatabaseMap.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/MapBuilder.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/TableMap.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/ValidatorMap.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/BaseObject.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/Persistent.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/PreOrderNodeIterator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/BasePeer.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/Criteria.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/PeerInfo.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/PropelPager.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/Transaction.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/BasicValidator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MatchValidator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MaxLengthValidator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MaxValueValidator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MinLengthValidator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MinValueValidator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/NotMatchValidator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/RequiredValidator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/UniqueValidator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/ValidValuesValidator.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/ValidationFailed.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaper.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperArrayDecorator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperGetterDecorator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperIteratorDecorator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperObjectDecorator.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfMailView.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfPHPView.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfPartialView.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfView.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfViewCacheManager.class.php
   prosistem/alba/trunk/dist/symfony-1.0.0/licenses/
   prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.Creole
   prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.ICU
   prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.PHPMailer
   prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.Propel
   prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.lime
   prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.pake
   prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.phing
   prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.prado
   prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.prototype
   prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.script.aculo.us
Log:
agregando symfony 1.0 stable

Added: prosistem/alba/trunk/dist/symfony-0.6.3/lib/vendor/pake
===================================================================
--- prosistem/alba/trunk/dist/symfony-0.6.3/lib/vendor/pake	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-0.6.3/lib/vendor/pake	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+link ../../../pake
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-0.6.3/lib/vendor/pake
___________________________________________________________________
Name: svn:special
   + *

Added: prosistem/alba/trunk/dist/symfony-0.6.3/lib/vendor/phing
===================================================================
--- prosistem/alba/trunk/dist/symfony-0.6.3/lib/vendor/phing	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-0.6.3/lib/vendor/phing	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+link ../../../phing.sandbox/
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-0.6.3/lib/vendor/phing
___________________________________________________________________
Name: svn:special
   + *

Added: prosistem/alba/trunk/dist/symfony-1.0.0/COPYRIGHT
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/COPYRIGHT	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/COPYRIGHT	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,128 @@
+COPYRIGHTS
+==========
+
+symfony
+-------
+
+symfony is originally based on Mojavi3 by Sean Kerr
+
+Url:       http://www.symfony-project.com/
+Copyright: Fabien Potencier
+License:   MIT - see LICENSE file
+
+Propel
+------
+
+symfony contains the Propel software
+
+Url:       http://propel.phpdb.org/
+Copyright: Authors
+License:   LGPL - see licenses/LICENSE.Propel file
+
+Creole
+------
+
+symfony contains the Creole software
+
+Url:       http://creole.phpdb.org/
+Copyright: Authors
+License:   LGPL - see licenses/LICENSE.Creole file
+
+International Components for Unicode
+------------------------------------
+
+symfony contains a port of parts of the International Components for Unicode library
+
+Url:       http://www.ibm.com/software/globalization/icu/, http://icu.sourceforge.net/
+Copyright: 1995-2006 International Business Machines Corporation and others.
+License:   ICU License - see licenses/LICENSE.ICU file
+
+Dynarch calendar
+----------------
+
+symfony contains the dynarch calendar software
+
+Url:       http://www.dynarch.com/projects/calendar/
+Copyright: Mihai Bazon, 2002-2005
+License:   LGPL - http://www.gnu.org/licenses/lgpl.html
+
+Prototype
+---------
+
+symfony contains the Prototype software
+
+Url:       http://prototype.conio.net/
+Copyright: 2005 Sam Stephenson
+License:   MIT - see licenses/LICENSE.prototype file
+
+script.aculo.us
+---------------
+
+symfony contains the script.aculo.us software
+
+Url:       http://script.aculo.us, http://mir.aculo.us
+Copyright: 2005, 2006 Thomas Fuchs
+License:   MIT - see licenses/LICENSE.script.aculo.us file
+
+famfamfam icons
+---------------
+
+symfony contains a subset of the silk famfamfam icons
+
+Url:       http://www.famfamfam.com/lab/icons/silk/
+License:   http://creativecommons.org/licenses/by/2.5/
+
+Prado i18n classes
+------------------
+
+symfony contains the Prado i18n core classes
+
+Url:       http://www.pradosoft.com/
+Copyright: 2004-2006, The PRADO Group
+License:   BSD - see licenses/LICENSE.prado file
+
+PHPMailer
+---------
+
+symfony contains the PHPMailer software
+
+Url:       http://phpmailer.sourceforge.net/
+Copyright: Chris Ryan
+License:   LGPL - see licenses/LICENSE.PHPMailer file
+
+Spyc
+----
+
+symfony contains the Spyc software
+
+Url:       http://spyc.sourceforge.net/
+Copyright: 2005-2006 Chris Wanstrath
+License:   MIT - http://www.opensource.org/licenses/mit-license.php
+
+pake
+----
+
+symfony uses the pake software
+
+Url:       http://www.symfony-project.com/
+Copyright: Fabien Potencier
+License:   MIT - see licenses/LICENSE.pake file
+
+lime
+----
+
+symfony uses the lime software
+
+Url:       http://www.symfony-project.com/
+Copyright: Fabien Potencier
+License:   MIT - see licenses/LICENSE.lime file
+
+Phing
+-----
+
+symfony contains the Phing software
+
+Url:       http://phing.info/
+Copyright: Authors
+License:   LGPL - see licenses/LICENSE.phing file
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/LICENSE
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/LICENSE	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/LICENSE	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,7 @@
+Copyright (c) 2004-2006 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/README
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/README	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/README	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,20 @@
+Symfony is a complete framework designed to optimize the development of web applications by way of several key features.
+For starters, it separates a web application's business rules, server logic, and presentation views.
+It contains numerous tools and classes aimed at shortening the development time of a complex web application.
+Additionally, it automates common tasks so that the developer can focus entirely on the specifics of an application.
+The end result of these advantages means there is no need to reinvent the wheel every time a new web application is built!
+
+Symfony was written entirely in PHP 5.
+It has been thoroughly tested in various real-world projects, and is actually in use for high-demand e-business websites.
+It is compatible with most of the available databases engines, including MySQL, PostgreSQL, Oracle, and Microsoft SQL Server.
+It runs on *nix and Windows platforms.
+
+LICENSE
+-------
+
+see LICENSE file
+
+INSTALLATION
+------------
+
+see doc/03-Running-Symfony.txt

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/create_sandbox.sh
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/create_sandbox.sh	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/create_sandbox.sh	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,66 @@
+#!/bin/sh
+
+# creates a symfony sandbox for this symfony version
+
+echo ">>> initialization"
+DIR=../`dirname $0`
+SANDBOX_NAME=sf_sandbox
+APP_NAME=frontend
+PHP=php
+
+echo ">>> project initialization"
+rm -rf ${SANDBOX_NAME}
+mkdir ${SANDBOX_NAME}
+cd ${SANDBOX_NAME}
+
+echo ">>> create a new project and a new app"
+${PHP} ${DIR}/../../data/bin/symfony init-project ${SANDBOX_NAME}
+${PHP} symfony init-app ${APP_NAME}
+
+echo ">>> add LICENSE"
+cp ${DIR}/../../LICENSE LICENSE
+
+echo ">>> add README"
+cp ${DIR}/../../data/data/SANDBOX_README README
+
+echo ">>> add symfony command line for windows users"
+cp ${DIR}/../../data/bin/symfony.bat symfony.bat
+
+echo ">>> freeze symfony"
+${PHP} symfony freeze
+rm config/config.php.bak
+
+echo ">>> default to sqlite (propel.ini)"
+sed -i '' -e "s#\(propel.database *= *\)mysql#\1sqlite#" config/propel.ini
+sed -i '' -e "s#\(propel.database.createUrl *= *\).*#\1sqlite://./../../../../data/sandbox.db#" config/propel.ini
+sed -i '' -e "s#\(propel.database.url *= *\).*#\1sqlite://./../../../../data/sandbox.db#" config/propel.ini
+
+echo ">>> default to sqlite (databases.yml)"
+echo "all:
+  propel:
+    class:      sfPropelDatabase
+    param:
+      phptype:  sqlite
+      database: %SF_DATA_DIR%/sandbox.db
+" > config/databases.yml
+
+echo ">>> add some empty files in empty directories"
+touch apps/${APP_NAME}/modules/.sf apps/${APP_NAME}/i18n/.sf doc/.sf web/images/.sf
+touch log/.sf cache/.sf batch/.sf data/sql/.sf data/model/.sf
+touch data/symfony/generator/sfPropelAdmin/default/skeleton/templates/.sf
+touch data/symfony/generator/sfPropelAdmin/default/skeleton/validate/.sf
+touch data/symfony/modules/default/config/.sf
+touch lib/model/.sf plugins/.sf web/js/.sf
+touch test/unit/.sf test/functional/.sf test/functional/${APP_NAME}/.sf
+touch web/uploads/assets/.sf
+
+touch data/sandbox.db
+chmod 777 data
+chmod 777 data/sandbox.db
+
+echo ">>> create archive"
+cd ..
+tar zcpf ${SANDBOX_NAME}.tgz ${SANDBOX_NAME}
+
+echo ">>> cleanup"
+rm -rf ${SANDBOX_NAME}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/release.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/release.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/release.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,116 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2007 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Release script.
+ *
+ * Usage: php data/bin/release.php 1.0.0 stable
+ *
+ * @package    symfony
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id$
+ */
+require_once(dirname(__FILE__).'/../../lib/vendor/pake/pakeFunction.php');
+require_once(dirname(__FILE__).'/../../lib/vendor/pake/pakeGetopt.class.php');
+require_once(dirname(__FILE__).'/../../lib/vendor/lime/lime.php');
+
+if (!isset($argv[1]))
+{
+  throw new Exception('You must provide version prefix.');
+}
+
+if (!isset($argv[2]))
+{
+  throw new Exception('You must provide stability status (alpha/beta/stable).');
+}
+
+$stability = $argv[2];
+
+if (($stability == 'beta' || $stability == 'alpha') && count(explode('.', $argv[1])) < 2)
+{
+  $version_prefix = $argv[1];
+
+  $result = pake_sh('svn status -u '.getcwd());
+  if (preg_match('/Status against revision\:\s+(\d+)\s*$/im', $result, $match))
+  {
+    $version = $match[1];
+  }
+
+  if (!isset($version))
+  {
+    throw new Exception('unable to find last svn revision');
+  }
+
+  // make a PEAR compatible version
+  $version = $version_prefix.'.'.$version;
+}
+else
+{
+  $version = $argv[1];
+}
+
+print 'releasing symfony version "'.$version."\"\n";
+
+// Test
+$h = new lime_harness(new lime_output_color());
+
+$h->base_dir = realpath(dirname(__FILE__).'/../../test');
+
+// unit tests
+$h->register_glob($h->base_dir.'/unit/*/*Test.php');
+
+// functional tests
+$h->register_glob($h->base_dir.'/functional/*Test.php');
+$h->register_glob($h->base_dir.'/functional/*/*Test.php');
+
+$ret = $h->run();
+
+if (!$ret)
+{
+  throw new Exception('Some tests failed. Release process aborted!');
+}
+
+if (is_file('package.xml'))
+{
+  pake_remove('package.xml', getcwd());
+}
+
+pake_copy(getcwd().'/package.xml.tmpl', getcwd().'/package.xml');
+
+// add class files
+$finder = pakeFinder::type('file')->ignore_version_control()->relative();
+$xml_classes = '';
+$dirs = array('lib' => 'php', 'data' => 'data');
+foreach ($dirs as $dir => $role)
+{
+  $class_files = $finder->in($dir);
+  foreach ($class_files as $file)
+  {
+    $xml_classes .= '<file role="'.$role.'" baseinstalldir="symfony" install-as="'.$file.'" name="'.$dir.'/'.$file.'" />'."\n";
+  }
+}
+
+// replace tokens
+pake_replace_tokens('package.xml', getcwd(), '##', '##', array(
+  'SYMFONY_VERSION' => $version,
+  'CURRENT_DATE'    => date('Y-m-d'),
+  'CLASS_FILES'     => $xml_classes,
+  'STABILITY'       => $stability,
+));
+
+$results = pake_sh('pear package');
+echo $results;
+
+pake_remove('package.xml', getcwd());
+
+// copy .tgz as symfony-latest.tgz
+pake_copy(getcwd().'/symfony-'.$version.'.tgz', getcwd().'/symfony-latest.tgz');
+
+exit(0);


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/release.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/sf_sandbox.tgz
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/sf_sandbox.tgz
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/symfony
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/symfony	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/symfony	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,39 @@
+#!/usr/bin/env php
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+// project exists?
+if (file_exists('config/config.php'))
+{
+  include('config/config.php');
+}
+
+if (!isset($sf_symfony_lib_dir))
+{
+  if (is_readable(dirname(__FILE__).'/../../lib/VERSION'))
+  {
+    // SVN
+    $sf_symfony_lib_dir  = realpath(dirname(__FILE__).'/../../lib');
+    $sf_symfony_data_dir = realpath(dirname(__FILE__).'/..');
+  }
+  else
+  {
+    // PEAR
+    $sf_symfony_lib_dir  = '@PEAR-DIR@/symfony';
+    $sf_symfony_data_dir = '@DATA-DIR@/symfony';
+
+    if (!is_dir($sf_symfony_lib_dir))
+    {
+      throw new Exception('Unable to find symfony libraries');
+    }
+  }
+}
+
+include($sf_symfony_data_dir.'/bin/symfony.php');

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/symfony.bat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/symfony.bat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/symfony.bat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,39 @@
+ en echo off
+
+rem *************************************************************
+rem ** symfony CLI for Windows based systems (based on phing.bat)
+rem *************************************************************
+
+rem This script will do the following:
+rem - check for PHP_COMMAND env, if found, use it.
+rem   - if not found detect php, if found use it, otherwise err and terminate
+
+if "%OS%"=="Windows_NT" @setlocal
+
+rem %~dp0 is expanded pathname of the current script under NT
+set SCRIPT_DIR=%~dp0
+
+goto init
+
+:init
+
+if "%PHP_COMMAND%" == "" goto no_phpcommand
+
+IF EXIST ".\symfony" (
+  %PHP_COMMAND% -d html_errors=off -d open_basedir= -q ".\symfony" %1 %2 %3 %4 %5 %6 %7 %8 %9
+) ELSE (
+  %PHP_COMMAND% -d html_errors=off -d open_basedir= -q "%SCRIPT_DIR%\symfony" %1 %2 %3 %4 %5 %6 %7 %8 %9
+)
+goto cleanup
+
+:no_phpcommand
+rem echo ------------------------------------------------------------------------
+rem echo WARNING: Set environment var PHP_COMMAND to the location of your php.exe
+rem echo          executable (e.g. C:\PHP\php.exe).  (assuming php.exe on PATH)
+rem echo ------------------------------------------------------------------------
+set PHP_COMMAND=php.exe
+goto init
+
+:cleanup
+if "%OS%"=="Windows_NT" @endlocal
+rem pause

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/symfony.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/symfony.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/symfony.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,173 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+if (!isset($sf_symfony_lib_dir))
+{
+  die("You must launch symfony command line with the symfony script\n");
+}
+
+if (ini_get('zend.ze1_compatibility_mode'))
+{
+  die("symfony cannot run with zend.ze1_compatibility_mode enabled.\nPlease turn zend.ze1_compatibility_mode to Off in your php.ini.\n");
+}
+
+// check if we are using an old project
+if (file_exists('config/config.php') && !isset($sf_symfony_lib_dir))
+{
+  // allow only upgrading
+  if (!in_array('upgrade', $argv))
+  {
+    echo "Please upgrade your project before launching any other symfony task\n";
+    exit();
+  }
+}
+
+require_once($sf_symfony_lib_dir.'/vendor/pake/pakeFunction.php');
+require_once($sf_symfony_lib_dir.'/vendor/pake/pakeGetopt.class.php');
+
+// autoloading for pake tasks
+class simpleAutoloader
+{
+  static public
+    $class_paths        = array(),
+    $autoload_callables = array();
+
+  static public function initialize($sf_symfony_lib_dir)
+  {
+    self::$class_paths = array();
+
+    self::register($sf_symfony_lib_dir, '.class.php');
+    self::register($sf_symfony_lib_dir.'/vendor/propel', '.php');
+    self::register($sf_symfony_lib_dir.'/vendor/creole', '.php');
+    self::register('lib/model', '.php');
+    self::register('plugins', '.php');
+  }
+
+  static public function __autoload($class)
+  {
+    if (!isset(self::$class_paths[$class]))
+    {
+      foreach ((array) self::$autoload_callables as $callable)
+      {
+        if (call_user_func($callable, $class))
+        {
+          return true;
+        }
+      }
+
+      return false;
+    }
+
+    require_once(self::$class_paths[$class]);
+
+    return true;
+  }
+
+  static public function register($dir, $ext)
+  {
+    if (!is_dir($dir))
+    {
+      return;
+    }
+
+    foreach (pakeFinder::type('file')->name('*'.$ext)->ignore_version_control()->follow_link()->in($dir) as $file)
+    {
+      self::$class_paths[str_replace($ext, '', str_replace('.class', '', basename($file, $ext)))] = $file;
+    }
+  }
+
+  static public function add($class, $file)
+  {
+    if (!is_file($file))
+    {
+      return;
+    }
+
+    self::$class_paths[$class] = $file;
+  }
+
+  static public function registerCallable($callable)
+  {
+    if (!is_callable($callable))
+    {
+      throw new Exception('Autoload callable does not exist');
+    }
+
+    self::$autoload_callables[] = $callable;
+  }
+}
+
+function __autoload($class)
+{
+  static $initialized = false;
+
+  if (!$initialized)
+  {
+    simpleAutoloader::initialize(sfConfig::get('sf_symfony_lib_dir'));
+    $initialized = true;
+  }
+
+  return simpleAutoloader::__autoload($class);
+}
+
+// trap -V before pake
+if (in_array('-V', $argv) || in_array('--version', $argv))
+{
+  printf("symfony version %s\n", pakeColor::colorize(trim(file_get_contents($sf_symfony_lib_dir.'/VERSION')), 'INFO'));
+  exit(0);
+}
+
+if (count($argv) <= 1)
+{
+  $argv[] = '-T';
+}
+
+require_once($sf_symfony_lib_dir.'/config/sfConfig.class.php');
+
+sfConfig::add(array(
+  'sf_root_dir'         => getcwd(),
+  'sf_symfony_lib_dir'  => $sf_symfony_lib_dir,
+  'sf_symfony_data_dir' => $sf_symfony_data_dir,
+));
+
+// directory layout
+include($sf_symfony_data_dir.'/config/constants.php');
+
+// include path
+set_include_path(
+  sfConfig::get('sf_lib_dir').PATH_SEPARATOR.
+  sfConfig::get('sf_app_lib_dir').PATH_SEPARATOR.
+  sfConfig::get('sf_model_dir').PATH_SEPARATOR.
+  sfConfig::get('sf_symfony_lib_dir').DIRECTORY_SEPARATOR.'vendor'.PATH_SEPARATOR.
+  get_include_path()
+);
+
+// register tasks
+$dirs = array(
+  sfConfig::get('sf_data_dir').DIRECTORY_SEPARATOR.'tasks'         => 'myPake*.php', // project tasks
+  sfConfig::get('sf_symfony_data_dir').DIRECTORY_SEPARATOR.'tasks' => 'sfPake*.php', // symfony tasks
+  sfConfig::get('sf_root_dir').'/plugins/*/data/tasks'             => '*.php',       // plugin tasks
+);
+foreach ($dirs as $globDir => $name)
+{
+  if ($dirs = glob($globDir))
+  {
+    $tasks = pakeFinder::type('file')->name($name)->in($dirs);
+    foreach ($tasks as $task)
+    {
+      include_once($task);
+    }
+  }
+}
+
+// run task
+pakeApp::get_instance()->run(null, null, false);
+
+exit(0);


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/bin/symfony.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/autoload.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/config/autoload.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/config/autoload.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,59 @@
+autoload:
+
+  # symfony core
+  symfony:
+    name:           symfony
+    path:           %SF_SYMFONY_LIB_DIR%
+    recursive:      on
+    exclude:        [vendor]
+
+  propel:
+    name:           propel
+    path:           %SF_SYMFONY_LIB_DIR%/vendor/propel
+    recursive:      on
+
+  creole:
+    name:           creole
+    path:           %SF_SYMFONY_LIB_DIR%/vendor/creole
+    recursive:      on
+
+  propel_addon:
+    name:           propel addon
+    files:
+      Propel:       %SF_SYMFONY_LIB_DIR%/addon/propel/sfPropelAutoload.php
+
+  # plugins
+  plugins_lib:
+    name:           plugins lib
+    path:           %SF_PLUGINS_DIR%/*/lib
+    recursive:      on
+
+  plugins_module_lib:
+    name:           plugins module lib
+    path:           %SF_PLUGINS_DIR%/*/modules/*/lib
+    prefix:         2
+    recursive:      on
+
+  # project
+  project:
+    name:           project
+    path:           %SF_LIB_DIR%
+    recursive:      on
+    exclude:        [model, symfony]
+
+  project_model:
+    name:           project model
+    path:           %SF_MODEL_LIB_DIR%
+    recursive:      on
+
+  # application
+  application:
+    name:           application
+    path:           %SF_APP_LIB_DIR%
+    recursive:      on
+
+  modules:
+    name:           module
+    path:           %SF_APP_DIR%/modules/*/lib
+    prefix:         1
+    recursive:      on


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/autoload.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/bootstrap_compile.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/config/bootstrap_compile.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/config/bootstrap_compile.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+- %SF_SYMFONY_LIB_DIR%/symfony.php


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/bootstrap_compile.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/config_handlers.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/config/config_handlers.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/config/config_handlers.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,70 @@
+config/autoload.yml:
+  class:    sfAutoloadConfigHandler
+
+config/php.yml:
+  class:    sfPhpConfigHandler
+
+config/databases.yml:
+  class:    sfDatabaseConfigHandler
+
+config/settings.yml:
+  class:    sfDefineEnvironmentConfigHandler
+  param:
+    prefix: sf_
+
+config/app.yml:
+  class:    sfDefineEnvironmentConfigHandler
+  param:
+    prefix: app_
+
+config/factories.yml:
+  class:    sfFactoryConfigHandler
+
+config/bootstrap_compile.yml:
+  class:    sfCompileConfigHandler
+
+config/core_compile.yml:
+  class:    sfCompileConfigHandler
+
+config/filters.yml:
+  class:    sfFilterConfigHandler
+
+config/logging.yml:
+  class:    sfLoggingConfigHandler
+  param:
+    prefix: sf_logging_
+
+config/routing.yml:
+  class:    sfRoutingConfigHandler
+
+config/i18n.yml:
+  class:    sfDefineEnvironmentConfigHandler
+  param:
+    prefix: sf_i18n_
+
+modules/*/config/generator.yml:
+  class:    sfGeneratorConfigHandler
+
+modules/*/config/view.yml:
+  class:    sfViewConfigHandler
+
+modules/*/config/mailer.yml:
+  class:    sfDefineEnvironmentConfigHandler
+  param:
+    prefix: sf_mailer_
+    module: yes
+
+modules/*/config/security.yml:
+  class:    sfSecurityConfigHandler
+
+modules/*/config/cache.yml:
+  class:    sfCacheConfigHandler
+
+modules/*/validate/*.yml:
+  class:    sfValidatorConfigHandler
+
+modules/*/config/module.yml:
+  class:    sfDefineEnvironmentConfigHandler
+  param:
+    prefix: mod_
+    module: yes


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/config_handlers.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/constants.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/config/constants.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/config/constants.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,81 @@
+<?php
+
+// for tracking temporary variables
+$usedVars = array_keys(get_defined_vars());
+
+$sf_root_dir    = sfConfig::get('sf_root_dir');
+$sf_app         = sfConfig::get('sf_app');
+$sf_environment = sfConfig::get('sf_environment');
+
+sfConfig::add(array(
+  // root directory names
+  'sf_bin_dir_name'     => $sf_bin_dir_name     = 'batch',
+  'sf_cache_dir_name'   => $sf_cache_dir_name   = 'cache',
+  'sf_log_dir_name'     => $sf_log_dir_name     = 'log',
+  'sf_lib_dir_name'     => $sf_lib_dir_name     = 'lib',
+  'sf_web_dir_name'     => $sf_web_dir_name     = 'web',
+  'sf_upload_dir_name'  => $sf_upload_dir_name  = 'uploads',
+  'sf_data_dir_name'    => $sf_data_dir_name    = 'data',
+  'sf_config_dir_name'  => $sf_config_dir_name  = 'config',
+  'sf_apps_dir_name'    => $sf_apps_dir_name    = 'apps',
+  'sf_test_dir_name'    => $sf_test_dir_name    = 'test',
+  'sf_doc_dir_name'     => $sf_doc_dir_name     = 'doc',
+  'sf_plugins_dir_name' => $sf_plugins_dir_name = 'plugins',
+
+  // global directory structure
+  'sf_app_dir'        => $sf_app_dir = $sf_root_dir.DIRECTORY_SEPARATOR.$sf_apps_dir_name.DIRECTORY_SEPARATOR.$sf_app,
+  'sf_lib_dir'        => $sf_lib_dir = $sf_root_dir.DIRECTORY_SEPARATOR.$sf_lib_dir_name,
+  'sf_bin_dir'        => $sf_root_dir.DIRECTORY_SEPARATOR.$sf_bin_dir_name,
+  'sf_web_dir'        => $sf_root_dir.DIRECTORY_SEPARATOR.$sf_web_dir_name,
+  'sf_upload_dir'     => $sf_root_dir.DIRECTORY_SEPARATOR.$sf_web_dir_name.DIRECTORY_SEPARATOR.$sf_upload_dir_name,
+  'sf_root_cache_dir' => $sf_root_cache_dir = $sf_root_dir.DIRECTORY_SEPARATOR.$sf_cache_dir_name,
+  'sf_base_cache_dir' => $sf_base_cache_dir = $sf_root_cache_dir.DIRECTORY_SEPARATOR.$sf_app,
+  'sf_cache_dir'      => $sf_cache_dir      = $sf_base_cache_dir.DIRECTORY_SEPARATOR.$sf_environment,
+  'sf_log_dir'        => $sf_root_dir.DIRECTORY_SEPARATOR.$sf_log_dir_name,
+  'sf_data_dir'       => $sf_root_dir.DIRECTORY_SEPARATOR.$sf_data_dir_name,
+  'sf_config_dir'     => $sf_root_dir.DIRECTORY_SEPARATOR.$sf_config_dir_name,
+  'sf_test_dir'       => $sf_root_dir.DIRECTORY_SEPARATOR.$sf_test_dir_name,
+  'sf_doc_dir'        => $sf_root_dir.DIRECTORY_SEPARATOR.'data'.DIRECTORY_SEPARATOR.$sf_doc_dir_name,
+  'sf_plugins_dir'    => $sf_root_dir.DIRECTORY_SEPARATOR.$sf_plugins_dir_name,
+
+  // lib directory names
+  'sf_model_dir_name'      => $sf_model_dir_name = 'model',
+
+  // lib directory structure
+  'sf_model_lib_dir'  => $sf_lib_dir.DIRECTORY_SEPARATOR.$sf_model_dir_name,
+
+  // SF_CACHE_DIR directory structure
+  'sf_template_cache_dir' => $sf_cache_dir.DIRECTORY_SEPARATOR.'template',
+  'sf_i18n_cache_dir'     => $sf_cache_dir.DIRECTORY_SEPARATOR.'i18n',
+  'sf_config_cache_dir'   => $sf_cache_dir.DIRECTORY_SEPARATOR.$sf_config_dir_name,
+  'sf_test_cache_dir'     => $sf_cache_dir.DIRECTORY_SEPARATOR.'test',
+  'sf_module_cache_dir'   => $sf_cache_dir.DIRECTORY_SEPARATOR.'modules',
+
+  // SF_APP_DIR sub-directories names
+  'sf_app_i18n_dir_name'     => $sf_app_i18n_dir_name     = 'i18n',
+  'sf_app_config_dir_name'   => $sf_app_config_dir_name   = 'config',
+  'sf_app_lib_dir_name'      => $sf_app_lib_dir_name      = 'lib',
+  'sf_app_module_dir_name'   => $sf_app_module_dir_name   = 'modules',
+  'sf_app_template_dir_name' => $sf_app_template_dir_name = 'templates',
+
+  // SF_APP_DIR directory structure
+  'sf_app_config_dir'   => $sf_app_dir.DIRECTORY_SEPARATOR.$sf_app_config_dir_name,
+  'sf_app_lib_dir'      => $sf_app_dir.DIRECTORY_SEPARATOR.$sf_app_lib_dir_name,
+  'sf_app_module_dir'   => $sf_app_dir.DIRECTORY_SEPARATOR.$sf_app_module_dir_name,
+  'sf_app_template_dir' => $sf_app_dir.DIRECTORY_SEPARATOR.$sf_app_template_dir_name,
+  'sf_app_i18n_dir'     => $sf_app_dir.DIRECTORY_SEPARATOR.$sf_app_i18n_dir_name,
+
+  // SF_APP_MODULE_DIR sub-directories names
+  'sf_app_module_action_dir_name'   => 'actions',
+  'sf_app_module_template_dir_name' => 'templates',
+  'sf_app_module_lib_dir_name'      => 'lib',
+  'sf_app_module_view_dir_name'     => 'views',
+  'sf_app_module_validate_dir_name' => 'validate',
+  'sf_app_module_config_dir_name'   => 'config',
+  'sf_app_module_i18n_dir_name'     => 'i18n',
+));
+
+// Remove temporary variables
+foreach (array_diff(array_keys(get_defined_vars()), $usedVars) as $var) {
+    unset($$var);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/constants.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/core_compile.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/config/core_compile.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/config/core_compile.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,37 @@
+- %SF_SYMFONY_LIB_DIR%/action/sfComponent.class.php
+- %SF_SYMFONY_LIB_DIR%/action/sfAction.class.php
+- %SF_SYMFONY_LIB_DIR%/action/sfActions.class.php
+- %SF_SYMFONY_LIB_DIR%/action/sfActionStack.class.php
+- %SF_SYMFONY_LIB_DIR%/action/sfActionStackEntry.class.php
+#- %SF_SYMFONY_LIB_DIR%/config/sfLoader.class.php
+- %SF_SYMFONY_LIB_DIR%/controller/sfController.class.php
+- %SF_SYMFONY_LIB_DIR%/database/sfDatabaseManager.class.php
+- %SF_SYMFONY_LIB_DIR%/filter/sfFilter.class.php
+- %SF_SYMFONY_LIB_DIR%/filter/sfCommonFilter.class.php
+- %SF_SYMFONY_LIB_DIR%/filter/sfExecutionFilter.class.php
+- %SF_SYMFONY_LIB_DIR%/filter/sfRenderingFilter.class.php
+- %SF_SYMFONY_LIB_DIR%/filter/sfFilterChain.class.php
+- %SF_SYMFONY_LIB_DIR%/request/sfRequest.class.php
+- %SF_SYMFONY_LIB_DIR%/response/sfResponse.class.php
+- %SF_SYMFONY_LIB_DIR%/storage/sfStorage.class.php
+- %SF_SYMFONY_LIB_DIR%/user/sfUser.class.php
+- %SF_SYMFONY_LIB_DIR%/util/sfContext.class.php
+- %SF_SYMFONY_LIB_DIR%/validator/sfValidatorManager.class.php
+#- %SF_SYMFONY_LIB_DIR%/util/sfParameterHolder.class.php
+- %SF_SYMFONY_LIB_DIR%/view/sfView.class.php
+
+# these classes are optionals but very likely to be used (in web context)
+#- %SF_SYMFONY_LIB_DIR%/controller/sfRouting.class.php
+- %SF_SYMFONY_LIB_DIR%/controller/sfWebController.class.php
+- %SF_SYMFONY_LIB_DIR%/controller/sfFrontWebController.class.php
+- %SF_SYMFONY_LIB_DIR%/request/sfWebRequest.class.php
+- %SF_SYMFONY_LIB_DIR%/response/sfWebResponse.class.php
+- %SF_SYMFONY_LIB_DIR%/storage/sfSessionStorage.class.php
+- %SF_SYMFONY_LIB_DIR%/view/sfPHPView.class.php
+
+# output escaper
+- %SF_SYMFONY_LIB_DIR%/view/escaper/sfOutputEscaper.class.php
+- %SF_SYMFONY_LIB_DIR%/view/escaper/sfOutputEscaperArrayDecorator.class.php
+- %SF_SYMFONY_LIB_DIR%/view/escaper/sfOutputEscaperGetterDecorator.class.php
+- %SF_SYMFONY_LIB_DIR%/view/escaper/sfOutputEscaperIteratorDecorator.class.php
+- %SF_SYMFONY_LIB_DIR%/view/escaper/sfOutputEscaperObjectDecorator.class.php


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/core_compile.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/factories.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/config/factories.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/config/factories.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,23 @@
+default:
+  controller:
+    class: sfFrontWebController
+
+  request:
+    class: sfWebRequest
+
+  response:
+    class: sfWebResponse
+
+  user:
+    class: myUser
+
+  storage:
+    class: sfSessionStorage
+    param:
+      session_name: symfony
+
+  view_cache:
+    class: sfFileCache
+    param:
+      automaticCleaningFactor: 0
+      cacheDir:                %SF_TEMPLATE_CACHE_DIR%


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/factories.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/filters.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/config/filters.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/config/filters.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,38 @@
+# rendering filter must be the first registered filter
+rendering:
+  class: sfRenderingFilter
+  param:
+    type: rendering
+
+web_debug:
+  class: sfWebDebugFilter
+  param:
+    condition: %SF_WEB_DEBUG%
+
+# security filter must have a type of security
+security:
+  class: sfBasicSecurityFilter
+  param:
+    type:      security
+    condition: %SF_USE_SECURITY%
+
+# generally, you will want to insert your own filters here
+
+cache:
+  class: sfCacheFilter
+  param:
+    condition: %SF_CACHE%
+
+common:
+  class: sfCommonFilter
+
+flash:
+  class: sfFlashFilter
+  param:
+    condition: %SF_USE_FLASH%
+
+# execution filter must be the last registered filter
+execution:
+  class: sfExecutionFilter
+  param:
+    type: execution


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/filters.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/generator.yml
===================================================================


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/generator.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/i18n.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/config/i18n.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/config/i18n.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,7 @@
+default:
+  default_culture:     en
+  source:              XLIFF
+  debug:               off
+  cache:               on
+  untranslated_prefix: "[T]"
+  untranslated_suffix: "[/T]"


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/i18n.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/logging.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/config/logging.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/config/logging.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,16 @@
+default:
+  enabled: on
+  level:   debug
+  rotate:  off
+  period:  7
+  history: 10
+  purge:   on
+  loggers:
+    sf_web_debug:
+      class: sfWebDebugLogger
+      param:
+        condition: %SF_WEB_DEBUG%
+    sf_file_debug:
+      class: sfFileLogger
+      param:
+        file: %SF_LOG_DIR%/%SF_APP%_%SF_ENVIRONMENT%.log


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/logging.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/mailer.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/config/mailer.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/config/mailer.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,16 @@
+default:
+  deliver:           on
+  mailer:            smtp
+  domain:            localhost.localdomain
+  hostname:          localhost
+  port:              25
+  username:          ''
+  password:          ''
+
+  wordwrap:          80
+
+  .headers:
+    priority:        3
+    content_type:    text/plain
+    charset:         utf-8
+    encoding:        8bit


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/mailer.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/module.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/config/module.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/config/module.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,4 @@
+default:
+  enabled:          on
+  view_class:       sfPHP
+  is_internal:      off


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/module.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/php.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/config/php.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/config/php.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,14 @@
+set:
+  magic_quotes_runtime:        off
+  log_errors:                  on
+  arg_separator.output:        |
+    &amp;
+
+check:
+  zend.ze1_compatibility_mode: off
+
+warn:
+  magic_quotes_gpc:            off
+  register_globals:            off
+  session.auto_start:          off
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/php.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/security.yml
===================================================================


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/security.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/settings.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/config/settings.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/config/settings.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,82 @@
+default:
+  .actions:
+    default_module:         default   # Default module and action to be called when
+    default_action:         index     # A routing rule doesn't set it
+
+    error_404_module:       default   # To be called when a 404 error is raised
+    error_404_action:       error404  # Or when the requested URL doesn't match any route
+
+    login_module:           default   # To be called when a non-authenticated user
+    login_action:           login     # Tries to access a secure page
+
+    secure_module:          default   # To be called when a user doesn't have
+    secure_action:          secure    # The credentials required for an action
+
+    module_disabled_module: default   # To be called when a user requests 
+    module_disabled_action: disabled  # A module disabled in the module.yml
+
+    unavailable_module:     default   # To be called when a user requests a page
+    unavailable_action:  unavailable  # From an application disabled via the available setting below
+
+  .settings:
+    available:              on        # Enable the whole application. Switch to off to redirect all requests to the unavailable module and action.
+
+    # Optional features. Deactivating unused features boots performance a bit.
+    use_database:           on        # Enable database manager. Set to off if you don't use a database.
+    use_security:           on        # Enable security features (login and credentials). Set to off for public applications.
+    use_flash:              on        # Enable flash parameter feature. Set to off if you never use the set_flash() method in actions.
+    i18n:                   off       # Enable interface translation. Set to off if your application should not be translated.
+    check_symfony_version:  off       # Enable check of symfony version for every request. Set to on to have symfony clear the cache automatically when the framework is upgraded. Set to off if you always clear the cache after an upgrade.
+    use_process_cache:      on        # Enable symfony optimizations based on PHP accelerators. Set to off for tests or when you have enabled a PHP accelerator in your server but don't want symfony to use it internally.
+    compressed:             off       # Enable PHP response compression. Set to on to compress the outgoing HTML via the PHP handler.
+    check_lock:             off       # Enable the application lock system triggered by the clear-cache and disable tasks. Set to on to have all requests to disabled applications redirected to the $sf_symfony_data_dir/web/arrors/unavailable.php page.
+
+    # Output escaping settings
+    escaping_strategy:      bc        # Determines how variables are made available to templates. Accepted values: bc, both, on, off. The value off deactivates escaping completely and gives a slight boost.
+    escaping_method:   ESC_ENTITIES   # Function or helper used for escaping. Accepted values: ESC_RAW, ESC_ENTITIES, ESC_JS, ESC_JS_NO_ENTITIES.
+
+    # Routing settings
+    suffix:                 .         # Default suffix for generated URLs. If set to a single dot (.), no suffix is added. Possible values: .html, .php, and so on.
+    no_script_name:         off       # Enable the front controller name in generated URLs
+
+    # Validation settings, used for error generation by the Validation helper
+    validation_error_prefix:    ' &darr;&nbsp;'
+    validation_error_suffix:    ' &nbsp;&darr;'
+    validation_error_class:     form_error
+    validation_error_id_prefix: error_for_
+
+    # Cache settings
+    cache:                  off       # Enable the template cache
+    etag:                   on        # Enable etag handling
+
+    # Logging and debugging settings
+    web_debug:              off       # Enable the web debug toolbar
+    error_reporting:        341       # Determines which events are logged. The default value is E_PARSE | E_COMPILE_ERROR | E_ERROR | E_CORE_ERROR | E_USER_ERROR = 341
+
+    # Assets paths
+    rich_text_js_dir:       js/tiny_mce
+    prototype_web_dir:      /sf/prototype
+    admin_web_dir:          /sf/sf_admin
+    web_debug_web_dir:      /sf/sf_web_debug
+    calendar_web_dir:       /sf/calendar
+
+    # Helpers included in all templates by default
+    standard_helpers:       [Partial, Cache, Form]
+
+    # Activated modules from plugins or from the symfony core
+    enabled_modules:        [default]
+
+    # Charset used for the response
+    charset:                utf-8
+
+    # Miscellaneous
+    strip_comments:         on         # Remove comments in core framework classes as defined in the core_compile.yml
+    autoloading_functions:  ~          # Functions called when a class is requested and this it is not already loaded. Expects an array of callables. Used by the framework bridges.
+    timeout:                1800       # Session timeout, in seconds
+    max_forwards:           5
+    path_info_array:        SERVER
+    path_info_key:          PATH_INFO
+    url_format:             PATH
+
+    # ORM
+    orm:                    propel


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/settings.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/view.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/config/view.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/config/view.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+default:


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/config/view.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/data/SANDBOX_README
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/data/SANDBOX_README	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/data/SANDBOX_README	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,100 @@
+symfony sandbox
+===============
+
+Thank you for downloading the symfony sandbox. This pre-configured symfony
+project will allow you to experiment with the symfony framework immediately, 
+without any installation or configuration.
+
+Quick start
+-----------
+
+The sandbox project will work "out of the box", provided that you extract the 
+.tgz archive under the root web directory configured for your server (usually 
+`web/`).
+
+After unpacking the archive, test the sandbox by requesting the following URL:
+
+    http://localhost/sf_sandbox/web/
+    
+You should see a congratulations page.
+
+Command line
+------------
+
+If you are in the `sf_sandbox/` directory, you can use the command line to do 
+usual site management operations. For instance, to clear the cache, type:
+
+    $ ./symfony.sh clear-cache                      (*nix)
+    symfony clear-cache                             (Windows)
+    
+To discover all the available actions of the symfony command line, type:
+
+    $ ./symfony.sh -T                               (*nix)
+    symfony -T                                      (Windows)
+
+Environments
+------------
+
+The sandbox already contains one application called `frontend`, accessible 
+through two environments:
+
+- the default environment is the `prod` one, in which the application is fast 
+  but outputs few error messages
+- the `dev` environment is slower but gives access to a lot of information
+  about the current request
+
+To access the `frontend` application in the `dev` environment, type:
+
+    http://localhost/sf_sandbox/web/frontend_dev.php/
+               (don't forget the final /)
+
+Modules
+-------
+
+To create a new module `mymodule`, just type in the command line:
+
+    $ ./symfony.sh init-module frontend mymodule    (*nix)
+    symfony init-module frontend mymodule           (Windows)
+
+To access it, call:
+
+    http://localhost/sf_sandbox/web/mymodule
+
+If, at this point, you meet an error, this means that your web server doesn't
+support mod_rewrite. Delete the `.htaccess` file from the `web/` directory and
+call instead: 
+
+    http://localhost/sf_sandbox/web/index.php/mymodule
+
+What's in the sandbox?
+----------------------
+
+The sandbox is an empty symfony project where all the required libraries 
+(symfony, pake, creole, propel and phing) are already included (in the 
+`sf_sandbox/lib/` directory). It is configured to work without any 
+configuration if unpacked under the web root, but you can install it anywhere 
+in your disk. In this case,
+
+- delete the 22nd line of the `sf_sandbox/apps/frontend/config/settings.yml`
+  (`relative_url_root: /sf_sandbox/web/`)
+- create a virtual host in your web server configuration to address the 
+  `sf_sandbox/web` directory
+
+The sandbox is intended for you to practice with symfony in a local computer, 
+not really to develop complex applications that may end up on the web. 
+However, the version of symfony shipped with the sandbox is fully functional 
+and equivalent to the one you can install via PEAR.
+
+Beware that the sandbox is not upgradeable.
+
+Happy symfony! 
+--------------
+
+Feel free to experiment and try the various techniques described in the 
+www.symfony-project.com website. All the tutorials can also work in a sandbox. 
+But in the long run, if you decide to go on with symfony, we advise you to 
+switch to a PEAR installation, which will guarantee you with the possibility 
+to use the latest patches and enhancements.
+
+The symfony team
+http://www.symfony-project.com/

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/data/error_messages.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/data/error_messages.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/data/error_messages.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,42 @@
+errors:
+  err0001: |
+    Symfony enforces some `php.ini` values threw the `php.yml` configuration file (under `check` category).
+
+    It seems you have a key in your `php.ini` configuration file with a "un-authorized" value (according to the symfony `php.yml` configuration file).
+
+    How can you fix this problem?
+
+    * change the value in `php.ini`
+
+    * change the `php.yml` file (you must copy the original file referenced in the error message to `yourpoject/config/php.yml` to override it)
+
+    * add `php_value magic_quotes_gpc 0` to the .htaccess of your project
+
+    Here is a sample `php.yml` file:
+
+      set:
+        magic_quotes_runtime: off
+        log_errors:           on
+        arg_separator.output: \&amp;
+
+      check:
+        magic_quotes_gpc:     off
+        register_globals:     off
+
+  err0002: |
+    You want to check a `php.ini` value but the key you specified doesn't exist in `php.ini`.
+
+  err0003: |
+    A class failed to autoload.
+
+    If you run in your production environment and the class is located in a
+    symfony autoload directory (lib, app/lib, app/module/lib), you should try to clear the
+    symfony cache:
+
+            symfony clear-cache
+
+    The mapping between class and file names is done by the autoload.yml configuration file
+    and the result is cached.
+
+    For example, if you just added a new model class and launched a `symfony build-model`,
+    you should always clear the cache in the all environments that have SF_DEBUG to false.


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/data/error_messages.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/data/exception.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/data/exception.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/data/exception.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,61 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+  <title>symfony exception</title>
+  <style>
+  body { margin: 0; padding: 20px; margin-top: 20px; background-color: #eee }
+  body, td, th { font: 11px Verdana, Arial, sans-serif; color: #333 }
+  a { color: #333 }
+  h1 { margin: 0 0 0 10px; padding: 10px 0 10px 0; font-weight: bold; font-size: 120% }
+  h2 { margin: 0; padding: 5px 0; font-size: 110% }
+  ul { padding-left: 20px; list-style: decimal }
+  ul li { padding-bottom: 5px; margin: 0 }
+  ol { font-family: monospace; white-space: pre; list-style-position: inside; margin: 0; padding: 10px 0 }
+  ol li { margin: -5px; padding: 0 }
+  ol .selected { font-weight: bold; background-color: #ddd; padding: 2px 0 }
+  table.vars { padding: 0; margin: 0; border: 1px solid #999; background-color: #fff; }
+  table.vars th { padding: 2px; background-color: #ddd; font-weight: bold }
+  table.vars td  { padding: 2px; font-family: monospace; white-space: pre }
+  p.error { padding: 10px; background-color: #f00; font-weight: bold; text-align: center; -moz-border-radius: 10px; }
+  p.error a { color: #fff }
+  #main { padding: 20px; padding-left: 70px; border: 1px solid #ddd; background-color: #fff; text-align:left; -moz-border-radius: 10px; min-width: 13em; max-width: 52em }
+  #message { padding: 10px; margin-bottom: 10px; background-color: #eee; -moz-border-radius: 10px }
+  </style>
+  <script type="text/javascript">
+  function toggle(id)
+  {
+    el = document.getElementById(id); el.style.display = el.style.display == 'none' ? 'block' : 'none';
+  }
+  </script>
+</head>
+<body>
+  <center><div id="main">
+  <div style="float: right"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAZCAYAAAAiwE4nAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEfklEQVRIx7VUa0wUVxT+Znd2FxZk0YKACAtaGwEDUhUTBTEIItmKYk3UNqalD7StMSQ1JKatP5omTYyx0VRrjPERX7XWAG2t9GVi3drU2h+gi4BCWV67lOe6O/uYmXtPf0BRrMBK6UlObmbON9935p6HQEQI1o7uXeSy1dsjHn2Xlpr0oKzililoEiIKymvOr9q+pzyZZN894moHcbWDZN892lOeTN9fKHgrWB5NsInZ7joOrtv4JgR2F4r0AxTpRwisEes2bsNtW+eBYHmCEqw8kVsp6oy6jMUFYIoTxFUQqWBqNzIWr4aoC9NVnlxZNSWC1mqLsa6ubd36zbug+m3gXBlypoCYAuavx4Ytu1Fbay+2VluME/GJEwHsnT3WpLlzhbi4Z6D46gBosP/gVQDA669kIzJSRWxcApLnPie0dw3cALBw0k1z5dyKrIqyWHL1/Eye7n3kcX5MH75fRAAIAJUUZ5Cnez9JPYfI1XuDKsriqOZcbtakm6alte/yqsIi6LVt4KobxAIAqSPxwUEJxAPgqgcG0YH8NS+gxT5wZVI1/PrU0q1O54OoFfmvQZZsIBYA5zIy0maOYFZmJ4GYAuIyZG8jcvLfgMPhmnHlbG7pUws2NfUeWVvyMpj3d3DVB84C4MyPxNkP+8I0TQRn/qGY6gP316J4w6uob3AceirBzw9nnBD1RmN65nLIUhOIBUBcBjEZ5viQEZx5thFcdQ+50o+A5w7SM5dBFHWhFz5bdOpJ3MLjq63mdHrIr7f6PaXbPtBGht4DUwYAQXikyVTkb/gKtbYBNFpzYYoY3egarR6D7jCcPmtly5ZEh6/ZWucfdyycPep3ycmJ2phoAzx9ziERLoMzN4hJAICI8KEkp4VxcCaP+p4zGdHTw2FOiNB2OTzfAMgf80qrjmem1zf256zf9B6kvmvgqgeqrw2qvx1cGQRxBcQV5GRFIGepaeT5cfdJXbAUPY+79z15l47MWzDmH7a3P/g2Ly9X4O6LkKUWEPeOMbwMpnANiClPDkOBXteL3OXxQnNL72UA5n/V8NLR9Bdrb/ddLN+5VvD23wTA8d9MgNH0LD759DrS5oeUbN7RWjXqSu//OXi8sCBFkN11IFJAxMZ0e4cP12+6xsUQqZC9nShclYTWtsDJUTU8cyDlsE7URqTMC4Eiu8fN+/JVF7I3NuGlna2wlDaPi1VkN1LnR0GvF00n95kPAICm+tgcQ9N9V5ll9Tz4JSem2vySE5bCFDS3+t+uPjbHIA64dF/MioU2aoYGXndgQgJLngnWL0PR1iUje0n4hHimBhA1XYA5IVz8q1eu0oSGqCc6HV4ihAIQgso6MV4flNhDUR/iYqbBI1GqZtM7zVUzZ4p3rl5rQIgxesqvVCsa0O8y4Lc/nGp8rLhcBIA7Df7C7hlKe2ZGojYmZsGUCsqygvOnf6FZsbrtm3bY+wUigiAIC/funlXR0RXYgv/BzAmGn979qGvXyOALghAJQAtAB0A/fIrDY6MNurj/LBqADW8OFYACQB4+2d80or7Ra0ZtxAAAAABJRU5ErkJggg==" /></div>
+  <h1>[<?php echo $name ?>]</h1>
+  <h2 id="message"><?php echo $message ?></h2>
+  <?php if ($error_reference): ?>
+    <p class="error"><a href='http://www.symfony-project.com/errors/<?php echo $error_reference ?>'>learn more about this issue</a></p>
+  <?php endif; ?>
+  <h2>stack trace</h2>
+  <ul><li><?php echo implode('</li><li>', $traces) ?></li></ul>
+
+  <h2>symfony settings <a href="#" onclick="toggle('sf_settings'); return false;">...</a></h2>
+  <div id="sf_settings" style="display: none"><?php echo $settingsTable ?></div>
+
+  <h2>request <a href="#" onclick="toggle('sf_request'); return false;">...</a></h2>
+  <div id="sf_request" style="display: none"><?php echo $requestTable ?></div>
+
+  <h2>response <a href="#" onclick="toggle('sf_response'); return false;">...</a></h2>
+  <div id="sf_response" style="display: none"><?php echo $responseTable ?></div>
+
+  <h2>global vars <a href="#" onclick="toggle('sf_globals'); return false;">...</a></h2>
+  <div id="sf_globals" style="display: none"><?php echo $globalsTable ?></div>
+
+  <p id="footer">
+    symfony v.<?php echo file_get_contents(sfConfig::get('sf_symfony_lib_dir').'/VERSION') ?> - php <?php echo PHP_VERSION ?><br />
+    for help resolving this issue, please visit <a href="http://www.symfony-project.com/">http://www.symfony-project.com/</a>.
+  </p>
+  </div></center>
+</body>
+</html>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/data/exception.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/data/exception.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/data/exception.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/data/exception.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,11 @@
+[exception]   <?php echo $name ?> 
+[message]     <?php echo $message ?> 
+<?php if (count($traces) > 0): ?>
+[stack trace]
+<?php foreach ($traces as $line): ?>
+  <?php echo $line ?>
+
+<?php endforeach; ?>
+<?php endif; ?>
+[symfony]     v. <?php echo sfConfig::get('sf_version') ?> (symfony-project.com)
+[PHP]         v. <?php echo PHP_VERSION ?> 

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/data/mime_types.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/data/mime_types.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/data/mime_types.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:390:{s:24:"application/andrew-inset";s:2:"ez";s:23:"application/appledouble";s:6:"base64";s:21:"application/applefile";s:6:"base64";s:24:"application/commonground";s:2:"dp";s:21:"application/cprplayer";s:3:"pqi";s:19:"application/dsptype";s:3:"tsp";s:17:"application/excel";s:3:"xls";s:22:"application/font-tdpfr";s:3:"pfr";s:24:"application/futuresplash";s:3:"spl";s:16:"application/hstu";s:3:"stk";s:23:"application/hyperstudio";s:3:"stk";s:22:"application/javascript";s:2:"js";s:24:"application/mac-binhex40";s:3:"hqx";s:26:"application/mac-compactpro";s:3:"cpt";s:16:"application/mbed";s:3:"mbd";s:18:"application/mirage";s:3:"mfp";s:18:"application/msword";s:3:"doc";s:24:"application/ocsp-request";s:3:"orq";s:25:"application/ocsp-response";s:3:"ors";s:24:"application/octet-stream";s:3:"exe";s:15:"application/oda";s:3:"oda";s:15:"application/ogg";s:3:"ogg";s:15:"application/pdf";s:3:"pdf";s:25:"application/pgp-encrypted";s:4:"7bit";s:20:"application/pgp-keys";s:4:"7bit";s:25:"application/pgp-signature";s:3:"sig";s:18:"application/pkcs10";s:3:"p10";s:22:"application/pkcs7-mime";s:3:"p7m";s:27:"application/pkcs7-signature";s:3:"p7s";s:21:"application/pkix-cert";s:3:"cer";s:20:"application/pkix-crl";s:3:"crl";s:24:"application/pkix-pkipath";s:7:"pkipath";s:19:"application/pkixcmp";s:3:"pki";s:22:"application/postscript";s:2:"ps";s:25:"application/presentations";s:3:"shw";s:19:"application/prs.cww";s:2:"cw";s:22:"application/prs.nprend";s:3:"rnd";s:17:"application/quest";s:3:"qrt";s:15:"application/rtf";s:3:"rtf";s:29:"application/sgml-open-catalog";s:3:"soc";s:17:"application/sieve";s:3:"siv";s:16:"application/smil";s:3:"smi";s:20:"application/toolbook";s:3:"tbk";s:33:"application/vnd.3gpp.pic-bw-large";s:3:"plb";s:33:"application/vnd.3gpp.pic-bw-small";s:3:"psb";s:31:"application/vnd.3gpp.pic-bw-var";s:3:"pvb";s:24:"application/vnd.3gpp.sms";s:3:"sms";s:23:"application/vnd.acucorp";s:3:"atc";s:26:"application/vnd.adobe.xfdf";s:4:"xfdf";s:25:"application/vnd.amiga.amu";s:3:"ami";s:33:"application/vnd.blueice.multipas
s";s:3:"mpm";s:26:"application/vnd.cinderella";s:3:"cdy";s:27:"application/vnd.cosmocaller";s:3:"cmc";s:37:"application/vnd.criticaltools.wbs+xml";s:3:"wbs";s:20:"application/vnd.curl";s:4:"curl";s:31:"application/vnd.data-vision.rdz";s:3:"rdz";s:28:"application/vnd.dreamfactory";s:4:"dfac";s:28:"application/vnd.fsc.weblauch";s:3:"fsc";s:32:"application/vnd.genomatix.tuxedo";s:3:"txd";s:20:"application/vnd.hbci";s:4:"hbci";s:33:"application/vnd.hhe.lesson-player";s:3:"les";s:23:"application/vnd.hp-hpgl";s:3:"plt";s:36:"application/vnd.ibm.electronic-media";s:3:"emm";s:37:"application/vnd.ibm.rights-management";s:3:"irm";s:36:"application/vnd.ibm.secure-container";s:2:"sc";s:37:"application/vnd.ipunplugged.rcprofile";s:9:"rcprofile";s:39:"application/vnd.irepository.package+xml";s:3:"irp";s:20:"application/vnd.jisp";s:4:"jisp";s:26:"application/vnd.kde.karbon";s:6:"karbon";s:26:"application/vnd.kde.kchart";s:4:"chrt";s:28:"application/vnd.kde.kformula";s:3:"kfo";s:25:"application/vnd.kde.kivio";s:3:"flw";s:27:"application/vnd.kde.kontour";s:3:"kon";s:30:"application/vnd.kde.kpresenter";s:3:"kpr";s:27:"application/vnd.kde.kspread";s:3:"ksp";s:25:"application/vnd.kde.kword";s:3:"kwd";s:25:"application/vnd.kenameapp";s:4:"htke";s:28:"application/vnd.kidspiration";s:3:"kia";s:21:"application/vnd.kinar";s:3:"kne";s:50:"application/vnd.llamagraphics.life-balance.desktop";s:3:"lbd";s:55:"application/vnd.llamagraphics.life-balance.exchange+xml";s:3:"lbe";s:27:"application/vnd.lotus-1-2-3";s:3:"wks";s:19:"application/vnd.mcd";s:3:"mcd";s:20:"application/vnd.mfmp";s:3:"mfm";s:30:"application/vnd.micrografx.flo";s:3:"flo";s:30:"application/vnd.micrografx.igx";s:3:"igx";s:19:"application/vnd.mif";s:3:"mif";s:34:"application/vnd.mophun.application";s:3:"mpn";s:34:"application/vnd.mophun.certificate";s:3:"mpc";s:31:"application/vnd.mozilla.xul+xml";s:3:"xul";s:27:"application/vnd.ms-artgalry";s:3:"cil";s:22:"application/vnd.ms-asf";s:3:"asf";s:24:"application/vnd.ms-excel";s:3:"xls";s:22:"application/vnd.ms-lrm";s:3:"lrm";s:29:
"application/vnd.ms-powerpoint";s:3:"ppt";s:26:"application/vnd.ms-project";s:3:"mpp";s:23:"application/vnd.ms-tnef";s:6:"base64";s:24:"application/vnd.ms-works";s:6:"base64";s:22:"application/vnd.ms-wpl";s:3:"wpl";s:20:"application/vnd.mseq";s:4:"mseq";s:23:"application/vnd.nervana";s:3:"ent";s:34:"application/vnd.nokia.radio-preset";s:4:"rpst";s:35:"application/vnd.nokia.radio-presets";s:4:"rpss";s:20:"application/vnd.palm";s:3:"prc";s:22:"application/vnd.picsel";s:4:"efif";s:25:"application/vnd.pvi.ptid1";s:3:"pti";s:33:"application/vnd.quark.quarkxpress";s:3:"qxd";s:26:"application/vnd.sealed.doc";s:4:"sdoc";s:26:"application/vnd.sealed.eml";s:4:"seml";s:26:"application/vnd.sealed.mht";s:4:"smht";s:26:"application/vnd.sealed.ppt";s:4:"sppt";s:26:"application/vnd.sealed.xls";s:4:"sxls";s:41:"application/vnd.sealedmedia.softseal.html";s:4:"stml";s:40:"application/vnd.sealedmedia.softseal.pdf";s:4:"spdf";s:23:"application/vnd.seemail";s:3:"see";s:20:"application/vnd.smaf";s:3:"mmf";s:28:"application/vnd.sun.xml.calc";s:3:"sxc";s:37:"application/vnd.sun.xml.calc.template";s:3:"stc";s:28:"application/vnd.sun.xml.draw";s:3:"sxd";s:37:"application/vnd.sun.xml.draw.template";s:3:"std";s:31:"application/vnd.sun.xml.impress";s:3:"sxi";s:40:"application/vnd.sun.xml.impress.template";s:3:"sti";s:28:"application/vnd.sun.xml.math";s:3:"sxm";s:30:"application/vnd.sun.xml.writer";s:3:"sxw";s:37:"application/vnd.sun.xml.writer.global";s:3:"sxg";s:39:"application/vnd.sun.xml.writer.template";s:3:"stw";s:28:"application/vnd.sus-calendar";s:3:"sus";s:37:"application/vnd.vidsoft.vidconference";s:3:"vsc";s:21:"application/vnd.visio";s:3:"vsd";s:25:"application/vnd.visionary";s:3:"vis";s:23:"application/vnd.wap.sic";s:3:"sic";s:23:"application/vnd.wap.slc";s:3:"slc";s:25:"application/vnd.wap.wbxml";s:5:"wbxml";s:24:"application/vnd.wap.wmlc";s:4:"wmlc";s:30:"application/vnd.wap.wmlscriptc";s:5:"wmlsc";s:24:"application/vnd.webturbo";s:3:"wtb";s:27:"application/vnd.wordperfect";s:3:"wpd";s:19:"application/vnd.wqd";s:3:"wqd";s:28:"ap
plication/vnd.wv.csp+wbxml";s:2:"wv";s:26:"application/vnd.wv.csp+xml";s:4:"8bit";s:26:"application/vnd.wv.ssp+xml";s:4:"8bit";s:29:"application/vnd.yamaha.hv-dic";s:3:"hvd";s:32:"application/vnd.yamaha.hv-script";s:3:"hvs";s:31:"application/vnd.yamaha.hv-voice";s:3:"hvp";s:33:"application/vnd.yamaha.smaf-audio";s:3:"saf";s:34:"application/vnd.yamaha.smaf-phrase";s:3:"spf";s:31:"application/vocaltec-media-desc";s:3:"vmd";s:31:"application/vocaltec-media-file";s:3:"vmf";s:27:"application/vocaltec-talker";s:3:"vtk";s:27:"application/watcherinfo+xml";s:3:"wif";s:26:"application/wordperfect5.1";s:3:"wp5";s:17:"application/x-123";s:2:"wk";s:29:"application/x-7th_level_event";s:3:"7ls";s:28:"application/x-authorware-bin";s:3:"aab";s:28:"application/x-authorware-map";s:3:"aam";s:28:"application/x-authorware-seg";s:3:"aas";s:19:"application/x-bcpio";s:5:"bcpio";s:21:"application/x-bleeper";s:5:"bleep";s:19:"application/x-bzip2";s:3:"bz2";s:20:"application/x-cdlink";s:3:"vcd";s:18:"application/x-chat";s:4:"chat";s:23:"application/x-chess-pgn";s:3:"pgn";s:22:"application/x-compress";s:1:"z";s:18:"application/x-cpio";s:4:"cpio";s:23:"application/x-cprplayer";s:3:"pqf";s:17:"application/x-csh";s:3:"csh";s:22:"application/x-cu-seeme";s:3:"csm";s:27:"application/x-cult3d-object";s:2:"co";s:28:"application/x-debian-package";s:3:"deb";s:22:"application/x-director";s:3:"dxr";s:17:"application/x-dvi";s:3:"dvi";s:19:"application/x-envoy";s:3:"evy";s:26:"application/x-futuresplash";s:3:"spl";s:18:"application/x-gtar";s:4:"gtar";s:18:"application/x-gzip";s:2:"gz";s:17:"application/x-hdf";s:3:"hdf";s:17:"application/x-hep";s:3:"hep";s:23:"application/x-html+ruby";s:5:"rhtml";s:24:"application/x-httpd-miva";s:2:"mv";s:23:"application/x-httpd-php";s:5:"phtml";s:17:"application/x-ica";s:3:"ica";s:22:"application/x-imagemap";s:8:"imagemap";s:18:"application/x-ipix";s:3:"ipx";s:22:"application/x-ipscript";s:3:"ips";s:26:"application/x-java-archive";s:3:"jar";s:28:"application/x-java-jnlp-file";s:4:"jnlp";s:36:"application/x-java-serialized
-object";s:3:"ser";s:21:"application/x-java-vm";s:5:"class";s:24:"application/x-javascript";s:2:"js";s:18:"application/x-koan";s:3:"skp";s:19:"application/x-latex";s:5:"latex";s:28:"application/x-mac-compactpro";s:3:"cpt";s:19:"application/x-maker";s:3:"frm";s:21:"application/x-mathcad";s:3:"mcd";s:18:"application/x-midi";s:3:"mid";s:17:"application/x-mif";s:3:"mif";s:22:"application/x-msaccess";s:3:"mda";s:27:"application/x-msdos-program";s:3:"com";s:24:"application/x-msdownload";s:6:"base64";s:21:"application/x-msexcel";s:3:"xls";s:20:"application/x-msword";s:3:"doc";s:20:"application/x-netcdf";s:2:"nc";s:33:"application/x-ns-proxy-autoconfig";s:3:"pac";s:23:"application/x-pagemaker";s:3:"pm5";s:18:"application/x-perl";s:2:"pl";s:26:"application/x-pn-realmedia";s:2:"rp";s:20:"application/x-python";s:2:"py";s:29:"application/x-quicktimeplayer";s:3:"qtl";s:28:"application/x-rar-compressed";s:3:"rar";s:18:"application/x-ruby";s:2:"rb";s:16:"application/x-sh";s:2:"sh";s:18:"application/x-shar";s:4:"shar";s:29:"application/x-shockwave-flash";s:3:"swf";s:20:"application/x-sprite";s:3:"spr";s:18:"application/x-spss";s:3:"sav";s:17:"application/x-spt";s:3:"spt";s:21:"application/x-stuffit";s:3:"sit";s:21:"application/x-sv4cpio";s:7:"sv4cpio";s:20:"application/x-sv4crc";s:6:"sv4crc";s:17:"application/x-tar";s:3:"tar";s:17:"application/x-tcl";s:3:"tcl";s:17:"application/x-tex";s:3:"tex";s:21:"application/x-texinfo";s:7:"texinfo";s:19:"application/x-troff";s:1:"t";s:23:"application/x-troff-man";s:3:"man";s:22:"application/x-troff-me";s:2:"me";s:22:"application/x-troff-ms";s:2:"ms";s:20:"application/x-twinvq";s:3:"vqf";s:27:"application/x-twinvq-plugin";s:3:"vqe";s:19:"application/x-ustar";s:5:"ustar";s:23:"application/x-vmsbackup";s:3:"bck";s:25:"application/x-wais-source";s:3:"src";s:19:"application/x-wingz";s:2:"wz";s:18:"application/x-word";s:6:"base64";s:28:"application/x-wordperfect6.1";s:3:"wp6";s:26:"application/x-x509-ca-cert";s:3:"crt";s:28:"application/x-zip-compressed";s:3:"zip";s:21:"application/xhtml+xml";s:5
:"xhtml";s:15:"application/zip";s:3:"zip";s:10:"audio/3gpp";s:4:"3gpp";s:9:"audio/amr";s:3:"amr";s:12:"audio/amr-wb";s:3:"awb";s:11:"audio/basic";s:2:"au";s:10:"audio/evrc";s:3:"evc";s:9:"audio/l16";s:3:"l16";s:10:"audio/midi";s:3:"mid";s:10:"audio/mpeg";s:4:"mpga";s:13:"audio/prs.sid";s:3:"sid";s:11:"audio/qcelp";s:3:"qcp";s:9:"audio/smv";s:3:"smv";s:18:"audio/vnd.audiokoz";s:3:"koz";s:23:"audio/vnd.digital-winds";s:3:"eol";s:20:"audio/vnd.everad.plj";s:3:"plj";s:22:"audio/vnd.lucent.voice";s:3:"lvp";s:26:"audio/vnd.nokia.mobile-xmf";s:4:"mxmf";s:20:"audio/vnd.nortel.vbk";s:3:"vbk";s:25:"audio/vnd.nuera.ecelp4800";s:9:"ecelp4800";s:25:"audio/vnd.nuera.ecelp7470";s:9:"ecelp7470";s:25:"audio/vnd.nuera.ecelp9600";s:9:"ecelp9600";s:35:"audio/vnd.sealedmedia.softseal.mpeg";s:4:"smp3";s:13:"audio/voxware";s:3:"vox";s:12:"audio/x-aiff";s:3:"aif";s:11:"audio/x-mid";s:3:"mid";s:12:"audio/x-midi";s:3:"mid";s:12:"audio/x-mpeg";s:3:"mp2";s:15:"audio/x-mpegurl";s:3:"mpu";s:20:"audio/x-pn-realaudio";s:2:"rm";s:27:"audio/x-pn-realaudio-plugin";s:3:"rpm";s:17:"audio/x-realaudio";s:2:"ra";s:11:"audio/x-wav";s:3:"wav";s:15:"chemical/x-csml";s:3:"csm";s:29:"chemical/x-embl-dl-nucleotide";s:3:"emb";s:24:"chemical/x-gaussian-cube";s:4:"cube";s:25:"chemical/x-gaussian-input";s:3:"gau";s:19:"chemical/x-jcamp-dx";s:3:"jdx";s:22:"chemical/x-mdl-molfile";s:3:"mol";s:22:"chemical/x-mdl-rxnfile";s:3:"rxn";s:18:"chemical/x-mdl-tgf";s:3:"tgf";s:22:"chemical/x-mopac-input";s:3:"mop";s:14:"chemical/x-pdb";s:3:"pdb";s:17:"chemical/x-rasmol";s:3:"scr";s:14:"chemical/x-xyz";s:3:"xyz";s:11:"drawing/dwf";s:3:"dwf";s:13:"drawing/x-dwf";s:3:"dwf";s:14:"i-world/i-vrml";s:3:"ivr";s:9:"image/bmp";s:3:"bmp";s:15:"image/cewavelet";s:3:"wif";s:13:"image/cis-cod";s:3:"cod";s:9:"image/fif";s:3:"fif";s:9:"image/gif";s:3:"gif";s:9:"image/ief";s:3:"ief";s:9:"image/jp2";s:3:"jp2";s:10:"image/jpeg";s:3:"jpg";s:9:"image/jpm";s:3:"jpm";s:9:"image/jpx";s:3:"jpf";s:10:"image/pict";s:3:"pic";s:11:"image/pjpeg";s:3:"jpg";s:9:"image/png";s:3:"png";s:11:"image/targa";s:3
:"tga";s:10:"image/tiff";s:4:"tiff";s:12:"image/vn-svf";s:3:"svf";s:13:"image/vnd.dgn";s:3:"dgn";s:14:"image/vnd.djvu";s:4:"djvu";s:13:"image/vnd.dwg";s:3:"dwg";s:28:"image/vnd.glocalgraphics.pgb";s:3:"pgb";s:24:"image/vnd.microsoft.icon";s:3:"ico";s:17:"image/vnd.ms-modi";s:3:"mdi";s:20:"image/vnd.sealed.png";s:4:"spng";s:34:"image/vnd.sealedmedia.softseal.gif";s:4:"sgif";s:34:"image/vnd.sealedmedia.softseal.jpg";s:4:"sjpg";s:18:"image/vnd.wap.wbmp";s:4:"wbmp";s:11:"image/x-bmp";s:3:"bmp";s:18:"image/x-cmu-raster";s:3:"ras";s:16:"image/x-freehand";s:3:"fh4";s:11:"image/x-png";s:3:"png";s:23:"image/x-portable-anymap";s:3:"pnm";s:23:"image/x-portable-bitmap";s:3:"pbm";s:24:"image/x-portable-graymap";s:3:"pgm";s:23:"image/x-portable-pixmap";s:3:"ppm";s:11:"image/x-rgb";s:3:"rgb";s:15:"image/x-xbitmap";s:3:"xbm";s:15:"image/x-xpixmap";s:3:"xpm";s:19:"image/x-xwindowdump";s:3:"xwd";s:21:"message/external-body";s:4:"8bit";s:12:"message/news";s:4:"8bit";s:15:"message/partial";s:4:"8bit";s:14:"message/rfc822";s:4:"8bit";s:10:"model/iges";s:3:"igs";s:10:"model/mesh";s:3:"msh";s:35:"model/vnd.parasolid.transmit.binary";s:3:"x_b";s:33:"model/vnd.parasolid.transmit.text";s:3:"x_t";s:10:"model/vrml";s:3:"wrl";s:21:"multipart/alternative";s:4:"8bit";s:21:"multipart/appledouble";s:4:"8bit";s:16:"multipart/digest";s:4:"8bit";s:15:"multipart/mixed";s:4:"8bit";s:18:"multipart/parallel";s:4:"8bit";s:27:"text/comma-separated-values";s:3:"csv";s:8:"text/css";s:3:"css";s:9:"text/html";s:4:"html";s:10:"text/plain";s:3:"txt";s:24:"text/prs.fallenstein.rst";s:3:"rst";s:13:"text/richtext";s:3:"rtx";s:8:"text/rtf";s:3:"rtf";s:9:"text/sgml";s:4:"sgml";s:25:"text/tab-separated-values";s:3:"tsv";s:37:"text/vnd.net2phone.commcenter.command";s:3:"ccc";s:32:"text/vnd.sun.j2me.app-descriptor";s:3:"jad";s:15:"text/vnd.wap.si";s:2:"si";s:15:"text/vnd.wap.sl";s:2:"sl";s:16:"text/vnd.wap.wml";s:3:"wml";s:22:"text/vnd.wap.wmlscript";s:4:"wmls";s:11:"text/x-hdml";s:4:"hdml";s:13:"text/x-setext";s:3:"etx";s:11:"text/x-sgml";s:4:"sgml";s:13:"text/x-spee
ch";s:4:"talk";s:16:"text/x-vcalendar";s:3:"vcs";s:12:"text/x-vcard";s:3:"vcf";s:8:"text/xml";s:3:"xml";s:10:"ulead/vrml";s:3:"uvr";s:10:"video/3gpp";s:3:"3gp";s:8:"video/dl";s:2:"dl";s:8:"video/gl";s:2:"gl";s:9:"video/mj2";s:3:"mj2";s:10:"video/mpeg";s:3:"mpg";s:15:"video/quicktime";s:2:"qt";s:9:"video/vdo";s:3:"vdo";s:10:"video/vivo";s:3:"viv";s:13:"video/vnd.fvt";s:3:"fvt";s:17:"video/vnd.mpegurl";s:3:"mxu";s:38:"video/vnd.nokia.interleaved-multimedia";s:3:"nim";s:21:"video/vnd.objectvideo";s:3:"mp4";s:22:"video/vnd.sealed.mpeg1";s:3:"s11";s:22:"video/vnd.sealed.mpeg4";s:4:"smpg";s:20:"video/vnd.sealed.swf";s:4:"sswf";s:34:"video/vnd.sealedmedia.softseal.mov";s:4:"smov";s:14:"video/vnd.vivo";s:4:"vivo";s:11:"video/x-fli";s:3:"fli";s:14:"video/x-ms-asf";s:3:"asf";s:14:"video/x-ms-wmv";s:3:"wmv";s:15:"video/x-msvideo";s:3:"avi";s:17:"video/x-sgi-movie";s:5:"movie";s:16:"x-chemical/x-pdb";s:3:"pdb";s:16:"x-chemical/x-xyz";s:3:"xyz";s:23:"x-conference/x-cooltalk";s:3:"ice";s:13:"x-drawing/dwf";s:3:"dwf";s:13:"x-world/x-d96";s:1:"d";s:13:"x-world/x-svr";s:3:"svr";s:15:"x-world/x-vream";s:3:"vrw";s:14:"x-world/x-vrml";s:3:"wrl";}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/data/mime_types.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/data/mime_types.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/data/mime_types.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,420 @@
+<?php
+
+$data = preg_match_all('/^([a-z0-9\/_\.+-]+) ([a-z0-9_]+)$/mi', file_get_contents(__FILE__), $matches, PREG_SET_ORDER);
+$mime_types = array();
+foreach ($matches as $match)
+{
+  $mime_types[strtolower($match[1])] = strtolower($match[2]);
+}
+
+file_put_contents(dirname(__FILE__).'/mime_types.dat', serialize($mime_types));
+
+/*
+application/andrew-inset ez
+application/appledouble base64
+application/applefile base64
+application/commonground dp
+application/cprplayer pqi
+application/dsptype tsp
+application/excel xls
+application/font-tdpfr pfr
+application/futuresplash spl
+application/hstu stk
+application/hyperstudio stk
+application/javascript js
+application/mac-binhex40 hqx
+application/mac-compactpro cpt
+application/mbed mbd
+application/mirage mfp
+application/msword doc
+application/ocsp-request orq
+application/ocsp-response ors
+application/octet-stream bin
+application/octet-stream exe
+application/oda oda
+application/ogg ogg
+application/pdf pdf
+application/pgp-encrypted 7bit
+application/pgp-keys 7bit
+application/pgp-signature sig
+application/pkcs10 p10
+application/pkcs7-mime p7m
+application/pkcs7-signature p7s
+application/pkix-cert cer
+application/pkix-crl crl
+application/pkix-pkipath pkipath
+application/pkixcmp pki
+application/postscript ai
+application/postscript eps
+application/postscript ps
+application/presentations shw
+application/prs.cww cw
+application/prs.nprend rnd
+application/quest qrt
+application/rtf rtf
+application/sgml-open-catalog soc
+application/sieve siv
+application/smil smi
+application/toolbook tbk
+application/vnd.3gpp.pic-bw-large plb
+application/vnd.3gpp.pic-bw-small psb
+application/vnd.3gpp.pic-bw-var pvb
+application/vnd.3gpp.sms sms
+application/vnd.acucorp atc
+application/vnd.adobe.xfdf xfdf
+application/vnd.amiga.amu ami
+application/vnd.blueice.multipass mpm
+application/vnd.cinderella cdy
+application/vnd.cosmocaller cmc
+application/vnd.criticaltools.wbs+xml wbs
+application/vnd.curl curl
+application/vnd.data-vision.rdz rdz
+application/vnd.dreamfactory dfac
+application/vnd.fsc.weblauch fsc
+application/vnd.genomatix.tuxedo txd
+application/vnd.hbci hbci
+application/vnd.hhe.lesson-player les
+application/vnd.hp-hpgl plt
+application/vnd.ibm.electronic-media emm
+application/vnd.ibm.rights-management irm
+application/vnd.ibm.secure-container sc
+application/vnd.ipunplugged.rcprofile rcprofile
+application/vnd.irepository.package+xml irp
+application/vnd.jisp jisp
+application/vnd.kde.karbon karbon
+application/vnd.kde.kchart chrt
+application/vnd.kde.kformula kfo
+application/vnd.kde.kivio flw
+application/vnd.kde.kontour kon
+application/vnd.kde.kpresenter kpr
+application/vnd.kde.kspread ksp
+application/vnd.kde.kword kwd
+application/vnd.kenameapp htke
+application/vnd.kidspiration kia
+application/vnd.kinar kne
+application/vnd.llamagraphics.life-balance.desktop lbd
+application/vnd.llamagraphics.life-balance.exchange+xml lbe
+application/vnd.lotus-1-2-3 wks
+application/vnd.mcd mcd
+application/vnd.mfmp mfm
+application/vnd.micrografx.flo flo
+application/vnd.micrografx.igx igx
+application/vnd.mif mif
+application/vnd.mophun.application mpn
+application/vnd.mophun.certificate mpc
+application/vnd.mozilla.xul+xml xul
+application/vnd.ms-artgalry cil
+application/vnd.ms-asf asf
+application/vnd.ms-excel xls
+application/vnd.ms-lrm lrm
+application/vnd.ms-powerpoint ppt
+application/vnd.ms-project mpp
+application/vnd.ms-tnef base64
+application/vnd.ms-works base64
+application/vnd.ms-wpl wpl
+application/vnd.mseq mseq
+application/vnd.nervana ent
+application/vnd.nokia.radio-preset rpst
+application/vnd.nokia.radio-presets rpss
+application/vnd.palm prc
+application/vnd.picsel efif
+application/vnd.pvi.ptid1 pti
+application/vnd.quark.quarkxpress qxd
+application/vnd.sealed.doc sdoc
+application/vnd.sealed.eml seml
+application/vnd.sealed.mht smht
+application/vnd.sealed.ppt sppt
+application/vnd.sealed.xls sxls
+application/vnd.sealedmedia.softseal.html stml
+application/vnd.sealedmedia.softseal.pdf spdf
+application/vnd.seemail see
+application/vnd.smaf mmf
+application/vnd.sun.xml.calc sxc
+application/vnd.sun.xml.calc.template stc
+application/vnd.sun.xml.draw sxd
+application/vnd.sun.xml.draw.template std
+application/vnd.sun.xml.impress sxi
+application/vnd.sun.xml.impress.template sti
+application/vnd.sun.xml.math sxm
+application/vnd.sun.xml.writer sxw
+application/vnd.sun.xml.writer.global sxg
+application/vnd.sun.xml.writer.template stw
+application/vnd.sus-calendar sus
+application/vnd.vidsoft.vidconference vsc
+application/vnd.visio vsd
+application/vnd.visionary vis
+application/vnd.wap.sic sic
+application/vnd.wap.slc slc
+application/vnd.wap.wbxml wbxml
+application/vnd.wap.wmlc wmlc
+application/vnd.wap.wmlscriptc wmlsc
+application/vnd.webturbo wtb
+application/vnd.wordperfect wpd
+application/vnd.wqd wqd
+application/vnd.wv.csp+wbxml wv
+application/vnd.wv.csp+xml 8bit
+application/vnd.wv.ssp+xml 8bit
+application/vnd.yamaha.hv-dic hvd
+application/vnd.yamaha.hv-script hvs
+application/vnd.yamaha.hv-voice hvp
+application/vnd.yamaha.smaf-audio saf
+application/vnd.yamaha.smaf-phrase spf
+application/vocaltec-media-desc vmd
+application/vocaltec-media-file vmf
+application/vocaltec-talker vtk
+application/watcherinfo+xml wif
+application/wordperfect5.1 wp5
+application/x-123 wk
+application/x-7th_level_event 7ls
+application/x-authorware-bin aab
+application/x-authorware-map aam
+application/x-authorware-seg aas
+application/x-bcpio bcpio
+application/x-bleeper bleep
+application/x-bzip2 bz2
+application/x-cdlink vcd
+application/x-chat chat
+application/x-chess-pgn pgn
+application/x-compress z
+application/x-cpio cpio
+application/x-cprplayer pqf
+application/x-csh csh
+application/x-cu-seeme csm
+application/x-cult3d-object co
+application/x-debian-package deb
+application/x-director dcr
+application/x-director dir
+application/x-director dxr
+application/x-dvi dvi
+application/x-envoy evy
+application/x-futuresplash spl
+application/x-gtar gtar
+application/x-gzip gz
+application/x-hdf hdf
+application/x-hep hep
+application/x-html+ruby rhtml
+application/x-httpd-miva mv
+application/x-httpd-php phtml
+application/x-ica ica
+application/x-imagemap imagemap
+application/x-ipix ipx
+application/x-ipscript ips
+application/x-java-archive jar
+application/x-java-jnlp-file jnlp
+application/x-java-serialized-object ser
+application/x-java-vm class
+application/x-javascript js
+application/x-koan skp
+application/x-latex latex
+application/x-mac-compactpro cpt
+application/x-maker frm
+application/x-mathcad mcd
+application/x-midi mid
+application/x-mif mif
+application/x-msaccess mda
+application/x-msdos-program cmd
+application/x-msdos-program com
+application/x-msdownload base64
+application/x-msexcel xls
+application/x-msword doc
+application/x-netcdf nc
+application/x-ns-proxy-autoconfig pac
+application/x-pagemaker pm5
+application/x-perl pl
+application/x-pn-realmedia rp
+application/x-python py
+application/x-quicktimeplayer qtl
+application/x-rar-compressed rar
+application/x-ruby rb
+application/x-sh sh
+application/x-shar shar
+application/x-shockwave-flash swf
+application/x-sprite spr
+application/x-spss sav
+application/x-spt spt
+application/x-stuffit sit
+application/x-sv4cpio sv4cpio
+application/x-sv4crc sv4crc
+application/x-tar tar
+application/x-tcl tcl
+application/x-tex tex
+application/x-texinfo texinfo
+application/x-troff t
+application/x-troff-man man
+application/x-troff-me me
+application/x-troff-ms ms
+application/x-twinvq vqf
+application/x-twinvq-plugin vqe
+application/x-ustar ustar
+application/x-vmsbackup bck
+application/x-wais-source src
+application/x-wingz wz
+application/x-word base64
+application/x-wordperfect6.1 wp6
+application/x-x509-ca-cert crt
+application/x-zip-compressed zip
+application/xhtml+xml xhtml
+application/zip zip
+audio/3gpp 3gpp
+audio/amr amr
+audio/amr-wb awb
+audio/basic au
+audio/evrc evc
+audio/l16 l16
+audio/midi mid
+audio/mpeg mp3
+audio/mpeg mpga
+audio/prs.sid sid
+audio/qcelp qcp
+audio/smv smv
+audio/vnd.audiokoz koz
+audio/vnd.digital-winds eol
+audio/vnd.everad.plj plj
+audio/vnd.lucent.voice lvp
+audio/vnd.nokia.mobile-xmf mxmf
+audio/vnd.nortel.vbk vbk
+audio/vnd.nuera.ecelp4800 ecelp4800
+audio/vnd.nuera.ecelp7470 ecelp7470
+audio/vnd.nuera.ecelp9600 ecelp9600
+audio/vnd.sealedmedia.softseal.mpeg smp3
+audio/voxware vox
+audio/x-aiff aif
+audio/x-mid mid
+audio/x-midi mid
+audio/x-mpeg mp2
+audio/x-mpegurl mpu
+audio/x-pn-realaudio ra
+audio/x-pn-realaudio rm
+audio/x-pn-realaudio-plugin rpm
+audio/x-realaudio ra
+audio/x-wav wav
+chemical/x-csml csm
+chemical/x-embl-dl-nucleotide emb
+chemical/x-gaussian-cube cube
+chemical/x-gaussian-input gau
+chemical/x-jcamp-dx jdx
+chemical/x-mdl-molfile mol
+chemical/x-mdl-rxnfile rxn
+chemical/x-mdl-tgf tgf
+chemical/x-mopac-input mop
+chemical/x-pdb pdb
+chemical/x-rasmol scr
+chemical/x-xyz xyz
+drawing/dwf dwf
+drawing/x-dwf dwf
+i-world/i-vrml ivr
+image/bmp bmp
+image/cewavelet wif
+image/cis-cod cod
+image/fif fif
+image/gif gif
+image/ief ief
+image/jp2 jp2
+image/jpeg jpeg
+image/jpeg jpg
+image/jpm jpm
+image/jpx jpf
+image/pict pic
+image/pjpeg jpg
+image/png png
+image/targa tga
+image/tiff tif
+image/tiff tiff
+image/vn-svf svf
+image/vnd.dgn dgn
+image/vnd.djvu djvu
+image/vnd.dwg dwg
+image/vnd.glocalgraphics.pgb pgb
+image/vnd.microsoft.icon ico
+image/vnd.ms-modi mdi
+image/vnd.sealed.png spng
+image/vnd.sealedmedia.softseal.gif sgif
+image/vnd.sealedmedia.softseal.jpg sjpg
+image/vnd.wap.wbmp wbmp
+image/x-bmp bmp
+image/x-cmu-raster ras
+image/x-freehand fh4
+image/x-png png
+image/x-portable-anymap pnm
+image/x-portable-bitmap pbm
+image/x-portable-graymap pgm
+image/x-portable-pixmap ppm
+image/x-rgb rgb
+image/x-xbitmap xbm
+image/x-xpixmap xpm
+image/x-xwindowdump xwd
+message/external-body 8bit
+message/news 8bit
+message/partial 8bit
+message/rfc822 8bit
+model/iges igs
+model/mesh msh
+model/vnd.parasolid.transmit.binary x_b
+model/vnd.parasolid.transmit.text x_t
+model/vrml vrm
+model/vrml wrl
+multipart/alternative 8bit
+multipart/appledouble 8bit
+multipart/digest 8bit
+multipart/mixed 8bit
+multipart/parallel 8bit
+text/comma-separated-values csv
+text/css css
+text/html htm
+text/html html
+text/plain txt
+text/prs.fallenstein.rst rst
+text/richtext rtx
+text/rtf rtf
+text/sgml sgm
+text/sgml sgml
+text/tab-separated-values tsv
+text/vnd.net2phone.commcenter.command ccc
+text/vnd.sun.j2me.app-descriptor jad
+text/vnd.wap.si si
+text/vnd.wap.sl sl
+text/vnd.wap.wml wml
+text/vnd.wap.wmlscript wmls
+text/x-hdml hdml
+text/x-setext etx
+text/x-sgml sgml
+text/x-speech talk
+text/x-vcalendar vcs
+text/x-vcard vcf
+text/xml xml
+ulead/vrml uvr
+video/3gpp 3gp
+video/dl dl
+video/gl gl
+video/mj2 mj2
+video/mpeg mp2
+video/mpeg mpeg
+video/mpeg mpg
+video/quicktime mov
+video/quicktime qt
+video/vdo vdo
+video/vivo viv
+video/vnd.fvt fvt
+video/vnd.mpegurl mxu
+video/vnd.nokia.interleaved-multimedia nim
+video/vnd.objectvideo mp4
+video/vnd.sealed.mpeg1 s11
+video/vnd.sealed.mpeg4 smpg
+video/vnd.sealed.swf sswf
+video/vnd.sealedmedia.softseal.mov smov
+video/vnd.vivo viv
+video/vnd.vivo vivo
+video/x-fli fli
+video/x-ms-asf asf
+video/x-ms-wmv wmv
+video/x-msvideo avi
+video/x-sgi-movie movie
+x-chemical/x-pdb pdb
+x-chemical/x-xyz xyz
+x-conference/x-cooltalk ice
+x-drawing/dwf dwf
+x-world/x-d96 d
+x-world/x-svr svr
+x-world/x-vream vrw
+x-world/x-vrml wrl
+*/


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/data/mime_types.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton/actions/actions.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton/actions/actions.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton/actions/actions.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,13 @@
+<?php
+
+/**
+ * ##MODULE_NAME## actions.
+ *
+ * @package    ##PROJECT_NAME##
+ * @subpackage ##MODULE_NAME##
+ * @author     ##AUTHOR_NAME##
+ * @version    SVN: $Id: actions.class.php 2288 2006-10-02 15:22:13Z fabien $
+ */
+class ##MODULE_NAME##Actions extends auto##MODULE_NAME##Actions
+{
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton/actions/actions.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton/config/generator.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton/config/generator.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton/config/generator.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,5 @@
+generator:
+  class:              sfPropelAdminGenerator
+  param:
+    model_class:      ##MODEL_CLASS##
+    theme:            ##THEME##


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/skeleton/config/generator.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/actions/actions.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/actions/actions.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/actions/actions.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,435 @@
+[?php
+
+/**
+ * <?php echo $this->getGeneratedModuleName() ?> actions.
+ *
+ * @package    ##PROJECT_NAME##
+ * @subpackage <?php echo $this->getGeneratedModuleName() ?>
+
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: actions.class.php 3501 2007-02-18 10:28:17Z fabien $
+ */
+class <?php echo $this->getGeneratedModuleName() ?>Actions extends sfActions
+{
+  public function executeIndex()
+  {
+    return $this->forward('<?php echo $this->getModuleName() ?>', 'list');
+  }
+
+  public function executeList()
+  {
+    $this->processSort();
+
+    $this->processFilters();
+
+<?php if ($this->getParameterValue('list.filters')): ?>
+    $this->filters = $this->getUser()->getAttributeHolder()->getAll('sf_admin/<?php echo $this->getSingularName() ?>/filters');
+<?php endif ?>
+
+    // pager
+    $this->pager = new sfPropelPager('<?php echo $this->getClassName() ?>', <?php echo $this->getParameterValue('list.max_per_page', 20) ?>);
+    $c = new Criteria();
+    $this->addSortCriteria($c);
+    $this->addFiltersCriteria($c);
+    $this->pager->setCriteria($c);
+    $this->pager->setPage($this->getRequestParameter('page', 1));
+<?php if ($this->getParameterValue('list.peer_method')): ?>
+    $this->pager->setPeerMethod('<?php echo $this->getParameterValue('list.peer_method') ?>');
+<?php endif ?>
+<?php if ($this->getParameterValue('list.peer_count_method')): ?>
+    $this->pager->setPeerCountMethod('<?php echo $this->getParameterValue('list.peer_count_method') ?>');
+<?php endif ?>
+    $this->pager->init();
+  }
+
+  public function executeCreate()
+  {
+    return $this->forward('<?php echo $this->getModuleName() ?>', 'edit');
+  }
+
+  public function executeSave()
+  {
+    return $this->forward('<?php echo $this->getModuleName() ?>', 'edit');
+  }
+
+  public function executeEdit()
+  {
+    $this-><?php echo $this->getSingularName() ?> = $this->get<?php echo $this->getClassName() ?>OrCreate();
+
+    if ($this->getRequest()->getMethod() == sfRequest::POST)
+    {
+      $this->update<?php echo $this->getClassName() ?>FromRequest();
+
+      $this->save<?php echo $this->getClassName() ?>($this-><?php echo $this->getSingularName() ?>);
+
+      $this->setFlash('notice', 'Your modifications have been saved');
+
+      if ($this->getRequestParameter('save_and_add'))
+      {
+        return $this->redirect('<?php echo $this->getModuleName() ?>/create');
+      }
+      else if ($this->getRequestParameter('save_and_list'))
+      {
+        return $this->redirect('<?php echo $this->getModuleName() ?>/list');
+      }
+      else
+      {
+        return $this->redirect('<?php echo $this->getModuleName() ?>/edit?<?php echo $this->getPrimaryKeyUrlParams('this->') ?>);
+      }
+    }
+    else
+    {
+      $this->labels = $this->getLabels();
+    }
+  }
+
+  public function executeDelete()
+  {
+    $this-><?php echo $this->getSingularName() ?> = <?php echo $this->getClassName() ?>Peer::retrieveByPk(<?php echo $this->getRetrieveByPkParamsForAction(40) ?>);
+    $this->forward404Unless($this-><?php echo $this->getSingularName() ?>);
+
+    try
+    {
+      $this->delete<?php echo $this->getClassName() ?>($this-><?php echo $this->getSingularName() ?>);
+    }
+    catch (PropelException $e)
+    {
+      $this->getRequest()->setError('delete', 'Could not delete the selected <?php echo sfInflector::humanize($this->getSingularName()) ?>. Make sure it does not have any associated items.');
+      return $this->forward('<?php echo $this->getModuleName() ?>', 'list');
+    }
+
+<?php foreach ($this->getColumnCategories('edit.display') as $category): ?>
+<?php foreach ($this->getColumns('edit.display', $category) as $name => $column): ?>
+<?php $input_type = $this->getParameterValue('edit.fields.'.$column->getName().'.type') ?>
+<?php if ($input_type == 'admin_input_file_tag'): ?>
+<?php $upload_dir = $this->replaceConstants($this->getParameterValue('edit.fields.'.$column->getName().'.upload_dir')) ?>
+      $currentFile = sfConfig::get('sf_upload_dir')."/<?php echo $upload_dir ?>/".$this-><?php echo $this->getSingularName() ?>->get<?php echo $column->getPhpName() ?>();
+      if (is_file($currentFile))
+      {
+        unlink($currentFile);
+      }
+
+<?php endif; ?>
+<?php endforeach; ?>
+<?php endforeach; ?>
+    return $this->redirect('<?php echo $this->getModuleName() ?>/list');
+  }
+
+  public function handleErrorEdit()
+  {
+    $this->preExecute();
+    $this-><?php echo $this->getSingularName() ?> = $this->get<?php echo $this->getClassName() ?>OrCreate();
+    $this->update<?php echo $this->getClassName() ?>FromRequest();
+
+    $this->labels = $this->getLabels();
+
+    return sfView::SUCCESS;
+  }
+
+  protected function save<?php echo $this->getClassName() ?>($<?php echo $this->getSingularName() ?>)
+  {
+    $<?php echo $this->getSingularName() ?>->save();
+
+<?php foreach ($this->getColumnCategories('edit.display') as $category): ?>
+<?php foreach ($this->getColumns('edit.display', $category) as $name => $column): $type = $column->getCreoleType(); ?>
+<?php $name = $column->getName() ?>
+<?php if ($column->isPrimaryKey()) continue ?>
+<?php $credentials = $this->getParameterValue('edit.fields.'.$column->getName().'.credentials') ?>
+<?php $input_type = $this->getParameterValue('edit.fields.'.$column->getName().'.type') ?>
+<?php
+
+$user_params = $this->getParameterValue('edit.fields.'.$column->getName().'.params');
+$user_params = is_array($user_params) ? $user_params : sfToolkit::stringToArray($user_params);
+$through_class = isset($user_params['through_class']) ? $user_params['through_class'] : '';
+
+?>
+<?php if ($through_class): ?>
+<?php
+
+$class = $this->getClassName();
+$related_class = sfPropelManyToMany::getRelatedClass($class, $through_class);
+$related_table = constant($related_class.'Peer::TABLE_NAME');
+$middle_table = constant($through_class.'Peer::TABLE_NAME');
+$this_table = constant($class.'Peer::TABLE_NAME');
+
+$related_column = sfPropelManyToMany::getRelatedColumn($class, $through_class);
+$column = sfPropelManyToMany::getColumn($class, $through_class);
+
+?>
+<?php if ($input_type == 'admin_double_list' || $input_type == 'admin_check_list' || $input_type == 'admin_select_list'): ?>
+<?php if ($credentials): $credentials = str_replace("\n", ' ', var_export($credentials, true)) ?>
+    if ($this->getUser()->hasCredential(<?php echo $credentials ?>))
+    {
+<?php endif; ?>
+      // Update many-to-many for "<?php echo $name ?>"
+      $c = new Criteria();
+      $c->add(<?php echo $through_class ?>Peer::<?php echo strtoupper($column->getColumnName()) ?>, $<?php echo $this->getSingularName() ?>->getPrimaryKey());
+      <?php echo $through_class ?>Peer::doDelete($c);
+
+      $ids = $this->getRequestParameter('associated_<?php echo $name ?>');
+      if (is_array($ids))
+      {
+        foreach ($ids as $id)
+        {
+          $<?php echo ucfirst($through_class) ?> = new <?php echo $through_class ?>();
+          $<?php echo ucfirst($through_class) ?>->set<?php echo $column->getPhpName() ?>($<?php echo $this->getSingularName() ?>->getPrimaryKey());
+          $<?php echo ucfirst($through_class) ?>->set<?php echo $related_column->getPhpName() ?>($id);
+          $<?php echo ucfirst($through_class) ?>->save();
+        }
+      }
+
+<?php if ($credentials): ?>
+    }
+<?php endif; ?>
+<?php endif; ?>
+<?php endif; ?>
+<?php endforeach; ?>
+<?php endforeach; ?>
+  }
+
+  protected function delete<?php echo $this->getClassName() ?>($<?php echo $this->getSingularName() ?>)
+  {
+    $<?php echo $this->getSingularName() ?>->delete();
+  }
+
+  protected function update<?php echo $this->getClassName() ?>FromRequest()
+  {
+    $<?php echo $this->getSingularName() ?> = $this->getRequestParameter('<?php echo $this->getSingularName() ?>');
+
+<?php foreach ($this->getColumnCategories('edit.display') as $category): ?>
+<?php foreach ($this->getColumns('edit.display', $category) as $name => $column): $type = $column->getCreoleType(); ?>
+<?php $name = $column->getName() ?>
+<?php if ($column->isPrimaryKey()) continue ?>
+<?php $credentials = $this->getParameterValue('edit.fields.'.$column->getName().'.credentials') ?>
+<?php $input_type = $this->getParameterValue('edit.fields.'.$column->getName().'.type') ?>
+<?php if ($credentials): $credentials = str_replace("\n", ' ', var_export($credentials, true)) ?>
+    if ($this->getUser()->hasCredential(<?php echo $credentials ?>))
+    {
+<?php endif; ?>
+<?php if ($input_type == 'admin_input_file_tag'): ?>
+<?php $upload_dir = $this->replaceConstants($this->getParameterValue('edit.fields.'.$column->getName().'.upload_dir')) ?>
+    $currentFile = sfConfig::get('sf_upload_dir')."/<?php echo $upload_dir ?>/".$this-><?php echo $this->getSingularName() ?>->get<?php echo $column->getPhpName() ?>();
+    if (!$this->getRequest()->hasErrors() && isset($<?php echo $this->getSingularName() ?>['<?php echo $name ?>_remove']))
+    {
+      $this-><?php echo $this->getSingularName() ?>->set<?php echo $column->getPhpName() ?>('');
+      if (is_file($currentFile))
+      {
+        unlink($currentFile);
+      }
+    }
+
+    if (!$this->getRequest()->hasErrors() && $this->getRequest()->getFileSize('<?php echo $this->getSingularName() ?>[<?php echo $name ?>]'))
+    {
+<?php elseif ($type != CreoleTypes::BOOLEAN): ?>
+    if (isset($<?php echo $this->getSingularName() ?>['<?php echo $name ?>']))
+    {
+<?php endif; ?>
+<?php if ($input_type == 'admin_input_file_tag'): ?>
+<?php if ($this->getParameterValue('edit.fields.'.$column->getName().'.filename')): ?>
+      $fileName = "<?php echo str_replace('"', '\\"', $this->replaceConstants($this->getParameterValue('edit.fields.'.$column->getName().'.filename'))) ?>";
+<?php else: ?>
+      $fileName = md5($this->getRequest()->getFileName('<?php echo $this->getSingularName() ?>[<?php echo $name ?>]').time().rand(0, 99999));
+<?php endif ?>
+      $ext = $this->getRequest()->getFileExtension('<?php echo $this->getSingularName() ?>[<?php echo $name ?>]');
+      if (is_file($currentFile))
+      {
+        unlink($currentFile);
+      }
+      $this->getRequest()->moveFile('<?php echo $this->getSingularName() ?>[<?php echo $name ?>]', sfConfig::get('sf_upload_dir')."/<?php echo $upload_dir ?>/".$fileName.$ext);
+      $this-><?php echo $this->getSingularName() ?>->set<?php echo $column->getPhpName() ?>($fileName.$ext);
+<?php elseif ($type == CreoleTypes::DATE || $type == CreoleTypes::TIMESTAMP): ?>
+      if ($<?php echo $this->getSingularName() ?>['<?php echo $name ?>'])
+      {
+        try
+        {
+          $dateFormat = new sfDateFormat($this->getUser()->getCulture());
+          <?php $inputPattern  = $type == CreoleTypes::DATE ? 'd' : 'g'; ?>
+          <?php $outputPattern = $type == CreoleTypes::DATE ? 'i' : 'I'; ?>
+          if (!is_array($<?php echo $this->getSingularName() ?>['<?php echo $name ?>']))
+          {
+            $value = $dateFormat->format($<?php echo $this->getSingularName() ?>['<?php echo $name ?>'], '<?php echo $outputPattern ?>', $dateFormat->getInputPattern('<?php echo $inputPattern ?>'));
+          }
+          else
+          {
+            $value_array = $<?php echo $this->getSingularName() ?>['<?php echo $name ?>'];
+            $value = $value_array['year'].'-'.$value_array['month'].'-'.$value_array['day'].(isset($value_array['hour']) ? ' '.$value_array['hour'].':'.$value_array['minute'].(isset($value_array['second']) ? ':'.$value_array['second'] : '') : '');
+          }
+          $this-><?php echo $this->getSingularName() ?>->set<?php echo $column->getPhpName() ?>($value);
+        }
+        catch (sfException $e)
+        {
+          // not a date
+        }
+      }
+      else
+      {
+        $this-><?php echo $this->getSingularName() ?>->set<?php echo $column->getPhpName() ?>(null);
+      }
+<?php elseif ($type == CreoleTypes::BOOLEAN): ?>
+    $this-><?php echo $this->getSingularName() ?>->set<?php echo $column->getPhpName() ?>(isset($<?php echo $this->getSingularName() ?>['<?php echo $name ?>']) ? $<?php echo $this->getSingularName() ?>['<?php echo $name ?>'] : 0);
+<?php elseif ($column->isForeignKey()): ?>
+    $this-><?php echo $this->getSingularName() ?>->set<?php echo $column->getPhpName() ?>($<?php echo $this->getSingularName() ?>['<?php echo $name ?>'] ? $<?php echo $this->getSingularName() ?>['<?php echo $name ?>'] : null);
+<?php else: ?>
+      $this-><?php echo $this->getSingularName() ?>->set<?php echo $column->getPhpName() ?>($<?php echo $this->getSingularName() ?>['<?php echo $name ?>']);
+<?php endif; ?>
+<?php if ($type != CreoleTypes::BOOLEAN): ?>
+    }
+<?php endif; ?>
+<?php if ($credentials): ?>
+      }
+<?php endif; ?>
+<?php endforeach; ?>
+<?php endforeach; ?>
+  }
+
+  protected function get<?php echo $this->getClassName() ?>OrCreate(<?php echo $this->getMethodParamsForGetOrCreate() ?>)
+  {
+    if (<?php echo $this->getTestPksForGetOrCreate() ?>)
+    {
+      $<?php echo $this->getSingularName() ?> = new <?php echo $this->getClassName() ?>();
+    }
+    else
+    {
+      $<?php echo $this->getSingularName() ?> = <?php echo $this->getClassName() ?>Peer::retrieveByPk(<?php echo $this->getRetrieveByPkParamsForGetOrCreate() ?>);
+
+      $this->forward404Unless($<?php echo $this->getSingularName() ?>);
+    }
+
+    return $<?php echo $this->getSingularName() ?>;
+  }
+
+  protected function processFilters()
+  {
+<?php if ($this->getParameterValue('list.filters')): ?>
+    if ($this->getRequest()->hasParameter('filter'))
+    {
+      $filters = $this->getRequestParameter('filters');
+<?php foreach ($this->getColumns('list.filters') as $column): $type = $column->getCreoleType() ?>
+<?php if ($type == CreoleTypes::DATE || $type == CreoleTypes::TIMESTAMP): ?>
+      if (isset($filters['<?php echo $column->getName() ?>']['from']) && $filters['<?php echo $column->getName() ?>']['from'] !== '')
+      {
+        $filters['<?php echo $column->getName() ?>']['from'] = sfI18N::getTimestampForCulture($filters['<?php echo $column->getName() ?>']['from'], $this->getUser()->getCulture());
+      }
+      if (isset($filters['<?php echo $column->getName() ?>']['to']) && $filters['<?php echo $column->getName() ?>']['to'] !== '')
+      {
+        $filters['<?php echo $column->getName() ?>']['to'] = sfI18N::getTimestampForCulture($filters['<?php echo $column->getName() ?>']['to'], $this->getUser()->getCulture());
+      }
+<?php endif; ?>
+<?php endforeach; ?>
+
+      $this->getUser()->getAttributeHolder()->removeNamespace('sf_admin/<?php echo $this->getSingularName() ?>/filters');
+      $this->getUser()->getAttributeHolder()->add($filters, 'sf_admin/<?php echo $this->getSingularName() ?>/filters');
+    }
+<?php endif; ?>
+  }
+
+  protected function processSort()
+  {
+    if ($this->getRequestParameter('sort'))
+    {
+      $this->getUser()->setAttribute('sort', $this->getRequestParameter('sort'), 'sf_admin/<?php echo $this->getSingularName() ?>/sort');
+      $this->getUser()->setAttribute('type', $this->getRequestParameter('type', 'asc'), 'sf_admin/<?php echo $this->getSingularName() ?>/sort');
+    }
+
+    if (!$this->getUser()->getAttribute('sort', null, 'sf_admin/<?php echo $this->getSingularName() ?>/sort'))
+    {
+<?php if ($sort = $this->getParameterValue('list.sort')): ?>
+<?php if (is_array($sort)): ?>
+      $this->getUser()->setAttribute('sort', '<?php echo $sort[0] ?>', 'sf_admin/<?php echo $this->getSingularName() ?>/sort');
+      $this->getUser()->setAttribute('type', '<?php echo $sort[1] ?>', 'sf_admin/<?php echo $this->getSingularName() ?>/sort');
+<?php else: ?>
+      $this->getUser()->setAttribute('sort', '<?php echo $sort ?>', 'sf_admin/<?php echo $this->getSingularName() ?>/sort');
+      $this->getUser()->setAttribute('type', 'asc', 'sf_admin/<?php echo $this->getSingularName() ?>/sort');
+<?php endif; ?>
+<?php endif; ?>
+    }
+  }
+
+  protected function addFiltersCriteria($c)
+  {
+<?php if ($this->getParameterValue('list.filters')): ?>
+<?php foreach ($this->getColumns('list.filters') as $column): $type = $column->getCreoleType() ?>
+<?php if (($column->isPartial() || $column->isComponent()) && $this->getParameterValue('list.fields.'.$column->getName().'.filter_criteria_disabled')) continue ?>
+    if (isset($this->filters['<?php echo $column->getName() ?>_is_empty']))
+    {
+      $criterion = $c->getNewCriterion(<?php echo $this->getPeerClassName() ?>::<?php echo strtoupper($column->getName()) ?>, '');
+      $criterion->addOr($c->getNewCriterion(<?php echo $this->getPeerClassName() ?>::<?php echo strtoupper($column->getName()) ?>, null, Criteria::ISNULL));
+      $c->add($criterion);
+    }
+<?php if ($type == CreoleTypes::DATE || $type == CreoleTypes::TIMESTAMP): ?>
+    else if (isset($this->filters['<?php echo $column->getName() ?>']))
+    {
+      if (isset($this->filters['<?php echo $column->getName() ?>']['from']) && $this->filters['<?php echo $column->getName() ?>']['from'] !== '')
+      {
+<?php if ($type == CreoleTypes::DATE): ?>
+        $criterion = $c->getNewCriterion(<?php echo $this->getPeerClassName() ?>::<?php echo strtoupper($column->getName()) ?>, date('Y-m-d', $this->filters['<?php echo $column->getName() ?>']['from']), Criteria::GREATER_EQUAL);
+<?php else: ?>
+        $criterion = $c->getNewCriterion(<?php echo $this->getPeerClassName() ?>::<?php echo strtoupper($column->getName()) ?>, $this->filters['<?php echo $column->getName() ?>']['from'], Criteria::GREATER_EQUAL);
+<?php endif; ?>
+      }
+      if (isset($this->filters['<?php echo $column->getName() ?>']['to']) && $this->filters['<?php echo $column->getName() ?>']['to'] !== '')
+      {
+        if (isset($criterion))
+        {
+<?php if ($type == CreoleTypes::DATE): ?>
+          $criterion->addAnd($c->getNewCriterion(<?php echo $this->getPeerClassName() ?>::<?php echo strtoupper($column->getName()) ?>, date('Y-m-d', $this->filters['<?php echo $column->getName() ?>']['to']), Criteria::LESS_EQUAL));
+<?php else: ?>
+          $criterion->addAnd($c->getNewCriterion(<?php echo $this->getPeerClassName() ?>::<?php echo strtoupper($column->getName()) ?>, $this->filters['<?php echo $column->getName() ?>']['to'], Criteria::LESS_EQUAL));
+<?php endif; ?>
+        }
+        else
+        {
+<?php if ($type == CreoleTypes::DATE): ?>
+          $criterion = $c->getNewCriterion(<?php echo $this->getPeerClassName() ?>::<?php echo strtoupper($column->getName()) ?>, date('Y-m-d', $this->filters['<?php echo $column->getName() ?>']['to']), Criteria::LESS_EQUAL);
+<?php else: ?>
+          $criterion = $c->getNewCriterion(<?php echo $this->getPeerClassName() ?>::<?php echo strtoupper($column->getName()) ?>, $this->filters['<?php echo $column->getName() ?>']['to'], Criteria::LESS_EQUAL);
+<?php endif; ?>
+        }
+      }
+
+      if (isset($criterion))
+      {
+        $c->add($criterion);
+      }
+    }
+<?php else: ?>
+    else if (isset($this->filters['<?php echo $column->getName() ?>']) && $this->filters['<?php echo $column->getName() ?>'] !== '')
+    {
+<?php if ($type == CreoleTypes::CHAR || $type == CreoleTypes::VARCHAR || $type == CreoleTypes::LONGVARCHAR): ?>
+      $c->add(<?php echo $this->getPeerClassName() ?>::<?php echo strtoupper($column->getName()) ?>, strtr($this->filters['<?php echo $column->getName() ?>'], '*', '%'), Criteria::LIKE);
+<?php else: ?>
+      $c->add(<?php echo $this->getPeerClassName() ?>::<?php echo strtoupper($column->getName()) ?>, $this->filters['<?php echo $column->getName() ?>']);
+<?php endif; ?>
+    }
+<?php endif; ?>
+<?php endforeach; ?>
+<?php endif; ?>
+  }
+
+  protected function addSortCriteria($c)
+  {
+    if ($sort_column = $this->getUser()->getAttribute('sort', null, 'sf_admin/<?php echo $this->getSingularName() ?>/sort'))
+    {
+      $sort_column = <?php echo $this->getClassName() ?>Peer::translateFieldName($sort_column, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME);
+      if ($this->getUser()->getAttribute('type', null, 'sf_admin/<?php echo $this->getSingularName() ?>/sort') == 'asc')
+      {
+        $c->addAscendingOrderByColumn($sort_column);
+      }
+      else
+      {
+        $c->addDescendingOrderByColumn($sort_column);
+      }
+    }
+  }
+
+  protected function getLabels()
+  {
+    return array(
+<?php foreach ($this->getColumnCategories('edit.display') as $category): ?>
+<?php foreach ($this->getColumns('edit.display', $category) as $name => $column): ?>
+      '<?php echo $this->getSingularName() ?>{<?php echo $column->getName() ?>}' => '<?php $label_name = str_replace("'", "\\'", $this->getParameterValue('edit.fields.'.$column->getName().'.name')); echo $label_name ?><?php if ($label_name): ?>:<?php endif ?>',
+<?php endforeach; ?>
+<?php endforeach; ?>
+    );
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/actions/actions.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_actions.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_actions.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_actions.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,13 @@
+<ul class="sf_admin_actions">
+<?php $editActions = $this->getParameterValue('edit.actions') ?>
+<?php if (null !== $editActions): ?>
+<?php foreach ((array) $editActions as $actionName => $params): ?>
+  <?php if ($actionName == '_delete') continue ?>
+  <?php echo $this->addCredentialCondition($this->getButtonToAction($actionName, $params, true), $params) ?>
+<?php endforeach; ?>
+<?php else: ?>
+  <?php echo $this->getButtonToAction('_list', array(), true) ?>
+  <?php echo $this->getButtonToAction('_save', array(), true) ?>
+  <?php echo $this->getButtonToAction('_save_and_add', array(), true) ?>
+<?php endif; ?>
+</ul>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_actions.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_footer.php
===================================================================


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_footer.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_form.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_form.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_form.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,86 @@
+[?php echo form_tag('<?php echo $this->getModuleName() ?>/edit', array(
+  'id'        => 'sf_admin_edit_form',
+  'name'      => 'sf_admin_edit_form',
+  'multipart' => true,
+<?php foreach ($this->getColumnCategories('edit.display') as $category): ?>
+<?php foreach ($this->getColumns('edit.display', $category) as $name => $column): ?>
+<?php if ('admin_double_list' == $this->getParameterValue('edit.fields.'.$column->getName().'.type')): ?>
+  'onsubmit'  => 'double_list_submit(); return true;'
+<?php break 2; ?>
+<?php endif; ?>
+<?php endforeach; ?>
+<?php endforeach; ?>
+)) ?]
+
+<?php foreach ($this->getPrimaryKey() as $pk): ?>
+[?php echo object_input_hidden_tag($<?php echo $this->getSingularName() ?>, 'get<?php echo $pk->getPhpName() ?>') ?]
+<?php endforeach; ?>
+
+<?php $first = true ?>
+<?php foreach ($this->getColumnCategories('edit.display') as $category): ?>
+<?php
+  if ($category[0] == '-')
+  {
+    $category_name = substr($category, 1);
+    $collapse = true;
+
+    if ($first)
+    {
+      $first = false;
+      echo "[?php use_javascript(sfConfig::get('sf_prototype_web_dir').'/js/prototype') ?]\n";
+      echo "[?php use_javascript(sfConfig::get('sf_admin_web_dir').'/js/collapse') ?]\n";
+    }
+  }
+  else
+  {
+    $category_name = $category;
+    $collapse = false;
+  }
+?>
+<fieldset id="sf_fieldset_<?php echo preg_replace('/[^a-z0-9_]/', '_', strtolower($category_name)) ?>" class="<?php if ($collapse): ?> collapse<?php endif; ?>">
+<?php if ($category != 'NONE'): ?><h2>[?php echo __('<?php echo $category_name ?>') ?]</h2>
+
+<?php endif; ?>
+
+<?php $hides = $this->getParameterValue('edit.hide', array()) ?>
+<?php foreach ($this->getColumns('edit.display', $category) as $name => $column): ?>
+<?php if (in_array($column->getName(), $hides)) continue ?>
+<?php if ($column->isPrimaryKey()) continue ?>
+<?php $credentials = $this->getParameterValue('edit.fields.'.$column->getName().'.credentials') ?>
+<?php if ($credentials): $credentials = str_replace("\n", ' ', var_export($credentials, true)) ?>
+    [?php if ($sf_user->hasCredential(<?php echo $credentials ?>)): ?]
+<?php endif; ?>
+<div class="form-row">
+  [?php echo label_for('<?php echo $this->getParameterValue("edit.fields.".$column->getName().".label_for", $this->getSingularName()."[".$column->getName()."]") ?>', __($labels['<?php echo $this->getSingularName() ?>{<?php echo $column->getName() ?>}']), '<?php if ($column->isNotNull()): ?>class="required" <?php endif; ?>') ?]
+  <div class="content[?php if ($sf_request->hasError('<?php echo $this->getSingularName() ?>{<?php echo $column->getName() ?>}')): ?] form-error[?php endif; ?]">
+  [?php if ($sf_request->hasError('<?php echo $this->getSingularName() ?>{<?php echo $column->getName() ?>}')): ?]
+    [?php echo form_error('<?php echo $this->getSingularName() ?>{<?php echo $column->getName() ?>}', array('class' => 'form-error-msg')) ?]
+  [?php endif; ?]
+
+  [?php $value = <?php echo $this->getColumnEditTag($column); ?>; echo $value ? $value : '&nbsp;' ?]
+  <?php echo $this->getHelp($column, 'edit') ?>
+  </div>
+</div>
+<?php if ($credentials): ?>
+    [?php endif; ?]
+<?php endif; ?>
+
+<?php endforeach; ?>
+</fieldset>
+<?php endforeach; ?>
+
+[?php include_partial('edit_actions', array('<?php echo $this->getSingularName() ?>' => $<?php echo $this->getSingularName() ?>)) ?]
+
+</form>
+
+<ul class="sf_admin_actions">
+<?php
+/*
+ * WARNING: delete is a form, it must be outside the main form
+ */
+ $editActions = $this->getParameterValue('edit.actions');
+?>
+  <?php if (null === $editActions || (null !== $editActions && array_key_exists('_delete', $editActions))): ?>
+    <?php echo $this->addCredentialCondition($this->getButtonToAction('_delete', $editActions['_delete'], true), $editActions['_delete']) ?>
+  <?php endif; ?>
+</ul>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_form.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_header.php
===================================================================


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_header.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_messages.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_messages.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_messages.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,15 @@
+[?php if ($sf_request->hasErrors()): ?]
+<div class="form-errors">
+<h2>[?php echo __('There are some errors that prevent the form to validate') ?]</h2>
+<dl>
+[?php foreach ($sf_request->getErrorNames() as $name): ?]
+  <dt>[?php echo __($labels[$name]) ?]</dt>
+  <dd>[?php echo $sf_request->getError($name) ?]</dd>
+[?php endforeach; ?]
+</dl>
+</div>
+[?php elseif ($sf_flash->has('notice')): ?]
+<div class="save-ok">
+<h2>[?php echo __($sf_flash->get('notice')) ?]</h2>
+</div>
+[?php endif; ?]


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_edit_messages.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_filters.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_filters.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_filters.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,37 @@
+[?php use_helper('Object') ?]
+
+<?php if ($this->getParameterValue('list.filters')): ?>
+<div class="sf_admin_filters">
+[?php echo form_tag('<?php echo $this->getModuleName() ?>/list', array('method' => 'get')) ?]
+
+  <fieldset>
+    <h2>[?php echo __('filters') ?]</h2>
+<?php foreach ($this->getColumns('list.filters') as $column): $type = $column->getCreoleType() ?>
+<?php $credentials = $this->getParameterValue('list.fields.'.$column->getName().'.credentials') ?>
+<?php if ($credentials): $credentials = str_replace("\n", ' ', var_export($credentials, true)) ?>
+    [?php if ($sf_user->hasCredential(<?php echo $credentials ?>)): ?]
+<?php endif; ?>
+    <div class="form-row">
+    <label for="<?php echo $column->getName() ?>">[?php echo __('<?php echo str_replace("'", "\\'", $this->getParameterValue('list.fields.'.$column->getName().'.name')) ?>:') ?]</label>
+    <div class="content">
+    [?php echo <?php echo $this->getColumnFilterTag($column) ?> ?]
+<?php if ($this->getParameterValue('list.fields.'.$column->getName().'.filter_is_empty')): ?>
+    <div>[?php echo checkbox_tag('filters[<?php echo $column->getName() ?>_is_empty]', 1, isset($filters['<?php echo $column->getName() ?>_is_empty']) ? $filters['<?php echo $column->getName() ?>_is_empty'] : null) ?]&nbsp;<label for="filters[<?php echo $column->getName() ?>_is_empty]">[?php echo __('is empty') ?]</label></div>
+<?php endif; ?>
+    </div>
+    </div>
+<?php if ($credentials): ?>
+    [?php endif; ?]
+<?php endif; ?>
+
+    <?php endforeach; ?>
+  </fieldset>
+
+  <ul class="sf_admin_actions">
+    <li>[?php echo button_to(__('reset'), '<?php echo $this->getModuleName() ?>/list?filter=filter', 'class=sf_admin_action_reset_filter') ?]</li>
+    <li>[?php echo submit_tag(__('filter'), 'name=filter class=sf_admin_action_filter') ?]</li>
+  </ul>
+
+</form>
+</div>
+<?php endif; ?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_filters.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,36 @@
+<table cellspacing="0" class="sf_admin_list">
+<thead>
+<tr>
+[?php include_partial('list_th_<?php echo $this->getParameterValue('list.layout', 'tabular') ?>') ?]
+<?php if ($this->getParameterValue('list.object_actions')): ?>
+  <th id="sf_admin_list_th_sf_actions">[?php echo __('Actions') ?]</th>
+<?php endif; ?>
+</tr>
+</thead>
+<tbody>
+[?php $i = 1; foreach ($pager->getResults() as $<?php echo $this->getSingularName() ?>): $odd = fmod(++$i, 2) ?]
+<tr class="sf_admin_row_[?php echo $odd ?]">
+[?php include_partial('list_td_<?php echo $this->getParameterValue('list.layout', 'tabular') ?>', array('<?php echo $this->getSingularName() ?>' => $<?php echo $this->getSingularName() ?>)) ?]
+[?php include_partial('list_td_actions', array('<?php echo $this->getSingularName() ?>' => $<?php echo $this->getSingularName() ?>)) ?]
+</tr>
+[?php endforeach; ?]
+</tbody>
+<tfoot>
+<tr><th colspan="<?php echo $this->getParameterValue('list.object_actions') ? count($this->getColumns('list.display')) + 1 : count($this->getColumns('list.display')) ?>">
+<div class="float-right">
+[?php if ($pager->haveToPaginate()): ?]
+  [?php echo link_to(image_tag(sfConfig::get('sf_admin_web_dir').'/images/first.png', array('align' => 'absmiddle', 'alt' => __('First'), 'title' => __('First'))), '<?php echo $this->getModuleName() ?>/list?page=1') ?]
+  [?php echo link_to(image_tag(sfConfig::get('sf_admin_web_dir').'/images/previous.png', array('align' => 'absmiddle', 'alt' => __('Previous'), 'title' => __('Previous'))), '<?php echo $this->getModuleName() ?>/list?page='.$pager->getPreviousPage()) ?]
+
+  [?php foreach ($pager->getLinks() as $page): ?]
+    [?php echo link_to_unless($page == $pager->getPage(), $page, '<?php echo $this->getModuleName() ?>/list?page='.$page) ?]
+  [?php endforeach; ?]
+
+  [?php echo link_to(image_tag(sfConfig::get('sf_admin_web_dir').'/images/next.png', array('align' => 'absmiddle', 'alt' => __('Next'), 'title' => __('Next'))), '<?php echo $this->getModuleName() ?>/list?page='.$pager->getNextPage()) ?]
+  [?php echo link_to(image_tag(sfConfig::get('sf_admin_web_dir').'/images/last.png', array('align' => 'absmiddle', 'alt' => __('Last'), 'title' => __('Last'))), '<?php echo $this->getModuleName() ?>/list?page='.$pager->getLastPage()) ?]
+[?php endif; ?]
+</div>
+[?php echo format_number_choice('[0] no result|[1] 1 result|(1,+Inf] %1% results', array('%1%' => $pager->getNbResults()), $pager->getNbResults()) ?]
+</th></tr>
+</tfoot>
+</table>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_actions.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_actions.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_actions.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,10 @@
+<ul class="sf_admin_actions">
+<?php $listActions = $this->getParameterValue('list.actions') ?>
+<?php if (null !== $listActions): ?>
+  <?php foreach ((array) $listActions as $actionName => $params): ?>
+    <?php echo $this->addCredentialCondition($this->getButtonToAction($actionName, $params, false), $params) ?>
+  <?php endforeach; ?>
+<?php else: ?>
+  <?php echo $this->getButtonToAction('_create', array(), false) ?>
+<?php endif; ?>
+</ul>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_actions.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_footer.php
===================================================================


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_footer.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_header.php
===================================================================


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_header.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_messages.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_messages.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_messages.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,8 @@
+[?php if ($sf_request->getError('delete')): ?]
+<div class="form-errors">
+  <h2>Could not delete the selected <?php echo sfInflector::humanize($this->getSingularName()) ?></h2>
+  <ul>
+    <li>[?php echo $sf_request->getError('delete') ?]</li>
+  </ul>
+</div>
+[?php endif; ?]


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_messages.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_td_actions.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_td_actions.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_td_actions.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,9 @@
+<?php if ($this->getParameterValue('list.object_actions')): ?>
+<td>
+<ul class="sf_admin_td_actions">
+<?php foreach ($this->getParameterValue('list.object_actions') as $actionName => $params): ?>
+  <?php echo $this->addCredentialCondition($this->getLinkToAction($actionName, $params, true), $params) ?>
+<?php endforeach; ?>
+</ul>
+</td>
+<?php endif; ?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_td_actions.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_td_stacked.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_td_stacked.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_td_stacked.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,16 @@
+<td colspan="<?php echo count($this->getColumns('list.display'))  ?>">
+<?php if ($this->getParameterValue('list.params')): ?>
+  <?php echo $this->getI18NString('list.params') ?>
+<?php else: ?>
+<?php $hides = $this->getParameterValue('list.hide', array()) ?>
+<?php foreach ($this->getColumns('list.display') as $column): ?>
+<?php if (in_array($column->getName(), $hides)) continue ?>
+  <?php if ($column->isLink()): ?>
+  [?php echo link_to(<?php echo $this->getColumnListTag($column) ?> ? <?php echo $this->getColumnListTag($column) ?> : __('-'), '<?php echo $this->getModuleName() ?>/edit?<?php echo $this->getPrimaryKeyUrlParams() ?>) ?]
+  <?php else: ?>
+  [?php echo <?php echo $this->getColumnListTag($column) ?> ?]
+  <?php endif; ?>
+   - 
+<?php endforeach; ?>
+<?php endif; ?>
+</td>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_td_stacked.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_td_tabular.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_td_tabular.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_td_tabular.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,16 @@
+<?php $hs = $this->getParameterValue('list.hide', array()) ?>
+<?php foreach ($this->getColumns('list.display') as $column): ?>
+<?php if (in_array($column->getName(), $hs)) continue ?>
+<?php $credentials = $this->getParameterValue('list.fields.'.$column->getName().'.credentials') ?>
+<?php if ($credentials): $credentials = str_replace("\n", ' ', var_export($credentials, true)) ?>
+    [?php if ($sf_user->hasCredential(<?php echo $credentials ?>)): ?]
+<?php endif; ?>
+  <?php if ($column->isLink()): ?>
+  <td>[?php echo link_to(<?php echo $this->getColumnListTag($column) ?> ? <?php echo $this->getColumnListTag($column) ?> : __('-'), '<?php echo $this->getModuleName() ?>/edit?<?php echo $this->getPrimaryKeyUrlParams() ?>) ?]</td>
+<?php else: ?>
+  <td>[?php echo <?php echo $this->getColumnListTag($column) ?> ?]</td>
+  <?php endif; ?>
+<?php if ($credentials): ?>
+    [?php endif; ?]
+<?php endif; ?>
+<?php endforeach; ?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_td_tabular.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_th_stacked.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_th_stacked.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_th_stacked.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+[?php include_partial('list_th_tabular') ?]


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_th_stacked.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_th_tabular.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_th_tabular.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_th_tabular.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,24 @@
+<?php $hides = $this->getParameterValue('list.hide', array()) ?>
+<?php foreach ($this->getColumns('list.display') as $column): ?>
+<?php if (in_array($column->getName(), $hides)) continue ?>
+<?php $credentials = $this->getParameterValue('list.fields.'.$column->getName().'.credentials') ?>
+<?php if ($credentials): $credentials = str_replace("\n", ' ', var_export($credentials, true)) ?>
+    [?php if ($sf_user->hasCredential(<?php echo $credentials ?>)): ?]
+<?php endif; ?>
+  <th id="sf_admin_list_th_<?php echo $column->getName() ?>">
+    <?php if ($column->isReal()): ?>
+      [?php if ($sf_user->getAttribute('sort', null, 'sf_admin/<?php echo $this->getSingularName() ?>/sort') == '<?php echo $column->getName() ?>'): ?]
+      [?php echo link_to(__('<?php echo str_replace("'", "\\'", $this->getParameterValue('list.fields.'.$column->getName().'.name')) ?>'), '<?php echo $this->getModuleName() ?>/list?sort=<?php echo $column->getName() ?>&type='.($sf_user->getAttribute('type', 'asc', 'sf_admin/<?php echo $this->getSingularName() ?>/sort') == 'asc' ? 'desc' : 'asc')) ?]
+      ([?php echo __($sf_user->getAttribute('type', 'asc', 'sf_admin/<?php echo $this->getSingularName() ?>/sort')) ?])
+      [?php else: ?]
+      [?php echo link_to(__('<?php echo str_replace("'", "\\'", $this->getParameterValue('list.fields.'.$column->getName().'.name')) ?>'), '<?php echo $this->getModuleName() ?>/list?sort=<?php echo $column->getName() ?>&type=asc') ?]
+      [?php endif; ?]
+    <?php else: ?>
+    [?php echo __('<?php echo str_replace("'", "\\'", $this->getParameterValue('list.fields.'.$column->getName().'.name')) ?>') ?]
+    <?php endif; ?>
+    <?php echo $this->getHelpAsIcon($column, 'list') ?>
+  </th>
+<?php if ($credentials): ?>
+    [?php endif; ?]
+<?php endif; ?>
+<?php endforeach; ?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/_list_th_tabular.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/editSuccess.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/editSuccess.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/editSuccess.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,22 @@
+[?php use_helper('Object', 'Validation', 'ObjectAdmin', 'I18N', 'Date') ?]
+
+[?php use_stylesheet('<?php echo $this->getParameterValue('css', sfConfig::get('sf_admin_web_dir').'/css/main') ?>') ?]
+
+<div id="sf_admin_container">
+
+<h1><?php echo $this->getI18NString('edit.title', 'edit '.$this->getModuleName()) ?></h1>
+
+<div id="sf_admin_header">
+[?php include_partial('<?php echo $this->getModuleName() ?>/edit_header', array('<?php echo $this->getSingularName() ?>' => $<?php echo $this->getSingularName() ?>)) ?]
+</div>
+
+<div id="sf_admin_content">
+[?php include_partial('<?php echo $this->getModuleName() ?>/edit_messages', array('<?php echo $this->getSingularName() ?>' => $<?php echo $this->getSingularName() ?>, 'labels' => $labels)) ?]
+[?php include_partial('<?php echo $this->getModuleName() ?>/edit_form', array('<?php echo $this->getSingularName() ?>' => $<?php echo $this->getSingularName() ?>, 'labels' => $labels)) ?]
+</div>
+
+<div id="sf_admin_footer">
+[?php include_partial('<?php echo $this->getModuleName() ?>/edit_footer', array('<?php echo $this->getSingularName() ?>' => $<?php echo $this->getSingularName() ?>)) ?]
+</div>
+
+</div>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/editSuccess.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/listSuccess.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/listSuccess.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/listSuccess.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,33 @@
+[?php use_helper('I18N', 'Date') ?]
+
+[?php use_stylesheet('<?php echo $this->getParameterValue('css', sfConfig::get('sf_admin_web_dir').'/css/main') ?>') ?]
+
+<div id="sf_admin_container">
+
+<h1><?php echo $this->getI18NString('list.title', $this->getModuleName().' list') ?></h1>
+
+<div id="sf_admin_header">
+[?php include_partial('<?php echo $this->getModuleName() ?>/list_header', array('pager' => $pager)) ?]
+[?php include_partial('<?php echo $this->getModuleName() ?>/list_messages', array('pager' => $pager)) ?]
+</div>
+
+<div id="sf_admin_bar">
+<?php if ($this->getParameterValue('list.filters')): ?>
+[?php include_partial('filters', array('filters' => $filters)) ?]
+<?php endif; ?>
+</div>
+
+<div id="sf_admin_content">
+[?php if (!$pager->getNbResults()): ?]
+[?php echo __('no result') ?]
+[?php else: ?]
+[?php include_partial('<?php echo $this->getModuleName() ?>/list', array('pager' => $pager)) ?]
+[?php endif; ?]
+[?php include_partial('list_actions') ?]
+</div>
+
+<div id="sf_admin_footer">
+[?php include_partial('<?php echo $this->getModuleName() ?>/list_footer', array('pager' => $pager)) ?]
+</div>
+
+</div>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelAdmin/default/template/templates/listSuccess.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/actions/actions.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/actions/actions.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/actions/actions.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,13 @@
+<?php
+
+/**
+ * ##MODULE_NAME## actions.
+ *
+ * @package    ##PROJECT_NAME##
+ * @subpackage ##MODULE_NAME##
+ * @author     ##AUTHOR_NAME##
+ * @version    SVN: $Id: actions.class.php 2288 2006-10-02 15:22:13Z fabien $
+ */
+class ##MODULE_NAME##Actions extends auto##MODULE_NAME##Actions
+{
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/actions/actions.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/config/generator.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/config/generator.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/config/generator.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,5 @@
+generator:
+  class:              sfPropelCrudGenerator
+  param:
+    model_class:      ##MODEL_CLASS##
+    theme:            default


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/config/generator.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/lib/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/templates/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/skeleton/validate/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/actions/actions.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/actions/actions.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/actions/actions.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,89 @@
+[?php
+
+/**
+ * <?php echo $this->getGeneratedModuleName() ?> actions.
+ *
+ * @package    ##PROJECT_NAME##
+ * @subpackage <?php echo $this->getGeneratedModuleName() ?>
+
+ * @author     ##AUTHOR_NAME##
+ * @version    SVN: $Id: actions.class.php 3335 2007-01-23 16:19:56Z fabien $
+ */
+class <?php echo $this->getGeneratedModuleName() ?>Actions extends sfActions
+{
+  public function executeIndex()
+  {
+    return $this->forward('<?php echo $this->getModuleName() ?>', 'list');
+  }
+
+  public function executeList()
+  {
+    $this-><?php echo $this->getPluralName() ?> = <?php echo $this->getClassName() ?>Peer::doSelect(new Criteria());
+  }
+
+  public function executeShow()
+  {
+    $this-><?php echo $this->getSingularName() ?> = <?php echo $this->getClassName() ?>Peer::retrieveByPk(<?php echo $this->getRetrieveByPkParamsForAction(49) ?>);
+    $this->forward404Unless($this-><?php echo $this->getSingularName() ?>);
+  }
+
+  public function executeCreate()
+  {
+    $this-><?php echo $this->getSingularName() ?> = new <?php echo $this->getClassName() ?>();
+
+    $this->setTemplate('edit');
+  }
+
+  public function executeEdit()
+  {
+    $this-><?php echo $this->getSingularName() ?> = <?php echo $this->getClassName() ?>Peer::retrieveByPk(<?php echo $this->getRetrieveByPkParamsForAction(49) ?>);
+    $this->forward404Unless($this-><?php echo $this->getSingularName() ?>);
+  }
+
+  public function executeUpdate()
+  {
+    if (<?php echo $this->getTestPksForGetOrCreate(false) ?>)
+    {
+      $<?php echo $this->getSingularName() ?> = new <?php echo $this->getClassName() ?>();
+    }
+    else
+    {
+      $<?php echo $this->getSingularName() ?> = <?php echo $this->getClassName() ?>Peer::retrieveByPk(<?php echo $this->getRetrieveByPkParamsForAction(45) ?>);
+      $this->forward404Unless($<?php echo $this->getSingularName() ?>);
+    }
+
+<?php foreach ($this->getTableMap()->getColumns() as $name => $column): $type = $column->getCreoleType(); ?>
+<?php if ($name == 'CREATED_AT' || $name == 'UPDATED_AT') continue ?>
+<?php $name = sfInflector::underscore($column->getPhpName()) ?>
+<?php if ($type == CreoleTypes::DATE || $type == CreoleTypes::TIMESTAMP): ?>
+    if ($this->getRequestParameter('<?php echo $name ?>'))
+    {
+      list($d, $m, $y) = sfI18N::getDateForCulture($this->getRequestParameter('<?php echo $name ?>'), $this->getUser()->getCulture());
+      $<?php echo $this->getSingularName() ?>->set<?php echo $column->getPhpName() ?>("$y-$m-$d");
+    }
+<?php elseif ($type == CreoleTypes::BOOLEAN): ?>
+    $<?php echo $this->getSingularName() ?>->set<?php echo $column->getPhpName() ?>($this->getRequestParameter('<?php echo $name ?>', 0));
+<?php elseif ($column->isForeignKey()): ?>
+    $<?php echo $this->getSingularName() ?>->set<?php echo $column->getPhpName() ?>($this->getRequestParameter('<?php echo $name ?>') ? $this->getRequestParameter('<?php echo $name ?>') : null);
+<?php else: ?>
+    $<?php echo $this->getSingularName() ?>->set<?php echo $column->getPhpName() ?>($this->getRequestParameter('<?php echo $name ?>'));
+<?php endif; ?>
+<?php endforeach; ?>
+
+    $<?php echo $this->getSingularName() ?>->save();
+
+    return $this->redirect('<?php echo $this->getModuleName() ?>/show?<?php echo $this->getPrimaryKeyUrlParams() ?>);
+<?php //' ?>
+  }
+
+  public function executeDelete()
+  {
+    $<?php echo $this->getSingularName() ?> = <?php echo $this->getClassName() ?>Peer::retrieveByPk(<?php echo $this->getRetrieveByPkParamsForAction(43) ?>);
+
+    $this->forward404Unless($<?php echo $this->getSingularName() ?>);
+
+    $<?php echo $this->getSingularName() ?>->delete();
+
+    return $this->redirect('<?php echo $this->getModuleName() ?>/list');
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/actions/actions.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/editSuccess.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/editSuccess.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/editSuccess.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,29 @@
+[?php use_helper('Object') ?]
+
+[?php echo form_tag('<?php echo $this->getModuleName() ?>/update') ?]
+
+<?php foreach ($this->getPrimaryKey() as $pk): ?>
+[?php echo object_input_hidden_tag($<?php echo $this->getSingularName() ?>, 'get<?php echo $pk->getPhpName() ?>') ?]
+<?php endforeach; ?>
+
+<table>
+<tbody>
+<?php foreach ($this->getTableMap()->getColumns() as $name => $column): ?>
+<?php if ($column->isPrimaryKey()) continue ?>
+<?php if ($name == 'CREATED_AT' || $name == 'UPDATED_AT') continue ?>
+<tr>
+  <th><?php echo sfInflector::humanize(sfInflector::underscore($column->getPhpName())) ?><?php if ($column->isNotNull()): ?>*<?php endif; ?>:</th>
+  <td>[?php echo <?php echo $this->getCrudColumnEditTag($column) ?> ?]</td>
+</tr>
+<?php endforeach; ?>
+</tbody>
+</table>
+<hr />
+[?php echo submit_tag('save') ?]
+[?php if (<?php echo $this->getPrimaryKeyIsSet() ?>): ?]
+  &nbsp;[?php echo link_to('delete', '<?php echo $this->getModuleName() ?>/delete?<?php echo $this->getPrimaryKeyUrlParams() ?>, 'post=true&confirm=Are you sure?') ?]
+  &nbsp;[?php echo link_to('cancel', '<?php echo $this->getModuleName() ?>/show?<?php echo $this->getPrimaryKeyUrlParams() ?>) ?]
+[?php else: ?]
+  &nbsp;[?php echo link_to('cancel', '<?php echo $this->getModuleName() ?>/list') ?]
+[?php endif; ?]
+</form>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/editSuccess.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/listSuccess.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/listSuccess.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/listSuccess.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,26 @@
+<h1><?php echo $this->getModuleName() ?></h1>
+
+<table>
+<thead>
+<tr>
+<?php foreach ($this->getTableMap()->getColumns() as $column): ?>
+  <th><?php echo sfInflector::humanize(sfInflector::underscore($column->getPhpName())) ?></th>
+<?php endforeach; ?>
+</tr>
+</thead>
+<tbody>
+[?php foreach ($<?php echo $this->getPluralName() ?> as $<?php echo $this->getSingularName() ?>): ?]
+<tr>
+<?php foreach ($this->getTableMap()->getColumns() as $column): ?>
+  <?php if ($column->isPrimaryKey()): ?>
+  <td>[?php echo link_to($<?php echo $this->getSingularName() ?>->get<?php echo $column->getPhpName() ?>(), '<?php echo $this->getModuleName() ?>/show?<?php echo $this->getPrimaryKeyUrlParams() ?>) ?]</td>
+  <?php else: ?>
+  <td>[?php echo $<?php echo $this->getSingularName() ?>->get<?php echo $column->getPhpName() ?>() ?]</td>
+  <?php endif; ?>
+<?php endforeach; ?>
+</tr>
+[?php endforeach; ?]
+</tbody>
+</table>
+
+[?php echo link_to ('create', '<?php echo $this->getModuleName() ?>/create') ?]


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/listSuccess.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/showSuccess.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/showSuccess.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/showSuccess.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,13 @@
+<table>
+<tbody>
+<?php foreach ($this->getTableMap()->getColumns() as $column): ?>
+<tr>
+<th><?php echo sfInflector::humanize(sfInflector::underscore($column->getPhpName())) ?>: </th>
+<td>[?= $<?php echo $this->getSingularName() ?>->get<?php echo $column->getPhpName() ?>() ?]</td>
+</tr>
+<?php endforeach; ?>
+</tbody>
+</table>
+<hr />
+[?php echo link_to('edit', '<?php echo $this->getModuleName() ?>/edit?<?php echo $this->getPrimaryKeyUrlParams() ?>) ?]
+&nbsp;[?php echo link_to('list', '<?php echo $this->getModuleName() ?>/list') ?]


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/generator/sfPropelCrud/default/template/templates/showSuccess.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/af.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/af.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/af.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:130:{s:2:"AE";a:1:{i:0;s:26:"Verenigde Arabiese Emirate";}s:2:"AF";a:1:{i:0;s:10:"Afganistan";}s:2:"AG";a:1:{i:0;s:18:"Antigua en Barbuda";}s:2:"AL";a:1:{i:0;s:8:"Albanië";}s:2:"AM";a:1:{i:0;s:8:"Armenië";}s:2:"AR";a:1:{i:0;s:11:"Argentinië";}s:2:"AT";a:1:{i:0;s:9:"Oostenryk";}s:2:"AU";a:1:{i:0;s:10:"Australië";}s:2:"AZ";a:1:{i:0;s:11:"Aserbeidjan";}s:2:"BA";a:1:{i:0;s:22:"Bosnië en Herzegowina";}s:2:"BD";a:1:{i:0;s:10:"Bangladesj";}s:2:"BE";a:1:{i:0;s:7:"België";}s:2:"BF";a:1:{i:0;s:14:"Boerkina Fasso";}s:2:"BG";a:1:{i:0;s:8:"Bulgarye";}s:2:"BH";a:1:{i:0;s:7:"Bahrein";}s:2:"BN";a:1:{i:0;s:7:"Broenei";}s:2:"BO";a:1:{i:0;s:8:"Bolivië";}s:2:"BR";a:1:{i:0;s:9:"Brasilië";}s:2:"BT";a:1:{i:0;s:7:"Bhoetan";}s:2:"BY";a:1:{i:0;s:11:"Wit-Rusland";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CF";a:1:{i:0;s:29:"Sentraal-Afrikaanse Republiek";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:11:"Switserland";}s:2:"CI";a:1:{i:0;s:8:"Ivoorkus";}s:2:"CL";a:1:{i:0;s:5:"Chili";}s:2:"CM";a:1:{i:0;s:8:"Kameroen";}s:2:"CN";a:1:{i:0;s:5:"Sjina";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:10:"Kaap Verde";}s:2:"CY";a:1:{i:0;s:6:"Ciprus";}s:2:"CZ";a:1:{i:0;s:19:"Tjeggiese Republiek";}s:2:"DE";a:1:{i:0;s:9:"Duitsland";}s:2:"DJ";a:1:{i:0;s:8:"Djiboeti";}s:2:"DK";a:1:{i:0;s:9:"Denemarke";}s:2:"DO";a:1:{i:0;s:22:"Dominikaanse Republiek";}s:2:"DZ";a:1:{i:0;s:8:"Algerië";}s:2:"EE";a:1:{i:0;s:7:"Estland";}s:2:"EG";a:1:{i:0;s:6:"Egipte";}s:2:"EH";a:1:{i:0;s:10:"Wes-Sahara";}s:2:"ES";a:1:{i:0;s:6:"Spanje";}s:2:"ET";a:1:{i:0;s:9:"Ethiopië";}s:2:"FJ";a:1:{i:0;s:5:"Fidji";}s:2:"FM";a:1:{i:0;s:11:"Mikronesië";}s:2:"FR";a:1:{i:0;s:8:"Frankryk";}s:2:"GA";a:1:{i:0;s:6:"Gaboen";}s:2:"GB";a:1:{i:0;s:15:"Groot-Brittanje";}s:2:"GE";a:1:{i:0;s:8:"Georgië";}s:2:"GM";a:1:{i:0;s:7:"Gambië";}s:2:"GN";a:1:{i:0;s:6:"Guinee";}s:2:"GQ";a:1:{i:0;s:18:"Ekwatoriaal-Guinee";}s:2:"GR";a:1:{i:0;s:10:"Griekeland";}s:2:"GW";a:1:{i:0;s:13:"Guinee-Bissau";}s:2:"HR";a:1:{i:0;s:8:"Kroasië";}s:2:"HT";a:1:{i:0;s:6:"Haïti";}s:2:"HU";a:1:{i:
0;s:8:"Hongarye";}s:2:"ID";a:1:{i:0;s:10:"Indonesië";}s:2:"IE";a:1:{i:0;s:7:"Ierland";}s:2:"IN";a:1:{i:0;s:6:"Indië";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IS";a:1:{i:0;s:6:"Ysland";}s:2:"IT";a:1:{i:0;s:7:"Italië";}s:2:"JM";a:1:{i:0;s:7:"Jamaika";}s:2:"JO";a:1:{i:0;s:9:"Jordanië";}s:2:"KE";a:1:{i:0;s:5:"Kenia";}s:2:"KG";a:1:{i:0;s:9:"Kirgisië";}s:2:"KH";a:1:{i:0;s:8:"Kambodja";}s:2:"KM";a:1:{i:0;s:6:"Comore";}s:2:"KN";a:1:{i:0;s:20:"Saint Kitts en Nevis";}s:2:"KP";a:1:{i:0;s:11:"Noord-Korea";}s:2:"KR";a:1:{i:0;s:10:"Suid-Korea";}s:2:"KW";a:1:{i:0;s:7:"Koeweit";}s:2:"KZ";a:1:{i:0;s:9:"Kasakstan";}s:2:"LB";a:1:{i:0;s:7:"Libanon";}s:2:"LR";a:1:{i:0;s:8:"Liberië";}s:2:"LT";a:1:{i:0;s:6:"Litaue";}s:2:"LU";a:1:{i:0;s:9:"Luxemburg";}s:2:"LV";a:1:{i:0;s:7:"Letland";}s:2:"LY";a:1:{i:0;s:6:"Libië";}s:2:"MA";a:1:{i:0;s:7:"Marokko";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:16:"Marshall-eilande";}s:2:"MK";a:1:{i:0;s:10:"Macedonië";}s:2:"MN";a:1:{i:0;s:9:"Mongolië";}s:2:"MR";a:1:{i:0;s:11:"Mouritanië";}s:2:"MV";a:1:{i:0;s:7:"Maldive";}s:2:"MX";a:1:{i:0;s:7:"Meksiko";}s:2:"MY";a:1:{i:0;s:9:"Maleisië";}s:2:"MZ";a:1:{i:0;s:9:"Mosambiek";}s:2:"NA";a:1:{i:0;s:8:"Namibië";}s:2:"NE";a:1:{i:0;s:8:"Nigerië";}s:2:"NL";a:1:{i:0;s:9:"Nederland";}s:2:"NO";a:1:{i:0;s:8:"Noorweë";}s:2:"NR";a:1:{i:0;s:7:"Naoeroe";}s:2:"NZ";a:1:{i:0;s:12:"Nieu-Seeland";}s:2:"PG";a:1:{i:0;s:18:"Papoea Nieu-Guinee";}s:2:"PH";a:1:{i:0;s:9:"Filippyne";}s:2:"PL";a:1:{i:0;s:4:"Pole";}s:2:"QA";a:1:{i:0;s:5:"Katar";}s:2:"RO";a:1:{i:0;s:9:"Roemenië";}s:2:"RU";a:1:{i:0;s:7:"Rusland";}s:2:"SA";a:1:{i:0;s:14:"Saoedi-Arabië";}s:2:"SB";a:1:{i:0;s:15:"Solomon Eilande";}s:2:"SC";a:1:{i:0;s:9:"Seychelle";}s:2:"SD";a:1:{i:0;s:6:"Soedan";}s:2:"SE";a:1:{i:0;s:5:"Swede";}s:2:"SG";a:1:{i:0;s:9:"Singapoer";}s:2:"SI";a:1:{i:0;s:9:"Slowenië";}s:2:"SK";a:1:{i:0;s:8:"Slowakye";}s:2:"SO";a:1:{i:0;s:8:"Somalië";}s:2:"SP";a:1:{i:0;s:7:"Serwië";}s:2:"ST";a:1:{i:0;s:20:"Sao Tome en Principe";}s:2:"SV";a:1:{i:0;s:8:"Salvador";}s:2:"SY";a:1:{i:0;s:6:"Sirië";}s:
2:"TD";a:1:{i:0;s:6:"Tsjaad";}s:2:"TJ";a:1:{i:0;s:11:"Tadjikistan";}s:2:"TM";a:1:{i:0;s:10:"Turkmenië";}s:2:"TN";a:1:{i:0;s:8:"Tunisië";}s:2:"TR";a:1:{i:0;s:6:"Turkye";}s:2:"TT";a:1:{i:0;s:18:"Trinidad en Tobago";}s:2:"TZ";a:1:{i:0;s:9:"Tanzanië";}s:2:"UA";a:1:{i:0;s:8:"Oekraine";}s:2:"US";a:1:{i:0;s:27:"Verenigde State van Amerika";}s:2:"UZ";a:1:{i:0;s:11:"Oesbekistan";}s:2:"VA";a:1:{i:0;s:8:"Vatikaan";}s:2:"VC";a:1:{i:0;s:30:"Saint Vincent en die Grenadine";}s:2:"VN";a:1:{i:0;s:8:"Viëtnam";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"ZA";a:1:{i:0;s:11:"Suid-Afrika";}s:2:"ZM";a:1:{i:0;s:7:"Zambië";}}s:10:"Currencies";a:1:{s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:4:"Rand";}}s:9:"Languages";a:1:{s:2:"af";a:1:{i:0;s:9:"Afrikaans";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:4:{s:11:"AmPmMarkers";a:2:{i:0;s:3:"vm.";i:1;s:3:"nm.";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:2:"So";i:1;s:2:"Ma";i:2;s:2:"Di";i:3;s:2:"Wo";i:4;s:2:"Do";i:5;s:2:"Vr";i:6;s:2:"Sa";}s:4:"wide";a:7:{i:0;s:6:"Sondag";i:1;s:7:"Maandag";i:2;s:7:"Dinsdag";i:3;s:8:"Woensdag";i:4;s:9:"Donderdag";i:5;s:6:"Vrydag";i:6;s:8:"Saterdag";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:4:"v.C.";i:1;s:4:"n.C.";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"Jan";i:1;s:3:"Feb";i:2;s:3:"Mar";i:3;s:3:"Apr";i:4;s:3:"Mei";i:5;s:3:"Jun";i:6;s:3:"Jul";i:7;s:3:"Aug";i:8;s:3:"Sep";i:9;s:3:"Okt";i:10;s:3:"Nov";i:11;s:3:"Des";}s:4:"wide";a:12:{i:0;s:8:"Januarie";i:1;s:9:"Februarie";i:2;s:5:"Maart";i:3;s:5:"April";i:4;s:3:"Mei";i:5;s:5:"Junie";i:6;s:5:"Julie";i:7;s:8:"Augustus";i:8;s:9:"September";i:9;s:7:"Oktober";i:10;s:8:"November";i:11;s:8:"Desember";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/af_ZA.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/af_ZA.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/af_ZA.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:9:"h:mm:ss a";i:1;s:9:"h:mm:ss a";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:17:"EEEE dd MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:11:"dd MMM yyyy";i:7;s:10:"yyyy/MM/dd";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/am.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/am.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/am.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:5:{s:9:"Countries";a:128:{s:2:"AD";a:1:{i:0;s:12:"አንዶራ";}s:2:"AE";a:1:{i:0;s:44:"የተባበሩት አረብ ኤáˆáˆ¬á‰µáˆµ";}s:2:"AL";a:1:{i:0;s:15:"አáˆá‰£áŠ’á‹«";}s:2:"AM";a:1:{i:0;s:15:"አርሜኒያ";}s:2:"AN";a:1:{i:0;s:37:"ኔዘርላንድስ አንቲáˆáˆµ";}s:2:"AR";a:1:{i:0;s:18:"አርጀንቲና";}s:2:"AT";a:1:{i:0;s:15:"ኦስትሪያ";}s:2:"AU";a:1:{i:0;s:21:"አá‹áˆµá‰µáˆ¬áˆŠá‹«";}s:2:"AZ";a:1:{i:0;s:18:"አዘርባጃን";}s:2:"BA";a:1:{i:0;s:41:"ቦስኒያ እና ሄርዞጎቪኒያ";}s:2:"BB";a:1:{i:0;s:15:"ባርቤዶስ";}s:2:"BE";a:1:{i:0;s:12:"ቤáˆáŒ„áˆ";}s:2:"BG";a:1:{i:0;s:15:"ቡáˆáŒŒáˆªá‹«";}s:2:"BH";a:1:{i:0;s:12:"ባህሬን";}s:2:"BM";a:1:{i:0;s:12:"ቤርሙዳ";}s:2:"BO";a:1:{i:0;s:12:"ቦሊቪያ";}s:2:"BR";a:1:{i:0;s:12:"ብራዚáˆ";}s:2:"BT";a:1:{i:0;s:12:"ቡህታን";}s:2:"BY";a:1:{i:0;s:12:"ቤላሩስ";}s:2:"BZ";a:1:{i:0;s:9:"ቤሊዘ";}s:2:"CD";a:1:{i:0;s:9:"ኮንጎ";}s:2:"CF";a:1:{i:0;s:50:"የመካከለኛዠአáሪካ ሪáብሊክ";}s:2:"CH";a:1:{i:0;s:21:"ስዊዘርላንድ";}s:2:"CL";a:1:{i:0;s:6:"ቺሊ";}s:2:"CM";a:1:{i:0;s:12:"ካሜሩን";}s:2:"CN";a:1:{i:0;s:9:"ቻይና";}s:2:"CO";a:1:{i:0;s:15:"ኮሎáˆá‰¢á‹«";}s:2:"CV";a:1:{i:0;s:16:"ኬᕠቬርዴ";}s:2:"CY";a:1:{i:0;s:15:"ሳይá•áˆ¨áˆµ";}s:2:"CZ";a:1:{i:0;s:22:"ቼክ ሪá‘ብሊክ";}s:2:"DE";a:1:{i:0;s:12:"ጀርመን";}s:2:"DK";a:1:{i:0;s:15:"ዴንማርክ";}s:2:"DM";a:1:{i:0;s:12:"ዶሚኒካ";}s:2:"DO";a:1:{i:0;s:28:"ዶሚኒክ ሪá‘ብሊክ";}s:2:"DZ";a:1:{i:0;s:15:"አáˆáŒ„ሪያ";}s:2:"EC";a:1:{i:0;s:12:"ኢኳዶር";}s:2:"EE";a:1:{i:0;s:15:"ኤስቶኒያ";}s:2:"EG";a:1:{i:0;s:9:"áŒá‰¥áŒ½";}s:2:"EH";a:1:{i:0;s:25:"áˆá‹•áˆ«á‰£á‹Š ሳህራ";}s:2:"ER";a:1:{i:0;s:12:"ኤርትራ";}s:2:"ES";a:1:{i:0;s:9:"ስá”ን";}s:2:"ET";a:1:{i:0;s:15:"ኢትዮጵያ";}s:2:"FI";a:1:{i:0;s:15:"áŠáŠ•áˆ‹áŠ•á‹µ";}s:2:"FJ";a:1:{i:0;s:6:"áŠáŒ‚";}s:2:"FM";a:1:{i:0;s:18:"ሚክሮኔዢያ";}s:2:"GB";a:1:{i:0;s:15:"እንáŒáˆŠá‹";}s:2:"GE";a:1:{i:0
;s:12:"ጆርጂያ";}s:2:"GF";a:1:{i:0;s:31:"የáˆáˆ¨áŠ•áˆ³á‹­ ጉዊአና";}s:2:"GM";a:1:{i:0;s:12:"ጋáˆá‰¢á‹«";}s:2:"GN";a:1:{i:0;s:6:"ጊኒ";}s:2:"GQ";a:1:{i:0;s:25:"ኢኳቶሪያሠጊኒ";}s:2:"GR";a:1:{i:0;s:9:"áŒáˆªáŠ­";}s:2:"GW";a:1:{i:0;s:9:"ቢሳዎ";}s:2:"GY";a:1:{i:0;s:9:"ጉያና";}s:2:"HR";a:1:{i:0;s:15:"ክሮኤሽያ";}s:2:"HT";a:1:{i:0;s:9:"ሀይቲ";}s:2:"HU";a:1:{i:0;s:12:"ሀንጋሪ";}s:2:"ID";a:1:{i:0;s:18:"ኢንዶኔዢያ";}s:2:"IE";a:1:{i:0;s:18:"አየርላንድ";}s:2:"IL";a:1:{i:0;s:15:"እስራኤáˆ";}s:2:"IN";a:1:{i:0;s:9:"ህንድ";}s:2:"IQ";a:1:{i:0;s:9:"ኢራቅ";}s:2:"IS";a:1:{i:0;s:18:"አይስላንድ";}s:2:"IT";a:1:{i:0;s:12:"ጣሊያን";}s:2:"JM";a:1:{i:0;s:12:"ጃማይካ";}s:2:"JO";a:1:{i:0;s:12:"ጆርዳን";}s:2:"JP";a:1:{i:0;s:9:"ጃá“ን";}s:2:"KH";a:1:{i:0;s:15:"ካáˆá‰¦á‹²á‹«";}s:2:"KM";a:1:{i:0;s:12:"ኮሞሮስ";}s:2:"KP";a:1:{i:0;s:19:"ደቡብ ኮሪያ";}s:2:"KR";a:1:{i:0;s:19:"ሰሜን ኮሪያ";}s:2:"KW";a:1:{i:0;s:9:"ክዌት";}s:2:"LB";a:1:{i:0;s:12:"ሊባኖስ";}s:2:"LT";a:1:{i:0;s:15:"ሊቱዌኒያ";}s:2:"LV";a:1:{i:0;s:12:"ላትቪያ";}s:2:"LY";a:1:{i:0;s:9:"ሊቢያ";}s:2:"MA";a:1:{i:0;s:9:"ሞሮኮ";}s:2:"MD";a:1:{i:0;s:12:"ሞáˆá‹¶á‰«";}s:2:"MK";a:1:{i:0;s:15:"ማከዶኒያ";}s:2:"MN";a:1:{i:0;s:15:"ሞንጎሊያ";}s:2:"MR";a:1:{i:0;s:15:"ሞሪቴኒያ";}s:2:"MT";a:1:{i:0;s:9:"ማáˆá‰³";}s:2:"MU";a:1:{i:0;s:12:"ማሩሸስ";}s:2:"MX";a:1:{i:0;s:12:"ሜክሲኮ";}s:2:"MY";a:1:{i:0;s:12:"ማሌዢያ";}s:2:"NA";a:1:{i:0;s:12:"ናሚቢያ";}s:2:"NC";a:1:{i:0;s:22:"ኒዠካሌዶኒያ";}s:2:"NG";a:1:{i:0;s:15:"ናይጄሪያ";}s:2:"NL";a:1:{i:0;s:18:"ኔዘርላንድ";}s:2:"NO";a:1:{i:0;s:9:"ኖርዌ";}s:2:"NP";a:1:{i:0;s:9:"ኔá“áˆ";}s:2:"NZ";a:1:{i:0;s:19:"ኒዠዚላንድ";}s:2:"PE";a:1:{i:0;s:6:"á”ሩ";}s:2:"PF";a:1:{i:0;s:34:"የáˆáˆ¨áŠ•áˆ³á‹­ á–ሊኔዢያ";}s:2:"PG";a:1:{i:0;s:23:"á“á‘á‹‹ ኒዠጊኒ";}s:2:"PL";a:1:{i:0;s:12:"á–ላንድ";}s:2:"PR";a:1:{i:0;s:16:"á–ርታ ሪ
ኮ";}s:2:"RO";a:1:{i:0;s:12:"ሮሜኒያ";}s:2:"RU";a:1:{i:0;s:9:"ራሺያ";}s:2:"SA";a:1:{i:0;s:21:"ሳá‹á‹µáŠ áˆ¨á‰¢á‹«";}s:2:"SD";a:1:{i:0;s:9:"ሱዳን";}s:2:"SE";a:1:{i:0;s:12:"ስዊድን";}s:2:"SG";a:1:{i:0;s:15:"ሲንጋá–ር";}s:2:"SI";a:1:{i:0;s:15:"ስሎቬኒያ";}s:2:"SK";a:1:{i:0;s:15:"ስሎቫኪያ";}s:2:"SN";a:1:{i:0;s:12:"ሴኔጋáˆ";}s:2:"SO";a:1:{i:0;s:9:"ሱማሌ";}s:2:"SP";a:1:{i:0;s:12:"ሰርቢያ";}s:2:"SY";a:1:{i:0;s:9:"ሲሪያ";}s:2:"TD";a:1:{i:0;s:6:"ቻድ";}s:2:"TF";a:1:{i:0;s:44:"የáˆáˆ¨áŠ•áˆ³á‹­ ደቡባዊ áŒá‹›á‰¶á‰½";}s:2:"TH";a:1:{i:0;s:15:"ታይላንድ";}s:2:"TJ";a:1:{i:0;s:18:"ታጃኪስታን";}s:2:"TL";a:1:{i:0;s:22:"áˆáˆµáˆ«á‰… ቲሞር";}s:2:"TN";a:1:{i:0;s:12:"ቱኒዚያ";}s:2:"TR";a:1:{i:0;s:9:"ቱርክ";}s:2:"TT";a:1:{i:0;s:32:"ትሪኒዳድ እና ቶባጎ";}s:2:"TZ";a:1:{i:0;s:15:"ታንዛኒያ";}s:2:"UG";a:1:{i:0;s:12:"ዩጋንዳ";}s:2:"US";a:1:{i:0;s:12:"አሜሪካ";}s:2:"UZ";a:1:{i:0;s:21:"á‹©á‹á‰ áŠªáˆµá‰³áŠ•";}s:2:"VE";a:1:{i:0;s:15:"ቬንዙዌላ";}s:2:"VG";a:1:{i:0;s:44:"የእንáŒáˆŠá‹ ድንáŒáˆ ደሴቶች";}s:2:"VI";a:1:{i:0;s:41:"የአሜሪካ ቨርጂን ደሴቶች";}s:2:"YE";a:1:{i:0;s:9:"የመን";}s:2:"YU";a:1:{i:0;s:18:"ዩጎá‹áˆ‹á‰ªá‹«";}s:2:"ZA";a:1:{i:0;s:22:"ደቡብ አáሪካ";}s:2:"ZM";a:1:{i:0;s:12:"á‹›áˆá‰¢á‹«";}}s:9:"Languages";a:142:{s:2:"aa";a:1:{i:0;s:12:"አá‹áˆ­áŠ›";}s:2:"ab";a:1:{i:0;s:15:"አብáˆá‹šáŠ›";}s:2:"af";a:1:{i:0;s:21:"አáሪቃንስኛ";}s:2:"am";a:1:{i:0;s:12:"አማርኛ";}s:2:"ar";a:1:{i:0;s:12:"á‹áˆ­á‰¢áŠ›";}s:2:"as";a:1:{i:0;s:15:"አሳሜዛዊ";}s:2:"ay";a:1:{i:0;s:15:"አያማርኛ";}s:2:"az";a:1:{i:0;s:24:"አዜርባይጃንኛ";}s:2:"ba";a:1:{i:0;s:15:"ባስኪርኛ";}s:2:"be";a:1:{i:0;s:15:"ቤላራሻኛ";}s:2:"bg";a:1:{i:0;s:15:"ቡáˆáŒ‹áˆªáŠ›";}s:2:"bh";a:1:{i:0;s:9:"ቢሃሪ";}s:2:"bi";a:1:{i:0;s:15:"ቢስላáˆáŠ›";}s:2:"bn";a:1:{i:0;s:15:"በንጋሊኛ";}s:2:"bo";a:1:{i:0;s:15:"ትበትንኛ";}s:2:"br";a:1:{i:0;s:15:"ብሬ
ቶንኛ";}s:3:"byn";a:1:{i:0;s:9:"ብሊን";}s:2:"ca";a:1:{i:0;s:15:"ካታላንኛ";}s:2:"co";a:1:{i:0;s:15:"ኮርሲካኛ";}s:2:"cs";a:1:{i:0;s:9:"ቼክኛ";}s:2:"cy";a:1:{i:0;s:9:"ወáˆáˆ½";}s:2:"da";a:1:{i:0;s:9:"ዴኒሽ";}s:2:"de";a:1:{i:0;s:12:"ጀርመን";}s:2:"dz";a:1:{i:0;s:18:"ድዞንáŒáŠ»áŠ›";}s:2:"el";a:1:{i:0;s:12:"áŒáˆªáŠ­áŠ›";}s:2:"en";a:1:{i:0;s:18:"እንáŒáˆŠá‹áŠ›";}s:2:"eo";a:1:{i:0;s:18:"ኤስáራንቶ";}s:2:"es";a:1:{i:0;s:12:"ስá“ኒሽ";}s:2:"et";a:1:{i:0;s:18:"ኤስቶኒአን";}s:2:"eu";a:1:{i:0;s:12:"ባስክኛ";}s:2:"fa";a:1:{i:0;s:15:"áርሲያኛ";}s:2:"fi";a:1:{i:0;s:9:"áŠáŠ’ሽ";}s:2:"fj";a:1:{i:0;s:9:"áŠáŒ‚ኛ";}s:2:"fo";a:1:{i:0;s:9:"á‹áˆ®áŠ›";}s:2:"fr";a:1:{i:0;s:18:"áˆáˆ¨áŠ•áˆ³á‹­áŠ›";}s:2:"fy";a:1:{i:0;s:12:"áሪስኛ";}s:2:"ga";a:1:{i:0;s:12:"አይሪሽ";}s:2:"gd";a:1:{i:0;s:28:"እስኮትስ ጌáˆáŠ­áŠ›";}s:3:"gez";a:1:{i:0;s:12:"áŒá‹•á‹áŠ›";}s:2:"gl";a:1:{i:0;s:12:"ጋለጋኛ";}s:2:"gn";a:1:{i:0;s:12:"ጓራኒኛ";}s:2:"gu";a:1:{i:0;s:15:"ጉጃርቲኛ";}s:2:"ha";a:1:{i:0;s:12:"ሃá‹áˆ³áŠ›";}s:2:"he";a:1:{i:0;s:15:"ዕብራስጥ";}s:2:"hi";a:1:{i:0;s:12:"áˆáŠ•á‹µáŠ›";}s:2:"hr";a:1:{i:0;s:18:"ክሮሽያንኛ";}s:2:"hu";a:1:{i:0;s:15:"ሀንጋሪኛ";}s:2:"hy";a:1:{i:0;s:15:"አርመናዊ";}s:2:"ia";a:1:{i:0;s:21:"ኢንቴርሊንጓ";}s:2:"id";a:1:{i:0;s:18:"እንዶኒሲኛ";}s:2:"ie";a:1:{i:0;s:24:"እንተርሊንáŒá‹ˆ";}s:2:"ik";a:1:{i:0;s:18:"እኑá’ያቅኛ";}s:2:"is";a:1:{i:0;s:21:"አይስላንድኛ";}s:2:"it";a:1:{i:0;s:15:"ጣሊያንኛ";}s:2:"iu";a:1:{i:0;s:21:"እኑክቲቱትኛ";}s:2:"ja";a:1:{i:0;s:12:"ጃá“ንኛ";}s:2:"jv";a:1:{i:0;s:12:"ጃቫንኛ";}s:2:"ka";a:1:{i:0;s:18:"ጊዮርጊያን";}s:2:"kk";a:1:{i:0;s:12:"ካዛክኛ";}s:2:"kl";a:1:{i:0;s:18:"ካላሊሱትኛ";}s:2:"km";a:1:{i:0;s:12:"ክመርኛ";}s:2:"kn";a:1:{i:0;s:12:"ካናዳኛ";}s:2:"ko";a:1:{i:0;s:12:"ኮሪያኛ";}s:2:"ks";a:1:{i:0;s:15:"ካሽሚርኛ";}s:2:"ku";a:1:{i:0;s:15:"ኩርድሽኛ";}s:2:"k
y";a:1:{i:0;s:15:"ኪርጊá‹áŠ›";}s:2:"la";a:1:{i:0;s:12:"ላቲንኛ";}s:2:"ln";a:1:{i:0;s:15:"ሊንጋላኛ";}s:2:"lo";a:1:{i:0;s:12:"ላá‹áˆµáŠ›";}s:2:"lt";a:1:{i:0;s:18:"ሊቱአኒያን";}s:2:"lv";a:1:{i:0;s:15:"ላትቪያን";}s:2:"mg";a:1:{i:0;s:15:"ማላጋስኛ";}s:2:"mi";a:1:{i:0;s:12:"ማዮሪኛ";}s:2:"mk";a:1:{i:0;s:15:"ማከዶኒኛ";}s:2:"ml";a:1:{i:0;s:18:"ማላያላáˆáŠ›";}s:2:"mn";a:1:{i:0;s:18:"ሞንጎላዊኛ";}s:2:"mo";a:1:{i:0;s:18:"ሞáˆá‹³á‰«á‹ŠáŠ“";}s:2:"mr";a:1:{i:0;s:12:"ማራዚኛ";}s:2:"ms";a:1:{i:0;s:12:"ማላይኛ";}s:2:"mt";a:1:{i:0;s:15:"ማáˆá‰²áˆµáŠ›";}s:2:"my";a:1:{i:0;s:12:"ቡርማኛ";}s:2:"na";a:1:{i:0;s:9:"ናኡሩ";}s:2:"ne";a:1:{i:0;s:12:"ኔá“ሊኛ";}s:2:"nl";a:1:{i:0;s:6:"ደች";}s:2:"no";a:1:{i:0;s:18:"ኖርዌጂያን";}s:2:"oc";a:1:{i:0;s:15:"ኦኪታንኛ";}s:2:"om";a:1:{i:0;s:12:"ኦሮáˆáŠ›";}s:2:"or";a:1:{i:0;s:12:"ኦሪያኛ";}s:2:"pa";a:1:{i:0;s:15:"á“ንጃቢኛ";}s:2:"pl";a:1:{i:0;s:9:"á–ሊሽ";}s:2:"ps";a:1:{i:0;s:12:"á‘ሽቶኛ";}s:2:"pt";a:1:{i:0;s:18:"á–ርቱጋሊኛ";}s:2:"qu";a:1:{i:0;s:9:"ኵቿኛ";}s:2:"rm";a:1:{i:0;s:12:"ሮማንስ";}s:2:"rn";a:1:{i:0;s:12:"ሩንዲኛ";}s:2:"ro";a:1:{i:0;s:15:"ሮማኒያን";}s:2:"ru";a:1:{i:0;s:9:"ራሽኛ";}s:2:"rw";a:1:{i:0;s:24:"ኪንያርዋንድኛ";}s:2:"sa";a:1:{i:0;s:21:"ሳንስክሪትኛ";}s:2:"sd";a:1:{i:0;s:15:"ሲንድሂኛ";}s:2:"sg";a:1:{i:0;s:12:"ሳንጎኛ";}s:2:"si";a:1:{i:0;s:15:"ስንሃáˆáŠ›";}s:3:"sid";a:1:{i:0;s:12:"ሲዳáˆáŠ›";}s:2:"sk";a:1:{i:0;s:15:"ስሎቫክኛ";}s:2:"sl";a:1:{i:0;s:12:"ስሎቪኛ";}s:2:"sm";a:1:{i:0;s:12:"ሳሞአኛ";}s:2:"sn";a:1:{i:0;s:9:"ሾናኛ";}s:2:"so";a:1:{i:0;s:12:"ሱማáˆáŠ›";}s:2:"sq";a:1:{i:0;s:12:"áˆá‰¤áŠ’ኛ";}s:2:"sr";a:1:{i:0;s:12:"ሰርቢኛ";}s:2:"ss";a:1:{i:0;s:12:"ስዋቲኛ";}s:2:"st";a:1:{i:0;s:9:"ሶዞኛ";}s:2:"su";a:1:{i:0;s:12:"ሱዳንኛ";}s:2:"sv";a:1:{i:0;s:15:"ስዊድንኛ";}s:2:"sw";a:1:{i:0;s:15:"ስዋሂሊኛ";}s:2:"ta";a:1:{i:0;s:12:"ታሚáˆáŠ
›";}s:2:"te";a:1:{i:0;s:12:"ተሉጉኛ";}s:2:"tg";a:1:{i:0;s:12:"ታጂኪኛ";}s:2:"th";a:1:{i:0;s:9:"ታይኛ";}s:2:"ti";a:1:{i:0;s:12:"ትáŒáˆ­áŠ›";}s:3:"tig";a:1:{i:0;s:9:"ትáŒáˆ¨";}s:2:"tk";a:1:{i:0;s:18:"ቱርክመንኛ";}s:2:"tl";a:1:{i:0;s:15:"ታጋሎገኛ";}s:2:"tn";a:1:{i:0;s:15:"ጽዋናዊኛ";}s:2:"to";a:1:{i:0;s:9:"ቶንጋ";}s:2:"tr";a:1:{i:0;s:12:"ቱርክኛ";}s:2:"ts";a:1:{i:0;s:12:"ጾንጋኛ";}s:2:"tt";a:1:{i:0;s:12:"ታታርኛ";}s:2:"tw";a:1:{i:0;s:9:"ትዊኛ";}s:2:"ug";a:1:{i:0;s:18:"ኡዊáŒáˆáˆ­áŠ›";}s:2:"uk";a:1:{i:0;s:15:"ዩክረኒኛ";}s:2:"ur";a:1:{i:0;s:12:"ኡርዱኛ";}s:2:"uz";a:1:{i:0;s:15:"ኡá‹á‰ áŠ­áŠ›";}s:2:"vi";a:1:{i:0;s:15:"ቪትናáˆáŠ›";}s:2:"vo";a:1:{i:0;s:15:"ቮላá‘ክኛ";}s:2:"wo";a:1:{i:0;s:12:"ዎሎáኛ";}s:2:"xh";a:1:{i:0;s:9:"ዞሳኛ";}s:2:"yi";a:1:{i:0;s:15:"ይዲሻዊኛ";}s:2:"yo";a:1:{i:0;s:15:"ዮሩባዊኛ";}s:2:"za";a:1:{i:0;s:15:"ዡዋንáŒáŠ›";}s:2:"zh";a:1:{i:0;s:12:"ቻይንኛ";}s:2:"zu";a:1:{i:0;s:9:"ዙሉኛ";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Ethi";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:4:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:7;i:1;i:1;}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:9:"እሑድ";i:1;s:6:"ሰኞ";i:2;s:9:"ማክሰ";i:3;s:9:"ረቡዕ";i:4;s:9:"áˆáˆ™áˆµ";i:5;s:9:"ዓርብ";i:6;s:9:"ቅዳሜ";}s:4:"wide";a:7:{i:0;s:9:"እሑድ";i:1;s:6:"ሰኞ";i:2;s:12:"ማክሰኞ";i:3;s:9:"ረቡዕ";i:4;s:9:"áˆáˆ™áˆµ";i:5;s:9:"ዓርብ";i:6;s:9:"ቅዳሜ";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:7:"á‹“/á‹“";i:1;s:7:"á‹“/áˆ";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:9:"ጃንዩ";i:1;s:9:"áŒá‰¥áˆ©";i:2;s:9:"ማርች";i:3;s:9:"ኤá•áˆ¨";i:4;s:6:"ሜይ";i:5;s:6:"áŒáŠ•";i:6;s:9:"áŒáˆ‹á‹­";i:7;s:9:"ኦገስ";i:8;s:9:"ሴá•á‰´";i:9;s:9:"ኦክተ";i:10;s:9:"ኖቬáˆ";i:11;s:9:"ዲሴáˆ";}s:4:"wide";a:12:{i:0;s:15:"ጃንዩወሪ";i:1;s:15:"áŒá‰¥áˆ©á‹ˆáˆª";i:2;s:9:"ማርች";i:3;s:12:
"ኤá•áˆ¨áˆ";i:4;s:6:"ሜይ";i:5;s:6:"áŒáŠ•";i:6;s:9:"áŒáˆ‹á‹­";i:7;s:12:"ኦገስት";i:8;s:18:"ሴá•á‰´áˆá‰ áˆ­";i:9;s:18:"ኦክተá‹á‰ áˆ­";i:10;s:15:"ኖቬáˆá‰ áˆ­";i:11;s:15:"ዲሴáˆá‰ áˆ­";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/am_ET.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/am_ET.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/am_ET.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:10:"Currencies";a:2:{s:3:"ETB";a:2:{i:0;s:1:"$";i:1;s:3:"ETB";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:3:"USD";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:11:"AmPmMarkers";a:2:{i:0;s:9:"ጡዋት";i:1;s:12:"ከሳዓት";}s:16:"DateTimePatterns";a:9:{i:0;s:10:"hh:mm:ss a";i:1;s:10:"hh:mm:ss a";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:29:"EEEEᣠdd MMMM ቀን yyyy G";i:5;s:12:"dd MMMM yyyy";i:6;s:9:"dd-MMM-yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:12:{s:9:"Countries";a:190:{s:2:"AD";a:1:{i:0;s:12:"اندورا";}s:2:"AE";a:1:{i:0;s:46:"الامارات العربية المتحدة";}s:2:"AF";a:1:{i:0;s:18:"اÙغانستان";}s:2:"AG";a:1:{i:0;s:29:"انتيغوا وبربودا";}s:2:"AI";a:1:{i:0;s:14:"البانيا";}s:2:"AM";a:1:{i:0;s:14:"ارمينيا";}s:2:"AO";a:1:{i:0;s:12:"انغولا";}s:2:"AR";a:1:{i:0;s:18:"الارجنتين";}s:2:"AT";a:1:{i:0;s:12:"النمسا";}s:2:"AU";a:1:{i:0;s:16:"استراليا";}s:2:"AZ";a:1:{i:0;s:16:"آذربيجان";}s:2:"BA";a:1:{i:0;s:29:"البوسنة والهرسك";}s:2:"BB";a:1:{i:0;s:14:"بربادوس";}s:2:"BD";a:1:{i:0;s:16:"بنغلاديش";}s:2:"BE";a:1:{i:0;s:12:"بلجيكا";}s:2:"BF";a:1:{i:0;s:23:"بوركينا Ùاسو";}s:2:"BG";a:1:{i:0;s:14:"بلغاريا";}s:2:"BH";a:1:{i:0;s:14:"البحرين";}s:2:"BI";a:1:{i:0;s:14:"بوروندي";}s:2:"BJ";a:1:{i:0;s:8:"بنين";}s:2:"BN";a:1:{i:0;s:12:"بروناي";}s:2:"BO";a:1:{i:0;s:14:"بوليÙيا";}s:2:"BR";a:1:{i:0;s:16:"البرازيل";}s:2:"BS";a:1:{i:0;s:14:"البهاما";}s:2:"BT";a:1:{i:0;s:10:"بوتان";}s:2:"BW";a:1:{i:0;s:16:"بوتسوانا";}s:2:"BY";a:1:{i:0;s:25:"روسيا البيضاء";}s:2:"BZ";a:1:{i:0;s:8:"بليز";}s:2:"CA";a:1:{i:0;s:8:"كندا";}s:2:"CF";a:1:{i:0;s:42:"جمهورية اÙريقيا الوسطى";}s:2:"CG";a:1:{i:0;s:14:"الكونغو";}s:2:"CH";a:1:{i:0;s:12:"سويسرا";}s:2:"CL";a:1:{i:0;s:10:"تشيلي";}s:2:"CM";a:1:{i:0;s:18:"الكاميرون";}s:2:"CN";a:1:{i:0;s:10:"الصين";}s:2:"CO";a:1:{i:0;s:16:"كولومبيا";}s:2:"CR";a:1:{i:0;s:18:"كوستاريكا";}s:2:"CU";a:1:{i:0;s:8:"كوبا";}s:2:"CV";a:1:{i:0;s:23:"الرأس الاخضر";}s:2:"CY";a:1:{i:0;s:8:"قبرص";}s:2:"CZ";a:1:{i:0;s:27:"جمهورية التشيك";}s:2:"DE";a:1:{i:0;s:14:"المانيا";}s:2:"DJ";a:1:{i:0;s:12:"جيبوتي";}s:2:"DK";a:1:{i:0;s:16:"الدانمرك";}s:2:"DM";a:1:{i:0;s:16:"دومينيكا";}s:2:"DO";a:1:{i:0;s:41:"الجمهورية الدومينيكية";}s:
2:"DZ";a:1:{i:0;s:14:"الجزائر";}s:2:"EC";a:1:{i:0;s:14:"اكوادور";}s:2:"EE";a:1:{i:0;s:14:"استونيا";}s:2:"EG";a:1:{i:0;s:6:"مصر";}s:2:"EH";a:1:{i:0;s:29:"الصحراء الغربية";}s:2:"ER";a:1:{i:0;s:14:"ارتيريا";}s:2:"ES";a:1:{i:0;s:14:"اسبانيا";}s:2:"ET";a:1:{i:0;s:14:"اثيوبيا";}s:2:"FI";a:1:{i:0;s:12:"Ùنلندا";}s:2:"FJ";a:1:{i:0;s:8:"Ùيجي";}s:2:"FM";a:1:{i:0;s:20:"ميكرونيزيا";}s:2:"FR";a:1:{i:0;s:10:"Ùرنسا";}s:2:"GA";a:1:{i:0;s:10:"غابون";}s:2:"GB";a:1:{i:0;s:29:"المملكة المتحدة";}s:2:"GD";a:1:{i:0;s:14:"غرينادا";}s:2:"GE";a:1:{i:0;s:12:"جورجيا";}s:2:"GH";a:1:{i:0;s:8:"غانا";}s:2:"GM";a:1:{i:0;s:12:"غامبيا";}s:2:"GN";a:1:{i:0;s:10:"غينيا";}s:2:"GQ";a:1:{i:0;s:31:"غينيا الاستوائية";}s:2:"GR";a:1:{i:0;s:14:"اليونان";}s:2:"GT";a:1:{i:0;s:18:"غواتيمالا";}s:2:"GW";a:1:{i:0;s:21:"غينيا بيساو";}s:2:"GY";a:1:{i:0;s:14:"غوايانا";}s:2:"HN";a:1:{i:0;s:14:"هندوراس";}s:2:"HR";a:1:{i:0;s:14:"كرواتيا";}s:2:"HT";a:1:{i:0;s:10:"هايتي";}s:2:"HU";a:1:{i:0;s:14:"هنغاريا";}s:2:"ID";a:1:{i:0;s:18:"اندونيسيا";}s:2:"IE";a:1:{i:0;s:14:"ايرلندا";}s:2:"IL";a:1:{i:0;s:14:"اسرائيل";}s:2:"IN";a:1:{i:0;s:10:"الهند";}s:2:"IQ";a:1:{i:0;s:12:"العراق";}s:2:"IR";a:1:{i:0;s:10:"ايران";}s:2:"IS";a:1:{i:0;s:14:"ايسلندا";}s:2:"IT";a:1:{i:0;s:14:"ايطاليا";}s:2:"JM";a:1:{i:0;s:14:"جامايكا";}s:2:"JO";a:1:{i:0;s:12:"الاردن";}s:2:"JP";a:1:{i:0;s:14:"اليابان";}s:2:"KE";a:1:{i:0;s:10:"كينيا";}s:2:"KG";a:1:{i:0;s:20:"قيرغيزستان";}s:2:"KH";a:1:{i:0;s:14:"كمبوديا";}s:2:"KI";a:1:{i:0;s:16:"كيريباتي";}s:2:"KM";a:1:{i:0;s:17:"جزر القمر";}s:2:"KN";a:1:{i:0;s:30:"سانت كيتس ونيÙيس";}s:2:"KP";a:1:{i:0;s:27:"كوريا الشمالية";}s:2:"KR";a:1:{i:0;s:27:"كوريا الجنوبية";}s:2:"KW";a:1:{i:0;s:12:"الكويت";}s:2:"KZ";a:1:{i:0;s:18:"
كازاخستان";}s:2:"LA";a:1:{i:0;s:8:"لاوس";}s:2:"LB";a:1:{i:0;s:10:"لبنان";}s:2:"LC";a:1:{i:0;s:19:"سانت لوسيا";}s:2:"LI";a:1:{i:0;s:20:"ليختنشتاين";}s:2:"LK";a:1:{i:0;s:17:"سري لانكا";}s:2:"LR";a:1:{i:0;s:14:"ليبيريا";}s:2:"LS";a:1:{i:0;s:12:"ليسوتو";}s:2:"LT";a:1:{i:0;s:16:"ليتوانيا";}s:2:"LU";a:1:{i:0;s:18:"لوكسومبرغ";}s:2:"LV";a:1:{i:0;s:12:"لاتÙيا";}s:2:"LY";a:1:{i:0;s:10:"ليبيا";}s:2:"MA";a:1:{i:0;s:12:"المغرب";}s:2:"MC";a:1:{i:0;s:12:"موناكو";}s:2:"MD";a:1:{i:0;s:14:"مولدوÙا";}s:2:"MG";a:1:{i:0;s:12:"مدغشقر";}s:2:"MH";a:1:{i:0;s:23:"جزر المارشال";}s:2:"MK";a:1:{i:0;s:14:"مقدونيا";}s:2:"ML";a:1:{i:0;s:8:"مالي";}s:2:"MM";a:1:{i:0;s:14:"ميانمار";}s:2:"MN";a:1:{i:0;s:14:"منغوليا";}s:2:"MR";a:1:{i:0;s:18:"موريتانيا";}s:2:"MT";a:1:{i:0;s:10:"مالطة";}s:2:"MU";a:1:{i:0;s:14:"موريشوس";}s:2:"MV";a:1:{i:0;s:12:"مالديÙ";}s:2:"MW";a:1:{i:0;s:10:"ملاوي";}s:2:"MX";a:1:{i:0;s:14:"المكسيك";}s:2:"MY";a:1:{i:0;s:14:"ماليزيا";}s:2:"MZ";a:1:{i:0;s:14:"موزمبيق";}s:2:"NA";a:1:{i:0;s:14:"ناميبيا";}s:2:"NE";a:1:{i:0;s:12:"النيجر";}s:2:"NG";a:1:{i:0;s:14:"نيجيريا";}s:2:"NI";a:1:{i:0;s:18:"نيكاراغوا";}s:2:"NL";a:1:{i:0;s:12:"هولندا";}s:2:"NO";a:1:{i:0;s:14:"النرويج";}s:2:"NP";a:1:{i:0;s:14:"النيبال";}s:2:"NR";a:1:{i:0;s:10:"ناورو";}s:2:"NZ";a:1:{i:0;s:27:"زيلندا الجديدة";}s:2:"OM";a:1:{i:0;s:8:"عمان";}s:2:"PA";a:1:{i:0;s:8:"بنما";}s:2:"PE";a:1:{i:0;s:8:"بيرو";}s:2:"PG";a:1:{i:0;s:36:"بابوا غينيا الجديدة";}s:2:"PH";a:1:{i:0;s:16:"الÙيلبين";}s:2:"PK";a:1:{i:0;s:18:"الباكستان";}s:2:"PL";a:1:{i:0;s:12:"بولندا";}s:2:"PT";a:1:{i:0;s:16:"البرتغال";}s:2:"PW";a:1:{i:0;s:10:"بالاو";}s:2:"PY";a:1:{i:0;s:16:"باراغواي";}s:2:"QA";a:1:{i:0;s:6:"قطر";}s:2:"RO";a:1:{i:0;s:14:"رومانيا";}s:2:"RU";a:1:{i:0;s:10
:"روسيا";}s:2:"RW";a:1:{i:0;s:12:"رواندا";}s:2:"SA";a:1:{i:0;s:31:"العربية السعودية";}s:2:"SB";a:1:{i:0;s:19:"جزر سليمان";}s:2:"SC";a:1:{i:0;s:8:"سيشل";}s:2:"SD";a:1:{i:0;s:14:"السودان";}s:2:"SE";a:1:{i:0;s:12:"السويد";}s:2:"SG";a:1:{i:0;s:16:"سنغاÙورة";}s:2:"SI";a:1:{i:0;s:16:"سلوÙينيا";}s:2:"SK";a:1:{i:0;s:16:"سلوÙاكيا";}s:2:"SL";a:1:{i:0;s:16:"سيراليون";}s:2:"SM";a:1:{i:0;s:19:"سان مارينو";}s:2:"SN";a:1:{i:0;s:14:"السنغال";}s:2:"SO";a:1:{i:0;s:14:"الصومال";}s:2:"SR";a:1:{i:0;s:14:"سورينام";}s:2:"ST";a:1:{i:0;s:34:"سان تومي وبرينسيبي";}s:2:"SV";a:1:{i:0;s:18:"السلÙادور";}s:2:"SY";a:1:{i:0;s:10:"سورية";}s:2:"SZ";a:1:{i:0;s:18:"سوازيلاند";}s:2:"TD";a:1:{i:0;s:8:"تشاد";}s:2:"TG";a:1:{i:0;s:8:"توغو";}s:2:"TH";a:1:{i:0;s:12:"تايلند";}s:2:"TJ";a:1:{i:0;s:18:"تاجيكستان";}s:2:"TM";a:1:{i:0;s:20:"تركمانستان";}s:2:"TN";a:1:{i:0;s:8:"تونس";}s:2:"TO";a:1:{i:0;s:10:"تونغا";}s:2:"TR";a:1:{i:0;s:10:"تركيا";}s:2:"TT";a:1:{i:0;s:31:"ترينيداد وتوباغو";}s:2:"TV";a:1:{i:0;s:12:"توÙالو";}s:2:"TW";a:1:{i:0;s:12:"تايوان";}s:2:"TZ";a:1:{i:0;s:16:"تانزانيا";}s:2:"UA";a:1:{i:0;s:16:"اوكرانيا";}s:2:"UG";a:1:{i:0;s:12:"اوغندا";}s:2:"US";a:1:{i:0;s:52:"الاولايات المتحدة الامريكية";}s:2:"UY";a:1:{i:0;s:14:"اروغواي";}s:2:"UZ";a:1:{i:0;s:16:"ازبكستان";}s:2:"VA";a:1:{i:0;s:18:"الÙاتيكان";}s:2:"VC";a:1:{i:0;s:45:"سانت Ùنسنت وجزر غرينادين";}s:2:"VE";a:1:{i:0;s:14:"Ùنزويلا";}s:2:"VN";a:1:{i:0;s:12:"Ùيتنام";}s:2:"VU";a:1:{i:0;s:14:"Ùانوآتو";}s:2:"WS";a:1:{i:0;s:10:"ساموا";}s:2:"YE";a:1:{i:0;s:10:"اليمن";}s:2:"ZA";a:1:{i:0;s:23:"جنوب اÙريقيا";}s:2:"ZM";a:1:{i:0;s:12:"زامبيا";}s:2:"ZW";a:1:{i:0;s:16:"زيمبابوي";}}s:10:"Currencies";a:17:{s:3:"AED";a:2:{i:0;s:9:"د.Ø¥.â€";i:1;s:3:"AED
";}s:3:"BHD";a:2:{i:0;s:9:"د.ب.â€";i:1;s:3:"BHD";}s:3:"DZD";a:2:{i:0;s:9:"د.ج.â€";i:1;s:3:"DZD";}s:3:"EGP";a:2:{i:0;s:9:"ج.Ù….â€";i:1;s:3:"EGP";}s:3:"IQD";a:2:{i:0;s:9:"د.ع.â€";i:1;s:3:"IQD";}s:3:"JOD";a:2:{i:0;s:9:"د.Ø£.â€";i:1;s:3:"JOD";}s:3:"KWD";a:2:{i:0;s:9:"د.Ùƒ.â€";i:1;s:3:"KWD";}s:3:"LBP";a:2:{i:0;s:9:"Ù„.Ù„.â€";i:1;s:3:"LBP";}s:3:"LYD";a:2:{i:0;s:9:"د.Ù„.â€";i:1;s:3:"LYD";}s:3:"MAD";a:2:{i:0;s:9:"د.Ù….â€";i:1;s:3:"MAD";}s:3:"OMR";a:2:{i:0;s:9:"ر.ع.â€";i:1;s:3:"OMR";}s:3:"QAR";a:2:{i:0;s:9:"ر.Ù‚.â€";i:1;s:3:"QAR";}s:3:"SAR";a:2:{i:0;s:9:"ر.س.â€";i:1;s:3:"SAR";}s:3:"SDP";a:2:{i:0;s:9:"ج.س.â€";i:1;s:3:"SDP";}s:3:"SYP";a:2:{i:0;s:9:"Ù„.س.â€";i:1;s:3:"SYP";}s:3:"TND";a:2:{i:0;s:9:"د.ت.â€";i:1;s:3:"TND";}s:3:"YER";a:2:{i:0;s:9:"ر.ÙŠ.â€";i:1;s:3:"YER";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:10:"تقويم";}s:9:"collation";a:1:{i:0;s:14:"الترتيب";}s:8:"currency";a:1:{i:0;s:14:"العملات";}}s:9:"Languages";a:79:{s:2:"aa";a:1:{i:0;s:16:"الاÙارية";}s:2:"ab";a:1:{i:0;s:18:"الابخازية";}s:2:"af";a:1:{i:0;s:18:"الاÙريقية";}s:3:"afa";a:1:{i:0;s:21:"اÙرو-اسيوية";}s:3:"ang";a:1:{i:0;s:27:"انكليزية، قديم";}s:2:"ar";a:1:{i:0;s:14:"العربية";}s:3:"arc";a:1:{i:0;s:16:"الارامية";}s:2:"az";a:1:{i:0;s:10:"اذرية";}s:3:"bal";a:1:{i:0;s:16:"البلوشية";}s:2:"be";a:1:{i:0;s:22:"البيلوروسية";}s:3:"ber";a:1:{i:0;s:16:"البربرية";}s:2:"bg";a:1:{i:0;s:18:"البلغارية";}s:2:"bn";a:1:{i:0;s:18:"البنغالية";}s:2:"bo";a:1:{i:0;s:14:"التبتية";}s:2:"bs";a:1:{i:0;s:16:"البوسنية";}s:2:"ca";a:1:{i:0;s:24:"الكاتالوينية";}s:2:"ce";a:1:{i:0;s:18:"الشيشانية";}s:3:"cop";a:1:{i:0;s:10:"قبطية";}s:2:"cs";a:1:{i:0;s:16:"التشيكية";}s:2:"cy";a:1:{i:0;s:14:"الولزية";}s:2:"da";a:1:{i:0;s:22:"الدانماركية";}s:2:"de";a:1:{i:0;s:18:"الالمانية";}s:2:"dv";a:1:{i:0;s:20:"المالديÙية";}s:2:"dz";a:1:{i:0;s:18:"الزونخا
ية";}s:3:"egy";a:1:{i:0;s:23:"مصرية، قديمة";}s:2:"el";a:1:{i:0;s:18:"اليونانية";}s:2:"en";a:1:{i:0;s:20:"الانجليزية";}s:2:"eo";a:1:{i:0;s:16:"اسبرانتو";}s:2:"es";a:1:{i:0;s:18:"الاسبانية";}s:2:"et";a:1:{i:0;s:14:"استونية";}s:2:"fa";a:1:{i:0;s:16:"الÙارسية";}s:2:"fi";a:1:{i:0;s:18:"الÙنلندية";}s:2:"fj";a:1:{i:0;s:14:"الÙيجية";}s:2:"fr";a:1:{i:0;s:16:"الÙرنسية";}s:2:"gu";a:1:{i:0;s:22:"الغوجاراتية";}s:2:"he";a:1:{i:0;s:14:"العبرية";}s:2:"hi";a:1:{i:0;s:14:"الهندية";}s:2:"hr";a:1:{i:0;s:18:"الكرواتية";}s:2:"ht";a:1:{i:0;s:16:"الهايتية";}s:2:"hu";a:1:{i:0;s:18:"الهنغارية";}s:2:"hy";a:1:{i:0;s:16:"الارمنية";}s:2:"id";a:1:{i:0;s:22:"الاندونيسية";}s:3:"ira";a:1:{i:0;s:18:"الايرانية";}s:2:"it";a:1:{i:0;s:18:"الايطالية";}s:2:"ja";a:1:{i:0;s:18:"اليابانية";}s:2:"km";a:1:{i:0;s:16:"الخميرية";}s:2:"ko";a:1:{i:0;s:14:"الكورية";}s:2:"ks";a:1:{i:0;s:20:"الكاشميرية";}s:2:"ku";a:1:{i:0;s:14:"الكردية";}s:2:"la";a:1:{i:0;s:18:"اللاتينية";}s:2:"lt";a:1:{i:0;s:18:"اللتوانية";}s:2:"lv";a:1:{i:0;s:16:"اللاتÙية";}s:2:"mn";a:1:{i:0;s:18:"المنغولية";}s:2:"ms";a:1:{i:0;s:21:"لغة الملايو";}s:2:"mt";a:1:{i:0;s:16:"المالطية";}s:2:"my";a:1:{i:0;s:16:"البورمية";}s:2:"ne";a:1:{i:0;s:18:"النيبالية";}s:2:"nl";a:1:{i:0;s:18:"الهولندية";}s:2:"pa";a:1:{i:0;s:18:"البنجابية";}s:2:"pl";a:1:{i:0;s:18:"البولونية";}s:2:"ps";a:1:{i:0;s:18:"البشتونية";}s:2:"pt";a:1:{i:0;s:20:"البرتغالية";}s:2:"ro";a:1:{i:0;s:18:"الرومانية";}s:2:"ru";a:1:{i:0;s:14:"الروسية";}s:3:"smi";a:1:{i:0;s:27:"اللغات السامية";}s:2:"sq";a:1:{i:0;s:18:"الالبانية";}s:2:"sr";a:1:{i:0;s:14:"الصربية";}s:2:"sv";a:1:{i:0;s:16:"السويدية";}s:2:"sw";a:1:{i:0;s:18:"السواحلية";}s:3:"syr";a:1:{i:0;s:18:"السرÙ
ŠØ§Ù†ÙŠØ©";}s:2:"th";a:1:{i:0;s:22:"التايلاندية";}s:2:"tl";a:1:{i:0;s:22:"التاغالوغية";}s:2:"tr";a:1:{i:0;s:14:"التركية";}s:2:"tt";a:1:{i:0;s:14:"التترية";}s:2:"ug";a:1:{i:0;s:16:"الاغورية";}s:2:"uk";a:1:{i:0;s:20:"الاوكرانية";}s:2:"ur";a:1:{i:0;s:14:"الاردية";}s:2:"vi";a:1:{i:0;s:20:"الÙيتنامية";}s:2:"zh";a:1:{i:0;s:14:"الصينية";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Arab";}s:14:"NumberElements";a:12:{i:0;s:2:"Ù«";i:1;s:2:"Ù¬";i:2;s:1:";";i:3;s:2:"Ùª";i:4;s:2:"Ù ";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;#,##0.###-";i:1;s:24:"¤ #,##0.00;¤ #,##0.00-";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Scripts";a:19:{s:4:"Arab";a:1:{i:0;s:14:"العربية";}s:4:"Armn";a:1:{i:0;s:16:"الارمنية";}s:4:"Beng";a:1:{i:0;s:18:"البنغالية";}s:4:"Brai";a:1:{i:0;s:10:"برايل";}s:4:"Copt";a:1:{i:0;s:14:"القبطية";}s:4:"Cprt";a:1:{i:0;s:16:"القبرصية";}s:4:"Ethi";a:1:{i:0;s:18:"الاثيوبية";}s:4:"Geor";a:1:{i:0;s:16:"الجورجية";}s:4:"Grek";a:1:{i:0;s:18:"اليونانية";}s:4:"Gujr";a:1:{i:0;s:18:"تاغجراتية";}s:4:"Hebr";a:1:{i:0;s:14:"العبرية";}s:4:"Khmr";a:1:{i:0;s:16:"الخميرية";}s:4:"Latn";a:1:{i:0;s:16:"اللاتنية";}s:4:"Mong";a:1:{i:0;s:16:"المغولية";}s:4:"Syrc";a:1:{i:0;s:18:"السريانية";}s:4:"Taml";a:1:{i:0;s:14:"التاميل";}s:4:"Tglg";a:1:{i:0;s:20:"التغالوغية";}s:4:"Thai";a:1:{i:0;s:20:"التايلندية";}s:4:"Tibt";a:1:{i:0;s:14:"التبتية";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:19:"تقويم بوني";}s:7:"chinese";a:1:{i:0;s:19:"تقويم صيني";}s:9:"gregorian";a:1:{i:0;s:23:"تقويم ميلادي";}s:6:"hebrew";a:1:{i:0;s:19:"تقويم عبري";}s:7:"islamic";a:1:{i:0;s:23:"تقويم اسلامي";}s:13:"islamic-civil";a:1:{i:0;s:32:"تقويم اسلامي مدني";}s:8:"japanese";a:1:{i:0;s:23:"ت
قويم ياباني";}}s:9:"collation";a:3:{s:6:"direct";a:1:{i:0;s:21:"ترتيب مباشر";}s:9:"phonebook";a:1:{i:0;s:32:"ترتيب دليل الهاتÙ";}s:11:"traditional";a:1:{i:0;s:12:"تقليدي";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:4:{s:8:"buddhist";a:1:{s:4:"eras";a:1:{s:11:"abbreviated";a:1:{i:0;s:27:"التقويم البوذي";}}}s:9:"gregorian";a:7:{s:11:"AmPmMarkers";a:2:{i:0;s:2:"ص";i:1;s:2:"Ù…";}s:26:"DateTimeElements:intvector";a:2:{i:0;i:7;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"z h:mm:ss a";i:1;s:9:"h:mm:ss a";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:18:"EEEE, d MMMM, yyyy";i:5;s:12:"d MMMM, yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"d/M/yyyy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:2:"Ø­";i:1;s:2:"Ù†";i:2;s:2:"Ø«";i:3;s:2:"ر";i:4;s:2:"Ø®";i:5;s:2:"ج";i:6;s:2:"س";}s:6:"narrow";a:7:{i:0;s:2:"Ø­";i:1;s:2:"Ù†";i:2;s:2:"Ø«";i:3;s:2:"ر";i:4;s:2:"Ø®";i:5;s:2:"ج";i:6;s:2:"س";}s:4:"wide";a:7:{i:0;s:10:"الأحد";i:1;s:14:"الاثنين";i:2;s:16:"الثلاثاء";i:3;s:16:"الأربعاء";i:4;s:12:"الخميس";i:5;s:12:"الجمعة";i:6;s:10:"السبت";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:5:"Ù‚.Ù…";i:1;s:2:"Ù…";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:10:"يناير";i:1;s:12:"Ùبراير";i:2;s:8:"مارس";i:3;s:10:"أبريل";i:4;s:8:"مايو";i:5;s:10:"يونيو";i:6;s:10:"يوليو";i:7;s:10:"أغسطس";i:8;s:12:"سبتمبر";i:9;s:12:"أكتوبر";i:10;s:12:"نوÙمبر";i:11;s:12:"ديسمبر";}s:6:"narrow";a:12:{i:0;s:2:"ÙŠ";i:1;s:2:"Ù";i:2;s:2:"Ù…";i:3;s:2:"Ø¢";i:4;s:2:"Ùˆ";i:5;s:2:"Ù†";i:6;s:2:"Ù„";i:7;s:2:"غ";i:8;s:2:"س";i:9;s:2:"Ùƒ";i:10;s:2:"ب";i:11;s:2:"د";}s:4:"wide";a:12:{i:0;s:10:"يناير";i:1;s:12:"Ùبراير";i:2;s:8:"مارس";i:3;s:10:"أبريل";i:4;s:8:"مايو";i:5;s:10:"يونيو";i:6;s:10:"يوليو";i:7;s:10:"أغسطس";i:8;s:12:"سبتمبر";i:9;s:12:"أكتوبر";i:10;s:12:"نوÙمبر";i:11;s:12:"ديسمب
ر";}}}s:17:"weekend:intvector";a:4:{i:0;i:5;i:1;i:0;i:2;i:6;i:3;i:86400000;}}s:7:"islamic";a:2:{s:4:"eras";a:1:{s:11:"abbreviated";a:1:{i:0;s:5:"Ù‡â€";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:17:"abbreviated:alias";a:1:{i:0;s:42:"ar/calendar/islamic/monthNames/format/wide";}s:4:"wide";a:12:{i:0;s:8:"محرم";i:1;s:6:"صÙر";i:2;s:19:"ربيع الأول";i:3;s:19:"ربيع الآخر";i:4;s:23:"جمادى الأولى";i:5;s:23:"جمادى الآخرة";i:6;s:6:"رجب";i:7;s:10:"شعبان";i:8;s:10:"رمضان";i:9;s:8:"شوال";i:10;s:17:"ذو القعدة";i:11;s:15:"ذو الحجة";}}}}s:13:"islamic-civil";a:2:{s:10:"eras:alias";a:1:{i:0;s:24:"ar/calendar/islamic/eras";}s:16:"monthNames:alias";a:1:{i:0;s:30:"ar/calendar/islamic/monthNames";}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_AE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_AE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_AE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_BH.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_BH.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_BH.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_DZ.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_DZ.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_DZ.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberElements";a:12:{i:0;s:2:"٫";i:1;s:2:"٬";i:2;s:1:";";i:3;s:2:"٪";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_EG.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_EG.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_EG.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:17:"weekend:intvector";a:4:{i:0;i:6;i:1;i:0;i:2;i:7;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_IN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_IN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_IN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:28:"##,##,##0.###;-##,##,##0.###";i:1;s:32:"¤ ##,##,##0.00;-¤ ##,##,##0.00";i:2;s:10:"##,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:6:"d-M-yy";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:1;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_IQ.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_IQ.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_IQ.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;#,##0.###-";i:1;s:26:"¤ #,##0.000;¤ #,##0.000-";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_JO.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_JO.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_JO.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;#,##0.###-";i:1;s:26:"¤ #,##0.000;¤ #,##0.000-";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:8:"dayNames";a:1:{s:6:"format";a:1:{s:11:"abbreviated";a:7:{i:0;s:10:"الأحد";i:1;s:14:"الاثنين";i:2;s:16:"الثلاثاء";i:3;s:16:"الأربعاء";i:4;s:12:"الخميس";i:5;s:12:"الجمعة";i:6;s:10:"السبت";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:23:"كانون الثاني";i:1;s:8:"شباط";i:2;s:8:"آذار";i:3;s:10:"نيسان";i:4;s:8:"أيار";i:5;s:12:"حزيران";i:6;s:8:"تموز";i:7;s:4:"آب";i:8;s:10:"أيلول";i:9;s:21:"تشرين الأول";i:10;s:23:"تشرين الثاني";i:11;s:21:"كانون الأول";}s:4:"wide";a:12:{i:0;s:23:"كانون الثاني";i:1;s:8:"شباط";i:2;s:8:"آذار";i:3;s:10:"نيسان";i:4;s:8:"أيار";i:5;s:12:"حزيران";i:6;s:8:"تموز";i:7;s:4:"آب";i:8;s:10:"أيلول";i:9;s:21:"تشرين الأول";i:10;s:23:"تشرين الثاني";i:11;s:21:"كانون الأول";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_KW.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_KW.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_KW.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;#,##0.###-";i:1;s:26:"¤ #,##0.000;¤ #,##0.000-";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_LB.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_LB.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_LB.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:8:"dayNames";a:1:{s:6:"format";a:1:{s:11:"abbreviated";a:7:{i:0;s:10:"الأحد";i:1;s:14:"الاثنين";i:2;s:16:"الثلاثاء";i:3;s:16:"الأربعاء";i:4;s:12:"الخميس";i:5;s:12:"الجمعة";i:6;s:10:"السبت";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:23:"كانون الثاني";i:1;s:8:"شباط";i:2;s:8:"آذار";i:3;s:10:"نيسان";i:4;s:8:"نوار";i:5;s:12:"حزيران";i:6;s:8:"تموز";i:7;s:4:"آب";i:8;s:10:"أيلول";i:9;s:21:"تشرين الأول";i:10;s:23:"تشرين الثاني";i:11;s:21:"كانون الأول";}s:4:"wide";a:12:{i:0;s:23:"كانون الثاني";i:1;s:8:"شباط";i:2;s:8:"آذار";i:3;s:10:"نيسان";i:4;s:8:"نوار";i:5;s:12:"حزيران";i:6;s:8:"تموز";i:7;s:4:"آب";i:8;s:10:"أيلول";i:9;s:21:"تشرين الأول";i:10;s:23:"تشرين الثاني";i:11;s:21:"كانون الأول";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_LY.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_LY.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_LY.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;#,##0.###-";i:1;s:26:"¤ #,##0.000;¤ #,##0.000-";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_MA.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_MA.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_MA.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberElements";a:12:{i:0;s:2:"٫";i:1;s:2:"٬";i:2;s:1:";";i:3;s:2:"٪";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_OM.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_OM.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_OM.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_QA.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_QA.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_QA.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:18:"###0.###;###0.###-";i:1;s:20:"¤###0.00;-¤###0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:8:"dayNames";a:1:{s:6:"format";a:1:{s:11:"abbreviated";a:7:{i:0;s:10:"الأحد";i:1;s:14:"الاثنين";i:2;s:16:"الثلاثاء";i:3;s:16:"الأربعاء";i:4;s:12:"الخميس";i:5;s:12:"الجمعة";i:6;s:10:"السبت";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_SA.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_SA.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_SA.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:18:"###0.###;###0.###-";i:1;s:20:"¤###0.00;-¤###0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:8:"dayNames";a:1:{s:6:"format";a:1:{s:11:"abbreviated";a:7:{i:0;s:10:"الأحد";i:1;s:14:"الاثنين";i:2;s:16:"الثلاثاء";i:3;s:16:"الأربعاء";i:4;s:12:"الخميس";i:5;s:12:"الجمعة";i:6;s:10:"السبت";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_SD.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_SD.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_SD.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_SY.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_SY.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_SY.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:18:"###0.###;###0.###-";i:1;s:20:"¤###0.00;-¤###0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:4:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:5;i:1;i:1;}s:8:"dayNames";a:1:{s:6:"format";a:1:{s:11:"abbreviated";a:7:{i:0;s:10:"الأحد";i:1;s:14:"الاثنين";i:2;s:16:"الثلاثاء";i:3;s:16:"الأربعاء";i:4;s:12:"الخميس";i:5;s:12:"الجمعة";i:6;s:10:"السبت";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:23:"كانون الثاني";i:1;s:8:"شباط";i:2;s:8:"آذار";i:3;s:10:"نيسان";i:4;s:8:"نوار";i:5;s:12:"حزيران";i:6;s:8:"تموز";i:7;s:4:"آب";i:8;s:10:"أيلول";i:9;s:21:"تشرين الأول";i:10;s:23:"تشرين الثاني";i:11;s:21:"كانون الأول";}s:4:"wide";a:12:{i:0;s:23:"كانون الثاني";i:1;s:8:"شباط";i:2;s:8:"آذار";i:3;s:10:"نيسان";i:4;s:8:"نوار";i:5;s:12:"حزيران";i:6;s:8:"تموز";i:7;s:4:"آب";i:8;s:10:"أيلول";i:9;s:21:"تشرين الأول";i:10;s:23:"تشرين الثاني";i:11;s:21:"كانون الأول";}}}s:17:"weekend:intvector";a:4:{i:0;i:6;i:1;i:0;i:2;i:7;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_TN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_TN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_TN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:14:"NumberElements";a:12:{i:0;s:2:"٫";i:1;s:2:"٬";i:2;s:1:";";i:3;s:2:"٪";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:18:"###0.###;###0.###-";i:1;s:20:"¤###0.00;-¤###0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:8:"dayNames";a:1:{s:6:"format";a:1:{s:11:"abbreviated";a:7:{i:0;s:10:"الأحد";i:1;s:14:"الاثنين";i:2;s:16:"الثلاثاء";i:3;s:16:"الأربعاء";i:4;s:12:"الخميس";i:5;s:12:"الجمعة";i:6;s:10:"السبت";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_YE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_YE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ar_YE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:18:"###0.###;###0.###-";i:1;s:20:"¤###0.00;-¤###0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:8:"dayNames";a:1:{s:6:"format";a:1:{s:11:"abbreviated";a:7:{i:0;s:10:"الأحد";i:1;s:14:"الاثنين";i:2;s:16:"الثلاثاء";i:3;s:16:"الأربعاء";i:4;s:12:"الخميس";i:5;s:12:"الجمعة";i:6;s:10:"السبت";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/be.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/be.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/be.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:8:{s:9:"Countries";a:1:{s:2:"BY";a:1:{i:0;s:16:"БеларуÑÑŒ";}}s:10:"Currencies";a:1:{s:3:"BYB";a:2:{i:0;s:6:"Руб";i:1;s:3:"BYB";}}s:9:"Languages";a:1:{s:2:"be";a:1:{i:0;s:18:"БеларуÑкі";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Cyrl";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH.mm.ss z";i:1;s:10:"HH.mm.ss z";i:2;s:8:"HH.mm.ss";i:3;s:5:"HH.mm";i:4;s:17:"EEEE, d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:8:"d.M.yyyy";i:7;s:6:"d.M.yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:4:"нд";i:1;s:4:"пн";i:2;s:4:"аў";i:3;s:4:"ÑÑ€";i:4;s:4:"чц";i:5;s:4:"пт";i:6;s:4:"Ñб";}s:4:"wide";a:7:{i:0;s:14:"нÑдзелÑ";i:1;s:20:"панÑдзелак";i:2;s:14:"аўторак";i:3;s:12:"Ñерада";i:4;s:12:"чацвер";i:5;s:14:"пÑтніца";i:6;s:12:"Ñубота";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:11:"да н.е.";i:1;s:6:"н.е.";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:6:"Ñту";i:1;s:6:"лют";i:2;s:6:"Ñак";i:3;s:6:"кра";i:4;s:6:"май";i:5;s:6:"чÑÑ€";i:6;s:6:"ліп";i:7;s:6:"жні";i:8;s:6:"вер";i:9;s:6:"каÑ";i:10;s:6:"ліÑ";i:11;s:6:"Ñне";}s:4:"wide";a:12:{i:0;s:16:"Ñтудзень";i:1;s:8:"люты";i:2;s:14:"Ñакавік";i:3;s:16:"краÑавік";i:4;s:6:"май";i:5;s:14:"чÑрвень";i:6;s:12:"ліпень";i:7;s:14:"жнівень";i:8;s:16:"вераÑень";i:9;s:20:"каÑтрычнік";i:10;s:16:"ліÑтапад";i:11;s:14:"Ñнежань";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/be_BY.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/be_BY.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/be_BY.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:16:"¤#,##0;-¤#,##0";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bg.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bg.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bg.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:12:{s:9:"Countries";a:239:{s:2:"AD";a:1:{i:0;s:12:"Ðндора";}s:2:"AE";a:1:{i:0;s:50:"Обединени ÐрабÑки ЕмирÑтва";}s:2:"AF";a:1:{i:0;s:20:"ÐфганиÑтан";}s:2:"AG";a:1:{i:0;s:32:"Ðнтигуа и Барбуда";}s:2:"AI";a:1:{i:0;s:14:"Ðнгуила";}s:2:"AL";a:1:{i:0;s:14:"ÐлбаниÑ";}s:2:"AM";a:1:{i:0;s:14:"ÐрмениÑ";}s:2:"AN";a:1:{i:0;s:31:"ХоландÑки Ðнтили";}s:2:"AO";a:1:{i:0;s:12:"Ðнгола";}s:2:"AQ";a:1:{i:0;s:20:"Ðнтарктика";}s:2:"AR";a:1:{i:0;s:18:"Ðржентина";}s:2:"AS";a:1:{i:0;s:33:"ÐмериканÑко Самоа";}s:2:"AT";a:1:{i:0;s:14:"ÐвÑтриÑ";}s:2:"AU";a:1:{i:0;s:18:"ÐвÑтралиÑ";}s:2:"AW";a:1:{i:0;s:10:"Ðруба";}s:2:"AZ";a:1:{i:0;s:22:"Ðзербайджан";}s:2:"BA";a:1:{i:0;s:36:"БоÑна и Херцеговина";}s:2:"BB";a:1:{i:0;s:16:"БарбадоÑ";}s:2:"BD";a:1:{i:0;s:18:"Бангладеш";}s:2:"BE";a:1:{i:0;s:12:"БелгиÑ";}s:2:"BF";a:1:{i:0;s:23:"Буркина ФаÑо";}s:2:"BG";a:1:{i:0;s:16:"БългариÑ";}s:2:"BH";a:1:{i:0;s:14:"Бахрейн";}s:2:"BI";a:1:{i:0;s:14:"Бурунди";}s:2:"BJ";a:1:{i:0;s:10:"Бенин";}s:2:"BM";a:1:{i:0;s:14:"Бермуда";}s:2:"BN";a:1:{i:0;s:31:"Бруней ДаруÑалам";}s:2:"BO";a:1:{i:0;s:14:"БоливиÑ";}s:2:"BR";a:1:{i:0;s:16:"БразилиÑ";}s:2:"BS";a:1:{i:0;s:12:"Бахами";}s:2:"BT";a:1:{i:0;s:10:"Бутан";}s:2:"BV";a:1:{i:0;s:21:"ОÑтров Буве";}s:2:"BW";a:1:{i:0;s:16:"БотÑуана";}s:2:"BY";a:1:{i:0;s:14:"БеларуÑ";}s:2:"BZ";a:1:{i:0;s:10:"Белиз";}s:2:"CA";a:1:{i:0;s:12:"Канада";}s:2:"CC";a:1:{i:0;s:48:"КокоÑови (Кийлинг) оÑтрови";}s:2:"CD";a:1:{i:0;s:54:"Демократична Република Конго";}s:2:"CF";a:1:{i:0;s:57:"ЦентралноафриканÑка Република";}s:2:"CG";a:1:{i:0;s:10:"Конго";}s:2:"CH";a:1:{i:0;s:18:"ШвейцариÑ";}s:2:"CI";a:1:{i:0;s:22:"Кот д’Ивоар";}s:2:"CK";a:1
:{i:0;s:21:"ОÑтрови Кук";}s:2:"CL";a:1:{i:0;s:8:"Чили";}s:2:"CM";a:1:{i:0;s:14:"Камерун";}s:2:"CN";a:1:{i:0;s:10:"Китай";}s:2:"CO";a:1:{i:0;s:16:"КолумбиÑ";}s:2:"CR";a:1:{i:0;s:19:"КоÑта Рика";}s:2:"CU";a:1:{i:0;s:8:"Куба";}s:2:"CV";a:1:{i:0;s:19:"Кабо Верде";}s:2:"CX";a:1:{i:0;s:29:"ОÑтров КриÑтмаÑ";}s:2:"CY";a:1:{i:0;s:10:"Кипър";}s:2:"CZ";a:1:{i:0;s:29:"Чешка Република";}s:2:"DE";a:1:{i:0;s:16:"ГерманиÑ";}s:2:"DJ";a:1:{i:0;s:14:"Джибути";}s:2:"DK";a:1:{i:0;s:10:"ДаниÑ";}s:2:"DM";a:1:{i:0;s:16:"Доминика";}s:2:"DO";a:1:{i:0;s:43:"ДоминиканÑка Република";}s:2:"DZ";a:1:{i:0;s:10:"Ðлжир";}s:2:"EC";a:1:{i:0;s:14:"Еквадор";}s:2:"EE";a:1:{i:0;s:14:"ЕÑтониÑ";}s:2:"EG";a:1:{i:0;s:12:"Египет";}s:2:"EH";a:1:{i:0;s:27:"Западна Сахара";}s:2:"ER";a:1:{i:0;s:14:"ЕритреÑ";}s:2:"ES";a:1:{i:0;s:14:"ИÑпаниÑ";}s:2:"ET";a:1:{i:0;s:14:"ЕтиопиÑ";}s:2:"FI";a:1:{i:0;s:18:"ФинландиÑ";}s:2:"FJ";a:1:{i:0;s:10:"Фиджи";}s:2:"FK";a:1:{i:0;s:37:"ФолклендÑки оÑтрови";}s:2:"FM";a:1:{i:0;s:49:"МикронезиÑ, Обединени Щати";}s:2:"FO";a:1:{i:0;s:33:"ФарьорÑки оÑтрови";}s:2:"FR";a:1:{i:0;s:14:"ФранциÑ";}s:2:"GA";a:1:{i:0;s:10:"Габон";}s:2:"GB";a:1:{i:0;s:35:"Обединено кралÑтво";}s:2:"GD";a:1:{i:0;s:14:"Гренада";}s:2:"GE";a:1:{i:0;s:12:"ГрузиÑ";}s:2:"GF";a:1:{i:0;s:27:"ФренÑка Гвиана";}s:2:"GH";a:1:{i:0;s:8:"Гана";}s:2:"GI";a:1:{i:0;s:18:"Гибралтар";}s:2:"GL";a:1:{i:0;s:20:"ГренландиÑ";}s:2:"GM";a:1:{i:0;s:12:"ГамбиÑ";}s:2:"GN";a:1:{i:0;s:12:"ГвинеÑ";}s:2:"GP";a:1:{i:0;s:18:"Гваделупа";}s:2:"GQ";a:1:{i:0;s:37:"Екваториална ГвинеÑ";}s:2:"GR";a:1:{i:0;s:12:"ГърциÑ";}s:2:"GS";a:1:{i:0;s:73:"Южна Ð”Ð¶Ð¾Ñ€Ð´Ð¶Ð¸Ñ Ð¸ Южни Сандвичеви ОÑтрови";}s:2:"
GT";a:1:{i:0;s:18:"Гватемала";}s:2:"GU";a:1:{i:0;s:8:"Гуам";}s:2:"GW";a:1:{i:0;s:23:"ГвинеÑ-БиÑау";}s:2:"GY";a:1:{i:0;s:12:"Гвиана";}s:2:"HK";a:1:{i:0;s:43:"Хонг-Конг О.Ð.Р. на Китай";}s:2:"HM";a:1:{i:0;s:58:"ОÑтров Хърд и ОÑтрови Макдоналд";}s:2:"HN";a:1:{i:0;s:16:"ХондураÑ";}s:2:"HR";a:1:{i:0;s:18:"ХърватÑка";}s:2:"HT";a:1:{i:0;s:10:"Хаити";}s:2:"HU";a:1:{i:0;s:14:"УнгариÑ";}s:2:"ID";a:1:{i:0;s:18:"ИндонезиÑ";}s:2:"IE";a:1:{i:0;s:16:"ИрландиÑ";}s:2:"IL";a:1:{i:0;s:12:"Израел";}s:2:"IN";a:1:{i:0;s:10:"ИндиÑ";}s:2:"IO";a:1:{i:0;s:70:"БританÑки територии в ИндийÑÐºÐ¸Ñ Ð¾ÐºÐµÐ°Ð½";}s:2:"IQ";a:1:{i:0;s:8:"Ирак";}s:2:"IR";a:1:{i:0;s:45:"Иран, ИÑлÑмÑка република";}s:2:"IS";a:1:{i:0;s:16:"ИÑландиÑ";}s:2:"IT";a:1:{i:0;s:12:"ИталиÑ";}s:2:"JM";a:1:{i:0;s:12:"Ямайка";}s:2:"JO";a:1:{i:0;s:16:"ЙорданиÑ";}s:2:"JP";a:1:{i:0;s:12:"ЯпониÑ";}s:2:"KE";a:1:{i:0;s:10:"КениÑ";}s:2:"KG";a:1:{i:0;s:20:"КиргизÑтан";}s:2:"KH";a:1:{i:0;s:16:"Камбоджа";}s:2:"KI";a:1:{i:0;s:16:"Кирибати";}s:2:"KM";a:1:{i:0;s:12:"Комори";}s:2:"KN";a:1:{i:0;s:33:"Сейнт ÐšÐ¸Ñ‚Ñ Ð¸ ÐевиÑ";}s:2:"KP";a:1:{i:0;s:26:"КореÑ, Северна";}s:2:"KR";a:1:{i:0;s:20:"КореÑ, Южна";}s:2:"KW";a:1:{i:0;s:12:"Кувейт";}s:2:"KY";a:1:{i:0;s:33:"Кайманови оÑтрови";}s:2:"KZ";a:1:{i:0;s:18:"КазахÑтан";}s:2:"LA";a:1:{i:0;s:67:"Ðародна Демократична Република ЛаоÑ";}s:2:"LB";a:1:{i:0;s:10:"Ливан";}s:2:"LC";a:1:{i:0;s:21:"Сейнт ЛуÑиÑ";}s:2:"LI";a:1:{i:0;s:20:"Лихтенщайн";}s:2:"LK";a:1:{i:0;s:17:"Шри Ланка";}s:2:"LR";a:1:{i:0;s:14:"ЛибериÑ";}s:2:"LS";a:1:{i:0;s:12:"ЛеÑото";}s:2:"LT";a:1:{i:0;s:10:"Литва";}s:2:"LU";a:1:{i:0;s:20:"ЛюкÑембург";}s:2:"LV";a:1:{i:0;s:12:"ЛатвиÑ";}s:2:"LY"
;a:1:{i:0;s:52:"ЛибийÑка ÐрабÑка ДжамахириÑ";}s:2:"MA";a:1:{i:0;s:12:"Мароко";}s:2:"MC";a:1:{i:0;s:12:"Монако";}s:2:"MD";a:1:{i:0;s:34:"Молдова, Република";}s:2:"MG";a:1:{i:0;s:20:"МадагаÑкар";}s:2:"MH";a:1:{i:0;s:33:"Маршалови ОÑтрови";}s:2:"MK";a:1:{i:0;s:38:"МакедониÑ, Република";}s:2:"ML";a:1:{i:0;s:8:"Мали";}s:2:"MM";a:1:{i:0;s:14:"Мианмар";}s:2:"MN";a:1:{i:0;s:16:"МонголиÑ";}s:2:"MO";a:1:{i:0;s:36:"Макао О.Ð.Р. на Китай";}s:2:"MP";a:1:{i:0;s:48:"Северни МарианÑки ОÑтрови";}s:2:"MQ";a:1:{i:0;s:18:"Мартиника";}s:2:"MR";a:1:{i:0;s:20:"МавританиÑ";}s:2:"MS";a:1:{i:0;s:16:"МонÑерат";}s:2:"MT";a:1:{i:0;s:10:"Малта";}s:2:"MU";a:1:{i:0;s:16:"Мавриций";}s:2:"MV";a:1:{i:0;s:14:"Малдиви";}s:2:"MW";a:1:{i:0;s:12:"Малави";}s:2:"MX";a:1:{i:0;s:14:"МекÑико";}s:2:"MY";a:1:{i:0;s:16:"МалайзиÑ";}s:2:"MZ";a:1:{i:0;s:16:"Мозамбик";}s:2:"NA";a:1:{i:0;s:14:"ÐамибиÑ";}s:2:"NC";a:1:{i:0;s:27:"Ðова КаледониÑ";}s:2:"NE";a:1:{i:0;s:10:"Ðигер";}s:2:"NF";a:1:{i:0;s:27:"ОÑтров Ðорфолк";}s:2:"NG";a:1:{i:0;s:14:"ÐигериÑ";}s:2:"NI";a:1:{i:0;s:18:"Ðикарагуа";}s:2:"NL";a:1:{i:0;s:16:"ХоландиÑ";}s:2:"NO";a:1:{i:0;s:16:"ÐорвегиÑ";}s:2:"NP";a:1:{i:0;s:10:"Ðепал";}s:2:"NR";a:1:{i:0;s:10:"Ðауру";}s:2:"NU";a:1:{i:0;s:8:"Ðиуе";}s:2:"NZ";a:1:{i:0;s:25:"Ðова ЗеландиÑ";}s:2:"OM";a:1:{i:0;s:8:"Оман";}s:2:"PA";a:1:{i:0;s:12:"Панама";}s:2:"PE";a:1:{i:0;s:8:"Перу";}s:2:"PF";a:1:{i:0;s:33:"ФренÑка ПолинезиÑ";}s:2:"PG";a:1:{i:0;s:32:"Папуа Ðова ГвинеÑ";}s:2:"PH";a:1:{i:0;s:16:"Филипини";}s:2:"PK";a:1:{i:0;s:16:"ПакиÑтан";}s:2:"PL";a:1:{i:0;s:10:"Полша";}s:2:"PM";a:1:{i:0;s:33:"Сен Пиер и Мигелон";}s:2:"PN";a:1:{i:0;s:16:"Питкайрн";}s:2:"PR";a:1:{i:0;
s:21:"Пуерто Рико";}s:2:"PS";a:1:{i:0;s:41:"ПалеÑтинÑки територии";}s:2:"PT";a:1:{i:0;s:20:"ПортугалиÑ";}s:2:"PW";a:1:{i:0;s:10:"Палау";}s:2:"PY";a:1:{i:0;s:16:"Парагвай";}s:2:"QA";a:1:{i:0;s:10:"Катар";}s:2:"RE";a:1:{i:0;s:14:"Реюниън";}s:2:"RO";a:1:{i:0;s:14:"РумъниÑ";}s:2:"RU";a:1:{i:0;s:29:"РуÑка ФедерациÑ";}s:2:"RW";a:1:{i:0;s:12:"Руанда";}s:2:"SA";a:1:{i:0;s:31:"СаудитÑка ÐрабиÑ";}s:2:"SB";a:1:{i:0;s:35:"Соломонови ОÑтрови";}s:2:"SC";a:1:{i:0;s:14:"Сейшели";}s:2:"SD";a:1:{i:0;s:10:"Судан";}s:2:"SE";a:1:{i:0;s:12:"ШвециÑ";}s:2:"SG";a:1:{i:0;s:16:"Сингапур";}s:2:"SH";a:1:{i:0;s:21:"Света Елена";}s:2:"SI";a:1:{i:0;s:16:"СловениÑ";}s:2:"SJ";a:1:{i:0;s:35:"Свалбард и Ян Майен";}s:2:"SK";a:1:{i:0;s:16:"СловакиÑ";}s:2:"SL";a:1:{i:0;s:21:"Сиера Леоне";}s:2:"SM";a:1:{i:0;s:19:"Сан Марино";}s:2:"SN";a:1:{i:0;s:14:"Сенегал";}s:2:"SO";a:1:{i:0;s:14:"СомалиÑ";}s:2:"SR";a:1:{i:0;s:14:"Суринам";}s:2:"ST";a:1:{i:0;s:35:"Сао Томе и Принципе";}s:2:"SV";a:1:{i:0;s:21:"Ел Салвадор";}s:2:"SY";a:1:{i:0;s:50:"СирийÑка ÐрабÑка Република";}s:2:"SZ";a:1:{i:0;s:18:"Суазиленд";}s:2:"TC";a:1:{i:0;s:41:"ОÑтрови Ð¢ÑƒÑ€ÐºÑ Ð¸ КайкоÑ";}s:2:"TD";a:1:{i:0;s:6:"Чад";}s:2:"TF";a:1:{i:0;s:42:"ФренÑки Южни Територии";}s:2:"TG";a:1:{i:0;s:8:"Того";}s:2:"TH";a:1:{i:0;s:14:"Тайланд";}s:2:"TJ";a:1:{i:0;s:22:"ТаджикиÑтан";}s:2:"TK";a:1:{i:0;s:14:"Токелау";}s:2:"TL";a:1:{i:0;s:25:"Източен Тимор";}s:2:"TM";a:1:{i:0;s:24:"ТуркмениÑтан";}s:2:"TN";a:1:{i:0;s:10:"ТуниÑ";}s:2:"TO";a:1:{i:0;s:10:"Тонга";}s:2:"TR";a:1:{i:0;s:12:"ТурциÑ";}s:2:"TT";a:1:{i:0;s:32:"Тринидад и Тобаго";}s:2:"TV";a:1:{i:0;s:12:"Тувалу";}s:2:"TW";a:1:{i:0;s:12:"Тайван
";}s:2:"TZ";a:1:{i:0;s:16:"ТанзаниÑ";}s:2:"UA";a:1:{i:0;s:14:"Украйна";}s:2:"UG";a:1:{i:0;s:12:"Уганда";}s:2:"UM";a:1:{i:0;s:36:"СÐЩ - външни оÑтрови";}s:2:"US";a:1:{i:0;s:6:"СÐЩ";}s:2:"UY";a:1:{i:0;s:14:"Уругвай";}s:2:"UZ";a:1:{i:0;s:20:"УзбекиÑтан";}s:2:"VA";a:1:{i:0;s:61:"Свещено море (ВатиканÑка държава)";}s:2:"VC";a:1:{i:0;s:47:"Сейнт ВинÑънт и Гренадини";}s:2:"VE";a:1:{i:0;s:18:"Венецуела";}s:2:"VG";a:1:{i:0;s:54:"БританÑки ВирджинÑки ОÑтрови";}s:2:"VI";a:1:{i:0;s:43:"СÐЩ, ВирджинÑки ОÑтрови";}s:2:"VN";a:1:{i:0;s:14:"Виетнам";}s:2:"VU";a:1:{i:0;s:14:"Вануату";}s:2:"WF";a:1:{i:0;s:26:"Ð£Ð¾Ð»Ð¸Ñ Ð¸ Футуна";}s:2:"WS";a:1:{i:0;s:10:"Самоа";}s:2:"YE";a:1:{i:0;s:10:"Йемен";}s:2:"YT";a:1:{i:0;s:10:"Мейот";}s:2:"YU";a:1:{i:0;s:18:"ЮгоÑлавиÑ";}s:2:"ZA";a:1:{i:0;s:21:"Южна Ðфрика";}s:2:"ZM";a:1:{i:0;s:12:"ЗамбиÑ";}s:2:"ZW";a:1:{i:0;s:16:"Зимбабве";}}s:10:"Currencies";a:277:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:27:"ÐндорÑки динар";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:29:"ÐндорÑка пеÑета";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:63:"Обединени арабÑки емирÑтва-дирхам";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:49:"ÐфганиÑтанÑки афган (1927-2002)";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:37:"ÐфганиÑтанÑки афган";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:35:"ÐлбанÑки лек (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:23:"ÐлбанÑки лек";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:38:"ÐлбанÑки валутен лек";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:52:"ÐлбанÑки конвертируем долар";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:25:"ÐрменÑки драм";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:29:"ÐнтилÑки гулден";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:29:"ÐнголÑка кваÐ
½Ñ†Ð°";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:41:"ÐнголÑка кванца (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:50:"ÐнголÑка нова кванца (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:50:"ÐнголÑка нова кванца (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:29:"ÐнголÑко еÑкудо";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:43:"ÐржентинÑко пеÑо (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:31:"ÐржентинÑко пеÑо";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:33:"ÐвÑтрийÑки шилинг";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:35:"ÐвÑтралийÑки долар";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:33:"ÐвÑтралийÑка лира";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:44:"ÐрубÑки гилдер - о. Ðруба";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:39:"ÐзербайджанÑки манат";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:47:"БоÑна и Херцеговина-динар";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:56:"БоÑненÑка конвертируема марка";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:54:"БоÑна и Херцеговина-нов динар";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:33:"БарбейдоÑки долар";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:31:"Бангладешка така";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:56:"БелгийÑки франк (конвертируем)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:29:"БелгийÑки франк";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:48:"БелгийÑки франк (финанÑов)";}s:3:"BGL";a:2:{i:0;s:4:"лв";i:1;s:3:"BGL";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:56:"БългарÑки ÑоциалиÑтичеÑки лев";}s:3:"BGN";a:2:{i:0;s:5:"лв.";i:1;s:3:"BGN";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:37:"БългарÑки лев (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:50:"БългарÑки конвертируем лев";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:31:"БахрейнÑки динар";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i
:1;s:33:"БурундийÑки франк";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:29:"БермудÑки долар";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:27:"БермудÑка лира";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:29:"БрунейÑки долар";}s:3:"BOB";a:2:{i:0;s:2:"Bs";i:1;s:39:"БоливийÑко боливиано";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:51:"БоливийÑко боливиано (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:29:"БоливийÑко пеÑо";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:27:"БразилÑки реал";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:27:"БахамÑки долар";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:25:"БахамÑка лира";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:33:"БутанÑки нгултрум";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:27:"БутанÑка рупиÑ";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:29:"БирманÑка рупиÑ";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:29:"БотÑуанÑка пула";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:50:"БеларуÑка нова рубла (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:41:"БеларуÑка рубла (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:29:"БеларуÑка рубла";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:31:"БелизийÑки долар";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:50:"БританÑки хондураÑки долар";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:27:"КанадÑки долар";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:31:"КонгоанÑки франк";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:31:"ШвейцарÑки франк";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:32:"ОÑтрови Кук-долар";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:29:"ЧилийÑко еÑкудо";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:25:"ЧилийÑко пеÑо";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:40:"КитайÑки ренминби юан";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:31:"КолумбийÑко пеÑо";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:37:"КоÑтариканÑки Ð
ºÐ¾Ð»Ð¾Ð½";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:35:"ЧехоÑловашка крона";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:62:"ЧехоÑловашка конвертируема крона";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:25:"КубинÑко пеÑо";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:32:"Кабо Верде еÑкудо";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:25:"КипърÑка лира";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:21:"Чешка крона";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:29:"ГерманÑка марка";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:29:"ДжибутÑки франк";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:23:"ДатÑка крона";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:33:"ДоминиканÑко пеÑо";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:27:"ÐлжирÑки динар";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:34:"ÐлжирÑки нов франк";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:31:"ЕквадорÑко Ñукре";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:27:"ЕÑтонÑка крона";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:27:"ЕгипетÑка лира";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:31:"ЕритрейÑка накфа";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:29:"ИÑпанÑка пеÑета";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:23:"ЕтиопÑки бир";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:27:"ЕтиопÑки долар";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:8:"Евро";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:31:"ФинландÑка марка";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:43:"ФинландÑка марка (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:23:"Фиджи - долар";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:21:"Фиджи - лира";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:31:"ФолкландÑка лира";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:25:"ФренÑки франк";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:27:"Габон - CFA франк";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:27:"БританÑка лира";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:27:"ГрузинÑки
 лари";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:25:"ГанайÑки Ñеди";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:36:"ГанайÑки Ñтари Ñеди";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:25:"ГанайÑка лира";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:33:"ГибралтарÑка лира";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:33:"ГренландÑка крона";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:31:"ГамбийÑки далаÑи";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:27:"ГамбийÑка лира";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:29:"ГвинейÑки франк";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:41:"ГвинейÑки франк (1960-1972)";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:33:"ГваделупÑки франк";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:25:"Гръцка драхма";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:34:"Гръцка нова драхма";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:37:"ГватемалÑки кветзал";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:32:"ГвинеÑ-БиÑау пеÑо";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:25:"ГаÑнÑки долар";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:33:"ХонгконгÑки долар";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:35:"ХондураÑка лемпира";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:29:"ХърватÑки динар";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:27:"ХърватÑка куна";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:23:"ХаитÑки гурд";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:29:"УнгарÑки форинт";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:44:"ИндонезийÑка нова рупиÑ";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:35:"ИндонезийÑка рупиÑ";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:27:"ИрландÑка лира";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:29:"ИзраелÑки шекел";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:27:"ИзраелÑка лира";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:36:"ИзраелÑки нов шекел";}s:3:"INR";a:2:{i:0;s:3:"INR";i:1;s:27:"ИндийÑка рупиÑ";}
s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:25:"ИракÑки динар";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:23:"ИранÑки риал";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:29:"ИÑландÑка крона";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:29:"ИталианÑка лира";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:25:"ЯмайÑки долар";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:23:"ЯмайÑка лира";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:29:"ЙорданÑки динар";}s:3:"JPY";a:2:{i:0;s:2:"Â¥";i:1;s:23:"ЯпонÑка йена";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:29:"КенийÑки шилинг";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:31:"КиргиÑтанÑки Ñом";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:42:"КамбоджанÑки Ñтар риел";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:33:"КамбоджанÑки риел";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:27:"КоморÑки франк";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:37:"СевернокорейÑки вон";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:15:"КÐДР вон";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:29:"КувейтÑки динар";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:46:"Кайманови оÑтрови - долар";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:35:"КазахÑтанÑка рубла";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:35:"КазахÑтанÑко тенге";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:19:"ЛаоÑки кип";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:25:"ЛиванÑка лира";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:37:"ЛихтенщайнÑки франк";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:31:"ШриланкÑка рупиÑ";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:29:"СейлонÑка рупиÑ";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:31:"ЛиберийÑки долар";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:25:"ЛеÑотÑко лоти";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:27:"ЛитовÑки литаз";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:37:"ЛюкÑембургÑки франк";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:25:"ЛатвийÑкÐ
¸ лат";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:29:"ЛатвийÑка рубла";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:27:"ЛибийÑки динар";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:25:"ЛибийÑка лира";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:33:"МароканÑки дирхам";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:31:"МароканÑки франк";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:25:"МолдовÑко леу";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:50:"Малгашки франк - МадагаÑкар";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:44:"МаршалÑки оÑтрови-долар";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:31:"МакедонÑки денар";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:43:"МакедонÑки денар (1992-1993)";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:42:"МиÑнмарÑки (Бирма) киÑÑ‚";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:56:"МиÑнмарÑки конвертируем долар";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:31:"МонголÑки тугрик";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:25:"Макао - патака";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:31:"Мартиника - франк";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:31:"МавританÑка огиÑ";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:27:"МалтийÑка лира";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:33:"МаврицийÑка рупиÑ";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:46:"МалдивÑка Ñ€ÑƒÐ¿Ð¸Ñ - Малдиви";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:29:"МалдивÑка руфиÑ";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:31:"МалавийÑка квача";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:29:"МалавийÑка лира";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:40:"МекÑиканÑко ново пеÑо";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:60:"МекÑиканÑко Ñребърно пеÑо (1861-1992)";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:35:"МалайзийÑки рингит";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:35:"МозамбикÑко еÑкудо";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i
:1;s:37:"МозамбикÑки метикал";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:31:"ÐамибийÑки долар";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:31:"ÐигерийÑка найра";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:29:"ÐигерийÑка лира";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:41:"ÐикарагуанÑка кордоба";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:54:"ÐикарагуанÑка златна кордоба";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:31:"ХоландÑки гулден";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:27:"Ðорвежка крона";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:27:"ÐепалÑка рупиÑ";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:37:"ÐовозеландÑки долар";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:35:"ÐовозеландÑка лира";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:23:"ОманÑки риал";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:29:"ПанамÑки балбоа";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:32:"ПеруанÑки нов Ñол";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:25:"ПеруанÑки Ñол";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:46:"Папуа-новогвинейÑка кина";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:29:"ФилипинÑко пеÑо";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:33:"ПакиÑтанÑка рупиÑ";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:23:"ПолÑка злота";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:48:"ПолÑки конвентируем долар";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:35:"ПолÑка злота (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:31:"ПалеÑтинÑка лира";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:35:"ПортугалÑко еÑкудо";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:37:"ПарагвайÑко гуарани";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:25:"КатарÑки риал";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:23:"РумънÑка леÑ";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:32:"РумънÑка нова леÑ";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:21:"РуÑка рубла";
}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:33:"РуÑка рубла (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:27:"РуандÑки франк";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:41:"СаудитÑкоарабÑки риал";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:48:"Соломонови оÑтрови - долар";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:29:"СейшелÑка рупиÑ";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:27:"СуданÑки динар";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:25:"СуданÑка лира";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:25:"ШведÑка крона";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:33:"СингапурÑки долар";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:30:"Света Елена лира";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:29:"СловенÑки толар";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:27:"Словашка крона";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:35:"СиералеонÑко леоне";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:30:"Сан Марино - лира";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:33:"СомалийÑки шилинг";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:33:"СуринамÑки гилдер";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:29:"ШотландÑка лира";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:48:"Сао Томе и ПринÑипи - добра";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:50:"Сао Томе и ПринÑипи - еÑкудо";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:36:"СъветÑка нова рубла";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:27:"СъветÑка рубла";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:33:"СалвадорÑки колон";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:25:"СирийÑка лира";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:43:"СвазилендÑки лилангени";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:27:"ТайландÑки бат";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:39:"ТаджикиÑтанÑка рубла";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:41:"ТаджикиÑтанÑки Ñомони";}s:3:"TMM";a:2:
{i:0;s:3:"TMM";i:1;s:41:"ТуркмениÑтанÑки манат";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:31:"ТунизийÑки динар";}s:3:"TOP";a:2:{i:0;s:2:"T$";i:1;s:26:"Тонга - па анга";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:29:"ТиморÑко еÑкудо";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:29:"ТиморÑка патака";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:21:"ТурÑка лира";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:45:"Тринидат и Тобаго - долар";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:54:"Тринидат и Тобаго - Ñтар долар";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:29:"ТайванÑки долар";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:35:"ТанзанийÑки шилинг";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:31:"УкраинÑка хривнÑ";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:39:"УкраинÑки карбованец";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:45:"УгандийÑки шилинг (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:40:"УгандийÑки нов шилинг";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:17:"СÐЩ долар";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:41:"УругвайÑко пеÑо (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:29:"УругвайÑко пеÑо";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:33:"УзбекиÑтанÑки Ñум";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:27:"Ватикана - лира";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:37:"ВенеÑуелÑки боливар";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:29:"ВиетнамÑки донг";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:36:"ВиетнамÑки нов донг";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:50:"ВиетнамÑки национален донг";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:25:"Вануату - вату";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:21:"Самоа - лира";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:21:"Самоа - тала";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:42:"Буркина ФаÑо - CFA - франк";}s:3:"XAU";a:2:{i:0;s:3:"XAU
";i:1;s:10:"Злато";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:58:"ИзточнокарибÑки долар - Ðнтигуа";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:18:"Еку на ЕИО";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:38:"ФренÑки златен франк";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:27:"Бенин - CFA франк";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:49:"ФренÑкополинезийÑки франк";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:27:"ЙеменÑки динар";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:25:"ЙеменÑки риал";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:31:"ЮгоÑлавÑки динар";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:56:"ЮгоÑлавÑки конвертируем динар";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:56:"ЮжноафриканÑки ранд (финанÑов)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:37:"ЮжноафриканÑка лира";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:37:"ЮжноафриканÑки ранд";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:29:"ЗамбийÑка квача";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:27:"ЗамбийÑка лира";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:34:"ЗаирÑко ново зайре";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:25:"ЗаирÑко зайре";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:35:"ЗимбабвийÑки долар";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:16:"Календар";}s:9:"collation";a:1:{i:0;s:18:"Сортиране";}s:8:"currency";a:1:{i:0;s:12:"Валути";}}s:9:"Languages";a:178:{s:2:"ab";a:1:{i:0;s:18:"ÐбкхазÑки";}s:2:"af";a:1:{i:0;s:16:"ÐфриканÑ";}s:3:"afa";a:1:{i:0;s:38:"Ðфро-азиатÑки (други)";}s:3:"afh";a:1:{i:0;s:16:"Ðфрихили";}s:3:"ale";a:1:{i:0;s:16:"ÐлеутÑки";}s:2:"am";a:1:{i:0;s:16:"ÐмхарÑки";}s:3:"ang";a:1:{i:0;s:42:"СтароанглийÑки (ca.450-1100)";}s:3:"apa";a:1:{i:0;s:30:"Езици на апахите";}s:2:"ar";a:1:{i:0;s:14:"ÐрабÑки";}s:3:"art";a:1:{i:0;s:31:"ИзкуÑтвен (други)";}s:
3:"aus";a:1:{i:0;s:35:"ÐвÑтралийÑки езици";}s:2:"av";a:1:{i:0;s:14:"ÐварÑки";}s:2:"ay";a:1:{i:0;s:12:"Ðймара";}s:2:"az";a:1:{i:0;s:28:"ÐзербайджанÑки";}s:2:"ba";a:1:{i:0;s:18:"БашкирÑки";}s:3:"bat";a:1:{i:0;s:37:"ПрибалтийÑки (други)";}s:2:"be";a:1:{i:0;s:18:"БеларуÑки";}s:3:"ber";a:1:{i:0;s:18:"берберÑки";}s:2:"bg";a:1:{i:0;s:18:"БългарÑки";}s:2:"bn";a:1:{i:0;s:18:"БенгалÑки";}s:3:"bnt";a:1:{i:0;s:10:"Банту";}s:2:"bo";a:1:{i:0;s:16:"ТибетÑки";}s:2:"br";a:1:{i:0;s:18:"БретонÑки";}s:2:"bs";a:1:{i:0;s:18:"БоÑненÑки";}s:2:"ca";a:1:{i:0;s:20:"КаталонÑки";}s:3:"cai";a:1:{i:0;s:72:"ЦентралноамериканÑки индианÑки (други)";}s:3:"car";a:1:{i:0;s:16:"КарибÑки";}s:3:"cau";a:1:{i:0;s:31:"КавказÑки (други)";}s:2:"ce";a:1:{i:0;s:16:"ЧеченÑки";}s:3:"cel";a:1:{i:0;s:27:"КелтÑки (други)";}s:3:"chr";a:1:{i:0;s:12:"чероки";}s:3:"chy";a:1:{i:0;s:16:"чейенÑки";}s:2:"co";a:1:{i:0;s:22:"КорÑиканÑки";}s:3:"cpe";a:1:{i:0;s:54:"КреолÑки, от английÑки (други)";}s:3:"cpf";a:1:{i:0;s:50:"КреолÑки, от френÑки (други)";}s:3:"cpp";a:1:{i:0;s:58:"КреолÑки, от португалÑки (други)";}s:3:"crp";a:1:{i:0;s:29:"КреолÑки (други)";}s:2:"cs";a:1:{i:0;s:10:"Чешки";}s:2:"cu";a:1:{i:0;s:35:"Църковно ÑлавÑнÑки";}s:2:"cy";a:1:{i:0;s:12:"УелÑки";}s:2:"da";a:1:{i:0;s:12:"ДатÑки";}s:2:"de";a:1:{i:0;s:12:"ÐемÑки";}s:3:"den";a:1:{i:0;s:18:"СлавÑнÑки";}s:3:"dum";a:1:{i:0;s:58:"ХоландÑки, Ñредновековен (1050-1350)";}s:2:"dv";a:1:{i:0;s:12:"Дивехи";}s:3:"egy";a:1:{i:0;s:33:"ЕгипетÑки (древен)";}s:2:"el";a:1:{i:0;s:12:"Гръцки";}s:2:"en";a:1:{i:0;s:18:"ÐнглийÑки";}s:3:"enm";a:1:{i:0;s:30:"ÐнглийÑки (1100-1500)";}s:2:"eo";a:1:{i:
0;s:18:"ЕÑперанто";}s:2:"es";a:1:{i:0;s:16:"ИÑпанÑки";}s:2:"et";a:1:{i:0;s:16:"ЕÑтонÑки";}s:2:"eu";a:1:{i:0;s:10:"БаÑки";}s:2:"fa";a:1:{i:0;s:18:"ПерÑийÑки";}s:2:"fi";a:1:{i:0;s:12:"ФинÑки";}s:3:"fiu";a:1:{i:0;s:34:"УгрофинÑка  (други)";}s:2:"fr";a:1:{i:0;s:14:"ФренÑки";}s:3:"frm";a:1:{i:0;s:26:"ФренÑки (1400-1600)";}s:3:"fro";a:1:{i:0;s:25:"ФренÑки (842-1400)";}s:2:"ga";a:1:{i:0;s:18:"ИрландÑки";}s:2:"gd";a:1:{i:0;s:33:"ШотландÑки галÑки";}s:3:"gem";a:1:{i:0;s:31:"ГерманÑки (други)";}s:3:"gmh";a:1:{i:0;s:24:"ÐемÑки (1050-1500)";}s:3:"goh";a:1:{i:0;s:23:"ÐемÑки (750-1050)";}s:3:"got";a:1:{i:0;s:18:"ГотичеÑки";}s:3:"grc";a:1:{i:0;s:36:"Древногръцки (до 1453)";}s:2:"gu";a:1:{i:0;s:18:"Гуджарати";}s:3:"haw";a:1:{i:0;s:16:"ХавайÑки";}s:2:"he";a:1:{i:0;s:10:"Иврит";}s:2:"hi";a:1:{i:0;s:10:"Хинди";}s:3:"hit";a:1:{i:0;s:12:"ХитÑки";}s:2:"hr";a:1:{i:0;s:18:"ХърватÑки";}s:2:"ht";a:1:{i:0;s:18:"ХаитÑнÑки";}s:2:"hu";a:1:{i:0;s:16:"УнгарÑки";}s:2:"hy";a:1:{i:0;s:16:"ÐрменÑки";}s:2:"id";a:1:{i:0;s:24:"ИндонезийÑки";}s:3:"inc";a:1:{i:0;s:29:"ИндийÑки (други)";}s:3:"ine";a:1:{i:0;s:42:"Индо-европейÑки (други)";}s:2:"io";a:1:{i:0;s:6:"Идо";}s:3:"ira";a:1:{i:0;s:14:"ИранÑки";}s:2:"is";a:1:{i:0;s:18:"ИÑландÑки";}s:2:"it";a:1:{i:0;s:20:"ИталианÑки";}s:2:"ja";a:1:{i:0;s:14:"ЯпонÑки";}s:3:"jpr";a:1:{i:0;s:35:"еврейÑко-перÑийÑки";}s:3:"jrb";a:1:{i:0;s:31:"еврейÑко-арабÑки";}s:2:"jv";a:1:{i:0;s:14:"ЯванÑки";}s:2:"ka";a:1:{i:0;s:18:"ГрузинÑки";}s:2:"kg";a:1:{i:0;s:20:"КонгоанÑки";}s:2:"ki";a:1:{i:0;s:12:"кикуйу";}s:2:"kk";a:1:{i:0;s:16:"КазахÑки";}s:2:"km";a:1:{i:0;s:16:"КхмерÑки";}s:2:"ko";a:1:{i:0;s:16:"КорейÑки";}s:2:"ks";a:1:{i:0;s:18:"КашмирÑ
ки";}s:2:"ku";a:1:{i:0;s:14:"КюрдÑки";}s:2:"ky";a:1:{i:0;s:18:"КиргизÑки";}s:2:"la";a:1:{i:0;s:16:"ЛатинÑки";}s:2:"lb";a:1:{i:0;s:26:"ЛюкÑембургÑки";}s:2:"lo";a:1:{i:0;s:12:"ЛаоÑки";}s:2:"lt";a:1:{i:0;s:16:"ЛитовÑки";}s:2:"lv";a:1:{i:0;s:18:"ЛатвийÑки";}s:3:"mas";a:1:{i:0;s:16:"маÑайÑки";}s:2:"mg";a:1:{i:0;s:16:"Малгашки";}s:3:"mga";a:1:{i:0;s:29:"ИрландÑки (900-1200)";}s:2:"mi";a:1:{i:0;s:14:"МаорÑки";}s:3:"mis";a:1:{i:0;s:21:"Други езици";}s:2:"mk";a:1:{i:0;s:20:"МакедонÑки";}s:2:"ml";a:1:{i:0;s:16:"МалайÑки";}s:2:"mn";a:1:{i:0;s:18:"МонголÑки";}s:2:"mo";a:1:{i:0;s:18:"МолдовÑки";}s:2:"ms";a:1:{i:0;s:16:"МалайÑки";}s:2:"mt";a:1:{i:0;s:18:"МалтийÑки";}s:2:"my";a:1:{i:0;s:18:"БирманÑки";}s:3:"nai";a:1:{i:0;s:68:"СеверноамериканÑки индианÑки (други)";}s:3:"nap";a:1:{i:0;s:26:"ÐеаполитанÑки";}s:2:"ne";a:1:{i:0;s:16:"ÐепалÑки";}s:2:"nl";a:1:{i:0;s:18:"ХоландÑки";}s:2:"no";a:1:{i:0;s:16:"Ðорвежки";}s:3:"nub";a:1:{i:0;s:27:"ÐубийÑки езици";}s:2:"ny";a:1:{i:0;s:16:"ЧинÑнджа";}s:2:"os";a:1:{i:0;s:14:"ОÑетÑки";}s:3:"ota";a:1:{i:0;s:44:"ТурÑки, отоманÑки (1500-1928)";}s:3:"oto";a:1:{i:0;s:33:"СтаротурÑки езици";}s:2:"pa";a:1:{i:0;s:20:"ПенджабÑки";}s:3:"paa";a:1:{i:0;s:29:"ПапуаÑки (други)";}s:3:"peo";a:1:{i:0;s:50:"СтароперÑийÑки (600-400 пр.н.е.)";}s:3:"phi";a:1:{i:0;s:33:"ФилипинÑки (други)";}s:3:"phn";a:1:{i:0;s:20:"ФиникийÑки";}s:2:"pl";a:1:{i:0;s:12:"ПолÑки";}s:3:"pro";a:1:{i:0;s:34:"ПрованÑалÑки (to 1500)";}s:2:"ps";a:1:{i:0;s:8:"Пущу";}s:2:"pt";a:1:{i:0;s:22:"ПортугалÑки";}s:2:"qu";a:1:{i:0;s:10:"Кечуа";}s:3:"raj";a:1:{i:0;s:24:"РаджаÑтанÑки";}s:2:"rm";a:1:{i:0;s:24:"РетороманÑки";}s:2:"rn";a:1:{i:0
;s:10:"Рунди";}s:2:"ro";a:1:{i:0;s:16:"РумънÑки";}s:3:"roa";a:1:{i:0;s:29:"РоманÑки (други)";}s:2:"ru";a:1:{i:0;s:10:"РуÑки";}s:2:"rw";a:1:{i:0;s:20:"КинÑруанда";}s:2:"sa";a:1:{i:0;s:24:"СанкÑкритÑки";}s:3:"sah";a:1:{i:0;s:14:"ЯкутÑки";}s:3:"sai";a:1:{i:0;s:62:"ЮжноамериканÑки индианÑки (други)";}s:2:"sc";a:1:{i:0;s:18:"СардинÑки";}s:3:"sem";a:1:{i:0;s:29:"СемитÑки (други)";}s:2:"sg";a:1:{i:0;s:10:"Санго";}s:3:"sga";a:1:{i:0;s:39:"СтароирландÑки (до 900)";}s:2:"sh";a:1:{i:0;s:28:"СърбохърватÑки";}s:2:"si";a:1:{i:0;s:18:"СинхалÑки";}s:2:"sk";a:1:{i:0;s:16:"Словашки";}s:2:"sl";a:1:{i:0;s:18:"СловенÑки";}s:3:"sla";a:1:{i:0;s:31:"СлавÑнÑки (други)";}s:2:"sm";a:1:{i:0;s:18:"СамоанÑки";}s:2:"so";a:1:{i:0;s:20:"СомалийÑки";}s:2:"sq";a:1:{i:0;s:16:"ÐлбанÑки";}s:2:"sr";a:1:{i:0;s:14:"СръбÑки";}s:2:"ss";a:1:{i:0;s:10:"Суази";}s:2:"st";a:1:{i:0;s:12:"СеÑуто";}s:3:"sux";a:1:{i:0;s:16:"ШумерÑки";}s:2:"sv";a:1:{i:0;s:14:"ШведÑки";}s:2:"sw";a:1:{i:0;s:14:"Суахили";}s:3:"syr";a:1:{i:0;s:16:"СирийÑки";}s:2:"ta";a:1:{i:0;s:16:"ТамилÑки";}s:3:"tai";a:1:{i:0;s:33:"ТайландÑки (други)";}s:2:"te";a:1:{i:0;s:12:"Телугу";}s:2:"tg";a:1:{i:0;s:18:"ТаджикÑки";}s:2:"th";a:1:{i:0;s:6:"Таи";}s:2:"tk";a:1:{i:0;s:20:"ТуркменÑки";}s:2:"tr";a:1:{i:0;s:12:"ТурÑки";}s:2:"tt";a:1:{i:0;s:16:"ТатарÑки";}s:3:"tut";a:1:{i:0;s:29:"ÐлтайÑки (други)";}s:2:"ty";a:1:{i:0;s:18:"ТаитÑнÑки";}s:2:"uk";a:1:{i:0;s:18:"УкраинÑки";}s:3:"und";a:1:{i:0;s:22:"Ðеопределен";}s:2:"ur";a:1:{i:0;s:8:"Урду";}s:2:"uz";a:1:{i:0;s:16:"УзбекÑки";}s:2:"vi";a:1:{i:0;s:20:"ВиетнамÑки";}s:2:"zh";a:1:{i:0;s:16:"КитайÑки";}s:2:"zu";a:1:{i:0;s:14:"ЗулуÑки";}}s:12:"LocaleScript";a:1:{i:0;s:
4:"Cyrl";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Scripts";a:31:{s:4:"Arab";a:1:{i:0;s:14:"ÐрабÑка";}s:4:"Armn";a:1:{i:0;s:16:"ÐрменÑка";}s:4:"Beng";a:1:{i:0;s:18:"БенгалÑка";}s:4:"Brai";a:1:{i:0;s:16:"Брайлова";}s:4:"Cher";a:1:{i:0;s:12:"Чероки";}s:4:"Copt";a:1:{i:0;s:14:"КоптÑка";}s:4:"Cyrl";a:1:{i:0;s:16:"Кирилица";}s:4:"Deva";a:1:{i:0;s:20:"Деванагари";}s:4:"Ethi";a:1:{i:0;s:16:"ЕтиопÑка";}s:4:"Geor";a:1:{i:0;s:18:"ГрузинÑка";}s:4:"Goth";a:1:{i:0;s:18:"ГотичеÑка";}s:4:"Grek";a:1:{i:0;s:12:"Гръцка";}s:4:"Gujr";a:1:{i:0;s:18:"Гуджарати";}s:4:"Hang";a:1:{i:0;s:16:"КорейÑка";}s:4:"Hani";a:1:{i:0;s:16:"КитайÑка";}s:4:"Hans";a:1:{i:0;s:33:"ОпроÑтен китайÑки";}s:4:"Hant";a:1:{i:0;s:39:"Традиционен китайÑки";}s:4:"Hebr";a:1:{i:0;s:10:"Иврит";}s:4:"Hira";a:1:{i:0;s:31:"ЯпонÑки хирагана";}s:4:"Kana";a:1:{i:0;s:31:"ЯпонÑки катакана";}s:4:"Khmr";a:1:{i:0;s:16:"КхмерÑка";}s:4:"Laoo";a:1:{i:0;s:12:"ЛаоÑка";}s:4:"Latn";a:1:{i:0;s:16:"ЛатинÑка";}s:4:"Mong";a:1:{i:0;s:18:"МонголÑка";}s:4:"Mymr";a:1:{i:0;s:18:"БирманÑка";}s:4:"Runr";a:1:{i:0;s:18:"РуничеÑка";}s:4:"Taml";a:1:{i:0;s:16:"ТамилÑка";}s:4:"Telu";a:1:{i:0;s:12:"Телугу";}s:4:"Thai";a:1:{i:0;s:6:"Таи";}s:4:"Tibt";a:1:{i:0;s:16:"ТибетÑка";}s:4:"Zyyy";a:1:{i:0;s:8:"Обща";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:33:"БудиÑтки календар";}s:7:"chinese";a:1:{i:0;s:33:"КитайÑки календар";}s:9:"gregorian";a:1:{i:0;s:41:"ГригорианÑки календар";}s:6:"hebrew";a:1:{i:0;s:33:"ЕврейÑки календар";}s:7:"islamic";a:1:{i:0;s:33:"ИÑлÑмÑки календар";}s:13:"islamic-civil";a:1:{
i:0;s:48:"ИÑлÑмÑки цивилен календар";}s:8:"japanese";a:1:{i:0;s:31:"ЯпонÑки календар";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:16:"Директно";}s:9:"phonebook";a:1:{i:0;s:21:"Ðзбучен ред";}s:6:"pinyin";a:1:{i:0;s:25:"Сортиране Pinyin";}s:6:"stroke";a:1:{i:0;s:32:"Сортиране по щрих";}s:11:"traditional";a:1:{i:0;s:22:"Традиционно";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:8:"HH:mm:ss";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:18:"dd MMMM yyyy, EEEE";i:5;s:12:"dd MMMM yyyy";i:6;s:10:"dd.MM.yyyy";i:7;s:8:"dd.MM.yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:7:"нед.";i:1;s:7:"пон.";i:2;s:5:"вт.";i:3;s:5:"ÑÑ€.";i:4;s:9:"четв.";i:5;s:7:"пет.";i:6;s:7:"Ñъб.";}s:6:"narrow";a:7:{i:0;s:2:"н";i:1;s:2:"п";i:2;s:2:"в";i:3;s:2:"Ñ";i:4;s:2:"ч";i:5;s:2:"п";i:6;s:2:"Ñ";}s:4:"wide";a:7:{i:0;s:12:"неделÑ";i:1;s:20:"понеделник";i:2;s:14:"вторник";i:3;s:10:"ÑÑ€Ñда";i:4;s:18:"четвъртък";i:5;s:10:"петък";i:6;s:12:"Ñъбота";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:11:"пр.н.е.";i:1;s:6:"н.е.";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:5:"Ñн.";i:1;s:7:"фев.";i:2;s:8:"март";i:3;s:7:"апр.";i:4;s:6:"май";i:5;s:6:"юни";i:6;s:6:"юли";i:7;s:7:"авг.";i:8;s:7:"Ñеп.";i:9;s:7:"окт.";i:10;s:9:"ноем.";i:11;s:7:"дек.";}s:6:"narrow";a:12:{i:0;s:2:"Ñ";i:1;s:2:"Ñ„";i:2;s:2:"м";i:3;s:2:"а";i:4;s:2:"м";i:5;s:2:"ÑŽ";i:6;s:2:"ÑŽ";i:7;s:2:"а";i:8;s:2:"Ñ";i:9;s:2:"о";i:10;s:2:"н";i:11;s:2:"д";}s:4:"wide";a:12:{i:0;s:12:"Ñнуари";i:1;s:16:"февруари";i:2;s:8:"март";i:3;s:10:"април";i:4;s:6:"май";i:5;s:6:"юни";i:6;s:6:"юли";i:7;s:12:"авгуÑÑ‚";i:8;s:18:"Ñептември";i:9;s:16:"окÑ
‚омври";i:10;s:14:"ноември";i:11;s:16:"декември";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}s:11:"zoneStrings";a:17:{i:0;a:6:{i:0;s:19:"America/Los_Angeles";i:1;s:46:"ТихоокеанÑка чаÑова зона";i:2;s:3:"PST";i:3;s:57:"ТихоокеанÑка лÑтна чаÑова зона";i:4;s:3:"PDT";i:5;s:21:"Ð›Ð¾Ñ ÐнжелиÑ";}i:1;a:6:{i:0;s:14:"America/Denver";i:1;s:63:"ÐмериканÑка планинÑка чаÑова зона";i:2;s:3:"MST";i:3;s:74:"ÐмериканÑка планинÑка лÑтна чаÑова зона";i:4;s:3:"MDT";i:5;s:12:"Денвър";}i:2;a:6:{i:0;s:15:"America/Phoenix";i:1;s:63:"ÐмериканÑка планинÑка чаÑова зона";i:2;s:3:"MST";i:3;s:63:"ÐмериканÑка планинÑка чаÑова зона";i:4;s:3:"MST";i:5;s:12:"ФиникÑ";}i:3;a:6:{i:0;s:15:"America/Chicago";i:1;s:63:"ÐмериканÑка централна чаÑова зона";i:2;s:3:"CST";i:3;s:74:"ÐмериканÑка централна лÑтна чаÑова зона";i:4;s:3:"CDT";i:5;s:12:"Чикаго";}i:4;a:6:{i:0;s:16:"America/New_York";i:1;s:59:"ÐмериканÑка източна чаÑова зона";i:2;s:3:"EST";i:3;s:70:"ÐмериканÑка източна лÑтна чаÑова зона";i:4;s:3:"EDT";i:5;s:13:"ÐÑŽ Йорк";}i:5;a:6:{i:0;s:20:"America/Indianapolis";i:1;s:59:"ÐмериканÑка източна чаÑова зона";i:2;s:3:"EST";i:3;s:59:"ÐмериканÑка източна чаÑова зона";i:4;s:3:"EST";i:5;s:24:"ИндианополиÑ";}i:6;a:6:{i:0;s:16:"Pacific/Honolulu";i:1;s:32:"ЧаÑова зона Хавай";i:2;s:3:"HST";i:3;s:43:"ЛÑтна чаÑова зона Хавай";i:4;s:3:"HST";i:5;s:16:"Хонолулу";}i:7;a:6:{i:0;s:17:"America/Anchorage";i:1;s:34:"ЧаÑова зона ÐлÑÑка";i:2;s:3:"AST";i:3;s:45:"ЛÑтна чаÑова зона ÐлÑÑка";i:4;s:3:"ADT";i:5;s:9:"Anchorage";}i:8;a:6:{i:0;s:15:"America/Halifax";i:1;
s:46:"ÐтлантичеÑка чаÑова зона";i:2;s:3:"AST";i:3;s:57:"ÐтлантичеÑка лÑтна чаÑова зона";i:4;s:3:"ADT";i:5;s:16:"ХалифакÑ";}i:9;a:6:{i:0;s:16:"America/St_Johns";i:1;s:44:"ЧаÑова зона Ðюфаундленд";i:2;s:3:"CNT";i:3;s:55:"ЛÑтна чаÑова зона Ðюфаундленд";i:4;s:3:"CDT";i:5;s:23:"Сейнт ДжоунÑ";}i:10;a:6:{i:0;s:12:"Europe/Paris";i:1;s:60:"ЦентралноевропейÑка чаÑова зона";i:2;s:3:"CET";i:3;s:69:"ЦентралноевропеÑка лÑтна чаÑова зона";i:4;s:4:"CEST";i:5;s:10:"Париж";}i:11;a:6:{i:0;s:7:"Etc/GMT";i:1;s:36:"ЧаÑова зона Гринуич";i:2;s:3:"GMT";i:3;s:36:"ЧаÑова зона Гринуич";i:4;s:3:"GMT";i:5;s:12:"Лондон";}i:12;a:6:{i:0;s:17:"Africa/Casablanca";i:1;s:36:"ЧаÑова зона Гринуич";i:2;s:3:"GMT";i:3;s:36:"ЧаÑова зона Гринуич";i:4;s:3:"GMT";i:5;s:20:"Казабланка";}i:13;a:6:{i:0;s:14:"Asia/Jerusalem";i:1;s:34:"ЧаÑова зона Израел";i:2;s:3:"IST";i:3;s:45:"ЛÑтна чаÑова зона Израел";i:4;s:3:"IDT";i:5;s:18:"ЙеруÑалим";}i:14;a:6:{i:0;s:10:"Asia/Tokyo";i:1;s:36:"ЯпонÑка чаÑова зона";i:2;s:3:"JST";i:3;s:36:"ЯпонÑка чаÑова зона";i:4;s:3:"JST";i:5;s:10:"Токио";}i:15;a:6:{i:0;s:16:"Europe/Bucharest";i:1;s:56:"ИзточноевропейÑка чаÑова зона";i:2;s:3:"EET";i:3;s:67:"ИзточноевропейÑка лÑтна чаÑова зона";i:4;s:4:"EEST";i:5;s:14:"Букурещ";}i:16;a:6:{i:0;s:13:"Asia/Shanghai";i:1;s:38:"КитайÑка чаÑова зона";i:2;s:3:"CTT";i:3;s:38:"КитайÑка чаÑова зона";i:4;s:3:"CDT";i:5;s:12:"Шанхай";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bg_BG.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bg_BG.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bg_BG.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bn.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bn.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bn.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:6:{s:9:"Countries";a:107:{s:2:"AF";a:1:{i:0;s:33:"আফগানিসà§à¦¤à¦¾à¦¨";}s:2:"AL";a:1:{i:0;s:30:"আলবà§à¦¯à¦¾à¦¨à¦¿à§Ÿà¦¾";}s:2:"AM";a:1:{i:0;s:27:"আরà§à¦®à§‡à¦¨à¦¿à§Ÿà¦¾";}s:2:"AR";a:1:{i:0;s:36:"আরà§à¦œà§‡à¦£à§à¦Ÿà¦¾à¦‡à¦¨à¦¾";}s:2:"AT";a:1:{i:0;s:27:"অসà§à¦Ÿà§à¦°à¦¿à§Ÿà¦¾";}s:2:"AU";a:1:{i:0;s:33:"অসà§à¦Ÿà§à¦°à§‡à¦²à¦¿à§Ÿà¦¾";}s:2:"AZ";a:1:{i:0;s:30:"আজারবাইজান";}s:2:"BD";a:1:{i:0;s:24:"বাংলাদেশ";}s:2:"BE";a:1:{i:0;s:24:"বেলà§à¦œà¦¿à§Ÿà¦®";}s:2:"BG";a:1:{i:0;s:27:"বà§à¦²à¦—েরিয়া";}s:2:"BO";a:1:{i:0;s:24:"বোলিভিয়া";}s:2:"BR";a:1:{i:0;s:21:"বà§à¦°à¦¾à¦œà¦¿à¦²";}s:2:"BT";a:1:{i:0;s:15:"ভà§à¦Ÿà¦¾à¦¨";}s:2:"BY";a:1:{i:0;s:30:"বেলোরà§à¦¶à¦¿à§Ÿà¦¾";}s:2:"CG";a:1:{i:0;s:15:"কঙà§à¦—ো";}s:2:"CH";a:1:{i:0;s:30:"সà§à¦‡à¦œà¦°à§à¦²à¦£à§à¦¡";}s:2:"CL";a:1:{i:0;s:12:"চিলি";}s:2:"CN";a:1:{i:0;s:9:"চীন";}s:2:"CO";a:1:{i:0;s:30:"কোলোমà§à¦¬à¦¿à§Ÿà¦¾";}s:2:"CR";a:1:{i:0;s:30:"কোসà§à¦Ÿà¦¾à¦°à¦¿à¦•à¦¾";}s:2:"CU";a:1:{i:0;s:15:"কিউবা";}s:2:"CZ";a:1:{i:0;s:18:"চেকিয়া";}s:2:"DE";a:1:{i:0;s:24:"জারà§à¦®à¦¾à¦¨à¦¿";}s:2:"DK";a:1:{i:0;s:27:"ডেনà§à¦®à¦¾à¦°à§à¦•";}s:2:"DZ";a:1:{i:0;s:24:"à¦à¦²à¦œà¦¿à¦°à¦¿à§Ÿà¦¾";}s:2:"EC";a:1:{i:0;s:21:"ইকোয়াডর";}s:2:"EE";a:1:{i:0;s:27:"à¦à¦¸à§à¦¤à§‹à¦¨à¦¿à§Ÿà¦¾";}s:2:"EG";a:1:{i:0;s:12:"মিশর";}s:2:"EH";a:1:{i:0;s:40:"পশà§à¦šà¦¿à¦®à§€ সাহারা";}s:2:"ES";a:1:{i:0;s:15:"সà§à¦ªà§‡à¦¨";}s:2:"ET";a:1:{i:0;s:24:"ইফিওপিয়া";}s:2:"FI";a:1:{i:0;s:33:"ফিনà§à¦²à§à¦¯à¦¾à¦£à§à¦¡";}s:2:"FR";a:1:{i:0;s:21:"ফà§à¦°à¦¾à¦¨à§à¦¸";}s:2:"GB";a:1:{i:0;s:30:"গà§à¦°à§‡à¦Ÿà¦¬à§ƒà¦Ÿà§‡à¦¨";}s:2:"GE";a:1:{i:0;s:21:"জরà§à¦œà¦¿à§Ÿà¦¾";}s:2:"GH";a:1:{i:0;s:12:"গানা";}s:2:"GR";a:1:{i:0;s:18:"গà§à¦°à§€à¦¸à§";}s:2:"GT";a:1:{i:0;s:30:"গোয়াটিমালা";}s:2:"GY";a:1:{i:0;s:18:"গিয়ানা";}s:2:"HN";a:1:{i:0;s:24:"হণ
à§à¦¡à§à¦°à¦¾à¦¸";}s:2:"HU";a:1:{i:0;s:24:"হাঙà§à¦—েরি";}s:2:"ID";a:1:{i:0;s:33:"ইনà§à¦¦à§‹à¦¨à§‡à¦¶à¦¿à§Ÿà¦¾";}s:2:"IE";a:1:{i:0;s:27:"আয়ারà§à¦²à¦£à§à¦¡";}s:2:"IL";a:1:{i:0;s:24:"ইসà§à¦°à¦¾à§Ÿà§‡à¦²";}s:2:"IN";a:1:{i:0;s:12:"ভারত";}s:2:"IQ";a:1:{i:0;s:12:"ইরাক";}s:2:"IR";a:1:{i:0;s:12:"ইরান";}s:2:"IS";a:1:{i:0;s:21:"আইসলণà§à¦¡";}s:2:"IT";a:1:{i:0;s:15:"ইতালী";}s:2:"JM";a:1:{i:0;s:24:"জà§à¦¯à¦¾à¦®à§‡à¦•à¦¾";}s:2:"JO";a:1:{i:0;s:15:"জরà§à¦¡à¦¨";}s:2:"JP";a:1:{i:0;s:15:"জাপান";}s:2:"KE";a:1:{i:0;s:18:"কেনিয়া";}s:2:"KG";a:1:{i:0;s:30:"কিরà§à¦—িজিয়া";}s:2:"KH";a:1:{i:0;s:21:"কামà§à¦¬à§‹à¦œ";}s:2:"KR";a:1:{i:0;s:37:"দকà§à¦·à¦¿à¦£ কোরিয়া";}s:2:"KZ";a:1:{i:0;s:30:"কাজাকসà§à¦¥à¦¾à¦¨";}s:2:"LA";a:1:{i:0;s:12:"লাওস";}s:2:"LB";a:1:{i:0;s:18:"লেবানন";}s:2:"LK";a:1:{i:0;s:27:"শà§à¦°à§€à¦²à¦™à§à¦•à¦¾";}s:2:"LR";a:1:{i:0;s:27:"লাইবিরিয়া";}s:2:"LT";a:1:{i:0;s:18:"লিতà§à¦­à¦¾";}s:2:"LU";a:1:{i:0;s:36:"লাকà§à¦¸à§‡à¦®à¦¬à¦¾à¦°à§à¦—";}s:2:"LV";a:1:{i:0;s:24:"লাতà§à¦­à¦¿à§Ÿà¦¾";}s:2:"LY";a:1:{i:0;s:18:"লিবিয়া";}s:2:"MA";a:1:{i:0;s:21:"মোরকà§à¦•à§‹";}s:2:"MD";a:1:{i:0;s:30:"মোলà§à¦¦à¦¾à¦­à¦¿à§Ÿà¦¾";}s:2:"MG";a:1:{i:0;s:33:"মাদাগাসà§à¦•à¦¾à¦°";}s:2:"MN";a:1:{i:0;s:27:"মঙà§à¦—োলিয়া";}s:2:"MX";a:1:{i:0;s:21:"মকà§à¦¸à¦¿à¦•à§‹";}s:2:"MY";a:1:{i:0;s:30:"মালà§à¦¯à¦¾à¦¶à¦¿à§Ÿà¦¾";}s:2:"NI";a:1:{i:0;s:30:"নিকারাগোয়া";}s:2:"NL";a:1:{i:0;s:15:"হলণà§à¦¡";}s:2:"NO";a:1:{i:0;s:15:"নরওয়ে";}s:2:"NP";a:1:{i:0;s:15:"নেপাল";}s:2:"NZ";a:1:{i:0;s:28:"নিউ জিলণà§à¦¡";}s:2:"PA";a:1:{i:0;s:18:"পানামা";}s:2:"PE";a:1:{i:0;s:12:"পিরà§";}s:2:"PH";a:1:{i:0;s:24:"ফিলিপাইন";}s:2:"PK";a:1:{i:0;s:27:"পাকিসà§à¦¤à¦¾à¦¨";}s:2:"PL";a:1:{i:0;s:27:"পোলà§à¦¯à¦¾à¦£à§à¦¡
";}s:2:"PT";a:1:{i:0;s:24:"পরà§à¦¤à§à¦—াল";}s:2:"PY";a:1:{i:0;s:30:"পà§à¦¯à¦¾à¦°à¦¾à¦—োয়ে";}s:2:"RO";a:1:{i:0;s:24:"রà§à¦®à¦¾à¦¨à¦¿à§Ÿà¦¾";}s:2:"RU";a:1:{i:0;s:18:"রাশিয়া";}s:2:"SA";a:1:{i:0;s:25:"সাউদি আরব";}s:2:"SD";a:1:{i:0;s:15:"সà§à¦¦à¦¾à¦¨";}s:2:"SE";a:1:{i:0;s:18:"সà§à¦‡à¦¡à§‡à¦¨";}s:2:"SG";a:1:{i:0;s:27:"সিঙà§à¦—াপà§à¦°";}s:2:"SK";a:1:{i:0;s:30:"শà§à¦²à§‹à¦­à¦¾à¦•à¦¿à§Ÿà¦¾";}s:2:"SO";a:1:{i:0;s:18:"সোমালি";}s:2:"SV";a:1:{i:0;s:21:"সালভেডর";}s:2:"SY";a:1:{i:0;s:18:"সিরিয়া";}s:2:"TH";a:1:{i:0;s:9:"থাই";}s:2:"TJ";a:1:{i:0;s:30:"তাজিকসà§à¦¥à¦¾à¦¨";}s:2:"TM";a:1:{i:0;s:33:"তà§à¦°à§à¦•à¦®à§‡à¦¨à¦¿à§Ÿà¦¾";}s:2:"TN";a:1:{i:0;s:21:"টিউনিসà§";}s:2:"TR";a:1:{i:0;s:18:"তà§à¦°à¦¸à§à¦•";}s:2:"TW";a:1:{i:0;s:21:"তাইওয়ান";}s:2:"UA";a:1:{i:0;s:24:"ইউকà§à¦°à§‡à¦‡à¦¨";}s:2:"US";a:1:{i:0;s:58:"মারà§à¦•à¦¿à¦¨ যà§à¦•à§à¦¤à¦°à¦¾à¦·à§à¦Ÿà§à¦°";}s:2:"UY";a:1:{i:0;s:21:"উরà§à¦—োয়ে";}s:2:"UZ";a:1:{i:0;s:36:"উজà§à¦¬à§‡à¦•à¦¿à¦¸à§à¦¥à¦¾à¦¨";}s:2:"VE";a:1:{i:0;s:30:"ভেনেজà§à§Ÿà§‡à¦²à¦¾";}s:2:"VN";a:1:{i:0;s:24:"ভিয়েতনাম";}s:2:"YE";a:1:{i:0;s:12:"ইমেন";}s:2:"ZA";a:1:{i:0;s:40:"দকà§à¦·à¦¿à¦£ আফà§à¦°à¦¿à¦•à¦¾";}}s:10:"Currencies";a:2:{s:3:"BDT";a:2:{i:0;s:3:"৳";i:1;s:3:"BDT";}s:3:"INR";a:2:{i:0;s:12:"টাকা";i:1;s:3:"INR";}}s:9:"Languages";a:1:{s:2:"bn";a:1:{i:0;s:15:"বাংলা";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Beng";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:11:"AmPmMarkers";a:2:{i:0;s:27:"পূরà§à¦¬à¦¾à¦¹à§à¦£";i:1;s:21:"অপরাহà§à¦£";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:9:"রবি";i:1;s:9:"সোম";i:2;s:15:"মঙà§à¦—ল";i:3;s:9:"বà§à¦§";i:4;s:24:"বৃহসà§à¦ªà¦¤à¦¿";i:5;s:15:"শà§à¦•à§à¦°";i:6;s:9:"শনি";}s:4:"wide";a:7:{i:0;s:18:"রবিবার";i:1;s:18:"সোমà
¦¬à¦¾à¦°";i:2;s:24:"মঙà§à¦—লবার";i:3;s:18:"বà§à¦§à¦¬à¦¾à¦°";i:4;s:33:"বৃহষà§à¦ªà¦¤à¦¿à¦¬à¦¾à¦°";i:5;s:24:"শà§à¦•à§à¦°à¦¬à¦¾à¦°";i:6;s:18:"শনিবার";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:24:"জানà§à§Ÿà¦¾à¦°à§€";i:1;s:30:"ফেবà§à¦°à§à§Ÿà¦¾à¦°à§€";i:2;s:15:"মারà§à¦š";i:3;s:18:"à¦à¦ªà§à¦°à¦¿à¦²";i:4;s:6:"মে";i:5;s:9:"জà§à¦¨";i:6;s:15:"জà§à¦²à¦¾à¦‡";i:7;s:15:"আগসà§à¦Ÿ";i:8;s:30:"সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°";i:9;s:21:"অকà§à¦Ÿà§‹à¦¬à¦°";i:10;s:21:"নভেমà§à¦¬à¦°";i:11;s:24:"ডিসেমà§à¦¬à¦°";}s:4:"wide";a:12:{i:0;s:24:"জানà§à§Ÿà¦¾à¦°à§€";i:1;s:30:"ফেবà§à¦°à§à§Ÿà¦¾à¦°à§€";i:2;s:15:"মারà§à¦š";i:3;s:18:"à¦à¦ªà§à¦°à¦¿à¦²";i:4;s:6:"মে";i:5;s:9:"জà§à¦¨";i:6;s:15:"জà§à¦²à¦¾à¦‡";i:7;s:15:"আগসà§à¦Ÿ";i:8;s:30:"সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°";i:9;s:21:"অকà§à¦Ÿà§‹à¦¬à¦°";i:10;s:21:"নভেমà§à¦¬à¦°";i:11;s:24:"ডিসেমà§à¦¬à¦°";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bn_IN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bn_IN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/bn_IN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:28:"##,##,##0.###;-##,##,##0.###";i:1;s:32:"¤ ##,##,##0.00;-¤ ##,##,##0.00";i:2;s:10:"##,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:6:"d-M-yy";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:1;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ca.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ca.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ca.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:8:{s:9:"Countries";a:196:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:25:"Unió dels Emirats Àrabs";}s:2:"AF";a:1:{i:0;s:10:"Afganistan";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:8:"Albània";}s:2:"AM";a:1:{i:0;s:8:"Armènia";}s:2:"AN";a:1:{i:0;s:19:"Antilles Holandeses";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AT";a:1:{i:0;s:8:"Âustria";}s:2:"AU";a:1:{i:0;s:10:"Austràlia";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:11:"Azerbaidjan";}s:2:"BA";a:1:{i:0;s:21:"Bòsnia i Hercegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:11:"Bangla Desh";}s:2:"BE";a:1:{i:0;s:8:"Bèlgica";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:9:"Bulgària";}s:2:"BH";a:1:{i:0;s:7:"Bahrain";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:8:"Bermudes";}s:2:"BN";a:1:{i:0;s:6:"Brunei";}s:2:"BO";a:1:{i:0;s:8:"Bolívia";}s:2:"BR";a:1:{i:0;s:6:"Brasil";}s:2:"BS";a:1:{i:0;s:7:"Bahames";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:12:"Bielorússia";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:7:"Canadà";}s:2:"CF";a:1:{i:0;s:24:"República Centrafricana";}s:2:"CG";a:1:{i:0;s:5:"Congo";}s:2:"CH";a:1:{i:0;s:11:"Switzerland";}s:2:"CI";a:1:{i:0;s:15:"Costa d’Ivori";}s:2:"CL";a:1:{i:0;s:4:"Xile";}s:2:"CM";a:1:{i:0;s:7:"Camerun";}s:2:"CN";a:1:{i:0;s:4:"Xina";}s:2:"CO";a:1:{i:0;s:9:"Colòmbia";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:4:"Cuba";}s:2:"CV";a:1:{i:0;s:8:"Cap Verd";}s:2:"CY";a:1:{i:0;s:5:"Xipre";}s:2:"CZ";a:1:{i:0;s:16:"República Txeca";}s:2:"DE";a:1:{i:0;s:8:"Alemanya";}s:2:"DJ";a:1:{i:0;s:8:"Djibouti";}s:2:"DK";a:1:{i:0;s:9:"Dinamarca";}s:2:"DM";a:1:{i:0;s:8:"Dominica";}s:2:"DO";a:1:{i:0;s:21:"República Dominicana";}s:2:"DZ";a:1:{i:0;s:8:"Algèria";}s:2:"EC";a:1:{i:0;s:7:"Equador";}s:2:"EE";a:1:{i:0;s:8:"Estònia";}s:2:"EG";a:1:{i:0;s:6:"Egipte";}s:2:"EH";a:1:{i:0;s:18:"Sàhara Occidental";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:7
:"Espanya";}s:2:"ET";a:1:{i:0;s:8:"Etiòpia";}s:2:"FI";a:1:{i:0;s:10:"Finlàndia";}s:2:"FJ";a:1:{i:0;s:4:"Fiji";}s:2:"FM";a:1:{i:0;s:11:"Micronèsia";}s:2:"FR";a:1:{i:0;s:7:"França";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:10:"Regne Unit";}s:2:"GE";a:1:{i:0;s:8:"Geòrgia";}s:2:"GF";a:1:{i:0;s:16:"Guaiana Francesa";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GM";a:1:{i:0;s:7:"Gàmbia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:17:"Guinea Equatorial";}s:2:"GR";a:1:{i:0;s:7:"Grècia";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GW";a:1:{i:0;s:13:"Guinea Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HN";a:1:{i:0;s:8:"Hondures";}s:2:"HR";a:1:{i:0;s:8:"Croàcia";}s:2:"HT";a:1:{i:0;s:6:"Haití";}s:2:"HU";a:1:{i:0;s:7:"Hongria";}s:2:"ID";a:1:{i:0;s:10:"Indonèsia";}s:2:"IE";a:1:{i:0;s:7:"Irlanda";}s:2:"IL";a:1:{i:0;s:6:"Israel";}s:2:"IN";a:1:{i:0;s:6:"Ãndia";}s:2:"IQ";a:1:{i:0;s:4:"Iraq";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:9:"Islàndia";}s:2:"IT";a:1:{i:0;s:7:"Itàlia";}s:2:"JM";a:1:{i:0;s:7:"Jamaica";}s:2:"JO";a:1:{i:0;s:9:"Jordània";}s:2:"JP";a:1:{i:0;s:5:"Japó";}s:2:"KE";a:1:{i:0;s:5:"Kenya";}s:2:"KG";a:1:{i:0;s:11:"Kirgizistan";}s:2:"KH";a:1:{i:0;s:8:"Cambodja";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:7:"Comores";}s:2:"KP";a:1:{i:0;s:14:"Corea del Nord";}s:2:"KR";a:1:{i:0;s:13:"Corea del Sud";}s:2:"KW";a:1:{i:0;s:6:"Kuwait";}s:2:"KZ";a:1:{i:0;s:10:"Kazakhstan";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:6:"Líban";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:8:"Libèria";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:9:"Lituània";}s:2:"LU";a:1:{i:0;s:9:"Luxemburg";}s:2:"LV";a:1:{i:0;s:8:"Letònia";}s:2:"LY";a:1:{i:0;s:6:"Líbia";}s:2:"MA";a:1:{i:0;s:6:"Marroc";}s:2:"MC";a:1:{i:0;s:7:"Mònaco";}s:2:"MD";a:1:{i:0;s:9:"Moldàvia";}s:2:"MG";a:1:{i:0;s:10:"Madagascar";}s:2:"MK";a:1:{i:0;s:10:"Macedònia";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:
1:{i:0;s:9:"Mongòlia";}s:2:"MQ";a:1:{i:0;s:9:"Martinica";}s:2:"MR";a:1:{i:0;s:11:"Mauritània";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:7:"Maurici";}s:2:"MX";a:1:{i:0;s:6:"Mèxic";}s:2:"MY";a:1:{i:0;s:9:"Malàisia";}s:2:"MZ";a:1:{i:0;s:9:"Moçambic";}s:2:"NA";a:1:{i:0;s:8:"Namíbia";}s:2:"NC";a:1:{i:0;s:15:"Nova Caledònia";}s:2:"NE";a:1:{i:0;s:6:"Níger";}s:2:"NG";a:1:{i:0;s:8:"Nigèria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:14:"Països Baixos";}s:2:"NO";a:1:{i:0;s:7:"Noruega";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:12:"Nova Zelanda";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:7:"Panamà";}s:2:"PE";a:1:{i:0;s:5:"Perú";}s:2:"PF";a:1:{i:0;s:19:"Polinèsia Francesa";}s:2:"PG";a:1:{i:0;s:17:"Papua Nova Guinea";}s:2:"PH";a:1:{i:0;s:9:"Filipines";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:8:"Polònia";}s:2:"PR";a:1:{i:0;s:11:"Puerto Rico";}s:2:"PT";a:1:{i:0;s:8:"Portugal";}s:2:"PY";a:1:{i:0;s:8:"Paraguai";}s:2:"QA";a:1:{i:0;s:5:"Qatar";}s:2:"RO";a:1:{i:0;s:7:"Romania";}s:2:"RU";a:1:{i:0;s:7:"Rússia";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:14:"Aràbia Saudí";}s:2:"SC";a:1:{i:0;s:10:"Seychelles";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:7:"Suècia";}s:2:"SG";a:1:{i:0;s:8:"Singapur";}s:2:"SI";a:1:{i:0;s:10:"Eslovènia";}s:2:"SK";a:1:{i:0;s:11:"Eslovàquia";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:8:"Somàlia";}s:2:"SP";a:1:{i:0;s:7:"Sèrbia";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:6:"Síria";}s:2:"SZ";a:1:{i:0;s:12:"Swazilàndia";}s:2:"TD";a:1:{i:0;s:4:"Txad";}s:2:"TF";a:1:{i:0;s:32:"Territoris Meridionals Francesos";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:10:"Tailàndia";}s:2:"TJ";a:1:{i:0;s:11:"Tadjikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:5:"Timor";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:8:"Tunísia";}s:2:"TO";a:1
:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:7:"Turquia";}s:2:"TT";a:1:{i:0;s:17:"Trinitat i Tobago";}s:2:"TW";a:1:{i:0;s:6:"Taiwan";}s:2:"TZ";a:1:{i:0;s:9:"Tanzània";}s:2:"UA";a:1:{i:0;s:8:"Ucraïna";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"US";a:1:{i:0;s:12:"Estats Units";}s:2:"UY";a:1:{i:0;s:7:"Uruguai";}s:2:"UZ";a:1:{i:0;s:10:"Uzbekistan";}s:2:"VA";a:1:{i:0;s:7:"Vaticà";}s:2:"VE";a:1:{i:0;s:10:"Veneçuela";}s:2:"VG";a:1:{i:0;s:25:"Illes Verges Britàniques";}s:2:"VI";a:1:{i:0;s:21:"Illes Verges dels USA";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"YE";a:1:{i:0;s:5:"Iemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:11:"Iugoslàvia";}s:2:"ZA";a:1:{i:0;s:11:"Sud-àfrica";}s:2:"ZM";a:1:{i:0;s:7:"Zàmbia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:1:{s:3:"ESP";a:3:{i:0;s:3:"₧";i:1;s:3:"ESP";i:2;a:3:{i:0;s:18:"¤ #,##0;-¤ #,##0";i:1;s:1:",";i:2;s:1:".";}}}s:9:"Languages";a:139:{s:2:"aa";a:1:{i:0;s:5:"àfar";}s:2:"ab";a:1:{i:0;s:6:"abkhaz";}s:2:"af";a:1:{i:0;s:9:"afrikaans";}s:2:"am";a:1:{i:0;s:8:"amhàric";}s:2:"ar";a:1:{i:0;s:5:"ârab";}s:2:"as";a:1:{i:0;s:8:"assamès";}s:2:"ay";a:1:{i:0;s:6:"aimara";}s:2:"az";a:1:{i:0;s:6:"àzeri";}s:2:"ba";a:1:{i:0;s:7:"baixkir";}s:2:"be";a:1:{i:0;s:9:"bielorús";}s:2:"bg";a:1:{i:0;s:7:"búlgar";}s:2:"bh";a:1:{i:0;s:6:"bihari";}s:2:"bi";a:1:{i:0;s:7:"bislama";}s:2:"bn";a:1:{i:0;s:8:"bengalí";}s:2:"bo";a:1:{i:0;s:7:"tibetà";}s:2:"br";a:1:{i:0;s:6:"bretó";}s:2:"ca";a:1:{i:0;s:7:"català";}s:2:"co";a:1:{i:0;s:4:"cors";}s:2:"cs";a:1:{i:0;s:4:"txec";}s:2:"cy";a:1:{i:0;s:9:"gal·lès";}s:2:"da";a:1:{i:0;s:6:"danès";}s:2:"de";a:1:{i:0;s:7:"alemany";}s:2:"dz";a:1:{i:0;s:9:"bhutanès";}s:2:"el";a:1:{i:0;s:4:"grec";}s:2:"en";a:1:{i:0;s:7:"anglès";}s:2:"eo";a:1:{i:0;s:9:"esperanto";}s:2:"es";a:1:{i:0;s:8:"espanyol";}s:2:"et";a:1:{i:0;s:8:"estonià";}s:2:"eu";a:1:{i:0;s:4:"basc";}s:2:"fa";a:1:{i:0;s:5:"persa";}s:2:"fi";a:1:{i:0;s:6:"finès";}s:2:"fj";a:1:{i:0;s:6:"fijià";}s:2:"fo";a:1:{i:0;s:7:"feroès";}s:2:"fr";a:1:{i:0;s:8:"francès";
}s:2:"fy";a:1:{i:0;s:6:"frisó";}s:2:"ga";a:1:{i:0;s:9:"irlandès";}s:2:"gd";a:1:{i:0;s:8:"escocès";}s:2:"gl";a:1:{i:0;s:6:"gallec";}s:2:"gn";a:1:{i:0;s:8:"guaraní";}s:2:"gu";a:1:{i:0;s:8:"gujarati";}s:2:"ha";a:1:{i:0;s:5:"hausa";}s:2:"he";a:1:{i:0;s:6:"hebreu";}s:2:"hi";a:1:{i:0;s:5:"hindi";}s:2:"hr";a:1:{i:0;s:5:"croat";}s:2:"hu";a:1:{i:0;s:9:"hongarès";}s:2:"hy";a:1:{i:0;s:6:"armeni";}s:2:"ia";a:1:{i:0;s:11:"interlingua";}s:2:"id";a:1:{i:0;s:8:"indonesi";}s:2:"ie";a:1:{i:0;s:11:"interlingue";}s:2:"ik";a:1:{i:0;s:7:"inupiak";}s:2:"is";a:1:{i:0;s:9:"islandès";}s:2:"it";a:1:{i:0;s:7:"italià";}s:2:"iu";a:1:{i:0;s:9:"inuktitut";}s:2:"ja";a:1:{i:0;s:8:"japonès";}s:2:"jv";a:1:{i:0;s:8:"javanès";}s:2:"ka";a:1:{i:0;s:8:"georgià";}s:2:"kk";a:1:{i:0;s:6:"kazakh";}s:2:"kl";a:1:{i:0;s:12:"greenlandès";}s:2:"km";a:1:{i:0;s:9:"cambodjà";}s:2:"kn";a:1:{i:0;s:7:"kannada";}s:2:"ko";a:1:{i:0;s:6:"coreà";}s:2:"ks";a:1:{i:0;s:8:"caixmiri";}s:2:"ku";a:1:{i:0;s:4:"kurd";}s:2:"ky";a:1:{i:0;s:8:"kirguís";}s:2:"la";a:1:{i:0;s:6:"llatí";}s:2:"ln";a:1:{i:0;s:7:"lingala";}s:2:"lo";a:1:{i:0;s:7:"laosià";}s:2:"lt";a:1:{i:0;s:6:"lituà";}s:2:"lv";a:1:{i:0;s:5:"letó";}s:2:"mg";a:1:{i:0;s:7:"malgaix";}s:2:"mi";a:1:{i:0;s:5:"maori";}s:2:"mk";a:1:{i:0;s:8:"macedoni";}s:2:"ml";a:1:{i:0;s:9:"malaialam";}s:2:"mn";a:1:{i:0;s:6:"mongol";}s:2:"mo";a:1:{i:0;s:6:"moldau";}s:2:"mr";a:1:{i:0;s:7:"marathi";}s:2:"ms";a:1:{i:0;s:5:"malai";}s:2:"mt";a:1:{i:0;s:7:"maltès";}s:2:"my";a:1:{i:0;s:6:"birmà";}s:2:"na";a:1:{i:0;s:7:"nauruà";}s:2:"ne";a:1:{i:0;s:8:"nepalès";}s:2:"nl";a:1:{i:0;s:11:"neerlandès";}s:2:"no";a:1:{i:0;s:6:"noruec";}s:2:"oc";a:1:{i:0;s:7:"occità";}s:2:"om";a:1:{i:0;s:12:"oromo (afan)";}s:2:"or";a:1:{i:0;s:5:"oriya";}s:2:"pa";a:1:{i:0;s:7:"panjabi";}s:2:"pl";a:1:{i:0;s:8:"polonès";}s:2:"ps";a:1:{i:0;s:6:"paixto";}s:2:"pt";a:1:{i:0;s:10:"portuguès";}s:2:"qu";a:1:{i:0;s:8:"quètxua";}s:2:"rm";a:1:{i:0;s:12:"retoromànic";}s:2:"rn";a:1:{i:0;s:7:"kirundi";}s:2:"ro";a:1:{i:0;s:8:"romanès";}s:2:"ru";a:1:{i:0;s:3:"rus";}s:2:"
rw";a:1:{i:0;s:11:"kinyarwanda";}s:2:"sa";a:1:{i:0;s:9:"sànscrit";}s:2:"sd";a:1:{i:0;s:6:"sindhi";}s:2:"sg";a:1:{i:0;s:5:"sango";}s:2:"sh";a:1:{i:0;s:11:"serbo-croat";}s:2:"si";a:1:{i:0;s:9:"sinhalès";}s:2:"sk";a:1:{i:0;s:7:"eslovac";}s:2:"sl";a:1:{i:0;s:7:"eslovè";}s:2:"sm";a:1:{i:0;s:6:"samoà";}s:2:"sn";a:1:{i:0;s:5:"shona";}s:2:"so";a:1:{i:0;s:6:"somali";}s:2:"sq";a:1:{i:0;s:8:"albanès";}s:2:"sr";a:1:{i:0;s:5:"serbi";}s:2:"ss";a:1:{i:0;s:7:"siswati";}s:2:"st";a:1:{i:0;s:5:"sotho";}s:2:"su";a:1:{i:0;s:9:"sundanès";}s:2:"sv";a:1:{i:0;s:4:"suec";}s:2:"sw";a:1:{i:0;s:7:"swahili";}s:2:"ta";a:1:{i:0;s:6:"tàmil";}s:2:"te";a:1:{i:0;s:6:"telugu";}s:2:"tg";a:1:{i:0;s:6:"tadjik";}s:2:"th";a:1:{i:0;s:4:"thai";}s:2:"ti";a:1:{i:0;s:8:"tigrinya";}s:2:"tk";a:1:{i:0;s:7:"turcman";}s:2:"tl";a:1:{i:0;s:8:"tagàlog";}s:2:"tn";a:1:{i:0;s:6:"tswana";}s:2:"to";a:1:{i:0;s:5:"tonga";}s:2:"tr";a:1:{i:0;s:4:"turc";}s:2:"ts";a:1:{i:0;s:6:"tsonga";}s:2:"tt";a:1:{i:0;s:6:"tàtar";}s:2:"tw";a:1:{i:0;s:3:"twi";}s:2:"ug";a:1:{i:0;s:5:"uigur";}s:2:"uk";a:1:{i:0;s:10:"ucraïnès";}s:2:"ur";a:1:{i:0;s:5:"urdú";}s:2:"uz";a:1:{i:0;s:5:"uzbek";}s:2:"vi";a:1:{i:0;s:10:"vietnamita";}s:2:"vo";a:1:{i:0;s:7:"volapuk";}s:2:"wo";a:1:{i:0;s:6:"wòlof";}s:2:"xh";a:1:{i:0;s:4:"xosa";}s:2:"yi";a:1:{i:0;s:7:"jiddish";}s:2:"yo";a:1:{i:0;s:6:"ioruba";}s:2:"za";a:1:{i:0;s:6:"zhuang";}s:2:"zh";a:1:{i:0;s:6:"xinés";}s:2:"zu";a:1:{i:0;s:4:"zulu";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:3:"dg.";i:1;s:3:"dl.";i:2;s:3:"dt.";i:3;s:3:"dc.";i:4;s:3:"dj.";i:5;s:3:"dv.";i:6;s:3:"ds.";}s:4:"wide";a:7:{i:0;s:8:"diumenge";i:1;s:7:"dilluns";i:2;s:7:"dimarts";i:3;s:8:"dimecres";i:4;s:6:"dijous";
i:5;s:9:"divendres";i:6;s:8:"dissabte";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:4:"gen.";i:1;s:4:"feb.";i:2;s:5:"març";i:3;s:4:"abr.";i:4;s:4:"maig";i:5;s:4:"juny";i:6;s:4:"jul.";i:7;s:3:"ag.";i:8;s:4:"set.";i:9;s:4:"oct.";i:10;s:4:"nov.";i:11;s:4:"des.";}s:4:"wide";a:12:{i:0;s:5:"gener";i:1;s:6:"febrer";i:2;s:5:"març";i:3;s:5:"abril";i:4;s:4:"maig";i:5;s:4:"juny";i:6;s:6:"juliol";i:7;s:5:"agost";i:8;s:8:"setembre";i:9;s:7:"octubre";i:10;s:8:"novembre";i:11;s:8:"desembre";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GuMtkHmsSEDFwWahKzUeygAZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ca_ES.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ca_ES.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ca_ES.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cs.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cs.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cs.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:11:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:26:"Spojené arabské emiráty";}s:2:"AF";a:1:{i:0;s:13:"Afghánistán";}s:2:"AG";a:1:{i:0;s:17:"Antigua a Barbuda";}s:2:"AI";a:1:{i:0;s:7:"Anguila";}s:2:"AL";a:1:{i:0;s:8:"Albánie";}s:2:"AM";a:1:{i:0;s:8:"Arménie";}s:2:"AN";a:1:{i:0;s:18:"Nizozemské Antily";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarktida";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:15:"Americká Samoa";}s:2:"AT";a:1:{i:0;s:8:"Rakousko";}s:2:"AU";a:1:{i:0;s:10:"Austrálie";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:15:"Ãzerbájdžán";}s:2:"BA";a:1:{i:0;s:19:"Bosna a Hercegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:11:"Bangladéš";}s:2:"BE";a:1:{i:0;s:6:"Belgie";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:9:"Bulharsko";}s:2:"BH";a:1:{i:0;s:7:"Bahrajn";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermudy";}s:2:"BN";a:1:{i:0;s:17:"Brunej Darussalam";}s:2:"BO";a:1:{i:0;s:8:"Bolívie";}s:2:"BR";a:1:{i:0;s:9:"Brazílie";}s:2:"BS";a:1:{i:0;s:6:"Bahamy";}s:2:"BT";a:1:{i:0;s:8:"Bhútán";}s:2:"BV";a:1:{i:0;s:13:"Ostrov Bouvet";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:10:"BÄ›lorusko";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:17:"Kokosové ostrovy";}s:2:"CD";a:1:{i:0;s:30:"Kongo, demokratická republika";}s:2:"CF";a:1:{i:0;s:25:"StÅ™edoafrická republika";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:11:"Å výcarsko";}s:2:"CI";a:1:{i:0;s:20:"PobÅ™eží slonoviny";}s:2:"CK";a:1:{i:0;s:15:"Cookovy ostrovy";}s:2:"CL";a:1:{i:0;s:5:"Chile";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:6:"Čína";}s:2:"CO";a:1:{i:0;s:8:"Kolumbie";}s:2:"CR";a:1:{i:0;s:9:"Kostarika";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:8:"Kapverdy";}s:2:"CX";a:1:{i:0;s:18:"VánoÄní ostrovy";}s:2:"CY";a:1:{i:0;s:4:"Kypr";}s:2:"CZ";a:1:{i:0;s:17:"ÄŒeská republika";}s:2:"DE";a:1:{i:0;s:8:"NÄ›mecko";}s:2:"DJ";a:
1:{i:0;s:8:"Džibuti";}s:2:"DK";a:1:{i:0;s:7:"Dánsko";}s:2:"DM";a:1:{i:0;s:8:"Dominika";}s:2:"DO";a:1:{i:0;s:24:"Dominikánská republika";}s:2:"DZ";a:1:{i:0;s:10:"Alžírsko";}s:2:"EC";a:1:{i:0;s:8:"Ekvádor";}s:2:"EE";a:1:{i:0;s:8:"Estonsko";}s:2:"EG";a:1:{i:0;s:5:"Egypt";}s:2:"EH";a:1:{i:0;s:16:"Západní Sahara";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:11:"Å panÄ›lsko";}s:2:"ET";a:1:{i:0;s:7:"Etiopie";}s:2:"FI";a:1:{i:0;s:6:"Finsko";}s:2:"FJ";a:1:{i:0;s:6:"Fidži";}s:2:"FK";a:1:{i:0;s:20:"Falklandské ostrovy";}s:2:"FM";a:1:{i:0;s:31:"Mikronésie, federativní stát";}s:2:"FO";a:1:{i:0;s:16:"Faerské ostrovy";}s:2:"FR";a:1:{i:0;s:7:"Francie";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:16:"Velká Británie";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:6:"Gruzie";}s:2:"GF";a:1:{i:0;s:19:"Francouzská Guyana";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:8:"Grónsko";}s:2:"GM";a:1:{i:0;s:6:"Gambie";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:18:"Rovníková Guinea";}s:2:"GR";a:1:{i:0;s:6:"Řecko";}s:2:"GS";a:1:{i:0;s:45:"Jižní Georgie a Jižní Sandwichovy ostrovy";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinea-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:52:"Hongkong, zvláštní administrativní oblast Číny";}s:2:"HM";a:1:{i:0;s:24:"Ostrovy Heard a McDonald";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:10:"Chorvatsko";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:9:"MaÄarsko";}s:2:"ID";a:1:{i:0;s:10:"Indonésie";}s:2:"IE";a:1:{i:0;s:5:"Irsko";}s:2:"IL";a:1:{i:0;s:6:"Izrael";}s:2:"IN";a:1:{i:0;s:5:"Indie";}s:2:"IO";a:1:{i:0;s:36:"Britské území v Indickém oceánu";}s:2:"IQ";a:1:{i:0;s:5:"Irák";}s:2:"IR";a:1:{i:0;s:6:"Ãrán";}s:2:"IS";a:1:{i:0;s:6:"Island";}s:2:"IT";a:1:{i:0;s:7:"Itálie";}s:2:"JM";a:1:{i:0;s:7:"Jamajka";}s:2:"JO";a:1:{i:0;s:10:"Jordánsko";}s:2:"JP";a:1:{i:0;s:8:"Japonsko";}s:2:"KE";a:1:{
i:0;s:5:"Keňa";}s:2:"KG";a:1:{i:0;s:11:"Kyrgyzstán";}s:2:"KH";a:1:{i:0;s:9:"Kambodža";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:6:"Komory";}s:2:"KN";a:1:{i:0;s:20:"Svatý Kitts a Nevis";}s:2:"KP";a:1:{i:0;s:14:"Severní Korea";}s:2:"KR";a:1:{i:0;s:13:"Jižní Korea";}s:2:"KW";a:1:{i:0;s:6:"Kuvajt";}s:2:"KY";a:1:{i:0;s:18:"Kajmanské ostrovy";}s:2:"KZ";a:1:{i:0;s:11:"Kazachstán";}s:2:"LA";a:1:{i:0;s:36:"Lidově demokratická republika Laos";}s:2:"LB";a:1:{i:0;s:7:"Libanon";}s:2:"LC";a:1:{i:0;s:12:"Svatá Lucie";}s:2:"LI";a:1:{i:0;s:16:"Lichtenštejnsko";}s:2:"LK";a:1:{i:0;s:10:"Srí Lanka";}s:2:"LR";a:1:{i:0;s:8:"Libérie";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:5:"Litva";}s:2:"LU";a:1:{i:0;s:11:"Lucembursko";}s:2:"LV";a:1:{i:0;s:9:"Lotyšsko";}s:2:"LY";a:1:{i:0;s:5:"Libye";}s:2:"MA";a:1:{i:0;s:6:"Maroko";}s:2:"MC";a:1:{i:0;s:6:"Monako";}s:2:"MD";a:1:{i:0;s:20:"Moldavsko, republika";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:19:"Marshallovy ostrovy";}s:2:"MK";a:1:{i:0;s:9:"Macedonia";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:15:"Myanmar (Burma)";}s:2:"MN";a:1:{i:0;s:9:"Mongolsko";}s:2:"MO";a:1:{i:0;s:19:"Macao S.A.R., China";}s:2:"MP";a:1:{i:0;s:16:"Severní Mariany";}s:2:"MQ";a:1:{i:0;s:8:"Martinik";}s:2:"MR";a:1:{i:0;s:11:"Mauritánie";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauricius";}s:2:"MV";a:1:{i:0;s:8:"Maladivy";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:6:"Mexiko";}s:2:"MY";a:1:{i:0;s:8:"Malajsie";}s:2:"MZ";a:1:{i:0;s:8:"Mosambik";}s:2:"NA";a:1:{i:0;s:7:"Namibie";}s:2:"NC";a:1:{i:0;s:15:"Nová Kaledonie";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:7:"Norfolk";}s:2:"NG";a:1:{i:0;s:8:"Nigérie";}s:2:"NI";a:1:{i:0;s:9:"Nikaragua";}s:2:"NL";a:1:{i:0;s:10:"Nizozemsko";}s:2:"NO";a:1:{i:0;s:6:"Norsko";}s:2:"NP";a:1:{i:0;s:6:"Nepál";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:13:"Nový Zéland";}s:2:"OM";a:1:{i:0;s:5:"Omán";}s:2:"PA";a:1:{i:0;s:6:"Pa
nama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:23:"Francouzská Polynésie";}s:2:"PG";a:1:{i:0;s:18:"Papua-Nová Guinea";}s:2:"PH";a:1:{i:0;s:9:"Filipíny";}s:2:"PK";a:1:{i:0;s:10:"Pákistán";}s:2:"PL";a:1:{i:0;s:6:"Polsko";}s:2:"PM";a:1:{i:0;s:24:"Svatý Pierre a Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:9:"Portoriko";}s:2:"PS";a:1:{i:0;s:21:"Palestinian Territory";}s:2:"PT";a:1:{i:0;s:11:"Portugalsko";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Katar";}s:2:"RE";a:1:{i:0;s:8:"Réunion";}s:2:"RO";a:1:{i:0;s:8:"Rumunsko";}s:2:"RU";a:1:{i:0;s:5:"Rusko";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:17:"Saúdská Arábie";}s:2:"SB";a:1:{i:0;s:20:"Šalamounovy ostrovy";}s:2:"SC";a:1:{i:0;s:8:"Seychely";}s:2:"SD";a:1:{i:0;s:7:"Súdán";}s:2:"SE";a:1:{i:0;s:9:"Švédsko";}s:2:"SG";a:1:{i:0;s:8:"Singapur";}s:2:"SH";a:1:{i:0;s:13:"Svatá Helena";}s:2:"SI";a:1:{i:0;s:9:"Slovinsko";}s:2:"SJ";a:1:{i:0;s:20:"Svalbard a Jan Mayen";}s:2:"SK";a:1:{i:0;s:9:"Slovensko";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:9:"Somálsko";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:14:"Svatý Tomáš";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:6:"Sýrie";}s:2:"SZ";a:1:{i:0;s:9:"Svazijsko";}s:2:"TC";a:1:{i:0;s:22:"Ostrovy Caicos a Turks";}s:2:"TD";a:1:{i:0;s:4:"Čad";}s:2:"TF";a:1:{i:0;s:30:"Francouzská jižní teritoria";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:7:"Thajsko";}s:2:"TJ";a:1:{i:0;s:14:"Tádžikistán";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:16:"Východní Timor";}s:2:"TM";a:1:{i:0;s:13:"Turkmenistán";}s:2:"TN";a:1:{i:0;s:7:"Tunisko";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:7:"Turecko";}s:2:"TT";a:1:{i:0;s:17:"Trinidad a Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:9:"Tchaj-wan";}s:2:"TZ";a:1:{i:0;s:8:"Tanzanie";}s:2:"UA";a:1:{i:0;s:8:"Ukrajina";}s:2:"UG"
;a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:28:"Menší odlehlé ostrovy USA";}s:2:"US";a:1:{i:0;s:15:"Spojené státy";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:11:"Uzbekistán";}s:2:"VA";a:1:{i:0;s:13:"Svatý stolec";}s:2:"VC";a:1:{i:0;s:26:"Svatý Vincent a Grenadiny";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:26:"Britské Panenské ostrovy";}s:2:"VI";a:1:{i:0;s:27:"Americké Panenské ostrovy";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:15:"Wallis a Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:11:"Jugoslávie";}s:2:"ZA";a:1:{i:0;s:14:"Jižní Afrika";}s:2:"ZM";a:1:{i:0;s:6:"Zambie";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:360:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:16:"Diner andorrský";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:17:"Peseta andorrská";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:10:"Dirham SAE";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:19:"Afghán (1927-2002)";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:7:"Afghán";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:22:"Affars and Issas Franc";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:15:"Lek (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:3:"Lek";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:19:"Albanian Lek Valute";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:15:"Dram arménský";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:26:"Zlatý Nizozemských Antil";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:6:"Kwanza";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:18:"Kwanza (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:24:"Kwanza nová (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:29:"Kwanza reajustado (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:16:"Escudo angolské";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:7:"Austral";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:33:"Peso argentinské Moneda Nacional";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:29:"Peso argentinské (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:17:"Peso argentinské";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:7:"Šilink";}s:3:"AUD";a:
2:{i:0;s:2:"$A";i:1;s:17:"Dolar australský";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:17:"Libra australská";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:15:"Zlatý arubský";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:24:"Manat ázerbajdžánský";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:26:"Dinár Bosny a Hercegoviny";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:20:"Marka konvertibilní";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:32:"Nový Dinár Bosny a Hercegoviny";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:17:"Dolar barbadoský";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:4:"Taka";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:20:"Frank konvertibilní";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:15:"Frank belgický";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:16:"Frank finanÄní";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:3:"Lev";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:29:"Lev Bulharský socialistický";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:14:"Lev Bulharský";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:26:"Lev Bulharský (1879-1952)";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:18:"Dinár bahrajnský";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:16:"Frank burundský";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:16:"Dolar bermudský";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:16:"Libra bermudská";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:16:"Dolar brunejský";}s:3:"BOB";a:2:{i:0;s:2:"Bs";i:1;s:9:"Boliviano";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:21:"Boliviano (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:4:"Peso";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:5:"Mvdol";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:20:"Cruzeiro (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:7:"Cruzado";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:20:"Cruzeiro (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:15:"Real brazilský";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:13:"Cruzado nové";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:13:"Cruzeiro real";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:20:"Cruzeiro (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:15:"Dolar bahamský";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:15:"Libra bahamská";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:8:"Ngultrum";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:18:"Ru
pie bhútánská";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:13:"Kyat barmský";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:14:"Rupie barmská";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:4:"Pula";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:34:"Rubl nový bÄ›loruský (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:28:"Rubl bÄ›loruský (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:16:"Rubl bÄ›loruský";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:15:"Dolar belizský";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:26:"Dolar Britského Hondurasu";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:15:"Dolar kanadský";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:15:"Frank konžský";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:25:"Frank Konžské republiky";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:15:"Zaire konžský";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:35:"Frank StÅ™edoafrické republiky CFA";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:18:"Frank Å¡výcarský";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:25:"Dolar Cookových ostrovů";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:15:"Condor chilský";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:15:"Escudo chilské";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:19:"Unidades de fomento";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:13:"Peso chilské";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:21:"Frank kamerunský CFA";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:17:"Juan jen min piao";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:19:"Dolar lidové banky";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:13:"Juan renminbi";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:17:"Peso kolumbijské";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:19:"Krank konžský CFA";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:17:"Peso kolumbijské";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:18:"Colón kostarický";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:23:"Koruna Äeskoslovenská";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:23:"Koruna Äeskoslovenská";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:15:"Peso kubánské";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:18:"Escudo kapverdské";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:14:"Zlatý Curacao";}s:3:"CYP";a:2:{i:0;s:2:"£";i:1;s:15:"Libra kyperská";}s:3:"CZK";a:2:{i:0;s:3:"KÄ";i:1;s:1
4:"Koruna Äeská";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:9:"Marka NDR";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:15:"Marka nÄ›mecká";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:19:"Sperrmark nÄ›mecká";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:17:"Frank džibutský";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:15:"Koruna dánská";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:19:"Peso dominikánské";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:18:"Dinár alžírský";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:23:"Frank nový alžírský";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:26:"Frank alžírský germinal";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:18:"Sucre ekvádorský";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:39:"Ecuador Unidad de Valor Constante (UVC)";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:5:"Kroon";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:15:"Libra egyptská";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:5:"Nakfa";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:19:"Peseta Å¡panÄ›lská";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:14:"Birr etiopský";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:15:"Dolar etiopský";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"Euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:6:"Markka";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:18:"Markka (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:17:"Dolar fidžijský";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:17:"Libra fidžijská";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:18:"Libra falklandská";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:26:"Koruna Faerských ostrovů";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:18:"Frank francouzský";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:42:"Frank francouzský germinal/Frank poincare";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:19:"Frank gabonský CFA";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:17:"Libra Å¡terlinků";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:20:"Georgian Kupon Larit";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:4:"Lari";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:4:"Cedi";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:14:"Ghana Old Cedi";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:14:"Libra ghanská";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:19:"Ghana Revalued Cedi";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:19:"Libr
a gibraltarská";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:15:"Greenland Krone";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:6:"Dalasi";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:16:"Libra gambijská";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:16:"Frank guinejský";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:28:"Frank guinejský (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:11:"Guinea Syli";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:19:"Frank guadeloupský";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:33:"Equatorial Guinea Ekwele Guineana";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:24:"Equatorial Guinea Franco";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:33:"Equatorial Guinea Peseta Guineana";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:7:"Drachma";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:21:"Drachma nová řecká";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:7:"Quetzal";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:26:"French Guyana Franc Guiana";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:17:"Escudo guinejské";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:26:"Portuguese Guinea Mil Reis";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:19:"Peso Guinnea-Bissau";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:15:"Dolar guyanský";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:18:"Dolar hongkongský";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:7:"Lempira";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:17:"Dinar chorvatský";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:16:"Kuna chorvatská";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:6:"Gourde";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:6:"Forint";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:18:"Libra severoirská";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:23:"Indonesian Nica Guilder";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:22:"Indonesian Java Rupiah";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:21:"Indonesian New Rupiah";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:18:"Rupie indonézská";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:12:"Libra irská";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:17:"Šekel izraelský";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:16:"Libra izraelská";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:23:"Šekel nový izraelský";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:28:"Libra šterlinků Ostrov Man";}s:3:"INR
";a:2:{i:0;s:3:"INR";i:1;s:14:"Rupie indická";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:15:"Dinár irácký";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:17:"Rijál íránský";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:17:"Koruna islandská";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:13:"Lira italská";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:24:"Libra šterlinků Jersey";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:15:"Dolar jamajský";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:15:"Libra jamajská";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:18:"Dinár jordánský";}s:3:"JPY";a:2:{i:0;s:2:"¥";i:1;s:3:"Jen";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:16:"Šilink keňský";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:3:"Som";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:11:"Riel starý";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:4:"Riel";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:17:"Dolar kiribatský";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:15:"Frank komorský";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:19:"Won severokorejský";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:18:"Hwan jihokorejský";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:24:"Won starý jihokorejský";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:17:"Won jihokorejský";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:17:"Dinár kuvajtský";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:27:"Dolar Kajmanských ostrovů";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:15:"Rubl kazašský";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:5:"Tenge";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:3:"Kip";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:17:"Libra libanonská";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:23:"Frank lichtenštejnský";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:17:"Rupie srílanská";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:16:"Rupie cejlonská";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:17:"Dolar liberijský";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:4:"Loti";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:15:"Litus litevský";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:5:"Talon";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:18:"Frank lucemburský";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:14:"Lat lotyšský";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:15:"Rubl lotyšský";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:16:"
Dinár lybijský";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:15:"Libra lybijská";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:15:"Dirham marocký";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:14:"Frank marocký";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:22:"Frank nouveau monacký";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:23:"Frank monacký germinal";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:18:"Moldovan Leu Cupon";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:14:"Leu moldavský";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:20:"Moldovan Ruble Cupon";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:21:"Ariary madagaskarský";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:20:"Frank madagaskarský";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:29:"Dolar Marshallových ostrovů";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:6:"Denár";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:18:"Denár (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:15:"Frank malijský";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:4:"Kyat";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:6:"Tugrik";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:6:"Pataca";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:18:"Frank martinikský";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:7:"Ouguiya";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:13:"Lira maltská";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:14:"Libra maltská";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:18:"Rupie mauricijská";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:17:"Rupie maledivská";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:7:"Rufiyaa";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:6:"Kwacha";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:17:"Libra malawijská";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:13:"Peso mexické";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:37:"Peso stříbrné mexické (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:33:"Mexican Unidad de Inversion (UDI)";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:21:"Ringgit malajskijský";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:16:"Escudo Mosambiku";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:7:"Metical";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:17:"Dolar namibijský";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:30:"Frank Nové Kaledonie germinal";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:5:"Naira";}s:3:"NGP";
a:2:{i:0;s:3:"NGP";i:1;s:17:"Libra nigerijská";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:24:"Frank Nových Hebrid CFP";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:7:"Cordoba";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:14:"Cordoba zlatá";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:11:"Cordoba oro";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:17:"Zlatý holandský";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:14:"Koruna norská";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:16:"Rupie nepálská";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:21:"Dolar novozélandský";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:21:"Libra novozélandská";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:16:"Rijál ománský";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:22:"Rijál ománský saidi";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:6:"Balboa";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:26:"Transdniestria Ruble Kupon";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:24:"Transdniestria New Ruble";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:20:"Transdniestria Ruble";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:4:"Inti";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:9:"Nuevo sol";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:3:"Sol";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:4:"Kina";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:17:"Peso filipínské";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:20:"Rupie pákistánská";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:6:"Zlotý";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:18:"Zlotý (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:18:"Libra palestinská";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:18:"Conto portugalské";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:19:"Escudo portugalské";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:7:"Guarani";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:16:"Rijál katarský";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:13:"Frank Reunion";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:3:"Lei";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:9:"Lei nový";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:11:"Rubl ruský";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:23:"Rubl ruský (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:15:"Frank rwandský";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:15:"Rijál saudský";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:
25:"Rijál saudský sovereign";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:30:"Dolar Å alamounových ostrovů";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:17:"Rupie seychelská";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:18:"Dinár súdánský";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:17:"Libra súdánská";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:17:"Koruna Å¡védská";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:18:"Dolar singapurský";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:19:"Libra Svaté Heleny";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:19:"Slovenia Tolar Bons";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:5:"Tolar";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:17:"Koruna slovenská";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:15:"Lira San Marino";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:18:"Å ilink somálský";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:19:"Somaliland Shilling";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:18:"Zlatý surinamský";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:14:"Libra skotská";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:5:"Dobra";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:24:"Escudo Svatého Tomáše";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:10:"Rubl nový";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:4:"Rubl";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:18:"Colon salvadorský";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:13:"Libra syrská";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:9:"Lilangeni";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:21:"Koruna Turks a Caicos";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:18:"Frank Äadský CFA";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:4:"Baht";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:16:"Tajikistan Ruble";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:6:"Somoni";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:5:"Manat";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:15:"Dinár tuniský";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:27:"Libra Å¡terlinků tonžská";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:16:"Escudo timorské";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:16:"Pataca timorská";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:13:"Lira turecká";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:23:"Dolar Trinidad a Tobago";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:30:"Dolar starý Trinidad a Tobago";}s:3:
"TVD";a:2:{i:0;s:3:"TVD";i:1;s:15:"Dolar tuvalský";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:24:"Dolar tchajvanský nový";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:18:"Å ilink tanzanský";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:7:"HÅ™ivna";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:10:"Karbovanec";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:29:"Å ilink ugandský (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:17:"Å ilink ugandský";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:15:"Dolar americký";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:32:"Dolar americký (příští den)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:27:"Dolar americký (týž den)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:23:"Peso uruguayské fuerte";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:28:"Peso uruguayské (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:16:"Peso uruguayské";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:21:"Uzbekistan Coupon Som";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:12:"Sum uzbecký";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:14:"Lira Vatikánu";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:7:"Bolivar";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:37:"Dolar Britských Panenských ostrovů";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:4:"Vatu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:21:"Libra Západní Samoa";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:4:"Tala";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:14:"Frank BEAC/CFA";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:28:"Asijská peněžní jednotka";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:5:"Zlato";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:29:"Evropská smíšená jednotka";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:29:"Evropská peněžní jednotka";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:33:"Evropská jednotka úÄtu 9 (XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:34:"Evropská jednotka úÄtu 17 (XBD)";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:23:"Dolar východokaribský";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:17:"Frank Nouveau CFA";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:3:"SDR";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:16:"Frank BCEAEC/CFA";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:27:"Evropská mÄ›nová jednotka";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;
s:12:"Frank zlatý";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:9:"Frank UIC";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:17:"Dinár islámský";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:30:"Frank Francouzských Antil CFA";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:15:"Frank BCEAO/CFA";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:9:"Frank CFP";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:16:"Dinár jemenský";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:22:"Rijál jemenský imadi";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:16:"Rijál jemenský";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:26:"Dinár jugoslávský nový";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:33:"Dinár jugoslávský federativní";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:25:"Dinár jugoslávský 1994";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:20:"Dinár jugoslávský";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:20:"Dinár jugoslávský";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:33:"Dinár jugoslávský reformovaný";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:15:"Rand finanÄní";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:18:"Libra jihoafrická";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:4:"Rand";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:6:"Kwacha";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:16:"Libra zambijská";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:11:"Zaire nový";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:5:"Zaire";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:17:"Dolar zimbabwský";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:10:"Kalendář";}s:9:"collation";a:1:{i:0;s:11:"TřídÄ›ní";}s:8:"currency";a:1:{i:0;s:5:"MÄ›na";}}s:9:"Languages";a:139:{s:2:"aa";a:1:{i:0;s:10:"afarÅ¡tina";}s:2:"ab";a:1:{i:0;s:13:"abcházÅ¡tina";}s:2:"af";a:1:{i:0;s:14:"afrikánÅ¡tina";}s:2:"am";a:1:{i:0;s:11:"amharÅ¡tina";}s:2:"ar";a:1:{i:0;s:10:"arabÅ¡tina";}s:2:"as";a:1:{i:0;s:13:"assaméština";}s:2:"ay";a:1:{i:0;s:12:"aymárÅ¡tina";}s:2:"az";a:1:{i:0;s:19:"azerbajdžánÅ¡tina";}s:2:"ba";a:1:{i:0;s:12:"baskirÅ¡tina";}s:2:"be";a:1:{i:0;s:13:"bÄ›loruÅ¡tina";}s:2:"bg";a:1:{i:0;s:12:"bulharÅ¡tina";}s:2:"bh";a:1:{i:0;s:11:"biharÅ¡tina";}s:2:"bi";a:1:{i:0;s:13:"bislámÅ¡tina";}s:2:"bn";a:1:{i:0;s:13:"bengálÅ¡tina";}s:2:"bo
";a:1:{i:0;s:11:"tibetÅ¡tina";}s:2:"br";a:1:{i:0;s:13:"bretaňština";}s:2:"ca";a:1:{i:0;s:14:"katalánÅ¡tina";}s:2:"co";a:1:{i:0;s:11:"korsiÄtina";}s:2:"cs";a:1:{i:0;s:9:"ÄeÅ¡tina";}s:2:"cy";a:1:{i:0;s:9:"velÅ¡tina";}s:2:"da";a:1:{i:0;s:10:"dánÅ¡tina";}s:2:"de";a:1:{i:0;s:9:"nÄ›mÄina";}s:2:"dz";a:1:{i:0;s:14:"bhútánÅ¡tina";}s:2:"el";a:1:{i:0;s:9:"Å™eÄtina";}s:2:"en";a:1:{i:0;s:11:"angliÄtina";}s:2:"eo";a:1:{i:0;s:9:"esperanto";}s:2:"es";a:1:{i:0;s:14:"Å¡panÄ›lÅ¡tina";}s:2:"et";a:1:{i:0;s:11:"estonÅ¡tina";}s:2:"eu";a:1:{i:0;s:11:"baskiÄtina";}s:2:"fa";a:1:{i:0;s:9:"perÅ¡tina";}s:2:"fi";a:1:{i:0;s:9:"finÅ¡tina";}s:2:"fj";a:1:{i:0;s:6:"fidži";}s:2:"fo";a:1:{i:0;s:10:"faerÅ¡tina";}s:2:"fr";a:1:{i:0;s:14:"francouzÅ¡tina";}s:2:"fy";a:1:{i:0;s:10:"fríština";}s:2:"ga";a:1:{i:0;s:8:"irÅ¡tina";}s:2:"gd";a:1:{i:0;s:18:"skotská galÅ¡tina";}s:2:"gl";a:1:{i:0;s:12:"haliÄÅ¡tina";}s:2:"gn";a:1:{i:0;s:12:"guaranÅ¡tina";}s:2:"gu";a:1:{i:0;s:13:"gujaratÅ¡tina";}s:2:"ha";a:1:{i:0;s:5:"hausa";}s:2:"he";a:1:{i:0;s:12:"hebrejÅ¡tina";}s:2:"hi";a:1:{i:0;s:10:"hindÅ¡tina";}s:2:"hr";a:1:{i:0;s:13:"chorvatÅ¡tina";}s:2:"hu";a:1:{i:0;s:12:"maÄarÅ¡tina";}s:2:"hy";a:1:{i:0;s:12:"arménÅ¡tina";}s:2:"ia";a:1:{i:0;s:11:"interlingua";}s:2:"id";a:1:{i:0;s:13:"indonéština";}s:2:"ie";a:1:{i:0;s:11:"interlingue";}s:2:"ik";a:1:{i:0;s:13:"inupiakÅ¡tina";}s:2:"is";a:1:{i:0;s:12:"islandÅ¡tina";}s:2:"it";a:1:{i:0;s:10:"italÅ¡tina";}s:2:"iu";a:1:{i:0;s:15:"inuktitutÅ¡tina";}s:2:"ja";a:1:{i:0;s:11:"japonÅ¡tina";}s:2:"jv";a:1:{i:0;s:12:"javánÅ¡tina";}s:2:"ka";a:1:{i:0;s:13:"gruzínÅ¡tina";}s:2:"kk";a:1:{i:0;s:12:"kazachÅ¡tina";}s:2:"kl";a:1:{i:0;s:11:"grónÅ¡tina";}s:2:"km";a:1:{i:0;s:14:"kambodžština";}s:2:"kn";a:1:{i:0;s:12:"kannadÅ¡tina";}s:2:"ko";a:1:{i:0;s:11:"korejÅ¡tina";}s:2:"ks";a:1:{i:0;s:14:"kaÅ¡mírÅ¡tina";}s:2:"ku";a:1:{i:0;s:10:"kurdÅ¡tina";}s:2:"ky";a:1:{i:0;s:12:"kirgizÅ¡tina";}s:2:"la";a:1:{i:0;s:6:"latina";}s:2:"ln";a:1:{i:0;s:12:"lingalÅ¡tina";}s:2:"lo";a:1:{i:0;s:9:"laoÅ¡tina";}s:2:"lt";a:1:{i:0;s:11:"litevÅ¡tina";}s:2:
"lv";a:1:{i:0;s:10:"lotyÅ¡tina";}s:2:"mg";a:1:{i:0;s:11:"malgaÅ¡tina";}s:2:"mi";a:1:{i:0;s:10:"maorÅ¡tina";}s:2:"mk";a:1:{i:0;s:13:"makedonÅ¡tina";}s:2:"ml";a:1:{i:0;s:13:"malabarÅ¡tina";}s:2:"mn";a:1:{i:0;s:12:"mongolÅ¡tina";}s:2:"mo";a:1:{i:0;s:12:"moldavÅ¡tina";}s:2:"mr";a:1:{i:0;s:7:"marathi";}s:2:"ms";a:1:{i:0;s:11:"malajÅ¡tina";}s:2:"mt";a:1:{i:0;s:10:"maltÅ¡tina";}s:2:"my";a:1:{i:0;s:10:"barmÅ¡tina";}s:2:"na";a:1:{i:0;s:5:"nauru";}s:2:"ne";a:1:{i:0;s:12:"nepálÅ¡tina";}s:2:"nl";a:1:{i:0;s:12:"holandÅ¡tina";}s:2:"no";a:1:{i:0;s:9:"norÅ¡tina";}s:2:"oc";a:1:{i:0;s:7:"occitan";}s:2:"om";a:1:{i:0;s:12:"oromo (afan)";}s:2:"or";a:1:{i:0;s:5:"oriya";}s:2:"pa";a:1:{i:0;s:16:"paňdžábÅ¡tina";}s:2:"pl";a:1:{i:0;s:9:"polÅ¡tina";}s:2:"ps";a:1:{i:0;s:15:"pashto (pushto)";}s:2:"pt";a:1:{i:0;s:14:"portugalÅ¡tina";}s:2:"qu";a:1:{i:0;s:14:"keÄuánÅ¡tina";}s:2:"rm";a:1:{i:0;s:17:"rétorománÅ¡tina";}s:2:"rn";a:1:{i:0;s:7:"kirundi";}s:2:"ro";a:1:{i:0;s:11:"rumunÅ¡tina";}s:2:"ru";a:1:{i:0;s:8:"ruÅ¡tina";}s:2:"rw";a:1:{i:0;s:16:"kinyarwandÅ¡tina";}s:2:"sa";a:1:{i:0;s:7:"sanskrt";}s:2:"sd";a:1:{i:0;s:6:"sindhi";}s:2:"sg";a:1:{i:0;s:6:"sangho";}s:2:"sh";a:1:{i:0;s:17:"srbochorvatÅ¡tina";}s:2:"si";a:1:{i:0;s:13:"sinhálÅ¡tina";}s:2:"sk";a:1:{i:0;s:12:"slovenÅ¡tina";}s:2:"sl";a:1:{i:0;s:12:"slovinÅ¡tina";}s:2:"sm";a:1:{i:0;s:11:"samoyÅ¡tina";}s:2:"sn";a:1:{i:0;s:5:"shona";}s:2:"so";a:1:{i:0;s:12:"somálÅ¡tina";}s:2:"sq";a:1:{i:0;s:12:"albánÅ¡tina";}s:2:"sr";a:1:{i:0;s:9:"srbÅ¡tina";}s:2:"ss";a:1:{i:0;s:12:"siswatÅ¡tina";}s:2:"st";a:1:{i:0;s:7:"sesotho";}s:2:"su";a:1:{i:0;s:12:"sundanÅ¡tina";}s:2:"sv";a:1:{i:0;s:12:"Å¡védÅ¡tina";}s:2:"sw";a:1:{i:0;s:12:"svahilÅ¡tina";}s:2:"ta";a:1:{i:0;s:11:"tamilÅ¡tina";}s:2:"te";a:1:{i:0;s:11:"telugÅ¡tina";}s:2:"tg";a:1:{i:0;s:13:"tádžiÄtina";}s:2:"th";a:1:{i:0;s:10:"thajÅ¡tina";}s:2:"ti";a:1:{i:0;s:14:"tigrinijÅ¡tina";}s:2:"tk";a:1:{i:0;s:13:"turkmenÅ¡tina";}s:2:"tl";a:1:{i:0;s:7:"tagalog";}s:2:"tn";a:1:{i:0;s:13:"setswanÅ¡tina";}s:2:"to";a:1:{i:0;s:5:"tonga";}s:2:"tr";a:1:{i:0;s:10:"ture
Ätina";}s:2:"ts";a:1:{i:0;s:6:"tsonga";}s:2:"tt";a:1:{i:0;s:11:"tatarÅ¡tina";}s:2:"tw";a:1:{i:0;s:3:"twi";}s:2:"ug";a:1:{i:0;s:12:"uighurÅ¡tina";}s:2:"uk";a:1:{i:0;s:13:"ukrajinÅ¡tina";}s:2:"ur";a:1:{i:0;s:9:"urdÅ¡tina";}s:2:"uz";a:1:{i:0;s:10:"uzbeÄtina";}s:2:"vi";a:1:{i:0;s:13:"vietnamÅ¡tina";}s:2:"vo";a:1:{i:0;s:7:"volapuk";}s:2:"wo";a:1:{i:0;s:5:"wolof";}s:2:"xh";a:1:{i:0;s:5:"xhosa";}s:2:"yi";a:1:{i:0;s:6:"jidiÅ¡";}s:2:"yo";a:1:{i:0;s:6:"yoruba";}s:2:"za";a:1:{i:0;s:6:"zhuang";}s:2:"zh";a:1:{i:0;s:11:"ÄínÅ¡tina";}s:2:"zu";a:1:{i:0;s:4:"zulu";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:5:"Types";a:1:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:23:"Budhistický kalendář";}s:7:"chinese";a:1:{i:0;s:20:"Čínský kalendář";}s:9:"gregorian";a:1:{i:0;s:25:"Gregoriánský kalendář";}s:6:"hebrew";a:1:{i:0;s:21:"Hebrejský kalendář";}s:7:"islamic";a:1:{i:0;s:21:"Muslimský kalendář";}s:13:"islamic-civil";a:1:{i:0;s:32:"Muslimský obÄanský kalendář";}s:8:"japanese";a:1:{i:0;s:20:"Japonský kalendář";}}}s:7:"Version";a:1:{i:0;s:3:"1.3";}s:8:"calendar";a:1:{s:9:"gregorian";a:6:{s:11:"AmPmMarkers";a:2:{i:0;s:4:"dop.";i:1;s:4:"odp.";}s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:9:"H:mm:ss z";i:1;s:9:"H:mm:ss z";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:18:"EEEE, d. MMMM yyyy";i:5;s:12:"d. MMMM yyyy";i:6;s:8:"d.M.yyyy";i:7;s:6:"d.M.yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:2:"ne";i:1;s:2:"po";i:2;s:3:"út";i:3;s:2:"st";i:4;s:3:"Ät";i:5;s:3:"pá";i:6;s:2:"so";}s:4:"wide";a:7:{i:0;s:7:"nedÄ›le";i:1;s:9:"pondÄ›lí";i:2;s:7:"úterý";i:3;s:7:"stÅ™eda";i:4;s:8:"Ätvrtek";i:5;s:6:"pátek";i:6;s:6:"sobota";}s:6:"narrow";a:8:{i:0;s:7:"nedÄ›le";i:1;s:9:"pondÄ›lí";i:2;s:7:"úterý";i:3;s:7:"stÅ™eda";i:4;s:8:"Ätvrtek";i:5;s:6:"pátek";i:6;s
:6:"sobota";i:7;s:7:"nedÄ›le";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:8:"pÅ™. Kr.";i:1;s:6:"po Kr.";}}s:10:"monthNames";a:2:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:3:"led";i:1;s:4:"úno";i:2;s:4:"bÅ™e";i:3;s:3:"dub";i:4;s:4:"kvÄ›";i:5;s:4:"Ärn";i:6;s:4:"Ärc";i:7;s:3:"srp";i:8;s:5:"zář";i:9;s:5:"říj";i:10;s:3:"lis";i:11;s:3:"pro";}s:6:"narrow";a:12:{i:0;s:1:"l";i:1;s:2:"ú";i:2;s:1:"b";i:3;s:1:"d";i:4;s:1:"k";i:5;s:2:"Ä";i:6;s:2:"Ä";i:7;s:1:"s";i:8;s:1:"z";i:9;s:2:"Å™";i:10;s:1:"l";i:11;s:1:"p";}s:4:"wide";a:12:{i:0;s:5:"ledna";i:1;s:6:"února";i:2;s:7:"bÅ™ezna";i:3;s:5:"dubna";i:4;s:7:"kvÄ›tna";i:5;s:7:"Äervna";i:6;s:9:"Äervence";i:7;s:5:"srpna";i:8;s:7:"září";i:9;s:7:"října";i:10;s:9:"listopadu";i:11;s:8:"prosince";}}s:11:"stand-alone";a:3:{s:11:"abbreviated";a:12:{i:0;s:3:"led";i:1;s:4:"úno";i:2;s:4:"bÅ™e";i:3;s:3:"dub";i:4;s:4:"kvÄ›";i:5;s:4:"Ärn";i:6;s:4:"Ärc";i:7;s:3:"srp";i:8;s:5:"zář";i:9;s:5:"říj";i:10;s:3:"lis";i:11;s:3:"pro";}s:6:"narrow";a:12:{i:0;s:1:"l";i:1;s:2:"ú";i:2;s:1:"b";i:3;s:1:"d";i:4;s:1:"k";i:5;s:2:"Ä";i:6;s:2:"Ä";i:7;s:1:"s";i:8;s:1:"z";i:9;s:2:"Å™";i:10;s:1:"l";i:11;s:1:"p";}s:4:"wide";a:12:{i:0;s:5:"leden";i:1;s:5:"únor";i:2;s:7:"bÅ™ezen";i:3;s:5:"duben";i:4;s:7:"kvÄ›ten";i:5;s:7:"Äerven";i:6;s:9:"Äervenec";i:7;s:5:"srpen";i:8;s:7:"září";i:9;s:7:"říjen";i:10;s:8:"listopad";i:11;s:8:"prosinec";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GuMtkHmsSEDFwWahKzUeygAZ";}s:11:"zoneStrings";a:17:{i:0;a:6:{i:0;s:19:"America/Los_Angeles";i:1;s:27:"Pacifický standardní Äas";i:2;s:3:"PST";i:3;s:22:"Pacifický letní Äas";i:4;s:3:"PDT";i:5;s:11:"Los Angeles";}i:1;a:6:{i:0;s:14:"America/Denver";i:1;s:24:"Horský standardní Äas";i:2;s:3:"MST";i:3;s:19:"Horský letní Äas";i:4;s:3:"MDT";i:5;s:6:"Denver";}i:2;a:6:{i:0;s:15:"America/Phoenix";i:1;s:24:"Horský standardní Äas";i:2;s:3:"MST";i:3;s:24:"Horský standardní Äas";i:4;s:3:"MST";i:5;s:7:"Phoenix";}i:3;a:6:{i:0;s:15:"America/Chicago";i:1;s:28:"Centrální standardní Äas";i:2;s:3:"CST";i
:3;s:23:"Centrální letní Äas";i:4;s:3:"CDT";i:5;s:7:"Chicago";}i:4;a:6:{i:0;s:16:"America/New_York";i:1;s:27:"Východní standardní Äas";i:2;s:3:"EST";i:3;s:22:"Východní letní Äas";i:4;s:3:"EDT";i:5;s:8:"New York";}i:5;a:6:{i:0;s:20:"America/Indianapolis";i:1;s:27:"Východní standardní Äas";i:2;s:3:"EST";i:3;s:27:"Východní standardní Äas";i:4;s:3:"EST";i:5;s:12:"Indianapolis";}i:6;a:6:{i:0;s:16:"Pacific/Honolulu";i:1;s:26:"Havajský standardní Äas";i:2;s:3:"HST";i:3;s:26:"Havajský standardní Äas";i:4;s:3:"HST";i:5;s:8:"Honolulu";}i:7;a:6:{i:0;s:17:"America/Anchorage";i:1;s:27:"AljaÅ¡ský standardní Äas";i:2;s:3:"AST";i:3;s:22:"AljaÅ¡ský letní Äas";i:4;s:3:"ADT";i:5;s:9:"Anchorage";}i:8;a:6:{i:0;s:15:"America/Halifax";i:1;s:28:"Atlantický standardní Äas";i:2;s:3:"AST";i:3;s:23:"Atlantický letní Äas";i:4;s:3:"ADT";i:5;s:7:"Halifax";}i:9;a:6:{i:0;s:16:"America/St_Johns";i:1;s:33:"Newfoundlandský standardní Äas";i:2;s:3:"CNT";i:3;s:28:"Newfoundlandský letní Äas";i:4;s:3:"CDT";i:5;s:9:"St. Johns";}i:10;a:6:{i:0;s:12:"Europe/Paris";i:1;s:33:"StÅ™edoevropský standardní Äas";i:2;s:3:"CET";i:3;s:28:"StÅ™edoevropský letní Äas";i:4;s:4:"CEST";i:5;s:8:"Paříž";}i:11;a:6:{i:0;s:7:"Etc/GMT";i:1;s:28:"Greenwichský stÅ™ední Äas";i:2;s:3:"GMT";i:3;s:28:"Greenwichský stÅ™ední Äas";i:4;s:3:"GMT";i:5;s:7:"Londýn";}i:12;a:6:{i:0;s:17:"Africa/Casablanca";i:1;s:28:"Greenwichský stÅ™ední Äas";i:2;s:3:"GMT";i:3;s:28:"Greenwichský stÅ™ední Äas";i:4;s:3:"GMT";i:5;s:10:"Casablanca";}i:13;a:6:{i:0;s:14:"Asia/Jerusalem";i:1;s:27:"Izraelský standardní Äas";i:2;s:3:"IST";i:3;s:22:"Izraelský letní Äas";i:4;s:3:"IDT";i:5;s:10:"Jeruzalém";}i:14;a:6:{i:0;s:10:"Asia/Tokyo";i:1;s:26:"Japonský standardní Äas";i:2;s:3:"JST";i:3;s:26:"Japonský standardní Äas";i:4;s:3:"JST";i:5;s:5:"Tokio";}i:15;a:6:{i:0;s:16:"Europe/Bucharest";i:1;s:34:"Východoevropský standardní Äas";i:2;s:3:"EET";i:3;s:29:"Východoevropský letní Äas";i:4;s:4:"EEST";i:5;s:10:"BukureÅ¡Å¥";}i:16;a:6:{i:0;s:13
:"Asia/Shanghai";i:1;s:26:"Čínský standardní Äas";i:2;s:3:"CTT";i:3;s:26:"Čínský standardní Äas";i:4;s:3:"CDT";i:5;s:8:"Å anghaj";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cs_CZ.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cs_CZ.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cs_CZ.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:18:"#,##0.##;-#,##0.##";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cy.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cy.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cy.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:5:{s:9:"Countries";a:1:{s:2:"GB";a:1:{i:0;s:12:"Prydain Fawr";}}s:9:"Languages";a:1:{s:2:"cy";a:1:{i:0;s:7:"Cymraeg";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:3:"Sul";i:1;s:4:"Llun";i:2;s:3:"Maw";i:3;s:3:"Mer";i:4;s:3:"Iau";i:5;s:4:"Gwen";i:6;s:3:"Sad";}s:4:"wide";a:7:{i:0;s:8:"Dydd Sul";i:1;s:9:"Dydd Llun";i:2;s:11:"Dydd Mawrth";i:3;s:12:"Dydd Mercher";i:4;s:8:"Dydd Iau";i:5;s:11:"Dydd Gwener";i:6;s:11:"Dydd Sadwrn";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"Ion";i:1;s:5:"Chwef";i:2;s:6:"Mawrth";i:3;s:6:"Ebrill";i:4;s:3:"Mai";i:5;s:3:"Meh";i:6;s:5:"Gorff";i:7;s:4:"Awst";i:8;s:4:"Medi";i:9;s:3:"Hyd";i:10;s:4:"Tach";i:11;s:4:"Rhag";}s:4:"wide";a:12:{i:0;s:6:"Ionawr";i:1;s:8:"Chwefror";i:2;s:6:"Mawrth";i:3;s:6:"Ebrill";i:4;s:3:"Mai";i:5;s:7:"Mehefin";i:6;s:9:"Gorffenaf";i:7;s:4:"Awst";i:8;s:4:"Medi";i:9;s:6:"Hydref";i:10;s:8:"Tachwedd";i:11;s:7:"Rhagfyr";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cy_GB.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cy_GB.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/cy_GB.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:18:"EEEE, dd MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:10:"d MMM yyyy";i:7;s:10:"dd/MM/yyyy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/da.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/da.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/da.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:12:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:26:"Forenede Arabiske Emirater";}s:2:"AF";a:1:{i:0;s:11:"Afghanistan";}s:2:"AG";a:1:{i:0;s:18:"Antigua og Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:8:"Albanien";}s:2:"AM";a:1:{i:0;s:8:"Armenien";}s:2:"AN";a:1:{i:0;s:19:"Hollandske Antiller";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:9:"Antarktis";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:16:"Amerikansk Samoa";}s:2:"AT";a:1:{i:0;s:7:"Østrig";}s:2:"AU";a:1:{i:0;s:10:"Australien";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:12:"Aserbajdsjan";}s:2:"BA";a:1:{i:0;s:19:"Bosnien-Hercegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BE";a:1:{i:0;s:7:"Belgien";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:9:"Bulgarien";}s:2:"BH";a:1:{i:0;s:7:"Bahrain";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:17:"Brunei Darussalam";}s:2:"BO";a:1:{i:0;s:7:"Bolivia";}s:2:"BR";a:1:{i:0;s:9:"Brasilien";}s:2:"BS";a:1:{i:0;s:7:"Bahamas";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BV";a:1:{i:0;s:8:"Bouvetø";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:12:"Hviderusland";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Canada";}s:2:"CC";a:1:{i:0;s:28:"Cocos-øerne (Keelingøerne)";}s:2:"CD";a:1:{i:0;s:31:"Den Demokratiske Republik Congo";}s:2:"CF";a:1:{i:0;s:26:"Centralafrikanske Republik";}s:2:"CG";a:1:{i:0;s:5:"Congo";}s:2:"CH";a:1:{i:0;s:7:"Schweiz";}s:2:"CI";a:1:{i:0;s:15:"Elfenbenskysten";}s:2:"CK";a:1:{i:0;s:11:"Cook-øerne";}s:2:"CL";a:1:{i:0;s:5:"Chile";}s:2:"CM";a:1:{i:0;s:8:"Cameroun";}s:2:"CN";a:1:{i:0;s:4:"Kina";}s:2:"CO";a:1:{i:0;s:8:"Colombia";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:4:"Cuba";}s:2:"CV";a:1:{i:0;s:9:"Kap Verde";}s:2:"CX";a:1:{i:0;s:8:"Juleøen";}s:2:"CY";a:1:{i:0;s:6:"Cypern";}s:2:"CZ";a:1:{i:0;s:8:"Tjekkiet";}s:2:"DE";a:1:{i:0;s:8:"Tyskland";}s:2:"DJ";a:1:{i:0;s:8:"Djibouti";}s:2:"
DK";a:1:{i:0;s:7:"Danmark";}s:2:"DM";a:1:{i:0;s:8:"Dominica";}s:2:"DO";a:1:{i:0;s:25:"Den Dominikanske Republik";}s:2:"DZ";a:1:{i:0;s:8:"Algeriet";}s:2:"EC";a:1:{i:0;s:7:"Ecuador";}s:2:"EE";a:1:{i:0;s:7:"Estland";}s:2:"EG";a:1:{i:0;s:7:"Egypten";}s:2:"EH";a:1:{i:0;s:10:"Vestsahara";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:7:"Spanien";}s:2:"ET";a:1:{i:0;s:8:"Etiopien";}s:2:"FI";a:1:{i:0;s:7:"Finland";}s:2:"FJ";a:1:{i:0;s:11:"Fiji-øerne";}s:2:"FK";a:1:{i:0;s:15:"Falklandsøerne";}s:2:"FM";a:1:{i:0;s:28:"Mikronesiens Forenede Stater";}s:2:"FO";a:1:{i:0;s:10:"Færøerne";}s:2:"FR";a:1:{i:0;s:8:"Frankrig";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:14:"Storbritannien";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:8:"Georgien";}s:2:"GF";a:1:{i:0;s:13:"Fransk Guyana";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:9:"Grønland";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:17:"Ækvatorialguinea";}s:2:"GR";a:1:{i:0;s:11:"Grækenland";}s:2:"GS";a:1:{i:0;s:40:"South Georgia og De Sydlige Sandwichøer";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinea-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:12:"SAR Hongkong";}s:2:"HM";a:1:{i:0;s:25:"Heard- og McDonald-øerne";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:8:"Kroatien";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:6:"Ungarn";}s:2:"ID";a:1:{i:0;s:10:"Indonesien";}s:2:"IE";a:1:{i:0;s:6:"Irland";}s:2:"IL";a:1:{i:0;s:6:"Israel";}s:2:"IN";a:1:{i:0;s:6:"Indien";}s:2:"IO";a:1:{i:0;s:44:"Det Britiske Territorium i Det Indiske Ocean";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:6:"Island";}s:2:"IT";a:1:{i:0;s:7:"Italien";}s:2:"JM";a:1:{i:0;s:7:"Jamaica";}s:2:"JO";a:1:{i:0;s:6:"Jordan";}s:2:"JP";a:1:{i:0;s:5:"Japan";}s:2:"KE";a:1:{i:0;s:5:"Kenya";}s:2:"KG";a:1:{i:0;s:11:"Kirgisistan";}s:2:"KH";a:1:{i:0;s:8:"Cambodja";}s:2:"KI"
;a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:9:"Comorerne";}s:2:"KN";a:1:{i:0;s:20:"Saint Kitts og Nevis";}s:2:"KP";a:1:{i:0;s:9:"Nordkorea";}s:2:"KR";a:1:{i:0;s:8:"Sydkorea";}s:2:"KW";a:1:{i:0;s:6:"Kuwait";}s:2:"KY";a:1:{i:0;s:12:"Caymanøerne";}s:2:"KZ";a:1:{i:0;s:10:"Kasakhstan";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:7:"Libanon";}s:2:"LC";a:1:{i:0;s:11:"Saint Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberia";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:7:"Litauen";}s:2:"LU";a:1:{i:0;s:10:"Luxembourg";}s:2:"LV";a:1:{i:0;s:7:"Letland";}s:2:"LY";a:1:{i:0;s:6:"Libyen";}s:2:"MA";a:1:{i:0;s:7:"Marokko";}s:2:"MC";a:1:{i:0;s:6:"Monaco";}s:2:"MD";a:1:{i:0;s:19:"Republikken Moldova";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:14:"Marshalløerne";}s:2:"MK";a:1:{i:0;s:22:"Republikken Makedonien";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:9:"Mongoliet";}s:2:"MO";a:1:{i:0;s:9:"SAR Macao";}s:2:"MP";a:1:{i:0;s:14:"Nordmarianerne";}s:2:"MQ";a:1:{i:0;s:10:"Martinique";}s:2:"MR";a:1:{i:0;s:11:"Mauretanien";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:10:"Maldiverne";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:6:"Mexico";}s:2:"MY";a:1:{i:0;s:8:"Malaysia";}s:2:"MZ";a:1:{i:0;s:10:"Mozambique";}s:2:"NA";a:1:{i:0;s:7:"Namibia";}s:2:"NC";a:1:{i:0;s:13:"Ny Caledonien";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:14:"Norfolk Island";}s:2:"NG";a:1:{i:0;s:7:"Nigeria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:7:"Holland";}s:2:"NO";a:1:{i:0;s:5:"Norge";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:11:"New Zealand";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:17:"Fransk Polynesien";}s:2:"PG";a:1:{i:0;s:15:"Papua Ny Guinea";}s:2:"PH";a:1:{i:0;s:12:"Filippinerne";}
s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:5:"Polen";}s:2:"PM";a:1:{i:0;s:24:"Saint Pierre og Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:11:"Puerto Rico";}s:2:"PS";a:1:{i:0;s:28:"De palæstinensiske områder";}s:2:"PT";a:1:{i:0;s:8:"Portugal";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Qatar";}s:2:"RE";a:1:{i:0;s:7:"Reunion";}s:2:"RO";a:1:{i:0;s:9:"Rumænien";}s:2:"RU";a:1:{i:0;s:7:"Rusland";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:13:"Saudi-Arabien";}s:2:"SB";a:1:{i:0;s:13:"Salomonøerne";}s:2:"SC";a:1:{i:0;s:12:"Seychellerne";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:7:"Sverige";}s:2:"SG";a:1:{i:0;s:9:"Singapore";}s:2:"SH";a:1:{i:0;s:10:"St. Helena";}s:2:"SI";a:1:{i:0;s:9:"Slovenien";}s:2:"SJ";a:1:{i:0;s:21:"Svalbard og Jan Mayen";}s:2:"SK";a:1:{i:0;s:9:"Slovakiet";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:7:"Somalia";}s:2:"SP";a:1:{i:0;s:7:"Serbien";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:23:"São Tomé og Príncipe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:6:"Syrien";}s:2:"SZ";a:1:{i:0;s:9:"Swaziland";}s:2:"TC";a:1:{i:0;s:22:"Turks- og Caicosøerne";}s:2:"TD";a:1:{i:0;s:5:"Tchad";}s:2:"TF";a:1:{i:0;s:47:"Franske Besiddelser i Det Sydlige Indiske Ocean";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:8:"Thailand";}s:2:"TJ";a:1:{i:0;s:12:"Tadsjikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:11:"Timor-Leste";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:8:"Tunesien";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:7:"Tyrkiet";}s:2:"TT";a:1:{i:0;s:18:"Trinidad og Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Taiwan";}s:2:"TZ";a:1:{i:0;s:8:"Tanzania";}s:2:"UA";a:1:{i:0;s:7:"Ukraine";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:38:"De Mindre Amerikanske Oversøiske Øer";}s:2:"US";a:1:{i:0;s:3:"USA";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"U
Z";a:1:{i:0;s:10:"Usbekistan";}s:2:"VA";a:1:{i:0;s:13:"Vatikanstaten";}s:2:"VC";a:1:{i:0;s:27:"St. Vincent og Grenadinerne";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:22:"De britiske jomfruøer";}s:2:"VI";a:1:{i:0;s:25:"De amerikanske jomfruøer";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:22:"Wallis og Futunaøerne";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Yemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:11:"Jugoslavien";}s:2:"ZA";a:1:{i:0;s:9:"Sydafrika";}s:2:"ZM";a:1:{i:0;s:6:"Zambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:346:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:16:"Andorransk diner";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:17:"Andorransk peseta";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:40:"Dirham fra de Forenede Arabiske Emirater";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:21:"Affars og Issas franc";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:23:"Albansk lek (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:11:"Albansk lek";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:11:"Albansk lek";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:12:"Armensk dram";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:35:"Gylden fra De Nederlandske Antiller";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:16:"Angolansk kwanza";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:28:"Angolansk kwanza (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:31:"Ny angolansk kwanza (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:39:"Angolansk kwanza reajustado (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:16:"Angolansk escudo";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:18:"Argentinsk austral";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:31:"Argentinsk peso moneda nacional";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:27:"Argentinsk peso (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:15:"Argentinsk peso";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:19:"Østrigsk schilling";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:16:"Australsk dollar";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:14:"Australsk pund";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:15:"Arubansk gylden";}s:3:"AZM";a:2:
{i:0;s:3:"AZM";i:1;s:20:"Aserbajdsjansk manat";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:26:"Bosnien-Hercegovinsk dinar";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:37:"Bosnien-Hercegovinsk konvertibel mark";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:29:"Ny bosnien-hercegovinsk dinar";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:16:"Barbadisk dollar";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:18:"Bangladeshisk taka";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:27:"Belgisk franc (konvertibel)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:13:"Belgisk franc";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:25:"Belgisk franc (financial)";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:17:"Bulgarsk hard lev";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:22:"Bulgarsk socialist lev";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:15:"Ny Bulgarsk lev";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:24:"Bulgarsk lev (1879-1952)";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:15:"Bahrainsk dinar";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:15:"Burundisk franc";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:17:"Bermudansk dollar";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:15:"Bermudansk pund";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:15:"Bruneisk dollar";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:15:"Boliviansk peso";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:16:"Boliviansk mvdol";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:37:"Brasiliansk cruzeiro novo (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:19:"Brasiliansk cruzado";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:32:"Brasiliansk cruzeiro (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:16:"Brasiliansk real";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:24:"Brasiliansk cruzado novo";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:20:"Brasiliansk cruzeiro";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:32:"Brasiliansk cruzeiro (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:16:"Bahamansk dollar";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:14:"Bahamansk pund";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:17:"Bhutansk ngultrum";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:14:"Bhutansk rupee";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:14:"Burmesisk kyat";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:15:"Burmesisk rupee";}s:3:"BWP";a:2
:{i:0;s:3:"BWP";i:1;s:14:"Botswansk pula";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:33:"Ny hviderussisk rubel (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:30:"Hviderussisk rubel (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:18:"Hviderussisk rubel";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:15:"Belizisk dollar";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:23:"Britisk Honduras dollar";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:15:"Canadisk dollar";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:27:"Congolesisk franc congolais";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:17:"Congolesisk franc";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:17:"Congolesisk Zaire";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:44:"CFA-franc fra den Centralafrikanske republik";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:16:"Schweizisk franc";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:21:"Dollar fra Cookøerne";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:15:"Chilensk condor";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:15:"Chilensk escudo";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:28:"Chilensk unidades de fomento";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:13:"Chilensk peso";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:20:"Camerounsk CFA-franc";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:26:"Kinesisk jen min piao yuan";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:22:"Kinesisk yuan renminbi";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:21:"Colombiansk papirpeso";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:21:"Congolesisk CFA-franc";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:16:"Colombiansk peso";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:18:"Costaricansk colon";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:22:"Tjekkoslovakisk koruna";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:27:"Tjekkoslovakisk hard koruna";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:12:"Cubansk peso";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:17:"Kapverdisk escudo";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:16:"Curacaosk gylden";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:15:"Cypriotisk pund";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:15:"Tjekkisk koruna";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:13:"Østtysk mark";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:9:"Tysk mark";}s:3:"DES";a:2:{i:0;s:3:"D
ES";i:1;s:14:"Tysk sperrmark";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:16:"Djiboutisk franc";}s:3:"DKK";a:2:{i:0;s:2:"kr";i:1;s:11:"Dansk krone";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:16:"Dominikansk peso";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:14:"Algerisk dinar";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:17:"Ny algerisk franc";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:23:"Algerisk franc germinal";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:18:"Ecuadoriansk sucre";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:12:"Estisk kroon";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:13:"Egyptisk pund";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:15:"Eritreisk nakfa";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:13:"Spansk peseta";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:13:"Etiopisk birr";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:15:"Etiopisk dollar";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"Euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:10:"Finsk mark";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:22:"Finsk mark (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:15:"Fijiansk dollar";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:13:"Fijiansk pund";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:24:"Pund fra Falklandsøerne";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:14:"Færøsk krone";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:12:"Fransk franc";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:20:"Gabonesisk CFA-franc";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:12:"Britisk pund";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:20:"Georgisk kupon larit";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:13:"Georgisk lari";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:14:"Ghanesisk cedi";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:21:"Gammel ghanesisk cedi";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:14:"Ghanesisk pund";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:25:"Ghanesisk revalueret cedi";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:17:"Gibraltarisk pund";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:17:"Grønlandsk krone";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:14:"Gambisk dalasi";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:12:"Gambisk pund";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:15:"Guineansk franc";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:27:"Guineansk franc (1960-1972)";}s:3
:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:14:"Guineansk syli";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:17:"Guadeloupsk franc";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:35:"Ækvatorialguineask ekwele guineana";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:26:"Ækvatorialguineask franco";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:35:"Ækvatorialguineask peseta guineana";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:14:"Græsk drachma";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:17:"Ny græsk drachma";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:20:"Guatemalansk quetzal";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:27:"Fransk-guyansk franc guiana";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:25:"Portugisisk guinea escudo";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:27:"Portugisisk guinea mil reis";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:14:"Guineansk peso";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:14:"Guyansk dollar";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:18:"Honduransk lempira";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:14:"Kroatisk dinar";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:13:"Kroatisk kuna";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:14:"Haitisk gourde";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:14:"Ungarsk forint";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:13:"Nordirsk pund";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:23:"Indonesisk nica guilder";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:22:"Indonesisk java rupiah";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:20:"Ny indonesisk rupiah";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:17:"Indonesisk pupiah";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:9:"Irsk pund";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:15:"Israelsk shekel";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:13:"Israelsk pund";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:18:"Ny israelsk shekel";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:12:"Indisk rupee";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:13:"Irakisk dinar";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:11:"Iransk rial";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:14:"Islandsk krona";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:14:"Italiensk lira";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:15:"Pund fra Jersey";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:17:"Jamaicansk dollar";}s:3:"JMP";a:2
:{i:0;s:3:"JMP";i:1;s:15:"Jamaicansk pund";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:14:"Jordansk dinar";}s:3:"JPY";a:2:{i:0;s:2:"¥";i:1;s:11:"Japansk yen";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:17:"Kenyansk shilling";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:13:"Kirgisisk som";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:23:"Gammel cambodjansk riel";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:16:"Cambodjansk riel";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:14:"Comorisk franc";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:16:"Nordkoreansk won";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:16:"Sydkoreansk hwan";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:22:"Gammel sydkoreansk won";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:15:"Sydkoreansk won";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:15:"Kuwaitisk dinar";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:23:"Dollar fra Caymanøerne";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:15:"Kasakhisk rubel";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:15:"Kasakhisk tenge";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:11:"Laotisk kip";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:15:"Libanesisk pund";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:21:"Liechtensteinsk franc";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:17:"Srilankansk rupee";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:17:"Ceylonesisk rupee";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:15:"Liberisk dollar";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:14:"Lesothisk loti";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:13:"Litauisk lita";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:16:"Litauisk talonas";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:18:"Luxembourgsk franc";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:12:"Lettisk lats";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:13:"Lettisk rubel";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:12:"Libysk dinar";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:11:"Libysk pund";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:17:"Marokkansk dirham";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:16:"Marokkansk franc";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:20:"Ny monegaskisk franc";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:26:"Monegaskisk franc germinal";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:19:"Moldovisk leu cupon";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:1
3:"Moldovisk leu";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:21:"Moldovisk ruble cupon";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:18:"Madagaskisk ariary";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:17:"Madagaskisk franc";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:25:"Dollar fra Marshalløerne";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:15:"Makedonsk denar";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:27:"Makedonsk denar (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:12:"Malisk franc";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:14:"Myanmarsk kyat";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:15:"Mongolsk tugrik";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:14:"Macaosk pataca";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:18:"Martiniquisk franc";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:18:"Mauritansk ouguiya";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:14:"Maltesisk lira";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:14:"Maltesisk pund";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:15:"Mauritisk rupee";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:15:"Maldivisk rupee";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:17:"Maldivisk rufiyaa";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:15:"Malawisk kwacha";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:13:"Malawisk pund";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:14:"Mexicansk peso";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:33:"Mexicansk silver peso (1861-1992)";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:17:"Malaysisk ringgit";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:19:"Mozambiquisk escudo";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:20:"Mozambiquisk metical";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:15:"Namibisk dollar";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:26:"Nykaledonsk franc germinal";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:16:"Nigeriansk naira";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:15:"Nigeriansk pund";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:27:"CFP-franc fra Ny-Hebriderne";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:20:"Nicaraguansk cordoba";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:25:"Nicaraguansk gold cordoba";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:24:"Nicaraguansk cordoba oro";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:17:"Hollandsk guilder";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:11:"Nor
sk krone";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:16:"Nepalesisk rupee";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:20:"New Zealandsk dollar";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:18:"New Zealandsk pund";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:11:"Omansk rial";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:17:"Omansk rial saidi";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:16:"Panamansk balboa";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:26:"Transdniestrisk rubelkupon";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:24:"Ny transdniestrisk rubel";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:21:"Transdniestrisk rubel";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:15:"Peruviansk inti";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:20:"Peruviansk sol nuevo";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:14:"Peruviansk sol";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:13:"Papuansk kina";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:15:"Filippinsk peso";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:16:"Pakistansk rupee";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:11:"Polsk zloty";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:23:"Polsk zloty (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:20:"Palæstinensisk pund";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:17:"Portugisisk conto";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:18:"Portugisisk escudo";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:18:"Paraguaysk guarani";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:12:"Qatarsk rial";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:12:"Rumænsk leu";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:15:"Ny rumænsk leu";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:13:"Russisk rubel";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:25:"Russisk rubel (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:14:"Rwandisk franc";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:13:"Saudisk riyal";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:23:"Saudisk sovereign riyal";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:16:"Salomonsk dollar";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:17:"Seychellisk rupee";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:13:"Sudansk dinar";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:12:"Sudansk pund";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:12:"Svensk krona";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:20:"Singapore
ansk dollar";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:21:"Pund fra Saint Helena";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:19:"Slovensk tolar bons";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:14:"Slovensk tolar";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:16:"Slovakisk koruna";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:18:"Sierraleonsk leone";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:19:"Lira fra San Marino";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:17:"Somalisk shilling";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:20:"Somalilands shilling";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:17:"Surinamsk guilder";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:11:"Skotsk pund";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:30:"Dobra fra Sao Tome og Principe";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:31:"Escudo fra Sao Tome og Principe";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:18:"Ny sovjetisk rubel";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:15:"Sovjetisk rubel";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:18:"Salvadoransk colon";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:11:"Syrisk pund";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:21:"Swazilandsk lilangeni";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:18:"Tchadisk CFA-franc";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:15:"Thailandsk baht";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:16:"Tadsjikisk rubel";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:17:"Tadsjikisk somoni";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:15:"Turkmensk manat";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:14:"Tunesisk dinar";}s:3:"TOP";a:2:{i:0;s:2:"T$";i:1;s:16:"Tongask paʻanga";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:12:"Tongask pund";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:16:"Escudo fra Timor";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:16:"Pataca fra Timor";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:12:"Tyrkisk lira";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:29:"Dollar fra Trinidad og Tobago";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:36:"Gammel dollar fra Trinidad og Tobago";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:17:"Tuvaluansk dollar";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:18:"Ny taiwansk dollar";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:18:"Tanzanisk shilling";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:15:"Ukrainsk gr
ynia";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:20:"Ukrainsk karbovanetz";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:29:"Ugandisk shilling (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:17:"Ugandisk shilling";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:18:"Amerikanske dollar";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:30:"Amerikansk dollar (næste dag)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:29:"Amerikansk dollar (samme dag)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:21:"Uruguaysk peso fuerte";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:26:"Uruguaysk peso (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:23:"Uruguaysk peso uruguayo";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:19:"Usbekisk coupon som";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:12:"Usbekisk sum";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:14:"Vatikansk lira";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:34:"Nordvietnamesisk piastre dong viet";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:24:"Ny nordvietnamesisk dong";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:44:"Nordvietnamesisk viet minh piastre dong viet";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:20:"Venezuelansk bolivar";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:33:"Dollar fra De Britiske Jomfruøer";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:17:"Vietnamesisk dong";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:20:"Ny vietnamesisk dong";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:30:"Vietnamesisk republikansk dong";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:26:"Vietnamesisk national dong";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:13:"Vanuaisk vatu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:13:"Samoansk pund";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:13:"Samoansk tala";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:17:"Beninsk CFA-franc";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:4:"Guld";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:21:"Øst-karaibisk dollar";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:16:"Fransk guldfranc";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:16:"Fransk UIC-franc";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:14:"Islamisk dinar";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:9:"CFP-franc";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:16:"Yemenitisk dinar";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:22:"Ye
menitisk imadi riyal";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:15:"Yemenitisk rial";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:22:"Jugoslavisk hard dinar";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:28:"Jugoslavisk federation dinar";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:22:"Jugoslavisk 1994 dinar";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:23:"Jugoslavisk noviy dinar";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:29:"Jugoslavisk convertible dinar";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:25:"Jugoslavisk october dinar";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:26:"Jugoslavisk reformed dinar";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:29:"Sydafrikansk rand (financial)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:17:"Sydafrikansk pund";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:17:"Sydafrikansk rand";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:14:"Zambisk kwacha";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:12:"Zambisk pund";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:16:"Ny zairisk zaire";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:13:"Zairisk naire";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:17:"Zimbabwisk dollar";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:8:"Kalender";}s:9:"collation";a:1:{i:0;s:9:"Sortering";}s:8:"currency";a:1:{i:0;s:6:"Valuta";}}s:9:"Languages";a:455:{s:2:"aa";a:1:{i:0;s:4:"Afar";}s:2:"ab";a:1:{i:0;s:9:"Abkhasisk";}s:3:"ace";a:1:{i:0;s:10:"Achinesisk";}s:3:"ach";a:1:{i:0;s:5:"Acoli";}s:3:"ada";a:1:{i:0;s:7:"Adangme";}s:3:"ady";a:1:{i:0;s:6:"Adyghe";}s:2:"ae";a:1:{i:0;s:7:"Avestan";}s:2:"af";a:1:{i:0;s:9:"Afrikaans";}s:3:"afa";a:1:{i:0;s:23:"Afro-asiatisk (øvrige)";}s:3:"afh";a:1:{i:0;s:8:"Afrihili";}s:2:"ak";a:1:{i:0;s:4:"Akan";}s:3:"akk";a:1:{i:0;s:8:"Akkadisk";}s:3:"ale";a:1:{i:0;s:15:"Aleutiske sprog";}s:3:"alg";a:1:{i:0;s:16:"Algonkiske sprog";}s:2:"am";a:1:{i:0;s:8:"Amharisk";}s:2:"an";a:1:{i:0;s:11:"Aragonesisk";}s:3:"ang";a:1:{i:0;s:26:"Angelsaksisk (ca.450-1100)";}s:3:"apa";a:1:{i:0;s:12:"Apache sprog";}s:2:"ar";a:1:{i:0;s:7:"Arabisk";}s:3:"arc";a:1:{i:0;s:9:"Aramæisk";}s:3:"arn";a:1:{i:0;s:9:"Araukansk";}s:3:"arp";a:1:{i:0;s:7:"Arapaho";}s:3:"art";a:1:{i:0;s:20:"Kunstsprog (øvrige)";}s:3:"arw"
;a:1:{i:0;s:6:"Arawak";}s:2:"as";a:1:{i:0;s:10:"Assamesisk";}s:3:"ast";a:1:{i:0;s:8:"Asturisk";}s:3:"aus";a:1:{i:0;s:16:"Australske sprog";}s:2:"av";a:1:{i:0;s:7:"Avarisk";}s:3:"awa";a:1:{i:0;s:6:"Awadhi";}s:2:"ay";a:1:{i:0;s:6:"Aymara";}s:2:"az";a:1:{i:0;s:12:"Aserbajdsjan";}s:2:"ba";a:1:{i:0;s:7:"Bashkir";}s:3:"bad";a:1:{i:0;s:5:"Banda";}s:3:"bal";a:1:{i:0;s:7:"Baluchi";}s:3:"ban";a:1:{i:0;s:10:"Balinesisk";}s:3:"bas";a:1:{i:0;s:4:"Basa";}s:3:"bat";a:1:{i:0;s:24:"Baltiske sprog (øvrige)";}s:2:"be";a:1:{i:0;s:12:"Hviderussisk";}s:3:"bej";a:1:{i:0;s:4:"Beja";}s:3:"bem";a:1:{i:0;s:5:"Bemba";}s:3:"ber";a:1:{i:0;s:16:"Berberiske sprog";}s:2:"bg";a:1:{i:0;s:8:"Bulgarsk";}s:2:"bh";a:1:{i:0;s:6:"Bihari";}s:3:"bho";a:1:{i:0;s:8:"Bhojpuri";}s:2:"bi";a:1:{i:0;s:7:"Bislama";}s:3:"bik";a:1:{i:0;s:5:"Bikol";}s:3:"bin";a:1:{i:0;s:4:"Bini";}s:3:"bla";a:1:{i:0;s:7:"Siksika";}s:2:"bm";a:1:{i:0;s:7:"Bambara";}s:2:"bn";a:1:{i:0;s:8:"Bengalsk";}s:3:"bnt";a:1:{i:0;s:5:"Bantu";}s:2:"bo";a:1:{i:0;s:9:"Tibetansk";}s:2:"br";a:1:{i:0;s:8:"Bretonsk";}s:3:"bra";a:1:{i:0;s:4:"Braj";}s:2:"bs";a:1:{i:0;s:7:"Bosnisk";}s:3:"btk";a:1:{i:0;s:5:"Batak";}s:3:"bua";a:1:{i:0;s:6:"Buriat";}s:3:"bug";a:1:{i:0;s:10:"Buginesisk";}s:3:"byn";a:1:{i:0;s:4:"Blin";}s:2:"ca";a:1:{i:0;s:9:"Katalansk";}s:3:"cad";a:1:{i:0;s:5:"Caddo";}s:3:"cai";a:1:{i:0;s:43:"Mellemamerikanske indianske sprog (øvrige)";}s:3:"car";a:1:{i:0;s:8:"Caribisk";}s:3:"cau";a:1:{i:0;s:26:"Kaukasiske sprog (øvrige)";}s:2:"ce";a:1:{i:0;s:9:"Tjetjensk";}s:3:"ceb";a:1:{i:0;s:7:"Cebuano";}s:3:"cel";a:1:{i:0;s:24:"Keltiske sprog (øvrige)";}s:2:"ch";a:1:{i:0;s:8:"Chamorro";}s:3:"chb";a:1:{i:0;s:7:"Chibcha";}s:3:"chg";a:1:{i:0;s:8:"Chagatai";}s:3:"chk";a:1:{i:0;s:8:"Chuukese";}s:3:"chm";a:1:{i:0;s:4:"Mari";}s:3:"chn";a:1:{i:0;s:7:"Chinook";}s:3:"cho";a:1:{i:0;s:7:"Choctaw";}s:3:"chp";a:1:{i:0;s:9:"Chipewyan";}s:3:"chr";a:1:{i:0;s:8:"Cherokee";}s:3:"chy";a:1:{i:0;s:8:"Cheyenne";}s:3:"cmc";a:1:{i:0;s:12:"Chamic sprog";}s:2:"co";a:1:{i:0;s:10:"Korsikansk";}s:3:"cop";a:1:{i:0;s:7:"Koptisk";}s:3:"c
pe";a:1:{i:0;s:48:"Kreolsk og pidgin, baseret på engelsk (øvrige)";}s:3:"cpf";a:1:{i:0;s:47:"Kreolsk og pidgin, baseret på fransk (øvrige)";}s:3:"cpp";a:1:{i:0;s:52:"Kreolsk og pidgin, baseret på portugisisk (øvrige)";}s:2:"cr";a:1:{i:0;s:4:"Cree";}s:3:"crh";a:1:{i:0;s:27:"Krim-tyrkisk; Krim-tatarisk";}s:3:"crp";a:1:{i:0;s:27:"Kreolsk og pidgin (øvrige)";}s:2:"cs";a:1:{i:0;s:8:"Tjekkisk";}s:3:"csb";a:1:{i:0;s:9:"Kashubian";}s:2:"cu";a:1:{i:0;s:12:"Kirkeslavisk";}s:3:"cus";a:1:{i:0;s:26:"Kusjitiske sprog (øvrige)";}s:2:"cv";a:1:{i:0;s:7:"Chuvash";}s:2:"cy";a:1:{i:0;s:8:"Walisisk";}s:2:"da";a:1:{i:0;s:5:"Dansk";}s:3:"dak";a:1:{i:0;s:6:"Dakota";}s:3:"dar";a:1:{i:0;s:6:"Dargwa";}s:3:"day";a:1:{i:0;s:5:"Dayak";}s:2:"de";a:1:{i:0;s:4:"Tysk";}s:3:"del";a:1:{i:0;s:8:"Delaware";}s:3:"den";a:1:{i:0;s:18:"Slave (Athapascan)";}s:3:"dgr";a:1:{i:0;s:6:"Dogrib";}s:3:"din";a:1:{i:0;s:5:"Dinka";}s:3:"doi";a:1:{i:0;s:5:"Dogri";}s:3:"dra";a:1:{i:0;s:26:"Dravidiske sprog (øvrige)";}s:3:"dsb";a:1:{i:0;s:13:"Nedre sorbisk";}s:3:"dua";a:1:{i:0;s:5:"Duala";}s:3:"dum";a:1:{i:0;s:25:"Hollandsk (ca. 1050-1350)";}s:2:"dv";a:1:{i:0;s:6:"Divehi";}s:3:"dyu";a:1:{i:0;s:5:"Dyula";}s:2:"dz";a:1:{i:0;s:8:"Dzongkha";}s:2:"ee";a:1:{i:0;s:3:"Ewe";}s:3:"efi";a:1:{i:0;s:4:"Efik";}s:3:"egy";a:1:{i:0;s:17:"Egyptisk (oldtid)";}s:3:"eka";a:1:{i:0;s:6:"Ekajuk";}s:2:"el";a:1:{i:0;s:6:"Græsk";}s:3:"elx";a:1:{i:0;s:9:"Elamitisk";}s:2:"en";a:1:{i:0;s:7:"Engelsk";}s:3:"enm";a:1:{i:0;s:28:"Engelsk, Middel- (1100-1500)";}s:2:"eo";a:1:{i:0;s:9:"Esperanto";}s:2:"es";a:1:{i:0;s:6:"Spansk";}s:2:"et";a:1:{i:0;s:6:"Estisk";}s:2:"eu";a:1:{i:0;s:7:"Baskisk";}s:3:"ewo";a:1:{i:0;s:6:"Ewondo";}s:2:"fa";a:1:{i:0;s:7:"Persisk";}s:3:"fan";a:1:{i:0;s:4:"Fang";}s:3:"fat";a:1:{i:0;s:5:"Fanti";}s:2:"ff";a:1:{i:0;s:5:"Fulah";}s:2:"fi";a:1:{i:0;s:5:"Finsk";}s:3:"fiu";a:1:{i:0;s:29:"Finsk-ugriske sprog (øvrige)";}s:2:"fj";a:1:{i:0;s:6:"Fijian";}s:2:"fo";a:1:{i:0;s:8:"Færøsk";}s:3:"fon";a:1:{i:0;s:3:"Fon";}s:2:"fr";a:1:{i:0;s:6:"Fransk";}s:3:"frm";a:1:{i:0;s:30:"Fransk, Mi
ddel- (ca.1400-1600)";}s:3:"fro";a:1:{i:0;s:26:"Fransk, Old- (842-ca.1400)";}s:3:"fur";a:1:{i:0;s:8:"Friulian";}s:2:"fy";a:1:{i:0;s:7:"Frisisk";}s:2:"ga";a:1:{i:0;s:4:"Irsk";}s:3:"gaa";a:1:{i:0;s:2:"Ga";}s:3:"gay";a:1:{i:0;s:4:"Gayo";}s:3:"gba";a:1:{i:0;s:5:"Gbaya";}s:2:"gd";a:1:{i:0;s:16:"Gælisk (skotsk)";}s:3:"gem";a:1:{i:0;s:25:"Germanske sprog (øvrige)";}s:3:"gez";a:1:{i:0;s:4:"Geez";}s:3:"gil";a:1:{i:0;s:12:"Gilbertesisk";}s:2:"gl";a:1:{i:0;s:8:"Galicisk";}s:3:"gmh";a:1:{i:0;s:32:"Tysk, Middelhøj- (ca.1050-1500)";}s:2:"gn";a:1:{i:0;s:7:"Guarani";}s:3:"goh";a:1:{i:0;s:28:"Tysk, Oldhøj- (ca.750-1050)";}s:3:"gon";a:1:{i:0;s:5:"Gondi";}s:3:"gor";a:1:{i:0;s:9:"Gorontalo";}s:3:"got";a:1:{i:0;s:6:"Gotisk";}s:3:"grb";a:1:{i:0;s:5:"Grebo";}s:3:"grc";a:1:{i:0;s:23:"Græsk, Old- (til 1453)";}s:2:"gu";a:1:{i:0;s:10:"Gujaratisk";}s:2:"gv";a:1:{i:0;s:4:"Manx";}s:3:"gwi";a:1:{i:0;s:9:"Gwichʻin";}s:2:"ha";a:1:{i:0;s:5:"Hausa";}s:3:"hai";a:1:{i:0;s:5:"Haida";}s:3:"haw";a:1:{i:0;s:10:"Hawaiiansk";}s:2:"he";a:1:{i:0;s:8:"Hebraisk";}s:2:"hi";a:1:{i:0;s:5:"Hindi";}s:3:"hil";a:1:{i:0;s:10:"Hiligaynon";}s:3:"him";a:1:{i:0;s:9:"Himachali";}s:3:"hit";a:1:{i:0;s:9:"Hittitisk";}s:3:"hmn";a:1:{i:0;s:5:"Hmong";}s:2:"ho";a:1:{i:0;s:9:"Hiri Motu";}s:2:"hr";a:1:{i:0;s:8:"Kroatisk";}s:3:"hsb";a:1:{i:0;s:13:"Øvre sorbisk";}s:2:"ht";a:1:{i:0;s:7:"Haitisk";}s:2:"hu";a:1:{i:0;s:7:"Ungarsk";}s:3:"hup";a:1:{i:0;s:4:"Hupa";}s:2:"hy";a:1:{i:0;s:7:"Armensk";}s:2:"hz";a:1:{i:0;s:6:"Herero";}s:2:"ia";a:1:{i:0;s:11:"Interlingua";}s:3:"iba";a:1:{i:0;s:4:"Iban";}s:2:"id";a:1:{i:0;s:10:"Indonesisk";}s:2:"ie";a:1:{i:0;s:11:"Interlingue";}s:2:"ig";a:1:{i:0;s:4:"Igbo";}s:2:"ii";a:1:{i:0;s:10:"Sichuan Yi";}s:3:"ijo";a:1:{i:0;s:3:"Ijo";}s:2:"ik";a:1:{i:0;s:7:"Inupiaq";}s:3:"ilo";a:1:{i:0;s:5:"Iloko";}s:3:"inc";a:1:{i:0;s:23:"Indiske sprog (øvrige)";}s:3:"ine";a:1:{i:0;s:31:"Indoeuropæiske sprog (øvrige)";}s:3:"inh";a:1:{i:0;s:6:"Ingush";}s:2:"io";a:1:{i:0;s:3:"Ido";}s:3:"ira";a:1:{i:0;s:23:"Iranske sprog (øvrige)";}s:3:"iro";a:1:{i:0;s:16:"Irokesiske
 sprog";}s:2:"is";a:1:{i:0;s:8:"Islandsk";}s:2:"it";a:1:{i:0;s:9:"Italiensk";}s:2:"iu";a:1:{i:0;s:9:"Inuktitut";}s:2:"ja";a:1:{i:0;s:7:"Japansk";}s:3:"jbo";a:1:{i:0;s:6:"Lojban";}s:3:"jpr";a:1:{i:0;s:15:"Jødisk-persisk";}s:3:"jrb";a:1:{i:0;s:15:"Jødisk-arabisk";}s:2:"jv";a:1:{i:0;s:10:"Javanesisk";}s:2:"ka";a:1:{i:0;s:8:"Georgisk";}s:3:"kaa";a:1:{i:0;s:13:"Karakalpakisk";}s:3:"kab";a:1:{i:0;s:6:"Kabyle";}s:3:"kac";a:1:{i:0;s:6:"Kachin";}s:3:"kam";a:1:{i:0;s:5:"Kamba";}s:3:"kar";a:1:{i:0;s:5:"Karen";}s:3:"kaw";a:1:{i:0;s:4:"Kawi";}s:3:"kbd";a:1:{i:0;s:9:"Kabardian";}s:2:"kg";a:1:{i:0;s:5:"Kongo";}s:3:"kha";a:1:{i:0;s:5:"Khasi";}s:3:"khi";a:1:{i:0;s:17:"Khoisan (øvrige)";}s:3:"kho";a:1:{i:0;s:11:"Khotanesisk";}s:2:"ki";a:1:{i:0;s:6:"Kikuyu";}s:2:"kj";a:1:{i:0;s:8:"Kuanyama";}s:2:"kk";a:1:{i:0;s:9:"Kasakhisk";}s:2:"kl";a:1:{i:0;s:11:"Kalaallisut";}s:2:"km";a:1:{i:0;s:5:"Khmer";}s:3:"kmb";a:1:{i:0;s:8:"Kimbundu";}s:2:"kn";a:1:{i:0;s:11:"Kannaresisk";}s:2:"ko";a:1:{i:0;s:8:"Koreansk";}s:3:"kok";a:1:{i:0;s:7:"Konkani";}s:3:"kos";a:1:{i:0;s:8:"Kosraean";}s:3:"kpe";a:1:{i:0;s:6:"Kpelle";}s:2:"kr";a:1:{i:0;s:6:"Kanuri";}s:3:"krc";a:1:{i:0;s:15:"Karachay-Balkar";}s:3:"kro";a:1:{i:0;s:3:"Kru";}s:3:"kru";a:1:{i:0;s:6:"Kurukh";}s:2:"ks";a:1:{i:0;s:8:"Kashmiri";}s:2:"ku";a:1:{i:0;s:7:"Kurdisk";}s:2:"kw";a:1:{i:0;s:7:"Cornisk";}s:2:"ky";a:1:{i:0;s:9:"Kirgisisk";}s:2:"la";a:1:{i:0;s:5:"Latin";}s:3:"lad";a:1:{i:0;s:6:"Ladino";}s:3:"lah";a:1:{i:0;s:6:"Lahnda";}s:3:"lam";a:1:{i:0;s:5:"Lamba";}s:2:"lb";a:1:{i:0;s:12:"Luxembourgsk";}s:3:"lez";a:1:{i:0;s:8:"Lezghian";}s:2:"lg";a:1:{i:0;s:5:"Ganda";}s:2:"li";a:1:{i:0;s:9:"Limburgsk";}s:2:"ln";a:1:{i:0;s:7:"Lingala";}s:2:"lo";a:1:{i:0;s:3:"Lao";}s:3:"lol";a:1:{i:0;s:5:"Mongo";}s:3:"loz";a:1:{i:0;s:4:"Lozi";}s:2:"lt";a:1:{i:0;s:8:"Litauisk";}s:2:"lu";a:1:{i:0;s:12:"Luba-Katanga";}s:3:"lua";a:1:{i:0;s:10:"Luba-Lulua";}s:3:"lui";a:1:{i:0;s:7:"Luiseno";}s:3:"lun";a:1:{i:0;s:5:"Lunda";}s:3:"luo";a:1:{i:0;s:3:"Luo";}s:3:"lus";a:1:{i:0;s:6:"Lushai";}s:2:"lv";a:1:{i:0;s:7:"Lettisk";}s:3:"mad
";a:1:{i:0;s:8:"Madurese";}s:3:"mag";a:1:{i:0;s:6:"Magahi";}s:3:"mai";a:1:{i:0;s:8:"Maithili";}s:3:"mak";a:1:{i:0;s:7:"Makasar";}s:3:"man";a:1:{i:0;s:8:"Mandingo";}s:3:"map";a:1:{i:0;s:34:"Malajo-polynesiske sprog (øvrige)";}s:3:"mas";a:1:{i:0;s:5:"Masai";}s:3:"mdf";a:1:{i:0;s:6:"Moksha";}s:3:"mdr";a:1:{i:0;s:6:"Mandar";}s:3:"men";a:1:{i:0;s:5:"Mende";}s:2:"mg";a:1:{i:0;s:8:"Malagasy";}s:3:"mga";a:1:{i:0;s:24:"Irsk, Middel- (900-1200)";}s:2:"mh";a:1:{i:0;s:11:"Marshallese";}s:2:"mi";a:1:{i:0;s:5:"Maori";}s:3:"mic";a:1:{i:0;s:6:"Micmac";}s:3:"min";a:1:{i:0;s:11:"Minangkabau";}s:3:"mis";a:1:{i:0;s:13:"Diverse sprog";}s:2:"mk";a:1:{i:0;s:9:"Makedonsk";}s:3:"mkh";a:1:{i:0;s:19:"Mon-khmer (øvrige)";}s:2:"ml";a:1:{i:0;s:9:"Malayalam";}s:2:"mn";a:1:{i:0;s:8:"Mongolsk";}s:3:"mnc";a:1:{i:0;s:6:"Manchu";}s:3:"mni";a:1:{i:0;s:8:"Manipuri";}s:2:"mo";a:1:{i:0;s:9:"Moldovisk";}s:3:"moh";a:1:{i:0;s:6:"Mohawk";}s:3:"mos";a:1:{i:0;s:5:"Mossi";}s:2:"mr";a:1:{i:0;s:9:"Marathisk";}s:2:"ms";a:1:{i:0;s:5:"Malay";}s:2:"mt";a:1:{i:0;s:9:"Maltesisk";}s:3:"mul";a:1:{i:0;s:11:"Flere sprog";}s:3:"mun";a:1:{i:0;s:15:"Munda (øvrige)";}s:3:"mus";a:1:{i:0;s:5:"Creek";}s:3:"mwr";a:1:{i:0;s:7:"Marwari";}s:2:"my";a:1:{i:0;s:9:"Burmesisk";}s:3:"myn";a:1:{i:0;s:10:"Maya sprog";}s:3:"myv";a:1:{i:0;s:5:"Erzya";}s:2:"na";a:1:{i:0;s:5:"Nauru";}s:3:"nah";a:1:{i:0;s:7:"Nahuatl";}s:3:"nai";a:1:{i:0;s:41:"Nordamerikanske indianske sprog (øvrige)";}s:3:"nap";a:1:{i:0;s:12:"Neapolitansk";}s:2:"nb";a:1:{i:0;s:13:"Norsk Bokmål";}s:2:"nd";a:1:{i:0;s:13:"Ndebele, Nord";}s:3:"nds";a:1:{i:0;s:24:"Nedertysk; nedersachsisk";}s:2:"ne";a:1:{i:0;s:10:"Nepalesisk";}s:3:"new";a:1:{i:0;s:6:"Newari";}s:2:"ng";a:1:{i:0;s:6:"Ndonga";}s:3:"nia";a:1:{i:0;s:4:"Nias";}s:3:"nic";a:1:{i:0;s:27:"Niger-Congo sprog (øvrige)";}s:3:"niu";a:1:{i:0;s:6:"Niuean";}s:2:"nl";a:1:{i:0;s:9:"Hollandsk";}s:2:"nn";a:1:{i:0;s:7:"Nynorsk";}s:2:"no";a:1:{i:0;s:5:"Norsk";}s:3:"nog";a:1:{i:0;s:5:"Nogai";}s:3:"non";a:1:{i:0;s:14:"Islandsk, Old-";}s:2:"nr";a:1:{i:0;s:12:"Ndebele, Syd";}s:3:"nso";a:
1:{i:0;s:11:"Sotho, Nord";}s:3:"nub";a:1:{i:0;s:13:"Nubiske sprog";}s:2:"nv";a:1:{i:0;s:6:"Navajo";}s:2:"ny";a:1:{i:0;s:23:"Nyanja; Chichewa; Chewa";}s:3:"nym";a:1:{i:0;s:8:"Nyamwezi";}s:3:"nyn";a:1:{i:0;s:8:"Nyankole";}s:3:"nyo";a:1:{i:0;s:11:"Nyoro sprog";}s:3:"nzi";a:1:{i:0;s:5:"Nzima";}s:2:"oc";a:1:{i:0;s:35:"Occitansk (efter 1500); Provencalsk";}s:2:"oj";a:1:{i:0;s:6:"Ojibwa";}s:2:"om";a:1:{i:0;s:5:"Oromo";}s:2:"or";a:1:{i:0;s:5:"Oriya";}s:2:"os";a:1:{i:0;s:8:"Ossetisk";}s:3:"osa";a:1:{i:0;s:5:"Osage";}s:3:"ota";a:1:{i:0;s:21:"Osmannisk (1500-1928)";}s:3:"oto";a:1:{i:0;s:11:"Otomi sprog";}s:2:"pa";a:1:{i:0;s:7:"Punjabi";}s:3:"paa";a:1:{i:0;s:32:"Papua-australske sprog (øvrige)";}s:3:"pag";a:1:{i:0;s:10:"Pangasinan";}s:3:"pal";a:1:{i:0;s:7:"Pahlavi";}s:3:"pam";a:1:{i:0;s:8:"Pampanga";}s:3:"pap";a:1:{i:0;s:10:"Papiamento";}s:3:"pau";a:1:{i:0;s:9:"Palauansk";}s:3:"peo";a:1:{i:0;s:34:"Persisk, Old- (ca. 600-400 f. Kr.)";}s:3:"phi";a:1:{i:0;s:27:"Filippinske sprog (øvrige)";}s:3:"phn";a:1:{i:0;s:9:"Fønikisk";}s:2:"pi";a:1:{i:0;s:4:"Pali";}s:2:"pl";a:1:{i:0;s:5:"Polsk";}s:3:"pon";a:1:{i:0;s:6:"Ponape";}s:3:"pro";a:1:{i:0;s:23:"Provencalsk (før 1500)";}s:2:"ps";a:1:{i:0;s:15:"Pashto (Pushto)";}s:2:"pt";a:1:{i:0;s:11:"Portugisisk";}s:2:"qu";a:1:{i:0;s:7:"Quechua";}s:3:"raj";a:1:{i:0;s:10:"Rajasthani";}s:3:"rap";a:1:{i:0;s:7:"Rapanui";}s:3:"rar";a:1:{i:0;s:10:"Rarotongan";}s:2:"rm";a:1:{i:0;s:12:"Rætoromansk";}s:2:"rn";a:1:{i:0;s:5:"Rundi";}s:2:"ro";a:1:{i:0;s:8:"Rumænsk";}s:3:"roa";a:1:{i:0;s:24:"Romanske sprog (øvrige)";}s:3:"rom";a:1:{i:0;s:6:"Romani";}s:2:"ru";a:1:{i:0;s:7:"Russisk";}s:2:"rw";a:1:{i:0;s:11:"Kinyarwanda";}s:2:"sa";a:1:{i:0;s:8:"Sanskrit";}s:3:"sad";a:1:{i:0;s:7:"Sandawe";}s:3:"sah";a:1:{i:0;s:5:"Yakut";}s:3:"sai";a:1:{i:0;s:40:"Sydamerikanske indianske sprog (øvrige)";}s:3:"sam";a:1:{i:0;s:11:"Samaritansk";}s:3:"sas";a:1:{i:0;s:5:"Sasak";}s:3:"sat";a:1:{i:0;s:7:"Santali";}s:2:"sc";a:1:{i:0;s:8:"Sardinsk";}s:3:"sco";a:1:{i:0;s:6:"Skotsk";}s:2:"sd";a:1:{i:0;s:6:"Sindhi";}s:2:"se";a:1:{i:0;s:
10:"Nordsamisk";}s:3:"sel";a:1:{i:0;s:9:"Selkupisk";}s:3:"sem";a:1:{i:0;s:25:"Semitiske sprog (øvrige)";}s:2:"sg";a:1:{i:0;s:5:"Sango";}s:3:"sga";a:1:{i:0;s:23:"Irsk, Old- (indtil 900)";}s:3:"sgn";a:1:{i:0;s:9:"Tegnsprog";}s:2:"sh";a:1:{i:0;s:13:"Serbokroatisk";}s:3:"shn";a:1:{i:0;s:4:"Shan";}s:2:"si";a:1:{i:0;s:11:"Singalesisk";}s:3:"sid";a:1:{i:0;s:6:"Sidamo";}s:3:"sit";a:1:{i:0;s:31:"Sino-tibetanske sprog (øvrige)";}s:2:"sk";a:1:{i:0;s:9:"Slovakisk";}s:2:"sl";a:1:{i:0;s:8:"Slovensk";}s:3:"sla";a:1:{i:0;s:24:"Slaviske sprog (øvrige)";}s:2:"sm";a:1:{i:0;s:8:"Samoansk";}s:3:"sma";a:1:{i:0;s:9:"Sydsamisk";}s:3:"smi";a:1:{i:0;s:23:"Samiske sprog (øvrige)";}s:3:"smj";a:1:{i:0;s:9:"Lule Sami";}s:3:"smn";a:1:{i:0;s:10:"Inari Sami";}s:3:"sms";a:1:{i:0;s:10:"Skolt Sami";}s:2:"sn";a:1:{i:0;s:5:"Shona";}s:3:"snk";a:1:{i:0;s:7:"Soninke";}s:2:"so";a:1:{i:0;s:8:"Somalisk";}s:3:"sog";a:1:{i:0;s:9:"Sogdiansk";}s:3:"son";a:1:{i:0;s:7:"Songhai";}s:2:"sq";a:1:{i:0;s:7:"Albansk";}s:2:"sr";a:1:{i:0;s:7:"Serbisk";}s:3:"srr";a:1:{i:0;s:5:"Serer";}s:2:"ss";a:1:{i:0;s:5:"Swati";}s:3:"ssa";a:1:{i:0;s:41:"Afrikanske sprog syd for Sahara (øvrige)";}s:2:"st";a:1:{i:0;s:15:"Sotho, Southern";}s:2:"su";a:1:{i:0;s:11:"Sundanesisk";}s:3:"suk";a:1:{i:0;s:6:"Sukuma";}s:3:"sus";a:1:{i:0;s:4:"Susu";}s:3:"sux";a:1:{i:0;s:8:"Sumerisk";}s:2:"sv";a:1:{i:0;s:6:"Svensk";}s:2:"sw";a:1:{i:0;s:7:"Swahili";}s:3:"syr";a:1:{i:0;s:6:"Syrisk";}s:2:"ta";a:1:{i:0;s:7:"Tamilsk";}s:3:"tai";a:1:{i:0;s:13:"Tai (øvrige)";}s:2:"te";a:1:{i:0;s:6:"Telugu";}s:3:"tem";a:1:{i:0;s:5:"Temne";}s:3:"ter";a:1:{i:0;s:6:"Tereno";}s:3:"tet";a:1:{i:0;s:5:"Tetum";}s:2:"tg";a:1:{i:0;s:5:"Tajik";}s:2:"th";a:1:{i:0;s:10:"Thailandsk";}s:2:"ti";a:1:{i:0;s:8:"Tigrinya";}s:3:"tig";a:1:{i:0;s:5:"Tigre";}s:3:"tiv";a:1:{i:0;s:4:"Tivi";}s:2:"tk";a:1:{i:0;s:9:"Turkmensk";}s:3:"tkl";a:1:{i:0;s:7:"Tokelau";}s:2:"tl";a:1:{i:0;s:7:"Tagalog";}s:3:"tli";a:1:{i:0;s:7:"Tlingit";}s:3:"tmh";a:1:{i:0;s:8:"Tamashek";}s:2:"tn";a:1:{i:0;s:6:"Tswana";}s:2:"to";a:1:{i:0;s:19:"Tonga (Tongaøerne)";}s:3:"tog
";a:1:{i:0;s:13:"Tonga (Nyasa)";}s:3:"tpi";a:1:{i:0;s:9:"Tok Pisin";}s:2:"tr";a:1:{i:0;s:7:"Tyrkisk";}s:2:"ts";a:1:{i:0;s:6:"Tsonga";}s:3:"tsi";a:1:{i:0;s:9:"Tsimshisk";}s:2:"tt";a:1:{i:0;s:8:"Tatarisk";}s:3:"tum";a:1:{i:0;s:7:"Tumbuka";}s:3:"tut";a:1:{i:0;s:33:"Tyrkisk-tatariske sprog (øvrige)";}s:3:"tvl";a:1:{i:0;s:6:"Tuvalu";}s:2:"tw";a:1:{i:0;s:3:"Twi";}s:2:"ty";a:1:{i:0;s:10:"Tahitiansk";}s:3:"tyv";a:1:{i:0;s:8:"Tuvinian";}s:3:"udm";a:1:{i:0;s:6:"Udmurt";}s:2:"ug";a:1:{i:0;s:8:"Uigurisk";}s:3:"uga";a:1:{i:0;s:10:"Ugaristisk";}s:2:"uk";a:1:{i:0;s:8:"Ukrainsk";}s:3:"umb";a:1:{i:0;s:7:"Umbundu";}s:3:"und";a:1:{i:0;s:26:"Sproget kan ikke bestemmes";}s:2:"ur";a:1:{i:0;s:4:"Urdu";}s:2:"uz";a:1:{i:0;s:8:"Usbekisk";}s:3:"vai";a:1:{i:0;s:3:"Vai";}s:2:"ve";a:1:{i:0;s:5:"Venda";}s:2:"vi";a:1:{i:0;s:12:"Vietnamesisk";}s:2:"vo";a:1:{i:0;s:8:"Volapük";}s:3:"vot";a:1:{i:0;s:6:"Votisk";}s:2:"wa";a:1:{i:0;s:8:"Vallonsk";}s:3:"wal";a:1:{i:0;s:6:"Walamo";}s:3:"war";a:1:{i:0;s:5:"Waray";}s:3:"was";a:1:{i:0;s:5:"Washo";}s:3:"wen";a:1:{i:0;s:14:"Vendiske sprog";}s:2:"wo";a:1:{i:0;s:5:"Wolof";}s:3:"xal";a:1:{i:0;s:6:"Kalmyk";}s:2:"xh";a:1:{i:0;s:5:"Xhosa";}s:3:"yao";a:1:{i:0;s:3:"Yao";}s:3:"yap";a:1:{i:0;s:3:"Yap";}s:2:"yi";a:1:{i:0;s:8:"Jiddisch";}s:2:"yo";a:1:{i:0;s:6:"Yoruba";}s:2:"za";a:1:{i:0;s:6:"Zhuang";}s:3:"zap";a:1:{i:0;s:7:"Zapotec";}s:3:"zen";a:1:{i:0;s:6:"Zenaga";}s:2:"zh";a:1:{i:0;s:8:"Kinesisk";}s:3:"znd";a:1:{i:0;s:5:"Zande";}s:2:"zu";a:1:{i:0;s:4:"Zulu";}s:3:"zun";a:1:{i:0;s:4:"Zuni";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Scripts";a:23:{s:4:"Arab";a:1:{i:0;s:7:"Arabisk";}s:4:"Armn";a:1:{i:0;s:7:"Armensk";}s:4:"Copt";a:1:{i:0;s:7:"Koptisk";}s:4:"Cprt";a:1:{i:0;s:10:"Cypriotisk";}s:4:"Cyrl";a:1:{i:0;s:9:"Kyrillisk";}s:4:"Deva";a:1:{i:0;s:12:"Devanagarisk";}s:4:"Ethi";a:1:{i:0;s:8:"Etiopisk";}s:4:"Geor";a:1:{i:0;s:8:"Georgisk";}
s:4:"Goth";a:1:{i:0;s:6:"Gotisk";}s:4:"Grek";a:1:{i:0;s:6:"Græsk";}s:4:"Hans";a:1:{i:0;s:13:"Forenklet Han";}s:4:"Hant";a:1:{i:0;s:16:"Traditionelt Han";}s:4:"Hebr";a:1:{i:0;s:8:"Hebraisk";}s:4:"Ital";a:1:{i:0;s:10:"Olditalisk";}s:4:"Latn";a:1:{i:0;s:7:"Latinsk";}s:4:"Mong";a:1:{i:0;s:8:"Mongolsk";}s:4:"Runr";a:1:{i:0;s:5:"Runer";}s:4:"Sinh";a:1:{i:0;s:11:"Singalesisk";}s:4:"Syrc";a:1:{i:0;s:6:"Syrisk";}s:4:"Taml";a:1:{i:0;s:7:"Tamilsk";}s:4:"Tibt";a:1:{i:0;s:9:"Tibetansk";}s:4:"Ugar";a:1:{i:0;s:9:"Ugaritisk";}s:4:"Zyyy";a:1:{i:0;s:6:"Ukendt";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:20:"Buddhistisk kalender";}s:7:"chinese";a:1:{i:0;s:17:"Kinesisk kalender";}s:9:"gregorian";a:1:{i:0;s:20:"Gregoriansk kalender";}s:6:"hebrew";a:1:{i:0;s:16:"Jødisk kalender";}s:7:"islamic";a:1:{i:0;s:17:"Islamisk kalender";}s:13:"islamic-civil";a:1:{i:0;s:26:"Verdslig islamisk kalender";}s:8:"japanese";a:1:{i:0;s:16:"Japansk kalender";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:30:"Direkte sorteringsrækkefølge";}s:9:"phonebook";a:1:{i:0;s:38:"Sorteringsrækkefølge i telefonbøger";}s:6:"pinyin";a:1:{i:0;s:37:"Pinyin-baseret sorteringsrækkefølge";}s:6:"stroke";a:1:{i:0;s:37:"Stroke-baseret sorteringsrækkefølge";}s:11:"traditional";a:1:{i:0;s:34:"Traditionel sorteringsrækkefølge";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:17:"EEEE dd MMMM yyyy";i:5;s:11:"d. MMM yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:8:"dd-MM-yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:4:"søn";i:1;s:3:"man";i:2;s:3:"tir";i:3;s:3:"ons";i:4;s:3:"tor";i:5;s:3:"fre";i:6;s:4:"lør";}s:6:"narrow";a:7:{i:0;s:1:"S";i:1;s:1:"M";i:2;s:1:"T";i:3;s:1:"O";i:4;s:1:"T";i:5;s:1:"F";i:6;s:1:"L";}s:4:"wide";a:7:{i:0;s:7:"søndag";i:1;s:6:"mandag";i:2;s:7:"tirsdag";i:3;s:6:"onsdag";i:4;s:7:"torsdag";i:5;s:6:
"fredag";i:6;s:7:"lørdag";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:5:"f.Kr.";i:1;s:5:"e.Kr.";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:3:"jan";i:1;s:3:"feb";i:2;s:3:"mar";i:3;s:3:"apr";i:4;s:3:"maj";i:5;s:3:"jun";i:6;s:3:"jul";i:7;s:3:"aug";i:8;s:3:"sep";i:9;s:3:"okt";i:10;s:3:"nov";i:11;s:3:"dec";}s:6:"narrow";a:12:{i:0;s:1:"J";i:1;s:1:"F";i:2;s:1:"M";i:3;s:1:"A";i:4;s:1:"M";i:5;s:1:"J";i:6;s:1:"J";i:7;s:1:"A";i:8;s:1:"S";i:9;s:1:"O";i:10;s:1:"N";i:11;s:1:"D";}s:4:"wide";a:12:{i:0;s:6:"januar";i:1;s:7:"februar";i:2;s:5:"marts";i:3;s:5:"april";i:4;s:3:"maj";i:5;s:4:"juni";i:6;s:4:"juli";i:7;s:6:"august";i:8;s:9:"september";i:9;s:7:"oktober";i:10;s:8:"november";i:11;s:8:"december";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GuMtkHmsSEDFwWahKzUeygAZ";}s:11:"zoneStrings";a:17:{i:0;a:6:{i:0;s:19:"America/Los_Angeles";i:1;s:17:"Pacific-normaltid";i:2;s:3:"PST";i:3;s:17:"Pacific-sommertid";i:4;s:3:"PDT";i:5;s:11:"Los Angeles";}i:1;a:6:{i:0;s:14:"America/Denver";i:1;s:18:"Mountain-normaltid";i:2;s:3:"MST";i:3;s:18:"Mountain-sommertid";i:4;s:3:"MDT";i:5;s:6:"Denver";}i:2;a:6:{i:0;s:15:"America/Phoenix";i:1;s:18:"Mountain-normaltid";i:2;s:3:"MST";i:3;s:18:"Mountain-normaltid";i:4;s:3:"MST";i:5;s:7:"Phoenix";}i:3;a:6:{i:0;s:15:"America/Chicago";i:1;s:17:"Central-normaltid";i:2;s:3:"CST";i:3;s:17:"Central-sommertid";i:4;s:3:"CDT";i:5;s:7:"Chicago";}i:4;a:6:{i:0;s:16:"America/New_York";i:1;s:17:"Eastern-normaltid";i:2;s:3:"EST";i:3;s:17:"Eastern-sommertid";i:4;s:3:"EDT";i:5;s:8:"New York";}i:5;a:6:{i:0;s:20:"America/Indianapolis";i:1;s:17:"Eastern-normaltid";i:2;s:3:"EST";i:3;s:17:"Eastern-normaltid";i:4;s:3:"EST";i:5;s:12:"Indianapolis";}i:6;a:6:{i:0;s:16:"Pacific/Honolulu";i:1;s:16:"Hawaii-normaltid";i:2;s:3:"HST";i:3;s:16:"Hawaii-normaltid";i:4;s:3:"HST";i:5;s:8:"Honolulu";}i:7;a:6:{i:0;s:17:"America/Anchorage";i:1;s:16:"Alaska-normaltid";i:2;s:3:"AST";i:3;s:16:"Alaska-sommertid";i:4;s:3:"ADT";i:5;s:9:"Anchorage";}i:8;a:6:{i:0;s:15:"America/Halifax";i:1;s:18:"Atlantic-normaltid";i
:2;s:3:"AST";i:3;s:18:"Atlantic-sommertid";i:4;s:3:"ADT";i:5;s:7:"Halifax";}i:9;a:6:{i:0;s:16:"America/St_Johns";i:1;s:22:"Newfoundland-normaltid";i:2;s:3:"CNT";i:3;s:22:"Newfoundland-sommertid";i:4;s:3:"CDT";i:5;s:9:"St. Johns";}i:10;a:6:{i:0;s:12:"Europe/Paris";i:1;s:26:"Mellemeuropæisk normaltid";i:2;s:3:"CET";i:3;s:26:"Mellemeuropæisk sommertid";i:4;s:4:"CEST";i:5;s:5:"Paris";}i:11;a:6:{i:0;s:7:"Etc/GMT";i:1;s:10:"Verdenstid";i:2;s:3:"GMT";i:3;s:10:"Verdenstid";i:4;s:3:"GMT";i:5;s:6:"London";}i:12;a:6:{i:0;s:17:"Africa/Casablanca";i:1;s:10:"Verdenstid";i:2;s:3:"GMT";i:3;s:10:"Verdenstid";i:4;s:3:"GMT";i:5;s:10:"Casablanca";}i:13;a:6:{i:0;s:14:"Asia/Jerusalem";i:1;s:18:"Israelsk normaltid";i:2;s:3:"IST";i:3;s:18:"Israelsk sommertid";i:4;s:3:"IDT";i:5;s:9:"Jerusalem";}i:14;a:6:{i:0;s:10:"Asia/Tokyo";i:1;s:17:"Japansk normaltid";i:2;s:3:"JST";i:3;s:17:"Japansk normaltid";i:4;s:3:"JST";i:5;s:5:"Tokyo";}i:15;a:6:{i:0;s:16:"Europe/Bucharest";i:1;s:24:"Østeuropæisk normaltid";i:2;s:3:"EET";i:3;s:24:"Østeuropæisk sommertid";i:4;s:4:"EEST";i:5;s:8:"Bukarest";}i:16;a:6:{i:0;s:13:"Asia/Shanghai";i:1;s:18:"Kinesisk normaltid";i:2;s:3:"CTT";i:3;s:18:"Kinesisk normaltid";i:4;s:3:"CDT";i:5;s:8:"Shanghai";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/da_DK.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/da_DK.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/da_DK.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"¤ #,##0.00;¤ -#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:13:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:28:"Vereinigte Arabische Emirate";}s:2:"AF";a:1:{i:0;s:11:"Afghanistan";}s:2:"AG";a:1:{i:0;s:19:"Antigua und Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:8:"Albanien";}s:2:"AM";a:1:{i:0;s:8:"Armenien";}s:2:"AN";a:1:{i:0;s:25:"Niederländische Antillen";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:9:"Antarktis";}s:2:"AR";a:1:{i:0;s:11:"Argentinien";}s:2:"AS";a:1:{i:0;s:18:"Amerikanisch-Samoa";}s:2:"AT";a:1:{i:0;s:11:"Österreich";}s:2:"AU";a:1:{i:0;s:10:"Australien";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:13:"Aserbaidschan";}s:2:"BA";a:1:{i:0;s:23:"Bosnien und Herzegowina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:11:"Bangladesch";}s:2:"BE";a:1:{i:0;s:7:"Belgien";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:9:"Bulgarien";}s:2:"BH";a:1:{i:0;s:7:"Bahrain";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:17:"Brunei Darussalam";}s:2:"BO";a:1:{i:0;s:8:"Bolivien";}s:2:"BR";a:1:{i:0;s:9:"Brasilien";}s:2:"BS";a:1:{i:0;s:7:"Bahamas";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BV";a:1:{i:0;s:11:"Bouvetinsel";}s:2:"BW";a:1:{i:0;s:8:"Botsuana";}s:2:"BY";a:1:{i:0;s:7:"Belarus";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:21:"Kokosinseln (Keeling)";}s:2:"CD";a:1:{i:0;s:28:"Demokratische Republik Kongo";}s:2:"CF";a:1:{i:0;s:28:"Zentralafrikanische Republik";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:7:"Schweiz";}s:2:"CI";a:1:{i:0;s:16:"Côte d’Ivoire";}s:2:"CK";a:1:{i:0;s:10:"Cookinseln";}s:2:"CL";a:1:{i:0;s:5:"Chile";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:5:"China";}s:2:"CO";a:1:{i:0;s:9:"Kolumbien";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:9:"Kap Verde";}s:2:"CX";a:1:{i:0;s:15:"Weihnachtsinsel";}s:2:"CY";a:1:{i:0;s:6:"Zypern";}s:2:"CZ";a:1:{i:0;s:21:"Tschechische Republik";}s:2:"DE";a:1:{i:0;s:11:"Deutschlan
d";}s:2:"DJ";a:1:{i:0;s:9:"Dschibuti";}s:2:"DK";a:1:{i:0;s:9:"Dänemark";}s:2:"DM";a:1:{i:0;s:8:"Dominica";}s:2:"DO";a:1:{i:0;s:23:"Dominikanische Republik";}s:2:"DZ";a:1:{i:0;s:8:"Algerien";}s:2:"EC";a:1:{i:0;s:7:"Ecuador";}s:2:"EE";a:1:{i:0;s:7:"Estland";}s:2:"EG";a:1:{i:0;s:8:"Ägypten";}s:2:"EH";a:1:{i:0;s:10:"Westsahara";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:7:"Spanien";}s:2:"ET";a:1:{i:0;s:10:"Äthiopien";}s:2:"FI";a:1:{i:0;s:8:"Finnland";}s:2:"FJ";a:1:{i:0;s:7:"Fidschi";}s:2:"FK";a:1:{i:0;s:14:"Falklandinseln";}s:2:"FM";a:1:{i:0;s:11:"Mikronesien";}s:2:"FO";a:1:{i:0;s:8:"Färöer";}s:2:"FR";a:1:{i:0;s:10:"Frankreich";}s:2:"GA";a:1:{i:0;s:5:"Gabun";}s:2:"GB";a:1:{i:0;s:23:"Vereinigtes Königreich";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:8:"Georgien";}s:2:"GF";a:1:{i:0;s:20:"Französisch-Guayana";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:9:"Grönland";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:17:"Äquatorialguinea";}s:2:"GR";a:1:{i:0;s:12:"Griechenland";}s:2:"GS";a:1:{i:0;s:46:"Südgeorgien und die Südlichen Sandwichinseln";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinea-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:23:"Hong Kong S.A.R., China";}s:2:"HM";a:1:{i:0;s:24:"Heard und McDonaldinseln";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:8:"Kroatien";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:6:"Ungarn";}s:2:"ID";a:1:{i:0;s:10:"Indonesien";}s:2:"IE";a:1:{i:0;s:6:"Irland";}s:2:"IL";a:1:{i:0;s:6:"Israel";}s:2:"IN";a:1:{i:0;s:6:"Indien";}s:2:"IO";a:1:{i:0;s:41:"Britisches Territorium im Indischen Ozean";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:6:"Island";}s:2:"IT";a:1:{i:0;s:7:"Italien";}s:2:"JM";a:1:{i:0;s:7:"Jamaika";}s:2:"JO";a:1:{i:0;s:9:"Jordanien";}s:2:"JP";a:1:{i:0;s:5:"Japan";}s:2:"KE";a:1:{i:0;s:5:"Kenia";}s:2:"KG";a:1:{i:0;s:1
1:"Kirgisistan";}s:2:"KH";a:1:{i:0;s:10:"Kambodscha";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:7:"Komoren";}s:2:"KN";a:1:{i:0;s:19:"St. Kitts und Nevis";}s:2:"KP";a:1:{i:0;s:33:"Demokratische Volksrepublik Korea";}s:2:"KR";a:1:{i:0;s:14:"Republik Korea";}s:2:"KW";a:1:{i:0;s:6:"Kuwait";}s:2:"KY";a:1:{i:0;s:12:"Kaimaninseln";}s:2:"KZ";a:1:{i:0;s:10:"Kasachstan";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:7:"Libanon";}s:2:"LC";a:1:{i:0;s:9:"St. Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberia";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:7:"Litauen";}s:2:"LU";a:1:{i:0;s:9:"Luxemburg";}s:2:"LV";a:1:{i:0;s:8:"Lettland";}s:2:"LY";a:1:{i:0;s:6:"Libyen";}s:2:"MA";a:1:{i:0;s:7:"Marokko";}s:2:"MC";a:1:{i:0;s:6:"Monaco";}s:2:"MD";a:1:{i:0;s:15:"Republik Moldau";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:14:"Marshallinseln";}s:2:"MK";a:1:{i:0;s:10:"Mazedonien";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:8:"Mongolei";}s:2:"MO";a:1:{i:0;s:19:"Macau S.A.R., China";}s:2:"MP";a:1:{i:0;s:19:"Nördliche Marianen";}s:2:"MQ";a:1:{i:0;s:10:"Martinique";}s:2:"MR";a:1:{i:0;s:11:"Mauretanien";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:9:"Malediven";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:6:"Mexiko";}s:2:"MY";a:1:{i:0;s:8:"Malaysia";}s:2:"MZ";a:1:{i:0;s:8:"Mosambik";}s:2:"NA";a:1:{i:0;s:7:"Namibia";}s:2:"NC";a:1:{i:0;s:13:"Neukaledonien";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:12:"Norfolkinsel";}s:2:"NG";a:1:{i:0;s:7:"Nigeria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:11:"Niederlande";}s:2:"NO";a:1:{i:0;s:8:"Norwegen";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:10:"Neuseeland";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:23:"Französisch-Po
lynesien";}s:2:"PG";a:1:{i:0;s:15:"Papua-Neuguinea";}s:2:"PH";a:1:{i:0;s:11:"Philippinen";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:5:"Polen";}s:2:"PM";a:1:{i:0;s:23:"St. Pierre und Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:11:"Puerto Rico";}s:2:"PS";a:1:{i:0;s:25:"Palästinensische Gebiete";}s:2:"PT";a:1:{i:0;s:8:"Portugal";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Katar";}s:2:"RE";a:1:{i:0;s:8:"Réunion";}s:2:"RO";a:1:{i:0;s:9:"Rumänien";}s:2:"RU";a:1:{i:0;s:21:"Russische Föderation";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SA";a:1:{i:0;s:13:"Saudi-Arabien";}s:2:"SB";a:1:{i:0;s:9:"Salomonen";}s:2:"SC";a:1:{i:0;s:10:"Seychellen";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:8:"Schweden";}s:2:"SG";a:1:{i:0;s:8:"Singapur";}s:2:"SH";a:1:{i:0;s:10:"St. Helena";}s:2:"SI";a:1:{i:0;s:9:"Slowenien";}s:2:"SJ";a:1:{i:0;s:22:"Svalbard und Jan Mayen";}s:2:"SK";a:1:{i:0;s:8:"Slowakei";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:7:"Somalia";}s:2:"SP";a:1:{i:0;s:7:"Serbien";}s:2:"SR";a:1:{i:0;s:8:"Suriname";}s:2:"ST";a:1:{i:0;s:24:"São Tomé und Príncipe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:6:"Syrien";}s:2:"SZ";a:1:{i:0;s:9:"Swasiland";}s:2:"TC";a:1:{i:0;s:23:"Turks- und Caicosinseln";}s:2:"TD";a:1:{i:0;s:6:"Tschad";}s:2:"TF";a:1:{i:0;s:40:"Französische Süd- und Antarktisgebiete";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:8:"Thailand";}s:2:"TJ";a:1:{i:0;s:13:"Tadschikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:8:"Osttimor";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:8:"Tunesien";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:7:"Türkei";}s:2:"TT";a:1:{i:0;s:19:"Trinidad und Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Taiwan";}s:2:"TZ";a:1:{i:0;s:8:"Tansania";}s:2:"UA";a:1:{i:0;s:7:"Ukraine";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:21:"Amerikanisch-Ozean
ien";}s:2:"US";a:1:{i:0;s:18:"Vereinigte Staaten";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:10:"Usbekistan";}s:2:"VA";a:1:{i:0;s:12:"Vatikanstadt";}s:2:"VC";a:1:{i:0;s:30:"St. Vincent und die Grenadinen";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:24:"Britische Jungferninseln";}s:2:"VI";a:1:{i:0;s:28:"Amerikanische Jungferninseln";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:17:"Wallis und Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:11:"Jugoslawien";}s:2:"ZA";a:1:{i:0;s:10:"Südafrika";}s:2:"ZM";a:1:{i:0;s:6:"Sambia";}s:2:"ZW";a:1:{i:0;s:8:"Simbabwe";}}s:10:"Currencies";a:341:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:20:"Andorranischer Diner";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:20:"Andorranische Pesete";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:10:"UAE Dirham";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:7:"Afghani";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:7:"Afghani";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:19:"Afar und Issa Franc";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:27:"Albanischer Lek (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"ALL";i:1;s:3:"Lek";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:22:"Albanischer Lek Valute";}s:3:"AMD";a:2:{i:0;s:3:"AMD";i:1;s:4:"Dram";}s:3:"ANG";a:2:{i:0;s:3:"ANG";i:1;s:24:"Niederl. Antillen Gulden";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:6:"Kwanza";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:32:"Angolanischer Kwanza (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:12:"Neuer Kwanza";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:17:"Kwanza Reajustado";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:20:"Angolanischer Escudo";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:22:"Argentinischer Austral";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:35:"Argentinischer Peso Moneda Nacional";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:31:"Argentinischer Peso (1983-1985)";}s:3:"ARS";a:2:{i:0;s:3:"ARS";i:1;s:19:"Argentinischer Peso";}s:3:"ATS";a:2:{i:0;s:3:"öS";i:1;s:27:"Österreichischer Schilling";}s:3:"AUD";a:2:{i:0;s:3:"AUD";i:1;s:20:"Australischer Dolla
r";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:19:"Australisches Pfund";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:12:"Aruba Florin";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:19:"Aserbeidschan Manat";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:29:"Bosnien und Herzegowina Dinar";}s:3:"BAM";a:2:{i:0;s:3:"BAM";i:1;s:19:"Konvertierbare Mark";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:35:"Bosnien und Herzegowina Neuer Dinar";}s:3:"BBD";a:2:{i:0;s:3:"BBD";i:1;s:15:"Barbados-Dollar";}s:3:"BDT";a:2:{i:0;s:3:"BDT";i:1;s:4:"Taka";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:30:"Belgischer Franc (konvertibel)";}s:3:"BEF";a:2:{i:0;s:3:"BEF";i:1;s:16:"Belgischer Franc";}s:3:"BGL";a:2:{i:0;s:3:"BGL";i:1;s:3:"Lew";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:3:"Lew";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:15:"Lew (1879-1952)";}s:3:"BHD";a:2:{i:0;s:3:"BHD";i:1;s:13:"Bahrain-Dinar";}s:3:"BIF";a:2:{i:0;s:3:"BIF";i:1;s:13:"Burundi-Franc";}s:3:"BMD";a:2:{i:0;s:3:"BMD";i:1;s:14:"Bermuda-Dollar";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:13:"Bermuda-Pfund";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:13:"Brunei-Dollar";}s:3:"BOB";a:2:{i:0;s:3:"BOB";i:1;s:9:"Boliviano";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:21:"Boliviano (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:19:"Bolivianischer Peso";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:5:"Mvdol";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:41:"Brasilianischer Cruzeiro Novo (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:23:"Brasilianischer Cruzado";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:36:"Brasilianischer Cruzeiro (1990-1993)";}s:3:"BRL";a:2:{i:0;s:3:"BRL";i:1;s:4:"Real";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:28:"Brasilianischer Cruzado Novo";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:24:"Brasilianischer Cruzeiro";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:36:"Brasilianischer Cruzeiro (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:13:"Bahama-Dollar";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:12:"Bahama-Pfund";}s:3:"BTN";a:2:{i:0;s:3:"BTN";i:1;s:8:"Ngultrum";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:12:"Bhutan Rupie";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:17:"Birmanischer Kyat";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i
:1;s:17:"Birmanische Rupie";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:4:"Pula";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:19:"Belarus Rubel (alt)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:25:"Belarus Rubel (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"BYR";i:1;s:19:"Belarus Rubel (neu)";}s:3:"BZD";a:2:{i:0;s:3:"BZD";i:1;s:13:"Belize-Dollar";}s:3:"CAD";a:2:{i:0;s:3:"CAD";i:1;s:18:"Kanadischer Dollar";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:15:"Franc congolais";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:20:"Republik Kongo Franc";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:19:"Kongolesische Zaire";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:38:"Zentralafrikanische Republik CFA Franc";}s:3:"CHF";a:2:{i:0;s:4:"SFr.";i:1;s:17:"Schweizer Franken";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:19:"Chilenischer Condor";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:19:"Chilenischer Escudo";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:19:"Unidades de Fomento";}s:3:"CLP";a:2:{i:0;s:3:"CLP";i:1;s:17:"Chilenischer Peso";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:17:"Kamerun CFA Franc";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:30:"Chinesischer Jen Min Piao Yuan";}s:3:"CNY";a:2:{i:0;s:3:"CNY";i:1;s:13:"Renminbi Yuan";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:27:"Kolumbianischer Papier-Peso";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:15:"Kongo CFA Franc";}s:3:"COP";a:2:{i:0;s:3:"COP";i:1;s:20:"Kolumbianischer Peso";}s:3:"CRC";a:2:{i:0;s:3:"CRC";i:1;s:16:"Costa Rica Colon";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:25:"Tschechoslowakische Krone";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:16:"Kubanischer Peso";}s:3:"CVE";a:2:{i:0;s:3:"CVE";i:1;s:16:"Kap Verde Escudo";}s:3:"CYP";a:2:{i:0;s:3:"CYP";i:1;s:12:"Zypern Pfund";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:18:"Tschechische Krone";}s:3:"DEM";a:2:{i:0;s:2:"DM";i:1;s:13:"Deutsche Mark";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:9:"Sperrmark";}s:3:"DJF";a:2:{i:0;s:3:"DJF";i:1;s:15:"Dschibuti-Franc";}s:3:"DKK";a:2:{i:0;s:3:"DKK";i:1;s:15:"Dänische Krone";}s:3:"DOP";a:2:{i:0;s:3:"DOP";i:1;s:20:"Dominikanischer Peso";}s:3:"DZD";a:2:{i:0;s:3:"DZD";i:1;s:17:"Algerischer Dinar";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:23:"A
lgerischer Neuer Franc";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:26:"Algerischer Franc Germinal";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:22:"Ecuadorianischer Sucre";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:27:"Verrechnungseinheit für EC";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:15:"Estnische Krone";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:18:"Ägyptisches Pfund";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:5:"Nakfa";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:16:"Spanische Pesete";}s:3:"ETB";a:2:{i:0;s:3:"ETB";i:1;s:4:"Birr";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:20:"Äthiopischer Dollar";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"Euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:14:"Finnische Mark";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:26:"Finnische Mark (1860-1962)";}s:3:"FJD";a:2:{i:0;s:3:"FJD";i:1;s:14:"Fidschi Dollar";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:13:"Fidschi Pfund";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:14:"Falkland Pfund";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:21:"Färöer Inseln Krone";}s:3:"FRF";a:2:{i:0;s:2:"FF";i:1;s:20:"Französischer Franc";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:44:"Französischer Franc Germinal/Franc Poincare";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:14:"Pfund Sterling";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:23:"Georgischer Kupon Larit";}s:3:"GEL";a:2:{i:0;s:3:"GEL";i:1;s:16:"Georgischer Lari";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:4:"Cedi";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:16:"Ghana Cedi (alt)";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:11:"Ghana Pfund";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:15:"Gibraltar Pfund";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:15:"Grönland Krone";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:6:"Dalasi";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:12:"Gambia Pfund";}s:3:"GNF";a:2:{i:0;s:3:"GNF";i:1;s:12:"Guinea Franc";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:33:"Äquatorialguinea Ekwele Guineana";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:24:"Äquatorialguinea Franco";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:33:"Äquatorialguinea Peseta Guineana";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:19:"Griechische Drachme";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:24:"Neue Griechische Drachme";}s:
3:"GTQ";a:2:{i:0;s:3:"GTQ";i:1;s:7:"Quetzal";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:33:"Französisch Guayana Franc Guiana";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:27:"Portugiesisch Guinea Escudo";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:29:"Portugiesisch Guinea Mil Reis";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:18:"Guinea Bissau Peso";}s:3:"GYD";a:2:{i:0;s:3:"GYD";i:1;s:13:"Guyana Dollar";}s:3:"HKD";a:2:{i:0;s:3:"HKD";i:1;s:15:"Hongkong Dollar";}s:3:"HNL";a:2:{i:0;s:3:"HNL";i:1;s:7:"Lempira";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:17:"Kroatischer Dinar";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:4:"Kuna";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:6:"Gourde";}s:3:"HUF";a:2:{i:0;s:3:"HUF";i:1;s:6:"Forint";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:18:"Nordirisches Pfund";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:26:"Indonesischer Nica Guilder";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:24:"Indonesische Java Rupiah";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:24:"Indonesische Neue Rupiah";}s:3:"IDR";a:2:{i:0;s:3:"IDR";i:1;s:6:"Rupiah";}s:3:"IEP";a:2:{i:0;s:3:"IEP";i:1;s:14:"Irisches Pfund";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:7:"Schekel";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:18:"Israelisches Pfund";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:7:"Schekel";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:14:"Indische Rupie";}s:3:"IQD";a:2:{i:0;s:3:"IQD";i:1;s:10:"Irak Dinar";}s:3:"IRR";a:2:{i:0;s:3:"IRR";i:1;s:4:"Rial";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:18:"Isländische Krone";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:17:"Italienische Lire";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:21:"Jersey Pfund Sterling";}s:3:"JMD";a:2:{i:0;s:3:"JMD";i:1;s:14:"Jamaika Dollar";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:13:"Jamaika Pfund";}s:3:"JOD";a:2:{i:0;s:3:"JOD";i:1;s:18:"Jordanischer Dinar";}s:3:"JPY";a:2:{i:0;s:2:"¥";i:1;s:3:"Yen";}s:3:"KES";a:2:{i:0;s:3:"KES";i:1;s:15:"Kenia Schilling";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:3:"Som";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:10:"Riel (alt)";}s:3:"KHR";a:2:{i:0;s:3:"KHR";i:1;s:4:"Riel";}s:3:"KMF";a:2:{i:0;s:3:"KMF";i:1;s:13:"Komoren Franc";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1
;s:26:"Nordkoreanischer Won (alt)";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:20:"Nordkoreanischer Won";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:21:"Südkoreanischer Hwan";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:26:"Südkoreanischer Won (alt)";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:20:"Südkoreanischer Won";}s:3:"KWD";a:2:{i:0;s:3:"KWD";i:1;s:12:"Kuwait Dinar";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:13:"Kaiman-Dollar";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:16:"Kasachstan Rubel";}s:3:"KZT";a:2:{i:0;s:3:"KZT";i:1;s:5:"Tenge";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:3:"Kip";}s:3:"LBP";a:2:{i:0;s:3:"LBP";i:1;s:19:"Libanesisches Pfund";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:21:"Liechtenstein Franken";}s:3:"LKR";a:2:{i:0;s:3:"LKR";i:1;s:15:"Sri Lanka Rupie";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:12:"Ceylon Rupie";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:21:"Liberianischer Dollar";}s:3:"LSL";a:2:{i:0;s:3:"LSL";i:1;s:4:"Loti";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:17:"Litauischer Litas";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:19:"Litauischer Talonas";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:21:"Luxemburgischer Franc";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:15:"Lettischer Lats";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:16:"Lettischer Rubel";}s:3:"LYD";a:2:{i:0;s:3:"LYD";i:1;s:15:"Libyscher Dinar";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:15:"Libysches Pfund";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:21:"Marokkanischer Dirham";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:20:"Marokkanischer Franc";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:20:"Monaco Franc Nouveau";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:21:"Monaco Franc Germinal";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:16:"Moldau Leu Cupon";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:10:"Moldau Leu";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:18:"Moldau Rubel Cupon";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:17:"Madagaskar Ariary";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:16:"Madagaskar Franc";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:22:"Marshall Inseln Dollar";}s:3:"MKD";a:2:{i:0;s:3:"MKD";i:1;s:5:"Denar";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:4:"Kyat";}s:3:"MNT";a:2:{i:0;s:3:"MNT";i:1;s:6:"Tugrik";}s:3:"M
OP";a:2:{i:0;s:3:"MOP";i:1;s:6:"Pataca";}s:3:"MRO";a:2:{i:0;s:3:"MRO";i:1;s:7:"Ouguiya";}s:3:"MTL";a:2:{i:0;s:3:"MTL";i:1;s:16:"Maltesische Lira";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:18:"Maltesisches Pfund";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:15:"Mauritius Rupie";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:15:"Malediven Rupie";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:7:"Rufiyaa";}s:3:"MWK";a:2:{i:0;s:3:"MWK";i:1;s:13:"Malawi Kwacha";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:12:"Malawi Pfund";}s:3:"MXN";a:2:{i:0;s:3:"MXN";i:1;s:18:"Mexikanischer Peso";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:37:"Mexikanischer Silber-Peso (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:33:"Mexican Unidad de Inversion (UDI)";}s:3:"MYR";a:2:{i:0;s:3:"MYR";i:1;s:20:"Malaysischer Ringgit";}s:3:"MZM";a:2:{i:0;s:3:"MZM";i:1;s:7:"Metical";}s:3:"NAD";a:2:{i:0;s:3:"NAD";i:1;s:14:"Namibia Dollar";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:28:"Neukaledonien Franc Germinal";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:5:"Naira";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:20:"Nigerianisches Pfund";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:23:"Neue Hebriden CFP Franc";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:7:"Cordoba";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:12:"Gold-Cordoba";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:12:"Gold-Cordoba";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:21:"Holländischer Gulden";}s:3:"NOK";a:2:{i:0;s:3:"NOK";i:1;s:17:"Norwegische Krone";}s:3:"NPR";a:2:{i:0;s:3:"NPR";i:1;s:18:"Nepalesische Rupie";}s:3:"NZD";a:2:{i:0;s:3:"NZD";i:1;s:17:"Neuseeland Dollar";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:16:"Neuseeland Pfund";}s:3:"OMR";a:2:{i:0;s:3:"OMR";i:1;s:10:"Rial Omani";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:6:"Balboa";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:28:"Dnjestr-Republik Rubel Kupon";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:28:"Dnjestr-Republik Rubel (neu)";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:22:"Dnjestr-Republik Rubel";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:17:"Peruanischer Inti";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:9:"Neuer Sol";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:3:"Sol";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:4
:"Kina";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:20:"Philippinischer Peso";}s:3:"PKR";a:2:{i:0;s:3:"PKR";i:1;s:19:"Pakistanische Rupie";}s:3:"PLN";a:2:{i:0;s:3:"PLN";i:1;s:5:"Zloty";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:17:"Zloty (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:16:"Palästina Pfund";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:21:"Portugiesischer Conto";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:22:"Portugiesischer Escudo";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:7:"Guarani";}s:3:"QAR";a:2:{i:0;s:3:"QAR";i:1;s:11:"Katar Riyal";}s:3:"ROL";a:2:{i:0;s:3:"ROL";i:1;s:3:"Leu";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:9:"Neuer Leu";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:22:"Russischer Rubel (neu)";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:22:"Russischer Rubel (alt)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:12:"Ruanda Franc";}s:3:"SAR";a:2:{i:0;s:3:"SAR";i:1;s:11:"Saudi Riyal";}s:3:"SBD";a:2:{i:0;s:3:"SBD";i:1;s:16:"Salomonen Dollar";}s:3:"SCR";a:2:{i:0;s:3:"SCR";i:1;s:16:"Seychellen Rupie";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:19:"Sudanesischer Dinar";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:19:"Sudanesisches Pfund";}s:3:"SEK";a:2:{i:0;s:3:"SEK";i:1;s:17:"Schwedische Krone";}s:3:"SGD";a:2:{i:0;s:3:"SGD";i:1;s:15:"Singapur Dollar";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:16:"St. Helena Pfund";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:10:"Tolar Bons";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:5:"Tolar";}s:3:"SKK";a:2:{i:0;s:3:"SKK";i:1;s:17:"Slowakische Krone";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:5:"Leone";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:15:"San Marino Lire";}s:3:"SOS";a:2:{i:0;s:3:"SOS";i:1;s:17:"Somalia Schilling";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:20:"Somaliland Schilling";}s:3:"SRG";a:2:{i:0;s:3:"SRG";i:1;s:15:"Suriname Gulden";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:18:"Schottisches Pfund";}s:3:"STD";a:2:{i:0;s:3:"STD";i:1;s:5:"Dobra";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:28:"Sao Tome und Principe Escudo";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:24:"Sowjetischer Neuer Rubel";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:18:"Sowjetischer Rubel";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:17:"El Sa
lvador Colon";}s:3:"SYP";a:2:{i:0;s:3:"SYP";i:1;s:15:"Syrisches Pfund";}s:3:"SZL";a:2:{i:0;s:3:"SZL";i:1;s:9:"Lilangeni";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:22:"Turks und Caicos Krone";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:16:"Tschad CFA Franc";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:4:"Baht";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:19:"Tadschikistan Rubel";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:20:"Tadschikistan Somoni";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:18:"Turkmenistan-Manat";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:17:"Tunesischer Dinar";}s:3:"TOP";a:2:{i:0;s:3:"TOP";i:1;s:8:"Paʻanga";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:20:"Tonga Pfund Sterling";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:12:"Timor Escudo";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:12:"Timor Pataca";}s:3:"TRL";a:2:{i:0;s:3:"TRL";i:1;s:15:"Türkische Lira";}s:3:"TTD";a:2:{i:0;s:3:"TTD";i:1;s:26:"Trinidad und Tobago Dollar";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:32:"Trinidad und Tobago Dollar (alt)";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:13:"Tuvalu Dollar";}s:3:"TWD";a:2:{i:0;s:3:"TWD";i:1;s:19:"Neuer Taiwan Dollar";}s:3:"TZS";a:2:{i:0;s:3:"TZS";i:1;s:18:"Tansania Schilling";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:7:"Hryvnia";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:24:"Ukrainischer Karbovanetz";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:28:"Uganda Schilling (1966-1987)";}s:3:"UGX";a:2:{i:0;s:3:"UGX";i:1;s:16:"Uganda Schilling";}s:3:"USD";a:2:{i:0;s:1:"$";i:1;s:9:"US Dollar";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:25:"US Dollar (Nächster Tag)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:24:"US Dollar (Gleicher Tag)";}s:3:"UYU";a:2:{i:0;s:3:"UYU";i:1;s:18:"Uruguayischer Peso";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:14:"Usbekistan Sum";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:17:"Vatikanstadt Lire";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:29:"Nordvietnam Piastre Dong Viet";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:22:"Nordvietnam Neuer Dong";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:39:"Nordvietnam Viet Minh Piastre Dong Viet";}s:3:"VEB";a:2:{i:0;s:3:"VEB";i:1;s:7:"Bolivar";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:31:"Britische Jungferninse
ln Dollar";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:4:"Dong";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:26:"Vietnamesischer Neuer Dong";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:21:"Republik Vietnam Dong";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:20:"Vietnamesischer Dong";}s:3:"VUV";a:2:{i:0;s:3:"VUV";i:1;s:4:"Vatu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:16:"West-Samoa Pfund";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:4:"Tala";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:23:"CFA Franc (Äquatorial)";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:4:"Gold";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:29:"Europäische Rechnungseinheit";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:35:"Europäische Rechnungseinheit (XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:35:"Europäische Rechnungseinheit (XBD)";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:21:"Ostkaribischer Dollar";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:20:"Sonderziehungsrechte";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:25:"Französischer Gold-Franc";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:24:"Französischer UIC-Franc";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:17:"Islamischer Dinar";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:33:"Französischer Antillen CFA Franc";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:16:"CFA Franc (West)";}s:3:"XPF";a:2:{i:0;s:3:"XPF";i:1;s:9:"CFP Franc";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:27:"COMECON Transferabler Rubel";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:11:"Jemen Dinar";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:17:"Jemen Imadi Riyal";}s:3:"YER";a:2:{i:0;s:3:"YER";i:1;s:10:"Jemen Rial";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:32:"Jugoslawischer Dinar (1966-1990)";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:31:"Jugoslawische Föderation Dinar";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:25:"Jugoslawischer 1994-Dinar";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:11:"Neuer Dinar";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:34:"Jugoslawischer Dinar (konvertibel)";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:28:"Jugoslawischer Oktober-Dinar";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:33:"Jugoslawischer Reformierter Dinar";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:23:"Südafrikanisches Pfund";}s:3:"ZAR";a:2:{i:0;s:3:"ZAR";
i:1;s:4:"Rand";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:6:"Kwacha";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:16:"Sambisches Pfund";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:11:"Neuer Zaire";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:5:"Zaire";}s:3:"ZWD";a:2:{i:0;s:3:"ZWD";i:1;s:15:"Simbabwe Dollar";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:8:"Kalender";}s:9:"collation";a:1:{i:0;s:10:"Sortierung";}s:8:"currency";a:1:{i:0;s:8:"Währung";}}s:9:"Languages";a:193:{s:2:"aa";a:1:{i:0;s:4:"Afar";}s:2:"ab";a:1:{i:0;s:10:"Abchasisch";}s:2:"ae";a:1:{i:0;s:9:"Avestisch";}s:2:"af";a:1:{i:0;s:9:"Afrikaans";}s:2:"ak";a:1:{i:0;s:4:"Akan";}s:2:"am";a:1:{i:0;s:9:"Amharisch";}s:2:"an";a:1:{i:0;s:12:"Aragonesisch";}s:2:"ar";a:1:{i:0;s:8:"Arabisch";}s:2:"as";a:1:{i:0;s:11:"Assamesisch";}s:2:"av";a:1:{i:0;s:8:"Awarisch";}s:2:"ay";a:1:{i:0;s:15:"Aymará-Sprache";}s:2:"az";a:1:{i:0;s:17:"Aserbaidschanisch";}s:2:"ba";a:1:{i:0;s:12:"Baschkirisch";}s:2:"be";a:1:{i:0;s:13:"Weißrussisch";}s:2:"bg";a:1:{i:0;s:10:"Bulgarisch";}s:2:"bh";a:1:{i:0;s:9:"Biharisch";}s:2:"bi";a:1:{i:0;s:7:"Bislama";}s:2:"bm";a:1:{i:0;s:15:"Bambara-Sprache";}s:2:"bn";a:1:{i:0;s:10:"Bengalisch";}s:2:"bo";a:1:{i:0;s:9:"Tibetisch";}s:2:"br";a:1:{i:0;s:10:"Bretonisch";}s:2:"bs";a:1:{i:0;s:8:"Bosnisch";}s:2:"ca";a:1:{i:0;s:11:"Katalanisch";}s:2:"ce";a:1:{i:0;s:15:"Tschetschenisch";}s:2:"ch";a:1:{i:0;s:16:"Chamorro-Sprache";}s:3:"chr";a:1:{i:0;s:8:"Cherokee";}s:2:"co";a:1:{i:0;s:8:"Korsisch";}s:2:"cr";a:1:{i:0;s:4:"Cree";}s:2:"cs";a:1:{i:0;s:11:"Tschechisch";}s:2:"cu";a:1:{i:0;s:15:"Kirchenslawisch";}s:2:"cv";a:1:{i:0;s:14:"Tschuwaschisch";}s:2:"cy";a:1:{i:0;s:8:"Kymrisch";}s:2:"da";a:1:{i:0;s:8:"Dänisch";}s:2:"de";a:1:{i:0;s:7:"Deutsch";}s:2:"dv";a:1:{i:0;s:11:"Maledivisch";}s:2:"dz";a:1:{i:0;s:10:"Bhutanisch";}s:2:"ee";a:1:{i:0;s:11:"Ewe-Sprache";}s:2:"el";a:1:{i:0;s:10:"Griechisch";}s:2:"en";a:1:{i:0;s:8:"Englisch";}s:3:"enm";a:1:{i:0;s:14:"Mittelenglisch";}s:2:"eo";a:1:{i:0;s:9:"Esperanto";}s:2:"es";a:1:{i:0;s:8:"Spanisch";}s:2:"et";a:1:{i:0;s:8:"Estnisch";}s:2:"eu";a:1:{i:0;s:8:"Baskisch
";}s:2:"fa";a:1:{i:0;s:8:"Persisch";}s:2:"ff";a:1:{i:0;s:3:"Ful";}s:2:"fi";a:1:{i:0;s:8:"Finnisch";}s:2:"fj";a:1:{i:0;s:13:"Fidschianisch";}s:2:"fo";a:1:{i:0;s:10:"Färöisch";}s:2:"fr";a:1:{i:0;s:12:"Französisch";}s:2:"fy";a:1:{i:0;s:9:"Friesisch";}s:2:"ga";a:1:{i:0;s:6:"Irisch";}s:2:"gd";a:1:{i:0;s:19:"Schottisch-Gälisch";}s:3:"gez";a:1:{i:0;s:14:"Altäthiopisch";}s:2:"gl";a:1:{i:0;s:9:"Galizisch";}s:2:"gn";a:1:{i:0;s:7:"Guarani";}s:2:"gu";a:1:{i:0;s:8:"Gujarati";}s:2:"gv";a:1:{i:0;s:4:"Manx";}s:2:"ha";a:1:{i:0;s:5:"Hausa";}s:3:"haw";a:1:{i:0;s:12:"Hawaiianisch";}s:2:"he";a:1:{i:0;s:10:"Hebräisch";}s:2:"hi";a:1:{i:0;s:5:"Hindi";}s:2:"ho";a:1:{i:0;s:9:"Hiri-Motu";}s:2:"hr";a:1:{i:0;s:9:"Kroatisch";}s:2:"ht";a:1:{i:0;s:9:"Kreolisch";}s:2:"hu";a:1:{i:0;s:9:"Ungarisch";}s:2:"hy";a:1:{i:0;s:9:"Armenisch";}s:2:"hz";a:1:{i:0;s:14:"Herero-Sprache";}s:2:"ia";a:1:{i:0;s:11:"Interlingua";}s:2:"id";a:1:{i:0;s:11:"Indonesisch";}s:2:"ie";a:1:{i:0;s:11:"Interlingue";}s:2:"ig";a:1:{i:0;s:12:"Igbo-Sprache";}s:2:"ik";a:1:{i:0;s:7:"Inupiak";}s:2:"is";a:1:{i:0;s:11:"Isländisch";}s:2:"it";a:1:{i:0;s:11:"Italienisch";}s:2:"iu";a:1:{i:0;s:8:"Inukitut";}s:2:"ja";a:1:{i:0;s:9:"Japanisch";}s:2:"jv";a:1:{i:0;s:9:"Javanisch";}s:2:"ka";a:1:{i:0;s:9:"Georgisch";}s:2:"kg";a:1:{i:0;s:5:"Kongo";}s:2:"ki";a:1:{i:0;s:14:"Kikuyu-Sprache";}s:2:"kj";a:1:{i:0;s:8:"Kwanyama";}s:2:"kk";a:1:{i:0;s:10:"Kasachisch";}s:2:"kl";a:1:{i:0;s:14:"Grönländisch";}s:2:"km";a:1:{i:0;s:15:"Kambodschanisch";}s:2:"kn";a:1:{i:0;s:7:"Kannada";}s:2:"ko";a:1:{i:0;s:10:"Koreanisch";}s:3:"kok";a:1:{i:0;s:7:"Konkani";}s:2:"kr";a:1:{i:0;s:14:"Kanuri-Sprache";}s:2:"ks";a:1:{i:0;s:12:"Kaschmirisch";}s:2:"ku";a:1:{i:0;s:8:"Kurdisch";}s:2:"kv";a:1:{i:0;s:12:"Komi-Sprache";}s:2:"kw";a:1:{i:0;s:8:"Kornisch";}s:2:"ky";a:1:{i:0;s:10:"Kirgisisch";}s:2:"la";a:1:{i:0;s:6:"Latein";}s:2:"lb";a:1:{i:0;s:13:"Luxemburgisch";}s:2:"lg";a:1:{i:0;s:13:"Ganda-Sprache";}s:2:"li";a:1:{i:0;s:11:"Limburgisch";}s:2:"ln";a:1:{i:0;s:7:"Lingala";}s:2:"lo";a:1:{i:0;s:8:"Laotisch";}s:2:"lt";a:1:{i:0;
s:9:"Litauisch";}s:2:"lu";a:1:{i:0;s:4:"Luba";}s:2:"lv";a:1:{i:0;s:8:"Lettisch";}s:2:"mg";a:1:{i:0;s:12:"Madagassisch";}s:2:"mh";a:1:{i:0;s:15:"Marschallesisch";}s:2:"mi";a:1:{i:0;s:5:"Maori";}s:2:"mk";a:1:{i:0;s:11:"Mazedonisch";}s:2:"ml";a:1:{i:0;s:9:"Malayalam";}s:2:"mn";a:1:{i:0;s:10:"Mongolisch";}s:2:"mo";a:1:{i:0;s:10:"Moldauisch";}s:2:"mr";a:1:{i:0;s:7:"Marathi";}s:2:"ms";a:1:{i:0;s:9:"Malaiisch";}s:2:"mt";a:1:{i:0;s:10:"Maltesisch";}s:2:"my";a:1:{i:0;s:10:"Birmanisch";}s:2:"na";a:1:{i:0;s:9:"Nauruisch";}s:2:"nb";a:1:{i:0;s:18:"Norwegisch Bokmål";}s:2:"nd";a:1:{i:0;s:22:"Ndebele-Sprache (Nord)";}s:2:"ne";a:1:{i:0;s:11:"Nepalesisch";}s:2:"ng";a:1:{i:0;s:6:"Ndonga";}s:2:"nl";a:1:{i:0;s:15:"Niederländisch";}s:2:"nn";a:1:{i:0;s:18:"Norwegisch Nynorsk";}s:2:"no";a:1:{i:0;s:10:"Norwegisch";}s:2:"nr";a:1:{i:0;s:22:"Ndebele-Sprache (Süd)";}s:2:"nv";a:1:{i:0;s:14:"Navajo-Sprache";}s:2:"ny";a:1:{i:0;s:13:"Chewa-Sprache";}s:2:"oc";a:1:{i:0;s:11:"Okzitanisch";}s:2:"oj";a:1:{i:0;s:14:"Ojibwa-Sprache";}s:2:"om";a:1:{i:0;s:5:"Oromo";}s:2:"or";a:1:{i:0;s:5:"Orija";}s:2:"os";a:1:{i:0;s:9:"Ossetisch";}s:2:"pa";a:1:{i:0;s:13:"Pandschabisch";}s:2:"pi";a:1:{i:0;s:4:"Pali";}s:2:"pl";a:1:{i:0;s:8:"Polnisch";}s:2:"ps";a:1:{i:0;s:20:"Afghanisch (Paschtu)";}s:2:"pt";a:1:{i:0;s:13:"Portugiesisch";}s:2:"qu";a:1:{i:0;s:7:"Quechua";}s:2:"rm";a:1:{i:0;s:14:"Rätoromanisch";}s:2:"rn";a:1:{i:0;s:13:"Rundi-Sprache";}s:2:"ro";a:1:{i:0;s:10:"Rumänisch";}s:2:"ru";a:1:{i:0;s:8:"Russisch";}s:2:"rw";a:1:{i:0;s:14:"Rwanda-Sprache";}s:2:"sa";a:1:{i:0;s:8:"Sanskrit";}s:2:"sc";a:1:{i:0;s:8:"Sardisch";}s:2:"sd";a:1:{i:0;s:6:"Sindhi";}s:2:"se";a:1:{i:0;s:12:"Nord-Samisch";}s:2:"sg";a:1:{i:0;s:5:"Sango";}s:2:"sh";a:1:{i:0;s:15:"Serbo-Kroatisch";}s:2:"si";a:1:{i:0;s:13:"Singhalesisch";}s:3:"sid";a:1:{i:0;s:6:"Sidamo";}s:2:"sk";a:1:{i:0;s:10:"Slowakisch";}s:2:"sl";a:1:{i:0;s:10:"Slowenisch";}s:2:"sm";a:1:{i:0;s:10:"Samoanisch";}s:2:"sn";a:1:{i:0;s:5:"Shona";}s:2:"so";a:1:{i:0;s:6:"Somali";}s:2:"sq";a:1:{i:0;s:9:"Albanisch";}s:2:"sr";a:1:{i:0;s:8:"Ser
bisch";}s:2:"ss";a:1:{i:0;s:5:"Swazi";}s:2:"st";a:1:{i:0;s:18:"Süd-Sotho-Sprache";}s:2:"su";a:1:{i:0;s:11:"Sudanesisch";}s:2:"sv";a:1:{i:0;s:10:"Schwedisch";}s:2:"sw";a:1:{i:0;s:7:"Suaheli";}s:3:"syr";a:1:{i:0;s:7:"Syrisch";}s:2:"ta";a:1:{i:0;s:9:"Tamilisch";}s:2:"te";a:1:{i:0;s:6:"Telugu";}s:2:"tg";a:1:{i:0;s:12:"Tadschikisch";}s:2:"th";a:1:{i:0;s:4:"Thai";}s:2:"ti";a:1:{i:0;s:8:"Tigrinja";}s:3:"tig";a:1:{i:0;s:5:"Tigre";}s:2:"tk";a:1:{i:0;s:11:"Turkmenisch";}s:2:"tl";a:1:{i:0;s:7:"Tagalog";}s:2:"tn";a:1:{i:0;s:14:"Tswana-Sprache";}s:2:"to";a:1:{i:0;s:9:"Tongaisch";}s:2:"tr";a:1:{i:0;s:9:"Türkisch";}s:2:"ts";a:1:{i:0;s:6:"Tsonga";}s:2:"tt";a:1:{i:0;s:9:"Tatarisch";}s:2:"tw";a:1:{i:0;s:3:"Twi";}s:2:"ty";a:1:{i:0;s:9:"Tahitisch";}s:2:"ug";a:1:{i:0;s:9:"Uigurisch";}s:2:"uk";a:1:{i:0;s:10:"Ukrainisch";}s:2:"ur";a:1:{i:0;s:4:"Urdu";}s:2:"uz";a:1:{i:0;s:9:"Usbekisch";}s:2:"ve";a:1:{i:0;s:13:"Venda-Sprache";}s:2:"vi";a:1:{i:0;s:13:"Vietnamesisch";}s:2:"vo";a:1:{i:0;s:8:"Volapük";}s:2:"wa";a:1:{i:0;s:10:"Wallonisch";}s:2:"wo";a:1:{i:0;s:5:"Wolof";}s:2:"xh";a:1:{i:0;s:5:"Xhosa";}s:2:"yi";a:1:{i:0;s:8:"Jiddisch";}s:2:"yo";a:1:{i:0;s:6:"Joruba";}s:2:"za";a:1:{i:0;s:6:"Zhuang";}s:3:"zap";a:1:{i:0;s:11:"Zapotekisch";}s:2:"zh";a:1:{i:0;s:10:"Chinesisch";}s:2:"zu";a:1:{i:0;s:4:"Zulu";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Scripts";a:47:{s:4:"Arab";a:1:{i:0;s:8:"Arabisch";}s:4:"Armn";a:1:{i:0;s:9:"Armenisch";}s:4:"Beng";a:1:{i:0;s:10:"Bengalisch";}s:4:"Bopo";a:1:{i:0;s:8:"Bopomofo";}s:4:"Brai";a:1:{i:0;s:14:"Blindenschrift";}s:4:"Cher";a:1:{i:0;s:8:"Cherokee";}s:4:"Copt";a:1:{i:0;s:8:"Koptisch";}s:4:"Cprt";a:1:{i:0;s:11:"Zypriotisch";}s:4:"Cyrl";a:1:{i:0;s:10:"Kyrillisch";}s:4:"Deva";a:1:{i:0;s:10:"Devanagari";}s:4:"Ethi";a:1:{i:0;s:11:"Äthiopisch";}s:4:"Geor";a:1:{i:0;s:9:"Georgisch";}s:4:"Goth";a:1:{i:0;s:7:"Gotisch";}s:4:"Grek";a:1:{i
:0;s:10:"Griechisch";}s:4:"Gujr";a:1:{i:0;s:8:"Gujarati";}s:4:"Guru";a:1:{i:0;s:8:"Gurmukhi";}s:4:"Hang";a:1:{i:0;s:6:"Hangul";}s:4:"Hani";a:1:{i:0;s:10:"Chinesisch";}s:4:"Hans";a:1:{i:0;s:32:"Vereinfachte Chinesische Schrift";}s:4:"Hant";a:1:{i:0;s:33:"Traditionelle Chinesische Schrift";}s:4:"Hebr";a:1:{i:0;s:10:"Hebräisch";}s:4:"Hira";a:1:{i:0;s:8:"Hiragana";}s:4:"Ital";a:1:{i:0;s:11:"Altitalisch";}s:4:"Kana";a:1:{i:0;s:8:"Katakana";}s:4:"Khmr";a:1:{i:0;s:5:"Khmer";}s:4:"Knda";a:1:{i:0;s:7:"Kannada";}s:4:"Laoo";a:1:{i:0;s:8:"Laotisch";}s:4:"Latn";a:1:{i:0;s:10:"Lateinisch";}s:4:"Limb";a:1:{i:0;s:5:"Limbu";}s:4:"Linb";a:1:{i:0;s:8:"Linear B";}s:4:"Mlym";a:1:{i:0;s:10:"Malaysisch";}s:4:"Mong";a:1:{i:0;s:10:"Mongolisch";}s:4:"Mymr";a:1:{i:0;s:10:"Burmesisch";}s:4:"Ogam";a:1:{i:0;s:5:"Ogham";}s:4:"Orya";a:1:{i:0;s:5:"Oriya";}s:4:"Osma";a:1:{i:0;s:9:"Osmanisch";}s:4:"Qaai";a:1:{i:0;s:20:"Geerbter Schriftwert";}s:4:"Runr";a:1:{i:0;s:12:"Runenschrift";}s:4:"Sinh";a:1:{i:0;s:13:"Singhalesisch";}s:4:"Syrc";a:1:{i:0;s:7:"Syrisch";}s:4:"Taml";a:1:{i:0;s:9:"Tamilisch";}s:4:"Telu";a:1:{i:0;s:6:"Telugu";}s:4:"Tglg";a:1:{i:0;s:7:"Tagalog";}s:4:"Tibt";a:1:{i:0;s:9:"Tibetisch";}s:4:"Ugar";a:1:{i:0;s:10:"Ugaritisch";}s:4:"Yiii";a:1:{i:0;s:2:"Yi";}s:4:"Zyyy";a:1:{i:0;s:10:"Unbestimmt";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:23:"Buddhistischer Kalender";}s:7:"chinese";a:1:{i:0;s:21:"Chinesischer Kalender";}s:9:"gregorian";a:1:{i:0;s:24:"Gregorianischer Kalender";}s:6:"hebrew";a:1:{i:0;s:21:"Hebräischer Kalender";}s:7:"islamic";a:1:{i:0;s:20:"Islamischer Kalender";}s:13:"islamic-civil";a:1:{i:0;s:34:"Bürgerlicher islamischer Kalender";}s:8:"japanese";a:1:{i:0;s:20:"Japanischer Kalender";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:21:"Direkte Sortierregeln";}s:9:"phonebook";a:1:{i:0;s:25:"Telefonbuch-Sortierregeln";}s:6:"pinyin";a:1:{i:0;s:20:"Pinyin-Sortierregeln";}s:6:"stroke";a:1:{i:0;s:11:"Strichfolge";}s:11:"traditional";a:1:{i:0;s:27:"Traditionelle Sortierregeln";}}}s:8:"Variants";a:2:{s:5:"POSIX
";a:1:{i:0;s:5:"Posix";}s:7:"REVISED";a:1:{i:0;s:9:"Revidiert";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:6:{s:11:"AmPmMarkers";a:2:{i:0;s:5:"vorm.";i:1;s:6:"nachm.";}s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:12:"H:mm' Uhr 'z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:18:"EEEE, d. MMMM yyyy";i:5;s:12:"d. MMMM yyyy";i:6;s:10:"dd.MM.yyyy";i:7;s:8:"dd.MM.yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:2:"So";i:1;s:2:"Mo";i:2;s:2:"Di";i:3;s:2:"Mi";i:4;s:2:"Do";i:5;s:2:"Fr";i:6;s:2:"Sa";}s:6:"narrow";a:7:{i:0;s:1:"S";i:1;s:1:"M";i:2;s:1:"D";i:3;s:1:"M";i:4;s:1:"D";i:5;s:1:"F";i:6;s:1:"S";}s:4:"wide";a:7:{i:0;s:7:"Sonntag";i:1;s:6:"Montag";i:2;s:8:"Dienstag";i:3;s:8:"Mittwoch";i:4;s:10:"Donnerstag";i:5;s:7:"Freitag";i:6;s:7:"Samstag";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:7:"v. Chr.";i:1;s:7:"n. Chr.";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:3:"Jan";i:1;s:3:"Feb";i:2;s:3:"Mrz";i:3;s:3:"Apr";i:4;s:3:"Mai";i:5;s:3:"Jun";i:6;s:3:"Jul";i:7;s:3:"Aug";i:8;s:3:"Sep";i:9;s:3:"Okt";i:10;s:3:"Nov";i:11;s:3:"Dez";}s:6:"narrow";a:12:{i:0;s:1:"J";i:1;s:1:"F";i:2;s:1:"M";i:3;s:1:"A";i:4;s:1:"M";i:5;s:1:"J";i:6;s:1:"J";i:7;s:1:"A";i:8;s:1:"S";i:9;s:1:"O";i:10;s:1:"N";i:11;s:1:"D";}s:4:"wide";a:12:{i:0;s:6:"Januar";i:1;s:7:"Februar";i:2;s:5:"März";i:3;s:5:"April";i:4;s:3:"Mai";i:5;s:4:"Juni";i:6;s:4:"Juli";i:7;s:6:"August";i:8;s:9:"September";i:9;s:7:"Oktober";i:10;s:8:"November";i:11;s:8:"Dezember";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GjMtkHmsSEDFwWahKzJeugAZ";}s:11:"zoneStrings";a:1:{i:0;a:6:{i:0;s:13:"Europe/Berlin";i:1;s:23:"Mitteleuropäische Zeit";i:2;s:3:"MEZ";i:3;s:29:"Mitteleuropäische Sommerzeit";i:4;s:4:"MESZ";i:5;s:6:"Berlin";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_AT.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_AT.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_AT.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:16:"DateTimePatterns";a:9:{i:0;s:13:"HH:mm' Uhr 'z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:19:"EEEE, dd. MMMM yyyy";i:5;s:13:"dd. MMMM yyyy";i:6;s:10:"dd.MM.yyyy";i:7;s:8:"dd.MM.yy";i:8;s:7:"{1} {0}";}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:4:"Jän";i:1;s:3:"Feb";i:2;s:4:"Mär";i:3;s:3:"Apr";i:4;s:3:"Mai";i:5;s:3:"Jun";i:6;s:3:"Jul";i:7;s:3:"Aug";i:8;s:3:"Sep";i:9;s:3:"Okt";i:10;s:3:"Nov";i:11;s:3:"Dez";}s:4:"wide";a:12:{i:0;s:7:"Jänner";i:1;s:7:"Februar";i:2;s:5:"März";i:3;s:5:"April";i:4;s:3:"Mai";i:5;s:4:"Juni";i:6;s:4:"Juli";i:7;s:6:"August";i:8;s:9:"September";i:9;s:7:"Oktober";i:10;s:8:"November";i:11;s:8:"Dezember";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_BE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_BE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_BE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:10:"Currencies";a:1:{s:3:"FRF";a:2:{i:0;s:2:"FF";i:1;s:7:"Franken";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:16:"DateTimePatterns";a:9:{i:0;s:24:"HH 'h' mm 'min' ss 's' z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:8:"d-MMM-yy";i:7;s:7:"d/MM/yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:1:{s:11:"abbreviated";a:7:{i:0;s:3:"Son";i:1;s:3:"Mon";i:2;s:3:"Die";i:3;s:3:"Mit";i:4;s:3:"Don";i:5;s:3:"Fre";i:6;s:3:"Sam";}}}s:10:"monthNames";a:1:{s:6:"format";a:1:{s:11:"abbreviated";a:12:{i:0;s:3:"Jan";i:1;s:3:"Feb";i:2;s:4:"Mär";i:3;s:3:"Apr";i:4;s:3:"Mai";i:5;s:3:"Jun";i:6;s:3:"Jul";i:7;s:3:"Aug";i:8;s:3:"Sep";i:9;s:3:"Okt";i:10;s:3:"Nov";i:11;s:3:"Dez";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_CH.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_CH.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_CH.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:9:"Countries";a:11:{s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BN";a:1:{i:0;s:6:"Brunei";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"CV";a:1:{i:0;s:9:"Kapverden";}s:2:"DJ";a:1:{i:0;s:8:"Djibouti";}s:2:"GB";a:1:{i:0;s:15:"Grossbritannien";}s:2:"MH";a:1:{i:0;s:15:"Marshall-Inseln";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SB";a:1:{i:0;s:14:"Salomon-Inseln";}s:2:"ST";a:1:{i:0;s:22:"Sao Tomé und Principe";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:14:"NumberElements";a:12:{i:0;s:1:".";i:1;s:1:"'";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:23:"¤ #,##0.00;¤-#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_DE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_DE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_DE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_LU.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_LU.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/de_LU.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:10:"Currencies";a:1:{s:3:"LUF";a:3:{i:0;s:1:"F";i:1;s:21:"Luxemburgischer Franc";i:2;a:3:{i:0;s:18:"#,##0 ¤;-#,##0 ¤";i:1;s:1:".";i:2;s:1:",";}}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/el.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/el.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/el.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:11:{s:9:"Countries";a:239:{s:2:"AD";a:1:{i:0;s:12:"ΑνδόÏα";}s:2:"AE";a:1:{i:0;s:44:"Ηνωμένα ΑÏαβικά ΕμιÏάτα";}s:2:"AF";a:1:{i:0;s:20:"Αφγανιστάν";}s:2:"AG";a:1:{i:0;s:48:"Αντίγκουα και ΜπαÏμποÏντα";}s:2:"AI";a:1:{i:0;s:18:"Ανγκουίλα";}s:2:"AL";a:1:{i:0;s:14:"Αλβανία";}s:2:"AM";a:1:{i:0;s:14:"ΑÏμενία";}s:2:"AN";a:1:{i:0;s:37:"Ολλανδικές Αντίλλες";}s:2:"AO";a:1:{i:0;s:14:"Ανγκόλα";}s:2:"AQ";a:1:{i:0;s:20:"ΑνταÏκτική";}s:2:"AR";a:1:{i:0;s:18:"ΑÏγεντινή";}s:2:"AS";a:1:{i:0;s:33:"ΑμεÏικανική Σαμόα";}s:2:"AT";a:1:{i:0;s:14:"ΑυστÏία";}s:2:"AU";a:1:{i:0;s:18:"ΑυστÏαλία";}s:2:"AW";a:1:{i:0;s:14:"ΑÏοÏμπα";}s:2:"AZ";a:1:{i:0;s:24:"ΑζεÏμπαϊτζάν";}s:2:"BA";a:1:{i:0;s:35:"Βοσνία - ΕÏζεγοβίνη";}s:2:"BB";a:1:{i:0;s:22:"ΜπαÏμπάντος";}s:2:"BD";a:1:{i:0;s:24:"Μπανγκλαντές";}s:2:"BE";a:1:{i:0;s:12:"Βέλγιο";}s:2:"BF";a:1:{i:0;s:27:"ΜπουÏκίνα Φάσο";}s:2:"BG";a:1:{i:0;s:18:"ΒουλγαÏία";}s:2:"BH";a:1:{i:0;s:16:"ΜπαχÏέιν";}s:2:"BI";a:1:{i:0;s:20:"ΜπουÏοÏντι";}s:2:"BJ";a:1:{i:0;s:12:"Μπένιν";}s:2:"BM";a:1:{i:0;s:18:"ΒεÏμοÏδες";}s:2:"BN";a:1:{i:0;s:39:"ΜπÏουνέι ÎταÏουσαλάμ";}s:2:"BO";a:1:{i:0;s:14:"Βολιβία";}s:2:"BR";a:1:{i:0;s:16:"Î’Ïαζιλία";}s:2:"BS";a:1:{i:0;s:16:"Μπαχάμες";}s:2:"BT";a:1:{i:0;s:14:"Μπουτάν";}s:2:"BV";a:1:{i:0;s:23:"Îήσος Μπουβέ";}s:2:"BW";a:1:{i:0;s:20:"Μποτσουάνα";}s:2:"BY";a:1:{i:0;s:20:"ΛευκοÏωσία";}s:2:"BZ";a:1:{i:0;s:12:"Μπελίζ";}s:2:"CA";a:1:{i:0;s:14:"Καναδάς";}s:2:"CC";a:1:{i:0;s:38:"Îήσοι Κόκος (Κήλινγκ)";}s:2:"CD";a:1:{i:0;s:52:"Κονγκό, Λαϊκή ΔημοκÏατία του";}s:2:"CF";a:1:{i:0;s:53:"ΚεντÏοαφÏικανική ΔημοκÏατία";}s:2:"CG";a:1:{i:0;s:12:"Κονγκό";}s:2:"CH";a:1:{i:0;s:14:"ΕλÎ
²ÎµÏ„ία";}s:2:"CI";a:1:{i:0;s:37:"Ακτή Ελεφαντόδοντος";}s:2:"CK";a:1:{i:0;s:19:"Îήσοι Κουκ";}s:2:"CL";a:1:{i:0;s:8:"Χιλή";}s:2:"CM";a:1:{i:0;s:16:"ΚαμεÏοÏν";}s:2:"CN";a:1:{i:0;s:8:"Κίνα";}s:2:"CO";a:1:{i:0;s:16:"Κολομβία";}s:2:"CR";a:1:{i:0;s:19:"Κόστα Ρίκα";}s:2:"CU";a:1:{i:0;s:10:"ΚοÏβα";}s:2:"CV";a:1:{i:0;s:48:"Îήσοι ΠÏάσινου ΑκÏωτηÏίου";}s:2:"CX";a:1:{i:0;s:37:"Îήσος ΧÏιστουγέννων";}s:2:"CY";a:1:{i:0;s:12:"ΚÏÏ€Ïος";}s:2:"CZ";a:1:{i:0;s:12:"Τσεχία";}s:2:"DE";a:1:{i:0;s:16:"ΓεÏμανία";}s:2:"DJ";a:1:{i:0;s:18:"Τζιμπουτί";}s:2:"DK";a:1:{i:0;s:10:"Δανία";}s:2:"DM";a:1:{i:0;s:18:"Îτομίνικα";}s:2:"DO";a:1:{i:0;s:41:"Δομινικανή ΔημοκÏατία";}s:2:"DZ";a:1:{i:0;s:14:"ΑλγεÏία";}s:2:"EC";a:1:{i:0;s:20:"ΙσημεÏινός";}s:2:"EE";a:1:{i:0;s:14:"Εσθονία";}s:2:"EG";a:1:{i:0;s:16:"Αίγυπτος";}s:2:"EH";a:1:{i:0;s:25:"Δυτική ΣαχάÏα";}s:2:"ER";a:1:{i:0;s:16:"ΕÏυθÏαία";}s:2:"ES";a:1:{i:0;s:14:"Ισπανία";}s:2:"ET";a:1:{i:0;s:16:"Αιθιοπία";}s:2:"FI";a:1:{i:0;s:18:"Φινλανδία";}s:2:"FJ";a:1:{i:0;s:10:"Φίτζι";}s:2:"FK";a:1:{i:0;s:25:"Îήσοι Φώκλαντ";}s:2:"FM";a:1:{i:0;s:68:"ΜικÏονησία, Ομόσπονδες Πολιτείες της";}s:2:"FO";a:1:{i:0;s:23:"Îήσοι ΦεÏόες";}s:2:"FR";a:1:{i:0;s:12:"Γαλλία";}s:2:"GA";a:1:{i:0;s:14:"Γκαμπόν";}s:2:"GB";a:1:{i:0;s:31:"Ηνωμένο Βασίλειο";}s:2:"GD";a:1:{i:0;s:14:"ΓÏενάδα";}s:2:"GE";a:1:{i:0;s:14:"ΓεωÏγία";}s:2:"GF";a:1:{i:0;s:29:"Γαλλική Γουιάνα";}s:2:"GH";a:1:{i:0;s:10:"Γκάνα";}s:2:"GI";a:1:{i:0;s:18:"ΓιβÏαλτάÏ";}s:2:"GL";a:1:{i:0;s:20:"ΓÏοιλανδία";}s:2:"GM";a:1:{i:0;s:14:"Γκάμπια";}s:2:"GN";a:1:{i:0;s:14:"Γουινέα";}s:2:"GP";a:1:{i:0;s:22:"ΓουαδελοÏπη";}s:2:"GQ";a:1:{i:0;s:33:"ΙσημεÏινή Γουινέα";}s:2:"GR"
;a:1:{i:0;s:12:"Ελλάδα";}s:2:"GS";a:1:{i:0;s:75:"Îότια ΓεωÏγία και Îήσοι Îότιες Σάντουιτς";}s:2:"GT";a:1:{i:0;s:20:"Γουατεμάλα";}s:2:"GU";a:1:{i:0;s:12:"Γκουάμ";}s:2:"GW";a:1:{i:0;s:29:"Γουινέα-Μπισάου";}s:2:"GY";a:1:{i:0;s:14:"Γουιάνα";}s:2:"HK";a:1:{i:0;s:95:"Χονγκ Κονγκ, Ειδική Διοικητική ΠεÏιφέÏεια της Κίνας";}s:2:"HM";a:1:{i:0;s:51:"Îήσοι ΧεÏντ και Μακντόναλντ";}s:2:"HN";a:1:{i:0;s:14:"ΟνδοÏÏα";}s:2:"HR";a:1:{i:0;s:14:"ΚÏοατία";}s:2:"HT";a:1:{i:0;s:8:"Αϊτή";}s:2:"HU";a:1:{i:0;s:16:"ΟυγγαÏία";}s:2:"ID";a:1:{i:0;s:18:"Ινδονησία";}s:2:"IE";a:1:{i:0;s:16:"ΙÏλανδία";}s:2:"IL";a:1:{i:0;s:12:"ΙσÏαήλ";}s:2:"IN";a:1:{i:0;s:10:"Ινδία";}s:2:"IO";a:1:{i:0;s:59:"Î’Ïετανικά Έδάφη Î™Î½Î´Î¹ÎºÎ¿Ï Î©ÎºÎµÎ±Î½Î¿Ï";}s:2:"IQ";a:1:{i:0;s:8:"ΙÏάκ";}s:2:"IR";a:1:{i:0;s:54:"ΙÏάν, Ισλαμική ΔημοκÏατία του";}s:2:"IS";a:1:{i:0;s:16:"Ισλανδία";}s:2:"IT";a:1:{i:0;s:12:"Ιταλία";}s:2:"JM";a:1:{i:0;s:16:"Τζαμάικα";}s:2:"JO";a:1:{i:0;s:16:"ΙοÏδανία";}s:2:"JP";a:1:{i:0;s:14:"Ιαπωνία";}s:2:"KE";a:1:{i:0;s:10:"Κένυα";}s:2:"KG";a:1:{i:0;s:16:"ΚιÏγιζία";}s:2:"KH";a:1:{i:0;s:16:"Καμπότζη";}s:2:"KI";a:1:{i:0;s:18:"ΚιÏιμπάτι";}s:2:"KM";a:1:{i:0;s:14:"ΚομόÏες";}s:2:"KN";a:1:{i:0;s:37:"Σαιντ Κιτς και Îέβις";}s:2:"KP";a:1:{i:0;s:24:"ΚοÏέα, Î’ÏŒÏεια";}s:2:"KR";a:1:{i:0;s:22:"ΚοÏέα, Îότια";}s:2:"KW";a:1:{i:0;s:14:"Κουβέιτ";}s:2:"KY";a:1:{i:0;s:23:"Îήσοι Κέιμαν";}s:2:"KZ";a:1:{i:0;s:18:"Καζακστάν";}s:2:"LA";a:1:{i:0;s:31:"Λατινική ΑμεÏική";}s:2:"LB";a:1:{i:0;s:14:"Λίβανος";}s:2:"LC";a:1:{i:0;s:21:"Αγία Λουκία";}s:2:"LI";a:1:{i:0;s:22:"Λιχτενστάιν";}s:2:"LK";a:1:{i:0;s:17:"ΣÏι Λάνκα";}s:2:"LR";a:1:{i:0;s:14:"ΛιβεÏία";}s:2:"LS";
a:1:{i:0;s:12:"Λεσότο";}s:2:"LT";a:1:{i:0;s:18:"Λιθουανία";}s:2:"LU";a:1:{i:0;s:24:"ΛουξεμβοÏÏγο";}s:2:"LV";a:1:{i:0;s:14:"Λετονία";}s:2:"MA";a:1:{i:0;s:12:"ΜαÏόκο";}s:2:"MC";a:1:{i:0;s:12:"Μονακό";}s:2:"MD";a:1:{i:0;s:45:"Μολδαβία, ΔημοκÏατία της";}s:2:"MG";a:1:{i:0;s:22:"ΜαδαγασκάÏη";}s:2:"MH";a:1:{i:0;s:23:"Îήσοι ΜάÏσαλ";}s:2:"MK";a:1:{i:0;s:27:"ΠΓΔ Μακεδονίας";}s:2:"ML";a:1:{i:0;s:8:"Μάλι";}s:2:"MM";a:1:{i:0;s:14:"ΜιανμάÏ";}s:2:"MN";a:1:{i:0;s:16:"Μογγολία";}s:2:"MO";a:1:{i:0;s:84:"Μακάο, Ειδική Διοικητική ΠεÏιφέÏεια της Κίνας";}s:2:"MP";a:1:{i:0;s:42:"Îήσοι Î’ÏŒÏειες ΜαÏιάνες";}s:2:"MQ";a:1:{i:0;s:18:"ΜαÏτινίκα";}s:2:"MR";a:1:{i:0;s:20:"ΜαυÏιτανία";}s:2:"MS";a:1:{i:0;s:16:"ΜονσεÏάτ";}s:2:"MT";a:1:{i:0;s:10:"Μάλτα";}s:2:"MU";a:1:{i:0;s:18:"ΜαυÏίκιος";}s:2:"MV";a:1:{i:0;s:16:"Μαλδίβες";}s:2:"MW";a:1:{i:0;s:14:"Μαλάουι";}s:2:"MX";a:1:{i:0;s:12:"Μεξικό";}s:2:"MY";a:1:{i:0;s:16:"Μαλαισία";}s:2:"MZ";a:1:{i:0;s:18:"Μοζαμβίκη";}s:2:"NA";a:1:{i:0;s:16:"Îαμίμπια";}s:2:"NC";a:1:{i:0;s:25:"Îέα Καληδονία";}s:2:"NE";a:1:{i:0;s:10:"ÎίγηÏ";}s:2:"NF";a:1:{i:0;s:25:"Îήσος ÎÏŒÏφολκ";}s:2:"NG";a:1:{i:0;s:14:"ÎιγηÏία";}s:2:"NI";a:1:{i:0;s:20:"ÎικαÏάγουα";}s:2:"NL";a:1:{i:0;s:16:"Ολλανδία";}s:2:"NO";a:1:{i:0;s:16:"ÎοÏβηγία";}s:2:"NP";a:1:{i:0;s:10:"Îεπάλ";}s:2:"NR";a:1:{i:0;s:14:"ÎαοÏÏου";}s:2:"NU";a:1:{i:0;s:10:"ÎιοÏε";}s:2:"NZ";a:1:{i:0;s:23:"Îέα Ζηλανδία";}s:2:"OM";a:1:{i:0;s:8:"Ομάν";}s:2:"PA";a:1:{i:0;s:14:"Παναμάς";}s:2:"PE";a:1:{i:0;s:10:"ΠεÏοÏ";}s:2:"PF";a:1:{i:0;s:33:"Γαλλική Πολυνησία";}s:2:"PG";a:1:{i:0;s:36:"ΠαποÏα - Îέα Γουινέα";}s:2:"PH";a:1:{i:0;s:20:"Φιλιππίνες";}s:2:"PK";a:1:{i:0;s:16:"Πακιστάν";}s:2:
"PL";a:1:{i:0;s:14:"Πολωνία";}s:2:"PM";a:1:{i:0;s:41:"Σαιντ Î Î¹Î­Ï ÎºÎ±Î¹ Μικελόν";}s:2:"PN";a:1:{i:0;s:14:"ΠίτκεÏν";}s:2:"PR";a:1:{i:0;s:23:"ΠουέÏτο Ρίκο";}s:2:"PS";a:1:{i:0;s:37:"Παλαιστινιακά Εδάφη";}s:2:"PT";a:1:{i:0;s:20:"ΠοÏτογαλία";}s:2:"PW";a:1:{i:0;s:12:"Παλάου";}s:2:"PY";a:1:{i:0;s:18:"ΠαÏαγουάη";}s:2:"QA";a:1:{i:0;s:10:"ΚατάÏ";}s:2:"RE";a:1:{i:0;s:14:"Ρεϋνιόν";}s:2:"RO";a:1:{i:0;s:16:"Ρουμανία";}s:2:"RU";a:1:{i:0;s:10:"Ρωσία";}s:2:"RW";a:1:{i:0;s:14:"Ρουάντα";}s:2:"SA";a:1:{i:0;s:29:"Σαουδική ΑÏαβία";}s:2:"SB";a:1:{i:0;s:31:"Îήσοι Σολομώντος";}s:2:"SC";a:1:{i:0;s:18:"Σεϋχέλλες";}s:2:"SD";a:1:{i:0;s:12:"Σουδάν";}s:2:"SE";a:1:{i:0;s:14:"Σουηδία";}s:2:"SG";a:1:{i:0;s:20:"ΣιγκαποÏÏη";}s:2:"SH";a:1:{i:0;s:19:"Αγία Ελένη";}s:2:"SI";a:1:{i:0;s:16:"Σλοβενία";}s:2:"SJ";a:1:{i:0;s:56:"Îήσοι Î£Î²Î¬Î»Î¼Ï€Î±Ï ÎºÎ±Î¹ Γιαν Μαγιέν";}s:2:"SK";a:1:{i:0;s:16:"Σλοβακία";}s:2:"SL";a:1:{i:0;s:21:"ΣιέÏα Λεόνε";}s:2:"SM";a:1:{i:0;s:25:"Άγιος ΜαÏίνος";}s:2:"SN";a:1:{i:0;s:16:"Σενεγάλη";}s:2:"SO";a:1:{i:0;s:14:"Σομαλία";}s:2:"SP";a:1:{i:0;s:12:"ΣεÏβία";}s:2:"SR";a:1:{i:0;s:16:"ΣουÏινάμ";}s:2:"ST";a:1:{i:0;s:39:"Σάο Τομέ και ΠÏίνσιπε";}s:2:"SV";a:1:{i:0;s:21:"Ελ ΣαλβαδόÏ";}s:2:"SY";a:1:{i:0;s:54:"ΣυÏία, ΑÏαβική ΔημοκÏατία της";}s:2:"SZ";a:1:{i:0;s:22:"Σουαζιλάνδη";}s:2:"TC";a:1:{i:0;s:41:"Îήσοι ΤεÏκς και Κάικος";}s:2:"TD";a:1:{i:0;s:10:"Τσαντ";}s:2:"TF";a:1:{i:0;s:36:"Γαλλικά Îότια Εδάφη";}s:2:"TG";a:1:{i:0;s:10:"Τόγκο";}s:2:"TH";a:1:{i:0;s:16:"Ταϊλάνδη";}s:2:"TJ";a:1:{i:0;s:22:"Τατζικιστάν";}s:2:"TK";a:1:{i:0;s:16:"Τοκελάου";}s:2:"TL";a:1:{i:0;s:29:"Ανατολικό ΤιμόÏ";}s:2:"TM";a:1:{i:0;s:26:"ΤουÏκμενιστάν"
;}s:2:"TN";a:1:{i:0;s:14:"Τυνησία";}s:2:"TO";a:1:{i:0;s:12:"Τόνγκα";}s:2:"TR";a:1:{i:0;s:14:"ΤουÏκία";}s:2:"TT";a:1:{i:0;s:40:"ΤÏινιδάδ και Τομπάγκο";}s:2:"TV";a:1:{i:0;s:16:"ΤουβαλοÏ";}s:2:"TW";a:1:{i:0;s:12:"Ταϊβάν";}s:2:"TZ";a:1:{i:0;s:16:"Τανζανία";}s:2:"UA";a:1:{i:0;s:16:"ΟυκÏανία";}s:2:"UG";a:1:{i:0;s:16:"Ουγκάντα";}s:2:"UM";a:1:{i:0;s:86:"ΑπομακÏυσμένες Îησίδες των Ηνωμένων Πολιτειών";}s:2:"US";a:1:{i:0;s:35:"Ηνωμένες Πολιτείες";}s:2:"UY";a:1:{i:0;s:20:"ΟυÏουγουάη";}s:2:"UZ";a:1:{i:0;s:24:"Ουζμπεκιστάν";}s:2:"VA";a:1:{i:0;s:36:"Αγία ΈδÏα (Βατικανό)";}s:2:"VC";a:1:{i:0;s:57:"Άγιος Βικέντιος και ΓÏεναδίνες";}s:2:"VE";a:1:{i:0;s:20:"Βενεζουέλα";}s:2:"VG";a:1:{i:0;s:48:"Î’Ïετανικές ΠαÏθένοι Îήσοι";}s:2:"VI";a:1:{i:0;s:52:"ΑμεÏικανικές ΠαÏθένοι Îήσοι";}s:2:"VN";a:1:{i:0;s:14:"Βιετνάμ";}s:2:"VU";a:1:{i:0;s:18:"Βανουάτου";}s:2:"WF";a:1:{i:0;s:49:"Îήσοι Ουαλλίς και Φουτουνά";}s:2:"WS";a:1:{i:0;s:10:"Σαμόα";}s:2:"YE";a:1:{i:0;s:12:"Υεμένη";}s:2:"YT";a:1:{i:0;s:12:"Μαγιότ";}s:2:"YU";a:1:{i:0;s:26:"Γιουγκοσλαβία";}s:2:"ZA";a:1:{i:0;s:23:"Îότια ΑφÏική";}s:2:"ZM";a:1:{i:0;s:12:"Ζάμπια";}s:2:"ZW";a:1:{i:0;s:20:"Ζιμπάμπουε";}}s:10:"Currencies";a:364:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:29:"ΔηνάÏιο ΑνδόÏας";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:27:"Πεσέτα ΑνδόÏας";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:63:"ÎτιÏάμ Ηνωμένων ΑÏαβικών ΕμιÏάτων";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:32:"ΦÏάγκο Affars και Issas";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:35:"Λεκ Αλβανίας (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:23:"Λεκ Αλβανίας";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:30:"Λεκ Valute Αλβανίας";}s
:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:101:"Αλβανικά Πιστοποιητικά Ξένου Συναλλάγματος σε ΔολάÏια";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:21:"Dram ΑÏμενίας";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:52:"Γκίλντα Ολλανδικών Αντιλλών";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:23:"Kwanza Ανγκόλας";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:35:"Kwanza Ανγκόλας (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:42:"Îέα Kwanza Ανγκόλας (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:46:"Kwanza Reajustado Ανγκόλας (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:31:"ΕσκοÏδο Ανγκόλας";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:28:"Austral ΑÏγεντινής";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:57:"Εθνικό Îόμισμα Πέσο ΑÏγεντινής";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:41:"Πέσο ΑÏγεντινής (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:29:"Πέσο ΑÏγεντινής";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:29:"Σελίνι ΑυστÏίας";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:35:"ΔολάÏιο ΑυστÏαλίας";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:29:"ΛίÏα ΑυστÏαλίας";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:29:"Γκίλντα ΑÏοÏμπα";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:35:"Μανάτ ΑζεÏμπαϊτζάν";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:52:"ΔηνάÏιο Βοσνίας-ΕÏζεγοβίνης";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:48:"ΜάÏκο Βοσνίας-ΕÏζεγοβίνης";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:59:"Îέο ΔηνάÏιο Βοσνίας-ΕÏζεγοβίνης";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:37:"ΔολάÏιο ΜπαÏμπάντος";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:31:"Τάκα Μπαγκλαντές";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:52:"ΦÏάγκο Βελγίου (μετατÏέψιμο)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:27:"ΦÏάγκο Βελγίου";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:50:"ΦÏάγκο Βελγίου (ο
ικονομικό)";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:46:"Μεταλλικό Λεβ ΒουλγαÏίας";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:52:"Σοσιαλιστικό Λεβ ΒουλγαÏίας";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:34:"Îέο Λεβ ΒουλγαÏίας";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:39:"Λεβ ΒουλγαÏίας (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:76:"Πιστοποιητικά Ξένου Συναλλάγματος σε Λεβ";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:23:"ΔηνάÏιο Bahraini";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:20:"ΦÏάγκο Burundi";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:33:"ΔολάÏιο ΒεÏμοÏδων";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:27:"ΛίÏα ΒεÏμοÏδων";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:21:"ΔολάÏιο Brunei";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:25:"Πέσο Βολιβίας";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:22:"Mvdol Βολιβίας";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:46:"Îέο Cruzeiro Î’Ïαζιλίας (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:26:"Cruzado Î’Ïαζιλίας";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:39:"Cruzeiro Î’Ïαζιλίας (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:23:"Real Î’Ïαζιλίας";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:33:"Îέο Cruzado Î’Ïαζιλίας";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:27:"Cruzeiro Î’Ïαζιλίας";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:39:"Cruzeiro Î’Ïαζιλίας (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:31:"ΔολάÏιο Μπαχάμες";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:25:"ΛίÏα Μπαχάμες";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:23:"Ngultrum Μπουτάν";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:27:"ΡοÏπια Μπουτάν";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:23:"Kyat ΒιÏμανίας";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:31:"ΡοÏπια ΒιÏμανίας";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:25:"Pula Μποτσουάνα";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:54:"Îέο ΡοÏβλι ΛευκοÏωσίας (1994-1999)";}s:3:
"BYL";a:2:{i:0;s:3:"BYL";i:1;s:47:"ΡοÏβλι ΛευκοÏωσίας (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:35:"ΡοÏβλι ΛευκοÏωσίας";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:21:"ΔολάÏιο Belize";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:52:"ΔολάÏιο Î’Ïετανικής ΟνδοÏÏας";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:27:"ΔολάÏιο Καναδά";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:35:"ΦÏάγκο Congolais Κονγκό";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:48:"ΦÏάγκο ΔημοκÏατίας Κονγκό";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:18:"Congolese ΖαÎÏ";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:81:"ΦÏάγκο ΚεντÏικής ΑφÏικανικής ΔημοκÏατίας CFA";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:29:"ΦÏάγκο Ελβετίας";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:34:"ΔολάÏιο Îήσων Κουκ";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:17:"Condor Χιλής";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:25:"ΕσκοÏδο Χιλής";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:30:"Unidades de Fomento Χιλής";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:19:"Πέσο Χιλής";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:33:"ΦÏάγκο ΚαμεÏοÏν CFA";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:28:"Jen Min Piao Yuan Κίνας";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:103:"Πιστοποιητικά Ξένου Συναλλάγματος σε ΔολάÏια ΗΠΑ, Κίνας";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:24:"Yuan Renminbi Κίνας";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:42:"ΧάÏτινο Πέσο Κολομβίας";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:29:"ΦÏάγκο Κονγκό CFA";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:27:"Πέσο Κολομβίας";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:25:"Colon Κόστα Ρίκα";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:41:"ΚοÏόνα Τσεχοσλοβακίας";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:54:"ΣκληÏή ΚοÏόνα Τσεχοσλοβακίας";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:21:"Πέσο ΚοÏβας";}s:3:"CUX";a:2:{i
:0;s:3:"CUX";i:1;s:77:"Πιστοποιητικά Ξένου Συναλλάγματος ΚοÏβας";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:52:"ΕσκοÏδο ΠÏάσινου ΑκÏωτηÏίου";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:22:"Γκίλντα Curacao";}s:3:"CYP";a:2:{i:0;s:2:"£";i:1;s:21:"ΛίÏα ΚÏÏ€Ïου";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:52:"ΚοÏόνα Τσέχικης ΔημοκÏατίας";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:47:"Ostmark Ανατολικής ΓεÏμανίας";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:29:"ΜάÏκο ΓεÏμανίας";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:28:"Sperrmark ΓεÏμανίας";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:31:"ΦÏάγκο Τζιμπουτί";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:25:"ΚοÏόνα Δανίας";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:27:"Πέσο Δομίνικου";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:31:"ΔηνάÏιο ΑλγεÏίας";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:36:"Îέο ΦÏάγκο ΑλγεÏίας";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:38:"Germinal ΦÏάγκο ΑλγεÏίας";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:26:"Sucre ΙσημεÏινοÏ";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:52:"Unidad de Valor Constante (UVC) ΙσημεÏινοÏ";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:29:"ΚοÏόνα Εσθονίας";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:25:"ΛίÏα ΑιγÏπτου";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:14:"Eritrean Nakfa";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:29:"Πεσέτα Ισπανίας";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:23:"Birr Αιθιοπίας";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:33:"ΔολάÏιο Αιθιοπίας";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:8:"ΕυÏÏŽ";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:31:"ΜάÏκο Φινλανδίας";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:43:"ΜάÏκο Φινλανδίας (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:25:"ΔολάÏιο Φίτζι";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:19:"ΛίÏα Φίτζι";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:38:"ΛίÏα Îησιών 
Φώλκλαντ";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:24:"Kronur Îήσων Faeroe";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:27:"ΦÏάγκο Γαλλίας";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:58:"ΦÏάγκο Germinal/ΦÏάγκο Poincare Γαλλίας";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:31:"ΦÏάγκο Γκαμπόν CFA";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:44:"ΛίÏα ΣτεÏλίνα Î’Ïετανίας";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:28:"Kupon Larit ΓεωÏγίας";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:21:"Lari ΓεωÏγίας";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:17:"Cedi Γκάνας";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:30:"Παλαιό Cedi Γκάνας";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:21:"ΛίÏα Γκάνας";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:40:"Ανατιμημένο Cedi Γκάνας";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:27:"ΛίÏα ΓιβÏαλτάÏ";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:35:"ΚοÏόνα ΓÏοιλανδίας";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:21:"Dalasi Γκάμπια";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:23:"ΛίÏα Γκάμπια";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:29:"ΦÏάγκο Γουινέας";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:41:"ΦÏάγκο Γουινέας (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:21:"Syli Γουινέας";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:37:"ΦÏάγκο ΓουαδελοÏπης";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:53:"Ekwele Guineana ΙσημεÏινής Γουινέας";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:50:"ΦÏάγκο ΙσημεÏινής Γουινέας";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:59:"Πεσέτα Guineana ΙσημεÏινής Γουινέας";}s:3:"GRD";a:2:{i:0;s:6:"ΔÏχ";i:1;s:6:"ΔÏχ";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:34:"Îέα ΔÏαχμή Ελλάδας";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:28:"Quetzal Γουατεμάλα";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:53:"ΦÏάγκο Guiana Γαλλικής Γουιάνας";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:50:"Γκινέα ΕσκοÏδο ΠοÏτογÎ
±Î»Î¯Î±Ï‚";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:44:"Γκινέα Mil Reis ΠοÏτογαλίας";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:22:"Πέσο Guinea-Bissau";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:31:"ΔολάÏιο Γουιάνας";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:36:"ΔολάÏιο Χονγκ Κονγκ";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:31:"ΔηνάÏιο ΚÏοατίας";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:19:"Kuna ΔηνάÏιο";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:17:"Gourde Αϊτής";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:33:"ΦιοÏίνι ΟυγγαÏίας";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:42:"ΛίÏα Î’ÏŒÏειας ΙÏλανδίας";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:40:"Γκίλντα Nica Ινδονησίας";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:44:"ΡοÏπια Ιάβας Ινδονησίας";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:40:"Îέα ΡοÏπια Ινδονησίας";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:33:"ΡοÏπια Ινδονησίας";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:27:"ΛίÏα ΙÏλανδίας";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:19:"Sheqel ΙσÏαήλ";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:21:"ΛίÏα ΙσÏαήλ";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:26:"Îέο Sheqel ΙσÏαήλ";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:40:"ΛίÏα ΣτεÏλίνα Îήσου Man";}s:3:"INR";a:2:{i:0;s:3:"INR";i:1;s:25:"ΡοÏπια Ινδίας";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:23:"ΔηνάÏιο ΙÏάκ";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:13:"Rial ΙÏάκ";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:31:"ΚοÏόνα Ισλανδίας";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:27:"ΛιÏέτα Ιταλίας";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:40:"ΛίÏα ΣτεÏλίνα ΥεÏσέης";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:33:"ΔολάÏιο Τζαμάικας";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:27:"ΛίÏα Τζαμάικας";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:33:"ΔηνάÏιο ΙοÏδανίας";}s:3:"JPY";a:2:{i:0;s:2:"Â¥";i:1;s:25:"Γιεν Ιαπωνίας";}s:3:"KES";a:2:{i:0;s:4:"K
 Sh";i:1;s:25:"Σελίνι Κένυας";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:36:"Παλαιό Riel Καμπότζης";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:23:"Riel Καμπότζης";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:23:"ΔολάÏιο Kiribati";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:19:"ΦÏάγκο Comoro";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:54:"Won ΔημοκÏατίας Î’ÏŒÏειας ΚοÏέας";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:31:"Won Î’ÏŒÏειας ΚοÏέας";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:30:"Hwan Îότιας ΚοÏέας";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:42:"Παλαιό Won Îότιας ΚοÏέας";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:29:"Won Îότιας ΚοÏέας";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:29:"ΔηνάÏιο Κουβέιτ";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:38:"ΔολάÏιο Îήσων Κάιμαν";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:31:"ΡοÏβλι Καζακστάν";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:24:"Tenge Καζακστάν";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:12:"Kip Λάος";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:23:"ΛίÏα Λιβάνου";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:35:"ΦÏάγκο Λιχτενστάιν";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:30:"ΡοÏπια ΣÏι Λάνκα";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:19:"ΡοÏπια Ceylon";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:31:"ΔολάÏιο ΛιβεÏίας";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:25:"Lita Λιθουανίας";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:28:"Talonas Λιθουανίας";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:39:"ΦÏάγκο ΛουξεμβοÏÏγου";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:21:"Lats Λετονίας";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:29:"ΡοÏβλι Λετονίας";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:84:"ΛίÏα Î’Ïετανικής ΣτÏατιωτικής Εξουσίας ΛιβÏης";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:27:"ΔηνάÏιο ΛιβÏης";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:21:"ΛίÏα ΛιβÏης";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:27:"ÎÏ„
ιÏάμ ΜαÏόκου";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:27:"ΦÏάγκο ΜαÏόκου";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:32:"Îέο ΦÏάγκο Μονακό";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:34:"ΦÏάγκο Germinal Μονακό";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:31:"Λέι Cupon Μολδαβίας";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:25:"Λέι Μολδαβίας";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:37:"ΡοÏβλι Cupon Μολδαβίας";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:31:"Ariary ΜαδαγασκάÏης";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:37:"ΦÏάγκο ΜαδαγασκάÏης";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:34:"ΔολάÏιο Îήσων Marshall";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:27:"ΔηνάÏιο Π.Γ.Δ.Îœ.";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:39:"ΔηνάÏιο Π.Γ.Δ.Îœ. (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:21:"ΦÏάγκο Μαλί";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:19:"Kyat ΜιανμάÏ";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:100:"Πιστοποιητικά Ξένου Συναλλάγματος σε ΔολάÏια, ΜιανμάÏ";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:25:"Tugrik Μογγολίας";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:17:"Pataca Μακάο";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:33:"ΦÏάγκο ΜαÏτινίκας";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:30:"Ouguiya ΜαυÏιτανίας";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:25:"ΛιÏέτα Μάλτας";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:21:"ΛίÏα Μάλτας";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:31:"ΡοÏπια ΜαυÏικίου";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:40:"ΡοÏπια Îήσων Μαλδίβων";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:35:"Rufiyaa Îήσων Μαλδίβων";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:21:"Kwacha Μαλάουι";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:23:"ΛίÏα Μαλάουι";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:23:"Πέσο ΜεξικοÏ";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:52:"Ασημένιο Πέσο ÎœÎµÎ¾Î¹ÎºÎ¿Ï (1861-1992)";}s:3:"MXV";a:2:{i:0
;s:3:"MXV";i:1;s:40:"Unidad de Inversion (UDI) ΜεξικοÏ";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:26:"Ringgit Μαλαισίας";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:35:"ΕσκοÏδο Μοζαμβίκης";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:28:"Metical Μοζαμβίκης";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:31:"ΔολάÏιο Îαμίμπια";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:51:"ΦÏάγκο Germinal Îέας Καληδονίας";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:22:"Naira ÎιγηÏίας";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:25:"ΛίÏα ÎιγηÏίας";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:40:"ΦÏάγκο Îέων ΕβÏίδων CFP";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:37:"ΚόÏδοβα ÎικαÏάγουας";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:48:"ΧÏυσή ΚόÏδοβα ÎικαÏάγουας";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:48:"ΧÏυσή ΚόÏδοβα ÎικαÏάγουας";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:33:"Γκίλντα Ολλανδίας";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:31:"ΚοÏόνα ÎοÏβηγίας";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:23:"ΡοÏπια Îεπάλ";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:42:"ΔολάÏιο Îέας Ζηλανδίας";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:36:"ΛίÏα Îέας Ζηλανδίας";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:13:"Rial Ομάν";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:19:"Rial Saidi Ομάν";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:29:"Μπαλμπόα Παναμά";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:15:"Inti ΠεÏοÏ";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:20:"Sol Nuevo ΠεÏοÏ";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:14:"Sol ΠεÏοÏ";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:39:"Kina ΠαποÏα Îέα Γουινέα";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:29:"Πέσο Φιλιππίνων";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:29:"ΡοÏπια Πακιστάν";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:27:"Ζλότυ Πολωνίας";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:102:"Πιστοποιητικά Ξένου Συναλλάγματος σ
ε ΔολάÏια, Πολωνίας";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:39:"Ζλότυ Πολωνίας (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:31:"ΛίÏα Παλαιστίνης";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:28:"Conto ΠοÏτογαλίας";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:37:"ΕσκοÏδο ΠοÏτογαλίας";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:39:"ΓκουαÏανί ΠαÏαγουάης";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:15:"Rial ΚατάÏ";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:20:"ΦÏάγκο Reunion";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:25:"Λέι Ρουμανίας";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:32:"Îέο Λέι Ρουμανίας";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:25:"ΡοÏβλι Ρωσίας";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:37:"ΡοÏβλι Ρωσίας (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:29:"ΦÏάγκο Ρουάντας";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:46:"ΔολάÏιο Îήσων Σολομώντος";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:29:"ΡοÏπια Σεϋχέλες";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:27:"ΔηνάÏιο Σουδάν";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:21:"ΛίÏα Σουδάν";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:29:"ΚοÏόνα Σουηδίας";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:37:"ΔολάÏιο ΣιγκαποÏÏης";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:32:"ΛίÏα Αγίας Ελένης";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:29:"Tolar Bons Σλοβενίας";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:24:"Tolar Σλοβενίας";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:31:"ΚοÏόνα Σλοβενίας";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:27:"Leone ΣιέÏα Λεόνε";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:38:"ΛιÏέτα Αγίου ΜαÏίνου";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:29:"Σελίνι Σομαλίας";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:29:"Σελίνι Σομαλίας";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:31:"Γκίλντα ΣουÏινάμ";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:23:"ΛίÏα ΣκωτίαÏ
‚";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:38:"Îέο Σοβιετικό ΡοÏβλι";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:31:"Σοβιετικό ΡοÏβλι";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:27:"Colon Ελ ΣαλβαδόÏ";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:21:"ΛίÏα ΣυÏίας";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:32:"Lilangeni Ζουαζιλάνδη";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:54:"ΚοÏόνα Îήσων ΤεÏκς και Κάικος";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:27:"ΦÏάγκο Τσαντ CFA";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:27:"Μπατ Ταϊλάνδης";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:35:"ΡοÏβλι Τατζικιστάν";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:29:"Somoni Τατζικιστάν";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:37:"Μανάτ ΤουÏκμενιστάν";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:31:"ΔηνάÏιο Τυνησίας";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:38:"ΛίÏα ΣτεÏλίνα Τόνγκα";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:25:"ΕσκοÏδο ΤιμόÏ";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:17:"Pataca ΤιμόÏ";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:25:"ΛίÏα ΤουÏκίας";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:55:"ΔολάÏιο ΤÏινιδάδ και Τομπάγκο";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:68:"Παλαιό ΔολάÏιο ΤÏινιδάδ και Τομπάγκο";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:21:"Tuvalu ΔολάÏιο";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:34:"Îέο ΔολάÏιο Ταϊβάν";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:31:"Σελίνι Τανζανίας";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:26:"Hryvnia ΟυκÏανίας";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:30:"Karbovanetz ΟυκÏανίας";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:43:"Σελίνι Ουγκάντας (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:31:"Σελίνι Ουγκάντας";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:21:"ΔολάÏιο ΗΠΑ";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:49:"ΔολάÏιο ΗΠΑ (Επόμενη ΗμέÏα)";}s:3:"USS"
;a:2:{i:0;s:3:"USS";i:1;s:43:"ΔολάÏιο ΗΠΑ (Ίδια ΗμέÏα)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:50:"Μεταλλικό Πέσο ΟυÏουγουάης";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:43:"Πέσο ΟυÏουγουάης (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:40:"Πέσο Uruguayo ΟυÏουγουάης";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:35:"Coupon Som Ουζμπεκιστάν";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:28:"Sum Ουζμπεκιστάν";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:31:"ΛιÏέτα ΒατικανοÏ";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:47:"Piastre Dong Viet ΒοÏείου Βιετνάμ";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:41:"Îέο Dong ΒοÏείου Βιετνάμ";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:57:"Viet Minh Piastre Dong Viet ΒοÏείου Βιετνάμ";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:39:"Μπολιβάλ Βενεζουέλας";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:63:"ΔολάÏιο Î’Ïετανικών ΠαÏθένων Îήσων";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:19:"Dong Βιετνάμ";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:26:"Îέο Dong Βιετνάμ";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:42:"Dong ΔημοκÏατίας Βιετνάμ";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:32:"Εθνικό Dong Βιετνάμ";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:34:"ΛίÏα Δυτικής Σαμόα";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:30:"Tala Δυτικής Σαμόα";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:71:"Μονάδα ΛογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Î‘ÏƒÎ¹Î±Ï„Î¹ÎºÎ¿Ï Î”Î·Î½Î±Ïίου";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:21:"ΦÏάγκο BEAC CFA";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:52:"Ασιατική Îομισματική Μονάδα";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:12:"ΧÏυσός";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:46:"ΕυÏωπαϊκή ΣÏνθετη Μονάδα";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:54:"ΕυÏωπαϊκή Îομισματική Μονάδα";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:60:"ΕυÏωπαϊκή Μονάδα ΛογαÏÎ¹Î±ÏƒÎ¼Î¿Ï 
(XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:60:"ΕυÏωπαϊκή Μονάδα ΛογαÏÎ¹Î±ÏƒÎ¼Î¿Ï (XBD)";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:56:"ΔολάÏιο Ανατολικής ΚαÏαϊβικής";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:23:"Îέο ΦÏάγκο CFA";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:50:"Ειδικά Δικαιώματα Ανάληψης";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:23:"ΦÏάγκο BCEAEC CFA";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:60:"ΕυÏωπαϊκή Συναλλαγματική Μονάδα";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:38:"ΧÏυσό ΦÏάγκο Γαλλίας";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:31:"UIC-ΦÏάγκο Γαλλίας";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:31:"Ισλαμικό ΔηνάÏιο";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:61:"Îέο ΜητÏοπολιτικό ΦÏάγκο Γαλλίας";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:50:"ΦÏάγκο Γαλλικών Αντιλλών CFA";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:22:"ΦÏάγκο BCEAO CFA";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:16:"ΦÏάγκο CFP";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:45:"Μεταβιβάσιμο ΡοÏβλι COMECON";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:29:"ΔηνάÏιο Υεμένης";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:26:"Imadi Riyal Υεμένης";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:19:"Rial Υεμένης";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:62:"Μεταλλικό ΔηνάÏιο Γιουγκοσλαβίας";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:68:"ΔηνάÏιο Γιουγκοσλαβικής Ομοσπονδίας";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:43:"ΔηνάÏιο Γιουγκοσλαβίας";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:50:"Îέο ΔηνάÏιο Γιουγκοσλαβίας";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:66:"ΜετατÏέψιμο ΔηνάÏιο Γιουγκοσλαβίας";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:64:"ΟκτωβÏιανό ΔηνάÏιο Γιουγκοσλαβίας";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:64:"Ανανεωμένο ΔηνάÏιο ΓιÎ
¿Ï…γκοσλαβίας";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:59:"Ραντ Îότιας ΑφÏικής (οικονομικό)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:36:"ΛίÏα Îότιας ΑφÏικής";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:36:"Ραντ Îότιας ΑφÏικής";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:21:"Kwacha Ζάμπιας";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:23:"ΛίÏα Ζάμπιας";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:21:"Îέο Zaire ΖαÎÏ";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:14:"Zaire ΖαÎÏ";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:35:"ΔολάÏιο Ζιμπάμπουε";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:20:"ΗμεÏολόγιο";}s:9:"collation";a:1:{i:0;s:22:"Τακτοποίηση";}s:8:"currency";a:1:{i:0;s:14:"Îόμισμα";}}s:9:"Languages";a:71:{s:2:"ar";a:1:{i:0;s:14:"ΑÏαβικά";}s:3:"arc";a:1:{i:0;s:16:"ΑÏαμαϊκά";}s:2:"be";a:1:{i:0;s:22:"ΛευκοÏωσικά";}s:2:"bg";a:1:{i:0;s:20:"ΒουλγαÏικά";}s:2:"bo";a:1:{i:0;s:18:"Θιβετιανά";}s:2:"bs";a:1:{i:0;s:16:"Βοσνιακά";}s:2:"ca";a:1:{i:0;s:20:"Καταλανικά";}s:2:"co";a:1:{i:0;s:22:"ΚοÏσικανικά";}s:3:"cop";a:1:{i:0;s:14:"Κοπτικά";}s:2:"cs";a:1:{i:0;s:14:"Τσεχικά";}s:2:"cy";a:1:{i:0;s:14:"Ουαλικά";}s:2:"da";a:1:{i:0;s:12:"Δανικά";}s:2:"de";a:1:{i:0;s:18:"ΓεÏμανικά";}s:3:"egy";a:1:{i:0;s:35:"Αιγυπτιακά (ΑÏχαία)";}s:2:"el";a:1:{i:0;s:16:"Ελληνικά";}s:2:"en";a:1:{i:0;s:14:"Αγγλικά";}s:2:"es";a:1:{i:0;s:16:"Ισπανικά";}s:2:"et";a:1:{i:0;s:16:"Εσθονικά";}s:2:"eu";a:1:{i:0;s:14:"Βασκικά";}s:2:"fa";a:1:{i:0;s:14:"ΠεÏσικά";}s:2:"fi";a:1:{i:0;s:20:"Φινλανδικά";}s:2:"fr";a:1:{i:0;s:14:"Γαλλικά";}s:2:"ga";a:1:{i:0;s:18:"ΙÏλανδικά";}s:2:"gd";a:1:{i:0;s:29:"Σκωτικά Κελτικά";}s:3:"grc";a:1:{i:0;s:44:"Ελληνικά, ΑÏχαία (έως 1453)";}s:3:"haw";a:1:{i:0;s:20:"Χαβανεζικά";}s:2:"he";a:1:{i:0;s:14:"ΕβÏαϊκά";}s:2:"hr";a
:1:{i:0;s:16:"ΚÏοατικά";}s:2:"hu";a:1:{i:0;s:16:"ΟυγγÏικά";}s:2:"hy";a:1:{i:0;s:16:"ΑÏμενικά";}s:2:"id";a:1:{i:0;s:22:"Ινδονησιακά";}s:3:"ine";a:1:{i:0;s:39:"ΙνδοευÏωπαϊκά (¨Αλλη)";}s:3:"ira";a:1:{i:0;s:14:"ΙÏανικά";}s:2:"is";a:1:{i:0;s:18:"Ισλανδικά";}s:2:"it";a:1:{i:0;s:14:"Ιταλικά";}s:2:"ja";a:1:{i:0;s:16:"Ιαπωνικά";}s:2:"ka";a:1:{i:0;s:18:"ΓεωÏγιανά";}s:2:"ko";a:1:{i:0;s:18:"ΚοÏεατικά";}s:2:"la";a:1:{i:0;s:16:"Λατινικά";}s:2:"lt";a:1:{i:0;s:20:"Λιθουανικά";}s:2:"lv";a:1:{i:0;s:16:"Λετονικά";}s:2:"mk";a:1:{i:0;s:30:"Σλαβομακεδονικά";}s:2:"mn";a:1:{i:0;s:18:"Μογγολικά";}s:2:"mo";a:1:{i:0;s:18:"Μολδαβικά";}s:2:"mt";a:1:{i:0;s:18:"Μαλτεζικά";}s:3:"mul";a:1:{i:0;s:33:"Πολλαπλές Γλώσσες";}s:3:"nai";a:1:{i:0;s:61:"Ινδιανικά Î’ÏŒÏειας ΑμεÏικής (Άλλα)";}s:2:"nl";a:1:{i:0;s:18:"Ολλανδικά";}s:2:"no";a:1:{i:0;s:18:"ÎοÏβηγικά";}s:3:"ota";a:1:{i:0;s:48:"ΤουÏκικά, Οθωμανικά (1500-1928)";}s:3:"peo";a:1:{i:0;s:44:"ΑÏχαία ΠεÏσικά (600-400 Ï€.Χ.)";}s:3:"phi";a:1:{i:0;s:37:"Φιλιππινέζικα (Άλλα)";}s:3:"phn";a:1:{i:0;s:18:"Φοινικικά";}s:2:"pl";a:1:{i:0;s:16:"Πολωνικά";}s:2:"pt";a:1:{i:0;s:22:"ΠοÏτογαλικά";}s:2:"ro";a:1:{i:0;s:18:"Ρουμανικά";}s:3:"rom";a:1:{i:0;s:16:"Ρωμανικά";}s:2:"ru";a:1:{i:0;s:12:"Ρωσικά";}s:3:"sem";a:1:{i:0;s:27:"Σημιτικά (Άλλα)";}s:2:"sh";a:1:{i:0;s:26:"ΣεÏβοκÏοατικά";}s:2:"sk";a:1:{i:0;s:18:"Σλοβακικά";}s:2:"sl";a:1:{i:0;s:18:"Σλοβενικά";}s:3:"sla";a:1:{i:0;s:25:"Σλαβικά (Άλλα)";}s:2:"sq";a:1:{i:0;s:16:"Αλβανικά";}s:2:"sr";a:1:{i:0;s:14:"ΣεÏβικά";}s:2:"sv";a:1:{i:0;s:16:"Σουηδικά";}s:2:"tr";a:1:{i:0;s:16:"ΤουÏκικά";}s:2:"uk";a:1:{i:0;s:18:"ΟυκÏανικά";}s:2:"vi";a:1:{i:0;s:24:"Βιετναμεζ
ικά";}s:2:"yi";a:1:{i:0;s:16:"Ιουδαϊκά";}s:2:"zh";a:1:{i:0;s:16:"Κινεζικά";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Grek";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Scripts";a:17:{s:4:"Arab";a:1:{i:0;s:14:"ΑÏαβικό";}s:4:"Armn";a:1:{i:0;s:16:"ΑÏμενικό";}s:4:"Brai";a:1:{i:0;s:12:"ΜπÏάιγ";}s:4:"Copt";a:1:{i:0;s:14:"Κοπτικό";}s:4:"Cprt";a:1:{i:0;s:16:"ΚυπÏιακό";}s:4:"Cyrl";a:1:{i:0;s:18:"ΚυÏιλλικό";}s:4:"Ethi";a:1:{i:0;s:18:"Αιθιοπικό";}s:4:"Geor";a:1:{i:0;s:18:"ΓεωÏγιανό";}s:4:"Goth";a:1:{i:0;s:14:"Γοτθικό";}s:4:"Grek";a:1:{i:0;s:16:"Ελληνικό";}s:4:"Hebr";a:1:{i:0;s:14:"ΕβÏαϊκό";}s:4:"Latn";a:1:{i:0;s:16:"Λατινικό";}s:4:"Mong";a:1:{i:0;s:18:"Μογγολικό";}s:4:"Syrc";a:1:{i:0;s:14:"ΣυÏιακό";}s:4:"Thai";a:1:{i:0;s:20:"Ταϊλανδικό";}s:4:"Tibt";a:1:{i:0;s:18:"Θιβετιανό";}s:4:"Zyyy";a:1:{i:0;s:10:"Κοινό";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:41:"Βουδιστικό ΗμεÏολόγιο";}s:7:"chinese";a:1:{i:0;s:37:"Κινέζικο ΗμεÏολόγιο";}s:9:"gregorian";a:1:{i:0;s:41:"ΓÏηγοÏιανό ΗμεÏολόγιο";}s:6:"hebrew";a:1:{i:0;s:35:"ΕβÏαϊκό ΗμεÏολόγιο";}s:7:"islamic";a:1:{i:0;s:37:"Ισλαμικό ΗμεÏολόγιο";}s:13:"islamic-civil";a:1:{i:0;s:50:"Ισλαμικό-Αστικό ΗμεÏολόγιο";}s:8:"japanese";a:1:{i:0;s:37:"Ιαπωνικό ΗμεÏολόγιο";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:17:"ΣειÏά Direct";}s:9:"phonebook";a:1:{i:0;s:52:"ΣειÏά Î¤Î·Î»ÎµÏ†Ï‰Î½Î¹ÎºÎ¿Ï ÎšÎ±Ï„Î±Î»ÏŒÎ³Î¿Ï…";}s:6:"pinyin";a:1:{i:0;s:17:"ΣειÏά Pinyin";}s:6:"stroke";a:1:{i:0;s:17:"ΣειÏά Stroke";}s:11:"traditional";a:1:{i:0;s:22:"ΠαÏαδοσιακή";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:6:{s:11:"AmPmMar
kers";a:2:{i:0;s:4:"ΠΜ";i:1;s:4:"ΜΜ";}s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:18:"EEEE, dd MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:11:"dd MMM yyyy";i:7;s:10:"dd/MM/yyyy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:6:"ΚυÏ";i:1;s:6:"Δευ";i:2;s:6:"ΤÏι";i:3;s:6:"Τετ";i:4;s:6:"Πεμ";i:5;s:6:"ΠαÏ";i:6;s:6:"Σαβ";}s:6:"narrow";a:7:{i:0;s:2:"Κ";i:1;s:2:"Δ";i:2;s:2:"Τ";i:3;s:2:"Τ";i:4;s:2:"Π";i:5;s:2:"Π";i:6;s:2:"Σ";}s:4:"wide";a:7:{i:0;s:14:"ΚυÏιακή";i:1;s:14:"ΔευτέÏα";i:2;s:10:"ΤÏίτη";i:3;s:14:"ΤετάÏτη";i:4;s:12:"Πέμπτη";i:5;s:18:"ΠαÏασκευή";i:6;s:14:"Σάββατο";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:6:"Ï€.Χ.";i:1;s:6:"μ.Χ.";}}s:10:"monthNames";a:2:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:6:"Ιαν";i:1;s:6:"Φεβ";i:2;s:6:"ΜαÏ";i:3;s:6:"ΑπÏ";i:4;s:6:"Μαϊ";i:5;s:8:"Ιουν";i:6;s:8:"Ιουλ";i:7;s:6:"Αυγ";i:8;s:6:"Σεπ";i:9;s:6:"Οκτ";i:10;s:6:"Îοε";i:11;s:6:"Δεκ";}s:6:"narrow";a:12:{i:0;s:2:"Ι";i:1;s:2:"Φ";i:2;s:2:"Îœ";i:3;s:2:"Α";i:4;s:2:"Îœ";i:5;s:2:"Ι";i:6;s:2:"Ι";i:7;s:2:"Α";i:8;s:2:"Σ";i:9;s:2:"Ο";i:10;s:2:"Î";i:11;s:2:"Δ";}s:4:"wide";a:12:{i:0;s:20:"ΙανουαÏίου";i:1;s:22:"ΦεβÏουαÏίου";i:2;s:14:"ΜαÏτίου";i:3;s:16:"ΑπÏιλίου";i:4;s:10:"ΜαÎου";i:5;s:14:"Ιουνίου";i:6;s:14:"Ιουλίου";i:7;s:18:"ΑυγοÏστου";i:8;s:22:"ΣεπτεμβÏίου";i:9;s:18:"ΟκτωβÏίου";i:10;s:18:"ÎοεμβÏίου";i:11;s:20:"ΔεκεμβÏίου";}}s:11:"stand-alone";a:3:{s:11:"abbreviated";a:12:{i:0;s:6:"Ιαν";i:1;s:6:"Φεβ";i:2;s:6:"ΜαÏ";i:3;s:6:"ΑπÏ";i:4;s:6:"Μαϊ";i:5;s:8:"Ιουν";i:6;s:8:"Ιουλ";i:7;s:6:"Αυγ";i:8;s:6:"Σεπ";i:9;s:6:"Οκτ";i:10;s:6:"Îοε";i:11;s:6:"Δεκ";}s:6:"narrow";a:12:{i:0;s:2:"Ι";i:1;s:2:"Φ";i:2;s:2:"Îœ";i:3;s:2:"
Α";i:4;s:2:"Îœ";i:5;s:2:"Ι";i:6;s:2:"Ι";i:7;s:2:"Α";i:8;s:2:"Σ";i:9;s:2:"Ο";i:10;s:2:"Î";i:11;s:2:"Δ";}s:4:"wide";a:12:{i:0;s:20:"ΙανουάÏιος";i:1;s:22:"ΦεβÏουάÏιος";i:2;s:14:"ΜάÏτιος";i:3;s:16:"ΑπÏίλιος";i:4;s:10:"Μάιος";i:5;s:14:"ΙοÏνιος";i:6;s:14:"ΙοÏλιος";i:7;s:18:"ΑÏγουστος";i:8;s:22:"ΣεπτέμβÏιος";i:9;s:18:"ΟκτώβÏιος";i:10;s:18:"ÎοέμβÏιος";i:11;s:20:"ΔεκέμβÏιος";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/el_GR.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/el_GR.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/el_GR.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:10:"Currencies";a:1:{s:3:"GRD";a:3:{i:0;s:6:"ΔÏχ";i:1;s:6:"ΔÏχ";i:2;a:3:{i:0;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:1;s:1:",";i:2;s:1:".";}}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"#,##0.00¤;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:12:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:20:"United Arab Emirates";}s:2:"AF";a:1:{i:0;s:11:"Afghanistan";}s:2:"AG";a:1:{i:0;s:19:"Antigua and Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:7:"Albania";}s:2:"AM";a:1:{i:0;s:7:"Armenia";}s:2:"AN";a:1:{i:0;s:20:"Netherlands Antilles";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarctica";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:14:"American Samoa";}s:2:"AT";a:1:{i:0;s:7:"Austria";}s:2:"AU";a:1:{i:0;s:9:"Australia";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:10:"Azerbaijan";}s:2:"BA";a:1:{i:0;s:22:"Bosnia and Herzegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BE";a:1:{i:0;s:7:"Belgium";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:8:"Bulgaria";}s:2:"BH";a:1:{i:0;s:7:"Bahrain";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:6:"Brunei";}s:2:"BO";a:1:{i:0;s:7:"Bolivia";}s:2:"BR";a:1:{i:0;s:6:"Brazil";}s:2:"BS";a:1:{i:0;s:7:"Bahamas";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BV";a:1:{i:0;s:13:"Bouvet Island";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:7:"Belarus";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Canada";}s:2:"CC";a:1:{i:0;s:23:"Cocos (Keeling) Islands";}s:2:"CD";a:1:{i:0;s:32:"Democratic Republic of the Congo";}s:2:"CF";a:1:{i:0;s:24:"Central African Republic";}s:2:"CG";a:1:{i:0;s:5:"Congo";}s:2:"CH";a:1:{i:0;s:11:"Switzerland";}s:2:"CI";a:1:{i:0;s:16:"Côte d’Ivoire";}s:2:"CK";a:1:{i:0;s:12:"Cook Islands";}s:2:"CL";a:1:{i:0;s:5:"Chile";}s:2:"CM";a:1:{i:0;s:8:"Cameroon";}s:2:"CN";a:1:{i:0;s:5:"China";}s:2:"CO";a:1:{i:0;s:8:"Colombia";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:4:"Cuba";}s:2:"CV";a:1:{i:0;s:10:"Cape Verde";}s:2:"CX";a:1:{i:0;s:16:"Christmas Island";}s:2:"CY";a:1:{i:0;s:6:"Cyprus";}s:2:"CZ";a:1:{i:0;s:14:"Czech Republic";}s:2:"DE";a:1:{i:0;s:7:"Germany";}s:2:"DJ";a:1:{i:0;s:8:"Djibouti";}s:2:"DK";
a:1:{i:0;s:7:"Denmark";}s:2:"DM";a:1:{i:0;s:8:"Dominica";}s:2:"DO";a:1:{i:0;s:18:"Dominican Republic";}s:2:"DZ";a:1:{i:0;s:7:"Algeria";}s:2:"EC";a:1:{i:0;s:7:"Ecuador";}s:2:"EE";a:1:{i:0;s:7:"Estonia";}s:2:"EG";a:1:{i:0;s:5:"Egypt";}s:2:"EH";a:1:{i:0;s:14:"Western Sahara";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:5:"Spain";}s:2:"ET";a:1:{i:0;s:8:"Ethiopia";}s:2:"FI";a:1:{i:0;s:7:"Finland";}s:2:"FJ";a:1:{i:0;s:4:"Fiji";}s:2:"FK";a:1:{i:0;s:16:"Falkland Islands";}s:2:"FM";a:1:{i:0;s:10:"Micronesia";}s:2:"FO";a:1:{i:0;s:13:"Faroe Islands";}s:2:"FR";a:1:{i:0;s:6:"France";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:14:"United Kingdom";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:7:"Georgia";}s:2:"GF";a:1:{i:0;s:13:"French Guiana";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:9:"Greenland";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:17:"Equatorial Guinea";}s:2:"GR";a:1:{i:0;s:6:"Greece";}s:2:"GS";a:1:{i:0;s:44:"South Georgia and the South Sandwich Islands";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinea-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:23:"Hong Kong S.A.R., China";}s:2:"HM";a:1:{i:0;s:33:"Heard Island and McDonald Islands";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:7:"Croatia";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:7:"Hungary";}s:2:"ID";a:1:{i:0;s:9:"Indonesia";}s:2:"IE";a:1:{i:0;s:7:"Ireland";}s:2:"IL";a:1:{i:0;s:6:"Israel";}s:2:"IN";a:1:{i:0;s:5:"India";}s:2:"IO";a:1:{i:0;s:30:"British Indian Ocean Territory";}s:2:"IQ";a:1:{i:0;s:4:"Iraq";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:7:"Iceland";}s:2:"IT";a:1:{i:0;s:5:"Italy";}s:2:"JM";a:1:{i:0;s:7:"Jamaica";}s:2:"JO";a:1:{i:0;s:6:"Jordan";}s:2:"JP";a:1:{i:0;s:5:"Japan";}s:2:"KE";a:1:{i:0;s:5:"Kenya";}s:2:"KG";a:1:{i:0;s:10:"Kyrgyzstan";}s:2:"KH";a:1:{i:0;s:8:"Cambodia";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1
:{i:0;s:7:"Comoros";}s:2:"KN";a:1:{i:0;s:21:"Saint Kitts and Nevis";}s:2:"KP";a:1:{i:0;s:11:"North Korea";}s:2:"KR";a:1:{i:0;s:11:"South Korea";}s:2:"KW";a:1:{i:0;s:6:"Kuwait";}s:2:"KY";a:1:{i:0;s:14:"Cayman Islands";}s:2:"KZ";a:1:{i:0;s:10:"Kazakhstan";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:7:"Lebanon";}s:2:"LC";a:1:{i:0;s:11:"Saint Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberia";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:9:"Lithuania";}s:2:"LU";a:1:{i:0;s:10:"Luxembourg";}s:2:"LV";a:1:{i:0;s:6:"Latvia";}s:2:"LY";a:1:{i:0;s:5:"Libya";}s:2:"MA";a:1:{i:0;s:7:"Morocco";}s:2:"MC";a:1:{i:0;s:6:"Monaco";}s:2:"MD";a:1:{i:0;s:7:"Moldova";}s:2:"MG";a:1:{i:0;s:10:"Madagascar";}s:2:"MH";a:1:{i:0;s:16:"Marshall Islands";}s:2:"MK";a:1:{i:0;s:9:"Macedonia";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:8:"Mongolia";}s:2:"MO";a:1:{i:0;s:19:"Macao S.A.R., China";}s:2:"MP";a:1:{i:0;s:24:"Northern Mariana Islands";}s:2:"MQ";a:1:{i:0;s:10:"Martinique";}s:2:"MR";a:1:{i:0;s:10:"Mauritania";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:8:"Maldives";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:6:"Mexico";}s:2:"MY";a:1:{i:0;s:8:"Malaysia";}s:2:"MZ";a:1:{i:0;s:10:"Mozambique";}s:2:"NA";a:1:{i:0;s:7:"Namibia";}s:2:"NC";a:1:{i:0;s:13:"New Caledonia";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:14:"Norfolk Island";}s:2:"NG";a:1:{i:0;s:7:"Nigeria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:11:"Netherlands";}s:2:"NO";a:1:{i:0;s:6:"Norway";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:11:"New Zealand";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:16:"French Polynesia";}s:2:"PG";a:1:{i:0;s:16:"Papua New Guinea";}s:2:"PH";a:1:{i:0;s:11:"Philippines";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}
s:2:"PL";a:1:{i:0;s:6:"Poland";}s:2:"PM";a:1:{i:0;s:25:"Saint Pierre and Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:11:"Puerto Rico";}s:2:"PS";a:1:{i:0;s:21:"Palestinian Territory";}s:2:"PT";a:1:{i:0;s:8:"Portugal";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Qatar";}s:2:"RE";a:1:{i:0;s:8:"Réunion";}s:2:"RO";a:1:{i:0;s:7:"Romania";}s:2:"RU";a:1:{i:0;s:6:"Russia";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:12:"Saudi Arabia";}s:2:"SB";a:1:{i:0;s:15:"Solomon Islands";}s:2:"SC";a:1:{i:0;s:10:"Seychelles";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:6:"Sweden";}s:2:"SG";a:1:{i:0;s:9:"Singapore";}s:2:"SH";a:1:{i:0;s:12:"Saint Helena";}s:2:"SI";a:1:{i:0;s:8:"Slovenia";}s:2:"SJ";a:1:{i:0;s:22:"Svalbard and Jan Mayen";}s:2:"SK";a:1:{i:0;s:8:"Slovakia";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:7:"Somalia";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:8:"Suriname";}s:2:"ST";a:1:{i:0;s:21:"Sao Tome and Principe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:5:"Syria";}s:2:"SZ";a:1:{i:0;s:9:"Swaziland";}s:2:"TC";a:1:{i:0;s:24:"Turks and Caicos Islands";}s:2:"TD";a:1:{i:0;s:4:"Chad";}s:2:"TF";a:1:{i:0;s:27:"French Southern Territories";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:8:"Thailand";}s:2:"TJ";a:1:{i:0;s:10:"Tajikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:11:"Timor-Leste";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:7:"Tunisia";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:6:"Turkey";}s:2:"TT";a:1:{i:0;s:19:"Trinidad and Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Taiwan";}s:2:"TZ";a:1:{i:0;s:8:"Tanzania";}s:2:"UA";a:1:{i:0;s:7:"Ukraine";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:36:"United States Minor Outlying Islands";}s:2:"US";a:1:{i:0;s:13:"United States";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:10:"Uzbekistan";}s:2:"VA";a:1:{i:0;s:7:"Vati
can";}s:2:"VC";a:1:{i:0;s:32:"Saint Vincent and the Grenadines";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:22:"British Virgin Islands";}s:2:"VI";a:1:{i:0;s:19:"U.S. Virgin Islands";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:17:"Wallis and Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Yemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:10:"Yugoslavia";}s:2:"ZA";a:1:{i:0;s:12:"South Africa";}s:2:"ZM";a:1:{i:0;s:6:"Zambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:380:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:14:"Andorran Diner";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:15:"Andorran Peseta";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:27:"United Arab Emirates Dirham";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:19:"Afghani (1927-2002)";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:7:"Afghani";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:22:"Affars and Issas Franc";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:24:"Albanian Lek (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:12:"Albanian Lek";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:19:"Albanian Lek Valute";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:45:"Albanian Dollar Foreign Exchange Certificates";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:13:"Armenian Dram";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:28:"Netherlands Antillan Guilder";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:14:"Angolan Kwanza";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:26:"Angolan Kwanza (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:30:"Angolan New Kwanza (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:37:"Angolan Kwanza Reajustado (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:14:"Angolan Escudo";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:17:"Argentine Austral";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:30:"Argentine Peso Moneda Nacional";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:26:"Argentine Peso (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:14:"Argentine Peso";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:18:"Austrian Schilling";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:17:"Australian Dollar";}s:3:"AUP";a:2:{i:0;s:3:"A
UP";i:1;s:16:"Australian Pound";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:14:"Aruban Guilder";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:19:"Azerbaijanian Manat";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:24:"Bosnia-Herzegovina Dinar";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:35:"Bosnia-Herzegovina Convertible Mark";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:28:"Bosnia-Herzegovina New Dinar";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:15:"Barbados Dollar";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:15:"Bangladesh Taka";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:27:"Belgian Franc (convertible)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:13:"Belgian Franc";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:25:"Belgian Franc (financial)";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:18:"Bulgarian Hard Lev";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:23:"Bulgarian Socialist Lev";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:17:"Bulgarian New Lev";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:25:"Bulgarian Lev (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:43:"Bulgarian Lev Foreign Exchange Certificates";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:14:"Bahraini Dinar";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:13:"Burundi Franc";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:15:"Bermudan Dollar";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:14:"Bermudan Pound";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:13:"Brunei Dollar";}s:3:"BOB";a:2:{i:0;s:2:"Bs";i:1;s:9:"Boliviano";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:21:"Boliviano (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:13:"Bolivian Peso";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:14:"Bolivian Mvdol";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:35:"Brazilian Cruzeiro Novo (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:17:"Brazilian Cruzado";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:30:"Brazilian Cruzeiro (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:14:"Brazilian Real";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:22:"Brazilian Cruzado Novo";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:18:"Brazilian Cruzeiro";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:30:"Brazilian Cruzeiro (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:15:"Bahamian Dollar";}s:3:"BSP";a:2:{i:0;s:3:"BSP"
;i:1;s:14:"Bahamian Pound";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:15:"Bhutan Ngultrum";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:12:"Bhutan Rupee";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:12:"Burmese Kyat";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:13:"Burmese Rupee";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:14:"Botswanan Pula";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:33:"Belarussian New Ruble (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:29:"Belarussian Ruble (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:17:"Belarussian Ruble";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:13:"Belize Dollar";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:23:"British Honduras Dollar";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:15:"Canadian Dollar";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:25:"Congolese Franc Congolais";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:24:"Congolese Republic Franc";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:15:"Congolese Zaire";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:34:"Central African Republic CFA Franc";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:11:"Swiss Franc";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:19:"Cook Islands Dollar";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:14:"Chilean Condor";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:14:"Chilean Escudo";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:27:"Chilean Unidades de Fomento";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:12:"Chilean Peso";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:18:"Cameroon CFA Franc";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:25:"Chinese Jen Min Piao Yuan";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:47:"Chinese US Dollar Foreign Exchange Certificates";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:21:"Chinese Yuan Renminbi";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:20:"Colombian Paper Peso";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:15:"Congo CFA Franc";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:14:"Colombian Peso";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:17:"Costa Rican Colon";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:19:"Czechoslovak Koruna";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:24:"Czechoslovak Hard Koruna";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:10:"Cuban Peso";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:35:"Cuban Foreign Excha
nge Certificates";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:17:"Cape Verde Escudo";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:15:"Curacao Guilder";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:12:"Cyprus Pound";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:21:"Czech Republic Koruna";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:19:"East German Ostmark";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:13:"Deutsche Mark";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:16:"German Sperrmark";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:14:"Djibouti Franc";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:12:"Danish Krone";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:14:"Dominican Peso";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:14:"Algerian Dinar";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:18:"Algerian New Franc";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:23:"Algerian Franc Germinal";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:13:"Ecuador Sucre";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:39:"Ecuador Unidad de Valor Constante (UVC)";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:14:"Estonian Kroon";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:14:"Egyptian Pound";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:14:"Eritrean Nakfa";}s:3:"ESP";a:2:{i:0;s:3:"₧";i:1;s:14:"Spanish Peseta";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:14:"Ethiopian Birr";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:16:"Ethiopian Dollar";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"Euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:14:"Finnish Markka";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:26:"Finnish Markka (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:11:"Fiji Dollar";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:10:"Fiji Pound";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:22:"Falkland Islands Pound";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:21:"Faeroe Islands Kronur";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:12:"French Franc";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:36:"French Franc Germinal/Franc Poincare";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:15:"Gabon CFA Franc";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:22:"British Pound Sterling";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:20:"Georgian Kupon Larit";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:13:"Georgian Lari";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1
;s:10:"Ghana Cedi";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:14:"Ghana Old Cedi";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:11:"Ghana Pound";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:19:"Ghana Revalued Cedi";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:15:"Gibraltar Pound";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:15:"Greenland Krone";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:13:"Gambia Dalasi";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:12:"Gambia Pound";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:12:"Guinea Franc";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:24:"Guinea Franc (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:11:"Guinea Syli";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:16:"Guadeloupe Franc";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:33:"Equatorial Guinea Ekwele Guineana";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:24:"Equatorial Guinea Franco";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:33:"Equatorial Guinea Peseta Guineana";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:13:"Greek Drachma";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:17:"Greek New Drachma";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:17:"Guatemala Quetzal";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:26:"French Guyana Franc Guiana";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:24:"Portuguese Guinea Escudo";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:26:"Portuguese Guinea Mil Reis";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:18:"Guinea-Bissau Peso";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:13:"Guyana Dollar";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:16:"Hong Kong Dollar";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:15:"Hoduras Lempira";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:14:"Croatian Dinar";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:13:"Croatian Kuna";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:14:"Haitian Gourde";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:16:"Hungarian Forint";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:20:"Northern Irish Pound";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:23:"Indonesian Nica Guilder";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:22:"Indonesian Java Rupiah";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:21:"Indonesian New Rupiah";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:17:"Indonesian Rupiah";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:11:"Irish Pound";
}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:14:"Israeli Sheqel";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:13:"Israeli Pound";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:18:"Israeli New Sheqel";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:26:"Isle of Man Pound Sterling";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:12:"Indian Rupee";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:11:"Iraqi Dinar";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:12:"Iranian Rial";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:15:"Icelandic Krona";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:12:"Italian Lira";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:21:"Jersey Pound Sterling";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:15:"Jamaican Dollar";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:14:"Jamaican Pound";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:15:"Jordanian Dinar";}s:3:"JPY";a:2:{i:0;s:2:"¥";i:1;s:12:"Japanese Yen";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:15:"Kenyan Shilling";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:13:"Kyrgystan Som";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:18:"Cambodian Old Riel";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:14:"Cambodian Riel";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:15:"Kiribati Dollar";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:12:"Comoro Franc";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:27:"North Korean People’s Won";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:16:"North Korean Won";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:17:"South Korean Hwan";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:20:"South Korean Old Won";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:16:"South Korean Won";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:13:"Kuwaiti Dinar";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:21:"Cayman Islands Dollar";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:16:"Kazakhstan Ruble";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:16:"Kazakhstan Tenge";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:11:"Laotian Kip";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:14:"Lebanese Pound";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:19:"Liechtenstein Franc";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:15:"Sri Lanka Rupee";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:12:"Ceylon Rupee";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:15:"Liberian Dollar";}s:3:"LSL";a:2:{i:0;s:1:"
M";i:1;s:12:"Lesotho Loti";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:15:"Lithuanian Lita";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:18:"Lithuanian Talonas";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:16:"Luxembourg Franc";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:12:"Latvian Lats";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:13:"Latvian Ruble";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:38:"Libyan British Military Authority Lira";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:12:"Libyan Dinar";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:12:"Libyan Pound";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:15:"Moroccan Dirham";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:14:"Moroccan Franc";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:20:"Monaco Franc Nouveau";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:21:"Monaco Franc Germinal";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:18:"Moldovan Leu Cupon";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:12:"Moldovan Leu";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:20:"Moldovan Ruble Cupon";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:17:"Madagascar Ariary";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:16:"Madagascar Franc";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:23:"Marshall Islands Dollar";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:16:"Macedonian Denar";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:28:"Macedonian Denar (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:10:"Mali Franc";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:12:"Myanmar Kyat";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:44:"Myanmar Dollar Foreign Exchange Certificates";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:16:"Mongolian Tugrik";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:12:"Macao Pataca";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:16:"Martinique Franc";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:18:"Mauritania Ouguiya";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:12:"Maltese Lira";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:13:"Maltese Pound";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:15:"Mauritius Rupee";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:21:"Maldive Islands Rupee";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:23:"Maldive Islands Rufiyaa";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:13:"Malawi Kwacha";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:12:"Malawi Pound";}s:
3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:12:"Mexican Peso";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:31:"Mexican Silver Peso (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:33:"Mexican Unidad de Inversion (UDI)";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:17:"Malaysian Ringgit";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:17:"Mozambique Escudo";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:18:"Mozambique Metical";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:14:"Namibia Dollar";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:28:"New Caledonia Franc Germinal";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:14:"Nigerian Naira";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:14:"Nigerian Pound";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:22:"New Hebrides CFP Franc";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:18:"Nicaraguan Cordoba";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:23:"Nicaraguan Gold Cordoba";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:22:"Nicaraguan Cordoba Oro";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:19:"Netherlands Guilder";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:15:"Norwegian Krone";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:14:"Nepalese Rupee";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:18:"New Zealand Dollar";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:17:"New Zealand Pound";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:9:"Oman Rial";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:15:"Oman Rial Saidi";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:17:"Panamanian Balboa";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:26:"Transdniestria Ruble Kupon";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:24:"Transdniestria New Ruble";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:20:"Transdniestria Ruble";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:13:"Peruvian Inti";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:18:"Peruvian Sol Nuevo";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:12:"Peruvian Sol";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:21:"Papua New Guinea Kina";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:15:"Philippine Peso";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:14:"Pakistan Rupee";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:12:"Polish Zloty";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:46:"Polish US Dollar Foreign Exchange Certificates";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:24:"Po
lish Zloty (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:15:"Palestine Pound";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:16:"Portuguese Conto";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:17:"Portuguese Escudo";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:16:"Paraguay Guarani";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:11:"Qatari Rial";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:13:"Reunion Franc";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:12:"Romanian Leu";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:16:"Romanian New Leu";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:13:"Russian Ruble";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:25:"Russian Ruble (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:13:"Rwandan Franc";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:11:"Saudi Riyal";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:21:"Saudi Sovereign Riyal";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:22:"Solomon Islands Dollar";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:16:"Seychelles Rupee";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:14:"Sudanese Dinar";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:14:"Sudanese Pound";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:13:"Swedish Krona";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:16:"Singapore Dollar";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:18:"Saint Helena Pound";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:19:"Slovenia Tolar Bons";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:14:"Slovenia Tolar";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:13:"Slovak Koruna";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:18:"Sierra Leone Leone";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:15:"San Marino Lira";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:15:"Somali Shilling";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:19:"Somaliland Shilling";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:16:"Suriname Guilder";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:14:"Scotland Pound";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:27:"Sao Tome and Principe Dobra";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:28:"Sao Tome and Principe Escudo";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:16:"Soviet New Ruble";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:13:"Soviet Rouble";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:17:"El Salvador Colon";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:12:"Syr
ian Pound";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:19:"Swaziland Lilangeni";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:22:"Turks and Caicos Crown";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:14:"Chad CFA Franc";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:9:"Thai Baht";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:16:"Tajikistan Ruble";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:17:"Tajikistan Somoni";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:18:"Turkmenistan Manat";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:14:"Tunisian Dinar";}s:3:"TOP";a:2:{i:0;s:2:"T$";i:1;s:14:"Tonga Paʻanga";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:20:"Tonga Pound Sterling";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:12:"Timor Escudo";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:12:"Timor Pataca";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:12:"Turkish Lira";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:26:"Trinidad and Tobago Dollar";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:30:"Trinidad and Tobago Old Dollar";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:13:"Tuvalu Dollar";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:17:"Taiwan New Dollar";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:18:"Tanzanian Shilling";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:17:"Ukrainian Hryvnia";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:21:"Ukrainian Karbovanetz";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:28:"Ugandan Shilling (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:16:"Ugandan Shilling";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:9:"US Dollar";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:20:"US Dollar (Next day)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:20:"US Dollar (Same day)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:19:"Uruguay Peso Fuerte";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:24:"Uruguay Peso (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:21:"Uruguay Peso Uruguayo";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:21:"Uzbekistan Coupon Som";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:14:"Uzbekistan Sum";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:17:"Vatican City Lira";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:31:"North Vietnam Piastre Dong Viet";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:22:"North Vietnam New Dong";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:41:"North Vietna
m Viet Minh Piastre Dong Viet";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:18:"Venezuelan Bolivar";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:29:"British Virgin Islands Dollar";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:15:"Vietnamese Dong";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:19:"Vietnamese New Dong";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:24:"Vietnamese Republic Dong";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:24:"Vietnamese National Dong";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:12:"Vanuatu Vatu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:19:"Western Samoa Pound";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:18:"Western Samoa Tala";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:27:"Asian Dinar Unit of Account";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:14:"CFA Franc BEAC";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:19:"Asian Monetary Unit";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:4:"Gold";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:23:"European Composite Unit";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:22:"European Monetary Unit";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:30:"European Unit of Account (XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:30:"European Unit of Account (XBD)";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:21:"East Caribbean Dollar";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:17:"CFA Nouveau Franc";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:22:"Special Drawing Rights";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:16:"CFA Franc BCEAEC";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:22:"European Currency Unit";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:17:"French Gold Franc";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:16:"French UIC-Franc";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:13:"Islamic Dinar";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:33:"French Metropolitan Nouveau Franc";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:25:"French Antilles CFA Franc";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:15:"CFA Franc BCEAO";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:9:"CFP Franc";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:26:"COMECON Transferable Ruble";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:12:"Yemeni Dinar";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:18:"Yemeni Imadi Riyal";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:11:"Yemeni 
Rial";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:22:"Yugoslavian Hard Dinar";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:28:"Yugoslavian Federation Dinar";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:22:"Yugoslavian 1994 Dinar";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:23:"Yugoslavian Noviy Dinar";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:29:"Yugoslavian Convertible Dinar";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:25:"Yugoslavian October Dinar";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:26:"Yugoslavian Reformed Dinar";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:30:"South African Rand (financial)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:19:"South African Pound";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:18:"South African Rand";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:14:"Zambian Kwacha";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:13:"Zambian Pound";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:17:"Zairean New Zaire";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:13:"Zairean Zaire";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:15:"Zimbabwe Dollar";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:8:"Calendar";}s:9:"collation";a:1:{i:0;s:9:"Collation";}s:8:"currency";a:1:{i:0;s:8:"Currency";}}s:9:"Languages";a:470:{s:2:"aa";a:1:{i:0;s:4:"Afar";}s:2:"ab";a:1:{i:0;s:9:"Abkhazian";}s:3:"ace";a:1:{i:0;s:8:"Achinese";}s:3:"ach";a:1:{i:0;s:5:"Acoli";}s:3:"ada";a:1:{i:0;s:7:"Adangme";}s:3:"ady";a:1:{i:0;s:6:"Adyghe";}s:2:"ae";a:1:{i:0;s:7:"Avestan";}s:2:"af";a:1:{i:0;s:9:"Afrikaans";}s:3:"afa";a:1:{i:0;s:20:"Afro-Asiatic (Other)";}s:3:"afh";a:1:{i:0;s:8:"Afrihili";}s:2:"ak";a:1:{i:0;s:4:"Akan";}s:3:"akk";a:1:{i:0;s:8:"Akkadian";}s:3:"ale";a:1:{i:0;s:5:"Aleut";}s:3:"alg";a:1:{i:0;s:20:"Algonquian Languages";}s:2:"am";a:1:{i:0;s:7:"Amharic";}s:2:"an";a:1:{i:0;s:9:"Aragonese";}s:3:"ang";a:1:{i:0;s:26:"English, Old (ca.450-1100)";}s:3:"apa";a:1:{i:0;s:16:"Apache Languages";}s:2:"ar";a:1:{i:0;s:6:"Arabic";}s:3:"arc";a:1:{i:0;s:7:"Aramaic";}s:3:"arn";a:1:{i:0;s:10:"Araucanian";}s:3:"arp";a:1:{i:0;s:7:"Arapaho";}s:3:"art";a:1:{i:0;s:18:"Artificial (Other)";}s:3:"arw";a:1:{i:0;s:6:"Arawak";}s:2:"as";a:1:{i:0;s:8:"Assamese";}s:3:"ast";a:1:{i:0;s:8:"A
sturian";}s:3:"ath";a:1:{i:0;s:20:"Athapascan Languages";}s:3:"aus";a:1:{i:0;s:20:"Australian Languages";}s:2:"av";a:1:{i:0;s:6:"Avaric";}s:3:"awa";a:1:{i:0;s:6:"Awadhi";}s:2:"ay";a:1:{i:0;s:6:"Aymara";}s:2:"az";a:1:{i:0;s:11:"Azerbaijani";}s:2:"ba";a:1:{i:0;s:7:"Bashkir";}s:3:"bad";a:1:{i:0;s:5:"Banda";}s:3:"bai";a:1:{i:0;s:18:"Bamileke Languages";}s:3:"bal";a:1:{i:0;s:7:"Baluchi";}s:3:"ban";a:1:{i:0;s:8:"Balinese";}s:3:"bas";a:1:{i:0;s:4:"Basa";}s:3:"bat";a:1:{i:0;s:14:"Baltic (Other)";}s:2:"be";a:1:{i:0;s:10:"Belarusian";}s:3:"bej";a:1:{i:0;s:4:"Beja";}s:3:"bem";a:1:{i:0;s:5:"Bemba";}s:3:"ber";a:1:{i:0;s:6:"Berber";}s:2:"bg";a:1:{i:0;s:9:"Bulgarian";}s:2:"bh";a:1:{i:0;s:6:"Bihari";}s:3:"bho";a:1:{i:0;s:8:"Bhojpuri";}s:2:"bi";a:1:{i:0;s:7:"Bislama";}s:3:"bik";a:1:{i:0;s:5:"Bikol";}s:3:"bin";a:1:{i:0;s:4:"Bini";}s:3:"bla";a:1:{i:0;s:7:"Siksika";}s:2:"bm";a:1:{i:0;s:7:"Bambara";}s:2:"bn";a:1:{i:0;s:7:"Bengali";}s:3:"bnt";a:1:{i:0;s:5:"Bantu";}s:2:"bo";a:1:{i:0;s:7:"Tibetan";}s:2:"br";a:1:{i:0;s:6:"Breton";}s:3:"bra";a:1:{i:0;s:4:"Braj";}s:2:"bs";a:1:{i:0;s:7:"Bosnian";}s:3:"btk";a:1:{i:0;s:5:"Batak";}s:3:"bua";a:1:{i:0;s:6:"Buriat";}s:3:"bug";a:1:{i:0;s:8:"Buginese";}s:3:"byn";a:1:{i:0;s:4:"Blin";}s:2:"ca";a:1:{i:0;s:7:"Catalan";}s:3:"cad";a:1:{i:0;s:5:"Caddo";}s:3:"cai";a:1:{i:0;s:31:"Central American Indian (Other)";}s:3:"car";a:1:{i:0;s:5:"Carib";}s:3:"cau";a:1:{i:0;s:17:"Caucasian (Other)";}s:2:"ce";a:1:{i:0;s:7:"Chechen";}s:3:"ceb";a:1:{i:0;s:7:"Cebuano";}s:3:"cel";a:1:{i:0;s:14:"Celtic (Other)";}s:2:"ch";a:1:{i:0;s:8:"Chamorro";}s:3:"chb";a:1:{i:0;s:7:"Chibcha";}s:3:"chg";a:1:{i:0;s:8:"Chagatai";}s:3:"chk";a:1:{i:0;s:8:"Chuukese";}s:3:"chm";a:1:{i:0;s:4:"Mari";}s:3:"chn";a:1:{i:0;s:14:"Chinook Jargon";}s:3:"cho";a:1:{i:0;s:7:"Choctaw";}s:3:"chp";a:1:{i:0;s:9:"Chipewyan";}s:3:"chr";a:1:{i:0;s:8:"Cherokee";}s:3:"chy";a:1:{i:0;s:8:"Cheyenne";}s:3:"cmc";a:1:{i:0;s:16:"Chamic Languages";}s:2:"co";a:1:{i:0;s:8:"Corsican";}s:3:"cop";a:1:{i:0;s:6:"Coptic";}s:3:"cpe";a:1:{i:0;s:42:"Creoles and Pidgins, English-based
 (Other)";}s:3:"cpf";a:1:{i:0;s:41:"Creoles and Pidgins, French-based (Other)";}s:3:"cpp";a:1:{i:0;s:45:"Creoles and pidgins, Portuguese-based (Other)";}s:2:"cr";a:1:{i:0;s:4:"Cree";}s:3:"crh";a:1:{i:0;s:30:"Crimean Turkish; Crimean Tatar";}s:3:"crp";a:1:{i:0;s:27:"Creoles and Pidgins (Other)";}s:2:"cs";a:1:{i:0;s:5:"Czech";}s:3:"csb";a:1:{i:0;s:9:"Kashubian";}s:2:"cu";a:1:{i:0;s:13:"Church Slavic";}s:3:"cus";a:1:{i:0;s:16:"Cushitic (Other)";}s:2:"cv";a:1:{i:0;s:7:"Chuvash";}s:2:"cy";a:1:{i:0;s:5:"Welsh";}s:2:"da";a:1:{i:0;s:6:"Danish";}s:3:"dak";a:1:{i:0;s:6:"Dakota";}s:3:"dar";a:1:{i:0;s:6:"Dargwa";}s:3:"day";a:1:{i:0;s:5:"Dayak";}s:2:"de";a:1:{i:0;s:6:"German";}s:3:"del";a:1:{i:0;s:8:"Delaware";}s:3:"den";a:1:{i:0;s:5:"Slave";}s:3:"dgr";a:1:{i:0;s:6:"Dogrib";}s:3:"din";a:1:{i:0;s:5:"Dinka";}s:3:"doi";a:1:{i:0;s:5:"Dogri";}s:3:"dra";a:1:{i:0;s:17:"Dravidian (Other)";}s:3:"dsb";a:1:{i:0;s:13:"Lower Sorbian";}s:3:"dua";a:1:{i:0;s:5:"Duala";}s:3:"dum";a:1:{i:0;s:29:"Dutch, Middle (ca. 1050-1350)";}s:2:"dv";a:1:{i:0;s:6:"Divehi";}s:3:"dyu";a:1:{i:0;s:5:"Dyula";}s:2:"dz";a:1:{i:0;s:8:"Dzongkha";}s:2:"ee";a:1:{i:0;s:3:"Ewe";}s:3:"efi";a:1:{i:0;s:4:"Efik";}s:3:"egy";a:1:{i:0;s:18:"Egyptian (Ancient)";}s:3:"eka";a:1:{i:0;s:6:"Ekajuk";}s:2:"el";a:1:{i:0;s:5:"Greek";}s:3:"elx";a:1:{i:0;s:7:"Elamite";}s:2:"en";a:1:{i:0;s:7:"English";}s:3:"enm";a:1:{i:0;s:27:"English, Middle (1100-1500)";}s:2:"eo";a:1:{i:0;s:9:"Esperanto";}s:2:"es";a:1:{i:0;s:7:"Spanish";}s:2:"et";a:1:{i:0;s:8:"Estonian";}s:2:"eu";a:1:{i:0;s:6:"Basque";}s:3:"ewo";a:1:{i:0;s:6:"Ewondo";}s:2:"fa";a:1:{i:0;s:7:"Persian";}s:3:"fan";a:1:{i:0;s:4:"Fang";}s:3:"fat";a:1:{i:0;s:5:"Fanti";}s:2:"ff";a:1:{i:0;s:5:"Fulah";}s:2:"fi";a:1:{i:0;s:7:"Finnish";}s:3:"fiu";a:1:{i:0;s:22:"Finno - Ugrian (Other)";}s:2:"fj";a:1:{i:0;s:6:"Fijian";}s:2:"fo";a:1:{i:0;s:7:"Faroese";}s:3:"fon";a:1:{i:0;s:3:"Fon";}s:2:"fr";a:1:{i:0;s:6:"French";}s:3:"frm";a:1:{i:0;s:29:"French, Middle (ca.1400-1600)";}s:3:"fro";a:1:{i:0;s:25:"French, Old (842-ca.1400)";}s:3:"fur";a:1:{i:0;s:8:"Friulian
";}s:2:"fy";a:1:{i:0;s:7:"Frisian";}s:2:"ga";a:1:{i:0;s:5:"Irish";}s:3:"gaa";a:1:{i:0;s:2:"Ga";}s:3:"gay";a:1:{i:0;s:4:"Gayo";}s:3:"gba";a:1:{i:0;s:5:"Gbaya";}s:2:"gd";a:1:{i:0;s:15:"Scottish Gaelic";}s:3:"gem";a:1:{i:0;s:16:"Germanic (Other)";}s:3:"gez";a:1:{i:0;s:4:"Geez";}s:3:"gil";a:1:{i:0;s:10:"Gilbertese";}s:2:"gl";a:1:{i:0;s:8:"Gallegan";}s:3:"gmh";a:1:{i:0;s:34:"German, Middle High (ca.1050-1500)";}s:2:"gn";a:1:{i:0;s:7:"Guarani";}s:3:"goh";a:1:{i:0;s:30:"German, Old High (ca.750-1050)";}s:3:"gon";a:1:{i:0;s:5:"Gondi";}s:3:"gor";a:1:{i:0;s:9:"Gorontalo";}s:3:"got";a:1:{i:0;s:6:"Gothic";}s:3:"grb";a:1:{i:0;s:5:"Gerbo";}s:3:"grc";a:1:{i:0;s:24:"Greek, Ancient (to 1453)";}s:2:"gu";a:1:{i:0;s:8:"Gujarati";}s:2:"gv";a:1:{i:0;s:4:"Manx";}s:3:"gwi";a:1:{i:0;s:9:"Gwichʻin";}s:2:"ha";a:1:{i:0;s:5:"Hausa";}s:3:"hai";a:1:{i:0;s:5:"Haida";}s:3:"haw";a:1:{i:0;s:8:"Hawaiian";}s:2:"he";a:1:{i:0;s:6:"Hebrew";}s:2:"hi";a:1:{i:0;s:5:"Hindi";}s:3:"hil";a:1:{i:0;s:10:"Hiligaynon";}s:3:"him";a:1:{i:0;s:9:"Himachali";}s:3:"hit";a:1:{i:0;s:7:"Hittite";}s:3:"hmn";a:1:{i:0;s:5:"Hmong";}s:2:"ho";a:1:{i:0;s:9:"Hiri Motu";}s:2:"hr";a:1:{i:0;s:8:"Croatian";}s:3:"hsb";a:1:{i:0;s:13:"Upper Sorbian";}s:2:"ht";a:1:{i:0;s:7:"Haitian";}s:2:"hu";a:1:{i:0;s:9:"Hungarian";}s:3:"hup";a:1:{i:0;s:4:"Hupa";}s:2:"hy";a:1:{i:0;s:8:"Armenian";}s:2:"hz";a:1:{i:0;s:6:"Herero";}s:2:"ia";a:1:{i:0;s:11:"Interlingua";}s:3:"iba";a:1:{i:0;s:4:"Iban";}s:2:"id";a:1:{i:0;s:10:"Indonesian";}s:2:"ie";a:1:{i:0;s:11:"Interlingue";}s:2:"ig";a:1:{i:0;s:4:"Igbo";}s:2:"ii";a:1:{i:0;s:10:"Sichuan Yi";}s:3:"ijo";a:1:{i:0;s:3:"Ijo";}s:2:"ik";a:1:{i:0;s:7:"Inupiaq";}s:3:"ilo";a:1:{i:0;s:5:"Iloko";}s:3:"inc";a:1:{i:0;s:13:"Indic (Other)";}s:3:"ine";a:1:{i:0;s:21:"Indo-European (Other)";}s:3:"inh";a:1:{i:0;s:6:"Ingush";}s:2:"io";a:1:{i:0;s:3:"Ido";}s:3:"ira";a:1:{i:0;s:7:"Iranian";}s:3:"iro";a:1:{i:0;s:19:"Iroquoian languages";}s:2:"is";a:1:{i:0;s:9:"Icelandic";}s:2:"it";a:1:{i:0;s:7:"Italian";}s:2:"iu";a:1:{i:0;s:9:"Inuktitut";}s:2:"ja";a:1:{i:0;s:8:"Japanese";}s:3:"jbo";
a:1:{i:0;s:6:"Lojban";}s:3:"jpr";a:1:{i:0;s:13:"Judeo-Persian";}s:3:"jrb";a:1:{i:0;s:12:"Judeo-Arabic";}s:2:"jv";a:1:{i:0;s:8:"Javanese";}s:2:"ka";a:1:{i:0;s:8:"Georgian";}s:3:"kaa";a:1:{i:0;s:11:"Kara-Kalpak";}s:3:"kab";a:1:{i:0;s:6:"Kabyle";}s:3:"kac";a:1:{i:0;s:6:"Kachin";}s:3:"kam";a:1:{i:0;s:5:"Kamba";}s:3:"kar";a:1:{i:0;s:5:"Karen";}s:3:"kaw";a:1:{i:0;s:4:"Kawi";}s:3:"kbd";a:1:{i:0;s:9:"Kabardian";}s:2:"kg";a:1:{i:0;s:5:"Kongo";}s:3:"kha";a:1:{i:0;s:5:"Khasi";}s:3:"khi";a:1:{i:0;s:15:"Khoisan (Other)";}s:3:"kho";a:1:{i:0;s:9:"Khotanese";}s:2:"ki";a:1:{i:0;s:6:"Kikuyu";}s:2:"kj";a:1:{i:0;s:8:"Kuanyama";}s:2:"kk";a:1:{i:0;s:6:"Kazakh";}s:2:"kl";a:1:{i:0;s:11:"Kalaallisut";}s:2:"km";a:1:{i:0;s:5:"Khmer";}s:3:"kmb";a:1:{i:0;s:8:"Kimbundu";}s:2:"kn";a:1:{i:0;s:7:"Kannada";}s:2:"ko";a:1:{i:0;s:6:"Korean";}s:3:"kok";a:1:{i:0;s:7:"Konkani";}s:3:"kos";a:1:{i:0;s:8:"Kosraean";}s:3:"kpe";a:1:{i:0;s:6:"Kpelle";}s:2:"kr";a:1:{i:0;s:6:"Kanuri";}s:3:"krc";a:1:{i:0;s:15:"Karachay-Balkar";}s:3:"kro";a:1:{i:0;s:3:"Kru";}s:3:"kru";a:1:{i:0;s:6:"Kurukh";}s:2:"ks";a:1:{i:0;s:8:"Kashmiri";}s:2:"ku";a:1:{i:0;s:7:"Kurdish";}s:3:"kum";a:1:{i:0;s:5:"Kumyk";}s:3:"kut";a:1:{i:0;s:7:"Kutenai";}s:2:"kv";a:1:{i:0;s:4:"Komi";}s:2:"kw";a:1:{i:0;s:7:"Cornish";}s:2:"ky";a:1:{i:0;s:7:"Kirghiz";}s:2:"la";a:1:{i:0;s:5:"Latin";}s:3:"lad";a:1:{i:0;s:6:"Ladino";}s:3:"lah";a:1:{i:0;s:6:"Lahnda";}s:3:"lam";a:1:{i:0;s:5:"Lamba";}s:2:"lb";a:1:{i:0;s:13:"Luxembourgish";}s:3:"lez";a:1:{i:0;s:8:"Lezghian";}s:2:"lg";a:1:{i:0;s:5:"Ganda";}s:2:"li";a:1:{i:0;s:10:"Limburgish";}s:2:"ln";a:1:{i:0;s:7:"Lingala";}s:2:"lo";a:1:{i:0;s:3:"Lao";}s:3:"lol";a:1:{i:0;s:5:"Mongo";}s:3:"loz";a:1:{i:0;s:4:"Lozi";}s:2:"lt";a:1:{i:0;s:10:"Lithuanian";}s:2:"lu";a:1:{i:0;s:12:"Luba-Katanga";}s:3:"lua";a:1:{i:0;s:10:"Luba-Lulua";}s:3:"lui";a:1:{i:0;s:7:"Luiseno";}s:3:"lun";a:1:{i:0;s:5:"Lunda";}s:3:"luo";a:1:{i:0;s:3:"Luo";}s:3:"lus";a:1:{i:0;s:6:"Lushai";}s:2:"lv";a:1:{i:0;s:7:"Latvian";}s:3:"mad";a:1:{i:0;s:8:"Madurese";}s:3:"mag";a:1:{i:0;s:6:"Magahi";}s:3:"mai";a:1:{i:0;s:
8:"Maithili";}s:3:"mak";a:1:{i:0;s:7:"Makasar";}s:3:"man";a:1:{i:0;s:8:"Mandingo";}s:3:"map";a:1:{i:0;s:12:"Austronesian";}s:3:"mas";a:1:{i:0;s:5:"Masai";}s:3:"mdf";a:1:{i:0;s:6:"Moksha";}s:3:"mdr";a:1:{i:0;s:6:"Mandar";}s:3:"men";a:1:{i:0;s:5:"Mende";}s:2:"mg";a:1:{i:0;s:8:"Malagasy";}s:3:"mga";a:1:{i:0;s:24:"Irish, Middle (900-1200)";}s:2:"mh";a:1:{i:0;s:11:"Marshallese";}s:2:"mi";a:1:{i:0;s:5:"Maori";}s:3:"mic";a:1:{i:0;s:6:"Micmac";}s:3:"min";a:1:{i:0;s:11:"Minangkabau";}s:3:"mis";a:1:{i:0;s:23:"Miscellaneous Languages";}s:2:"mk";a:1:{i:0;s:10:"Macedonian";}s:3:"mkh";a:1:{i:0;s:17:"Mon-Khmer (Other)";}s:2:"ml";a:1:{i:0;s:9:"Malayalam";}s:2:"mn";a:1:{i:0;s:9:"Mongolian";}s:3:"mnc";a:1:{i:0;s:6:"Manchu";}s:3:"mni";a:1:{i:0;s:8:"Manipuri";}s:3:"mno";a:1:{i:0;s:16:"Manobo Languages";}s:2:"mo";a:1:{i:0;s:9:"Moldavian";}s:3:"moh";a:1:{i:0;s:6:"Mohawk";}s:3:"mos";a:1:{i:0;s:5:"Mossi";}s:2:"mr";a:1:{i:0;s:7:"Marathi";}s:2:"ms";a:1:{i:0;s:5:"Malay";}s:2:"mt";a:1:{i:0;s:7:"Maltese";}s:3:"mul";a:1:{i:0;s:18:"Multiple Languages";}s:3:"mun";a:1:{i:0;s:15:"Munda Languages";}s:3:"mus";a:1:{i:0;s:5:"Creek";}s:3:"mwr";a:1:{i:0;s:7:"Marwari";}s:2:"my";a:1:{i:0;s:7:"Burmese";}s:3:"myn";a:1:{i:0;s:5:"Mayan";}s:3:"myv";a:1:{i:0;s:5:"Erzya";}s:2:"na";a:1:{i:0;s:5:"Nauru";}s:3:"nah";a:1:{i:0;s:7:"Nahuatl";}s:3:"nai";a:1:{i:0;s:29:"North American Indian (Other)";}s:3:"nap";a:1:{i:0;s:10:"Neapolitan";}s:2:"nb";a:1:{i:0;s:17:"Norwegian Bokmål";}s:2:"nd";a:1:{i:0;s:14:"Ndebele, North";}s:3:"nds";a:1:{i:0;s:21:"Low German; Low Saxon";}s:2:"ne";a:1:{i:0;s:6:"Nepali";}s:3:"new";a:1:{i:0;s:6:"Newari";}s:2:"ng";a:1:{i:0;s:6:"Ndonga";}s:3:"nia";a:1:{i:0;s:4:"Nias";}s:3:"nic";a:1:{i:0;s:27:"Niger - Kordofanian (Other)";}s:3:"niu";a:1:{i:0;s:6:"Niuean";}s:2:"nl";a:1:{i:0;s:5:"Dutch";}s:2:"nn";a:1:{i:0;s:17:"Norwegian Nynorsk";}s:2:"no";a:1:{i:0;s:9:"Norwegian";}s:3:"nog";a:1:{i:0;s:5:"Nogai";}s:3:"non";a:1:{i:0;s:10:"Norse, Old";}s:2:"nr";a:1:{i:0;s:14:"Ndebele, South";}s:3:"nso";a:1:{i:0;s:15:"Sotho, Northern";}s:3:"nub";a:1:{i:0;s:16:"Nubia
n Languages";}s:2:"nv";a:1:{i:0;s:6:"Navajo";}s:3:"nwc";a:1:{i:0;s:16:"Classical Newari";}s:2:"ny";a:1:{i:0;s:23:"Nyanja; Chichewa; Chewa";}s:3:"nym";a:1:{i:0;s:8:"Nyamwezi";}s:3:"nyn";a:1:{i:0;s:8:"Nyankole";}s:3:"nyo";a:1:{i:0;s:5:"Nyoro";}s:3:"nzi";a:1:{i:0;s:5:"Nzima";}s:2:"oc";a:1:{i:0;s:31:"Occitan (post 1500); Provençal";}s:2:"oj";a:1:{i:0;s:6:"Ojibwa";}s:2:"om";a:1:{i:0;s:5:"Oromo";}s:2:"or";a:1:{i:0;s:5:"Oriya";}s:2:"os";a:1:{i:0;s:7:"Ossetic";}s:3:"osa";a:1:{i:0;s:5:"Osage";}s:3:"ota";a:1:{i:0;s:28:"Turkish, Ottoman (1500-1928)";}s:3:"oto";a:1:{i:0;s:17:"Otomian Languages";}s:2:"pa";a:1:{i:0;s:7:"Punjabi";}s:3:"paa";a:1:{i:0;s:14:"Papuan (Other)";}s:3:"pag";a:1:{i:0;s:10:"Pangasinan";}s:3:"pal";a:1:{i:0;s:7:"Pahlavi";}s:3:"pam";a:1:{i:0;s:8:"Pampanga";}s:3:"pap";a:1:{i:0;s:10:"Papiamento";}s:3:"pau";a:1:{i:0;s:7:"Palauan";}s:3:"peo";a:1:{i:0;s:29:"Persian Old (ca.600-400 B.C.)";}s:3:"phi";a:1:{i:0;s:18:"Philippine (Other)";}s:3:"phn";a:1:{i:0;s:10:"Phoenician";}s:2:"pi";a:1:{i:0;s:4:"Pali";}s:2:"pl";a:1:{i:0;s:6:"Polish";}s:3:"pon";a:1:{i:0;s:9:"Pohnpeian";}s:3:"pra";a:1:{i:0;s:17:"Prakrit Languages";}s:3:"pro";a:1:{i:0;s:25:"Provençal, Old (to 1500)";}s:2:"ps";a:1:{i:0;s:15:"Pashto (Pushto)";}s:2:"pt";a:1:{i:0;s:10:"Portuguese";}s:2:"qu";a:1:{i:0;s:7:"Quechua";}s:3:"raj";a:1:{i:0;s:10:"Rajasthani";}s:3:"rap";a:1:{i:0;s:7:"Rapanui";}s:3:"rar";a:1:{i:0;s:10:"Rarotongan";}s:2:"rm";a:1:{i:0;s:14:"Rhaeto-Romance";}s:2:"rn";a:1:{i:0;s:5:"Rundi";}s:2:"ro";a:1:{i:0;s:8:"Romanian";}s:3:"roa";a:1:{i:0;s:15:"Romance (Other)";}s:3:"rom";a:1:{i:0;s:6:"Romany";}s:4:"root";a:1:{i:0;s:4:"Root";}s:2:"ru";a:1:{i:0;s:7:"Russian";}s:2:"rw";a:1:{i:0;s:11:"Kinyarwanda";}s:2:"sa";a:1:{i:0;s:8:"Sanskrit";}s:3:"sad";a:1:{i:0;s:7:"Sandawe";}s:3:"sah";a:1:{i:0;s:5:"Yakut";}s:3:"sai";a:1:{i:0;s:29:"South American Indian (Other)";}s:3:"sal";a:1:{i:0;s:18:"Salishan languages";}s:3:"sam";a:1:{i:0;s:17:"Samaritan Aramaic";}s:3:"sas";a:1:{i:0;s:5:"Sasak";}s:3:"sat";a:1:{i:0;s:7:"Santali";}s:2:"sc";a:1:{i:0;s:9:"Sardinian";}s:3:"sco"
;a:1:{i:0;s:5:"Scots";}s:2:"sd";a:1:{i:0;s:6:"Sindhi";}s:2:"se";a:1:{i:0;s:13:"Northern Sami";}s:3:"sel";a:1:{i:0;s:6:"Selkup";}s:3:"sem";a:1:{i:0;s:15:"Semitic (Other)";}s:2:"sg";a:1:{i:0;s:5:"Sango";}s:3:"sga";a:1:{i:0;s:19:"Irish, Old (to 900)";}s:3:"sgn";a:1:{i:0;s:14:"Sign Languages";}s:2:"sh";a:1:{i:0;s:14:"Serbo-Croatian";}s:3:"shn";a:1:{i:0;s:4:"Shan";}s:2:"si";a:1:{i:0;s:9:"Sinhalese";}s:3:"sid";a:1:{i:0;s:6:"Sidamo";}s:3:"sio";a:1:{i:0;s:16:"Siouan Languages";}s:3:"sit";a:1:{i:0;s:20:"Sino-Tibetan (Other)";}s:2:"sk";a:1:{i:0;s:6:"Slovak";}s:2:"sl";a:1:{i:0;s:9:"Slovenian";}s:3:"sla";a:1:{i:0;s:14:"Slavic (Other)";}s:2:"sm";a:1:{i:0;s:6:"Samoan";}s:3:"sma";a:1:{i:0;s:13:"Southern Sami";}s:3:"smi";a:1:{i:0;s:22:"Sami languages (Other)";}s:3:"smj";a:1:{i:0;s:9:"Lule Sami";}s:3:"smn";a:1:{i:0;s:10:"Inari Sami";}s:3:"sms";a:1:{i:0;s:10:"Skolt Sami";}s:2:"sn";a:1:{i:0;s:5:"Shona";}s:3:"snk";a:1:{i:0;s:7:"Soninke";}s:2:"so";a:1:{i:0;s:6:"Somali";}s:3:"sog";a:1:{i:0;s:7:"Sogdien";}s:3:"son";a:1:{i:0;s:7:"Songhai";}s:2:"sq";a:1:{i:0;s:8:"Albanian";}s:2:"sr";a:1:{i:0;s:7:"Serbian";}s:3:"srr";a:1:{i:0;s:5:"Serer";}s:2:"ss";a:1:{i:0;s:5:"Swati";}s:3:"ssa";a:1:{i:0;s:20:"Nilo-Saharam (Other)";}s:2:"st";a:1:{i:0;s:15:"Sotho, Southern";}s:2:"su";a:1:{i:0;s:9:"Sundanese";}s:3:"suk";a:1:{i:0;s:6:"Sukuma";}s:3:"sus";a:1:{i:0;s:4:"Susu";}s:3:"sux";a:1:{i:0;s:8:"Sumerian";}s:2:"sv";a:1:{i:0;s:7:"Swedish";}s:2:"sw";a:1:{i:0;s:7:"Swahili";}s:3:"syr";a:1:{i:0;s:6:"Syriac";}s:2:"ta";a:1:{i:0;s:5:"Tamil";}s:3:"tai";a:1:{i:0;s:11:"Tai (Other)";}s:2:"te";a:1:{i:0;s:6:"Telugu";}s:3:"tem";a:1:{i:0;s:5:"Timne";}s:3:"ter";a:1:{i:0;s:6:"Tereno";}s:3:"tet";a:1:{i:0;s:5:"Tetum";}s:2:"tg";a:1:{i:0;s:5:"Tajik";}s:2:"th";a:1:{i:0;s:4:"Thai";}s:2:"ti";a:1:{i:0;s:8:"Tigrinya";}s:3:"tig";a:1:{i:0;s:5:"Tigre";}s:3:"tiv";a:1:{i:0;s:3:"Tiv";}s:2:"tk";a:1:{i:0;s:7:"Turkmen";}s:3:"tkl";a:1:{i:0;s:7:"Tokelau";}s:2:"tl";a:1:{i:0;s:7:"Tagalog";}s:3:"tlh";a:1:{i:0;s:7:"Klingon";}s:3:"tli";a:1:{i:0;s:7:"Tlingit";}s:3:"tmh";a:1:{i:0;s:8:"Tamashek";}s:2:
"tn";a:1:{i:0;s:6:"Tswana";}s:2:"to";a:1:{i:0;s:21:"Tonga (Tonga Islands)";}s:3:"tog";a:1:{i:0;s:13:"Tonga (Nyasa)";}s:3:"tpi";a:1:{i:0;s:9:"Tok Pisin";}s:2:"tr";a:1:{i:0;s:7:"Turkish";}s:2:"ts";a:1:{i:0;s:6:"Tsonga";}s:3:"tsi";a:1:{i:0;s:9:"Tsimshian";}s:2:"tt";a:1:{i:0;s:5:"Tatar";}s:3:"tum";a:1:{i:0;s:7:"Tumbuka";}s:3:"tup";a:1:{i:0;s:14:"Tupi languages";}s:3:"tut";a:1:{i:0;s:14:"Altaic (Other)";}s:3:"tvl";a:1:{i:0;s:6:"Tuvalu";}s:2:"tw";a:1:{i:0;s:3:"Twi";}s:2:"ty";a:1:{i:0;s:8:"Tahitian";}s:3:"tyv";a:1:{i:0;s:8:"Tuvinian";}s:3:"udm";a:1:{i:0;s:6:"Udmurt";}s:2:"ug";a:1:{i:0;s:6:"Uighur";}s:3:"uga";a:1:{i:0;s:8:"Ugaritic";}s:2:"uk";a:1:{i:0;s:9:"Ukrainian";}s:3:"umb";a:1:{i:0;s:7:"Umbundu";}s:3:"und";a:1:{i:0;s:12:"Undetermined";}s:2:"ur";a:1:{i:0;s:4:"Urdu";}s:2:"uz";a:1:{i:0;s:5:"Uzbek";}s:3:"vai";a:1:{i:0;s:3:"Vai";}s:2:"ve";a:1:{i:0;s:5:"Venda";}s:2:"vi";a:1:{i:0;s:10:"Vietnamese";}s:2:"vo";a:1:{i:0;s:8:"Volapük";}s:3:"vot";a:1:{i:0;s:5:"Votic";}s:2:"wa";a:1:{i:0;s:7:"Walloon";}s:3:"wak";a:1:{i:0;s:18:"Wakashan Languages";}s:3:"wal";a:1:{i:0;s:6:"Walamo";}s:3:"war";a:1:{i:0;s:5:"Waray";}s:3:"was";a:1:{i:0;s:5:"Washo";}s:3:"wen";a:1:{i:0;s:17:"Sorbian Languages";}s:2:"wo";a:1:{i:0;s:5:"Wolof";}s:3:"xal";a:1:{i:0;s:6:"Kalmyk";}s:2:"xh";a:1:{i:0;s:5:"Xhosa";}s:3:"yao";a:1:{i:0;s:3:"Yao";}s:3:"yap";a:1:{i:0;s:6:"Yapese";}s:2:"yi";a:1:{i:0;s:7:"Yiddish";}s:2:"yo";a:1:{i:0;s:6:"Yoruba";}s:3:"ypk";a:1:{i:0;s:15:"Yupik Languages";}s:2:"za";a:1:{i:0;s:6:"Zhuang";}s:3:"zap";a:1:{i:0;s:7:"Zapotec";}s:3:"zen";a:1:{i:0;s:6:"Zenaga";}s:2:"zh";a:1:{i:0;s:7:"Chinese";}s:3:"znd";a:1:{i:0;s:5:"Zande";}s:2:"zu";a:1:{i:0;s:4:"Zulu";}s:3:"zun";a:1:{i:0;s:4:"Zuni";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Scripts";a:56:{s:4:"Arab";a:1:{i:0;s:6:"Arabic";}s:4:"Armn";a:1:{i:0;s:8:"Armenian";}s:4:"Beng";a:1:{i:0;s:7:"Bengali";}s:4:"Bopo";a:1:{i:0;s:8:"Bopomofo";}s:4:"Brai";a:1:{i:0;s:7:"Braille";}s:4:"
Buhd";a:1:{i:0;s:5:"Buhid";}s:4:"Cans";a:1:{i:0;s:35:"Unified Canadian Aboriginal Symbols";}s:4:"Cher";a:1:{i:0;s:8:"Cherokee";}s:4:"Copt";a:1:{i:0;s:6:"Coptic";}s:4:"Cprt";a:1:{i:0;s:7:"Cypriot";}s:4:"Cyrl";a:1:{i:0;s:8:"Cyrillic";}s:4:"Deva";a:1:{i:0;s:10:"Devanagari";}s:4:"Dsrt";a:1:{i:0;s:7:"Deseret";}s:4:"Ethi";a:1:{i:0;s:8:"Ethiopic";}s:4:"Geor";a:1:{i:0;s:8:"Georgian";}s:4:"Goth";a:1:{i:0;s:6:"Gothic";}s:4:"Grek";a:1:{i:0;s:5:"Greek";}s:4:"Gujr";a:1:{i:0;s:8:"Gujarati";}s:4:"Guru";a:1:{i:0;s:8:"Gurmukhi";}s:4:"Hang";a:1:{i:0;s:6:"Hangul";}s:4:"Hani";a:1:{i:0;s:3:"Han";}s:4:"Hano";a:1:{i:0;s:7:"Hanunoo";}s:4:"Hans";a:1:{i:0;s:14:"Simplified Han";}s:4:"Hant";a:1:{i:0;s:15:"Traditional Han";}s:4:"Hebr";a:1:{i:0;s:6:"Hebrew";}s:4:"Hira";a:1:{i:0;s:8:"Hiragana";}s:4:"Hrkt";a:1:{i:0;s:20:"Katakana or Hiragana";}s:4:"Ital";a:1:{i:0;s:10:"Old Italic";}s:4:"Kana";a:1:{i:0;s:8:"Katakana";}s:4:"Khmr";a:1:{i:0;s:5:"Khmer";}s:4:"Knda";a:1:{i:0;s:7:"Kannada";}s:4:"Laoo";a:1:{i:0;s:3:"Lao";}s:4:"Latn";a:1:{i:0;s:5:"Latin";}s:4:"Limb";a:1:{i:0;s:5:"Limbu";}s:4:"Linb";a:1:{i:0;s:8:"Linear B";}s:4:"Mlym";a:1:{i:0;s:9:"Malayalam";}s:4:"Mong";a:1:{i:0;s:9:"Mongolian";}s:4:"Mymr";a:1:{i:0;s:7:"Myanmar";}s:4:"Ogam";a:1:{i:0;s:5:"Ogham";}s:4:"Orya";a:1:{i:0;s:5:"Oriya";}s:4:"Osma";a:1:{i:0;s:7:"Osmanya";}s:4:"Qaai";a:1:{i:0;s:9:"Inherited";}s:4:"Runr";a:1:{i:0;s:5:"Runic";}s:4:"Shaw";a:1:{i:0;s:7:"Shavian";}s:4:"Sinh";a:1:{i:0;s:7:"Sinhala";}s:4:"Syrc";a:1:{i:0;s:6:"Syriac";}s:4:"Tagb";a:1:{i:0;s:8:"Tagbanwa";}s:4:"Tale";a:1:{i:0;s:6:"Tai Le";}s:4:"Taml";a:1:{i:0;s:5:"Tamil";}s:4:"Telu";a:1:{i:0;s:6:"Telugu";}s:4:"Tglg";a:1:{i:0;s:7:"Tagalog";}s:4:"Thaa";a:1:{i:0;s:6:"Thaana";}s:4:"Tibt";a:1:{i:0;s:7:"Tibetan";}s:4:"Ugar";a:1:{i:0;s:8:"Ugaritic";}s:4:"Yiii";a:1:{i:0;s:2:"Yi";}s:4:"Zyyy";a:1:{i:0;s:6:"Common";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:17:"Buddhist Calendar";}s:7:"chinese";a:1:{i:0;s:16:"Chinese Calendar";}s:9:"gregorian";a:1:{i:0;s:18:"Gregorian Calendar";}s:6:"hebrew";a:1:{i:0;s:15:"Hebrew 
Calendar";}s:7:"islamic";a:1:{i:0;s:16:"Islamic Calendar";}s:13:"islamic-civil";a:1:{i:0;s:22:"Islamic-Civil Calendar";}s:8:"japanese";a:1:{i:0;s:17:"Japanese Calendar";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:12:"Direct Order";}s:9:"phonebook";a:1:{i:0;s:15:"Phonebook Order";}s:6:"pinyin";a:1:{i:0;s:12:"Pinyin Order";}s:6:"stroke";a:1:{i:0;s:12:"Stroke Order";}s:11:"traditional";a:1:{i:0;s:11:"Traditional";}}}s:8:"Variants";a:2:{s:5:"POSIX";a:1:{i:0;s:8:"Computer";}s:7:"REVISED";a:1:{i:0;s:19:"Revised Orthography";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:4:{s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"d MMM yyyy";i:7;s:10:"yyyy-MM-dd";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:3:"Sun";i:1;s:3:"Mon";i:2;s:3:"Tue";i:3;s:3:"Wed";i:4;s:3:"Thu";i:5;s:3:"Fri";i:6;s:3:"Sat";}s:6:"narrow";a:7:{i:0;s:1:"S";i:1;s:1:"M";i:2;s:1:"T";i:3;s:1:"W";i:4;s:1:"T";i:5;s:1:"F";i:6;s:1:"S";}s:4:"wide";a:7:{i:0;s:6:"Sunday";i:1;s:6:"Monday";i:2;s:7:"Tuesday";i:3;s:9:"Wednesday";i:4;s:8:"Thursday";i:5;s:6:"Friday";i:6;s:8:"Saturday";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:2:"BC";i:1;s:2:"AD";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:3:"Jan";i:1;s:3:"Feb";i:2;s:3:"Mar";i:3;s:3:"Apr";i:4;s:3:"May";i:5;s:3:"Jun";i:6;s:3:"Jul";i:7;s:3:"Aug";i:8;s:3:"Sep";i:9;s:3:"Oct";i:10;s:3:"Nov";i:11;s:3:"Dec";}s:6:"narrow";a:12:{i:0;s:1:"J";i:1;s:1:"F";i:2;s:1:"M";i:3;s:1:"A";i:4;s:1:"M";i:5;s:1:"J";i:6;s:1:"J";i:7;s:1:"A";i:8;s:1:"S";i:9;s:1:"O";i:10;s:1:"N";i:11;s:1:"D";}s:4:"wide";a:12:{i:0;s:7:"January";i:1;s:8:"February";i:2;s:5:"March";i:3;s:5:"April";i:4;s:3:"May";i:5;s:4:"June";i:6;s:4:"July";i:7;s:6:"August";i:8;s:9:"September";i:9;s:7:"October";i:10;s:8:"November";i:11;s:8:"December";}}}}}s:11:"zoneStrings";a:26:{i:0;a:6:{i:0;s:19:"America/Los_Angeles";i:1;s:21:"Pacific Standard Time";i:2;s:3:"PST";i
:3;s:21:"Pacific Daylight Time";i:4;s:3:"PDT";i:5;s:11:"Los Angeles";}i:1;a:6:{i:0;s:17:"America/Vancouver";i:1;s:26:"Pacific Standard Time (CA)";i:2;s:8:"PST (CA)";i:3;s:26:"Pacific Daylight Time (CA)";i:4;s:8:"PDT (CA)";i:5;s:9:"Vancouver";}i:2;a:6:{i:0;s:14:"America/Denver";i:1;s:22:"Mountain Standard Time";i:2;s:3:"MST";i:3;s:22:"Mountain Daylight Time";i:4;s:3:"MDT";i:5;s:6:"Denver";}i:3;a:6:{i:0;s:16:"America/Edmonton";i:1;s:27:"Mountain Standard Time (CA)";i:2;s:8:"MST (CA)";i:3;s:27:"Mountain Daylight Time (CA)";i:4;s:8:"MDT (CA)";i:5;s:8:"Edmonton";}i:4;a:6:{i:0;s:15:"America/Phoenix";i:1;s:22:"Mountain Standard Time";i:2;s:3:"MST";i:3;s:22:"Mountain Daylight Time";i:4;s:3:"MDT";i:5;s:7:"Phoenix";}i:5;a:6:{i:0;s:15:"America/Chicago";i:1;s:21:"Central Standard Time";i:2;s:3:"CST";i:3;s:21:"Central Daylight Time";i:4;s:3:"CDT";i:5;s:7:"Chicago";}i:6;a:6:{i:0;s:16:"America/Winnipeg";i:1;s:26:"Central Standard Time (CA)";i:2;s:8:"CST (CA)";i:3;s:26:"Central Daylight Time (CA)";i:4;s:8:"CDT (CA)";i:5;s:8:"Winnipeg";}i:7;a:6:{i:0;s:16:"America/New_York";i:1;s:21:"Eastern Standard Time";i:2;s:3:"EST";i:3;s:21:"Eastern Daylight Time";i:4;s:3:"EDT";i:5;s:8:"New York";}i:8;a:6:{i:0;s:16:"America/Montreal";i:1;s:26:"Eastern Standard Time (CA)";i:2;s:8:"EST (CA)";i:3;s:26:"Eastern Daylight Time (CA)";i:4;s:8:"EDT (CA)";i:5;s:8:"Montreal";}i:9;a:6:{i:0;s:20:"America/Indianapolis";i:1;s:21:"Eastern Standard Time";i:2;s:3:"EST";i:3;s:21:"Eastern Daylight Time";i:4;s:3:"EDT";i:5;s:12:"Indianapolis";}i:10;a:6:{i:0;s:16:"Pacific/Honolulu";i:1;s:20:"Hawaii Standard Time";i:2;s:3:"HST";i:3;s:20:"Hawaii Daylight Time";i:4;s:3:"HDT";i:5;s:8:"Honolulu";}i:11;a:6:{i:0;s:17:"America/Anchorage";i:1;s:20:"Alaska Standard Time";i:2;s:4:"AKST";i:3;s:20:"Alaska Daylight Time";i:4;s:4:"AKDT";i:5;s:9:"Anchorage";}i:12;a:6:{i:0;s:15:"America/Halifax";i:1;s:22:"Atlantic Standard Time";i:2;s:3:"AST";i:3;s:22:"Atlantic Daylight Time";i:4;s:3:"ADT";i:5;s:7:"Halifax";}i:13;a:6:{i:0;s:16:"America/St_Johns";i:1;s:26:"Newfoundland Standard Time
";i:2;s:3:"NST";i:3;s:26:"Newfoundland Daylight Time";i:4;s:3:"NDT";i:5;s:12:"St. John’s";}i:14;a:6:{i:0;s:12:"Europe/Paris";i:1;s:30:"Central European Standard Time";i:2;s:4:"CEST";i:3;s:30:"Central European Daylight Time";i:4;s:4:"CEDT";i:5;s:5:"Paris";}i:15;a:6:{i:0;s:7:"Etc/GMT";i:1;s:19:"Greenwich Mean Time";i:2;s:3:"GMT";i:3;s:19:"Greenwich Mean Time";i:4;s:3:"GMT";i:5;s:5:"(GMT)";}i:16;a:6:{i:0;s:13:"Europe/London";i:1;s:21:"British Standard Time";i:2;s:3:"BST";i:3;s:21:"British Daylight Time";i:4;s:3:"BDT";i:5;s:6:"London";}i:17;a:6:{i:0;s:14:"Asia/Jerusalem";i:1;s:20:"Israel Standard Time";i:2;s:3:"IST";i:3;s:20:"Israel Daylight Time";i:4;s:3:"IDT";i:5;s:9:"Jerusalem";}i:18;a:6:{i:0;s:10:"Asia/Tokyo";i:1;s:19:"Japan Standard Time";i:2;s:3:"JST";i:3;s:19:"Japan Daylight Time";i:4;s:3:"JDT";i:5;s:5:"Tokyo";}i:19;a:6:{i:0;s:16:"Europe/Bucharest";i:1;s:30:"Eastern European Standard Time";i:2;s:3:"EET";i:3;s:30:"Eastern European Daylight Time";i:4;s:4:"EEST";i:5;s:9:"Bucharest";}i:20;a:6:{i:0;s:13:"Asia/Shanghai";i:1;s:19:"China Standard Time";i:2;s:3:"CST";i:3;s:19:"China Daylight Time";i:4;s:3:"CDT";i:5;s:8:"Shanghai";}i:21;a:6:{i:0;s:15:"Australia/Perth";i:1;s:32:"Australian Western Standard Time";i:2;s:4:"AWST";i:3;s:32:"Australian Western Standard Time";i:4;s:4:"AWST";i:5;s:5:"Perth";}i:22;a:6:{i:0;s:16:"Australia/Darwin";i:1;s:32:"Australian Central Standard Time";i:2;s:4:"ACST";i:3;s:32:"Australian Central Standard Time";i:4;s:4:"ACST";i:5;s:6:"Darwin";}i:23;a:6:{i:0;s:18:"Australia/Adelaide";i:1;s:32:"Australian Central Daylight Time";i:2;s:4:"ACDT";i:3;s:32:"Australian Central Daylight Time";i:4;s:4:"ACDT";i:5;s:8:"Adelaide";}i:24;a:6:{i:0;s:18:"Australia/Brisbane";i:1;s:32:"Australian Eastern Standard Time";i:2;s:4:"AEST";i:3;s:32:"Australian Eastern Standard Time";i:4;s:4:"AEST";i:5;s:8:"Brisbane";}i:25;a:6:{i:0;s:16:"Australia/Sydney";i:1;s:32:"Australian Eastern Daylight Time";i:2;s:4:"AEDT";i:3;s:32:"Australian Eastern Daylight Time";i:4;s:4:"AEDT";i:5;s:6:"Sydney";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_AU.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_AU.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_AU.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:10:"Currencies";a:1:{s:3:"AUD";a:2:{i:0;s:1:"$";i:1;s:17:"Australian Dollar";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:9:"h:mm:ss a";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:17:"EEEE, d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:7:"d/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_BE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_BE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_BE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:5:{s:10:"Currencies";a:1:{s:3:"BEF";a:3:{i:0;s:2:"BF";i:1;s:13:"Belgian Franc";i:2;a:3:{i:0;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:1;s:1:",";i:2;s:1:".";}}}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:24:"HH' h 'mm' min 'ss' s 'z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:14:"EEE d MMM yyyy";i:6;s:11:"dd MMM yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_BW.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_BW.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_BW.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:9:"h:mm:ss a";i:1;s:9:"h:mm:ss a";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:17:"EEEE dd MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:9:"MMM dd,yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_CA.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_CA.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_CA.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:10:"Currencies";a:1:{s:3:"CAD";a:2:{i:0;s:1:"$";i:1;s:15:"Canadian Dollar";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:23:"¤#,##0.00;(¤#,##0.00)";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:1;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:18:"EEEE, MMMM d, yyyy";i:5;s:12:"MMMM d, yyyy";i:6;s:8:"d-MMM-yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_GB.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_GB.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_GB.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:17:"EEEE, d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"d MMM yyyy";i:7;s:10:"dd/MM/yyyy";i:8;s:7:"{1} {0}";}}}s:11:"zoneStrings";a:1:{i:0;a:6:{i:0;s:13:"Europe/London";i:1;s:19:"Greenwich Mean Time";i:2;s:3:"GMT";i:3;s:21:"British Daylight Time";i:4;s:3:"BDT";i:5;s:6:"London";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_HK.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_HK.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_HK.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:10:"Currencies";a:2:{s:3:"HKD";a:2:{i:0;s:1:"$";i:1;s:16:"Hong Kong Dollar";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:3:"USD";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:23:"¤#,##0.00;(¤#,##0.00)";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:17:"EEEE, d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"d MMM yyyy";i:7;s:10:"dd/MM/yyyy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_IE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_IE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_IE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:10:"Currencies";a:1:{s:3:"IEP";a:2:{i:0;s:2:"£";i:1;s:11:"Irish Pound";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:11:"AmPmMarkers";a:2:{i:0;s:4:"a.m.";i:1;s:4:"p.m.";}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"d MMM yyyy";i:7;s:10:"dd/MM/yyyy";i:8;s:7:"{1} {0}";}}}s:11:"zoneStrings";a:1:{i:0;a:6:{i:0;s:13:"Europe/Dublin";i:1;s:19:"Greenwich Mean Time";i:2;s:3:"GMT";i:3;s:17:"Irish Summer Time";i:4;s:3:"IST";i:5;s:6:"Dublin";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_IN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_IN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_IN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:28:"##,##,##0.###;-##,##,##0.###";i:1;s:32:"¤ ##,##,##0.00;-¤ ##,##,##0.00";i:2;s:10:"##,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:9:"dd-MMM-yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:1;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_MT.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_MT.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_MT.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:10:"Currencies";a:1:{s:3:"GBP";a:2:{i:0;s:3:"GBP";i:1;s:22:"British Pound Sterling";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:1;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:17:"EEEE, d MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:11:"dd MMM yyyy";i:7;s:10:"dd/MM/yyyy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_NZ.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_NZ.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_NZ.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:10:"Currencies";a:1:{s:3:"NZD";a:2:{i:0;s:1:"$";i:1;s:18:"New Zealand Dollar";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:9:"h:mm:ss a";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:17:"EEEE, d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:9:"d/MM/yyyy";i:7;s:7:"d/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_PH.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_PH.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_PH.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:10:"Currencies";a:1:{s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:4:"Peso";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:23:"¤#,##0.00;(¤#,##0.00)";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:18:"EEEE, MMMM d, yyyy";i:5;s:12:"MMMM d, yyyy";i:6;s:8:"MM d, yy";i:7;s:6:"M/d/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_PK.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_PK.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_PK.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:28:"##,##,##0.###;-##,##,##0.###";i:1;s:32:"¤ ##,##,##0.00;-¤ ##,##,##0.00";i:2;s:10:"##,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:9:"dd-MMM-yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_SG.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_SG.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_SG.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:10:"Currencies";a:2:{s:3:"SGD";a:2:{i:0;s:1:"$";i:1;s:16:"Singapore Dollar";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:3:"USD";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:10:"a hh:mm:ss";i:1;s:10:"a hh:mm:ss";i:2;s:7:"a hh:mm";i:3;s:7:"a hh:mm";i:4;s:12:"dd MMMM yyyy";i:5;s:11:"dd MMM yyyy";i:6;s:9:"dd-MMM-yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}s:11:"zoneStrings";a:1:{i:0;a:6:{i:0;s:19:"Pacific/Guadalcanal";i:1;s:23:"Singapore Standard Time";i:2;s:3:"SST";i:3;s:23:"Singapore Standard Time";i:4;s:3:"SST";i:5;s:9:"Singapore";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_US.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_US.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_US.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:6:{s:10:"Currencies";a:1:{s:3:"USD";a:2:{i:0;s:1:"$";i:1;s:9:"US Dollar";}}s:21:"MeasurementSystem:int";a:1:{i:0;i:1;}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:23:"¤#,##0.00;(¤#,##0.00)";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:19:"PaperSize:intvector";a:2:{i:0;i:279;i:1;i:216;}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:18:"EEEE, MMMM d, yyyy";i:5;s:12:"MMMM d, yyyy";i:6;s:11:"MMM d, yyyy";i:7;s:6:"M/d/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_US_POSIX.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_US_POSIX.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_US_POSIX.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:14:"NumberElements";a:12:{i:0;s:1:".";i:1;s:1:",";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:4:"0/00";i:9;s:3:"INF";i:10;s:3:"NaN";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:18:"0.######;-0.######";i:1;s:16:"¤ 0.00;-¤ 0.00";i:2;s:2:"0%";i:3;s:13:"0.000000E+000";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:10:"boundaries";a:1:{s:4:"word";a:1:{i:0;s:10:"word_POSIX";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_VI.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_VI.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_VI.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:23:"¤#,##0.00;(¤#,##0.00)";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_ZA.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_ZA.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_ZA.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:9:"h:mm:ss a";i:1;s:9:"h:mm:ss a";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:17:"EEEE dd MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:11:"dd MMM yyyy";i:7;s:10:"yyyy/MM/dd";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_ZW.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_ZW.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/en_ZW.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:10:"Currencies";a:1:{s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:17:"Zimbabwean Dollar";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:9:"h:mm:ss a";i:1;s:9:"h:mm:ss a";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:17:"EEEE dd MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:9:"dd MMM,yy";i:7;s:8:"d/M/yyyy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/eo.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/eo.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/eo.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:225:{s:2:"AD";a:1:{i:0;s:6:"Andoro";}s:2:"AE";a:1:{i:0;s:29:"UnuiÄintaj Arabaj Emirlandos";}s:2:"AF";a:1:{i:0;s:8:"Afganujo";}s:2:"AG";a:1:{i:0;s:15:"Antigvo-Barbudo";}s:2:"AI";a:1:{i:0;s:7:"Angvilo";}s:2:"AL";a:1:{i:0;s:8:"Albanujo";}s:2:"AM";a:1:{i:0;s:8:"Armenujo";}s:2:"AN";a:1:{i:0;s:19:"Nederlandaj Antiloj";}s:2:"AO";a:1:{i:0;s:6:"Angolo";}s:2:"AQ";a:1:{i:0;s:8:"Antarkto";}s:2:"AR";a:1:{i:0;s:9:"Argentino";}s:2:"AT";a:1:{i:0;s:9:"AÅ­strujo";}s:2:"AU";a:1:{i:0;s:10:"AÅ­stralio";}s:2:"AW";a:1:{i:0;s:5:"Arubo";}s:2:"AZ";a:1:{i:0;s:12:"AzerbajÄano";}s:2:"BA";a:1:{i:0;s:18:"Bosnio-Hercegovino";}s:2:"BB";a:1:{i:0;s:7:"Barbado";}s:2:"BD";a:1:{i:0;s:11:"BangladeÅo";}s:2:"BE";a:1:{i:0;s:7:"Belgujo";}s:2:"BF";a:1:{i:0;s:7:"Burkino";}s:2:"BG";a:1:{i:0;s:9:"Bulgarujo";}s:2:"BH";a:1:{i:0;s:7:"Barejno";}s:2:"BI";a:1:{i:0;s:7:"Burundo";}s:2:"BJ";a:1:{i:0;s:6:"Benino";}s:2:"BM";a:1:{i:0;s:8:"Bermudoj";}s:2:"BN";a:1:{i:0;s:7:"Brunejo";}s:2:"BO";a:1:{i:0;s:7:"Bolivio";}s:2:"BR";a:1:{i:0;s:7:"Brazilo";}s:2:"BS";a:1:{i:0;s:7:"Bahamoj";}s:2:"BT";a:1:{i:0;s:6:"Butano";}s:2:"BW";a:1:{i:0;s:7:"Bocvano";}s:2:"BY";a:1:{i:0;s:10:"Belorusujo";}s:2:"BZ";a:1:{i:0;s:6:"Belizo";}s:2:"CA";a:1:{i:0;s:6:"Kanado";}s:2:"CF";a:1:{i:0;s:23:"Centr-Afrika Respubliko";}s:2:"CG";a:1:{i:0;s:7:"Kongolo";}s:2:"CH";a:1:{i:0;s:7:"Svisujo";}s:2:"CI";a:1:{i:0;s:10:"Ebur-Bordo";}s:2:"CK";a:1:{i:0;s:10:"Kukinsuloj";}s:2:"CL";a:1:{i:0;s:6:"Ĉilio";}s:2:"CM";a:1:{i:0;s:8:"Kameruno";}s:2:"CN";a:1:{i:0;s:7:"Ĉinujo";}s:2:"CO";a:1:{i:0;s:8:"Kolombio";}s:2:"CR";a:1:{i:0;s:9:"Kostariko";}s:2:"CU";a:1:{i:0;s:4:"Kubo";}s:2:"CV";a:1:{i:0;s:10:"Kabo-Verdo";}s:2:"CY";a:1:{i:0;s:5:"Kipro";}s:2:"CZ";a:1:{i:0;s:8:"ĈeÄ¥ujo";}s:2:"DE";a:1:{i:0;s:9:"Germanujo";}s:2:"DJ";a:1:{i:0;s:8:"Äœibutio";}s:2:"DK";a:1:{i:0;s:6:"Danujo";}s:2:"DM";a:1:{i:0;s:8:"Dominiko";}s:2:"DO";a:1:{i:0;s:7:"Domingo";}s:2:"DZ";a:1:{i:0;s:8:"AlÄerio";}s:2:"EC";a:1:{i:0;s:8:"Ekvadoro";}s:2:"EE";a:1:{i:0;s:8:"Estonujo";}s:2:"EG";a:1:{i:0;s:6:"Egipto";}s:2:"EH";a:1:{i:0;s:16:"Ok
cidenta Saharo";}s:2:"ER";a:1:{i:0;s:7:"Eritreo";}s:2:"ES";a:1:{i:0;s:9:"Hispanujo";}s:2:"ET";a:1:{i:0;s:8:"Etiopujo";}s:2:"FI";a:1:{i:0;s:9:"Finnlando";}s:2:"FJ";a:1:{i:0;s:6:"FiÄoj";}s:2:"FM";a:1:{i:0;s:10:"Mikronezio";}s:2:"FO";a:1:{i:0;s:6:"Ferooj";}s:2:"FR";a:1:{i:0;s:8:"Francujo";}s:2:"GA";a:1:{i:0;s:6:"Gabono";}s:2:"GB";a:1:{i:0;s:20:"UnuiÄinta ReÄlando";}s:2:"GD";a:1:{i:0;s:7:"Grenado";}s:2:"GE";a:1:{i:0;s:10:"Kartvelujo";}s:2:"GF";a:1:{i:0;s:13:"Franca Gviano";}s:2:"GH";a:1:{i:0;s:5:"Ganao";}s:2:"GI";a:1:{i:0;s:11:"Äœibraltaro";}s:2:"GL";a:1:{i:0;s:9:"Gronlando";}s:2:"GM";a:1:{i:0;s:6:"Gambio";}s:2:"GN";a:1:{i:0;s:6:"Gvineo";}s:2:"GP";a:1:{i:0;s:9:"Gvadelupo";}s:2:"GQ";a:1:{i:0;s:15:"Ekvatora Gvineo";}s:2:"GR";a:1:{i:0;s:7:"Grekujo";}s:2:"GS";a:1:{i:0;s:35:"Sud-Georgio kaj Sud-Sandviĉinsuloj";}s:2:"GT";a:1:{i:0;s:9:"Gvatemalo";}s:2:"GU";a:1:{i:0;s:5:"Gvamo";}s:2:"GW";a:1:{i:0;s:14:"Gvineo-BisaÅ­o";}s:2:"GY";a:1:{i:0;s:6:"Gujano";}s:2:"HM";a:1:{i:0;s:29:"Herda kaj Makdonaldaj Insuloj";}s:2:"HN";a:1:{i:0;s:7:"Honduro";}s:2:"HR";a:1:{i:0;s:8:"Kroatujo";}s:2:"HT";a:1:{i:0;s:6:"Haitio";}s:2:"HU";a:1:{i:0;s:9:"Hungarujo";}s:2:"ID";a:1:{i:0;s:9:"Indonezio";}s:2:"IE";a:1:{i:0;s:7:"Irlando";}s:2:"IL";a:1:{i:0;s:7:"Israelo";}s:2:"IN";a:1:{i:0;s:7:"Hindujo";}s:2:"IO";a:1:{i:0;s:26:"Brita Hindoceana Teritorio";}s:2:"IQ";a:1:{i:0;s:5:"Irako";}s:2:"IR";a:1:{i:0;s:5:"Irano";}s:2:"IS";a:1:{i:0;s:7:"Islando";}s:2:"IT";a:1:{i:0;s:7:"Italujo";}s:2:"JM";a:1:{i:0;s:7:"Jamajko";}s:2:"JO";a:1:{i:0;s:8:"Jordanio";}s:2:"JP";a:1:{i:0;s:8:"Japanujo";}s:2:"KE";a:1:{i:0;s:5:"Kenjo";}s:2:"KG";a:1:{i:0;s:12:"Kirgizistano";}s:2:"KH";a:1:{i:0;s:8:"KamboÄo";}s:2:"KI";a:1:{i:0;s:8:"Kiribato";}s:2:"KM";a:1:{i:0;s:7:"Komoroj";}s:2:"KN";a:1:{i:0;s:24:"Sent-Kristofo kaj Neviso";}s:2:"KP";a:1:{i:0;s:10:"Nord-Koreo";}s:2:"KR";a:1:{i:0;s:9:"Sud-Koreo";}s:2:"KW";a:1:{i:0;s:7:"Kuvajto";}s:2:"KY";a:1:{i:0;s:8:"Kejmanoj";}s:2:"KZ";a:1:{i:0;s:11:"KazaÄ¥stano";}s:2:"LA";a:1:{i:0;s:5:"Laoso";}s:2:"LB";a:1:{i:0;s:6:"Libano";}s:2:"LC";a:1:{i:0;s:10:
"Sent-Lucio";}s:2:"LI";a:1:{i:0;s:14:"LiÄ¥tenÅtejno";}s:2:"LK";a:1:{i:0;s:9:"Sri-Lanko";}s:2:"LR";a:1:{i:0;s:7:"Liberio";}s:2:"LS";a:1:{i:0;s:6:"Lesoto";}s:2:"LT";a:1:{i:0;s:8:"Litovujo";}s:2:"LU";a:1:{i:0;s:11:"Luksemburgo";}s:2:"LV";a:1:{i:0;s:7:"Latvujo";}s:2:"LY";a:1:{i:0;s:5:"Libio";}s:2:"MA";a:1:{i:0;s:6:"Maroko";}s:2:"MC";a:1:{i:0;s:6:"Monako";}s:2:"MD";a:1:{i:0;s:9:"Moldavujo";}s:2:"MG";a:1:{i:0;s:11:"Madagaskaro";}s:2:"MH";a:1:{i:0;s:9:"MarÅaloj";}s:2:"MK";a:1:{i:0;s:10:"Makedonujo";}s:2:"ML";a:1:{i:0;s:5:"Malio";}s:2:"MM";a:1:{i:0;s:7:"Mjanmao";}s:2:"MN";a:1:{i:0;s:9:"Mongolujo";}s:2:"MP";a:1:{i:0;s:13:"Nord-Marianoj";}s:2:"MQ";a:1:{i:0;s:9:"Martiniko";}s:2:"MR";a:1:{i:0;s:12:"MaÅ­ritanujo";}s:2:"MT";a:1:{i:0;s:5:"Malto";}s:2:"MU";a:1:{i:0;s:9:"MaÅ­ricio";}s:2:"MV";a:1:{i:0;s:8:"Maldivoj";}s:2:"MW";a:1:{i:0;s:7:"Malavio";}s:2:"MX";a:1:{i:0;s:7:"Meksiko";}s:2:"MY";a:1:{i:0;s:8:"Malajzio";}s:2:"MZ";a:1:{i:0;s:9:"Mozambiko";}s:2:"NA";a:1:{i:0;s:7:"Namibio";}s:2:"NC";a:1:{i:0;s:13:"Nov-Kaledonio";}s:2:"NE";a:1:{i:0;s:7:"NiÄero";}s:2:"NF";a:1:{i:0;s:13:"Norfolkinsulo";}s:2:"NG";a:1:{i:0;s:8:"NiÄerio";}s:2:"NI";a:1:{i:0;s:9:"Nikaragvo";}s:2:"NL";a:1:{i:0;s:10:"Nederlando";}s:2:"NO";a:1:{i:0;s:9:"Norvegujo";}s:2:"NP";a:1:{i:0;s:6:"Nepalo";}s:2:"NR";a:1:{i:0;s:5:"Nauro";}s:2:"NU";a:1:{i:0;s:4:"Niuo";}s:2:"NZ";a:1:{i:0;s:11:"Nov-Zelando";}s:2:"OM";a:1:{i:0;s:5:"Omano";}s:2:"PA";a:1:{i:0;s:6:"Panamo";}s:2:"PE";a:1:{i:0;s:5:"Peruo";}s:2:"PF";a:1:{i:0;s:16:"Franca Polinezio";}s:2:"PG";a:1:{i:0;s:16:"Papuo-Nov-Gvineo";}s:2:"PH";a:1:{i:0;s:9:"Filipinoj";}s:2:"PK";a:1:{i:0;s:9:"Pakistano";}s:2:"PL";a:1:{i:0;s:8:"Pollando";}s:2:"PM";a:1:{i:0;s:23:"Sent-Piero kaj Mikelono";}s:2:"PN";a:1:{i:0;s:15:"Pitkarna Insulo";}s:2:"PR";a:1:{i:0;s:11:"Puerto-Riko";}s:2:"PT";a:1:{i:0;s:11:"Portugalujo";}s:2:"PW";a:1:{i:0;s:7:"BelaÅ­o";}s:2:"PY";a:1:{i:0;s:9:"Paragvajo";}s:2:"QA";a:1:{i:0;s:6:"Kataro";}s:2:"RE";a:1:{i:0;s:6:"Reunio";}s:2:"RO";a:1:{i:0;s:8:"Rumanujo";}s:2:"RU";a:1:{i:0;s:6:"Rusujo";}s:2:"RW";a:1:{i:0;s:6:"Ruando";}
s:2:"SA";a:1:{i:0;s:14:"SaÅ­da Arabujo";}s:2:"SB";a:1:{i:0;s:9:"Salomonoj";}s:2:"SC";a:1:{i:0;s:9:"SejÅeloj";}s:2:"SD";a:1:{i:0;s:6:"Sudano";}s:2:"SE";a:1:{i:0;s:7:"Svedujo";}s:2:"SG";a:1:{i:0;s:9:"Singapuro";}s:2:"SH";a:1:{i:0;s:11:"Sent-Heleno";}s:2:"SI";a:1:{i:0;s:9:"Slovenujo";}s:2:"SJ";a:1:{i:0;s:30:"Svalbardo kaj Jan-Majen-insulo";}s:2:"SK";a:1:{i:0;s:9:"Slovakujo";}s:2:"SL";a:1:{i:0;s:11:"Siera-Leono";}s:2:"SM";a:1:{i:0;s:10:"San-Marino";}s:2:"SN";a:1:{i:0;s:8:"Senegalo";}s:2:"SO";a:1:{i:0;s:8:"Somalujo";}s:2:"SP";a:1:{i:0;s:7:"Serbujo";}s:2:"SR";a:1:{i:0;s:8:"Surinamo";}s:2:"ST";a:1:{i:0;s:23:"Sao-Tomeo kaj Principeo";}s:2:"SV";a:1:{i:0;s:9:"Salvadoro";}s:2:"SY";a:1:{i:0;s:5:"Sirio";}s:2:"SZ";a:1:{i:0;s:10:"Svazilando";}s:2:"TD";a:1:{i:0;s:5:"Ĉado";}s:2:"TG";a:1:{i:0;s:6:"Togolo";}s:2:"TH";a:1:{i:0;s:8:"Tajlando";}s:2:"TJ";a:1:{i:0;s:9:"TaÄikujo";}s:2:"TM";a:1:{i:0;s:10:"Turkmenujo";}s:2:"TN";a:1:{i:0;s:7:"Tunizio";}s:2:"TO";a:1:{i:0;s:5:"Tongo";}s:2:"TR";a:1:{i:0;s:7:"Turkujo";}s:2:"TT";a:1:{i:0;s:20:"Trinidado kaj Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalo";}s:2:"TW";a:1:{i:0;s:7:"Tajvano";}s:2:"TZ";a:1:{i:0;s:8:"Tanzanio";}s:2:"UA";a:1:{i:0;s:7:"Ukrajno";}s:2:"UG";a:1:{i:0;s:6:"Ugando";}s:2:"UM";a:1:{i:0;s:25:"Usonaj malgrandaj insuloj";}s:2:"US";a:1:{i:0;s:5:"Usono";}s:2:"UY";a:1:{i:0;s:8:"Urugvajo";}s:2:"UZ";a:1:{i:0;s:8:"Uzbekujo";}s:2:"VA";a:1:{i:0;s:8:"Vatikano";}s:2:"VC";a:1:{i:0;s:31:"Sent-Vincento kaj la Grenadinoj";}s:2:"VE";a:1:{i:0;s:9:"Venezuelo";}s:2:"VG";a:1:{i:0;s:22:"Britaj Virgulininsuloj";}s:2:"VI";a:1:{i:0;s:22:"Usonaj Virgulininsuloj";}s:2:"VN";a:1:{i:0;s:8:"Vjetnamo";}s:2:"VU";a:1:{i:0;s:8:"Vanuatuo";}s:2:"WF";a:1:{i:0;s:17:"Valiso kaj Futuno";}s:2:"WS";a:1:{i:0;s:5:"Samoo";}s:2:"YE";a:1:{i:0;s:6:"Jemeno";}s:2:"YT";a:1:{i:0;s:6:"Majoto";}s:2:"ZA";a:1:{i:0;s:10:"Sud-Afriko";}s:2:"ZM";a:1:{i:0;s:6:"Zambio";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabvo";}}s:9:"Languages";a:138:{s:2:"aa";a:1:{i:0;s:5:"afara";}s:2:"ab";a:1:{i:0;s:7:"abÄ¥aza";}s:2:"af";a:1:{i:0;s:9:"afrikansa";}s:2:"am";a:1:{i:0;s:6:"
amhara";}s:2:"ar";a:1:{i:0;s:5:"araba";}s:2:"as";a:1:{i:0;s:5:"asama";}s:2:"ay";a:1:{i:0;s:6:"ajmara";}s:2:"az";a:1:{i:0;s:12:"azerbajÄana";}s:2:"ba";a:1:{i:0;s:8:"baÅkira";}s:2:"be";a:1:{i:0;s:8:"belorusa";}s:2:"bg";a:1:{i:0;s:7:"bulgara";}s:2:"bh";a:1:{i:0;s:6:"bihara";}s:2:"bi";a:1:{i:0;s:7:"bislamo";}s:2:"bn";a:1:{i:0;s:7:"bengala";}s:2:"bo";a:1:{i:0;s:6:"tibeta";}s:2:"br";a:1:{i:0;s:7:"bretona";}s:2:"ca";a:1:{i:0;s:8:"kataluna";}s:2:"co";a:1:{i:0;s:7:"korsika";}s:2:"cs";a:1:{i:0;s:6:"ĉeÄ¥a";}s:2:"cy";a:1:{i:0;s:5:"kimra";}s:2:"da";a:1:{i:0;s:4:"dana";}s:2:"de";a:1:{i:0;s:7:"germana";}s:2:"dz";a:1:{i:0;s:6:"dzonko";}s:2:"el";a:1:{i:0;s:5:"greka";}s:2:"en";a:1:{i:0;s:5:"angla";}s:2:"eo";a:1:{i:0;s:9:"esperanto";}s:2:"es";a:1:{i:0;s:7:"hispana";}s:2:"et";a:1:{i:0;s:6:"estona";}s:2:"eu";a:1:{i:0;s:6:"eÅ­ska";}s:2:"fa";a:1:{i:0;s:5:"persa";}s:2:"fi";a:1:{i:0;s:5:"finna";}s:2:"fj";a:1:{i:0;s:6:"fiÄia";}s:2:"fo";a:1:{i:0;s:5:"feroa";}s:2:"fr";a:1:{i:0;s:6:"franca";}s:2:"fy";a:1:{i:0;s:5:"frisa";}s:2:"ga";a:1:{i:0;s:7:"irlanda";}s:2:"gd";a:1:{i:0;s:5:"gaela";}s:2:"gl";a:1:{i:0;s:6:"galega";}s:2:"gn";a:1:{i:0;s:8:"gvarania";}s:2:"gu";a:1:{i:0;s:9:"guÄarata";}s:2:"ha";a:1:{i:0;s:6:"haÅ­sa";}s:2:"he";a:1:{i:0;s:6:"hebrea";}s:2:"hi";a:1:{i:0;s:5:"hinda";}s:2:"hr";a:1:{i:0;s:6:"kroata";}s:2:"hu";a:1:{i:0;s:7:"hungara";}s:2:"hy";a:1:{i:0;s:6:"armena";}s:2:"ia";a:1:{i:0;s:12:"interlingvao";}s:2:"id";a:1:{i:0;s:9:"indonezia";}s:2:"ie";a:1:{i:0;s:11:"okcidentalo";}s:2:"ik";a:1:{i:0;s:6:"eskima";}s:2:"is";a:1:{i:0;s:7:"islanda";}s:2:"it";a:1:{i:0;s:5:"itala";}s:2:"iu";a:1:{i:0;s:6:"inuita";}s:2:"ja";a:1:{i:0;s:6:"japana";}s:2:"jv";a:1:{i:0;s:4:"java";}s:2:"ka";a:1:{i:0;s:8:"kartvela";}s:2:"kk";a:1:{i:0;s:7:"kazaÄ¥a";}s:2:"kl";a:1:{i:0;s:9:"gronlanda";}s:2:"km";a:1:{i:0;s:5:"kmera";}s:2:"kn";a:1:{i:0;s:6:"kanara";}s:2:"ko";a:1:{i:0;s:5:"korea";}s:2:"ks";a:1:{i:0;s:8:"kaÅmira";}s:2:"ku";a:1:{i:0;s:5:"kurda";}s:2:"ky";a:1:{i:0;s:7:"kirgiza";}s:2:"la";a:1:{i:0;s:6:"latino";}s:2:"ln";a:1:{i:0;s:7:"lingala";}s:2:"lo";a:1:{i:0
;s:5:"laÅ­a";}s:2:"lt";a:1:{i:0;s:6:"litova";}s:2:"lv";a:1:{i:0;s:5:"latva";}s:2:"mg";a:1:{i:0;s:8:"malagasa";}s:2:"mi";a:1:{i:0;s:6:"maoria";}s:2:"mk";a:1:{i:0;s:8:"makedona";}s:2:"ml";a:1:{i:0;s:10:"malajalama";}s:2:"mn";a:1:{i:0;s:7:"mongola";}s:2:"mr";a:1:{i:0;s:6:"marata";}s:2:"ms";a:1:{i:0;s:6:"malaja";}s:2:"mt";a:1:{i:0;s:5:"malta";}s:2:"my";a:1:{i:0;s:5:"birma";}s:2:"na";a:1:{i:0;s:5:"naura";}s:2:"ne";a:1:{i:0;s:6:"nepala";}s:2:"nl";a:1:{i:0;s:10:"nederlanda";}s:2:"no";a:1:{i:0;s:7:"norvega";}s:2:"oc";a:1:{i:0;s:8:"okcitana";}s:2:"om";a:1:{i:0;s:5:"oroma";}s:2:"or";a:1:{i:0;s:5:"orijo";}s:2:"pa";a:1:{i:0;s:8:"panÄaba";}s:2:"pl";a:1:{i:0;s:4:"pola";}s:2:"ps";a:1:{i:0;s:7:"paÅtua";}s:2:"pt";a:1:{i:0;s:9:"portugala";}s:2:"qu";a:1:{i:0;s:6:"keĉua";}s:2:"rm";a:1:{i:0;s:8:"romanĉa";}s:2:"rn";a:1:{i:0;s:7:"burunda";}s:2:"ro";a:1:{i:0;s:6:"rumana";}s:2:"ru";a:1:{i:0;s:4:"rusa";}s:2:"rw";a:1:{i:0;s:6:"ruanda";}s:2:"sa";a:1:{i:0;s:9:"sanskrito";}s:2:"sd";a:1:{i:0;s:5:"sinda";}s:2:"sg";a:1:{i:0;s:6:"sangoa";}s:2:"sh";a:1:{i:0;s:12:"serbo-Kroata";}s:2:"si";a:1:{i:0;s:7:"sinhala";}s:2:"sk";a:1:{i:0;s:7:"slovaka";}s:2:"sl";a:1:{i:0;s:7:"slovena";}s:2:"sm";a:1:{i:0;s:5:"samoa";}s:2:"sn";a:1:{i:0;s:5:"Åona";}s:2:"so";a:1:{i:0;s:6:"somala";}s:2:"sq";a:1:{i:0;s:6:"albana";}s:2:"sr";a:1:{i:0;s:5:"serba";}s:2:"ss";a:1:{i:0;s:6:"svazia";}s:2:"st";a:1:{i:0;s:4:"sota";}s:2:"su";a:1:{i:0;s:5:"sunda";}s:2:"sv";a:1:{i:0;s:5:"sveda";}s:2:"sw";a:1:{i:0;s:7:"svahila";}s:2:"ta";a:1:{i:0;s:6:"tamila";}s:2:"te";a:1:{i:0;s:7:"telugua";}s:2:"tg";a:1:{i:0;s:7:"taÄika";}s:2:"th";a:1:{i:0;s:4:"taja";}s:2:"ti";a:1:{i:0;s:7:"tigraja";}s:2:"tk";a:1:{i:0;s:8:"turkmena";}s:2:"tl";a:1:{i:0;s:8:"filipina";}s:2:"tn";a:1:{i:0;s:5:"cvana";}s:2:"to";a:1:{i:0;s:6:"tongaa";}s:2:"tr";a:1:{i:0;s:5:"turka";}s:2:"ts";a:1:{i:0;s:5:"conga";}s:2:"tt";a:1:{i:0;s:6:"tatara";}s:2:"tw";a:1:{i:0;s:5:"akana";}s:2:"ug";a:1:{i:0;s:6:"ujgura";}s:2:"uk";a:1:{i:0;s:7:"ukraina";}s:2:"ur";a:1:{i:0;s:5:"urduo";}s:2:"uz";a:1:{i:0;s:6:"uzbeka";}s:2:"vi";a:1:{i:0;s:8:"vje
tnama";}s:2:"vo";a:1:{i:0;s:8:"volapuko";}s:2:"wo";a:1:{i:0;s:6:"volofa";}s:2:"xh";a:1:{i:0;s:5:"ksosa";}s:2:"yi";a:1:{i:0;s:4:"jida";}s:2:"yo";a:1:{i:0;s:6:"joruba";}s:2:"za";a:1:{i:0;s:7:"Äuanga";}s:2:"zh";a:1:{i:0;s:5:"ĉina";}s:2:"zu";a:1:{i:0;s:5:"zulua";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:6:{s:11:"AmPmMarkers";a:2:{i:0;s:3:"atm";i:1;s:3:"ptm";}s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:18:"H'-a horo kaj 'm z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:24:"EEEE, d'-a de 'MMMM yyyy";i:5;s:12:"yyyy-MMMM-dd";i:6;s:11:"yyyy-MMM-dd";i:7;s:8:"yy-MM-dd";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:2:"di";i:1;s:2:"lu";i:2;s:2:"ma";i:3;s:2:"me";i:4;s:3:"ĵa";i:5;s:2:"ve";i:6;s:2:"sa";}s:4:"wide";a:7:{i:0;s:8:"dimanĉo";i:1;s:5:"lundo";i:2;s:5:"mardo";i:3;s:8:"merkredo";i:4;s:7:"ĵaÅ­do";i:5;s:8:"vendredo";i:6;s:6:"sabato";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:2:"aK";i:1;s:2:"pK";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"jan";i:1;s:3:"feb";i:2;s:3:"mar";i:3;s:3:"apr";i:4;s:3:"maj";i:5;s:3:"jun";i:6;s:3:"jul";i:7;s:4:"aÅ­g";i:8;s:3:"sep";i:9;s:3:"okt";i:10;s:3:"nov";i:11;s:3:"dec";}s:4:"wide";a:12:{i:0;s:7:"januaro";i:1;s:8:"februaro";i:2;s:5:"marto";i:3;s:6:"aprilo";i:4;s:4:"majo";i:5;s:5:"junio";i:6;s:5:"julio";i:7;s:8:"aÅ­gusto";i:8;s:9:"septembro";i:9;s:7:"oktobro";i:10;s:8:"novembro";i:11;s:8:"decembro";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GjMtkHmslTDUSnahKzJdugAZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:13:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:23:"Emiratos Ãrabes Unidos";}s:2:"AF";a:1:{i:0;s:11:"Afganistán";}s:2:"AG";a:1:{i:0;s:17:"Antigua y Barbuda";}s:2:"AI";a:1:{i:0;s:7:"Anguila";}s:2:"AL";a:1:{i:0;s:7:"Albania";}s:2:"AM";a:1:{i:0;s:7:"Armenia";}s:2:"AN";a:1:{i:0;s:21:"Antillas Neerlandesas";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antártida";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:15:"Samoa Americana";}s:2:"AT";a:1:{i:0;s:7:"Austria";}s:2:"AU";a:1:{i:0;s:9:"Australia";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:11:"Azerbaiyán";}s:2:"BA";a:1:{i:0;s:18:"Bosnia-Herzegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BE";a:1:{i:0;s:8:"Bélgica";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:8:"Bulgaria";}s:2:"BH";a:1:{i:0;s:8:"Bahráin";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:6:"Benín";}s:2:"BM";a:1:{i:0;s:8:"Bermudas";}s:2:"BN";a:1:{i:0;s:7:"Brunéi";}s:2:"BO";a:1:{i:0;s:7:"Bolivia";}s:2:"BR";a:1:{i:0;s:6:"Brasil";}s:2:"BS";a:1:{i:0;s:7:"Bahamas";}s:2:"BT";a:1:{i:0;s:6:"Bután";}s:2:"BV";a:1:{i:0;s:11:"Isla Bouvet";}s:2:"BW";a:1:{i:0;s:8:"Botsuana";}s:2:"BY";a:1:{i:0;s:11:"Bielorrusia";}s:2:"BZ";a:1:{i:0;s:6:"Belice";}s:2:"CA";a:1:{i:0;s:7:"Canadá";}s:2:"CC";a:1:{i:0;s:21:"Islas Cocos (Keeling)";}s:2:"CD";a:1:{i:0;s:33:"República Democrática del Congo";}s:2:"CF";a:1:{i:0;s:25:"República Centroafricana";}s:2:"CG";a:1:{i:0;s:5:"Congo";}s:2:"CH";a:1:{i:0;s:5:"Suiza";}s:2:"CI";a:1:{i:0;s:15:"Costa de Marfil";}s:2:"CK";a:1:{i:0;s:10:"Islas Cook";}s:2:"CL";a:1:{i:0;s:5:"Chile";}s:2:"CM";a:1:{i:0;s:8:"Camerún";}s:2:"CN";a:1:{i:0;s:5:"China";}s:2:"CO";a:1:{i:0;s:8:"Colombia";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:4:"Cuba";}s:2:"CV";a:1:{i:0;s:10:"Cabo Verde";}s:2:"CX";a:1:{i:0;s:12:"Isla Navidad";}s:2:"CY";a:1:{i:0;s:6:"Chipre";}s:2:"CZ";a:1:{i:0;s:16:"República Checa";}s:2:"DE";a:1:{i:0;s:8:"Alemania";}s:2:"DJ";a:1:{i:0;s:6:"Yibuti";}s:2:"DK";a:1:{
i:0;s:9:"Dinamarca";}s:2:"DM";a:1:{i:0;s:8:"Dominica";}s:2:"DO";a:1:{i:0;s:21:"República Dominicana";}s:2:"DZ";a:1:{i:0;s:7:"Argelia";}s:2:"EC";a:1:{i:0;s:7:"Ecuador";}s:2:"EE";a:1:{i:0;s:7:"Estonia";}s:2:"EG";a:1:{i:0;s:6:"Egipto";}s:2:"EH";a:1:{i:0;s:18:"Sáhara Occidental";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:7:"España";}s:2:"ET";a:1:{i:0;s:8:"Etiopía";}s:2:"FI";a:1:{i:0;s:9:"Finlandia";}s:2:"FJ";a:1:{i:0;s:4:"Fiyi";}s:2:"FK";a:1:{i:0;s:25:"Islas Falkland (Malvinas)";}s:2:"FM";a:1:{i:0;s:10:"Micronesia";}s:2:"FO";a:1:{i:0;s:11:"Islas Feroe";}s:2:"FR";a:1:{i:0;s:7:"Francia";}s:2:"GA";a:1:{i:0;s:6:"Gabón";}s:2:"GB";a:1:{i:0;s:11:"Reino Unido";}s:2:"GD";a:1:{i:0;s:7:"Granada";}s:2:"GE";a:1:{i:0;s:7:"Georgia";}s:2:"GF";a:1:{i:0;s:16:"Guayana Francesa";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:11:"Groenlandia";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:9:"Guadalupe";}s:2:"GQ";a:1:{i:0;s:17:"Guinea Ecuatorial";}s:2:"GR";a:1:{i:0;s:6:"Grecia";}s:2:"GS";a:1:{i:0;s:40:"Islas Georgia del Sur y Sandwich del Sur";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinea-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:51:"Hong-Kong, Región administrativa especial de China";}s:2:"HM";a:1:{i:0;s:22:"Islas Heard y McDonald";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:7:"Croacia";}s:2:"HT";a:1:{i:0;s:6:"Haití";}s:2:"HU";a:1:{i:0;s:8:"Hungría";}s:2:"ID";a:1:{i:0;s:9:"Indonesia";}s:2:"IE";a:1:{i:0;s:7:"Irlanda";}s:2:"IL";a:1:{i:0;s:6:"Israel";}s:2:"IN";a:1:{i:0;s:5:"India";}s:2:"IO";a:1:{i:0;s:42:"Territorios Británico del Océano Ãndico";}s:2:"IQ";a:1:{i:0;s:4:"Iraq";}s:2:"IR";a:1:{i:0;s:5:"Irán";}s:2:"IS";a:1:{i:0;s:8:"Islandia";}s:2:"IT";a:1:{i:0;s:6:"Italia";}s:2:"JM";a:1:{i:0;s:7:"Jamaica";}s:2:"JO";a:1:{i:0;s:8:"Jordania";}s:2:"JP";a:1:{i:0;s:6:"Japón";}s:2:"KE";a:1:{i:0;s:5:"Kenia";}s:2:"KG";a:1:{i:0;s:13:"Kirguizistán";}s:2:"KH";a:1:{i:0;s:7:"Ca
mboya";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:7:"Comoras";}s:2:"KN";a:1:{i:0;s:23:"San Cristóbal y Nieves";}s:2:"KP";a:1:{i:0;s:15:"Corea del Norte";}s:2:"KR";a:1:{i:0;s:13:"Corea del Sur";}s:2:"KW";a:1:{i:0;s:6:"Kuwait";}s:2:"KY";a:1:{i:0;s:13:"Islas Caimán";}s:2:"KZ";a:1:{i:0;s:10:"Kazajstán";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:7:"Líbano";}s:2:"LC";a:1:{i:0;s:11:"Saint Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberia";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:8:"Lituania";}s:2:"LU";a:1:{i:0;s:10:"Luxemburgo";}s:2:"LV";a:1:{i:0;s:7:"Letonia";}s:2:"LY";a:1:{i:0;s:5:"Libia";}s:2:"MA";a:1:{i:0;s:9:"Marruecos";}s:2:"MC";a:1:{i:0;s:7:"Mónaco";}s:2:"MD";a:1:{i:0;s:7:"Moldova";}s:2:"MG";a:1:{i:0;s:10:"Madagascar";}s:2:"MH";a:1:{i:0;s:14:"Islas Marshall";}s:2:"MK";a:1:{i:0;s:9:"Macedonia";}s:2:"ML";a:1:{i:0;s:5:"Malí";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:8:"Mongolia";}s:2:"MO";a:1:{i:0;s:47:"Macao, Región administrativa especial de China";}s:2:"MP";a:1:{i:0;s:24:"Islas Marianas del Norte";}s:2:"MQ";a:1:{i:0;s:9:"Martinica";}s:2:"MR";a:1:{i:0;s:10:"Mauritania";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:8:"Mauricio";}s:2:"MV";a:1:{i:0;s:8:"Maldivas";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:7:"México";}s:2:"MY";a:1:{i:0;s:7:"Malasia";}s:2:"MZ";a:1:{i:0;s:10:"Mozambique";}s:2:"NA";a:1:{i:0;s:7:"Namibia";}s:2:"NC";a:1:{i:0;s:15:"Nueva Caledonia";}s:2:"NE";a:1:{i:0;s:6:"Níger";}s:2:"NF";a:1:{i:0;s:12:"Isla Norfolk";}s:2:"NG";a:1:{i:0;s:7:"Nigeria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:13:"Países Bajos";}s:2:"NO";a:1:{i:0;s:7:"Noruega";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:9:"Isla Niue";}s:2:"NZ";a:1:{i:0;s:13:"Nueva Zelanda";}s:2:"OM";a:1:{i:0;s:5:"Omán";}s:2:"PA";a:1:{i:0;s:7:"Panamá";}s:2:"PE";a:1:{i:0;s:5:"Perú";}s:2:"PF";a:1:{i:0;s:18:"Polinesia Francesa";}s:2:"PG";a:
1:{i:0;s:19:"Papúa Nueva Guinea";}s:2:"PH";a:1:{i:0;s:9:"Filipinas";}s:2:"PK";a:1:{i:0;s:9:"Pakistán";}s:2:"PL";a:1:{i:0;s:7:"Polonia";}s:2:"PM";a:1:{i:0;s:21:"San Pedro y Miquelón";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:11:"Puerto Rico";}s:2:"PS";a:1:{i:0;s:22:"Territorios Palestinos";}s:2:"PT";a:1:{i:0;s:8:"Portugal";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Qatar";}s:2:"RE";a:1:{i:0;s:8:"Réunion";}s:2:"RO";a:1:{i:0;s:8:"Rumanía";}s:2:"RU";a:1:{i:0;s:5:"Rusia";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SA";a:1:{i:0;s:13:"Arabia Saudí";}s:2:"SB";a:1:{i:0;s:14:"Islas Salomón";}s:2:"SC";a:1:{i:0;s:10:"Seychelles";}s:2:"SD";a:1:{i:0;s:6:"Sudán";}s:2:"SE";a:1:{i:0;s:6:"Suecia";}s:2:"SG";a:1:{i:0;s:8:"Singapur";}s:2:"SH";a:1:{i:0;s:11:"Santa Elena";}s:2:"SI";a:1:{i:0;s:9:"Eslovenia";}s:2:"SJ";a:1:{i:0;s:20:"Svalbard y Jan Mayen";}s:2:"SK";a:1:{i:0;s:10:"Eslovaquia";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leona";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:7:"Somalia";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:8:"Suriname";}s:2:"ST";a:1:{i:0;s:23:"Santo Tomé y Príncipe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:5:"Siria";}s:2:"SZ";a:1:{i:0;s:11:"Suazilandia";}s:2:"TC";a:1:{i:0;s:21:"Islas Turcas y Caicos";}s:2:"TD";a:1:{i:0;s:4:"Chad";}s:2:"TF";a:1:{i:0;s:31:"Territorios Australes Franceses";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:9:"Tailandia";}s:2:"TJ";a:1:{i:0;s:11:"Tayikistán";}s:2:"TK";a:1:{i:0;s:13:"Islas Tokelau";}s:2:"TL";a:1:{i:0;s:14:"Timor Oriental";}s:2:"TM";a:1:{i:0;s:13:"Turkmenistán";}s:2:"TN";a:1:{i:0;s:6:"Túnez";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:8:"Turquía";}s:2:"TT";a:1:{i:0;s:17:"Trinidad y Tabago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:7:"Taiwán";}s:2:"TZ";a:1:{i:0;s:8:"Tanzania";}s:2:"UA";a:1:{i:0;s:7:"Ucrania";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:44:"Islas menores alejadas de los Estados Unidos";}s:2:"U
S";a:1:{i:0;s:14:"Estados Unidos";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:11:"Uzbekistán";}s:2:"VA";a:1:{i:0;s:19:"Ciudad del Vaticano";}s:2:"VC";a:1:{i:0;s:28:"San Vicente y las Granadinas";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:27:"Islas Vírgenes Británicas";}s:2:"VI";a:1:{i:0;s:37:"Islas Vírgenes de los Estados Unidos";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:15:"Wallis y Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Yemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:10:"Yugoslavia";}s:2:"ZA";a:1:{i:0;s:10:"Sudáfrica";}s:2:"ZM";a:1:{i:0;s:6:"Zambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabue";}}s:10:"Currencies";a:380:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:15:"diner andorrano";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:16:"peseta andorrana";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:37:"dirham de los Emiratos Ãrabes Unidos";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:18:"afgani (1927-2002)";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:6:"afgani";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:24:"franco de Affars e Issas";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:24:"lek albanés (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:12:"lek albanés";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:19:"lek valute albanés";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:44:"certificados de cambio albaneses en dólares";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:12:"dram armenio";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:36:"florín de las Antillas Neerlandesas";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:16:"kwanza angoleño";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:28:"kwanza angoleño (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:34:"nuevo kwanza angoleño (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:39:"kwanza reajustado angoleño (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:16:"escudo angoleño";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:17:"austral argentino";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:30:"peso moneda nacional argentino";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:26:"peso argentino (1983-1985)";}s:3:"ARS"
;a:2:{i:0;s:4:"Arg$";i:1;s:14:"peso argentino";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:17:"chelín austriaco";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:18:"dólar australiano";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:17:"libra australiana";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:16:"florín de Aruba";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:12:"manat azerí";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:12:"dinar bosnio";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:24:"marco bosnio convertible";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:18:"nuevo dinar bosnio";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:18:"dólar de Barbados";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:18:"taka de Bangladesh";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:26:"franco belga (convertible)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:12:"franco belga";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:25:"franco belga (financiero)";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:19:"lev fuerte búlgaro";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:23:"lev socialista búlgaro";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:18:"nuevo lev búlgaro";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:24:"lev búlgaro (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:40:"certificados de cambio búlgaros en leva";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:15:"dinar bahreiní";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:17:"franco de Burundi";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:18:"dólar de Bermudas";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:17:"libra de Bermudas";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:17:"dólar de Brunéi";}s:3:"BOB";a:2:{i:0;s:2:"Bs";i:1;s:9:"boliviano";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:21:"boliviano (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:14:"peso boliviano";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:15:"MVDOL boliviano";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:37:"nuevo cruceiro brasileño (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:18:"cruzado brasileño";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:31:"cruceiro brasileño (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:15:"real brasileño";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:24:"nuevo cruzado brasileño";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:19
:"cruceiro brasileño";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:31:"cruceiro brasileño (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:21:"dólar de las Bahamas";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:20:"libra de las Bahamas";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:17:"ngultrum butanés";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:14:"rupia butanesa";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:12:"kyat birmano";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:13:"rupia birmana";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:13:"pula botsuano";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:34:"nuevo rublo bielorruso (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:28:"rublo bielorruso (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:16:"rublo bielorruso";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:16:"dólar de Belice";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:29:"dólar de Honduras Británica";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:17:"dólar canadiense";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:17:"franco congoleño";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:33:"franco de la República del Congo";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:16:"zaire congoleño";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:42:"franco CFA de la República Centroafricana";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:12:"franco suizo";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:24:"dólar de las Islas Cook";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:15:"cóndor chileno";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:14:"escudo chileno";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:25:"unidad de fomento chilena";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:12:"peso chileno";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:22:"franco CFA de Camerún";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:23:"jen min piao yuan chino";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:57:"certificados de cambio chinos en dólares estadounidenses";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:19:"yuan renminbi chino";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:24:"peso de papel colombiano";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:20:"franco CFA del Congo";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:15:"peso colombiano";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:20:"colón costarri
cense";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:19:"corona checoslovaca";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:26:"corona fuerte checoslovaca";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:11:"peso cubano";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:30:"certificados de cambio cubanos";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:20:"escudo de Cabo Verde";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:18:"florín de Curazao";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:15:"libra chipriota";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:12:"corona checa";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:28:"ostmark de Alemania del Este";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:13:"marco alemán";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:17:"sperrmark alemán";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:16:"franco de Yibuti";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:13:"corona danesa";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:15:"peso dominicano";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:14:"dinar argelino";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:21:"nuevo franco argelino";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:24:"franco germinal argelino";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:17:"sucre ecuatoriano";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:43:"unidad de valor constante (UVC) ecuatoriana";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:14:"corona estonia";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:13:"libra egipcia";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:13:"nakfa eritreo";}s:3:"ESP";a:2:{i:0;s:3:"₧";i:1;s:16:"peseta española";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:12:"birr etíope";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:14:"dólar etíope";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:16:"marco finlandés";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:28:"marco finlandés (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:24:"dólar de las Islas Fiyi";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:23:"libra de las Islas Fiyi";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:27:"libra de las Islas Malvinas";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:25:"corona de las Islas Feroe";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:15:"franco francés";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:41:"fr
anco germinal/franco Poincaré francés";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:20:"franco CFA de Gabón";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:26:"libra esterlina británica";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:21:"kupon larit georgiano";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:14:"lari georgiano";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:12:"cedi ghanés";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:20:"antiguo cedi ghanés";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:13:"libra ghanesa";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:22:"cedi revaluado ghanés";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:18:"libra de Gibraltar";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:21:"corona de Groenlandia";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:15:"dalasi gambiano";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:14:"libra gambiana";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:13:"franco guineo";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:25:"franco guineo (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:13:"syli guineano";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:19:"franco de Guadalupe";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:27:"ekuele de Guinea Ecuatorial";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:27:"franco de Guinea Ecuatorial";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:36:"peseta guineana de Guinea Ecuatorial";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:13:"dracma griego";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:19:"nuevo dracma griego";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:20:"quetzal guatemalteco";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:39:"franco guayanés de la Guayana Francesa";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:27:"escudo de Guinea Portuguesa";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:29:"mil reis de Guinea Portuguesa";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:22:"peso de Guinea-Bissáu";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:15:"dólar guyanés";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:19:"dólar de Hong Kong";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:18:"lempira hondureño";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:12:"dinar croata";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:11:"kuna croata";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:15:"gourde haitiano";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s
:16:"forinto húngaro";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:26:"libra de Irlanda del Norte";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:22:"florín Nica indonesio";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:20:"rupia Java indonesia";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:21:"nueva rupia indonesia";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:15:"rupia indonesia";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:15:"libra irlandesa";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:15:"sheqel israelí";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:14:"libra israelí";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:21:"nuevo sheqel israelí";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:33:"libra esterlina de la Isla de Man";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:11:"rupia india";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:13:"dinar iraquí";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:11:"rial iraní";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:16:"corona islandesa";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:13:"lira italiana";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:25:"libra esterlina de Jersey";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:17:"dólar de Jamaica";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:15:"libra jamaicana";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:13:"dinar jordano";}s:3:"JPY";a:2:{i:0;s:2:"¥";i:1;s:12:"yen japonés";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:15:"chelín keniata";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:12:"som kirguís";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:22:"antiguo riel camboyano";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:14:"riel camboyano";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:18:"dólar de Kiribati";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:16:"franco comorense";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:25:"won del pueblo norcoreano";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:14:"won norcoreano";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:15:"hwan surcoreano";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:22:"antiguo won surcoreano";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:14:"won surcoreano";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:14:"dinar kuwaití";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:27:"dólar de las Islas Caimán";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:12:"rublo kazako";
}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:12:"tenge kazako";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:12:"kip laosiano";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:14:"libra libanesa";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:23:"franco de Liechtenstein";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:18:"rupia de Sri Lanka";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:15:"rupia cingalesa";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:16:"dólar liberiano";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:15:"loti lesothense";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:13:"litas lituano";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:15:"talonas lituano";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:20:"franco luxemburgués";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:11:"lats letón";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:12:"rublo letón";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:45:"lira libia de la Autoridad Militar Británica";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:11:"dinar libio";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:11:"libra libia";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:16:"dirham marroquí";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:16:"franco marroquí";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:22:"nuevo franco monegasco";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:25:"franco germinal monegasco";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:18:"cupón leu moldavo";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:11:"leu moldavo";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:20:"cupón rublo moldavo";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:15:"ariary malgache";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:15:"franco malgache";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:28:"dólar de las Islas Marshall";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:15:"dinar macedonio";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:27:"dinar macedonio (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:12:"franco malí";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:15:"kyat de Myanmar";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:43:"certificados de cambio birmanos en dólares";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:13:"tugrik mongol";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:15:"pataca de Macao";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:19:"franco de Martinica";}s:3:"MRO";a:2:
{i:0;s:2:"UM";i:1;s:17:"ouguiya mauritano";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:12:"lira maltesa";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:13:"libra maltesa";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:16:"rupia mauriciana";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:17:"rupia de Maldivas";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:19:"rufiyaa de Maldivas";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:16:"kwacha de Malawi";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:15:"libra de Malawi";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:13:"peso mexicano";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:34:"peso de plata mexicano (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:35:"unidad de inversión (UDI) mexicana";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:15:"ringgit malasio";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:20:"escudo mozambiqueño";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:21:"metical mozambiqueño";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:17:"dólar de Namibia";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:34:"franco germinal de Nueva Caledonia";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:15:"naira nigeriano";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:15:"libra nigeriana";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:34:"franco CFP de las Nuevas Hébridas";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:22:"córdoba nicaragüense";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:26:"córdoba oro nicaragüense";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:26:"córdoba oro nicaragüense";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:19:"florín neerlandés";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:14:"corona noruega";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:14:"rupia nepalesa";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:19:"dólar neozelandés";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:18:"libra neozelandesa";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:11:"rial omaní";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:17:"rial saidi omaní";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:16:"balboa panameño";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:30:"cupón rublo de Transdniestria";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:29:"nuevo rublo de Transdniestria";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:23:"rublo de Transdniestria";}s:3:"PEI";a:2:{i:0;s
:3:"PEI";i:1;s:12:"inti peruano";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:17:"nuevo sol peruano";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:11:"sol peruano";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:27:"kina de Papúa Nueva Guinea";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:13:"peso filipino";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:16:"rupia pakistaní";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:12:"zloty polaco";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:58:"certificados de cambio polacos en dólares estadounidenses";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:24:"zloty polaco (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:15:"libra palestina";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:16:"conto portugués";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:17:"escudo portugués";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:18:"guaraní paraguayo";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:14:"riyal de Qatar";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:18:"franco de Reunión";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:10:"leu rumano";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:16:"nuevo leu rumano";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:10:"rublo ruso";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:22:"rublo ruso (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:15:"franco ruandés";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:12:"riyal saudí";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:21:"riyal soberano saudí";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:28:"dólar de las Islas Salomón";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:19:"rupia de Seychelles";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:14:"dinar sudanés";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:14:"libra sudanesa";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:12:"corona sueca";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:19:"dólar singapurense";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:20:"libra de Santa Elena";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:20:"tólar bons esloveno";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:15:"tólar esloveno";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:15:"corona eslovaca";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:21:"leone de Sierra Leona";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:18:"lira de San Marino";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1
;s:15:"chelín somalí";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:23:"chelín de Somalilandia";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:18:"florín surinamés";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:14:"libra escocesa";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:32:"dobra de Santo Tomé y Príncipe";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:33:"escudo de Santo Tomé y Príncipe";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:22:"nuevo rublo soviético";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:16:"rublo soviético";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:19:"colón salvadoreño";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:11:"libra siria";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:15:"lilangeni suazi";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:35:"corona de las Islas Turcas y Caicos";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:19:"franco CFA del Chad";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:15:"baht tailandés";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:12:"rublo tayiko";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:13:"somoni tayiko";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:15:"manat turcomano";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:14:"dinar tunecino";}s:3:"TOP";a:2:{i:0;s:2:"T$";i:1;s:16:"paʻanga tongano";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:23:"libra esterlina tongana";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:16:"escudo timorense";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:16:"pataca timorense";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:10:"lira turca";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:27:"dólar de Trinidad y Tobago";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:35:"antiguo dólar de Trinidad y Tobago";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:16:"dólar de Tuvalu";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:22:"nuevo dólar taiwanés";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:15:"chelín tanzano";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:16:"grivna ucraniana";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:20:"karbovanet ucraniano";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:28:"chelín ugandés (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:16:"chelín ugandés";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:21:"dólar estadounidense";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:38:"dólar estadounidense 
(día siguiente)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:34:"dólar estadounidense (mismo día)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:20:"peso fuerte uruguayo";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:25:"peso uruguayo (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:13:"peso uruguayo";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:17:"cupón som uzbeko";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:10:"sum uzbeko";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:30:"lira de la Ciudad del Vaticano";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:38:"piastre dong viet de Vietnam del Norte";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:31:"nuevo dong de Vietnam del Norte";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:48:"viet minh piastre dong viet de Vietnam del Norte";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:19:"bolívar venezolano";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:41:"dólar de las Islas Vírgenes Británicas";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:15:"dong vietnamita";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:21:"nuevo dong vietnamita";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:36:"dong de la República del vietnamita";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:24:"dong nacional vietnamita";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:16:"vatu vanuatuense";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:13:"libra samoana";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:12:"tala samoano";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:37:"unidad de cuenta asiática en dinares";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:15:"franco CFA BEAC";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:26:"unidad monetaria asiática";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:3:"oro";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:24:"unidad compuesta europea";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:24:"unidad monetaria europea";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:30:"unidad de cuenta europea (XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:30:"unidad de cuenta europea (XBD)";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:26:"dólar del Caribe Oriental";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:16:"nuevo franco CFA";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:27:"derechos especiales de giro";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:17:"franco CFA B
CEAEC";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:24:"unidad de moneda europea";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:19:"franco oro francés";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:19:"franco UIC francés";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:15:"dinar islámico";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:35:"nuevo franco metropolitano francés";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:36:"franco CFA de las Antillas Francesas";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:16:"franco CFA BCEAO";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:10:"franco CFP";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:30:"rublo transferible del COMECON";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:13:"dinar yemení";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:19:"riyal Imadi yemení";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:12:"rial yemení";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:22:"dinar fuerte yugoslavo";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:33:"dinar de la Federación Yugoslava";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:20:"dinar 1994 yugoslavo";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:21:"super dinar yugoslavo";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:27:"dinar convertible yugoslavo";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:26:"dinar de octubre yugoslavo";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:25:"dinar reformado yugoslavo";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:29:"rand sudafricano (financiero)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:17:"libra sudafricana";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:16:"rand sudafricano";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:15:"kwacha zambiano";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:14:"libra zambiana";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:20:"nuevo zaire zaireño";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:14:"zaire zaireño";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:18:"dólar de Zimbabue";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:10:"calendario";}s:9:"collation";a:1:{i:0;s:14:"intercalación";}s:8:"currency";a:1:{i:0;s:6:"moneda";}}s:9:"Languages";a:195:{s:2:"aa";a:1:{i:0;s:4:"afar";}s:2:"ab";a:1:{i:0;s:10:"abkhaziano";}s:2:"ae";a:1:{i:0;s:9:"avéstico";}s:2:"af";a:1:{i:0;s:9:"afrikaans";}s:2:"ak";a:1:{i:0;s:4:"akan";}s:2:"a
m";a:1:{i:0;s:8:"amárico";}s:2:"an";a:1:{i:0;s:9:"aragonés";}s:2:"ar";a:1:{i:0;s:6:"árabe";}s:2:"as";a:1:{i:0;s:7:"asamés";}s:2:"av";a:1:{i:0;s:4:"avar";}s:2:"ay";a:1:{i:0;s:6:"aymara";}s:2:"az";a:1:{i:0;s:6:"azerí";}s:2:"ba";a:1:{i:0;s:7:"bashkir";}s:2:"be";a:1:{i:0;s:10:"bielorruso";}s:2:"bg";a:1:{i:0;s:8:"búlgaro";}s:2:"bh";a:1:{i:0;s:6:"bihari";}s:2:"bi";a:1:{i:0;s:7:"bislama";}s:2:"bm";a:1:{i:0;s:7:"bambara";}s:2:"bn";a:1:{i:0;s:8:"bengalí";}s:2:"bo";a:1:{i:0;s:8:"tibetano";}s:2:"br";a:1:{i:0;s:7:"bretón";}s:2:"bs";a:1:{i:0;s:6:"bosnio";}s:3:"byn";a:1:{i:0;s:4:"blin";}s:2:"ca";a:1:{i:0;s:8:"catalán";}s:2:"ce";a:1:{i:0;s:8:"checheno";}s:2:"ch";a:1:{i:0;s:8:"chamorro";}s:3:"chr";a:1:{i:0;s:8:"cherokee";}s:2:"co";a:1:{i:0;s:5:"corso";}s:2:"cr";a:1:{i:0;s:4:"cree";}s:2:"cs";a:1:{i:0;s:5:"checo";}s:2:"cu";a:1:{i:0;s:20:"eslavo eclesiástico";}s:2:"cv";a:1:{i:0;s:7:"chuvash";}s:2:"cy";a:1:{i:0;s:6:"galés";}s:2:"da";a:1:{i:0;s:6:"danés";}s:2:"de";a:1:{i:0;s:7:"alemán";}s:2:"dv";a:1:{i:0;s:6:"divehi";}s:2:"dz";a:1:{i:0;s:8:"bhutaní";}s:2:"ee";a:1:{i:0;s:3:"ewe";}s:2:"el";a:1:{i:0;s:6:"griego";}s:2:"en";a:1:{i:0;s:7:"inglés";}s:2:"eo";a:1:{i:0;s:9:"esperanto";}s:2:"es";a:1:{i:0;s:8:"español";}s:2:"et";a:1:{i:0;s:7:"estonio";}s:2:"eu";a:1:{i:0;s:5:"vasco";}s:2:"fa";a:1:{i:0;s:5:"farsi";}s:2:"ff";a:1:{i:0;s:4:"fula";}s:2:"fi";a:1:{i:0;s:10:"finlandés";}s:2:"fj";a:1:{i:0;s:5:"fidji";}s:2:"fo";a:1:{i:0;s:7:"feroés";}s:2:"fr";a:1:{i:0;s:8:"francés";}s:2:"fy";a:1:{i:0;s:7:"frisón";}s:2:"ga";a:1:{i:0;s:9:"irlandés";}s:2:"gd";a:1:{i:0;s:17:"gaélico escocés";}s:3:"gez";a:1:{i:0;s:4:"geez";}s:2:"gl";a:1:{i:0;s:7:"gallego";}s:2:"gn";a:1:{i:0;s:8:"guaraní";}s:2:"gu";a:1:{i:0;s:8:"gujarati";}s:2:"gv";a:1:{i:0;s:15:"gaélico manés";}s:2:"ha";a:1:{i:0;s:5:"hausa";}s:3:"haw";a:1:{i:0;s:8:"hawaiano";}s:2:"he";a:1:{i:0;s:6:"hebreo";}s:2:"hi";a:1:{i:0;s:5:"hindi";}s:2:"ho";a:1:{i:0;s:9:"hiri motu";}s:2:"hr";a:1:{i:0;s:6:"croata";}s:2:"ht";a:1:{i:0;s:8:"haitiano";}s:2:"hu";a:1:{i:0;s:8:"húngaro";}s:2:"hy";a:1:{i
:0;s:7:"armenio";}s:2:"hz";a:1:{i:0;s:6:"herero";}s:2:"ia";a:1:{i:0;s:11:"interlingua";}s:2:"id";a:1:{i:0;s:9:"indonesio";}s:2:"ie";a:1:{i:0;s:11:"interlingue";}s:2:"ig";a:1:{i:0;s:4:"igbo";}s:2:"ii";a:1:{i:0;s:10:"sichuan yi";}s:2:"ik";a:1:{i:0;s:7:"inupiak";}s:2:"io";a:1:{i:0;s:3:"ido";}s:2:"is";a:1:{i:0;s:9:"islandés";}s:2:"it";a:1:{i:0;s:8:"italiano";}s:2:"iu";a:1:{i:0;s:9:"inuktitut";}s:2:"ja";a:1:{i:0;s:8:"japonés";}s:2:"jv";a:1:{i:0;s:8:"javanés";}s:2:"ka";a:1:{i:0;s:9:"georgiano";}s:2:"kg";a:1:{i:0;s:5:"kongo";}s:2:"ki";a:1:{i:0;s:6:"kikuyu";}s:2:"kj";a:1:{i:0;s:8:"kuanyama";}s:2:"kk";a:1:{i:0;s:6:"kazajo";}s:2:"kl";a:1:{i:0;s:12:"groenlandés";}s:2:"km";a:1:{i:0;s:5:"jemer";}s:2:"kn";a:1:{i:0;s:8:"canarés";}s:2:"ko";a:1:{i:0;s:7:"coreano";}s:3:"kok";a:1:{i:0;s:7:"konkani";}s:2:"kr";a:1:{i:0;s:6:"kanuri";}s:2:"ks";a:1:{i:0;s:9:"cachemiro";}s:2:"ku";a:1:{i:0;s:5:"kurdo";}s:2:"kv";a:1:{i:0;s:4:"komi";}s:2:"kw";a:1:{i:0;s:8:"córnico";}s:2:"ky";a:1:{i:0;s:7:"kirghiz";}s:2:"la";a:1:{i:0;s:6:"latín";}s:2:"lb";a:1:{i:0;s:13:"luxemburgués";}s:2:"lg";a:1:{i:0;s:5:"ganda";}s:2:"li";a:1:{i:0;s:11:"limburgués";}s:2:"ln";a:1:{i:0;s:7:"lingala";}s:2:"lo";a:1:{i:0;s:8:"laosiano";}s:2:"lt";a:1:{i:0;s:7:"lituano";}s:2:"lu";a:1:{i:0;s:12:"luba-katanga";}s:2:"lv";a:1:{i:0;s:6:"letón";}s:2:"mg";a:1:{i:0;s:8:"malgache";}s:2:"mh";a:1:{i:0;s:10:"marshalés";}s:2:"mi";a:1:{i:0;s:6:"maorí";}s:2:"mk";a:1:{i:0;s:9:"macedonio";}s:2:"ml";a:1:{i:0;s:9:"malayalam";}s:2:"mn";a:1:{i:0;s:6:"mongol";}s:2:"mo";a:1:{i:0;s:7:"moldavo";}s:2:"mr";a:1:{i:0;s:7:"marathi";}s:2:"ms";a:1:{i:0;s:6:"malayo";}s:2:"mt";a:1:{i:0;s:7:"maltés";}s:2:"my";a:1:{i:0;s:7:"birmano";}s:2:"na";a:1:{i:0;s:8:"nauruano";}s:2:"nb";a:1:{i:0;s:14:"bokmal noruego";}s:2:"nd";a:1:{i:0;s:21:"ndebele septentrional";}s:2:"ne";a:1:{i:0;s:7:"nepalí";}s:2:"ng";a:1:{i:0;s:6:"ndonga";}s:2:"nl";a:1:{i:0;s:9:"holandés";}s:2:"nn";a:1:{i:0;s:15:"nynorsk noruego";}s:2:"no";a:1:{i:0;s:7:"noruego";}s:2:"nr";a:1:{i:0;s:18:"ndebele meridional";}s:2:"nv";a:1:{i:0;s:6:"navajo";}
s:2:"ny";a:1:{i:0;s:6:"nyanja";}s:2:"oc";a:1:{i:0;s:28:"occitano (después del 1500)";}s:2:"oj";a:1:{i:0;s:6:"ojibwa";}s:2:"om";a:1:{i:0;s:5:"oromo";}s:2:"or";a:1:{i:0;s:5:"oriya";}s:2:"os";a:1:{i:0;s:8:"osético";}s:2:"pa";a:1:{i:0;s:8:"punjabí";}s:2:"pi";a:1:{i:0;s:4:"pali";}s:2:"pl";a:1:{i:0;s:6:"polaco";}s:2:"ps";a:1:{i:0;s:6:"pashto";}s:2:"pt";a:1:{i:0;s:10:"portugués";}s:2:"qu";a:1:{i:0;s:7:"quechua";}s:2:"rm";a:1:{i:0;s:12:"reto-romance";}s:2:"rn";a:1:{i:0;s:8:"kiroundi";}s:2:"ro";a:1:{i:0;s:6:"rumano";}s:4:"root";a:1:{i:0;s:5:"raíz";}s:2:"ru";a:1:{i:0;s:4:"ruso";}s:2:"rw";a:1:{i:0;s:11:"kinyarwanda";}s:2:"sa";a:1:{i:0;s:10:"sánscrito";}s:2:"sc";a:1:{i:0;s:5:"sardo";}s:2:"sd";a:1:{i:0;s:6:"sindhi";}s:2:"se";a:1:{i:0;s:18:"sami septentrional";}s:2:"sg";a:1:{i:0;s:5:"sango";}s:2:"sh";a:1:{i:0;s:12:"serbo-croata";}s:2:"si";a:1:{i:0;s:9:"singalés";}s:3:"sid";a:1:{i:0;s:6:"sidamo";}s:2:"sk";a:1:{i:0;s:8:"eslovaco";}s:2:"sl";a:1:{i:0;s:8:"esloveno";}s:2:"sm";a:1:{i:0;s:7:"samoano";}s:2:"sn";a:1:{i:0;s:5:"shona";}s:2:"so";a:1:{i:0;s:7:"somalí";}s:2:"sq";a:1:{i:0;s:8:"albanés";}s:2:"sr";a:1:{i:0;s:6:"serbio";}s:2:"ss";a:1:{i:0;s:7:"siswati";}s:2:"st";a:1:{i:0;s:7:"sesotho";}s:2:"su";a:1:{i:0;s:9:"sundanés";}s:2:"sv";a:1:{i:0;s:5:"sueco";}s:2:"sw";a:1:{i:0;s:7:"swahili";}s:3:"syr";a:1:{i:0;s:7:"siriaco";}s:2:"ta";a:1:{i:0;s:5:"tamil";}s:2:"te";a:1:{i:0;s:6:"telugu";}s:2:"tg";a:1:{i:0;s:6:"tayiko";}s:2:"th";a:1:{i:0;s:10:"tailandés";}s:2:"ti";a:1:{i:0;s:8:"tigrinya";}s:3:"tig";a:1:{i:0;s:6:"tigré";}s:2:"tk";a:1:{i:0;s:8:"turkmeno";}s:2:"tl";a:1:{i:0;s:6:"tagalo";}s:2:"tn";a:1:{i:0;s:9:"setchwana";}s:2:"to";a:1:{i:0;s:19:"tonga (Islas Tonga)";}s:2:"tr";a:1:{i:0;s:5:"turco";}s:2:"ts";a:1:{i:0;s:6:"tsonga";}s:2:"tt";a:1:{i:0;s:5:"tatar";}s:2:"tw";a:1:{i:0;s:3:"twi";}s:2:"ty";a:1:{i:0;s:9:"tahitiano";}s:2:"ug";a:1:{i:0;s:5:"uigur";}s:2:"uk";a:1:{i:0;s:9:"ucraniano";}s:2:"ur";a:1:{i:0;s:4:"urdu";}s:2:"uz";a:1:{i:0;s:6:"uzbeko";}s:2:"ve";a:1:{i:0;s:5:"venda";}s:2:"vi";a:1:{i:0;s:10:"vietnamita";}s:2:"vo";a:1:{i:
0;s:7:"volapuk";}s:2:"wa";a:1:{i:0;s:6:"valón";}s:2:"wo";a:1:{i:0;s:5:"uolof";}s:2:"xh";a:1:{i:0;s:5:"xhosa";}s:2:"yi";a:1:{i:0;s:6:"yidish";}s:2:"yo";a:1:{i:0;s:6:"yoruba";}s:2:"za";a:1:{i:0;s:6:"zhuang";}s:2:"zh";a:1:{i:0;s:5:"chino";}s:2:"zu";a:1:{i:0;s:5:"zulú";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:23:"¤#,##0.00;(¤#,##0.00)";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Scripts";a:55:{s:4:"Arab";a:1:{i:0;s:6:"árabe";}s:4:"Armn";a:1:{i:0;s:7:"armenio";}s:4:"Beng";a:1:{i:0;s:8:"bengalí";}s:4:"Bopo";a:1:{i:0;s:8:"bopomofo";}s:4:"Brai";a:1:{i:0;s:7:"braille";}s:4:"Buhd";a:1:{i:0;s:5:"buhid";}s:4:"Cans";a:1:{i:0;s:44:"símbolos aborígenes canadienses unificados";}s:4:"Cher";a:1:{i:0;s:8:"cherokee";}s:4:"Copt";a:1:{i:0;s:5:"copto";}s:4:"Cprt";a:1:{i:0;s:9:"chipriota";}s:4:"Cyrl";a:1:{i:0;s:9:"cirílico";}s:4:"Deva";a:1:{i:0;s:10:"devanagari";}s:4:"Dsrt";a:1:{i:0;s:7:"deseret";}s:4:"Ethi";a:1:{i:0;s:9:"etíopico";}s:4:"Geor";a:1:{i:0;s:9:"georgiano";}s:4:"Goth";a:1:{i:0;s:7:"gótico";}s:4:"Grek";a:1:{i:0;s:6:"griego";}s:4:"Gujr";a:1:{i:0;s:8:"gujarati";}s:4:"Guru";a:1:{i:0;s:7:"gurmuji";}s:4:"Hang";a:1:{i:0;s:6:"hangul";}s:4:"Hani";a:1:{i:0;s:3:"han";}s:4:"Hano";a:1:{i:0;s:7:"hanunoo";}s:4:"Hans";a:1:{i:0;s:16:"han simplificado";}s:4:"Hant";a:1:{i:0;s:15:"han tradicional";}s:4:"Hebr";a:1:{i:0;s:6:"hebreo";}s:4:"Hira";a:1:{i:0;s:8:"hiragana";}s:4:"Ital";a:1:{i:0;s:19:"antigua bastardilla";}s:4:"Kana";a:1:{i:0;s:8:"katakana";}s:4:"Khmr";a:1:{i:0;s:5:"jemer";}s:4:"Knda";a:1:{i:0;s:8:"canarés";}s:4:"Laoo";a:1:{i:0;s:3:"lao";}s:4:"Latn";a:1:{i:0;s:6:"latín";}s:4:"Limb";a:1:{i:0;s:5:"limbu";}s:4:"Linb";a:1:{i:0;s:8:"linear B";}s:4:"Mlym";a:1:{i:0;s:10:"malayálam";}s:4:"Mong";a:1:{i:0;s:10:"mongoliano";}s:4:"Mymr";a:1:{i:0;s:7:"myanmar";}s:4:"Ogam";a:1:{i:0;s:5:"ogham";}s:4:"Orya";a:1:{i:0;s:5:"oriya";}s:4:"Osma";a:1:{i:0;s:8:"osmaniya";}s:4:"Runr";a:1:{i:0;s:7:"rúnico";}s:4:"Shaw";a:1:{i:0;s:7:"shavian";}s:4:"Sinh";a:1:{i:0;s:7:"binhala";}s:4:"Syrc";a
:1:{i:0;s:7:"siriaco";}s:4:"Tagb";a:1:{i:0;s:9:"tagbanúa";}s:4:"Tale";a:1:{i:0;s:6:"tai le";}s:4:"Taml";a:1:{i:0;s:5:"tamil";}s:4:"Telu";a:1:{i:0;s:6:"telugu";}s:4:"Tglg";a:1:{i:0;s:6:"tagalo";}s:4:"Thaa";a:1:{i:0;s:6:"thaana";}s:4:"Thai";a:1:{i:0;s:10:"tailandés";}s:4:"Tibt";a:1:{i:0;s:8:"tibetano";}s:4:"Ugar";a:1:{i:0;s:10:"ugarítico";}s:4:"Yiii";a:1:{i:0;s:2:"yi";}s:4:"Zyyy";a:1:{i:0;s:6:"común";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:18:"calendario budista";}s:7:"chinese";a:1:{i:0;s:16:"calendario chino";}s:9:"gregorian";a:1:{i:0;s:21:"calendario gregoriano";}s:6:"hebrew";a:1:{i:0;s:17:"calendario hebreo";}s:7:"islamic";a:1:{i:0;s:20:"calendario islámico";}s:13:"islamic-civil";a:1:{i:0;s:26:"calendario civil islámico";}s:8:"japanese";a:1:{i:0;s:19:"calendario japonés";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:13:"orden directo";}s:9:"phonebook";a:1:{i:0;s:28:"orden de listín telefónico";}s:6:"pinyin";a:1:{i:0;s:12:"orden pinyin";}s:6:"stroke";a:1:{i:0;s:15:"orden pincelada";}s:11:"traditional";a:1:{i:0;s:17:"orden tradicional";}}}s:8:"Variants";a:1:{s:7:"REVISED";a:1:{i:0;s:8:"Revisado";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:14:"HH'H'mm''ss' z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:9:"dd-MMM-yy";i:7;s:7:"d/MM/yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:3:"dom";i:1;s:3:"lun";i:2;s:3:"mar";i:3;s:4:"mié";i:4;s:3:"jue";i:5;s:3:"vie";i:6;s:4:"sáb";}s:6:"narrow";a:7:{i:0;s:1:"D";i:1;s:1:"L";i:2;s:1:"M";i:3;s:1:"M";i:4;s:1:"J";i:5;s:1:"V";i:6;s:1:"S";}s:4:"wide";a:7:{i:0;s:7:"domingo";i:1;s:5:"lunes";i:2;s:6:"martes";i:3;s:10:"miércoles";i:4;s:6:"jueves";i:5;s:7:"viernes";i:6;s:7:"sábado";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:4:"a.C.";i:1;s:4:"d.C.";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11
:"abbreviated";a:12:{i:0;s:3:"ene";i:1;s:3:"feb";i:2;s:3:"mar";i:3;s:3:"abr";i:4;s:3:"may";i:5;s:3:"jun";i:6;s:3:"jul";i:7;s:3:"ago";i:8;s:3:"sep";i:9;s:3:"oct";i:10;s:3:"nov";i:11;s:3:"dic";}s:6:"narrow";a:12:{i:0;s:1:"E";i:1;s:1:"F";i:2;s:1:"M";i:3;s:1:"A";i:4;s:1:"M";i:5;s:1:"J";i:6;s:1:"J";i:7;s:1:"A";i:8;s:1:"S";i:9;s:1:"O";i:10;s:1:"N";i:11;s:1:"D";}s:4:"wide";a:12:{i:0;s:5:"enero";i:1;s:7:"febrero";i:2;s:5:"marzo";i:3;s:5:"abril";i:4;s:4:"mayo";i:5;s:5:"junio";i:6;s:5:"julio";i:7;s:6:"agosto";i:8;s:10:"septiembre";i:9;s:7:"octubre";i:10;s:9:"noviembre";i:11;s:9:"diciembre";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GuMtkHmsSEDFwWahKzUeygAZ";}s:11:"zoneStrings";a:17:{i:0;a:6:{i:0;s:19:"America/Los_Angeles";i:1;s:28:"Hora estándar del Pacífico";i:2;s:3:"PST";i:3;s:28:"Hora de verano del Pacífico";i:4;s:3:"PDT";i:5;s:12:"Los Ãngeles";}i:1;a:6:{i:0;s:14:"America/Denver";i:1;s:26:"Hora estándar de Montaña";i:2;s:3:"MST";i:3;s:26:"Hora de verano de Montaña";i:4;s:3:"MDT";i:5;s:6:"Denver";}i:2;a:6:{i:0;s:15:"America/Phoenix";i:1;s:26:"Hora estándar de Montaña";i:2;s:3:"MST";i:3;s:26:"Hora estándar de Montaña";i:4;s:3:"MST";i:5;s:7:"Phoenix";}i:3;a:6:{i:0;s:15:"America/Chicago";i:1;s:22:"Hora estándar central";i:2;s:3:"CST";i:3;s:22:"Hora de verano central";i:4;s:3:"CDT";i:5;s:7:"Chicago";}i:4;a:6:{i:0;s:16:"America/New_York";i:1;s:23:"Hora estándar oriental";i:2;s:3:"EST";i:3;s:23:"Hora de verano oriental";i:4;s:3:"EDT";i:5;s:10:"Nueva York";}i:5;a:6:{i:0;s:20:"America/Indianapolis";i:1;s:23:"Hora estándar oriental";i:2;s:3:"EST";i:3;s:23:"Hora estándar oriental";i:4;s:3:"EST";i:5;s:13:"Indianápolis";}i:6;a:6:{i:0;s:16:"Pacific/Honolulu";i:1;s:23:"Hora estándar de Hawai";i:2;s:3:"HST";i:3;s:23:"Hora estándar de Hawai";i:4;s:3:"HST";i:5;s:8:"Honolulu";}i:7;a:6:{i:0;s:17:"America/Anchorage";i:1;s:24:"Hora estándar de Alaska";i:2;s:3:"AST";i:3;s:24:"Hora de verano de Alaska";i:4;s:3:"ADT";i:5;s:9:"Anchorage";}i:8;a:6:{i:0;s:15:"America/Halifax";i:1;s:29:"Hora estándar del Atlántico";i:2;s:3:"A
ST";i:3;s:29:"Hora de verano del Atlántico";i:4;s:3:"ADT";i:5;s:7:"Halifax";}i:9;a:6:{i:0;s:16:"America/St_Johns";i:1;s:30:"Hora estándar de Newfoundland";i:2;s:3:"CNT";i:3;s:30:"Hora de verano de Newfoundland";i:4;s:3:"CDT";i:5;s:9:"St. Johns";}i:10;a:6:{i:0;s:12:"Europe/Paris";i:1;s:32:"Hora estándar de Europa Central";i:2;s:3:"CET";i:3;s:32:"Hora de verano de Europa Central";i:4;s:4:"CEST";i:5;s:6:"París";}i:11;a:6:{i:0;s:7:"Etc/GMT";i:1;s:23:"Hora media de Greenwich";i:2;s:3:"GMT";i:3;s:23:"Hora media de Greenwich";i:4;s:3:"GMT";i:5;s:7:"Londres";}i:12;a:6:{i:0;s:17:"Africa/Casablanca";i:1;s:23:"Hora media de Greenwich";i:2;s:3:"GMT";i:3;s:23:"Hora media de Greenwich";i:4;s:3:"GMT";i:5;s:10:"Casablanca";}i:13;a:6:{i:0;s:14:"Asia/Jerusalem";i:1;s:24:"Hora estándar de Israel";i:2;s:3:"IST";i:3;s:24:"Hora de verano de Israel";i:4;s:3:"IDT";i:5;s:10:"Jerusalén";}i:14;a:6:{i:0;s:10:"Asia/Tokyo";i:1;s:24:"Hora estándar de Japón";i:2;s:3:"JST";i:3;s:24:"Hora estándar de Japón";i:4;s:3:"JST";i:5;s:5:"Tokio";}i:15;a:6:{i:0;s:16:"Europe/Bucharest";i:1;s:33:"Hora estándar de Europa del Este";i:2;s:3:"EET";i:3;s:33:"Hora de verano de Europa del Este";i:4;s:4:"EEST";i:5;s:8:"Bucarest";}i:16;a:6:{i:0;s:13:"Asia/Shanghai";i:1;s:23:"Hora estándar de China";i:2;s:3:"CTT";i:3;s:23:"Hora estándar de China";i:4;s:3:"CDT";i:5;s:8:"Shanghai";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_AR.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_AR.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_AR.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:10:"Currencies";a:2:{s:3:"ARS";a:2:{i:0;s:1:"$";i:1;s:14:"Peso Argentino";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:16:"Dólar Americano";}}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:11:"HH'h'''mm z";i:1;s:9:"H:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_BO.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_BO.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_BO.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_CL.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_CL.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_CL.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:5:{s:10:"Currencies";a:2:{s:3:"CLP";a:2:{i:0;s:1:"$";i:1;s:12:"Peso Chileno";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:16:"Dólar Americano";}}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;¤-#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:9:"H:mm:ss z";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:8:"dd-MM-yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_CO.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_CO.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_CO.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:10:"Currencies";a:2:{s:3:"COP";a:2:{i:0;s:1:"$";i:1;s:16:"Peso de Colombia";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:16:"Dólar Americano";}}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:9:"H:mm:ss z";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:9:"d/MM/yyyy";i:7;s:7:"d/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_CR.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_CR.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_CR.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_DO.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_DO.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_DO.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_EC.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_EC.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_EC.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;¤-#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:9:"H:mm:ss z";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_ES.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_ES.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_ES.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:5:{s:10:"Currencies";a:1:{s:3:"ESP";a:3:{i:0;s:3:"₧";i:1;s:16:"peseta española";i:2;a:3:{i:0;s:18:"#,##0 ¤;-#,##0 ¤";i:1;s:1:",";i:2;s:1:".";}}}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:14:"HH'H'mm''ss' z";i:1;s:10:"HH:mm:ss z";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_GT.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_GT.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_GT.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:9:"d/MM/yyyy";i:7;s:7:"d/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_HN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_HN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_HN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:27:"EEEE dd' de 'MMMM' de 'yyyy";i:5;s:22:"dd' de 'MMMM' de 'yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_MX.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_MX.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_MX.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:10:"Currencies";a:2:{s:3:"MXN";a:2:{i:0;s:1:"$";i:1;s:3:"MXN";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:16:"Dólar Americano";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_NI.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_NI.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_NI.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PA.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PA.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PA.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"MM/dd/yyyy";i:7;s:8:"MM/dd/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;¤-#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PR.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PR.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PR.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:10:"Currencies";a:1:{s:3:"USD";a:2:{i:0;s:1:"$";i:1;s:16:"Dólar Americano";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"MM/dd/yyyy";i:7;s:8:"MM/dd/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PY.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PY.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_PY.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:18:"¤ #,##0;¤ -#,##0";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_SV.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_SV.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_SV.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_US.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_US.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_US.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:21:"MeasurementSystem:int";a:1:{i:0;i:1;}s:19:"PaperSize:intvector";a:2:{i:0;i:279;i:1;i:216;}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:1;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:11:"MMM d, yyyy";i:7;s:6:"M/d/yy";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:7;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_UY.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_UY.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_UY.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"¤ #,##0.00;(¤#,##0.00)";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_VE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_VE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/es_VE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:23:"¤#,##0.00;¤ -#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:26:"EEEE d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/et.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/et.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/et.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:8:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:23:"Araabia Ühendemiraadid";}s:2:"AF";a:1:{i:0;s:10:"Afganistan";}s:2:"AG";a:1:{i:0;s:18:"Antigua ja Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:8:"Albaania";}s:2:"AM";a:1:{i:0;s:8:"Armeenia";}s:2:"AN";a:1:{i:0;s:17:"Hollandi Antillid";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarktika";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:14:"Ameerika Samoa";}s:2:"AT";a:1:{i:0;s:7:"Austria";}s:2:"AU";a:1:{i:0;s:10:"Austraalia";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:13:"AserbaidĪaan";}s:2:"BA";a:1:{i:0;s:23:"Bosnia ja Hertsegoviina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BE";a:1:{i:0;s:6:"Belgia";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:9:"Bulgaaria";}s:2:"BH";a:1:{i:0;s:7:"Bahrein";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:6:"Brunei";}s:2:"BO";a:1:{i:0;s:8:"Boliivia";}s:2:"BR";a:1:{i:0;s:9:"Brasiilia";}s:2:"BS";a:1:{i:0;s:13:"Bahama saared";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BV";a:1:{i:0;s:14:"Bouvet’ saar";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:9:"Valgevene";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:12:"Kookossaared";}s:2:"CD";a:1:{i:0;s:8:"Kongo DV";}s:2:"CF";a:1:{i:0;s:21:"Kesk-Aafrika Vabariik";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:7:"Ĩveits";}s:2:"CI";a:1:{i:0;s:15:"Cote d’Ivoire";}s:2:"CK";a:1:{i:0;s:12:"Cooki saared";}s:2:"CL";a:1:{i:0;s:6:"Tiiili";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:5:"Hiina";}s:2:"CO";a:1:{i:0;s:8:"Colombia";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:5:"Kuuba";}s:2:"CV";a:1:{i:0;s:10:"Cabo Verde";}s:2:"CX";a:1:{i:0;s:10:"Jõulusaar";}s:2:"CY";a:1:{i:0;s:7:"Küpros";}s:2:"CZ";a:1:{i:0;s:15:"Tiehhi Vabariik";}s:2:"DE";a:1:{i:0;s:8:"Saksamaa";}s:2:"DJ";a:1:{i:0;s:8:"Djibouti";}s:2:"DK";a:1:{i:0;s:5:"Taani";}s:2:"D
M";a:1:{i:0;s:8:"Dominica";}s:2:"DO";a:1:{i:0;s:20:"Dominikaani Vabariik";}s:2:"DZ";a:1:{i:0;s:9:"AlĪeeria";}s:2:"EC";a:1:{i:0;s:7:"Ecuador";}s:2:"EE";a:1:{i:0;s:5:"Eesti";}s:2:"EG";a:1:{i:0;s:7:"Egiptus";}s:2:"EH";a:1:{i:0;s:14:"Lääne-Sahara";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:9:"Hispaania";}s:2:"ET";a:1:{i:0;s:8:"Etioopia";}s:2:"FI";a:1:{i:0;s:5:"Soome";}s:2:"FJ";a:1:{i:0;s:6:"FidĪi";}s:2:"FK";a:1:{i:0;s:16:"Falklandi saared";}s:2:"FM";a:1:{i:0;s:23:"Mikroneesia Liiduriigid";}s:2:"FO";a:1:{i:0;s:14:"Fääri saared";}s:2:"FR";a:1:{i:0;s:11:"Prantsusmaa";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:16:"Ühendkuningriik";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:7:"Gruusia";}s:2:"GF";a:1:{i:0;s:18:"Prantsuse Guajaana";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:11:"Gröönimaa";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:18:"Ekvatoriaal-Guinea";}s:2:"GR";a:1:{i:0;s:6:"Kreeka";}s:2:"GS";a:1:{i:0;s:41:"Lõuna-Georgia ja Lõuna-Sandwichi saared";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinea-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:27:"Hongkongi erihalduspiirkond";}s:2:"HM";a:1:{i:0;s:17:"Heard ja McDonald";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:9:"Horvaatia";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:6:"Ungari";}s:2:"ID";a:1:{i:0;s:10:"Indoneesia";}s:2:"IE";a:1:{i:0;s:7:"Iirimaa";}s:2:"IL";a:1:{i:0;s:7:"Iisrael";}s:2:"IN";a:1:{i:0;s:5:"India";}s:2:"IO";a:1:{i:0;s:23:"Briti India ookeani ala";}s:2:"IQ";a:1:{i:0;s:5:"Iraak";}s:2:"IR";a:1:{i:0;s:5:"Iraan";}s:2:"IS";a:1:{i:0;s:6:"Island";}s:2:"IT";a:1:{i:0;s:7:"Itaalia";}s:2:"JM";a:1:{i:0;s:7:"Jamaica";}s:2:"JO";a:1:{i:0;s:9:"Jordaania";}s:2:"JP";a:1:{i:0;s:6:"Jaapan";}s:2:"KE";a:1:{i:0;s:5:"Kenya";}s:2:"KG";a:1:{i:0;s:12:"Kõrgõzstan";}s:2:"KH";a:1:{i:0;s:9:"KambodĪa";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:
1:{i:0;s:8:"Komoorid";}s:2:"KN";a:1:{i:0;s:20:"Saint Kitts ja Nevis";}s:2:"KP";a:1:{i:0;s:12:"Põhja-Korea";}s:2:"KR";a:1:{i:0;s:12:"Lõuna-Korea";}s:2:"KW";a:1:{i:0;s:6:"Kuveit";}s:2:"KY";a:1:{i:0;s:14:"Kaimani saared";}s:2:"KZ";a:1:{i:0;s:9:"Kasahstan";}s:2:"LA";a:1:{i:0;s:9:"Laose DRV";}s:2:"LB";a:1:{i:0;s:8:"Liibanon";}s:2:"LC";a:1:{i:0;s:11:"Saint Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:8:"Libeeria";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:5:"Leedu";}s:2:"LU";a:1:{i:0;s:10:"Luksemburg";}s:2:"LV";a:1:{i:0;s:5:"Läti";}s:2:"LY";a:1:{i:0;s:7:"Liibüa";}s:2:"MA";a:1:{i:0;s:6:"Maroko";}s:2:"MC";a:1:{i:0;s:6:"Monaco";}s:2:"MD";a:1:{i:0;s:7:"Moldova";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:16:"Marshalli Saared";}s:2:"MK";a:1:{i:0;s:19:"Makedoonia Vabariik";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:9:"Mongoolia";}s:2:"MO";a:1:{i:0;s:30:"Aomeni Hiina erihalduspiirkond";}s:2:"MP";a:1:{i:0;s:16:"Põhja-Mariaanid";}s:2:"MQ";a:1:{i:0;s:10:"Martinique";}s:2:"MR";a:1:{i:0;s:11:"Mauritaania";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:9:"Maldiivid";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:7:"Mehhiko";}s:2:"MY";a:1:{i:0;s:8:"Malaisia";}s:2:"MZ";a:1:{i:0;s:9:"Mosambiik";}s:2:"NA";a:1:{i:0;s:8:"Namiibia";}s:2:"NC";a:1:{i:0;s:14:"Uus-Kaledoonia";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:7:"Norfolk";}s:2:"NG";a:1:{i:0;s:8:"Nigeeria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:7:"Holland";}s:2:"NO";a:1:{i:0;s:5:"Norra";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:11:"Uus-Meremaa";}s:2:"OM";a:1:{i:0;s:5:"Omaan";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:5:"Peruu";}s:2:"PF";a:1:{i:0;s:21:"Prantsuse Polüneesia";}s:2:"PG";a:1:{i:0;s:17:"Paapua Uus-Guinea";}s:2:"PH";a:1:{i:0;s:10:"Filipiinid";}s:2:"PK";a:1:{i:0;
s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:5:"Poola";}s:2:"PM";a:1:{i:0;s:24:"Saint-Pierre ja Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:11:"Puerto Rico";}s:2:"PS";a:1:{i:0;s:22:"Palestiina Omavalitsus";}s:2:"PT";a:1:{i:0;s:8:"Portugal";}s:2:"PW";a:1:{i:0;s:5:"Belau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Katar";}s:2:"RE";a:1:{i:0;s:8:"Réunion";}s:2:"RO";a:1:{i:0;s:8:"Rumeenia";}s:2:"RU";a:1:{i:0;s:7:"Venemaa";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:13:"Saudi Araabia";}s:2:"SB";a:1:{i:0;s:16:"Saalomoni Saared";}s:2:"SC";a:1:{i:0;s:9:"Seiiellid";}s:2:"SD";a:1:{i:0;s:6:"Sudaan";}s:2:"SE";a:1:{i:0;s:6:"Rootsi";}s:2:"SG";a:1:{i:0;s:8:"Singapur";}s:2:"SH";a:1:{i:0;s:12:"Saint Helena";}s:2:"SI";a:1:{i:0;s:9:"Sloveenia";}s:2:"SJ";a:1:{i:0;s:21:"Svalbard ja Jan Mayen";}s:2:"SK";a:1:{i:0;s:9:"Slovakkia";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:8:"Somaalia";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:8:"Suriname";}s:2:"ST";a:1:{i:0;s:21:"Sao Tomé ja Principe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:8:"Süüria";}s:2:"SZ";a:1:{i:0;s:9:"Svaasimaa";}s:2:"TC";a:1:{i:0;s:15:"Turks ja Caicos";}s:2:"TD";a:1:{i:0;s:5:"Tiaad";}s:2:"TF";a:1:{i:0;s:20:"Prantsuse Lõunaalad";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:3:"Tai";}s:2:"TJ";a:1:{i:0;s:12:"TadĪikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:9:"Ida-Timor";}s:2:"TM";a:1:{i:0;s:13:"Türkmenistan";}s:2:"TN";a:1:{i:0;s:8:"Tuneesia";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:6:"Türgi";}s:2:"TT";a:1:{i:0;s:18:"Trinidad ja Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Taiwan";}s:2:"TZ";a:1:{i:0;s:9:"Tansaania";}s:2:"UA";a:1:{i:0;s:7:"Ukraina";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:24:"Ühendriikide hajasaared";}s:2:"US";a:1:{i:0;s:21:"Ameerika Ühendriigid";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:10:"Usbekistan";}s:2:"VA";a:1:{i:0;s:20:"Püh
a Tool (Vatikan)";}s:2:"VC";a:1:{i:0;s:28:"Saint Vincent ja Grenadiinid";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:18:"Briti Neitsisaared";}s:2:"VI";a:1:{i:0;s:16:"USA Neitsisaared";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:16:"Wallis ja Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:6:"Jeemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:11:"Jugoslaavia";}s:2:"ZA";a:1:{i:0;s:23:"Lõuna-Aafrika Vabariik";}s:2:"ZM";a:1:{i:0;s:6:"Sambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:1:{s:3:"EEK";a:2:{i:0;s:2:"kr";i:1;s:3:"EEK";}}s:9:"Languages";a:30:{s:2:"ar";a:1:{i:0;s:7:"Araabia";}s:2:"bg";a:1:{i:0;s:9:"Bulgaaria";}s:2:"cs";a:1:{i:0;s:6:"Tiehhi";}s:2:"da";a:1:{i:0;s:5:"Taani";}s:2:"de";a:1:{i:0;s:5:"Saksa";}s:2:"el";a:1:{i:0;s:6:"Kreeka";}s:2:"en";a:1:{i:0;s:7:"Inglise";}s:2:"es";a:1:{i:0;s:9:"Hispaania";}s:2:"et";a:1:{i:0;s:5:"Eesti";}s:2:"fi";a:1:{i:0;s:5:"Soome";}s:2:"fr";a:1:{i:0;s:9:"Prantsuse";}s:2:"he";a:1:{i:0;s:7:"Heebrea";}s:2:"hr";a:1:{i:0;s:8:"Horvaadi";}s:2:"hu";a:1:{i:0;s:6:"Ungari";}s:2:"it";a:1:{i:0;s:7:"Itaalia";}s:2:"ja";a:1:{i:0;s:7:"Jaapani";}s:2:"ko";a:1:{i:0;s:5:"Korea";}s:2:"lt";a:1:{i:0;s:5:"Leedu";}s:2:"lv";a:1:{i:0;s:5:"Läti";}s:2:"nl";a:1:{i:0;s:8:"Hollandi";}s:2:"no";a:1:{i:0;s:5:"Norra";}s:2:"pl";a:1:{i:0;s:5:"Poola";}s:2:"pt";a:1:{i:0;s:9:"Portugali";}s:2:"ro";a:1:{i:0;s:8:"Rumeenia";}s:2:"ru";a:1:{i:0;s:4:"Vene";}s:2:"sk";a:1:{i:0;s:7:"Slovaki";}s:2:"sl";a:1:{i:0;s:8:"Sloveeni";}s:2:"sv";a:1:{i:0;s:6:"Rootsi";}s:2:"tr";a:1:{i:0;s:6:"Türgi";}s:2:"zh";a:1:{i:0;s:5:"Hiina";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:9:"H:mm:ss z";i:1;s:9:"H:mm:ss z";i:2;
s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:18:"EEEE, d, MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd.MM.yyyy";i:7;s:8:"dd.MM.yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:1:"P";i:1;s:1:"E";i:2;s:1:"T";i:3;s:1:"K";i:4;s:1:"N";i:5;s:1:"R";i:6;s:1:"L";}s:4:"wide";a:7:{i:0;s:10:"pühapäev";i:1;s:10:"esmaspäev";i:2;s:10:"teisipäev";i:3;s:10:"kolmapäev";i:4;s:10:"neljapäev";i:5;s:5:"reede";i:6;s:8:"laupäev";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:6:"e.m.a.";i:1;s:6:"m.a.j.";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:4:"jaan";i:1;s:5:"veebr";i:2;s:6:"märts";i:3;s:3:"apr";i:4;s:3:"mai";i:5;s:5:"juuni";i:6;s:5:"juuli";i:7;s:3:"aug";i:8;s:4:"sept";i:9;s:3:"okt";i:10;s:3:"nov";i:11;s:4:"dets";}s:4:"wide";a:12:{i:0;s:7:"jaanuar";i:1;s:8:"veebruar";i:2;s:6:"märts";i:3;s:6:"aprill";i:4;s:3:"mai";i:5;s:5:"juuni";i:6;s:5:"juuli";i:7;s:6:"august";i:8;s:9:"september";i:9;s:8:"oktoober";i:10;s:8:"november";i:11;s:9:"detsember";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/et_EE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/et_EE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/et_EE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/eu.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/eu.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/eu.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:109:{s:2:"AE";a:1:{i:0;s:24:"Arabiar Emirrerri Batuak";}s:2:"AF";a:1:{i:0;s:10:"Afganistan";}s:2:"AG";a:1:{i:0;s:19:"Antigua eta Barbuda";}s:2:"AQ";a:1:{i:0;s:9:"Antartika";}s:2:"BA";a:1:{i:0;s:18:"Bosnia-Herzegovina";}s:2:"BE";a:1:{i:0;s:7:"Belgika";}s:2:"BO";a:1:{i:0;s:7:"Bolibia";}s:2:"BR";a:1:{i:0;s:6:"Brasil";}s:2:"BS";a:1:{i:0;s:7:"Bahamak";}s:2:"BY";a:1:{i:0;s:11:"Bielorrusia";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CF";a:1:{i:0;s:25:"Afrika Erdiko Errepublika";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:6:"Suitza";}s:2:"CI";a:1:{i:0;s:10:"Boli Kosta";}s:2:"CL";a:1:{i:0;s:5:"Txile";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:5:"Txina";}s:2:"CO";a:1:{i:0;s:8:"Kolonbia";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:10:"Cabo Verde";}s:2:"CY";a:1:{i:0;s:5:"Zipre";}s:2:"CZ";a:1:{i:0;s:19:"Txekiar errepublika";}s:2:"DE";a:1:{i:0;s:8:"Alemania";}s:2:"DJ";a:1:{i:0;s:7:"Djibuti";}s:2:"DK";a:1:{i:0;s:9:"Danimarka";}s:2:"DM";a:1:{i:0;s:8:"Dominika";}s:2:"DO";a:1:{i:0;s:21:"Dominikar Errepublika";}s:2:"DZ";a:1:{i:0;s:7:"Aljeria";}s:2:"EC";a:1:{i:0;s:7:"Ekuador";}s:2:"EG";a:1:{i:0;s:6:"Egipto";}s:2:"EH";a:1:{i:0;s:19:"Mendebaldeko Sahara";}s:2:"ES";a:1:{i:0;s:8:"Espainia";}s:2:"ET";a:1:{i:0;s:7:"Etiopia";}s:2:"FI";a:1:{i:0;s:9:"Finlandia";}s:2:"FM";a:1:{i:0;s:10:"Mikronesia";}s:2:"FR";a:1:{i:0;s:8:"Frantzia";}s:2:"GN";a:1:{i:0;s:5:"Ginea";}s:2:"GQ";a:1:{i:0;s:14:"Ekuatore Ginea";}s:2:"GR";a:1:{i:0;s:6:"Grezia";}s:2:"GW";a:1:{i:0;s:12:"Ginea-Bissau";}s:2:"HR";a:1:{i:0;s:7:"Kroazia";}s:2:"HU";a:1:{i:0;s:8:"Hungaria";}s:2:"IE";a:1:{i:0;s:7:"Irlanda";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IS";a:1:{i:0;s:8:"Islandia";}s:2:"IT";a:1:{i:0;s:6:"Italia";}s:2:"JM";a:1:{i:0;s:7:"Jamaika";}s:2:"JO";a:1:{i:0;s:8:"Jordania";}s:2:"JP";a:1:{i:0;s:7:"Japonia";}s:2:"KE";a:1:{i:0;s:5:"Kenia";}s:2:"KG";a:1:{i:0;s:11:"Kirgizistan";}s:2:"KH";a:1:{i:0;s:8:"Kanbodia";}s:2:"KM";a:1:{i:0;s:8:"Komoreak";}s:2:"KN";a:1:{i:0;s:21:"Saint Kitts eta Nevis";}s:2:"KP";a:1:{i:0;s:10:"Ipar Korea";}s:2:"KR";a:1:{i:0
;s:10:"Hego Korea";}s:2:"LB";a:1:{i:0;s:6:"Libano";}s:2:"LC";a:1:{i:0;s:11:"Santa Luzia";}s:2:"LT";a:1:{i:0;s:8:"Lituania";}s:2:"LU";a:1:{i:0;s:10:"Luxenburgo";}s:2:"LV";a:1:{i:0;s:7:"Letonia";}s:2:"LY";a:1:{i:0;s:5:"Libia";}s:2:"MA";a:1:{i:0;s:6:"Maroko";}s:2:"MC";a:1:{i:0;s:6:"Monako";}s:2:"MD";a:1:{i:0;s:8:"Moldavia";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:17:"Marshall uharteak";}s:2:"MK";a:1:{i:0;s:9:"Mazedonia";}s:2:"MU";a:1:{i:0;s:8:"Maurizio";}s:2:"MV";a:1:{i:0;s:8:"Maldivak";}s:2:"MX";a:1:{i:0;s:6:"Mexiko";}s:2:"MY";a:1:{i:0;s:7:"Malasia";}s:2:"MZ";a:1:{i:0;s:9:"Mozambike";}s:2:"NI";a:1:{i:0;s:9:"Nikaragua";}s:2:"NL";a:1:{i:0;s:11:"Herbehereak";}s:2:"NO";a:1:{i:0;s:8:"Norvegia";}s:2:"NZ";a:1:{i:0;s:15:"Zeelanda Berria";}s:2:"PG";a:1:{i:0;s:18:"Papua Ginea Berria";}s:2:"PH";a:1:{i:0;s:9:"Filipinak";}s:2:"PL";a:1:{i:0;s:7:"Polonia";}s:2:"PY";a:1:{i:0;s:8:"Paraguai";}s:2:"QA";a:1:{i:0;s:5:"Katar";}s:2:"RO";a:1:{i:0;s:9:"Errumania";}s:2:"RU";a:1:{i:0;s:7:"Errusia";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SB";a:1:{i:0;s:16:"Salomon uharteak";}s:2:"SC";a:1:{i:0;s:11:"Seychelleak";}s:2:"SE";a:1:{i:0;s:6:"Suedia";}s:2:"SG";a:1:{i:0;s:8:"Singapur";}s:2:"SI";a:1:{i:0;s:9:"Eslovenia";}s:2:"SK";a:1:{i:0;s:9:"Eslovakia";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leona";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:22:"Sao Tomé eta Principe";}s:2:"SY";a:1:{i:0;s:5:"Siria";}s:2:"SZ";a:1:{i:0;s:11:"Swazilandia";}s:2:"TD";a:1:{i:0;s:4:"Txad";}s:2:"TH";a:1:{i:0;s:9:"Tailandia";}s:2:"TJ";a:1:{i:0;s:11:"Tadjikistan";}s:2:"TR";a:1:{i:0;s:6:"Turkia";}s:2:"TT";a:1:{i:0;s:19:"Trinidad eta Tobago";}s:2:"UA";a:1:{i:0;s:7:"Ukraina";}s:2:"US";a:1:{i:0;s:25:"Ameriketako Estatu Batuak";}s:2:"UY";a:1:{i:0;s:7:"Uruguai";}s:2:"VA";a:1:{i:0;s:8:"Vatikano";}s:2:"VC";a:1:{i:0;s:28:"Saint Vincent eta Grenadinak";}s:2:"ZA";a:1:{i:0;s:10:"Hegoafrika";}}s:10:"Currencies";a:1:{s:3:"ESP";a:3:{i:0;s:3:"₧";i:1;s:3:"ESP";i:2;a:3:{i:0;s:18:"¤ #,##0;-¤ #,##0";i:1;s:1:",";i:2;s:1:".";}}}s:9:"Languages";a
:1:{s:2:"eu";a:1:{i:0;s:7:"euskara";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:2:"ig";i:1;s:2:"al";i:2;s:2:"as";i:3;s:2:"az";i:4;s:2:"og";i:5;s:2:"or";i:6;s:2:"lr";}s:4:"wide";a:7:{i:0;s:7:"igandea";i:1;s:10:"astelehena";i:2;s:9:"asteartea";i:3;s:10:"asteazkena";i:4;s:8:"osteguna";i:5;s:8:"ostirala";i:6;s:9:"larunbata";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"urt";i:1;s:3:"ots";i:2;s:3:"mar";i:3;s:3:"api";i:4;s:3:"mai";i:5;s:3:"eka";i:6;s:3:"uzt";i:7;s:3:"abu";i:8;s:3:"ira";i:9;s:3:"urr";i:10;s:3:"aza";i:11;s:3:"abe";}s:4:"wide";a:12:{i:0;s:9:"urtarrila";i:1;s:7:"otsaila";i:2;s:7:"martxoa";i:3;s:7:"apirila";i:4;s:7:"maiatza";i:5;s:6:"ekaina";i:6;s:7:"uztaila";i:7;s:7:"abuztua";i:8;s:6:"iraila";i:9;s:5:"urria";i:10;s:6:"azaroa";i:11;s:7:"abendua";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/eu_ES.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/eu_ES.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/eu_ES.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:31:"EEEE, yyyy'eko' MMMM'ren' dd'a'";i:5;s:29:"EEE, yyyy'eko' MMM'ren' dd'a'";i:6;s:13:"yy'-'MMM'-'dd";i:7;s:12:"yy'-'MM'-'dd";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fa.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fa.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fa.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:8:{s:9:"Countries";a:237:{s:2:"AD";a:1:{i:0;s:12:"آندورا";}s:2:"AE";a:1:{i:0;s:37:"امارات متحده‌ی عربی";}s:2:"AF";a:1:{i:0;s:18:"اÙغانستان";}s:2:"AG";a:1:{i:0;s:32:"آنتیگوا Ùˆ باربودا";}s:2:"AI";a:1:{i:0;s:10:"آنگیل";}s:2:"AL";a:1:{i:0;s:12:"آلبانی";}s:2:"AM";a:1:{i:0;s:16:"ارمنستان";}s:2:"AN";a:1:{i:0;s:19:"آنتیل هلند";}s:2:"AO";a:1:{i:0;s:12:"آنگولا";}s:2:"AQ";a:1:{i:0;s:14:"جنوبگان";}s:2:"AR";a:1:{i:0;s:16:"آرژانتین";}s:2:"AS";a:1:{i:0;s:25:"ساموای امریکا";}s:2:"AT";a:1:{i:0;s:10:"اتریش";}s:2:"AU";a:1:{i:0;s:16:"استرالیا";}s:2:"AW";a:1:{i:0;s:10:"آروبا";}s:2:"AZ";a:1:{i:0;s:18:"آذربایجان";}s:2:"BA";a:1:{i:0;s:28:"بوسنی Ùˆ هرزگوین";}s:2:"BB";a:1:{i:0;s:16:"باربادوس";}s:2:"BD";a:1:{i:0;s:14:"بنگلادش";}s:2:"BE";a:1:{i:0;s:10:"بلژیک";}s:2:"BF";a:1:{i:0;s:22:"بورکیناÙاسو";}s:2:"BG";a:1:{i:0;s:18:"بلغارستان";}s:2:"BH";a:1:{i:0;s:10:"بحرین";}s:2:"BI";a:1:{i:0;s:14:"بوروندی";}s:2:"BJ";a:1:{i:0;s:8:"بنین";}s:2:"BM";a:1:{i:0;s:12:"برمودا";}s:2:"BN";a:1:{i:0;s:12:"برونئی";}s:2:"BO";a:1:{i:0;s:12:"بولیوی";}s:2:"BR";a:1:{i:0;s:10:"برزیل";}s:2:"BS";a:1:{i:0;s:12:"باهاما";}s:2:"BT";a:1:{i:0;s:10:"بوتان";}s:2:"BV";a:1:{i:0;s:24:"جزیره‌ی بووت";}s:2:"BW";a:1:{i:0;s:16:"بوتسوانا";}s:2:"BY";a:1:{i:0;s:16:"بیلوروسی";}s:2:"BZ";a:1:{i:0;s:8:"بلیز";}s:2:"CA";a:1:{i:0;s:12:"کانادا";}s:2:"CC";a:1:{i:0;s:21:"جزایر کوکوس";}s:2:"CD";a:1:{i:0;s:40:"جمهوری دموکراتیک Ú©Ù†Ú¯Ùˆ";}s:2:"CF";a:1:{i:0;s:38:"جمهوری اÙریقای مرکزی";}s:2:"CG";a:1:{i:0;s:10:"کونگو";}s:2:"CH";a:1:{i:0;s:10:"سوئیس";}s:2:"CI";a:1:{i:0;s:15:"ساحل عاج";}s:2:"CK";a:1:{i:0;s:17:"جزایر Ú©ÙˆÚ©";}s:2:"CL";a:1:{i:0;s:8:"شیلی";}s:2:"CM";a:1:{i:0;s:12:"کامرون";}s:2:"CN";a:1:{i:0;s:6:"چین";}s:2:"CO";a:1:{i:0;s:12:"کلمبیا";}s:2:
"CR";a:1:{i:0;s:18:"کاستاریکا";}s:2:"CU";a:1:{i:0;s:8:"کوبا";}s:2:"CV";a:1:{i:0;s:13:"کیپ ورد";}s:2:"CX";a:1:{i:0;s:28:"جزیره‌ی کریسمس";}s:2:"CY";a:1:{i:0;s:8:"قبرس";}s:2:"CZ";a:1:{i:0;s:17:"جمهوری Ú†Ú©";}s:2:"DE";a:1:{i:0;s:10:"آلمان";}s:2:"DJ";a:1:{i:0;s:12:"جیبوتی";}s:2:"DK";a:1:{i:0;s:14:"دانمارک";}s:2:"DM";a:1:{i:0;s:16:"دومینیکا";}s:2:"DO";a:1:{i:0;s:29:"جمهوری دومینیکن";}s:2:"DZ";a:1:{i:0;s:14:"الجزایر";}s:2:"EC";a:1:{i:0;s:12:"اکوادر";}s:2:"EE";a:1:{i:0;s:12:"استونی";}s:2:"EG";a:1:{i:0;s:6:"مصر";}s:2:"EH";a:1:{i:0;s:19:"صحرای غربی";}s:2:"ER";a:1:{i:0;s:12:"اریتره";}s:2:"ES";a:1:{i:0;s:14:"اسپانیا";}s:2:"ET";a:1:{i:0;s:12:"اتیوپی";}s:2:"FI";a:1:{i:0;s:12:"Ùنلاند";}s:2:"FJ";a:1:{i:0;s:8:"Ùیجی";}s:2:"FK";a:1:{i:0;s:25:"جزایر Ùالکلند";}s:2:"FM";a:1:{i:0;s:16:"میکرونزی";}s:2:"FO";a:1:{i:0;s:19:"جزایر Ùارو";}s:2:"FR";a:1:{i:0;s:12:"Ùرانسه";}s:2:"GA";a:1:{i:0;s:10:"گابون";}s:2:"GB";a:1:{i:0;s:16:"انگلستان";}s:2:"GD";a:1:{i:0;s:14:"گرانادا";}s:2:"GE";a:1:{i:0;s:14:"گرجستان";}s:2:"GF";a:1:{i:0;s:23:"گویان Ùرانسه";}s:2:"GH";a:1:{i:0;s:6:"غنا";}s:2:"GI";a:1:{i:0;s:18:"گیبرالتار";}s:2:"GL";a:1:{i:0;s:16:"گروئنلند";}s:2:"GM";a:1:{i:0;s:12:"گامبیا";}s:2:"GN";a:1:{i:0;s:8:"گینه";}s:2:"GP";a:1:{i:0;s:14:"گوادلوپ";}s:2:"GQ";a:1:{i:0;s:28:"گینه‌ی استوایی";}s:2:"GR";a:1:{i:0;s:10:"یونان";}s:2:"GS";a:1:{i:0;s:65:"جورجیای جنوبی Ùˆ جزایر ساندویچ جنوبی";}s:2:"GT";a:1:{i:0;s:16:"گواتمالا";}s:2:"GU";a:1:{i:0;s:8:"گوام";}s:2:"GW";a:1:{i:0;s:26:"گینه‌ی بیسائو";}s:2:"GY";a:1:{i:0;s:10:"گویان";}s:2:"HM";a:1:{i:0;s:56:"جزیره‌ی هرد Ùˆ جزایر مک‌دونالد";}s:2:"HN";a:1:{i:0;s:14:"هندوراس";}s:2:"HR";a:1:{i:0;s:12:"کرواسی";}s:2:"HT";a:1:{i:0;s:12:"هاییتی";}s:2:"HU";a:1:{i:
0;s:16:"مجارستان";}s:2:"ID";a:1:{i:0;s:14:"اندونزی";}s:2:"IE";a:1:{i:0;s:12:"ایرلند";}s:2:"IL";a:1:{i:0;s:14:"اسرائیل";}s:2:"IN";a:1:{i:0;s:6:"هند";}s:2:"IO";a:1:{i:0;s:67:"مستعمره‌های انگلستان در اقیانوس هند";}s:2:"IQ";a:1:{i:0;s:8:"عراق";}s:2:"IR";a:1:{i:0;s:10:"ایران";}s:2:"IS";a:1:{i:0;s:12:"ایسلند";}s:2:"IT";a:1:{i:0;s:14:"ایتالیا";}s:2:"JM";a:1:{i:0;s:16:"جامائیکا";}s:2:"JO";a:1:{i:0;s:8:"اردن";}s:2:"JP";a:1:{i:0;s:8:"ژاپن";}s:2:"KE";a:1:{i:0;s:8:"کنیا";}s:2:"KG";a:1:{i:0;s:18:"قرقیزستان";}s:2:"KH";a:1:{i:0;s:12:"کامبوج";}s:2:"KI";a:1:{i:0;s:16:"کیریباتی";}s:2:"KM";a:1:{i:0;s:12:"کومورو";}s:2:"KN";a:1:{i:0;s:27:"سنت کیتس Ùˆ نویس";}s:2:"KP";a:1:{i:0;s:22:"کره‌ی شمالی";}s:2:"KR";a:1:{i:0;s:22:"کره‌ی جنوبی";}s:2:"KW";a:1:{i:0;s:8:"کویت";}s:2:"KY";a:1:{i:0;s:21:"جزایر Ú©Ùیمن";}s:2:"KZ";a:1:{i:0;s:16:"قزاقستان";}s:2:"LA";a:1:{i:0;s:10:"لائوس";}s:2:"LB";a:1:{i:0;s:10:"لبنان";}s:2:"LC";a:1:{i:0;s:17:"سنت لوسیا";}s:2:"LI";a:1:{i:0;s:25:"لیختن‌اشتاین";}s:2:"LK";a:1:{i:0;s:19:"سری‌لانکا";}s:2:"LR";a:1:{i:0;s:12:"لیبریا";}s:2:"LS";a:1:{i:0;s:10:"لسوتو";}s:2:"LT";a:1:{i:0;s:14:"لیتوانی";}s:2:"LU";a:1:{i:0;s:20:"لوکزامبورگ";}s:2:"LV";a:1:{i:0;s:10:"لتونی";}s:2:"LY";a:1:{i:0;s:8:"لیبی";}s:2:"MA";a:1:{i:0;s:10:"مراکش";}s:2:"MC";a:1:{i:0;s:12:"موناکو";}s:2:"MD";a:1:{i:0;s:14:"مولدووا";}s:2:"MG";a:1:{i:0;s:20:"ماداگاسکار";}s:2:"MH";a:1:{i:0;s:23:"جزایر مارشال";}s:2:"MK";a:1:{i:0;s:14:"مقدونیه";}s:2:"ML";a:1:{i:0;s:8:"مالی";}s:2:"MM";a:1:{i:0;s:14:"میانمار";}s:2:"MN";a:1:{i:0;s:16:"مغولستان";}s:2:"MP";a:1:{i:0;s:38:"جزایر ماریانای شمالی";}s:2:"MQ";a:1:{i:0;s:16:"مارتینیک";}s:2:"MR";a:1:{i:0;s:16:"موریتانی";}s:2:"MS";a:1:{i:0;s:19:"مونت‌سرات";}s:2:"MT";a:1:{
i:0;s:8:"مالت";}s:2:"MU";a:1:{i:0;s:16:"موریتیوس";}s:2:"MV";a:1:{i:0;s:12:"مالدیو";}s:2:"MW";a:1:{i:0;s:12:"مالاوی";}s:2:"MX";a:1:{i:0;s:10:"مکزیک";}s:2:"MY";a:1:{i:0;s:10:"مالزی";}s:2:"MZ";a:1:{i:0;s:16:"موزامبیک";}s:2:"NA";a:1:{i:0;s:14:"نامیبیا";}s:2:"NC";a:1:{i:0;s:27:"کالدونیای جدید";}s:2:"NE";a:1:{i:0;s:8:"نیجر";}s:2:"NF";a:1:{i:0;s:30:"جزیره‌ی نورÙولک";}s:2:"NG";a:1:{i:0;s:12:"نیجریه";}s:2:"NI";a:1:{i:0;s:20:"نیکاراگوئه";}s:2:"NL";a:1:{i:0;s:8:"هلند";}s:2:"NO";a:1:{i:0;s:8:"نروژ";}s:2:"NP";a:1:{i:0;s:8:"نپال";}s:2:"NR";a:1:{i:0;s:12:"نائورو";}s:2:"NU";a:1:{i:0;s:10:"نیوئه";}s:2:"NZ";a:1:{i:0;s:15:"زلاند نو";}s:2:"OM";a:1:{i:0;s:8:"عمان";}s:2:"PA";a:1:{i:0;s:12:"پاناما";}s:2:"PE";a:1:{i:0;s:6:"پرو";}s:2:"PF";a:1:{i:0;s:28:"پلی‌نزی Ùرانسه";}s:2:"PG";a:1:{i:0;s:29:"پاپوا گینه‌ی نو";}s:2:"PH";a:1:{i:0;s:14:"Ùیلیپین";}s:2:"PK";a:1:{i:0;s:14:"پاکستان";}s:2:"PL";a:1:{i:0;s:12:"لهستان";}s:2:"PM";a:1:{i:0;s:29:"سنت پیر Ùˆ میکلون";}s:2:"PN";a:1:{i:0;s:16:"پیتکایرن";}s:2:"PR";a:1:{i:0;s:19:"پورتو ریکو";}s:2:"PT";a:1:{i:0;s:12:"پرتغال";}s:2:"PW";a:1:{i:0;s:12:"پالائو";}s:2:"PY";a:1:{i:0;s:16:"پاراگوئه";}s:2:"QA";a:1:{i:0;s:6:"قطر";}s:2:"RE";a:1:{i:0;s:14:"ریونیون";}s:2:"RO";a:1:{i:0;s:12:"رومانی";}s:2:"RU";a:1:{i:0;s:10:"روسیه";}s:2:"RW";a:1:{i:0;s:12:"رواندا";}s:2:"SA";a:1:{i:0;s:25:"عربستان سعودی";}s:2:"SB";a:1:{i:0;s:23:"جزایر سلیمان";}s:2:"SC";a:1:{i:0;s:8:"سیشل";}s:2:"SD";a:1:{i:0;s:10:"سودان";}s:2:"SE";a:1:{i:0;s:8:"سوئد";}s:2:"SG";a:1:{i:0;s:14:"سنگاپور";}s:2:"SH";a:1:{i:0;s:13:"سنت هلن";}s:2:"SI";a:1:{i:0;s:14:"اسلوونی";}s:2:"SJ";a:1:{i:0;s:37:"اسوالبارد Ùˆ جان ماین";}s:2:"SK";a:1:{i:0;s:14:"اسلواکی";}s:2:"SL";a:1:{i:0;s:16:"سیرالئون";}s:2:"SM";a:1:{i:0;s:19:"سان
 مارینو";}s:2:"SN";a:1:{i:0;s:10:"سنگال";}s:2:"SO";a:1:{i:0;s:12:"سومالی";}s:2:"SP";a:1:{i:0;s:14:"صربستان";}s:2:"SR";a:1:{i:0;s:14:"سورینام";}s:2:"ST";a:1:{i:0;s:37:"سائو تومه Ùˆ پرینسیپه";}s:2:"SV";a:1:{i:0;s:20:"السالوادور";}s:2:"SY";a:1:{i:0;s:10:"سوریه";}s:2:"SZ";a:1:{i:0;s:16:"سوازیلند";}s:2:"TC";a:1:{i:0;s:33:"جزایر ترک Ùˆ کایکوس";}s:2:"TD";a:1:{i:0;s:6:"چاد";}s:2:"TF";a:1:{i:0;s:47:"مستعمره‌های جنوبی Ùرانسه";}s:2:"TG";a:1:{i:0;s:8:"توگو";}s:2:"TH";a:1:{i:0;s:12:"تایلند";}s:2:"TJ";a:1:{i:0;s:18:"تاجیکستان";}s:2:"TK";a:1:{i:0;s:14:"توکلائو";}s:2:"TL";a:1:{i:0;s:19:"تیمور شرقی";}s:2:"TM";a:1:{i:0;s:18:"ترکمنستان";}s:2:"TN";a:1:{i:0;s:8:"تونس";}s:2:"TO";a:1:{i:0;s:10:"تونگا";}s:2:"TR";a:1:{i:0;s:10:"ترکیه";}s:2:"TT";a:1:{i:0;s:32:"ترینیداد Ùˆ توباگو";}s:2:"TV";a:1:{i:0;s:12:"تووالو";}s:2:"TW";a:1:{i:0;s:12:"تایوان";}s:2:"TZ";a:1:{i:0;s:16:"تانزانیا";}s:2:"UA";a:1:{i:0;s:14:"اوکراین";}s:2:"UG";a:1:{i:0;s:14:"اوگاندا";}s:2:"UM";a:1:{i:0;s:67:"جزایر Ú©ÙˆÚ†Ú© دوراÙتاده‌ی ایالات متحده";}s:2:"US";a:1:{i:0;s:41:"ایالات متحده‌ی امریکا";}s:2:"UY";a:1:{i:0;s:16:"اوروگوئه";}s:2:"UZ";a:1:{i:0;s:16:"ازبکستان";}s:2:"VA";a:1:{i:0;s:14:"واتیکان";}s:2:"VC";a:1:{i:0;s:37:"سنت وینسنت Ùˆ گرنادین";}s:2:"VE";a:1:{i:0;s:14:"ونزوئلا";}s:2:"VG";a:1:{i:0;s:40:"جزایر ویرجین انگلستان";}s:2:"VI";a:1:{i:0;s:47:"جزایر ویرجین ایالات متحده";}s:2:"VN";a:1:{i:0;s:12:"ویتنام";}s:2:"VU";a:1:{i:0;s:14:"وانواتو";}s:2:"WF";a:1:{i:0;s:28:"والیس Ùˆ Ùیوتونا";}s:2:"WS";a:1:{i:0;s:10:"ساموا";}s:2:"YE";a:1:{i:0;s:6:"یمن";}s:2:"YT";a:1:{i:0;s:10:"مایوت";}s:2:"YU";a:1:{i:0;s:16:"یوگسلاوی";}s:2:"ZA";a:1:{i:0;s:25:"اÙریقای جنوبی";}s:2:"ZM";a:1:{i:0;s:12:"ز
امبیا";}s:2:"ZW";a:1:{i:0;s:16:"زیمبابوه";}}s:10:"Currencies";a:2:{s:3:"AFA";a:2:{i:0;s:12:"اÙغانی";i:1;s:12:"اÙغانی";}s:3:"IRR";a:2:{i:0;s:3:"ï·¼";i:1;s:3:"IRR";}}s:9:"Languages";a:204:{s:2:"aa";a:1:{i:0;s:10:"Ø¢Ùاری";}s:2:"ab";a:1:{i:0;s:12:"آبخازی";}s:2:"ae";a:1:{i:0;s:14:"اوستایی";}s:2:"af";a:1:{i:0;s:16:"Ø¢Ùریکانس";}s:3:"afa";a:1:{i:0;s:39:"اÙریقا Ùˆ آسیایی (غیره)";}s:2:"am";a:1:{i:0;s:10:"امهری";}s:3:"ang";a:1:{i:0;s:58:"انگلیسی باستان (حدود Û´ÛµÛ°-Û±Û±Û°Û° Ù….)";}s:3:"apa";a:1:{i:0;s:34:"زبان‌های آپاچیایی";}s:2:"ar";a:1:{i:0;s:8:"عربی";}s:3:"arc";a:1:{i:0;s:10:"آرامی";}s:3:"art";a:1:{i:0;s:28:"ساخته‌گی (غیره)";}s:2:"as";a:1:{i:0;s:10:"آسامی";}s:3:"aus";a:1:{i:0;s:38:"زبان‌های استرالیایی";}s:2:"ay";a:1:{i:0;s:16:"آیمارایی";}s:2:"az";a:1:{i:0;s:20:"آذربایجانی";}s:2:"ba";a:1:{i:0;s:12:"باشکیر";}s:3:"bal";a:1:{i:0;s:10:"بلوچی";}s:3:"bat";a:1:{i:0;s:25:"بالتیکی (غیره)";}s:2:"be";a:1:{i:0;s:14:"بلوروسی";}s:2:"bg";a:1:{i:0;s:12:"بلغاری";}s:2:"bh";a:1:{i:0;s:12:"بیهاری";}s:3:"bho";a:1:{i:0;s:14:"بوجپوری";}s:2:"bi";a:1:{i:0;s:14:"بیسلاما";}s:2:"bn";a:1:{i:0;s:12:"بنگالی";}s:2:"bo";a:1:{i:0;s:8:"تبتی";}s:2:"bs";a:1:{i:0;s:16:"بوسنیایی";}s:2:"ca";a:1:{i:0;s:22:"کاتالونیایی";}s:3:"cai";a:1:{i:0;s:56:"سرخ‌پوستی امریکای مرکزی (غیره)";}s:2:"ce";a:1:{i:0;s:8:"Ú†Ú†Ù†ÛŒ";}s:3:"cel";a:1:{i:0;s:19:"سلتی (غیره)";}s:2:"ch";a:1:{i:0;s:16:"چامورویی";}s:3:"chr";a:1:{i:0;s:10:"چروکی";}s:3:"cop";a:1:{i:0;s:8:"قبطی";}s:2:"cs";a:1:{i:0;s:6:"Ú†Ú©ÛŒ";}s:2:"cu";a:1:{i:0;s:27:"اسلاوی کلیسایی";}s:2:"cv";a:1:{i:0;s:12:"چوواشی";}s:2:"cy";a:1:{i:0;s:10:"ویلزی";}s:2:"da";a:1:{i:0;s:16:"دانمارکی";}s:3:"dak";a:1:{i:0;s:16:"داکوتایی";}s:2:"de";a:1:{i:0;s:12:"آلمانی";}s:3:"dra";a:1:{i:0;s:25:"دراوید
ÛŒ (غیره)";}s:3:"dum";a:1:{i:0;s:54:"هلندی میانه (حدود Û±Û°ÛµÛ°-Û±Û³ÛµÛ° Ù….)";}s:2:"dz";a:1:{i:0;s:12:"بوتانی";}s:3:"egy";a:1:{i:0;s:25:"مصری (باستانی)";}s:2:"el";a:1:{i:0;s:12:"یونانی";}s:2:"en";a:1:{i:0;s:14:"انگلیسی";}s:3:"enm";a:1:{i:0;s:50:"انگلیسی میانه (Û±Û±Û°Û° -Û±ÛµÛ°Û° Ù….)";}s:2:"eo";a:1:{i:0;s:16:"اسپرانتو";}s:2:"es";a:1:{i:0;s:18:"اسپانیایی";}s:2:"et";a:1:{i:0;s:18:"استونیایی";}s:2:"eu";a:1:{i:0;s:10:"باسکی";}s:2:"fa";a:1:{i:0;s:10:"Ùارسی";}s:2:"fi";a:1:{i:0;s:14:"Ùنلاندی";}s:2:"fj";a:1:{i:0;s:14:"Ùیجیایی";}s:2:"fo";a:1:{i:0;s:12:"Ùارویی";}s:2:"fr";a:1:{i:0;s:14:"Ùرانسوی";}s:3:"frm";a:1:{i:0;s:58:"Ùرانسوی میانه (حدود Û±Û´Û°Û°-Û±Û¶Û°Û° Ù….)";}s:3:"fro";a:1:{i:0;s:54:"Ùرانسوی قدیم (Û¸Û´Û²-حدود Û±Û´Û°Û° Ù….)";}s:2:"ga";a:1:{i:0;s:14:"ایرلندی";}s:3:"gaa";a:1:{i:0;s:4:"گا";}s:3:"gem";a:1:{i:0;s:21:"ژرمنی (غیره)";}s:3:"gmh";a:1:{i:0;s:63:"آلمانی علیای میانه (حدود Û±Û°ÛµÛ°-Û±ÛµÛ°Û°)";}s:2:"gn";a:1:{i:0;s:14:"گوارانی";}s:3:"goh";a:1:{i:0;s:63:"آلمانی علیای باستان (حدود Û·ÛµÛ°-Û±Û°ÛµÛ°)";}s:3:"got";a:1:{i:0;s:10:"گوتیک";}s:3:"grc";a:1:{i:0;s:39:"یونانی کهن (تا Û±Û´ÛµÛ³ Ù….)";}s:2:"gu";a:1:{i:0;s:12:"گجراتی";}s:2:"gv";a:1:{i:0;s:8:"مانی";}s:2:"ha";a:1:{i:0;s:14:"هوسیایی";}s:3:"haw";a:1:{i:0;s:18:"هاوائیایی";}s:2:"he";a:1:{i:0;s:8:"عبری";}s:2:"hi";a:1:{i:0;s:8:"هندی";}s:3:"hit";a:1:{i:0;s:8:"هیتی";}s:2:"hr";a:1:{i:0;s:12:"کرواتی";}s:2:"hu";a:1:{i:0;s:10:"مجاری";}s:2:"hy";a:1:{i:0;s:10:"ارمنی";}s:2:"hz";a:1:{i:0;s:14:"هریرویی";}s:2:"ia";a:1:{i:0;s:19:"میان‌زبان";}s:2:"id";a:1:{i:0;s:20:"اندونزیایی";}s:2:"ik";a:1:{i:0;s:14:"اینوپیک";}s:3:"inc";a:1:{i:0;s:21:"هندیک (غیره)";}s:3:"ine";a:1:{i:0;s:24:"هندوارودپایی";}s:3:"ira";a:1:{i:0;s:12:"ایرانی";}s:2:"is";a:1:{i:0;s:14
:"ایسلندی";}s:2:"it";a:1:{i:0;s:18:"ایتالیایی";}s:2:"iu";a:1:{i:0;s:18:"اینوکیتوت";}s:2:"ja";a:1:{i:0;s:10:"ژاپنی";}s:3:"jpr";a:1:{i:0;s:21:"Ùارسی یهودی";}s:3:"jrb";a:1:{i:0;s:19:"عربی یهودی";}s:2:"jv";a:1:{i:0;s:15:"جاوه‌ای";}s:2:"ka";a:1:{i:0;s:8:"گرجی";}s:2:"kk";a:1:{i:0;s:10:"قزاقی";}s:2:"km";a:1:{i:0;s:8:"خمری";}s:2:"kn";a:1:{i:0;s:19:"کاناده‌ای";}s:2:"ko";a:1:{i:0;s:13:"کره‌ای";}s:3:"kok";a:1:{i:0;s:12:"کنکانی";}s:2:"ks";a:1:{i:0;s:12:"کشمیری";}s:2:"ku";a:1:{i:0;s:8:"کردی";}s:2:"kv";a:1:{i:0;s:14:"کومیایی";}s:2:"kw";a:1:{i:0;s:14:"کرنوالی";}s:2:"ky";a:1:{i:0;s:12:"قرقیزی";}s:2:"la";a:1:{i:0;s:12:"لاتینی";}s:2:"lb";a:1:{i:0;s:23:"لتسه‌بورگیش";}s:2:"ln";a:1:{i:0;s:14:"لینگالا";}s:2:"lo";a:1:{i:0;s:12:"لائوسی";}s:2:"lt";a:1:{i:0;s:20:"لیتوانیایی";}s:2:"lv";a:1:{i:0;s:16:"لتونیایی";}s:3:"map";a:1:{i:0;s:24:"آسترونیزیایی";}s:2:"mg";a:1:{i:0;s:22:"مالاگاسیایی";}s:3:"mga";a:1:{i:0;s:47:"ایرلندی میانه (Û¹Û°Û°-Û±Û²Û°Û° Ù….)";}s:2:"mh";a:1:{i:0;s:14:"مارشالی";}s:2:"mi";a:1:{i:0;s:18:"مائوریایی";}s:3:"mis";a:1:{i:0;s:30:"زبان‌های متÙرقه";}s:2:"mk";a:1:{i:0;s:12:"مقدونی";}s:2:"ml";a:1:{i:0;s:20:"مالایالامی";}s:2:"mn";a:1:{i:0;s:10:"مغولی";}s:2:"mo";a:1:{i:0;s:20:"مولداویایی";}s:3:"moh";a:1:{i:0;s:12:"موهاکی";}s:2:"mr";a:1:{i:0;s:10:"مراتی";}s:2:"ms";a:1:{i:0;s:16:"مالزیایی";}s:2:"mt";a:1:{i:0;s:10:"مالتی";}s:3:"mul";a:1:{i:0;s:19:"چندین زبان";}s:2:"my";a:1:{i:0;s:15:"برمه‌ای";}s:3:"myn";a:1:{i:0;s:14:"مایاییک";}s:2:"na";a:1:{i:0;s:16:"نائورویی";}s:3:"nai";a:1:{i:0;s:56:"سرخ‌پوستی امریکای شمالی (غیره)";}s:2:"nb";a:1:{i:0;s:25:"بوکسمال نروژی";}s:2:"nd";a:1:{i:0;s:35:"انده‌بله‌ای شمالی";}s:3:"nds";a:1:{i:0;s:45:"آلمانی سÙلی؛ ساکسون
 سÙلب";}s:2:"ne";a:1:{i:0;s:10:"نپالی";}s:2:"nl";a:1:{i:0;s:10:"هلندی";}s:2:"nn";a:1:{i:0;s:25:"نینورسک نروژی";}s:2:"no";a:1:{i:0;s:10:"نروژی";}s:2:"nr";a:1:{i:0;s:35:"انده‌بله‌ای جنوبی";}s:2:"nv";a:1:{i:0;s:16:"ناواهویی";}s:2:"or";a:1:{i:0;s:17:"اوریه‌ای";}s:3:"ota";a:1:{i:0;s:42:"ترکی (امپراتوری عثمانی)";}s:2:"pa";a:1:{i:0;s:12:"پنجابی";}s:3:"paa";a:1:{i:0;s:25:"پاپوایی (غیره)";}s:3:"pal";a:1:{i:0;s:10:"پهلوی";}s:3:"peo";a:1:{i:0;s:51:"Ùارسی قدیم (حدود Û¶Û°Û°-Û´Û°Û° Ù‚.Ù….)";}s:3:"phi";a:1:{i:0;s:27:"Ùیایپینی (غیره)";}s:3:"phn";a:1:{i:0;s:10:"Ùنیقی";}s:2:"pi";a:1:{i:0;s:8:"پالی";}s:2:"pl";a:1:{i:0;s:14:"لهستانی";}s:2:"ps";a:1:{i:0;s:8:"پشتو";}s:2:"pt";a:1:{i:0;s:14:"پرتغالی";}s:2:"qu";a:1:{i:0;s:12:"کچوایی";}s:2:"ro";a:1:{i:0;s:18:"رومانیایی";}s:4:"root";a:1:{i:0;s:8:"ریشه";}s:2:"ru";a:1:{i:0;s:8:"روسی";}s:2:"rw";a:1:{i:0;s:26:"کینیارواندایی";}s:2:"sa";a:1:{i:0;s:14:"سنسکریت";}s:3:"sai";a:1:{i:0;s:56:"سرخ‌پوستی امریکای جنوبی (غیره)";}s:2:"sc";a:1:{i:0;s:20:"ساردینیایی";}s:3:"sco";a:1:{i:0;s:18:"اسکاتلندی";}s:2:"sd";a:1:{i:0;s:8:"سندی";}s:3:"sem";a:1:{i:0;s:8:"سامی";}s:2:"sg";a:1:{i:0;s:14:"سانگویی";}s:3:"sga";a:1:{i:0;s:45:"ایرلندی باستان (تا Û¹Û°Û° Ù….)";}s:3:"sgn";a:1:{i:0;s:35:"زبان‌های نشانه‌ای";}s:2:"sh";a:1:{i:0;s:22:"صرب Ùˆ کرواتی";}s:2:"si";a:1:{i:0;s:14:"سینهالی";}s:3:"sit";a:1:{i:0;s:29:"چین Ùˆ تبتی (غیره)";}s:2:"sk";a:1:{i:0;s:14:"اسلواکی";}s:2:"sl";a:1:{i:0;s:22:"اسلووینیایی";}s:2:"sm";a:1:{i:0;s:14:"ساموآیی";}s:2:"sn";a:1:{i:0;s:12:"شونایی";}s:2:"so";a:1:{i:0;s:18:"سومالیایی";}s:2:"sq";a:1:{i:0;s:18:"آلبانیایی";}s:2:"sr";a:1:{i:0;s:8:"صربی";}s:2:"st";a:1:{i:0;s:23:"سوتویی جنوبی";}s:2:"su";a:1:{i:0;s:14:"سوندایی";
}s:3:"sux";a:1:{i:0;s:10:"سومری";}s:2:"sv";a:1:{i:0;s:10:"سوئدی";}s:2:"sw";a:1:{i:0;s:12:"سواحلی";}s:3:"syr";a:1:{i:0;s:12:"سریانی";}s:2:"ta";a:1:{i:0;s:12:"تامیلی";}s:2:"te";a:1:{i:0;s:14:"تلوگویی";}s:2:"tg";a:1:{i:0;s:12:"تاجیکی";}s:2:"th";a:1:{i:0;s:14:"تایلندی";}s:2:"ti";a:1:{i:0;s:20:"تیگرینیایی";}s:2:"tk";a:1:{i:0;s:12:"ترکمتی";}s:2:"tl";a:1:{i:0;s:16:"تاگالوگی";}s:2:"tn";a:1:{i:0;s:16:"تسوانایی";}s:2:"to";a:1:{i:0;s:38:"تونگایی (جزایر تونگا)";}s:2:"tr";a:1:{i:0;s:8:"ترکی";}s:2:"ts";a:1:{i:0;s:16:"تسونگایی";}s:2:"tt";a:1:{i:0;s:12:"تاتاری";}s:2:"tw";a:1:{i:0;s:17:"توی‌یایی";}s:2:"ty";a:1:{i:0;s:18:"تاهیتیایی";}s:2:"ug";a:1:{i:0;s:14:"اویغوری";}s:2:"uk";a:1:{i:0;s:16:"اوکراینی";}s:3:"und";a:1:{i:0;s:12:"نامشخص";}s:2:"ur";a:1:{i:0;s:8:"اردو";}s:2:"uz";a:1:{i:0;s:10:"ازبکی";}s:2:"vi";a:1:{i:0;s:14:"ویتنامی";}s:2:"vo";a:1:{i:0;s:12:"ولاپوک";}s:2:"wo";a:1:{i:0;s:10:"ولوÙÛŒ";}s:2:"xh";a:1:{i:0;s:12:"خوسایی";}s:2:"yi";a:1:{i:0;s:6:"یدی";}s:2:"yo";a:1:{i:0;s:16:"یوروبایی";}s:2:"zh";a:1:{i:0;s:8:"چینی";}s:2:"zu";a:1:{i:0;s:12:"زولویی";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Arab";}s:7:"Scripts";a:35:{s:4:"Arab";a:1:{i:0;s:8:"عربی";}s:4:"Armn";a:1:{i:0;s:10:"ارمنی";}s:4:"Beng";a:1:{i:0;s:12:"بنگالی";}s:4:"Bopo";a:1:{i:0;s:16:"بوپوموÙÙˆ";}s:4:"Cher";a:1:{i:0;s:16:"چروکیایی";}s:4:"Copt";a:1:{i:0;s:8:"قبطی";}s:4:"Cyrl";a:1:{i:0;s:12:"سیریلی";}s:4:"Deva";a:1:{i:0;s:14:"دوناگری";}s:4:"Ethi";a:1:{i:0;s:18:"اتیوپیایی";}s:4:"Geor";a:1:{i:0;s:8:"گرجی";}s:4:"Goth";a:1:{i:0;s:10:"گوتیک";}s:4:"Grek";a:1:{i:0;s:12:"یونانی";}s:4:"Gujr";a:1:{i:0;s:12:"گجراتی";}s:4:"Hang";a:1:{i:0;s:12:"هانگول";}s:4:"Hani";a:1:{i:0;s:6:"هان";}s:4:"Hebr";a:1:{i:0;s:8:"عبری";}s:4:"Hira";a:1:{i:0;s:16:"هیراگانا";}s:4:"Kana";a:1:{i:0;s:16:"کاتاکانا";
}s:4:"Khmr";a:1:{i:0;s:8:"خمری";}s:4:"Knda";a:1:{i:0;s:19:"کاناده‌ای";}s:4:"Laoo";a:1:{i:0;s:12:"لائوسی";}s:4:"Latn";a:1:{i:0;s:10:"لاتین";}s:4:"Mlym";a:1:{i:0;s:20:"مالایالامی";}s:4:"Mong";a:1:{i:0;s:10:"مغولی";}s:4:"Mymr";a:1:{i:0;s:14:"میانمار";}s:4:"Orya";a:1:{i:0;s:17:"اوریه‌ای";}s:4:"Qaai";a:1:{i:0;s:12:"موروثی";}s:4:"Runr";a:1:{i:0;s:8:"رونی";}s:4:"Syrc";a:1:{i:0;s:10:"آسوری";}s:4:"Taml";a:1:{i:0;s:10:"تامیل";}s:4:"Telu";a:1:{i:0;s:14:"تلوگویی";}s:4:"Thai";a:1:{i:0;s:14:"تایلندی";}s:4:"Tibt";a:1:{i:0;s:8:"تبتی";}s:4:"Yiii";a:1:{i:0;s:4:"یی";}s:4:"Zyyy";a:1:{i:0;s:10:"مشترک";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:11:"AmPmMarkers";a:2:{i:0;s:6:"Ù‚.ظ.";i:1;s:6:"ب.ظ.";}s:16:"DateTimePatterns";a:9:{i:0;s:12:"HH:mm:ss (z)";i:1;s:12:"HH:mm:ss (z)";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:18:"EEEEØŒ d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:9:"yyyy/MM/d";i:7;s:9:"yyyy/MM/d";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:3:"ÛŒ.";i:1;s:3:"د.";i:2;s:3:"س.";i:3;s:3:"Ú†.";i:4;s:3:"Ù¾.";i:5;s:3:"ج.";i:6;s:3:"Ø´.";}s:4:"wide";a:7:{i:0;s:15:"یک‌شنبه";i:1;s:12:"دوشنبه";i:2;s:15:"سه‌شنبه";i:3;s:16:"چهارشنبه";i:4;s:17:"پنج‌شنبه";i:5;s:8:"جمعه";i:6;s:8:"شنبه";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:6:"Ù‚.Ù….";i:1;s:3:"Ù….";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:6:"ژان";i:1;s:6:"Ùور";i:2;s:6:"مار";i:3;s:6:"آور";i:4;s:6:"مـه";i:5;s:6:"ژون";i:6;s:6:"Ú˜ÙˆÛŒ";i:7;s:6:"اوت";i:8;s:6:"سپت";i:9;s:6:"اکت";i:10;s:6:"نوا";i:11;s:6:"دسا";}s:4:"wide";a:12:{i:0;s:12:"ژانویه";i:1;s:10:"Ùوریه";i:2;s:8:"مارس";i:3;s:10:"آوریل";i:4;s:4:"مه";i:5;s:8:"ژوئن";i:6;s:10:"ژوئیه";i:7;s:6:"اوت";i:8;s:14:"سپتامبر";i:9;s:10:"اکتبر";i:10;s:12:"نوامبر";i:11;s:12:"دسامبر";}}}}}s:11:"zoneStrings";a
:1:{i:0;a:6:{i:0;s:11:"Asia/Tehran";i:1;s:36:"وقت استاندارد تهران";i:2;s:4:"IRST";i:3;s:34:"وقت تابستانی تهران";i:4;s:4:"IRDT";i:5;s:10:"تهران";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fa_AF.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fa_AF.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fa_AF.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:97:{s:2:"AD";a:1:{i:0;s:12:"اندورا";}s:2:"AE";a:1:{i:0;s:34:"امارات متحدهٔ عربی";}s:2:"AG";a:1:{i:0;s:32:"انتیگوا Ùˆ باربودا";}s:2:"AL";a:1:{i:0;s:14:"البانیا";}s:2:"AO";a:1:{i:0;s:12:"انگولا";}s:2:"AR";a:1:{i:0;s:16:"ارجنتاین";}s:2:"AU";a:1:{i:0;s:16:"آسترالیا";}s:2:"BA";a:1:{i:0;s:37:"بوسنیا Ùˆ هرزه‌گوینا";}s:2:"BD";a:1:{i:0;s:19:"بنگله‌دیش";}s:2:"BE";a:1:{i:0;s:10:"بلجیم";}s:2:"BG";a:1:{i:0;s:14:"بلغاریا";}s:2:"BN";a:1:{i:0;s:10:"برونی";}s:2:"BO";a:1:{i:0;s:14:"بولیویا";}s:2:"BR";a:1:{i:0;s:12:"برازیل";}s:2:"BS";a:1:{i:0;s:12:"بهاماس";}s:2:"BY";a:1:{i:0;s:21:"روسیهٔ سÙید";}s:2:"CD";a:1:{i:0;s:42:"جمهوری دموکراتیک کانگو";}s:2:"CF";a:1:{i:0;s:25:"اÙریقای مرکزی";}s:2:"CG";a:1:{i:0;s:10:"کانگو";}s:2:"CH";a:1:{i:0;s:8:"سویس";}s:2:"CL";a:1:{i:0;s:6:"Ú†Ù„ÛŒ";}s:2:"CO";a:1:{i:0;s:14:"کولمبیا";}s:2:"CR";a:1:{i:0;s:16:"کاستریکا";}s:2:"CU";a:1:{i:0;s:10:"کیوبا";}s:2:"DK";a:1:{i:0;s:12:"دنمارک";}s:2:"EC";a:1:{i:0;s:14:"اکوادور";}s:2:"EE";a:1:{i:0;s:14:"استونیا";}s:2:"ER";a:1:{i:0;s:14:"اریتریا";}s:2:"ES";a:1:{i:0;s:14:"هسپانیه";}s:2:"ET";a:1:{i:0;s:14:"ایتوپیا";}s:2:"FI";a:1:{i:0;s:10:"Ùنلند";}s:2:"FM";a:1:{i:0;s:18:"میکرونزیا";}s:2:"GD";a:1:{i:0;s:14:"گرینادا";}s:2:"GN";a:1:{i:0;s:10:"گینیا";}s:2:"GQ";a:1:{i:0;s:25:"گینیا استوایی";}s:2:"GT";a:1:{i:0;s:18:"گواتیمالا";}s:2:"GW";a:1:{i:0;s:23:"گینیا بیسائو";}s:2:"GY";a:1:{i:0;s:10:"گیانا";}s:2:"HN";a:1:{i:0;s:16:"هاندوراس";}s:2:"HR";a:1:{i:0;s:12:"کروشیا";}s:2:"HT";a:1:{i:0;s:10:"هایتی";}s:2:"ID";a:1:{i:0;s:18:"اندونیزیا";}s:2:"IE";a:1:{i:0;s:12:"آیرلند";}s:2:"IS";a:1:{i:0;s:12:"آیسلند";}s:2:"JP";a:1:{i:0;s:10:"جاپان";}s:2:"KE";a:1:{i:0;s:10:"کینیا";}s:2:"KG";a:1:{i:0;s:16:"قرغزستان";}s:2:"KH";a:
1:{i:0;s:14:"کمپوچیا";}s:2:"KM";a:1:{i:0;s:10:"کومور";}s:2:"KN";a:1:{i:0;s:29:"سنت کیتس و نیویس";}s:2:"KP";a:1:{i:0;s:23:"کوریای شمالی";}s:2:"KR";a:1:{i:0;s:23:"کوریای جنوبی";}s:2:"LK";a:1:{i:0;s:16:"سریلانکا";}s:2:"LS";a:1:{i:0;s:12:"لیسوتو";}s:2:"LT";a:1:{i:0;s:14:"لتوانیا";}s:2:"LV";a:1:{i:0;s:12:"لاتویا";}s:2:"LY";a:1:{i:0;s:10:"لیبیا";}s:2:"MG";a:1:{i:0;s:16:"مادغاسکر";}s:2:"MN";a:1:{i:0;s:14:"منگولیا";}s:2:"MR";a:1:{i:0;s:18:"موریتانیا";}s:2:"MT";a:1:{i:0;s:10:"مالتا";}s:2:"MX";a:1:{i:0;s:12:"مکسیکو";}s:2:"MY";a:1:{i:0;s:14:"مالیزیا";}s:2:"MZ";a:1:{i:0;s:14:"موزمبیق";}s:2:"NG";a:1:{i:0;s:12:"نیجریا";}s:2:"NI";a:1:{i:0;s:18:"نیکاراگوا";}s:2:"NL";a:1:{i:0;s:10:"هالند";}s:2:"NO";a:1:{i:0;s:10:"ناروی";}s:2:"NP";a:1:{i:0;s:10:"نیپال";}s:2:"NZ";a:1:{i:0;s:21:"زیلاند جدید";}s:2:"PA";a:1:{i:0;s:12:"پانامه";}s:2:"PE";a:1:{i:0;s:8:"پیرو";}s:2:"PG";a:1:{i:0;s:28:"پاپوا نیو گینیا";}s:2:"PL";a:1:{i:0;s:10:"پولند";}s:2:"PT";a:1:{i:0;s:12:"پرتگال";}s:2:"PY";a:1:{i:0;s:16:"پاراگوای";}s:2:"RO";a:1:{i:0;s:14:"رومانیا";}s:2:"RW";a:1:{i:0;s:12:"روآندا";}s:2:"SB";a:1:{i:0;s:23:"جزایر سلومون";}s:2:"SE";a:1:{i:0;s:10:"سویدن";}s:2:"SG";a:1:{i:0;s:16:"سینگاپور";}s:2:"SI";a:1:{i:0;s:12:"سلونیا";}s:2:"SK";a:1:{i:0;s:14:"سلواکیا";}s:2:"SL";a:1:{i:0;s:16:"سیرالیون";}s:2:"SN";a:1:{i:0;s:14:"سینیگال";}s:2:"SO";a:1:{i:0;s:14:"سومالیه";}s:2:"ST";a:1:{i:0;s:35:"سائو تومه و پرینسیپ";}s:2:"SV";a:1:{i:0;s:18:"السلوادور";}s:2:"TJ";a:1:{i:0;s:16:"تاجکستان";}s:2:"UA";a:1:{i:0;s:12:"اکراین";}s:2:"US";a:1:{i:0;s:38:"ایالات متحدهٔ امریکا";}s:2:"UY";a:1:{i:0;s:16:"یوروگوای";}s:2:"VC";a:1:{i:0;s:39:"سنت وینسنت و گرینادین";}s:2:"VE";a:1:{i:0;s:14:"ونزویلا";}s:2:"WS";a:1:{i:0;s:21:"سام
وآی غربی";}s:2:"YU";a:1:{i:0;s:20:"یوگوسلاویا";}s:2:"ZW";a:1:{i:0;s:16:"زیمبابوی";}}s:9:"Languages";a:19:{s:2:"es";a:1:{i:0;s:14:"هسپانوی";}s:2:"fa";a:1:{i:0;s:6:"دری";}s:2:"fi";a:1:{i:0;s:12:"Ùنلندی";}s:2:"ga";a:1:{i:0;s:14:"آیرلندی";}s:2:"hr";a:1:{i:0;s:16:"کروشیایی";}s:2:"id";a:1:{i:0;s:22:"اندونیزیایی";}s:2:"is";a:1:{i:0;s:14:"آیسلندی";}s:2:"it";a:1:{i:0;s:14:"ایتالوی";}s:2:"ja";a:1:{i:0;s:12:"جاپانی";}s:2:"ko";a:1:{i:0;s:14:"کوریایی";}s:2:"ky";a:1:{i:0;s:10:"قرغزی";}s:2:"mn";a:1:{i:0;s:8:"مغلی";}s:2:"ne";a:1:{i:0;s:12:"نیپالی";}s:2:"nl";a:1:{i:0;s:12:"هالندی";}s:2:"no";a:1:{i:0;s:14:"نارویژی";}s:2:"pl";a:1:{i:0;s:12:"پولندی";}s:2:"pt";a:1:{i:0;s:14:"پرتگالی";}s:2:"sv";a:1:{i:0;s:12:"سویدنی";}s:2:"tg";a:1:{i:0;s:10:"تاجکی";}}s:14:"NumberElements";a:12:{i:0;s:2:"Ù«";i:1;s:2:"Ù¬";i:2;s:1:";";i:3;s:2:"Ùª";i:4;s:2:"Û°";i:5;s:1:"#";i:6;s:3:"−";i:7;s:7:"×۱۰^";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:18:"#,##0 ¤;-#,##0 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:7;i:1;i:1;}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:6:"جنو";i:1;s:6:"Ùبر";i:2;s:6:"مار";i:3;s:6:"اپر";i:4;s:6:"مـی";i:5;s:6:"جون";i:6;s:6:"جول";i:7;s:6:"اگس";i:8;s:6:"سپت";i:9;s:6:"اکت";i:10;s:6:"نوم";i:11;s:6:"دسم";}s:4:"wide";a:12:{i:0;s:10:"جنوری";i:1;s:12:"Ùبروری";i:2;s:8:"مارچ";i:3;s:10:"اپریل";i:4;s:4:"Ù…ÛŒ";i:5;s:6:"جون";i:6;s:10:"جولای";i:7;s:8:"اگست";i:8;s:12:"سپتمبر";i:9;s:12:"اکتوبر";i:10;s:10:"نومبر";i:11;s:10:"دسمبر";}}}}}s:11:"zoneStrings";a:1:{i:0;a:6:{i:0;s:10:"Asia/Kabul";i:1;s:25:"وقت اÙغانستان";i:2;s:3:"AFT";i:3;s:25:"وقت اÙغانستان";i:4;s:3:"AFT";i:5;s:8:"Ú©Ø
§Ø¨Ù„";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fa_IR.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fa_IR.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fa_IR.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:14:"NumberElements";a:12:{i:0;s:2:"٫";i:1;s:2:"٬";i:2;s:1:";";i:3;s:2:"٪";i:4;s:2:"۰";i:5;s:1:"#";i:6;s:1:"-";i:7;s:7:"×۱۰^";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:22:"#,##0.###;−#,##0.###";i:1;s:20:"#,##0 ¤;−#,##0 ¤";i:2;s:6:"%#,##0";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:7;i:1;i:1;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fi.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fi.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fi.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:12:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:17:"Arabiemiirikunnat";}s:2:"AF";a:1:{i:0;s:10:"Afganistan";}s:2:"AG";a:1:{i:0;s:18:"Antigua ja Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:7:"Albania";}s:2:"AM";a:1:{i:0;s:7:"Armenia";}s:2:"AN";a:1:{i:0;s:21:"Alankomaiden Antillit";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:9:"Antarktis";}s:2:"AR";a:1:{i:0;s:10:"Argentiina";}s:2:"AS";a:1:{i:0;s:14:"Amerikan Samoa";}s:2:"AT";a:1:{i:0;s:9:"Itävalta";}s:2:"AU";a:1:{i:0;s:9:"Australia";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:11:"Azerbaidzan";}s:2:"BA";a:1:{i:0;s:22:"Bosnia ja Hertsegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BE";a:1:{i:0;s:6:"Belgia";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:8:"Bulgaria";}s:2:"BH";a:1:{i:0;s:7:"Bahrain";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:6:"Brunei";}s:2:"BO";a:1:{i:0;s:7:"Bolivia";}s:2:"BR";a:1:{i:0;s:8:"Brasilia";}s:2:"BS";a:1:{i:0;s:6:"Bahama";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BV";a:1:{i:0;s:15:"Bouvet’nsaari";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:14:"Valko-Venäjä";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:12:"Kookossaaret";}s:2:"CD";a:1:{i:0;s:31:"Kongon demokraattinen tasavalta";}s:2:"CF";a:1:{i:0;s:23:"Keski-Afrikan tasavalta";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:7:"Sveitsi";}s:2:"CI";a:1:{i:0;s:17:"Norsunluurannikko";}s:2:"CK";a:1:{i:0;s:12:"Cookinsaaret";}s:2:"CL";a:1:{i:0;s:5:"Chile";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:5:"Kiina";}s:2:"CO";a:1:{i:0;s:8:"Kolumbia";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:5:"Kuuba";}s:2:"CV";a:1:{i:0;s:9:"Kap Verde";}s:2:"CX";a:1:{i:0;s:10:"Joulusaari";}s:2:"CY";a:1:{i:0;s:6:"Kypros";}s:2:"CZ";a:1:{i:0;s:16:"Tsekin tasavalta";}s:2:"DE";a:1:{i:0;s:5:"Saksa";}s:2:"DJ";a:1:{i:0;s:8:"Djibouti";}s:2:"DK";a:1:{i:0;s:6:"Ta
nska";}s:2:"DM";a:1:{i:0;s:8:"Dominica";}s:2:"DO";a:1:{i:0;s:24:"Dominikaaninen tasavalta";}s:2:"DZ";a:1:{i:0;s:7:"Algeria";}s:2:"EC";a:1:{i:0;s:7:"Ecuador";}s:2:"EE";a:1:{i:0;s:4:"Viro";}s:2:"EG";a:1:{i:0;s:6:"Egypti";}s:2:"EH";a:1:{i:0;s:13:"Länsi-Sahara";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:7:"Espanja";}s:2:"ET";a:1:{i:0;s:7:"Etiopia";}s:2:"FI";a:1:{i:0;s:5:"Suomi";}s:2:"FJ";a:1:{i:0;s:5:"Fidzi";}s:2:"FK";a:1:{i:0;s:16:"Falklandinsaaret";}s:2:"FM";a:1:{i:0;s:10:"Mikronesia";}s:2:"FO";a:1:{i:0;s:10:"Färsaaret";}s:2:"FR";a:1:{i:0;s:6:"Ranska";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:13:"Iso-Britannia";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:7:"Georgia";}s:2:"GF";a:1:{i:0;s:15:"Ranskan Guayana";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:10:"Grönlanti";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:23:"Päiväntasaajan Guinea";}s:2:"GR";a:1:{i:0;s:7:"Kreikka";}s:2:"GS";a:1:{i:0;s:43:"Etelä-Georgia ja Eteläiset Sandwichsaaret";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinea-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:30:"Hongkongin erityishallintoalue";}s:2:"HM";a:1:{i:0;s:25:"Heard ja McDonaldinsaaret";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:7:"Kroatia";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:6:"Unkari";}s:2:"ID";a:1:{i:0;s:9:"Indonesia";}s:2:"IE";a:1:{i:0;s:7:"Irlanti";}s:2:"IL";a:1:{i:0;s:6:"Israel";}s:2:"IN";a:1:{i:0;s:5:"Intia";}s:2:"IO";a:1:{i:0;s:36:"Brittiläinen Intian valtameren alue";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:7:"Islanti";}s:2:"IT";a:1:{i:0;s:6:"Italia";}s:2:"JM";a:1:{i:0;s:7:"Jamaika";}s:2:"JO";a:1:{i:0;s:8:"Jordania";}s:2:"JP";a:1:{i:0;s:6:"Japani";}s:2:"KE";a:1:{i:0;s:5:"Kenia";}s:2:"KG";a:1:{i:0;s:8:"Kirgisia";}s:2:"KH";a:1:{i:0;s:8:"Kambodza";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i
:0;s:7:"Komorit";}s:2:"KN";a:1:{i:0;s:20:"Saint Kitts ja Nevis";}s:2:"KP";a:1:{i:0;s:13:"Pohjois-Korea";}s:2:"KR";a:1:{i:0;s:16:"Korean tasavalta";}s:2:"KW";a:1:{i:0;s:6:"Kuwait";}s:2:"KY";a:1:{i:0;s:12:"Caymansaaret";}s:2:"KZ";a:1:{i:0;s:9:"Kazakstan";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:7:"Libanon";}s:2:"LC";a:1:{i:0;s:11:"Saint Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberia";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:7:"Liettua";}s:2:"LU";a:1:{i:0;s:9:"Luxemburg";}s:2:"LV";a:1:{i:0;s:6:"Latvia";}s:2:"LY";a:1:{i:0;s:5:"Libya";}s:2:"MA";a:1:{i:0;s:7:"Marokko";}s:2:"MC";a:1:{i:0;s:6:"Monaco";}s:2:"MD";a:1:{i:0;s:7:"Moldova";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:16:"Marshallinsaaret";}s:2:"MK";a:1:{i:0;s:9:"Makedonia";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:8:"Mongolia";}s:2:"MO";a:1:{i:0;s:26:"Macaon erityishallintoalue";}s:2:"MP";a:1:{i:0;s:17:"Pohjois-Mariaanit";}s:2:"MQ";a:1:{i:0;s:10:"Martinique";}s:2:"MR";a:1:{i:0;s:10:"Mauritania";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:10:"Malediivit";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:7:"Meksiko";}s:2:"MY";a:1:{i:0;s:7:"Malesia";}s:2:"MZ";a:1:{i:0;s:8:"Mosambik";}s:2:"NA";a:1:{i:0;s:7:"Namibia";}s:2:"NC";a:1:{i:0;s:14:"Uusi-Kaledonia";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:14:"Norfolkinsaari";}s:2:"NG";a:1:{i:0;s:7:"Nigeria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:10:"Alankomaat";}s:2:"NO";a:1:{i:0;s:5:"Norja";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:13:"Uusi-Seelanti";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:17:"Ranskan Polynesia";}s:2:"PG";a:1:{i:0;s:17:"Papua-Uusi-Guinea";}s:2:"PH";a:1:{i:0;s:11:"Filippiinit";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:
2:"PL";a:1:{i:0;s:5:"Puola";}s:2:"PM";a:1:{i:0;s:24:"Saint-Pierre ja Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:11:"Puerto Rico";}s:2:"PS";a:1:{i:0;s:10:"Palestiina";}s:2:"PT";a:1:{i:0;s:9:"Portugali";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Qatar";}s:2:"RE";a:1:{i:0;s:8:"Réunion";}s:2:"RO";a:1:{i:0;s:7:"Romania";}s:2:"RU";a:1:{i:0;s:8:"Venäjä";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SA";a:1:{i:0;s:12:"Saudi-Arabia";}s:2:"SB";a:1:{i:0;s:13:"Salomonsaaret";}s:2:"SC";a:1:{i:0;s:10:"Seychellit";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:6:"Ruotsi";}s:2:"SG";a:1:{i:0;s:9:"Singapore";}s:2:"SH";a:1:{i:0;s:12:"Saint Helena";}s:2:"SI";a:1:{i:0;s:8:"Slovenia";}s:2:"SJ";a:1:{i:0;s:25:"Huippuvuoret ja Jan Mayen";}s:2:"SK";a:1:{i:0;s:8:"Slovakia";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:7:"Somalia";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:8:"Suriname";}s:2:"ST";a:1:{i:0;s:20:"Sao Tome ja Principe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:6:"Syyria";}s:2:"SZ";a:1:{i:0;s:8:"Swazimaa";}s:2:"TC";a:1:{i:0;s:22:"Turks- ja Caicossaaret";}s:2:"TD";a:1:{i:0;s:4:"Tsad";}s:2:"TF";a:1:{i:0;s:25:"Ranskan eteläiset alueet";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:7:"Thaimaa";}s:2:"TJ";a:1:{i:0;s:11:"Tadzikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:11:"Timor-Leste";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:7:"Tunisia";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:6:"Turkki";}s:2:"TT";a:1:{i:0;s:18:"Trinidad ja Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Taiwan";}s:2:"TZ";a:1:{i:0;s:8:"Tansania";}s:2:"UA";a:1:{i:0;s:7:"Ukraina";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:33:"Yhdysvaltain pienet erillissaaret";}s:2:"US";a:1:{i:0;s:11:"Yhdysvallat";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:10:"Uzbekistan";}s:2:"VA";a:1:{i:0;s:9:"Vatikaani";}s:2:"VC";a:1:{
i:0;s:28:"Saint Vincent ja Grenadiinit";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:27:"Brittiläiset Neitsytsaaret";}s:2:"VI";a:1:{i:0;s:26:"Yhdysvaltain Neitsytsaaret";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:16:"Wallis ja Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:10:"Jugoslavia";}s:2:"ZA";a:1:{i:0;s:14:"Etelä-Afrikka";}s:2:"ZM";a:1:{i:0;s:6:"Sambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:380:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:16:"Andorran dinaari";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:15:"Andorran peseta";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:26:"Arabiemiirikuntien dirhami";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:19:"Afgaani (1927-2002)";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:7:"Afgaani";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:26:"Affarsin ja Issasin frangi";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:24:"Albanian lek (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:12:"Albanian lek";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:19:"Albanian lek valute";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:21:"Albanian dollarin FEC";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:13:"Armenian dram";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:30:"Alankomaiden Antillien guldeni";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:14:"Angolan kwanza";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:26:"Angolan kwanza (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:31:"Angolan uusi kwanza (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:37:"Angolan kwanza reajustado (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:14:"Angolan escudo";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:19:"Argentiinan austral";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:32:"Argentiinan peso moneda nacional";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:28:"Argentiinan peso (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:16:"Argentiinan peso";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:20:"Itävallan shillinki";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:18:"Australian dollari";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:16:"Au
stralian punta";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:14:"Aruban guldeni";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:20:"Azerbaidžanin manat";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:28:"Bosnia-Hertsegovinan dinaari";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:39:"Bosnia-Hertsegovinan vaihdettava markka";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:33:"Bosnia-Hertsegovinan uusi dinaari";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:18:"Barbadosin dollari";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:17:"Bangladeshin taka";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:28:"Belgian frangi (vaihdettava)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:14:"Belgian frangi";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:25:"Belgian frangi (rahoitus)";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:19:"Bulgarian kova leva";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:27:"Bulgarian sosialistinen lev";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:18:"Bulgarian uusi lev";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:25:"Bulgarian lev (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:17:"Bulgarian lev FEC";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:17:"Bahrainin dinaari";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:15:"Burundin frangi";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:16:"Bermudan dollari";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:14:"Bermudan punta";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:15:"Brunein dollari";}s:3:"BOB";a:2:{i:0;s:2:"Bs";i:1;s:9:"Boliviano";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:21:"Boliviano (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:13:"Bolivian peso";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:14:"Bolivian mvdol";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:35:"Brasilian uusi cruzeiro (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:17:"Brasilian cruzado";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:30:"Brasilian cruzeiro (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:14:"Brasilian real";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:22:"Brasilian uusi cruzado";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:18:"Brasilian cruzeiro";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:30:"Brazilian cruzeiro (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:15:"Bahaman dollari";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:
13:"Bahaman punta";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:17:"Bhutanin ngultrum";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:14:"Bhutanin rupia";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:11:"Burman kyat";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:12:"Burman rupia";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:14:"Botswanan pula";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:38:"Valko-Venäjän uusi rupla (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:33:"Valko-Venäjän rupla (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:21:"Valko-Venäjän rupla";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:15:"Belizen dollari";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:32:"Brittiläisen Hondurasin dollari";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:15:"Kanadan dollari";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:25:"Kongon kongolainen frangi";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:24:"Kongon tasavallan frangi";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:12:"Kongon zaire";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:35:"Keski-Afrikan tasavallan CFA-frangi";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:15:"Sveitsin frangi";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:21:"Cookinsaarten dollari";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:13:"Chilen condor";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:13:"Chilen escudo";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:26:"Chilen unidades de fomento";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:11:"Chilen peso";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:20:"Kamerunin CFA-frangi";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:24:"Kiinan jen min piao yuan";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:22:"Kiinan US-dollarin FEC";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:20:"Kiinan yuan renminbi";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:20:"Kolumbian paperipeso";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:17:"Kongon CFA-frangi";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:14:"Kolumbian peso";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:17:"Costa Rican colon";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:23:"Tšekkoslovakian koruna";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:28:"Tšekkoslovakian kova koruna";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:11:"Kuuban peso";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:10:"Kuuban FEC";}s:
3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:17:"Kap Verden escudo";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:16:"Curacaon guldeni";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:15:"Kyproksen punta";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:14:"Tšekin koruna";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:19:"Itä-Saksan ostmark";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:13:"Saksan markka";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:16:"Saksan sperrmark";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:16:"Djiboutin frangi";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:14:"Tanskan kruunu";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:30:"Dominikaanisen tasavallan peso";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:16:"Algerian dinaari";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:20:"Algerian uusi frangi";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:23:"Algerian franc germinal";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:15:"Ecuadorin sucre";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:13:"Ecuadorin UVC";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:12:"Viron kruunu";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:13:"Egyptin punta";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:14:"Eritrean nakfa";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:15:"Espanjan peseta";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:13:"Etiopian birr";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:16:"Etiopian dollari";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"euro";}s:3:"FIM";a:2:{i:0;s:2:"mk";i:1;s:13:"Suomen markka";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:25:"Suomen markka (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:15:"Fidžin dollari";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:13:"Fidžin punta";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:23:"Falklandinsaarten punta";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:18:"Färsaarten kruunu";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:14:"Ranskan frangi";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:37:"Ranskan franc germinal/franc poincare";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:18:"Gabonin CFA-frangi";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:29:"Iso-Britannian sterling-punta";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:20:"Georgian kuponkilari";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:13:"Georgian lari";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:11:"Ghana
n cedi";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:17:"Ghanan vanha cedi";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:12:"Ghanan punta";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:22:"Ghanan revalvoitu cedi";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:17:"Gibraltarin punta";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:18:"Grönlannin kruunu";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:14:"Gambian dalasi";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:13:"Gambian punta";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:14:"Guinean frangi";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:26:"Guinean frangi (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:12:"Guinean syli";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:18:"Guadeloupen frangi";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:40:"Päiväntasaajan Guinean ekwele guineana";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:31:"Päiväntasaajan Guinean frangi";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:40:"Päiväntasaajan Guinean peseta guineana";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:15:"Kreikan drakhma";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:20:"Kreikan uusi drakhma";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:18:"Guatemalan quetzal";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:28:"Ranskan Guyanan franc guiana";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:25:"Portugalin Guinean escudo";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:27:"Portugalin Guinean mil reis";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:19:"Guinea-Bissaun peso";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:15:"Guyanan dollari";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:19:"Hong Kongin dollari";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:18:"Hondurasin lempira";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:16:"Kroatian dinaari";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:13:"Kroatian kuna";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:13:"Haitin gourde";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:16:"Unkarin forintti";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:22:"Pohjois-Irlannin punta";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:23:"Indonesian nica guldeni";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:21:"Indonesian java rupia";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:21:"Indonesian uusi rupia";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:16:"Indonesian rupia";}s:
3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:14:"Irlannin punta";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:15:"Israelin sekeli";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:14:"Israelin punta";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:20:"Israelin uusi sekeli";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:24:"Mansaaren sterling-punta";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:12:"Intian rupia";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:14:"Irakin dinaari";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:11:"Iranin rial";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:15:"Islannin kruunu";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:13:"Italian liira";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:22:"Jerseyn sterling-punta";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:16:"Jamaikan dollari";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:14:"Jamaikan punta";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:17:"Jordanian dinaari";}s:3:"JPY";a:2:{i:0;s:2:"¥";i:1;s:12:"Japanin jeni";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:16:"Kenian shillinki";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:15:"Kirgistanin som";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:21:"Kambodžan vanha riel";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:15:"Kambodžan riel";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:17:"Kiribatin dollari";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:15:"Komorien frangi";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:25:"Pohjois-Korean kansan won";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:18:"Pohjois-Korean won";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:18:"Etelä-Korean hwan";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:23:"Etelä-Korean vanha won";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:17:"Etelä-Korean won";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:16:"Kuwaitin dinaari";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:21:"Caymansaarten dollari";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:18:"Kazakhstanin rupla";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:18:"Kazakhstanin tenge";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:10:"Laosin kip";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:15:"Libanonin punta";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:22:"Liechtensteinin frangi";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:16:"Sri Lankan rupia";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:14:"Ceylo
nin rupia";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:16:"Liberian dollari";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:13:"Lesothon loti";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:13:"Liettuan liti";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:16:"Liettuan talonas";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:18:"Luxemburgin frangi";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:12:"Latvian lati";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:13:"Latvian rupla";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:26:"Libyan sotilasvallan liira";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:14:"Libyan dinaari";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:12:"Libyan punta";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:15:"Marokon dirhami";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:14:"Marokon frangi";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:19:"Monacon uusi frangi";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:22:"Monacon franc germinal";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:19:"Moldovan kuponkileu";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:12:"Moldovan leu";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:21:"Moldovan kuponkirupla";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:19:"Madagaskarin ariary";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:19:"Madagaskarin frangi";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:25:"Marshallinsaarten dollari";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:18:"Makedonian dinaari";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:30:"Makedonian dinaari (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:12:"Malin frangi";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:14:"Myanmarin kyat";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:22:"Myanmarin dollarin FEC";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:16:"Mongolian tugrik";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:13:"Macaon pataca";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:18:"Martiniquen frangi";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:19:"Mauritanian ouguiya";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:12:"Maltan liira";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:12:"Maltan punta";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:18:"Mauritiuksen rupia";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:17:"Malediivien rupia";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:19:"Malediivien rufiyaa";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:
14:"Malawin kwacha";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:13:"Malawin punta";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:13:"Meksikon peso";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:30:"Meksikon hopeapeso (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:12:"Meksikon UDI";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:16:"Malesian ringgit";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:17:"Mosambikin escudo";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:18:"Mosambikin metical";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:16:"Namibian dollari";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:31:"Uuden-Kaledonian franc germinal";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:14:"Nigerian naira";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:14:"Nigerian punta";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:27:"Uusien-Hebridien CFP-frangi";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:18:"Nicaraguan cordoba";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:23:"Nicaraguan kultacordoba";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:22:"Nicaraguan cordoba oro";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:20:"Alankomaiden guldeni";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:13:"Norjan kruunu";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:13:"Nepalin rupia";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:23:"Uuden-Seelannin dollari";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:21:"Uuden-Seelannin punta";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:11:"Omanin rial";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:17:"Omanin rial saidi";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:14:"Panaman balboa";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:28:"Transdniestrian kuponkirupla";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:26:"Transdniestrian uusi rupla";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:21:"Transdniestrian rupla";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:10:"Perun inti";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:14:"Perun uusi sol";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:9:"Perun sol";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:24:"Papua-Uuden-Guinean kina";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:17:"Filippiinien peso";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:16:"Pakistanin rupia";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:12:"Puolan zloty";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:22:"Puolan US-doll
arin FEC";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:24:"Puolan zloty (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:17:"Palestiinan punta";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:16:"Portugalin conto";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:17:"Portugalin escudo";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:17:"Paraguayn guarani";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:12:"Qatarin rial";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:16:"Reunionin frangi";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:12:"Romanian lei";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:17:"Romanian uusi lei";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:15:"Venäjän rupla";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:27:"Venäjän rupla (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:14:"Ruandan frangi";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:18:"Saudi-Arabian rial";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:30:"Saudi-Arabian itsenäinen rial";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:22:"Salomonsaarten dollari";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:17:"Seychellien rupia";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:15:"Sudanin dinaari";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:13:"Sudanin punta";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:14:"Ruotsin kruunu";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:18:"Singaporen dollari";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:19:"Saint Helenan punta";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:20:"Slovenian tolar bons";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:15:"Slovenian tolar";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:15:"Slovakin koruna";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:19:"Sierra Leonen leone";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:17:"San Marinon liira";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:17:"Somalin shillinki";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:20:"Somalimaan shillinki";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:17:"Surinamin guldeni";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:16:"Skotlannin punta";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:31:"São Tomén ja Principén dobra";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:32:"São Tomén ja Principén escudo";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:25:"Neuvostoliiton uusi rupla";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:20:"
Neuvostoliiton rupla";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:19:"El Salvadorin colon";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:13:"Syyrian punta";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:19:"Swazimaan lilangeni";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:29:"Turks- ja Caicossaarten crown";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:18:"Tšadin CFA-frangi";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:13:"Thaimaan baht";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:20:"Tadžikistanin rupla";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:21:"Tadžikistanin somoni";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:20:"Turkmenistanin manat";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:16:"Tunisian dinaari";}s:3:"TOP";a:2:{i:0;s:2:"T$";i:1;s:15:"Tongan paʻanga";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:21:"Tongan sterling-punta";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:14:"Timorin escudo";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:14:"Timorin pataca";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:12:"Turkin liira";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:29:"Trinidadin ja Tobagon dollari";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:35:"Trinidadin ja Tobagon vanha dollari";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:15:"Tuvalun dollari";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:21:"Taiwanin uusi dollari";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:19:"Tansanian shillinki";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:16:"Ukrainan hryvnia";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:20:"Ukrainan karbovanetz";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:29:"Ugandan shillinki (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:17:"Ugandan shillinki";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:20:"Yhdysvaltain dollari";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:39:"Yhdysvaltain dollari (Seuraava päivä)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:35:"Yhdysvaltain dollari (Sama päivä)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:20:"Uruguayn peso fuerte";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:25:"Uruguayn peso (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:22:"Uruguayn peso uruguayo";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:23:"Uzbekistanin kuponkisom";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:16:"Uzbekistanin som";}s:3:"VAL";a:2:{i:0;
s:3:"VAL";i:1;s:26:"Vatikaanin kaupungin liira";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:35:"Pohjois-Vietnamin piastre dong viet";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:27:"Pohjois-Vietnamin uusi dong";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:45:"Pohjois-Vietnamin viet minh piastre dong viet";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:18:"Venezuelan bolivar";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:37:"Brittiläisten Neitsytsaarten dollari";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:14:"Vietnamin dong";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:19:"Vietnamin uusi dong";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:25:"Vietnamin tasavallan dong";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:26:"Vietnamin kansallinen dong";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:13:"Vanuatun vatu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:19:"Länsi-Samoan punta";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:18:"Länsi-Samoan tala";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:18:"Aasian dinaarin UA";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:15:"CFA-frangi BEAC";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:25:"Aasian rahayksikkö (AMU)";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:5:"Kulta";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:5:"EURCO";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:27:"Euroopan rahayksikkö (EMU)";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:9:"EUA (XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:9:"EUA (XBD)";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:21:"Itä-Karibian dollari";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:15:"CFA uusi frangi";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:24:"Erityiset nosto-oikeudet";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:17:"CFA-frangi BCEAEC";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:25:"Euroopan valuuttayksikkö";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:20:"Ranskan kulta frangi";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:18:"Ranskan UIC-frangi";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:15:"Islamin dinaari";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:28:"Ranskan emämaan uusi frangi";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:28:"Ranskan Antillien CFA-frangi";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:16:"CFA-frangi BCEAO";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:10:"CFP-frangi";}s:3:"XTR";a:2:
{i:0;s:3:"XTR";i:1;s:29:"COMECONin siirrettävä rupla";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:15:"Jemenin dinaari";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:18:"Jemenin imadi rial";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:12:"Jemenin rial";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:24:"Jugoslavian kova dinaari";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:33:"Jugoslavian liittovaltion dinaari";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:24:"Jugoslavian 1994 dinaari";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:24:"Jugoslavian uusi dinaari";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:31:"Jugoslavian vaihdettava dinaari";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:28:"Jugoslavian lokakuun dinaari";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:30:"Jugoslavian uudistettu dinaari";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:31:"Etelä-Afrikan randi (rahoitus)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:20:"Etelä-Afrikan punta";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:20:"Etelä-Afrikan randi";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:14:"Zambian kwacha";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:13:"Zambian punta";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:17:"Zairen uusi zaire";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:12:"Zairen zaire";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:17:"Zimbabwen dollari";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:9:"Kalenteri";}s:9:"collation";a:1:{i:0;s:12:"Kerääminen";}s:8:"currency";a:1:{i:0;s:8:"Valuutta";}}s:9:"Languages";a:462:{s:2:"aa";a:1:{i:0;s:4:"afar";}s:2:"ab";a:1:{i:0;s:7:"abhaasi";}s:3:"ace";a:1:{i:0;s:4:"aceh";}s:3:"ada";a:1:{i:0;s:7:"adangme";}s:3:"ady";a:1:{i:0;s:6:"adyghe";}s:2:"ae";a:1:{i:0;s:6:"avesta";}s:2:"af";a:1:{i:0;s:9:"afrikaans";}s:3:"afa";a:1:{i:0;s:27:"muut afroaasialaiset kielet";}s:3:"afh";a:1:{i:0;s:8:"afrihili";}s:2:"ak";a:1:{i:0;s:4:"akan";}s:3:"akk";a:1:{i:0;s:6:"akkadi";}s:3:"ale";a:1:{i:0;s:7:"aleutti";}s:3:"alg";a:1:{i:0;s:15:"algonkin-kielet";}s:2:"am";a:1:{i:0;s:6:"amhara";}s:2:"an";a:1:{i:0;s:8:"aragonia";}s:3:"ang";a:1:{i:0;s:15:"muinaisenglanti";}s:3:"apa";a:1:{i:0;s:6:"apassi";}s:2:"ar";a:1:{i:0;s:6:"arabia";}s:3:"arc";a:1:{i:0;s:6:"aramea";}s:3:"arn";a:1:{i:0;s:9
:"araukaani";}s:3:"arp";a:1:{i:0;s:7:"arapaho";}s:3:"art";a:1:{i:0;s:15:"muut tekokielet";}s:3:"arw";a:1:{i:0;s:6:"arawak";}s:2:"as";a:1:{i:0;s:6:"assami";}s:3:"ast";a:1:{i:0;s:7:"astuuri";}s:3:"ath";a:1:{i:0;s:16:"athabasca-kielet";}s:3:"aus";a:1:{i:0;s:22:"australialaiset kielet";}s:2:"av";a:1:{i:0;s:6:"avaari";}s:3:"awa";a:1:{i:0;s:6:"awadhi";}s:2:"ay";a:1:{i:0;s:6:"aimara";}s:2:"az";a:1:{i:0;s:11:"azerbaizani";}s:2:"ba";a:1:{i:0;s:9:"baškiiri";}s:3:"bad";a:1:{i:0;s:5:"banda";}s:3:"bai";a:1:{i:0;s:8:"bamileke";}s:3:"bal";a:1:{i:0;s:8:"balutši";}s:3:"ban";a:1:{i:0;s:4:"bali";}s:3:"bas";a:1:{i:0;s:4:"basa";}s:3:"bat";a:1:{i:0;s:24:"muut balttilaiset kielet";}s:2:"be";a:1:{i:0;s:13:"valkovenäjä";}s:3:"bej";a:1:{i:0;s:7:"bedauje";}s:3:"bem";a:1:{i:0;s:5:"bemba";}s:3:"ber";a:1:{i:0;s:7:"berberi";}s:2:"bg";a:1:{i:0;s:8:"bulgaria";}s:2:"bh";a:1:{i:0;s:6:"bihari";}s:3:"bho";a:1:{i:0;s:10:"bhodžpuri";}s:2:"bi";a:1:{i:0;s:7:"bislama";}s:3:"bik";a:1:{i:0;s:5:"bicol";}s:3:"bin";a:1:{i:0;s:4:"bini";}s:3:"bla";a:1:{i:0;s:10:"mustajalka";}s:2:"bm";a:1:{i:0;s:7:"bambara";}s:2:"bn";a:1:{i:0;s:7:"bengali";}s:3:"bnt";a:1:{i:0;s:5:"bantu";}s:2:"bo";a:1:{i:0;s:6:"tiibet";}s:2:"br";a:1:{i:0;s:7:"bretoni";}s:3:"bra";a:1:{i:0;s:6:"bradž";}s:2:"bs";a:1:{i:0;s:6:"bosnia";}s:3:"btk";a:1:{i:0;s:7:"batakki";}s:3:"bua";a:1:{i:0;s:9:"burjaatti";}s:3:"bug";a:1:{i:0;s:4:"bugi";}s:3:"byn";a:1:{i:0;s:4:"blin";}s:2:"ca";a:1:{i:0;s:9:"katalaani";}s:3:"cad";a:1:{i:0;s:5:"caddo";}s:3:"cai";a:1:{i:0;s:34:"muut Keski-Amerikan intiaanikielet";}s:3:"car";a:1:{i:0;s:5:"karib";}s:3:"cau";a:1:{i:0;s:26:"muut kaukasialaiset kielet";}s:2:"ce";a:1:{i:0;s:11:"tšetšeeni";}s:3:"ceb";a:1:{i:0;s:7:"sebuano";}s:3:"cel";a:1:{i:0;s:25:"muut kelttiläiset kielet";}s:2:"ch";a:1:{i:0;s:8:"chamorro";}s:3:"chb";a:1:{i:0;s:7:"chibcha";}s:3:"chg";a:1:{i:0;s:9:"tšagatai";}s:3:"chk";a:1:{i:0;s:4:"truk";}s:3:"chm";a:1:{i:0;s:4:"mari";}s:3:"chn";a:1:{i:0;s:7:"chinook";}s:3:"cho";a:1:{i:0;s:7:"choctaw";}s:3:"chp";a:1:{i:0;s:8:"chipewya";}s:3:"chr";a:1:{i:0;s:8:"cheroke
e";}s:3:"chy";a:1:{i:0;s:8:"cheyenne";}s:3:"cmc";a:1:{i:0;s:5:"tšam";}s:2:"co";a:1:{i:0;s:7:"korsika";}s:3:"cop";a:1:{i:0;s:5:"kopti";}s:3:"cpe";a:1:{i:0;s:14:"pidginenglanti";}s:3:"cpf";a:1:{i:0;s:44:"muut ranskaan perustuvat kreolit ja pidginit";}s:3:"cpp";a:1:{i:0;s:47:"muut portugaliin perustuvat kreolit ja pidginit";}s:2:"cr";a:1:{i:0;s:4:"cree";}s:3:"crh";a:1:{i:0;s:29:"krimin turkki; krimin tataari";}s:3:"crp";a:1:{i:0;s:24:"muut kreolit ja pidginit";}s:2:"cs";a:1:{i:0;s:6:"tsekki";}s:3:"csb";a:1:{i:0;s:7:"kashubi";}s:2:"cu";a:1:{i:0;s:12:"kirkkoslaavi";}s:3:"cus";a:1:{i:0;s:23:"muut kuusilaiset kielet";}s:2:"cv";a:1:{i:0;s:9:"tšuvassi";}s:2:"cy";a:1:{i:0;s:5:"kymri";}s:2:"da";a:1:{i:0;s:6:"tanska";}s:3:"dak";a:1:{i:0;s:5:"sioux";}s:3:"dar";a:1:{i:0;s:6:"dargva";}s:3:"day";a:1:{i:0;s:7:"dajakki";}s:2:"de";a:1:{i:0;s:5:"saksa";}s:3:"del";a:1:{i:0;s:8:"delaware";}s:3:"den";a:1:{i:0;s:6:"slaavi";}s:3:"dgr";a:1:{i:0;s:6:"dogrib";}s:3:"din";a:1:{i:0;s:5:"dinka";}s:3:"doi";a:1:{i:0;s:5:"dogri";}s:3:"dra";a:1:{i:0;s:18:"muut dravidakielet";}s:3:"dsb";a:1:{i:0;s:9:"ala-sorbi";}s:3:"dua";a:1:{i:0;s:5:"duala";}s:3:"dum";a:1:{i:0;s:13:"keskihollanti";}s:2:"dv";a:1:{i:0;s:9:"malediivi";}s:3:"dyu";a:1:{i:0;s:5:"djula";}s:2:"dz";a:1:{i:0;s:7:"bhutani";}s:2:"ee";a:1:{i:0;s:3:"ewe";}s:3:"efi";a:1:{i:0;s:4:"efik";}s:3:"egy";a:1:{i:0;s:13:"muinaisegypti";}s:3:"eka";a:1:{i:0;s:6:"ekajuk";}s:2:"el";a:1:{i:0;s:7:"kreikka";}s:3:"elx";a:1:{i:0;s:5:"elami";}s:2:"en";a:1:{i:0;s:8:"englanti";}s:3:"enm";a:1:{i:0;s:13:"keskienglanti";}s:2:"eo";a:1:{i:0;s:9:"esperanto";}s:2:"es";a:1:{i:0;s:7:"espanja";}s:2:"et";a:1:{i:0;s:4:"viro";}s:2:"eu";a:1:{i:0;s:5:"baski";}s:3:"ewo";a:1:{i:0;s:6:"ewondo";}s:2:"fa";a:1:{i:0;s:5:"farsi";}s:3:"fan";a:1:{i:0;s:4:"fang";}s:3:"fat";a:1:{i:0;s:5:"fanti";}s:2:"ff";a:1:{i:0;s:6:"fulani";}s:2:"fi";a:1:{i:0;s:5:"suomi";}s:3:"fiu";a:1:{i:0;s:32:"muut suomalais-ugrilaiset kielet";}s:2:"fj";a:1:{i:0;s:6:"fidži";}s:2:"fo";a:1:{i:0;s:7:"fääri";}s:3:"fon";a:1:{i:0;s:4:"fong";}s:2:"fr";a:1:{i:0;s:6:"ranska";
}s:3:"frm";a:1:{i:0;s:11:"keskiranska";}s:3:"fro";a:1:{i:0;s:13:"muinaisranska";}s:3:"fur";a:1:{i:0;s:6:"friuli";}s:2:"fy";a:1:{i:0;s:6:"friisi";}s:2:"ga";a:1:{i:0;s:4:"iiri";}s:3:"gaa";a:1:{i:0;s:2:"ga";}s:3:"gay";a:1:{i:0;s:4:"gayo";}s:3:"gba";a:1:{i:0;s:5:"gbaja";}s:2:"gd";a:1:{i:0;s:5:"gaeli";}s:3:"gem";a:1:{i:0;s:23:"muut germaaniset kielet";}s:3:"gez";a:1:{i:0;s:7:"etiopia";}s:3:"gil";a:1:{i:0;s:8:"kiribati";}s:2:"gl";a:1:{i:0;s:7:"galicia";}s:3:"gmh";a:1:{i:0;s:14:"keskiyläsaksa";}s:2:"gn";a:1:{i:0;s:7:"guarani";}s:3:"goh";a:1:{i:0;s:16:"muinaisyläsaksa";}s:3:"gon";a:1:{i:0;s:5:"gondi";}s:3:"gor";a:1:{i:0;s:9:"gorontalo";}s:3:"got";a:1:{i:0;s:6:"gootti";}s:3:"grb";a:1:{i:0;s:5:"grebo";}s:3:"grc";a:1:{i:0;s:14:"muinaiskreikka";}s:2:"gu";a:1:{i:0;s:8:"gujarati";}s:2:"gv";a:1:{i:0;s:4:"manx";}s:3:"gwi";a:1:{i:0;s:8:"gwitşin";}s:2:"ha";a:1:{i:0;s:5:"hausa";}s:3:"hai";a:1:{i:0;s:5:"haida";}s:3:"haw";a:1:{i:0;s:7:"havaiji";}s:2:"he";a:1:{i:0;s:6:"heprea";}s:2:"hi";a:1:{i:0;s:5:"hindi";}s:3:"hil";a:1:{i:0;s:6:"ilongo";}s:3:"him";a:1:{i:0;s:9:"himachali";}s:3:"hit";a:1:{i:0;s:6:"heetti";}s:3:"hmn";a:1:{i:0;s:5:"hmong";}s:2:"ho";a:1:{i:0;s:9:"hiri-motu";}s:2:"hr";a:1:{i:0;s:8:"kroaatti";}s:3:"hsb";a:1:{i:0;s:10:"ylä-sorbi";}s:2:"ht";a:1:{i:0;s:5:"haiti";}s:2:"hu";a:1:{i:0;s:6:"unkari";}s:3:"hup";a:1:{i:0;s:4:"hupa";}s:2:"hy";a:1:{i:0;s:7:"armenia";}s:2:"hz";a:1:{i:0;s:6:"herero";}s:2:"ia";a:1:{i:0;s:11:"interlingua";}s:3:"iba";a:1:{i:0;s:4:"iban";}s:2:"id";a:1:{i:0;s:9:"indonesia";}s:2:"ie";a:1:{i:0;s:11:"interlingue";}s:2:"ig";a:1:{i:0;s:4:"igbo";}s:2:"ii";a:1:{i:0;s:10:"pohjois-ji";}s:2:"ik";a:1:{i:0;s:7:"inupiak";}s:3:"ilo";a:1:{i:0;s:5:"iloko";}s:3:"inc";a:1:{i:0;s:23:"muut intialaiset kielet";}s:3:"ine";a:1:{i:0;s:30:"muut indoeurooppalaiset kielet";}s:3:"inh";a:1:{i:0;s:8:"inguuši";}s:2:"io";a:1:{i:0;s:3:"ido";}s:3:"ira";a:1:{i:0;s:4:"iran";}s:3:"iro";a:1:{i:0;s:8:"irokeesi";}s:2:"is";a:1:{i:0;s:7:"islanti";}s:2:"it";a:1:{i:0;s:6:"italia";}s:2:"iu";a:1:{i:0;s:6:"eskimo";}s:2:"ja";a:1:{i:0;s:6:"japani";}s
:3:"jbo";a:1:{i:0;s:5:"lojba";}s:3:"jpr";a:1:{i:0;s:15:"juutalaispersia";}s:3:"jrb";a:1:{i:0;s:15:"juutalaisarabia";}s:2:"jv";a:1:{i:0;s:5:"jaava";}s:2:"ka";a:1:{i:0;s:7:"georgia";}s:3:"kaa";a:1:{i:0;s:12:"karakalpakki";}s:3:"kab";a:1:{i:0;s:7:"kabyyli";}s:3:"kac";a:1:{i:0;s:9:"džingpho";}s:3:"kam";a:1:{i:0;s:5:"kamba";}s:3:"kar";a:1:{i:0;s:5:"karen";}s:3:"kaw";a:1:{i:0;s:4:"kavi";}s:3:"kbd";a:1:{i:0;s:7:"kabardi";}s:2:"kg";a:1:{i:0;s:5:"kongo";}s:3:"kha";a:1:{i:0;s:5:"khasi";}s:3:"khi";a:1:{i:0;s:18:"muut khoisankielet";}s:3:"kho";a:1:{i:0;s:7:"khotani";}s:2:"ki";a:1:{i:0;s:6:"kikuju";}s:2:"kj";a:1:{i:0;s:8:"kuanjama";}s:2:"kk";a:1:{i:0;s:7:"kazakki";}s:2:"kl";a:1:{i:0;s:10:"grönlanti";}s:2:"km";a:1:{i:0;s:5:"khmer";}s:3:"kmb";a:1:{i:0;s:8:"kimbundu";}s:2:"kn";a:1:{i:0;s:7:"kannada";}s:2:"ko";a:1:{i:0;s:5:"korea";}s:3:"kok";a:1:{i:0;s:7:"konkani";}s:3:"kos";a:1:{i:0;s:6:"kosrae";}s:3:"kpe";a:1:{i:0;s:6:"kpelle";}s:2:"kr";a:1:{i:0;s:6:"kanuri";}s:3:"krc";a:1:{i:0;s:15:"karachay-balkar";}s:3:"kro";a:1:{i:0;s:10:"kru-kielet";}s:3:"kru";a:1:{i:0;s:6:"kurukh";}s:2:"ks";a:1:{i:0;s:8:"kašmiri";}s:2:"ku";a:1:{i:0;s:5:"kurdi";}s:3:"kum";a:1:{i:0;s:7:"kumukki";}s:3:"kut";a:1:{i:0;s:7:"kutenai";}s:2:"kv";a:1:{i:0;s:4:"komi";}s:2:"kw";a:1:{i:0;s:5:"korni";}s:2:"ky";a:1:{i:0;s:8:"kirgiisi";}s:2:"la";a:1:{i:0;s:6:"latina";}s:3:"lad";a:1:{i:0;s:16:"juutalaisespanja";}s:3:"lah";a:1:{i:0;s:6:"lahnda";}s:3:"lam";a:1:{i:0;s:5:"lamba";}s:2:"lb";a:1:{i:0;s:9:"luxemburg";}s:3:"lez";a:1:{i:0;s:5:"lezgi";}s:2:"lg";a:1:{i:0;s:5:"ganda";}s:2:"li";a:1:{i:0;s:8:"limburgi";}s:2:"ln";a:1:{i:0;s:7:"lingala";}s:2:"lo";a:1:{i:0;s:3:"lao";}s:3:"lol";a:1:{i:0;s:5:"mongo";}s:3:"loz";a:1:{i:0;s:4:"lozi";}s:2:"lt";a:1:{i:0;s:7:"liettua";}s:2:"lu";a:1:{i:0;s:13:"katangan luba";}s:3:"lua";a:1:{i:0;s:4:"luba";}s:3:"lui";a:1:{i:0;s:7:"luiseno";}s:3:"lun";a:1:{i:0;s:5:"lunda";}s:3:"lus";a:1:{i:0;s:6:"lushai";}s:2:"lv";a:1:{i:0;s:6:"latvia";}s:3:"mad";a:1:{i:0;s:6:"madura";}s:3:"mag";a:1:{i:0;s:6:"magahi";}s:3:"mai";a:1:{i:0;s:8:"maithili";}s:3:"mak";a
:1:{i:0;s:8:"makassar";}s:3:"man";a:1:{i:0;s:8:"mandingo";}s:3:"map";a:1:{i:0;s:11:"austronesia";}s:3:"mas";a:1:{i:0;s:6:"maasai";}s:3:"mdf";a:1:{i:0;s:6:"mokša";}s:3:"mdr";a:1:{i:0;s:6:"mandar";}s:3:"men";a:1:{i:0;s:5:"mende";}s:2:"mg";a:1:{i:0;s:8:"malagasi";}s:3:"mga";a:1:{i:0;s:10:"keski-iiri";}s:2:"mh";a:1:{i:0;s:9:"marshalli";}s:2:"mi";a:1:{i:0;s:5:"maori";}s:3:"mic";a:1:{i:0;s:6:"micmac";}s:3:"min";a:1:{i:0;s:11:"minangkabau";}s:3:"mis";a:1:{i:0;s:17:"sekalaiset kielet";}s:2:"mk";a:1:{i:0;s:9:"makedonia";}s:3:"mkh";a:1:{i:0;s:21:"muut mon-khmer-kielet";}s:2:"ml";a:1:{i:0;s:9:"malajalam";}s:2:"mn";a:1:{i:0;s:7:"mongoli";}s:3:"mnc";a:1:{i:0;s:7:"mantšu";}s:3:"mni";a:1:{i:0;s:8:"manipuri";}s:3:"mno";a:1:{i:0;s:13:"manobo-kielet";}s:2:"mo";a:1:{i:0;s:7:"moldova";}s:3:"moh";a:1:{i:0;s:6:"mohawk";}s:3:"mos";a:1:{i:0;s:4:"mosi";}s:2:"mr";a:1:{i:0;s:7:"marathi";}s:2:"ms";a:1:{i:0;s:7:"malaiji";}s:2:"mt";a:1:{i:0;s:5:"malta";}s:3:"mul";a:1:{i:0;s:12:"monikielinen";}s:3:"mun";a:1:{i:0;s:11:"mundakielet";}s:3:"mus";a:1:{i:0;s:7:"muskogi";}s:3:"mwr";a:1:{i:0;s:7:"marwari";}s:2:"my";a:1:{i:0;s:5:"burma";}s:3:"myn";a:1:{i:0;s:4:"maya";}s:3:"myv";a:1:{i:0;s:5:"ersä";}s:2:"na";a:1:{i:0;s:5:"nauru";}s:3:"nah";a:1:{i:0;s:7:"nahuatl";}s:3:"nai";a:1:{i:0;s:36:"muut Pohjois-Amerikan intiaanikielet";}s:3:"nap";a:1:{i:0;s:14:"napolin italia";}s:2:"nb";a:1:{i:0;s:10:"kirjanorja";}s:2:"nd";a:1:{i:0;s:14:"pohjoisndebele";}s:3:"nds";a:1:{i:0;s:8:"alasaksa";}s:2:"ne";a:1:{i:0;s:6:"nepali";}s:3:"new";a:1:{i:0;s:6:"newari";}s:2:"ng";a:1:{i:0;s:6:"ndonga";}s:3:"nia";a:1:{i:0;s:4:"nias";}s:3:"nic";a:1:{i:0;s:35:"muut nigeriläis-kongolaiset kielet";}s:3:"niu";a:1:{i:0;s:4:"niue";}s:2:"nl";a:1:{i:0;s:8:"hollanti";}s:2:"nn";a:1:{i:0;s:8:"uusnorja";}s:2:"no";a:1:{i:0;s:5:"norja";}s:3:"nog";a:1:{i:0;s:5:"nogai";}s:3:"non";a:1:{i:0;s:18:"muinaisskandinaavi";}s:2:"nr";a:1:{i:0;s:13:"eteländebele";}s:3:"nso";a:1:{i:0;s:4:"pedi";}s:3:"nub";a:1:{i:0;s:19:"nuubialaiset kielet";}s:2:"nv";a:1:{i:0;s:6:"navaho";}s:2:"ny";a:1:{i:0;s:16:"njandža, 
tšewa";}s:3:"nym";a:1:{i:0;s:8:"nyamwezi";}s:3:"nyn";a:1:{i:0;s:8:"nyankole";}s:3:"nyo";a:1:{i:0;s:5:"nyoro";}s:3:"nzi";a:1:{i:0;s:5:"nzima";}s:2:"oc";a:1:{i:0;s:22:"oksitaani, provensaali";}s:2:"oj";a:1:{i:0;s:6:"ojibwa";}s:2:"om";a:1:{i:0;s:5:"oromo";}s:2:"or";a:1:{i:0;s:5:"orija";}s:2:"os";a:1:{i:0;s:8:"osseetti";}s:3:"osa";a:1:{i:0;s:5:"osage";}s:3:"ota";a:1:{i:0;s:6:"osmani";}s:3:"oto";a:1:{i:0;s:21:"otomangelaiset kielet";}s:2:"pa";a:1:{i:0;s:7:"punjabi";}s:3:"paa";a:1:{i:0;s:20:"muut papualaiskielet";}s:3:"pag";a:1:{i:0;s:10:"pangasinan";}s:3:"pal";a:1:{i:0;s:7:"pahlavi";}s:3:"pam";a:1:{i:0;s:8:"pampanga";}s:3:"pap";a:1:{i:0;s:10:"papiamentu";}s:3:"pau";a:1:{i:0;s:5:"palau";}s:3:"peo";a:1:{i:0;s:13:"muinaispersia";}s:3:"phi";a:1:{i:0;s:26:"muut filippiiniläiskielet";}s:3:"phn";a:1:{i:0;s:8:"foinikia";}s:2:"pi";a:1:{i:0;s:4:"pali";}s:2:"pl";a:1:{i:0;s:5:"puola";}s:3:"pon";a:1:{i:0;s:7:"pohnpei";}s:3:"pra";a:1:{i:0;s:10:"prakriitit";}s:3:"pro";a:1:{i:0;s:18:"muinaisprovensaali";}s:2:"ps";a:1:{i:0;s:6:"pašto";}s:2:"pt";a:1:{i:0;s:9:"portugali";}s:2:"qu";a:1:{i:0;s:7:"ketšua";}s:3:"raj";a:1:{i:0;s:10:"rajasthani";}s:3:"rap";a:1:{i:0;s:7:"rapanui";}s:3:"rar";a:1:{i:0;s:9:"rarotonga";}s:2:"rm";a:1:{i:0;s:11:"retoromaani";}s:2:"rn";a:1:{i:0;s:5:"rundi";}s:2:"ro";a:1:{i:0;s:7:"romania";}s:3:"roa";a:1:{i:0;s:22:"muut romaaniset kielet";}s:3:"rom";a:1:{i:0;s:6:"romani";}s:2:"ru";a:1:{i:0;s:8:"venäjä";}s:2:"rw";a:1:{i:0;s:6:"ruanda";}s:2:"sa";a:1:{i:0;s:11:"sanskriitti";}s:3:"sad";a:1:{i:0;s:7:"sandawe";}s:3:"sah";a:1:{i:0;s:8:"jakuutti";}s:3:"sai";a:1:{i:0;s:35:"muut Etelä-Amerikan intiaanikielet";}s:3:"sal";a:1:{i:0;s:6:"sališ";}s:3:"sam";a:1:{i:0;s:12:"länsiaramea";}s:3:"sas";a:1:{i:0;s:5:"sasak";}s:3:"sat";a:1:{i:0;s:7:"santali";}s:2:"sc";a:1:{i:0;s:5:"sardi";}s:3:"sco";a:1:{i:0;s:6:"skotti";}s:2:"sd";a:1:{i:0;s:6:"sindhi";}s:2:"se";a:1:{i:0;s:12:"pohjoissaame";}s:3:"sel";a:1:{i:0;s:8:"selkuppi";}s:3:"sem";a:1:{i:0;s:24:"muut seemiläiset kielet";}s:2:"sg";a:1:{i:0;s:5:"sango";}s:3:"sga";a:1:{i:0;s:11:"m
uinaisiiri";}s:3:"sgn";a:1:{i:0;s:14:"viittomakielet";}s:2:"sh";a:1:{i:0;s:12:"serbokroatia";}s:3:"shn";a:1:{i:0;s:4:"šan";}s:2:"si";a:1:{i:0;s:10:"singaleesi";}s:3:"sid";a:1:{i:0;s:6:"sidamo";}s:3:"sio";a:1:{i:0;s:19:"siouxilaiset kielet";}s:3:"sit";a:1:{i:0;s:30:"muut sinotiibetiläiset kielet";}s:2:"sk";a:1:{i:0;s:8:"slovakki";}s:2:"sl";a:1:{i:0;s:8:"sloveeni";}s:3:"sla";a:1:{i:0;s:24:"muut slaavilaiset kielet";}s:2:"sm";a:1:{i:0;s:5:"samoa";}s:3:"sma";a:1:{i:0;s:11:"eteläsaame";}s:3:"smi";a:1:{i:0;s:18:"muut saamen kielet";}s:3:"smj";a:1:{i:0;s:14:"luulajan saame";}s:3:"smn";a:1:{i:0;s:11:"inarinsaame";}s:3:"sms";a:1:{i:0;s:11:"koltansaame";}s:2:"sn";a:1:{i:0;s:5:"shona";}s:3:"snk";a:1:{i:0;s:7:"soninke";}s:2:"so";a:1:{i:0;s:6:"somali";}s:3:"sog";a:1:{i:0;s:5:"sogdi";}s:3:"son";a:1:{i:0;s:7:"songhai";}s:2:"sq";a:1:{i:0;s:7:"albania";}s:2:"sr";a:1:{i:0;s:6:"serbia";}s:3:"srr";a:1:{i:0;s:5:"serer";}s:2:"ss";a:1:{i:0;s:5:"swazi";}s:3:"ssa";a:1:{i:0;s:28:"muut nilosaharalaiset kielet";}s:2:"st";a:1:{i:0;s:11:"eteläsotho";}s:2:"su";a:1:{i:0;s:5:"sunda";}s:3:"suk";a:1:{i:0;s:6:"sukuma";}s:3:"sus";a:1:{i:0;s:4:"susu";}s:3:"sux";a:1:{i:0;s:6:"sumeri";}s:2:"sv";a:1:{i:0;s:6:"ruotsi";}s:2:"sw";a:1:{i:0;s:7:"suahili";}s:3:"syr";a:1:{i:0;s:6:"syyria";}s:2:"ta";a:1:{i:0;s:6:"tamili";}s:3:"tai";a:1:{i:0;s:15:"muut thaikielet";}s:2:"te";a:1:{i:0;s:6:"telugu";}s:3:"tem";a:1:{i:0;s:5:"temne";}s:3:"ter";a:1:{i:0;s:6:"tereno";}s:3:"tet";a:1:{i:0;s:5:"tetum";}s:2:"tg";a:1:{i:0;s:9:"tadžikki";}s:2:"th";a:1:{i:0;s:4:"thai";}s:2:"ti";a:1:{i:0;s:8:"tigrinja";}s:3:"tig";a:1:{i:0;s:5:"tigre";}s:2:"tk";a:1:{i:0;s:9:"turkmeeni";}s:3:"tkl";a:1:{i:0;s:7:"tokelau";}s:2:"tl";a:1:{i:0;s:7:"tagalog";}s:3:"tli";a:1:{i:0;s:7:"tlingit";}s:3:"tmh";a:1:{i:0;s:8:"tamašek";}s:2:"tn";a:1:{i:0;s:6:"tswana";}s:2:"to";a:1:{i:0;s:19:"Tonga-saarten tonga";}s:3:"tog";a:1:{i:0;s:5:"tonga";}s:3:"tpi";a:1:{i:0;s:9:"tok-pisin";}s:2:"tr";a:1:{i:0;s:6:"turkki";}s:2:"ts";a:1:{i:0;s:6:"tsonga";}s:3:"tsi";a:1:{i:0;s:9:"tsimshian";}s:2:"tt";a:1:{i:0;s:7:"tataar
i";}s:3:"tum";a:1:{i:0;s:7:"tumbuka";}s:3:"tup";a:1:{i:0;s:17:"tupilaiset kielet";}s:3:"tut";a:1:{i:0;s:23:"muut altailaiset kielet";}s:3:"tvl";a:1:{i:0;s:6:"tuvalu";}s:2:"tw";a:1:{i:0;s:3:"twi";}s:2:"ty";a:1:{i:0;s:6:"tahiti";}s:3:"tyv";a:1:{i:0;s:7:"tuviini";}s:3:"udm";a:1:{i:0;s:8:"udmurtti";}s:2:"ug";a:1:{i:0;s:7:"uiguuri";}s:3:"uga";a:1:{i:0;s:6:"ugarit";}s:2:"uk";a:1:{i:0;s:7:"ukraina";}s:3:"umb";a:1:{i:0;s:7:"umbundu";}s:3:"und";a:1:{i:0;s:19:"määrittelemätön";}s:2:"ur";a:1:{i:0;s:4:"urdu";}s:2:"uz";a:1:{i:0;s:7:"uzbekki";}s:2:"ve";a:1:{i:0;s:5:"venda";}s:2:"vi";a:1:{i:0;s:7:"vietnam";}s:2:"vo";a:1:{i:0;s:8:"volapük";}s:3:"vot";a:1:{i:0;s:5:"vatja";}s:2:"wa";a:1:{i:0;s:7:"valloni";}s:3:"wak";a:1:{i:0;s:19:"wakasilaiset kielet";}s:3:"wal";a:1:{i:0;s:6:"walamo";}s:3:"war";a:1:{i:0;s:5:"waray";}s:3:"was";a:1:{i:0;s:5:"washo";}s:3:"wen";a:1:{i:0;s:5:"sorbi";}s:2:"wo";a:1:{i:0;s:5:"wolof";}s:3:"xal";a:1:{i:0;s:8:"kalmukki";}s:2:"xh";a:1:{i:0;s:7:"kafferi";}s:3:"yao";a:1:{i:0;s:3:"jao";}s:3:"yap";a:1:{i:0;s:3:"jap";}s:2:"yi";a:1:{i:0;s:5:"jiddi";}s:2:"yo";a:1:{i:0;s:6:"joruba";}s:3:"ypk";a:1:{i:0;s:13:"juppik-kielet";}s:2:"za";a:1:{i:0;s:6:"zhuang";}s:3:"zap";a:1:{i:0;s:10:"zapoteekki";}s:3:"zen";a:1:{i:0;s:6:"zenaga";}s:2:"zh";a:1:{i:0;s:5:"kiina";}s:3:"znd";a:1:{i:0;s:5:"zande";}s:2:"zu";a:1:{i:0;s:4:"zulu";}s:3:"zun";a:1:{i:0;s:4:"zuni";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Scripts";a:21:{s:4:"Arab";a:1:{i:0;s:12:"Arabialainen";}s:4:"Armn";a:1:{i:0;s:13:"Armenialainen";}s:4:"Beng";a:1:{i:0;s:13:"Bengalilainen";}s:4:"Cans";a:1:{i:0;s:42:"Yhdistetyt Kanadan aboriginaalien symbolit";}s:4:"Copt";a:1:{i:0;s:11:"Koptilainen";}s:4:"Cyrl";a:1:{i:0;s:10:"Kyrillinen";}s:4:"Ethi";a:1:{i:0;s:13:"Etiopialainen";}s:4:"Geor";a:1:{i:0;s:13:"Georgialainen";}s:4:"Goth";a:1:{i:0;s:12:"Goottilainen";}s:4:"Grek";a:1:{i:0;s:13:"Kreikkala
inen";}s:4:"Hans";a:1:{i:0;s:18:"Yksinkertainen han";}s:4:"Hant";a:1:{i:0;s:15:"Perinteinen han";}s:4:"Hebr";a:1:{i:0;s:12:"Heprealainen";}s:4:"Ital";a:1:{i:0;s:12:"Vanha italia";}s:4:"Latn";a:1:{i:0;s:12:"Latinalainen";}s:4:"Mong";a:1:{i:0;s:14:"Mongolialainen";}s:4:"Runr";a:1:{i:0;s:14:"Riimukirjaimet";}s:4:"Syrc";a:1:{i:0;s:12:"Syyrialainen";}s:4:"Tibt";a:1:{i:0;s:14:"Tiibetiläinen";}s:4:"Ugar";a:1:{i:0;s:13:"Ugaritilainen";}s:4:"Zyyy";a:1:{i:0;s:7:"Yleinen";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:22:"Buddhalainen kalenteri";}s:7:"chinese";a:1:{i:0;s:21:"Kiinalainen kalenteri";}s:9:"gregorian";a:1:{i:0;s:24:"Gregoriaaninen kalenteri";}s:6:"hebrew";a:1:{i:0;s:21:"Juutalainen kalenteri";}s:7:"islamic";a:1:{i:0;s:22:"Islamilainen kalenteri";}s:13:"islamic-civil";a:1:{i:0;s:29:"Islamilainen siviilikalenteri";}s:8:"japanese";a:1:{i:0;s:22:"Japanilainen kalenteri";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:16:"Suora järjestys";}s:9:"phonebook";a:1:{i:0;s:21:"Osoitekirjajärjestys";}s:6:"pinyin";a:1:{i:0;s:17:"Pinyin-järjestys";}s:6:"stroke";a:1:{i:0;s:16:"Piirtojärjestys";}s:11:"traditional";a:1:{i:0;s:11:"Perinteinen";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:4:{s:9:"gregorian";a:6:{s:11:"AmPmMarkers";a:2:{i:0;s:3:"ap.";i:1;s:3:"ip.";}s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:13:"'klo 'H.mm.ss";i:1;s:9:"H:mm:ss v";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:25:"EEEE'na 'd. MMMM'ta 'yyyy";i:5;s:16:"d. MMMM'ta 'yyyy";i:6;s:8:"d.M.yyyy";i:7;s:8:"d.M.yyyy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:2:"su";i:1;s:2:"ma";i:2;s:2:"ti";i:3;s:2:"ke";i:4;s:2:"to";i:5;s:2:"pe";i:6;s:2:"la";}s:6:"narrow";a:7:{i:0;s:1:"S";i:1;s:1:"M";i:2;s:1:"T";i:3;s:1:"K";i:4;s:1:"T";i:5;s:1:"P";i:6;s:1:"L";}s:4:"wide";a:7:{i:0;s:9:"sunnuntai";i:1;s:9:"maanantai";i:2;s:7:"tiistai";i:3;s:11:"keskiviikko";i:4;s:7:"torstai";i:5;s:9:"perjantai";i:6;s:8:"lauantai";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:4:"ea
a.";i:1;s:4:"jaa.";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:5:"tammi";i:1;s:5:"helmi";i:2;s:6:"maalis";i:3;s:5:"huhti";i:4;s:5:"touko";i:5;s:5:"kesä";i:6;s:6:"heinä";i:7;s:3:"elo";i:8;s:4:"syys";i:9;s:4:"loka";i:10;s:6:"marras";i:11;s:5:"joulu";}s:6:"narrow";a:12:{i:0;s:1:"T";i:1;s:1:"H";i:2;s:1:"M";i:3;s:1:"H";i:4;s:1:"T";i:5;s:1:"K";i:6;s:1:"H";i:7;s:1:"E";i:8;s:1:"S";i:9;s:1:"L";i:10;s:1:"M";i:11;s:1:"J";}s:4:"wide";a:12:{i:0;s:8:"tammikuu";i:1;s:8:"helmikuu";i:2;s:9:"maaliskuu";i:3;s:8:"huhtikuu";i:4;s:8:"toukokuu";i:5;s:8:"kesäkuu";i:6;s:9:"heinäkuu";i:7;s:6:"elokuu";i:8;s:7:"syyskuu";i:9;s:7:"lokakuu";i:10;s:9:"marraskuu";i:11;s:8:"joulukuu";}}}}s:6:"hebrew";a:1:{s:10:"monthNames";a:1:{s:6:"format";a:2:{s:17:"abbreviated:alias";a:1:{i:0;s:41:"fi/calendar/hebrew/monthNames/format/wide";}s:4:"wide";a:13:{i:0;s:10:"Tišrìkuu";i:1;s:11:"Hešvánkuu";i:2;s:10:"Kislévkuu";i:3;s:9:"Tevétkuu";i:4;s:9:"Ševatkuu";i:5;s:8:"Adárkuu";i:6;s:11:"Adárkuu II";i:7;s:9:"Nisánkuu";i:8;s:9:"Ijjárkuu";i:9;s:9:"Sivánkuu";i:10;s:10:"Tammúzkuu";i:11;s:5:"Abkuu";i:12;s:8:"Elúlkuu";}}}}s:7:"islamic";a:1:{s:10:"monthNames";a:1:{s:6:"format";a:2:{s:17:"abbreviated:alias";a:1:{i:0;s:42:"fi/calendar/islamic/monthNames/format/wide";}s:4:"wide";a:12:{i:0;s:9:"Muhárram";i:1;s:6:"Sáfar";i:2;s:17:"Rabíʻ al-áwwal";i:3;s:17:"Rabíʻ al-ákhir";i:4;s:15:"Džumada-l-úla";i:5;s:18:"Džumada-l-ákhira";i:6;s:7:"Radžab";i:7;s:9:"Šaʻbán";i:8;s:8:"Ramadán";i:9;s:7:"Šawwal";i:10;s:10:"Dhu-l-qada";i:11;s:13:"Dhu-l-hiddža";}}}}s:13:"islamic-civil";a:1:{s:16:"monthNames:alias";a:1:{i:0;s:30:"fi/calendar/islamic/monthNames";}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}s:11:"zoneStrings";a:17:{i:0;a:6:{i:0;s:19:"America/Los_Angeles";i:1;s:24:"Tyynenmeren normaaliaika";i:2;s:3:"PST";i:3;s:21:"Tyynenmeren kesäaika";i:4;s:3:"PDT";i:5;s:11:"Los Angeles";}i:1;a:6:{i:0;s:14:"America/Denver";i:1;s:26:"Kalliovuorten normaaliaika";i:2;s:3:"MST";i:3;s:23:"Kalliovuorten kesäaika";i
:4;s:3:"MDT";i:5;s:6:"Denver";}i:2;a:6:{i:0;s:15:"America/Phoenix";i:1;s:26:"Kalliovuorten normaaliaika";i:2;s:3:"MST";i:3;s:26:"Kalliovuorten normaaliaika";i:4;s:3:"MST";i:5;s:7:"Phoenix";}i:3;a:6:{i:0;s:15:"America/Chicago";i:1;s:21:"Keskinen normaaliaika";i:2;s:3:"CST";i:3;s:18:"Keskinen kesäaika";i:4;s:3:"CDT";i:5;s:7:"Chicago";}i:4;a:6:{i:0;s:16:"America/New_York";i:1;s:21:"Itäinen normaaliaika";i:2;s:3:"EST";i:3;s:18:"Itäinen kesäaika";i:4;s:3:"EDT";i:5;s:8:"New York";}i:5;a:6:{i:0;s:20:"America/Indianapolis";i:1;s:21:"Itäinen normaaliaika";i:2;s:3:"EST";i:3;s:21:"Itäinen normaaliaika";i:4;s:3:"EST";i:5;s:12:"Indianapolis";}i:6;a:6:{i:0;s:16:"Pacific/Honolulu";i:1;s:21:"Havaijin normaaliaika";i:2;s:3:"HST";i:3;s:21:"Havaijin normaaliaika";i:4;s:3:"HST";i:5;s:8:"Honolulu";}i:7;a:6:{i:0;s:17:"America/Anchorage";i:1;s:20:"Alaskan normaaliaika";i:2;s:3:"AST";i:3;s:17:"Alaskan kesäaika";i:4;s:3:"ADT";i:5;s:9:"Anchorage";}i:8;a:6:{i:0;s:15:"America/Halifax";i:1;s:21:"Atlantin normaaliaika";i:2;s:3:"AST";i:3;s:18:"Atlantin kesäaika";i:4;s:3:"ADT";i:5;s:7:"Halifax";}i:9;a:6:{i:0;s:16:"America/St_Johns";i:1;s:27:"Newfoundlandin normaaliaika";i:2;s:3:"CNT";i:3;s:24:"Newfoundlandin kesäaika";i:4;s:3:"CDT";i:5;s:9:"St. Johns";}i:10;a:6:{i:0;s:12:"Europe/Paris";i:1;s:27:"Keski-Euroopan normaaliaika";i:2;s:3:"CET";i:3;s:24:"Keski-Euroopan kesäaika";i:4;s:4:"CEST";i:5;s:7:"Pariisi";}i:11;a:6:{i:0;s:7:"Etc/GMT";i:1;s:16:"Greenwichin aika";i:2;s:3:"GMT";i:3;s:16:"Greenwichin aika";i:4;s:3:"GMT";i:5;s:6:"Lontoo";}i:12;a:6:{i:0;s:17:"Africa/Casablanca";i:1;s:16:"Greenwichin aika";i:2;s:3:"GMT";i:3;s:16:"Greenwichin aika";i:4;s:3:"GMT";i:5;s:10:"Casablanca";}i:13;a:6:{i:0;s:14:"Asia/Jerusalem";i:1;s:21:"Israelin normaaliaika";i:2;s:3:"IST";i:3;s:18:"Israelin kesäaika";i:4;s:3:"IDT";i:5;s:9:"Jerusalem";}i:14;a:6:{i:0;s:10:"Asia/Tokyo";i:1;s:20:"Japanin normaaliaika";i:2;s:3:"JST";i:3;s:20:"Japanin normaaliaika";i:4;s:3:"JST";i:5;s:5:"Tokio";}i:15;a:6:{i:0;s:16:"Europe/Bucharest";i:1;s:26:"Itä-Euroopan normaaliaika";
i:2;s:3:"EET";i:3;s:23:"Itä-Euroopan kesäaika";i:4;s:4:"EEST";i:5;s:8:"Bukarest";}i:16;a:6:{i:0;s:13:"Asia/Shanghai";i:1;s:19:"Kiinan normaaliaika";i:2;s:3:"CTT";i:3;s:19:"Kiinan normaaliaika";i:4;s:3:"CDT";i:5;s:8:"Shanghai";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fi_FI.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fi_FI.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fi_FI.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fo.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fo.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fo.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:122:{s:2:"AE";a:1:{i:0;s:20:"Sameindu Emirríkini";}s:2:"AF";a:1:{i:0;s:10:"Afganistan";}s:2:"AG";a:1:{i:0;s:18:"Antigua og Barbuda";}s:2:"AQ";a:1:{i:0;s:9:"Antarktis";}s:2:"AT";a:1:{i:0;s:11:"Eysturríki";}s:2:"AU";a:1:{i:0;s:9:"Avstralia";}s:2:"AZ";a:1:{i:0;s:12:"Aserbajdsjan";}s:2:"BA";a:1:{i:0;s:18:"Bosnia-Hersegovina";}s:2:"BD";a:1:{i:0;s:10:"Bangladesj";}s:2:"BE";a:1:{i:0;s:6:"Belgia";}s:2:"BR";a:1:{i:0;s:8:"Brasilia";}s:2:"BT";a:1:{i:0;s:5:"Butan";}s:2:"BW";a:1:{i:0;s:8:"Botsvana";}s:2:"BY";a:1:{i:0;s:14:"Hvítarussland";}s:2:"BZ";a:1:{i:0;s:5:"Belis";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CF";a:1:{i:0;s:22:"Miðafrikalýðveldið";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:5:"Sveis";}s:2:"CI";a:1:{i:0;s:18:"Fílabeinsstrondin";}s:2:"CL";a:1:{i:0;s:4:"Kili";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:4:"Kina";}s:2:"CO";a:1:{i:0;s:8:"Kolombia";}s:2:"CR";a:1:{i:0;s:10:"Kosta Rika";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:21:"Grønhøvdaoyggjarnar";}s:2:"CY";a:1:{i:0;s:7:"Kýpros";}s:2:"CZ";a:1:{i:0;s:6:"Kekkia";}s:2:"DE";a:1:{i:0;s:9:"Týskland";}s:2:"DK";a:1:{i:0;s:8:"Danmørk";}s:2:"DM";a:1:{i:0;s:8:"Dominika";}s:2:"DO";a:1:{i:0;s:20:"Domingo lýðveldið";}s:2:"EC";a:1:{i:0;s:7:"Ekvador";}s:2:"EE";a:1:{i:0;s:7:"Estland";}s:2:"EG";a:1:{i:0;s:10:"Egyptaland";}s:2:"ES";a:1:{i:0;s:6:"Spania";}s:2:"ET";a:1:{i:0;s:7:"Etiopia";}s:2:"FI";a:1:{i:0;s:8:"Finnland";}s:2:"FM";a:1:{i:0;s:10:"Mikronesia";}s:2:"FO";a:1:{i:0;s:8:"Føroyar";}s:2:"FR";a:1:{i:0;s:8:"Frakland";}s:2:"GQ";a:1:{i:0;s:14:"Ekvator Guinea";}s:2:"GR";a:1:{i:0;s:10:"Grikkaland";}s:2:"GW";a:1:{i:0;s:13:"Guinea Bissau";}s:2:"GY";a:1:{i:0;s:6:"Gujana";}s:2:"HR";a:1:{i:0;s:7:"Kroatia";}s:2:"HU";a:1:{i:0;s:6:"Ungarn";}s:2:"IE";a:1:{i:0;s:7:"Ãrland";}s:2:"IL";a:1:{i:0;s:7:"Ãsrael";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IS";a:1:{i:0;s:7:"Ãsland";}s:2:"IT";a:1:{i:0;s:6:"Italia";}s:2:"JM";a:1:{i:0;s:7:"Jameika";}s:2:"KE";a:1:{i:0;s:5:"Kenja";}s:2:"KG";a:1:{i:0;s:8:"Kirgisia";}s:2:"KH";a:1:{i:0;s:8:"Kambodja"
;}s:2:"KM";a:1:{i:0;s:16:"Komorooyggjarnar";}s:2:"KN";a:1:{i:0;s:20:"Saint Kitts og Nevis";}s:2:"KP";a:1:{i:0;s:13:"Norður-Korea";}s:2:"KR";a:1:{i:0;s:12:"Suður-Korea";}s:2:"KW";a:1:{i:0;s:6:"Kuvait";}s:2:"KZ";a:1:{i:0;s:9:"Kasakstan";}s:2:"LB";a:1:{i:0;s:7:"Libanon";}s:2:"LC";a:1:{i:0;s:11:"Saint Lusia";}s:2:"LI";a:1:{i:0;s:11:"Liktenstein";}s:2:"LS";a:1:{i:0;s:6:"Lesoto";}s:2:"LT";a:1:{i:0;s:6:"Litava";}s:2:"LU";a:1:{i:0;s:10:"Luksemborg";}s:2:"LV";a:1:{i:0;s:8:"Lettland";}s:2:"MA";a:1:{i:0;s:7:"Marokko";}s:2:"MC";a:1:{i:0;s:6:"Monako";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:18:"Marshalloyggjarnar";}s:2:"MK";a:1:{i:0;s:10:"Makedónia";}s:2:"MR";a:1:{i:0;s:10:"Móritania";}s:2:"MU";a:1:{i:0;s:9:"Móritius";}s:2:"MV";a:1:{i:0;s:17:"Maldivuoyggjarnar";}s:2:"MW";a:1:{i:0;s:6:"Malavi";}s:2:"MX";a:1:{i:0;s:7:"Meksiko";}s:2:"MY";a:1:{i:0;s:8:"Maleisia";}s:2:"MZ";a:1:{i:0;s:8:"Mosambik";}s:2:"NI";a:1:{i:0;s:9:"Nikaragua";}s:2:"NL";a:1:{i:0;s:10:"Niðurlond";}s:2:"NO";a:1:{i:0;s:5:"Noreg";}s:2:"NZ";a:1:{i:0;s:11:"Ný Sæland";}s:2:"PE";a:1:{i:0;s:5:"Perú";}s:2:"PG";a:1:{i:0;s:15:"Papua Nýguinea";}s:2:"PH";a:1:{i:0;s:13:"Filipsoyggjar";}s:2:"PL";a:1:{i:0;s:8:"Pólland";}s:2:"PY";a:1:{i:0;s:8:"Paraguei";}s:2:"QA";a:1:{i:0;s:5:"Katar";}s:2:"RO";a:1:{i:0;s:7:"Rumenia";}s:2:"RU";a:1:{i:0;s:8:"Russland";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SA";a:1:{i:0;s:13:"Saudi-Arábia";}s:2:"SB";a:1:{i:0;s:18:"Sálomonoyggjarnar";}s:2:"SC";a:1:{i:0;s:18:"Seyskelloyggjarnar";}s:2:"SE";a:1:{i:0;s:9:"Svøríki";}s:2:"SG";a:1:{i:0;s:8:"Singapor";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:20:"Sao Tome og Prinsipi";}s:2:"SZ";a:1:{i:0;s:9:"Svasiland";}s:2:"TD";a:1:{i:0;s:4:"Kjad";}s:2:"TJ";a:1:{i:0;s:12:"Tadsjikistan";}s:2:"TN";a:1:{i:0;s:7:"Tunesia";}s:2:"TR";a:1:{i:0;s:9:"Turkaland";}s:2:"TT";a:1:{i:0;s:18:"Trinidad og Tobago";}s:2:"TW";a:1:{i:0;s:6:"Teivan";}s:2:"TZ";a:1:{i:0;s:8:"Tansania";}s:2:"UA";a:1:{i:0;s:7:"Ukreina";}s:2:"US";a:1:{i:0;s:21:"Sambandsríki Amerika";}s:2:"UY";a:1:{i:0;s:7:"Uruguei";}s:2:"
UZ";a:1:{i:0;s:10:"Usbekistan";}s:2:"VA";a:1:{i:0;s:7:"Vatikan";}s:2:"VC";a:1:{i:0;s:32:"Saint Vinsent og Grenadinoyggjar";}s:2:"VE";a:1:{i:0;s:9:"Venesuela";}s:2:"WS";a:1:{i:0;s:6:"Sámoa";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"ZA";a:1:{i:0;s:12:"Suðurafrika";}s:2:"ZM";a:1:{i:0;s:6:"Sambia";}s:2:"ZW";a:1:{i:0;s:8:"Simbabvi";}}s:10:"Currencies";a:1:{s:3:"DKK";a:2:{i:0;s:2:"kr";i:1;s:3:"DKK";}}s:9:"Languages";a:1:{s:2:"fo";a:1:{i:0;s:9:"føroyskt";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:17:"EEEE dd MMMM yyyy";i:5;s:11:"d. MMM yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:8:"dd-MM-yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:3:"sun";i:1;s:4:"mán";i:2;s:4:"týs";i:3;s:3:"mik";i:4;s:4:"hós";i:5;s:4:"frí";i:6;s:3:"ley";}s:4:"wide";a:7:{i:0;s:10:"sunnudagur";i:1;s:10:"mánadagur";i:2;s:9:"týsdagur";i:3;s:9:"mikudagur";i:4;s:9:"hósdagur";i:5;s:13:"fríggjadagur";i:6;s:11:"leygardagur";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"jan";i:1;s:3:"feb";i:2;s:3:"mar";i:3;s:3:"apr";i:4;s:3:"mai";i:5;s:3:"jun";i:6;s:3:"jul";i:7;s:3:"aug";i:8;s:3:"sep";i:9;s:3:"okt";i:10;s:3:"nov";i:11;s:3:"des";}s:4:"wide";a:12:{i:0;s:6:"januar";i:1;s:7:"februar";i:2;s:4:"mars";i:3;s:6:"apríl";i:4;s:3:"mai";i:5;s:4:"juni";i:6;s:4:"juli";i:7;s:6:"august";i:8;s:9:"september";i:9;s:7:"oktober";i:10;s:8:"november";i:11;s:8:"desember";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fo_FO.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fo_FO.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fo_FO.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:23:"¤#,##0.00;¤ -#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:14:{s:9:"Countries";a:239:{s:2:"AD";a:1:{i:0;s:7:"Andorre";}s:2:"AE";a:1:{i:0;s:20:"Émirats arabes unis";}s:2:"AF";a:1:{i:0;s:11:"Afghanistan";}s:2:"AG";a:1:{i:0;s:18:"Antigua-et-Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:7:"Albanie";}s:2:"AM";a:1:{i:0;s:8:"Arménie";}s:2:"AN";a:1:{i:0;s:23:"Antilles néerlandaises";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:11:"Antarctique";}s:2:"AR";a:1:{i:0;s:9:"Argentine";}s:2:"AS";a:1:{i:0;s:18:"Samoa américaines";}s:2:"AT";a:1:{i:0;s:8:"Autriche";}s:2:"AU";a:1:{i:0;s:9:"Australie";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:12:"Azerbaïdjan";}s:2:"BA";a:1:{i:0;s:19:"Bosnie-Herzégovine";}s:2:"BB";a:1:{i:0;s:7:"Barbade";}s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BE";a:1:{i:0;s:8:"Belgique";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:8:"Bulgarie";}s:2:"BH";a:1:{i:0;s:8:"Bahreïn";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:8:"Bermudes";}s:2:"BN";a:1:{i:0;s:6:"Brunei";}s:2:"BO";a:1:{i:0;s:7:"Bolivie";}s:2:"BR";a:1:{i:0;s:7:"Brésil";}s:2:"BS";a:1:{i:0;s:7:"Bahamas";}s:2:"BT";a:1:{i:0;s:7:"Bhoutan";}s:2:"BV";a:1:{i:0;s:11:"Île Bouvet";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:8:"Bélarus";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Canada";}s:2:"CC";a:1:{i:0;s:11:"Îles Cocos";}s:2:"CD";a:1:{i:0;s:34:"République démocratique du Congo";}s:2:"CF";a:1:{i:0;s:26:"République centrafricaine";}s:2:"CG";a:1:{i:0;s:5:"Congo";}s:2:"CH";a:1:{i:0;s:6:"Suisse";}s:2:"CI";a:1:{i:0;s:16:"Côte d’Ivoire";}s:2:"CK";a:1:{i:0;s:10:"Îles Cook";}s:2:"CL";a:1:{i:0;s:5:"Chili";}s:2:"CM";a:1:{i:0;s:8:"Cameroun";}s:2:"CN";a:1:{i:0;s:5:"Chine";}s:2:"CO";a:1:{i:0;s:8:"Colombie";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:4:"Cuba";}s:2:"CV";a:1:{i:0;s:8:"Cap Vert";}s:2:"CX";a:1:{i:0;s:14:"Île Christmas";}s:2:"CY";a:1:{i:0;s:6:"Chypre";}s:2:"CZ";a:1:{i:0;s:20:"République tchèque";}s:2:"DE";a:1:{i:0;s:9:"Allemagne";}s:2:"DJ";a:1:{i:0;s:8:"Djibouti";}s:2:"DK";a:
1:{i:0;s:8:"Danemark";}s:2:"DM";a:1:{i:0;s:9:"Dominique";}s:2:"DO";a:1:{i:0;s:23:"République dominicaine";}s:2:"DZ";a:1:{i:0;s:8:"Algérie";}s:2:"EC";a:1:{i:0;s:9:"Équateur";}s:2:"EE";a:1:{i:0;s:7:"Estonie";}s:2:"EG";a:1:{i:0;s:7:"Égypte";}s:2:"EH";a:1:{i:0;s:17:"Sahara occidental";}s:2:"ER";a:1:{i:0;s:10:"Érythrée";}s:2:"ES";a:1:{i:0;s:7:"Espagne";}s:2:"ET";a:1:{i:0;s:9:"Éthiopie";}s:2:"FI";a:1:{i:0;s:8:"Finlande";}s:2:"FJ";a:1:{i:0;s:5:"Fidji";}s:2:"FK";a:1:{i:0;s:25:"Îles Falkland (Malvinas)";}s:2:"FM";a:1:{i:0;s:11:"Micronésie";}s:2:"FO";a:1:{i:0;s:13:"Îles Féroé";}s:2:"FR";a:1:{i:0;s:6:"France";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:11:"Royaume-Uni";}s:2:"GD";a:1:{i:0;s:7:"Grenade";}s:2:"GE";a:1:{i:0;s:8:"Géorgie";}s:2:"GF";a:1:{i:0;s:17:"Guyane française";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:9:"Groenland";}s:2:"GM";a:1:{i:0;s:6:"Gambie";}s:2:"GN";a:1:{i:0;s:7:"Guinée";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:20:"Guinée équatoriale";}s:2:"GR";a:1:{i:0;s:6:"Grèce";}s:2:"GS";a:1:{i:0;s:38:"Géorgie du Sud, Îles Sandwich du Sud";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:14:"Guinée-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HM";a:1:{i:0;s:24:"Îles Heard et MacDonald";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:7:"Croatie";}s:2:"HT";a:1:{i:0;s:6:"Haïti";}s:2:"HU";a:1:{i:0;s:7:"Hongrie";}s:2:"ID";a:1:{i:0;s:10:"Indonésie";}s:2:"IE";a:1:{i:0;s:7:"Irlande";}s:2:"IL";a:1:{i:0;s:7:"Israël";}s:2:"IN";a:1:{i:0;s:4:"Inde";}s:2:"IO";a:1:{i:0;s:43:"Territoire britannique de l’océan indien";}s:2:"IQ";a:1:{i:0;s:4:"Iraq";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:7:"Islande";}s:2:"IT";a:1:{i:0;s:6:"Italie";}s:2:"JM";a:1:{i:0;s:9:"Jamaïque";}s:2:"JO";a:1:{i:0;s:8:"Jordanie";}s:2:"JP";a:1:{i:0;s:5:"Japon";}s:2:"KE";a:1:{i:0;s:5:"Kenya";}s:2:"KG";a:1:{i:0;s:12:"Kirghizistan";}s:2:"KH";a:1:{i:0;s:8:"Cambodge";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i
:0;s:7:"Comores";}s:2:"KN";a:1:{i:0;s:20:"Saint Kitts et Nevis";}s:2:"KP";a:1:{i:0;s:14:"Corée du Nord";}s:2:"KR";a:1:{i:0;s:13:"Corée du Sud";}s:2:"KW";a:1:{i:0;s:7:"Koweït";}s:2:"KY";a:1:{i:0;s:15:"Îles Caïmanes";}s:2:"KZ";a:1:{i:0;s:10:"Kazakhstan";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:5:"Liban";}s:2:"LC";a:1:{i:0;s:12:"Sainte-Lucie";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:8:"Libéria";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:9:"Lithuanie";}s:2:"LU";a:1:{i:0;s:10:"Luxembourg";}s:2:"LV";a:1:{i:0;s:8:"Lettonie";}s:2:"LY";a:1:{i:0;s:5:"Libye";}s:2:"MA";a:1:{i:0;s:5:"Maroc";}s:2:"MC";a:1:{i:0;s:6:"Monaco";}s:2:"MD";a:1:{i:0;s:7:"Moldova";}s:2:"MG";a:1:{i:0;s:10:"Madagascar";}s:2:"MH";a:1:{i:0;s:14:"Îles Marshall";}s:2:"MK";a:1:{i:0;s:10:"Macédoine";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:8:"Mongolie";}s:2:"MO";a:1:{i:0;s:21:"Macao R.A.S. de Chine";}s:2:"MP";a:1:{i:0;s:23:"Îles Mariannes du Nord";}s:2:"MQ";a:1:{i:0;s:10:"Martinique";}s:2:"MR";a:1:{i:0;s:10:"Mauritanie";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malte";}s:2:"MU";a:1:{i:0;s:7:"Maurice";}s:2:"MV";a:1:{i:0;s:8:"Maldives";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:7:"Mexique";}s:2:"MY";a:1:{i:0;s:8:"Malaisie";}s:2:"MZ";a:1:{i:0;s:10:"Mozambique";}s:2:"NA";a:1:{i:0;s:7:"Namibie";}s:2:"NC";a:1:{i:0;s:19:"Nouvelle-Calédonie";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:12:"Île Norfolk";}s:2:"NG";a:1:{i:0;s:8:"Nigéria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:8:"Pays-Bas";}s:2:"NO";a:1:{i:0;s:8:"Norvège";}s:2:"NP";a:1:{i:0;s:6:"Népal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:5:"Niué";}s:2:"NZ";a:1:{i:0;s:17:"Nouvelle-Zélande";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:6:"Pérou";}s:2:"PF";a:1:{i:0;s:21:"Polynésie française";}s:2:"PG";a:1:{i:0;s:26:"Papouasie-Nouvelle-Guinée";}s:2:"PH";a:1:{i:0;s:11:"Philippines";}s:2
:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:7:"Pologne";}s:2:"PM";a:1:{i:0;s:24:"Saint-Pierre-et-Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:10:"Porto Rico";}s:2:"PS";a:1:{i:0;s:22:"Territoire palestinien";}s:2:"PT";a:1:{i:0;s:8:"Portugal";}s:2:"PW";a:1:{i:0;s:6:"Palaos";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Qatar";}s:2:"RE";a:1:{i:0;s:8:"Réunion";}s:2:"RO";a:1:{i:0;s:8:"Roumanie";}s:2:"RU";a:1:{i:0;s:6:"Russie";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:15:"Arabie saoudite";}s:2:"SB";a:1:{i:0;s:13:"Îles Salomon";}s:2:"SC";a:1:{i:0;s:10:"Seychelles";}s:2:"SD";a:1:{i:0;s:6:"Soudan";}s:2:"SE";a:1:{i:0;s:6:"Suède";}s:2:"SG";a:1:{i:0;s:9:"Singapour";}s:2:"SH";a:1:{i:0;s:15:"Sainte-Hélène";}s:2:"SI";a:1:{i:0;s:9:"Slovénie";}s:2:"SJ";a:1:{i:0;s:26:"Svalbard et Île Jan Mayen";}s:2:"SK";a:1:{i:0;s:9:"Slovaquie";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:11:"Saint-Marin";}s:2:"SN";a:1:{i:0;s:9:"Sénégal";}s:2:"SO";a:1:{i:0;s:7:"Somalie";}s:2:"SP";a:1:{i:0;s:6:"Serbie";}s:2:"SR";a:1:{i:0;s:8:"Suriname";}s:2:"ST";a:1:{i:0;s:21:"Sao Tomé-et-Principe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:5:"Syrie";}s:2:"SZ";a:1:{i:0;s:9:"Swaziland";}s:2:"TC";a:1:{i:0;s:23:"Îles Turks et Caïques";}s:2:"TD";a:1:{i:0;s:5:"Tchad";}s:2:"TF";a:1:{i:0;s:28:"Terres australes françaises";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:10:"Thaïlande";}s:2:"TJ";a:1:{i:0;s:11:"Tadjikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:11:"Timor-Leste";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:7:"Tunisie";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:7:"Turquie";}s:2:"TT";a:1:{i:0;s:18:"Trinité-et-Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:7:"Taïwan";}s:2:"TZ";a:1:{i:0;s:8:"Tanzanie";}s:2:"UA";a:1:{i:0;s:7:"Ukraine";}s:2:"UG";a:1:{i:0;s:7:"Ouganda";}s:2:"UM";a:1:{i:0;s:42:"Îles Mineures Éloignées des États-Unis";}s:2:"US";a:1:{i:0;s:11:"États-Unis";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"U
Z";a:1:{i:0;s:12:"Ouzbékistan";}s:2:"VA";a:1:{i:0;s:42:"Saint-Siège (Etat de la Cité du Vatican)";}s:2:"VC";a:1:{i:0;s:31:"Saint-Vincent-et-les Grenadines";}s:2:"VE";a:1:{i:0;s:11:"Vénézuela";}s:2:"VG";a:1:{i:0;s:26:"Îles Vierges Britanniques";}s:2:"VI";a:1:{i:0;s:29:"Îles Vierges des États-Unis";}s:2:"VN";a:1:{i:0;s:8:"Viet Nam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:16:"Wallis et Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:6:"Yémen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:11:"Yougoslavie";}s:2:"ZA";a:1:{i:0;s:14:"Afrique du Sud";}s:2:"ZM";a:1:{i:0;s:6:"Zambie";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:376:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:14:"diner andorran";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:16:"peseta andorrane";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:31:"dirham des Émirats arabes unis";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:7:"afghani";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:7:"afghani";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:21:"franc Affars et Issas";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:24:"lek albanais (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:12:"lek albanais";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:19:"Albanian Lek Valute";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:52:"dollar albanais (certificat de devises étrangères)";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:14:"dram arménien";}s:3:"ANG";a:2:{i:0;s:3:"ANG";i:1;s:27:"florin des Antilles néerl.";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:15:"kwanza angolais";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:27:"kwanza angolais (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:35:"nouveau kwanza angolais (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:38:"kwanza angolais réajusté (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:15:"escudo angolais";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:7:"austral";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:30:"Argentine Peso Moneda Nacional";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:25:"peso argentin (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:13:"peso argentin";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:
20:"schilling autrichien";}s:3:"AUD";a:2:{i:0;s:3:"AUD";i:1;s:17:"dollar australien";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:18:"livre australienne";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:16:"florin d’Aruba";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:19:"Azerbaijanian Manat";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:27:"dinar de Bosnie-Herzegovine";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:38:"mark convertible de Bosnie-Herzegovine";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:35:"nouveau dinar de Bosnie-Herzegovine";}s:3:"BBD";a:2:{i:0;s:3:"BBD";i:1;s:17:"dollar de Barbade";}s:3:"BDT";a:2:{i:0;s:3:"BDT";i:1;s:4:"taka";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:25:"franc belge (convertible)";}s:3:"BEF";a:2:{i:0;s:2:"FB";i:1;s:11:"franc belge";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:23:"franc belge (financier)";}s:3:"BGL";a:2:{i:0;s:3:"BGL";i:1;s:3:"lev";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:26:"lev de Bulgarie socialiste";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:11:"nouveau lef";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:15:"lev (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:40:"lev (certificat de devises étrangères)";}s:3:"BHD";a:2:{i:0;s:3:"BHD";i:1;s:16:"dinar de Bahrein";}s:3:"BIF";a:2:{i:0;s:3:"BIF";i:1;s:16:"franc du Burundi";}s:3:"BMD";a:2:{i:0;s:3:"BMD";i:1;s:19:"dollar des Bermudes";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:18:"livre des Bermudes";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:16:"dollar de Brunei";}s:3:"BOB";a:2:{i:0;s:2:"Bs";i:1;s:9:"boliviano";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:21:"boliviano (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:13:"peso bolivien";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:14:"Bolivian Mvdol";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:28:"nouveau cruzeiro (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:8:"cruzeiro";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:20:"cruzeiro (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:5:"réal";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:15:"nouveau cruzado";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:8:"cruzeiro";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:20:"cruzeiro (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:18:"dollar des Baha
mas";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:17:"livre des Bahamas";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:8:"ngultrum";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:17:"roupie de Bhoutan";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:4:"kyat";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:18:"roupie de Birmanie";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:4:"pula";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:38:"nouveau rouble biélorusse (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:30:"rouble biélorusse (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:18:"rouble biélorusse";}s:3:"BZD";a:2:{i:0;s:3:"BZD";i:1;s:17:"dollar de Bélize";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:30:"dollar du Honduras britannique";}s:3:"CAD";a:2:{i:0;s:3:"CAD";i:1;s:15:"dollar canadien";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:15:"franc congolais";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:34:"franc de la République Congolaise";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:15:"Congolese Zaire";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:45:"franc CFA de la République du Centre Afrique";}s:3:"CHF";a:2:{i:0;s:4:"sFr.";i:1;s:12:"franc suisse";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:21:"dollar des îles Cook";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:14:"condor chilien";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:14:"escudo chilien";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:27:"Chilean Unidades de Fomento";}s:3:"CLP";a:2:{i:0;s:3:"CLP";i:1;s:12:"peso chilien";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:21:"franc CFA camerounais";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:25:"Chinese Jen Min Piao Yuan";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:54:"dollar US chinois (certificat de devises étrangères)";}s:3:"CNY";a:2:{i:0;s:3:"CNY";i:1;s:15:"Yuan Ren-min-bi";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:20:"Colombian Paper Peso";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:19:"franc CFA congolais";}s:3:"COP";a:2:{i:0;s:3:"COP";i:1;s:14:"peso colombien";}s:3:"CRC";a:2:{i:0;s:3:"CRC";i:1;s:5:"colon";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:17:"couronne tchèque";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:17:"couronne tchèque";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:11:"peso cubain";}s:3:"CUX";a:2:{i:
0;s:3:"CUX";i:1;s:42:"certificat de devises étrangères de Cuba";}s:3:"CVE";a:2:{i:0;s:3:"CVE";i:1;s:18:"escudo du Cap-Vert";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:17:"florin de Curacao";}s:3:"CYP";a:2:{i:0;s:3:"CYP";i:1;s:14:"livre cypriote";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:17:"couronne tchèque";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:17:"mark est-allemand";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:13:"deutsche mark";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:18:"sperrmark allemand";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:17:"franc de Djibouti";}s:3:"DKK";a:2:{i:0;s:3:"DKK";i:1;s:16:"couronne danoise";}s:3:"DOP";a:2:{i:0;s:3:"DOP";i:1;s:15:"peso dominicain";}s:3:"DZD";a:2:{i:0;s:3:"DZD";i:1;s:15:"dinar algérien";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:23:"nouveau franc algérien";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:24:"franc germinal algérien";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:5:"sucre";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:45:"unité de valeur constante équatoriale (UVC)";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:19:"couronne estonienne";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:17:"livre égyptienne";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:14:"Eritrean Nakfa";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:16:"peseta espagnole";}s:3:"ETB";a:2:{i:0;s:3:"ETB";i:1;s:4:"birr";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:17:"dollar éthiopien";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:15:"mark finlandais";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:27:"mark finlandais (1860-1962)";}s:3:"FJD";a:2:{i:0;s:3:"FJD";i:1;s:15:"dollar de Fidji";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:13:"livre de Fiji";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:29:"livre des Falkland (Malvinas)";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:21:"Faeroe Islands Kronur";}s:3:"FRF";a:2:{i:0;s:1:"F";i:1;s:15:"franc français";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:30:"franc germinal/franc Poincaré";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:19:"franc CFA gabonnais";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:14:"livre sterling";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:20:"Georgian Kupon Larit";}s:3:"GEL";a:2:{i:0;
s:4:"lari";i:1;s:4:"lari";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:5:"cédi";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:11:"ancien cedi";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:16:"livre ghanéenne";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:16:"cedi revalorisé";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:18:"livre de Gibraltar";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:21:"couronne du Groenland";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:7:"dalasie";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:15:"livre de Gambie";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:14:"franc guinéen";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:26:"franc guinéen (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:4:"syli";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:19:"franc guadeloupéen";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:8:"ekwélé";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:29:"franco de Guinée Equatoriale";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:29:"peseta de Guinée Equatoriale";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:7:"drachme";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:15:"nouveau drachme";}s:3:"GTQ";a:2:{i:0;s:3:"GTQ";i:1;s:7:"quetzal";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:14:"franc guyanais";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:28:"Escudo de Guinée Portugaise";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:26:"Portuguese Guinea Mil Reis";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:22:"peso de Guinée-Bissau";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:16:"dollar de Guyane";}s:3:"HKD";a:2:{i:0;s:3:"HKD";i:1;s:19:"dollar de Hong Kong";}s:3:"HNL";a:2:{i:0;s:3:"HNL";i:1;s:7:"lempira";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:12:"dinar croate";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:4:"kuna";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:6:"gourde";}s:3:"HUF";a:2:{i:0;s:3:"HUF";i:1;s:6:"forint";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:25:"livre d’Irlande du Nord";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:14:"florin de Nica";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:14:"roupie de Java";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:29:"nouvelle roupie indonésienne";}s:3:"IDR";a:2:{i:0;s:3:"IDR";i:1;s:6:"rupiah";}s:3:"IEP";a:2:{i:0;s:3:"IEP";i:1;s:16:"livre irlandaise";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;
s:7:"shékel";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:18:"livre israélienne";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:7:"shékel";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:32:"livre sterling de l’Ile de Man";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:15:"roupie indienne";}s:3:"IQD";a:2:{i:0;s:3:"IQD";i:1;s:13:"dinar irakien";}s:3:"IRR";a:2:{i:0;s:3:"IRR";i:1;s:12:"rial iranien";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:19:"couronne islandaise";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:14:"lire italienne";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:24:"livre sterling de Jersey";}s:3:"JMD";a:2:{i:0;s:3:"JMD";i:1;s:17:"dollar jamaïcain";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:17:"livre jamaïcaine";}s:3:"JOD";a:2:{i:0;s:3:"JOD";i:1;s:15:"dinar jordanien";}s:3:"JPY";a:2:{i:0;s:2:"¥";i:1;s:3:"yen";}s:3:"KES";a:2:{i:0;s:3:"KES";i:1;s:17:"shilling du Kenya";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:16:"som du Kyrgystan";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:10:"vieux riel";}s:3:"KHR";a:2:{i:0;s:3:"KHR";i:1;s:4:"riel";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:18:"dollar de Kiribati";}s:3:"KMF";a:2:{i:0;s:3:"KMF";i:1;s:17:"franc des Comores";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:26:"won du peuple nord-coréen";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:16:"won nord-coréen";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:4:"hwan";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:9:"vieux won";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:15:"won sud-coréen";}s:3:"KWD";a:2:{i:0;s:3:"KWD";i:1;s:15:"dinar koweitien";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:25:"dollar des îles Caïmans";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:20:"rouble du Kazakhstan";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:19:"tenge du Kazakhstan";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:3:"kip";}s:3:"LBP";a:2:{i:0;s:3:"LBP";i:1;s:15:"livre libanaise";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:22:"franc du Liechtenstein";}s:3:"LKR";a:2:{i:0;s:3:"LKR";i:1;s:19:"roupie de Sri Lanka";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:16:"roupie de Ceylan";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:16:"dollar libérien";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:12:"Lesotho Loti";}s:3:"LTL";a:2:{i:0
;s:3:"LTL";i:1;s:18:"Lita de Lithuanian";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:20:"Talonas de Lithuanie";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:20:"franc luxembourgeois";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:11:"lats letton";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:13:"rouble letton";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:51:"lire de l’autorié militaire britannique de Libye";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:12:"dinar Iibyen";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:14:"livre libyenne";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:15:"dirham marocain";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:14:"franc marocain";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:22:"nouveau franc marocain";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:26:"franc Germinal monégasque";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:18:"Moldovan Leu Cupon";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:11:"leu moldave";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:14:"rouble moldave";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:15:"ariary malgache";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:14:"franc malgache";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:26:"dollar des  îles Marshall";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:17:"dinar macédonien";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:29:"dinar macédonien (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:12:"franc malien";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:12:"Myanmar Kyat";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:54:"dollar de Myanmar (certificat de devises étrangères)";}s:3:"MNT";a:2:{i:0;s:3:"MNT";i:1;s:6:"tugrik";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:6:"pataca";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:18:"franc martiniquais";}s:3:"MRO";a:2:{i:0;s:3:"MRO";i:1;s:7:"ouguija";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:13:"lire maltaise";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:14:"livre maltaise";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:26:"roupie de l’île Maurice";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:19:"roupie des Maldives";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:19:"roupie des Maldives";}s:3:"MWK";a:2:{i:0;s:3:"MWK";i:1;s:6:"kwacha";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:15:"livre de Malawi";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:3
6:"peso d’argent mexicain (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:36:"unité de conversion mexicaine (UDI)";}s:3:"MYR";a:2:{i:0;s:3:"MYR";i:1;s:7:"ringgit";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:20:"escudo du Mozambique";}s:3:"MZM";a:2:{i:0;s:3:"MZM";i:1;s:8:"métical";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:17:"dollar de Namibie";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:37:"franc Germinal de Nouvelle Calédonie";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:5:"naira";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:16:"livre nigériane";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:33:"franc CFP des Nouvelles Hébrides";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:7:"cordoba";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:14:"cordoba d’or";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:14:"cordoba d’or";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:19:"florin néerlandais";}s:3:"NOK";a:2:{i:0;s:3:"NOK";i:1;s:21:"couronne norvégienne";}s:3:"NPR";a:2:{i:0;s:3:"NPR";i:1;s:16:"roupie du Népal";}s:3:"NZD";a:2:{i:0;s:3:"NZD";i:1;s:22:"dollar néo-zélandais";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:22:"livre néo-zélandaise";}s:3:"OMR";a:2:{i:0;s:3:"OMR";i:1;s:10:"rial omani";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:15:"Oman Rial Saidi";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:6:"balboa";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:26:"Transdniestria Ruble Kupon";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:22:"nouveau rouble moldave";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:14:"rouble moldave";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:14:"Inti péruvien";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:21:"nouveau sol péruvien";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:13:"sol péruvien";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:4:"kina";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:14:"peso philippin";}s:3:"PKR";a:2:{i:0;s:3:"PKR";i:1;s:18:"roupie du Pakistan";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:55:"dollar US polonais (certificat de devises étrangères)";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:17:"zloty (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:19:"livre palestinienne";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:15:"conto portugais";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i
:1;s:16:"escudo portugais";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:7:"guarani";}s:3:"QAR";a:2:{i:0;s:3:"QAR";i:1;s:13:"rial du Qatar";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:20:"franc de la Réunion";}s:3:"ROL";a:2:{i:0;s:3:"ROL";i:1;s:3:"leu";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:11:"nouveau leu";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:28:"rouble de Russie (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:15:"franc du Rwanda";}s:3:"SAR";a:2:{i:0;s:3:"SAR";i:1;s:15:"riyal séoudien";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:14:"riyal saoudien";}s:3:"SBD";a:2:{i:0;s:3:"SBD";i:1;s:17:"dollar de Salomon";}s:3:"SCR";a:2:{i:0;s:3:"SCR";i:1;s:21:"roupie des Seychelles";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:15:"dinar soudanais";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:16:"livre soudanaise";}s:3:"SEK";a:2:{i:0;s:3:"SEK";i:1;s:18:"couronne suédoise";}s:3:"SGD";a:2:{i:0;s:3:"SGD";i:1;s:19:"dollar de Singapour";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:24:"livre de Sainte-Hélène";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:22:"bons de tolar slovène";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:14:"tolar slovène";}s:3:"SKK";a:2:{i:0;s:3:"SKK";i:1;s:17:"couronne slovaque";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:6:"léone";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:19:"lire de Saint-Marin";}s:3:"SOS";a:2:{i:0;s:3:"SOS";i:1;s:19:"shilling de Somalie";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:19:"shilling de Somalie";}s:3:"SRG";a:2:{i:0;s:3:"SRG";i:1;s:17:"florin du Surinam";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:16:"livre écossaise";}s:3:"STD";a:2:{i:0;s:3:"STD";i:1;s:5:"dobra";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:31:"escudo de Sao Tomé et Principe";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:26:"nouveau rouble soviétique";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:16:"rouble de C.E.I.";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:5:"colon";}s:3:"SYP";a:2:{i:0;s:3:"SYP";i:1;s:14:"livre syrienne";}s:3:"SZL";a:2:{i:0;s:3:"SZL";i:1;s:9:"lilangeni";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:36:"couronne des îles Turks et Caïques";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:18:"franc CFA du Tchad";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;
s:4:"baht";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:21:"rouble du Tadjikistan";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:21:"somoni du Tadjikistan";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:18:"Turkmenistan Manat";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:14:"dinar tunisien";}s:3:"TOP";a:2:{i:0;s:3:"TOP";i:1;s:8:"paʻanga";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:23:"livre sterling du Tonga";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:15:"escudo de Timor";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:15:"pataca de Timor";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:12:"livre turque";}s:3:"TTD";a:2:{i:0;s:3:"TTD";i:1;s:21:"dollar de la Trinité";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:27:"vieux dollar de la Trinité";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:16:"dollar du Tuvalu";}s:3:"TWD";a:2:{i:0;s:3:"TWD";i:1;s:17:"dollar taïwanais";}s:3:"TZS";a:2:{i:0;s:3:"TZS";i:1;s:20:"shilling de Tanzanie";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:7:"hryvnia";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:11:"karbovanetz";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:30:"shilling ougandais (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:18:"shilling ougandais";}s:3:"USD";a:2:{i:0;s:1:"$";i:1;s:22:"dollar des États-Unis";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:36:"dollar des Etats-Unis (jour suivant)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:34:"dollar des Etats-Unis (jour même)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:19:"peso fort uruguayen";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:26:"peso uruguayen (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:14:"peso uruguayen";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:21:"Uzbekistan Coupon Som";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:3:"sum";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:15:"lire du Vatican";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:31:"North Vietnam Piastre Dong Viet";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:28:"nouveau dong nord-vietnamien";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:41:"North Vietnam Viet Minh Piastre Dong Viet";}s:3:"VEB";a:2:{i:0;s:3:"VEB";i:1;s:7:"bolivar";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:37:"dollar des îles Vierges britanniques";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:4:"dong";}s:3:"
VNN";a:2:{i:0;s:3:"VNN";i:1;s:23:"nouveau dong vietnamien";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:35:"dong de la République Vietnamienne";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:24:"dong national du Vietnam";}s:3:"VUV";a:2:{i:0;s:3:"VUV";i:1;s:4:"vatu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:14:"livre du Samoa";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:4:"tala";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:34:"dinar asiatique (unité de compte)";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:16:"franc CFA (BEAC)";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:27:"unité monétaire asiatique";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:2:"Or";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:28:"unité composite européenne";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:29:"unité monétaire européenne";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:34:"unité de compte européenne (XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:34:"unité de compte européenne (XBD)";}s:3:"XCD";a:2:{i:0;s:3:"XCD";i:1;s:20:"dollar des Caraïbes";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:17:"nouveau franc CFA";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:18:"franc CFA (BCEAEC)";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:34:"unité de compte européenne (ECU)";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:8:"franc or";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:9:"franc UIC";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:14:"dinar musulman";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:28:"nouveau franc métropolitain";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:19:"franc CFA antillais";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:17:"franc CFA (BCEAO)";}s:3:"XPF";a:2:{i:0;s:3:"XPF";i:1;s:9:"franc CFP";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:31:"rouble transférable du COMECON";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:15:"dinar du Yémen";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:15:"riyal du Yémen";}s:3:"YER";a:2:{i:0;s:3:"YER";i:1;s:15:"riyal du Yémen";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:24:"nouveau dinar yougoslave";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:35:"dinar de la Fédération Yougoslave";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:21:"dinar yougoslave 1994";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:22:"dinar yougoslave No
viy";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:28:"dinar yougoslave convertible";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:28:"dinar yougoslave d’Octobre";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:26:"dinar yougoslave réformé";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:29:"rand sud-africain (financier)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:19:"livre sud-africaine";}s:3:"ZAR";a:2:{i:0;s:3:"ZAR";i:1;s:4:"rand";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:6:"kwacha";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:15:"livre zambienne";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:14:"nouveau zaïre";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:6:"zaïre";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:18:"dollar du Zimbabwe";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:10:"Calendrier";}s:9:"collation";a:1:{i:0;s:14:"Ordonnancement";}s:8:"currency";a:1:{i:0;s:6:"Devise";}}s:9:"Languages";a:195:{s:2:"aa";a:1:{i:0;s:4:"afar";}s:2:"ab";a:1:{i:0;s:7:"abkhaze";}s:2:"ae";a:1:{i:0;s:9:"avestique";}s:2:"af";a:1:{i:0;s:9:"afrikaans";}s:2:"ak";a:1:{i:0;s:4:"akan";}s:2:"am";a:1:{i:0;s:9:"amharique";}s:2:"an";a:1:{i:0;s:9:"aragonais";}s:2:"ar";a:1:{i:0;s:5:"arabe";}s:2:"as";a:1:{i:0;s:8:"assamais";}s:2:"av";a:1:{i:0;s:4:"avar";}s:2:"ay";a:1:{i:0;s:6:"aymara";}s:2:"az";a:1:{i:0;s:6:"azéri";}s:2:"ba";a:1:{i:0;s:7:"bachkir";}s:2:"be";a:1:{i:0;s:11:"biélorusse";}s:2:"bg";a:1:{i:0;s:7:"bulgare";}s:2:"bh";a:1:{i:0;s:6:"bihari";}s:2:"bi";a:1:{i:0;s:9:"bichlamar";}s:2:"bm";a:1:{i:0;s:7:"bambara";}s:2:"bn";a:1:{i:0;s:7:"bengali";}s:2:"bo";a:1:{i:0;s:9:"tibétain";}s:2:"br";a:1:{i:0;s:6:"breton";}s:2:"bs";a:1:{i:0;s:9:"bosniaque";}s:3:"byn";a:1:{i:0;s:4:"blin";}s:2:"ca";a:1:{i:0;s:7:"catalan";}s:2:"ce";a:1:{i:0;s:12:"tchétchène";}s:2:"ch";a:1:{i:0;s:8:"chamorro";}s:3:"chr";a:1:{i:0;s:8:"cherokee";}s:2:"co";a:1:{i:0;s:5:"corse";}s:2:"cr";a:1:{i:0;s:4:"cree";}s:2:"cs";a:1:{i:0;s:8:"tchèque";}s:2:"cu";a:1:{i:0;s:18:"slavon d’église";}s:2:"cv";a:1:{i:0;s:10:"tchouvache";}s:2:"cy";a:1:{i:0;s:7:"gallois";}s:2:"da";a:1:{i:0;s:6:"danois";}s:2:"de";a:1:{i:0;s:8:"allemand";}s:2:"dv";a:1:{i:0;s:9:"maldivien";}s:2:"dz
";a:1:{i:0;s:8:"dzongkha";}s:2:"ee";a:1:{i:0;s:5:"éwé";}s:2:"el";a:1:{i:0;s:4:"grec";}s:2:"en";a:1:{i:0;s:7:"anglais";}s:2:"eo";a:1:{i:0;s:10:"espéranto";}s:2:"es";a:1:{i:0;s:8:"espagnol";}s:2:"et";a:1:{i:0;s:8:"estonien";}s:2:"eu";a:1:{i:0;s:6:"basque";}s:2:"fa";a:1:{i:0;s:6:"persan";}s:2:"ff";a:1:{i:0;s:4:"peul";}s:2:"fi";a:1:{i:0;s:7:"finnois";}s:2:"fj";a:1:{i:0;s:7:"fidjien";}s:2:"fo";a:1:{i:0;s:9:"féroïen";}s:2:"fr";a:1:{i:0;s:9:"français";}s:2:"fy";a:1:{i:0;s:6:"frison";}s:2:"ga";a:1:{i:0;s:9:"irlandais";}s:2:"gd";a:1:{i:0;s:19:"gaélique écossais";}s:3:"gez";a:1:{i:0;s:6:"guèze";}s:2:"gl";a:1:{i:0;s:8:"galicien";}s:2:"gn";a:1:{i:0;s:7:"guarani";}s:2:"gu";a:1:{i:0;s:9:"goudjrati";}s:2:"gv";a:1:{i:0;s:4:"manx";}s:2:"ha";a:1:{i:0;s:7:"haoussa";}s:3:"haw";a:1:{i:0;s:8:"hawaïen";}s:2:"he";a:1:{i:0;s:7:"hébreu";}s:2:"hi";a:1:{i:0;s:5:"hindi";}s:2:"ho";a:1:{i:0;s:9:"hiri motu";}s:2:"hr";a:1:{i:0;s:6:"croate";}s:2:"ht";a:1:{i:0;s:8:"haïtien";}s:2:"hu";a:1:{i:0;s:8:"hongrois";}s:2:"hy";a:1:{i:0;s:9:"arménien";}s:2:"hz";a:1:{i:0;s:8:"héréro";}s:2:"ia";a:1:{i:0;s:11:"interlingua";}s:2:"id";a:1:{i:0;s:11:"indonésien";}s:2:"ie";a:1:{i:0;s:11:"interlingue";}s:2:"ig";a:1:{i:0;s:4:"igbo";}s:2:"ii";a:1:{i:0;s:13:"yi de Sichuan";}s:2:"ik";a:1:{i:0;s:7:"inupiaq";}s:2:"io";a:1:{i:0;s:3:"ido";}s:2:"is";a:1:{i:0;s:9:"islandais";}s:2:"it";a:1:{i:0;s:7:"italien";}s:2:"iu";a:1:{i:0;s:9:"inuktitut";}s:2:"ja";a:1:{i:0;s:8:"japonais";}s:2:"jv";a:1:{i:0;s:8:"javanais";}s:2:"ka";a:1:{i:0;s:9:"géorgien";}s:2:"kg";a:1:{i:0;s:5:"kongo";}s:2:"ki";a:1:{i:0;s:6:"kikuyu";}s:2:"kj";a:1:{i:0;s:8:"kuanyama";}s:2:"kk";a:1:{i:0;s:6:"kazakh";}s:2:"kl";a:1:{i:0;s:12:"groenlandais";}s:2:"km";a:1:{i:0;s:5:"khmer";}s:2:"kn";a:1:{i:0;s:7:"kannada";}s:2:"ko";a:1:{i:0;s:7:"coréen";}s:3:"kok";a:1:{i:0;s:7:"konkani";}s:2:"kr";a:1:{i:0;s:7:"kanouri";}s:2:"ks";a:1:{i:0;s:8:"kashmiri";}s:2:"ku";a:1:{i:0;s:5:"kurde";}s:2:"kv";a:1:{i:0;s:4:"komi";}s:2:"kw";a:1:{i:0;s:8:"cornique";}s:2:"ky";a:1:{i:0;s:8:"kirghize";}s:2:"la";a:1:{i:0;s:5:"latin";}
s:2:"lb";a:1:{i:0;s:14:"luxembourgeois";}s:2:"lg";a:1:{i:0;s:5:"ganda";}s:2:"li";a:1:{i:0;s:12:"limbourgeois";}s:2:"ln";a:1:{i:0;s:7:"lingala";}s:2:"lo";a:1:{i:0;s:3:"lao";}s:2:"lt";a:1:{i:0;s:9:"lituanien";}s:2:"lu";a:1:{i:0;s:12:"luba-katanga";}s:2:"lv";a:1:{i:0;s:6:"letton";}s:2:"mg";a:1:{i:0;s:8:"malgache";}s:2:"mh";a:1:{i:0;s:8:"marshall";}s:2:"mi";a:1:{i:0;s:5:"maori";}s:2:"mk";a:1:{i:0;s:11:"macédonien";}s:2:"ml";a:1:{i:0;s:9:"malayalam";}s:2:"mn";a:1:{i:0;s:6:"mongol";}s:2:"mo";a:1:{i:0;s:7:"moldave";}s:2:"mr";a:1:{i:0;s:7:"marathe";}s:2:"ms";a:1:{i:0;s:6:"malais";}s:2:"mt";a:1:{i:0;s:7:"maltais";}s:2:"my";a:1:{i:0;s:6:"birman";}s:2:"na";a:1:{i:0;s:7:"nauruan";}s:2:"nb";a:1:{i:0;s:18:"bokmål norvégien";}s:2:"nd";a:1:{i:0;s:18:"ndébélé du Nord";}s:2:"ne";a:1:{i:0;s:9:"népalais";}s:2:"ng";a:1:{i:0;s:6:"ndonga";}s:2:"nl";a:1:{i:0;s:12:"néerlandais";}s:2:"nn";a:1:{i:0;s:18:"nynorsk norvégien";}s:2:"no";a:1:{i:0;s:10:"norvégien";}s:2:"nr";a:1:{i:0;s:17:"ndébélé du Sud";}s:2:"nv";a:1:{i:0;s:6:"navaho";}s:2:"ny";a:1:{i:0;s:6:"nyanja";}s:2:"oc";a:1:{i:0;s:21:"occitan (après 1500)";}s:2:"oj";a:1:{i:0;s:6:"ojibwa";}s:2:"om";a:1:{i:0;s:5:"galla";}s:2:"or";a:1:{i:0;s:5:"oriya";}s:2:"os";a:1:{i:0;s:7:"ossète";}s:2:"pa";a:1:{i:0;s:8:"pendjabi";}s:2:"pi";a:1:{i:0;s:4:"pali";}s:2:"pl";a:1:{i:0;s:8:"polonais";}s:2:"ps";a:1:{i:0;s:6:"pachto";}s:2:"pt";a:1:{i:0;s:9:"portugais";}s:2:"qu";a:1:{i:0;s:7:"quechua";}s:2:"rm";a:1:{i:0;s:12:"rhéto-roman";}s:2:"rn";a:1:{i:0;s:6:"roundi";}s:2:"ro";a:1:{i:0;s:7:"roumain";}s:4:"root";a:1:{i:0;s:6:"racine";}s:2:"ru";a:1:{i:0;s:5:"russe";}s:2:"rw";a:1:{i:0;s:6:"rwanda";}s:2:"sa";a:1:{i:0;s:8:"sanskrit";}s:2:"sc";a:1:{i:0;s:5:"sarde";}s:2:"sd";a:1:{i:0;s:6:"sindhi";}s:2:"se";a:1:{i:0;s:12:"sami du Nord";}s:2:"sg";a:1:{i:0;s:5:"sango";}s:2:"sh";a:1:{i:0;s:12:"serbo-croate";}s:2:"si";a:1:{i:0;s:10:"singhalais";}s:3:"sid";a:1:{i:0;s:6:"sidamo";}s:2:"sk";a:1:{i:0;s:8:"slovaque";}s:2:"sl";a:1:{i:0;s:8:"slovène";}s:2:"sm";a:1:{i:0;s:6:"samoan";}s:2:"sn";a:1:{i:0;s:5:"shona";}s:
2:"so";a:1:{i:0;s:6:"somali";}s:2:"sq";a:1:{i:0;s:8:"albanais";}s:2:"sr";a:1:{i:0;s:5:"serbe";}s:2:"ss";a:1:{i:0;s:5:"swati";}s:2:"st";a:1:{i:0;s:12:"sotho du Sud";}s:2:"su";a:1:{i:0;s:10:"soundanais";}s:2:"sv";a:1:{i:0;s:8:"suédois";}s:2:"sw";a:1:{i:0;s:7:"swahili";}s:3:"syr";a:1:{i:0;s:8:"syriaque";}s:2:"ta";a:1:{i:0;s:6:"tamoul";}s:2:"te";a:1:{i:0;s:9:"télougou";}s:2:"tg";a:1:{i:0;s:6:"tadjik";}s:2:"th";a:1:{i:0;s:5:"thaï";}s:2:"ti";a:1:{i:0;s:8:"tigrigna";}s:3:"tig";a:1:{i:0;s:6:"tigré";}s:2:"tk";a:1:{i:0;s:9:"turkmène";}s:2:"tl";a:1:{i:0;s:7:"tagalog";}s:2:"tn";a:1:{i:0;s:8:"setswana";}s:2:"to";a:1:{i:0;s:20:"tongan (Îles Tonga)";}s:2:"tr";a:1:{i:0;s:4:"turc";}s:2:"ts";a:1:{i:0;s:6:"tsonga";}s:2:"tt";a:1:{i:0;s:5:"tatar";}s:2:"tw";a:1:{i:0;s:3:"twi";}s:2:"ty";a:1:{i:0;s:8:"tahitien";}s:2:"ug";a:1:{i:0;s:8:"ouïgour";}s:2:"uk";a:1:{i:0;s:9:"ukrainien";}s:2:"ur";a:1:{i:0;s:6:"ourdou";}s:2:"uz";a:1:{i:0;s:6:"ouzbek";}s:2:"ve";a:1:{i:0;s:5:"venda";}s:2:"vi";a:1:{i:0;s:10:"vietnamien";}s:2:"vo";a:1:{i:0;s:8:"volapük";}s:2:"wa";a:1:{i:0;s:6:"wallon";}s:2:"wo";a:1:{i:0;s:5:"wolof";}s:2:"xh";a:1:{i:0;s:5:"xhosa";}s:2:"yi";a:1:{i:0;s:7:"yiddish";}s:2:"yo";a:1:{i:0;s:6:"yoruba";}s:2:"za";a:1:{i:0;s:6:"zhuang";}s:2:"zh";a:1:{i:0;s:7:"chinois";}s:2:"zu";a:1:{i:0;s:6:"zoulou";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Scripts";a:55:{s:4:"Arab";a:1:{i:0;s:5:"arabe";}s:4:"Armn";a:1:{i:0;s:9:"arménien";}s:4:"Beng";a:1:{i:0;s:10:"bengâglî";}s:4:"Bopo";a:1:{i:0;s:8:"bopomofo";}s:4:"Brai";a:1:{i:0;s:7:"braille";}s:4:"Buhd";a:1:{i:0;s:7:"bouhide";}s:4:"Cans";a:1:{i:0;s:39:"syllabaire autochthone canadien unifié";}s:4:"Cher";a:1:{i:0;s:10:"tchérokî";}s:4:"Copt";a:1:{i:0;s:5:"copte";}s:4:"Cprt";a:1:{i:0;s:9:"
chypriote";}s:4:"Cyrl";a:1:{i:0;s:10:"cyrillique";}s:4:"Deva";a:1:{i:0;s:13:"dévanâgarî";}s:4:"Dsrt";a:1:{i:0;s:9:"déséret";}s:4:"Ethi";a:1:{i:0;s:11:"éthiopique";}s:4:"Geor";a:1:{i:0;s:9:"géorgien";}s:4:"Goth";a:1:{i:0;s:7:"gotique";}s:4:"Grek";a:1:{i:0;s:4:"grec";}s:4:"Gujr";a:1:{i:0;s:12:"goudjarâtî";}s:4:"Guru";a:1:{i:0;s:11:"gourmoukhî";}s:4:"Hang";a:1:{i:0;s:7:"hangûl";}s:4:"Hani";a:1:{i:0;s:3:"han";}s:4:"Hano";a:1:{i:0;s:9:"hanounóo";}s:4:"Hans";a:1:{i:0;s:14:"han simplifié";}s:4:"Hant";a:1:{i:0;s:16:"han traditionnel";}s:4:"Hebr";a:1:{i:0;s:7:"hébreu";}s:4:"Hira";a:1:{i:0;s:8:"hiragana";}s:4:"Ital";a:1:{i:0;s:15:"ancien italique";}s:4:"Kana";a:1:{i:0;s:8:"katakana";}s:4:"Khmr";a:1:{i:0;s:5:"khmer";}s:4:"Knda";a:1:{i:0;s:7:"kannara";}s:4:"Laoo";a:1:{i:0;s:7:"laotien";}s:4:"Latn";a:1:{i:0;s:5:"latin";}s:4:"Limb";a:1:{i:0;s:6:"limbou";}s:4:"Linb";a:1:{i:0;s:11:"linéaire B";}s:4:"Mlym";a:1:{i:0;s:10:"malayâlam";}s:4:"Mong";a:1:{i:0;s:6:"mongol";}s:4:"Mymr";a:1:{i:0;s:6:"birman";}s:4:"Ogam";a:1:{i:0;s:4:"ogam";}s:4:"Orya";a:1:{i:0;s:6:"oriyâ";}s:4:"Osma";a:1:{i:0;s:8:"osmanais";}s:4:"Qaai";a:1:{i:0;s:8:"hérité";}s:4:"Runr";a:1:{i:0;s:7:"runique";}s:4:"Shaw";a:1:{i:0;s:7:"shavien";}s:4:"Sinh";a:1:{i:0;s:10:"singhalais";}s:4:"Syrc";a:1:{i:0;s:8:"syriaque";}s:4:"Tagb";a:1:{i:0;s:9:"tagbanoua";}s:4:"Tale";a:1:{i:0;s:7:"taï-le";}s:4:"Taml";a:1:{i:0;s:6:"tamoul";}s:4:"Telu";a:1:{i:0;s:9:"télougou";}s:4:"Tglg";a:1:{i:0;s:5:"tagal";}s:4:"Thaa";a:1:{i:0;s:6:"thâna";}s:4:"Thai";a:1:{i:0;s:5:"thaï";}s:4:"Tibt";a:1:{i:0;s:9:"tibétain";}s:4:"Ugar";a:1:{i:0;s:11:"ougaritique";}s:4:"Yiii";a:1:{i:0;s:2:"yi";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:21:"Calendrier bouddhiste";}s:7:"chinese";a:1:{i:0;s:18:"Calendrier chinois";}s:9:"gregorian";a:1:{i:0;s:21:"Calendrier grégorien";}s:6:"hebrew";a:1:{i:0;s:22:"Calendrier hébraïque";}s:7:"islamic";a:1:{i:0;s:19:"Calendrier musulman";}s:13:"islamic-civil";a:1:{i:0;s:25:"Calendrier civil musulman";}s:8:"japanese";a:1:{i:0;s:19:"Calend
rier japonais";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:12:"Ordre direct";}s:9:"phonebook";a:1:{i:0;s:21:"Ordre de l’annuaire";}s:6:"pinyin";a:1:{i:0;s:12:"Ordre pinyin";}s:6:"stroke";a:1:{i:0;s:16:"Ordre des traits";}s:11:"traditional";a:1:{i:0;s:18:"Ordre traditionnel";}}}s:8:"Variants";a:1:{s:7:"REVISED";a:1:{i:0;s:8:"Révisé";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:4:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"HH' h 'mm z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:8:"d MMM yy";i:7;s:10:"dd/MM/yyyy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:4:"dim.";i:1;s:4:"lun.";i:2;s:4:"mar.";i:3;s:4:"mer.";i:4;s:4:"jeu.";i:5;s:4:"ven.";i:6;s:4:"sam.";}s:6:"narrow";a:7:{i:0;s:1:"D";i:1;s:1:"L";i:2;s:1:"M";i:3;s:1:"M";i:4;s:1:"J";i:5;s:1:"V";i:6;s:1:"S";}s:4:"wide";a:7:{i:0;s:8:"dimanche";i:1;s:5:"lundi";i:2;s:5:"mardi";i:3;s:8:"mercredi";i:4;s:5:"jeudi";i:5;s:8:"vendredi";i:6;s:6:"samedi";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:9:"av. J.-C.";i:1;s:9:"ap. J.-C.";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:5:"janv.";i:1;s:6:"févr.";i:2;s:4:"mars";i:3;s:4:"avr.";i:4;s:3:"mai";i:5;s:4:"juin";i:6;s:5:"juil.";i:7;s:5:"août";i:8;s:5:"sept.";i:9;s:4:"oct.";i:10;s:4:"nov.";i:11;s:5:"déc.";}s:6:"narrow";a:12:{i:0;s:1:"J";i:1;s:1:"F";i:2;s:1:"M";i:3;s:1:"A";i:4;s:1:"M";i:5;s:1:"J";i:6;s:1:"J";i:7;s:1:"A";i:8;s:1:"S";i:9;s:1:"O";i:10;s:1:"N";i:11;s:1:"D";}s:4:"wide";a:12:{i:0;s:7:"janvier";i:1;s:8:"février";i:2;s:4:"mars";i:3;s:5:"avril";i:4;s:3:"mai";i:5;s:4:"juin";i:6;s:7:"juillet";i:7;s:5:"août";i:8;s:9:"septembre";i:9;s:7:"octobre";i:10;s:8:"novembre";i:11;s:9:"décembre";}}}}s:6:"hebrew";a:1:{s:10:"monthNames";a:1:{s:6:"format";a:2:{s:17:"abbreviated:alias";a:1:{i:0;s:41:"fr/calendar/hebrew/monthNames/format/wide";}s:4:"wide";a:13:{i:0;s:7:"Tisseri";i:1;s:6:"Hesvan";i:2;s:6:"Kisl
ev";i:3;s:7:"Tébeth";i:4;s:8:"Schébat";i:5;s:4:"Adar";i:6;s:7:"Adar II";i:7;s:6:"Nissan";i:8;s:4:"Iyar";i:9;s:5:"Sivan";i:10;s:6:"Tamouz";i:11;s:2:"Ab";i:12;s:6:"Elloul";}}}}s:7:"islamic";a:1:{s:10:"monthNames";a:1:{s:6:"format";a:2:{s:17:"abbreviated:alias";a:1:{i:0;s:42:"fr/calendar/islamic/monthNames/format/wide";}s:4:"wide";a:12:{i:0;s:9:"Mouharram";i:1;s:5:"Safar";i:2;s:18:"Rabiʻ-oul-Aououal";i:3;s:15:"Rabiʻ-out-Tani";i:4;s:15:"Djoumada-l-Oula";i:5;s:16:"Djoumada-t-Tania";i:6;s:6:"Radjab";i:7;s:8:"Chaʻban";i:8;s:7:"Ramadan";i:9;s:9:"Chaououal";i:10;s:12:"Dou-l-Qaʻda";i:11;s:12:"Dou-l-Hidjja";}}}}s:19:"islamic-civil:alias";a:1:{i:0;s:19:"fr/calendar/islamic";}}s:17:"localPatternChars";a:1:{i:0;s:24:"GaMjkHmsSEDFwWxhKzAeugXZ";}s:11:"zoneStrings";a:20:{i:0;a:6:{i:0;s:17:"America/Vancouver";i:1;s:26:"Heure normale du Pacifique";i:2;s:3:"HNP";i:3;s:27:"Heure avancée du Pacifique";i:4;s:3:"HAP";i:5;s:9:"Vancouver";}i:1;a:6:{i:0;s:19:"America/Los_Angeles";i:1;s:33:"Heure normale du Pacifique (ÉUA)";i:2;s:10:"HNP (ÉUA)";i:3;s:34:"Heure avancée du Pacifique (ÉUA)";i:4;s:10:"HAP (ÉUA)";i:5;s:11:"Los Angeles";}i:2;a:6:{i:0;s:16:"America/Edmonton";i:1;s:27:"Heure normale des Rocheuses";i:2;s:3:"HNR";i:3;s:28:"Heure avancée des Rocheuses";i:4;s:3:"HAR";i:5;s:8:"Edmonton";}i:3;a:6:{i:0;s:14:"America/Denver";i:1;s:34:"Heure normale des Rocheuses (ÉUA)";i:2;s:10:"HNR (ÉUA)";i:3;s:35:"Heure avancée des Rocheuses (ÉUA)";i:4;s:10:"HAR (ÉUA)";i:5;s:6:"Denver";}i:4;a:6:{i:0;s:15:"America/Phoenix";i:1;s:34:"Heure normale des Rocheuses (ÉUA)";i:2;s:10:"HNR (ÉUA)";i:3;s:35:"Heure avancée des Rocheuses (ÉUA)";i:4;s:10:"HAR (ÉUA)";i:5;s:7:"Phoenix";}i:5;a:6:{i:0;s:16:"America/Winnipeg";i:1;s:23:"Heure normale du Centre";i:2;s:3:"HNC";i:3;s:24:"Heure avancée du Centre";i:4;s:3:"HAC";i:5;s:8:"Winnipeg";}i:6;a:6:{i:0;s:15:"America/Chicago";i:1;s:30:"Heure normale du Centre (ÉUA)";i:2;s:10:"HNC (ÉUA)";i:3;s:31:"Heure avancée du Centre (ÉUA)";i:4;s:10:"HAC (ÉUA)";i:5;s:7:"Chicago";}i:7;a:6:{i:0;s:16:"America/M
ontreal";i:1;s:24:"Heure normale de l’Est";i:2;s:3:"HNE";i:3;s:25:"Heure avancée de l’Est";i:4;s:3:"HAE";i:5;s:9:"Montréal";}i:8;a:6:{i:0;s:16:"America/New_York";i:1;s:31:"Heure normale de l’Est (ÉUA)";i:2;s:10:"HNE (ÉUA)";i:3;s:32:"Heure avancée de l’Est (ÉUA)";i:4;s:10:"HAE (ÉUA)";i:5;s:8:"New York";}i:9;a:6:{i:0;s:20:"America/Indianapolis";i:1;s:31:"Heure normale de l’Est (ÉUA)";i:2;s:10:"HNE (ÉUA)";i:3;s:32:"Heure avancée de l’Est (ÉUA)";i:4;s:10:"HAE (ÉUA)";i:5;s:12:"Indianapolis";}i:10;a:6:{i:0;s:16:"Pacific/Honolulu";i:1;s:24:"Heure normale d’Hawaï";i:2;s:3:"HST";i:3;s:25:"Heure avancée d’Hawaï";i:4;s:3:"HDT";i:5;s:8:"Honolulu";}i:11;a:6:{i:0;s:17:"America/Anchorage";i:1;s:27:"Heure normale de l’Alaska";i:2;s:4:"HNAK";i:3;s:28:"Heure avancée de l’Alaska";i:4;s:4:"HAAK";i:5;s:9:"Anchorage";}i:12;a:6:{i:0;s:15:"America/Halifax";i:1;s:31:"Heure normale de l’Atlantique";i:2;s:3:"HNA";i:3;s:32:"Heure avancée de l’Atlantique";i:4;s:3:"HAA";i:5;s:7:"Halifax";}i:13;a:6:{i:0;s:16:"America/St_Johns";i:1;s:28:"Heure normale de Terre-Neuve";i:2;s:3:"HNT";i:3;s:29:"Heure avancée de Terre-Neuve";i:4;s:3:"HAT";i:5;s:25:"Saint-Jean de Terre-Neuve";}i:14;a:6:{i:0;s:12:"Europe/Paris";i:1;s:36:"Heure normale de l’Europe centrale";i:2;s:4:"HNEC";i:3;s:37:"Heure avancée de l’Europe centrale";i:4;s:4:"HAEC";i:5;s:5:"Paris";}i:15;a:6:{i:0;s:7:"Etc/GMT";i:1;s:24:"Temps Moyen de Greenwich";i:2;s:3:"GMT";i:3;s:24:"Temps Moyen de Greenwich";i:4;s:3:"GMT";i:5;s:5:"(GMT)";}i:16;a:6:{i:0;s:14:"Asia/Jerusalem";i:1;s:25:"Heure normale d’Israël";i:2;s:3:"HNI";i:3;s:26:"Heure avancée d’Israël";i:4;s:3:"HAI";i:5;s:10:"Jérusalem";}i:17;a:6:{i:0;s:10:"Asia/Tokyo";i:1;s:22:"Heure normale du Japon";i:2;s:3:"HNJ";i:3;s:23:"Heure avancée du Japon";i:4;s:3:"HAJ";i:5;s:5:"Tokyo";}i:18;a:6:{i:0;s:16:"Europe/Bucharest";i:1;s:38:"Heure normale de l’Europe de l’Est";i:2;s:3:"HEE";i:3;s:39:"Heure avancée de l’Europe de l’Est";i:4;s:4:"HAEE";i:5;s:8:"Bucarest";}i:19;a:6:{i:0;s:13:"Asia/Shan
ghai";i:1;s:22:"Heure normale de Chine";i:2;s:3:"HNC";i:3;s:23:"Heure avancée de Chine";i:4;s:3:"HAC";i:5;s:8:"Shanghai";}}}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_BE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_BE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_BE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:23:"H' h 'mm' min 'ss' s 'z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:9:"dd-MMM-yy";i:7;s:7:"d/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_CA.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_CA.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_CA.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:10:"Currencies";a:2:{s:3:"CAD";a:2:{i:0;s:1:"$";i:1;s:15:"dollar canadien";}s:3:"USD";a:2:{i:0;s:4:"$ US";i:1;s:22:"dollar des États-Unis";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;(#,##0.00¤)";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:1;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:24:"HH' h 'mm' min 'ss' s 'z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:8:"yy-MM-dd";i:7;s:8:"yy-MM-dd";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:7;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_CH.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_CH.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_CH.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:14:"NumberElements";a:12:{i:0;s:1:".";i:1;s:1:"'";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:23:"¤ #,##0.00;¤-#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:14:"HH.mm:ss' h' z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:17:"EEEE, d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:8:"d MMM yy";i:7;s:8:"dd.MM.yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_FR.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_FR.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_FR.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_LU.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_LU.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/fr_LU.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:10:"Currencies";a:2:{s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:15:"franc français";}s:3:"LUF";a:2:{i:0;s:1:"F";i:1;s:20:"franc luxembourgeois";}}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ga.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ga.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ga.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:8:{s:9:"Countries";a:238:{s:2:"AD";a:1:{i:0;s:7:"Andóra";}s:2:"AE";a:1:{i:0;s:36:"Aontas na nÉimíríochtaí Arabacha";}s:2:"AF";a:1:{i:0;s:15:"An Afganastáin";}s:2:"AG";a:1:{i:0;s:20:"Antigua agus Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:10:"An Albáin";}s:2:"AM";a:1:{i:0;s:11:"An Airméin";}s:2:"AN";a:1:{i:0;s:23:"Antillí na hÃsiltíre";}s:2:"AO";a:1:{i:0;s:7:"Angóla";}s:2:"AQ";a:1:{i:0;s:13:"An Antartaice";}s:2:"AR";a:1:{i:0;s:13:"An Airgintín";}s:2:"AS";a:1:{i:0;s:19:"Samó Meiriceánach";}s:2:"AT";a:1:{i:0;s:9:"An Ostair";}s:2:"AU";a:1:{i:0;s:11:"An Astráil";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:16:"An Asarbaiseáin";}s:2:"BA";a:1:{i:0;s:27:"An Bhoisnia-Heirseagaivéin";}s:2:"BB";a:1:{i:0;s:9:"Barbadós";}s:2:"BD";a:1:{i:0;s:16:"An Bhanglaidéis";}s:2:"BE";a:1:{i:0;s:9:"An Bheilg";}s:2:"BF";a:1:{i:0;s:15:"Buircíne Fasó";}s:2:"BG";a:1:{i:0;s:12:"An Bhulgáir";}s:2:"BH";a:1:{i:0;s:8:"Bairéin";}s:2:"BI";a:1:{i:0;s:11:"An Bhurúin";}s:2:"BJ";a:1:{i:0;s:6:"Beinin";}s:2:"BM";a:1:{i:0;s:10:"Beirmiúda";}s:2:"BN";a:1:{i:0;s:8:"Brúiné";}s:2:"BO";a:1:{i:0;s:10:"An Bholaiv";}s:2:"BR";a:1:{i:0;s:12:"An Bhrasaíl";}s:2:"BS";a:1:{i:0;s:12:"Na Bahámaí";}s:2:"BT";a:1:{i:0;s:12:"An Bhútáin";}s:2:"BV";a:1:{i:0;s:15:"Oileáin Bouvet";}s:2:"BW";a:1:{i:0;s:13:"An Bhotsuáin";}s:2:"BY";a:1:{i:0;s:14:"An Bhealarúis";}s:2:"BZ";a:1:{i:0;s:11:"An Bheilís";}s:2:"CA";a:1:{i:0;s:7:"Ceanada";}s:2:"CC";a:1:{i:0;s:24:"Oileáin Cocos (Keeling)";}s:2:"CD";a:1:{i:0;s:32:"Poblacht Dhaonlathach an Chongó";}s:2:"CF";a:1:{i:0;s:26:"Poblacht na hAfraice Láir";}s:2:"CG";a:1:{i:0;s:9:"An Congó";}s:2:"CH";a:1:{i:0;s:11:"An Eilvéis";}s:2:"CI";a:1:{i:0;s:17:"An Cósta Eabhair";}s:2:"CK";a:1:{i:0;s:13:"Oileáin Cook";}s:2:"CL";a:1:{i:0;s:8:"An tSile";}s:2:"CM";a:1:{i:0;s:8:"Camarún";}s:2:"CN";a:1:{i:0;s:8:"An tSín";}s:2:"CO";a:1:{i:0;s:11:"An Cholóim";}s:2:"CR";a:1:{i:0;s:12:"Cósta Ríce";}s:2:"CU";a:1:{i:0;s:5:"Cúba";}s:2:"CV";a:1:{i:0;s:10:"Rinn Verde";}s:2:"CX";a:1:{i:0;s:17:"Oileán
 na Nollag";}s:2:"CY";a:1:{i:0;s:9:"An Chipir";}s:2:"CZ";a:1:{i:0;s:17:"Poblacht na Seice";}s:2:"DE";a:1:{i:0;s:13:"An Ghearmáin";}s:2:"DJ";a:1:{i:0;s:8:"Djibouti";}s:2:"DK";a:1:{i:0;s:12:"An Danmhairg";}s:2:"DM";a:1:{i:0;s:9:"Doiminice";}s:2:"DO";a:1:{i:0;s:26:"An Phoblacht Dhoiminiceach";}s:2:"DZ";a:1:{i:0;s:11:"An Ailgéir";}s:2:"EC";a:1:{i:0;s:9:"Eacuadór";}s:2:"EE";a:1:{i:0;s:11:"An Eastóin";}s:2:"EG";a:1:{i:0;s:10:"An Éigipt";}s:2:"EH";a:1:{i:0;s:16:"An Sahára Thiar";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:10:"An Spáinn";}s:2:"ET";a:1:{i:0;s:10:"An Aetóip";}s:2:"FI";a:1:{i:0;s:13:"An Fhionlainn";}s:2:"FJ";a:1:{i:0;s:6:"Fidsí";}s:2:"FK";a:1:{i:0;s:20:"Oileáin Fháclainne";}s:2:"FM";a:1:{i:0;s:14:"An Mhicrinéis";}s:2:"FO";a:1:{i:0;s:15:"Oileáin Fharó";}s:2:"FR";a:1:{i:0;s:10:"An Fhrainc";}s:2:"GA";a:1:{i:0;s:11:"An Ghabúin";}s:2:"GB";a:1:{i:0;s:20:"An Ríocht Aontaithe";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:12:"An tSeoirsia";}s:2:"GF";a:1:{i:0;s:20:"An Ghuáin Fhrancach";}s:2:"GH";a:1:{i:0;s:5:"Gána";}s:2:"GI";a:1:{i:0;s:11:"Giobráltar";}s:2:"GL";a:1:{i:0;s:14:"An Ghraonlainn";}s:2:"GM";a:1:{i:0;s:11:"An Ghaimbia";}s:2:"GN";a:1:{i:0;s:9:"An Ghuine";}s:2:"GP";a:1:{i:0;s:10:"Guadalúip";}s:2:"GQ";a:1:{i:0;s:25:"An Ghuine Mheánchriosach";}s:2:"GR";a:1:{i:0;s:10:"An Ghréig";}s:2:"GS";a:1:{i:0;s:47:"An tSeoirsia Theas agus Oileáin Sandwich Theas";}s:2:"GT";a:1:{i:0;s:9:"Guatamala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:17:"An Ghuine-Bhissau";}s:2:"GY";a:1:{i:0;s:10:"An Ghuáin";}s:2:"HM";a:1:{i:0;s:36:"Oileán Heard agus Oileáin McDonald";}s:2:"HN";a:1:{i:0;s:9:"Hondúras";}s:2:"HR";a:1:{i:0;s:10:"An Chróit";}s:2:"HT";a:1:{i:0;s:7:"Háití";}s:2:"HU";a:1:{i:0;s:10:"An Ungáir";}s:2:"ID";a:1:{i:0;s:12:"An Indinéis";}s:2:"IE";a:1:{i:0;s:5:"Éire";}s:2:"IL";a:1:{i:0;s:7:"Iosrael";}s:2:"IN";a:1:{i:0;s:8:"An India";}s:2:"IO";a:1:{i:0;s:39:"Críocha Briotanacha an Aigéin Indiagh";}s:2:"IQ";a:1:{i:0;s:10:"An Iaráic";}s:2:"IR";a:1:{i:0;s:10:"An Iaráin";}s:2
:"IS";a:1:{i:0;s:12:"An Ãoslainn";}s:2:"IT";a:1:{i:0;s:10:"An Iodáil";}s:2:"JM";a:1:{i:0;s:8:"Iamáice";}s:2:"JO";a:1:{i:0;s:11:"An Iordáin";}s:2:"JP";a:1:{i:0;s:12:"An tSeapáin";}s:2:"KE";a:1:{i:0;s:11:"An Chéinia";}s:2:"KG";a:1:{i:0;s:16:"An Chirgeastáin";}s:2:"KH";a:1:{i:0;s:12:"An Chambóid";}s:2:"KI";a:1:{i:0;s:11:"Cireabaití";}s:2:"KM";a:1:{i:0;s:17:"Oileáin Chomóra";}s:2:"KN";a:1:{i:0;s:22:"Saint Kitts agus Nevis";}s:2:"KP";a:1:{i:0;s:19:"An Chóiré Thuaidh";}s:2:"KR";a:1:{i:0;s:17:"An Chóiré Theas";}s:2:"KW";a:1:{i:0;s:6:"Cuáit";}s:2:"KY";a:1:{i:0;s:15:"Oileáin Cayman";}s:2:"KZ";a:1:{i:0;s:15:"An Chasacstáin";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:11:"An Liobáin";}s:2:"LC";a:1:{i:0;s:11:"Saint Lucia";}s:2:"LI";a:1:{i:0;s:13:"Lichtinstéin";}s:2:"LK";a:1:{i:0;s:10:"Srí Lanca";}s:2:"LR";a:1:{i:0;s:10:"An Libéir";}s:2:"LS";a:1:{i:0;s:8:"Leosóta";}s:2:"LT";a:1:{i:0;s:12:"An Liotuáin";}s:2:"LU";a:1:{i:0;s:10:"Lucsamburg";}s:2:"LV";a:1:{i:0;s:10:"An Laitvia";}s:2:"LY";a:1:{i:0;s:8:"An Libia";}s:2:"MA";a:1:{i:0;s:7:"Maracó";}s:2:"MC";a:1:{i:0;s:7:"Monacó";}s:2:"MD";a:1:{i:0;s:12:"An Mholdóiv";}s:2:"MG";a:1:{i:0;s:10:"Madagascar";}s:2:"MH";a:1:{i:0;s:17:"Oileáin Marshall";}s:2:"MK";a:1:{i:0;s:13:"An Mhacadóin";}s:2:"ML";a:1:{i:0;s:6:"Mailí";}s:2:"MM";a:1:{i:0;s:7:"Maenmar";}s:2:"MN";a:1:{i:0;s:12:"An Mhongóil";}s:2:"MP";a:1:{i:0;s:24:"Oileáin Mariana Thuaidh";}s:2:"MQ";a:1:{i:0;s:10:"Martinique";}s:2:"MR";a:1:{i:0;s:13:"An Mharatáin";}s:2:"MS";a:1:{i:0;s:9:"Montsarat";}s:2:"MT";a:1:{i:0;s:6:"Málta";}s:2:"MU";a:1:{i:0;s:16:"Oileán Mhuirís";}s:2:"MV";a:1:{i:0;s:10:"Mhaildiví";}s:2:"MW";a:1:{i:0;s:11:"An Mhaláiv";}s:2:"MX";a:1:{i:0;s:9:"Meicsiceo";}s:2:"MY";a:1:{i:0;s:13:"An Mhalaeisia";}s:2:"MZ";a:1:{i:0;s:11:"Mósaimbíc";}s:2:"NA";a:1:{i:0;s:9:"An Namaib";}s:2:"NC";a:1:{i:0;s:17:"An Nua-Chaladóin";}s:2:"NE";a:1:{i:0;s:9:"An Nígir";}s:2:"NF";a:1:{i:0;s:15:"Oileán Norfolk";}s:2:"NG";a:1:{i:0;s:10:"An Nigéir";}s:2:"NI";a:1:{i:0;s:10:"Nicearagua";}s:2:"NL";a:1:{i:0;s:
12:"An Ãsiltír";}s:2:"NO";a:1:{i:0;s:8:"An Iorua";}s:2:"NP";a:1:{i:0;s:7:"Neipeal";}s:2:"NR";a:1:{i:0;s:6:"Nárú";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:17:"An Nua-Shéalainn";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:7:"Peiriú";}s:2:"PF";a:1:{i:0;s:24:"An Pholainéis Fhrancach";}s:2:"PG";a:1:{i:0;s:17:"Nua-Ghuine Phapua";}s:2:"PH";a:1:{i:0;s:27:"Na hOileáin Fhilipíneacha";}s:2:"PK";a:1:{i:0;s:14:"An Phacastáin";}s:2:"PL";a:1:{i:0;s:11:"An Pholainn";}s:2:"PM";a:1:{i:0;s:26:"Saint Pierre agus Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:12:"Portó Ríce";}s:2:"PS";a:1:{i:0;s:27:"Na Críocha Pailistíneacha";}s:2:"PT";a:1:{i:0;s:16:"An Phortaingéil";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:7:"Paragua";}s:2:"QA";a:1:{i:0;s:5:"Catar";}s:2:"RE";a:1:{i:0;s:8:"Réunion";}s:2:"RO";a:1:{i:0;s:11:"An Rómáin";}s:2:"RU";a:1:{i:0;s:19:"Cónaidhm na Rúise";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SA";a:1:{i:0;s:17:"An Araib Shádach";}s:2:"SB";a:1:{i:0;s:16:"Oileáin Solomon";}s:2:"SC";a:1:{i:0;s:12:"Na Séiséil";}s:2:"SD";a:1:{i:0;s:12:"An tSúdáin";}s:2:"SE";a:1:{i:0;s:12:"An tSualainn";}s:2:"SG";a:1:{i:0;s:10:"Singeapór";}s:2:"SH";a:1:{i:0;s:11:"San Héilin";}s:2:"SI";a:1:{i:0;s:13:"An tSlóvéin";}s:2:"SJ";a:1:{i:0;s:23:"Svalbard agus Jan Mayen";}s:2:"SK";a:1:{i:0;s:12:"An tSlóvaic";}s:2:"SL";a:1:{i:0;s:11:"Siarra Leon";}s:2:"SM";a:1:{i:0;s:12:"San Mairíne";}s:2:"SN";a:1:{i:0;s:15:"An tSeineagáil";}s:2:"SO";a:1:{i:0;s:11:"An tSomáil";}s:2:"SP";a:1:{i:0;s:11:"An tSeirbia";}s:2:"SR";a:1:{i:0;s:7:"Suranam";}s:2:"ST";a:1:{i:0;s:22:"Sao Tome agus Principe";}s:2:"SV";a:1:{i:0;s:14:"An tSalvadóir";}s:2:"SY";a:1:{i:0;s:9:"An tSiria";}s:2:"SZ";a:1:{i:0;s:14:"An tSuasalainn";}s:2:"TC";a:1:{i:0;s:26:"Oileáin Turks agus Caicos";}s:2:"TD";a:1:{i:0;s:4:"Sead";}s:2:"TF";a:1:{i:0;s:24:"Críocha Francacha Theas";}s:2:"TG";a:1:{i:0;s:5:"Tóga";}s:2:"TH";a:1:{i:0;s:12:"An Téalainn";}s:2:"TJ";a:1:{i:0;s:20:"An Táidsíceastáin";}s:2:"TK";a:1
:{i:0;s:8:"Tócalá";}s:2:"TL";a:1:{i:0;s:14:"Tíomór-Leste";}s:2:"TM";a:1:{i:0;s:20:"An Tuircméanastáin";}s:2:"TN";a:1:{i:0;s:12:"An Túinéis";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:8:"An Tuirc";}s:2:"TT";a:1:{i:0;s:36:"Oileáin na Tríonóide agus Tobága";}s:2:"TV";a:1:{i:0;s:7:"Tuvalú";}s:2:"TW";a:1:{i:0;s:12:"An Téaváin";}s:2:"TZ";a:1:{i:0;s:11:"An Tansáin";}s:2:"UA";a:1:{i:0;s:11:"An Úcráin";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:31:"Mion-Oileáin Imeallacha S.A.M.";}s:2:"US";a:1:{i:0;s:27:"Stáit Aontaithe Mheiriceá";}s:2:"UY";a:1:{i:0;s:6:"Urugua";}s:2:"UZ";a:1:{i:0;s:17:"Úisbéiceastáin";}s:2:"VA";a:1:{i:0;s:49:"An Chathaoir Naofa (Stát Chathair na Vatacáine)";}s:2:"VC";a:1:{i:0;s:32:"Saint Vincent agus na Grenadines";}s:2:"VE";a:1:{i:0;s:11:"Veiniséala";}s:2:"VG";a:1:{i:0;s:34:"Oileáin Bhriotanacha na Maighdean";}s:2:"VI";a:1:{i:0;s:28:"Oileáin na Maighdean S.A.M.";}s:2:"VN";a:1:{i:0;s:8:"Vítneam";}s:2:"VU";a:1:{i:0;s:8:"Vanuatú";}s:2:"WF";a:1:{i:0;s:29:"Oileáin Vailís agus Futúna";}s:2:"WS";a:1:{i:0;s:5:"Samó";}s:2:"YE";a:1:{i:0;s:6:"Éimin";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:12:"An Iúgslaiv";}s:2:"ZA";a:1:{i:0;s:15:"An Afraic Theas";}s:2:"ZM";a:1:{i:0;s:11:"An tSaimbia";}s:2:"ZW";a:1:{i:0;s:13:"An tSiombáib";}}s:10:"Currencies";a:376:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:15:"Dínear Andóra";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:14:"Peseta Andóra";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:43:"Dirham Aontas na nÉimíríochtaí Arabacha";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:20:"Afgainí (1927-2002)";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:8:"Afgainí";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:23:"Franc Affars agus Issas";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:25:"Lek Albánach (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:13:"Lek Albánach";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:20:"Lek Valute Albánach";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:40:"Teastais Airgeadraí Dollar na hAlbáine";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:16:"Dram Airméanach";}s:3:"ANG";a
:2:{i:0;s:6:"Aà f.";i:1;s:34:"Guilder na nAntillí Ãsiltíreach";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:16:"Kwanza Angólach";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:28:"Kwanza Angólach (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:32:"Kwanza Nua Angólach (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:39:"Kwanza Reajustado Angólach (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:16:"Escudo Angólach";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:22:"Austral Airgintíneach";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:35:"Peso Moneda Nacional Airgintíneach";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:31:"Peso na Airgintíne (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:19:"Peso na Airgintíne";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:17:"Scilling Ostarach";}s:3:"AUD";a:2:{i:0;s:2:"A$";i:1;s:17:"Dollar Astrálach";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:15:"Punt Astrálach";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:13:"Guilder Aruba";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:21:"Manat Asarbaiseánach";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:32:"Dínear Bhoisnia-Heirseagaivéin";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:41:"Marc Inathraithe Bhoisnia-Heirseagaivéin";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:36:"Dínear Nua Bhoisnia-Heirseagaivéin";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:18:"Dollar Bharbadóis";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:22:"Taka Bhanglaidéiseach";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:29:"Franc Beilgeach (inathraithe)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:15:"Franc Beilgeach";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:29:"Franc Beilgeach (airgeadúil)";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:19:"Lev Bulgárach Crua";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:29:"Lev Bulgárach Sóisialaíoch";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:18:"Lev Nua Bulgárach";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:26:"Lev Bulgárach (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:35:"Teastais Airgeadraí Lev Bulgárach";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:20:"Dínear na Bairéine";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:17:"Franc na Burúine";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:18:"Dollar Bheirmiúda
";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:16:"Punt Bheirmiúda";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:16:"Dollar Bhrúiné";}s:3:"BOB";a:2:{i:0;s:2:"Bs";i:1;s:9:"Boliviano";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:21:"Boliviano (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:15:"Peso na Bolaive";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:14:"Mvdol Bolavach";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:38:"Cruzeiro Novo Brasaíleach (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:20:"Cruzado Brasaíleach";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:33:"Cruzeiro Brasaíleach (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:17:"Real Brasaíleach";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:25:"Cruzado Novo Brasaíleach";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:21:"Cruzeiro Brasaíleach";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:33:"Cruzeiro Brasaíleach (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:20:"Dollar na mBahámaí";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:18:"Punt na mBahámaí";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:19:"Ngultrum Bútánach";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:20:"Rúipí na Bútáine";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:12:"Kyat Burmach";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:14:"Rúipí Bhurma";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:16:"Pula Botsuánach";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:38:"Rúbal Nua Béalarúiseach (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:34:"Rúbal Béalarúiseach (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:22:"Rúbal Béalarúiseach";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:18:"Dollar na Beilíse";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:30:"Dollar Hondúrais Bhriotanaigh";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:14:"Dollar Ceanada";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:26:"Franc Congolais an Chongó";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:26:"Franc Phoblacht an Chongó";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:16:"Zaire an Chongó";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:37:"CFA Franc Phoblacht na hAfraice Láir";}s:3:"CHF";a:2:{i:0;s:3:"CHF";i:1;s:19:"Franc na hEilvéise";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:20:"Dollar Oileáin Cook";}s:3:"CL
C";a:2:{i:0;s:3:"CLC";i:1;s:14:"Condor na Sile";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:14:"Escudo na Sile";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:27:"Unidades de Fomento na Sile";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:12:"Peso na Sile";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:20:"CFA Franc Chamarúin";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:26:"Jen Min Piao Yuan Síneach";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:40:"Teastais Airgeadraí Dollar SAM Síneach";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:22:"Yuan Renminbi Síneach";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:26:"Peso Páipéir na Colóime";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:17:"CFA Franc Chongó";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:16:"Peso na Colóime";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:19:"Colon Chósta Ríce";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:23:"Koruna na Seicslóvaice";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:28:"Koruna Crua na Seicslóvaice";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:10:"Peso Cúba";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:27:"Teastais Airgeadraí Chúba";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:21:"Escudo na Rinne Verde";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:15:"Guilder Curacao";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:14:"Punt na Cipire";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:25:"Koruna Phoblacht na Seice";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:26:"Ostmark na hOirGhearmáine";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:13:"Deutsche Mark";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:21:"Sperrmark Gearmánach";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:14:"Franc Djibouti";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:17:"Krone Danmhargach";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:17:"Peso Doimineacach";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:21:"Dínear na hAilgéire";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:20:"Franc Nua Ailgérach";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:25:"Franc Germinal Ailgérach";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:16:"Sucre Eacuadóir";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:42:"Unidad de Valor Constante (UVC) Eacuadóir";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:19:"Kroon na hEastóine";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:17:"Punt na 
hÉigipte";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:18:"Peseta Spáinneach";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:17:"Birr na hAetóipe";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:19:"Dollar na hAetóipe";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"Euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:19:"Markka Fionnlannach";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:31:"Markka Fionnlannach (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:14:"Dollar Fhidsí";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:12:"Punt Fhidsí";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:25:"Punt Oileáin Fháclainne";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:22:"Kronur Oileáin Fharó";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:14:"Franc Francach";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:38:"Franc Germinal Francach/Franc Poincare";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:21:"CFA Franc na Gabúine";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:14:"Punt Steirling";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:22:"Kupon Larit na Grúise";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:15:"Lari na Grúise";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:11:"Cedi Ghána";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:16:"Sean-Cedi Ghána";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:11:"Punt Ghána";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:23:"Cedi Athluachtha Ghána";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:18:"Punt Ghiobráltair";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:20:"Krone na Graonlainne";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:14:"Dalasi Gaimbia";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:12:"Punt Gaimbia";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:11:"Franc Guine";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:23:"Franc Guine (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:10:"Syli Guine";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:16:"Franc Guadeloupe";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:39:"Ekwele Guineana na Guine Meánchriosaí";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:30:"Franco na Guine Meánchriosaí";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:39:"Peseta Guineana na Guine Meánchriosaí";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:17:"Drachma Gréagach";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:21:"Drachma Nua Gréagach";}s:3:"GTQ";a:2:{i:0
;s:1:"Q";i:1;s:17:"Quetzal Guatamala";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:32:"Franc Guiana na Guáine Francaí";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:31:"Escudo na Guine Portaingéalaí";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:33:"Mil Reis na Guine Portaingéalaí";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:18:"Peso Guine-Bhissau";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:17:"Dollar na Guáine";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:16:"Dollar Hong Cong";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:18:"Lempira Hondúrais";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:18:"Dínear na Cróite";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:13:"Kuna Crótach";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:14:"Gourde Háití";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:16:"Forint Ungárach";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:25:"Punt Thuaisceart Éireann";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:26:"Nica Guilder Indinéiseach";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:25:"Java Rupiah Indinéiseach";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:24:"Rupiah Nua Indinéiseach";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:20:"Rupiah Indinéiseach";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:16:"Punt Éireannach";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:17:"Sheqel Iosraelach";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:15:"Punt Iosraelach";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:21:"Sheqel Nua Iosraelach";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:30:"Punt Steirling Oileán Mhanann";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:13:"Rúipí India";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:16:"Dínear Irácach";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:14:"Rial Iaránach";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:17:"Krona Ãoslannach";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:14:"Lira Iodálach";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:23:"Punt Steirling Gheirsí";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:16:"Dollar Iamácach";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:14:"Punt Iamácach";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:18:"Dínear Iordánach";}s:3:"JPY";a:2:{i:0;s:2:"Â¥";i:1;s:14:"Yen Seapánach";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:18:"Scilling Céiniach";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:
20:"Som na Cirgeastáine";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:22:"Sean-Riel na Cambóide";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:17:"Riel na Cambóide";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:19:"Dollar Chireabaití";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:14:"Franc Chomóra";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:33:"Won Na nDaoine na Cóiré Thuaidh";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:22:"Won na Cóiré Thuaidh";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:21:"Hwan na Cóiré Theas";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:25:"Sean-Won na Cóiré Theas";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:20:"Won na Cóiré Theas";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:16:"Dínear Cuátach";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:22:"Dollar Oileáin Cayman";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:20:"Rúbal Casacstánach";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:19:"Tenge Casacstánach";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:11:"Kip Laosach";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:17:"Punt na Liobáine";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:19:"Franc Lichtinstéin";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:18:"Rúipí Srí Lanca";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:20:"Rúipí na Siolióne";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:18:"Dollar na Libéire";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:13:"Loti Leosóta";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:16:"Lita Liotuánach";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:19:"Talonas Liotuánach";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:16:"Franc Lucsamburg";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:14:"Lats Laitviach";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:16:"Rúbal Laitviach";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:39:"Lira Údarás Míleata Briotanach Libia";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:13:"Dínear Libia";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:10:"Punt Libia";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:15:"Dirham Mharacó";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:14:"Franc Mharacó";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:22:"Franc Nouveau Mhonacó";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:23:"Franc Germinal Mhonacó";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:23:"Leu Cúpóin Moldóvach";}s:3:"MDL";a:2:{i
:0;s:3:"MDL";i:1;s:14:"Leu Moldóvach";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:26:"Rúbal Cúpóin Moldóvach";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:17:"Ariary Madagascar";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:16:"Franc Madagascar";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:24:"Dollar Oileáin Marshall";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:19:"Denar na Macadóine";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:31:"Denar na Macadóine (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:13:"Franc Mhailí";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:13:"Kyat Mhaenmar";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:34:"Teastais Airgeadra Dollar Mhaenmar";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:17:"Tugrik Mongólach";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:12:"Pataca Macao";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:16:"Franc Martinique";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:21:"Ouguiya na Maratáine";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:12:"Lira Maltach";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:12:"Punt Maltach";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:24:"Rúipí Oileán Mhuirís";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:23:"Maldive Islands Rúipí";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:23:"Maldive Islands Rufiyaa";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:18:"Kwacha na Maláive";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:16:"Punt na Maláive";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:14:"Peso Meicsiceo";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:33:"Peso Airgid Meicsiceo (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:35:"Unidad de Inversion (UDI) Meicsiceo";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:17:"Ringgit Malaeisia";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:19:"Escudo Mósaimbíce";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:20:"Metical Mósaimbíce";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:17:"Dollar na Namaibe";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:33:"Franc Germinal na Nua-Chaladóine";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:17:"Naira Nígéarach";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:16:"Punt Nígéarach";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:24:"CFP Franc Nua-Inse Ghall";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:18:"Cordoba Nicearagua";}s:3:"NIG";a:2:{i:0
;s:3:"NIG";i:1;s:22:"Cordoba Ór Nicearagua";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:22:"Cordoba Oro Nicearagua";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:21:"Guilder Ãsiltíreach";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:13:"Krone Ioruach";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:17:"Rúipí Neipeáil";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:25:"Dollar na Nua-Shéalainne";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:23:"Punt na Nua-Shéalainne";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:10:"Rial Omain";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:16:"Rial Saidi Omain";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:15:"Balboa Panamach";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:29:"Rúbal Cupóin Transdniestria";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:25:"Rúbal Nua Transdniestria";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:21:"Transdniestria Rúbal";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:13:"Inti Pheiriú";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:18:"Sol Nuevo Pheiriú";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:12:"Sol Pheiriú";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:22:"Kina Nua-Ghuine Phapua";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:17:"Peso Filipíneach";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:22:"Rúipí na Pacastáine";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:15:"Zloty Polannach";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:39:"Teastais Airgeadra Dollar SAM Polannach";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:27:"Zloty Polannach (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:19:"Punt Pailistíneach";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:21:"Conto Portaingéalach";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:21:"Escudo Portaingélach";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:16:"Guarani Pharagua";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:13:"Rial Catarach";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:14:"Franc Réunion";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:14:"Leu Rómánach";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:18:"Leu Nua Rómánach";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:16:"Rúbal Rúiseach";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:28:"Rúbal Rúiseach (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:12:"Franc Ruanda";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:13:"Riyal SÃ
¡dach";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:23:"Dollar Oileáin Solomon";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:20:"Rúipí na Séiséil";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:20:"Dínear na Súdáine";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:17:"Punt na Súdáine";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:16:"Krona Sualannach";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:18:"Dollar Singeapóir";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:16:"Punt San Héilin";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:23:"Tolar Bons Slóvéanach";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:17:"Tolar Slóvénach";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:19:"Koruna na Slóvaice";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:18:"Leone Shiarra Leon";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:15:"Lira San Marino";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:21:"Scilling na Sómáile";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:17:"Guilder Shuranaim";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:13:"Punt Albanach";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:28:"Dobra Sao Tome agus Principe";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:29:"Escudo Sao Tome agus Principe";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:22:"Rúbal Nua Sóvéadach";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:18:"Rúbal Sóvéadach";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:20:"Colon na Salvadóire";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:10:"Punt Siria";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:24:"Lilangeni na Suasalainne";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:14:"CFA Franc Sead";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:18:"Baht na Téalainne";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:28:"Rúbal na Táidsíceastáine";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:28:"Somoni na Táidsíceastáine";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:30:"Manat na An Tuircméanastáine";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:21:"Dínear na Túinéise";}s:3:"TOP";a:2:{i:0;s:2:"T$";i:1;s:14:"PaÊ»anga Tonga";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:20:"Punt Steirling Tonga";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:16:"Escudo Tíomóir";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:16:"Pataca Tíomóir";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:12:"Lira Turcach";}s:3:"TTD";a:2:{i:0;
s:3:"TT$";i:1;s:43:"Dollar Oileáin na Tríonóide agus Tobága";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:48:"Sean-Dollar Oileáin na Tríonóide agus Tobága";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:13:"Dollar Tuvalu";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:24:"Dollar Nua na Téaváine";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:21:"Scilling na Tansáine";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:18:"Hryvnia Úcránach";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:22:"Karbovanetz Úcránach";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:27:"Scilling Uganda (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:15:"Scilling Uganda";}s:3:"USD";a:2:{i:0;s:1:"$";i:1;s:13:"Dollar S.A.M.";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:34:"Dollar S.A.M. (an chéad lá eile)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:29:"Dollar S.A.M. (an la céanna)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:18:"Peso Fuerte Uragua";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:23:"Peso Uragua (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:20:"Peso Uruguayo Uragua";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:35:"Som Cúpóin na hÚisbéiceastáine";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:26:"Sum na hÚisbéiceastáine";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:18:"Lira na Vatacáine";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:34:"Piastre Dong Viet Vítneam Thuaidh";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:25:"Dong Nua Vítneam Thuaidh";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:44:"Viet Minh Piastre Dong Viet Vítneam Thuaidh";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:19:"Bolivar Veiniséala";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:41:"Dollar Oileáin Bhriotanacha na Maighdean";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:16:"Dong Vítneamach";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:20:"Dong Nua Vítneamach";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:24:"Dong Phoblacht Vítneaim";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:28:"Dong Náisiúnta Vítneamach";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:13:"Vatu Vanuatú";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:16:"Punt Samó Thiar";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:16:"Tala Samó Thiar";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:32:"Dínear Ãiseach Unit of Ac
count";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:14:"CFA Franc BEAC";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:31:"Aonad Airgeadaíochta na hÃise";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:3:"Ór";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:23:"Aonad Ilchodach Eorpach";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:29:"Aonad Airgeadaíochta Eorpach";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:27:"Aonad Cuntais Eorpach (XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:27:"Aonad Cuntais Eorpach (XBD)";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:26:"Dollar Oirthear na Cairibe";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:17:"CFA Nouveau Franc";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:29:"Cearta Speisialta Tarraingthe";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:16:"CFA Franc BCEAEC";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:23:"Aonad Airgeadra Eorpach";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:18:"Franc Ór Francach";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:18:"UIC-Franc Francach";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:17:"Dínear Ioslamach";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:38:"Nouveau Franc Ceannchathartha Francach";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:31:"CFA Franc na nAntillí Francach";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:15:"CFA Franc BCEAO";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:9:"CFP Franc";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:26:"Rúbal Inaistrithe COMECON";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:14:"Dínear Éimin";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:18:"Imadi Riyal Éimin";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:11:"Rial Éimin";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:24:"Dínear Crua Iúgslavach";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:33:"Dínear Chónaidhm na hIúgslaive";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:24:"Dínear 1994 Iúgslavach";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:23:"Noviy Dinar Iúgslavach";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:31:"Dínear Inathraithe Iúgslavach";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:37:"Dínear Dheireadh Fómhar Iúgslavach";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:29:"Dínear Leasaithe Iúgslavach";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:36:"Rand na hAfraice Theas (airgeadúil)";}s:3:"ZAP";a:2:{i:0;s:3
:"ZAP";i:1;s:22:"Punt na hAfraice Theas";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:22:"Rand na hAfraice Theas";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:16:"Kwacha Saimbiach";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:14:"Punt Saimbiach";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:20:"Zaire Nua Sáíreach";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:16:"Zaire Sáíreach";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:18:"Dollar Siombábach";}}s:9:"Languages";a:120:{s:2:"aa";a:1:{i:0;s:4:"Afar";}s:2:"ab";a:1:{i:0;s:9:"Abcáisis";}s:2:"ae";a:1:{i:0;s:10:"Aivéistis";}s:2:"af";a:1:{i:0;s:11:"Afracáinis";}s:2:"ar";a:1:{i:0;s:7:"Araibis";}s:2:"as";a:1:{i:0;s:7:"Asaimis";}s:2:"az";a:1:{i:0;s:15:"Asarbaiseáinis";}s:2:"ba";a:1:{i:0;s:10:"Baiscíris";}s:2:"be";a:1:{i:0;s:12:"Bealarúisis";}s:2:"bg";a:1:{i:0;s:10:"Bulgáiris";}s:2:"bn";a:1:{i:0;s:11:"Beangálais";}s:2:"bo";a:1:{i:0;s:10:"Tibéadais";}s:2:"br";a:1:{i:0;s:11:"Briotáinis";}s:2:"bs";a:1:{i:0;s:7:"Boisnis";}s:2:"ca";a:1:{i:0;s:11:"Catalóinis";}s:2:"ce";a:1:{i:0;s:7:"Sisinis";}s:2:"co";a:1:{i:0;s:9:"Corsaicis";}s:2:"cr";a:1:{i:0;s:8:"Craíais";}s:2:"cs";a:1:{i:0;s:6:"Seicis";}s:2:"cu";a:1:{i:0;s:20:"Slavais na hEaglaise";}s:2:"cv";a:1:{i:0;s:8:"Suvaisis";}s:2:"cy";a:1:{i:0;s:9:"Breatnais";}s:2:"da";a:1:{i:0;s:11:"Danmhairgis";}s:2:"de";a:1:{i:0;s:11:"Gearmáinis";}s:2:"el";a:1:{i:0;s:8:"Gréigis";}s:2:"en";a:1:{i:0;s:7:"Béarla";}s:2:"eo";a:1:{i:0;s:9:"Esperanto";}s:2:"es";a:1:{i:0;s:9:"Spáinnis";}s:2:"et";a:1:{i:0;s:10:"Eastóinis";}s:2:"eu";a:1:{i:0;s:7:"Bascais";}s:2:"fa";a:1:{i:0;s:7:"Peirsis";}s:2:"fi";a:1:{i:0;s:12:"Fionnlainnis";}s:2:"fj";a:1:{i:0;s:6:"Fidsis";}s:2:"fo";a:1:{i:0;s:7:"Faróis";}s:2:"fr";a:1:{i:0;s:8:"Fraincis";}s:2:"fy";a:1:{i:0;s:13:"Freaslainnais";}s:2:"ga";a:1:{i:0;s:7:"Gaeilge";}s:2:"gd";a:1:{i:0;s:17:"Gaeilge na hAlban";}s:2:"gu";a:1:{i:0;s:14:"Gúisearáitis";}s:2:"gv";a:1:{i:0;s:9:"Mannainis";}s:3:"haw";a:1:{i:0;s:10:"Haváíais";}s:2:"he";a:1:{i:0;s:8:"Eabhrais";}s:2:"hi";a:1:{i:0;s:9:"Hiondúis";}s:2:"hr";a:1:{i:0;s:8:"Cróitis";}s:2:"hu";a:1:{i:0;s:9:"Ungáiris";}s:2:"hy";
a:1:{i:0;s:10:"Airméinis";}s:2:"ia";a:1:{i:0;s:11:"Interlingua";}s:2:"id";a:1:{i:0;s:11:"Indinéisis";}s:2:"ie";a:1:{i:0;s:11:"Interlingue";}s:2:"ik";a:1:{i:0;s:7:"Inupiaq";}s:2:"io";a:1:{i:0;s:3:"Ido";}s:2:"is";a:1:{i:0;s:12:"Ãoslainnais";}s:2:"it";a:1:{i:0;s:9:"Iodáilis";}s:2:"iu";a:1:{i:0;s:9:"Ionúitis";}s:2:"ja";a:1:{i:0;s:10:"Seapáinis";}s:2:"jv";a:1:{i:0;s:7:"Iávais";}s:2:"ka";a:1:{i:0;s:8:"Seoirsis";}s:2:"kk";a:1:{i:0;s:9:"Casachais";}s:2:"kn";a:1:{i:0;s:9:"Cannadais";}s:2:"ko";a:1:{i:0;s:9:"Cóiréis";}s:2:"ks";a:1:{i:0;s:10:"Caismíris";}s:2:"kw";a:1:{i:0;s:7:"Cornais";}s:2:"ky";a:1:{i:0;s:10:"Cirgeasais";}s:2:"la";a:1:{i:0;s:6:"Laidin";}s:2:"lb";a:1:{i:0;s:14:"Leitseabuirgis";}s:2:"lo";a:1:{i:0;s:7:"Laosais";}s:2:"lt";a:1:{i:0;s:11:"Liotuáinis";}s:2:"lv";a:1:{i:0;s:7:"Laitvis";}s:2:"mg";a:1:{i:0;s:11:"Malagásais";}s:2:"mi";a:1:{i:0;s:7:"Maorais";}s:2:"mk";a:1:{i:0;s:11:"Macadóinis";}s:2:"ml";a:1:{i:0;s:13:"Mailéalaimis";}s:2:"mn";a:1:{i:0;s:10:"Mongóilis";}s:2:"mo";a:1:{i:0;s:10:"Moldáivis";}s:2:"mr";a:1:{i:0;s:8:"Maraitis";}s:2:"mt";a:1:{i:0;s:7:"Maltais";}s:2:"my";a:1:{i:0;s:7:"Burmais";}s:2:"na";a:1:{i:0;s:8:"Nárúis";}s:2:"nb";a:1:{i:0;s:15:"Ioruais BokmÃ¥l";}s:2:"ne";a:1:{i:0;s:10:"Neipealais";}s:2:"nl";a:1:{i:0;s:10:"Ollainnais";}s:2:"nn";a:1:{i:0;s:15:"Ioruais Nynorsk";}s:2:"no";a:1:{i:0;s:7:"Ioruais";}s:2:"nv";a:1:{i:0;s:10:"Navachóis";}s:2:"oc";a:1:{i:0;s:38:"Ocatáinis (tar éis 1500); Provençal";}s:2:"os";a:1:{i:0;s:10:"Óiséitis";}s:2:"pa";a:1:{i:0;s:11:"Puinseaibis";}s:2:"pl";a:1:{i:0;s:9:"Polainnis";}s:2:"ps";a:1:{i:0;s:7:"Paisteo";}s:2:"pt";a:1:{i:0;s:14:"Portaingéilis";}s:2:"qu";a:1:{i:0;s:9:"Ceatsuais";}s:2:"ro";a:1:{i:0;s:9:"Romáinis";}s:2:"ru";a:1:{i:0;s:7:"Rúisis";}s:2:"sa";a:1:{i:0;s:9:"Sanscrait";}s:2:"sc";a:1:{i:0;s:10:"Sairdínis";}s:2:"sd";a:1:{i:0;s:6:"Sindis";}s:2:"se";a:1:{i:0;s:15:"Sáimis Thuaidh";}s:2:"sh";a:1:{i:0;s:17:"Seirbea-Chróitis";}s:2:"sk";a:1:{i:0;s:10:"Slóvacais";}s:2:"sl";a:1:{i:0;s:11:"Slóvéinis";}s:2:"sm";a:1:{i:0;s:7:"Samóis";}s:2:"so
";a:1:{i:0;s:9:"Somálais";}s:2:"sq";a:1:{i:0;s:9:"Albáinis";}s:2:"sr";a:1:{i:0;s:7:"Seirbis";}s:2:"sv";a:1:{i:0;s:10:"Sualainnis";}s:2:"sw";a:1:{i:0;s:10:"Svahaílis";}s:2:"ta";a:1:{i:0;s:8:"Tamailis";}s:2:"th";a:1:{i:0;s:11:"Téalainnis";}s:2:"tl";a:1:{i:0;s:11:"Tagálaigis";}s:2:"tr";a:1:{i:0;s:7:"Tuircis";}s:2:"tt";a:1:{i:0;s:8:"Tatarais";}s:2:"ty";a:1:{i:0;s:9:"Taihítis";}s:2:"uk";a:1:{i:0;s:10:"Úcráinis";}s:2:"ur";a:1:{i:0;s:6:"Urdais";}s:2:"uz";a:1:{i:0;s:11:"Úisbéicis";}s:2:"vi";a:1:{i:0;s:11:"Vítneamais";}s:2:"wa";a:1:{i:0;s:10:"Vallúnais";}s:2:"yi";a:1:{i:0;s:8:"Giúdais";}s:2:"zh";a:1:{i:0;s:6:"Sínis";}s:2:"zu";a:1:{i:0;s:8:"Súlúis";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:4:{s:11:"AmPmMarkers";a:2:{i:0;s:4:"a.m.";i:1;s:4:"p.m.";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:4:"Domh";i:1;s:4:"Luan";i:2;s:6:"Máirt";i:3;s:5:"Céad";i:4;s:5:"Déar";i:5;s:5:"Aoine";i:6;s:4:"Sath";}s:4:"wide";a:7:{i:0;s:13:"Dé Domhnaigh";i:1;s:9:"Dé Luain";i:2;s:10:"Dé Máirt";i:3;s:13:"Dé Céadaoin";i:4;s:10:"Déardaoin";i:5;s:10:"Dé hAoine";i:6;s:12:"Dé Sathairn";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:2:"RC";i:1;s:2:"AD";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"Ean";i:1;s:5:"Feabh";i:2;s:6:"Márta";i:3;s:3:"Aib";i:4;s:4:"Beal";i:5;s:5:"Meith";i:6;s:5:"Iúil";i:7;s:4:"Lún";i:8;s:6:"MFómh";i:9;s:6:"DFómh";i:10;s:4:"Samh";i:11;s:4:"Noll";}s:4:"wide";a:12:{i:0;s:7:"Eanáir";i:1;s:7:"Feabhra";i:2;s:6:"Márta";i:3;s:8:"Aibreán";i:4;s:9:"Bealtaine";i:5;s:9:"Meitheamh";i:6;s:5:"Iúil";i:7;s:7:"Lúnasa";i:8;s:14:"Meán Fómhair";i:9;s:17:"Deireadh Fómhair";i:10;s:7:"Samhain";i:11;s:7:"Nollaig";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"RbMLkUnsSElFtTauKcBeyrAC";}s:11:"zoneStrings";a:4:{i:0;a:6:{i:0;s:13:"Europe/Dublin";i:1;s:18:"Meán-Am Greenwich";i:2;s:3:"MAG";i:3;s:25:"Am Samhraidh na hÉireann";i:4;s:4:"ASÉ";i:5;s:18:"Baile Ãtha Cliath";}i:1;a:6:{i:0;s:13:"Euro
pe/London";i:1;s:18:"Meán-Am Greenwich";i:2;s:3:"MAG";i:3;s:25:"Am Samhraidh na Breataine";i:4;s:3:"ASB";i:5;s:7:"Londain";}i:2;a:6:{i:0;s:14:"Europe/Belfast";i:1;s:18:"Meán-Am Greenwich";i:2;s:3:"MAG";i:3;s:25:"Am Samhraidh na Breataine";i:4;s:3:"ASB";i:5;s:13:"Béal Feirste";}i:3;a:6:{i:0;s:7:"Etc/GMT";i:1;s:18:"Meán-Am Greenwich";i:2;s:3:"MAG";i:3;s:18:"Meán-Am Greenwich";i:4;s:3:"MAG";i:5;s:7:"Londain";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ga_IE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ga_IE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ga_IE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:10:"Currencies";a:1:{s:3:"IEP";a:2:{i:0;s:2:"£";i:1;s:16:"Punt Éireannach";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"d MMM yyyy";i:7;s:10:"dd/MM/yyyy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gl.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gl.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gl.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:1:{s:2:"ES";a:1:{i:0;s:7:"España";}}s:10:"Currencies";a:1:{s:3:"ESP";a:3:{i:0;s:3:"₧";i:1;s:3:"ESP";i:2;a:3:{i:0;s:18:"¤ #,##0;-¤ #,##0";i:1;s:1:",";i:2;s:1:".";}}}s:9:"Languages";a:1:{s:2:"gl";a:1:{i:0;s:6:"galego";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:3:"Dom";i:1;s:3:"Lun";i:2;s:3:"Mar";i:3;s:4:"Mér";i:4;s:3:"Xov";i:5;s:3:"Ven";i:6;s:4:"Sáb";}s:4:"wide";a:7:{i:0;s:7:"Domingo";i:1;s:4:"Luns";i:2;s:6:"Martes";i:3;s:9:"Mércores";i:4;s:5:"Xoves";i:5;s:6:"Venres";i:6;s:7:"Sábado";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"Xan";i:1;s:3:"Feb";i:2;s:3:"Mar";i:3;s:3:"Abr";i:4;s:3:"Mai";i:5;s:4:"Xuñ";i:6;s:3:"Xul";i:7;s:3:"Ago";i:8;s:3:"Set";i:9;s:3:"Out";i:10;s:3:"Nov";i:11;s:3:"Dec";}s:4:"wide";a:12:{i:0;s:7:"Xaneiro";i:1;s:8:"Febreiro";i:2;s:5:"Marzo";i:3;s:5:"Abril";i:4;s:4:"Maio";i:5;s:5:"Xuño";i:6;s:5:"Xullo";i:7;s:6:"Agosto";i:8;s:8:"Setembro";i:9;s:7:"Outubro";i:10;s:8:"Novembro";i:11;s:8:"Decembro";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gl_ES.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gl_ES.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gl_ES.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:17:"EEEE dd MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:9:"MMM dd,yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gu.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gu.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gu.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:10:{s:2:"CN";a:1:{i:0;s:9:"ચીન";}s:2:"DE";a:1:{i:0;s:15:"જમિની";}s:2:"EG";a:1:{i:0;s:12:"મિસર";}s:2:"GE";a:1:{i:0;s:30:"જà«àª¯à«‹àª°à«àªœà«€àª¯àª¾";}s:2:"IN";a:1:{i:0;s:12:"ભારત";}s:2:"NP";a:1:{i:0;s:15:"નેપાળ";}s:2:"PK";a:1:{i:0;s:18:"કરાંચી";}s:2:"TM";a:1:{i:0;s:42:"તà«àª°à«àª•à«àª®àª¨àª¿àª¸à«àª¤àª¾àª¨";}s:2:"TR";a:1:{i:0;s:30:"તà«àª°à«àª•àª¸à«àª¤àª¾àª¨";}s:2:"US";a:1:{i:0;s:56:"સંયà«àª•àª¤ રાજà«àª¯ અમેરિકા";}}s:10:"Currencies";a:1:{s:3:"INR";a:2:{i:0;s:6:"રà«";i:1;s:3:"INR";}}s:9:"Languages";a:1:{s:2:"gu";a:1:{i:0;s:21:"ગà«àªœàª°àª¾àª¤à«€";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Gujr";}s:14:"NumberElements";a:12:{i:0;s:1:".";i:1;s:1:",";i:2;s:1:";";i:3;s:1:"%";i:4;s:3:"૦";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:11:"AmPmMarkers";a:2:{i:0;s:41:"પૂરà«àªµÂ àª®àª§à«àª¯àª¾àª¹à«àª¨";i:1;s:41:"ઉતà«àª¤àª°Â àª®àª§à«àª¯àª¾àª¹à«àª¨";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:9:"રવિ";i:1;s:9:"સોમ";i:2;s:12:"મંગળ";i:3;s:9:"બà«àª§";i:4;s:12:"ગà«àª°à«";i:5;s:15:"શà«àª•à«àª°";i:6;s:9:"શનિ";}s:4:"wide";a:7:{i:0;s:18:"રવિવાર";i:1;s:18:"સોમવાર";i:2;s:21:"મંગળવાર";i:3;s:18:"બà«àª§àªµàª¾àª°";i:4;s:21:"ગà«àª°à«àªµàª¾àª°";i:5;s:24:"શà«àª•à«àª°àªµàª¾àª°";i:6;s:18:"શનિવાર";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:18:"જાનà«àª¯à«";i:1;s:18:"ફેબà«àª°à«";i:2;s:15:"મારà«àªš";i:3;s:18:"àªàªªà«àª°àª¿àª²";i:4;s:6:"મે";i:5;s:9:"જૂન";i:6;s:15:"જà«àª²àª¾àªˆ";i:7;s:15:"ઑગસà«àªŸ";i:8;s:15:"સપà«àªŸà«‡";i:9;s:15:"ઑકà«àªŸà«‹";i:10;s:9:"નવે";i:11;s:12:"ડિસે";}s:4:"wide";a:12:{i:0;s:27:"જાનà«àª¯à«àª†àª°à«€";i:1;s:27:"ફેબà«àª°à«àª†àª°à«€";i:2;s:15:"à
ª®àª¾àª°à«àªš";i:3;s:18:"àªàªªà«àª°àª¿àª²";i:4;s:6:"મે";i:5;s:9:"જૂન";i:6;s:15:"જà«àª²àª¾àªˆ";i:7;s:15:"ઑગસà«àªŸ";i:8;s:27:"સપà«àªŸà«‡àª®à«àª¬àª°";i:9;s:21:"ઑકà«àªŸà«àª¬àª°";i:10;s:21:"નવેમà«àª¬àª°";i:11;s:24:"ડિસેમà«àª¬àª°";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gu_IN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gu_IN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gu_IN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:28:"##,##,##0.###;-##,##,##0.###";i:1;s:32:"¤ ##,##,##0.00;-¤ ##,##,##0.00";i:2;s:10:"##,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:7:"d-MM-yy";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:1;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gv.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gv.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gv.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:5:{s:9:"Countries";a:1:{s:2:"GB";a:1:{i:0;s:14:"Rywvaneth Unys";}}s:9:"Languages";a:1:{s:2:"gv";a:1:{i:0;s:5:"Gaelg";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:4:{s:11:"AmPmMarkers";a:2:{i:0;s:4:"a.m.";i:1;s:4:"p.m.";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:3:"Jed";i:1;s:3:"Jel";i:2;s:3:"Jem";i:3;s:4:"Jerc";i:4;s:4:"Jerd";i:5;s:3:"Jeh";i:6;s:3:"Jes";}s:4:"wide";a:7:{i:0;s:8:"Jedoonee";i:1;s:7:"Jelhein";i:2;s:7:"Jemayrt";i:3;s:7:"Jercean";i:4;s:7:"Jerdein";i:5;s:8:"Jeheiney";i:6;s:6:"Jesarn";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:2:"RC";i:1;s:2:"AD";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:6:"J-guer";i:1;s:7:"T-arree";i:2;s:6:"Mayrnt";i:3;s:6:"Avrril";i:4;s:7:"Boaldyn";i:5;s:8:"M-souree";i:6;s:8:"J-souree";i:7;s:9:"Luanistyn";i:8;s:8:"M-fouyir";i:9;s:8:"J-fouyir";i:10;s:8:"M.Houney";i:11;s:9:"M.Nollick";}s:4:"wide";a:12:{i:0;s:13:"Jerrey-geuree";i:1;s:15:"Toshiaght-arree";i:2;s:6:"Mayrnt";i:3;s:6:"Averil";i:4;s:7:"Boaldyn";i:5;s:11:"Mean-souree";i:6;s:13:"Jerrey-souree";i:7;s:9:"Luanistyn";i:8;s:11:"Mean-fouyir";i:9;s:13:"Jerrey-fouyir";i:10;s:10:"Mee Houney";i:11;s:14:"Mee ny Nollick";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gv_GB.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gv_GB.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/gv_GB.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:8:"HH:mm:ss";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:17:"EEEE dd MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:9:"MMM dd,yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/he.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/he.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/he.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:10:{s:9:"Countries";a:239:{s:2:"AD";a:1:{i:0;s:12:"×נדורה";}s:2:"AE";a:1:{i:0;s:44:"×יחוד ×”×מירויות הערביות";}s:2:"AF";a:1:{i:0;s:16:"×פגניסטן";}s:2:"AG";a:1:{i:0;s:31:"×נטיגו××” וברבודה";}s:2:"AI";a:1:{i:0;s:12:"×נגילה";}s:2:"AL";a:1:{i:0;s:12:"×לבניה";}s:2:"AM";a:1:{i:0;s:12:"×רמניה";}s:2:"AN";a:1:{i:0;s:37:"×”××™× ×˜×™×œ×™× ×”×”×•×œ× ×“×™×™×";}s:2:"AO";a:1:{i:0;s:12:"×נגולה";}s:2:"AQ";a:1:{i:0;s:20:"×נט×רקטיקה";}s:2:"AR";a:1:{i:0;s:16:"×רגנטינה";}s:2:"AS";a:1:{i:0;s:29:"סמו××” ×”×מריקנית";}s:2:"AT";a:1:{i:0;s:14:"×וסטריה";}s:2:"AU";a:1:{i:0;s:16:"×וסטרליה";}s:2:"AW";a:1:{i:0;s:10:"×רובה";}s:2:"AZ";a:1:{i:0;s:18:"×זרבייג׳ן";}s:2:"BA";a:1:{i:0;s:31:"בוסניה הרצגובינה";}s:2:"BB";a:1:{i:0;s:12:"ברבדוס";}s:2:"BD";a:1:{i:0;s:12:"בנגלדש";}s:2:"BE";a:1:{i:0;s:10:"בלגיה";}s:2:"BF";a:1:{i:0;s:23:"בורקינה פ×סו";}s:2:"BG";a:1:{i:0;s:14:"בולגריה";}s:2:"BH";a:1:{i:0;s:12:"בחריין";}s:2:"BI";a:1:{i:0;s:14:"בורונדי";}s:2:"BJ";a:1:{i:0;s:8:"בנין";}s:2:"BM";a:1:{i:0;s:12:"ברמודה";}s:2:"BN";a:1:{i:0;s:27:"ברוניי ד×רסל××";}s:2:"BO";a:1:{i:0;s:14:"בוליביה";}s:2:"BR";a:1:{i:0;s:10:"ברזיל";}s:2:"BS";a:1:{i:0;s:10:"בה×מה";}s:2:"BT";a:1:{i:0;s:10:"בוט×ן";}s:2:"BV";a:1:{i:0;s:15:"×”××™ בובה";}s:2:"BW";a:1:{i:0;s:18:"בוטסוו×× ×”";}s:2:"BY";a:1:{i:0;s:10:"בלרוס";}s:2:"BZ";a:1:{i:0;s:8:"בליז";}s:2:"CA";a:1:{i:0;s:8:"קנדה";}s:2:"CC";a:1:{i:0;s:32:"××™×™ קוקוס (קילינג)";}s:2:"CD";a:1:{i:0;s:54:"קונגו, הרפובליקה הדמוקרטית של";}s:2:"CF";a:1:{i:0;s:45:"הרפובליקה של מרכז ×פריקה";}s:2:"CG";a:1:{i:0;s:10:"קונגו";}s:2:"CH";a:1:{i:0;s:12:"שווייץ";}s:2:"CI";a:1:{i:0;s:17:"חוף השנהב";}s:2:"CK";a:1:{i:0;s:13:"××™×™ קוק";}s:2:"CL";a:1:{i:0;s:10:"צ׳ילה";}s:2:"CM";a:1:{i:0;s:10:"קמרון";}s:2:"CN";a:1:{
i:0;s:6:"סין";}s:2:"CO";a:1:{i:0;s:16:"קולומביה";}s:2:"CR";a:1:{i:0;s:19:"קוסטה ריקה";}s:2:"CU";a:1:{i:0;s:8:"קובה";}s:2:"CV";a:1:{i:0;s:17:"קייפ ורדה";}s:2:"CX";a:1:{i:0;s:21:"××™×™ כריסטמס";}s:2:"CY";a:1:{i:0;s:14:"קפריסין";}s:2:"CZ";a:1:{i:0;s:31:"הרפובליקה הצ׳כית";}s:2:"DE";a:1:{i:0;s:12:"גרמניה";}s:2:"DJ";a:1:{i:0;s:14:"ג׳יבוטי";}s:2:"DK";a:1:{i:0;s:10:"דנמרק";}s:2:"DM";a:1:{i:0;s:16:"דומיניקה";}s:2:"DO";a:1:{i:0;s:41:"הרפובליקה הדומיניקנית";}s:2:"DZ";a:1:{i:0;s:16:"×לג׳יריה";}s:2:"EC";a:1:{i:0;s:16:"×קוו×דור";}s:2:"EE";a:1:{i:0;s:14:"×סטוניה";}s:2:"EG";a:1:{i:0;s:10:"מצרי×";}s:2:"EH";a:1:{i:0;s:23:"סהרה המערבית";}s:2:"ER";a:1:{i:0;s:16:"×ריתרי××”";}s:2:"ES";a:1:{i:0;s:8:"ספרד";}s:2:"ET";a:1:{i:0;s:14:"×תיופיה";}s:2:"FI";a:1:{i:0;s:12:"פינלנד";}s:2:"FJ";a:1:{i:0;s:10:"פיג׳י";}s:2:"FK";a:1:{i:0;s:19:"××™×™ פוקלנד";}s:2:"FM";a:1:{i:0;s:56:"מ×וריציוס, המדינות המ×וגדות של";}s:2:"FO";a:1:{i:0;s:15:"××™×™ פ×רו";}s:2:"FR";a:1:{i:0;s:8:"צרפת";}s:2:"GA";a:1:{i:0;s:8:"גבון";}s:2:"GB";a:1:{i:0;s:14:"בריטניה";}s:2:"GD";a:1:{i:0;s:10:"גרנדה";}s:2:"GE";a:1:{i:0;s:12:"גרוזיה";}s:2:"GF";a:1:{i:0;s:25:"×’×™×× ×” הצרפתית";}s:2:"GH";a:1:{i:0;s:8:"×’×× ×”";}s:2:"GI";a:1:{i:0;s:14:"גיברלטר";}s:2:"GL";a:1:{i:0;s:14:"גרינלנד";}s:2:"GM";a:1:{i:0;s:10:"גמביה";}s:2:"GN";a:1:{i:0;s:12:"×’×™× ×™××”";}s:2:"GP";a:1:{i:0;s:16:"גוו×דלופ";}s:2:"GQ";a:1:{i:0;s:29:"×’×™× ×™××” המשוונית";}s:2:"GR";a:1:{i:0;s:8:"יוון";}s:2:"GS";a:1:{i:0;s:81:"×”××™ ג׳ורג׳יה הדרומית ו××™×™ סנדוויץ׳ הדרומיי×";}s:2:"GT";a:1:{i:0;s:16:"גווטמ×לה";}s:2:"GU";a:1:{i:0;s:8:"גו××";}s:2:"GW";a:1:{i:0;s:23:"×’×™× ×™××”-ביס×ו";}s:2:"GY";a:1:{i:0;s:10:"×’×™×× ×”";}s:2:"HK";a:1:{i:0;s:36:"הונג קונג S.A.R. של סין";}s:2:"HM";a:1
:{i:0;s:39:"××™×™ הרד ו××™×™ מקדונלנד";}s:2:"HN";a:1:{i:0;s:14:"הונדורס";}s:2:"HR";a:1:{i:0;s:14:"קרו×טיה";}s:2:"HT";a:1:{i:0;s:10:"×”×יטי";}s:2:"HU";a:1:{i:0;s:14:"הונגריה";}s:2:"ID";a:1:{i:0;s:18:"×ינדונזיה";}s:2:"IE";a:1:{i:0;s:12:"×ירלנד";}s:2:"IL";a:1:{i:0;s:10:"ישר×ל";}s:2:"IN";a:1:{i:0;s:8:"הודו";}s:2:"IO";a:1:{i:0;s:61:"הטריטוריה הבריטית ב×וקינוס ההודי";}s:2:"IQ";a:1:{i:0;s:8:"עירק";}s:2:"IR";a:1:{i:0;s:47:"×יר×ן, הרפובליקה ×”×יסלמית";}s:2:"IS";a:1:{i:0;s:12:"×יסלנד";}s:2:"IT";a:1:{i:0;s:12:"×יטליה";}s:2:"JM";a:1:{i:0;s:14:"ג׳מייקה";}s:2:"JO";a:1:{i:0;s:8:"ירדן";}s:2:"JP";a:1:{i:0;s:6:"יפן";}s:2:"KE";a:1:{i:0;s:8:"קניה";}s:2:"KG";a:1:{i:0;s:18:"קירגיזסטן";}s:2:"KH";a:1:{i:0;s:14:"קמבודיה";}s:2:"KI";a:1:{i:0;s:16:"קיריב×טי";}s:2:"KM";a:1:{i:0;s:14:"קומורוס";}s:2:"KN";a:1:{i:0;s:26:"סנט קיטס וניבס";}s:2:"KP";a:1:{i:0;s:22:"קורי××”, צפון";}s:2:"KR";a:1:{i:0;s:22:"קורי××”, דרו×";}s:2:"KW";a:1:{i:0;s:10:"כווית";}s:2:"KY";a:1:{i:0;s:19:"××™×™ קיימ×ן";}s:2:"KZ";a:1:{i:0;s:12:"קזחסטן";}s:2:"LA";a:1:{i:0;s:60:"ל×וס, הרפובליקה הדמקורטית העממית";}s:2:"LB";a:1:{i:0;s:10:"לבנון";}s:2:"LC";a:1:{i:0;s:17:"סנט לושיה";}s:2:"LI";a:1:{i:0;s:20:"ליכטנשטיין";}s:2:"LK";a:1:{i:0;s:15:"סרי לנקה";}s:2:"LR";a:1:{i:0;s:12:"ליבריה";}s:2:"LS";a:1:{i:0;s:10:"לסוטו";}s:2:"LT";a:1:{i:0;s:8:"ליט×";}s:2:"LU";a:1:{i:0;s:18:"לוקסמבורג";}s:2:"LV";a:1:{i:0;s:10:"לטביה";}s:2:"LY";a:1:{i:0;s:6:"לוב";}s:2:"MA";a:1:{i:0;s:10:"מרוקו";}s:2:"MC";a:1:{i:0;s:10:"מונקו";}s:2:"MD";a:1:{i:0;s:34:"מולדובה, הרפובליקה";}s:2:"MG";a:1:{i:0;s:12:"מדגסקר";}s:2:"MH";a:1:{i:0;s:15:"××™×™ מרשל";}s:2:"MK";a:1:{i:0;s:39:"מקדוניה, הרפובליקה של";}s:2:"ML";a:1:{i:0;s:8:"מ×לי";}s:2:"MM";a:1:{i:0;s:12:"
מינמ×ר";}s:2:"MN";a:1:{i:0;s:16:"מונגוליה";}s:2:"MO";a:1:{i:0;s:27:"מק×ו S.A.R. של סין";}s:2:"MP";a:1:{i:0;s:36:"××™×™ מרי×× ×” הצפוניי×";}s:2:"MQ";a:1:{i:0;s:14:"מרטיניק";}s:2:"MR";a:1:{i:0;s:18:"מ×וריטניה";}s:2:"MS";a:1:{i:0;s:16:"מונטסר×ט";}s:2:"MT";a:1:{i:0;s:8:"מלטה";}s:2:"MU";a:1:{i:0;s:18:"מ×וריציוס";}s:2:"MV";a:1:{i:0;s:14:"מלדיב×ס";}s:2:"MW";a:1:{i:0;s:12:"מל×ווי";}s:2:"MX";a:1:{i:0;s:12:"מכסיקו";}s:2:"MY";a:1:{i:0;s:10:"מלזיה";}s:2:"MZ";a:1:{i:0;s:14:"מוזמביק";}s:2:"NA";a:1:{i:0;s:12:"נמיביה";}s:2:"NC";a:1:{i:0;s:25:"קלדוניה החדשה";}s:2:"NE";a:1:{i:0;s:10:"ניז׳ר";}s:2:"NF";a:1:{i:0;s:17:"××™×™ נורפק";}s:2:"NG";a:1:{i:0;s:12:"ניגריה";}s:2:"NI";a:1:{i:0;s:18:"ניקר×גווה";}s:2:"NL";a:1:{i:0;s:10:"הולנד";}s:2:"NO";a:1:{i:0;s:16:"נורווגיה";}s:2:"NP";a:1:{i:0;s:8:"נפ×ל";}s:2:"NR";a:1:{i:0;s:10:"× ×ורו";}s:2:"NU";a:1:{i:0;s:10:"ניווה";}s:2:"NZ";a:1:{i:0;s:17:"ניו זילנד";}s:2:"OM";a:1:{i:0;s:8:"עומן";}s:2:"PA";a:1:{i:0;s:8:"פנמה";}s:2:"PE";a:1:{i:0;s:6:"פרו";}s:2:"PF";a:1:{i:0;s:31:"פולינזיה הצרפתית";}s:2:"PG";a:1:{i:0;s:34:"פפו××” ×’×™× ×™××” החדשה";}s:2:"PH";a:1:{i:0;s:18:"פיליפיני×";}s:2:"PK";a:1:{i:0;s:12:"פקיסטן";}s:2:"PL";a:1:{i:0;s:10:"פולין";}s:2:"PM";a:1:{i:0;s:30:"סנט פייר ומיקלון";}s:2:"PN";a:1:{i:0;s:16:"פיטקיירן";}s:2:"PR";a:1:{i:0;s:19:"פורטו ריקו";}s:2:"PS";a:1:{i:0;s:29:"הרשות הפלשתינית";}s:2:"PT";a:1:{i:0;s:14:"פורטוגל";}s:2:"PW";a:1:{i:0;s:8:"פל×ו";}s:2:"PY";a:1:{i:0;s:16:"פר×גוו××™";}s:2:"QA";a:1:{i:0;s:6:"קטר";}s:2:"RE";a:1:{i:0;s:14:"ר×וניון";}s:2:"RO";a:1:{i:0;s:12:"רומניה";}s:2:"RU";a:1:{i:0;s:36:"חבר המדינות הרוסיות";}s:2:"RW";a:1:{i:0;s:12:"רו×נדה";}s:2:"SA";a:1:{i:0;s:21:"ערב הסעודית";}s:2:"SB";a:1:{i:0;s:15:"××™×™ שלמה";}s:2:"SC";a:1:{i:
0;s:17:"××™×™ סיישל";}s:2:"SD";a:1:{i:0;s:8:"סודן";}s:2:"SE";a:1:{i:0;s:12:"שוודיה";}s:2:"SG";a:1:{i:0;s:14:"סינגפור";}s:2:"SH";a:1:{i:0;s:19:"סיינט הלנה";}s:2:"SI";a:1:{i:0;s:14:"סלובניה";}s:2:"SJ";a:1:{i:0;s:38:"סוולב×רד וז׳×ן מ×יין";}s:2:"SK";a:1:{i:0;s:14:"סלובקיה";}s:2:"SL";a:1:{i:0;s:21:"סיירה ל×ונה";}s:2:"SM";a:1:{i:0;s:15:"סן מרינו";}s:2:"SN";a:1:{i:0;s:8:"סנגל";}s:2:"SO";a:1:{i:0;s:12:"סומליה";}s:2:"SR";a:1:{i:0;s:14:"סורינ××";}s:2:"ST";a:1:{i:0;s:32:"סן תומה ופרינסיפה";}s:2:"SV";a:1:{i:0;s:19:"×ל סלב×דור";}s:2:"SY";a:1:{i:0;s:44:"הרפובליקה הערבית הסורית";}s:2:"SZ";a:1:{i:0;s:16:"סווזילנד";}s:2:"TC";a:1:{i:0;s:32:"××™×™ טורקס וק×יקוס";}s:2:"TD";a:1:{i:0;s:8:"צ׳×ד";}s:2:"TF";a:1:{i:0;s:47:"טריטוריות דרומיות של צרפת";}s:2:"TG";a:1:{i:0;s:8:"טוגו";}s:2:"TH";a:1:{i:0;s:12:"ת×ילנד";}s:2:"TJ";a:1:{i:0;s:18:"טג׳יקיסטן";}s:2:"TK";a:1:{i:0;s:12:"טוקל×ו";}s:2:"TL";a:1:{i:0;s:19:"מזרח טימור";}s:2:"TM";a:1:{i:0;s:20:"טורקמניסטן";}s:2:"TN";a:1:{i:0;s:14:"טוניסיה";}s:2:"TO";a:1:{i:0;s:10:"טונגה";}s:2:"TR";a:1:{i:0;s:12:"טורקיה";}s:2:"TT";a:1:{i:0;s:27:"טרינידד וטובגו";}s:2:"TV";a:1:{i:0;s:12:"טוב×לו";}s:2:"TW";a:1:{i:0;s:12:"טיוו×ן";}s:2:"TZ";a:1:{i:0;s:12:"טנזניה";}s:2:"UA";a:1:{i:0;s:16:"×וקר××™× ×”";}s:2:"UG";a:1:{i:0;s:12:"×וגנדה";}s:2:"UM";a:1:{i:0;s:52:"××™×™× ×§×˜× ×™× ×©×œ×—×•×£ ×רצות הברית";}s:2:"US";a:1:{i:0;s:21:"×רצות הברית";}s:2:"UY";a:1:{i:0;s:18:"×ורוגוו××™";}s:2:"UZ";a:1:{i:0;s:18:"×וזבקיסטן";}s:2:"VA";a:1:{i:0;s:14:"הוותיקן";}s:2:"VC";a:1:{i:0;s:40:"סנט וינסנט והגרנדיני×";}s:2:"VE";a:1:{i:0;s:14:"ונצו×לה";}s:2:"VG";a:1:{i:0;s:36:"××™×™ הבתולה הבריטיי×";}s:2:"VI";a:1:{i:0;s:40:"××™×™ הבתולה ×”×מריקניי×";}s:2:"VN
";a:1:{i:0;s:14:"וייטנ××";}s:2:"VU";a:1:{i:0;s:14:"ו×נו×טו";}s:2:"WF";a:1:{i:0;s:25:"ו×ליס ופוטונה";}s:2:"WS";a:1:{i:0;s:10:"סמו××”";}s:2:"YE";a:1:{i:0;s:8:"תימן";}s:2:"YT";a:1:{i:0;s:10:"מיוטה";}s:2:"YU";a:1:{i:0;s:18:"יוגוסלביה";}s:2:"ZA";a:1:{i:0;s:21:"×“×¨×•× ×פריקה";}s:2:"ZM";a:1:{i:0;s:10:"זמביה";}s:2:"ZW";a:1:{i:0;s:16:"זימבבווה";}}s:10:"Currencies";a:1:{s:3:"ILS";a:2:{i:0;s:3:"₪";i:1;s:5:"ש'×—";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:13:"לוח שנה";}s:9:"collation";a:1:{i:0;s:8:"מיון";}s:8:"currency";a:1:{i:0;s:8:"מטבע";}}s:9:"Languages";a:74:{s:2:"aa";a:1:{i:0;s:14:"×תיופית";}s:2:"af";a:1:{i:0;s:16:"×פריקנית";}s:2:"ar";a:1:{i:0;s:10:"ערבית";}s:3:"arc";a:1:{i:0;s:10:"×רמית";}s:3:"ast";a:1:{i:0;s:14:"×וסטרית";}s:3:"aus";a:1:{i:0;s:27:"שפות ×וסטרליות";}s:2:"bg";a:1:{i:0;s:14:"בולגרית";}s:2:"bn";a:1:{i:0;s:12:"בנגלית";}s:2:"bo";a:1:{i:0;s:12:"טיבטית";}s:2:"bs";a:1:{i:0;s:12:"בוסנית";}s:2:"ca";a:1:{i:0;s:14:"קטלונית";}s:3:"cad";a:1:{i:0;s:8:"ק×דו";}s:2:"cs";a:1:{i:0;s:10:"צ׳כית";}s:2:"cy";a:1:{i:0;s:12:"וולשית";}s:2:"da";a:1:{i:0;s:8:"דנית";}s:2:"de";a:1:{i:0;s:12:"גרמנית";}s:3:"egy";a:1:{i:0;s:23:"מצרית (עתיקה)";}s:2:"el";a:1:{i:0;s:12:"יוונית";}s:2:"en";a:1:{i:0;s:12:"×נגלית";}s:2:"eo";a:1:{i:0;s:14:"×ספרנטו";}s:2:"es";a:1:{i:0;s:12:"ספרדית";}s:2:"et";a:1:{i:0;s:14:"×סטונית";}s:2:"eu";a:1:{i:0;s:10:"בסקית";}s:2:"fa";a:1:{i:0;s:10:"פרסית";}s:2:"fi";a:1:{i:0;s:10:"פינית";}s:2:"fr";a:1:{i:0;s:12:"צרפתית";}s:2:"ga";a:1:{i:0;s:10:"×ירית";}s:2:"gd";a:1:{i:0;s:23:"סקוטית ×’×לית";}s:2:"he";a:1:{i:0;s:10:"עברית";}s:2:"hi";a:1:{i:0;s:12:"הינדית";}s:2:"hr";a:1:{i:0;s:14:"קרו×טית";}s:2:"hu";a:1:{i:0;s:14:"הונגרית";}s:2:"hy";a:1:{i:0;s:12:"×רמנית";}s:2:"id";a:1:{i:0;s:18:"×ינדונזית";}s:2:"is";a:1:{i:0;s:16:"×יסלנ×
“ית";}s:2:"it";a:1:{i:0;s:14:"×יטלקית";}s:2:"ja";a:1:{i:0;s:10:"יפנית";}s:2:"ka";a:1:{i:0;s:16:"גרוזינית";}s:2:"ko";a:1:{i:0;s:16:"קורי×נית";}s:2:"la";a:1:{i:0;s:12:"לטינית";}s:3:"lad";a:1:{i:0;s:10:"לדינו";}s:2:"lt";a:1:{i:0;s:12:"ליט×ית";}s:2:"lv";a:1:{i:0;s:10:"לטבית";}s:3:"mas";a:1:{i:0;s:12:"מ×ס×ית";}s:2:"mi";a:1:{i:0;s:12:"מ×ורית";}s:2:"mk";a:1:{i:0;s:14:"מקדונית";}s:2:"mn";a:1:{i:0;s:16:"מונגולית";}s:2:"mo";a:1:{i:0;s:14:"מולדבית";}s:2:"mt";a:1:{i:0;s:12:"מלטזית";}s:3:"mul";a:1:{i:0;s:17:"מספר שפות";}s:3:"myn";a:1:{i:0;s:8:"מ××™×”";}s:3:"nap";a:1:{i:0;s:18:"נפוליטנית";}s:2:"ne";a:1:{i:0;s:12:"נפ×לית";}s:2:"nl";a:1:{i:0;s:14:"הולנדית";}s:2:"no";a:1:{i:0;s:16:"נורווגית";}s:2:"pl";a:1:{i:0;s:12:"פולנית";}s:2:"pt";a:1:{i:0;s:18:"פורטוגזית";}s:2:"ro";a:1:{i:0;s:12:"רומנית";}s:2:"ru";a:1:{i:0;s:10:"רוסית";}s:2:"sa";a:1:{i:0;s:14:"סנסקרית";}s:3:"sgn";a:1:{i:0;s:19:"שפת סימני×";}s:2:"sh";a:1:{i:0;s:23:"סרבו-קרו×טית";}s:2:"sk";a:1:{i:0;s:14:"סלובקית";}s:2:"sl";a:1:{i:0;s:14:"סלובנית";}s:2:"sr";a:1:{i:0;s:10:"סרבית";}s:2:"sv";a:1:{i:0;s:12:"שוודית";}s:2:"sw";a:1:{i:0;s:16:"סווהילית";}s:2:"th";a:1:{i:0;s:6:"ת××™";}s:2:"tk";a:1:{i:0;s:16:"טורקמנית";}s:2:"tr";a:1:{i:0;s:12:"טורקית";}s:2:"uk";a:1:{i:0;s:18:"×וקר×ינית";}s:2:"yi";a:1:{i:0;s:10:"יידיש";}s:2:"zh";a:1:{i:0;s:10:"סינית";}s:2:"zu";a:1:{i:0;s:8:"זולו";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Hebr";}s:7:"Scripts";a:1:{s:4:"Hebr";a:1:{i:0;s:10:"עברית";}}s:5:"Types";a:1:{s:8:"calendar";a:1:{s:6:"hebrew";a:1:{i:0;s:22:"לוח שנה עברי";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:4:{s:9:"gregorian";a:5:{s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/y
y";i:8;s:7:"{0} {1}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:2:"×";i:1;s:2:"ב";i:2;s:2:"×’";i:3;s:2:"ד";i:4;s:2:"×”";i:5;s:2:"ו";i:6;s:2:"ש";}s:6:"narrow";a:7:{i:0;s:2:"×";i:1;s:2:"ב";i:2;s:2:"×’";i:3;s:2:"ד";i:4;s:2:"×”";i:5;s:2:"ו";i:6;s:2:"ש";}s:4:"wide";a:7:{i:0;s:17:"×™×•× ×¨×שון";i:1;s:13:"×™×•× ×©× ×™";i:2;s:17:"×™×•× ×©×œ×™×©×™";i:3;s:17:"×™×•× ×¨×‘×™×¢×™";i:4;s:17:"×™×•× ×—×ž×™×©×™";i:5;s:15:"×™×•× ×©×™×©×™";i:6;s:6:"שבת";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:12:"לפנה״ס";i:1;s:10:"לסה״נ";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:6:"ינו";i:1;s:6:"פבר";i:2;s:6:"מרץ";i:3;s:6:"×פר";i:4;s:6:"מ××™";i:5;s:6:"יונ";i:6;s:6:"יול";i:7;s:6:"×וג";i:8;s:6:"ספט";i:9;s:6:"×וק";i:10;s:6:"נוב";i:11;s:6:"דצמ";}s:4:"wide";a:12:{i:0;s:10:"ינו×ר";i:1;s:12:"פברו×ר";i:2;s:6:"מרץ";i:3;s:10:"×פריל";i:4;s:6:"מ××™";i:5;s:8:"יוני";i:6;s:8:"יולי";i:7;s:12:"×וגוסט";i:8;s:12:"ספטמבר";i:9;s:14:"×וקטובר";i:10;s:12:"נובמבר";i:11;s:10:"דצמבר";}}}s:17:"weekend:intvector";a:4:{i:0;i:6;i:1;i:0;i:2;i:7;i:3;i:86400000;}}s:6:"hebrew";a:2:{s:4:"eras";a:1:{s:11:"abbreviated";a:1:{i:0;s:9:"לבה'×¢";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:17:"abbreviated:alias";a:1:{i:0;s:41:"he/calendar/hebrew/monthNames/format/wide";}s:4:"wide";a:13:{i:0;s:8:"תשרי";i:1;s:8:"חשון";i:2;s:8:"כסלו";i:3;s:6:"טבת";i:4;s:6:"שבט";i:5;s:17:"×דר ר×שון";i:6;s:13:"×דר שני";i:7;s:8:"ניסן";i:8;s:8:"×ייר";i:9;s:8:"סיון";i:10;s:8:"תמוז";i:11;s:4:"×ב";i:12;s:8:"×לול";}}}}s:7:"islamic";a:2:{s:4:"eras";a:1:{s:11:"abbreviated";a:1:{i:0;s:19:"שנת היג׳רה";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:17:"abbreviated:alias";a:1:{i:0;s:42:"he/calendar/islamic/monthNames/format/wide";}s:4:"wide";a:12:{i:0;s:10:"מוחר×";i:1;s:6:"ספר";i:2;s:24:"רביע ×ל-×וו×ל";i:3;s:20:"רביע ×ל-תני";i:4;s:28:"ג׳ומ
דה ×ל-×וו×ל";i:5;s:24:"ג׳ומדה ×ל-תני";i:6;s:10:"רג׳×ב";i:7;s:10:"שעב×ן";i:8;s:10:"ר×מדן";i:9;s:10:"שוו×ל";i:10;s:16:"זו ×ל-QI'DAH";i:11;s:20:"זו ×ל-חיג׳ה";}}}}s:19:"islamic-civil:alias";a:1:{i:0;s:19:"he/calendar/islamic";}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/he_IL.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/he_IL.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/he_IL.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hi.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hi.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hi.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:8:{s:9:"Countries";a:168:{s:2:"AD";a:1:{i:0;s:21:"अनà¥à¤¡à¥‹à¤°à¤¾";}s:2:"AE";a:1:{i:0;s:50:"संयà¥à¤•à¥à¤¤ अरब अमीरात";}s:2:"AF";a:1:{i:0;s:33:"अफगानिसà¥à¤¤à¤¾à¤¨";}s:2:"AG";a:1:{i:0;s:56:"à¤à¤¨à¥à¤Ÿà¤¿à¤—à¥à¤µà¤¾ और बारबूडा";}s:2:"AL";a:1:{i:0;s:27:"अलà¥à¤¬à¤¾à¤¨à¤¿à¤¯à¤¾";}s:2:"AM";a:1:{i:0;s:27:"आरà¥à¤®à¥‡à¤¨à¤¿à¤¯à¤¾";}s:2:"AO";a:1:{i:0;s:18:"अंगोला";}s:2:"AR";a:1:{i:0;s:33:"अरà¥à¤œà¥‡à¤¨à¥à¤Ÿà¥€à¤¨à¤¾";}s:2:"AT";a:1:{i:0;s:27:"ऑसà¥à¤Ÿà¥à¤°à¤¿à¤¯à¤¾";}s:2:"AU";a:1:{i:0;s:33:"ऑसà¥à¤Ÿà¥à¤°à¥‡à¤²à¤¿à¤¯à¤¾";}s:2:"AZ";a:1:{i:0;s:24:"अजरबैजान";}s:2:"BA";a:1:{i:0;s:55:"बोसनिया हरà¥à¤œà¤¿à¤—ोविना";}s:2:"BB";a:1:{i:0;s:24:"बारबाडोस";}s:2:"BD";a:1:{i:0;s:24:"बंगलादेश";}s:2:"BE";a:1:{i:0;s:24:"बेलà¥à¤œà¤¿à¤¯à¤®";}s:2:"BF";a:1:{i:0;s:34:"बरà¥à¤•à¤¿à¤¨à¤¾ फासो";}s:2:"BG";a:1:{i:0;s:30:"बà¥à¤²à¥à¤—ारिया";}s:2:"BH";a:1:{i:0;s:15:"बहरैन";}s:2:"BI";a:1:{i:0;s:21:"बà¥à¤°à¥à¤‚डी";}s:2:"BJ";a:1:{i:0;s:15:"बेनिन";}s:2:"BN";a:1:{i:0;s:18:"बà¥à¤°à¥‚नइ";}s:2:"BO";a:1:{i:0;s:24:"बोलीविया";}s:2:"BR";a:1:{i:0;s:21:"बà¥à¤°à¤¾à¤œà¥€à¤²";}s:2:"BS";a:1:{i:0;s:15:"बहामा";}s:2:"BT";a:1:{i:0;s:15:"भूटान";}s:2:"BW";a:1:{i:0;s:30:"बोतà¥à¤¸à¥à¤µà¤¾à¤¨à¤¾";}s:2:"BY";a:1:{i:0;s:21:"बेलारूस";}s:2:"BZ";a:1:{i:0;s:15:"बेलिज";}s:2:"CA";a:1:{i:0;s:15:"कनाडा";}s:2:"CC";a:1:{i:0;s:21:"किंशासा";}s:2:"CF";a:1:{i:0;s:68:"सेंटà¥à¤°à¤² अफà¥à¤°à¥€à¤•à¤¨ रिपबà¥à¤²à¤¿à¤•";}s:2:"CG";a:1:{i:0;s:15:"कांगो";}s:2:"CH";a:1:{i:0;s:15:"सà¥à¤µà¤¿à¤¸";}s:2:"CI";a:1:{i:0;s:31:"आईवरी कोसà¥à¤Ÿ";}s:2:"CL";a:1:{i:0;s:12:"चिली";}s:2:"CM";a:1:{i:0;s:21:"कामेरान";}s:2:"CN";a:1:{i:0;s:9:"चीन";}s:2:"CO";a:1:{i:0;s:27:"कोलमà¥à¤¬à¤¿à¤¯à¤¾";}s:2:"CR";a
:1:{i:0;s:30:"कोसà¥à¤Ÿà¤¾à¤°à¥€à¤•à¤¾";}s:2:"CU";a:1:{i:0;s:18:"कà¥à¤¯à¥‚बा";}s:2:"CV";a:1:{i:0;s:22:"कैप वरà¥à¤¤";}s:2:"CY";a:1:{i:0;s:21:"साइपà¥à¤°à¤¸";}s:2:"CZ";a:1:{i:0;s:31:"चेक गणराजà¥à¤¯";}s:2:"DE";a:1:{i:0;s:18:"जरà¥à¤®à¤¨à¥€";}s:2:"DJ";a:1:{i:0;s:18:"जिबूती";}s:2:"DK";a:1:{i:0;s:24:"डेनमारà¥à¤•";}s:2:"DM";a:1:{i:0;s:24:"डोमिनिका";}s:2:"DO";a:1:{i:0;s:46:"डोमिनिकन गणराजà¥à¤¯";}s:2:"DZ";a:1:{i:0;s:27:"अलà¥à¤œà¥€à¤°à¤¿à¤¯à¤¾";}s:2:"EC";a:1:{i:0;s:24:"इकà¥à¤µà¤¾à¤¡à¥‹à¤°";}s:2:"EE";a:1:{i:0;s:27:"à¤à¤¸à¥à¤Ÿà¥‹à¤¨à¤¿à¤¯à¤¾";}s:2:"EG";a:1:{i:0;s:15:"मिसà¥à¤°";}s:2:"EH";a:1:{i:0;s:37:"पशà¥à¤šà¤¿à¤®à¥€ सहारा";}s:2:"ER";a:1:{i:0;s:27:"इरिटà¥à¤°à¤¿à¤¯à¤¾";}s:2:"ES";a:1:{i:0;s:15:"सà¥à¤ªà¥‡à¤¨";}s:2:"ET";a:1:{i:0;s:27:"इथियोपिया";}s:2:"FI";a:1:{i:0;s:21:"फिनलैंड";}s:2:"FJ";a:1:{i:0;s:12:"फिजी";}s:2:"FR";a:1:{i:0;s:18:"फà¥à¤°à¤¾à¤‚स";}s:2:"GR";a:1:{i:0;s:15:"गà¥à¤°à¥€à¤¸";}s:2:"GT";a:1:{i:0;s:24:"गोतेदाला";}s:2:"GW";a:1:{i:0;s:28:"गीनी-बिसाउ";}s:2:"GY";a:1:{i:0;s:18:"गà¥à¤¯à¤¾à¤¨à¤¾";}s:2:"HN";a:1:{i:0;s:24:"हाणà¥à¤¡à¥‚रस";}s:2:"HR";a:1:{i:0;s:24:"कà¥à¤°à¥‹à¤¶à¤¿à¤¯à¤¾";}s:2:"HT";a:1:{i:0;s:15:"हाइती";}s:2:"HU";a:1:{i:0;s:15:"हंगरी";}s:2:"ID";a:1:{i:0;s:30:"इंडोनेशिया";}s:2:"IE";a:1:{i:0;s:21:"आयरलैंड";}s:2:"IL";a:1:{i:0;s:18:"इसराइल";}s:2:"IN";a:1:{i:0;s:12:"भारत";}s:2:"IQ";a:1:{i:0;s:12:"इराक";}s:2:"IR";a:1:{i:0;s:12:"ईरान";}s:2:"IS";a:1:{i:0;s:21:"आइसलैंड";}s:2:"IT";a:1:{i:0;s:12:"इटली";}s:2:"JM";a:1:{i:0;s:18:"जमाइका";}s:2:"JO";a:1:{i:0;s:18:"जोरà¥à¤¡à¤¨";}s:2:"JP";a:1:{i:0;s:15:"जापान";}s:2:"KE";a:1:{i:0;s:18:"केनà¥à¤¯à¤¾";}s:2:"KG";a:1:{i:0;s:21:"किरà¥à¤—िज";}s:2:"KH";a:1:{i:0;s:27:"कमà
¥à¤¬à¥‹à¤¡à¤¿à¤¯à¤¾";}s:2:"KM";a:1:{i:0;s:18:"कोमोरस";}s:2:"KN";a:1:{i:0;s:51:"सेंट किटà¥à¤¸ और नेविस";}s:2:"KP";a:1:{i:0;s:34:"उतà¥à¤¤à¤° कोरिया";}s:2:"KR";a:1:{i:0;s:37:"दकà¥à¤·à¤¿à¤£ कोरिया";}s:2:"KW";a:1:{i:0;s:15:"कà¥à¤µà¥ˆà¤¤";}s:2:"KZ";a:1:{i:0;s:27:"कजाखसà¥à¤¤à¤¾à¤¨";}s:2:"LA";a:1:{i:0;s:12:"लाओस";}s:2:"LB";a:1:{i:0;s:18:"लेबनान";}s:2:"LC";a:1:{i:0;s:31:"सेंट लूसिया";}s:2:"LI";a:1:{i:0;s:33:"लिकटेंसà¥à¤Ÿà¥€à¤¨";}s:2:"LK";a:1:{i:0;s:24:"शà¥à¤°à¥€à¤²à¤‚का";}s:2:"LR";a:1:{i:0;s:27:"लाइबेरिया";}s:2:"LS";a:1:{i:0;s:18:"लेसोथो";}s:2:"LT";a:1:{i:0;s:27:"लिथà¥à¤†à¤¨à¤¿à¤¯à¤¾";}s:2:"LU";a:1:{i:0;s:27:"लकà¥à¤¸à¤®à¤¬à¤°à¥à¤—";}s:2:"LV";a:1:{i:0;s:24:"लातà¥à¤µà¤¿à¤¯à¤¾";}s:2:"LY";a:1:{i:0;s:18:"लीबिया";}s:2:"MA";a:1:{i:0;s:21:"मोरकà¥à¤•à¥‹";}s:2:"MC";a:1:{i:0;s:18:"मोनाको";}s:2:"MD";a:1:{i:0;s:30:"मोलà¥à¤¡à¤¾à¤µà¤¿à¤¯à¤¾";}s:2:"MG";a:1:{i:0;s:27:"मदागासà¥à¤•à¤°";}s:2:"MK";a:1:{i:0;s:30:"मैसेडोनिया";}s:2:"ML";a:1:{i:0;s:12:"माली";}s:2:"MM";a:1:{i:0;s:24:"मà¥à¤¯à¤¾à¤¨à¤®à¤¾à¤°";}s:2:"MN";a:1:{i:0;s:24:"मंगोलिया";}s:2:"MR";a:1:{i:0;s:30:"मॉरिटानिया";}s:2:"MT";a:1:{i:0;s:18:"मालà¥à¤Ÿà¤¾";}s:2:"MU";a:1:{i:0;s:15:"मौरिस";}s:2:"MV";a:1:{i:0;s:18:"मालदीव";}s:2:"MW";a:1:{i:0;s:15:"मलावी";}s:2:"MX";a:1:{i:0;s:24:"मेकà¥à¤¸à¤¿à¤•à¥‹";}s:2:"MY";a:1:{i:0;s:21:"मलेशिया";}s:2:"MZ";a:1:{i:0;s:27:"मोजामà¥à¤¬à¤¿à¤•";}s:2:"PA";a:1:{i:0;s:15:"पनामा";}s:2:"PE";a:1:{i:0;s:12:"पेरू";}s:2:"PG";a:1:{i:0;s:41:"पापà¥à¤† नà¥à¤¯à¥‚ गिनी";}s:2:"PH";a:1:{i:0;s:24:"फिलीपिंस";}s:2:"PK";a:1:{i:0;s:27:"पाकिसà¥à¤¤à¤¾à¤¨";}s:2:"PL";a:1:{i:0;s:18:"पोलैंड";}s:2:"PT";a:1:{i:0;s:24:"पà¥à¤°à¥à¤¤à
¤—ाल";}s:2:"PY";a:1:{i:0;s:21:"पारागà¥à¤";}s:2:"QA";a:1:{i:0;s:9:"कतर";}s:2:"RO";a:1:{i:0;s:24:"रोमानिया";}s:2:"RU";a:1:{i:0;s:9:"रूस";}s:2:"RW";a:1:{i:0;s:21:"रूआणà¥à¤¡à¤¾";}s:2:"SA";a:1:{i:0;s:22:"सऊदी अरब";}s:2:"SD";a:1:{i:0;s:15:"सूडान";}s:2:"SE";a:1:{i:0;s:18:"सà¥à¤µà¥€à¤¡à¤¨";}s:2:"SG";a:1:{i:0;s:24:"सिंगापà¥à¤°";}s:2:"SI";a:1:{i:0;s:30:"सà¥à¤²à¥‹à¤µà¥‡à¤¨à¤¿à¤¯à¤¾";}s:2:"SK";a:1:{i:0;s:30:"सà¥à¤²à¥‹à¤µà¤¾à¤•à¤¿à¤¯à¤¾";}s:2:"SL";a:1:{i:0;s:27:"सियरालेओन";}s:2:"SM";a:1:{i:0;s:28:"सैन मेरीनो";}s:2:"SN";a:1:{i:0;s:18:"सेनेगल";}s:2:"SO";a:1:{i:0;s:24:"सोमालिया";}s:2:"SR";a:1:{i:0;s:21:"सà¥à¤°à¤¿à¤¨à¤¾à¤®";}s:2:"ST";a:1:{i:0;s:44:"साउ-तोम-पà¥à¤°à¤¿à¤‚सिप";}s:2:"SV";a:1:{i:0;s:34:"अल सालà¥à¤µà¤¾à¤¡à¥‹à¤°";}s:2:"SY";a:1:{i:0;s:18:"सीरिया";}s:2:"SZ";a:1:{i:0;s:27:"सà¥à¤†à¤œà¥€à¤²à¥ˆà¤‚ड";}s:2:"TD";a:1:{i:0;s:9:"चाड";}s:2:"TG";a:1:{i:0;s:12:"टोगो";}s:2:"TH";a:1:{i:0;s:21:"थाइलैंड";}s:2:"TJ";a:1:{i:0;s:33:"ताजिकिसà¥à¤¤à¤¾à¤¨";}s:2:"TM";a:1:{i:0;s:42:"तà¥à¤°à¥à¤•à¤®à¥‡à¤¨à¤¿à¤¸à¥à¤¤à¤¾à¤¨";}s:2:"TN";a:1:{i:0;s:24:"तà¥à¤¨à¤¿à¤¶à¤¿à¤¯à¤¾";}s:2:"TO";a:1:{i:0;s:15:"टोंगा";}s:2:"TR";a:1:{i:0;s:18:"तà¥à¤°à¥à¤•à¥€";}s:2:"TT";a:1:{i:0;s:53:"टà¥à¤°à¤¿à¤¨à¤¿à¤¡à¤¾à¤¡ और टोबैगो";}s:2:"TV";a:1:{i:0;s:18:"तà¥à¤µà¤¾à¤²à¥";}s:2:"TW";a:1:{i:0;s:18:"ताइवान";}s:2:"TZ";a:1:{i:0;s:24:"तंजानिया";}s:2:"UA";a:1:{i:0;s:21:"यूकà¥à¤°à¥‡à¤¨";}s:2:"UG";a:1:{i:0;s:21:"यà¥à¤—ांडा";}s:2:"US";a:1:{i:0;s:56:"संयà¥à¤•à¥à¤¤ राजà¥à¤¯ अमरिका";}s:2:"UY";a:1:{i:0;s:21:"यà¥à¤°à¥‚गà¥à¤";}s:2:"UZ";a:1:{i:0;s:33:"उजबेकिसà¥à¤¤à¤¾à¤¨";}s:2:"VA";a:1:{i:0;s:18:"वैटिकन";}s:2:"VE";a:1:{i:0;s:27:"वेनेजà¥à¤à¤²à¤¾";}s:2:"VG";a:1:{i:0;s:65:"बà¥à¤°à¤¿à¤Ÿ
िश वरà¥à¤œà¥€à¤¨ ऌईलैंडसà¥";}s:2:"VI";a:1:{i:0;s:58:"ईउ, à¤à¤¸ वरà¥à¤œà¥€à¤¨ आईलैंडसà¥";}s:2:"VN";a:1:{i:0;s:21:"वियतनाम";}s:2:"VU";a:1:{i:0;s:21:"वानà¥à¤…तà¥";}s:2:"YE";a:1:{i:0;s:9:"यमन";}s:2:"ZA";a:1:{i:0;s:40:"दकà¥à¤·à¤¿à¤£ अफà¥à¤°à¥€à¤•à¤¾";}s:2:"ZM";a:1:{i:0;s:24:"जामà¥à¤¬à¤¿à¤¯à¤¾";}s:2:"ZW";a:1:{i:0;s:30:"जिमà¥à¤¬à¤¾à¤¬à¥à¤µà¥‡";}}s:10:"Currencies";a:1:{s:3:"INR";a:2:{i:0;s:6:"रà¥";i:1;s:3:"INR";}}s:9:"Languages";a:142:{s:2:"aa";a:1:{i:0;s:15:"अफ़ार";}s:2:"ab";a:1:{i:0;s:30:"अबà¥à¤–ाज़ियनà¥";}s:2:"af";a:1:{i:0;s:21:"अफà¥à¤°à¥€à¤•à¥€";}s:2:"am";a:1:{i:0;s:27:"अमà¥à¤¹à¤¾à¤°à¤¿à¤•à¥";}s:2:"ar";a:1:{i:0;s:12:"अरबी";}s:2:"as";a:1:{i:0;s:15:"असामी";}s:2:"ay";a:1:{i:0;s:18:"आयमारा";}s:2:"az";a:1:{i:0;s:30:"अज़रबैंजानी";}s:2:"ba";a:1:{i:0;s:15:"बशख़िर";}s:2:"be";a:1:{i:0;s:33:"बैलोरूशियनà¥";}s:2:"bg";a:1:{i:0;s:30:"बलà¥à¤—ेरियनà¥";}s:2:"bh";a:1:{i:0;s:18:"बिहारी";}s:2:"bi";a:1:{i:0;s:24:"बिसà¥à¤²à¤¾à¤®à¤¾";}s:2:"bn";a:1:{i:0;s:18:"बà¤à¤—ाली";}s:2:"bo";a:1:{i:0;s:21:"तिबà¥à¤¬à¤¤à¥€";}s:2:"br";a:1:{i:0;s:18:"बà¥à¤°à¥‡à¤Ÿà¤¨";}s:2:"ca";a:1:{i:0;s:21:"कातालान";}s:2:"co";a:1:{i:0;s:24:"कोरà¥à¤¸à¥€à¤•à¤¨";}s:2:"cs";a:1:{i:0;s:9:"चेक";}s:2:"cy";a:1:{i:0;s:15:"वेलà¥à¤¶";}s:2:"da";a:1:{i:0;s:15:"डैनीश";}s:2:"de";a:1:{i:0;s:15:"ज़रà¥à¤®à¤¨";}s:2:"dz";a:1:{i:0;s:18:"भà¥à¤Ÿà¤¾à¤¨à¥€";}s:2:"el";a:1:{i:0;s:15:"गà¥à¤°à¥€à¤•";}s:2:"en";a:1:{i:0;s:24:"अंगà¥à¤°à¥‡à¤œà¥€";}s:2:"eo";a:1:{i:0;s:33:"à¤à¤¸à¥à¤ªà¥‡à¤°à¤¾à¤¨à¥à¤¤à¥‹";}s:2:"es";a:1:{i:0;s:21:"सà¥à¤ªà¥‡à¤¨à¤¿à¤¶";}s:2:"et";a:1:{i:0;s:30:"à¤à¤¸à¥à¤¤à¥‹à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"eu";a:1:{i:0;s:18:"बासà¥à¤•à¥";}s:2:"fa";a:1:{i:0;s:24:"परà¥à¤¶à¤¿à¤¯à¤¨à¥";}s:2:"fi";a:1:{i:0;s:15:"फिनिश";}s:2:"fj";a:1:{i:0;s:12:"फ़ीà
¤œà¥€";}s:2:"fo";a:1:{i:0;s:18:"फिरोज़ी";}s:2:"fr";a:1:{i:0;s:18:"फà¥à¤°à¥‡à¤‚च";}s:2:"fy";a:1:{i:0;s:24:"फà¥à¤°à¥€à¤œà¤¼à¤¨à¥";}s:2:"ga";a:1:{i:0;s:15:"आईरिश";}s:2:"gd";a:1:{i:0;s:49:"सà¥à¤•à¤¾à¤Ÿà¥à¤¸à¥ गायेलिकà¥";}s:2:"gl";a:1:{i:0;s:27:"गैलिशियनà¥";}s:2:"gn";a:1:{i:0;s:21:"गà¥à¤†à¤°à¤¾à¤¨à¥€";}s:2:"gu";a:1:{i:0;s:21:"गà¥à¥›à¤°à¤¾à¤¤à¥€";}s:2:"ha";a:1:{i:0;s:15:"होउसा";}s:2:"he";a:1:{i:0;s:21:"हिबà¥à¤°à¥€à¤Š";}s:2:"hi";a:1:{i:0;s:15:"हिंदी";}s:2:"hr";a:1:{i:0;s:24:"कà¥à¤°à¥‹à¤à¤¶à¤¨à¥";}s:2:"hu";a:1:{i:0;s:18:"हंगेरी";}s:2:"hy";a:1:{i:0;s:27:"अरमेनियनà¥";}s:2:"ia";a:1:{i:0;s:33:"ईनà¥à¤Ÿà¤°à¤²à¤¿à¤‚गà¥à¤†";}s:2:"id";a:1:{i:0;s:36:"इनà¥à¤¡à¥‹à¤¨à¥‡à¤¶à¤¿à¤¯à¤¨à¥";}s:2:"ie";a:1:{i:0;s:33:"ईनà¥à¤Ÿà¤°à¤²à¤¿à¤‚गà¥à¤‡";}s:2:"ik";a:1:{i:0;s:27:"इनà¥à¤ªà¤¿à¤¯à¤¾à¤•à¥";}s:2:"is";a:1:{i:0;s:33:"आईसà¥à¤²à¥ˆà¤‚डिकà¥";}s:2:"it";a:1:{i:0;s:24:"ईटालियनà¥";}s:2:"iu";a:1:{i:0;s:27:"इनूकीटूतà¥";}s:2:"ja";a:1:{i:0;s:18:"जापानी";}s:2:"jv";a:1:{i:0;s:21:"जावानीस";}s:2:"ka";a:1:{i:0;s:27:"जॉरà¥à¤œà¥€à¤¯à¤¨à¥";}s:2:"kk";a:1:{i:0;s:12:"कज़ाख";}s:2:"kl";a:1:{i:0;s:33:"गà¥à¤°à¥€à¤¨à¤²à¥ˆà¤‚डिक";}s:2:"km";a:1:{i:0;s:33:"कैमà¥à¤¬à¥‹à¤¡à¤¿à¤¯à¤¨à¥";}s:2:"kn";a:1:{i:0;s:18:"कनà¥à¤¨à¤¡à¤¼";}s:2:"ko";a:1:{i:0;s:21:"कोरीयनà¥";}s:3:"kok";a:1:{i:0;s:18:"कोंकणी";}s:2:"ks";a:1:{i:0;s:24:"काशà¥à¤®à¤¿à¤°à¥€";}s:2:"ku";a:1:{i:0;s:18:"कà¥à¤°à¤¦à¥€à¤¶";}s:2:"ky";a:1:{i:0;s:18:"किरघिज़";}s:2:"la";a:1:{i:0;s:15:"लैटीन";}s:2:"ln";a:1:{i:0;s:21:"लिंगाला";}s:2:"lo";a:1:{i:0;s:24:"लाओथीयनà¥";}s:2:"lt";a:1:{i:0;s:27:"लिथà¥à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"lv";a:1:{i:0;s:48:"लाटवियनॠ(लेटà¥à¤Ÿà¥€à¤¶)";}s:2:"mg";a:1:{i:0;s:24:"मालागासी";}s:2:"mi";a:1:{i:0;s:15:"मेओरी"
;}s:2:"mk";a:1:{i:0;s:33:"मैसेडोनियनà¥";}s:2:"ml";a:1:{i:0;s:18:"मलयालम";}s:2:"mn";a:1:{i:0;s:27:"मोंगोलियन";}s:2:"mo";a:1:{i:0;s:30:"मोलडावियनà¥";}s:2:"mr";a:1:{i:0;s:15:"मराठी";}s:2:"ms";a:1:{i:0;s:9:"मलय";}s:2:"mt";a:1:{i:0;s:21:"मालटिसà¥";}s:2:"my";a:1:{i:0;s:18:"बरà¥à¤²à¤¿à¤¸";}s:2:"na";a:1:{i:0;s:15:"नायरू";}s:2:"ne";a:1:{i:0;s:18:"नेपाली";}s:2:"nl";a:1:{i:0;s:9:"डचà¥";}s:2:"no";a:1:{i:0;s:33:"नारà¥à¤µà¥‡à¤œà¥€à¤¯à¤¨à¥";}s:2:"oc";a:1:{i:0;s:18:"ओसीटान";}s:2:"om";a:1:{i:0;s:33:"ओरोमो (अफ़ान)";}s:2:"or";a:1:{i:0;s:18:"उड़िया";}s:2:"pa";a:1:{i:0;s:18:"पंजाबी";}s:2:"pl";a:1:{i:0;s:15:"पॉलिश";}s:2:"ps";a:1:{i:0;s:33:"पॉशतो (पà¥à¤¶à¤¤à¥‹)";}s:2:"pt";a:1:{i:0;s:24:"पà¥à¤°à¥à¤¤à¥à¤—ी";}s:2:"qu";a:1:{i:0;s:21:"कà¥à¤µà¥‡à¤¶à¥à¤†";}s:3:"raj";a:1:{i:0;s:30:"राजेसà¥à¤¥à¤¾à¤¨à¥€";}s:2:"rm";a:1:{i:0;s:43:"रहेयà¥à¤Ÿà¥‹-रोमानà¥à¤¸";}s:2:"rn";a:1:{i:0;s:24:"किरूनà¥à¤¦à¥€";}s:2:"ro";a:1:{i:0;s:27:"रूमानीयनà¥";}s:4:"root";a:1:{i:0;s:12:"शिखर";}s:2:"ru";a:1:{i:0;s:12:"रà¥à¤¸à¥€";}s:2:"rw";a:1:{i:0;s:39:"किनà¥à¤¯à¤¾à¤°à¤µà¤¾à¤£à¥à¤¡à¤¾";}s:2:"sa";a:1:{i:0;s:21:"संसà¥à¤•à¥ƒà¤¤";}s:2:"sd";a:1:{i:0;s:18:"सिनà¥à¤§à¥€";}s:2:"sg";a:1:{i:0;s:21:"साà¤à¤—à¥à¤°à¥‹";}s:2:"sh";a:1:{i:0;s:43:"सेरà¥à¤¬à¥‹-कà¥à¤°à¥‹à¤à¤¶à¤¨à¥";}s:2:"si";a:1:{i:0;s:27:"शिंघालीसà¥";}s:2:"sk";a:1:{i:0;s:24:"सà¥à¤²à¥‹à¤µà¤¾à¤•à¥";}s:2:"sl";a:1:{i:0;s:33:"सà¥à¤²à¥‹à¤µà¥‡à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"sm";a:1:{i:0;s:15:"सामोन";}s:2:"sn";a:1:{i:0;s:12:"सोणा";}s:2:"so";a:1:{i:0;s:18:"सोमाली";}s:2:"sq";a:1:{i:0;s:30:"अलà¥à¤¬à¥‡à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"sr";a:1:{i:0;s:24:"सरà¥à¤¬à¤¿à¤¯à¤¨à¥";}s:2:"ss";a:1:{i:0;s:24:"सीसà¥à¤µà¤¾à¤Ÿà¤¿";}s:2:"st";a:1:{i:0;s:18:"सेसोथो
";}s:2:"su";a:1:{i:0;s:27:"सà¥à¤¨à¥à¤¦à¤¾à¤¨à¥€à¤¸";}s:2:"sv";a:1:{i:0;s:21:"सà¥à¤µà¤¿à¤¡à¤¿à¤¶";}s:2:"sw";a:1:{i:0;s:24:"सà¥à¤µà¤¾à¤¹à¤¿à¤²à¥€";}s:2:"ta";a:1:{i:0;s:12:"तमिल";}s:2:"te";a:1:{i:0;s:18:"तेलेगà¥";}s:2:"tg";a:1:{i:0;s:18:"ताजिकà¥";}s:2:"th";a:1:{i:0;s:9:"थाई";}s:2:"ti";a:1:{i:0;s:30:"तिगà¥à¤°à¥€à¤¨à¥à¤¯à¤¾";}s:2:"tk";a:1:{i:0;s:24:"तà¥à¤•à¥à¤°à¤®à¥‡à¤¨";}s:2:"tl";a:1:{i:0;s:21:"तागालोग";}s:2:"tn";a:1:{i:0;s:30:"सेतà¥à¤¸à¥à¤µà¤¾à¤¨à¤¾";}s:2:"to";a:1:{i:0;s:15:"टोंगा";}s:2:"tr";a:1:{i:0;s:21:"तà¥à¤•à¥à¤°à¥€à¤¶";}s:2:"ts";a:1:{i:0;s:15:"सोंगा";}s:2:"tt";a:1:{i:0;s:12:"टाटर";}s:2:"tw";a:1:{i:0;s:12:"टà¥à¤µà¥€";}s:2:"ug";a:1:{i:0;s:15:"उईघà¥à¤°";}s:2:"uk";a:1:{i:0;s:33:"यूकà¥à¤°à¥‡à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"ur";a:1:{i:0;s:15:"ऊरà¥à¤¦à¥";}s:2:"uz";a:1:{i:0;s:18:"उज़बेकà¥";}s:2:"vi";a:1:{i:0;s:27:"वियेतनामी";}s:2:"vo";a:1:{i:0;s:21:"वोलापà¥à¤•";}s:2:"wo";a:1:{i:0;s:15:"वोलोफ";}s:2:"xh";a:1:{i:0;s:12:"षोसा";}s:2:"yi";a:1:{i:0;s:18:"येहà¥à¤¦à¥€";}s:2:"yo";a:1:{i:0;s:18:"योरूबा";}s:2:"za";a:1:{i:0;s:15:"ज़à¥à¤†à¤‚ग";}s:2:"zh";a:1:{i:0;s:12:"चीनी";}s:2:"zu";a:1:{i:0;s:12:"ज़à¥à¤²à¥‚";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Deva";}s:14:"NumberElements";a:12:{i:0;s:1:".";i:1;s:1:",";i:2;s:1:";";i:3;s:1:"%";i:4;s:3:"०";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:4:{s:11:"AmPmMarkers";a:2:{i:0;s:27:"पूरà¥à¤µà¤¾à¤¹à¥à¤¨";i:1;s:21:"अपराहà¥à¤¨";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:9:"रवि";i:1;s:9:"सोम";i:2;s:12:"मंगल";i:3;s:9:"बà¥à¤§";i:4;s:12:"गà¥à¤°à¥";i:5;s:15:"शà¥à¤•à¥à¤°";i:6;s:9:"शनि";}s:4:"wide";a:7:{i:0;s:18:"रविवार";i:1;s:18:"सोमवार";i:2;s:21:"मंगलवार"
;i:3;s:18:"बà¥à¤§à¤µà¤¾à¤°";i:4;s:21:"गà¥à¤°à¥à¤µà¤¾à¤°";i:5;s:24:"शà¥à¤•à¥à¤°à¤µà¤¾à¤°";i:6;s:18:"शनिवार";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:24:"ईसापूरà¥à¤µ";i:1;s:6:"सन";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:15:"जनवरी";i:1;s:15:"फरवरी";i:2;s:15:"मारà¥à¤š";i:3;s:18:"अपà¥à¤°à¥ˆà¤²";i:4;s:6:"मई";i:5;s:9:"जून";i:6;s:15:"जà¥à¤²à¤¾à¤ˆ";i:7;s:15:"अगसà¥à¤¤";i:8;s:21:"सितमà¥à¤¬à¤°";i:9;s:21:"अकà¥à¤¤à¥‚बर";i:10;s:18:"नवमà¥à¤¬à¤°";i:11;s:21:"दिसमà¥à¤¬à¤°";}s:4:"wide";a:12:{i:0;s:15:"जनवरी";i:1;s:15:"फरवरी";i:2;s:15:"मारà¥à¤š";i:3;s:18:"अपà¥à¤°à¥ˆà¤²";i:4;s:6:"मई";i:5;s:9:"जून";i:6;s:15:"जà¥à¤²à¤¾à¤ˆ";i:7;s:15:"अगसà¥à¤¤";i:8;s:21:"सितमà¥à¤¬à¤°";i:9;s:21:"अकà¥à¤¤à¥‚बर";i:10;s:18:"नवमà¥à¤¬à¤°";i:11;s:21:"दिसमà¥à¤¬à¤°";}}}}}s:11:"zoneStrings";a:1:{i:0;a:5:{i:0;s:13:"Asia/Calcutta";i:1;s:28:"भारतीय समय";i:2;s:3:"IST";i:3;s:28:"भारतीय समय";i:4;s:3:"IST";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hi_IN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hi_IN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hi_IN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:28:"##,##,##0.###;-##,##,##0.###";i:1;s:32:"¤ ##,##,##0.00;-¤ ##,##,##0.00";i:2;s:10:"##,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:6:"d-M-yy";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:1;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hr.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hr.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hr.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:10:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:6:"Andora";}s:2:"AE";a:1:{i:0;s:26:"Ujedinjeni Arapski Emirati";}s:2:"AF";a:1:{i:0;s:10:"Afganistan";}s:2:"AG";a:1:{i:0;s:17:"Antigua i Barbuda";}s:2:"AI";a:1:{i:0;s:7:"Anguila";}s:2:"AL";a:1:{i:0;s:8:"Albanija";}s:2:"AM";a:1:{i:0;s:8:"Armenija";}s:2:"AN";a:1:{i:0;s:17:"Nizozemski Antili";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:9:"Antarktik";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:15:"AmeriÄka Samoa";}s:2:"AT";a:1:{i:0;s:8:"Austrija";}s:2:"AU";a:1:{i:0;s:10:"Australija";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:12:"Azerbajdžan";}s:2:"BA";a:1:{i:0;s:19:"Bosna i Hercegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"BangladeÅ¡";}s:2:"BE";a:1:{i:0;s:7:"Belgija";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:8:"Bugarska";}s:2:"BH";a:1:{i:0;s:7:"Bahrein";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:17:"Brunei Darussalam";}s:2:"BO";a:1:{i:0;s:8:"Bolivija";}s:2:"BR";a:1:{i:0;s:6:"Brazil";}s:2:"BS";a:1:{i:0;s:6:"Bahami";}s:2:"BT";a:1:{i:0;s:5:"Butan";}s:2:"BV";a:1:{i:0;s:11:"Otok Bouvet";}s:2:"BW";a:1:{i:0;s:7:"Bocvana";}s:2:"BY";a:1:{i:0;s:11:"Bjelorusija";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:21:"Kokos (Keeling) Otoci";}s:2:"CD";a:1:{i:0;s:28:"Kongo, Demokratska Republika";}s:2:"CF";a:1:{i:0;s:25:"SrednjoafriÄka Republika";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:10:"Å vicarska";}s:2:"CI";a:1:{i:0;s:16:"Obala Bjelokosti";}s:2:"CK";a:1:{i:0;s:12:"Kukovi Otoci";}s:2:"CL";a:1:{i:0;s:5:"ÄŒile";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:4:"Kina";}s:2:"CO";a:1:{i:0;s:9:"Kolumbija";}s:2:"CR";a:1:{i:0;s:9:"Kostarika";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:9:"Zeleni Rt";}s:2:"CX";a:1:{i:0;s:15:"Božićni Otoci";}s:2:"CY";a:1:{i:0;s:5:"Cipar";}s:2:"CZ";a:1:{i:0;s:17:"ÄŒeÅ¡ka Republika";}s:2:"DE";a:1:{i:0;s:9:"NjemaÄka";}s:2:"DJ";a:1:{i:0;s:8:"Džibuti";}s:2
:"DK";a:1:{i:0;s:6:"Danska";}s:2:"DM";a:1:{i:0;s:8:"Dominika";}s:2:"DO";a:1:{i:0;s:22:"Dominikanska Republika";}s:2:"DZ";a:1:{i:0;s:6:"Alžir";}s:2:"EC";a:1:{i:0;s:7:"Ekvador";}s:2:"EE";a:1:{i:0;s:8:"Estonija";}s:2:"EG";a:1:{i:0;s:6:"Egipat";}s:2:"EH";a:1:{i:0;s:14:"Zapadna Sahara";}s:2:"ER";a:1:{i:0;s:8:"Eritreja";}s:2:"ES";a:1:{i:0;s:11:"Å panjolska";}s:2:"ET";a:1:{i:0;s:8:"Etiopija";}s:2:"FI";a:1:{i:0;s:6:"Finska";}s:2:"FJ";a:1:{i:0;s:6:"Fidži";}s:2:"FK";a:1:{i:0;s:17:"Falklandski Otoci";}s:2:"FM";a:1:{i:0;s:30:"Mikronezija, Federalne Države";}s:2:"FO";a:1:{i:0;s:12:"Farski Otoci";}s:2:"FR";a:1:{i:0;s:9:"Francuska";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:21:"Ujedinjena Kraljevina";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:7:"Gruzija";}s:2:"GF";a:1:{i:0;s:17:"Francuska Gvajana";}s:2:"GH";a:1:{i:0;s:4:"Gana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:9:"Greenland";}s:2:"GM";a:1:{i:0;s:7:"Gambija";}s:2:"GN";a:1:{i:0;s:7:"Gvineja";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:18:"Ekvatorska Gvineja";}s:2:"GR";a:1:{i:0;s:6:"GrÄka";}s:2:"GS";a:1:{i:0;s:38:"Južna Gruzija i Južni SendviÄ Otoci";}s:2:"GT";a:1:{i:0;s:9:"Gvatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Gvineja Bisau";}s:2:"GY";a:1:{i:0;s:7:"Gvajana";}s:2:"HK";a:1:{i:0;s:21:"Hong Kong S.A.R. Kine";}s:2:"HM";a:1:{i:0;s:27:"Heard Otok i McDonald Otoci";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:8:"Hrvatska";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:9:"MaÄ‘arska";}s:2:"ID";a:1:{i:0;s:10:"Indonezija";}s:2:"IE";a:1:{i:0;s:5:"Irska";}s:2:"IL";a:1:{i:0;s:6:"Izrael";}s:2:"IN";a:1:{i:0;s:6:"Indija";}s:2:"IO";a:1:{i:0;s:36:"Britanski Teritorij Indijskog Oceana";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IR";a:1:{i:0;s:24:"Iran, Islamska Republika";}s:2:"IS";a:1:{i:0;s:6:"Island";}s:2:"IT";a:1:{i:0;s:7:"Italija";}s:2:"JM";a:1:{i:0;s:7:"Jamajka";}s:2:"JO";a:1:{i:0;s:6:"Jordan";}s:2:"JP";a:1:{i:0;s:5:"Japan";}s:2:"KE";a:1:{i:0;s:6:"Kenija";}s:2:"KG";a:1:{i:0;s:9:"Kirgistan";}s:2:"KH
";a:1:{i:0;s:9:"Kambodža";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:6:"Komori";}s:2:"KN";a:1:{i:0;s:23:"Sveti Kristofor i Nevis";}s:2:"KP";a:1:{i:0;s:16:"Koreja, Sjeverna";}s:2:"KR";a:1:{i:0;s:14:"Koreja, Južna";}s:2:"KW";a:1:{i:0;s:6:"Kuvajt";}s:2:"KY";a:1:{i:0;s:15:"Kajmanski Otoci";}s:2:"KZ";a:1:{i:0;s:9:"Kazakstan";}s:2:"LA";a:1:{i:0;s:36:"Laoska Narodna Demokratska Republika";}s:2:"LB";a:1:{i:0;s:7:"Libanon";}s:2:"LC";a:1:{i:0;s:12:"Sveta Lucija";}s:2:"LI";a:1:{i:0;s:12:"Lihtenštajn";}s:2:"LK";a:1:{i:0;s:10:"Šri Lanka";}s:2:"LR";a:1:{i:0;s:8:"Liberija";}s:2:"LS";a:1:{i:0;s:6:"Lesoto";}s:2:"LT";a:1:{i:0;s:5:"Litva";}s:2:"LU";a:1:{i:0;s:10:"Luksemburg";}s:2:"LV";a:1:{i:0;s:7:"Latvija";}s:2:"LY";a:1:{i:0;s:29:"Libijska Arapska Džamahirija";}s:2:"MA";a:1:{i:0;s:6:"Maroko";}s:2:"MC";a:1:{i:0;s:6:"Monako";}s:2:"MD";a:1:{i:0;s:20:"Moldavija, Republika";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:16:"Maršalovi Otoci";}s:2:"MK";a:1:{i:0;s:21:"Makedonija, Republika";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Mijanma";}s:2:"MN";a:1:{i:0;s:9:"Mongolija";}s:2:"MO";a:1:{i:0;s:17:"Makao S.A.R. Kine";}s:2:"MP";a:1:{i:0;s:24:"Sjeverni Marianski Otoci";}s:2:"MQ";a:1:{i:0;s:8:"Martinik";}s:2:"MR";a:1:{i:0;s:11:"Mauritanija";}s:2:"MS";a:1:{i:0;s:9:"Montserat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:10:"Mauricijus";}s:2:"MV";a:1:{i:0;s:7:"Maldivi";}s:2:"MW";a:1:{i:0;s:6:"Malavi";}s:2:"MX";a:1:{i:0;s:7:"Meksiko";}s:2:"MY";a:1:{i:0;s:8:"Malezija";}s:2:"MZ";a:1:{i:0;s:8:"Mozambik";}s:2:"NA";a:1:{i:0;s:8:"Namibija";}s:2:"NC";a:1:{i:0;s:15:"Nova Kaledonija";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:16:"Norfolški Otoci";}s:2:"NG";a:1:{i:0;s:8:"Nigerija";}s:2:"NI";a:1:{i:0;s:9:"Nikaragva";}s:2:"NL";a:1:{i:0;s:10:"Nizozemska";}s:2:"NO";a:1:{i:0;s:9:"Norveška";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:11:"Novi Zeland";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4
:"Peru";}s:2:"PF";a:1:{i:0;s:20:"Francuska Polinezija";}s:2:"PG";a:1:{i:0;s:18:"Papua Nova Gvineja";}s:2:"PH";a:1:{i:0;s:8:"Filipini";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:7:"Poljska";}s:2:"PM";a:1:{i:0;s:20:"Sveti Petar i Miguel";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:9:"Portoriko";}s:2:"PS";a:1:{i:0;s:21:"Palestinska Teritoija";}s:2:"PT";a:1:{i:0;s:8:"Portugal";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paragvaj";}s:2:"QA";a:1:{i:0;s:5:"Katar";}s:2:"RE";a:1:{i:0;s:7:"Reunion";}s:2:"RO";a:1:{i:0;s:9:"Rumunjska";}s:2:"RU";a:1:{i:0;s:16:"Ruska Federacija";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SA";a:1:{i:0;s:17:"Saudijska Arabija";}s:2:"SB";a:1:{i:0;s:16:"Salamunovi Otoci";}s:2:"SC";a:1:{i:0;s:8:"SejÅ¡eli";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:8:"Å vedska";}s:2:"SG";a:1:{i:0;s:8:"Singapur";}s:2:"SH";a:1:{i:0;s:12:"Sveta Helena";}s:2:"SI";a:1:{i:0;s:9:"Slovenija";}s:2:"SJ";a:1:{i:0;s:20:"Svalbard i Jan Mayen";}s:2:"SK";a:1:{i:0;s:9:"SlovaÄka";}s:2:"SL";a:1:{i:0;s:12:"Sijera Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:8:"Somalija";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:21:"Sveti Toma i Prinsipe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:6:"Sirija";}s:2:"SZ";a:1:{i:0;s:5:"Svazi";}s:2:"TC";a:1:{i:0;s:22:"Turkski i Kaikos Otoci";}s:2:"TD";a:1:{i:0;s:4:"ÄŒad";}s:2:"TF";a:1:{i:0;s:27:"Francuske Južne Teritorije";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:7:"Tajland";}s:2:"TJ";a:1:{i:0;s:12:"Tadžikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:14:"IstoÄni Timor";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:5:"Tunis";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:6:"Turska";}s:2:"TT";a:1:{i:0;s:17:"Trinidad i Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Tajvan";}s:2:"TZ";a:1:{i:0;s:9:"Tanzanija";}s:2:"UA";a:1:{i:0;s:8:"Ukrajina";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:38:"S
jedinjene Države Manji Vanjski Otoci";}s:2:"US";a:1:{i:0;s:18:"Sjedinjene Države";}s:2:"UY";a:1:{i:0;s:7:"Urugvaj";}s:2:"UZ";a:1:{i:0;s:10:"Uzbekistan";}s:2:"VA";a:1:{i:0;s:41:"Sveta Stolica (Država Vatikanskog Grada)";}s:2:"VC";a:1:{i:0;s:25:"Sveti Vincent i Grenadini";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:28:"Britanski DjeviÄanski Otoci";}s:2:"VI";a:1:{i:0;s:23:"U.S. DjeviÄanski Otoci";}s:2:"VN";a:1:{i:0;s:8:"Vijetnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:15:"Wallis i Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"YT";a:1:{i:0;s:6:"Majote";}s:2:"YU";a:1:{i:0;s:11:"Jugoslavija";}s:2:"ZA";a:1:{i:0;s:13:"Južna Afrika";}s:2:"ZM";a:1:{i:0;s:7:"Zambija";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabve";}}s:10:"Currencies";a:229:{s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:24:"Albanski lek (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:12:"Albanski lek";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:19:"Albanian Lek Valute";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:13:"Armenian Dram";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:15:"Angolska kvanza";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:27:"Angolska kvanza (1977-1990)";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:28:"Argentinski pezo (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:16:"Argentinski pezo";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:18:"Austrijski Å¡iling";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:16:"Australski dolar";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:21:"Azerbejdžanski manat";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:19:"Konvertibilna marka";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:16:"Barbadoski dolar";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:4:"Taka";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:16:"Belgijski franak";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:15:"Bermudski dolar";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:15:"Bermudska funta";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:15:"Brunejski dolar";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:14:"Kanadski dolar";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:17:"Å vicarski franak";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:27:"Chilean Unidades de Fomento";}s:3:"CLP";
a:2:{i:0;s:3:"Ch$";i:1;s:15:"ÄŒileanski pezo";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:25:"Chinese Jen Min Piao Yuan";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:16:"Kolumbijski pezo";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:19:"Kostarikanski kolon";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:13:"ÄŒeÅ¡ka kruna";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:24:"Czechoslovak Hard Koruna";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:13:"Kubanski pezo";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:18:"Zelenortski eskudo";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:15:"Curacao Guilder";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:14:"Ciparska funta";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:13:"ÄŒeÅ¡ka kruna";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:19:"East German Ostmark";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:15:"NjemaÄka marka";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:16:"German Sperrmark";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:14:"Djibouti Franc";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:12:"Danska kruna";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:17:"Dominikanski pezo";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:15:"Alžirski dinar";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:18:"Algerian New Franc";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:23:"Algerian Franc Germinal";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:13:"Ecuador Sucre";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:39:"Ecuador Unidad de Valor Constante (UVC)";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:14:"Estonian Kroon";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:15:"Egipatska funta";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:14:"Eritrean Nakfa";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:18:"Å panjolska pezeta";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:12:"Etiopski bir";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:14:"Etiopski dolar";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"Euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:12:"Finska marka";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:24:"Finska marka (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:16:"Fidžijski dolar";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:16:"Fidžijska funta";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:17:"Falklandska funta";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:21:"Faeroe Islands Kronur";}s:3:"FRF"
;a:2:{i:0;s:3:"FRF";i:1;s:16:"Francuski franak";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:36:"French Franc Germinal/Franc Poincare";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:15:"Britanska funta";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:20:"Georgian Kupon Larit";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:14:"Gruzijski lari";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:18:"Gibraltarska funta";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:17:"Grenlandska kruna";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:13:"Gambia Dalasi";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:15:"Gambijska funta";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:16:"Gvinejski franak";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:28:"Gvinejski franak (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:11:"Guinea Syli";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:16:"Guadeloupe Franc";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:33:"Equatorial Guinea Ekwele Guineana";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:24:"Equatorial Guinea Franco";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:33:"Equatorial Guinea Peseta Guineana";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:13:"GrÄka drahma";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:6:"Kvecal";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:26:"French Guyana Franc Guiana";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:24:"Portuguese Guinea Escudo";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:26:"Portuguese Guinea Mil Reis";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:22:"Gvinejskobisauski pezo";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:13:"Guyana Dollar";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:16:"HonkonÅ¡ki dolar";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:18:"HoduraÅ¡ka lempira";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:14:"Hrvatski dinar";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:4:"Kuna";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:14:"Haitian Gourde";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:17:"MaÄ‘arska forinta";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:19:"Indonezijska rupija";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:11:"Irska funta";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:16:"Israelski Å¡ekel";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:15:"Israelska funta";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:21:"Novi izraelski Å¡ekel";}s:3:"INR";a:2:{i:0
;s:3:"INR";i:1;s:15:"Indijska rupija";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:13:"IraÄki dinar";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:13:"Iranski rijal";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:15:"Islandska kruna";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:15:"Talijanska lira";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:18:"JamaiÄanski dolar";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:18:"JamaiÄanska funta";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:15:"Jordanski dinar";}s:3:"JPY";a:2:{i:0;s:2:"Â¥";i:1;s:12:"Japanski jen";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:16:"Kenijski Å¡iling";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:13:"Kyrgystan Som";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:18:"Cambodian Old Riel";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:14:"Cambodian Riel";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:15:"Kiribati Dollar";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:12:"Comoro Franc";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:15:"Kuvajtski dinar";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:15:"Kajmanski dolar";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:16:"Kazakhstan Ruble";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:16:"Kazakhstan Tenge";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:11:"Laotian Kip";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:22:"LihtenÅ¡tajnski franak";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:15:"Sri Lanka Rupee";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:12:"Ceylon Rupee";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:16:"Liberijski dolar";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:12:"Lesotho Loti";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:15:"Lithuanian Lita";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:18:"Lithuanian Talonas";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:20:"LuksemburÅ¡ki franak";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:12:"Latvian Lats";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:13:"Latvian Ruble";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:14:"Libijski dinar";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:14:"Libijska funta";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:17:"Morokanski dirham";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:17:"Morokanski franak";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:20:"Monaco Franc Nouveau";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:21:"Monaco Franc Germinal";}s:3:"MDC";a
:2:{i:0;s:3:"MDC";i:1;s:18:"Moldovan Leu Cupon";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:13:"Moldovski lej";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:20:"Moldovan Ruble Cupon";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:23:"Marshall Islands Dollar";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:16:"Makedonski denar";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:28:"Makedonski denar (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:10:"Mali Franc";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:12:"Myanmar Kyat";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:16:"Mongolski tugrik";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:12:"Macao Pataca";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:16:"Martinique Franc";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:18:"Mauritanska ouguja";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:14:"MalteÅ¡ka lira";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:15:"MalteÅ¡ka funta";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:18:"Mauricijska rupija";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:13:"Malawi Kwacha";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:12:"Malawi Pound";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:14:"MeksiÄki pezo";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:34:"MeksiÄki srebrni pezo (1861-1992)";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:17:"Malaysian Ringgit";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:17:"Mozambique Escudo";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:18:"Mozambique Metical";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:16:"Namibijski dolar";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:16:"Nigerijska naira";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:16:"Nigerijska funta";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:17:"Nizozemski gulden";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:15:"NorveÅ¡ka kruna";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:15:"Nepalska rupija";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:19:"Novozelandski dolar";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:19:"Novozelandska funta";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:13:"Omanski rijal";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:15:"Panamska balboa";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:26:"Transdniestria Ruble Kupon";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:20:"Transdniestria Ruble";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:14:"Peruanski inti";
}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:18:"Peruanski novi sol";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:13:"Peruanski sol";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:15:"Filipinski pezo";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:18:"Pakistanska rupija";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:13:"Poljska zlota";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:25:"Poljska zlota (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:17:"Palestinska funta";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:17:"Portugalski konto";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:18:"Portugalski eskudo";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:19:"Paragvajski gvarani";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:13:"Rumunjski lej";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:18:"Rumunjski novi lej";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:12:"Ruska rublja";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:24:"Ruska rublja (1991-1998)";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:23:"SolomonskootoÄni dolar";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:17:"SejÅ¡elska rupija";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:14:"Sudanski dinar";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:14:"Sudanska funta";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:14:"Å vedska kruna";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:17:"Singapurski dolar";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:19:"Slovenia Tolar Bons";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:15:"Slovenski tolar";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:15:"SlovaÄka kruna";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:18:"Somalijski Å¡iling";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:17:"Surinamski gulden";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:14:"Å kotska funta";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:14:"Sirijska funta";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:9:"Lilangeni";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:22:"Tadžikistanski somoni";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:21:"Turkmenistanski manat";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:13:"Tuniski dinar";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:15:"Timorski eskudo";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:12:"Timor Pataca";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:11:"Turska lira";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:22:"TrinidadtobaÅ¡ki dolar";}s:3:"TT
O";a:2:{i:0;s:3:"TTO";i:1;s:28:"TrinidadtobaÅ¡ki stari dolar";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:19:"Novotajvanski dolar";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:19:"Tanzanijski Å¡iling";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:18:"Ukrajinska hrivnja";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:28:"Ugandski Å¡iling (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:16:"Ugandski Å¡iling";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:15:"AmeriÄki dolar";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:31:"AmeriÄki dolar (sljedeći dan)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:26:"AmeriÄki dolar (isti dan)";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:27:"Urugvajski pezo (1975-1993)";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:19:"Venezuelski bolivar";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:17:"Viejetnamski dong";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:5:"Zlato";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:26:"Europska složena jedinica";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:27:"Europska monetarna jedinica";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:14:"jemenski dinar";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:18:"Yemeni Imadi Riyal";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:13:"Jemenski rial";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:27:"Jugoslavenski Ävrsti dinar";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:29:"Jugoslavenski federalni dinar";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:24:"Jugoslavenski dinar 1994";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:24:"Jugoslavenski novi dinar";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:33:"Jugoslavenski konvertibilni dinar";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:30:"Jugoslavenski oktobarski dinar";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:31:"Jugoslavenski reformirani dinar";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:33:"JužnoafriÄki rand (financijski)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:20:"JužnoafriÄka funta";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:19:"JužnoafriÄki rand";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:16:"Zambijska kvaÄa";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:15:"Zambijska funta";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:17:"Zairski novi zair";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:12:"Zairski zair";}s:3:"ZWD";a:2:{i:
0;s:2:"Z$";i:1;s:19:"Zimbabveanski dolar";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:8:"Kalendar";}s:9:"collation";a:1:{i:0;s:11:"Poredavanje";}s:8:"currency";a:1:{i:0;s:6:"Valuta";}}s:9:"Languages";a:71:{s:3:"ang";a:1:{i:0;s:29:"engleski, stari (ca.450-1100)";}s:3:"apa";a:1:{i:0;s:7:"apaÅ¡ki";}s:2:"ar";a:1:{i:0;s:7:"arapski";}s:3:"art";a:1:{i:0;s:16:"umjetni (ostali)";}s:2:"av";a:1:{i:0;s:7:"avarski";}s:3:"bat";a:1:{i:0;s:18:"baltiÄki (ostali)";}s:2:"be";a:1:{i:0;s:10:"bjeloruski";}s:2:"bg";a:1:{i:0;s:8:"bugarski";}s:3:"cel";a:1:{i:0;s:16:"keltski (ostali)";}s:2:"cs";a:1:{i:0;s:7:"ÄeÅ¡ki";}s:2:"cu";a:1:{i:0;s:16:"crkvenoslavenski";}s:2:"cy";a:1:{i:0;s:7:"velÅ¡ki";}s:2:"da";a:1:{i:0;s:6:"danski";}s:2:"de";a:1:{i:0;s:9:"njemaÄki";}s:3:"dum";a:1:{i:0;s:35:"nizozemski, srednji (ca. 1050-1350)";}s:3:"egy";a:1:{i:0;s:20:"egipatski (antiÄki)";}s:2:"el";a:1:{i:0;s:6:"grÄki";}s:2:"en";a:1:{i:0;s:8:"engleski";}s:3:"enm";a:1:{i:0;s:29:"engleski, srednji (1100-1500)";}s:2:"eo";a:1:{i:0;s:9:"esperanto";}s:2:"es";a:1:{i:0;s:11:"Å¡panjolski";}s:2:"et";a:1:{i:0;s:10:"estonijski";}s:2:"fa";a:1:{i:0;s:9:"perzijski";}s:2:"fi";a:1:{i:0;s:6:"finski";}s:2:"fr";a:1:{i:0;s:9:"francuski";}s:3:"frm";a:1:{i:0;s:33:"francuski, srednji (ca.1400-1600)";}s:3:"fro";a:1:{i:0;s:30:"francuski, stari (842-ca.1400)";}s:2:"fy";a:1:{i:0;s:9:"frizijski";}s:2:"ga";a:1:{i:0;s:5:"irski";}s:3:"gem";a:1:{i:0;s:18:"germanski (ostali)";}s:3:"gmh";a:1:{i:0;s:40:"njemaÄki, srednji visoki (ca.1050-1500)";}s:3:"goh";a:1:{i:0;s:37:"njemaÄki, stari visoki (ca.750-1050)";}s:3:"grc";a:1:{i:0;s:26:"grÄki, antiÄki (do 1453)";}s:3:"haw";a:1:{i:0;s:8:"havajski";}s:2:"he";a:1:{i:0;s:9:"hebrejski";}s:2:"hr";a:1:{i:0;s:8:"hrvatski";}s:2:"hu";a:1:{i:0;s:9:"maÄ‘arski";}s:2:"hy";a:1:{i:0;s:8:"armenski";}s:3:"inc";a:1:{i:0;s:16:"indijski (drugi)";}s:3:"ine";a:1:{i:0;s:20:"indoevropski (drugi)";}s:3:"ira";a:1:{i:0;s:7:"iranski";}s:2:"is";a:1:{i:0;s:9:"islandski";}s:2:"it";a:1:{i:0;s:10:"talijanski";}s:2:"ja";a:1:{i:0;s:8:"japanski";}s:2:"km";a:1:{i:0;s:7:"kmerski";}s:
2:"ko";a:1:{i:0;s:8:"korejski";}s:2:"la";a:1:{i:0;s:8:"latinski";}s:2:"lt";a:1:{i:0;s:9:"litvanski";}s:2:"lv";a:1:{i:0;s:9:"latvijski";}s:3:"mga";a:1:{i:0;s:25:"irski, srednji (900-1200)";}s:2:"mk";a:1:{i:0;s:10:"makedonski";}s:2:"mn";a:1:{i:0;s:9:"mongolski";}s:2:"mt";a:1:{i:0;s:9:"malteÅ¡ki";}s:2:"ne";a:1:{i:0;s:8:"nepalski";}s:2:"nl";a:1:{i:0;s:10:"nizozemski";}s:2:"no";a:1:{i:0;s:9:"norveÅ¡ki";}s:2:"pl";a:1:{i:0;s:7:"poljski";}s:2:"pt";a:1:{i:0;s:11:"portugalski";}s:2:"ro";a:1:{i:0;s:9:"rumunjski";}s:3:"roa";a:1:{i:0;s:17:"romanski (ostali)";}s:2:"ru";a:1:{i:0;s:5:"ruski";}s:2:"sk";a:1:{i:0;s:9:"slovaÄki";}s:2:"sl";a:1:{i:0;s:9:"slovenski";}s:3:"sla";a:1:{i:0;s:17:"slavenski (drugi)";}s:2:"sq";a:1:{i:0;s:8:"albanski";}s:2:"sr";a:1:{i:0;s:6:"srpski";}s:2:"sv";a:1:{i:0;s:8:"Å¡vedski";}s:2:"tr";a:1:{i:0;s:6:"turski";}s:2:"uk";a:1:{i:0;s:10:"ukrajinski";}s:2:"vi";a:1:{i:0;s:11:"vijetnamski";}s:2:"zh";a:1:{i:0;s:7:"kineski";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:20:"BudistiÄki kalendar";}s:7:"chinese";a:1:{i:0;s:16:"Kineski kalendar";}s:9:"gregorian";a:1:{i:0;s:22:"Gregorijanski kalendar";}s:6:"hebrew";a:1:{i:0;s:18:"Hebrejski kalendar";}s:7:"islamic";a:1:{i:0;s:17:"Islamski kalendar";}s:13:"islamic-civil";a:1:{i:0;s:25:"Islamski civilni kalendar";}s:8:"japanese";a:1:{i:0;s:17:"Japanski kalendar";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:20:"Direktno poredavanje";}s:9:"phonebook";a:1:{i:0;s:22:"Poredavanja po abecedi";}s:6:"pinyin";a:1:{i:0;s:18:"Pinyin poredavanje";}s:6:"stroke";a:1:{i:0;s:24:"Stroke order poredavanje";}s:11:"traditional";a:1:{i:0;s:24:"Tradicionano poredavanje";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:4:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:
1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:13:"dd MMMM yyyy.";i:5;s:13:"dd MMMM yyyy.";i:6;s:11:"dd.MM.yyyy.";i:7;s:11:"dd.MM.yyyy.";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:3:"ned";i:1;s:3:"pon";i:2;s:3:"uto";i:3;s:3:"sri";i:4;s:4:"Äet";i:5;s:3:"pet";i:6;s:3:"sub";}s:6:"narrow";a:7:{i:0;s:1:"n";i:1;s:1:"p";i:2;s:1:"u";i:3;s:1:"s";i:4;s:2:"Ä";i:5;s:1:"p";i:6;s:1:"s";}s:4:"wide";a:7:{i:0;s:8:"nedjelja";i:1;s:11:"ponedjeljak";i:2;s:6:"utorak";i:3;s:7:"srijeda";i:4;s:9:"Äetvrtak";i:5;s:5:"petak";i:6;s:6:"subota";}}}s:10:"monthNames";a:2:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:3:"sij";i:1;s:3:"vel";i:2;s:4:"ožu";i:3;s:3:"tra";i:4;s:3:"svi";i:5;s:3:"lip";i:6;s:3:"srp";i:7;s:3:"kol";i:8;s:3:"ruj";i:9;s:3:"lis";i:10;s:3:"stu";i:11;s:3:"pro";}s:6:"narrow";a:12:{i:0;s:1:"s";i:1;s:1:"v";i:2;s:1:"o";i:3;s:1:"t";i:4;s:1:"s";i:5;s:1:"l";i:6;s:1:"s";i:7;s:1:"k";i:8;s:1:"r";i:9;s:1:"l";i:10;s:1:"s";i:11;s:1:"p";}s:4:"wide";a:12:{i:0;s:9:"sijeÄnja";i:1;s:8:"veljaÄe";i:2;s:7:"ožujka";i:3;s:7:"travnja";i:4;s:7:"svibnja";i:5;s:6:"lipnja";i:6;s:6:"srpnja";i:7;s:8:"kolovoza";i:8;s:5:"rujna";i:9;s:9:"listopada";i:10;s:9:"studenoga";i:11;s:8:"prosinca";}}s:11:"stand-alone";a:3:{s:11:"abbreviated";a:12:{i:0;s:3:"sij";i:1;s:3:"vel";i:2;s:4:"ožu";i:3;s:3:"tra";i:4;s:3:"svi";i:5;s:3:"lip";i:6;s:3:"srp";i:7;s:3:"kol";i:8;s:3:"ruj";i:9;s:3:"lis";i:10;s:3:"stu";i:11;s:3:"pro";}s:6:"narrow";a:12:{i:0;s:1:"s";i:1;s:1:"v";i:2;s:1:"o";i:3;s:1:"t";i:4;s:1:"s";i:5;s:1:"l";i:6;s:1:"s";i:7;s:1:"k";i:8;s:1:"r";i:9;s:1:"l";i:10;s:1:"s";i:11;s:1:"p";}s:4:"wide";a:12:{i:0;s:9:"sijeÄanj";i:1;s:8:"veljaÄa";i:2;s:7:"ožujak";i:3;s:7:"travanj";i:4;s:7:"svibanj";i:5;s:6:"lipanj";i:6;s:6:"srpanj";i:7;s:7:"kolovoz";i:8;s:5:"rujan";i:9;s:8:"listopad";i:10;s:7:"studeni";i:11;s:8:"prosinac";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hr_HR.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hr_HR.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hr_HR.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hu.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hu.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hu.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:11:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:24:"Egyesült Arab Emirátus";}s:2:"AF";a:1:{i:0;s:12:"Afganisztán";}s:2:"AG";a:1:{i:0;s:19:"Antigua és Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:8:"Albánia";}s:2:"AM";a:1:{i:0;s:15:"Örményország";}s:2:"AN";a:1:{i:0;s:17:"Holland Antillák";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarktisz";}s:2:"AR";a:1:{i:0;s:10:"Argentína";}s:2:"AS";a:1:{i:0;s:15:"Amerikai Szamoa";}s:2:"AT";a:1:{i:0;s:8:"Ausztria";}s:2:"AU";a:1:{i:0;s:11:"Ausztrália";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:13:"Azerbajdzsán";}s:2:"BA";a:1:{i:0;s:19:"Bosznia-Hercegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:9:"Banglades";}s:2:"BE";a:1:{i:0;s:7:"Belgium";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:9:"Bulgária";}s:2:"BH";a:1:{i:0;s:7:"Bahrain";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:17:"Brunei Darussalam";}s:2:"BO";a:1:{i:0;s:8:"Bolívia";}s:2:"BR";a:1:{i:0;s:9:"Brazília";}s:2:"BS";a:1:{i:0;s:8:"Bahamák";}s:2:"BT";a:1:{i:0;s:7:"Bhután";}s:2:"BV";a:1:{i:0;s:13:"Bouvet-sziget";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:18:"Fehéroroszország";}s:2:"BZ";a:1:{i:0;s:5:"Beliz";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:26:"Kókusz (Keeling)-szigetek";}s:2:"CD";a:1:{i:0;s:35:"Kongó, Demokratikus köztársaság";}s:2:"CF";a:1:{i:0;s:30:"Közép-afrikai Köztársaság";}s:2:"CG";a:1:{i:0;s:6:"Kongó";}s:2:"CH";a:1:{i:0;s:6:"Svájc";}s:2:"CI";a:1:{i:0;s:17:"Elefántcsontpart";}s:2:"CK";a:1:{i:0;s:13:"Cook-szigetek";}s:2:"CL";a:1:{i:0;s:5:"Chile";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:5:"Kína";}s:2:"CO";a:1:{i:0;s:8:"Kolumbia";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:25:"Zöld-foki Köztársaság";}s:2:"CX";a:1:{i:0;s:19:"Karácsony-szigetek";}s:2:"CY";a:1:{i:0;s:6:"Ciprus";}s:2:"CZ";a:1:{i:0;s:19:"Cseh Köztársaság"
;}s:2:"DE";a:1:{i:0;s:13:"Németország";}s:2:"DJ";a:1:{i:0;s:8:"Dzsibuti";}s:2:"DK";a:1:{i:0;s:6:"Dánia";}s:2:"DM";a:1:{i:0;s:8:"Dominika";}s:2:"DO";a:1:{i:0;s:24:"Dominikai Köztársaság";}s:2:"DZ";a:1:{i:0;s:8:"Algéria";}s:2:"EC";a:1:{i:0;s:7:"Ecuador";}s:2:"EE";a:1:{i:0;s:12:"Észtország";}s:2:"EG";a:1:{i:0;s:8:"Egyiptom";}s:2:"EH";a:1:{i:0;s:14:"Nyugat Szahara";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:14:"Spanyolország";}s:2:"ET";a:1:{i:0;s:8:"Etiópia";}s:2:"FI";a:1:{i:0;s:11:"Finnország";}s:2:"FJ";a:1:{i:0;s:6:"Fidzsi";}s:2:"FK";a:1:{i:0;s:17:"Falkland-szigetek";}s:2:"FM";a:1:{i:0;s:34:"Mikronézia, Szövetségi Ãllamok";}s:2:"FO";a:1:{i:0;s:16:"Feröer-szigetek";}s:2:"FR";a:1:{i:0;s:14:"Franciaország";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:21:"Egyesült Királyság";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:7:"Grúzia";}s:2:"GF";a:1:{i:0;s:14:"Francia Guyana";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:10:"Gibraltár";}s:2:"GL";a:1:{i:0;s:9:"Grönland";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:19:"EgyenlítÄi Guinea";}s:2:"GR";a:1:{i:0;s:14:"Görögország";}s:2:"GS";a:1:{i:0;s:39:"Dél-Georgia és Dél-Sandwich Szigetek";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinea-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:23:"Hong Kong S.A.R., China";}s:2:"HM";a:1:{i:0;s:27:"Heard és McDonald Szigetek";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:14:"Horvátország";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:13:"Magyarország";}s:2:"ID";a:1:{i:0;s:10:"Indonézia";}s:2:"IE";a:1:{i:0;s:10:"Ãrország";}s:2:"IL";a:1:{i:0;s:6:"Izrael";}s:2:"IN";a:1:{i:0;s:5:"India";}s:2:"IO";a:1:{i:0;s:18:"Brit Indiai Oceán";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IR";a:1:{i:0;s:5:"Irán";}s:2:"IS";a:1:{i:0;s:6:"Izland";}s:2:"IT";a:1:{i:0;s:12:"Olaszország";}s:2:"JM";a:1:{i:0;s:7:"Jamaica";}s:2:"JO";a:1:{i:0;s:9:"Jordán
ia";}s:2:"JP";a:1:{i:0;s:6:"Japán";}s:2:"KE";a:1:{i:0;s:5:"Kenya";}s:2:"KG";a:1:{i:0;s:13:"Kirgizisztán";}s:2:"KH";a:1:{i:0;s:9:"Kambodzsa";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:15:"Comore-szigetek";}s:2:"KN";a:1:{i:0;s:21:"Saint Kitts és Nevis";}s:2:"KP";a:1:{i:0;s:13:"Korea, Észak";}s:2:"KR";a:1:{i:0;s:11:"Korea, Dél";}s:2:"KW";a:1:{i:0;s:6:"Kuwait";}s:2:"KY";a:1:{i:0;s:16:"Kajmán-szigetek";}s:2:"KZ";a:1:{i:0;s:11:"Kazahsztán";}s:2:"LA";a:1:{i:0;s:40:"Laoszi Népi Demokratikus Köztársaság";}s:2:"LB";a:1:{i:0;s:7:"Libanon";}s:2:"LC";a:1:{i:0;s:11:"Saint Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:8:"Libéria";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:9:"Litvánia";}s:2:"LU";a:1:{i:0;s:9:"Luxemburg";}s:2:"LV";a:1:{i:0;s:11:"Lettország";}s:2:"LY";a:1:{i:0;s:23:"Líbiai Arab Jamahiriya";}s:2:"MA";a:1:{i:0;s:8:"Marokkó";}s:2:"MC";a:1:{i:0;s:6:"Monaco";}s:2:"MD";a:1:{i:0;s:22:"Moldáv Köztársaság";}s:2:"MG";a:1:{i:0;s:12:"Madagaszkár";}s:2:"MH";a:1:{i:0;s:17:"Marshall-szigetek";}s:2:"MK";a:1:{i:0;s:26:"Macedónia, Köztársaság";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Mianmar";}s:2:"MN";a:1:{i:0;s:9:"Mongólia";}s:2:"MO";a:1:{i:0;s:19:"Macao S.A.R., China";}s:2:"MP";a:1:{i:0;s:24:"Északi Mariana-szigetek";}s:2:"MQ";a:1:{i:0;s:20:"Martinique (francia)";}s:2:"MR";a:1:{i:0;s:11:"Mauritánia";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:6:"Málta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:16:"Maldív-szigetek";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:7:"Mexikó";}s:2:"MY";a:1:{i:0;s:8:"Malajzia";}s:2:"MZ";a:1:{i:0;s:8:"Mozambik";}s:2:"NA";a:1:{i:0;s:8:"Namíbia";}s:2:"NC";a:1:{i:0;s:24:"Új Kaledónia (francia)";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:14:"Norfolk-sziget";}s:2:"NG";a:1:{i:0;s:8:"Nigéria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:9:"Hollandia";}s:2:"NO";a:1:{i:0;s:9:"Norvégia";}s:2:"NP";a:1:{i:0;s:6:"Nepál";}s:2:"NR";a:1:
{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:11:"Új-Zéland";}s:2:"OM";a:1:{i:0;s:5:"Omán";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:20:"Polinézia (francia)";}s:2:"PG";a:1:{i:0;s:17:"Pápua Új-Guinea";}s:2:"PH";a:1:{i:0;s:16:"Fülöp-szigetek";}s:2:"PK";a:1:{i:0;s:10:"Pakisztán";}s:2:"PL";a:1:{i:0;s:14:"Lengyelország";}s:2:"PM";a:1:{i:0;s:25:"Saint Pierre és Miquelon";}s:2:"PN";a:1:{i:0;s:15:"Pitcairn-sziget";}s:2:"PR";a:1:{i:0;s:11:"Puerto Rico";}s:2:"PS";a:1:{i:0;s:19:"Palesztín Terület";}s:2:"PT";a:1:{i:0;s:11:"Portugália";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Katar";}s:2:"RE";a:1:{i:0;s:17:"Reunion (francia)";}s:2:"RO";a:1:{i:0;s:8:"Románia";}s:2:"RU";a:1:{i:0;s:20:"Orosz Köztársaság";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SA";a:1:{i:0;s:13:"Szaud-Arábia";}s:2:"SB";a:1:{i:0;s:16:"Salamon-szigetek";}s:2:"SC";a:1:{i:0;s:10:"Seychelles";}s:2:"SD";a:1:{i:0;s:7:"Szudán";}s:2:"SE";a:1:{i:0;s:12:"Svédország";}s:2:"SG";a:1:{i:0;s:10:"Szingapúr";}s:2:"SH";a:1:{i:0;s:12:"Saint Helena";}s:2:"SI";a:1:{i:0;s:10:"Szlovénia";}s:2:"SJ";a:1:{i:0;s:22:"Svalbard és Jan Mayen";}s:2:"SK";a:1:{i:0;s:10:"Szlovákia";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:9:"Szenegál";}s:2:"SO";a:1:{i:0;s:9:"Szomália";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:8:"Suriname";}s:2:"ST";a:1:{i:0;s:23:"Saint Tome és Principe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:28:"Szíriai Arab Köztársaság";}s:2:"SZ";a:1:{i:0;s:12:"Szváziföld";}s:2:"TC";a:1:{i:0;s:27:"Török és Caicos Szigetek";}s:2:"TD";a:1:{i:0;s:5:"Csád";}s:2:"TF";a:1:{i:0;s:24:"Francia Déli Területek";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:9:"Thaiföld";}s:2:"TJ";a:1:{i:0;s:14:"Tadzsikisztán";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:11:"Kelet-Timor";}s:2:"TM";a:1:{i:0;s:15:"Türkmenisztán";}s:2:"TN";a:1:{i:0;s:8:"Tunézia";}s:2:"TO";a:1:{
i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:14:"Törökország";}s:2:"TT";a:1:{i:0;s:19:"Trinidad és Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Taiwan";}s:2:"TZ";a:1:{i:0;s:9:"Tanzánia";}s:2:"UA";a:1:{i:0;s:7:"Ukrajna";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:36:"United States Minor Outlying Islands";}s:2:"US";a:1:{i:0;s:18:"Egyesült Ãllamok";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:13:"Ãœzbegisztán";}s:2:"VA";a:1:{i:0;s:8:"Vatikán";}s:2:"VC";a:1:{i:0;s:28:"Saint Vincent és Grenadines";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:20:"Brit Virgin-szigetek";}s:2:"VI";a:1:{i:0;s:20:"U.S. Virgin-szigetek";}s:2:"VN";a:1:{i:0;s:8:"Vietnám";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:26:"Wallis és Futuna Szigetek";}s:2:"WS";a:1:{i:0;s:6:"Szamoa";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:12:"Jugoszlávia";}s:2:"ZA";a:1:{i:0;s:11:"Dél-Afrika";}s:2:"ZM";a:1:{i:0;s:6:"Zambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:378:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:16:"Andorrai dínár";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:15:"Andorrai peseta";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:10:"EAE dirham";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:19:"Afghani (1927-2002)";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:7:"Afghani";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:22:"Affars and Issas Franc";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:22:"Albán lek (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:10:"Albán lek";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:17:"Albán lek valuta";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:35:"Albán dollár konvertibilis valuta";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:4:"Dram";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:22:"Holland-antilla forint";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:14:"Angolai kwanza";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:26:"Angolai kwanza (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:30:"Angolai új kwanza (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:37:"Angolai kwanza reajustado (1995-1999)";}s:3:"AOS";a:2:{i:0
;s:3:"AOS";i:1;s:14:"Angolai escudo";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:17:"Argentín austral";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:30:"Argentín peso moneda nacional";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:26:"Argentín peso (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:4:"Peso";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:18:"Osztrák schilling";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:17:"Ausztrál dollár";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:14:"Ausztrál font";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:13:"Arubai forint";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:20:"Azerbajdzsáni manat";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:28:"Bosznia-hercegovinai dínár";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:41:"Bozsnia-hercegovinai konvertibilis márka";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:32:"Bosznia-hercegovinai új dínár";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:17:"Barbadosi dollár";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:15:"Bangladesi taka";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:27:"Belga frank (konvertibilis)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:11:"Belga frank";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:24:"Belga frank (pénzügyi)";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:20:"Bolgár kemény leva";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:24:"Bolgár szocialista leva";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:16:"Bolgár új leva";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:24:"Bolgár leva (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:33:"Bolgár leva konvertibilis valuta";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:15:"Bahreini dinár";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:13:"Burundi frank";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:16:"Bermudai dollár";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:13:"Bermudai font";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:14:"Brunei dollár";}s:3:"BOB";a:2:{i:0;s:2:"Bs";i:1;s:9:"Boliviano";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:21:"Boliviano (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:14:"Bolíviai peso";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:15:"Bolíviai mvdol";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:31:"Brazi cruzeiro novo (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:13:"
Brazi cruzado";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:27:"Brazil cruzeiro (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:11:"Brazil real";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:19:"Brazil cruzado novo";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:15:"Brazil cruzeiro";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:27:"Brazil cruzeiro (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:15:"Bahamai dollár";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:12:"Bahamai font";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:17:"Bhutáni ngultrum";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:15:"Bhutáni rúpia";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:11:"Burmai kyat";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:13:"Burmai rúpia";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:14:"Botswanai pula";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:33:"Fehérorosz új rubel (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:29:"Fehérorosz rubel (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:17:"Fehérorosz rubel";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:15:"Belizei dollár";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:22:"Brit-hondurasi dollár";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:15:"Kanadai dollár";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:13:"Kongói frank";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:29:"Kongói köztársasági frank";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:13:"Kongói zaire";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:25:"Közép-afrikai CFA frank";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:13:"Svájci frank";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:22:"Cook-szigeteki dollár";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:13:"Chilei condor";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:13:"Chilei escudo";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:26:"Chilei unidades de fomento";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:11:"Chilei peso";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:18:"Cameruni CFA frank";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:25:"Kínai jen min piao jüan";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:39:"Kínai USA dollár konvertibilis valuta";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:21:"Kínai jüan renminbi";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:21:"Kolumbiai papír peso";}s:3:"COF";a:2:{i:0;s
:3:"COF";i:1;s:17:"Kongói CFA frank";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:14:"Kolumbiai peso";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:17:"Costa Ricai colon";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:19:"Csehszlovák korona";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:27:"Csehszlovák kemény korona";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:10:"Kubai peso";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:26:"Kubai konvertibilis valuta";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:18:"Cape Verdei escudo";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:15:"Curacaoi forint";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:12:"Ciprusi font";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:11:"Cseh korona";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:19:"Kelet-Német márka";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:13:"Német márka";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:16:"German Sperrmark";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:14:"Dzsibuti frank";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:11:"Dán korona";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:14:"Dominikai peso";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:17:"Algériai dínár";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:19:"Algériai új frank";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:23:"Algériai kezdeti frank";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:14:"Ecuadori sucre";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:40:"Ecuadori Unidad de Valor Constante (UVC)";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:12:"Észt korona";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:14:"Egyiptomi font";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:14:"Eritreai nakfa";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:14:"Spanyol peseta";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:14:"Etiópiai birr";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:17:"Etiópiai dollár";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"Euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:11:"Finn markka";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:23:"Finn markka (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:14:"Fidzsi dollár";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:11:"Fidzsi font";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:23:"Falkland-szigeteki font";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:24:"Feröer-szigeteki korona";}s:3:"FRF";a:2:{i:0;s:
3:"FRF";i:1;s:13:"Francia frank";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:36:"Francia frank kezdeti/Frank poincare";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:16:"Gaboni CFA frank";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:18:"Brit font sterling";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:17:"Grúz kupon larit";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:10:"Grúz lari";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:12:"Ghánai cedi";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:18:"Ghánai régi cedi";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:12:"Ghánai font";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:28:"Ghánai újraértékelt cedi";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:16:"Gibraltári font";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:17:"Grönlandi korona";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:14:"Gambiai dalasi";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:12:"Gambiai font";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:13:"Guineai frank";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:25:"Guineai frank (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:12:"Guineai syli";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:17:"Guadeloupei frank";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:36:"Egyenlítői-guineai ekwele guineana";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:27:"Egyenlítői-guineai franco";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:36:"Egyenlítői-guineai peseta guineana";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:15:"Görög drachma";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:19:"Görög új drachma";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:18:"Guatemalai quetzal";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:28:"Francia Guyanai frank guiana";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:23:"Portugál guinea escudo";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:25:"Portugál guinea mil reis";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:19:"Guinea-Bissaui peso";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:15:"Guyanai dollár";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:17:"Hongkongi dollár";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:16:"Hodurasi lempira";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:15:"Horvát dínár";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:12:"Horvát kuna";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:12:"Haiti gourde";}s:3:"HUF
";a:2:{i:0;s:2:"Ft";i:1;s:13:"Magyar forint";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:14:"Északír font";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:21:"Indonéz nica guilder";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:21:"Indonéz jáva rúpia";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:19:"Indonéz új rúpia";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:15:"Indonéz rúpia";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:8:"Ãr font";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:14:"Izraeli sékel";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:12:"Izraeli font";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:18:"Izraeli új sékel";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:25:"Man-szigeti font sterling";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:13:"Iraki dínár";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:11:"Iráni rial";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:14:"Izlandi korona";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:11:"Olasz líra";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:20:"Jersey font sterling";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:16:"Jamaikai dollár";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:13:"Jamaikai font";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:18:"Jordániai dínár";}s:3:"JPY";a:2:{i:0;s:2:"Â¥";i:1;s:10:"Japán jen";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:15:"Kenyai shilling";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:19:"Kirgizisztáni szom";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:21:"Kambodzsai régi riel";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:15:"Kambodzsai riel";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:16:"Kiribati dollár";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:13:"Comorei frank";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:23:"Észak-koreai népi won";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:17:"Észak-koreai won";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:16:"Dél-koreai hwan";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:21:"Dél-koreai régi won";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:15:"Dél-koreai won";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:15:"Kuvaiti dínár";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:25:"Kajmán-szigeteki dollár";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:18:"Kazahsztáni rubel";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:18:"Kazahsztáni tenge";}s:3:"LAK";a:2:{i:0;s:3:"
LAK";i:1;s:10:"Laoszi kip";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:13:"Libanoni font";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:20:"Liechtensteini frank";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:17:"Sri Lankai rúpia";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:14:"Ceyloni rúpia";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:17:"Libériai dollár";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:13:"Lesothoi loti";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:16:"Litvániai litas";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:18:"Litvániai talonas";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:16:"Luxemburgi frank";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:9:"Lett lats";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:10:"Lett rubel";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:41:"Líbiai brit katonai fennhatósági líra";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:15:"Líbiai dínár";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:12:"Líbiai font";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:16:"Marokkói dirham";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:15:"Marokkói frank";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:17:"Monacoi frank új";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:21:"Monacoi frank kezdeti";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:19:"Moldován lei kupon";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:13:"Moldován lei";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:21:"Moldován rubel kupon";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:20:"Madagaszkári ariary";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:19:"Madagaszkári frank";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:26:"Marshall-szigeteki dollár";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:15:"Macedon dínár";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:27:"Macedon dínár (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:10:"Mali frank";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:13:"Mianmari kyat";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:37:"Mianmari dollár konvertibilis valuta";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:17:"Mongóliai tugrik";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:13:"Macaoi pataca";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:17:"Martiniquei frank";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:20:"Mauritániai ouguiya";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:13:"Máltai lír
a";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:12:"Máltai font";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:17:"Mauritiusi rúpia";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:24:"Maldív-szigeteki rúpia";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:25:"Maldív-szigeteki rufiyaa";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:13:"Malawi kwacha";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:11:"Malawi font";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:13:"Mexikói peso";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:32:"Mexikói ezüst peso (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:34:"Mexikói Unidad de Inversion (UDI)";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:17:"Malajziai ringgit";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:15:"Mozambik escudo";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:16:"Mozambik metical";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:17:"Namíbiai dollár";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:29:"Új-kaledóniai frank kezdeti";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:15:"Nigériai naira";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:14:"Nigériai font";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:24:"Új-hebridáki CFP frank";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:18:"Nikaraguai cordoba";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:24:"Nikaraguai arany cordoba";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:22:"Nikaraguai cordoba oro";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:14:"Holland forint";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:14:"Norvég korona";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:14:"Nepáli rúpia";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:20:"Új-zélandi dollár";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:17:"Új-zélandi font";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:11:"Ománi rial";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:17:"Ománi rial saidi";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:14:"Panamai balboa";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:28:"Transzdnyeszteri rubel kupon";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:26:"Transzdnyeszteri új rubel";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:22:"Transzdnyeszteri rubel";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:10:"Perui inti";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:15:"Perui sol nuevo";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:9:"Perui sol"
;}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:23:"Pápua új-guineai kina";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:22:"Fülöp-szigeteki peso";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:18:"Pakisztáni rúpia";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:13:"Lengyel zloty";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:40:"Lengyel USA dollár konvertibilis valuta";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:25:"Lengyel zloty (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:14:"Palesztin font";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:15:"Portugál conto";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:16:"Portugál escudo";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:17:"Paraguayi guarani";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:11:"Katari rial";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:15:"Réunioni frank";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:10:"Román lej";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:14:"Román új lej";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:11:"Orosz rubel";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:23:"Orosz rubel (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:13:"Ruandai frank";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:13:"Szaúdi riyal";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:23:"Szaúdi szuverén riyal";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:25:"Salamon-szigeteki dollár";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:26:"Seychelle-szigeteki rúpia";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:16:"Szudáni dínár";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:13:"Szudáni font";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:12:"Svéd korona";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:19:"Szingapúri dollár";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:17:"Saint Helena font";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:19:"Szlovén tolar bons";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:14:"Szlovén tolar";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:15:"Szlovák korona";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:19:"Sierra Leonei leone";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:17:"San Marinoi líra";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:17:"Szomáli shilling";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:22:"Szomálföldi shilling";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:17:"Suriname-i gulden";}s:3:"SSP";a:2:{i
:0;s:3:"SSP";i:1;s:10:"Skót font";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:31:"Sao tome-i és principe-i dobra";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:32:"Sao tome-i és principe-i escudo";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:17:"Szovjet új rubel";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:13:"Szovjet rubel";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:16:"Salvadori colón";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:13:"Szíriai font";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:23:"Szváziföldi lilangeni";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:24:"Turks és caicosi korona";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:16:"Csádi CFA frank";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:9:"Thai baht";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:22:"Tádzsikisztáni rubel";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:23:"Tádzsikisztáni somoni";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:22:"Türkmenisztáni manat";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:17:"Tunéziai dínár";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:20:"Tongai font sterling";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:13:"Timori escudo";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:13:"Timori pataca";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:13:"Török líra";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:28:"Trinidad és tobagoi dollár";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:34:"Trinidad és tobagoi régi dollár";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:15:"Tuvalui dollár";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:19:"Tajvani új dollár";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:19:"Tanzániai shilling";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:14:"Ukrán hrivnya";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:17:"Ukrán karbovanec";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:28:"Ugandai shilling (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:16:"Ugandai shilling";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:11:"USA dollár";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:30:"USA dollár (következő napi)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:20:"USA dollár (aznapi)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:21:"Uruguay-i peso fuerte";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:26:"Uruguay-i peso (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:23
:"Uruguay-i peso uruguayo";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:24:"Üzbegisztáni kupon som";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:19:"Üzbegisztáni szum";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:15:"Vatikáni líra";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:34:"Észak-vietnámi piastre dong viet";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:25:"Észak-vietnámi új dong";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:44:"Észak-vietnámi viet minh piastre dong viet";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:19:"Venezuelai bolívar";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:29:"Brit virgin-szigeteki dollár";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:14:"Vietnámi dong";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:18:"Vietnámi új dong";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:30:"Vietnámi köztársasági dong";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:22:"Vietnámi nemzeti dong";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:13:"Vanuatui vatu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:19:"Nyugat-szamoai font";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:19:"Nyugat-szamoai tala";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:27:"Asian Dinar Unit of Account";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:14:"CFA frank BEAC";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:19:"Asian Monetary Unit";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:5:"Arany";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:23:"European Composite Unit";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:22:"European Monetary Unit";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:30:"European Unit of Account (XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:30:"European Unit of Account (XBD)";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:20:"Kelet-karibi dollár";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:13:"CFA új frank";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:22:"Special Drawing Rights";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:16:"CFA frank BCEAEC";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:22:"European Currency Unit";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:19:"Francia arany frank";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:17:"Francia UIC-frank";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:15:"Iszlám dínár";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:33:"French Metropolitan Nouv
eau Franc";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:25:"French Antilles CFA Franc";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:15:"CFA frank BCEAO";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:9:"CFP frank";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:26:"COMECON Transferable Ruble";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:14:"Jemeni dínár";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:18:"Jemeni imadi riyal";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:11:"Jemeni rial";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:26:"Jugoszláv kemény dínár";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:31:"Jugoszláv szövetségi dínár";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:26:"Jugoszláv 1994-es dínár";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:22:"Jugoszláv új dínár";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:32:"Jugoszláv konvertibilis dínár";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:28:"Jugoszláv októberi dínár";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:25:"Jugoszláv reform dínár";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:30:"Dél-afrikai rand (pénzügyi)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:17:"Dél-afrikai font";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:17:"Dél-afrikai rand";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:14:"Zambiai kwacha";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:12:"Zambiai font";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:16:"Zairei új zaire";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:12:"Zairei zaire";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:17:"Zimbabwei dollár";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:7:"Naptár";}s:9:"collation";a:1:{i:0;s:9:"Rendezés";}s:8:"currency";a:1:{i:0;s:8:"Pénznem";}}s:9:"Languages";a:139:{s:2:"aa";a:1:{i:0;s:4:"afar";}s:2:"ab";a:1:{i:0;s:6:"abház";}s:2:"af";a:1:{i:0;s:7:"afrikai";}s:2:"am";a:1:{i:0;s:6:"amhara";}s:2:"ar";a:1:{i:0;s:4:"arab";}s:2:"as";a:1:{i:0;s:8:"asszámi";}s:2:"ay";a:1:{i:0;s:6:"ajmara";}s:2:"az";a:1:{i:0;s:14:"azerbajdzsáni";}s:2:"ba";a:1:{i:0;s:7:"baskír";}s:2:"be";a:1:{i:0;s:8:"belorusz";}s:2:"bg";a:1:{i:0;s:7:"bolgár";}s:2:"bh";a:1:{i:0;s:6:"bihari";}s:2:"bi";a:1:{i:0;s:7:"bislama";}s:2:"bn";a:1:{i:0;s:8:"bengáli";}s:2:"bo";a:1:{i:0;s:6:"tibeti";}s:2:"br";a:1:{i
:0;s:6:"breton";}s:2:"ca";a:1:{i:0;s:8:"katalán";}s:2:"co";a:1:{i:0;s:8:"korzikai";}s:2:"cs";a:1:{i:0;s:4:"cseh";}s:2:"cy";a:1:{i:0;s:6:"walesi";}s:2:"da";a:1:{i:0;s:4:"dán";}s:2:"de";a:1:{i:0;s:6:"német";}s:2:"dz";a:1:{i:0;s:7:"butáni";}s:2:"el";a:1:{i:0;s:7:"görög";}s:2:"en";a:1:{i:0;s:5:"angol";}s:2:"eo";a:1:{i:0;s:11:"eszperantó";}s:2:"es";a:1:{i:0;s:7:"spanyol";}s:2:"et";a:1:{i:0;s:5:"észt";}s:2:"eu";a:1:{i:0;s:5:"baszk";}s:2:"fa";a:1:{i:0;s:6:"perzsa";}s:2:"fi";a:1:{i:0;s:4:"finn";}s:2:"fj";a:1:{i:0;s:6:"fidzsi";}s:2:"fo";a:1:{i:0;s:8:"feröeri";}s:2:"fr";a:1:{i:0;s:7:"francia";}s:2:"fy";a:1:{i:0;s:5:"fríz";}s:2:"ga";a:1:{i:0;s:3:"ír";}s:2:"gd";a:1:{i:0;s:12:"skót (gael)";}s:2:"gl";a:1:{i:0;s:9:"galíciai";}s:2:"gn";a:1:{i:0;s:7:"guarani";}s:2:"gu";a:1:{i:0;s:11:"gudzsaráti";}s:2:"ha";a:1:{i:0;s:6:"hausza";}s:2:"he";a:1:{i:0;s:6:"héber";}s:2:"hi";a:1:{i:0;s:5:"hindi";}s:2:"hr";a:1:{i:0;s:7:"horvát";}s:2:"hu";a:1:{i:0;s:6:"magyar";}s:2:"hy";a:1:{i:0;s:8:"örmény";}s:2:"ia";a:1:{i:0;s:11:"interlingua";}s:2:"id";a:1:{i:0;s:8:"indonéz";}s:2:"ie";a:1:{i:0;s:11:"interlingue";}s:2:"ik";a:1:{i:0;s:7:"inupiak";}s:2:"is";a:1:{i:0;s:7:"izlandi";}s:2:"it";a:1:{i:0;s:5:"olasz";}s:2:"iu";a:1:{i:0;s:9:"inuktitut";}s:2:"ja";a:1:{i:0;s:6:"japán";}s:2:"jv";a:1:{i:0;s:6:"jávai";}s:2:"ka";a:1:{i:0;s:5:"grúz";}s:2:"kk";a:1:{i:0;s:5:"kazah";}s:2:"kl";a:1:{i:0;s:10:"grönlandi";}s:2:"km";a:1:{i:0;s:10:"kambodzsai";}s:2:"kn";a:1:{i:0;s:7:"kannada";}s:2:"ko";a:1:{i:0;s:6:"koreai";}s:2:"ks";a:1:{i:0;s:8:"kasmíri";}s:2:"ku";a:1:{i:0;s:4:"kurd";}s:2:"ky";a:1:{i:0;s:6:"kirgiz";}s:2:"la";a:1:{i:0;s:5:"latin";}s:2:"ln";a:1:{i:0;s:7:"lingala";}s:2:"lo";a:1:{i:0;s:6:"laoszi";}s:2:"lt";a:1:{i:0;s:7:"litván";}s:2:"lv";a:1:{i:0;s:4:"lett";}s:2:"mg";a:1:{i:0;s:13:"madagaszkári";}s:2:"mi";a:1:{i:0;s:5:"maori";}s:2:"mk";a:1:{i:0;s:8:"macedón";}s:2:"ml";a:1:{i:0;s:9:"malajalam";}s:2:"mn";a:1:{i:0;s:6:"mongol";}s:2:"mo";a:1:{i:0;s:7:"moldvai";}s:2:"mr";a:1:{i:0;s:6:"marati";}s:2:"ms";a:1:{i:0;s:6:"maláj";}s:2:"mt";a:1:{i:0;
s:7:"máltai";}s:2:"my";a:1:{i:0;s:6:"burmai";}s:2:"na";a:1:{i:0;s:6:"naurui";}s:2:"ne";a:1:{i:0;s:7:"nepáli";}s:2:"nl";a:1:{i:0;s:7:"holland";}s:2:"no";a:1:{i:0;s:7:"norvég";}s:2:"oc";a:1:{i:0;s:9:"okszitán";}s:2:"om";a:1:{i:0;s:7:"oromói";}s:2:"or";a:1:{i:0;s:5:"orija";}s:2:"pa";a:1:{i:0;s:10:"pandzsábi";}s:2:"pl";a:1:{i:0;s:7:"lengyel";}s:2:"ps";a:1:{i:0;s:14:"pastu (afgán)";}s:2:"pt";a:1:{i:0;s:9:"portugál";}s:2:"qu";a:1:{i:0;s:6:"kecsua";}s:2:"rm";a:1:{i:0;s:11:"rétoromán";}s:2:"rn";a:1:{i:0;s:7:"kirundi";}s:2:"ro";a:1:{i:0;s:6:"román";}s:2:"ru";a:1:{i:0;s:5:"orosz";}s:2:"rw";a:1:{i:0;s:8:"kiruanda";}s:2:"sa";a:1:{i:0;s:10:"szanszkrit";}s:2:"sd";a:1:{i:0;s:6:"szindi";}s:2:"sg";a:1:{i:0;s:5:"sango";}s:2:"sh";a:1:{i:0;s:13:"szerb-horvát";}s:2:"si";a:1:{i:0;s:10:"szingaléz";}s:2:"sk";a:1:{i:0;s:8:"szlovák";}s:2:"sl";a:1:{i:0;s:8:"szlovén";}s:2:"sm";a:1:{i:0;s:7:"szamoai";}s:2:"sn";a:1:{i:0;s:4:"sona";}s:2:"so";a:1:{i:0;s:8:"szomáli";}s:2:"sq";a:1:{i:0;s:6:"albán";}s:2:"sr";a:1:{i:0;s:5:"szerb";}s:2:"ss";a:1:{i:0;s:9:"sziszuati";}s:2:"st";a:1:{i:0;s:9:"szeszotó";}s:2:"su";a:1:{i:0;s:10:"szundanéz";}s:2:"sv";a:1:{i:0;s:5:"svéd";}s:2:"sw";a:1:{i:0;s:9:"szuahéli";}s:2:"ta";a:1:{i:0;s:5:"tamil";}s:2:"te";a:1:{i:0;s:6:"telugu";}s:2:"tg";a:1:{i:0;s:7:"tadzsik";}s:2:"th";a:1:{i:0;s:4:"thai";}s:2:"ti";a:1:{i:0;s:8:"tigrinya";}s:2:"tk";a:1:{i:0;s:9:"türkmén";}s:2:"tl";a:1:{i:0;s:7:"tagalog";}s:2:"tn";a:1:{i:0;s:10:"szecsuáni";}s:2:"to";a:1:{i:0;s:5:"tonga";}s:2:"tr";a:1:{i:0;s:7:"török";}s:2:"ts";a:1:{i:0;s:5:"conga";}s:2:"tt";a:1:{i:0;s:6:"tatár";}s:2:"tw";a:1:{i:0;s:3:"tui";}s:2:"ug";a:1:{i:0;s:5:"ujgur";}s:2:"uk";a:1:{i:0;s:6:"ukrán";}s:2:"ur";a:1:{i:0;s:4:"urdu";}s:2:"uz";a:1:{i:0;s:7:"üzbég";}s:2:"vi";a:1:{i:0;s:9:"vietnámi";}s:2:"vo";a:1:{i:0;s:8:"volapük";}s:2:"wo";a:1:{i:0;s:5:"volof";}s:2:"xh";a:1:{i:0;s:5:"hosza";}s:2:"yi";a:1:{i:0;s:6:"zsidó";}s:2:"yo";a:1:{i:0;s:6:"joruba";}s:2:"za";a:1:{i:0;s:6:"zsuang";}s:2:"zh";a:1:{i:0;s:6:"kínai";}s:2:"zu";a:1:{i:0;s:4:"zulu";}}s:12:"Loca
leScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Scripts";a:34:{s:4:"Armn";a:1:{i:0;s:8:"Örmény";}s:4:"Beng";a:1:{i:0;s:8:"Bengáli";}s:4:"Bopo";a:1:{i:0;s:8:"Bopomofo";}s:4:"Brai";a:1:{i:0;s:9:"Vakírás";}s:4:"Cans";a:1:{i:0;s:34:"Egyesített kanadai őslakos jelek";}s:4:"Cprt";a:1:{i:0;s:7:"Ciprusi";}s:4:"Cyrl";a:1:{i:0;s:6:"Cirill";}s:4:"Ethi";a:1:{i:0;s:6:"Etióp";}s:4:"Geor";a:1:{i:0;s:5:"Grúz";}s:4:"Goth";a:1:{i:0;s:8:"Gótikus";}s:4:"Grek";a:1:{i:0;s:7:"Görög";}s:4:"Hani";a:1:{i:0;s:3:"Han";}s:4:"Hano";a:1:{i:0;s:7:"Hanunoo";}s:4:"Hans";a:1:{i:0;s:20:"Egyszerűsített Han";}s:4:"Hant";a:1:{i:0;s:16:"Hagyományos Han";}s:4:"Hebr";a:1:{i:0;s:6:"Héber";}s:4:"Ital";a:1:{i:0;s:11:"Régi olasz";}s:4:"Knda";a:1:{i:0;s:7:"Kannada";}s:4:"Laoo";a:1:{i:0;s:3:"Lao";}s:4:"Limb";a:1:{i:0;s:5:"Limbu";}s:4:"Mlym";a:1:{i:0;s:9:"Malayalam";}s:4:"Mymr";a:1:{i:0;s:6:"Burmai";}s:4:"Ogam";a:1:{i:0;s:5:"Ogham";}s:4:"Orya";a:1:{i:0;s:5:"Oriya";}s:4:"Osma";a:1:{i:0;s:7:"Oszmán";}s:4:"Sinh";a:1:{i:0;s:10:"Szingaléz";}s:4:"Syrc";a:1:{i:0;s:8:"Szíriai";}s:4:"Tagb";a:1:{i:0;s:8:"Tagbanwa";}s:4:"Tale";a:1:{i:0;s:6:"Tai Le";}s:4:"Telu";a:1:{i:0;s:6:"Telugu";}s:4:"Thaa";a:1:{i:0;s:6:"Thaana";}s:4:"Tibt";a:1:{i:0;s:6:"Tibeti";}s:4:"Ugar";a:1:{i:0;s:5:"Ugari";}s:4:"Zyyy";a:1:{i:0;s:16:"Meghatározatlan";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:17:"buddhista naptár";}s:7:"chinese";a:1:{i:0;s:14:"kínai naptár";}s:9:"gregorian";a:1:{i:0;s:15:"Gergely-naptár";}s:6:"hebrew";a:1:{i:0;s:14:"héber naptár";}s:7:"islamic";a:1:{i:0;s:15:"iszlám naptár";}s:13:"islamic-civil";a:1:{i:0;s:21:"iszlám civil naptár";}s:8:"japanese";a:1:{i:0;s:14:"japán naptár";}}s:9:"collation";a:3:{s:6:"direct";a:1:{i:0;s:18:"Közvetlen sorrend";}s:9:"phonebook";a:1:{i:0;s:21:"Telefonkönyv sorrend";}s:11:"traditional";a:1:{i:0;s:12:"Hagyományos";}}}s:7:"Versio
n";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:5:{s:8:"buddhist";a:1:{s:4:"eras";a:1:{s:11:"abbreviated";a:1:{i:0;s:2:"BK";}}}s:9:"gregorian";a:6:{s:11:"AmPmMarkers";a:2:{i:0;s:2:"DE";i:1;s:2:"DU";}s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:9:"H:mm:ss z";i:1;s:9:"H:mm:ss z";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:13:"yyyy. MMMM d.";i:5;s:13:"yyyy. MMMM d.";i:6;s:11:"yyyy.MM.dd.";i:7;s:11:"yyyy.MM.dd.";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:1:"V";i:1;s:1:"H";i:2;s:1:"K";i:3;s:3:"Sze";i:4;s:2:"Cs";i:5;s:1:"P";i:6;s:3:"Szo";}s:6:"narrow";a:7:{i:0;s:1:"V";i:1;s:1:"H";i:2;s:1:"K";i:3;s:1:"S";i:4;s:1:"C";i:5;s:1:"P";i:6;s:1:"S";}s:4:"wide";a:7:{i:0;s:9:"vasárnap";i:1;s:7:"hétfÅ‘";i:2;s:4:"kedd";i:3;s:6:"szerda";i:4;s:12:"csütörtök";i:5;s:7:"péntek";i:6;s:7:"szombat";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:4:"i.e.";i:1;s:4:"i.u.";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:4:"jan.";i:1;s:5:"febr.";i:2;s:6:"márc.";i:3;s:5:"ápr.";i:4;s:5:"máj.";i:5;s:5:"jún.";i:6;s:5:"júl.";i:7;s:4:"aug.";i:8;s:6:"szept.";i:9;s:4:"okt.";i:10;s:4:"nov.";i:11;s:4:"dec.";}s:6:"narrow";a:12:{i:0;s:1:"J";i:1;s:1:"F";i:2;s:1:"M";i:3;s:2:"Ã";i:4;s:1:"M";i:5;s:1:"J";i:6;s:1:"J";i:7;s:1:"A";i:8;s:1:"S";i:9;s:1:"O";i:10;s:1:"N";i:11;s:1:"D";}s:4:"wide";a:12:{i:0;s:7:"január";i:1;s:8:"február";i:2;s:8:"március";i:3;s:8:"április";i:4;s:6:"május";i:5;s:7:"június";i:6;s:7:"július";i:7;s:9:"augusztus";i:8;s:10:"szeptember";i:9;s:8:"október";i:10;s:8:"november";i:11;s:8:"december";}}}}s:6:"hebrew";a:2:{s:4:"eras";a:1:{s:11:"abbreviated";a:1:{i:0;s:3:"TÉ";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:17:"abbreviated:alias";a:1:{i:0;s:41:"hu/calendar/hebrew/monthNames/format/wide";}s:4:"wide";a:13:{i:0;s:5:"Tisri";i:1;s:7:"Hesván";i:2;s:8:"Kiszlév";i:3;s:8:"Tévész";i:4;s:5:"Svát";i:5;s:13:"Ãdár risón";i:6;s:12:"Ãdár séni";i:7;s:7:"Niszán";i:8;s:5:"Ijár";i:9;s:7:"Sziván";i:10;s:5:"Tamuz";i:11;s:3:"Ã
v";i:12;s:4:"Elul";}}}}s:7:"islamic";a:2:{s:4:"eras";a:1:{s:11:"abbreviated";a:1:{i:0;s:2:"MF";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:17:"abbreviated:alias";a:1:{i:0;s:42:"hu/calendar/islamic/monthNames/format/wide";}s:4:"wide";a:12:{i:0;s:8:"Moharrem";i:1;s:5:"Safar";i:2;s:14:"Rébi el avvel";i:3;s:15:"Rébi el accher";i:4;s:17:"Dsemádi el avvel";i:5;s:18:"Dsemádi el accher";i:6;s:6:"Redseb";i:7;s:6:"Sabán";i:8;s:8:"Ramadán";i:9;s:7:"Sevvál";i:10;s:10:"Dsül kade";i:11;s:11:"Dsül hedse";}}}}s:19:"islamic-civil:alias";a:1:{i:0;s:19:"hu/calendar/islamic";}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hu_HU.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hu_HU.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hu_HU.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hy.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hy.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hy.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:192:{s:2:"AD";a:1:{i:0;s:12:"Ô±Õ¶Õ¤Õ¸Ö€Õ¡";}s:2:"AE";a:1:{i:0;s:50:"Õ„Õ«Õ¡ÖÕµÕ¡Õ¬ Ô±Ö€Õ¡Õ¢Õ¡Õ¯Õ¡Õ¶ Ô·Õ´Õ«Ö€Õ¡Õ©Õ¶Õ¥Ö€";}s:2:"AF";a:1:{i:0;s:18:"Ô±Ö†Õ²Õ¡Õ¶Õ½Õ¿Õ¡Õ¶";}s:2:"AG";a:1:{i:0;s:33:"Ô±Õ¶Õ¿Õ«Õ£Õ¸Ö‚Õ¡-Ô²Õ¡Ö€Õ¢Õ¸Ö‚Õ¤Õ¡";}s:2:"AL";a:1:{i:0;s:14:"Ô±Õ¬Õ¢Õ¡Õ¶Õ«Õ¡";}s:2:"AM";a:1:{i:0;s:47:"Õ€Õ¡ÕµÕ¡Õ½Õ¿Õ¡Õ¶Õ« Õ€Õ¡Õ¶Ö€Õ¡ÕºÕ¥Õ¿Õ¸Ö‚Õ©Õ«Ö‚Õ¶";}s:2:"AO";a:1:{i:0;s:12:"Ô±Õ¶Õ£Õ¸Õ¬Õ¡";}s:2:"AR";a:1:{i:0;s:18:"Ô±Ö€Õ£Õ¥Õ¶Õ¿Õ«Õ¶Õ¡";}s:2:"AT";a:1:{i:0;s:14:"Ô±Õ¾Õ½Õ¿Ö€Õ«Õ¡";}s:2:"AU";a:1:{i:0;s:18:"Ô±Õ¾Õ½Õ¿Ö€Õ¡Õ¬Õ«Õ¡";}s:2:"AZ";a:1:{i:0;s:16:"Ô±Õ¤Ö€Õ¢Õ¥Õ»Õ¡Õ¶";}s:2:"BA";a:1:{i:0;s:35:"Ô²Õ¸Õ½Õ¶Õ«Õ¡-Õ€Õ¥Ö€ÖÕ¥Õ£Õ¸Õ¾Õ«Õ¶Õ¡";}s:2:"BB";a:1:{i:0;s:16:"Ô²Õ¡Ö€Õ¢Õ¡Õ¤Õ¸Õ½";}s:2:"BD";a:1:{i:0;s:18:"Ô²Õ¡Õ¶Õ£Õ¬Õ¡Õ¤Õ¥Õ·";}s:2:"BE";a:1:{i:0;s:12:"Ô²Õ¥Õ¬Õ£Õ«Õ¡";}s:2:"BF";a:1:{i:0;s:25:"Ô²Õ¸Ö‚Ö€Õ¯Õ«Õ¶Õ¡ Õ–Õ¡Õ½Õ¸";}s:2:"BG";a:1:{i:0;s:18:"Ô²Õ¸Ö‚Õ¬Õ²Õ¡Ö€Õ«Õ¡";}s:2:"BH";a:1:{i:0;s:14:"Ô²Õ¡Õ°Ö€Õ¥ÕµÕ¶";}s:2:"BI";a:1:{i:0;s:18:"Ô²Õ¸Ö‚Ö€Õ¸Ö‚Õ¶Õ¤Õ«";}s:2:"BJ";a:1:{i:0;s:10:"Ô²Õ¥Õ¶Õ«Õ¶";}s:2:"BN";a:1:{i:0;s:14:"Ô²Ö€Õ¸Ö‚Õ¶Õ¥Õµ";}s:2:"BO";a:1:{i:0;s:14:"Ô²Õ¸Õ¬Õ«Õ¾Õ«Õ¡";}s:2:"BR";a:1:{i:0;s:16:"Ô²Ö€Õ¡Õ¦Õ«Õ¬Õ«Õ¡";}s:2:"BS";a:1:{i:0;s:16:"Ô²Õ¡Õ°Õ¡Õ´Õ¶Õ¥Ö€";}s:2:"BT";a:1:{i:0;s:12:"Ô²Õ¸Ö‚Õ¿Õ¡Õ¶";}s:2:"BW";a:1:{i:0;s:16:"Ô²Õ¸Õ¿Õ½Õ¾Õ¡Õ¶Õ¡";}s:2:"BY";a:1:{i:0;s:16:"Ô²Õ¥Õ¬Õ¸Õ¼Õ¸Ö‚Õ½";}s:2:"BZ";a:1:{i:0;s:10:"Ô²Õ¥Õ¬Õ«Õ¦";}s:2:"CA";a:1:{i:0;s:12:"Ô¿Õ¡Õ¶Õ¡Õ¤Õ¡";}s:2:"CF";a:1:{i:0;s:70:"Ô¿Õ¥Õ¶Õ¿Ö€Õ¸Õ¶Õ¡Õ¯Õ¡Õ¶ Ô±Ö†Ö€Õ«Õ¯ÕµÕ¡Õ¶ Õ€Õ¡Õ¶Ö€Õ¡ÕºÕ¥Õ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶";}s:2:"CG";a:1:{i:0;s:10:"Ô¿Õ¸Õ¶Õ£Õ¸";}s:2:"CH";a:1:{i:0;s:18:"Õ‡Õ¾Õ¥ÕµÖÕ¡Ö€Õ«Õ¡";}s:2:"CI";a:1:{i:0;s:19:"Õ“Õ²Õ¸Õ½Õ¯Ö€Õ« Ô±Öƒ";}s:2:"CL";a:1:{i:0;s:8:"Õ‰Õ«Õ¬Õ«";}s:2:"CM";a:1:{i:0;s:16:"Ô¿Õ¡Õ´Õ¥Ö€Õ¸Ö‚Õ¶";}s:2:"CN";a:1:{i:0;s:16:"Õ‰Õ«Õ¶Õ¡Õ½Õ¿Õ¡Õ¶";}s:2:"CO";a:1:{i:0;s:18:"Ô¿Õ¸Õ¬Õ¸Ö‚Õ´Õ¢Õ«Õ¡";}s:2:"CR";a:1:{i:0;s:19:"Ô¿Õ¸Õ½Õ¿Õ¡-Ռիկա";}s:2:"CU";a:1:{i:0;s:10:"Ô¿Õ¸Ö‚Õ¢Õ¡";}s:2:"CV";a:1:{i:0;s:19:"Ô¿Õ¡Õ¢Õ¸-ÕŽÕ¥Ö€Õ¤Õ¥";}s:2:"CY";a:1:{i:0;s:12:"Ô¿Õ«ÕºÖ€Õ¸Õ½";}s:2:"CZ";a:1:{i:0;s:45:"Õ‰Õ¥Õ­Õ«Õ¡ÕµÕ« Õ€Õ¡Õ¶Ö€Õ¡ÕºÕ¥Õ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶";}s:2:"DE";a:1:{i:0;s:16:"Ô³Õ¥Ö€Õ´Õ¡Õ¶Õ«Õ¡";}s:2:"DJ";a:1:{i:0;s
:14:"Õ‹Õ«Õ¢Õ¸Ö‚Õ¿Õ«";}s:2:"DK";a:1:{i:0;s:10:"Ô´Õ¡Õ¶Õ«Õ¡";}s:2:"DM";a:1:{i:0;s:16:"Ô´Õ¸Õ´Õ«Õ¶Õ«Õ¯Õ¡";}s:2:"DO";a:1:{i:0;s:51:"Ô´Õ¸Õ´Õ«Õ¶Õ«Õ¯ÕµÕ¡Õ¶ Õ€Õ¡Õ¶Ö€Õ¡ÕºÕ¥Õ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶";}s:2:"DZ";a:1:{i:0;s:10:"Ô±Õ¬ÕªÕ«Ö€";}s:2:"EC";a:1:{i:0;s:14:"Ô·Õ¯Õ¾Õ¡Õ¤Õ¸Ö€";}s:2:"EE";a:1:{i:0;s:14:"Ô·Õ½Õ¿Õ¸Õ¶Õ«Õ¡";}s:2:"EG";a:1:{i:0;s:14:"ÔµÕ£Õ«ÕºÕ¿Õ¸Õ½";}s:2:"EH";a:1:{i:0;s:31:"Ô±Ö€Õ¥Õ¾Õ´Õ¿ÕµÕ¡Õ¶ ÕÕ¡Õ°Õ¡Ö€Õ¡";}s:2:"ER";a:1:{i:0;s:14:"Ô·Ö€Õ«Õ¿Ö€Õ¥Õ¡";}s:2:"ES";a:1:{i:0;s:14:"Ô»Õ½ÕºÕ¡Õ¶Õ«Õ¡";}s:2:"ET";a:1:{i:0;s:14:"ÔµÕ©Õ¸Õ¾ÕºÕ«Õ¡";}s:2:"FI";a:1:{i:0;s:18:"Õ–Õ«Õ¶Õ¬Õ¡Õ¶Õ¤Õ«Õ¡";}s:2:"FJ";a:1:{i:0;s:8:"Õ–Õ«Õ»Õ«";}s:2:"FM";a:1:{i:0;s:20:"Õ„Õ«Õ¯Ö€Õ¸Õ¶Õ¥Õ¦Õ«Õ¡";}s:2:"FR";a:1:{i:0;s:14:"Õ–Ö€Õ¡Õ¶Õ½Õ«Õ¡";}s:2:"GA";a:1:{i:0;s:10:"Ô³Õ¡Õ¢Õ¸Õ¶";}s:2:"GB";a:1:{i:0;s:23:"Õ„Õ¥Õ® Ô²Ö€Õ«Õ¿Õ¡Õ¶Õ«Õ¡";}s:2:"GD";a:1:{i:0;s:14:"Ô³Ö€Õ¥Õ¶Õ¡Õ¤Õ¡";}s:2:"GE";a:1:{i:0;s:14:"ÕŽÖ€Õ¡Õ½Õ¿Õ¡Õ¶";}s:2:"GH";a:1:{i:0;s:8:"Ô³Õ¡Õ¶Õ¡";}s:2:"GM";a:1:{i:0;s:12:"Ô³Õ¡Õ´Õ¢Õ«Õ¡";}s:2:"GN";a:1:{i:0;s:12:"Ô³Õ¾Õ«Õ¶Õ¥Õ¡";}s:2:"GQ";a:1:{i:0;s:39:"Õ€Õ¡Õ½Õ¡Ö€Õ¡Õ¯Õ¡Õ®Õ¡ÕµÕ«Õ¶ Ô³Õ¾Õ«Õ¶Õ¥Õ¡";}s:2:"GR";a:1:{i:0;s:18:"Õ€Õ¸Ö‚Õ¶Õ¡Õ½Õ¿Õ¡Õ¶";}s:2:"GT";a:1:{i:0;s:18:"Ô³Õ¾Õ¡Õ¿Õ¥Õ´Õ¡Õ¬Õ¡";}s:2:"GW";a:1:{i:0;s:25:"Ô³Õ¾Õ«Õ¶Õ¥Õ¡-Ô²Õ«Õ½Õ¡Õ¸Ö‚";}s:2:"GY";a:1:{i:0;s:12:"Ô³Õ¡ÕµÕ¡Õ¶Õ¡";}s:2:"HN";a:1:{i:0;s:18:"Õ€Õ¸Õ¶Õ¤Õ¸Ö‚Ö€Õ¡Õ½";}s:2:"HR";a:1:{i:0;s:16:"Õ€Õ¸Ö€Õ¾Õ¡Õ©Õ«Õ¡";}s:2:"HT";a:1:{i:0;s:10:"Õ€Õ¡Õ«Õ©Õ«";}s:2:"HU";a:1:{i:0;s:18:"Õ€Õ¸Ö‚Õ¶Õ£Õ¡Ö€Õ«Õ¡";}s:2:"ID";a:1:{i:0;s:18:"Ô»Õ¶Õ¤Õ¸Õ¶Õ¥Õ¦Õ«Õ¡";}s:2:"IE";a:1:{i:0;s:16:"Ô»Õ¼Õ¬Õ¡Õ¶Õ¤Õ«Õ¡";}s:2:"IL";a:1:{i:0;s:14:"Ô»Õ½Ö€Õ¡ÕµÕ¥Õ¬";}s:2:"IN";a:1:{i:0;s:18:"Õ€Õ¶Õ¤Õ¯Õ¡Õ½Õ¿Õ¡Õ¶";}s:2:"IQ";a:1:{i:0;s:8:"Ô»Ö€Õ¡Ö„";}s:2:"IR";a:1:{i:0;s:8:"Ô»Ö€Õ¡Õ¶";}s:2:"IS";a:1:{i:0;s:16:"Ô»Õ½Õ¬Õ¡Õ¶Õ¤Õ«Õ¡";}s:2:"IT";a:1:{i:0;s:12:"Ô»Õ¿Õ¡Õ¬Õ«Õ¡";}s:2:"JM";a:1:{i:0;s:14:"Õ‹Õ¡Õ´Õ¡ÕµÕ¯Õ¡";}s:2:"JO";a:1:{i:0;s:16:"Õ€Õ¸Ö€Õ¤Õ¡Õ¶Õ¡Õ¶";}s:2:"JP";a:1:{i:0;s:14:"ÕƒÕ¡ÕºÕ¸Õ¶Õ«Õ¡";}s:2:"KE";a:1:{i:0;s:10:"Õ”Õ¥Õ¶Õ«Õ¡";}s:2:"KG";a:1:{i:0;s:20:"Ô¿Õ«Ö€Õ£Õ«Õ¦Õ½Õ¿Õ¡Õ¶";}s:2:"KH";a:1:{i:0;s:14:"Ô¿Õ¡Õ´Õ¢Õ¸Õ»Õ¡";}s:2:"KI";a:1:{i:0;s:16:"Ô¿Õ«Ö€Õ«Õ¢Õ¡Õ¿Õ«";}s:2:"KM";a:1:{i:0;s:14:"Ô¿Õ¸Õ´Õ¸Ö€Õ¸Õ½";}s:2:
"KN";a:1:{i:0;s:28:"ÕÕ¥Õ¶Õ¿ Ô¿Õ«Õ¿Õ½-Õ†Õ¥Õ¾Õ«Õ½";}s:2:"KP";a:1:{i:0;s:33:"Õ€ÕµÕ¸Ö‚Õ½Õ«Õ½Õ¡ÕµÕ«Õ¶ Ô¿Õ¸Ö€Õ¥Õ¡";}s:2:"KR";a:1:{i:0;s:29:"Õ€Õ¡Ö€Õ¡Õ¾Õ¡ÕµÕ«Õ¶ Ô¿Õ¸Ö€Õ¥Õ¡";}s:2:"KW";a:1:{i:0;s:14:"Õ”Õ¸Ö‚Õ¾Õ¥ÕµÕ©";}s:2:"KZ";a:1:{i:0;s:18:"Õ‚Õ¡Õ¦Õ¡Õ­Õ½Õ¿Õ¡Õ¶";}s:2:"LA";a:1:{i:0;s:8:"Ô¼Õ¡Õ¸Õ½";}s:2:"LB";a:1:{i:0;s:14:"Ô¼Õ«Õ¢Õ¡Õ¶Õ¡Õ¶";}s:2:"LC";a:1:{i:0;s:23:"ÕÕ¡Õ¶Õ¿Õ¡ Ô¼Õ¸Ö‚Õ¹Õ«Õ¡";}s:2:"LI";a:1:{i:0;s:22:"Ô¼Õ«Õ­Õ¿Õ¥Õ¶Õ·Õ¿Õ¥ÕµÕ¶";}s:2:"LK";a:1:{i:0;s:17:"Õ‡Ö€Õ« Ô¼Õ¡Õ¶Õ¯Õ¡";}s:2:"LR";a:1:{i:0;s:14:"Ô¼Õ«Õ¢Õ¥Ö€Õ«Õ¡";}s:2:"LS";a:1:{i:0;s:12:"Ô¼Õ¥Õ½Õ¸Õ¿Õ¸";}s:2:"LT";a:1:{i:0;s:10:"Ô¼Õ«Õ¿Õ¾Õ¡";}s:2:"LU";a:1:{i:0;s:26:"Ô¼ÕµÕ¸Ö‚Ö„Õ½Õ¥Õ´Õ¢Õ¸Ö‚Ö€Õ£";}s:2:"LV";a:1:{i:0;s:12:"Ô¼Õ¡Õ¿Õ¾Õ«Õ¡";}s:2:"LY";a:1:{i:0;s:10:"Ô¼Õ«Õ¢Õ«Õ¡";}s:2:"MA";a:1:{i:0;s:12:"Õ„Õ¡Ö€Õ¸Õ¯Õ¸";}s:2:"MC";a:1:{i:0;s:12:"Õ„Õ¸Õ¶Õ¡Õ¯Õ¸";}s:2:"MD";a:1:{i:0;s:14:"Õ„Õ¸Õ¬Õ¤Õ¸Õ¾Õ¡";}s:2:"MG";a:1:{i:0;s:20:"Õ„Õ¡Õ¤Õ¡Õ£Õ¡Õ½Õ¯Õ¡Ö€";}s:2:"MH";a:1:{i:0;s:33:"Õ„Õ¡Ö€Õ·Õ¡Õ¬ÕµÕ¡Õ¶ Õ¯Õ²Õ¦Õ«Õ¶Õ¥Ö€";}s:2:"MK";a:1:{i:0;s:18:"Õ„Õ¡Õ¯Õ¥Õ¤Õ¸Õ¶Õ«Õ¡";}s:2:"ML";a:1:{i:0;s:8:"Õ„Õ¡Õ¬Õ«";}s:2:"MM";a:1:{i:0;s:12:"Õ„ÕµÕ¡Õ¶Õ´Õ¡";}s:2:"MN";a:1:{i:0;s:16:"Õ„Õ¸Õ¶Õ²Õ¸Õ¬Õ«Õ¡";}s:2:"MR";a:1:{i:0;s:20:"Õ„Õ¡Õ¾Ö€Õ«Õ¿Õ¡Õ¶Õ«Õ¡";}s:2:"MT";a:1:{i:0;s:10:"Õ„Õ¡Õ¬Õ©Õ¡";}s:2:"MU";a:1:{i:0;s:16:"Õ„Õ¡Õ¾Ö€Õ«Õ¿Õ¸Õ½";}s:2:"MV";a:1:{i:0;s:18:"Õ„Õ¡Õ¬Õ¤Õ«Õ¾Õ¶Õ¥Ö€";}s:2:"MW";a:1:{i:0;s:12:"Õ„Õ¡Õ¬Õ¡Õ¾Õ«";}s:2:"MX";a:1:{i:0;s:14:"Õ„Õ¥Ö„Õ½Õ«Õ¯Õ¡";}s:2:"MY";a:1:{i:0;s:16:"Õ„Õ¡Õ¬Õ¡ÕµÕ¦Õ«Õ¡";}s:2:"MZ";a:1:{i:0;s:16:"Õ„Õ¸Õ¦Õ¡Õ´Õ¢Õ«Õ¯";}s:2:"NA";a:1:{i:0;s:14:"Õ†Õ¡Õ´Õ«Õ¢Õ«Õ¡";}s:2:"NE";a:1:{i:0;s:10:"Õ†Õ«Õ£Õ¥Ö€";}s:2:"NG";a:1:{i:0;s:14:"Õ†Õ«Õ£Õ¥Ö€Õ«Õ¡";}s:2:"NI";a:1:{i:0;s:20:"Õ†Õ«Õ¯Õ¡Ö€Õ¡Õ£Õ¸Ö‚Õ¡";}s:2:"NL";a:1:{i:0;s:22:"Õ†Õ«Õ¤Õ¥Ö€Õ¬Õ¡Õ¶Õ¤Õ¥Ö€";}s:2:"NO";a:1:{i:0;s:16:"Õ†Õ¸Ö€Õ¾Õ¥Õ£Õ«Õ¡";}s:2:"NP";a:1:{i:0;s:10:"Õ†Õ¥ÕºÕ¡Õ¬";}s:2:"NR";a:1:{i:0;s:14:"Õ†Õ¡Õ¸Ö‚Ö€Õ¸Ö‚";}s:2:"NZ";a:1:{i:0;s:23:"Õ†Õ¸Ö€ Ô¶Õ¥Õ¬Õ¡Õ¶Õ¤Õ«Õ¡";}s:2:"OM";a:1:{i:0;s:8:"Õ•Õ´Õ¡Õ¶";}s:2:"PA";a:1:{i:0;s:12:"ÕŠÕ¡Õ¶Õ¡Õ´Õ¡";}s:2:"PE";a:1:{i:0;s:10:"ÕŠÕ¥Ö€Õ¸Ö‚";}s:2:"PG";a:1:{i:0;s:32:"ÕŠÕ¡ÕºÕ¸Ö‚Õ¡ Õ†Õ¸Ö€ Ô³Õ¾Õ«Õ¶Õ¥Õ¡";}s:2:"PH";a:1:{i:0;s:20:"Õ–Õ«Õ¬Õ«ÕºÕ«Õ¶Õ¶Õ¥Ö€";}s:2:
"PK";a:1:{i:0;s:16:"ÕŠÕ¡Õ¯Õ«Õ½Õ¿Õ¡Õ¶";}s:2:"PL";a:1:{i:0;s:16:"Ô¼Õ¥Õ°Õ¡Õ½Õ¿Õ¡Õ¶";}s:2:"PT";a:1:{i:0;s:22:"ÕŠÕ¸Ö€Õ¿Õ¸Ö‚Õ£Õ¡Õ¬Õ«Õ¡";}s:2:"PW";a:1:{i:0;s:12:"ÕŠÕ¡Õ¬Õ¡Õ¸Ö‚";}s:2:"PY";a:1:{i:0;s:16:"ÕŠÕ¡Ö€Õ¡Õ£Õ¾Õ¡Õµ";}s:2:"QA";a:1:{i:0;s:10:"Ô¿Õ¡Õ¿Õ¡Ö€";}s:2:"RO";a:1:{i:0;s:16:"Ռումինիա";}s:2:"RU";a:1:{i:0;s:18:"Ռուսաստան";}s:2:"RW";a:1:{i:0;s:14:"Ռուանդա";}s:2:"SA";a:1:{i:0;s:29:"ÕÕ¡Õ¸Ö‚Õ¤Õ«Õ¡Õ¶ Ô±Ö€Õ¡Õ¢Õ«Õ¡";}s:2:"SB";a:1:{i:0;s:35:"ÕÕ¸Õ¬Õ¸Õ´Õ¸Õ¶ÕµÕ¡Õ¶ Õ¯Õ²Õ¦Õ«Õ¶Õ¥Ö€";}s:2:"SC";a:1:{i:0;s:18:"ÕÕ¥ÕµÕ·Õ¥Õ¬Õ¶Õ¥Ö€";}s:2:"SD";a:1:{i:0;s:12:"ÕÕ¸Ö‚Õ¤Õ¡Õ¶";}s:2:"SE";a:1:{i:0;s:12:"Õ‡Õ¾Õ¥Õ¤Õ«Õ¡";}s:2:"SG";a:1:{i:0;s:18:"ÕÕ«Õ¶Õ£Õ¡ÕºÕ¸Ö‚Ö€";}s:2:"SI";a:1:{i:0;s:16:"ÕÕ¬Õ¸Õ¾Õ¥Õ¶Õ«Õ¡";}s:2:"SK";a:1:{i:0;s:16:"ÕÕ¬Õ¸Õ¾Õ¡Õ¯Õ«Õ¡";}s:2:"SL";a:1:{i:0;s:21:"ÕÕµÕ¥Ö€Õ¡-Ô¼Õ¥Õ¸Õ¶Õ¥";}s:2:"SM";a:1:{i:0;s:19:"ÕÕ¡Õ¶ Õ„Õ¡Ö€Õ«Õ¶Õ¸";}s:2:"SN";a:1:{i:0;s:14:"ÕÕ¥Õ¶Õ¥Õ£Õ¡Õ¬";}s:2:"SO";a:1:{i:0;s:12:"ÕÕ¸Õ´Õ¡Õ¬Õ«";}s:2:"SP";a:1:{i:0;s:12:"ÕÕ¥Ö€Õ¢Õ«Õ¡";}s:2:"SR";a:1:{i:0;s:16:"ÕÕ¸Ö‚Ö€Õ«Õ¶Õ¡Õ´";}s:2:"ST";a:1:{i:0;s:32:"ÕÕ¡Õ¶-Ô¹Õ¸Õ´Õ¥-Õ“Ö€Õ«Õ¶Õ½Õ«ÕºÕ«";}s:2:"SV";a:1:{i:0;s:16:"ÕÕ¡Õ¬Õ¾Õ¡Õ¤Õ¸Ö€";}s:2:"SY";a:1:{i:0;s:10:"ÕÕ«Ö€Õ«Õ¡";}s:2:"SZ";a:1:{i:0;s:18:"ÕÕ¾Õ¡Õ¦Õ«Õ¬Õ¥Õ¶Õ¤";}s:2:"TD";a:1:{i:0;s:6:"Õ‰Õ¡Õ¤";}s:2:"TG";a:1:{i:0;s:8:"ÕÕ¸Õ£Õ¸";}s:2:"TH";a:1:{i:0;s:14:"Ô¹Õ¡Õ«Õ¬Õ¡Õ¶Õ¤";}s:2:"TJ";a:1:{i:0;s:18:"ÕÕ¡Õ³Õ«Õ¯Õ½Õ¿Õ¡Õ¶";}s:2:"TM";a:1:{i:0;s:24:"Ô¹Õ¸Ö‚Ö€Ö„Õ´Õ¥Õ¶Õ½Õ¿Õ¡Õ¶";}s:2:"TN";a:1:{i:0;s:12:"Ô¹Õ¸Ö‚Õ¶Õ«Õ½";}s:2:"TO";a:1:{i:0;s:10:"ÕÕ¸Õ¶Õ£Õ¡";}s:2:"TR";a:1:{i:0;s:14:"Ô¹Õ¸Ö‚Ö€Ö„Õ«Õ¡";}s:2:"TT";a:1:{i:0;s:29:"ÕÖ€Õ«Õ¶Õ«Õ¤Õ¡Õ¤-ÕÕ¸Õ¢Õ¡Õ£Õ¸";}s:2:"TV";a:1:{i:0;s:16:"ÕÕ¸Ö‚Õ¾Õ¡Õ¬Õ¸Ö‚";}s:2:"TW";a:1:{i:0;s:12:"Ô¹Õ¡ÕµÕ¾Õ¡Õ¶";}s:2:"TZ";a:1:{i:0;s:16:"ÕÕ¡Õ¶Õ¦Õ¡Õ¶Õ«Õ¡";}s:2:"UA";a:1:{i:0;s:16:"ÕˆÖ‚Õ¯Ö€Õ¡Õ«Õ¶Õ¡";}s:2:"UG";a:1:{i:0;s:14:"ÕˆÖ‚Õ£Õ¡Õ¶Õ¤Õ¡";}s:2:"US";a:1:{i:0;s:52:"Ô±Õ´Õ§Ö€Õ«Õ¯Õ¡ÕµÕ« Õ„Õ«Õ¡ÖÕµÕ¡Õ¬ Õ†Õ¡Õ°Õ¡Õ¶Õ£Õ¶Õ§Ö€";}s:2:"UY";a:1:{i:0;s:18:"ÕˆÖ‚Ö€Õ¸Ö‚Õ£Õ¾Õ¡Õµ";}s:2:"UZ";a:1:{i:0;s:20:"ÕˆÖ‚Õ¦Õ¢Õ¥Õ¯Õ½Õ¿Õ¡Õ¶";}s:2:"VA";a:1:{i:0;s:14:"ÕŽÕ¡Õ¿Õ«Õ¯Õ¡Õ¶";}s:2:"VC";a:1:{i:0;s:44:"ÕÕ¥Õ¶Õ¿ ÕŽÕ«Õ½Õ¥Õ¶Õ¿-Ô³Ö€Õ¥Õ¶Õ¡Õ¤Õ«
Õ¶Õ¶Õ¥Ö€";}s:2:"VE";a:1:{i:0;s:20:"ÕŽÕ¥Õ¶Õ¥Õ½Õ¸Ö‚Õ¥Õ¬Õ¡";}s:2:"VN";a:1:{i:0;s:14:"ÕŽÕ«Õ¥Õ¿Õ¶Õ¡Õ´";}s:2:"VU";a:1:{i:0;s:18:"ÕŽÕ¡Õ¶Õ¸Ö‚Õ¡Õ¿Õ¸Ö‚";}s:2:"WS";a:1:{i:0;s:10:"ÕÕ¡Õ´Õ¸Õ¡";}s:2:"YE";a:1:{i:0;s:8:"ÔµÕ´Õ¥Õ¶";}s:2:"ZA";a:1:{i:0;s:31:"Õ€Õ¡Ö€Õ¡Õ¾Õ¡ÕµÕ«Õ¶ Ô±Ö†Ö€Õ«Õ¯Õ¡";}s:2:"ZM";a:1:{i:0;s:12:"Ô¶Õ¡Õ´Õ¢Õ«Õ¡";}s:2:"ZW";a:1:{i:0;s:16:"Ô¶Õ«Õ´Õ¢Õ¡Õ¢Õ¾Õ¥";}}s:9:"Languages";a:1:{s:2:"hy";a:1:{i:0;s:14:"Õ€Õ¡ÕµÕ¥Ö€Õ§Õ¶";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Armn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:14:"#0.###;-#0.###";i:1;s:18:"#0.00 ¤;-#0.00 ¤";i:2;s:3:"#0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:6:{s:11:"AmPmMarkers";a:2:{i:0;s:7:"Առ․";i:1;s:7:"Եր․";}s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:18:"EEEE, MMMM d, yyyy";i:5;s:13:"MMMM dd, yyyy";i:6;s:11:"MMM d, yyyy";i:7;s:8:"MM/dd/yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:6:"Ô¿Õ«Ö€";i:1;s:6:"ÔµÖ€Õ¯";i:2;s:6:"ÔµÖ€Ö„";i:3;s:6:"Õ‰Õ¸Ö€";i:4;s:6:"Õ€Õ¶Õ£";i:5;s:6:"ÕˆÖ‚Ö€";i:6;s:6:"Õ‡Õ¡Õ¢";}s:4:"wide";a:7:{i:0;s:12:"Ô¿Õ«Ö€Õ¡Õ¯Õ«";i:1;s:20:"ÔµÖ€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«";i:2;s:18:"ÔµÖ€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«";i:3;s:20:"Õ‰Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«";i:4;s:18:"Õ€Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«";i:5;s:12:"ÕˆÖ‚Ö€Õ¢Õ¡Õ©";i:6;s:10:"Õ‡Õ¡Õ¢Õ¡Õ©";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:10:"Յ․Õ․";i:1;s:10:"Ն․Ք․";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:6:"Õ…Õ¶Ö€";i:1;s:6:"Õ“Õ¿Ö€";i:2;s:6:"Õ„Ö€Õ¿";i:3;s:6:"Ô±ÕºÖ€";i:4;s:6:"Õ„ÕµÕ½";i:5;s:6:"Õ…Õ¶Õ½";i:6;s:6:"Õ…Õ¬Õ½";i:7;s:6:"Õ•Õ£Õ½";i:8;s:6:"ÕÕ¥Õº";i:9;s:6:"Õ€Õ¸Õ¯";i:10;s:6:"Õ†Õ¸Õµ";i:11;s:6:"Ô´Õ¥Õ¯";}s:4:"wide";a:12:{i:0;s:16:"Õ…Õ¸Ö‚Õ¶Õ¸Ö‚Õ¡Ö€";i:1;s:16:"Õ“Õ¥Õ¿Ö€Õ¸Ö‚Õ¡Ö€";i:2;s:8:"Õ„Õ¡Ö€Õ¿";i:3;s:10:"Ô±ÕºÖ€Õ«Õ¬";i:4;s:10:"Õ
„Õ¡ÕµÕ«Õ½";i:5;s:12:"Õ…Õ¸Ö‚Õ¶Õ«Õ½";i:6;s:12:"Õ…Õ¸Ö‚Õ¬Õ«Õ½";i:7;s:14:"Õ•Õ£Õ¸Õ½Õ¿Õ¸Õ½";i:8;s:18:"ÕÕ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€";i:9;s:18:"Õ€Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€";i:10;s:16:"Õ†Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€";i:11;s:18:"Ô´Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hy_AM.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hy_AM.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hy_AM.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:10:"Ք․Ա․";i:1;s:10:"Ք․Ե․";}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hy_AM_REVISED.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hy_AM_REVISED.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/hy_AM_REVISED.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:11:"AmPmMarkers";a:2:{i:0;s:7:"Առ․";i:1;s:7:"Կե․";}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:15:"Մ․Թ․Ա․";i:1;s:10:"Մ․Թ․";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:6:"Õ€Õ¶Õ¾";i:1;s:6:"Õ“Õ¿Õ¾";i:2;s:6:"Õ„Ö€Õ¿";i:3;s:6:"Ô±ÕºÖ€";i:4;s:6:"Õ„ÕµÕ½";i:5;s:6:"Õ€Õ¶Õ½";i:6;s:6:"Õ€Õ¬Õ½";i:7;s:6:"Õ•Õ£Õ½";i:8;s:6:"ÕÕ¥Õº";i:9;s:6:"Õ€Õ¸Õ¯";i:10;s:6:"Õ†Õ¸Õµ";i:11;s:6:"Ô´Õ¥Õ¯";}s:4:"wide";a:12:{i:0;s:14:"Õ€Õ¸Ö‚Õ¶Õ¾Õ¡Ö€";i:1;s:14:"Õ“Õ¥Õ¿Ö€Õ¾Õ¡Ö€";i:2;s:8:"Õ„Õ¡Ö€Õ¿";i:3;s:10:"Ô±ÕºÖ€Õ«Õ¬";i:4;s:10:"Õ„Õ¡ÕµÕ«Õ½";i:5;s:12:"Õ€Õ¸Ö‚Õ¶Õ«Õ½";i:6;s:12:"Õ€Õ¸Ö‚Õ¬Õ«Õ½";i:7;s:14:"Õ•Õ£Õ¸Õ½Õ¿Õ¸Õ½";i:8;s:18:"ÕÕ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€";i:9;s:18:"Õ€Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€";i:10;s:16:"Õ†Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€";i:11;s:18:"Ô´Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/id.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/id.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/id.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:8:{s:9:"Countries";a:235:{s:2:"AD";a:1:{i:0;s:6:"Andora";}s:2:"AE";a:1:{i:0;s:15:"Uni Emirat Arab";}s:2:"AF";a:1:{i:0;s:11:"Afghanistan";}s:2:"AG";a:1:{i:0;s:19:"Antigua dan Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:7:"Albania";}s:2:"AM";a:1:{i:0;s:7:"Armenia";}s:2:"AN";a:1:{i:0;s:16:"Antilles Belanda";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarktika";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:13:"Samoa Amerika";}s:2:"AT";a:1:{i:0;s:7:"Austria";}s:2:"AU";a:1:{i:0;s:9:"Australia";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:10:"Azerbaijan";}s:2:"BA";a:1:{i:0;s:22:"Bosnia dan Herzegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BE";a:1:{i:0;s:6:"Belgia";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:8:"Bulgaria";}s:2:"BH";a:1:{i:0;s:7:"Bahrain";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:6:"Brunei";}s:2:"BO";a:1:{i:0;s:7:"Bolivia";}s:2:"BR";a:1:{i:0;s:6:"Brazil";}s:2:"BS";a:1:{i:0;s:7:"Bahamas";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BV";a:1:{i:0;s:16:"Kepulauan Bouvet";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:9:"Belarusia";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:15:"Kepulauan Cocos";}s:2:"CD";a:1:{i:0;s:25:"Republik Demokratik Kongo";}s:2:"CF";a:1:{i:0;s:22:"Republik Afrika Tengah";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:5:"Swiss";}s:2:"CI";a:1:{i:0;s:13:"Pantai Gading";}s:2:"CK";a:1:{i:0;s:14:"Kepulauan Cook";}s:2:"CL";a:1:{i:0;s:5:"Chili";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:4:"Cina";}s:2:"CO";a:1:{i:0;s:8:"Kolombia";}s:2:"CR";a:1:{i:0;s:10:"Kosta Rika";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:13:"Tanjung Verde";}s:2:"CX";a:1:{i:0;s:15:"Pulau Christmas";}s:2:"CY";a:1:{i:0;s:6:"Siprus";}s:2:"CZ";a:1:{i:0;s:13:"Republik Ceko";}s:2:"DE";a:1:{i:0;s:6:"Jerman";}s:2:"DJ";a:1:{i:0;s:7:"Jibouti";}s:2:"DK";a:1:{i:0;s:7:"Denmark";}s:2:"DM";a:1
:{i:0;s:8:"Dominika";}s:2:"DO";a:1:{i:0;s:17:"Republik Dominika";}s:2:"DZ";a:1:{i:0;s:7:"Algeria";}s:2:"EC";a:1:{i:0;s:7:"Ekuador";}s:2:"EE";a:1:{i:0;s:7:"Estonia";}s:2:"EG";a:1:{i:0;s:5:"Mesir";}s:2:"EH";a:1:{i:0;s:12:"Sahara Barat";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:7:"Spanyol";}s:2:"ET";a:1:{i:0;s:8:"Ethiopia";}s:2:"FI";a:1:{i:0;s:9:"Finlandia";}s:2:"FJ";a:1:{i:0;s:4:"Fiji";}s:2:"FK";a:1:{i:0;s:18:"Kepulauan Falkland";}s:2:"FM";a:1:{i:0;s:10:"Mikronesia";}s:2:"FO";a:1:{i:0;s:15:"Kepulauan Faroe";}s:2:"FR";a:1:{i:0;s:8:"Perancis";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:12:"Inggris Raya";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:7:"Georgia";}s:2:"GF";a:1:{i:0;s:15:"Guyana Perancis";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:9:"Greenland";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:19:"Guinea Khatulistiwa";}s:2:"GR";a:1:{i:0;s:6:"Yunani";}s:2:"GS";a:1:{i:0;s:46:"Georgia Selatan dan Kepulauan Sandwich Selatan";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinea-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:22:"Hong Kong S.A.R., Cina";}s:2:"HM";a:1:{i:0;s:34:"Pulau Heard dan Kepulauan McDonald";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:7:"Kroasia";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:8:"Hungaria";}s:2:"ID";a:1:{i:0;s:9:"Indonesia";}s:2:"IE";a:1:{i:0;s:8:"Irlandia";}s:2:"IL";a:1:{i:0;s:6:"Israel";}s:2:"IN";a:1:{i:0;s:5:"India";}s:2:"IQ";a:1:{i:0;s:4:"Iraq";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:8:"Islandia";}s:2:"IT";a:1:{i:0;s:5:"Itali";}s:2:"JM";a:1:{i:0;s:7:"Jamaika";}s:2:"JO";a:1:{i:0;s:8:"Yordania";}s:2:"JP";a:1:{i:0;s:6:"Jepang";}s:2:"KE";a:1:{i:0;s:5:"Kenya";}s:2:"KG";a:1:{i:0;s:10:"Kyrgyzstan";}s:2:"KH";a:1:{i:0;s:7:"Kamboja";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:7:"Komoros";}s:2:"KN";a:1:{i:0;s:21:"Saint Kitts dan Nevis";}s:2:"KP"
;a:1:{i:0;s:11:"Korea Utara";}s:2:"KR";a:1:{i:0;s:13:"Korea Selatan";}s:2:"KW";a:1:{i:0;s:6:"Kuwait";}s:2:"KY";a:1:{i:0;s:16:"Kepulauan Kayman";}s:2:"KZ";a:1:{i:0;s:10:"Kazakhstan";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:7:"Lebanon";}s:2:"LC";a:1:{i:0;s:11:"Santa Lusia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberia";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:9:"Lithuania";}s:2:"LU";a:1:{i:0;s:10:"Luxembourg";}s:2:"LV";a:1:{i:0;s:6:"Latvia";}s:2:"LY";a:1:{i:0;s:5:"Libya";}s:2:"MA";a:1:{i:0;s:6:"Maroko";}s:2:"MC";a:1:{i:0;s:6:"Monaco";}s:2:"MD";a:1:{i:0;s:7:"Moldova";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:18:"Kepulauan Marshall";}s:2:"MK";a:1:{i:0;s:9:"Macedonia";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:8:"Mongolia";}s:2:"MO";a:1:{i:0;s:17:"Makao S.A.R. Cina";}s:2:"MP";a:1:{i:0;s:23:"Kepualuan Mariana Utara";}s:2:"MQ";a:1:{i:0;s:10:"Martinique";}s:2:"MR";a:1:{i:0;s:10:"Mauritania";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:8:"Maldives";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:6:"Mexico";}s:2:"MY";a:1:{i:0;s:8:"Malaysia";}s:2:"MZ";a:1:{i:0;s:10:"Mozambique";}s:2:"NA";a:1:{i:0;s:7:"Namibia";}s:2:"NC";a:1:{i:0;s:14:"Kaledonia Baru";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:17:"Kepulauan Norfolk";}s:2:"NG";a:1:{i:0;s:7:"Nigeria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:11:"Netherlands";}s:2:"NO";a:1:{i:0;s:8:"Norwegia";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:13:"Selandia Baru";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:18:"Polynesia Perancis";}s:2:"PG";a:1:{i:0;s:12:"Papua Nugini";}s:2:"PH";a:1:{i:0;s:8:"Filipina";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:8:"Polandia";}s:2:"PM";a:1:{i:0;s:25:"Saint Pierre da
n Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:11:"Puerto Riko";}s:2:"PS";a:1:{i:0;s:18:"Otoritas Palestina";}s:2:"PT";a:1:{i:0;s:8:"Portugis";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Qatar";}s:2:"RE";a:1:{i:0;s:8:"Réunion";}s:2:"RO";a:1:{i:0;s:7:"Romania";}s:2:"RU";a:1:{i:0;s:5:"Rusia";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:10:"Arab Saudi";}s:2:"SB";a:1:{i:0;s:17:"Kepulauan Solomon";}s:2:"SC";a:1:{i:0;s:10:"Seychelles";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:6:"Sweden";}s:2:"SG";a:1:{i:0;s:9:"Singapura";}s:2:"SH";a:1:{i:0;s:12:"Saint Helena";}s:2:"SI";a:1:{i:0;s:8:"Slovenia";}s:2:"SJ";a:1:{i:0;s:22:"Svalbard dan Jan Mayen";}s:2:"SK";a:1:{i:0;s:8:"Slovakia";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:7:"Somalia";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:8:"Suriname";}s:2:"ST";a:1:{i:0;s:21:"Sao Tome dan Principe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:5:"Syria";}s:2:"SZ";a:1:{i:0;s:9:"Swaziland";}s:2:"TD";a:1:{i:0;s:4:"Chad";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:8:"Thailand";}s:2:"TJ";a:1:{i:0;s:10:"Tajikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:7:"Tunisia";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:6:"Turkey";}s:2:"TT";a:1:{i:0;s:19:"Trinidad dan Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Taiwan";}s:2:"TZ";a:1:{i:0;s:8:"Tanzania";}s:2:"UA";a:1:{i:0;s:7:"Ukraina";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"US";a:1:{i:0;s:15:"Amerika Serikat";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:10:"Uzbekistan";}s:2:"VA";a:1:{i:0;s:7:"Vatikan";}s:2:"VC";a:1:{i:0;s:28:"Saint Vincent dan Grenadines";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:24:"Kepulauan British Virgin";}s:2:"VI";a:1:{i:0;s:21:"Kepulauan U.S. Virgin";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;
s:17:"Wallis dan Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Yaman";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:10:"Yugoslavia";}s:2:"ZA";a:1:{i:0;s:14:"Afrika Selatan";}s:2:"ZM";a:1:{i:0;s:6:"Zambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:1:{s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:3:"IDR";}}s:9:"Languages";a:227:{s:2:"aa";a:1:{i:0;s:4:"Afar";}s:2:"ab";a:1:{i:0;s:6:"Abkhaz";}s:3:"ace";a:1:{i:0;s:4:"Aceh";}s:2:"ae";a:1:{i:0;s:7:"Avestan";}s:2:"af";a:1:{i:0;s:9:"Afrikaans";}s:3:"afa";a:1:{i:0;s:22:"Afro-Asiatik (Lainnya)";}s:2:"ak";a:1:{i:0;s:4:"Akan";}s:3:"akk";a:1:{i:0;s:8:"Akkadien";}s:3:"alg";a:1:{i:0;s:16:"Bahasa Algonquia";}s:2:"am";a:1:{i:0;s:7:"Amharik";}s:3:"ang";a:1:{i:0;s:26:"Inggris Kuno (kl.450-1100)";}s:3:"apa";a:1:{i:0;s:20:"Bahasa-bahasa Apache";}s:2:"ar";a:1:{i:0;s:4:"Arab";}s:3:"arc";a:1:{i:0;s:4:"Aram";}s:3:"arn";a:1:{i:0;s:7:"Araucan";}s:3:"art";a:1:{i:0;s:16:"Buatan (Lainnya)";}s:2:"as";a:1:{i:0;s:5:"Assam";}s:3:"ast";a:1:{i:0;s:5:"Astur";}s:3:"ath";a:1:{i:0;s:23:"Bahasa-bahasa Athapaska";}s:3:"aus";a:1:{i:0;s:23:"Bahasa-bahasa Australia";}s:2:"av";a:1:{i:0;s:6:"Avarik";}s:2:"ay";a:1:{i:0;s:6:"Aymara";}s:2:"az";a:1:{i:0;s:10:"Azerbaijan";}s:2:"ba";a:1:{i:0;s:7:"Bashkir";}s:3:"bai";a:1:{i:0;s:22:"Bahasa-bahasa Bamileke";}s:3:"ban";a:1:{i:0;s:5:"Balin";}s:3:"bat";a:1:{i:0;s:16:"Baltik (Lainnya)";}s:2:"be";a:1:{i:0;s:9:"Belarusia";}s:2:"bg";a:1:{i:0;s:8:"Bulgaria";}s:2:"bh";a:1:{i:0;s:6:"Bihari";}s:2:"bi";a:1:{i:0;s:7:"Bislama";}s:2:"bm";a:1:{i:0;s:7:"Bambara";}s:2:"bn";a:1:{i:0;s:6:"Bengal";}s:2:"bo";a:1:{i:0;s:5:"Tibet";}s:2:"br";a:1:{i:0;s:6:"Breton";}s:2:"bs";a:1:{i:0;s:6:"Bosnia";}s:3:"bug";a:1:{i:0;s:5:"Bugis";}s:2:"ca";a:1:{i:0;s:7:"Catalan";}s:3:"cai";a:1:{i:0;s:31:"India Amerika Tengah (Lainnnya)";}s:3:"car";a:1:{i:0;s:5:"Karib";}s:3:"cau";a:1:{i:0;s:18:"Kaukasia (Lainnya)";}s:2:"ce";a:1:{i:0;s:7:"Chechen";}s:3:"cel";a:1:{i:0;s:16:"Celtic (Lainnya)";}s:2:"ch";a:1:{i:0;s:8:"Chamorro";}s:3:"chk";a:1:{i:0;s:6:"Chuuke";}s:2:"co";a:1:{i:0;s:7:"Korsika";}
s:3:"cop";a:1:{i:0;s:6:"Koptik";}s:2:"cr";a:1:{i:0;s:4:"Cree";}s:2:"cs";a:1:{i:0;s:4:"Ceko";}s:2:"cv";a:1:{i:0;s:7:"Chuvash";}s:2:"cy";a:1:{i:0;s:5:"Welsh";}s:2:"da";a:1:{i:0;s:7:"Denmark";}s:2:"de";a:1:{i:0;s:6:"Jerman";}s:2:"dv";a:1:{i:0;s:6:"Divehi";}s:2:"dz";a:1:{i:0;s:8:"Dzongkha";}s:2:"ee";a:1:{i:0;s:3:"Ewe";}s:3:"egy";a:1:{i:0;s:10:"Mesir Kuno";}s:2:"el";a:1:{i:0;s:6:"Yunani";}s:2:"en";a:1:{i:0;s:7:"Inggris";}s:3:"enm";a:1:{i:0;s:37:"Inggris, Abad Pertengahan (1100-1500)";}s:2:"eo";a:1:{i:0;s:9:"Esperanto";}s:2:"es";a:1:{i:0;s:7:"Spanyol";}s:2:"et";a:1:{i:0;s:8:"Estonian";}s:2:"eu";a:1:{i:0;s:6:"Basque";}s:2:"fa";a:1:{i:0;s:6:"Persia";}s:2:"ff";a:1:{i:0;s:5:"Fulah";}s:2:"fi";a:1:{i:0;s:9:"Finlandia";}s:2:"fj";a:1:{i:0;s:4:"Fiji";}s:2:"fo";a:1:{i:0;s:4:"Faro";}s:2:"fr";a:1:{i:0;s:8:"Perancis";}s:3:"frm";a:1:{i:0;s:41:"Perancis, Abad Pertengahan (kl.1400-1600)";}s:3:"fro";a:1:{i:0;s:27:"Perancis Kuno (842-kl.1400)";}s:3:"fur";a:1:{i:0;s:6:"Friuli";}s:2:"fy";a:1:{i:0;s:5:"Frisi";}s:2:"ga";a:1:{i:0;s:8:"Irlandia";}s:2:"gd";a:1:{i:0;s:17:"Gaelik Skotlandia";}s:3:"gem";a:1:{i:0;s:18:"Jermanik (Lainnya)";}s:3:"gil";a:1:{i:0;s:7:"Gilbert";}s:2:"gl";a:1:{i:0;s:8:"Gallegan";}s:3:"gmh";a:1:{i:0;s:39:"Jerman, Abad Pertengahan (kl.1050-1500)";}s:2:"gn";a:1:{i:0;s:7:"Guarani";}s:3:"goh";a:1:{i:0;s:25:"Jerman Kuno (kl.750-1050)";}s:3:"got";a:1:{i:0;s:6:"Gothik";}s:3:"grc";a:1:{i:0;s:21:"Yunani Kuno (sd 1453)";}s:2:"gu";a:1:{i:0;s:8:"Gujarati";}s:2:"gv";a:1:{i:0;s:4:"Manx";}s:2:"ha";a:1:{i:0;s:5:"Hausa";}s:3:"haw";a:1:{i:0;s:6:"Hawaii";}s:2:"he";a:1:{i:0;s:6:"Ibrani";}s:2:"hi";a:1:{i:0;s:5:"Hindi";}s:2:"ho";a:1:{i:0;s:9:"Hiri Motu";}s:2:"hr";a:1:{i:0;s:7:"Kroasia";}s:2:"hu";a:1:{i:0;s:8:"Hungaria";}s:2:"hy";a:1:{i:0;s:7:"Armenia";}s:2:"hz";a:1:{i:0;s:6:"Herero";}s:2:"ia";a:1:{i:0;s:11:"Interlingua";}s:2:"id";a:1:{i:0;s:16:"Bahasa Indonesia";}s:2:"ie";a:1:{i:0;s:11:"Interlingue";}s:2:"ig";a:1:{i:0;s:4:"Igbo";}s:2:"ii";a:1:{i:0;s:10:"Sichuan Yi";}s:2:"ik";a:1:{i:0;s:7:"Inupiaq";}s:2:"io";a:1:{i:0;s:3:"Ido";}s:2:"is";a:1:{i:
0;s:9:"Icelandic";}s:2:"it";a:1:{i:0;s:7:"Italian";}s:2:"ja";a:1:{i:0;s:8:"Japanese";}s:3:"jpr";a:1:{i:0;s:12:"Judeo-Persia";}s:3:"jrb";a:1:{i:0;s:10:"Judeo-Arab";}s:2:"jv";a:1:{i:0;s:4:"Jawa";}s:2:"ka";a:1:{i:0;s:8:"Georgian";}s:2:"kg";a:1:{i:0;s:5:"Kongo";}s:2:"ki";a:1:{i:0;s:6:"Kikuyu";}s:2:"kj";a:1:{i:0;s:8:"Kuanyama";}s:2:"kk";a:1:{i:0;s:6:"Kazakh";}s:2:"kl";a:1:{i:0;s:11:"Kalaallisut";}s:2:"km";a:1:{i:0;s:5:"Khmer";}s:2:"kn";a:1:{i:0;s:7:"Kannada";}s:2:"ko";a:1:{i:0;s:5:"Korea";}s:3:"kok";a:1:{i:0;s:7:"Konkani";}s:3:"kos";a:1:{i:0;s:6:"Kosrae";}s:2:"kr";a:1:{i:0;s:6:"Kanuri";}s:2:"ks";a:1:{i:0;s:7:"Kashmir";}s:2:"ku";a:1:{i:0;s:5:"Kurdi";}s:2:"kv";a:1:{i:0;s:4:"Komi";}s:2:"kw";a:1:{i:0;s:7:"Cornish";}s:2:"ky";a:1:{i:0;s:7:"Kirghiz";}s:2:"la";a:1:{i:0;s:5:"Latin";}s:2:"lb";a:1:{i:0;s:10:"Luxembourg";}s:3:"lez";a:1:{i:0;s:7:"Lezghia";}s:2:"lg";a:1:{i:0;s:5:"Ganda";}s:2:"li";a:1:{i:0;s:7:"Limburg";}s:2:"ln";a:1:{i:0;s:7:"Lingala";}s:2:"lo";a:1:{i:0;s:3:"Lao";}s:2:"lt";a:1:{i:0;s:9:"Lithuania";}s:2:"lu";a:1:{i:0;s:12:"Luba-Katanga";}s:2:"lv";a:1:{i:0;s:7:"Latvian";}s:3:"mad";a:1:{i:0;s:6:"Madura";}s:3:"mak";a:1:{i:0;s:8:"Makassar";}s:3:"map";a:1:{i:0;s:11:"Austronesia";}s:2:"mg";a:1:{i:0;s:8:"Malagasi";}s:3:"mga";a:1:{i:0;s:36:"Irlandia Abad Pertengahan (900-1200)";}s:2:"mh";a:1:{i:0;s:8:"Marshall";}s:2:"mi";a:1:{i:0;s:5:"Maori";}s:3:"mis";a:1:{i:0;s:16:"Bahasa Lain-lain";}s:2:"mk";a:1:{i:0;s:10:"Macedonian";}s:3:"mkh";a:1:{i:0;s:19:"Mon-Khmer (Lainnya)";}s:2:"ml";a:1:{i:0;s:9:"Malayalam";}s:2:"mn";a:1:{i:0;s:9:"Mongolian";}s:2:"mo";a:1:{i:0;s:9:"Moldavian";}s:2:"mr";a:1:{i:0;s:7:"Marathi";}s:2:"ms";a:1:{i:0;s:5:"Malay";}s:2:"mt";a:1:{i:0;s:7:"Maltese";}s:2:"my";a:1:{i:0;s:5:"Burma";}s:2:"na";a:1:{i:0;s:5:"Nauru";}s:2:"nb";a:1:{i:0;s:17:"Norwegian Bokmål";}s:2:"ne";a:1:{i:0;s:5:"Nepal";}s:2:"ng";a:1:{i:0;s:6:"Ndonga";}s:2:"nl";a:1:{i:0;s:7:"Belanda";}s:2:"nn";a:1:{i:0;s:17:"Norwegian Nynorsk";}s:2:"no";a:1:{i:0;s:9:"Norwegian";}s:2:"nv";a:1:{i:0;s:6:"Navajo";}s:2:"ny";a:1:{i:0;s:23:"Nyanja; Chichewa; Chewa";}s
:2:"oj";a:1:{i:0;s:6:"Ojibwa";}s:2:"om";a:1:{i:0;s:5:"Oromo";}s:2:"or";a:1:{i:0;s:5:"Oriya";}s:2:"os";a:1:{i:0;s:7:"Ossetic";}s:2:"pa";a:1:{i:0;s:7:"Punjabi";}s:3:"paa";a:1:{i:0;s:16:"Papuan (Lainnya)";}s:3:"peo";a:1:{i:0;s:28:"Persia Kuno (kl.600-400 SM.)";}s:3:"phi";a:1:{i:0;s:18:"Filipina (Lainnya)";}s:2:"pi";a:1:{i:0;s:4:"Pali";}s:2:"pl";a:1:{i:0;s:6:"Polish";}s:2:"ps";a:1:{i:0;s:15:"Pashto (Pushto)";}s:2:"pt";a:1:{i:0;s:8:"Portugis";}s:2:"qu";a:1:{i:0;s:7:"Quechua";}s:2:"rm";a:1:{i:0;s:14:"Rhaeto-Romance";}s:2:"rn";a:1:{i:0;s:5:"Rundi";}s:2:"ro";a:1:{i:0;s:8:"Romanian";}s:2:"ru";a:1:{i:0;s:7:"Russian";}s:2:"rw";a:1:{i:0;s:11:"Kinyarwanda";}s:2:"sa";a:1:{i:0;s:8:"Sanskrit";}s:2:"sc";a:1:{i:0;s:9:"Sardinian";}s:2:"sd";a:1:{i:0;s:6:"Sindhi";}s:2:"se";a:1:{i:0;s:13:"Northern Sami";}s:2:"sg";a:1:{i:0;s:5:"Sango";}s:2:"sh";a:1:{i:0;s:14:"Serbo-Croatian";}s:2:"si";a:1:{i:0;s:9:"Sinhalese";}s:2:"sk";a:1:{i:0;s:6:"Slovak";}s:2:"sl";a:1:{i:0;s:9:"Slovenian";}s:2:"sm";a:1:{i:0;s:6:"Samoan";}s:2:"sn";a:1:{i:0;s:5:"Shona";}s:2:"so";a:1:{i:0;s:6:"Somali";}s:2:"sq";a:1:{i:0;s:8:"Albanian";}s:2:"sr";a:1:{i:0;s:7:"Serbian";}s:2:"ss";a:1:{i:0;s:5:"Swati";}s:2:"su";a:1:{i:0;s:6:"Sundan";}s:3:"sux";a:1:{i:0;s:7:"Sumeria";}s:2:"sv";a:1:{i:0;s:6:"Swedia";}s:2:"sw";a:1:{i:0;s:7:"Swahili";}s:3:"syr";a:1:{i:0;s:5:"Syria";}s:2:"ta";a:1:{i:0;s:5:"Tamil";}s:2:"te";a:1:{i:0;s:6:"Telugu";}s:2:"tg";a:1:{i:0;s:5:"Tajik";}s:2:"th";a:1:{i:0;s:4:"Thai";}s:2:"ti";a:1:{i:0;s:8:"Tigrinya";}s:2:"tk";a:1:{i:0;s:7:"Turkmen";}s:2:"tl";a:1:{i:0;s:7:"Tagalog";}s:2:"tn";a:1:{i:0;s:6:"Tswana";}s:2:"tr";a:1:{i:0;s:7:"Turkish";}s:2:"ts";a:1:{i:0;s:6:"Tsonga";}s:2:"tt";a:1:{i:0;s:5:"Tatar";}s:2:"tw";a:1:{i:0;s:3:"Twi";}s:2:"ty";a:1:{i:0;s:8:"Tahitian";}s:2:"ug";a:1:{i:0;s:6:"Uighur";}s:2:"uk";a:1:{i:0;s:9:"Ukrainian";}s:2:"ur";a:1:{i:0;s:4:"Urdu";}s:2:"uz";a:1:{i:0;s:5:"Uzbek";}s:2:"ve";a:1:{i:0;s:5:"Venda";}s:2:"vi";a:1:{i:0;s:10:"Vietnamese";}s:2:"vo";a:1:{i:0;s:8:"Volapük";}s:2:"wa";a:1:{i:0;s:7:"Walloon";}s:2:"wo";a:1:{i:0;s:5:"Wolof";}s:2:"xh";a:1:{i
:0;s:5:"Xhosa";}s:2:"yi";a:1:{i:0;s:7:"Yiddish";}s:2:"yo";a:1:{i:0;s:6:"Yoruba";}s:2:"za";a:1:{i:0;s:6:"Zhuang";}s:2:"zh";a:1:{i:0;s:4:"Cina";}s:2:"zu";a:1:{i:0;s:4:"Zulu";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:3:"Min";i:1;s:3:"Sen";i:2;s:3:"Sel";i:3;s:3:"Rab";i:4;s:3:"Kam";i:5;s:3:"Jum";i:6;s:3:"Sab";}s:4:"wide";a:7:{i:0;s:6:"Minggu";i:1;s:5:"Senin";i:2;s:6:"Selasa";i:3;s:4:"Rabu";i:4;s:5:"Kamis";i:5;s:5:"Jumat";i:6;s:5:"Sabtu";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"Jan";i:1;s:3:"Feb";i:2;s:3:"Mar";i:3;s:3:"Apr";i:4;s:3:"Mei";i:5;s:3:"Jun";i:6;s:3:"Jul";i:7;s:3:"Agu";i:8;s:3:"Sep";i:9;s:3:"Okt";i:10;s:3:"Nov";i:11;s:3:"Des";}s:4:"wide";a:12:{i:0;s:7:"Januari";i:1;s:8:"Februari";i:2;s:5:"Maret";i:3;s:5:"April";i:4;s:3:"Mei";i:5;s:4:"Juni";i:6;s:4:"Juli";i:7;s:7:"Agustus";i:8;s:9:"September";i:9;s:7:"Oktober";i:10;s:8:"November";i:11;s:8:"Desember";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/id_ID.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/id_ID.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/id_ID.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:7:"H:mm:ss";i:1;s:7:"H:mm:ss";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:17:"EEEE dd MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:9:"dd MMM yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/in.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/in.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/in.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"__ALIAS";a:1:{i:0;s:2:"id";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/in_ID.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/in_ID.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/in_ID.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"__ALIAS";a:1:{i:0;s:5:"id_ID";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/is.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/is.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/is.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:9:{s:9:"Countries";a:237:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:33:"Sameinuðu arabísku furstadæmin";}s:2:"AF";a:1:{i:0;s:10:"Afganistan";}s:2:"AG";a:1:{i:0;s:20:"Antígva og Barbúda";}s:2:"AI";a:1:{i:0;s:8:"Angvilla";}s:2:"AL";a:1:{i:0;s:8:"Albanía";}s:2:"AM";a:1:{i:0;s:8:"Armenía";}s:2:"AN";a:1:{i:0;s:18:"Hollensku Antillur";}s:2:"AO";a:1:{i:0;s:7:"Angóla";}s:2:"AQ";a:1:{i:0;s:19:"Suðurskautslandið";}s:2:"AR";a:1:{i:0;s:10:"Argentína";}s:2:"AS";a:1:{i:0;s:18:"Bandaríska Samóa";}s:2:"AT";a:1:{i:0;s:11:"Austurríki";}s:2:"AU";a:1:{i:0;s:10:"Ãstralía";}s:2:"AW";a:1:{i:0;s:6:"Arúba";}s:2:"AZ";a:1:{i:0;s:13:"Aserbaídsjan";}s:2:"BA";a:1:{i:0;s:24:"Bosnía og Hersegóvína";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladess";}s:2:"BE";a:1:{i:0;s:7:"Belgía";}s:2:"BF";a:1:{i:0;s:15:"Búrkína Fasó";}s:2:"BG";a:1:{i:0;s:10:"Búlgaría";}s:2:"BH";a:1:{i:0;s:6:"Barein";}s:2:"BI";a:1:{i:0;s:10:"Búrúndí";}s:2:"BJ";a:1:{i:0;s:6:"Benín";}s:2:"BM";a:1:{i:0;s:13:"Bermúdaeyjar";}s:2:"BN";a:1:{i:0;s:7:"Brúnei";}s:2:"BO";a:1:{i:0;s:9:"Bólivía";}s:2:"BR";a:1:{i:0;s:9:"Brasilía";}s:2:"BS";a:1:{i:0;s:11:"Bahamaeyjar";}s:2:"BT";a:1:{i:0;s:6:"Bútan";}s:2:"BV";a:1:{i:0;s:10:"Bouveteyja";}s:2:"BW";a:1:{i:0;s:8:"Botsvana";}s:2:"BY";a:1:{i:0;s:16:"Hvíta-Rússland";}s:2:"BZ";a:1:{i:0;s:6:"Belís";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:11:"Kókoseyjar";}s:2:"CD";a:1:{i:0;s:13:"Austur-Kongó";}s:2:"CF";a:1:{i:0;s:24:"Mið-Afríkulýðveldið";}s:2:"CG";a:1:{i:0;s:13:"Vestur-Kongó";}s:2:"CH";a:1:{i:0;s:5:"Sviss";}s:2:"CI";a:1:{i:0;s:19:"Fílabeinsströndin";}s:2:"CK";a:1:{i:0;s:10:"Cookseyjar";}s:2:"CM";a:1:{i:0;s:8:"Kamerún";}s:2:"CN";a:1:{i:0;s:5:"Kína";}s:2:"CO";a:1:{i:0;s:10:"Kólumbía";}s:2:"CR";a:1:{i:0;s:10:"Kostaríka";}s:2:"CU";a:1:{i:0;s:5:"Kúba";}s:2:"CV";a:1:{i:0;s:17:"Grænhöfðaeyjar";}s:2:"CX";a:1:{i:0;s:7:"Jólaey";}s:2:"CY";a:1:{i:0;s:6:"Kýpur";}s:2:"CZ";a:1:{i:0;s:9:"Tékkland";}s:2:"DE";a:1:{i:0;s:11:"Þýskaland";}s:2:"DJ";a:1:{i:0;s:10:"Dj
íbútí";}s:2:"DK";a:1:{i:0;s:8:"Danmörk";}s:2:"DM";a:1:{i:0;s:10:"Dóminíka";}s:2:"DO";a:1:{i:0;s:24:"Dóminíska lýðveldið";}s:2:"DZ";a:1:{i:0;s:6:"Alsír";}s:2:"EC";a:1:{i:0;s:7:"Ekvador";}s:2:"EE";a:1:{i:0;s:8:"Eistland";}s:2:"EG";a:1:{i:0;s:10:"Egyptaland";}s:2:"EH";a:1:{i:0;s:13:"Vestur-Sahara";}s:2:"ER";a:1:{i:0;s:8:"Erítrea";}s:2:"ES";a:1:{i:0;s:6:"Spánn";}s:2:"ET";a:1:{i:0;s:11:"Eþíópía";}s:2:"FI";a:1:{i:0;s:8:"Finnland";}s:2:"FJ";a:1:{i:0;s:11:"Fídjieyjar";}s:2:"FK";a:1:{i:0;s:14:"Falklandseyjar";}s:2:"FM";a:1:{i:0;s:12:"Mikrónesía";}s:2:"FO";a:1:{i:0;s:9:"Færeyjar";}s:2:"FR";a:1:{i:0;s:9:"Frakkland";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:8:"Bretland";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:8:"Georgía";}s:2:"GF";a:1:{i:0;s:16:"Franska Gvæjana";}s:2:"GH";a:1:{i:0;s:4:"Gana";}s:2:"GI";a:1:{i:0;s:10:"Gíbraltar";}s:2:"GL";a:1:{i:0;s:9:"Grænland";}s:2:"GM";a:1:{i:0;s:7:"Gambía";}s:2:"GN";a:1:{i:0;s:6:"Gínea";}s:2:"GP";a:1:{i:0;s:14:"Gvadelúpeyjar";}s:2:"GQ";a:1:{i:0;s:16:"Miðbaugs-Gínea";}s:2:"GR";a:1:{i:0;s:9:"Grikkland";}s:2:"GS";a:1:{i:0;s:41:"Suður-Georgía og Suður-Sandvíkureyjar";}s:2:"GT";a:1:{i:0;s:9:"Gvatemala";}s:2:"GU";a:1:{i:0;s:4:"Gvam";}s:2:"GW";a:1:{i:0;s:13:"Gínea-Bissá";}s:2:"GY";a:1:{i:0;s:8:"Gvæjana";}s:2:"HK";a:1:{i:0;s:9:"Hong Kong";}s:2:"HM";a:1:{i:0;s:23:"Heard og McDonaldseyjar";}s:2:"HN";a:1:{i:0;s:9:"Hondúras";}s:2:"HR";a:1:{i:0;s:9:"Króatía";}s:2:"HT";a:1:{i:0;s:7:"Haítí";}s:2:"HU";a:1:{i:0;s:12:"Ungverjaland";}s:2:"ID";a:1:{i:0;s:11:"Indónesía";}s:2:"IE";a:1:{i:0;s:7:"Ãrland";}s:2:"IL";a:1:{i:0;s:7:"Ãsrael";}s:2:"IN";a:1:{i:0;s:7:"Indland";}s:2:"IO";a:1:{i:0;s:24:"Bresku Indlandshafseyjar";}s:2:"IQ";a:1:{i:0;s:5:"Ãrak";}s:2:"IR";a:1:{i:0;s:5:"Ãran";}s:2:"IS";a:1:{i:0;s:7:"Ãsland";}s:2:"IT";a:1:{i:0;s:8:"Ãtalía";}s:2:"JM";a:1:{i:0;s:8:"Jamaíka";}s:2:"JO";a:1:{i:0;s:10:"Jórdanía";}s:2:"JP";a:1:{i:0;s:5:"Japan";}s:2:"KE";a:1:{i:0;s:6:"Kenía";}s:2:"KG";a:1:{i:0;s:11:"Kirgisistan";}s:2:"KH";a:1:{i:0;s:10:"KambÃ
³día";}s:2:"KI";a:1:{i:0;s:10:"Kíribatí";}s:2:"KM";a:1:{i:0;s:11:"Kómoreyjar";}s:2:"KN";a:1:{i:0;s:26:"Sankti Kristófer og Nevis";}s:2:"KP";a:1:{i:0;s:14:"Norður-Kórea";}s:2:"KR";a:1:{i:0;s:13:"Suður-Kórea";}s:2:"KW";a:1:{i:0;s:7:"Kúveit";}s:2:"KY";a:1:{i:0;s:11:"Caymaneyjar";}s:2:"KZ";a:1:{i:0;s:9:"Kasakstan";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:8:"Líbanon";}s:2:"LC";a:1:{i:0;s:14:"Sankti Lúsía";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:10:"Srí Lanka";}s:2:"LR";a:1:{i:0;s:9:"Líbería";}s:2:"LS";a:1:{i:0;s:8:"Lesótó";}s:2:"LT";a:1:{i:0;s:8:"Litháen";}s:2:"LU";a:1:{i:0;s:10:"Lúxemborg";}s:2:"LV";a:1:{i:0;s:8:"Lettland";}s:2:"LY";a:1:{i:0;s:7:"Líbía";}s:2:"MA";a:1:{i:0;s:8:"Marokkó";}s:2:"MC";a:1:{i:0;s:8:"Mónakó";}s:2:"MD";a:1:{i:0;s:8:"Moldóva";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:13:"Marshalleyjar";}s:2:"MK";a:1:{i:0;s:11:"Makedónía";}s:2:"ML";a:1:{i:0;s:5:"Malí";}s:2:"MM";a:1:{i:0;s:7:"Mjanmar";}s:2:"MN";a:1:{i:0;s:10:"Mongólía";}s:2:"MO";a:1:{i:0;s:6:"Makaó";}s:2:"MP";a:1:{i:0;s:21:"Norður-Maríanaeyjar";}s:2:"MQ";a:1:{i:0;s:9:"Martiník";}s:2:"MR";a:1:{i:0;s:11:"Máritanía";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:10:"Máritíus";}s:2:"MV";a:1:{i:0;s:12:"Maldíveyjar";}s:2:"MW";a:1:{i:0;s:7:"Malaví";}s:2:"MX";a:1:{i:0;s:8:"Mexíkó";}s:2:"MY";a:1:{i:0;s:8:"Malasía";}s:2:"MZ";a:1:{i:0;s:10:"Mósambík";}s:2:"NA";a:1:{i:0;s:8:"Namibía";}s:2:"NC";a:1:{i:0;s:17:"Nýja-Kaledónía";}s:2:"NE";a:1:{i:0;s:6:"Níger";}s:2:"NF";a:1:{i:0;s:11:"Norfolkeyja";}s:2:"NG";a:1:{i:0;s:9:"Nígería";}s:2:"NI";a:1:{i:0;s:10:"Níkaragva";}s:2:"NL";a:1:{i:0;s:11:"Niðurlönd";}s:2:"NO";a:1:{i:0;s:7:"Noregur";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:6:"Nárú";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:14:"Nýja-Sjáland";}s:2:"OM";a:1:{i:0;s:5:"Óman";}s:2:"PE";a:1:{i:0;s:5:"Perú";}s:2:"PF";a:1:{i:0;s:20:"Franska Pólýnesía";}s:2:"PG";a:1:{i:0;s:19:"Papúa Nýja-Gínea";}s:2
:"PH";a:1:{i:0;s:12:"Filippseyjar";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:8:"Pólland";}s:2:"PM";a:1:{i:0;s:25:"Sankti Pierre og Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:15:"Púertó Ríkó";}s:2:"PS";a:1:{i:0;s:10:"Palestína";}s:2:"PT";a:1:{i:0;s:9:"Portúgal";}s:2:"PW";a:1:{i:0;s:5:"Palá";}s:2:"PY";a:1:{i:0;s:8:"Paragvæ";}s:2:"QA";a:1:{i:0;s:5:"Katar";}s:2:"RE";a:1:{i:0;s:8:"Réunion";}s:2:"RO";a:1:{i:0;s:9:"Rúmenía";}s:2:"RU";a:1:{i:0;s:9:"Rússland";}s:2:"RW";a:1:{i:0;s:7:"Rúanda";}s:2:"SA";a:1:{i:0;s:13:"Sádi-Arabía";}s:2:"SB";a:1:{i:0;s:14:"Salómonseyjar";}s:2:"SC";a:1:{i:0;s:15:"Seychelleseyjar";}s:2:"SD";a:1:{i:0;s:6:"Súdan";}s:2:"SE";a:1:{i:0;s:11:"Svíþjóð";}s:2:"SG";a:1:{i:0;s:9:"Singapúr";}s:2:"SH";a:1:{i:0;s:13:"Sankti Helena";}s:2:"SI";a:1:{i:0;s:10:"Slóvenía";}s:2:"SJ";a:1:{i:0;s:23:"Svalbarði og Jan Mayen";}s:2:"SK";a:1:{i:0;s:10:"Slóvakía";}s:2:"SL";a:1:{i:0;s:14:"Síerra Leóne";}s:2:"SM";a:1:{i:0;s:12:"San Marínó";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:9:"Sómalía";}s:2:"SP";a:1:{i:0;s:7:"Serbía";}s:2:"SR";a:1:{i:0;s:9:"Súrínam";}s:2:"ST";a:1:{i:0;s:23:"Saó Tóme og Prinsípe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:8:"Sýrland";}s:2:"SZ";a:1:{i:0;s:10:"Svasíland";}s:2:"TC";a:1:{i:0;s:21:"Turks- og Caicoseyjar";}s:2:"TD";a:1:{i:0;s:5:"Tsjad";}s:2:"TF";a:1:{i:0;s:31:"Frönsku suðlægu landsvæðin";}s:2:"TG";a:1:{i:0;s:6:"Tógó";}s:2:"TH";a:1:{i:0;s:8:"Taíland";}s:2:"TJ";a:1:{i:0;s:12:"Tadsjikistan";}s:2:"TK";a:1:{i:0;s:8:"Tókelá";}s:2:"TL";a:1:{i:0;s:13:"Austur-Tímor";}s:2:"TM";a:1:{i:0;s:13:"Túrkmenistan";}s:2:"TN";a:1:{i:0;s:6:"Túnis";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:8:"Tyrkland";}s:2:"TT";a:1:{i:0;s:21:"Trínidad og Tóbagó";}s:2:"TV";a:1:{i:0;s:8:"Túvalú";}s:2:"TW";a:1:{i:0;s:7:"Taívan";}s:2:"TZ";a:1:{i:0;s:9:"Tansanía";}s:2:"UA";a:1:{i:0;s:9:"Úkraína";}s:2:"UG";a:1:{i:0;s:7:"Úganda";}s:2:"UM";a:1:{i:0;s:24:"Smáeyjar Bandaríkjanna";}s:2:"US";a:1:{i:0;s:11
:"Bandaríkin";}s:2:"UY";a:1:{i:0;s:9:"Úrúgvæ";}s:2:"UZ";a:1:{i:0;s:11:"Úsbekistan";}s:2:"VA";a:1:{i:0;s:12:"Páfagarður";}s:2:"VC";a:1:{i:0;s:32:"Sankti Vinsent og Grenadíneyjar";}s:2:"VE";a:1:{i:0;s:10:"Venesúela";}s:2:"VG";a:1:{i:0;s:23:"Jómfrúaeyjar (bresku)";}s:2:"VI";a:1:{i:0;s:28:"Jómfrúaeyjar (bandarísku)";}s:2:"VN";a:1:{i:0;s:8:"Víetnam";}s:2:"VU";a:1:{i:0;s:9:"Vanúatú";}s:2:"WF";a:1:{i:0;s:24:"Wallis- og Fútúnaeyjar";}s:2:"WS";a:1:{i:0;s:6:"Samóa";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:13:"Júgóslavía";}s:2:"ZA";a:1:{i:0;s:14:"Suður-Afríka";}s:2:"ZM";a:1:{i:0;s:7:"Sambía";}}s:10:"Currencies";a:229:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:17:"Andorrskur denari";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:17:"Andorrskur peseti";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:17:"Arabískt dírham";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:15:"Lek (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:3:"Lek";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:22:"Lek Valute (1992-1993)";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:50:"Albanskt gjaldeyrisskírteini í Bandaríkjadölum";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:5:"Dramm";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:24:"Hollenskt Antillugyllini";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:17:"Angólskur skúti";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:17:"Argentine Austral";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:29:"Argentískur pesi (1899-1970)";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:29:"Argentískur pesi (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:17:"Argentískur pesi";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:24:"Austurrískur skildingur";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:17:"Ãstralskur dalur";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:15:"Ãstralskt pund";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:17:"Barbadoskur dalur";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:17:"Belgískur franki";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:3:"Lef";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:15:"Lef (1952-1962)";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:10:"Lef, nýtt";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:15:"Lef
 (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:38:"Búlgarskt gjaldeyrisskírteini í lef";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:19:"Bermúdeyskur dalur";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:17:"Bermúdeyskt pund";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:17:"Brúneiskur dalur";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:17:"Bólivískur pesi";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:14:"Bolivian Mvdol";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:17:"Brasilískt ríal";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:17:"Bahameyskur dalur";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:15:"Bahameyskt pund";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:16:"Búrmverskt kjat";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:15:"Belískur dalur";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:17:"Hondúrskur dalur";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:17:"Kanadískur dalur";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:20:"Miðafrískur franki";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:18:"Svissneskur franki";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:17:"Cookseyskur dalur";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:16:"Chileskur skúti";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:27:"Chilean Unidades de Fomento";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:14:"Chileskur pesi";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:30:"Miðafrískur franki, Kamerún";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:52:"Kínverskt gjaldeyrisskírteini í Bandaríkjadölum";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:5:"Júan";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:26:"Kólumbískur pappírspesi";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:28:"Miðafrískur franki, Kongó";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:18:"Kólumbískur pesi";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:28:"Tékknesk króna (1945-1953)";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:23:"Tékknesk króna, eldri";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:16:"Kúbverskur pesi";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:31:"Kúbverskt gjaldeyrisskírteini";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:24:"Grænhöfðeyskur skúti";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:15:"Kýpverskt pund";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:16:"Tékknesk króna";}s:3:"DDM";a:2:{i:0;s:3:"DDM"
;i:1;s:18:"Austurþýskt mark";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:12:"Þýskt mark";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:16:"German Sperrmark";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:14:"Djibouti Franc";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:13:"Dönsk króna";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:17:"Dóminískur pesi";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:13:"Ecuador Sucre";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:15:"Eistnesk króna";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:12:"Egypskt pund";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:16:"Spænskur peseti";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:20:"Eþíópískur dalur";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"Euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:12:"Finnskt mark";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:17:"Fídjeyskur dalur";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:15:"Fídjeyskt pund";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:15:"Falklenskt pund";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:15:"Færeysk króna";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:15:"Franskur franki";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:27:"Miðafrískur franki, Gabon";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:13:"Sterlingspund";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:14:"Ganverskt pund";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:15:"Gíbraltarspund";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:17:"Grænlensk króna";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:14:"Gambískt pund";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:12:"Gíneufranki";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:24:"Gíneufranki (1960-1972)";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:6:"Drakma";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:11:"Drakma, Ný";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:17:"Guatemala Quetzal";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:31:"Portúgalskur, gíneskur skúti";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:26:"Portuguese Guinea Mil Reis";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:17:"Gvæjanskur dalur";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:15:"Hong Kong-dalur";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:15:"Hoduras Lempira";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:5:"Kúna";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:8:"Fórinta";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1
;s:18:"Norðurírskt pund";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:20:"Indónesísk rúpía";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:11:"Ãrskt pund";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:14:"Israeli Sheqel";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:15:"Ãsraelskt pund";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:6:"Sikill";}s:3:"INR";a:2:{i:0;s:3:"INR";i:1;s:16:"Indversk rúpía";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:16:"Ãrakskur denari";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:14:"Ãranskt ríal";}s:3:"ISK";a:2:{i:0;s:3:"kr.";i:1;s:15:"Ãslensk króna";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:14:"Ãtölsk líra";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:14:"Jerseyskt pund";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:16:"Jamaískur dalur";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:14:"Jamaískt pund";}s:3:"JPY";a:2:{i:0;s:2:"Â¥";i:1;s:3:"Jen";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:20:"Kíribatískur dalur";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:19:"Kómoreyskur franki";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:32:"Norðurkóreskt vonn (1947-1959)";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:20:"Norðurkóreskt vonn";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:17:"South Korean Hwan";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:31:"Suðurkóreskt vonn (1947-1953)";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:19:"Suðurkóreskt vonn";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:17:"Kúveiskur denari";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:18:"Caymaneyskur dalur";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:16:"Kazakhstan Ruble";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:16:"Kazakhstan Tenge";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:14:"Líbanskt pund";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:18:"Srílönsk rúpía";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:12:"Ceylon Rupee";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:18:"Líberískur dalur";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:12:"Lesotho Loti";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:4:"Lít";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:18:"Lithuanian Talonas";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:18:"Lúxemborgarfranki";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:3:"Lat";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:15:"Lettnesk rúbla";}s:3:"LYD";a:2:{i:0
;s:2:"LD";i:1;s:17:"Líbískur denari";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:14:"Líbískt pund";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:19:"Marokkóskt dírham";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:19:"Marokkóskur franki";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:17:"Madagascar Ariary";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:17:"Madagaskur franki";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:20:"Marshalleyskur dalur";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:19:"Makedónskur denari";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:31:"Makedónskur denari (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:16:"Malískur franki";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:15:"Mjanmarskt kjat";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:52:"Mjanmarskt gjaldeyrisskírteini í Bandaríkjadölum";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:9:"Túríkur";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:12:"Macao Pataca";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:18:"Mauritania Ouguiya";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:14:"Meltnesk líra";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:14:"Maltneskt pund";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:15:"Malavískt pund";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:17:"Mexíkóskur pesi";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:36:"Mexíkóskur silfurpesi  (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:22:"Mexíkóskur pesi, UDI";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:17:"Malaysian Ringgit";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:20:"Mósambískur skúti";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:17:"Namibískur dalur";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:14:"Nigerian Naira";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:16:"Nígerískt pund";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:17:"Hollenskt gyllini";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:12:"Norsk króna";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:20:"Nýsjálenskur dalur";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:18:"Nýsjálenskt pund";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:14:"Ómanskt ríal";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:7:"Balbói";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:19:"Pakistönsk rúpía";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:49:"Pólskt gjaldeyrisskírteini í Bandaríkja
dölum";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:4:"Slot";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:17:"Palestínskt pund";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:20:"Portúgalskur skúti";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:13:"Rúmenskt lei";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:16:"Rússnesk rúbla";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:13:"Rwandan Franc";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:20:"Sádiarabískt ríal";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:21:"Salómonseyskur dalur";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:18:"Seychelles rúpía";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:17:"Súdanskur denari";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:14:"Súdanskt pund";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:13:"Sænsk króna";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:19:"Singapúrskur dalur";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:13:"Helenskt pund";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:17:"Slóvenskur dalur";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:18:"Slóvakísk króna";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:16:"Suriname Guilder";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:11:"Skoskt pund";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:27:"Sao Tome and Principe Dobra";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:30:"Saó Tóme og Prinsípe skúti";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:13:"Soviet Rouble";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:17:"El Salvador Colon";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:15:"Sýrlenskt pund";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:26:"Turk- og Caicoseysk króna";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:27:"Miðafrískur franki, Tsjad";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:3:"Bat";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:16:"Tadsjiksk rúbla";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:17:"Tajikistan Somoni";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:17:"Túrkmenskt manat";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:24:"Tongverskt sterlingspund";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:17:"Tímorskur skúti";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:12:"Timor Pataca";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:14:"Tyrknesk líra";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:27:"Trínidad og Tóbagó-dalur";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:34:
"Trínidad og Tóbagó-dalur, eldri";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:18:"Túvalúskur dalur";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:17:"Taívanskur dalur";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:18:"Tanzanian Shilling";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:6:"Hrinja";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:21:"Ukrainian Karbovanetz";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:16:"Bandaríkjadalur";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:29:"Bandaríkjadalur (næsta dag)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:27:"Bandaríkjadalur (sama dag)";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:18:"Venezuelan Bolivar";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:18:"Jómfrúaeyjadalur";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:12:"Vanuatu Vatu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:13:"Samóskt pund";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:26:"Miðafrískur franki, BEAC";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:23:"Austur-Karíbahafsdalur";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:26:"Miðafrískur franki, nýr";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:27:"Sérstök dráttarréttindi";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:28:"Miðafrískur franki, BCEAEC";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:19:"Franskur gullfranki";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:20:"Franskur franki, UIC";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:17:"Ãslamskur denari";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:24:"Kómoreyskur franki, CFA";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:30:"Miðafrískur franki, Antillur";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:27:"Miðafrískur franki, BCEAO";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:21:"Pólinesískur franki";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:16:"Jemenskur denari";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:26:"Jemenskt ríal (1904-1964)";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:14:"Jemenskt ríal";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:23:"Júgóslavneskur denari";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:17:"Rand (viðskipta)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:19:"Suðurafrískt pund";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:14:"Zambian Kwacha";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:14:"Sambískt pund";}s:3:"ZWD";a:2:{i:0;s:2:
"Z$";i:1;s:18:"Simbabveskur dalur";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:7:"Dagatal";}s:9:"collation";a:1:{i:0;s:7:"Röðun";}s:8:"currency";a:1:{i:0;s:12:"Gjaldmiðill";}}s:9:"Languages";a:466:{s:2:"ab";a:1:{i:0;s:10:"Abkasíska";}s:3:"ace";a:1:{i:0;s:8:"Akkíska";}s:3:"ach";a:1:{i:0;s:7:"Akólí";}s:3:"ada";a:1:{i:0;s:7:"Adangme";}s:3:"ady";a:1:{i:0;s:6:"Adýge";}s:2:"ae";a:1:{i:0;s:10:"Avestíska";}s:2:"af";a:1:{i:0;s:11:"Afríkanska";}s:3:"afa";a:1:{i:0;s:25:"Afróasísk mál (önnur)";}s:3:"afh";a:1:{i:0;s:11:"Afríhílí";}s:2:"ak";a:1:{i:0;s:4:"Akan";}s:3:"akk";a:1:{i:0;s:10:"Akkadíska";}s:3:"ale";a:1:{i:0;s:8:"Aleúska";}s:3:"alg";a:1:{i:0;s:17:"Algonkvínsk mál";}s:2:"am";a:1:{i:0;s:10:"Amharíska";}s:2:"an";a:1:{i:0;s:9:"Aragonska";}s:3:"ang";a:1:{i:0;s:23:"Fornenska (um 450-1100)";}s:3:"apa";a:1:{i:0;s:11:"Apatsjamál";}s:2:"ar";a:1:{i:0;s:9:"Arabíska";}s:3:"arc";a:1:{i:0;s:10:"Arameíska";}s:3:"arn";a:1:{i:0;s:12:"Arákaníska";}s:3:"arp";a:1:{i:0;s:8:"Arapahó";}s:3:"art";a:1:{i:0;s:23:"Alþjóðamál (önnur)";}s:3:"arw";a:1:{i:0;s:9:"Aravakska";}s:2:"as";a:1:{i:0;s:8:"Assamska";}s:3:"ast";a:1:{i:0;s:11:"Astúríska";}s:3:"ath";a:1:{i:0;s:16:"Atapaskísk mál";}s:3:"aus";a:1:{i:0;s:15:"Ãströlsk mál";}s:2:"av";a:1:{i:0;s:9:"Avaríska";}s:3:"awa";a:1:{i:0;s:6:"Avadí";}s:2:"ay";a:1:{i:0;s:7:"Aímara";}s:2:"az";a:1:{i:0;s:7:"Aserska";}s:2:"ba";a:1:{i:0;s:7:"Baskír";}s:3:"bad";a:1:{i:0;s:5:"Banda";}s:3:"bai";a:1:{i:0;s:13:"Bamílekemál";}s:3:"bal";a:1:{i:0;s:8:"Balúkí";}s:3:"ban";a:1:{i:0;s:8:"Balíska";}s:3:"bas";a:1:{i:0;s:4:"Basa";}s:3:"bat";a:1:{i:0;s:22:"Baltnesk mál (önnur)";}s:2:"be";a:1:{i:0;s:15:"Hvítrússneska";}s:3:"bej";a:1:{i:0;s:4:"Beja";}s:3:"bem";a:1:{i:0;s:5:"Bemba";}s:3:"ber";a:1:{i:0;s:9:"Berbamál";}s:2:"bg";a:1:{i:0;s:10:"Búlgarska";}s:2:"bh";a:1:{i:0;s:8:"Bíharí";}s:3:"bho";a:1:{i:0;s:9:"Bojpúrí";}s:2:"bi";a:1:{i:0;s:8:"Bíslama";}s:3:"bik";a:1:{i:0;s:6:"Bíkol";}s:3:"bin";a:1:{i:0;s:6:"Bíní";}s:3:"bla";a:1:{i:0;s:7:"Siksika";}s:2:"bm";a:1:{i:0;s:7:"Bambar
a";}s:2:"bn";a:1:{i:0;s:9:"Bengalska";}s:3:"bnt";a:1:{i:0;s:10:"Bantúmál";}s:2:"bo";a:1:{i:0;s:8:"Tíbeska";}s:2:"br";a:1:{i:0;s:10:"Bretónska";}s:3:"bra";a:1:{i:0;s:5:"Braí";}s:2:"bs";a:1:{i:0;s:9:"Bosníska";}s:3:"btk";a:1:{i:0;s:5:"Batak";}s:3:"bua";a:1:{i:0;s:8:"Búríat";}s:3:"bug";a:1:{i:0;s:9:"Búgíska";}s:3:"byn";a:1:{i:0;s:5:"Blín";}s:2:"ca";a:1:{i:0;s:11:"Katalónska";}s:3:"cad";a:1:{i:0;s:6:"Kaddó";}s:3:"cai";a:1:{i:0;s:36:"Indíánamál Mið-Ameríku (önnur)";}s:3:"car";a:1:{i:0;s:11:"Karíbamál";}s:3:"cau";a:1:{i:0;s:21:"Kákasusmál (önnur)";}s:2:"ce";a:1:{i:0;s:12:"Tsjetsjenska";}s:3:"ceb";a:1:{i:0;s:9:"Kebúanó";}s:3:"cel";a:1:{i:0;s:17:"Keltnesk (önnur)";}s:2:"ch";a:1:{i:0;s:8:"Kamorró";}s:3:"chb";a:1:{i:0;s:7:"Síbsja";}s:3:"chg";a:1:{i:0;s:9:"Sjagataí";}s:3:"chk";a:1:{i:0;s:10:"Sjúkíska";}s:3:"chm";a:1:{i:0;s:5:"Marí";}s:3:"chn";a:1:{i:0;s:7:"Sínúk";}s:3:"cho";a:1:{i:0;s:7:"Sjoktá";}s:3:"chp";a:1:{i:0;s:11:"Sípevíska";}s:3:"chr";a:1:{i:0;s:9:"Sjerókí";}s:3:"chy";a:1:{i:0;s:6:"Sjeyen";}s:3:"cmc";a:1:{i:0;s:12:"Kamísk mál";}s:2:"co";a:1:{i:0;s:9:"Korsíska";}s:3:"cop";a:1:{i:0;s:9:"Koptíska";}s:3:"cpe";a:1:{i:0;s:38:"Kreól- og pidginmál á enskum grunni";}s:3:"cpf";a:1:{i:0;s:41:"Kreól- og pidginmál á frönskum grunni";}s:3:"cpp";a:1:{i:0;s:46:"Kreól- og pidginmál á portúgölskum grunni";}s:2:"cr";a:1:{i:0;s:4:"Krí";}s:3:"crh";a:1:{i:0;s:14:"Krímtyrkneska";}s:3:"crp";a:1:{i:0;s:30:"Kreól- og pidginmál (önnur)";}s:2:"cs";a:1:{i:0;s:10:"Tékkneska";}s:3:"csb";a:1:{i:0;s:11:"Kasúbíska";}s:2:"cu";a:1:{i:0;s:15:"Kirkjuslavneska";}s:3:"cus";a:1:{i:0;s:24:"Kúsitísk mál (önnur)";}s:2:"cv";a:1:{i:0;s:7:"Sjúvas";}s:2:"cy";a:1:{i:0;s:6:"Velska";}s:2:"da";a:1:{i:0;s:6:"Danska";}s:3:"dak";a:1:{i:0;s:7:"Dakóta";}s:3:"dar";a:1:{i:0;s:6:"Dargva";}s:3:"day";a:1:{i:0;s:5:"Dajak";}s:2:"de";a:1:{i:0;s:7:"Þýska";}s:3:"del";a:1:{i:0;s:7:"Delaver";}s:3:"den";a:1:{i:0;s:4:"Slav";}s:3:"dgr";a:1:{i:0;s:7:"Dogríb";}s:3:"din";a:1:{i:0;s:5:"Dinka";}s:3:"doi";a:1:{i:0;s:6:"D
ogrí";}s:3:"dra";a:1:{i:0;s:24:"Dravidísk mál (önnur)";}s:3:"dsb";a:1:{i:0;s:13:"Lágsorbneska";}s:3:"dua";a:1:{i:0;s:6:"Dúala";}s:3:"dum";a:1:{i:0;s:28:"Miðhollenska (um 1050-1350)";}s:2:"dv";a:1:{i:0;s:8:"Dívehí";}s:3:"dyu";a:1:{i:0;s:6:"Djúla";}s:2:"dz";a:1:{i:0;s:7:"Dsongka";}s:2:"ee";a:1:{i:0;s:3:"Eve";}s:3:"efi";a:1:{i:0;s:5:"Efík";}s:3:"egy";a:1:{i:0;s:11:"Fornegypska";}s:3:"eka";a:1:{i:0;s:7:"Ekajúk";}s:2:"el";a:1:{i:0;s:18:"Nýgríska (1453-)";}s:3:"elx";a:1:{i:0;s:7:"Elamít";}s:2:"en";a:1:{i:0;s:5:"Enska";}s:3:"enm";a:1:{i:0;s:21:"Miðenska (1100-1500)";}s:2:"eo";a:1:{i:0;s:10:"Esperantó";}s:2:"es";a:1:{i:0;s:8:"Spænska";}s:2:"et";a:1:{i:0;s:9:"Eistneska";}s:2:"eu";a:1:{i:0;s:9:"Baskneska";}s:3:"ewo";a:1:{i:0;s:7:"Evondó";}s:2:"fa";a:1:{i:0;s:9:"Persneska";}s:3:"fan";a:1:{i:0;s:4:"Fang";}s:3:"fat";a:1:{i:0;s:6:"Fantí";}s:2:"ff";a:1:{i:0;s:5:"Fúla";}s:2:"fi";a:1:{i:0;s:7:"Finnska";}s:3:"fiu";a:1:{i:0;s:28:"Finnskúgrísk mál (önnur)";}s:2:"fj";a:1:{i:0;s:10:"Fídjeyska";}s:2:"fo";a:1:{i:0;s:9:"Færeyska";}s:3:"fon";a:1:{i:0;s:4:"Fón";}s:2:"fr";a:1:{i:0;s:7:"Franska";}s:3:"frm";a:1:{i:0;s:26:"Miðfranska (um 1400-1600)";}s:3:"fro";a:1:{i:0;s:27:"Fornfranska (842 - um 1400)";}s:3:"fur";a:1:{i:0;s:10:"Fríúlska";}s:2:"fy";a:1:{i:0;s:10:"Frísneska";}s:2:"ga";a:1:{i:0;s:6:"Ãrska";}s:3:"gaa";a:1:{i:0;s:2:"Ga";}s:3:"gay";a:1:{i:0;s:5:"Gajó";}s:3:"gba";a:1:{i:0;s:5:"Gbaja";}s:2:"gd";a:1:{i:0;s:14:"Skosk gelíska";}s:3:"gem";a:1:{i:0;s:23:"Germönsk mál (önnur)";}s:3:"gez";a:1:{i:0;s:4:"Gís";}s:3:"gil";a:1:{i:0;s:9:"Gilberska";}s:2:"gl";a:1:{i:0;s:9:"Gallegska";}s:3:"gmh";a:1:{i:0;s:28:"Miðháþýska (um 1050-1500";}s:2:"gn";a:1:{i:0;s:8:"Gvaraní";}s:3:"goh";a:1:{i:0;s:28:"Fornháþýska (um 750-1050)";}s:3:"gon";a:1:{i:0;s:6:"Gondí";}s:3:"gor";a:1:{i:0;s:10:"Gorontaló";}s:3:"got";a:1:{i:0;s:8:"Gotneska";}s:3:"grb";a:1:{i:0;s:6:"Gerbó";}s:3:"grc";a:1:{i:0;s:22:"Forngríska (til 1453)";}s:2:"gu";a:1:{i:0;s:10:"Gújaratí";}s:2:"gv";a:1:{i:0;s:4:"Manx";}s:3:"gwi";a:1:{i:0;s:8:"GvísÃ
­n";}s:2:"ha";a:1:{i:0;s:5:"Hása";}s:3:"hai";a:1:{i:0;s:6:"Haída";}s:3:"haw";a:1:{i:0;s:9:"Havaíska";}s:2:"he";a:1:{i:0;s:8:"Hebreska";}s:2:"hi";a:1:{i:0;s:6:"Hindí";}s:3:"hil";a:1:{i:0;s:12:"Híligaínon";}s:3:"him";a:1:{i:0;s:11:"Hímasjalí";}s:3:"hit";a:1:{i:0;s:11:"Hettitíska";}s:3:"hmn";a:1:{i:0;s:5:"Hmong";}s:2:"ho";a:1:{i:0;s:12:"Hírímótú";}s:2:"hr";a:1:{i:0;s:11:"Króatíska";}s:3:"hsb";a:1:{i:0;s:12:"Hásorbneska";}s:2:"ht";a:1:{i:0;s:10:"Haítíska";}s:2:"hu";a:1:{i:0;s:9:"Ungverska";}s:3:"hup";a:1:{i:0;s:5:"Húpa";}s:2:"hy";a:1:{i:0;s:8:"Armenska";}s:2:"hz";a:1:{i:0;s:7:"Hereró";}s:2:"ia";a:1:{i:0;s:11:"Interlingva";}s:3:"iba";a:1:{i:0;s:5:"Ãban";}s:2:"id";a:1:{i:0;s:13:"Indónesíska";}s:2:"ie";a:1:{i:0;s:11:"Interlingva";}s:2:"ig";a:1:{i:0;s:6:"Ãgbó";}s:2:"ii";a:1:{i:0;s:11:"Sísúanjí";}s:3:"ijo";a:1:{i:0;s:5:"Ãjó";}s:2:"ik";a:1:{i:0;s:10:"Ãnúpíak";}s:3:"ilo";a:1:{i:0;s:7:"Ãlokó";}s:3:"inc";a:1:{i:0;s:22:"Indversk mál (önnur)";}s:3:"ine";a:1:{i:0;s:27:"Indóevrópsk mál (önnur)";}s:3:"inh";a:1:{i:0;s:6:"Ingús";}s:2:"io";a:1:{i:0;s:5:"Ãdó";}s:3:"ira";a:1:{i:0;s:8:"Ãranska";}s:3:"iro";a:1:{i:0;s:14:"Ãrókesk mál";}s:2:"is";a:1:{i:0;s:9:"Ãslenska";}s:2:"it";a:1:{i:0;s:8:"Ãtalska";}s:2:"iu";a:1:{i:0;s:11:"Inúktitút";}s:2:"ja";a:1:{i:0;s:8:"Japanska";}s:3:"jbo";a:1:{i:0;s:6:"Lojban";}s:3:"jpr";a:1:{i:0;s:17:"Gyðingapersneska";}s:3:"jrb";a:1:{i:0;s:17:"Gyðingaarabíska";}s:2:"jv";a:1:{i:0;s:8:"Javanska";}s:2:"ka";a:1:{i:0;s:10:"Georgíska";}s:3:"kaa";a:1:{i:0;s:10:"Karakalpak";}s:3:"kab";a:1:{i:0;s:7:"Kabíle";}s:3:"kac";a:1:{i:0;s:6:"Kasín";}s:3:"kam";a:1:{i:0;s:5:"Kamba";}s:3:"kar";a:1:{i:0;s:5:"Karen";}s:3:"kaw";a:1:{i:0;s:5:"Kaví";}s:3:"kbd";a:1:{i:0;s:11:"Kabardíska";}s:2:"kg";a:1:{i:0;s:6:"Kongó";}s:3:"kha";a:1:{i:0;s:5:"Kasí";}s:3:"khi";a:1:{i:0;s:17:"Koímál (önnur)";}s:3:"kho";a:1:{i:0;s:7:"Kotaska";}s:2:"ki";a:1:{i:0;s:9:"Kíkújú";}s:2:"kj";a:1:{i:0;s:9:"Kúanjama";}s:2:"kk";a:1:{i:0;s:8:"Kasakska";}s:2:"kl";a:1:{i:0;s:11:"Grænlenska";}s:2:"km";a:1
:{i:0;s:4:"Kmer";}s:3:"kmb";a:1:{i:0;s:10:"Kimbúndú";}s:2:"kn";a:1:{i:0;s:7:"Kannada";}s:2:"ko";a:1:{i:0;s:8:"Kóreska";}s:3:"kok";a:1:{i:0;s:8:"Konkaní";}s:3:"kos";a:1:{i:0;s:8:"Kosraska";}s:3:"kpe";a:1:{i:0;s:6:"Kpelle";}s:2:"kr";a:1:{i:0;s:8:"Kanúrí";}s:3:"krc";a:1:{i:0;s:14:"Karasaíbalkar";}s:3:"kro";a:1:{i:0;s:4:"Krú";}s:3:"kru";a:1:{i:0;s:7:"Kúrúk";}s:2:"ks";a:1:{i:0;s:10:"Kasmírska";}s:2:"ku";a:1:{i:0;s:10:"Kúrdneska";}s:3:"kum";a:1:{i:0;s:7:"Kúmík";}s:3:"kut";a:1:{i:0;s:9:"Kútenaí";}s:2:"kv";a:1:{i:0;s:8:"Komíska";}s:2:"kw";a:1:{i:0;s:9:"Korníska";}s:2:"ky";a:1:{i:0;s:8:"Kirgiska";}s:2:"la";a:1:{i:0;s:7:"Latína";}s:3:"lad";a:1:{i:0;s:9:"Ladínska";}s:3:"lah";a:1:{i:0;s:5:"Landa";}s:3:"lam";a:1:{i:0;s:5:"Lamba";}s:2:"lb";a:1:{i:0;s:15:"Lúxemborgíska";}s:3:"lez";a:1:{i:0;s:9:"Lesgíska";}s:2:"lg";a:1:{i:0;s:5:"Ganda";}s:2:"li";a:1:{i:0;s:13:"Limbúrgíska";}s:2:"ln";a:1:{i:0;s:7:"Lingala";}s:2:"lo";a:1:{i:0;s:4:"Laó";}s:3:"lol";a:1:{i:0;s:6:"Mongó";}s:3:"loz";a:1:{i:0;s:5:"Losí";}s:2:"lt";a:1:{i:0;s:11:"Litháíska";}s:2:"lu";a:1:{i:0;s:12:"Lúbakatanga";}s:3:"lua";a:1:{i:0;s:12:"Lúbalúlúa";}s:3:"lui";a:1:{i:0;s:9:"Lúisenó";}s:3:"lun";a:1:{i:0;s:6:"Lúnda";}s:3:"luo";a:1:{i:0;s:5:"Lúó";}s:3:"lus";a:1:{i:0;s:7:"Lúsaí";}s:2:"lv";a:1:{i:0;s:9:"Lettneska";}s:3:"mad";a:1:{i:0;s:9:"Madúrska";}s:3:"mag";a:1:{i:0;s:7:"Magahí";}s:3:"mai";a:1:{i:0;s:10:"Maítílí";}s:3:"mak";a:1:{i:0;s:7:"Makasar";}s:3:"man";a:1:{i:0;s:9:"Mandingó";}s:3:"map";a:1:{i:0;s:15:"Ãstrónesíska";}s:3:"mas";a:1:{i:0;s:6:"Masaí";}s:3:"mdf";a:1:{i:0;s:5:"Moksa";}s:3:"mdr";a:1:{i:0;s:6:"Mandar";}s:3:"men";a:1:{i:0;s:5:"Mende";}s:2:"mg";a:1:{i:0;s:12:"Malagasíska";}s:3:"mga";a:1:{i:0;s:21:"Miðírska (900-1200)";}s:2:"mh";a:1:{i:0;s:11:"Marshallska";}s:2:"mi";a:1:{i:0;s:7:"Maórí";}s:3:"mic";a:1:{i:0;s:6:"Mikmak";}s:3:"min";a:1:{i:0;s:12:"Mínangkabá";}s:3:"mis";a:1:{i:0;s:10:"Ãmis mál";}s:2:"mk";a:1:{i:0;s:11:"Makedónska";}s:3:"mkh";a:1:{i:0;s:20:"Monkmermál (önnur)";}s:2:"ml";a:1:{i:0;s:9:"Malajal
am";}s:2:"mn";a:1:{i:0;s:10:"Mongólska";}s:3:"mnc";a:1:{i:0;s:7:"Mansjú";}s:3:"mni";a:1:{i:0;s:11:"Manípúrí";}s:3:"mno";a:1:{i:0;s:12:"Manóbómál";}s:2:"mo";a:1:{i:0;s:10:"Moldóvska";}s:3:"moh";a:1:{i:0;s:9:"Móhíska";}s:3:"mos";a:1:{i:0;s:6:"Mossí";}s:2:"mr";a:1:{i:0;s:7:"Maratí";}s:2:"ms";a:1:{i:0;s:9:"Malaíska";}s:2:"mt";a:1:{i:0;s:9:"Maltneska";}s:3:"mul";a:1:{i:0;s:16:"Margvísleg mál";}s:3:"mun";a:1:{i:0;s:10:"Múndamál";}s:3:"mus";a:1:{i:0;s:5:"Krík";}s:3:"mwr";a:1:{i:0;s:8:"Marvarí";}s:2:"my";a:1:{i:0;s:9:"Burmneska";}s:3:"myn";a:1:{i:0;s:8:"Majamál";}s:3:"myv";a:1:{i:0;s:5:"Ersja";}s:2:"na";a:1:{i:0;s:9:"Nárúska";}s:3:"nah";a:1:{i:0;s:8:"Nahúatl";}s:3:"nai";a:1:{i:0;s:39:"Indíánamál Norður-Ameríku (önnur)";}s:3:"nap";a:1:{i:0;s:11:"Napólíska";}s:2:"nb";a:1:{i:0;s:15:"Norskt bókmál";}s:2:"nd";a:1:{i:0;s:14:"Norðurndebele";}s:3:"nds";a:1:{i:0;s:25:"Lágþýska; Lágsaxneska";}s:2:"ne";a:1:{i:0;s:8:"Nepalska";}s:3:"new";a:1:{i:0;s:7:"Nevarí";}s:2:"ng";a:1:{i:0;s:6:"Ndonga";}s:3:"nia";a:1:{i:0;s:5:"Nías";}s:3:"nic";a:1:{i:0;s:28:"Nígerkordófanmál (önnur)";}s:3:"niu";a:1:{i:0;s:8:"Níveska";}s:2:"nl";a:1:{i:0;s:9:"Hollenska";}s:2:"nn";a:1:{i:0;s:9:"Nýnorska";}s:2:"no";a:1:{i:0;s:6:"Norska";}s:3:"nog";a:1:{i:0;s:7:"Nógaí";}s:3:"non";a:1:{i:0;s:8:"Norræna";}s:2:"nr";a:1:{i:0;s:13:"Suðurndebele";}s:3:"nso";a:1:{i:0;s:13:"Norðursótó";}s:3:"nub";a:1:{i:0;s:13:"Núbísk mál";}s:2:"nv";a:1:{i:0;s:7:"Navahó";}s:2:"ny";a:1:{i:0;s:23:"Njanja; Sísjeva; Sjeva";}s:3:"nym";a:1:{i:0;s:9:"Njamvesí";}s:3:"nyn";a:1:{i:0;s:9:"Njankóle";}s:3:"nyo";a:1:{i:0;s:7:"Njóró";}s:3:"nzi";a:1:{i:0;s:6:"Nsíma";}s:2:"oc";a:1:{i:0;s:38:"Okkitíska (eftir 1500); Próvensalska";}s:2:"oj";a:1:{i:0;s:6:"Ojibva";}s:2:"om";a:1:{i:0;s:8:"Órómó";}s:2:"or";a:1:{i:0;s:6:"Óría";}s:2:"os";a:1:{i:0;s:10:"Ossetíska";}s:3:"osa";a:1:{i:0;s:6:"Ósage";}s:3:"ota";a:1:{i:0;s:31:"Tyrkneska, ottóman (1500-1928)";}s:3:"oto";a:1:{i:0;s:9:"Ótommál";}s:2:"pa";a:1:{i:0;s:9:"Púnjabí";}s:3:"paa";a:1:{i:0;s
:21:"Papúsk mál (önnur)";}s:3:"pag";a:1:{i:0;s:13:"Pangasínmál";}s:3:"pal";a:1:{i:0;s:7:"Palaví";}s:3:"pam";a:1:{i:0;s:8:"Pampanga";}s:3:"pap";a:1:{i:0;s:12:"Papíamentó";}s:3:"pau";a:1:{i:0;s:8:"Paláska";}s:3:"peo";a:1:{i:0;s:13:"Fornpersneska";}s:3:"phi";a:1:{i:0;s:25:"Filippseysk mál (önnur)";}s:3:"phn";a:1:{i:0;s:11:"Fönikíska";}s:2:"pi";a:1:{i:0;s:5:"Palí";}s:2:"pl";a:1:{i:0;s:7:"Pólska";}s:3:"pon";a:1:{i:0;s:9:"Ponpeiska";}s:3:"pra";a:1:{i:0;s:12:"Prakrítmál";}s:3:"pro";a:1:{i:0;s:28:"Fornpróvensalska (til 1500)";}s:2:"ps";a:1:{i:0;s:6:"Pastú";}s:2:"pt";a:1:{i:0;s:12:"Portúgalska";}s:2:"qu";a:1:{i:0;s:8:"Kvesjúa";}s:3:"raj";a:1:{i:0;s:10:"Rajastaní";}s:3:"rap";a:1:{i:0;s:9:"Rapanúí";}s:3:"rar";a:1:{i:0;s:12:"Rarótongska";}s:2:"rm";a:1:{i:0;s:14:"Retórómanska";}s:2:"rn";a:1:{i:0;s:7:"Rúndí";}s:2:"ro";a:1:{i:0;s:9:"Rúmenska";}s:3:"roa";a:1:{i:0;s:23:"Rómönsk mál (önnur)";}s:3:"rom";a:1:{i:0;s:7:"Romaní";}s:2:"ru";a:1:{i:0;s:10:"Rússneska";}s:2:"rw";a:1:{i:0;s:12:"Kínjarvanda";}s:2:"sa";a:1:{i:0;s:9:"Sanskrít";}s:3:"sad";a:1:{i:0;s:7:"Sandave";}s:3:"sah";a:1:{i:0;s:6:"Jakút";}s:3:"sai";a:1:{i:0;s:38:"Indíánamál Suður-Ameríku (önnur)";}s:3:"sal";a:1:{i:0;s:10:"Salísmál";}s:3:"sam";a:1:{i:0;s:19:"Samversk arameíska";}s:3:"sas";a:1:{i:0;s:5:"Sasak";}s:3:"sat";a:1:{i:0;s:8:"Santalí";}s:2:"sc";a:1:{i:0;s:10:"Sardínska";}s:3:"sco";a:1:{i:0;s:6:"Skoska";}s:2:"sd";a:1:{i:0;s:6:"Sindí";}s:2:"se";a:1:{i:0;s:15:"Norðursamíska";}s:3:"sel";a:1:{i:0;s:7:"Selkúp";}s:3:"sem";a:1:{i:0;s:21:"Semísk mál (önnur)";}s:2:"sg";a:1:{i:0;s:6:"Sangó";}s:3:"sga";a:1:{i:0;s:20:"Fornírska (til 900)";}s:3:"sgn";a:1:{i:0;s:9:"Táknmál";}s:2:"sh";a:1:{i:0;s:17:"Serbókróatíska";}s:3:"shn";a:1:{i:0;s:4:"Sjan";}s:2:"si";a:1:{i:0;s:13:"Singalesíska";}s:3:"sid";a:1:{i:0;s:8:"Sídamó";}s:3:"sio";a:1:{i:0;s:9:"Síúmál";}s:3:"sit";a:1:{i:0;s:27:"Sínótíbesk mál (önnur)";}s:2:"sk";a:1:{i:0;s:12:"Slóvakíska";}s:2:"sl";a:1:{i:0;s:10:"Slóvenska";}s:3:"sla";a:1:{i:0;s:22:"Slavnesk mÃ
¡l (önnur)";}s:2:"sm";a:1:{i:0;s:8:"Samóska";}s:3:"sma";a:1:{i:0;s:14:"Suðursamíska";}s:3:"smi";a:1:{i:0;s:21:"Samísk mál (önnur)";}s:3:"smj";a:1:{i:0;s:13:"Lúlesamíska";}s:3:"smn";a:1:{i:0;s:13:"Enaresamíska";}s:3:"sms";a:1:{i:0;s:14:"Skoltesamíska";}s:2:"sn";a:1:{i:0;s:27:"Sínótíbesk mál (önnur)";}s:3:"snk";a:1:{i:0;s:8:"Sóninke";}s:2:"so";a:1:{i:0;s:9:"Sómalska";}s:3:"sog";a:1:{i:0;s:8:"Sogdíen";}s:3:"son";a:1:{i:0;s:8:"Songhaí";}s:2:"sq";a:1:{i:0;s:8:"Albanska";}s:2:"sr";a:1:{i:0;s:9:"Serbneska";}s:3:"srr";a:1:{i:0;s:5:"Serer";}s:2:"ss";a:1:{i:0;s:6:"Svatí";}s:3:"ssa";a:1:{i:0;s:25:"Nílósaharamál (önnur)";}s:2:"st";a:1:{i:0;s:12:"Suðursótó";}s:2:"su";a:1:{i:0;s:10:"Súndanska";}s:3:"suk";a:1:{i:0;s:8:"Súkúma";}s:3:"sus";a:1:{i:0;s:6:"Súsú";}s:3:"sux";a:1:{i:0;s:9:"Súmerska";}s:2:"sv";a:1:{i:0;s:7:"Sænska";}s:2:"sw";a:1:{i:0;s:9:"Svahílí";}s:3:"syr";a:1:{i:0;s:10:"Sýrlenska";}s:2:"ta";a:1:{i:0;s:9:"Tamílska";}s:3:"tai";a:1:{i:0;s:17:"Taímál (önnur)";}s:2:"te";a:1:{i:0;s:8:"Telúgú";}s:3:"tem";a:1:{i:0;s:6:"Tímne";}s:3:"ter";a:1:{i:0;s:7:"Terenó";}s:3:"tet";a:1:{i:0;s:6:"Tetúm";}s:2:"tg";a:1:{i:0;s:10:"Tadsjikska";}s:2:"th";a:1:{i:0;s:10:"Taílenska";}s:2:"ti";a:1:{i:0;s:9:"Tígrinja";}s:3:"tig";a:1:{i:0;s:6:"Tígre";}s:3:"tiv";a:1:{i:0;s:4:"Tív";}s:2:"tk";a:1:{i:0;s:11:"Túrkmenska";}s:3:"tkl";a:1:{i:0;s:11:"Tókeláska";}s:2:"tl";a:1:{i:0;s:7:"Tagalog";}s:3:"tli";a:1:{i:0;s:7:"Tlingit";}s:3:"tmh";a:1:{i:0;s:8:"Tamasjek";}s:2:"tn";a:1:{i:0;s:7:"Tsúana";}s:2:"to";a:1:{i:0;s:10:"Tongverska";}s:3:"tog";a:1:{i:0;s:10:"Tongverska";}s:3:"tpi";a:1:{i:0;s:8:"Tokpisin";}s:2:"tr";a:1:{i:0;s:9:"Tyrkneska";}s:2:"ts";a:1:{i:0;s:6:"Tsonga";}s:3:"tsi";a:1:{i:0;s:10:"Tsimsíska";}s:2:"tt";a:1:{i:0;s:8:"Tatarska";}s:3:"tum";a:1:{i:0;s:9:"Túmbúka";}s:3:"tup";a:1:{i:0;s:10:"Túpímál";}s:3:"tut";a:1:{i:0;s:22:"Altaísk mál (önnur)";}s:3:"tvl";a:1:{i:0;s:11:"Túvalúska";}s:2:"tw";a:1:{i:0;s:4:"Tví";}s:2:"ty";a:1:{i:0;s:11:"Tahítíska";}s:3:"tyv";a:1:{i:0;s:10:"Túvínska";}s:
3:"udm";a:1:{i:0;s:8:"Údmúrt";}s:2:"ug";a:1:{i:0;s:8:"Úígúr";}s:3:"uga";a:1:{i:0;s:13:"Úgarítíska";}s:2:"uk";a:1:{i:0;s:11:"Úkraínska";}s:3:"umb";a:1:{i:0;s:10:"Úmbúndú";}s:3:"und";a:1:{i:0;s:8:"Óljóst";}s:2:"ur";a:1:{i:0;s:6:"Úrdú";}s:2:"uz";a:1:{i:0;s:9:"Úsbekska";}s:3:"vai";a:1:{i:0;s:4:"Vaí";}s:2:"ve";a:1:{i:0;s:5:"Venda";}s:2:"vi";a:1:{i:0;s:11:"Víetnamska";}s:2:"vo";a:1:{i:0;s:8:"Volapük";}s:3:"vot";a:1:{i:0;s:8:"Votíska";}s:2:"wa";a:1:{i:0;s:10:"Vallónska";}s:3:"wak";a:1:{i:0;s:9:"Vakasmál";}s:3:"wal";a:1:{i:0;s:7:"Valamó";}s:3:"war";a:1:{i:0;s:6:"Varaí";}s:3:"was";a:1:{i:0;s:6:"Vasjó";}s:3:"wen";a:1:{i:0;s:13:"Sorbnesk mál";}s:2:"wo";a:1:{i:0;s:5:"Volof";}s:3:"xal";a:1:{i:0;s:10:"Kalmúkska";}s:2:"xh";a:1:{i:0;s:5:"Sósa";}s:3:"yao";a:1:{i:0;s:4:"Jaó";}s:3:"yap";a:1:{i:0;s:8:"Japíska";}s:2:"yi";a:1:{i:0;s:9:"Jiddíska";}s:2:"yo";a:1:{i:0;s:8:"Jórúba";}s:3:"ypk";a:1:{i:0;s:13:"Júpísk mál";}s:2:"za";a:1:{i:0;s:6:"Súang";}s:3:"zap";a:1:{i:0;s:8:"Sapótek";}s:3:"zen";a:1:{i:0;s:6:"Senaga";}s:2:"zh";a:1:{i:0;s:10:"Kínverska";}s:3:"znd";a:1:{i:0;s:5:"Sande";}s:2:"zu";a:1:{i:0;s:6:"Súlú";}s:3:"zun";a:1:{i:0;s:6:"Súní";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:18:"Búddískt dagatal";}s:7:"chinese";a:1:{i:0;s:18:"Kínverskt dagatal";}s:9:"gregorian";a:1:{i:0;s:19:"Gregorískt dagatal";}s:6:"hebrew";a:1:{i:0;s:17:"Hebreskt  dagatal";}s:7:"islamic";a:1:{i:0;s:17:"Ãslamskt dagatal";}s:13:"islamic-civil";a:1:{i:0;s:24:"Ãslamskt borgaradagatal";}s:8:"japanese";a:1:{i:0;s:16:"Japanskt dagatal";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:12:"Bein röðun";}s:9:"phonebook";a:1:{i:0;s:19:"Símaskráarröðun";}s:6:"pinyin";a:1:{i:0;s:14:"Pinyin-röðun";}s:6:"stroke";a:1:{i:0;s:13:"Strikaröðun";}s:11:"traditional";a:1:{i:0;s:11:"Hefð
bundin";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:18:"EEEE, d. MMMM yyyy";i:5;s:12:"d. MMMM yyyy";i:6;s:8:"d.M.yyyy";i:7;s:8:"d.M.yyyy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:3:"sun";i:1;s:4:"mán";i:2;s:4:"þri";i:3;s:4:"mið";i:4;s:3:"fim";i:5;s:4:"fös";i:6;s:3:"lau";}s:6:"narrow";a:7:{i:0;s:1:"s";i:1;s:1:"m";i:2;s:2:"þ";i:3;s:1:"m";i:4;s:1:"f";i:5;s:1:"f";i:6;s:1:"l";}s:4:"wide";a:7:{i:0;s:10:"sunnudagur";i:1;s:10:"mánudagur";i:2;s:13:"þriðjudagur";i:3;s:13:"miðvikudagur";i:4;s:11:"fimmtudagur";i:5;s:11:"föstudagur";i:6;s:11:"laugardagur";}}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:3:"jan";i:1;s:3:"feb";i:2;s:3:"mar";i:3;s:3:"apr";i:4;s:4:"maí";i:5;s:4:"jún";i:6;s:4:"júl";i:7;s:5:"ágú";i:8;s:3:"sep";i:9;s:3:"okt";i:10;s:4:"nóv";i:11;s:3:"des";}s:6:"narrow";a:12:{i:0;s:1:"j";i:1;s:1:"f";i:2;s:1:"m";i:3;s:1:"a";i:4;s:1:"m";i:5;s:1:"j";i:6;s:1:"j";i:7;s:2:"á";i:8;s:1:"s";i:9;s:1:"o";i:10;s:1:"n";i:11;s:1:"d";}s:4:"wide";a:12:{i:0;s:7:"janúar";i:1;s:8:"febrúar";i:2;s:4:"mars";i:3;s:6:"apríl";i:4;s:4:"maí";i:5;s:6:"júní";i:6;s:6:"júlí";i:7;s:7:"ágúst";i:8;s:9:"september";i:9;s:8:"október";i:10;s:9:"nóvember";i:11;s:8:"desember";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/is_IS.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/is_IS.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/is_IS.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/it.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/it.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/it.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:12:{s:9:"Countries";a:239:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:19:"Emirati Arabi Uniti";}s:2:"AF";a:1:{i:0;s:11:"Afghanistan";}s:2:"AG";a:1:{i:0;s:17:"Antigua e Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:7:"Albania";}s:2:"AM";a:1:{i:0;s:7:"Armenia";}s:2:"AN";a:1:{i:0;s:16:"Antille Olandesi";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:9:"Antartide";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:15:"Samoa Americane";}s:2:"AT";a:1:{i:0;s:7:"Austria";}s:2:"AU";a:1:{i:0;s:9:"Australia";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:11:"Azerbaigian";}s:2:"BA";a:1:{i:0;s:17:"Bosnia Erzegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BE";a:1:{i:0;s:6:"Belgio";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:8:"Bulgaria";}s:2:"BH";a:1:{i:0;s:7:"Bahrein";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:6:"Brunei";}s:2:"BO";a:1:{i:0;s:7:"Bolivia";}s:2:"BR";a:1:{i:0;s:7:"Brasile";}s:2:"BS";a:1:{i:0;s:7:"Bahamas";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BV";a:1:{i:0;s:12:"Isola Bouvet";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:11:"Bielorussia";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Canada";}s:2:"CC";a:1:{i:0;s:21:"Isole Cocos (Keeling)";}s:2:"CD";a:1:{i:0;s:32:"Repubblica Democratica del Congo";}s:2:"CF";a:1:{i:0;s:24:"Repubblica Centrafricana";}s:2:"CG";a:1:{i:0;s:5:"Congo";}s:2:"CH";a:1:{i:0;s:8:"Svizzera";}s:2:"CI";a:1:{i:0;s:16:"Costa d’Avorio";}s:2:"CK";a:1:{i:0;s:10:"Isole Cook";}s:2:"CL";a:1:{i:0;s:4:"Cile";}s:2:"CM";a:1:{i:0;s:7:"Camerun";}s:2:"CN";a:1:{i:0;s:4:"Cina";}s:2:"CO";a:1:{i:0;s:8:"Colombia";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:4:"Cuba";}s:2:"CV";a:1:{i:0;s:10:"Capo Verde";}s:2:"CX";a:1:{i:0;s:15:"Isola Christmas";}s:2:"CY";a:1:{i:0;s:5:"Cipro";}s:2:"CZ";a:1:{i:0;s:15:"Repubblica Ceca";}s:2:"DE";a:1:{i:0;s:8:"Germania";}s:2:"DJ";a:1:{i:0;s:6:"Gibuti";}s:2:"DK";a:1:{i:0;s:9:"Danimar
ca";}s:2:"DM";a:1:{i:0;s:8:"Dominica";}s:2:"DO";a:1:{i:0;s:21:"Repubblica Dominicana";}s:2:"DZ";a:1:{i:0;s:7:"Algeria";}s:2:"EC";a:1:{i:0;s:7:"Ecuador";}s:2:"EE";a:1:{i:0;s:7:"Estonia";}s:2:"EG";a:1:{i:0;s:6:"Egitto";}s:2:"EH";a:1:{i:0;s:18:"Sahara Occidentale";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:6:"Spagna";}s:2:"ET";a:1:{i:0;s:7:"Etiopia";}s:2:"FI";a:1:{i:0;s:9:"Finlandia";}s:2:"FJ";a:1:{i:0;s:4:"Fiji";}s:2:"FK";a:1:{i:0;s:14:"Isole Falkland";}s:2:"FM";a:1:{i:0;s:10:"Micronesia";}s:2:"FO";a:1:{i:0;s:11:"Isole Faroe";}s:2:"FR";a:1:{i:0;s:7:"Francia";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:11:"Regno Unito";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:7:"Georgia";}s:2:"GF";a:1:{i:0;s:15:"Guiana Francese";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:10:"Gibilterra";}s:2:"GL";a:1:{i:0;s:11:"Groenlandia";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:9:"Guadalupa";}s:2:"GQ";a:1:{i:0;s:18:"Guinea Equatoriale";}s:2:"GR";a:1:{i:0;s:6:"Grecia";}s:2:"GS";a:1:{i:0;s:40:"Georgia del Sud e Isole Sandwich del Sud";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinea-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:50:"Regione Amministrativa Speciale di Hong Kong, Cina";}s:2:"HM";a:1:{i:0;s:29:"Isole Heard ed Isole McDonald";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:7:"Croazia";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:8:"Ungheria";}s:2:"ID";a:1:{i:0;s:9:"Indonesia";}s:2:"IE";a:1:{i:0;s:7:"Irlanda";}s:2:"IL";a:1:{i:0;s:7:"Israele";}s:2:"IN";a:1:{i:0;s:5:"India";}s:2:"IO";a:1:{i:0;s:43:"Territorio Britannico dell’Oceano Indiano";}s:2:"IQ";a:1:{i:0;s:4:"Iraq";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:7:"Islanda";}s:2:"IT";a:1:{i:0;s:6:"Italia";}s:2:"JM";a:1:{i:0;s:8:"Giamaica";}s:2:"JO";a:1:{i:0;s:9:"Giordania";}s:2:"JP";a:1:{i:0;s:8:"Giappone";}s:2:"KE";a:1:{i:0;s:5:"Kenya";}s:2:"KG";a:1:{i:0;s:12:"Kirghizistan";}s:2:"KH";a:1:{i:0;s:8:"Cambogia";}s:2:"KI";a:
1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:6:"Comore";}s:2:"KN";a:1:{i:0;s:19:"Saint Kitts e Nevis";}s:2:"KP";a:1:{i:0;s:14:"Corea del Nord";}s:2:"KR";a:1:{i:0;s:13:"Corea del Sud";}s:2:"KW";a:1:{i:0;s:6:"Kuwait";}s:2:"KY";a:1:{i:0;s:12:"Isole Cayman";}s:2:"KZ";a:1:{i:0;s:10:"Kazakistan";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:6:"Libano";}s:2:"LC";a:1:{i:0;s:11:"Saint Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberia";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:8:"Lituania";}s:2:"LU";a:1:{i:0;s:11:"Lussemburgo";}s:2:"LV";a:1:{i:0;s:8:"Lettonia";}s:2:"LY";a:1:{i:0;s:5:"Libia";}s:2:"MA";a:1:{i:0;s:7:"Marocco";}s:2:"MC";a:1:{i:0;s:6:"Monaco";}s:2:"MD";a:1:{i:0;s:8:"Moldavia";}s:2:"MG";a:1:{i:0;s:10:"Madagascar";}s:2:"MH";a:1:{i:0;s:14:"Isole Marshall";}s:2:"MK";a:1:{i:0;s:21:"Macedonia, Repubblica";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:8:"Mongolia";}s:2:"MO";a:1:{i:0;s:46:"Regione Amministrativa Speciale di Macao, Cina";}s:2:"MP";a:1:{i:0;s:29:"Isole Marianne Settentrionali";}s:2:"MQ";a:1:{i:0;s:9:"Martinica";}s:2:"MR";a:1:{i:0;s:10:"Mauritania";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:7:"Maldive";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:7:"Messico";}s:2:"MY";a:1:{i:0;s:7:"Malesia";}s:2:"MZ";a:1:{i:0;s:9:"Mozambico";}s:2:"NA";a:1:{i:0;s:7:"Namibia";}s:2:"NC";a:1:{i:0;s:15:"Nuova Caledonia";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:13:"Isola Norfolk";}s:2:"NG";a:1:{i:0;s:7:"Nigeria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:11:"Paesi Bassi";}s:2:"NO";a:1:{i:0;s:8:"Norvegia";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:13:"Nuova Zelanda";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:5:"Perù";}s:2:"PF";a:1:{i:0;s:18:"Polinesia Francese";}s:2:"PG";a:1:{i:0;s:18:"Papua Nu
ova Guinea";}s:2:"PH";a:1:{i:0;s:9:"Filippine";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:7:"Polonia";}s:2:"PM";a:1:{i:0;s:23:"Saint Pierre e Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:9:"Portorico";}s:2:"PS";a:1:{i:0;s:9:"Palestina";}s:2:"PT";a:1:{i:0;s:10:"Portogallo";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Qatar";}s:2:"RE";a:1:{i:0;s:8:"Réunion";}s:2:"RO";a:1:{i:0;s:7:"Romania";}s:2:"RU";a:1:{i:0;s:17:"Federazione Russa";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SA";a:1:{i:0;s:14:"Arabia Saudita";}s:2:"SB";a:1:{i:0;s:13:"Isole Solomon";}s:2:"SC";a:1:{i:0;s:10:"Seychelles";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:6:"Svezia";}s:2:"SG";a:1:{i:0;s:9:"Singapore";}s:2:"SH";a:1:{i:0;s:12:"Sant’Elena";}s:2:"SI";a:1:{i:0;s:8:"Slovenia";}s:2:"SJ";a:1:{i:0;s:20:"Svalbard e Jan Mayen";}s:2:"SK";a:1:{i:0;s:10:"Slovacchia";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:7:"Somalia";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:8:"Suriname";}s:2:"ST";a:1:{i:0;s:22:"São Tomé e Príncipe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:5:"Siria";}s:2:"SZ";a:1:{i:0;s:9:"Swaziland";}s:2:"TC";a:1:{i:0;s:20:"Isole Turks e Caicos";}s:2:"TD";a:1:{i:0;s:4:"Ciad";}s:2:"TF";a:1:{i:0;s:27:"Territori australi francesi";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:9:"Tailandia";}s:2:"TJ";a:1:{i:0;s:10:"Tagikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:9:"Timor Est";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:7:"Tunisia";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:7:"Turchia";}s:2:"TT";a:1:{i:0;s:17:"Trinidad e Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TZ";a:1:{i:0;s:8:"Tanzania";}s:2:"UA";a:1:{i:0;s:7:"Ucraina";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:38:"Isole Minori lontane dagli Stati Uniti";}s:2:"US";a:1:{i:0;s:11:"Stati Uniti";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:1
0:"Uzbekistan";}s:2:"VA";a:1:{i:0;s:8:"Vaticano";}s:2:"VC";a:1:{i:0;s:26:"Saint Vincent e Grenadines";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:25:"Isole Vergini Britanniche";}s:2:"VI";a:1:{i:0;s:23:"Isole Vergini Americane";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:15:"Wallis e Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Yemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:10:"Yugoslavia";}s:2:"ZA";a:1:{i:0;s:10:"Sud Africa";}s:2:"ZM";a:1:{i:0;s:6:"Zambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:380:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:15:"Diner Andorrano";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:16:"Peseta Andorrana";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:32:"Dirham degli Emirati Arabi Uniti";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:18:"Afgani (1927-2002)";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:6:"Afgani";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:24:"Franco di Affars e Issas";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:24:"Lek Albanese (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:12:"Lek Albanese";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:19:"Lek Valute Albanese";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:48:"Certificati di cambio esteri albanesi in dollari";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:11:"Dram Armeno";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:30:"Fiorino delle Antille Olandesi";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:15:"Kwanza Angolano";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:27:"Kwanza Angolano (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:33:"Nuovo Kwanza Angolano (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:38:"Kwanza Reajustado Angolano (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:15:"Escudo Angolano";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:17:"Austral Argentino";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:30:"Peso Moneda Nacional argentino";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:29:"Peso Argentino (vecchio Cod.)";}s:3:"ARS";a:2:{i:0;s:3:"ARS";i:1;s:14:"Peso Argentino";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:18:"Scellino Austriaco";}s:3:"AUD";a:2:{i:0;s:3:
"AUD";i:1;s:19:"Dollaro Australiano";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:20:"Sterlina Australiana";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:16:"Fiorino di Aruba";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:11:"Manat Azero";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:24:"Dinar Bosnia-Herzegovina";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:29:"Marco Conv. Bosnia-Erzegovina";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:30:"Nuovo Dinar Bosnia-Herzegovina";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:19:"Dollaro di Barbados";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:15:"Taka Bangladese";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:27:"Franco Belga (convertibile)";}s:3:"BEF";a:2:{i:0;s:3:"BEF";i:1;s:12:"Franco Belga";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:26:"Franco Belga (finanziario)";}s:3:"BGL";a:2:{i:0;s:3:"BGL";i:1;s:11:"Lev Bulgaro";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:22:"Lev Bulgaro Socialista";}s:3:"BGN";a:2:{i:0;s:3:"lev";i:1;s:17:"Nuovo Lev Bulgaro";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:23:"Lev Bulgaro (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:43:"Certificati di cambio esteri in Lev bulgari";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:19:"Dinaro del Bahraini";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:18:"Franco del Burundi";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:21:"Dollaro delle Bermuda";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:22:"Sterlina delle Bermuda";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:18:"Dollaro del Brunei";}s:3:"BOB";a:2:{i:0;s:3:"BOB";i:1;s:9:"Boliviano";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:21:"Boliviano (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:14:"Peso Boliviano";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:15:"Mvdol Boliviano";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:36:"Cruzeiro Novo Brasiliano (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:18:"Cruzado Brasiliano";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:31:"Cruzeiro Brasiliano (1990-1993)";}s:3:"BRL";a:2:{i:0;s:3:"BRL";i:1;s:15:"Real Brasiliano";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:23:"Cruzado Novo Brasiliano";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:19:"Cruzeiro Brasiliano";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:31:"Cruzeiro Brasiliano (1942-1
967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:21:"Dollaro delle Bahamas";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:19:"Libra delle Bahamas";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:17:"Ngultrum Butanese";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:14:"Rupia Butanese";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:12:"Kyat Birmano";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:13:"Rupia Birmana";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:17:"Pula del Botswana";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:35:"Nuovo Rublo Bielorussia (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:29:"Rublo Bielorussia (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:17:"Rublo Bielorussia";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:14:"Dollaro Belize";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:27:"Dollaro Honduras Britannico";}s:3:"CAD";a:2:{i:0;s:3:"CAD";i:1;s:16:"Dollaro Canadese";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:16:"Franco Congolese";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:33:"Franco della Repubblica Congolese";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:15:"Zaire Congolese";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:50:"Franco CFA della Repubblica dell’Africa Centrale";}s:3:"CHF";a:2:{i:0;s:4:"SFr.";i:1;s:15:"Franco Svizzero";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:24:"Dollaro delle Isole Cook";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:13:"Condor Cileno";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:13:"Escudo Cileno";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:27:"Unidades de Fomento Chilene";}s:3:"CLP";a:2:{i:0;s:3:"CLP";i:1;s:11:"Peso Cileno";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:22:"Franco CFA del Camerun";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:24:"Jen Min Piao Yuan Cinese";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:59:"Certificati di cambio esteri cinesi in dollari statunitensi";}s:3:"CNY";a:2:{i:0;s:3:"CNY";i:1;s:15:"Renmimbi Cinese";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:28:"Peso in banconote colombiano";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:20:"Franco CFA del Congo";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:15:"Peso Colombiano";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:18:"Colón Costaricano";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:19:"Corona Cecoslovacca";}s:3:"CSK";
a:2:{i:0;s:3:"CSK";i:1;s:25:"Corona forte cecoslovacca";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:11:"Peso Cubano";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:35:"Certificati di cambio esteri cubani";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:21:"Escudo del Capo Verde";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:19:"Guilder del Curacao";}s:3:"CYP";a:2:{i:0;s:3:"CYP";i:1;s:17:"Sterlina Cipriota";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:11:"Corona Ceca";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:32:"Ostmark della Germania Orientale";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:13:"Marco Tedesco";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:17:"Sperrmark Tedesco";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:16:"Franco Gibutiano";}s:3:"DKK";a:2:{i:0;s:3:"DKK";i:1;s:13:"Corona Danese";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:15:"Peso Dominicano";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:15:"Dinaro Algerino";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:21:"Nuovo franco algerino";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:25:"Franco germinale algerino";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:20:"Sucre dell’Ecuador";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:46:"Unidad de Valor Constante (UVC) dell’Ecuador";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:21:"Corona dell’Estonia";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:17:"Sterlina Egiziana";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:13:"Nakfa Eritreo";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:15:"Peseta Spagnola";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:13:"Birr Etiopico";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:16:"Dollaro Etiopico";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"Euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:17:"Markka Finlandese";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:29:"Markka Finlandese (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:18:"Dollaro delle Figi";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:19:"Sterlina delle Figi";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:23:"Sterlina delle Falkland";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:25:"Kronur delle Isole Faeroe";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:15:"Franco Francese";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:41:"Franco germinale/franco Poincare francese";}s:3:"GAF";a:2:{i:
0;s:3:"GAF";i:1;s:16:"Franco CFA Gabon";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:16:"Sterlina Inglese";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:21:"Kupon Larit Georgiano";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:14:"Lari Georgiano";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:14:"Cedi del Ghana";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:21:"Vecchi cedi del Ghana";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:18:"Sterlina del Ghana";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:25:"Cedi rivalutato del Ghana";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:22:"Sterlina di Gibilterra";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:24:"Corona della Groenlandia";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:17:"Dalasi del Gambia";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:19:"Sterlina del Gambia";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:19:"Franco della Guinea";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:31:"Franco della Guinea (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:17:"Syli della Guinea";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:22:"Franco della Guadalupa";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:31:"Ekwele della Guinea Equatoriale";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:31:"Franco della Guinea Equatoriale";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:40:"Peseta Guineana della Guinea Equatoriale";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:12:"Dracma Greca";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:18:"Nuova dracma greca";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:20:"Quetzal Guatemalteco";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:35:"Franco Guiana della Guyana francese";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:30:"Escudo della Guinea portoghese";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:32:"Mil Reis della Guinea portoghese";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:24:"Peso della Guinea-Bissau";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:20:"Dollaro della Guyana";}s:3:"HKD";a:2:{i:0;s:3:"HKD";i:1;s:20:"Dollaro di Hong Kong";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:17:"Lempira Hoduregno";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:13:"Dinaro Croato";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:11:"Kuna Croata";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:15:"Gourde Haitiano";}s:3:"HUF";a:2:{i:0;s:3:"HUF";i:1;s:17:"Fio
rino Ungherese";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:32:"Sterlina dell’Irlanda del Nord";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:24:"Fiorino Nica indonesiano";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:25:"Rupia indonesiana di Java";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:23:"Nuova rupia indonesiana";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:13:"Rupia Indiana";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:14:"Lira Irlandese";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:17:"Sheqel Israeliano";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:19:"Sterlina Israeliana";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:23:"Nuovo sheqel israeliano";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:33:"Lira Sterlina dell’Isola di Man";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:13:"Rupia Indiana";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:15:"Dinaro Iracheno";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:13:"Rial Iraniano";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:16:"Corona Islandese";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:13:"Lira Italiana";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:23:"Lira Sterlina di Jersey";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:18:"Dollaro Giamaicano";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:19:"Sterlina Giamaicana";}s:3:"JOD";a:2:{i:0;s:3:"JOD";i:1;s:15:"Dinaro Giordano";}s:3:"JPY";a:2:{i:0;s:2:"¥";i:1;s:14:"Yen Giapponese";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:16:"Scellino Keniota";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:13:"Som  Kirghiso";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:23:"Vecchio riel cambogiano";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:15:"Riel Cambogiano";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:19:"Dollaro di Kiribati";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:16:"Franco Comoriano";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:53:"Won della Repubblica popolare democratica nordcoreana";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:15:"Won Nordcoreano";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:15:"Hwan sudcoreano";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:21:"Vecchi won sudcoreano";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:14:"Won Sudcoreano";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:17:"Dinaro Kuwaitiano";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:26:"Dollaro delle Isole
 Cayman";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:12:"Rublo Kazaco";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:12:"Tenge Kazaco";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:12:"Kip Laotiano";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:17:"Sterlina Libanese";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:24:"Franco del Liechtenstein";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:18:"Rupia di Sri Lanka";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:15:"Rupia di Ceylon";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:17:"Dollaro Liberiano";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:16:"Loti del Lesotho";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:12:"Lita Lituana";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:15:"Talonas Lituani";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:22:"Franco del Lussemburgo";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:11:"Lat Lettone";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:13:"Rublo Lettone";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:44:"Lira libica della British Military Authority";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:13:"Dinaro Libico";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:15:"Sterlina Libica";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:17:"Dirham Marocchino";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:17:"Franco Marocchino";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:23:"Franc Nouveau di Monaco";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:26:"Franco germinale di Monaco";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:25:"Coupon Leu della Moldavia";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:11:"Leu Moldavo";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:27:"Coupon Rublo della Moldavia";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:16:"Ariary Malgascio";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:16:"Franco Malgascio";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:28:"Dollaro delle Isole Marshall";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:15:"Dinaro Macedone";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:27:"Dinaro Macedone (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:14:"Franco di Mali";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:15:"Kyat di Myanmar";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:47:"Certificati di cambio esteri in dollari Myanmar";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:14:"Tugrik Mongolo";}s:3:"MOP";a:2:{i:0;s:3:"MOP";
i:1;s:15:"Pataca di Macao";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:22:"Franco della Martinica";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:24:"Ouguiya della Mauritania";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:12:"Lira Maltese";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:16:"Sterlina Maltese";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:16:"Rupia Mauriziana";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:19:"Rupia delle Maldive";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:21:"Rufiyaa delle Maldive";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:16:"Kwacha Malawiano";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:18:"Sterlina Malawiana";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:14:"Peso Messicano";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:38:"Peso messicano d’argento (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:35:"Unidad de Inversion (UDI) Messicana";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:21:"Ringgit della Malesia";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:20:"Escudo del Mozambico";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:21:"Metical del Mozambico";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:17:"Dollaro Namibiano";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:38:"Franco germinale della Nuova Caledonia";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:15:"Naira Nigeriana";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:18:"Sterlina Nigeriana";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:29:"Franco CFP delle Nuove Ebridi";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:20:"Cordoba Nicaraguense";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:29:"Córdoba d’oro nicaraguense";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:25:"Córdoba oro nicaraguense";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:16:"Fiorino Olandese";}s:3:"NOK";a:2:{i:0;s:3:"NOK";i:1;s:16:"Corona Norvegese";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:14:"Rupia Nepalese";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:20:"Dollaro Neozelandese";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:21:"Sterlina Neozelandese";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:12:"Rial Omanita";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:22:"Rial Saidi dell’Oman";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:16:"Balboa di Panama";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:36:"Coupon in rubli della Transdniestria";}s:3:"
PDN";a:2:{i:0;s:3:"PDN";i:1;s:32:"Nuovo rublo della Transdniestria";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:26:"Rublo della Transdniestria";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:14:"Inti Peruviano";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:19:"Sol Nuevo Peruviano";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:13:"Sol Peruviano";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:29:"Kina della Papua Nuova Guinea";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:20:"Peso delle Filippine";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:18:"Rupia del Pakistan";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:13:"Zloty Polacco";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:61:"Certificati di cambio esteri polacchi in dollari statunitensi";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:25:"Zloty Polacco (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:24:"Sterlina della Palestina";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:16:"Conto Portoghese";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:17:"Escudo Portoghese";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:20:"Guarani del Paraguay";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:14:"Rial del Qatar";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:17:"Franco di Reunion";}s:3:"ROL";a:2:{i:0;s:3:"ROL";i:1;s:17:"Leu della Romania";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:23:"Nuovo Leu della Romania";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:11:"Rublo Russo";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:15:"Rublo della CSI";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:15:"Franco Ruandese";}s:3:"SAR";a:2:{i:0;s:3:"SAR";i:1;s:12:"Ryal Saudita";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:21:"Riyal sovrano saudita";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:27:"Dollaro delle Isole Solomon";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:22:"Rupia delle Seychelles";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:15:"Dinaro Sudanese";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:17:"Sterlina Sudanese";}s:3:"SEK";a:2:{i:0;s:3:"SEK";i:1;s:14:"Corona Svedese";}s:3:"SGD";a:2:{i:0;s:3:"SGD";i:1;s:20:"Dollaro di Singapore";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:24:"Sterlina di Sant’Elena";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:20:"Tallero Bons Sloveno";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:15:"Tallero Sloveno";}s:3:
"SKK";a:2:{i:0;s:2:"Sk";i:1;s:15:"Corona Slovacca";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:24:"Leone della Sierra Leone";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:18:"Lira di San Marino";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:15:"Scellino Somalo";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:23:"Scellino del Somaliland";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:20:"Fiorino del Suriname";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:17:"Sterlina Scozzese";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:30:"Dobra di São Tomé e Principe";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:31:"Escudo di São Tomé e Principe";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:21:"Nuovo rublo sovietico";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:15:"Rublo Sovietico";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:19:"Colón Salvadoregno";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:16:"Sterlina Siriana";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:25:"Lilangeni dello Swaziland";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:24:"Corona di Turks e Caicos";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:19:"Franco CFA del Chad";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:15:"Baht Tailandese";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:20:"Rublo del Tajikistan";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:21:"Somoni del Tajikistan";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:14:"Manat Turkmeno";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:15:"Dinaro Tunisino";}s:3:"TOP";a:2:{i:0;s:2:"T$";i:1;s:17:"Paʻanga di Tonga";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:22:"Lira sterlina di Tonga";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:15:"Escudo di Timor";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:15:"Pataca di Timor";}s:3:"TRL";a:2:{i:0;s:3:"TRL";i:1;s:10:"Lira Turca";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:28:"Dollaro di Trinidad e Tobago";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:36:"Vecchio dollaro di Trinidad e Tobago";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:17:"Dollaro di Tuvalu";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:23:"Nuovo dollaro taiwanese";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:23:"Scellino della Tanzania";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:14:"Hrivna Ucraina";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:19:"Karbovanetz Ucraino";}s:3:"UGS";a:
2:{i:0;s:3:"UGS";i:1;s:29:"Scellino Ugandese (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:17:"Scellino Ugandese";}s:3:"USD";a:2:{i:0;s:1:"$";i:1;s:20:"Dollaro Statunitense";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:31:"Dollaro Statunitense (Next day)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:31:"Dollaro Statunitense (Same day)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:29:"Peso Fuerte dell’Uruguaiano";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:27:"Peso Uruguaiano (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:24:"Peso Uruguayo uruguaiano";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:28:"Som Coupon dell’Uzbekistan";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:21:"Sum dell’Uzbekistan";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:30:"Lira della Città del Vaticano";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:32:"Piastre Dong Viet nordvietnamita";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:25:"Nuovo Dong nordvietnamita";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:42:"Viet Minh Piastre Dong Viet nordvietnamita";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:19:"Bolivar Venezuelano";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:39:"Dollaro delle Isole Vergini britanniche";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:15:"Dong Vietnamita";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:21:"Nuovo dong vietnamita";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:32:"Dong della Repubblica Vietnamita";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:25:"Dong Nazionale Vietnamita";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:15:"Vatu di Vanuatu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:32:"Sterlina della Samoa Occidentale";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:28:"Tala della Samoa Occidentale";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:34:"Unità di conto in dinari asiatica";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:15:"Franco CFA BEAC";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:25:"Unità Monetaria Asiatica";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:3:"Oro";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:24:"Unità composita europea";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:24:"Unità monetaria europea";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:31:"Unità di acconto europea (XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:3
1:"Unità di acconto europea (XBD)";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:29:"Dollaro dei Caraibi Orientali";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:16:"Nuovo Franco CFA";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:27:"Diritti Speciali di Incasso";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:17:"Franco CFA BCEAEC";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:24:"Unità Monetaria Europea";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:19:"Franco Oro Francese";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:19:"Franco UIC Francese";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:15:"Dinaro Islamico";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:36:"Nouveau Franc francese metropolitano";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:33:"Franco CFA delle Antille Francesi";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:16:"Franco CFA BCEAO";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:10:"Franco CFP";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:26:"Rublo Trasferibile COMECON";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:18:"Dinaro dello Yemen";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:23:"Riyal Imadi dello Yemen";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:16:"Rial dello Yemen";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:22:"Dinaro Forte Yugoslavo";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:34:"Dinaro della Federazione Yugoslava";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:21:"Dinaro 1994 Yugoslavo";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:22:"Dinaro Noviy Yugoslavo";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:29:"Dinaro Convertibile Yugoslavo";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:27:"Dinaro di Ottobre Yugoslavo";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:26:"Dinaro Riformato Yugoslavo";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:30:"Rand Sudafricano (finanziario)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:20:"Sterlina Sudafricana";}s:3:"ZAR";a:2:{i:0;s:3:"ZAR";i:1;s:16:"Rand Sudafricano";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:19:"Kwacha dello Zambia";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:21:"Sterlina dello Zambia";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:23:"Nuovo Zaire dello Zaire";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:17:"Zaire dello Zaire";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:22:"Dollaro dello Zimbabwe";}}s:4:"Keys";a:3:
{s:8:"calendar";a:1:{i:0;s:10:"Calendario";}s:9:"collation";a:1:{i:0;s:10:"Collazione";}s:8:"currency";a:1:{i:0;s:6:"Valuta";}}s:9:"Languages";a:461:{s:2:"aa";a:1:{i:0;s:4:"afar";}s:2:"ab";a:1:{i:0;s:9:"abkhazian";}s:3:"ace";a:1:{i:0;s:8:"accinese";}s:3:"ach";a:1:{i:0;s:6:"acioli";}s:3:"ada";a:1:{i:0;s:7:"adangme";}s:3:"ady";a:1:{i:0;s:6:"adyghe";}s:2:"ae";a:1:{i:0;s:7:"avestan";}s:2:"af";a:1:{i:0;s:9:"afrikaans";}s:3:"afa";a:1:{i:0;s:28:"afro-asiatica (altra lingua)";}s:3:"afh";a:1:{i:0;s:8:"afrihili";}s:2:"ak";a:1:{i:0;s:4:"akan";}s:3:"akk";a:1:{i:0;s:6:"accado";}s:3:"ale";a:1:{i:0;s:6:"aleuto";}s:3:"alg";a:1:{i:0;s:17:"lingue algonchine";}s:2:"am";a:1:{i:0;s:7:"amarico";}s:2:"an";a:1:{i:0;s:9:"aragonese";}s:3:"ang";a:1:{i:0;s:29:"inglese, antico (ca.450-1100)";}s:3:"apa";a:1:{i:0;s:13:"lingue apache";}s:2:"ar";a:1:{i:0;s:5:"arabo";}s:3:"arc";a:1:{i:0;s:8:"aramaico";}s:3:"arn";a:1:{i:0;s:8:"araucano";}s:3:"arp";a:1:{i:0;s:7:"arapaho";}s:3:"art";a:1:{i:0;s:26:"artificiale (altra lingua)";}s:3:"arw";a:1:{i:0;s:6:"aruaco";}s:2:"as";a:1:{i:0;s:8:"assamese";}s:3:"ast";a:1:{i:0;s:9:"asturiano";}s:3:"ath";a:1:{i:0;s:16:"lingue athabaska";}s:3:"aus";a:1:{i:0;s:18:"lingue australiane";}s:2:"av";a:1:{i:0;s:5:"avaro";}s:3:"awa";a:1:{i:0;s:6:"awadhi";}s:2:"ay";a:1:{i:0;s:6:"aymara";}s:2:"az";a:1:{i:0;s:12:"azerbaigiano";}s:2:"ba";a:1:{i:0;s:8:"baschiro";}s:3:"bad";a:1:{i:0;s:5:"banda";}s:3:"bai";a:1:{i:0;s:15:"lingue bamileke";}s:3:"bal";a:1:{i:0;s:6:"beluci";}s:3:"ban";a:1:{i:0;s:8:"balinese";}s:3:"bas";a:1:{i:0;s:4:"basa";}s:3:"bat";a:1:{i:0;s:22:"baltica (altra lingua)";}s:2:"be";a:1:{i:0;s:10:"bielorusso";}s:3:"bej";a:1:{i:0;s:5:"begia";}s:3:"bem";a:1:{i:0;s:5:"wemba";}s:3:"ber";a:1:{i:0;s:7:"berbero";}s:2:"bg";a:1:{i:0;s:7:"bulgaro";}s:2:"bh";a:1:{i:0;s:6:"bihari";}s:3:"bho";a:1:{i:0;s:8:"bhojpuri";}s:2:"bi";a:1:{i:0;s:7:"bislama";}s:3:"bik";a:1:{i:0;s:5:"bicol";}s:3:"bin";a:1:{i:0;s:4:"bini";}s:3:"bla";a:1:{i:0;s:7:"siksika";}s:2:"bm";a:1:{i:0;s:7:"bambara";}s:2:"bn";a:1:{i:0;s:9:"bengalese";}s:3:"bnt";a:1:{i:0;s:5:"
bantu";}s:2:"bo";a:1:{i:0;s:8:"tibetano";}s:2:"br";a:1:{i:0;s:7:"bretone";}s:3:"bra";a:1:{i:0;s:4:"braj";}s:2:"bs";a:1:{i:0;s:8:"bosniaco";}s:3:"btk";a:1:{i:0;s:5:"batak";}s:3:"bua";a:1:{i:0;s:6:"buriat";}s:3:"bug";a:1:{i:0;s:4:"bugi";}s:3:"byn";a:1:{i:0;s:4:"blin";}s:2:"ca";a:1:{i:0;s:8:"catalano";}s:3:"cad";a:1:{i:0;s:5:"caddo";}s:3:"cai";a:1:{i:0;s:46:"indiana dell’America Centrale (altra lingua)";}s:3:"car";a:1:{i:0;s:8:"caribico";}s:3:"cau";a:1:{i:0;s:24:"caucasica (altra lingua)";}s:2:"ce";a:1:{i:0;s:6:"ceceno";}s:3:"ceb";a:1:{i:0;s:7:"cebuano";}s:3:"cel";a:1:{i:0;s:20:"celtica altra lingua";}s:2:"ch";a:1:{i:0;s:8:"chamorro";}s:3:"chb";a:1:{i:0;s:7:"chibcha";}s:3:"chg";a:1:{i:0;s:10:"ciagataico";}s:3:"chk";a:1:{i:0;s:8:"chuukese";}s:3:"chm";a:1:{i:0;s:4:"mari";}s:3:"chn";a:1:{i:0;s:13:"gergo chinook";}s:3:"cho";a:1:{i:0;s:7:"choctaw";}s:3:"chp";a:1:{i:0;s:9:"chipewyan";}s:3:"chr";a:1:{i:0;s:8:"cherokee";}s:3:"chy";a:1:{i:0;s:8:"cheyenne";}s:3:"cmc";a:1:{i:0;s:13:"lingue chamic";}s:2:"co";a:1:{i:0;s:5:"corso";}s:3:"cop";a:1:{i:0;s:5:"copto";}s:3:"cpe";a:1:{i:0;s:54:"creolo e pidgins, basato sull’inglese (altra lingua)";}s:3:"cpf";a:1:{i:0;s:52:"creolo e pidgins, basato sul francese (altra lingua)";}s:3:"cpp";a:1:{i:0;s:54:"creolo e pidgins, basato sul portoghese (altra lingua)";}s:2:"cr";a:1:{i:0;s:4:"cree";}s:3:"crh";a:1:{i:0;s:26:"turco crimeo; tatar crimeo";}s:3:"crp";a:1:{i:0;s:31:"creola e Pidgins (altra lingua)";}s:2:"cs";a:1:{i:0;s:4:"ceco";}s:3:"csb";a:1:{i:0;s:9:"kashubian";}s:2:"cu";a:1:{i:0;s:18:"slavo della Chiesa";}s:3:"cus";a:1:{i:0;s:24:"cuscitica (altra lingua)";}s:2:"cv";a:1:{i:0;s:7:"chuvash";}s:2:"cy";a:1:{i:0;s:7:"gallese";}s:2:"da";a:1:{i:0;s:6:"danese";}s:3:"dak";a:1:{i:0;s:6:"dakota";}s:3:"dar";a:1:{i:0;s:6:"dargwa";}s:3:"day";a:1:{i:0;s:5:"dayak";}s:2:"de";a:1:{i:0;s:7:"tedesco";}s:3:"del";a:1:{i:0;s:8:"delaware";}s:3:"den";a:1:{i:0;s:5:"slave";}s:3:"dgr";a:1:{i:0;s:6:"dogrib";}s:3:"din";a:1:{i:0;s:5:"dinca";}s:3:"doi";a:1:{i:0;s:5:"dogri";}s:3:"dra";a:1:{i:0;s:24:"dravidica (altr
a lingua)";}s:3:"dsb";a:1:{i:0;s:12:"basso sorabo";}s:3:"dua";a:1:{i:0;s:5:"duala";}s:3:"dum";a:1:{i:0;s:31:"olandese, medio (ca. 1050-1350)";}s:2:"dv";a:1:{i:0;s:6:"divehi";}s:3:"dyu";a:1:{i:0;s:5:"diula";}s:2:"dz";a:1:{i:0;s:8:"dzongkha";}s:2:"ee";a:1:{i:0;s:3:"ewe";}s:3:"efi";a:1:{i:0;s:4:"efik";}s:3:"egy";a:1:{i:0;s:17:"egiziano (antico)";}s:3:"eka";a:1:{i:0;s:7:"ekajuka";}s:2:"el";a:1:{i:0;s:5:"greco";}s:3:"elx";a:1:{i:0;s:9:"elamitico";}s:2:"en";a:1:{i:0;s:7:"inglese";}s:3:"enm";a:1:{i:0;s:26:"inglese, medio (1100-1500)";}s:2:"eo";a:1:{i:0;s:9:"esperanto";}s:2:"es";a:1:{i:0;s:8:"spagnolo";}s:2:"et";a:1:{i:0;s:6:"estone";}s:2:"eu";a:1:{i:0;s:5:"basco";}s:3:"ewo";a:1:{i:0;s:6:"ewondo";}s:2:"fa";a:1:{i:0;s:8:"persiano";}s:3:"fat";a:1:{i:0;s:5:"fanti";}s:2:"ff";a:1:{i:0;s:5:"fulah";}s:2:"fi";a:1:{i:0;s:10:"finlandese";}s:3:"fiu";a:1:{i:0;s:26:"ugrofinnica (altra lingua)";}s:2:"fj";a:1:{i:0;s:7:"figiano";}s:2:"fo";a:1:{i:0;s:7:"faroese";}s:2:"fr";a:1:{i:0;s:8:"francese";}s:3:"frm";a:1:{i:0;s:30:"francese, medio (ca.1400-1600)";}s:3:"fro";a:1:{i:0;s:30:"francese, antico (842-ca.1400)";}s:3:"fur";a:1:{i:0;s:8:"friulano";}s:2:"fy";a:1:{i:0;s:7:"frisone";}s:2:"ga";a:1:{i:0;s:9:"irlandese";}s:3:"gaa";a:1:{i:0;s:2:"ga";}s:3:"gay";a:1:{i:0;s:4:"gayo";}s:3:"gba";a:1:{i:0;s:5:"gbaya";}s:2:"gd";a:1:{i:0;s:16:"gaelico scozzese";}s:3:"gem";a:1:{i:0;s:24:"germanica (altra lingua)";}s:3:"gez";a:1:{i:0;s:4:"geez";}s:3:"gil";a:1:{i:0;s:10:"gilbertese";}s:2:"gl";a:1:{i:0;s:9:"galiziano";}s:3:"gmh";a:1:{i:0;s:34:"tedesco, medio alto (ca.1050-1500)";}s:2:"gn";a:1:{i:0;s:7:"guarana";}s:3:"goh";a:1:{i:0;s:34:"tedesco, antico alto (ca.750-1050)";}s:3:"gon";a:1:{i:0;s:5:"gondi";}s:3:"gor";a:1:{i:0;s:9:"gorontalo";}s:3:"got";a:1:{i:0;s:6:"gotico";}s:3:"grb";a:1:{i:0;s:5:"gerbo";}s:3:"grc";a:1:{i:0;s:28:"greco, antico (fino al 1453)";}s:2:"gu";a:1:{i:0;s:8:"gujarati";}s:2:"gv";a:1:{i:0;s:4:"manx";}s:3:"gwi";a:1:{i:0;s:9:"gwichʻin";}s:2:"ha";a:1:{i:0;s:6:"haussa";}s:3:"hai";a:1:{i:0;s:5:"haida";}s:3:"haw";a:1:{i:0;s:8:"hawaiano";}s:2:"h
e";a:1:{i:0;s:7:"ebraico";}s:2:"hi";a:1:{i:0;s:5:"hindi";}s:3:"hil";a:1:{i:0;s:9:"hiligayna";}s:3:"him";a:1:{i:0;s:9:"himachali";}s:3:"hit";a:1:{i:0;s:7:"hittite";}s:3:"hmn";a:1:{i:0;s:5:"hmong";}s:2:"ho";a:1:{i:0;s:9:"hiri motu";}s:2:"hr";a:1:{i:0;s:6:"croato";}s:3:"hsb";a:1:{i:0;s:11:"alto sorabo";}s:2:"ht";a:1:{i:0;s:7:"haitian";}s:2:"hu";a:1:{i:0;s:9:"ungherese";}s:3:"hup";a:1:{i:0;s:4:"hupa";}s:2:"hy";a:1:{i:0;s:6:"armeno";}s:2:"hz";a:1:{i:0;s:6:"herero";}s:2:"ia";a:1:{i:0;s:11:"interlingua";}s:3:"iba";a:1:{i:0;s:4:"iban";}s:2:"id";a:1:{i:0;s:11:"indonesiano";}s:2:"ie";a:1:{i:0;s:11:"interlingue";}s:2:"ig";a:1:{i:0;s:4:"igbo";}s:2:"ii";a:1:{i:0;s:10:"sichuan yi";}s:2:"ik";a:1:{i:0;s:7:"inupiak";}s:3:"ilo";a:1:{i:0;s:7:"ilocano";}s:3:"inc";a:1:{i:0;s:22:"indiana (altra lingua)";}s:3:"ine";a:1:{i:0;s:26:"indoeuropea (altra lingua)";}s:3:"inh";a:1:{i:0;s:6:"ingush";}s:2:"io";a:1:{i:0;s:3:"ido";}s:3:"ira";a:1:{i:0;s:8:"iraniana";}s:3:"iro";a:1:{i:0;s:15:"lingue irochesi";}s:2:"is";a:1:{i:0;s:9:"islandese";}s:2:"it";a:1:{i:0;s:8:"italiano";}s:2:"iu";a:1:{i:0;s:9:"inuktitut";}s:2:"ja";a:1:{i:0;s:10:"giapponese";}s:3:"jbo";a:1:{i:0;s:6:"lojban";}s:3:"jpr";a:1:{i:0;s:15:"giudeo persiano";}s:3:"jrb";a:1:{i:0;s:12:"giudeo arabo";}s:2:"jv";a:1:{i:0;s:9:"giavanese";}s:2:"ka";a:1:{i:0;s:9:"georgiano";}s:3:"kaa";a:1:{i:0;s:11:"kara-kalpak";}s:3:"kab";a:1:{i:0;s:6:"kabyle";}s:3:"kac";a:1:{i:0;s:6:"kachin";}s:3:"kam";a:1:{i:0;s:5:"kamba";}s:3:"kar";a:1:{i:0;s:5:"karen";}s:3:"kaw";a:1:{i:0;s:4:"kawi";}s:3:"kbd";a:1:{i:0;s:8:"kabardia";}s:2:"kg";a:1:{i:0;s:5:"kongo";}s:3:"kha";a:1:{i:0;s:5:"khasi";}s:3:"khi";a:1:{i:0;s:22:"khoisan (altra lingua)";}s:3:"kho";a:1:{i:0;s:9:"khotanese";}s:2:"ki";a:1:{i:0;s:6:"kikuyu";}s:2:"kj";a:1:{i:0;s:8:"kuanyama";}s:2:"kk";a:1:{i:0;s:6:"kazako";}s:2:"kl";a:1:{i:0;s:11:"kalaallisut";}s:2:"km";a:1:{i:0;s:5:"khmer";}s:3:"kmb";a:1:{i:0;s:8:"kimbundu";}s:2:"kn";a:1:{i:0;s:7:"kannada";}s:2:"ko";a:1:{i:0;s:7:"coreano";}s:3:"kok";a:1:{i:0;s:7:"konkani";}s:3:"kos";a:1:{i:0;s:8:"Kosraean";}s:3:"kpe";a:
1:{i:0;s:6:"kpelle";}s:2:"kr";a:1:{i:0;s:6:"kanuri";}s:3:"krc";a:1:{i:0;s:15:"karachay-Balkar";}s:3:"kro";a:1:{i:0;s:3:"kru";}s:3:"kru";a:1:{i:0;s:6:"kurukh";}s:2:"ks";a:1:{i:0;s:8:"kashmiri";}s:2:"ku";a:1:{i:0;s:5:"curdo";}s:3:"kum";a:1:{i:0;s:5:"kumyk";}s:3:"kut";a:1:{i:0;s:7:"kutenai";}s:2:"kv";a:1:{i:0;s:4:"komi";}s:2:"kw";a:1:{i:0;s:7:"cornico";}s:2:"ky";a:1:{i:0;s:8:"kirghiso";}s:2:"la";a:1:{i:0;s:6:"latino";}s:3:"lad";a:1:{i:0;s:6:"ladino";}s:3:"lah";a:1:{i:0;s:6:"lahnda";}s:3:"lam";a:1:{i:0;s:5:"lamba";}s:2:"lb";a:1:{i:0;s:14:"lussemburghese";}s:3:"lez";a:1:{i:0;s:8:"lezghian";}s:2:"lg";a:1:{i:0;s:5:"ganda";}s:2:"li";a:1:{i:0;s:10:"limburgish";}s:2:"ln";a:1:{i:0;s:7:"lingala";}s:2:"lo";a:1:{i:0;s:3:"lao";}s:3:"lol";a:1:{i:0;s:12:"lolo (bantu)";}s:3:"loz";a:1:{i:0;s:4:"lozi";}s:2:"lt";a:1:{i:0;s:7:"lituano";}s:2:"lu";a:1:{i:0;s:12:"luba-katanga";}s:3:"lua";a:1:{i:0;s:10:"luba-lulua";}s:3:"lui";a:1:{i:0;s:7:"luiseno";}s:3:"lun";a:1:{i:0;s:5:"lunda";}s:3:"luo";a:1:{i:0;s:22:"luo (Kenia e Tanzania)";}s:3:"lus";a:1:{i:0;s:6:"lushai";}s:2:"lv";a:1:{i:0;s:7:"lettone";}s:3:"mad";a:1:{i:0;s:8:"madurese";}s:3:"mag";a:1:{i:0;s:6:"magahi";}s:3:"mai";a:1:{i:0;s:8:"maithili";}s:3:"mak";a:1:{i:0;s:7:"makasar";}s:3:"man";a:1:{i:0;s:8:"mandingo";}s:3:"map";a:1:{i:0;s:13:"austronesiano";}s:3:"mas";a:1:{i:0;s:5:"masai";}s:3:"mdf";a:1:{i:0;s:6:"moksha";}s:3:"mdr";a:1:{i:0;s:6:"mandar";}s:3:"men";a:1:{i:0;s:5:"mende";}s:2:"mg";a:1:{i:0;s:8:"malagasy";}s:3:"mga";a:1:{i:0;s:26:"irlandese medio (900-1200)";}s:2:"mh";a:1:{i:0;s:11:"marshallese";}s:2:"mi";a:1:{i:0;s:5:"maori";}s:3:"mic";a:1:{i:0;s:6:"micmac";}s:3:"min";a:1:{i:0;s:11:"menangkabau";}s:3:"mis";a:1:{i:0;s:14:"lingue diverse";}s:2:"mk";a:1:{i:0;s:8:"macedone";}s:3:"mkh";a:1:{i:0;s:24:"mon-khmer (altra lingua)";}s:2:"ml";a:1:{i:0;s:9:"malayalam";}s:2:"mn";a:1:{i:0;s:7:"mongolo";}s:3:"mnc";a:1:{i:0;s:6:"manchu";}s:3:"mni";a:1:{i:0;s:8:"manipuri";}s:3:"mno";a:1:{i:0;s:6:"manobo";}s:2:"mo";a:1:{i:0;s:7:"moldavo";}s:3:"moh";a:1:{i:0;s:6:"mohawk";}s:3:"mos";a:1:{i:0;s:5:"mos
si";}s:2:"mr";a:1:{i:0;s:7:"marathi";}s:2:"ms";a:1:{i:0;s:5:"malay";}s:2:"mt";a:1:{i:0;s:7:"maltese";}s:3:"mul";a:1:{i:0;s:11:"multilingua";}s:3:"mun";a:1:{i:0;s:20:"munda (altra lingua)";}s:3:"mus";a:1:{i:0;s:5:"creek";}s:3:"mwr";a:1:{i:0;s:7:"marwari";}s:2:"my";a:1:{i:0;s:7:"burmese";}s:3:"myn";a:1:{i:0;s:11:"lingue maya";}s:3:"myv";a:1:{i:0;s:5:"erzya";}s:2:"na";a:1:{i:0;s:5:"nauru";}s:3:"nah";a:1:{i:0;s:7:"nahuatl";}s:3:"nai";a:1:{i:0;s:39:"indiano del Nord America (altra lingua)";}s:3:"nap";a:1:{i:0;s:10:"napoletano";}s:2:"nb";a:1:{i:0;s:17:"norvegese bokmål";}s:2:"nd";a:1:{i:0;s:16:"ndebele del nord";}s:3:"nds";a:1:{i:0;s:28:"basso tedesco; basso sassone";}s:2:"ne";a:1:{i:0;s:6:"nepali";}s:3:"new";a:1:{i:0;s:6:"newari";}s:2:"ng";a:1:{i:0;s:6:"ndonga";}s:3:"nic";a:1:{i:0;s:31:"niger - cordofan (altra lingua)";}s:3:"niu";a:1:{i:0;s:4:"niue";}s:2:"nl";a:1:{i:0;s:8:"olandese";}s:2:"nn";a:1:{i:0;s:17:"norvegese nynorsk";}s:2:"no";a:1:{i:0;s:9:"norvegese";}s:3:"nog";a:1:{i:0;s:5:"nogai";}s:3:"non";a:1:{i:0;s:12:"norse antico";}s:2:"nr";a:1:{i:0;s:15:"ndebele del sud";}s:3:"nso";a:1:{i:0;s:14:"sotho del nord";}s:3:"nub";a:1:{i:0;s:7:"nubiano";}s:2:"nv";a:1:{i:0;s:6:"navajo";}s:2:"ny";a:1:{i:0;s:23:"nyanja; chichewa; chewa";}s:3:"nym";a:1:{i:0;s:8:"nyamwezi";}s:3:"nyn";a:1:{i:0;s:8:"nyankole";}s:3:"nyo";a:1:{i:0;s:5:"nyoro";}s:3:"nzi";a:1:{i:0;s:5:"nzima";}s:2:"oc";a:1:{i:0;s:32:"occitano (post 1500); provenzale";}s:2:"oj";a:1:{i:0;s:6:"ojibwa";}s:2:"om";a:1:{i:0;s:5:"oromo";}s:2:"or";a:1:{i:0;s:5:"oriya";}s:2:"os";a:1:{i:0;s:8:"ossetico";}s:3:"osa";a:1:{i:0;s:5:"osage";}s:3:"ota";a:1:{i:0;s:26:"turco ottomano (1500-1928)";}s:3:"oto";a:1:{i:0;s:12:"lingue otomi";}s:2:"pa";a:1:{i:0;s:7:"punjabi";}s:3:"paa";a:1:{i:0;s:34:"papuano-australiano (altra lingua)";}s:3:"pag";a:1:{i:0;s:10:"pangasinan";}s:3:"pal";a:1:{i:0;s:7:"pahlavi";}s:3:"pam";a:1:{i:0;s:8:"pampanga";}s:3:"pap";a:1:{i:0;s:10:"papiamento";}s:3:"pau";a:1:{i:0;s:5:"palau";}s:3:"peo";a:1:{i:0;s:30:"antico persiano (600-400 A.C.)";}s:3:"phi";a:1:{i:0;s:24:"fi
lippino (altra lingua)";}s:3:"phn";a:1:{i:0;s:7:"fenicio";}s:2:"pi";a:1:{i:0;s:4:"pali";}s:2:"pl";a:1:{i:0;s:7:"polacco";}s:3:"pon";a:1:{i:0;s:6:"ponape";}s:3:"pra";a:1:{i:0;s:8:"pracrito";}s:3:"pro";a:1:{i:0;s:33:"provenzale, antico (fino al 1500)";}s:2:"ps";a:1:{i:0;s:6:"pashto";}s:2:"pt";a:1:{i:0;s:10:"portoghese";}s:2:"qu";a:1:{i:0;s:7:"quechua";}s:3:"raj";a:1:{i:0;s:10:"rajasthani";}s:3:"rap";a:1:{i:0;s:7:"rapanui";}s:3:"rar";a:1:{i:0;s:9:"rarotonga";}s:2:"rm";a:1:{i:0;s:21:"lingua rhaeto-romance";}s:2:"rn";a:1:{i:0;s:5:"rundi";}s:2:"ro";a:1:{i:0;s:6:"romeno";}s:3:"roa";a:1:{i:0;s:29:"lingua romanza (altra lingua)";}s:3:"rom";a:1:{i:0;s:6:"romani";}s:2:"ru";a:1:{i:0;s:5:"russo";}s:2:"rw";a:1:{i:0;s:11:"kinyarwanda";}s:2:"sa";a:1:{i:0;s:9:"sanscrito";}s:3:"sad";a:1:{i:0;s:7:"sandawe";}s:3:"sah";a:1:{i:0;s:5:"yakut";}s:3:"sai";a:1:{i:0;s:38:"indiano del Sud America (altra lingua)";}s:3:"sal";a:1:{i:0;s:13:"lingue salish";}s:3:"sam";a:1:{i:0;s:19:"aramaico samaritano";}s:3:"sas";a:1:{i:0;s:5:"sasak";}s:3:"sat";a:1:{i:0;s:7:"santali";}s:2:"sc";a:1:{i:0;s:5:"sardo";}s:3:"sco";a:1:{i:0;s:8:"scozzese";}s:2:"sd";a:1:{i:0;s:6:"sindhi";}s:2:"se";a:1:{i:0;s:13:"sami del nord";}s:3:"sel";a:1:{i:0;s:6:"selkup";}s:3:"sem";a:1:{i:0;s:23:"semitico (altra lingua)";}s:2:"sg";a:1:{i:0;s:5:"sango";}s:3:"sga";a:1:{i:0;s:34:"irlandese, antico (fino al ’900)";}s:3:"sgn";a:1:{i:0;s:11:"lingue sign";}s:2:"sh";a:1:{i:0;s:12:"serbo-croato";}s:3:"shn";a:1:{i:0;s:4:"shan";}s:2:"si";a:1:{i:0;s:9:"singalese";}s:3:"sid";a:1:{i:0;s:6:"sidamo";}s:3:"sio";a:1:{i:0;s:12:"lingue sioux";}s:3:"sit";a:1:{i:0;s:28:"sino-tibetano (altra lingua)";}s:2:"sk";a:1:{i:0;s:8:"slovacco";}s:2:"sl";a:1:{i:0;s:7:"sloveno";}s:3:"sla";a:1:{i:0;s:20:"slavo (altra lingua)";}s:2:"sm";a:1:{i:0;s:7:"samoano";}s:3:"sma";a:1:{i:0;s:12:"sami del sud";}s:3:"smi";a:1:{i:0;s:26:"lingue sami (altra lingua)";}s:3:"smj";a:1:{i:0;s:9:"sami lule";}s:3:"smn";a:1:{i:0;s:10:"sami inari";}s:3:"sms";a:1:{i:0;s:10:"sami skolt";}s:2:"sn";a:1:{i:0;s:5:"shona";}s:3:"snk";a:1:{i:0;s:7:
"soninke";}s:2:"so";a:1:{i:0;s:6:"somalo";}s:3:"sog";a:1:{i:0;s:8:"sogdiano";}s:3:"son";a:1:{i:0;s:7:"songhai";}s:2:"sq";a:1:{i:0;s:8:"albanese";}s:2:"sr";a:1:{i:0;s:5:"serbo";}s:3:"srr";a:1:{i:0;s:5:"serer";}s:2:"ss";a:1:{i:0;s:5:"swati";}s:3:"ssa";a:1:{i:0;s:29:"nilo-sahariana (altra lingua)";}s:2:"st";a:1:{i:0;s:13:"sotho del sud";}s:2:"su";a:1:{i:0;s:9:"sundanese";}s:3:"suk";a:1:{i:0;s:6:"sukuma";}s:3:"sus";a:1:{i:0;s:4:"susu";}s:3:"sux";a:1:{i:0;s:6:"sumero";}s:2:"sv";a:1:{i:0;s:7:"svedese";}s:2:"sw";a:1:{i:0;s:7:"swahili";}s:3:"syr";a:1:{i:0;s:7:"siriaco";}s:2:"ta";a:1:{i:0;s:5:"tamil";}s:3:"tai";a:1:{i:0;s:25:"tailandese (altra lingua)";}s:2:"te";a:1:{i:0;s:6:"telugu";}s:3:"tem";a:1:{i:0;s:5:"temne";}s:3:"ter";a:1:{i:0;s:6:"tereno";}s:3:"tet";a:1:{i:0;s:5:"tetum";}s:2:"tg";a:1:{i:0;s:7:"tagicco";}s:2:"th";a:1:{i:0;s:4:"thai";}s:2:"ti";a:1:{i:0;s:8:"tigrinya";}s:3:"tig";a:1:{i:0;s:5:"tigre";}s:2:"tk";a:1:{i:0;s:10:"turcomanno";}s:3:"tkl";a:1:{i:0;s:7:"tokelau";}s:2:"tl";a:1:{i:0;s:7:"tagalog";}s:3:"tli";a:1:{i:0;s:7:"tlingit";}s:3:"tmh";a:1:{i:0;s:8:"tamashek";}s:2:"tn";a:1:{i:0;s:6:"tswana";}s:2:"to";a:1:{i:0;s:19:"tonga (Isole Tonga)";}s:3:"tog";a:1:{i:0;s:13:"tonga (nyasa)";}s:3:"tpi";a:1:{i:0;s:9:"tok pisin";}s:2:"tr";a:1:{i:0;s:5:"turco";}s:2:"ts";a:1:{i:0;s:6:"tsonga";}s:3:"tsi";a:1:{i:0;s:9:"tsimshian";}s:2:"tt";a:1:{i:0;s:8:"tatarico";}s:3:"tum";a:1:{i:0;s:7:"tumbuka";}s:3:"tup";a:1:{i:0;s:11:"lingue tupi";}s:3:"tut";a:1:{i:0;s:29:"turco-tatarica (altra lingua)";}s:3:"tvl";a:1:{i:0;s:6:"tuvalu";}s:2:"tw";a:1:{i:0;s:2:"ci";}s:2:"ty";a:1:{i:0;s:8:"taitiano";}s:3:"tyv";a:1:{i:0;s:8:"tuvinian";}s:3:"udm";a:1:{i:0;s:6:"udmurt";}s:2:"ug";a:1:{i:0;s:8:"uigurico";}s:3:"uga";a:1:{i:0;s:9:"ugaritico";}s:2:"uk";a:1:{i:0;s:7:"ucraino";}s:3:"umb";a:1:{i:0;s:6:"mbundu";}s:3:"und";a:1:{i:0;s:18:"lingua imprecisata";}s:2:"ur";a:1:{i:0;s:4:"urdu";}s:2:"uz";a:1:{i:0;s:6:"usbeco";}s:2:"ve";a:1:{i:0;s:5:"venda";}s:2:"vi";a:1:{i:0;s:10:"vietnamita";}s:2:"vo";a:1:{i:0;s:8:"volapük";}s:3:"vot";a:1:{i:0;s:4:"voto";}s:2:"w
a";a:1:{i:0;s:7:"walloon";}s:3:"wak";a:1:{i:0;s:13:"lingue wakash";}s:3:"wal";a:1:{i:0;s:6:"walamo";}s:3:"war";a:1:{i:0;s:5:"waray";}s:3:"was";a:1:{i:0;s:5:"washo";}s:3:"wen";a:1:{i:0;s:6:"sorabo";}s:2:"wo";a:1:{i:0;s:5:"volof";}s:3:"xal";a:1:{i:0;s:6:"kalmyk";}s:2:"xh";a:1:{i:0;s:4:"xosa";}s:3:"yao";a:1:{i:0;s:11:"yao (bantu)";}s:3:"yap";a:1:{i:0;s:6:"Yapese";}s:2:"yi";a:1:{i:0;s:7:"yiddish";}s:2:"yo";a:1:{i:0;s:6:"yoruba";}s:3:"ypk";a:1:{i:0;s:12:"lingue yupik";}s:2:"za";a:1:{i:0;s:6:"zhuang";}s:3:"zap";a:1:{i:0;s:7:"zapotec";}s:3:"zen";a:1:{i:0;s:6:"zenaga";}s:2:"zh";a:1:{i:0;s:6:"cinese";}s:3:"znd";a:1:{i:0;s:5:"zande";}s:2:"zu";a:1:{i:0;s:4:"zulu";}s:3:"zun";a:1:{i:0;s:4:"zuni";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Scripts";a:56:{s:4:"Arab";a:1:{i:0;s:5:"arabo";}s:4:"Armn";a:1:{i:0;s:7:"armenio";}s:4:"Beng";a:1:{i:0;s:7:"bengali";}s:4:"Bopo";a:1:{i:0;s:8:"bopomofo";}s:4:"Brai";a:1:{i:0;s:7:"braille";}s:4:"Buhd";a:1:{i:0;s:5:"buhid";}s:4:"Cans";a:1:{i:0;s:36:"simboli aborigeni canadesi unificati";}s:4:"Cher";a:1:{i:0;s:8:"cherokee";}s:4:"Copt";a:1:{i:0;s:5:"copto";}s:4:"Cprt";a:1:{i:0;s:8:"cipriota";}s:4:"Cyrl";a:1:{i:0;s:9:"cirillico";}s:4:"Deva";a:1:{i:0;s:10:"devanagari";}s:4:"Dsrt";a:1:{i:0;s:7:"deseret";}s:4:"Ethi";a:1:{i:0;s:6:"etiope";}s:4:"Geor";a:1:{i:0;s:9:"georgiano";}s:4:"Goth";a:1:{i:0;s:6:"gotico";}s:4:"Grek";a:1:{i:0;s:5:"greco";}s:4:"Gujr";a:1:{i:0;s:8:"gujarati";}s:4:"Guru";a:1:{i:0;s:8:"gurmukhi";}s:4:"Hang";a:1:{i:0;s:6:"hangul";}s:4:"Hani";a:1:{i:0;s:3:"han";}s:4:"Hano";a:1:{i:0;s:7:"hanunoo";}s:4:"Hans";a:1:{i:0;s:16:"han semplificato";}s:4:"Hant";a:1:{i:0;s:16:"han tradizionale";}s:4:"Hebr";a:1:{i:0;s:5:"ebreo";}s:4:"Hira";a:1:{i:0;s:8:"hiragana";}s:4:"Ital";a:1:{i:0;s:14:"italico antico";}s:4:"Kana";a:1:{i:0;s:8:"katakana";}s:4:"Khmr";a:1:{i:0;s:5:"khmer";}s:4:"Knda";a:1:{i:0;s:7:"kannada";}s:4:"Lao
o";a:1:{i:0;s:3:"lao";}s:4:"Latn";a:1:{i:0;s:6:"latino";}s:4:"Limb";a:1:{i:0;s:5:"limbu";}s:4:"Linb";a:1:{i:0;s:9:"B lineare";}s:4:"Mlym";a:1:{i:0;s:9:"malayalam";}s:4:"Mong";a:1:{i:0;s:7:"mongolo";}s:4:"Mymr";a:1:{i:0;s:7:"myanmar";}s:4:"Ogam";a:1:{i:0;s:5:"ogham";}s:4:"Orya";a:1:{i:0;s:5:"oriya";}s:4:"Osma";a:1:{i:0;s:7:"osmanya";}s:4:"Qaai";a:1:{i:0;s:9:"ereditato";}s:4:"Runr";a:1:{i:0;s:6:"runico";}s:4:"Shaw";a:1:{i:0;s:8:"shaviano";}s:4:"Sinh";a:1:{i:0;s:9:"singalese";}s:4:"Syrc";a:1:{i:0;s:7:"siriano";}s:4:"Tagb";a:1:{i:0;s:8:"tagbanwa";}s:4:"Tale";a:1:{i:0;s:6:"tai le";}s:4:"Taml";a:1:{i:0;s:5:"tamil";}s:4:"Telu";a:1:{i:0;s:6:"telugu";}s:4:"Tglg";a:1:{i:0;s:7:"tagalog";}s:4:"Thaa";a:1:{i:0;s:6:"thaana";}s:4:"Thai";a:1:{i:0;s:10:"tailandese";}s:4:"Tibt";a:1:{i:0;s:8:"tibetano";}s:4:"Ugar";a:1:{i:0;s:7:"ugarita";}s:4:"Yiii";a:1:{i:0;s:2:"yi";}s:4:"Zyyy";a:1:{i:0;s:6:"comune";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:19:"Calendario Buddista";}s:7:"chinese";a:1:{i:0;s:17:"Calendario Cinese";}s:9:"gregorian";a:1:{i:0;s:21:"Calendario Gregoriano";}s:6:"hebrew";a:1:{i:0;s:18:"Calendario Ebraico";}s:7:"islamic";a:1:{i:0;s:19:"Calendario Islamico";}s:13:"islamic-civil";a:1:{i:0;s:26:"Calendario Civile Islamico";}s:8:"japanese";a:1:{i:0;s:21:"Calendario Giapponese";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:14:"Ordine Diretto";}s:9:"phonebook";a:1:{i:0;s:24:"Ordine Elenco Telefonico";}s:6:"pinyin";a:1:{i:0;s:13:"Ordine Pinyin";}s:6:"stroke";a:1:{i:0;s:12:"Ordine Segni";}s:11:"traditional";a:1:{i:0;s:19:"Ordine Tradizionale";}}}s:8:"Variants";a:1:{s:7:"REVISED";a:1:{i:0;s:10:"Modificato";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:6:{s:11:"AmPmMarkers";a:2:{i:0;s:2:"m.";i:1;s:2:"p.";}s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:9:"dd/MMM/yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}s:8:"day
Names";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:3:"dom";i:1;s:3:"lun";i:2;s:3:"mar";i:3;s:3:"mer";i:4;s:3:"gio";i:5;s:3:"ven";i:6;s:3:"sab";}s:6:"narrow";a:7:{i:0;s:1:"D";i:1;s:1:"L";i:2;s:1:"M";i:3;s:1:"M";i:4;s:1:"G";i:5;s:1:"V";i:6;s:1:"S";}s:4:"wide";a:7:{i:0;s:8:"domenica";i:1;s:7:"lunedì";i:2;s:8:"martedì";i:3;s:10:"mercoledì";i:4;s:8:"giovedì";i:5;s:8:"venerdì";i:6;s:6:"sabato";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:2:"aC";i:1;s:2:"dC";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:3:"gen";i:1;s:3:"feb";i:2;s:3:"mar";i:3;s:3:"apr";i:4;s:3:"mag";i:5;s:3:"giu";i:6;s:3:"lug";i:7;s:3:"ago";i:8;s:3:"set";i:9;s:3:"ott";i:10;s:3:"nov";i:11;s:3:"dic";}s:6:"narrow";a:12:{i:0;s:1:"G";i:1;s:1:"F";i:2;s:1:"M";i:3;s:1:"A";i:4;s:1:"M";i:5;s:1:"G";i:6;s:1:"L";i:7;s:1:"A";i:8;s:1:"S";i:9;s:1:"O";i:10;s:1:"N";i:11;s:1:"D";}s:4:"wide";a:12:{i:0;s:7:"gennaio";i:1;s:8:"febbraio";i:2;s:5:"marzo";i:3;s:6:"aprile";i:4;s:6:"maggio";i:5;s:6:"giugno";i:6;s:6:"luglio";i:7;s:6:"agosto";i:8;s:9:"settembre";i:9;s:7:"ottobre";i:10;s:8:"novembre";i:11;s:8:"dicembre";}}}}}s:11:"zoneStrings";a:17:{i:0;a:6:{i:0;s:19:"America/Los_Angeles";i:1;s:21:"Ora Standard Pacifico";i:2;s:3:"PST";i:3;s:19:"Ora Legale Pacifico";i:4;s:3:"PDT";i:5;s:11:"Los Angeles";}i:1;a:6:{i:0;s:14:"America/Denver";i:1;s:21:"Ora Standard Mountain";i:2;s:3:"MST";i:3;s:19:"Ora Legale Mountain";i:4;s:3:"MDT";i:5;s:6:"Denver";}i:2;a:6:{i:0;s:15:"America/Phoenix";i:1;s:21:"Ora Standard Mountain";i:2;s:3:"MST";i:3;s:21:"Ora Standard Mountain";i:4;s:3:"MST";i:5;s:7:"Phoenix";}i:3;a:6:{i:0;s:15:"America/Chicago";i:1;s:21:"Ora Standard Centrale";i:2;s:3:"CST";i:3;s:19:"Ora Legale Centrale";i:4;s:3:"CDT";i:5;s:7:"Chicago";}i:4;a:6:{i:0;s:16:"America/New_York";i:1;s:22:"Ora Standard Orientale";i:2;s:3:"EST";i:3;s:20:"Ora Legale Orientale";i:4;s:3:"EDT";i:5;s:8:"New York";}i:5;a:6:{i:0;s:20:"America/Indianapolis";i:1;s:22:"Ora Standard Orientale";i:2;s:3:"EST";i:3;s:22:"Ora Standard Orientale";i:4;s:3:"EST";i:5;s:12:"Indianapoli
s";}i:6;a:6:{i:0;s:16:"Pacific/Honolulu";i:1;s:19:"Ora Standard Hawaii";i:2;s:3:"HST";i:3;s:19:"Ora Standard Hawaii";i:4;s:3:"HST";i:5;s:8:"Honolulu";}i:7;a:6:{i:0;s:17:"America/Anchorage";i:1;s:19:"Ora Standard Alaska";i:2;s:3:"AST";i:3;s:17:"Ora Legale Alaska";i:4;s:3:"ADT";i:5;s:9:"Anchorage";}i:8;a:6:{i:0;s:15:"America/Halifax";i:1;s:22:"Ora Standard Atlantico";i:2;s:3:"AST";i:3;s:20:"Ora Legale Atlantico";i:4;s:3:"ADT";i:5;s:7:"Halifax";}i:9;a:6:{i:0;s:16:"America/St_Johns";i:1;s:25:"Ora Standard Newfoundland";i:2;s:3:"CNT";i:3;s:23:"Ora Legale Newfoundland";i:4;s:3:"CDT";i:5;s:9:"St. Johns";}i:10;a:6:{i:0;s:12:"Europe/Paris";i:1;s:29:"Ora Standard Centrale Europeo";i:2;s:3:"CET";i:3;s:27:"Ora Legale Centrale Europeo";i:4;s:4:"CEST";i:5;s:6:"Parigi";}i:11;a:6:{i:0;s:7:"Etc/GMT";i:1;s:23:"Ora Meridiano Greenwich";i:2;s:3:"GMT";i:3;s:23:"Ora Meridiano Greenwich";i:4;s:3:"GMT";i:5;s:6:"Londra";}i:12;a:6:{i:0;s:17:"Africa/Casablanca";i:1;s:23:"Ora Meridiano Greenwich";i:2;s:3:"GMT";i:3;s:23:"Ora Meridiano Greenwich";i:4;s:3:"GMT";i:5;s:10:"Casablanca";}i:13;a:6:{i:0;s:14:"Asia/Jerusalem";i:1;s:20:"Ora Standard Israele";i:2;s:3:"IST";i:3;s:18:"Ora Legale Israele";i:4;s:3:"IDT";i:5;s:11:"Gerusalemme";}i:14;a:6:{i:0;s:10:"Asia/Tokyo";i:1;s:21:"Ora Standard Giappone";i:2;s:3:"JST";i:3;s:21:"Ora Standard Giappone";i:4;s:3:"JST";i:5;s:5:"Tokyo";}i:15;a:6:{i:0;s:16:"Europe/Bucharest";i:1;s:29:"Ora Standard Europa Orientale";i:2;s:3:"EET";i:3;s:27:"Ora Legale Europa Orientale";i:4;s:4:"EEST";i:5;s:8:"Bucarest";}i:16;a:6:{i:0;s:13:"Asia/Shanghai";i:1;s:17:"Ora Standard Cina";i:2;s:3:"CTT";i:3;s:17:"Ora Standard Cina";i:4;s:3:"CDT";i:5;s:8:"Shanghai";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/it_CH.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/it_CH.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/it_CH.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:14:"NumberElements";a:12:{i:0;s:1:".";i:1;s:1:"'";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:23:"¤ #,##0.00;¤-#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:14:"HH.mm:ss' h' z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:17:"EEEE, d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:8:"d-MMM-yy";i:7;s:8:"dd.MM.yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/it_IT.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/it_IT.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/it_IT.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:10:"Currencies";a:1:{s:3:"ITL";a:3:{i:0;s:3:"₤";i:1;s:13:"Lira Italiana";i:2;a:3:{i:0;s:18:"¤ #,##0;-¤ #,##0";i:1;s:1:",";i:2;s:1:".";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:9:"H:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:9:"dd/MMM/yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/iw.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/iw.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/iw.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"__ALIAS";a:1:{i:0;s:2:"he";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/iw_IL.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/iw_IL.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/iw_IL.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"__ALIAS";a:1:{i:0;s:5:"he_IL";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ja.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ja.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ja.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:13:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:12:"アンドラ";}s:2:"AE";a:1:{i:0;s:24:"アラブ首長国連邦";}s:2:"AF";a:1:{i:0;s:21:"アフガニスタン";}s:2:"AG";a:1:{i:0;s:36:"アンティグア・ãƒãƒ¼ãƒ–ーダ";}s:2:"AI";a:1:{i:0;s:12:"アンギラ";}s:2:"AL";a:1:{i:0;s:15:"アルãƒãƒ‹ã‚¢";}s:2:"AM";a:1:{i:0;s:15:"アルメニア";}s:2:"AN";a:1:{i:0;s:36:"オランダ領アンティル諸島";}s:2:"AO";a:1:{i:0;s:12:"アンゴラ";}s:2:"AQ";a:1:{i:0;s:12:"å—極大陸";}s:2:"AR";a:1:{i:0;s:18:"アルゼンãƒãƒ³";}s:2:"AS";a:1:{i:0;s:15:"米領サモア";}s:2:"AT";a:1:{i:0;s:18:"オーストリア";}s:2:"AU";a:1:{i:0;s:21:"オーストラリア";}s:2:"AW";a:1:{i:0;s:12:"アルãƒå³¶";}s:2:"AZ";a:1:{i:0;s:24:"アゼルãƒã‚¤ã‚¸ãƒ£ãƒ³";}s:2:"BA";a:1:{i:0;s:36:"ボスニア・ヘルツェゴビナ";}s:2:"BB";a:1:{i:0;s:15:"ãƒãƒ«ãƒãƒ‰ã‚¹";}s:2:"BD";a:1:{i:0;s:21:"ãƒãƒ³ã‚°ãƒ©ãƒ‡ã‚·ãƒ¥";}s:2:"BE";a:1:{i:0;s:12:"ベルギー";}s:2:"BF";a:1:{i:0;s:21:"ブルキナファソ";}s:2:"BG";a:1:{i:0;s:15:"ブルガリア";}s:2:"BH";a:1:{i:0;s:15:"ãƒãƒ¼ãƒ¬ãƒ¼ãƒ³";}s:2:"BI";a:1:{i:0;s:12:"ブルンジ";}s:2:"BJ";a:1:{i:0;s:9:"ベニン";}s:2:"BM";a:1:{i:0;s:18:"ãƒãƒ¼ãƒŸãƒ¥ãƒ¼ãƒ€";}s:2:"BN";a:1:{i:0;s:12:"ブルãƒã‚¤";}s:2:"BO";a:1:{i:0;s:12:"ボリビア";}s:2:"BR";a:1:{i:0;s:12:"ブラジル";}s:2:"BS";a:1:{i:0;s:9:"ãƒãƒãƒž";}s:2:"BT";a:1:{i:0;s:12:"ブータン";}s:2:"BV";a:1:{i:0;s:12:"ブーベ島";}s:2:"BW";a:1:{i:0;s:12:"ボツワナ";}s:2:"BY";a:1:{i:0;s:15:"ベラルーシ";}s:2:"BZ";a:1:{i:0;s:12:"ベリーズ";}s:2:"CA";a:1:{i:0;s:9:"カナダ";}s:2:"CC";a:1:{i:0;s:34:"ココス (キーリング) 諸島";}s:2:"CD";a:1:{i:0;s:24:"コンゴ民主共和国";}s:2:"CF";a:1:{i:0;s:27:"中央アフリカ共和国";}s:2:"CG";a:1:{i:0;s:9:"コンゴ";}s:2:"CH";a:1:{i:0;s:9:"スイス";}s:2:"CI";a:1:{i:0;s:24:"コートジボアール";}s:2:"CK";a:1:{i:0;s:15:"クック諸島";}s:2:"CL";a:1:{i:0;s:6:"ãƒãƒª";}s:2:"CM";a:1:{i:0;s:15:"カメルーン";}s:2:"CN";a:1:{i:0;s:6:"中国";}s:2:"CO";a:1:{i:0;s:
15:"コロンビア";}s:2:"CR";a:1:{i:0;s:15:"コスタリカ";}s:2:"CU";a:1:{i:0;s:12:"キューãƒ";}s:2:"CV";a:1:{i:0;s:18:"カーボベルデ";}s:2:"CX";a:1:{i:0;s:18:"クリスマス島";}s:2:"CY";a:1:{i:0;s:12:"キプロス";}s:2:"CZ";a:1:{i:0;s:9:"ãƒã‚§ã‚³";}s:2:"DE";a:1:{i:0;s:9:"ドイツ";}s:2:"DJ";a:1:{i:0;s:9:"ジブãƒ";}s:2:"DK";a:1:{i:0;s:15:"デンマーク";}s:2:"DM";a:1:{i:0;s:15:"ドミニカ国";}s:2:"DO";a:1:{i:0;s:21:"ドミニカ共和国";}s:2:"DZ";a:1:{i:0;s:18:"アルジェリア";}s:2:"EC";a:1:{i:0;s:15:"エクアドル";}s:2:"EE";a:1:{i:0;s:15:"エストニア";}s:2:"EG";a:1:{i:0;s:12:"エジプト";}s:2:"EH";a:1:{i:0;s:12:"西サãƒãƒ©";}s:2:"ER";a:1:{i:0;s:15:"エリトリア";}s:2:"ES";a:1:{i:0;s:12:"スペイン";}s:2:"ET";a:1:{i:0;s:15:"エãƒã‚ªãƒ”ã‚¢";}s:2:"FI";a:1:{i:0;s:18:"フィンランド";}s:2:"FJ";a:1:{i:0;s:12:"フィジー";}s:2:"FK";a:1:{i:0;s:27:"フォークランド諸島";}s:2:"FM";a:1:{i:0;s:18:"ミクロãƒã‚·ã‚¢";}s:2:"FO";a:1:{i:0;s:18:"フェロー諸島";}s:2:"FR";a:1:{i:0;s:12:"フランス";}s:2:"GA";a:1:{i:0;s:9:"ガボン";}s:2:"GB";a:1:{i:0;s:12:"イギリス";}s:2:"GD";a:1:{i:0;s:12:"グレナダ";}s:2:"GE";a:1:{i:0;s:12:"グルジア";}s:2:"GF";a:1:{i:0;s:15:"ä»é ˜ã‚®ã‚¢ãƒŠ";}s:2:"GH";a:1:{i:0;s:9:"ガーナ";}s:2:"GI";a:1:{i:0;s:18:"ジブラルタル";}s:2:"GL";a:1:{i:0;s:21:"グリーンランド";}s:2:"GM";a:1:{i:0;s:12:"ガンビア";}s:2:"GN";a:1:{i:0;s:9:"ギニア";}s:2:"GP";a:1:{i:0;s:18:"グアドループ";}s:2:"GQ";a:1:{i:0;s:15:"赤é“ギニア";}s:2:"GR";a:1:{i:0;s:12:"ギリシア";}s:2:"GS";a:1:{i:0;s:51:"å—ジョージア島・å—サンドイッãƒè«¸å³¶";}s:2:"GT";a:1:{i:0;s:15:"グアテマラ";}s:2:"GU";a:1:{i:0;s:12:"グアム島";}s:2:"GW";a:1:{i:0;s:18:"ギニアビサウ";}s:2:"GY";a:1:{i:0;s:12:"ガイアナ";}s:2:"HK";a:1:{i:0;s:42:"中è¯äººæ°‘共和国香港特別行政区";}s:2:"HM";a:1:{i:0;s:60:"ãƒãƒ¼ãƒ‰ãƒ»ã‚¢ãƒ³ãƒ‰ãƒ»ãƒžã‚¯ãƒ‰ãƒŠãƒ«ãƒ‰ãƒ»ã‚¢ã‚¤ãƒ©ãƒ³ã‚º";}s:2:"HN";a:1:{i:0;s:18:"ホンジュラス";}s:2:"HR";a:1:{i:
0;s:15:"クロアãƒã‚¢";}s:2:"HT";a:1:{i:0;s:9:"ãƒã‚¤ãƒ";}s:2:"HU";a:1:{i:0;s:15:"ãƒãƒ³ã‚¬ãƒªãƒ¼";}s:2:"ID";a:1:{i:0;s:18:"インドãƒã‚·ã‚¢";}s:2:"IE";a:1:{i:0;s:18:"アイルランド";}s:2:"IL";a:1:{i:0;s:15:"イスラエル";}s:2:"IN";a:1:{i:0;s:9:"インド";}s:2:"IO";a:1:{i:0;s:27:"英領インド洋æ¤æ°‘地";}s:2:"IQ";a:1:{i:0;s:9:"イラク";}s:2:"IR";a:1:{i:0;s:9:"イラン";}s:2:"IS";a:1:{i:0;s:18:"アイスランド";}s:2:"IT";a:1:{i:0;s:12:"イタリア";}s:2:"JM";a:1:{i:0;s:15:"ジャマイカ";}s:2:"JO";a:1:{i:0;s:12:"ヨルダン";}s:2:"JP";a:1:{i:0;s:6:"日本";}s:2:"KE";a:1:{i:0;s:9:"ケニア";}s:2:"KG";a:1:{i:0;s:18:"キルギスタン";}s:2:"KH";a:1:{i:0;s:15:"カンボジア";}s:2:"KI";a:1:{i:0;s:12:"キリãƒã‚¹";}s:2:"KM";a:1:{i:0;s:9:"コモロ";}s:2:"KN";a:1:{i:0;s:45:"セントクリストファー・ãƒã‚¤ãƒ“ス";}s:2:"KP";a:1:{i:0;s:33:"æœé®®æ°‘主主義人民共和国";}s:2:"KR";a:1:{i:0;s:12:"大韓民国";}s:2:"KW";a:1:{i:0;s:15:"クウェート";}s:2:"KY";a:1:{i:0;s:18:"ケイマン諸島";}s:2:"KZ";a:1:{i:0;s:18:"カザフスタン";}s:2:"LA";a:1:{i:0;s:9:"ラオス";}s:2:"LB";a:1:{i:0;s:12:"レãƒãƒŽãƒ³";}s:2:"LC";a:1:{i:0;s:18:"セントルシア";}s:2:"LI";a:1:{i:0;s:27:"リヒテンシュタイン";}s:2:"LK";a:1:{i:0;s:15:"スリランカ";}s:2:"LR";a:1:{i:0;s:12:"リベリア";}s:2:"LS";a:1:{i:0;s:9:"レソト";}s:2:"LT";a:1:{i:0;s:15:"リトアニア";}s:2:"LU";a:1:{i:0;s:21:"ルクセンブルグ";}s:2:"LV";a:1:{i:0;s:12:"ラトビア";}s:2:"LY";a:1:{i:0;s:9:"リビア";}s:2:"MA";a:1:{i:0;s:12:"モロッコ";}s:2:"MC";a:1:{i:0;s:9:"モナコ";}s:2:"MD";a:1:{i:0;s:12:"モルドãƒ";}s:2:"MG";a:1:{i:0;s:18:"マダガスカル";}s:2:"MH";a:1:{i:0;s:30:"マーシャル諸島共和国";}s:2:"MK";a:1:{i:0;s:15:"マケドニア";}s:2:"ML";a:1:{i:0;s:6:"マリ";}s:2:"MM";a:1:{i:0;s:15:"ミャンマー";}s:2:"MN";a:1:{i:0;s:12:"モンゴル";}s:2:"MO";a:1:{i:0;s:45:"中è¯äººæ°‘共和国マカオ特別行政区";}s:2:"MP";a:1:{i:0;s:21:"北マリアナ諸島";}s:2:"MQ";a:1:{i
:0;s:24:"マルティニーク島";}s:2:"MR";a:1:{i:0;s:18:"モーリタニア";}s:2:"MS";a:1:{i:0;s:21:"モントセラト島";}s:2:"MT";a:1:{i:0;s:9:"マルタ";}s:2:"MU";a:1:{i:0;s:18:"モーリシャス";}s:2:"MV";a:1:{i:0;s:12:"モルジブ";}s:2:"MW";a:1:{i:0;s:12:"マラウィ";}s:2:"MX";a:1:{i:0;s:12:"メキシコ";}s:2:"MY";a:1:{i:0;s:15:"マレーシア";}s:2:"MZ";a:1:{i:0;s:18:"モザンビーク";}s:2:"NA";a:1:{i:0;s:12:"ナミビア";}s:2:"NC";a:1:{i:0;s:24:"ニューカレドニア";}s:2:"NE";a:1:{i:0;s:15:"ニジェール";}s:2:"NF";a:1:{i:0;s:21:"ノーフォーク島";}s:2:"NG";a:1:{i:0;s:18:"ナイジェリア";}s:2:"NI";a:1:{i:0;s:15:"ニカラグア";}s:2:"NL";a:1:{i:0;s:12:"オランダ";}s:2:"NO";a:1:{i:0;s:15:"ノルウェー";}s:2:"NP";a:1:{i:0;s:12:"ãƒãƒ‘ール";}s:2:"NR";a:1:{i:0;s:9:"ナウル";}s:2:"NU";a:1:{i:0;s:12:"ニウエ島";}s:2:"NZ";a:1:{i:0;s:24:"ニュージーランド";}s:2:"OM";a:1:{i:0;s:12:"オマーン";}s:2:"PA";a:1:{i:0;s:9:"パナマ";}s:2:"PE";a:1:{i:0;s:9:"ペルー";}s:2:"PF";a:1:{i:0;s:21:"ä»é ˜ãƒãƒªãƒã‚·ã‚¢";}s:2:"PG";a:1:{i:0;s:27:"パプアニューギニア";}s:2:"PH";a:1:{i:0;s:15:"フィリピン";}s:2:"PK";a:1:{i:0;s:15:"パキスタン";}s:2:"PL";a:1:{i:0;s:15:"ãƒãƒ¼ãƒ©ãƒ³ãƒ‰";}s:2:"PM";a:1:{i:0;s:42:"サンピエール・エ・ミクロン島";}s:2:"PN";a:1:{i:0;s:18:"ピトケアン島";}s:2:"PR";a:1:{i:0;s:18:"プエルトリコ";}s:2:"PS";a:1:{i:0;s:15:"パレスãƒãƒŠ";}s:2:"PT";a:1:{i:0;s:15:"ãƒãƒ«ãƒˆã‚¬ãƒ«";}s:2:"PW";a:1:{i:0;s:9:"パラオ";}s:2:"PY";a:1:{i:0;s:15:"パラグアイ";}s:2:"QA";a:1:{i:0;s:12:"カタール";}s:2:"RE";a:1:{i:0;s:18:"レユニオン島";}s:2:"RO";a:1:{i:0;s:15:"ルーマニア";}s:2:"RU";a:1:{i:0;s:9:"ロシア";}s:2:"RW";a:1:{i:0;s:12:"ルワンダ";}s:2:"SA";a:1:{i:0;s:21:"サウジアラビア";}s:2:"SB";a:1:{i:0;s:18:"ソロモン諸島";}s:2:"SC";a:1:{i:0;s:15:"セイシェル";}s:2:"SD";a:1:{i:0;s:12:"スーダン";}s:2:"SE";a:1:{i:0;s:18:"スウェーデン";}s:2:"SG";a:1:{i:0;s:18:"シンガãƒãƒ¼ãƒ«";}s:
2:"SH";a:1:{i:0;s:21:"セントヘレナ島";}s:2:"SI";a:1:{i:0;s:15:"スロベニア";}s:2:"SJ";a:1:{i:0;s:48:"スãƒãƒ¼ãƒ«ãƒãƒ«è«¸å³¶ãƒ»ãƒ¤ãƒ³ãƒžã‚¤ã‚¨ãƒ³å³¶";}s:2:"SK";a:1:{i:0;s:15:"スロãƒã‚­ã‚¢";}s:2:"SL";a:1:{i:0;s:18:"シエラレオãƒ";}s:2:"SM";a:1:{i:0;s:15:"サンマリノ";}s:2:"SN";a:1:{i:0;s:12:"ã‚»ãƒã‚¬ãƒ«";}s:2:"SO";a:1:{i:0;s:12:"ソマリア";}s:2:"SP";a:1:{i:0;s:12:"セルビア";}s:2:"SR";a:1:{i:0;s:12:"スリナム";}s:2:"ST";a:1:{i:0;s:30:"サントメ・プリンシペ";}s:2:"SV";a:1:{i:0;s:21:"エルサルãƒãƒ‰ãƒ«";}s:2:"SY";a:1:{i:0;s:9:"シリア";}s:2:"SZ";a:1:{i:0;s:18:"スワジランド";}s:2:"TC";a:1:{i:0;s:39:"タークス諸島・カイコス諸島";}s:2:"TD";a:1:{i:0;s:9:"ãƒãƒ£ãƒ‰";}s:2:"TF";a:1:{i:0;s:12:"ä»å—方領";}s:2:"TG";a:1:{i:0;s:9:"トーゴ";}s:2:"TH";a:1:{i:0;s:6:"タイ";}s:2:"TJ";a:1:{i:0;s:18:"タジキスタン";}s:2:"TK";a:1:{i:0;s:18:"トケラウ諸島";}s:2:"TL";a:1:{i:0;s:18:"æ±ãƒ†ã‚£ãƒ¢ãƒ¼ãƒ«";}s:2:"TM";a:1:{i:0;s:24:"トルクメニスタン";}s:2:"TN";a:1:{i:0;s:15:"ãƒãƒ¥ãƒ‹ã‚¸ã‚¢";}s:2:"TO";a:1:{i:0;s:9:"トンガ";}s:2:"TR";a:1:{i:0;s:9:"トルコ";}s:2:"TT";a:1:{i:0;s:30:"トリニダード・トãƒã‚´";}s:2:"TV";a:1:{i:0;s:9:"ツãƒãƒ«";}s:2:"TW";a:1:{i:0;s:6:"å°æ¹¾";}s:2:"TZ";a:1:{i:0;s:15:"タンザニア";}s:2:"UA";a:1:{i:0;s:15:"ウクライナ";}s:2:"UG";a:1:{i:0;s:12:"ウガンダ";}s:2:"UM";a:1:{i:0;s:21:"米領太平洋諸島";}s:2:"US";a:1:{i:0;s:21:"アメリカåˆè¡†å›½";}s:2:"UY";a:1:{i:0;s:15:"ウルグアイ";}s:2:"UZ";a:1:{i:0;s:21:"ウズベキスタン";}s:2:"VA";a:1:{i:0;s:39:"ãƒ­ãƒ¼ãƒžæ•™çš‡åº (ãƒãƒã‚«ãƒ³å¸‚国)";}s:2:"VC";a:1:{i:0;s:54:"セントビンセント・グレナディーン諸島";}s:2:"VE";a:1:{i:0;s:15:"ベãƒã‚ºã‚¨ãƒ©";}s:2:"VG";a:1:{i:0;s:24:"英領ãƒãƒ¼ã‚¸ãƒ³è«¸å³¶";}s:2:"VI";a:1:{i:0;s:24:"米領ãƒãƒ¼ã‚¸ãƒ³è«¸å³¶";}s:2:"VN";a:1:{i:0;s:12:"ベトナム";}s:2:"VU";a:1:{i:0;s:12:"ãƒãƒŒã‚¢ãƒ„";}s:2:"WF";a:1:{i:0;s:27:"ウォリス・フトーナ";}s:2:"WS";a:1:{i:0;s:12:"西サモア";}s:2:"YE";a:1:{i
:0;s:12:"イエメン";}s:2:"YT";a:1:{i:0;s:15:"マヨット島";}s:2:"YU";a:1:{i:0;s:21:"ユーゴスラビア";}s:2:"ZA";a:1:{i:0;s:15:"å—アフリカ";}s:2:"ZM";a:1:{i:0;s:12:"ザンビア";}s:2:"ZW";a:1:{i:0;s:15:"ジンãƒãƒ–エ";}}s:10:"Currencies";a:377:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:28:"アンドラ ディナール";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:22:"アンドラ ペセタ";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:19:"UAE ディルãƒãƒ ";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:27:"アフガニー (1927-2002)";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:15:"アフガニー";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:43:"アファールãŠã‚ˆã³ã‚¤ã‚µã‚¹ フラン";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:34:"アルãƒãƒ‹ã‚¢ レク (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"ALL";i:1;s:22:"アルãƒãƒ‹ã‚¢ レク";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:31:"アルãƒãƒ‹ã‚¢ レク (Valute)";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:26:"アルãƒãƒ‹ã‚¢ レク (f)";}s:3:"AMD";a:2:{i:0;s:3:"AMD";i:1;s:25:"アルメニア ドラム";}s:3:"ANG";a:2:{i:0;s:3:"ANG";i:1;s:43:"オランダ領アンティル ギルダー";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:18:"クワンザ (AOA)";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:24:"クワンザ (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:40:"アンゴラ 新クワンザ (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:40:"アンゴラ 旧クワンザ (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:28:"アンゴラ エスクード";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:40:"アルゼンãƒãƒ³ アゥストラール";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:30:"アルゼンãƒãƒ³ ペソ (MN)";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:37:"アルゼンãƒãƒ³ ペソ (1983-1985)";}s:3:"ARS";a:2:{i:0;s:3:"ARS";i:1;s:25:"アルゼンãƒãƒ³ ペソ";}s:3:"AUD";a:2:{i:0;s:3:"AUD";i:1;s:28:"オーストラリア ドル";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:31:"オーストラリア ãƒãƒ³ãƒ‰";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:22:"アルムギルダー";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:34:"アゼルãƒã‚¤ã‚¸ãƒ£ãƒ³ マナト";}s:3:
"BAD";a:2:{i:0;s:3:"BAD";i:1;s:28:"ボスニア ディナール";}s:3:"BAM";a:2:{i:0;s:3:"BAM";i:1;s:28:"ボスニア マルク (BAM)";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:31:"ボスニア 新ディナール";}s:3:"BBD";a:2:{i:0;s:3:"BBD";i:1;s:22:"ãƒãƒ«ãƒãƒ‰ã‚¹ ドル";}s:3:"BDT";a:2:{i:0;s:3:"BDT";i:1;s:28:"ãƒãƒ³ã‚°ãƒ©ãƒ‡ã‚·ãƒ¥ ã‚¿ã‚«";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:28:"ベルギー フラン (BEC)";}s:3:"BEF";a:2:{i:0;s:3:"BEF";i:1;s:22:"ベルギー フラン";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:28:"ベルギー フラン (BEL)";}s:3:"BGL";a:2:{i:0;s:3:"BGL";i:1;s:28:"ブルガリア レフ (BGL)";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:28:"ブルガリア レフ (BGM)";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:25:"ブルガリア 新レフ";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:34:"ブルガリア レフ (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:28:"ブルガリア レフ (FEC)";}s:3:"BHD";a:2:{i:0;s:3:"BHD";i:1;s:31:"ãƒãƒ¼ãƒ¬ãƒ¼ãƒ³ ディナール";}s:3:"BIF";a:2:{i:0;s:3:"BIF";i:1;s:22:"ブルンジ フラン";}s:3:"BMD";a:2:{i:0;s:3:"BMD";i:1;s:22:"ãƒãƒŸãƒ¥ãƒ¼ãƒ€ ドル";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:25:"ãƒãƒŸãƒ¥ãƒ¼ãƒ€ ãƒãƒ³ãƒ‰";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:19:"ブルãƒã‚¤ ドル";}s:3:"BOB";a:2:{i:0;s:3:"BOB";i:1;s:15:"ボリビアノ";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:40:"ボリビア ボリビアノ (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:19:"ボリビア ペソ";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:18:"ボリビア Mvdol";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:49:"ブラジル 新クルゼイロ (BRBã€1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:34:"ブラジル クルゼイロ (BRC)";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:46:"ブラジル クルゼイロ (BREã€1990-1993)";}s:3:"BRL";a:2:{i:0;s:3:"BRL";i:1;s:22:"ブラジル レアル";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:37:"ブラジル 新クルゼイロ (BRN)";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:38:"ブラジル クルゼイロ レアル";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:46:"ブラジル クルゼイロ (BRZã€1942-1
967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:16:"ãƒãƒãƒž ドル";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:19:"ãƒãƒãƒž ãƒãƒ³ãƒ‰";}s:3:"BTN";a:2:{i:0;s:3:"BTN";i:1;s:28:"ブータン ニュルタム";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:22:"ブータン ルピー";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:22:"ビルマ ãƒãƒ£ãƒƒãƒˆ";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:19:"ビルマ ルピー";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:19:"ボツワナ プラ";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:46:"ベラルーシ ルーブル (BYBã€1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:46:"ベラルーシ ルーブル (BYLã€1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"BYR";i:1;s:28:"ベラルーシ ルーブル";}s:3:"BZD";a:2:{i:0;s:3:"BZD";i:1;s:19:"ベリーズ ドル";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:31:"英領ホンジュラス ドル";}s:3:"CAD";a:2:{i:0;s:3:"CAD";i:1;s:16:"カナダ ドル";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:19:"コンゴ フラン";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:28:"コンゴ共和国 フラン";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:22:"コンゴ ザイール";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:41:"中央アフリカ共和国 CFA フラン";}s:3:"CHF";a:2:{i:0;s:3:"CHF";i:1;s:19:"スイス フラン";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:22:"クック諸島 ドル";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:19:"ãƒãƒª ペソ (CLC)";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:22:"ãƒãƒª エスクード";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:36:"ãƒãƒª ウニダ デ フォメント";}s:3:"CLP";a:2:{i:0;s:3:"CLP";i:1;s:13:"ãƒãƒª ペソ";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:29:"カメルーン CFA フラン";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:15:"中国人民元";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:22:"中国 米ドル (FEC)";}s:3:"CNY";a:2:{i:0;s:3:"CNY";i:1;s:15:"中国人民元";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:28:"コロンビア ペソ (COB)";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:23:"コンゴ CFA フラン";}s:3:"COP";a:2:{i:0;s:3:"COP";i:1;s:22:"コロンビア ペソ";}s:3:"CRC";a:2:{i:0;s:3:"CRC";i:1;s:25:"コスタリカ 
コロン";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:40:"ãƒã‚§ã‚³ã‚¹ãƒ­ãƒã‚­ã‚¢ コルナ (CSC)";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:40:"ãƒã‚§ã‚³ã‚¹ãƒ­ãƒã‚­ã‚¢ コルナ (CSK)";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:19:"キュームペソ";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:18:"キューム(FEC)";}s:3:"CVE";a:2:{i:0;s:3:"CVE";i:1;s:34:"カーボベルデ エスクード";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:31:"キュラソー島 ギルダー";}s:3:"CYP";a:2:{i:0;s:3:"CYP";i:1;s:22:"キプロス ãƒãƒ³ãƒ‰";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:19:"ãƒã‚§ã‚³ コルナ";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:22:"æ±ãƒ‰ã‚¤ãƒ„ マルク";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:19:"ドイツ マルク";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:31:"ドイツ マルク (Sperrmark)";}s:3:"DJF";a:2:{i:0;s:3:"DJF";i:1;s:19:"ジブムフラン";}s:3:"DKK";a:2:{i:0;s:3:"DKK";i:1;s:28:"デンマーク クローãƒ";}s:3:"DOP";a:2:{i:0;s:3:"DOP";i:1;s:19:"ドミニカ ペソ";}s:3:"DZD";a:2:{i:0;s:3:"DZD";i:1;s:34:"アルジェリア ディナール";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:31:"アルジェリア 新フラン";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:34:"アルジェリア フラン (DZG)";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:25:"エクアドル スクレ";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:19:"エクアドル UVC";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:28:"エストニア クルーン";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:22:"エジプト ãƒãƒ³ãƒ‰";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:28:"エリトリア ナクファ";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:22:"スペイン ペセタ";}s:3:"ETB";a:2:{i:0;s:3:"ETB";i:1;s:22:"エãƒã‚ªãƒ”ã‚¢ ブル";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:22:"エãƒã‚ªãƒ”ã‚¢ ドル";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:9:"ユーロ";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:28:"フィンランド マルカ";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:40:"フィンランド マルカ (1860-1962)";}s:3:"FJD";a:2:{i:0;s:3:"FJD";i:1;s:25:"フィジー諸島 ドル";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:28:"フィジー諸島 ãƒãƒ³ãƒ‰";
}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:58:"フォークランド(マルビナス)諸島 ãƒãƒ³ãƒ‰";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:31:"フェロー諸島 クローナ";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:22:"フランス フラン";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:54:"フランス フラン (Franc Germinal/Franc Poincare)";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:23:"ガボン CFA フラン";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:15:"英国ãƒãƒ³ãƒ‰";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:32:"グルジア クーãƒãƒ³ ラリ";}s:3:"GEL";a:2:{i:0;s:3:"GEL";i:1;s:19:"グルジア ラリ";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:19:"ガーナ セディ";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:22:"ガーナ 旧セディ";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:19:"ガーナ ãƒãƒ³ãƒ‰";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:22:"ガーナ 新セディ";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:28:"ジブラルタル ãƒãƒ³ãƒ‰";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:34:"グリーンランド クローãƒ";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:22:"ガンビア ダラシ";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:22:"ガンビア ãƒãƒ³ãƒ‰";}s:3:"GNF";a:2:{i:0;s:3:"GNF";i:1;s:19:"ギニア フラン";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:31:"ギニア フラン (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:19:"ギニア シリー";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:28:"グアドループ フラン";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:25:"赤é“ギニア ギニー";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:25:"赤é“ギニア フラン";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:25:"赤é“ギニア ペセタ";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:25:"ギリシャ ドラクマ";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:28:"ギリシャ 新ドラクマ";}s:3:"GTQ";a:2:{i:0;s:3:"GTQ";i:1;s:28:"グアテマラ ケツァル";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:25:"ä»é ˜ã‚®ã‚¢ãƒŠ フラン";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:43:"ãƒãƒ«ãƒˆã‚¬ãƒ«é ˜ã‚®ãƒ‹ã‚¢ エスクード";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:43:"ãƒãƒ«ãƒˆã‚¬ãƒ«é ˜ã‚®ãƒ‹ã‚¢ ミルレイス";}s:3:"GWP";a:2:{i:0;s:3:"
GWP";i:1;s:25:"ギニアビサウ ペソ";}s:3:"GYD";a:2:{i:0;s:3:"GYD";i:1;s:19:"ガイアナ ドル";}s:3:"HKD";a:2:{i:0;s:3:"HKD";i:1;s:12:"香港ドル";}s:3:"HNL";a:2:{i:0;s:3:"HNL";i:1;s:31:"ホンジュラス レンピラ";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:31:"クロアãƒã‚¢ ディナール";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:25:"クロアãƒã‚¢ クーナ";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:22:"ãƒã‚¤ãƒ グールド";}s:3:"HUF";a:2:{i:0;s:3:"HUF";i:1;s:31:"ãƒãƒ³ã‚¬ãƒªãƒ¼ フォリント";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:31:"北アイルランド ãƒãƒ³ãƒ‰";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:37:"インドãƒã‚·ã‚¢ ニカギルダー";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:38:"インドãƒã‚·ã‚¢ ジャワ ルピア";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:31:"インドãƒã‚·ã‚¢ 新ルピア";}s:3:"IDR";a:2:{i:0;s:3:"IDR";i:1;s:28:"インドãƒã‚·ã‚¢ ルピア";}s:3:"IEP";a:2:{i:0;s:3:"IEP";i:1;s:28:"アイリッシュ ãƒãƒ³ãƒ‰";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:28:"イスラエル シェケル";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:25:"イスラエル ãƒãƒ³ãƒ‰";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:30:"イスラエル新シェケル";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:19:"マン島 ãƒãƒ³ãƒ‰";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:19:"インド ルピー";}s:3:"IQD";a:2:{i:0;s:3:"IQD";i:1;s:25:"イラク ディナール";}s:3:"IRR";a:2:{i:0;s:3:"IRR";i:1;s:19:"イラン リアル";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:31:"アイスランド クローナ";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:19:"イタリア リラ";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:28:"ジャージー島 ãƒãƒ³ãƒ‰";}s:3:"JMD";a:2:{i:0;s:3:"JMD";i:1;s:22:"ジャマイカ ドル";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:25:"ジャマイカ ãƒãƒ³ãƒ‰";}s:3:"JOD";a:2:{i:0;s:3:"JOD";i:1;s:28:"ヨルダン ディナール";}s:3:"JPY";a:2:{i:0;s:3:"ï¿¥";i:1;s:3:"円";}s:3:"KES";a:2:{i:0;s:3:"KES";i:1;s:22:"ケニア シリング";}s:3:"KGS";a:2:{i:0;s:3:"KGS";i:1;s:25:"キルギスタン ソム";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:28:"ã
‚«ãƒ³ãƒœã‚¸ã‚¢ 旧リエル";}s:3:"KHR";a:2:{i:0;s:3:"KHR";i:1;s:25:"カンボジア リエル";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:19:"キリãƒã‚¹ ドル";}s:3:"KMF";a:2:{i:0;s:3:"KMF";i:1;s:19:"コモロ フラン";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:25:"北æœé®® 人民ウォン";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:19:"北æœé®® ウォン";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:16:"韓国 ホアン";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:19:"韓国 旧ウォン";}s:3:"KRW";a:2:{i:0;s:3:"₩";i:1;s:16:"韓国 ウォン";}s:3:"KWD";a:2:{i:0;s:3:"KWD";i:1;s:31:"クウェート ディナール";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:25:"ケイマン諸島 ドル";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:31:"カザフスタン ルーブル";}s:3:"KZT";a:2:{i:0;s:3:"KZT";i:1;s:28:"カザフスタン テンゲ";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:19:"ラオス キープ";}s:3:"LBP";a:2:{i:0;s:3:"LBP";i:1;s:22:"レãƒãƒŽãƒ³ ãƒãƒ³ãƒ‰";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:37:"リヒテンシュタイン フラン";}s:3:"LKR";a:2:{i:0;s:3:"LKR";i:1;s:25:"スリランカ ルピー";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:22:"セイロン ルピー";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:19:"リベリア ドル";}s:3:"LSL";a:2:{i:0;s:3:"LSL";i:1;s:19:"レソト ロティ";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:25:"リトアニア リタス";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:25:"リトアニア タロナ";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:31:"ルクセンブルグ フラン";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:22:"ラトビア ラッツ";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:25:"ラトビア ルーブル";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:45:"リビア リラ (British Military Authority)";}s:3:"LYD";a:2:{i:0;s:3:"LYD";i:1;s:25:"リビア ディナール";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:19:"リピア ãƒãƒ³ãƒ‰";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:28:"モロッコ ディルãƒãƒ ";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:22:"モロッコ フラン";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:19:"モナコ フラン";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:2
5:"モナコ フラン (MCG)";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:32:"モルドムレイ クーãƒãƒ³";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:19:"モルドムレイ";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:32:"モルドムレイ クーãƒãƒ³";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:31:"マダガスカル アリアリ";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:28:"マダガスカル フラン";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:28:"マーシャル諸島 ドル";}s:3:"MKD";a:2:{i:0;s:3:"MKD";i:1;s:25:"マケドニア デナル";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:37:"マケドニア デナル (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:16:"マリ フラン";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:28:"ミャンマー ãƒãƒ£ãƒƒãƒˆ";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:28:"ミャンマー ドル (FEC)";}s:3:"MNT";a:2:{i:0;s:3:"MNT";i:1;s:25:"モンゴル トグログ";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:19:"マカオ パタカ";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:34:"マルティニーク島 フラン";}s:3:"MRO";a:2:{i:0;s:3:"MRO";i:1;s:28:"モーリタニア ウギア";}s:3:"MTL";a:2:{i:0;s:3:"MTL";i:1;s:16:"マルタ リラ";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:19:"マルタ ãƒãƒ³ãƒ‰";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:28:"モーリシャス ルピー";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:31:"モルディブ諸島 ルピー";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:34:"モルディブ諸島 ルフィア";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:25:"マラウィ クワãƒãƒ£";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:22:"マラウィ ãƒãƒ³ãƒ‰";}s:3:"MXN";a:2:{i:0;s:3:"MXN";i:1;s:19:"メキシコ ペソ";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:37:"メキシコ ペソ (MXPã€1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:16:"メキシコ UDI";}s:3:"MYR";a:2:{i:0;s:3:"MYR";i:1;s:31:"マレーシア リンギット";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:34:"モザンピーク エスクード";}s:3:"MZM";a:2:{i:0;s:3:"MZM";i:1;s:34:"モザンピーク メティカル";}s:3:"NAD";a:2:{i:0;s:3:"NAD";i:1;s:19:"ナミビア ドル";}s:3:"NCF";a:2:{i:0;s:3:"N
CF";i:1;s:38:"ニューカレドニア CFP フラン";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:28:"ナイジェリア ナイラ";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:28:"ナイジェリア ãƒãƒ³ãƒ‰";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:50:"ニューヘブリディーズ諸島 CFP フラン";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:28:"ニカラグア コルドãƒ";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:34:"ニカラグア コルドム(NIG)";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:35:"ニカラグア コルドムオロ";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:25:"オランダ ギルダー";}s:3:"NOK";a:2:{i:0;s:3:"NOK";i:1;s:28:"ノルウェー クローãƒ";}s:3:"NPR";a:2:{i:0;s:3:"NPR";i:1;s:22:"ãƒãƒ‘ール ルピー";}s:3:"NZD";a:2:{i:0;s:3:"NZD";i:1;s:31:"ニュージーランド ドル";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:34:"ニュージーランド ãƒãƒ³ãƒ‰";}s:3:"OMR";a:2:{i:0;s:3:"OMR";i:1;s:22:"オマーン リアル";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:28:"オマーン リアル (OMS)";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:22:"パナマ ãƒãƒ«ãƒœã‚¢";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:40:"沿ドニエストル ルーブル (PDK)";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:43:"沿ドニエストル 新ルーブル (PDN)";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:40:"沿ドニエストル ルーブル (PDR)";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:22:"ペルー インティ";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:19:"ペルー 新ソル";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:16:"ペルー ソル";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:34:"パプアニューギニア キナ";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:22:"フィリピン ペソ";}s:3:"PKR";a:2:{i:0;s:3:"PKR";i:1;s:25:"パキスタン ルピー";}s:3:"PLN";a:2:{i:0;s:3:"PLN";i:1;s:31:"ãƒãƒ¼ãƒ©ãƒ³ãƒ‰ ズウォティ";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:31:"ãƒãƒ¼ãƒ©ãƒ³ãƒ‰ 米ドル (FEC)";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:43:"ãƒãƒ¼ãƒ©ãƒ³ãƒ‰ ズウォティ (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:25:"パレスãƒãƒŠ ãƒãƒ³ãƒ‰";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:25:"ãƒãƒ«ãƒˆã‚¬ãƒ
« コント";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:31:"ãƒãƒ«ãƒˆã‚¬ãƒ« エスクード";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:28:"パラグアイ グアラニ";}s:3:"QAR";a:2:{i:0;s:3:"QAR";i:1;s:22:"カタール リアル";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:28:"レユニオン島 フラン";}s:3:"ROL";a:2:{i:0;s:3:"ROL";i:1;s:22:"ルーマニア レイ";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:25:"ルーマニア 新レイ";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:34:"ロシア ルーブル (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:22:"ルワンダ フラン";}s:3:"SAR";a:2:{i:0;s:3:"SAR";i:1;s:19:"サウジ リヤル";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:25:"サウジ リヤル (SAS)";}s:3:"SBD";a:2:{i:0;s:3:"SBD";i:1;s:25:"ソロモン諸島 ドル";}s:3:"SCR";a:2:{i:0;s:3:"SCR";i:1;s:25:"セイシェル ルピー";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:28:"スーダン ディナール";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:22:"スーダン ãƒãƒ³ãƒ‰";}s:3:"SEK";a:2:{i:0;s:3:"SEK";i:1;s:31:"スウェーデン クローナ";}s:3:"SGD";a:2:{i:0;s:3:"SGD";i:1;s:25:"シンガãƒãƒ¼ãƒ« ドル";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:31:"セントヘレナ島 ãƒãƒ³ãƒ‰";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:34:"スロベニア トラール (SIB)";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:28:"スロベニア トラール";}s:3:"SKK";a:2:{i:0;s:3:"SKK";i:1;s:25:"スロãƒã‚­ã‚¢ コルナ";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:28:"シエラレオムレオン";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:22:"サンマリノ リラ";}s:3:"SOS";a:2:{i:0;s:3:"SOS";i:1;s:25:"ソマリア シリング";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:31:"ソマリランド シリング";}s:3:"SRG";a:2:{i:0;s:3:"SRG";i:1;s:25:"スリナム ギルダー";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:31:"スコットランド ãƒãƒ³ãƒ‰";}s:3:"STD";a:2:{i:0;s:3:"STD";i:1;s:40:"サントメ・プリンシペ ドブラ";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:46:"サントメ・プリンシペ エスクード";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:22:"ソ連 新ルーブル";}s:3:"SUR";a:2:{i
:0;s:3:"SUR";i:1;s:19:"ソ連 ルーブル";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:31:"エルサルãƒãƒ‰ãƒ« コロン";}s:3:"SYP";a:2:{i:0;s:3:"SYP";i:1;s:19:"シリア ãƒãƒ³ãƒ‰";}s:3:"SZL";a:2:{i:0;s:3:"SZL";i:1;s:34:"スワジランド リランゲニ";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:46:"タークス・カイコス諸島 クローン";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:23:"ãƒãƒ£ãƒ‰ CFA フラン";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:16:"タイ ãƒãƒ¼ãƒ„";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:31:"タジキスタン ルーブル";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:28:"タジキスタン ソモニ";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:34:"トルクメニスタン マナト";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:31:"ãƒãƒ¥ãƒ‹ã‚¸ã‚¢ ディナール";}s:3:"TOP";a:2:{i:0;s:3:"TOP";i:1;s:25:"トンガ パ・アンガ";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:19:"トンガ ãƒãƒ³ãƒ‰";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:31:"ティモール エスクード";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:25:"ティモール パタカ";}s:3:"TRL";a:2:{i:0;s:3:"TRL";i:1;s:16:"トルコ リラ";}s:3:"TTD";a:2:{i:0;s:3:"TTD";i:1;s:34:"トリニダードトãƒã‚´ ドル";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:37:"トリニダードトãƒã‚´ 旧ドル";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:16:"ツãƒãƒ« ドル";}s:3:"TWD";a:2:{i:0;s:3:"TWD";i:1;s:15:"æ–°å°æ¹¾ãƒ‰ãƒ«";}s:3:"TZS";a:2:{i:0;s:3:"TZS";i:1;s:28:"タンザニア シリング";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:28:"ウクライナ グリブナ";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:34:"ウクライナ カルボãƒãƒãƒ„";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:37:"ウガンダ シリング (1966-1987)";}s:3:"UGX";a:2:{i:0;s:3:"UGX";i:1;s:25:"ウガンダ シリング";}s:3:"USD";a:2:{i:0;s:1:"$";i:1;s:9:"米ドル";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:18:"米ドル (翌日)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:18:"米ドル (当日)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:28:"ウルグアイ ペソ (UYF)";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:34:"ウルグアイ ペソ (1975-1993)";}s:3:"UYU";a:2:{i:0
;s:3:"UYU";i:1;s:22:"ウルグアイ ペソ";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:34:"ウズベキスタン スム (UZC)";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:28:"ウズベキスタン スム";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:19:"ãƒãƒã‚«ãƒ³ リラ";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:28:"北ベトナム ドン (VDD)";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:25:"北ベトナム 新ドン";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:28:"北ベトナム ドン (VDP)";}s:3:"VEB";a:2:{i:0;s:3:"VEB";i:1;s:28:"ベãƒã‚ºã‚¨ãƒ© ボリãƒãƒ«";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:31:"英領ãƒãƒ¼ã‚¸ãƒ³è«¸å³¶ ドル";}s:3:"VND";a:2:{i:0;s:2:"Ä‘";i:1;s:19:"ベトナム ドン";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:22:"ベトナム 新ドン";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:28:"ベトナム共和国 ドン";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:28:"ベトナム自治区 ドン";}s:3:"VUV";a:2:{i:0;s:3:"VUV";i:1;s:19:"ãƒãƒŒã‚¢ãƒ„ ãƒãƒ„";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:22:"西サモア ãƒãƒ³ãƒ‰";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:19:"西サモア タラ";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:37:"アジア ディナール勘定å˜ä½";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:18:"CFA フラン BEAC";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:27:"アジア通貨å˜ä½ (AMU)";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:3:"金";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:35:"ヨーロッパ混åˆå˜ä½ (EURCO)";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:35:"ヨーロッパ通貨å˜ä½ (EMU-6)";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:35:"ヨーロッパ勘定å˜ä½ (EUA-9)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:36:"ヨーロッパ勘定å˜ä½ (EUA-17)";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:19:"æ±ã‚«ãƒªãƒ– ドル";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:16:"CFA 新フラン";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:46:"特別引ã出ã—権 (Special Drawing Rights)";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:22:"CFA フラン (BCEAEC)";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:27:"ヨーロッパ通貨å˜ä½";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:28:"フランス フラン (XFO)";}s:3:"XFU";a:2:{i:0;s:3:"
XFU";i:1;s:26:"フランス UIC フラン";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:28:"イスラム ディナール";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:31:"フランス 新フラン (XMF)";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:41:"ä»é ˜ã‚¢ãƒ³ãƒ†ã‚£ãƒ«è«¸å³¶ CFA フラン";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:19:"CFA フラン BCEAO";}s:3:"XPF";a:2:{i:0;s:3:"XPF";i:1;s:13:"CFP フラン";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:30:"コメコン振替ルーブル";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:28:"イエメン ディナール";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:28:"イエメン リアル (YEI)";}s:3:"YER";a:2:{i:0;s:3:"YER";i:1;s:22:"イエメン リアル";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:43:"ユーゴスラビア ディナール (YUD)";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:43:"ユーゴスラビア ディナール (YUF)";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:43:"ユーゴスラビア ディナール (YUG)";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:50:"ユーゴスラビア スーパー ディナール";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:46:"ユーゴスラビア 新ディナール (YUN)";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:43:"ユーゴスラビア ディナール (YUO)";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:43:"ユーゴスラビア ディナール (YUR)";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:31:"å—アフリカ ランド (ZAL)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:25:"å—アフリカ ãƒãƒ³ãƒ‰";}s:3:"ZAR";a:2:{i:0;s:3:"ZAR";i:1;s:25:"å—アフリカ ランド";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:22:"ザンビア ãƒãƒ³ãƒ‰";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:28:"ザイール 新ザイール";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:25:"ザイール ザイール";}s:3:"ZWD";a:2:{i:0;s:3:"ZWD";i:1;s:22:"ジンãƒãƒ–エ ドル";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:3:"暦";}s:9:"collation";a:1:{i:0;s:12:"ç…§åˆé †ç•ª";}s:8:"currency";a:1:{i:0;s:6:"通貨";}}s:9:"Languages";a:194:{s:2:"aa";a:1:{i:0;s:18:"アファール語";}s:2:"ab";a:1:{i:0;s:15:"アブãƒã‚ºèªž";}s:2:"ae";a:1:{i:0;s:18:"アヴェスタ語";}s:2:"af";a:1:{i:0
;s:24:"アフリカーンス語";}s:2:"ak";a:1:{i:0;s:12:"アカン語";}s:2:"am";a:1:{i:0;s:15:"アムãƒãƒ©èªž";}s:2:"an";a:1:{i:0;s:15:"アラゴン語";}s:2:"ar";a:1:{i:0;s:15:"アラビア語";}s:2:"as";a:1:{i:0;s:15:"アッサム語";}s:2:"av";a:1:{i:0;s:15:"アヴァル語";}s:2:"ay";a:1:{i:0;s:15:"アイマラ語";}s:2:"az";a:1:{i:0;s:27:"アゼルãƒã‚¤ã‚¸ãƒ£ãƒ³èªž";}s:2:"ba";a:1:{i:0;s:18:"ãƒã‚·ã‚­ãƒ¼ãƒ«èªž";}s:2:"be";a:1:{i:0;s:18:"ベラルーシ語";}s:2:"bg";a:1:{i:0;s:18:"ブルガリア語";}s:2:"bh";a:1:{i:0;s:15:"ビãƒâ€•ãƒ«èªž";}s:2:"bi";a:1:{i:0;s:15:"ビスラマ語";}s:2:"bm";a:1:{i:0;s:15:"ãƒãƒ³ãƒãƒ©èªž";}s:2:"bn";a:1:{i:0;s:15:"ベンガル語";}s:2:"bo";a:1:{i:0;s:15:"ãƒãƒ™ãƒƒãƒˆèªž";}s:2:"br";a:1:{i:0;s:15:"ブルトン語";}s:2:"bs";a:1:{i:0;s:15:"ボスニア語";}s:3:"byn";a:1:{i:0;s:12:"ビリン語";}s:2:"ca";a:1:{i:0;s:18:"カタロニア語";}s:2:"ce";a:1:{i:0;s:18:"ãƒã‚§ãƒã‚§ãƒ³èªž";}s:2:"ch";a:1:{i:0;s:15:"ãƒãƒ£ãƒ¢ãƒ­èªž";}s:3:"chr";a:1:{i:0;s:18:"ãƒã‚§ãƒ­ã‚­ãƒ¼èªž";}s:2:"co";a:1:{i:0;s:15:"コルシカ語";}s:2:"cr";a:1:{i:0;s:12:"クリー語";}s:2:"cs";a:1:{i:0;s:12:"ãƒã‚§ã‚³èªž";}s:2:"cu";a:1:{i:0;s:18:"教会スラブ語";}s:2:"cv";a:1:{i:0;s:21:"ãƒãƒ¥ãƒ´ã‚¡ã‚·ãƒ¥èªž";}s:2:"cy";a:1:{i:0;s:18:"ウェールズ語";}s:2:"da";a:1:{i:0;s:18:"デンマーク語";}s:2:"de";a:1:{i:0;s:12:"ドイツ語";}s:2:"dv";a:1:{i:0;s:18:"ディヴェヒ語";}s:2:"dz";a:1:{i:0;s:15:"ブータン語";}s:2:"ee";a:1:{i:0;s:12:"エウェ語";}s:2:"el";a:1:{i:0;s:15:"ギリシャ語";}s:2:"en";a:1:{i:0;s:6:"英語";}s:2:"eo";a:1:{i:0;s:21:"エスペラント語";}s:2:"es";a:1:{i:0;s:15:"スペイン語";}s:2:"et";a:1:{i:0;s:18:"エストニア語";}s:2:"eu";a:1:{i:0;s:12:"ãƒã‚¹ã‚¯èªž";}s:2:"fa";a:1:{i:0;s:15:"ペルシア語";}s:2:"ff";a:1:{i:0;s:12:"フラニ語";}s:2:"fi";a:1:{i:0;s:21:"フィンランド語";}s:2:"fj";a:1:{i:0;s:15:"フィジー語";}s:2:"fo";a:1:{i:0;s:15:"フェロー語";}s:2:"fr";a:1:{i:0;s:15:"フランス語";}s:2:"fy";a:1:{i:0;s:15:"フリジア語";}s:2:"ga";
a:1:{i:0;s:21:"アイルランド語";}s:2:"gd";a:1:{i:0;s:36:"スコットランド・ゲール語";}s:3:"gez";a:1:{i:0;s:12:"ゲエズ語";}s:2:"gl";a:1:{i:0;s:15:"ガリシア語";}s:2:"gn";a:1:{i:0;s:15:"グワラニ語";}s:2:"gu";a:1:{i:0;s:21:"グジャラート語";}s:2:"gv";a:1:{i:0;s:12:"マン島語";}s:2:"ha";a:1:{i:0;s:12:"ãƒã‚¦ã‚µèªž";}s:3:"haw";a:1:{i:0;s:12:"ãƒãƒ¯ã‚¤èªž";}s:2:"he";a:1:{i:0;s:15:"ヘブライ語";}s:2:"hi";a:1:{i:0;s:18:"ヒンディー語";}s:2:"ho";a:1:{i:0;s:18:"ヒリモトゥ語";}s:2:"hr";a:1:{i:0;s:18:"クロアãƒã‚¢èªž";}s:2:"ht";a:1:{i:0;s:12:"ãƒã‚¤ãƒèªž";}s:2:"hu";a:1:{i:0;s:18:"ãƒãƒ³ã‚¬ãƒªãƒ¼èªž";}s:2:"hy";a:1:{i:0;s:18:"アルメニア語";}s:2:"hz";a:1:{i:0;s:12:"ヘレロ語";}s:2:"ia";a:1:{i:0;s:9:"国際語";}s:2:"id";a:1:{i:0;s:21:"インドãƒã‚·ã‚¢èªž";}s:2:"ie";a:1:{i:0;s:9:"国際語";}s:2:"ig";a:1:{i:0;s:9:"イボ語";}s:2:"ii";a:1:{i:0;s:12:"å››å·ã‚¤èªž";}s:2:"ik";a:1:{i:0;s:21:"イヌピアック語";}s:2:"io";a:1:{i:0;s:9:"イド語";}s:2:"is";a:1:{i:0;s:21:"アイスランド語";}s:2:"it";a:1:{i:0;s:15:"イタリア語";}s:2:"iu";a:1:{i:0;s:30:"イヌクウティトット語";}s:2:"ja";a:1:{i:0;s:9:"日本語";}s:2:"jv";a:1:{i:0;s:12:"ジャワ語";}s:2:"ka";a:1:{i:0;s:15:"グルジア語";}s:2:"kg";a:1:{i:0;s:12:"コンゴ語";}s:2:"ki";a:1:{i:0;s:12:"キクユ語";}s:2:"kj";a:1:{i:0;s:18:"クアニャマ語";}s:2:"kk";a:1:{i:0;s:12:"カザフ語";}s:2:"kl";a:1:{i:0;s:24:"グリーンランド語";}s:2:"km";a:1:{i:0;s:18:"カンボジア語";}s:2:"kn";a:1:{i:0;s:15:"カンナダ語";}s:2:"ko";a:1:{i:0;s:9:"韓国語";}s:3:"kok";a:1:{i:0;s:15:"コンカニ語";}s:2:"kr";a:1:{i:0;s:12:"カヌリ語";}s:2:"ks";a:1:{i:0;s:18:"カシミール語";}s:2:"ku";a:1:{i:0;s:12:"クルド語";}s:2:"kv";a:1:{i:0;s:9:"コミ語";}s:2:"kw";a:1:{i:0;s:24:"コーンウォール語";}s:2:"ky";a:1:{i:0;s:15:"キルギス語";}s:2:"la";a:1:{i:0;s:12:"ラテン語";}s:2:"lb";a:1:{i:0;s:24:"ルクセンブルク語";}s:2:"lg";a:1:{i:0;s:12:"ガンダ語";}s:2:"li";a:1:{i
:0;s:18:"リンブルフ語";}s:2:"ln";a:1:{i:0;s:15:"リンガラ語";}s:2:"lo";a:1:{i:0;s:9:"ラオ語";}s:2:"lt";a:1:{i:0;s:18:"リトアニア語";}s:2:"lu";a:1:{i:0;s:24:"ルãƒãƒ»ã‚«ã‚¿ãƒ³ã‚¬èªž";}s:2:"lv";a:1:{i:0;s:15:"ラトビア語";}s:2:"mg";a:1:{i:0;s:18:"マラガシー語";}s:2:"mh";a:1:{i:0;s:18:"マーシャル語";}s:2:"mi";a:1:{i:0;s:12:"マオリ語";}s:2:"mk";a:1:{i:0;s:18:"マケドニア語";}s:2:"ml";a:1:{i:0;s:21:"マラヤ―ラム語";}s:2:"mn";a:1:{i:0;s:15:"モンゴル語";}s:2:"mo";a:1:{i:0;s:18:"モルダビア語";}s:2:"mr";a:1:{i:0;s:21:"マラーティー語";}s:2:"ms";a:1:{i:0;s:12:"マライ語";}s:2:"mt";a:1:{i:0;s:12:"マルタ語";}s:2:"my";a:1:{i:0;s:12:"ビルマ語";}s:2:"na";a:1:{i:0;s:12:"ナウル語";}s:2:"nb";a:1:{i:0;s:36:"ノルウェー語 (ボクモール)";}s:2:"nd";a:1:{i:0;s:18:"北ンデベレ語";}s:2:"ne";a:1:{i:0;s:15:"ãƒãƒ‘ール語";}s:2:"ng";a:1:{i:0;s:15:"ンドンガ語";}s:2:"nl";a:1:{i:0;s:15:"オランダ語";}s:2:"nn";a:1:{i:0;s:42:"ノルウェー語 (ニューノルスク)";}s:2:"no";a:1:{i:0;s:18:"ノルウェー語";}s:2:"nr";a:1:{i:0;s:18:"å—ンデベレ語";}s:2:"nv";a:1:{i:0;s:12:"ナãƒãƒ›èªž";}s:2:"ny";a:1:{i:0;s:51:"ニャンジャ語ã€ãƒãƒã‚§ãƒ¯èªžã€ãƒã‚§ãƒ¯èªž";}s:2:"oc";a:1:{i:0;s:21:"プロヴァンス語";}s:2:"oj";a:1:{i:0;s:15:"オブジワ語";}s:2:"om";a:1:{i:0;s:9:"ガラ語";}s:2:"or";a:1:{i:0;s:15:"オリヤー語";}s:2:"os";a:1:{i:0;s:12:"オセト語";}s:2:"pa";a:1:{i:0;s:18:"パンジャブ語";}s:2:"pi";a:1:{i:0;s:12:"パーリ語";}s:2:"pl";a:1:{i:0;s:18:"ãƒãƒ¼ãƒ©ãƒ³ãƒ‰èªž";}s:2:"ps";a:1:{i:0;s:18:"パシュトー語";}s:2:"pt";a:1:{i:0;s:18:"ãƒãƒ«ãƒˆã‚¬ãƒ«èªž";}s:2:"qu";a:1:{i:0;s:15:"ケãƒãƒ¥ã‚¢èªž";}s:2:"rm";a:1:{i:0;s:21:"レトï¼ãƒ­ãƒžãƒ³èªž";}s:2:"rn";a:1:{i:0;s:12:"ルンジ語";}s:2:"ro";a:1:{i:0;s:18:"ルーマニア語";}s:2:"ru";a:1:{i:0;s:12:"ロシア語";}s:2:"rw";a:1:{i:0;s:15:"ルワンダ語";}s:2:"sa";a:1:{i:0;s:24:"サンスクリット語";}s:2:"sc";a:1:{i:0;s:21:"サルデーニャ語";}s
:2:"sd";a:1:{i:0;s:12:"シンド語";}s:2:"se";a:1:{i:0;s:15:"北サーミ語";}s:2:"sg";a:1:{i:0;s:12:"サンゴ語";}s:2:"sh";a:1:{i:0;s:30:"セルボï¼ã‚¯ãƒ­ã‚¢ãƒã‚¢èªž";}s:2:"si";a:1:{i:0;s:15:"シンãƒãƒ©èªž";}s:3:"sid";a:1:{i:0;s:12:"シダモ語";}s:2:"sk";a:1:{i:0;s:18:"スロãƒã‚­ã‚¢èªž";}s:2:"sl";a:1:{i:0;s:18:"スロベニア語";}s:2:"sm";a:1:{i:0;s:12:"サモア語";}s:2:"sn";a:1:{i:0;s:12:"ショナ語";}s:2:"so";a:1:{i:0;s:12:"ソマリ語";}s:2:"sq";a:1:{i:0;s:18:"アルãƒãƒ‹ã‚¢èªž";}s:2:"sr";a:1:{i:0;s:15:"セルビア語";}s:2:"ss";a:1:{i:0;s:18:"シスワティ語";}s:2:"st";a:1:{i:0;s:15:"å—セソト語";}s:2:"su";a:1:{i:0;s:12:"スンダ語";}s:2:"sv";a:1:{i:0;s:21:"スウェーデン語";}s:2:"sw";a:1:{i:0;s:15:"スワヒリ語";}s:3:"syr";a:1:{i:0;s:12:"シリア語";}s:2:"ta";a:1:{i:0;s:15:"タミール語";}s:2:"te";a:1:{i:0;s:12:"テルグ語";}s:2:"tg";a:1:{i:0;s:12:"タジク語";}s:2:"th";a:1:{i:0;s:9:"タイ語";}s:2:"ti";a:1:{i:0;s:21:"ティグリニア語";}s:3:"tig";a:1:{i:0;s:15:"ティグレ語";}s:2:"tk";a:1:{i:0;s:18:"トルクメン語";}s:2:"tl";a:1:{i:0;s:15:"タガログ語";}s:2:"tn";a:1:{i:0;s:12:"ツワナ語";}s:2:"to";a:1:{i:0;s:12:"トンガ語";}s:2:"tr";a:1:{i:0;s:12:"トルコ語";}s:2:"ts";a:1:{i:0;s:15:"ツォンガ語";}s:2:"tt";a:1:{i:0;s:15:"タタール語";}s:2:"tw";a:1:{i:0;s:12:"トゥイ語";}s:2:"ty";a:1:{i:0;s:12:"タヒãƒèªž";}s:2:"ug";a:1:{i:0;s:15:"ウイグル語";}s:2:"uk";a:1:{i:0;s:18:"ウクライナ語";}s:2:"ur";a:1:{i:0;s:18:"ウルドゥー語";}s:2:"uz";a:1:{i:0;s:15:"ウズベク語";}s:2:"ve";a:1:{i:0;s:12:"ベンダ語";}s:2:"vi";a:1:{i:0;s:15:"ベトナム語";}s:2:"vo";a:1:{i:0;s:18:"ボラピュク語";}s:2:"wa";a:1:{i:0;s:12:"ワロン語";}s:2:"wo";a:1:{i:0;s:15:"ウォロフ語";}s:2:"xh";a:1:{i:0;s:9:"コサ語";}s:2:"yi";a:1:{i:0;s:21:"イディッシュ語";}s:2:"yo";a:1:{i:0;s:12:"ヨルãƒèªž";}s:2:"za";a:1:{i:0;s:12:"ãƒãƒ¯ãƒ³èªž";}s:2:"zh";a:1:{i:0;s:9:"中国語";}s:2:"zu";a:1:{i:0;s:15:"ズールー語";}}s:12:"Lo
caleScript";a:3:{i:0;s:4:"Kana";i:1;s:4:"Hira";i:2;s:4:"Hani";}s:7:"Scripts";a:54:{s:4:"Arab";a:1:{i:0;s:18:"アラビア文字";}s:4:"Armn";a:1:{i:0;s:21:"アルメニア文字";}s:4:"Beng";a:1:{i:0;s:18:"ベンガル文字";}s:4:"Bopo";a:1:{i:0;s:12:"注音字æ¯";}s:4:"Brai";a:1:{i:0;s:18:"ブライユ点字";}s:4:"Buhd";a:1:{i:0;s:18:"ブヒッド文字";}s:4:"Cans";a:1:{i:0;s:30:"çµ±åˆã‚«ãƒŠãƒ€å…ˆä½æ°‘記å·";}s:4:"Cher";a:1:{i:0;s:21:"ãƒã‚§ãƒ­ã‚­ãƒ¼æ–‡å­—";}s:4:"Copt";a:1:{i:0;s:15:"コプト文字";}s:4:"Cprt";a:1:{i:0;s:18:"キプロス文字";}s:4:"Cyrl";a:1:{i:0;s:15:"キリル文字";}s:4:"Deva";a:1:{i:0;s:30:"デーãƒãƒŠãƒ¼ã‚¬ãƒªãƒ¼æ–‡å­—";}s:4:"Dsrt";a:1:{i:0;s:21:"デセレット文字";}s:4:"Ethi";a:1:{i:0;s:21:"エãƒã‚ªãƒ”ア文字";}s:4:"Geor";a:1:{i:0;s:18:"グルジア文字";}s:4:"Goth";a:1:{i:0;s:15:"ゴート文字";}s:4:"Grek";a:1:{i:0;s:18:"ギリシャ文字";}s:4:"Gujr";a:1:{i:0;s:24:"グジャラート文字";}s:4:"Guru";a:1:{i:0;s:21:"グルムキー文字";}s:4:"Hang";a:1:{i:0;s:18:"ãƒãƒ³ã‚°ãƒ«æ–‡å­—";}s:4:"Hani";a:1:{i:0;s:6:"漢字";}s:4:"Hano";a:1:{i:0;s:18:"ãƒãƒŒãƒŽã‚ªæ–‡å­—";}s:4:"Hans";a:1:{i:0;s:9:"簡体字";}s:4:"Hant";a:1:{i:0;s:9:"ç¹ä½“å­—";}s:4:"Hebr";a:1:{i:0;s:18:"ヘブライ文字";}s:4:"Hira";a:1:{i:0;s:12:"ã²ã‚‰ãŒãª";}s:4:"Ital";a:1:{i:0;s:24:"å¤ä»£ã‚¤ã‚¿ãƒªã‚¢æ–‡å­—";}s:4:"Kana";a:1:{i:0;s:12:"カタカナ";}s:4:"Khmr";a:1:{i:0;s:21:"カンボジア文字";}s:4:"Knda";a:1:{i:0;s:18:"カンナダ文字";}s:4:"Laoo";a:1:{i:0;s:12:"ラオ文字";}s:4:"Latn";a:1:{i:0;s:15:"ラテン文字";}s:4:"Limb";a:1:{i:0;s:15:"リンブ文字";}s:4:"Linb";a:1:{i:0;s:10:"線文字B";}s:4:"Mlym";a:1:{i:0;s:24:"マラヤーラム文字";}s:4:"Mong";a:1:{i:0;s:18:"モンゴル文字";}s:4:"Mymr";a:1:{i:0;s:21:"ミャンマー文字";}s:4:"Ogam";a:1:{i:0;s:9:"オガム";}s:4:"Orya";a:1:{i:0;s:18:"オリヤー文字";}s:4:"Osma";a:1:{i:0;s:21:"オスマニア文字";}s:4:"Runr";a:1:{i:0;s:15:"ルーン文字";}s:4:"Shaw";a:1:{i:0;s:15:"ショー文字";}s:4:"Sinh";a:1:{i:0;s
:18:"シンãƒãƒ©æ–‡å­—";}s:4:"Syrc";a:1:{i:0;s:15:"シリア文字";}s:4:"Tagb";a:1:{i:0;s:21:"ã‚¿ã‚°ãƒãƒ³ãƒ¯æ–‡å­—";}s:4:"Tale";a:1:{i:0;s:15:"タイレ文字";}s:4:"Taml";a:1:{i:0;s:18:"タミール文字";}s:4:"Telu";a:1:{i:0;s:15:"テルグ文字";}s:4:"Tglg";a:1:{i:0;s:18:"タガログ文字";}s:4:"Thaa";a:1:{i:0;s:15:"ターナ文字";}s:4:"Thai";a:1:{i:0;s:12:"タイ文字";}s:4:"Tibt";a:1:{i:0;s:18:"ãƒãƒ™ãƒƒãƒˆæ–‡å­—";}s:4:"Ugar";a:1:{i:0;s:18:"ウガリト文字";}s:4:"Yiii";a:1:{i:0;s:9:"イ文字";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:6:"ä»æš¦";}s:7:"chinese";a:1:{i:0;s:9:"中国暦";}s:9:"gregorian";a:1:{i:0;s:18:"グレゴリオ暦";}s:6:"hebrew";a:1:{i:0;s:15:"ヘブライ暦";}s:7:"islamic";a:1:{i:0;s:15:"イスラム暦";}s:13:"islamic-civil";a:1:{i:0;s:21:"太陽イスラム暦";}s:8:"japanese";a:1:{i:0;s:6:"和暦";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:12:"直接著錄";}s:9:"phonebook";a:1:{i:0;s:15:"電話帳方å¼";}s:6:"pinyin";a:1:{i:0;s:9:"拼音順";}s:6:"stroke";a:1:{i:0;s:9:"画数順";}s:11:"traditional";a:1:{i:0;s:6:"æ—§å¼";}}}s:8:"Variants";a:1:{s:7:"REVISED";a:1:{i:0;s:9:"改訂版";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:10:"boundaries";a:1:{s:4:"word";a:1:{i:0;s:7:"word_ja";}}s:8:"calendar";a:2:{s:9:"gregorian";a:5:{s:11:"AmPmMarkers";a:2:{i:0;s:6:"åˆå‰";i:1;s:6:"åˆå¾Œ";}s:16:"DateTimePatterns";a:9:{i:0;s:21:"H'時'mm'分'ss'秒'z";i:1;s:9:"H:mm:ss:z";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:25:"yyyy'å¹´'M'月'd'æ—¥'EEEE";i:5;s:21:"yyyy'å¹´'M'月'd'æ—¥'";i:6;s:10:"yyyy/MM/dd";i:7;s:8:"yy/MM/dd";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:3:"æ—¥";i:1;s:3:"月";i:2;s:3:"ç«";i:3;s:3:"æ°´";i:4;s:3:"木";i:5;s:3:"金";i:6;s:3:"土";}s:6:"narrow";a:7:{i:0;s:3:"æ—¥";i:1;s:3:"月";i:2;s:3:"ç«";i:3;s:3:"æ°´";i:4;s:3:"木";i:5;s:3:"金";i:6;s:3:"土";}s:4:"wide";a:7:{i:0;s:9:"日曜日";i:1;s:9:"月曜日";i:2;s:9:"ç«æ›œæ—¥";i:3;s:9:"水曜日";i:4;s:9:"木曜日";i:5;s:9:"金曜日";i:6;s:9:"土曜日";}}
}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:9:"紀元å‰";i:1;s:6:"西暦";}}s:10:"monthNames";a:1:{s:6:"format";a:1:{s:4:"wide";a:12:{i:0;s:4:"1月";i:1;s:4:"2月";i:2;s:4:"3月";i:3;s:4:"4月";i:4;s:4:"5月";i:5;s:4:"6月";i:6;s:4:"7月";i:7;s:4:"8月";i:8;s:4:"9月";i:9;s:5:"10月";i:10;s:5:"11月";i:11;s:5:"12月";}}}}s:8:"japanese";a:2:{s:16:"DateTimePatterns";a:9:{i:0;s:21:"H'時'mm'分'ss'秒'z";i:1;s:9:"H:mm:ss:z";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:23:"Gy'å¹´'M'月'd'æ—¥'EEEE";i:5;s:19:"Gy'å¹´'M'月'd'æ—¥'";i:6;s:10:"G yy/MM/dd";i:7;s:10:"G yy/MM/dd";i:8;s:7:"{1} {0}";}s:4:"eras";a:1:{s:11:"abbreviated";a:236:{i:0;s:6:"大化";i:1;s:6:"白雉";i:2;s:6:"白鳯";i:3;s:6:"朱鳥";i:4;s:6:"大å®";i:5;s:6:"慶雲";i:6;s:6:"和銅";i:7;s:6:"霊亀";i:8;s:6:"養è€";i:9;s:6:"神亀";i:10;s:6:"天平";i:11;s:12:"天平感å®";i:12;s:12:"天平å‹å®";i:13;s:12:"天平å®å­—";i:14;s:12:"天平神護";i:15;s:12:"神護景雲";i:16;s:6:"å®äº€";i:17;s:6:"天応";i:18;s:6:"延暦";i:19;s:6:"大åŒ";i:20;s:6:"弘ä»";i:21;s:6:"天長";i:22;s:6:"承和";i:23;s:6:"嘉祥";i:24;s:6:"ä»å¯¿";i:25;s:6:"斉衡";i:26;s:6:"天安";i:27;s:6:"貞観";i:28;s:6:"元慶";i:29;s:6:"ä»å’Œ";i:30;s:6:"寛平";i:31;s:6:"昌泰";i:32;s:6:"延喜";i:33;s:6:"延長";i:34;s:6:"承平";i:35;s:6:"天慶";i:36;s:6:"天暦";i:37;s:6:"天徳";i:38;s:6:"応和";i:39;s:6:"康ä¿";i:40;s:6:"安和";i:41;s:6:"天禄";i:42;s:6:"天延";i:43;s:6:"貞元";i:44;s:6:"天元";i:45;s:6:"永観";i:46;s:6:"寛和";i:47;s:6:"永延";i:48;s:6:"永祚";i:49;s:6:"正暦";i:50;s:6:"é•·å¾³";i:51;s:6:"é•·ä¿";i:52;s:6:"寛弘";i:53;s:6:"é•·å’Œ";i:54;s:6:"寛ä»";i:55;s:6:"治安";i:56;s:6:"万寿";i:57;s:6:"é•·å…ƒ";i:58;s:6:"長暦";i:59;s:6:"é•·ä¹…";i:60;s:6:"寛徳";i:61;s:6:"永承";i:62;s:6:"天喜";i:63;s:6:"康平";i:64;s:6:"治暦";i:65;s:6:"延久";i:66;s:6:"承ä¿";i:67;s:6:"承暦";i:68;s:6:"æ°¸ä¿";i:69;s:6:"応徳";i:70;s:6:"寛治";i:71;s:6:"嘉ä¿";i:72;s:6:"永長";i:73;s:6:"承徳";i:74;s:6:"康和";i:75;s:6:"é•·æ²»";i:76;s:6:"嘉承";i:77
;s:6:"天ä»";i:78;s:6:"天永";i:79;s:6:"永久";i:80;s:6:"元永";i:81;s:6:"ä¿å®‰";i:82;s:6:"天治";i:83;s:6:"大治";i:84;s:6:"天承";i:85;s:6:"長承";i:86;s:6:"ä¿å»¶";i:87;s:6:"永治";i:88;s:6:"康治";i:89;s:6:"天養";i:90;s:6:"久安";i:91;s:6:"ä»å¹³";i:92;s:6:"久寿";i:93;s:6:"ä¿å…ƒ";i:94;s:6:"平治";i:95;s:6:"永暦";i:96;s:6:"å¿œä¿";i:97;s:6:"長寛";i:98;s:6:"永万";i:99;s:6:"ä»å®‰";i:100;s:6:"嘉応";i:101;s:6:"承安";i:102;s:6:"安元";i:103;s:6:"治承";i:104;s:6:"養和";i:105;s:6:"寿永";i:106;s:6:"元暦";i:107;s:6:"文治";i:108;s:6:"建久";i:109;s:6:"正治";i:110;s:6:"建ä»";i:111;s:6:"元久";i:112;s:6:"建永";i:113;s:6:"承元";i:114;s:6:"建暦";i:115;s:6:"建ä¿";i:116;s:6:"承久";i:117;s:6:"貞応";i:118;s:6:"å…ƒä»";i:119;s:6:"嘉禄";i:120;s:6:"安貞";i:121;s:6:"寛喜";i:122;s:6:"貞永";i:123;s:6:"天ç¦";i:124;s:6:"文暦";i:125;s:6:"嘉禎";i:126;s:6:"暦ä»";i:127;s:6:"延応";i:128;s:6:"ä»æ²»";i:129;s:6:"寛元";i:130;s:6:"å®æ²»";i:131;s:6:"建長";i:132;s:6:"康元";i:133;s:6:"正嘉";i:134;s:6:"正元";i:135;s:6:"文応";i:136;s:6:"弘長";i:137;s:6:"文永";i:138;s:6:"建治";i:139;s:6:"弘安";i:140;s:6:"正応";i:141;s:6:"æ°¸ä»";i:142;s:6:"正安";i:143;s:6:"乾元";i:144;s:6:"嘉元";i:145;s:6:"徳治";i:146;s:6:"延慶";i:147;s:6:"応長";i:148;s:6:"正和";i:149;s:6:"æ–‡ä¿";i:150;s:6:"元応";i:151;s:6:"元亨";i:152;s:6:"正中";i:153;s:6:"嘉暦";i:154;s:6:"元徳";i:155;s:6:"元弘";i:156;s:6:"建武";i:157;s:6:"延元";i:158;s:6:"興国";i:159;s:6:"正平";i:160;s:6:"建徳";i:161;s:6:"文中";i:162;s:6:"天授";i:163;s:6:"康暦";i:164;s:6:"弘和";i:165;s:6:"元中";i:166;s:6:"至徳";i:167;s:6:"嘉慶";i:168;s:6:"康応";i:169;s:6:"明徳";i:170;s:6:"応永";i:171;s:6:"正長";i:172;s:6:"永享";i:173;s:6:"嘉å‰";i:174;s:6:"文安";i:175;s:6:"å®å¾³";i:176;s:6:"享徳";i:177;s:6:"康正";i:178;s:6:"長禄";i:179;s:6:"寛正";i:180;s:6:"文正";i:181;s:6:"å¿œä»";i:182;s:6:"文明";i:183;s:6:"長享";i:184;s:6:"延徳";i:185;s:6:"明応";i:18
6;s:6:"文亀";i:187;s:6:"永正";i:188;s:6:"大永";i:189;s:6:"享禄";i:190;s:6:"天文";i:191;s:6:"弘治";i:192;s:6:"永禄";i:193;s:6:"元亀";i:194;s:6:"天正";i:195;s:6:"文禄";i:196;s:6:"慶長";i:197;s:6:"元和";i:198;s:6:"寛永";i:199;s:6:"æ­£ä¿";i:200;s:6:"慶安";i:201;s:6:"承応";i:202;s:6:"明暦";i:203;s:6:"万治";i:204;s:6:"寛文";i:205;s:6:"延å®";i:206;s:6:"天和";i:207;s:6:"貞享";i:208;s:6:"元禄";i:209;s:6:"å®æ°¸";i:210;s:6:"正徳";i:211;s:6:"享ä¿";i:212;s:6:"元文";i:213;s:6:"寛ä¿";i:214;s:6:"延享";i:215;s:6:"寛延";i:216;s:6:"å®æš¦";i:217;s:6:"明和";i:218;s:6:"安永";i:219;s:6:"天明";i:220;s:6:"寛政";i:221;s:6:"享和";i:222;s:6:"文化";i:223;s:6:"文政";i:224;s:6:"天ä¿";i:225;s:6:"弘化";i:226;s:6:"嘉永";i:227;s:6:"安政";i:228;s:6:"万延";i:229;s:6:"文久";i:230;s:6:"元治";i:231;s:6:"慶応";i:232;s:6:"明治";i:233;s:6:"大正";i:234;s:6:"昭和";i:235;s:6:"å¹³æˆ";}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}s:11:"zoneStrings";a:17:{i:0;a:6:{i:0;s:19:"America/Los_Angeles";i:1;s:18:"太平洋標準時";i:2;s:3:"PST";i:3;s:18:"太平洋å¤æ™‚é–“";i:4;s:3:"PDT";i:5;s:18:"ロサンゼルス";}i:1;a:6:{i:0;s:14:"America/Denver";i:1;s:15:"山地標準時";i:2;s:3:"MST";i:3;s:15:"山地å¤æ™‚é–“";i:4;s:3:"MDT";i:5;s:12:"デンãƒãƒ¼";}i:2;a:6:{i:0;s:15:"America/Phoenix";i:1;s:15:"山地標準時";i:2;s:3:"MST";i:3;s:15:"山地標準時";i:4;s:3:"MST";i:5;s:18:"フェニックス";}i:3;a:6:{i:0;s:15:"America/Chicago";i:1;s:15:"中部標準時";i:2;s:3:"CST";i:3;s:15:"中部å¤æ™‚é–“";i:4;s:3:"CDT";i:5;s:9:"ã‚·ã‚«ã‚´";}i:4;a:6:{i:0;s:16:"America/New_York";i:1;s:15:"æ±éƒ¨æ¨™æº–時";i:2;s:3:"EST";i:3;s:15:"æ±éƒ¨å¤æ™‚é–“";i:4;s:3:"EDT";i:5;s:18:"ニューヨーク";}i:5;a:6:{i:0;s:20:"America/Indianapolis";i:1;s:15:"æ±éƒ¨æ¨™æº–時";i:2;s:3:"EST";i:3;s:15:"æ±éƒ¨æ¨™æº–時";i:4;s:3:"EST";i:5;s:27:"インディアナãƒãƒªã‚¹";}i:6;a:6:{i:0;s:16:"Pacific/Honolulu";i:1;s:18:"ãƒãƒ¯ã‚¤æ¨™æº–時";i:2;s:3:"HST";i:3;s:18:"ãƒãƒ¯ã‚¤æ¨™æ
º–時";i:4;s:3:"HST";i:5;s:12:"ホノルル";}i:7;a:6:{i:0;s:17:"America/Anchorage";i:1;s:21:"アラスカ標準時";i:2;s:3:"AST";i:3;s:21:"アラスカå¤æ™‚é–“";i:4;s:3:"ADT";i:5;s:18:"アンカレッジ";}i:8;a:6:{i:0;s:15:"America/Halifax";i:1;s:18:"大西洋標準時";i:2;s:3:"AST";i:3;s:18:"大西洋å¤æ™‚é–“";i:4;s:3:"ADT";i:5;s:18:"ãƒãƒªãƒ•ã‚¡ã‚¯ã‚¹";}i:9;a:6:{i:0;s:16:"America/St_Johns";i:1;s:42:"ニューファンドランド島標準時";i:2;s:3:"CNT";i:3;s:42:"ニューファンドランド島å¤æ™‚é–“";i:4;s:3:"CDT";i:5;s:21:"セントジョンズ";}i:10;a:6:{i:0;s:12:"Europe/Paris";i:1;s:15:"中欧標準時";i:2;s:3:"CET";i:3;s:15:"中欧å¤æ™‚é–“";i:4;s:4:"CEST";i:5;s:6:"パリ";}i:11;a:6:{i:0;s:7:"Etc/GMT";i:1;s:24:"グリニッジ標準時";i:2;s:3:"GMT";i:3;s:24:"グリニッジ標準時";i:4;s:3:"GMT";i:5;s:12:"ロンドン";}i:12;a:6:{i:0;s:17:"Africa/Casablanca";i:1;s:24:"グリニッジ標準時";i:2;s:3:"GMT";i:3;s:24:"グリニッジ標準時";i:4;s:3:"GMT";i:5;s:18:"カサブランカ";}i:13;a:6:{i:0;s:14:"Asia/Jerusalem";i:1;s:24:"イスラエル標準時";i:2;s:3:"IST";i:3;s:24:"イスラエルå¤æ™‚é–“";i:4;s:3:"IDT";i:5;s:15:"エルサレム";}i:14;a:6:{i:0;s:10:"Asia/Tokyo";i:1;s:15:"日本標準時";i:2;s:3:"JST";i:3;s:15:"日本標準時";i:4;s:3:"JST";i:5;s:6:"æ±äº¬";}i:15;a:6:{i:0;s:16:"Europe/Bucharest";i:1;s:15:"æ±æ¬§æ¨™æº–時";i:2;s:3:"EET";i:3;s:15:"æ±æ¬§å¤æ™‚é–“";i:4;s:4:"EEST";i:5;s:15:"ブカレスト";}i:16;a:6:{i:0;s:13:"Asia/Shanghai";i:1;s:15:"中国標準時";i:2;s:3:"CTT";i:3;s:15:"中国標準時";i:4;s:3:"CDT";i:5;s:6:"上海";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ja_JP.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ja_JP.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ja_JP.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:16:"¤#,##0;-¤#,##0";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ja_JP_TRADITIONAL.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ja_JP_TRADITIONAL.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ja_JP_TRADITIONAL.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:8:"calendar";a:1:{s:7:"default";a:1:{i:0;s:8:"japanese";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kk.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kk.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kk.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:1:{s:2:"KZ";a:1:{i:0;s:18:"ҚазақÑтан";}}s:10:"Currencies";a:1:{s:3:"KZT";a:2:{i:0;s:7:"тңг.";i:1;s:3:"KZT";}}s:9:"Languages";a:1:{s:2:"kk";a:1:{i:0;s:10:"Қазақ";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Cyrl";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:4:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:23:"EEEE, d MMMM yyyy 'ж.'";i:5;s:17:"d MMMM yyyy 'ж.'";i:6;s:10:"dd.MM.yyyy";i:7;s:8:"dd.MM.yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:5:"жÑ.";i:1;s:5:"дÑ.";i:2;s:5:"ÑÑ.";i:3;s:5:"ÑÑ€.";i:4;s:5:"бÑ.";i:5;s:5:"жм.";i:6;s:5:"ÑÒ».";}s:4:"wide";a:7:{i:0;s:14:"жекÑені";i:1;s:16:"дуйÑенбі";i:2;s:16:"ÑейÑенбі";i:3;s:14:"Ñәренбі";i:4;s:16:"бейÑенбі";i:5;s:8:"жұма";i:6;s:10:"Ñенбі";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:7:"қаң.";i:1;s:7:"ақп.";i:2;s:7:"нау.";i:3;s:7:"Ñәу.";i:4;s:7:"мам.";i:5;s:7:"мау.";i:6;s:7:"шіл.";i:7;s:7:"там.";i:8;s:7:"қыр.";i:9;s:7:"қаз.";i:10;s:7:"қар.";i:11;s:9:"желт.";}s:4:"wide";a:12:{i:0;s:12:"қаңтар";i:1;s:10:"ақпан";i:2;s:12:"наурыз";i:3;s:10:"Ñәуір";i:4;s:10:"мамыр";i:5;s:12:"мауÑым";i:6;s:10:"шілде";i:7;s:10:"тамыз";i:8;s:16:"қыркүйек";i:9;s:10:"қазан";i:10;s:12:"қараша";i:11;s:18:"желтоқÑан";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kk_KZ.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kk_KZ.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kk_KZ.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-¤ #,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kl.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kl.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kl.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:1:{s:2:"GL";a:1:{i:0;s:16:"Kalaallit Nunaat";}}s:10:"Currencies";a:1:{s:3:"DKK";a:2:{i:0;s:2:"kr";i:1;s:3:"DKK";}}s:9:"Languages";a:1:{s:2:"kl";a:1:{i:0;s:11:"kalaallisut";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:3:"sab";i:1;s:3:"ata";i:2;s:3:"mar";i:3;s:3:"pin";i:4;s:3:"sis";i:5;s:3:"tal";i:6;s:3:"arf";}s:4:"wide";a:7:{i:0;s:6:"sabaat";i:1;s:14:"ataasinngorneq";i:2;s:13:"marlunngorneq";i:3;s:15:"pingasunngorneq";i:4;s:14:"sisamanngorneq";i:5;s:15:"tallimanngorneq";i:6;s:14:"arfininngorneq";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"jan";i:1;s:3:"feb";i:2;s:3:"mar";i:3;s:3:"apr";i:4;s:3:"maj";i:5;s:3:"jun";i:6;s:3:"jul";i:7;s:3:"aug";i:8;s:3:"sep";i:9;s:3:"okt";i:10;s:3:"nov";i:11;s:3:"dec";}s:4:"wide";a:12:{i:0;s:7:"januari";i:1;s:8:"februari";i:2;s:6:"martsi";i:3;s:6:"aprili";i:4;s:4:"maji";i:5;s:4:"juni";i:6;s:4:"juli";i:7;s:9:"augustusi";i:8;s:10:"septemberi";i:9;s:8:"oktoberi";i:10;s:9:"novemberi";i:11;s:9:"decemberi";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kl_GL.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kl_GL.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kl_GL.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:23:"¤#,##0.00;¤ -#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:9:"h:mm:ss a";i:1;s:9:"h:mm:ss a";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:17:"EEEE dd MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:9:"MMM dd,yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kn.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kn.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kn.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:6:{s:9:"Countries";a:8:{s:2:"AU";a:1:{i:0;s:30:"ಆಸà³à²Ÿà³à²°à³†à²²à²¿à²¯";}s:2:"CN";a:1:{i:0;s:9:"ಚೀನ";}s:2:"EE";a:1:{i:0;s:24:"ಎಸà³à²¤à³Šà²¨à²¿à²¯";}s:2:"IN";a:1:{i:0;s:12:"ಭಾರತ";}s:2:"MV";a:1:{i:0;s:46:"ಮಾಲà³à²¡à²¿à²µ ದà³à²µà³€à²ªà²—ಳà³";}s:2:"NP";a:1:{i:0;s:15:"ನೆಪಾಳ";}s:2:"SG";a:1:{i:0;s:21:"ಸಿಂಗಪà³à²°";}s:2:"TR";a:1:{i:0;s:18:"ತà³à²°à³à²•à²¿";}}s:10:"Currencies";a:1:{s:3:"INR";a:2:{i:0;s:6:"रà¥";i:1;s:3:"INR";}}s:9:"Languages";a:1:{s:2:"kn";a:1:{i:0;s:15:"ಕನà³à²¨à²¡";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Knda";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:11:"AmPmMarkers";a:2:{i:0;s:27:"ಪೂರà³à²µà²¾à²¹à³à²¨";i:1;s:21:"ಅಪರಾಹà³à²¨";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:4:"ರ.";i:1;s:7:"ಸೋ.";i:2;s:7:"ಮಂ.";i:3;s:7:"ಬà³.";i:4;s:7:"ಗà³.";i:5;s:7:"ಶà³.";i:6;s:10:"ಶನಿ.";}s:4:"wide";a:7:{i:0;s:18:"ರವಿವಾರ";i:1;s:18:"ಸೋಮವಾರ";i:2;s:21:"ಮಂಗಳವಾರ";i:3;s:18:"ಬà³à²§à²µà²¾à²°";i:4;s:21:"ಗà³à²°à³à²µà²¾à²°";i:5;s:24:"ಶà³à²•à³à²°à²µà²¾à²°";i:6;s:18:"ಶನಿವಾರ";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:15:"ಜನವರೀ";i:1;s:24:"ಫೆಬà³à²°à²µà²°à³€";i:2;s:18:"ಮಾರà³à²šà³";i:3;s:21:"ಎಪà³à²°à²¿à²²à³";i:4;s:6:"ಮೆ";i:5;s:12:"ಜೂನà³";i:6;s:12:"ಜà³à²²à³ˆ";i:7;s:18:"ಆಗಸà³à²Ÿà³";i:8;s:27:"ಸಪà³à²Ÿà³†à²‚ಬರà³";i:9;s:24:"ಅಕà³à²Ÿà³‹à²¬à²°à³";i:10;s:21:"ನವೆಂಬರà³";i:11;s:24:"ಡಿಸೆಂಬರà³";}s:4:"wide";a:12:{i:0;s:15:"ಜನವರೀ";i:1;s:24:"ಫೆಬà³à²°à²µà²°à³€";i:2;s:18:"ಮಾರà³à²šà³";i:3;s:21:"ಎಪà³à²°à²¿à²²à³";i:4;s:6:"ಮೆ";i:5;s:12:"ಜೂನà³";i:6;s:12:"ಜà³à²²à³ˆ";i:7;s:18:"ಆಗಸà³à²Ÿà³";i:8;s:27:"ಸಪà³à²Ÿà³†à²‚ಬರà³";i:9;s:24:"ಅಕà³à²Ÿà³‹à²¬à²°à³";i:10;s:21:"ನವೆಂಬರà³";i:11;s:24:"ಡಿಸೆಂಬರà³";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kn_IN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kn_IN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kn_IN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:28:"##,##,##0.###;-##,##,##0.###";i:1;s:32:"¤ ##,##,##0.00;-¤ ##,##,##0.00";i:2;s:10:"##,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:6:"d-M-yy";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:1;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ko.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ko.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ko.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:12:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:9:"안ë„ë¼";}s:2:"AE";a:1:{i:0;s:18:"ì•„ëžì—미리트";}s:2:"AF";a:1:{i:0;s:18:"아프가니스탄";}s:2:"AG";a:1:{i:0;s:19:"앤티가 바부다";}s:2:"AI";a:1:{i:0;s:9:"안길ë¼";}s:2:"AL";a:1:{i:0;s:12:"알바니아";}s:2:"AM";a:1:{i:0;s:15:"아르메니아";}s:2:"AN";a:1:{i:0;s:28:"네ëœëž€ë“œë ¹ 안틸레스";}s:2:"AO";a:1:{i:0;s:9:"앙골ë¼";}s:2:"AQ";a:1:{i:0;s:13:"남극 대륙";}s:2:"AR";a:1:{i:0;s:15:"아르헨티나";}s:2:"AS";a:1:{i:0;s:22:"아메리칸 사모아";}s:2:"AT";a:1:{i:0;s:15:"오스트리아";}s:2:"AU";a:1:{i:0;s:21:"오스트레ì¼ë¦¬ì•„";}s:2:"AW";a:1:{i:0;s:9:"아루바";}s:2:"AZ";a:1:{i:0;s:18:"아제르바ì´ìž”";}s:2:"BA";a:1:{i:0;s:31:"보스니아 헤르체고비나";}s:2:"BB";a:1:{i:0;s:15:"바베ì´ë„스";}s:2:"BD";a:1:{i:0;s:15:"방글ë¼ë°ì‹œ";}s:2:"BE";a:1:{i:0;s:9:"벨기ì—";}s:2:"BF";a:1:{i:0;s:18:"부르키나파소";}s:2:"BG";a:1:{i:0;s:12:"불가리아";}s:2:"BH";a:1:{i:0;s:9:"바레ì¸";}s:2:"BI";a:1:{i:0;s:9:"부룬디";}s:2:"BJ";a:1:{i:0;s:6:"베넹";}s:2:"BM";a:1:{i:0;s:9:"버뮤다";}s:2:"BN";a:1:{i:0;s:12:"브루나ì´";}s:2:"BO";a:1:{i:0;s:12:"볼리비아";}s:2:"BR";a:1:{i:0;s:9:"브ë¼ì§ˆ";}s:2:"BS";a:1:{i:0;s:9:"바하마";}s:2:"BT";a:1:{i:0;s:6:"부탄";}s:2:"BV";a:1:{i:0;s:6:"부베";}s:2:"BW";a:1:{i:0;s:12:"보츠와나";}s:2:"BY";a:1:{i:0;s:12:"벨ë¼ë£¨ìŠ¤";}s:2:"BZ";a:1:{i:0;s:9:"벨리즈";}s:2:"CA";a:1:{i:0;s:9:"ìºë‚˜ë‹¤";}s:2:"CC";a:1:{i:0;s:15:"코코스제ë„";}s:2:"CD";a:1:{i:0;s:21:"콩고민주공화국";}s:2:"CF";a:1:{i:0;s:19:"중앙 아프리카";}s:2:"CG";a:1:{i:0;s:6:"콩고";}s:2:"CH";a:1:{i:0;s:9:"스위스";}s:2:"CI";a:1:{i:0;s:18:"코트디부와르";}s:2:"CK";a:1:{i:0;s:9:"ì¿¡ì œë„";}s:2:"CL";a:1:{i:0;s:6:"ì¹ ë ˆ";}s:2:"CM";a:1:{i:0;s:9:"카메룬";}s:2:"CN";a:1:{i:0;s:6:"중국";}s:2:"CO";a:1:{i:0;s:12:"콜롬비아";}s:2:"CR";a:1:{i:0;s:15:"코스타리카";}s:2:"CU";a:1:{i:0;s:6:"ì¿ ë°”";}s:2:"CV";a:1:{i:0;s:15:"까뽀베르ë°";}s:2:"CX";a:1:{i:0;s:18:"í¬ë¦¬ìŠ¤ë§ˆìŠ¤ì„¬";}
s:2:"CY";a:1:{i:0;s:15:"사ì´í”„러스";}s:2:"CZ";a:1:{i:0;s:6:"ì²´ì½”";}s:2:"DE";a:1:{i:0;s:6:"ë…ì¼";}s:2:"DJ";a:1:{i:0;s:9:"지부티";}s:2:"DK";a:1:{i:0;s:9:"ë´ë§ˆí¬";}s:2:"DM";a:1:{i:0;s:12:"ë„미니카";}s:2:"DO";a:1:{i:0;s:22:"ë„미니카 공화국";}s:2:"DZ";a:1:{i:0;s:9:"알제리";}s:2:"EC";a:1:{i:0;s:15:"ì—ì¿ ì•„ë„르";}s:2:"EE";a:1:{i:0;s:15:"ì—스토니아";}s:2:"EG";a:1:{i:0;s:9:"ì´ì§‘트";}s:2:"EH";a:1:{i:0;s:12:"서사하ë¼";}s:2:"ER";a:1:{i:0;s:15:"ì—리트리아";}s:2:"ES";a:1:{i:0;s:9:"스페ì¸";}s:2:"ET";a:1:{i:0;s:15:"ì´ë””오피아";}s:2:"FI";a:1:{i:0;s:9:"핀란드";}s:2:"FJ";a:1:{i:0;s:6:"피지";}s:2:"FK";a:1:{i:0;s:18:"í¬í´ëžœë“œì œë„";}s:2:"FM";a:1:{i:0;s:21:"마ì´í¬ë¡œë„¤ì‹œì•„";}s:2:"FO";a:1:{i:0;s:12:"페로제ë„";}s:2:"FR";a:1:{i:0;s:9:"프랑스";}s:2:"GA";a:1:{i:0;s:6:"가봉";}s:2:"GB";a:1:{i:0;s:6:"ì˜êµ­";}s:2:"GD";a:1:{i:0;s:12:"그레나다";}s:2:"GE";a:1:{i:0;s:12:"그루지야";}s:2:"GF";a:1:{i:0;s:22:"프랑스령 기아나";}s:2:"GH";a:1:{i:0;s:6:"가나";}s:2:"GI";a:1:{i:0;s:12:"지브롤터";}s:2:"GL";a:1:{i:0;s:12:"그린란드";}s:2:"GM";a:1:{i:0;s:9:"ê°ë¹„ì•„";}s:2:"GN";a:1:{i:0;s:6:"기니";}s:2:"GP";a:1:{i:0;s:12:"과달로프";}s:2:"GQ";a:1:{i:0;s:13:"ì ë„ 기니";}s:2:"GR";a:1:{i:0;s:9:"그리스";}s:2:"GS";a:1:{i:0;s:46:"사우스조지아-사우스샌드위치제ë„";}s:2:"GT";a:1:{i:0;s:12:"과테ë§ë¼";}s:2:"GU";a:1:{i:0;s:3:"ê´Œ";}s:2:"GW";a:1:{i:0;s:12:"기네비ì˜";}s:2:"GY";a:1:{i:0;s:12:"ê°€ì´ì•„나";}s:2:"HK";a:1:{i:0;s:30:"í™ì½©, 중국 특별행정구";}s:2:"HM";a:1:{i:0;s:28:"허드섬-맥ë„ë„드제ë„";}s:2:"HN";a:1:{i:0;s:12:"온ë‘ë¼ìŠ¤";}s:2:"HR";a:1:{i:0;s:15:"í¬ë¡œì•„í‹°ì•„";}s:2:"HT";a:1:{i:0;s:9:"하ì´í‹°";}s:2:"HU";a:1:{i:0;s:9:"í—가리";}s:2:"ID";a:1:{i:0;s:15:"ì¸ë„네시아";}s:2:"IE";a:1:{i:0;s:12:"ì•„ì¼ëžœë“œ";}s:2:"IL";a:1:{i:0;s:12:"ì´ìŠ¤ë¼ì—˜";}s:2:"IN";a:1:{i:0;s:6:"ì¸ë„";}s:2:"IO";a:1:{i:0;s:27:"ì˜êµ­ë ¹ì¸ë„ì–‘ì‹ë¯¼ì§€";}s:2:"IQ";a:1:{i:0;s:9:"ì´ë¼í¬";}s:2:"IR";a:1:{i:0;s:6:"ì´ëž€";}s
:2:"IS";a:1:{i:0;s:15:"ì•„ì´ìŠ¬ëž€ë“œ";}s:2:"IT";a:1:{i:0;s:12:"ì´íƒˆë¦¬ì•„";}s:2:"JM";a:1:{i:0;s:12:"ìžë©”ì´ì¹´";}s:2:"JO";a:1:{i:0;s:9:"요르단";}s:2:"JP";a:1:{i:0;s:6:"ì¼ë³¸";}s:2:"KE";a:1:{i:0;s:6:"ì¼€ëƒ";}s:2:"KG";a:1:{i:0;s:18:"키르기스스탄";}s:2:"KH";a:1:{i:0;s:12:"캄보디아";}s:2:"KI";a:1:{i:0;s:12:"키리바시";}s:2:"KM";a:1:{i:0;s:9:"코모르";}s:2:"KN";a:1:{i:0;s:34:"세ì¸íŠ¸í¬ë¦¬ìŠ¤í† í¼ 네비스";}s:2:"KP";a:1:{i:0;s:36:"ì¡°ì„  ë¯¼ì£¼ì£¼ì˜ ì¸ë¯¼ 공화국";}s:2:"KR";a:1:{i:0;s:12:"대한민국";}s:2:"KW";a:1:{i:0;s:12:"쿠웨ì´íŠ¸";}s:2:"KY";a:1:{i:0;s:15:"ì¼€ì´ë§¨ì œë„";}s:2:"KZ";a:1:{i:0;s:15:"ì¹´ìží스탄";}s:2:"LA";a:1:{i:0;s:9:"ë¼ì˜¤ìŠ¤";}s:2:"LB";a:1:{i:0;s:9:"레바논";}s:2:"LC";a:1:{i:0;s:18:"세ì¸íŠ¸ë£¨ì‹œì•„";}s:2:"LI";a:1:{i:0;s:18:"리히í…슈타ì¸";}s:2:"LK";a:1:{i:0;s:12:"스리랑카";}s:2:"LR";a:1:{i:0;s:15:"ë¼ì´ë² ë¦¬ì•„";}s:2:"LS";a:1:{i:0;s:9:"레소토";}s:2:"LT";a:1:{i:0;s:15:"리투아니아";}s:2:"LU";a:1:{i:0;s:15:"룩셈부르í¬";}s:2:"LV";a:1:{i:0;s:12:"ë¼íŠ¸ë¹„ì•„";}s:2:"LY";a:1:{i:0;s:9:"리비아";}s:2:"MA";a:1:{i:0;s:9:"모로코";}s:2:"MC";a:1:{i:0;s:9:"모나코";}s:2:"MD";a:1:{i:0;s:9:"몰ë„ë°”";}s:2:"MG";a:1:{i:0;s:18:"마다가스카르";}s:2:"MH";a:1:{i:0;s:13:"마샬 êµ°ë„";}s:2:"MK";a:1:{i:0;s:18:"마케ë„니아어";}s:2:"ML";a:1:{i:0;s:6:"ë§ë¦¬";}s:2:"MM";a:1:{i:0;s:9:"미얀마";}s:2:"MN";a:1:{i:0;s:6:"몽골";}s:2:"MO";a:1:{i:0;s:33:"마카오, 중국 특별행정구";}s:2:"MP";a:1:{i:0;s:21:"ë¶ë§ˆë¦¬ì•„나제ë„";}s:2:"MQ";a:1:{i:0;s:12:"ë§í‹°ë‹ˆí¬";}s:2:"MR";a:1:{i:0;s:12:"모리타니";}s:2:"MS";a:1:{i:0;s:15:"몬트세ë¼íŠ¸";}s:2:"MT";a:1:{i:0;s:6:"몰타";}s:2:"MU";a:1:{i:0;s:12:"모리셔스";}s:2:"MV";a:1:{i:0;s:9:"몰디브";}s:2:"MW";a:1:{i:0;s:9:"ë§ë¼ìœ„";}s:2:"MX";a:1:{i:0;s:9:"멕시코";}s:2:"MY";a:1:{i:0;s:15:"ë§ë ˆì´ì§€ì•„";}s:2:"MZ";a:1:{i:0;s:12:"모잠비í¬";}s:2:"NA";a:1:{i:0;s:12:"나미비아";}s:2:"NC";a:1:{i:0;s:19:"뉴 칼레ë„니아";}s:2:"NE";a:1:{i:0;s:9:"니제르";}s:2:"NF";a:1:
{i:0;s:9:"ë…¸í½ì„¬";}s:2:"NG";a:1:{i:0;s:15:"나ì´ì§€ë¦¬ì•„";}s:2:"NI";a:1:{i:0;s:12:"니카ë¼ê³¼";}s:2:"NL";a:1:{i:0;s:12:"네ëœëž€ë“œ";}s:2:"NO";a:1:{i:0;s:12:"노르웨ì´";}s:2:"NP";a:1:{i:0;s:6:"네팔";}s:2:"NR";a:1:{i:0;s:9:"나우루";}s:2:"NU";a:1:{i:0;s:9:"니우ì—";}s:2:"NZ";a:1:{i:0;s:12:"뉴질랜드";}s:2:"OM";a:1:{i:0;s:6:"오만";}s:2:"PA";a:1:{i:0;s:9:"파나마";}s:2:"PE";a:1:{i:0;s:6:"페루";}s:2:"PF";a:1:{i:0;s:28:"프랑스령 í´ë¦¬ë„¤ì‹œì•„";}s:2:"PG";a:1:{i:0;s:18:"파푸아뉴기니";}s:2:"PH";a:1:{i:0;s:9:"필리핀";}s:2:"PK";a:1:{i:0;s:12:"파키스탄";}s:2:"PL";a:1:{i:0;s:9:"í´ëž€ë“œ";}s:2:"PM";a:1:{i:0;s:28:"세ì¸íŠ¸í”¼ì—르-미케롱";}s:2:"PN";a:1:{i:0;s:12:"í•ì¼€ì–¸ì„¬";}s:2:"PR";a:1:{i:0;s:18:"푸ì—르토리코";}s:2:"PS";a:1:{i:0;s:22:"íŒ”ë ˆìŠ¤íƒ€ì¸ ì§€êµ¬";}s:2:"PT";a:1:{i:0;s:12:"í¬ë¥´íŠ¸ì¹¼";}s:2:"PW";a:1:{i:0;s:9:"팔ë¼ìš°";}s:2:"PY";a:1:{i:0;s:12:"파ë¼ê³¼ì´";}s:2:"QA";a:1:{i:0;s:9:"카타르";}s:2:"RE";a:1:{i:0;s:12:"리유니온";}s:2:"RO";a:1:{i:0;s:12:"루마니아";}s:2:"RU";a:1:{i:0;s:9:"러시아";}s:2:"RW";a:1:{i:0;s:9:"르완다";}s:2:"SA";a:1:{i:0;s:21:"사우디아ë¼ë¹„ì•„";}s:2:"SB";a:1:{i:0;s:9:"솔로몬";}s:2:"SC";a:1:{i:0;s:9:"ì‰ì´ì‰˜";}s:2:"SD";a:1:{i:0;s:6:"수단";}s:2:"SE";a:1:{i:0;s:9:"스웨ë´";}s:2:"SG";a:1:{i:0;s:12:"싱가í¬ë¥´";}s:2:"SH";a:1:{i:0;s:18:"세ì¸íŠ¸í—¬ë ˆë‚˜";}s:2:"SI";a:1:{i:0;s:15:"슬로베니아";}s:2:"SJ";a:1:{i:0;s:31:"스발바르제ë„-얀마웬섬";}s:2:"SK";a:1:{i:0;s:15:"슬로바키아";}s:2:"SL";a:1:{i:0;s:15:"ì‹œì—ë¼ë¦¬ì˜¨";}s:2:"SM";a:1:{i:0;s:12:"산마리노";}s:2:"SN";a:1:{i:0;s:9:"세네갈";}s:2:"SO";a:1:{i:0;s:12:"소ë§ë¦¬ì•„";}s:2:"SP";a:1:{i:0;s:12:"세르비아";}s:2:"SR";a:1:{i:0;s:9:"수리남";}s:2:"ST";a:1:{i:0;s:22:"ìƒíˆ¬ë©” 프린시페";}s:2:"SV";a:1:{i:0;s:15:"엘살바ë„르";}s:2:"SY";a:1:{i:0;s:9:"시리아";}s:2:"SZ";a:1:{i:0;s:15:"스와질랜드";}s:2:"TC";a:1:{i:0;s:27:"í„°í¬ìŠ¤ì¼€ì´ì»¤ìŠ¤ì œë„";}s:2:"TD";a:1:{i:0;s:6:"차드";}s:2:"TF";a:1:{i:0;s:23:"프랑스 남부
 지방";}s:2:"TG";a:1:{i:0;s:6:"토고";}s:2:"TH";a:1:{i:0;s:6:"태국";}s:2:"TJ";a:1:{i:0;s:15:"타지키스탄";}s:2:"TK";a:1:{i:0;s:12:"토켈ë¼ìš°";}s:2:"TL";a:1:{i:0;s:12:"ë™í‹°ëª¨ë¥´";}s:2:"TM";a:1:{i:0;s:21:"투르í¬ë©”니스탄";}s:2:"TN";a:1:{i:0;s:9:"튀니지";}s:2:"TO";a:1:{i:0;s:6:"통가";}s:2:"TR";a:1:{i:0;s:6:"터키";}s:2:"TT";a:1:{i:0;s:25:"트리니다드 토바고";}s:2:"TV";a:1:{i:0;s:9:"투발루";}s:2:"TW";a:1:{i:0;s:6:"대만";}s:2:"TZ";a:1:{i:0;s:12:"탄ìžë‹ˆì•„";}s:2:"UA";a:1:{i:0;s:15:"ìš°í¬ë¼ì´ë‚˜";}s:2:"UG";a:1:{i:0;s:9:"우간다";}s:2:"UM";a:1:{i:0;s:23:"미국령 해외 ì œë„";}s:2:"US";a:1:{i:0;s:6:"미국";}s:2:"UY";a:1:{i:0;s:12:"우루과ì´";}s:2:"UZ";a:1:{i:0;s:18:"우즈베키스탄";}s:2:"VA";a:1:{i:0;s:9:"바티칸";}s:2:"VC";a:1:{i:0;s:30:"세ì¸íŠ¸ë¹ˆì„¼íŠ¸ê·¸ë ˆë‚˜ë”˜";}s:2:"VE";a:1:{i:0;s:15:"베네수엘ë¼";}s:2:"VG";a:1:{i:0;s:29:"ì˜êµ­ë ¹ 버진 ì•„ì¼ëžœë“œ";}s:2:"VI";a:1:{i:0;s:29:"미국령 버진 ì•„ì¼ëžœë“œ";}s:2:"VN";a:1:{i:0;s:9:"베트남";}s:2:"VU";a:1:{i:0;s:12:"바누아투";}s:2:"WF";a:1:{i:0;s:26:"왈리스-푸투나 ì œë„";}s:2:"WS";a:1:{i:0;s:9:"사모아";}s:2:"YE";a:1:{i:0;s:6:"예멘";}s:2:"YT";a:1:{i:0;s:9:"마요티";}s:2:"YU";a:1:{i:0;s:18:"유고슬ë¼ë¹„ì•„";}s:2:"ZA";a:1:{i:0;s:15:"남아프리카";}s:2:"ZM";a:1:{i:0;s:9:"잠비아";}s:2:"ZW";a:1:{i:0;s:12:"ì§ë°”브웨";}}s:10:"Currencies";a:348:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:19:"안ë„ë¼ ë””ë„¤ë¥´";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:19:"안ë„ë¼ íŽ˜ì„¸íƒ€";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:31:"ì•„ëžì—미레ì´íŠ¸ 디나르";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:24:"아프가니 (1927-2002)";}s:3:"AFN";a:2:{i:0;s:3:"AFN";i:1;s:12:"아프가니";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:32:"아파르와 ì´ì‚¬ìŠ¤ì˜ 프랑";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:31:"알바니아 ë ˆí¬ (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"ALL";i:1;s:19:"알바니아 ë ˆí¬";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:29:"알바니아 ë ˆí¬ ë°œë£¨íŠ¸";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:29:"알바니ì•
„ 달러 태환권";}s:3:"AMD";a:2:{i:0;s:3:"AMD";i:1;s:22:"아르메니아 드람";}s:3:"ANG";a:2:{i:0;s:3:"ANG";i:1;s:32:"네ë¸ëž€ë“œ 안틸레스 êµ´ë´";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:16:"ì•™ê³¨ë¼ ì½´ìž";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:28:"ì•™ê³¨ë¼ ì½´ìž (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:35:"ì•™ê³¨ë¼ ì‹ ê·„ ì½´ìž (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:39:"ì•™ê³¨ë¼ ì½´ìž Reajustado (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:22:"ì•™ê³¨ë¼ ì—스쿠ë„";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:28:"아르헨티나 오스트랄";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:39:"아르헨티나 페소 모네다 êµ­ì˜";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:34:"아르헨티나 페소 (1983-1985)";}s:3:"ARS";a:2:{i:0;s:3:"ARS";i:1;s:22:"아르헨티나 페소";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:13:"호주 실ë§";}s:3:"AUD";a:2:{i:0;s:3:"AUD";i:1;s:13:"호주 달러";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:16:"호주 파운드";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:16:"아루바 길ë”";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:28:"아제르바ì´ì   마나트";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:41:"보스니아-헤르체고비나 디나르";}s:3:"BAM";a:2:{i:0;s:3:"BAM";i:1;s:48:"보스니아-헤르체고비나 태환 마르í¬";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:45:"보스니아-헤르체고비나 ì‹  디나르";}s:3:"BBD";a:2:{i:0;s:3:"BBD";i:1;s:22:"바베ì´ë„스 달러";}s:3:"BDT";a:2:{i:0;s:3:"BDT";i:1;s:22:"방글ë¼ë°ì‹œ 타카";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:25:"ë²¨ê¸°ì— í”„ëž‘ (태환)";}s:3:"BEF";a:2:{i:0;s:3:"BEF";i:1;s:16:"ë²¨ê¸°ì— í”„ëž‘";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:25:"ë²¨ê¸°ì— í”„ëž‘ (금융)";}s:3:"BGL";a:2:{i:0;s:3:"BGL";i:1;s:23:"불가리아 ë™ì „ ë ›";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:29:"불가리아 ì‚¬íšŒì£¼ì˜ ë ›";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:23:"불가리아 신권 ë ›";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:28:"불가리아 ë › (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:26:"불가리아 ë › 태환권";}s:3:"BHD";a:2:{i:0;s:3:"BHD";i:1;
s:19:"ë°”ë ˆì¸ ë””ë‚˜ë¥´";}s:3:"BIF";a:2:{i:0;s:3:"BIF";i:1;s:16:"부룬디 프랑";}s:3:"BMD";a:2:{i:0;s:3:"BMD";i:1;s:16:"버뮤다 달러";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:19:"버뮤다 파운드";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:19:"ë¶€ë£¨ë‚˜ì´ ë‹¬ëŸ¬";}s:3:"BOB";a:2:{i:0;s:3:"BOB";i:1;s:15:"볼리비아노";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:27:"볼리비아노 (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:22:"볼리비아노 페소";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:51:"볼리비아노  í¬ë£¨ì œì´ë£¨ 노보 (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:22:"브ë¼ì§ˆ í¬ë£¨ìžë‘";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:37:"브ë¼ì§ˆ í¬ë£¨ì œì´ë£¨ (1990-1993)";}s:3:"BRL";a:2:{i:0;s:3:"BRL";i:1;s:16:"브ë¼ì§ˆ 레알";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:29:"브ë¼ì§ˆ í¬ë£¨ìžë‘ 노보";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:25:"브ë¼ì§ˆ í¬ë£¨ì œì´ë£¨";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:37:"브ë¼ì§ˆ í¬ë£¨ì œì´ë£¨ (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:16:"바하마 달러";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:26:"바하마 달러 파운드";}s:3:"BTN";a:2:{i:0;s:3:"BTN";i:1;s:16:"부탄 눌투눔";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:13:"부탄 루피";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:13:"버마 차트";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:13:"버마 루피";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:19:"보츠와나 í´ë¼";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:38:"벨ë¼ë£¨ìŠ¤ 신권 루블 (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:31:"벨ë¼ë£¨ìŠ¤ 루블 (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"BYR";i:1;s:19:"벨ë¼ë£¨ìŠ¤ 루블";}s:3:"BZD";a:2:{i:0;s:3:"BZD";i:1;s:16:"벨리즈 달러";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:29:"ì˜êµ­ë ¹ 혼ë‘ë¼ìŠ¤ 달러";}s:3:"CAD";a:2:{i:0;s:3:"CAD";i:1;s:16:"ìºë‚˜ë‹¤ 달러";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:26:"콩고 프랑 콩골ë¼ìŠ¤";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:23:"콩고 공화국 프랑";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:16:"콩고 ìžì´ë¥´";}s:3:"CHF";a:2:{i:0;s:3:"CHF";i:1;s:22:"스위스 프랑달러";}s:3:"CKD";a:2:{
i:0;s:3:"CKD";i:1;s:17:"ì¿¡ ì œë„ ë‹¬ëŸ¬";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:16:"ì¹ ë ˆ 콘ë„르";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:19:"ì¹ ë ˆ ì—스쿠ë„";}s:3:"CLP";a:2:{i:0;s:3:"CLP";i:1;s:13:"ì¹ ë ˆ 페소";}s:3:"CNY";a:2:{i:0;s:3:"CNY";i:1;s:23:"중국 위안 ì¸ë¯¼í";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:26:"콜롬비아 지í 페소";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:17:"콩고 CFA 프랑";}s:3:"COP";a:2:{i:0;s:3:"COP";i:1;s:19:"콜롬비아 페소";}s:3:"CRC";a:2:{i:0;s:3:"CRC";i:1;s:22:"코스타리카 콜론";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:31:"체코슬로바키아 코루나";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:38:"체코슬로바키아 ë™ì „ 코루나";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:13:"ì¿ ë°” 페소";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:26:"ì¿ ë°” 태환권 마르í¬";}s:3:"CVE";a:2:{i:0;s:3:"CVE";i:1;s:28:"ì¹´ë³´ë² ë¥´ë° ì—스쿠ë„";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:19:"ì¿ ë¼ì¹´ì˜¤ 길ë”";}s:3:"CYP";a:2:{i:0;s:3:"CYP";i:1;s:25:"싸ì´í”„러스 파운드";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:26:"ì²´ì½” 공화국 코루나";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:25:"ë™ë… 오스트마르í¬";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:16:"ë…ì¼ ë§ˆë¥´í¬";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:22:"ë…ì¼ ìŠ¤í¼ë§ˆë¥´í¬";}s:3:"DJF";a:2:{i:0;s:3:"DJF";i:1;s:16:"지부티 프랑";}s:3:"DKK";a:2:{i:0;s:3:"DKK";i:1;s:19:"ë´ë§ˆí¬ í¬ë¡œë„¤";}s:3:"DOP";a:2:{i:0;s:3:"DOP";i:1;s:19:"ë„미니카 페소";}s:3:"DZD";a:2:{i:0;s:3:"DZD";i:1;s:19:"알제리 디나르";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:23:"알제리 신권 프랑";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:29:"알제리 프랑 제르미날";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:25:"ì—ì¿ ì•„ë„르 수í¬ë ˆ";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:22:"ì—스토니아 í¬ë£¬";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:19:"ì´ì§‘트 파운드";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:25:"ì—리트리아 나í¬íŒŒ";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:19:"ìŠ¤íŽ˜ì¸ íŽ˜ì„¸íƒ€";}s:3:"ETB";a:2:{i:0;s:3:"ETB";i:1;s:22:"ì´ë””오피아 비르";}s:3:"ETD";a:2:{i:0;s:
3:"ETD";i:1;s:22:"ì´ë””오피아 달러";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:9:"유로화";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:19:"핀란드 마르카";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:31:"핀란드 마르카 (1860-1962)";}s:3:"FJD";a:2:{i:0;s:3:"FJD";i:1;s:13:"피지 달러";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:16:"피지 파운드";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:28:"í¬í´ëžœë“œì œë„ 파운드";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:22:"íŽ˜ë¡œì œë„ í¬ë¡œë„ˆ";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:16:"프랑스 프랑";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:49:"프랑스 프랑 제르미날/프랑 í¬ì•™ì¹´ë ˆ";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:17:"가봉 CFA 프랑";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:29:"ì˜êµ­ë ¹ 파운드 스털ë§";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:29:"그루지야 지í ë¼ë¦¬íŠ¸";}s:3:"GEL";a:2:{i:0;s:3:"GEL";i:1;s:19:"그루지야 ë¼ë¦¬";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:13:"가나 시디";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:20:"가나 구권 시디";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:16:"가나 파운드";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:23:"가나 재í‰ê°€ 시디";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:22:"지브롤터 파운드";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:22:"그린란드 í¬ë¡œë„¤";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:19:"ê°ë¹„ì•„ 달ë¼ì‹œ";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:19:"ê°ë¹„ì•„ 파운드";}s:3:"GNF";a:2:{i:0;s:3:"GNF";i:1;s:13:"기니 프랑";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:25:"기니 프랑 (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:13:"기니 시리";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:19:"과달로프 프랑";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:20:"ì ë„ 기니 프랑";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:36:"ì ë„ 기니 페세타 기니아나";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:22:"그리스 ë“œë¼í¬ë§ˆ";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:29:"그리스 신권 ë“œë¼í¬ë§ˆ";}s:3:"GTQ";a:2:{i:0;s:3:"GTQ";i:1;s:22:"과테ë§ë¼ 케트살";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:42:"프랑스령 ê°€ì´ì•„나 프랑 기아나";}s:3:"GWE";a:2
:{i:0;s:3:"GWE";i:1;s:35:"í¬ë¥´íˆ¬ê°ˆë ¹ 기니 ì—스쿠ë„";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:36:"í¬ë¥´íˆ¬ê°ˆë ¹ 기니 ë°€ ë ˆì´ìŠ¤";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:19:"ê¸°ë„¤ë¹„ì˜ íŽ˜ì†Œ";}s:3:"GYD";a:2:{i:0;s:3:"GYD";i:1;s:19:"ê°€ì´ì•„나 달러";}s:3:"HKD";a:2:{i:0;s:3:"HKD";i:1;s:13:"í™ì½© 달러";}s:3:"HNL";a:2:{i:0;s:3:"HNL";i:1;s:22:"온ë‘ë¼ìŠ¤ 렘피ë¼";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:25:"í¬ë¡œì•„í‹°ì•„ 디나르";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:22:"í¬ë¡œì•„í‹°ì•„ 쿠나";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:19:"하ì´í‹° 구르드";}s:3:"HUF";a:2:{i:0;s:3:"HUF";i:1;s:19:"í—가리 í¬ë¦°íŠ¸";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:29:"ë¶ë¶€ ì•„ì¼ëžœë“œ 파운드";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:29:"ì¸ë„네시아 니카 길ë”";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:32:"ì¸ë„네시아 ìžë°” 루피아";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:32:"ì¸ë„네시아 신권 루피아";}s:3:"IDR";a:2:{i:0;s:3:"IDR";i:1;s:25:"ì¸ë„네시아 루피아";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:22:"ì•„ì¼ëžœë“œ 파운드";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:19:"ì´ìŠ¤ë¼ì—˜ 세켈";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:22:"ì´ìŠ¤ë¼ì—˜ 파운드";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:26:"ì´ìŠ¤ë¼ì—˜ 신권 세켈";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:26:"ë§¨ë„ íŒŒìš´ë“œ 스털ë§";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:13:"ì¸ë„ 루피";}s:3:"IQD";a:2:{i:0;s:3:"IQD";i:1;s:19:"ì´ë¼í¬ 디나르";}s:3:"IRR";a:2:{i:0;s:3:"IRR";i:1;s:13:"ì´ëž€ 리얄";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:25:"ì•„ì´ìŠ¬ëž€ë“œ í¬ë¡œë‚˜";}s:3:"ITL";a:2:{i:0;s:3:"ITL";i:1;s:19:"ì´íƒˆë¦¬ì•„ 리ë¼";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:26:"저지 파운드 스털ë§";}s:3:"JMD";a:2:{i:0;s:3:"JMD";i:1;s:19:"ìžë©”ì´ì¹´ 달러";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:22:"ìžë©”ì´ì¹´ 파운드";}s:3:"JOD";a:2:{i:0;s:3:"JOD";i:1;s:19:"요르단 디나르";}s:3:"JPY";a:2:{i:0;s:3:"ï¿¥";i:1;s:13:"ì¼ë³¸ 엔화";}s:3:"KES";a:2:{i:0;s:3:"KES";i:1;s:13:"ì¼€ëƒ ì‹¤ë§";}s:3:"KGS";a:2:{i:0;s:3:"KGS";i:1;s:22:"키르기ìŠ
¤ìŠ¤íƒ„ 솜";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:26:"캄보디아 구권 리얄";}s:3:"KHR";a:2:{i:0;s:3:"KHR";i:1;s:19:"캄보디아 리얄";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:19:"키리바시 달러";}s:3:"KMF";a:2:{i:0;s:3:"KMF";i:1;s:16:"코모르 프랑";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:40:"ì¡°ì„  ë¯¼ì£¼ì£¼ì˜ ì¸ë¯¼ 공화국 ì›";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:40:"ì¡°ì„  ë¯¼ì£¼ì£¼ì˜ ì¸ë¯¼ 공화국 ì›";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:16:"대한민국 환";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:23:"대한민국 구권 ì›";}s:3:"KRW";a:2:{i:0;s:3:"₩";i:1;s:16:"대한민국 ì›";}s:3:"KWD";a:2:{i:0;s:3:"KWD";i:1;s:22:"쿠웨ì´íŠ¸ 디나르";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:23:"ì¼€ì´ë§¨ ì œë„ ë‹¬ëŸ¬";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:22:"ì¹´ìží스탄 루블";}s:3:"KZT";a:2:{i:0;s:3:"KZT";i:1;s:22:"ì¹´ìží스탄 í…게";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:16:"ë¼ì˜¤ìŠ¤ 키프";}s:3:"LBP";a:2:{i:0;s:3:"LBP";i:1;s:19:"레바논 파운드";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:25:"리히í…ìŠˆíƒ€ì¸ í”„ëž‘";}s:3:"LKR";a:2:{i:0;s:3:"LKR";i:1;s:19:"스리랑카 루피";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:13:"실론 루피";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:22:"ë¼ì´ë² ë¦¬ì•„ 달러";}s:3:"LSL";a:2:{i:0;s:3:"LSL";i:1;s:16:"레소토 로티";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:22:"리투아니아 리타";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:25:"ë£©ì…ˆë¶€ë¥´í¬ íƒ€ë¡œë‚˜";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:22:"ë£©ì…ˆë¶€ë¥´í¬ í”„ëž‘";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:19:"ë¼íŠ¸ë¹„ì•„ ë¼íŠ¸";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:19:"ë¼íŠ¸ë¹„ì•„ 루블";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:33:"리비아 ì˜êµ­ 군사령 리ë¼";}s:3:"LYD";a:2:{i:0;s:3:"LYD";i:1;s:19:"리비아 디나르";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:19:"리비아 파운드";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:16:"모로코 디렘";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:16:"모로코 프랑";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:23:"모나코 프랑 누보";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:29:"모나코 프랑 제르미
ë‚ ";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:23:"몰ë„ë°” ë ˆì´ ì§€í";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:16:"몰ë„ë°” ë ˆì´";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:23:"몰ë„ë°” 루블 지í";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:31:"마다가스카르 아리아리";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:25:"마다가스카르 프랑";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:20:"마샬 êµ°ë„ ë‹¬ëŸ¬";}s:3:"MKD";a:2:{i:0;s:3:"MKD";i:1;s:25:"마케ë„니아 디나르";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:37:"마케ë„니아 디나르 (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:13:"ë§ë¦¬ 프랑";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:16:"미얀마 키ì–";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:26:"미얀마 달러 태환권";}s:3:"MNT";a:2:{i:0;s:3:"MNT";i:1;s:16:"몽골 투그릭";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:19:"마카오 파타카";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:19:"ë§í‹°ë‹ˆí¬ 프랑";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:22:"모리타니 우기야";}s:3:"MTL";a:2:{i:0;s:3:"MTL";i:1;s:13:"몰타 리ë¼";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:16:"몰타 파운드";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:19:"모리셔스 루피";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:23:"몰디브 ì œë„ ë£¨í”¼";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:26:"몰디브 ì œë„ ë£¨í”¼ì•„";}s:3:"MWK";a:2:{i:0;s:3:"MWK";i:1;s:16:"ë§ë¼ìœ„ ì½°ì³";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:19:"ë§ë¼ìœ„ 파운드";}s:3:"MXN";a:2:{i:0;s:3:"MXN";i:1;s:16:"멕시코 페소";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:35:"멕시코 실버 페소 (1861-1992)";}s:3:"MYR";a:2:{i:0;s:3:"MYR";i:1;s:25:"ë§ë ˆì´ì§€ì•„ ë§ê¸°íŠ¸";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:25:"ëª¨ìž ë¹„í¬ ì—스쿠ë„";}s:3:"MZM";a:2:{i:0;s:3:"MZM";i:1;s:22:"ëª¨ìž ë¹„í¬ ë©”í‹°ì¹¼";}s:3:"NAD";a:2:{i:0;s:3:"NAD";i:1;s:19:"나미비아 달러";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:39:"뉴 칼레ë„니아 프랑 제르미날";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:19:"니제르 나ì´ë¼";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:19:"니제르 파운드";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:25:"니카ë¼ê³¼ 코르ë
„ë°”";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:32:"니카ë¼ê³¼ 코르ë„ë°” 오로";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:19:"네ë¸ëž€ë“œ 길ë”";}s:3:"NOK";a:2:{i:0;s:3:"NOK";i:1;s:22:"ë…¸ë¥´ì›¨ì´ í¬ë¡œë„¤";}s:3:"NPR";a:2:{i:0;s:3:"NPR";i:1;s:13:"네팔 루피";}s:3:"NZD";a:2:{i:0;s:3:"NZD";i:1;s:19:"뉴질랜드 달러";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:22:"뉴질랜드 파운드";}s:3:"OMR";a:2:{i:0;s:3:"OMR";i:1;s:13:"오만 리얄";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:23:"오만 리얄 사ì´ë””";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:19:"파나마 발보아";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:13:"페루 ì¸í‹°";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:20:"페루 솔 누ì—ë³´";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:10:"페루 솔";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:25:"파푸아뉴기니 키나";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:16:"필리핀 페소";}s:3:"PKR";a:2:{i:0;s:3:"PKR";i:1;s:19:"파키스탄 루피";}s:3:"PLN";a:2:{i:0;s:3:"PLN";i:1;s:19:"í´ëž€ë“œ ì¦ë¡œí‹°";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:31:"í´ëž€ë“œ ì¦ë¡œí‹° (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:25:"íŒ”ë ˆìŠ¤íƒ€ì¸ íŒŒìš´ë“œ";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:19:"í¬ë¥´íˆ¬ê°ˆ 콘토";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:25:"í¬ë¥´íˆ¬ê°ˆ ì—스쿠ë„";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:22:"파ë¼ê³¼ì´ ê³¼ë¼ë‹ˆ";}s:3:"QAR";a:2:{i:0;s:3:"QAR";i:1;s:16:"카타르 리얄";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:19:"리유니온 프랑";}s:3:"ROL";a:2:{i:0;s:3:"ROL";i:1;s:19:"루마니아 ë ˆì´";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:26:"루마니아 신권 ë ˆì´";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:16:"러시아 루블";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:28:"러시아 루블 (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:16:"르완다 프랑";}s:3:"SAR";a:2:{i:0;s:3:"SAR";i:1;s:28:"사우디아ë¼ë¹„ì•„ 리얄";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:38:"사우디아ë¼ë¹„ì•„ ìžì¹˜ë ¹ 리얄";}s:3:"SBD";a:2:{i:0;s:3:"SBD";i:1;s:23:"솔로몬 ì œë„ ë‹¬ëŸ¬";}s:3:"SCR";a:2:{i:0;s:3:"SCR";i:1;s:16:"세ì´ì‰´ 루피";}s:3:"SDD";a:2:{i:0;s:3:"S
DD";i:1;s:16:"수단 디나르";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:16:"수단 파운드";}s:3:"SEK";a:2:{i:0;s:3:"SEK";i:1;s:19:"ìŠ¤ì›¨ë´ í¬ë¡œë‚˜";}s:3:"SGD";a:2:{i:0;s:3:"SGD";i:1;s:16:"ì‹±ê°€í´ ë‹¬ëŸ¬";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:28:"세ì¸íŠ¸í—¬ë ˆë‚˜ 파운드";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:32:"슬로베니아 톨ë¼ë¥´ 본스";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:25:"슬로베니아 톨ë¼ë¥´";}s:3:"SKK";a:2:{i:0;s:3:"SKK";i:1;s:25:"슬로바키아 코루나";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:22:"ì‹œì—ë¼ë¦¬ì˜¨ 리온";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:19:"산마리노 리ë¼";}s:3:"SOS";a:2:{i:0;s:3:"SOS";i:1;s:19:"소ë§ë¦¬ì•„ 실ë§";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:22:"소ë§ë¦¬ëžœë“œ 실ë§";}s:3:"SRG";a:2:{i:0;s:3:"SRG";i:1;s:16:"수리남 길ë”";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:25:"스코틀랜드 파운드";}s:3:"STD";a:2:{i:0;s:3:"STD";i:1;s:32:"ìƒíˆ¬ë©” 프린시페 ë„브ë¼";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:35:"ìƒíˆ¬ë©” 프린시페 ì—스쿠ë„";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:20:"소련 신권 루블";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:13:"소련 루블";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:22:"엘살바ë„르 콜론";}s:3:"SYP";a:2:{i:0;s:3:"SYP";i:1;s:19:"시리아 파운드";}s:3:"SZL";a:2:{i:0;s:3:"SZL";i:1;s:28:"스와질란드 릴랑게니";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:31:"í„°í¬ìŠ¤ì¼€ì´ì»¤ìŠ¤ í¬ë¼ìš´";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:13:"태국 바트";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:22:"타지키스탄 루블";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:25:"타지키스탄 소모니";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:31:"투르í¬ë©”니스탄 마나트";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:19:"튀니지 디나르";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:26:"통가 파운드 스털ë§";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:22:"티모르 ì—스쿠ë„";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:19:"티모르 파타카";}s:3:"TRL";a:2:{i:0;s:3:"TRL";i:1;s:13:"터기 리ë¼";}s:3:"TTD";a:2:{i:0;s:3:"TTD";i:1;s:32:"트리니다드 토바고 달러";}s:3:"TT
O";a:2:{i:0;s:3:"TTO";i:1;s:39:"트리니다드 토바고 구권 달러";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:16:"투발루 달러";}s:3:"TWD";a:2:{i:0;s:3:"TWD";i:1;s:20:"대만 신권 달러";}s:3:"TZS";a:2:{i:0;s:3:"TZS";i:1;s:19:"탄ìžë‹ˆì•„ 실ë§";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:28:"ìš°í¬ë¼ì´ë‚˜ 그리브나";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:28:"우간다 ì‹¤ë§ (1966-1987)";}s:3:"UGX";a:2:{i:0;s:3:"UGX";i:1;s:16:"우간다 실ë§";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:13:"미국 달러";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:32:"ìš°ë£¨ê³¼ì´ íŽ˜ì†Œ 푸ì—르떼";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:31:"ìš°ë£¨ê³¼ì´ íŽ˜ì†Œ (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"UYU";i:1;s:32:"ìš°ë£¨ê³¼ì´ íŽ˜ì†Œ 우루과요";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:29:"우즈베키스탄 숨 ì¿ í°";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:22:"우즈베키스탄 숨";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:16:"바티칸 리ë¼";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:37:"ë¶ ë² íŠ¸ë‚¨ 피아스타 ë™ ë² íŠ¸";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:24:"ë¶ ë² íŠ¸ë‚¨ 신권 ë™";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:47:"ë¶ ë² íŠ¸ë‚¨ 베트민 피아스타 ë™ ë² íŠ¸";}s:3:"VEB";a:2:{i:0;s:3:"VEB";i:1;s:28:"ë² ë„¤ì£¼ì—˜ë¼ ë³¼ë¦¬ë°”ë¥´";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:36:"ì˜êµ­ë ¹ 버진 ì•„ì¼ëžœë“œ 달러";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:13:"베트남 ë™";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:20:"베트남 신권 ë™";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:23:"베트남 공화국 ë™";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:20:"베트남 êµ­ì˜ ë™";}s:3:"VUV";a:2:{i:0;s:3:"VUV";i:1;s:19:"바누아투 바투";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:23:"ì„œ 사모아 파운드";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:20:"ì„œ 사모아 탈ë¼";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:33:"아시아 디나르 계산 단위";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:37:"아시아 기금 ì—°í•© 통화 단위";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:3:"금";}s:3:"XCD";a:2:{i:0;s:3:"XCD";i:1;s:19:"ë™ì¹´ë¦¬ë¸Œ 달러";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:15:"특별ì¸ì¶œê¶
Œ";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:20:"유럽 환율 단위";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:21:"프랑스 Gold 프랑";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:20:"프랑스 UIC-프랑";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:19:"ì´ìŠ¬ëžŒ 디나르";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:42:"프랑스 메트로í´ë¦¬íƒ„ 누보 프랑";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:16:"예멘 디나르";}s:3:"YER";a:2:{i:0;s:3:"YER";i:1;s:13:"예멘 리알";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:35:"유고슬ë¼ë¹„ì•„ ë™ì „ 디나르";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:35:"유고슬ë¼ë¹„ì•„ ì—°í•© 디나르";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:33:"유고슬ë¼ë¹„ì•„ 1994 디나르";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:35:"유고슬ë¼ë¹„ì•„ 노비 디나르";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:35:"유고슬ë¼ë¹„ì•„ 전환 디나르";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:34:"유고슬ë¼ë¹„ì•„ 10ì›” 디나르";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:35:"유고슬ë¼ë¹„ì•„ 개량 디나르";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:31:"남아프리카 랜드 (금융)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:25:"남아프리카 파운드";}s:3:"ZAR";a:2:{i:0;s:3:"ZAR";i:1;s:22:"남아프리카 랜드";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:16:"쟘비아 ì½°ì³";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:19:"쟘비아 파운드";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:26:"ìžì´ë¥´ 신권 ìžì´ë¥´";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:19:"ìžì´ë¥´ ìžì´ë¥´";}s:3:"ZWD";a:2:{i:0;s:3:"ZWD";i:1;s:19:"ì§ë¹„브웨 달러";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:6:"달력";}s:9:"collation";a:1:{i:0;s:6:"ì¡°í•©";}s:8:"currency";a:1:{i:0;s:6:"통화";}}s:9:"Languages";a:464:{s:2:"aa";a:1:{i:0;s:12:"아파르어";}s:2:"ab";a:1:{i:0;s:12:"압카즈어";}s:3:"ace";a:1:{i:0;s:9:"ì•„ì²´ì–´";}s:3:"ach";a:1:{i:0;s:12:"아콜리어";}s:3:"ada";a:1:{i:0;s:12:"아당메어";}s:3:"ady";a:1:{i:0;s:12:"아닥헤어";}s:2:"af";a:1:{i:0;s:19:"남아공 공용어";}s:3:"afa";a:1:{i:0;s:34:"아시아-아프리카어 (기타)";}s:3:"afh";a:1:{i:0;s:18:"아프리히리어";}s:2:"a
k";a:1:{i:0;s:9:"아칸어";}s:3:"akk";a:1:{i:0;s:12:"아카드어";}s:3:"ale";a:1:{i:0;s:12:"알류트어";}s:3:"alg";a:1:{i:0;s:12:"알콘킨어";}s:2:"am";a:1:{i:0;s:12:"암하ë¼ì–´";}s:2:"an";a:1:{i:0;s:12:"ì•„ë¼ê³¤ì–´";}s:3:"ang";a:1:{i:0;s:27:"ì´ì „ ì˜ì–´ (ca.450-1100)";}s:3:"apa";a:1:{i:0;s:12:"아파치어";}s:2:"ar";a:1:{i:0;s:9:"ì•„ëžì–´";}s:3:"arc";a:1:{i:0;s:9:"아람어";}s:3:"arn";a:1:{i:0;s:15:"ì•„ë¼ìš°ì¹¸ì–´";}s:3:"arp";a:1:{i:0;s:15:"ì•„ë¼íŒŒí˜¸ì–´";}s:3:"art";a:1:{i:0;s:18:"기계어 (기타)";}s:3:"arw";a:1:{i:0;s:15:"ì•„ë¼ì™€í¬ì–´";}s:2:"as";a:1:{i:0;s:9:"아샘어";}s:3:"ast";a:1:{i:0;s:18:"아스투리아어";}s:3:"ath";a:1:{i:0;s:18:"아타바스카어";}s:3:"aus";a:1:{i:0;s:24:"오스트레ì¼ë¦¬ì•„ì–´";}s:2:"av";a:1:{i:0;s:12:"아바릭어";}s:3:"awa";a:1:{i:0;s:12:"아와히어";}s:2:"ay";a:1:{i:0;s:15:"ì•„ì´ë§ˆë¼ì–´";}s:2:"az";a:1:{i:0;s:21:"아제르바ì´ìž”ì–´";}s:2:"ba";a:1:{i:0;s:15:"바슈키르어";}s:3:"bad";a:1:{i:0;s:9:"반다어";}s:3:"bai";a:1:{i:0;s:15:"바미레케어";}s:3:"bal";a:1:{i:0;s:12:"발루치어";}s:3:"ban";a:1:{i:0;s:9:"발리어";}s:3:"bas";a:1:{i:0;s:9:"바사어";}s:3:"bat";a:1:{i:0;s:18:"발트어 (기타)";}s:2:"be";a:1:{i:0;s:15:"벨로루시어";}s:3:"bej";a:1:{i:0;s:9:"ë² ìžì–´";}s:3:"bem";a:1:{i:0;s:9:"벰바어";}s:3:"ber";a:1:{i:0;s:15:"베르베르어";}s:2:"bg";a:1:{i:0;s:15:"불가리아어";}s:2:"bh";a:1:{i:0;s:12:"비하르어";}s:3:"bho";a:1:{i:0;s:15:"호즈푸리어";}s:2:"bi";a:1:{i:0;s:15:"비슬ë¼ë§ˆì–´";}s:3:"bik";a:1:{i:0;s:9:"비콜어";}s:3:"bin";a:1:{i:0;s:9:"비니어";}s:3:"bla";a:1:{i:0;s:12:"ì‹ì‹œì¹´ì–´";}s:2:"bm";a:1:{i:0;s:12:"밤바ë¼ì–´";}s:2:"bn";a:1:{i:0;s:9:"벵골어";}s:3:"bnt";a:1:{i:0;s:9:"반투어";}s:2:"bo";a:1:{i:0;s:12:"티베트어";}s:2:"br";a:1:{i:0;s:15:"브르타뉴어";}s:3:"bra";a:1:{i:0;s:9:"브ë¼ì–´";}s:2:"bs";a:1:{i:0;s:15:"보스니아어";}s:3:"btk";a:1:{i:0;s:12:"바타í¬ì–´";}s:3:"bua";a:1:{i:0;s:12:"부리아타";}s:3:"bug";a:1:{i:0;s:9:"부기어";}s:3:"byn";a:1:{i:0;s:9:"브린어
";}s:2:"ca";a:1:{i:0;s:18:"카탈로니아어";}s:3:"cad";a:1:{i:0;s:9:"ì¹´ë„ì–´";}s:3:"cai";a:1:{i:0;s:41:"중앙 아메리카 ì¸ë””안어 (기타)";}s:3:"car";a:1:{i:0;s:12:"카리브어";}s:3:"cau";a:1:{i:0;s:24:"카프카스어 (기타)";}s:3:"ceb";a:1:{i:0;s:15:"세부아노어";}s:3:"cel";a:1:{i:0;s:18:"켈트어 (기타)";}s:2:"ch";a:1:{i:0;s:12:"차모로어";}s:3:"chb";a:1:{i:0;s:12:"치브차어";}s:3:"chg";a:1:{i:0;s:15:"차가타ì´ì–´";}s:3:"chk";a:1:{i:0;s:12:"츄케스어";}s:3:"chm";a:1:{i:0;s:9:"마리어";}s:3:"chn";a:1:{i:0;s:48:"치누í¬ì–´ì™€ ì˜ì–´ í”„ëž‘ìŠ¤ì–´ì˜ í˜¼ì„±ì–´";}s:3:"cho";a:1:{i:0;s:9:"촉토어";}s:3:"chp";a:1:{i:0;s:12:"치페우얀";}s:3:"chr";a:1:{i:0;s:12:"체로키어";}s:3:"chy";a:1:{i:0;s:12:"샤ì´ì—”ì–´";}s:3:"cmc";a:1:{i:0;s:9:"카믹어";}s:2:"co";a:1:{i:0;s:15:"코르시카어";}s:3:"cop";a:1:{i:0;s:9:"콥트어";}s:3:"cpe";a:1:{i:0;s:55:"í¬ë ˆì˜¤ë¦¬ìŠ¤ì™€ 피긴스어, ì˜ì–´-기반 (기타)";}s:3:"cpf";a:1:{i:0;s:61:"í¬ë ˆì˜¤ë¦¬ìŠ¤ì™€ 피긴스어, 프랑스어-기반 (기타)";}s:3:"cpp";a:1:{i:0;s:64:"í¬ë ˆì˜¤ë¦¬ìŠ¤ì™€ 피긴스어, í¬ë¥´íˆ¬ê°ˆì–´-기반 (기타)";}s:2:"cr";a:1:{i:0;s:9:"í¬ë¦¬ì–´";}s:3:"crh";a:1:{i:0;s:43:"í¬ë¦¬ë¯¼ 터키어; í¬ë¦¬ë¯¼ 타타르어";}s:3:"crp";a:1:{i:0;s:37:"í¬ë ˆì˜¤ìŠ¤ì™€ 피긴스어 (기타)";}s:2:"cs";a:1:{i:0;s:9:"체코어";}s:3:"csb";a:1:{i:0;s:15:"카슈비아어";}s:2:"cu";a:1:{i:0;s:18:"êµíšŒìŠ¬ë¼ë¸Œì–´";}s:3:"cus";a:1:{i:0;s:27:"쿠시트제족어 (기타)";}s:2:"cv";a:1:{i:0;s:12:"추바시어";}s:2:"cy";a:1:{i:0;s:12:"웨ì¼ìŠ¤ì–´";}s:2:"da";a:1:{i:0;s:12:"ë´ë§ˆí¬ì–´";}s:3:"dak";a:1:{i:0;s:12:"다코타어";}s:3:"dar";a:1:{i:0;s:15:"다르그와어";}s:3:"day";a:1:{i:0;s:12:"다야í¬ì–´";}s:2:"de";a:1:{i:0;s:9:"ë…ì¼ì–´";}s:3:"del";a:1:{i:0;s:15:"ë¸ë¼ì›¨ì–´ì–´";}s:3:"den";a:1:{i:0;s:12:"슬ë¼ë¸Œì–´";}s:3:"dgr";a:1:{i:0;s:15:"ë„그리브어";}s:3:"din";a:1:{i:0;s:9:"딩카어";}s:3:"doi";a:1:{i:0;s:12:"ë„그리어";}s:3:"dra";a:1:{i:0;s:24:"ë“œë¼ë¹„다어 (기타)";}s:3:"dsb";a:1:{i:0;s:22:"ì €
급 소르비안어";}s:3:"dua";a:1:{i:0;s:12:"드와ë¼ì–´";}s:3:"dum";a:1:{i:0;s:36:"네ëœëž€ë“œ, 중세 (ca. 1050-1350)";}s:2:"dv";a:1:{i:0;s:12:"디베히어";}s:3:"dyu";a:1:{i:0;s:12:"드율ë¼ì–´";}s:2:"dz";a:1:{i:0;s:9:"부탄어";}s:2:"ee";a:1:{i:0;s:9:"ì—웨어";}s:3:"efi";a:1:{i:0;s:9:"ì´í”½ì–´";}s:3:"egy";a:1:{i:0;s:21:"ì´ì§‘트어 (고대)";}s:3:"eka";a:1:{i:0;s:12:"ì´ì¹´ì£½ì–´";}s:2:"el";a:1:{i:0;s:12:"그리스어";}s:3:"elx";a:1:{i:0;s:9:"엘람어";}s:2:"en";a:1:{i:0;s:6:"ì˜ì–´";}s:3:"enm";a:1:{i:0;s:26:"ì˜ì–´, 중세 (1100-1500)";}s:2:"eo";a:1:{i:0;s:18:"ì—스페란토어";}s:2:"es";a:1:{i:0;s:12:"스페ì¸ì–´";}s:2:"et";a:1:{i:0;s:18:"ì—스토니아어";}s:2:"eu";a:1:{i:0;s:12:"바스í¬ì–´";}s:3:"ewo";a:1:{i:0;s:12:"ì´ì›ë„ì–´";}s:2:"fa";a:1:{i:0;s:9:"ì´ëž€ì–´";}s:3:"fan";a:1:{i:0;s:9:"팡그어";}s:3:"fat";a:1:{i:0;s:9:"íŒí‹°ì–´";}s:2:"ff";a:1:{i:0;s:9:"í’€ë¼ì–´";}s:2:"fi";a:1:{i:0;s:12:"핀란드어";}s:3:"fiu";a:1:{i:0;s:30:"피노우그리아어 (기타)";}s:2:"fj";a:1:{i:0;s:9:"피지어";}s:2:"fo";a:1:{i:0;s:12:"페로스어";}s:3:"fon";a:1:{i:0;s:6:"í°ì–´";}s:2:"fr";a:1:{i:0;s:12:"프랑스어";}s:3:"frm";a:1:{i:0;s:35:"프랑스어, 중세 (ca.1400-1600)";}s:3:"fro";a:1:{i:0;s:34:"프랑스어, 고대 (842-ca.1400)";}s:3:"fur";a:1:{i:0;s:18:"프리우리안어";}s:2:"fy";a:1:{i:0;s:15:"프리지아어";}s:2:"ga";a:1:{i:0;s:15:"ì•„ì¼ëžœë“œì–´";}s:3:"gaa";a:1:{i:0;s:6:"가어";}s:3:"gay";a:1:{i:0;s:9:"가요어";}s:3:"gba";a:1:{i:0;s:12:"그바야어";}s:2:"gd";a:1:{i:0;s:15:"스코갤릭어";}s:3:"gem";a:1:{i:0;s:18:"ë…ì¼ì–´ (기타)";}s:3:"gez";a:1:{i:0;s:12:"게ì´ì¦ˆì–´";}s:3:"gil";a:1:{i:0;s:15:"키리바시어";}s:2:"gl";a:1:{i:0;s:15:"갈리시아어";}s:3:"gmh";a:1:{i:0;s:39:"ë…ì¼ì–´, 중세 고급 (ca.1050-1500)";}s:2:"gn";a:1:{i:0;s:15:"구아ë¼ë‹ˆì–´";}s:3:"goh";a:1:{i:0;s:38:"ë…ì¼ì–´, 고대 저급 (ca.750-1050)";}s:3:"gon";a:1:{i:0;s:9:"곤디어";}s:3:"gor";a:1:{i:0;s:15:"고론탈로어";}s:3:"got";a:1:{i:0;s:9:"고트어";}s:3:"grb";a:1:{i:0;s:12:"ê²
Œë¥´ë³´ì–´";}s:3:"grc";a:1:{i:0;s:37:"그리스어, 고대 (1453ë…„ 까지)";}s:2:"gu";a:1:{i:0;s:15:"구ìžë¼íŠ¸ì–´";}s:2:"gv";a:1:{i:0;s:12:"맹í¬ìŠ¤ì–´";}s:3:"gwi";a:1:{i:0;s:12:"그위친어";}s:2:"ha";a:1:{i:0;s:12:"하우ìžì–´";}s:3:"hai";a:1:{i:0;s:12:"하ì´ë‹¤ì–´";}s:3:"haw";a:1:{i:0;s:12:"하와ì´ì–´";}s:2:"he";a:1:{i:0;s:12:"히브리어";}s:2:"hi";a:1:{i:0;s:9:"힌디어";}s:3:"hil";a:1:{i:0;s:15:"헤리가뇬어";}s:3:"him";a:1:{i:0;s:15:"히마차리어";}s:3:"hit";a:1:{i:0;s:15:"하타ì´íŠ¸ì–´";}s:3:"hmn";a:1:{i:0;s:9:"히몸어";}s:2:"ho";a:1:{i:0;s:16:"히리 모투어";}s:2:"hr";a:1:{i:0;s:18:"í¬ë¡œì•„í‹°ì•„ì–´";}s:3:"hsb";a:1:{i:0;s:19:"위 소르비안어";}s:2:"ht";a:1:{i:0;s:12:"ì•„ì´í‹°ì–´";}s:2:"hu";a:1:{i:0;s:12:"í—가리어";}s:3:"hup";a:1:{i:0;s:9:"후파어";}s:2:"hy";a:1:{i:0;s:18:"아르메니아어";}s:2:"ia";a:1:{i:0;s:12:"ì¸í„°ë§ê±°";}s:3:"iba";a:1:{i:0;s:9:"ì´ë°˜ì–´";}s:2:"id";a:1:{i:0;s:18:"ì¸ë„네시아어";}s:2:"ie";a:1:{i:0;s:15:"ì¸í„°ë§ê²Œì–´";}s:2:"ig";a:1:{i:0;s:12:"ì´ê·¸ë³´ì–´";}s:2:"ii";a:1:{i:0;s:16:"시츄안 ì´ì–´";}s:3:"ijo";a:1:{i:0;s:9:"ì´ì¡°ì–´";}s:2:"ik";a:1:{i:0;s:18:"ì´ëˆ„피아í¬ì–´";}s:3:"ilo";a:1:{i:0;s:12:"ì´ë¡œì½”ì–´";}s:3:"inc";a:1:{i:0;s:18:"ì¸ë„ì–´ (기타)";}s:3:"ine";a:1:{i:0;s:24:"ì¸ë„유럽어 (기타)";}s:3:"inh";a:1:{i:0;s:12:"ì¸ê·€ì‹œì–´";}s:2:"io";a:1:{i:0;s:9:"ì´ë„ì–´";}s:3:"ira";a:1:{i:0;s:9:"ì´ëž€ì–´";}s:3:"iro";a:1:{i:0;s:15:"ì´ëŸ¬ì¿¼ì´ì–´";}s:2:"is";a:1:{i:0;s:18:"ì•„ì´ìŠ¬ëž€ë“œì–´";}s:2:"it";a:1:{i:0;s:15:"ì´íƒˆë¦¬ì•„ì–´";}s:2:"iu";a:1:{i:0;s:18:"ì´ëˆ…티투트어";}s:2:"ja";a:1:{i:0;s:9:"ì¼ë³¸ì–´";}s:3:"jbo";a:1:{i:0;s:9:"로반어";}s:3:"jpr";a:1:{i:0;s:22:"유대-페르시아어";}s:3:"jrb";a:1:{i:0;s:22:"유대-ì•„ë¼ë¹„ì•„ì–´";}s:2:"jv";a:1:{i:0;s:9:"ìžë°”ì–´";}s:2:"ka";a:1:{i:0;s:15:"그루지야어";}s:3:"kaa";a:1:{i:0;s:18:"ì¹´ë¼ì¹¼íŒŒí¬ì–´";}s:3:"kab";a:1:{i:0;s:12:"커바ì¼ì–´";}s:3:"kac";a:1:{i:0;s:9:"카친어";}s:3:"kam";a:1:{i:0;s:9:"캄바어";}s:3:"kar";a:1:{i:0;s:9:"카렌어";}s:3:"k
aw";a:1:{i:0;s:9:"카위어";}s:3:"kbd";a:1:{i:0;s:15:"카바르디어";}s:2:"kg";a:1:{i:0;s:9:"콩고어";}s:3:"kha";a:1:{i:0;s:9:"카시어";}s:3:"khi";a:1:{i:0;s:21:"ì½”ì´ì‚°ì–´ (기타)";}s:3:"kho";a:1:{i:0;s:12:"코탄스어";}s:2:"ki";a:1:{i:0;s:12:"키쿠유어";}s:2:"kj";a:1:{i:0;s:15:"쿠안야마어";}s:2:"kk";a:1:{i:0;s:12:"ì¹´ìžíì–´";}s:2:"kl";a:1:{i:0;s:15:"그린랜드어";}s:2:"km";a:1:{i:0;s:15:"캄보디아어";}s:3:"kmb";a:1:{i:0;s:12:"킴분누어";}s:2:"kn";a:1:{i:0;s:12:"카나다어";}s:2:"ko";a:1:{i:0;s:9:"한국어";}s:3:"kok";a:1:{i:0;s:12:"코카니어";}s:3:"kos";a:1:{i:0;s:18:"코스ë¼ì´ì—”ì–´";}s:3:"kpe";a:1:{i:0;s:9:"코펠레";}s:2:"kr";a:1:{i:0;s:12:"칸누리어";}s:3:"krc";a:1:{i:0;s:25:"ì¹´ë¼ì± ì´-발카르어";}s:3:"kro";a:1:{i:0;s:9:"í¬ë£¨ì–´";}s:3:"kru";a:1:{i:0;s:12:"쿠르í¬ì–´";}s:2:"ks";a:1:{i:0;s:15:"카슈미르어";}s:2:"ku";a:1:{i:0;s:12:"í¬ë¥´ë“œì–´";}s:3:"kum";a:1:{i:0;s:9:"쿠믹어";}s:3:"kut";a:1:{i:0;s:12:"쿠테네어";}s:2:"kv";a:1:{i:0;s:9:"코미어";}s:2:"kw";a:1:{i:0;s:9:"콘월어";}s:2:"ky";a:1:{i:0;s:15:"키르기스어";}s:2:"la";a:1:{i:0;s:9:"ë¼í‹´ì–´";}s:3:"lad";a:1:{i:0;s:12:"ë¼ë””노어";}s:3:"lah";a:1:{i:0;s:12:"ë¼í•œë‹¤ì–´";}s:3:"lam";a:1:{i:0;s:9:"람바어";}s:2:"lb";a:1:{i:0;s:18:"룩셈부르í¬ì–´";}s:3:"lez";a:1:{i:0;s:15:"레즈기안어";}s:2:"lg";a:1:{i:0;s:9:"간다어";}s:2:"li";a:1:{i:0;s:12:"림버거어";}s:2:"ln";a:1:{i:0;s:12:"ë§ê°ˆë¼ì–´";}s:2:"lo";a:1:{i:0;s:9:"ë¼ì˜¤ì–´";}s:3:"lol";a:1:{i:0;s:9:"몽구어";}s:3:"loz";a:1:{i:0;s:9:"로지어";}s:2:"lt";a:1:{i:0;s:18:"리투아니아어";}s:2:"lu";a:1:{i:0;s:19:"루바-카탄가어";}s:3:"lua";a:1:{i:0;s:19:"루바-룰루아어";}s:3:"lui";a:1:{i:0;s:15:"루ì´ì„¸ë…¸ì–´";}s:3:"lun";a:1:{i:0;s:9:"룬다어";}s:3:"luo";a:1:{i:0;s:9:"루오어";}s:3:"lus";a:1:{i:0;s:12:"루샤ì´ì–´";}s:2:"lv";a:1:{i:0;s:15:"ë¼íŠ¸ë¹„ì•„ì–´";}s:3:"mad";a:1:{i:0;s:12:"마ë‘레세";}s:3:"mag";a:1:{i:0;s:9:"마가히";}s:3:"mai";a:1:{i:0;s:12:"마ì´í‹¸ë¦¬";}s:3:"mak";a:1:{i:0;s:12:"마
카사어";}s:3:"man";a:1:{i:0;s:12:"만딩고어";}s:3:"map";a:1:{i:0;s:9:"남ë„ì–´";}s:3:"mas";a:1:{i:0;s:12:"마사ì´ì–´";}s:3:"mdf";a:1:{i:0;s:12:"모í¬ìƒ¤ì–´";}s:3:"mdr";a:1:{i:0;s:12:"만다르어";}s:3:"men";a:1:{i:0;s:9:"멘ë°ì–´";}s:2:"mg";a:1:{i:0;s:21:"마다가스카르어";}s:3:"mga";a:1:{i:0;s:34:"ì•„ì¼ëžœë“œì–´, 중세 (900-1200)";}s:2:"mh";a:1:{i:0;s:15:"마셜제ë„ì–´";}s:2:"mi";a:1:{i:0;s:12:"마오리어";}s:3:"mic";a:1:{i:0;s:12:"미í¬ë§¥ì–´";}s:3:"min";a:1:{i:0;s:15:"미낭카바우";}s:3:"mis";a:1:{i:0;s:13:"기타 언어";}s:2:"mk";a:1:{i:0;s:18:"마케ë„니아어";}s:3:"mkh";a:1:{i:0;s:24:"몬í¬ë©”르어 (기타)";}s:2:"ml";a:1:{i:0;s:15:"ë§ë¼ì–„람어";}s:2:"mn";a:1:{i:0;s:9:"몽골어";}s:3:"mnc";a:1:{i:0;s:9:"만주어";}s:3:"mni";a:1:{i:0;s:15:"마니푸리어";}s:3:"mno";a:1:{i:0;s:12:"마노보어";}s:2:"mo";a:1:{i:0;s:15:"몰다비아어";}s:3:"moh";a:1:{i:0;s:12:"모호í¬ì–´";}s:3:"mos";a:1:{i:0;s:9:"모시어";}s:2:"mr";a:1:{i:0;s:12:"마ë¼í‹°ì–´";}s:2:"ms";a:1:{i:0;s:12:"ë§ë ˆì´ì–´";}s:2:"mt";a:1:{i:0;s:9:"몰타어";}s:3:"mul";a:1:{i:0;s:13:"다중 언어";}s:3:"mun";a:1:{i:0;s:9:"문다어";}s:3:"mus";a:1:{i:0;s:12:"í¬ë¦¬í¬ì–´";}s:3:"mwr";a:1:{i:0;s:15:"마르와리어";}s:2:"my";a:1:{i:0;s:9:"버마어";}s:3:"myn";a:1:{i:0;s:9:"마야어";}s:3:"myv";a:1:{i:0;s:12:"엘즈야어";}s:2:"na";a:1:{i:0;s:12:"나우루어";}s:3:"nah";a:1:{i:0;s:15:"나우아틀어";}s:3:"nai";a:1:{i:0;s:38:"ë¶ ì•„ë©”ë¦¬ì¹¸ ì¸ë””언어 (기타)";}s:3:"nap";a:1:{i:0;s:12:"나í´ë¦¬ì–´";}s:2:"nb";a:1:{i:0;s:25:"ë³´í¬ë§ 노르웨ì´ì–´";}s:2:"nd";a:1:{i:0;s:23:"ì€ë°ë²¨ë ˆì–´, ë¶ë¶€";}s:3:"nds";a:1:{i:0;s:34:"저급 ë…ì¼ì–´; 저급 색슨어";}s:2:"ne";a:1:{i:0;s:9:"네팔어";}s:3:"new";a:1:{i:0;s:12:"네와리어";}s:2:"ng";a:1:{i:0;s:12:"ëŠë™ê°€ì–´";}s:3:"nia";a:1:{i:0;s:12:"니아스어";}s:3:"nic";a:1:{i:0;s:42:"니제르 - 코르ë„파니아어 (기타)";}s:3:"niu";a:1:{i:0;s:12:"니웨언어";}s:2:"nl";a:1:{i:0;s:15:"네ëœëž€ë“œì–´";}s:2:"nn";a:1:{i:0;s:31:"뉘노르스
í¬ ë…¸ë¥´ì›¨ì´ì–´";}s:2:"no";a:1:{i:0;s:15:"노르웨ì´ì–´";}s:3:"nog";a:1:{i:0;s:12:"노가ì´ì–´";}s:3:"non";a:1:{i:0;s:20:"노르웨ì´, 고대";}s:2:"nr";a:1:{i:0;s:23:"ì€ë°ë²¨ë ˆì–´, 남부";}s:3:"nso";a:1:{i:0;s:17:"소토어, ë¶ë¶€";}s:3:"nub";a:1:{i:0;s:12:"누비안어";}s:2:"nv";a:1:{i:0;s:12:"나바호어";}s:2:"ny";a:1:{i:0;s:31:"니안ìžì–´; 치츄어; 츄어";}s:3:"nym";a:1:{i:0;s:15:"니암웨지어";}s:3:"nyn";a:1:{i:0;s:12:"니안콜어";}s:3:"nyo";a:1:{i:0;s:9:"뉴로어";}s:3:"nzi";a:1:{i:0;s:12:"ëŠì§€ë§ˆì–´";}s:2:"oc";a:1:{i:0;s:12:"옥시트어";}s:2:"oj";a:1:{i:0;s:18:"오지브웨ì´ì–´";}s:2:"om";a:1:{i:0;s:21:"오로모어 (ì•„íŒ)";}s:2:"or";a:1:{i:0;s:12:"오리야어";}s:2:"os";a:1:{i:0;s:12:"오세트어";}s:3:"osa";a:1:{i:0;s:15:"오세ì´ì§€ì–´";}s:3:"ota";a:1:{i:0;s:32:"터키어, 오스만 (1500-1928)";}s:3:"oto";a:1:{i:0;s:15:"오토미안어";}s:2:"pa";a:1:{i:0;s:9:"펀잡어";}s:3:"paa";a:1:{i:0;s:21:"파푸아어 (기타)";}s:3:"pag";a:1:{i:0;s:15:"íŒê°€ì‹œë‚œì–´";}s:3:"pal";a:1:{i:0;s:12:"팔빌레어";}s:3:"pam";a:1:{i:0;s:12:"팜팡가어";}s:3:"pap";a:1:{i:0;s:18:"파피아먼토어";}s:3:"pau";a:1:{i:0;s:15:"파ë¼ìš°ì•ˆì–´";}s:3:"peo";a:1:{i:0;s:40:"페르시안 고대어 (ca.600-400 B.C.)";}s:3:"phi";a:1:{i:0;s:21:"필리핀어 (기타)";}s:3:"phn";a:1:{i:0;s:15:"페니키아어";}s:2:"pi";a:1:{i:0;s:9:"팔리어";}s:2:"pl";a:1:{i:0;s:12:"í´ëž€ë“œì–´";}s:3:"pon";a:1:{i:0;s:12:"í¼íŽ˜ì´ì–´";}s:3:"pra";a:1:{i:0;s:18:"프ë¼í¬ë¦¬íŠ¸ì–´";}s:3:"pro";a:1:{i:0;s:40:"프로벤칼어, 고대 (1500ë…„ 까지)";}s:2:"ps";a:1:{i:0;s:24:"파시토어 (푸시토)";}s:2:"pt";a:1:{i:0;s:15:"í¬ë¥´íˆ¬ì¹¼ì–´";}s:2:"qu";a:1:{i:0;s:12:"케추아어";}s:3:"raj";a:1:{i:0;s:15:"ë¼ìžìŠ¤íƒ„ì–´";}s:3:"rap";a:1:{i:0;s:12:"ë¼íŒŒë‰´ì´";}s:3:"rar";a:1:{i:0;s:15:"파로톤간어";}s:2:"rm";a:1:{i:0;s:15:"레토로만어";}s:2:"rn";a:1:{i:0;s:20:"반투어(부룬디)";}s:2:"ro";a:1:{i:0;s:15:"루마니아어";}s:3:"roa";a:1:{i:0;s:21:"ë¡œë§ìŠ¤ì–´ (기타)";}s:3:"rom";a:1:{i:0;s:9:"집
시어";}s:2:"ru";a:1:{i:0;s:12:"러시아어";}s:2:"rw";a:1:{i:0;s:20:"반투어(루완다)";}s:2:"sa";a:1:{i:0;s:18:"산스í¬ë¦¬íŠ¸ì–´";}s:3:"sad";a:1:{i:0;s:12:"산다웨어";}s:3:"sah";a:1:{i:0;s:12:"야í트어";}s:3:"sai";a:1:{i:0;s:37:"남아메리카 ì¸ë””언어 (기타)";}s:3:"sal";a:1:{i:0;s:15:"ìƒë¦¬ì‹œì–´ì–´";}s:3:"sam";a:1:{i:0;s:22:"사마리아 ì•„ëžì–´";}s:3:"sas";a:1:{i:0;s:12:"사사í¬ì–´";}s:3:"sat";a:1:{i:0;s:12:"산탈리어";}s:2:"sc";a:1:{i:0;s:18:"사르디니아어";}s:3:"sco";a:1:{i:0;s:18:"스코틀랜드어";}s:2:"sd";a:1:{i:0;s:9:"신디어";}s:2:"se";a:1:{i:0;s:16:"ë¶ë¶€ 사미어";}s:3:"sel";a:1:{i:0;s:12:"셀쿠프어";}s:3:"sem";a:1:{i:0;s:15:"셈어 (기타)";}s:2:"sg";a:1:{i:0;s:9:"ì‚°ê³ ì–´";}s:3:"sga";a:1:{i:0;s:36:"ì•„ì¼ëžœë“œ, 고대 (900ë…„ 까지)";}s:3:"sgn";a:1:{i:0;s:6:"수화";}s:2:"sh";a:1:{i:0;s:27:"세르보í¬ë¡œì•„í‹°ì•„ì–´";}s:3:"shn";a:1:{i:0;s:6:"샨어";}s:2:"si";a:1:{i:0;s:15:"스리랑카어";}s:3:"sid";a:1:{i:0;s:12:"시다모어";}s:3:"sio";a:1:{i:0;s:9:"수족어";}s:3:"sit";a:1:{i:0;s:24:"ì¸ë„제언어 (기타)";}s:2:"sk";a:1:{i:0;s:18:"슬로바키아어";}s:2:"sl";a:1:{i:0;s:18:"슬로베니아어";}s:3:"sla";a:1:{i:0;s:21:"슬ë¼ë¸Œì–´ (기타)";}s:2:"sm";a:1:{i:0;s:12:"사모아어";}s:3:"sma";a:1:{i:0;s:16:"남부 사미어";}s:3:"smi";a:1:{i:0;s:18:"사미어 (기타)";}s:3:"smj";a:1:{i:0;s:16:"룰레 사미어";}s:3:"smn";a:1:{i:0;s:19:"ì´ë‚˜ë¦¬ 사미어";}s:3:"sms";a:1:{i:0;s:19:"스콜트 사미어";}s:2:"sn";a:1:{i:0;s:9:"쇼나어";}s:3:"snk";a:1:{i:0;s:12:"소닌케어";}s:2:"so";a:1:{i:0;s:15:"소ë§ë¦¬ì•„ì–´";}s:3:"sog";a:1:{i:0;s:15:"소그디엔어";}s:3:"son";a:1:{i:0;s:15:"송가ì´ì¡±ì–´";}s:2:"sq";a:1:{i:0;s:15:"알바니아어";}s:2:"sr";a:1:{i:0;s:15:"세르비아어";}s:3:"srr";a:1:{i:0;s:9:"세셀어";}s:2:"ss";a:1:{i:0;s:15:"시스와티어";}s:3:"ssa";a:1:{i:0;s:28:"니로-사하람어 (기타)";}s:2:"st";a:1:{i:0;s:12:"세소토어";}s:2:"su";a:1:{i:0;s:9:"순단어";}s:3:"suk";a:1:{i:0;s:15:"수쿠마족어";}s:3:"
sus";a:1:{i:0;s:9:"수수어";}s:3:"sux";a:1:{i:0;s:12:"수메르어";}s:2:"sv";a:1:{i:0;s:12:"스웨ë´ì–´";}s:2:"sw";a:1:{i:0;s:15:"스와ížë¦¬ì–´";}s:3:"syr";a:1:{i:0;s:12:"시리아어";}s:2:"ta";a:1:{i:0;s:9:"타밀어";}s:3:"tai";a:1:{i:0;s:18:"태국어 (기타)";}s:2:"te";a:1:{i:0;s:12:"텔루구어";}s:3:"tem";a:1:{i:0;s:9:"팀니어";}s:3:"ter";a:1:{i:0;s:12:"테레노어";}s:3:"tet";a:1:{i:0;s:9:"테툼어";}s:2:"tg";a:1:{i:0;s:18:"타지키스탄어";}s:2:"th";a:1:{i:0;s:9:"태국어";}s:2:"ti";a:1:{i:0;s:15:"티그리ëƒì–´";}s:3:"tig";a:1:{i:0;s:12:"티그레어";}s:3:"tiv";a:1:{i:0;s:9:"티비어";}s:2:"tk";a:1:{i:0;s:15:"투르í¬ë©˜ì–´";}s:3:"tkl";a:1:{i:0;s:21:"토켈ë¼ìš°ì œë„ì–´";}s:2:"tl";a:1:{i:0;s:15:"타갈로그어";}s:3:"tli";a:1:{i:0;s:15:"í‹€ë§ê¹ƒì¡±ì–´";}s:3:"tmh";a:1:{i:0;s:12:"타마섹어";}s:2:"tn";a:1:{i:0;s:15:"세츠와나어";}s:2:"to";a:1:{i:0;s:9:"통가어";}s:3:"tog";a:1:{i:0;s:27:"통가어 (니아살랜드)";}s:3:"tpi";a:1:{i:0;s:16:"í† í¬ í”¼ì‹ ì–´";}s:2:"tr";a:1:{i:0;s:9:"터키어";}s:2:"ts";a:1:{i:0;s:9:"통가어";}s:3:"tsi";a:1:{i:0;s:15:"트심시안어";}s:2:"tt";a:1:{i:0;s:12:"타타르어";}s:3:"tum";a:1:{i:0;s:12:"툼부카어";}s:3:"tup";a:1:{i:0;s:9:"투피어";}s:3:"tut";a:1:{i:0;s:21:"알타ì´ì–´ (기타)";}s:3:"tvl";a:1:{i:0;s:12:"투발루어";}s:2:"tw";a:1:{i:0;s:9:"트위어";}s:2:"ty";a:1:{i:0;s:12:"타히티어";}s:3:"tyv";a:1:{i:0;s:15:"투비니안어";}s:3:"udm";a:1:{i:0;s:15:"ìš°ë“œë§íŠ¸ì–´";}s:2:"ug";a:1:{i:0;s:12:"위구르어";}s:3:"uga";a:1:{i:0;s:15:"유가리틱어";}s:2:"uk";a:1:{i:0;s:18:"ìš°í¬ë¼ì´ë‚˜ì–´";}s:3:"umb";a:1:{i:0;s:12:"윤번ë‘ì–´";}s:3:"und";a:1:{i:0;s:18:"ê²°ì •ë˜ì§€ì•ŠìŒ";}s:2:"ur";a:1:{i:0;s:12:"우르ë‘ì–´";}s:2:"uz";a:1:{i:0;s:15:"우즈베í¬ì–´";}s:3:"vai";a:1:{i:0;s:9:"ë°”ì´ì–´";}s:2:"ve";a:1:{i:0;s:9:"벤다어";}s:2:"vi";a:1:{i:0;s:12:"베트남어";}s:2:"vo";a:1:{i:0;s:15:"ë³¼ë¼í“Œí¬ì–´";}s:3:"vot";a:1:{i:0;s:9:"보틱어";}s:2:"wa";a:1:{i:0;s:9:"왈론어";}s:3:"wak";a:1:{i:0;s:12:"와카샨어";}
s:3:"wal";a:1:{i:0;s:12:"와ë¼ëª¨ì–´";}s:3:"war";a:1:{i:0;s:12:"와ë¼ì´ì–´";}s:3:"was";a:1:{i:0;s:9:"와쇼어";}s:3:"wen";a:1:{i:0;s:12:"소르브어";}s:2:"wo";a:1:{i:0;s:12:"올로프어";}s:3:"xal";a:1:{i:0;s:12:"칼미í¬ì–´";}s:2:"xh";a:1:{i:0;s:26:"반투어(남아프리카)";}s:3:"yao";a:1:{i:0;s:12:"야오족어";}s:3:"yap";a:1:{i:0;s:12:"ì–페세어";}s:2:"yi";a:1:{i:0;s:12:"ì´ë””시어";}s:2:"yo";a:1:{i:0;s:12:"요루바어";}s:3:"ypk";a:1:{i:0;s:9:"야픽어";}s:2:"za";a:1:{i:0;s:9:"주앙어";}s:3:"zap";a:1:{i:0;s:15:"사í¬í…Œí¬ì–´";}s:3:"zen";a:1:{i:0;s:12:"제나가어";}s:2:"zh";a:1:{i:0;s:9:"중국어";}s:3:"znd";a:1:{i:0;s:15:"ì•„ìž”ë°ì¡±ì–´";}s:2:"zu";a:1:{i:0;s:9:"줄루어";}s:3:"zun";a:1:{i:0;s:9:"주니어";}}s:12:"LocaleScript";a:2:{i:0;s:4:"Hang";i:1;s:4:"Hani";}s:7:"Scripts";a:54:{s:4:"Arab";a:1:{i:0;s:9:"ì•„ëžì–´";}s:4:"Armn";a:1:{i:0;s:18:"아르메니아어";}s:4:"Beng";a:1:{i:0;s:9:"벵골어";}s:4:"Bopo";a:1:{i:0;s:12:"주ìŒë¶€í˜¸";}s:4:"Brai";a:1:{i:0;s:9:"브ë¼ìœ ";}s:4:"Buhd";a:1:{i:0;s:12:"부히드어";}s:4:"Cans";a:1:{i:0;s:26:"통합 ìºë‚˜ë‹¤ 토착어";}s:4:"Cher";a:1:{i:0;s:12:"체로키어";}s:4:"Copt";a:1:{i:0;s:9:"콥트어";}s:4:"Cprt";a:1:{i:0;s:15:"키프로스어";}s:4:"Cyrl";a:1:{i:0;s:9:"키릴어";}s:4:"Deva";a:1:{i:0;s:18:"ë°ë°”니가리어";}s:4:"Dsrt";a:1:{i:0;s:12:"디저렛어";}s:4:"Ethi";a:1:{i:0;s:18:"ì—티오피아어";}s:4:"Geor";a:1:{i:0;s:15:"그루지아어";}s:4:"Goth";a:1:{i:0;s:9:"고트어";}s:4:"Grek";a:1:{i:0;s:12:"그리스어";}s:4:"Gujr";a:1:{i:0;s:15:"구쟈ë¼í‹°ì–´";}s:4:"Guru";a:1:{i:0;s:12:"구루묵히";}s:4:"Hang";a:1:{i:0;s:9:"한국어";}s:4:"Hani";a:1:{i:0;s:9:"한족어";}s:4:"Hano";a:1:{i:0;s:12:"하누누어";}s:4:"Hans";a:1:{i:0;s:16:"중국어 ê°„ì²´";}s:4:"Hant";a:1:{i:0;s:16:"중국어 번체";}s:4:"Hebr";a:1:{i:0;s:12:"히브리어";}s:4:"Hira";a:1:{i:0;s:12:"히ë¼ì¹´ë‚˜";}s:4:"Ital";a:1:{i:0;s:18:"ê³ ì´íƒˆë¦¬ì•„ì–´";}s:4:"Kana";a:1:{i:0;s:12:"가타카나";}s:4:"Khmr";a:1:{i:0;s:12:"í¬ë©”르어";}s:4:"Knda"
;a:1:{i:0;s:9:"칸나다";}s:4:"Laoo";a:1:{i:0;s:9:"ë¼ì˜¤ì–´";}s:4:"Latn";a:1:{i:0;s:9:"ë¼í‹´ì–´";}s:4:"Limb";a:1:{i:0;s:9:"림부어";}s:4:"Linb";a:1:{i:0;s:15:"선형 ë¬¸ìž B";}s:4:"Mlym";a:1:{i:0;s:15:"ë§ë¼ì–„람어";}s:4:"Mong";a:1:{i:0;s:9:"몽골어";}s:4:"Mymr";a:1:{i:0;s:12:"미얀마어";}s:4:"Ogam";a:1:{i:0;s:12:"오그함어";}s:4:"Orya";a:1:{i:0;s:12:"오리야어";}s:4:"Osma";a:1:{i:0;s:15:"오스만야어";}s:4:"Runr";a:1:{i:0;s:10:"룬 문ìž";}s:4:"Shaw";a:1:{i:0;s:12:"샤비안어";}s:4:"Sinh";a:1:{i:0;s:12:"ì‹ í• ë¼ì–´";}s:4:"Syrc";a:1:{i:0;s:12:"시리아어";}s:4:"Tagb";a:1:{i:0;s:12:"타반와어";}s:4:"Tale";a:1:{i:0;s:13:"íƒ€ì´ ë ˆì–´";}s:4:"Taml";a:1:{i:0;s:9:"타밀어";}s:4:"Telu";a:1:{i:0;s:12:"탤루그어";}s:4:"Tglg";a:1:{i:0;s:15:"타갈로그어";}s:4:"Thaa";a:1:{i:0;s:9:"타나어";}s:4:"Thai";a:1:{i:0;s:9:"태국어";}s:4:"Tibt";a:1:{i:0;s:9:"티벳어";}s:4:"Ugar";a:1:{i:0;s:12:"우가릿어";}s:4:"Yiii";a:1:{i:0;s:6:"ì´ì–´";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:9:"불êµë ¥";}s:7:"chinese";a:1:{i:0;s:9:"중국력";}s:9:"gregorian";a:1:{i:0;s:9:"태양력";}s:6:"hebrew";a:1:{i:0;s:12:"히브리력";}s:7:"islamic";a:1:{i:0;s:12:"ì´ìŠ¬ëžŒë ¥";}s:13:"islamic-civil";a:1:{i:0;s:19:"ì´ìŠ¬ëžŒ ìƒìš©ë ¥";}s:8:"japanese";a:1:{i:0;s:9:"ì¼ë³¸ë ¥";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:6:"순서";}s:9:"phonebook";a:1:{i:0;s:18:"전화번호부순";}s:6:"pinyin";a:1:{i:0;s:9:"병ìŒìˆœ";}s:6:"stroke";a:1:{i:0;s:9:"ìžíšìˆœ";}s:11:"traditional";a:1:{i:0;s:13:"전통 역법";}}}s:8:"Variants";a:1:{s:7:"REVISED";a:1:{i:0;s:6:"개정";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:11:"AmPmMarkers";a:2:{i:0;s:6:"오전";i:1;s:6:"오후";}s:16:"DateTimePatterns";a:9:{i:0;s:27:"a hh'ì‹œ' mm'분' ss'ì´ˆ' z";i:1;s:25:"a hh'ì‹œ' mm'분' ss'ì´ˆ'";i:2;s:17:"a hh'ì‹œ' mm'분'";i:3;s:17:"a hh'ì‹œ' mm'분'";i:4;s:28:"yyyy'ë…„' M'ì›”' d'ì¼' EEEE";i:5;s:26:"yyyy'ë…„' M'ì›”' d'ì¼' EE";i:6;s:10:"yyyy-MM-dd";i:7;s:8:"yy-MM-dd";i:8;
s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:3:"ì¼";i:1;s:3:"ì›”";i:2;s:3:"í™”";i:3;s:3:"수";i:4;s:3:"목";i:5;s:3:"금";i:6;s:3:"토";}s:6:"narrow";a:7:{i:0;s:3:"ì¼";i:1;s:3:"ì›”";i:2;s:3:"í™”";i:3;s:3:"수";i:4;s:3:"목";i:5;s:3:"금";i:6;s:3:"토";}s:4:"wide";a:7:{i:0;s:9:"ì¼ìš”ì¼";i:1;s:9:"월요ì¼";i:2;s:9:"화요ì¼";i:3;s:9:"수요ì¼";i:4;s:9:"목요ì¼";i:5;s:9:"금요ì¼";i:6;s:9:"토요ì¼";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:9:"기ì›ì „";i:1;s:6:"서기";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:4:"1ì›”";i:1;s:4:"2ì›”";i:2;s:4:"3ì›”";i:3;s:4:"4ì›”";i:4;s:4:"5ì›”";i:5;s:4:"6ì›”";i:6;s:4:"7ì›”";i:7;s:4:"8ì›”";i:8;s:4:"9ì›”";i:9;s:5:"10ì›”";i:10;s:5:"11ì›”";i:11;s:5:"12ì›”";}s:6:"narrow";a:12:{i:0;s:4:"1ì›”";i:1;s:4:"2ì›”";i:2;s:4:"3ì›”";i:3;s:4:"4ì›”";i:4;s:4:"5ì›”";i:5;s:4:"6ì›”";i:6;s:4:"7ì›”";i:7;s:4:"8ì›”";i:8;s:4:"9ì›”";i:9;s:5:"10ì›”";i:10;s:5:"11ì›”";i:11;s:5:"12ì›”";}s:4:"wide";a:12:{i:0;s:4:"1ì›”";i:1;s:4:"2ì›”";i:2;s:4:"3ì›”";i:3;s:4:"4ì›”";i:4;s:4:"5ì›”";i:5;s:4:"6ì›”";i:6;s:4:"7ì›”";i:7;s:4:"8ì›”";i:8;s:4:"9ì›”";i:9;s:5:"10ì›”";i:10;s:5:"11ì›”";i:11;s:5:"12ì›”";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}s:11:"zoneStrings";a:18:{i:0;a:6:{i:0;s:19:"America/Los_Angeles";i:1;s:19:"태í‰ì–‘ 표준시";i:2;s:3:"PST";i:3;s:19:"태í‰ì–‘ 기준시";i:4;s:3:"PDT";i:5;s:18:"로스앤젤레스";}i:1;a:6:{i:0;s:14:"America/Denver";i:1;s:16:"ì‚°ì•… 표준시";i:2;s:3:"MST";i:3;s:16:"ì‚°ì•… 기준시";i:4;s:3:"MDT";i:5;s:6:"ë´ë²„";}i:2;a:6:{i:0;s:15:"America/Phoenix";i:1;s:16:"ì‚°ì•… 표준시";i:2;s:3:"MST";i:3;s:16:"ì‚°ì•… 표준시";i:4;s:3:"MST";i:5;s:9:"피닉스";}i:3;a:6:{i:0;s:15:"America/Chicago";i:1;s:16:"중부 표준시";i:2;s:3:"CST";i:3;s:16:"중부 기준시";i:4;s:3:"CDT";i:5;s:9:"시카고";}i:4;a:6:{i:0;s:16:"America/New_York";i:1;s:16:"ë™ë¶€ 표준시";i:2;s:3:"EST";i:3;s:16:"ë™ë¶€ 기준시";i:4;s:3:"EDT";i:5;s:6:"뉴욕";}i:5;a:6:{i:0;s:20:"America/Indianapolis";i
:1;s:16:"ë™ë¶€ 표준시";i:2;s:3:"EST";i:3;s:16:"ë™ë¶€ 표준시";i:4;s:3:"EST";i:5;s:21:"ì¸ë””애나í´ë¦¬ìŠ¤";}i:6;a:6:{i:0;s:16:"Pacific/Honolulu";i:1;s:19:"í•˜ì™€ì´ í‘œì¤€ì‹œ";i:2;s:3:"HST";i:3;s:19:"í•˜ì™€ì´ í‘œì¤€ì‹œ";i:4;s:3:"HST";i:5;s:12:"호놀룰루";}i:7;a:6:{i:0;s:17:"America/Anchorage";i:1;s:22:"알래스카 표준시";i:2;s:3:"AST";i:3;s:22:"알래스카 기준시";i:4;s:3:"ADT";i:5;s:12:"앵커리지";}i:8;a:6:{i:0;s:15:"America/Halifax";i:1;s:19:"대서양 표준시";i:2;s:3:"AST";i:3;s:19:"대서양 기준시";i:4;s:3:"ADT";i:5;s:12:"핼리팩스";}i:9;a:6:{i:0;s:16:"America/St_Johns";i:1;s:25:"뉴펀들랜드 표준시";i:2;s:3:"CNT";i:3;s:25:"뉴펀들랜드 기준시";i:4;s:3:"CDT";i:5;s:9:"St. Johns";}i:10;a:6:{i:0;s:12:"Europe/Paris";i:1;s:22:"중부유럽 표준시";i:2;s:3:"CET";i:3;s:22:"중부유럽 기준시";i:4;s:4:"CEST";i:5;s:6:"파리";}i:11;a:6:{i:0;s:7:"Etc/GMT";i:1;s:22:"그리니치 표준시";i:2;s:3:"GMT";i:3;s:22:"그리니치 표준시";i:4;s:3:"GMT";i:5;s:6:"런ë˜";}i:12;a:6:{i:0;s:17:"Africa/Casablanca";i:1;s:22:"그리니치 표준시";i:2;s:3:"GMT";i:3;s:22:"그리니치 표준시";i:4;s:3:"GMT";i:5;s:15:"카사블랑카";}i:13;a:6:{i:0;s:14:"Asia/Jerusalem";i:1;s:22:"ì´ìŠ¤ë¼ì—˜ 표준시";i:2;s:3:"IST";i:3;s:22:"ì´ìŠ¤ë¼ì—˜ 기준시";i:4;s:3:"IDT";i:5;s:12:"예루살렘";}i:14;a:6:{i:0;s:10:"Asia/Tokyo";i:1;s:16:"ì¼ë³¸ 표준시";i:2;s:3:"JST";i:3;s:16:"ì¼ë³¸ 표준시";i:4;s:3:"JST";i:5;s:6:"ë„ì¿„";}i:15;a:6:{i:0;s:10:"Asia/Seoul";i:1;s:15:"한국표준시";i:2;s:3:"KST";i:3;s:15:"한국표준시";i:4;s:3:"KST";i:5;s:6:"서울";}i:16;a:6:{i:0;s:16:"Europe/Bucharest";i:1;s:22:"ë™ë¶€ìœ ëŸ½ 표준시";i:2;s:3:"EET";i:3;s:22:"ë™ë¶€ìœ ëŸ½ 기준시";i:4;s:4:"EEST";i:5;s:15:"부쿠레슈티";}i:17;a:6:{i:0;s:13:"Asia/Shanghai";i:1;s:16:"중국 표준시";i:2;s:3:"CTT";i:3;s:16:"중국 표준시";i:4;s:3:"CDT";i:5;s:9:"ìƒí•˜ì´";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ko_KR.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ko_KR.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ko_KR.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:27:"a hh'ì‹œ' mm'분' ss'ì´ˆ' z";i:1;s:25:"a hh'ì‹œ' mm'분' ss'ì´ˆ'";i:2;s:9:"a h:mm:ss";i:3;s:6:"a h:mm";i:4;s:28:"yyyy'ë…„' M'ì›”' d'ì¼' EEEE";i:5;s:23:"yyyy'ë…„' M'ì›”' d'ì¼'";i:6;s:12:"yyyy. MM. dd";i:7;s:10:"yy. MM. dd";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kok.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kok.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kok.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:1:{s:2:"IN";a:1:{i:0;s:12:"भारत";}}s:10:"Currencies";a:1:{s:3:"INR";a:2:{i:0;s:6:"रà¥";i:1;s:3:"INR";}}s:9:"Languages";a:140:{s:2:"aa";a:1:{i:0;s:12:"अफार";}s:2:"ab";a:1:{i:0;s:27:"अबखेज़ियन";}s:2:"af";a:1:{i:0;s:30:"अफà¥à¤°à¤¿à¤•à¤¾à¤¨à¥à¤¸";}s:2:"am";a:1:{i:0;s:24:"अमहारिकà¥";}s:2:"ar";a:1:{i:0;s:21:"अरेबिकà¥";}s:2:"as";a:1:{i:0;s:15:"असामी";}s:2:"ay";a:1:{i:0;s:12:"à¤à¤®à¤°à¤¾";}s:2:"az";a:1:{i:0;s:30:"अज़रबैजानी";}s:2:"ba";a:1:{i:0;s:18:"बषà¥à¤•à¤¿à¤°";}s:2:"be";a:1:{i:0;s:33:"बैलोरà¥à¤¸à¤¿à¤¯à¤¨à¥";}s:2:"bg";a:1:{i:0;s:27:"बलà¥à¤—ेरियन";}s:2:"bh";a:1:{i:0;s:18:"बीहारी";}s:2:"bi";a:1:{i:0;s:18:"बिसलमा";}s:2:"bn";a:1:{i:0;s:18:"बंगाली";}s:2:"bo";a:1:{i:0;s:24:"तिबेतियन";}s:2:"br";a:1:{i:0;s:18:"बà¥à¤°à¥‡à¤Ÿà¤¨";}s:2:"ca";a:1:{i:0;s:15:"कटलान";}s:2:"co";a:1:{i:0;s:24:"कोरà¥à¤¶à¤¿à¤¯à¤¨";}s:2:"cs";a:1:{i:0;s:15:"ज़ेकà¥";}s:2:"cy";a:1:{i:0;s:18:"वेळà¥à¤·à¥";}s:2:"da";a:1:{i:0;s:15:"डानिष";}s:2:"de";a:1:{i:0;s:15:"जरà¥à¤®à¤¨";}s:2:"dz";a:1:{i:0;s:18:"भूटानी";}s:2:"el";a:1:{i:0;s:18:"गà¥à¤°à¥€à¤•à¥";}s:2:"en";a:1:{i:0;s:15:"आंगà¥à¤²";}s:2:"eo";a:1:{i:0;s:30:"इसà¥à¤ªà¤°à¤¾à¤¨à¥à¤Ÿà¥‹";}s:2:"es";a:1:{i:0;s:21:"सà¥à¤ªà¤¾à¤¨à¤¿à¤·";}s:2:"et";a:1:{i:0;s:30:"इसà¥à¤Ÿà¥‹à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"eu";a:1:{i:0;s:15:"बासà¥à¤•";}s:2:"fa";a:1:{i:0;s:24:"परà¥à¤·à¤¿à¤¯à¤¨à¥";}s:2:"fi";a:1:{i:0;s:24:"फिनà¥à¤¨à¤¿à¤·à¥";}s:2:"fj";a:1:{i:0;s:12:"फिजी";}s:2:"fo";a:1:{i:0;s:18:"फेरोसà¥";}s:2:"fr";a:1:{i:0;s:21:"फà¥à¤°à¥‡à¤¨à¥à¤š";}s:2:"fy";a:1:{i:0;s:27:"फà¥à¤°à¤¿à¤¶à¤¿à¤¯à¤¨à¥";}s:2:"ga";a:1:{i:0;s:12:"à¤à¤°à¤¿à¤·";}s:2:"gd";a:1:{i:0;s:40:"सà¥à¤•à¤¾à¤Ÿà¤¸à¥ गेलिकà¥";}s:2:"gl";a:1:{i:0;s:24:"गेलीशियन";}s:2:"gn";a:1:{i:0;s:18:"गौरानी";}s:2:"gu";a:1:{i:0;s:
21:"गà¥à¤œà¤°à¤¾à¤¤à¥€";}s:2:"ha";a:1:{i:0;s:12:"हौसा";}s:2:"he";a:1:{i:0;s:18:"हेबà¥à¤°à¥";}s:2:"hi";a:1:{i:0;s:18:"हिनà¥à¤¦à¥€";}s:2:"hr";a:1:{i:0;s:33:"कà¥à¤°à¥‹à¤¯à¥‡à¤·à¤¿à¤¯à¤¨à¥";}s:2:"hu";a:1:{i:0;s:27:"हंगेरियनà¥";}s:2:"hy";a:1:{i:0;s:30:"आरà¥à¤®à¥€à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"ia";a:1:{i:0;s:36:"इनà¥à¤Ÿà¤°à¤²à¤¿à¤‚गà¥à¤µà¤¾";}s:2:"id";a:1:{i:0;s:33:"इनà¥à¤¡à¥‹à¤¨à¥‡à¤·à¤¿à¤¯à¤¨";}s:2:"ie";a:1:{i:0;s:30:"इनà¥à¤Ÿà¤°à¤²à¤¿à¤‚गà¥";}s:2:"ik";a:1:{i:0;s:27:"इनूपेयाकà¥";}s:2:"is";a:1:{i:0;s:33:"आईसà¥à¤²à¤¾à¤¨à¥à¤¡à¤¿à¤•";}s:2:"it";a:1:{i:0;s:21:"इटालियन";}s:2:"iu";a:1:{i:0;s:27:"इनà¥à¤¯à¥à¤•à¤Ÿà¥à¤Ÿ";}s:2:"ja";a:1:{i:0;s:21:"जापनीसà¥";}s:2:"jv";a:1:{i:0;s:21:"जावनीसà¥";}s:2:"ka";a:1:{i:0;s:27:"जारà¥à¤œà¤¿à¤¯à¤¨à¥";}s:2:"kk";a:1:{i:0;s:15:"कज़खà¥";}s:2:"kl";a:1:{i:0;s:36:"गà¥à¤°à¥€à¤¨à¤²à¤¾à¤¨à¥à¤¡à¤¿à¤•";}s:2:"km";a:1:{i:0;s:24:"कंबोडियन";}s:2:"kn";a:1:{i:0;s:18:"कनà¥à¤¨à¤¡à¤¾";}s:2:"ko";a:1:{i:0;s:21:"कोरियनà¥";}s:3:"kok";a:1:{i:0;s:18:"कोंकणी";}s:2:"ks";a:1:{i:0;s:21:"कशà¥à¤®à¥€à¤°à¥€";}s:2:"ku";a:1:{i:0;s:21:"कà¥à¤°à¥à¤¦à¤¿à¤·";}s:2:"ky";a:1:{i:0;s:24:"किरà¥à¤—िज़";}s:2:"la";a:1:{i:0;s:15:"लाटिन";}s:2:"ln";a:1:{i:0;s:21:"लिंगाला";}s:2:"lo";a:1:{i:0;s:24:"लाओतियनà¥";}s:2:"lt";a:1:{i:0;s:30:"लिथà¥à¤†à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"lv";a:1:{i:0;s:54:"लाटà¥à¤µà¤¿à¤¯à¤¨à¥ (लेटà¥à¤Ÿà¤¿à¤·à¥)";}s:2:"mg";a:1:{i:0;s:18:"मलागसी";}s:2:"mi";a:1:{i:0;s:15:"माओरी";}s:2:"mk";a:1:{i:0;s:30:"मसीडोनियनà¥";}s:2:"ml";a:1:{i:0;s:21:"मळियाळम";}s:2:"mn";a:1:{i:0;s:27:"मंगोलियनà¥";}s:2:"mo";a:1:{i:0;s:33:"मोलà¥à¤¡à¤¾à¤µà¤¿à¤¯à¤¨à¥";}s:2:"mr";a:1:{i:0;s:15:"मराठी";}s:2:"ms";a:1:{i:0;s:9:"मलय";}s:2:"mt";a:1:{i:0;s:21:"मालतीसà¥";}s:2:"my";a:1:{i:0;s:24
:"बरà¥à¤®à¥€à¤œà¤¼à¥";}s:2:"na";a:1:{i:0;s:12:"नौरो";}s:2:"ne";a:1:{i:0;s:18:"नेपाळी";}s:2:"nl";a:1:{i:0;s:9:"डचà¥";}s:2:"no";a:1:{i:0;s:30:"नोरà¥à¤µà¥‡à¤œà¤¿à¤¯à¤¨";}s:2:"oc";a:1:{i:0;s:21:"ओसिटानà¥";}s:2:"om";a:1:{i:0;s:30:"ओरोमो (अफान)";}s:2:"or";a:1:{i:0;s:15:"ओरिया";}s:2:"pa";a:1:{i:0;s:18:"पंजाबी";}s:2:"pl";a:1:{i:0;s:15:"पोलिष";}s:2:"ps";a:1:{i:0;s:39:"पाषà¥à¤Ÿà¥‹ (पà¥à¤·à¥à¤Ÿà¥‹)";}s:2:"pt";a:1:{i:0;s:33:"पोरà¥à¤šà¥à¤—ीज़à¥";}s:2:"qu";a:1:{i:0;s:24:"कà¥à¤µà¥‡à¤šà¥à¤µà¤¾";}s:2:"rm";a:1:{i:0;s:37:"रहटो-रोमानà¥à¤¸à¥";}s:2:"rn";a:1:{i:0;s:24:"किरà¥à¤¨à¥à¤¦à¥€";}s:2:"ro";a:1:{i:0;s:27:"रोमानियनà¥";}s:2:"ru";a:1:{i:0;s:18:"रषà¥à¤¯à¤¨à¥";}s:2:"rw";a:1:{i:0;s:42:"किनà¥à¤¯à¤¾à¤°à¥à¤µà¤¾à¤¨à¥à¤¡à¤¾";}s:2:"sa";a:1:{i:0;s:21:"संसà¥à¤•à¥ƒà¤¤";}s:2:"sd";a:1:{i:0;s:15:"सिंधी";}s:2:"sg";a:1:{i:0;s:21:"सांगà¥à¤°à¥‹";}s:2:"sh";a:1:{i:0;s:52:"सेरà¥à¤¬à¥‹-कà¥à¤°à¥‹à¤¯à¥‡à¤·à¤¿à¤¯à¤¨à¥";}s:2:"si";a:1:{i:0;s:27:"सिनà¥à¤¹à¤²à¥€à¤¸à¥";}s:2:"sk";a:1:{i:0;s:21:"सà¥à¤²à¥‹à¤µà¤¾à¤•";}s:2:"sl";a:1:{i:0;s:33:"सà¥à¤²à¥‹à¤µà¥‡à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"sm";a:1:{i:0;s:12:"समोन";}s:2:"sn";a:1:{i:0;s:12:"शोना";}s:2:"so";a:1:{i:0;s:18:"सोमाळी";}s:2:"sq";a:1:{i:0;s:30:"आलà¥à¤¬à¥‡à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"sr";a:1:{i:0;s:27:"सेरà¥à¤¬à¤¿à¤¯à¤¨à¥";}s:2:"ss";a:1:{i:0;s:24:"सिसà¥à¤µà¤¾à¤¤à¥€";}s:2:"st";a:1:{i:0;s:18:"सेसोथो";}s:2:"su";a:1:{i:0;s:21:"सà¥à¤‚दनीस";}s:2:"sv";a:1:{i:0;s:21:"सà¥à¤µà¥€à¤¦à¥€à¤·";}s:2:"sw";a:1:{i:0;s:24:"सà¥à¤µà¤¾à¤¹à¤¿à¤²à¥€";}s:2:"ta";a:1:{i:0;s:12:"तमिळ";}s:2:"te";a:1:{i:0;s:18:"तेलà¥à¤—ू";}s:2:"tg";a:1:{i:0;s:12:"तजिक";}s:2:"th";a:1:{i:0;s:9:"थाई";}s:2:"ti";a:1:{i:0;s:30:"तिगà¥à¤°à¤¿à¤¨à¥à¤¯à¤¾";}s:2:"tk";a:1:{i:0;s:21:"तà¥à¤°à¥à¤•à¤®à¤¨";}s:2:"tl";a:1:{i:0;s:18:"तग
ालोग";}s:2:"tn";a:1:{i:0;s:30:"सेतà¥à¤¸à¥à¤µà¤¾à¤¨à¤¾";}s:2:"to";a:1:{i:0;s:15:"तोंगा";}s:2:"tr";a:1:{i:0;s:21:"तà¥à¤°à¥à¤•à¤¿à¤·";}s:2:"ts";a:1:{i:0;s:18:"तà¥à¤¸à¥‹à¤—ा";}s:2:"tt";a:1:{i:0;s:12:"तटार";}s:2:"tw";a:1:{i:0;s:12:"तà¥à¤µà¤¿";}s:2:"ug";a:1:{i:0;s:12:"उधूर";}s:2:"uk";a:1:{i:0;s:33:"यà¥à¤•à¥à¤°à¥‡à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"ur";a:1:{i:0;s:15:"उरà¥à¤¦à¥‚";}s:2:"uz";a:1:{i:0;s:18:"उज़बेक";}s:2:"vi";a:1:{i:0;s:33:"वियतà¥à¤¨à¤¾à¤®à¥€à¤œà¤¼";}s:2:"vo";a:1:{i:0;s:18:"ओलापà¥à¤•";}s:2:"wo";a:1:{i:0;s:15:"उलोफ़";}s:2:"xh";a:1:{i:0;s:15:"à¤à¤¼à¥Œà¤¸à¤¾";}s:2:"yi";a:1:{i:0;s:21:"इदà¥à¤¦à¤¿à¤·à¥";}s:2:"yo";a:1:{i:0;s:18:"यूरà¥à¤¬à¤¾";}s:2:"za";a:1:{i:0;s:21:"à¤à¥à¤¹à¥à¤¨à¥à¤—";}s:2:"zh";a:1:{i:0;s:18:"चीनीसà¥";}s:2:"zu";a:1:{i:0;s:12:"जà¥à¤²à¥‚";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Deva";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:4:{s:11:"AmPmMarkers";a:2:{i:0;s:11:"म.पू.";i:1;s:11:"म.नं.";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:9:"रवि";i:1;s:9:"सोम";i:2;s:12:"मंगळ";i:3;s:9:"बà¥à¤§";i:4;s:12:"गà¥à¤°à¥";i:5;s:15:"शà¥à¤•à¥à¤°";i:6;s:9:"शनि";}s:4:"wide";a:7:{i:0;s:27:"आदितà¥à¤¯à¤µà¤¾à¤°";i:1;s:18:"सोमवार";i:2;s:18:"मंगळार";i:3;s:18:"बà¥à¤§à¤µà¤¾à¤°";i:4;s:21:"गà¥à¤°à¥à¤µà¤¾à¤°";i:5;s:24:"शà¥à¤•à¥à¤°à¤µà¤¾à¤°";i:6;s:18:"शनिवार";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:36:"कà¥à¤°à¤¿à¤¸à¥à¤¤à¤ªà¥‚रà¥à¤µ";i:1;s:30:"कà¥à¤°à¤¿à¤¸à¥à¤¤à¤¶à¤–ा";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:24:"जानेवारी";i:1;s:24:"फेबृवारी";i:2;s:15:"मारà¥à¤š";i:3;s:18:"à¤à¤ªà¥à¤°à¤¿à¤²";i:4;s:6:"मे";i:5;s:9:"जून";i:6;s:12:"जà¥à¤²à¥ˆ";i:7;s:15:"ओगसà¥à¤Ÿ";i:8;s:27:"सेपà¥à¤Ÿà¥‡à¤‚बर";i:9;s:21:"ओकà¥à¤Ÿà¥‹à¤¬à¤°";i:10;s:27:"नोवà¥
हेंबर";i:11;s:21:"डिसेंबर";}s:4:"wide";a:12:{i:0;s:24:"जानेवारी";i:1;s:30:"फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€";i:2;s:15:"मारà¥à¤š";i:3;s:18:"à¤à¤ªà¥à¤°à¤¿à¤²";i:4;s:6:"मे";i:5;s:9:"जून";i:6;s:12:"जà¥à¤²à¥ˆ";i:7;s:15:"ओगसà¥à¤Ÿ";i:8;s:27:"सेपà¥à¤Ÿà¥‡à¤‚बर";i:9;s:21:"ओकà¥à¤Ÿà¥‹à¤¬à¤°";i:10;s:27:"नोवà¥à¤¹à¥‡à¤‚बर";i:11;s:21:"डिसेंबर";}}}}}s:11:"zoneStrings";a:1:{i:0;a:5:{i:0;s:13:"Asia/Calcutta";i:1;s:28:"भारतीय समय";i:2;s:3:"IST";i:3;s:28:"भारतीय समय";i:4;s:3:"IST";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kok_IN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kok_IN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kok_IN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:28:"##,##,##0.###;-##,##,##0.###";i:1;s:32:"¤ ##,##,##0.00;-¤ ##,##,##0.00";i:2;s:10:"##,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:6:"d-M-yy";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:1;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kw.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kw.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kw.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:5:{s:9:"Countries";a:1:{s:2:"GB";a:1:{i:0;s:14:"Rywvaneth Unys";}}s:9:"Languages";a:1:{s:2:"kw";a:1:{i:0;s:8:"kernewek";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:4:{s:11:"AmPmMarkers";a:2:{i:0;s:4:"a.m.";i:1;s:4:"p.m.";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:3:"Sul";i:1;s:3:"Lun";i:2;s:3:"Mth";i:3;s:3:"Mhr";i:4;s:3:"Yow";i:5;s:3:"Gwe";i:6;s:3:"Sad";}s:4:"wide";a:7:{i:0;s:6:"De Sul";i:1;s:6:"De Lun";i:2;s:8:"De Merth";i:3;s:9:"De Merher";i:4;s:6:"De Yow";i:5;s:9:"De Gwener";i:6;s:9:"De Sadorn";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:2:"RC";i:1;s:2:"AD";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"Gen";i:1;s:3:"Whe";i:2;s:3:"Mer";i:3;s:3:"Ebr";i:4;s:2:"Me";i:5;s:3:"Efn";i:6;s:3:"Gor";i:7;s:3:"Est";i:8;s:3:"Gwn";i:9;s:3:"Hed";i:10;s:2:"Du";i:11;s:3:"Kev";}s:4:"wide";a:12:{i:0;s:10:"Mys Genver";i:1;s:11:"Mys Whevrel";i:2;s:9:"Mys Merth";i:3;s:9:"Mys Ebrel";i:4;s:6:"Mys Me";i:5;s:8:"Mys Efan";i:6;s:13:"Mys Gortheren";i:7;s:7:"Mye Est";i:8;s:12:"Mys Gwyngala";i:9;s:9:"Mys Hedra";i:10;s:6:"Mys Du";i:11;s:12:"Mys Kevardhu";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kw_GB.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kw_GB.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/kw_GB.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:8:"HH:mm:ss";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"d MMM yyyy";i:7;s:10:"dd/MM/yyyy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lt.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lt.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lt.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:8:{s:9:"Countries";a:239:{s:2:"AD";a:1:{i:0;s:6:"Andora";}s:2:"AE";a:1:{i:0;s:26:"Jungtiniai Arabų Emyratai";}s:2:"AF";a:1:{i:0;s:12:"Afganistanas";}s:2:"AG";a:1:{i:0;s:18:"Antigva ir Barbuda";}s:2:"AI";a:1:{i:0;s:7:"Angvila";}s:2:"AL";a:1:{i:0;s:8:"Albanija";}s:2:"AM";a:1:{i:0;s:9:"Armėnija";}s:2:"AN";a:1:{i:0;s:19:"Nyderlandų Antilai";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarktika";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:14:"Amerikos Samoa";}s:2:"AT";a:1:{i:0;s:8:"Austrija";}s:2:"AU";a:1:{i:0;s:10:"Australija";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:14:"Azerbaidžanas";}s:2:"BA";a:1:{i:0;s:22:"Bosnija ir Hercegovina";}s:2:"BB";a:1:{i:0;s:10:"Barbadosas";}s:2:"BD";a:1:{i:0;s:12:"Bangladešas";}s:2:"BE";a:1:{i:0;s:7:"Belgija";}s:2:"BF";a:1:{i:0;s:13:"Burkina Fasas";}s:2:"BG";a:1:{i:0;s:9:"Bulgarija";}s:2:"BH";a:1:{i:0;s:9:"Bahreinas";}s:2:"BI";a:1:{i:0;s:8:"Burundis";}s:2:"BJ";a:1:{i:0;s:7:"Beninas";}s:2:"BM";a:1:{i:0;s:8:"Bermudai";}s:2:"BN";a:1:{i:0;s:9:"Brunėjus";}s:2:"BO";a:1:{i:0;s:8:"Bolivija";}s:2:"BR";a:1:{i:0;s:9:"Brazilija";}s:2:"BS";a:1:{i:0;s:7:"Bahamai";}s:2:"BT";a:1:{i:0;s:7:"Butanas";}s:2:"BV";a:1:{i:0;s:11:"Bouvet sala";}s:2:"BW";a:1:{i:0;s:8:"Botsvana";}s:2:"BY";a:1:{i:0;s:11:"Baltarusija";}s:2:"BZ";a:1:{i:0;s:7:"Belizas";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:13:"Kokosų salos";}s:2:"CD";a:1:{i:0;s:29:"Kongo Demokratinė Respublika";}s:2:"CF";a:1:{i:0;s:29:"Centrinės Afrikos Respublika";}s:2:"CG";a:1:{i:0;s:6:"Kongas";}s:2:"CH";a:1:{i:0;s:11:"Šveicarija";}s:2:"CI";a:1:{i:0;s:13:"Kot d’Ivuar";}s:2:"CK";a:1:{i:0;s:10:"Kuko salos";}s:2:"CL";a:1:{i:0;s:6:"Čilė";}s:2:"CM";a:1:{i:0;s:10:"Kamerūnas";}s:2:"CN";a:1:{i:0;s:6:"Kinija";}s:2:"CO";a:1:{i:0;s:9:"Kolumbija";}s:2:"CR";a:1:{i:0;s:10:"Kosta Rika";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:23:"Žaliojo Kyšulio salos";}s:2:"CX";a:1:{i:0;s:13:"Kalėdų sala";}s:2:"CY";a:1:{i:0;s:6:"Kipras";}s:2:"CZ";a:1:{i:0;s:19:"Čekijos respublika";}s:2:"DE";a:1:{i:0;s:9:"Vokieti
ja";}s:2:"DJ";a:1:{i:0;s:9:"Džibutis";}s:2:"DK";a:1:{i:0;s:6:"Danija";}s:2:"DM";a:1:{i:0;s:8:"Dominika";}s:2:"DO";a:1:{i:0;s:20:"Dominikos Respublika";}s:2:"DZ";a:1:{i:0;s:8:"Alžyras";}s:2:"EC";a:1:{i:0;s:9:"Ekvadoras";}s:2:"EE";a:1:{i:0;s:6:"Estija";}s:2:"EG";a:1:{i:0;s:7:"Egiptas";}s:2:"EH";a:1:{i:0;s:15:"Vakarų Sachara";}s:2:"ER";a:1:{i:0;s:9:"Eritrėja";}s:2:"ES";a:1:{i:0;s:8:"Ispanija";}s:2:"ET";a:1:{i:0;s:8:"Etiopija";}s:2:"FI";a:1:{i:0;s:7:"Suomija";}s:2:"FJ";a:1:{i:0;s:7:"Fidžis";}s:2:"FK";a:1:{i:0;s:26:"Folklendo salos (Malvinai)";}s:2:"FM";a:1:{i:0;s:35:"Mikronezijos Federacinės Valstijos";}s:2:"FO";a:1:{i:0;s:13:"Farerų salos";}s:2:"FR";a:1:{i:0;s:11:"Prancūzija";}s:2:"GA";a:1:{i:0;s:7:"Gabonas";}s:2:"GB";a:1:{i:0;s:19:"Didžioji Britanija";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:7:"Gruzija";}s:2:"GF";a:1:{i:0;s:19:"Prancūzijos Gviana";}s:2:"GH";a:1:{i:0;s:4:"Gana";}s:2:"GI";a:1:{i:0;s:11:"Gibraltaras";}s:2:"GL";a:1:{i:0;s:11:"Grenlandija";}s:2:"GM";a:1:{i:0;s:7:"Gambija";}s:2:"GN";a:1:{i:0;s:8:"Gvinėja";}s:2:"GP";a:1:{i:0;s:10:"Gvadelupė";}s:2:"GQ";a:1:{i:0;s:20:"Ekvatorinė Gvinėja";}s:2:"GR";a:1:{i:0;s:8:"Graikija";}s:2:"GS";a:1:{i:0;s:41:"Rytų Džordžija ir Rytų Sandwich salos";}s:2:"GT";a:1:{i:0;s:9:"Gvatemala";}s:2:"GU";a:1:{i:0;s:6:"Guamas";}s:2:"GW";a:1:{i:0;s:14:"Gvinėja-Bisau";}s:2:"GY";a:1:{i:0;s:6:"Gviana";}s:2:"HK";a:1:{i:0;s:23:"Kinijos S.A.R.Honkongas";}s:2:"HM";a:1:{i:0;s:23:"Heard ir McDonald salos";}s:2:"HN";a:1:{i:0;s:9:"Hondūras";}s:2:"HR";a:1:{i:0;s:8:"Kroatija";}s:2:"HT";a:1:{i:0;s:6:"Haitis";}s:2:"HU";a:1:{i:0;s:8:"Vengrija";}s:2:"ID";a:1:{i:0;s:10:"Indonezija";}s:2:"IE";a:1:{i:0;s:6:"Airija";}s:2:"IL";a:1:{i:0;s:8:"Izraelis";}s:2:"IN";a:1:{i:0;s:6:"Indija";}s:2:"IO";a:1:{i:0;s:35:"Britų Indijos vandenyno teritorija";}s:2:"IQ";a:1:{i:0;s:6:"Irakas";}s:2:"IR";a:1:{i:0;s:5:"Irano";}s:2:"IS";a:1:{i:0;s:9:"Islandija";}s:2:"IT";a:1:{i:0;s:7:"Italija";}s:2:"JM";a:1:{i:0;s:7:"Jamaika";}s:2:"JO";a:1:{i:0;s:9:"Jordanija";}s:2:"JP";a:1:{i:0;s:8:"Japonija";}s:
2:"KE";a:1:{i:0;s:6:"Kenija";}s:2:"KG";a:1:{i:0;s:11:"Kirgiztanas";}s:2:"KH";a:1:{i:0;s:9:"Kambodža";}s:2:"KI";a:1:{i:0;s:9:"Kiribatis";}s:2:"KM";a:1:{i:0;s:7:"Komorai";}s:2:"KN";a:1:{i:0;s:20:"Sent Kitsas ir Nevis";}s:2:"KP";a:1:{i:0;s:17:"Šiaurės Korėja";}s:2:"KR";a:1:{i:0;s:14:"Pietų Korėja";}s:2:"KW";a:1:{i:0;s:8:"Kuveitas";}s:2:"KY";a:1:{i:0;s:14:"Kaimanų salos";}s:2:"KZ";a:1:{i:0;s:12:"Kazachstanas";}s:2:"LA";a:1:{i:0;s:38:"Laoso Liaudies Demokratinė Respublika";}s:2:"LB";a:1:{i:0;s:7:"Libanas";}s:2:"LC";a:1:{i:0;s:17:"Šventoji Liucija";}s:2:"LI";a:1:{i:0;s:15:"Lichtenšteinas";}s:2:"LK";a:1:{i:0;s:10:"Šri Lanka";}s:2:"LR";a:1:{i:0;s:8:"Liberija";}s:2:"LS";a:1:{i:0;s:7:"Lesotas";}s:2:"LT";a:1:{i:0;s:7:"Lietuva";}s:2:"LU";a:1:{i:0;s:13:"Liuksemburgas";}s:2:"LV";a:1:{i:0;s:7:"Latvija";}s:2:"LY";a:1:{i:0;s:27:"Libijos Arabų Džamahirija";}s:2:"MA";a:1:{i:0;s:7:"Marokas";}s:2:"MC";a:1:{i:0;s:7:"Monakas";}s:2:"MD";a:1:{i:0;s:19:"Moldovos Respublika";}s:2:"MG";a:1:{i:0;s:12:"Madagaskaras";}s:2:"MH";a:1:{i:0;s:14:"Maršalo salos";}s:2:"MK";a:1:{i:0;s:22:"Makedonijos Respublika";}s:2:"ML";a:1:{i:0;s:5:"Malis";}s:2:"MM";a:1:{i:0;s:6:"Mjanma";}s:2:"MN";a:1:{i:0;s:9:"Mongolija";}s:2:"MO";a:1:{i:0;s:20:"Kinijos S.A.R. Makao";}s:2:"MP";a:1:{i:0;s:26:"Šiaurinės Marianos salos";}s:2:"MQ";a:1:{i:0;s:9:"Martinika";}s:2:"MR";a:1:{i:0;s:11:"Mauritanija";}s:2:"MS";a:1:{i:0;s:9:"Montserat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:10:"Mauricijus";}s:2:"MV";a:1:{i:0;s:8:"Maldivai";}s:2:"MW";a:1:{i:0;s:7:"Malavis";}s:2:"MX";a:1:{i:0;s:7:"Meksika";}s:2:"MY";a:1:{i:0;s:9:"Malaizija";}s:2:"MZ";a:1:{i:0;s:10:"Mozambikas";}s:2:"NA";a:1:{i:0;s:8:"Namibija";}s:2:"NC";a:1:{i:0;s:18:"Naujoji Kaledonija";}s:2:"NE";a:1:{i:0;s:7:"Nigeris";}s:2:"NF";a:1:{i:0;s:13:"Norfolko sala";}s:2:"NG";a:1:{i:0;s:8:"Nigerija";}s:2:"NI";a:1:{i:0;s:9:"Nikaragva";}s:2:"NL";a:1:{i:0;s:11:"Nyderlandai";}s:2:"NO";a:1:{i:0;s:9:"Norvegija";}s:2:"NP";a:1:{i:0;s:7:"Nepalas";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:6:"Niujė";}s:2:"N
Z";a:1:{i:0;s:17:"Naujoji Zelandija";}s:2:"OM";a:1:{i:0;s:6:"Omanas";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:21:"Prancūzų Polinezija";}s:2:"PG";a:1:{i:0;s:22:"Papua Naujoji Gvinėja";}s:2:"PH";a:1:{i:0;s:9:"Filipinai";}s:2:"PK";a:1:{i:0;s:10:"Pakistanas";}s:2:"PL";a:1:{i:0;s:7:"Lenkija";}s:2:"PM";a:1:{i:0;s:23:"Sen Pjeras ir Mikelonas";}s:2:"PN";a:1:{i:0;s:9:"Pitkernas";}s:2:"PR";a:1:{i:0;s:12:"Puerto Rikas";}s:2:"PS";a:1:{i:0;s:21:"Palestinos teritorija";}s:2:"PT";a:1:{i:0;s:11:"Portugalija";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:10:"Paragvajus";}s:2:"QA";a:1:{i:0;s:7:"Kataras";}s:2:"RE";a:1:{i:0;s:10:"Rejunjonas";}s:2:"RO";a:1:{i:0;s:8:"Rumunija";}s:2:"RU";a:1:{i:0;s:18:"Rusijos Federacija";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SA";a:1:{i:0;s:13:"Saudo Arabija";}s:2:"SB";a:1:{i:0;s:15:"Saliamono salos";}s:2:"SC";a:1:{i:0;s:10:"Seišeliai";}s:2:"SD";a:1:{i:0;s:7:"Sudanas";}s:2:"SE";a:1:{i:0;s:8:"Švedija";}s:2:"SG";a:1:{i:0;s:11:"Singapūras";}s:2:"SH";a:1:{i:0;s:15:"Šventoji Elena";}s:2:"SI";a:1:{i:0;s:10:"Slovėnija";}s:2:"SJ";a:1:{i:0;s:28:"Svalbardo ir Jan Majen salos";}s:2:"SK";a:1:{i:0;s:8:"Slovakia";}s:2:"SL";a:1:{i:0;s:12:"Siera Leonė";}s:2:"SM";a:1:{i:0;s:11:"San Marinas";}s:2:"SN";a:1:{i:0;s:9:"Senegalas";}s:2:"SO";a:1:{i:0;s:7:"Somalis";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:9:"Surinamas";}s:2:"ST";a:1:{i:0;s:22:"San Tomė ir Principė";}s:2:"SV";a:1:{i:0;s:13:"El Salvadoras";}s:2:"SY";a:1:{i:0;s:6:"Sirija";}s:2:"SZ";a:1:{i:0;s:11:"Svazilendas";}s:2:"TC";a:1:{i:0;s:21:"Turks ir Kaikos salos";}s:2:"TD";a:1:{i:0;s:6:"Čadas";}s:2:"TF";a:1:{i:0;s:32:"Prancūzų pietinės teritorijos";}s:2:"TG";a:1:{i:0;s:5:"Togas";}s:2:"TH";a:1:{i:0;s:9:"Tailandas";}s:2:"TJ";a:1:{i:0;s:10:"Tadžikija";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:13:"Rytų Timoras";}s:2:"TM";a:1:{i:0;s:15:"Turkmėnistanas";}s:2:"TN";a:1:{i:0;s:7:"Tunisas";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:7:"Turkija";}s:2:"TT";a:1:{i:0;s:21:"Trinidadas ir 
Tobagas";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TZ";a:1:{i:0;s:9:"Tanzanija";}s:2:"UA";a:1:{i:0;s:7:"Ukraina";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:33:"JAV antraeilÄ—s teritorijos salos";}s:2:"US";a:1:{i:0;s:13:"United States";}s:2:"UY";a:1:{i:0;s:9:"Urugvajus";}s:2:"UZ";a:1:{i:0;s:8:"Uzbekija";}s:2:"VA";a:1:{i:0;s:24:"Vatikano Miesto Valstija";}s:2:"VC";a:1:{i:0;s:34:"Å ventasis Vincentas ir Grenadinai";}s:2:"VE";a:1:{i:0;s:9:"Venesuela";}s:2:"VG";a:1:{i:0;s:23:"Britų Virginijos salos";}s:2:"VI";a:1:{i:0;s:20:"JAV Virginijos salos";}s:2:"VN";a:1:{i:0;s:9:"Vietnamas";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:22:"Valiso ir Futuna salos";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:7:"Jemenas";}s:2:"YT";a:1:{i:0;s:7:"MajotÄ—";}s:2:"YU";a:1:{i:0;s:11:"Jugoslavija";}s:2:"ZA";a:1:{i:0;s:13:"Pietų Afrika";}s:2:"ZM";a:1:{i:0;s:7:"Zambija";}s:2:"ZW";a:1:{i:0;s:9:"ZimbabvÄ—";}}s:10:"Currencies";a:1:{s:3:"LTL";a:2:{i:0;s:2:"Lt";i:1;s:3:"LTL";}}s:9:"Languages";a:30:{s:2:"ar";a:1:{i:0;s:6:"Arabų";}s:2:"bg";a:1:{i:0;s:8:"Bulgarų";}s:2:"cs";a:1:{i:0;s:8:"ÄŒekijos";}s:2:"da";a:1:{i:0;s:5:"Danų";}s:2:"de";a:1:{i:0;s:10:"VokieÄių";}s:2:"el";a:1:{i:0;s:7:"Graikų";}s:2:"en";a:1:{i:0;s:6:"Anglų";}s:2:"es";a:1:{i:0;s:7:"Ispanų";}s:2:"et";a:1:{i:0;s:5:"Estų";}s:2:"fi";a:1:{i:0;s:7:"Suomių";}s:2:"fr";a:1:{i:0;s:10:"PrancÅ«zų";}s:2:"he";a:1:{i:0;s:8:"Hebrajų";}s:2:"hr";a:1:{i:0;s:7:"Kroatų";}s:2:"hu";a:1:{i:0;s:7:"Vengrų";}s:2:"it";a:1:{i:0;s:6:"Italų";}s:2:"ja";a:1:{i:0;s:7:"Japonų";}s:2:"ko";a:1:{i:0;s:13:"KorÄ—jieÄių";}s:2:"lt";a:1:{i:0;s:9:"Lietuvių";}s:2:"lv";a:1:{i:0;s:7:"Latvių";}s:2:"nl";a:1:{i:0;s:7:"Olandų";}s:2:"no";a:1:{i:0;s:8:"Norvegų";}s:2:"pl";a:1:{i:0;s:6:"Lenkų";}s:2:"pt";a:1:{i:0;s:10:"Portugalų";}s:2:"ro";a:1:{i:0;s:7:"Rumunų";}s:2:"ru";a:1:{i:0;s:5:"Rusų";}s:2:"sk";a:1:{i:0;s:8:"Slovakų";}s:2:"sl";a:1:{i:0;s:9:"SlovÄ—nų";}s:2:"sv";a:1:{i:0;s:7:"Å vedų";}s:2:"tr";a:1:{i:0;s:6:"Turkų";}s:2:"zh";a:1:{i:0;s:5:"Kinų";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Lat
n";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:26:"yyyy 'm.' MMMM d 'd.',EEEE";i:5;s:21:"yyyy 'm.' MMMM d 'd.'";i:6;s:10:"yyyy.MM.dd";i:7;s:10:"yyyy.MM.dd";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:2:"Sk";i:1;s:2:"Pr";i:2;s:2:"An";i:3;s:2:"Tr";i:4;s:2:"Kt";i:5;s:2:"Pn";i:6;s:3:"Å t";}s:4:"wide";a:7:{i:0;s:11:"Sekmadienis";i:1;s:11:"Pirmadienis";i:2;s:11:"Antradienis";i:3;s:13:"TreÄiadienis";i:4;s:14:"Ketvirtadienis";i:5;s:12:"Penktadienis";i:6;s:13:"Å eÅ¡tadienis";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:6:"pr.Kr.";i:1;s:6:"po.Kr.";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"Sau";i:1;s:3:"Vas";i:2;s:3:"Kov";i:3;s:3:"Bal";i:4;s:3:"Geg";i:5;s:3:"Bir";i:6;s:3:"Lie";i:7;s:3:"Rgp";i:8;s:3:"Rgs";i:9;s:3:"Spa";i:10;s:3:"Lap";i:11;s:3:"Grd";}s:4:"wide";a:12:{i:0;s:6:"Sausio";i:1;s:7:"Vasario";i:2;s:4:"Kovo";i:3;s:10:"Balandžio";i:4;s:9:"Gegužės";i:5;s:9:"Birželio";i:6;s:6:"Liepos";i:7;s:11:"RugpjÅ«Äio";i:8;s:8:"RugsÄ—jo";i:9;s:6:"Spalio";i:10;s:10:"LapkriÄio";i:11;s:9:"Gruodžio";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lt_LT.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lt_LT.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lt_LT.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"##,##0.##;-##,##0.##";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:5:"#,##%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lv.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lv.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lv.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:8:{s:9:"Countries";a:239:{s:2:"AD";a:1:{i:0;s:6:"Andora";}s:2:"AE";a:1:{i:0;s:26:"Apvienotie ArÄbu EmirÄti";}s:2:"AF";a:1:{i:0;s:12:"AfganistÄna";}s:2:"AG";a:1:{i:0;s:18:"Antigva un Barbuda";}s:2:"AI";a:1:{i:0;s:7:"Angilja";}s:2:"AL";a:1:{i:0;s:9:"AlbÄnija";}s:2:"AM";a:1:{i:0;s:9:"ArmÄ“nija";}s:2:"AN";a:1:{i:0;s:8:"Antiļas";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarktika";}s:2:"AR";a:1:{i:0;s:10:"ArgentÄ«na";}s:2:"AS";a:1:{i:0;s:17:"AmerikÄņu Samoa";}s:2:"AT";a:1:{i:0;s:8:"Austrija";}s:2:"AU";a:1:{i:0;s:11:"AustrÄlija";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:14:"AzerbaidžÄna";}s:2:"BA";a:1:{i:0;s:22:"Bosnija un Hercegovina";}s:2:"BB";a:1:{i:0;s:9:"Barbadosa";}s:2:"BD";a:1:{i:0;s:11:"BangladeÅ¡a";}s:2:"BE";a:1:{i:0;s:9:"Beļģija";}s:2:"BF";a:1:{i:0;s:11:"Burkinafaso";}s:2:"BG";a:1:{i:0;s:10:"BulgÄrija";}s:2:"BH";a:1:{i:0;s:8:"Bahreina";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:6:"Benina";}s:2:"BM";a:1:{i:0;s:13:"Bermudu salas";}s:2:"BN";a:1:{i:0;s:7:"Bruneja";}s:2:"BO";a:1:{i:0;s:9:"BolÄ«vija";}s:2:"BR";a:1:{i:0;s:10:"BrazÄ«lija";}s:2:"BS";a:1:{i:0;s:7:"Bahamas";}s:2:"BT";a:1:{i:0;s:7:"ButÄna";}s:2:"BV";a:1:{i:0;s:10:"BuvÄ“ sala";}s:2:"BW";a:1:{i:0;s:9:"BotsvÄna";}s:2:"BY";a:1:{i:0;s:12:"Baltkrievija";}s:2:"BZ";a:1:{i:0;s:6:"Beliza";}s:2:"CA";a:1:{i:0;s:7:"KanÄda";}s:2:"CC";a:1:{i:0;s:23:"Kokosu (KÄ«linga) salas";}s:2:"CD";a:1:{i:0;s:30:"Kongo DemokrÄtiskÄ Republika";}s:2:"CF";a:1:{i:0;s:26:"CentrÄlÄfrikas Republika";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:7:"Å veice";}s:2:"CI";a:1:{i:0;s:11:"KotdivuÄra";}s:2:"CK";a:1:{i:0;s:10:"Kuka salas";}s:2:"CL";a:1:{i:0;s:6:"Čīle";}s:2:"CM";a:1:{i:0;s:9:"KamerÅ«na";}s:2:"CN";a:1:{i:0;s:6:"Ķīna";}s:2:"CO";a:1:{i:0;s:9:"Kolumbija";}s:2:"CR";a:1:{i:0;s:9:"Kostarika";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:9:"Kaboverde";}s:2:"CX";a:1:{i:0;s:16:"ZiemsvÄ“tku sala";}s:2:"CY";a:1:{i:0;s:5:"Kipra";}s:2:"CZ";a:1:{i:0;s:7:"ÄŒehija";}s:2:"DE";a:1:{i:0;s:7:"VÄcija";}s:2:"DJ";a:1:{i:0;s:10:"Dži
butija";}s:2:"DK";a:1:{i:0;s:7:"DÄnija";}s:2:"DM";a:1:{i:0;s:8:"Dominika";}s:2:"DO";a:1:{i:0;s:22:"DominikÄnas Republika";}s:2:"DZ";a:1:{i:0;s:10:"Alžīrija";}s:2:"EC";a:1:{i:0;s:8:"Ekvadora";}s:2:"EE";a:1:{i:0;s:8:"Igaunija";}s:2:"EG";a:1:{i:0;s:8:"Ä’Ä£ipte";}s:2:"EH";a:1:{i:0;s:13:"RietumsahÄra";}s:2:"ER";a:1:{i:0;s:8:"Eritreja";}s:2:"ES";a:1:{i:0;s:8:"SpÄnija";}s:2:"ET";a:1:{i:0;s:8:"Etiopija";}s:2:"FI";a:1:{i:0;s:6:"Somija";}s:2:"FJ";a:1:{i:0;s:6:"Fidži";}s:2:"FK";a:1:{i:0;s:15:"Folklenda salas";}s:2:"FM";a:1:{i:0;s:35:"MikronÄ“zijas FederatÄ«vÄs Valstis";}s:2:"FO";a:1:{i:0;s:13:"FarÄ“ru salas";}s:2:"FR";a:1:{i:0;s:8:"Francija";}s:2:"GA";a:1:{i:0;s:6:"Gabona";}s:2:"GB";a:1:{i:0;s:14:"LielbritÄnija";}s:2:"GD";a:1:{i:0;s:8:"GrenÄda";}s:2:"GE";a:1:{i:0;s:7:"Gruzija";}s:2:"GF";a:1:{i:0;s:15:"FranÄu GviÄna";}s:2:"GH";a:1:{i:0;s:4:"Gana";}s:2:"GI";a:1:{i:0;s:11:"GibraltÄrs";}s:2:"GL";a:1:{i:0;s:9:"Grenlande";}s:2:"GM";a:1:{i:0;s:7:"Gambija";}s:2:"GN";a:1:{i:0;s:7:"Gvineja";}s:2:"GP";a:1:{i:0;s:9:"Gvadelupa";}s:2:"GQ";a:1:{i:0;s:21:"EkvatoriÄlÄ Gvineja";}s:2:"GR";a:1:{i:0;s:9:"GrieÄ·ija";}s:2:"GS";a:1:{i:0;s:44:"Dienviddžordžija un DienvidsendviÄu salas";}s:2:"GT";a:1:{i:0;s:9:"Gvatemala";}s:2:"GU";a:1:{i:0;s:5:"Guama";}s:2:"GW";a:1:{i:0;s:14:"Gvineja-Bisava";}s:2:"GY";a:1:{i:0;s:7:"GajÄna";}s:2:"HK";a:1:{i:0;s:47:"Honkonga, Ķīnas Ä«paÅ¡Äs pÄrvaldes apgabals";}s:2:"HM";a:1:{i:0;s:26:"HÄ“rda un Makdonalda salas";}s:2:"HN";a:1:{i:0;s:9:"Hondurasa";}s:2:"HR";a:1:{i:0;s:10:"HorvÄtija";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:9:"UngÄrija";}s:2:"ID";a:1:{i:0;s:11:"IndonÄ“zija";}s:2:"IE";a:1:{i:0;s:6:"Īrija";}s:2:"IL";a:1:{i:0;s:8:"IzraÄ“la";}s:2:"IN";a:1:{i:0;s:6:"Indija";}s:2:"IO";a:1:{i:0;s:32:"Britu Indijas okeÄna teritorija";}s:2:"IQ";a:1:{i:0;s:6:"IrÄka";}s:2:"IR";a:1:{i:0;s:6:"IrÄna";}s:2:"IS";a:1:{i:0;s:7:"Islande";}s:2:"IT";a:1:{i:0;s:8:"ItÄlija";}s:2:"JM";a:1:{i:0;s:7:"Jamaika";}s:2:"JO";a:1:{i:0;s:10:"JordÄnija";}s:2:"JP";a:1:{i:0;s:7:"JapÄna";}s:2:"KE";a:1:{i:0;s:6:"Ken
ija";}s:2:"KG";a:1:{i:0;s:10:"KirgÄ«zija";}s:2:"KH";a:1:{i:0;s:9:"Kambodža";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:12:"Komoru salas";}s:2:"KN";a:1:{i:0;s:19:"Sentkitsa un Nevisa";}s:2:"KP";a:1:{i:0;s:13:"Ziemeļkoreja";}s:2:"KR";a:1:{i:0;s:13:"Dienvidkoreja";}s:2:"KW";a:1:{i:0;s:7:"Kuveita";}s:2:"KY";a:1:{i:0;s:13:"Kaimanu salas";}s:2:"KZ";a:1:{i:0;s:11:"KazahstÄna";}s:2:"LA";a:1:{i:0;s:5:"Laosa";}s:2:"LB";a:1:{i:0;s:7:"LibÄna";}s:2:"LC";a:1:{i:0;s:11:"SentlÅ«sija";}s:2:"LI";a:1:{i:0;s:13:"LihtenÅ¡teina";}s:2:"LK";a:1:{i:0;s:9:"Å rilanka";}s:2:"LR";a:1:{i:0;s:9:"LibÄ“rija";}s:2:"LS";a:1:{i:0;s:6:"Lesoto";}s:2:"LT";a:1:{i:0;s:7:"Lietuva";}s:2:"LU";a:1:{i:0;s:11:"Luksemburga";}s:2:"LV";a:1:{i:0;s:7:"Latvija";}s:2:"LY";a:1:{i:0;s:7:"LÄ«bija";}s:2:"MA";a:1:{i:0;s:6:"Maroka";}s:2:"MC";a:1:{i:0;s:6:"Monako";}s:2:"MD";a:1:{i:0;s:7:"Moldova";}s:2:"MG";a:1:{i:0;s:11:"Madagaskara";}s:2:"MH";a:1:{i:0;s:15:"MÄrÅ¡ala salas";}s:2:"MK";a:1:{i:0;s:11:"MaÄ·edonija";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:6:"Mjanma";}s:2:"MN";a:1:{i:0;s:9:"Mongolija";}s:2:"MO";a:1:{i:0;s:44:"Makao, Ķīnas Ä«paÅ¡Äs pÄrvaldes apgabals";}s:2:"MP";a:1:{i:0;s:17:"Ziemeļu Marianas";}s:2:"MQ";a:1:{i:0;s:9:"Martinika";}s:2:"MR";a:1:{i:0;s:12:"MauritÄnija";}s:2:"MS";a:1:{i:0;s:11:"Montserrata";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:10:"MaurÄ«cija";}s:2:"MV";a:1:{i:0;s:10:"MaldÄ«vija";}s:2:"MW";a:1:{i:0;s:9:"MalÄvija";}s:2:"MX";a:1:{i:0;s:7:"Meksika";}s:2:"MY";a:1:{i:0;s:9:"Malaizija";}s:2:"MZ";a:1:{i:0;s:9:"Mozambika";}s:2:"NA";a:1:{i:0;s:9:"NamÄ«bija";}s:2:"NC";a:1:{i:0;s:14:"Jaunkaledonija";}s:2:"NE";a:1:{i:0;s:7:"NigÄ“ra";}s:2:"NF";a:1:{i:0;s:8:"Norfolka";}s:2:"NG";a:1:{i:0;s:9:"NigÄ“rija";}s:2:"NI";a:1:{i:0;s:9:"Nikaragva";}s:2:"NL";a:1:{i:0;s:11:"NÄ«derlande";}s:2:"NO";a:1:{i:0;s:11:"NorvÄ“Ä£ija";}s:2:"NP";a:1:{i:0;s:7:"NepÄla";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:12:"JaunzÄ“lande";}s:2:"OM";a:1:{i:0;s:6:"OmÄna";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:
1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:19:"FranÄu PolinÄ“zija";}s:2:"PG";a:1:{i:0;s:17:"Papua-Jaungvineja";}s:2:"PH";a:1:{i:0;s:10:"FilipÄ«nas";}s:2:"PK";a:1:{i:0;s:10:"PakistÄna";}s:2:"PL";a:1:{i:0;s:6:"Polija";}s:2:"PM";a:1:{i:0;s:21:"SenpjÄ“ra un Mikelona";}s:2:"PN";a:1:{i:0;s:9:"PitkÄ“rna";}s:2:"PR";a:1:{i:0;s:10:"Puertoriko";}s:2:"PS";a:1:{i:0;s:40:"PalestÄ«nieÅ¡u paÅ¡pÄrvaldes teritorija";}s:2:"PT";a:1:{i:0;s:10:"PortugÄle";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:9:"Paragvaja";}s:2:"QA";a:1:{i:0;s:6:"Katara";}s:2:"RE";a:1:{i:0;s:8:"Reinjona";}s:2:"RO";a:1:{i:0;s:9:"RumÄnija";}s:2:"RU";a:1:{i:0;s:8:"Krievija";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SA";a:1:{i:0;s:15:"SaÅ«da ArÄbija";}s:2:"SB";a:1:{i:0;s:15:"ZÄlamana salas";}s:2:"SC";a:1:{i:0;s:15:"SeiÅ¡eļu salas";}s:2:"SD";a:1:{i:0;s:7:"SudÄna";}s:2:"SE";a:1:{i:0;s:9:"Zviedrija";}s:2:"SG";a:1:{i:0;s:10:"SingapÅ«ra";}s:2:"SH";a:1:{i:0;s:17:"Sv. HelÄ“nas sala";}s:2:"SI";a:1:{i:0;s:10:"SlovÄ“nija";}s:2:"SJ";a:1:{i:0;s:29:"SvalbÄra un Jana Majena sala";}s:2:"SK";a:1:{i:0;s:10:"SlovÄkija";}s:2:"SL";a:1:{i:0;s:11:"Sjerraleone";}s:2:"SM";a:1:{i:0;s:10:"SanmarÄ«no";}s:2:"SN";a:1:{i:0;s:9:"SenegÄla";}s:2:"SO";a:1:{i:0;s:9:"SomÄlija";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:8:"Surinama";}s:2:"ST";a:1:{i:0;s:19:"Santome un Prinsipi";}s:2:"SV";a:1:{i:0;s:9:"Salvadora";}s:2:"SY";a:1:{i:0;s:7:"SÄ«rija";}s:2:"SZ";a:1:{i:0;s:10:"Svazilenda";}s:2:"TC";a:1:{i:0;s:26:"TÄ“rksas un Kaikosas salas";}s:2:"TD";a:1:{i:0;s:5:"ÄŒada";}s:2:"TF";a:1:{i:0;s:28:"FranÄu dienvidu teritorijas";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:7:"Taizeme";}s:2:"TJ";a:1:{i:0;s:14:"TadžikistÄna";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:13:"Austrumtimora";}s:2:"TM";a:1:{i:0;s:14:"TurkmenistÄna";}s:2:"TN";a:1:{i:0;s:8:"Tunisija";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:7:"Turcija";}s:2:"TT";a:1:{i:0;s:21:"TrinidÄda un TobÄgo";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TZ";a:1:{i:0;s:10:"TanzÄnija";}s:2:"UA";a:1:{i:0;s:7:"Ukraina";}s:2:
"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:32:"ASV mazÄs aizjÅ«ras teritorijas";}s:2:"US";a:1:{i:0;s:13:"United States";}s:2:"UY";a:1:{i:0;s:8:"Urugvaja";}s:2:"UZ";a:1:{i:0;s:12:"UzbekistÄna";}s:2:"VA";a:1:{i:0;s:9:"VatikÄns";}s:2:"VC";a:1:{i:0;s:27:"Sentvinsenta un GrenadÄ«nas";}s:2:"VE";a:1:{i:0;s:10:"VenecuÄ“la";}s:2:"VG";a:1:{i:0;s:22:"Britu Virdžīnu salas";}s:2:"VI";a:1:{i:0;s:28:"AmerikÄņu Virdžīnu salas";}s:2:"VN";a:1:{i:0;s:8:"Vjetnama";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:16:"Volisa un Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:6:"Jemena";}s:2:"YT";a:1:{i:0;s:6:"Majota";}s:2:"YU";a:1:{i:0;s:15:"DienvidslÄvija";}s:2:"ZA";a:1:{i:0;s:14:"DienvidÄfrika";}s:2:"ZM";a:1:{i:0;s:7:"Zambija";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabve";}}s:10:"Currencies";a:1:{s:3:"LVL";a:2:{i:0;s:2:"Ls";i:1;s:3:"LVL";}}s:9:"Languages";a:30:{s:2:"ar";a:1:{i:0;s:6:"arÄbu";}s:2:"bg";a:1:{i:0;s:8:"bulgÄru";}s:2:"cs";a:1:{i:0;s:5:"Äehu";}s:2:"da";a:1:{i:0;s:6:"dÄņu";}s:2:"de";a:1:{i:0;s:5:"vÄcu";}s:2:"el";a:1:{i:0;s:7:"grieÄ·u";}s:2:"en";a:1:{i:0;s:6:"angļu";}s:2:"es";a:1:{i:0;s:7:"spÄņu";}s:2:"et";a:1:{i:0;s:7:"igauņu";}s:2:"fi";a:1:{i:0;s:4:"somu";}s:2:"fr";a:1:{i:0;s:7:"franÄu";}s:2:"he";a:1:{i:0;s:6:"ivrits";}s:2:"hr";a:1:{i:0;s:8:"horvÄtu";}s:2:"hu";a:1:{i:0;s:7:"ungÄru";}s:2:"it";a:1:{i:0;s:10:"itÄlieÅ¡u";}s:2:"ja";a:1:{i:0;s:8:"japÄņu";}s:2:"ko";a:1:{i:0;s:10:"korejieÅ¡u";}s:2:"lt";a:1:{i:0;s:11:"lietuvieÅ¡u";}s:2:"lv";a:1:{i:0;s:9:"latvieÅ¡u";}s:2:"nl";a:1:{i:0;s:11:"holandieÅ¡u";}s:2:"no";a:1:{i:0;s:9:"norvÄ“Ä£u";}s:2:"pl";a:1:{i:0;s:5:"poļu";}s:2:"pt";a:1:{i:0;s:11:"portugÄļu";}s:2:"ro";a:1:{i:0;s:8:"rumÄņu";}s:2:"ru";a:1:{i:0;s:6:"krievu";}s:2:"sk";a:1:{i:0;s:8:"slovÄku";}s:2:"sl";a:1:{i:0;s:9:"slovēņu";}s:2:"sv";a:1:{i:0;s:7:"zviedru";}s:2:"tr";a:1:{i:0;s:5:"turku";}s:2:"zh";a:1:{i:0;s:10:"Ä·Ä«nieÅ¡u";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:
1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:26:"EEEE, yyyy'. gada 'd. MMMM";i:5;s:20:"yyyy'. gada 'd. MMMM";i:6;s:8:"yyyy.d.M";i:7;s:6:"yy.d.M";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:2:"Sv";i:1;s:1:"P";i:2;s:1:"O";i:3;s:1:"T";i:4;s:1:"C";i:5;s:2:"Pk";i:6;s:1:"S";}s:4:"wide";a:7:{i:0;s:10:"svÄ“tdiena";i:1;s:9:"pirmdiena";i:2;s:8:"otrdiena";i:3;s:10:"treÅ¡diena";i:4;s:11:"ceturtdiena";i:5;s:10:"piektdiena";i:6;s:9:"sestdiena";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:4:"pmÄ“";i:1;s:3:"mÄ“";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"Jan";i:1;s:3:"Feb";i:2;s:3:"Mar";i:3;s:3:"Apr";i:4;s:3:"Mai";i:5;s:4:"JÅ«n";i:6;s:4:"JÅ«l";i:7;s:3:"Aug";i:8;s:3:"Sep";i:9;s:3:"Okt";i:10;s:3:"Nov";i:11;s:3:"Dec";}s:4:"wide";a:12:{i:0;s:9:"janvÄris";i:1;s:10:"februÄris";i:2;s:5:"marts";i:3;s:8:"aprÄ«lis";i:4;s:5:"maijs";i:5;s:7:"jÅ«nijs";i:6;s:7:"jÅ«lijs";i:7;s:7:"augusts";i:8;s:10:"septembris";i:9;s:8:"oktobris";i:10;s:9:"novembris";i:11;s:9:"decembris";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lv_LV.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lv_LV.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/lv_LV.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mk.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mk.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mk.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:10:{s:9:"Countries";a:239:{s:2:"AD";a:1:{i:0;s:12:"Ðндора";}s:2:"AE";a:1:{i:0;s:48:"Обединети ÐрапÑки Емирати";}s:2:"AF";a:1:{i:0;s:20:"ÐвганиÑтан";}s:2:"AG";a:1:{i:0;s:32:"Ðнтигуа и Барбуда";}s:2:"AI";a:1:{i:0;s:14:"Ðнгвила";}s:2:"AL";a:1:{i:0;s:16:"Ðлбанија";}s:2:"AM";a:1:{i:0;s:16:"Ерменија";}s:2:"AN";a:1:{i:0;s:31:"ХоландÑки Ðнтили";}s:2:"AO";a:1:{i:0;s:12:"Ðнгола";}s:2:"AQ";a:1:{i:0;s:18:"Ðнтарктик";}s:2:"AR";a:1:{i:0;s:18:"Ðргентина";}s:2:"AS";a:1:{i:0;s:33:"ÐмериканÑка Самоа";}s:2:"AT";a:1:{i:0;s:16:"ÐвÑтрија";}s:2:"AU";a:1:{i:0;s:20:"ÐвÑтралија";}s:2:"AW";a:1:{i:0;s:10:"Ðруба";}s:2:"AZ";a:1:{i:0;s:20:"Ðзејберџан";}s:2:"BA";a:1:{i:0;s:36:"БоÑна и Херцеговина";}s:2:"BB";a:1:{i:0;s:16:"БарбадоÑ";}s:2:"BD";a:1:{i:0;s:18:"Бангладеш";}s:2:"BE";a:1:{i:0;s:14:"Белгија";}s:2:"BF";a:1:{i:0;s:23:"Буркина ФаÑо";}s:2:"BG";a:1:{i:0;s:16:"Бугарија";}s:2:"BH";a:1:{i:0;s:14:"Бахреин";}s:2:"BI";a:1:{i:0;s:14:"Бурунди";}s:2:"BJ";a:1:{i:0;s:10:"Бенин";}s:2:"BM";a:1:{i:0;s:14:"Бермуди";}s:2:"BN";a:1:{i:0;s:12:"Брунеи";}s:2:"BO";a:1:{i:0;s:16:"Боливија";}s:2:"BR";a:1:{i:0;s:12:"Бразил";}s:2:"BS";a:1:{i:0;s:12:"Бахами";}s:2:"BT";a:1:{i:0;s:10:"Бутан";}s:2:"BV";a:1:{i:0;s:33:"Боувитови оÑтрови";}s:2:"BW";a:1:{i:0;s:14:"Боцвана";}s:2:"BY";a:1:{i:0;s:20:"БелоруÑија";}s:2:"BZ";a:1:{i:0;s:12:"Белизе";}s:2:"CA";a:1:{i:0;s:12:"Канада";}s:2:"CC";a:1:{i:0;s:31:"КокоÑови оÑтрови";}s:2:"CD";a:1:{i:0;s:52:"ДемократÑка Република Конго";}s:2:"CF";a:1:{i:0;s:52:"Централан Ðфричка република";}s:2:"CG";a:1:{i:0;s:10:"Конго";}s:2:"CH";a:1:{i:0;s:20:"Швајцарија";}s:2:"CI";a:1:{i:0;s:47:"Брегот на Слоновата КоÑка";}s:2:"CK"
;a:1:{i:0;s:27:"Кукови ОÑтрови";}s:2:"CL";a:1:{i:0;s:8:"Чиле";}s:2:"CM";a:1:{i:0;s:14:"Камерун";}s:2:"CN";a:1:{i:0;s:8:"Кина";}s:2:"CO";a:1:{i:0;s:18:"Колумбија";}s:2:"CR";a:1:{i:0;s:18:"КоÑтарика";}s:2:"CU";a:1:{i:0;s:8:"Куба";}s:2:"CV";a:1:{i:0;s:37:"ЗеленортÑки ОÑтрови";}s:2:"CX";a:1:{i:0;s:29:"Божиќни ОÑтрови";}s:2:"CY";a:1:{i:0;s:10:"Кипар";}s:2:"CZ";a:1:{i:0;s:29:"Чешка Република";}s:2:"DE";a:1:{i:0;s:18:"Германија";}s:2:"DJ";a:1:{i:0;s:12:"Ðибути";}s:2:"DK";a:1:{i:0;s:12:"ДанÑка";}s:2:"DM";a:1:{i:0;s:16:"Доминика";}s:2:"DO";a:1:{i:0;s:43:"ДоминиканÑка Република";}s:2:"DZ";a:1:{i:0;s:10:"Ðлжир";}s:2:"EC";a:1:{i:0;s:14:"Еквадор";}s:2:"EE";a:1:{i:0;s:16:"ЕÑтонија";}s:2:"EG";a:1:{i:0;s:12:"Египет";}s:2:"EH";a:1:{i:0;s:27:"Западна Сахара";}s:2:"ER";a:1:{i:0;s:16:"Еритреја";}s:2:"ES";a:1:{i:0;s:14:"Шпанија";}s:2:"ET";a:1:{i:0;s:16:"Етиопија";}s:2:"FI";a:1:{i:0;s:12:"ФинÑка";}s:2:"FJ";a:1:{i:0;s:8:"Фиџи";}s:2:"FK";a:1:{i:0;s:35:"ФокландÑки ОÑтрови";}s:2:"FM";a:1:{i:0;s:22:"Микронезија";}s:2:"FO";a:1:{i:0;s:27:"ФарÑки ОÑтрови";}s:2:"FR";a:1:{i:0;s:16:"Франција";}s:2:"GA";a:1:{i:0;s:10:"Габон";}s:2:"GB";a:1:{i:0;s:31:"Велика Британија";}s:2:"GD";a:1:{i:0;s:14:"Гренада";}s:2:"GE";a:1:{i:0;s:14:"Ðорџија";}s:2:"GF";a:1:{i:0;s:29:"ФранцуÑка Гуана";}s:2:"GH";a:1:{i:0;s:8:"Гана";}s:2:"GI";a:1:{i:0;s:18:"Гилбартар";}s:2:"GL";a:1:{i:0;s:16:"Гренланд";}s:2:"GM";a:1:{i:0;s:14:"Гамбија";}s:2:"GN";a:1:{i:0;s:14:"Гвинеја";}s:2:"GP";a:1:{i:0;s:18:"Гвадалупе";}s:2:"GQ";a:1:{i:0;s:35:"ЕкваторÑка Гвинеја";}s:2:"GR";a:1:{i:0;s:12:"Грција";}s:2:"GS";a:1:{i:0;s:69:"Јужна Ðорџија и Јужни Сендвич ОÑтрови";}s:2:"GT";a:1:{i:0;s
:18:"Гватемала";}s:2:"GU";a:1:{i:0;s:8:"Гвам";}s:2:"GW";a:1:{i:0;s:21:"Гвинеа-БиÑа";}s:2:"GY";a:1:{i:0;s:14:"Гвајана";}s:2:"HK";a:1:{i:0;s:33:"Хон Конг С.Ð.Р Кина";}s:2:"HM";a:1:{i:0;s:66:"Хардови оÑтрови и Мекдоналд ОÑтрови";}s:2:"HN";a:1:{i:0;s:16:"ХондураÑ";}s:2:"HR";a:1:{i:0;s:16:"ХрватÑка";}s:2:"HT";a:1:{i:0;s:10:"Хаити";}s:2:"HU";a:1:{i:0;s:16:"Унгарија";}s:2:"ID";a:1:{i:0;s:20:"Индонезија";}s:2:"IE";a:1:{i:0;s:10:"ИрÑка";}s:2:"IL";a:1:{i:0;s:12:"Израел";}s:2:"IN";a:1:{i:0;s:12:"Индија";}s:2:"IO";a:1:{i:0;s:71:"БританÑко ИндиÑко ОкеанÑка територија";}s:2:"IQ";a:1:{i:0;s:8:"Ирак";}s:2:"IR";a:1:{i:0;s:8:"Иран";}s:2:"IS";a:1:{i:0;s:12:"ИÑланд";}s:2:"IT";a:1:{i:0;s:14:"Италија";}s:2:"JM";a:1:{i:0;s:14:"Јамајка";}s:2:"JO";a:1:{i:0;s:12:"Јордан";}s:2:"JP";a:1:{i:0;s:16:"Јапонија";}s:2:"KE";a:1:{i:0;s:12:"Кенија";}s:2:"KG";a:1:{i:0;s:18:"КургиÑтан";}s:2:"KH";a:1:{i:0;s:14:"Камбоџа";}s:2:"KI";a:1:{i:0;s:16:"Кирибати";}s:2:"KM";a:1:{i:0;s:14:"КомороÑ";}s:2:"KN";a:1:{i:0;s:41:"Сент КриÑтофер и ÐевиÑ";}s:2:"KP";a:1:{i:0;s:25:"Северна Кореа";}s:2:"KR";a:1:{i:0;s:21:"Јужна Кореа";}s:2:"KW";a:1:{i:0;s:12:"Кувајт";}s:2:"KY";a:1:{i:0;s:33:"Кајманови ОÑтрови";}s:2:"KZ";a:1:{i:0;s:18:"КазаџÑтан";}s:2:"LA";a:1:{i:0;s:8:"ЛаоÑ";}s:2:"LB";a:1:{i:0;s:14:"Либанон";}s:2:"LC";a:1:{i:0;s:23:"Света Лучија";}s:2:"LI";a:1:{i:0;s:22:"Лихтенштајн";}s:2:"LK";a:1:{i:0;s:17:"Шри Ланка";}s:2:"LR";a:1:{i:0;s:14:"Либериа";}s:2:"LS";a:1:{i:0;s:12:"Лешото";}s:2:"LT";a:1:{i:0;s:18:"Литванија";}s:2:"LU";a:1:{i:0;s:20:"ЛукÑембург";}s:2:"LV";a:1:{i:0;s:14:"Латвија";}s:2:"LY";a:1:{i:0;s:12:"Либија";}s:2:"MA";a:1:{i:0;s:12:"Мароко";}s:2:"MC";a:1:{i:0;s
:12:"Монако";}s:2:"MD";a:1:{i:0;s:14:"Молдова";}s:2:"MG";a:1:{i:0;s:20:"МадагаÑкар";}s:2:"MH";a:1:{i:0;s:33:"Маршалови ОСтрови";}s:2:"MK";a:1:{i:0;s:20:"Македонија";}s:2:"ML";a:1:{i:0;s:8:"Мали";}s:2:"MM";a:1:{i:0;s:14:"Муанмар";}s:2:"MN";a:1:{i:0;s:18:"Монголија";}s:2:"MO";a:1:{i:0;s:28:"Макао С.Ð.Р Кина";}s:2:"MP";a:1:{i:0;s:50:"Северни Маријанини ОÑтрови";}s:2:"MQ";a:1:{i:0;s:16:"Мартиник";}s:2:"MR";a:1:{i:0;s:22:"Мавританија";}s:2:"MS";a:1:{i:0;s:16:"МонÑерат";}s:2:"MT";a:1:{i:0;s:10:"Малта";}s:2:"MU";a:1:{i:0;s:16:"МауритуÑ";}s:2:"MV";a:1:{i:0;s:14:"Малдиви";}s:2:"MW";a:1:{i:0;s:12:"Малави";}s:2:"MX";a:1:{i:0;s:14:"МекÑико";}s:2:"MY";a:1:{i:0;s:16:"Малезија";}s:2:"MZ";a:1:{i:0;s:14:"Мозамбе";}s:2:"NA";a:1:{i:0;s:16:"Ðамибија";}s:2:"NC";a:1:{i:0;s:29:"Ðова Каледонија";}s:2:"NE";a:1:{i:0;s:10:"Ðигер";}s:2:"NF";a:1:{i:0;s:27:"Ðофролк ОÑтров";}s:2:"NG";a:1:{i:0;s:16:"Ðигерија";}s:2:"NI";a:1:{i:0;s:18:"Ðикараква";}s:2:"NL";a:1:{i:0;s:18:"Холандија";}s:2:"NO";a:1:{i:0;s:16:"Ðорвешка";}s:2:"NP";a:1:{i:0;s:10:"Ðепал";}s:2:"NR";a:1:{i:0;s:10:"Ðауру";}s:2:"NU";a:1:{i:0;s:6:"Ðие";}s:2:"NZ";a:1:{i:0;s:19:"Ðов Зеланд";}s:2:"OM";a:1:{i:0;s:8:"Оман";}s:2:"PA";a:1:{i:0;s:12:"Панама";}s:2:"PE";a:1:{i:0;s:8:"Перу";}s:2:"PF";a:1:{i:0;s:39:"ФранцуÑка Полинезија";}s:2:"PG";a:1:{i:0;s:34:"Папуа Ðова Гвинеја";}s:2:"PH";a:1:{i:0;s:16:"Филипини";}s:2:"PK";a:1:{i:0;s:16:"ПакиÑтан";}s:2:"PL";a:1:{i:0;s:12:"ПолÑка";}s:2:"PM";a:1:{i:0;s:35:"Сент Пјер и Микелан";}s:2:"PN";a:1:{i:0;s:14:"Питкарн";}s:2:"PR";a:1:{i:0;s:18:"Порторико";}s:2:"PS";a:1:{i:0;s:43:"ПалеÑтинÑка Територија";}s:2:"PT";a:1:{i:0;s:22:"Португалија";}s:2:"PW";a:1:{i:0
;s:10:"Палау";}s:2:"PY";a:1:{i:0;s:16:"Парагвај";}s:2:"QA";a:1:{i:0;s:12:"Кватар";}s:2:"RE";a:1:{i:0;s:16:"Рејунион";}s:2:"RO";a:1:{i:0;s:16:"Романија";}s:2:"RU";a:1:{i:0;s:12:"РуÑија";}s:2:"RW";a:1:{i:0;s:12:"Руанда";}s:2:"SA";a:1:{i:0;s:31:"СаудиÑка Ðрабија";}s:2:"SB";a:1:{i:0;s:39:"Соломоновите ОÑтрови";}s:2:"SC";a:1:{i:0;s:14:"Сејшели";}s:2:"SD";a:1:{i:0;s:10:"Судан";}s:2:"SE";a:1:{i:0;s:14:"ШведÑка";}s:2:"SG";a:1:{i:0;s:16:"Сингапур";}s:2:"SH";a:1:{i:0;s:21:"Света Елена";}s:2:"SI";a:1:{i:0;s:18:"Словенија";}s:2:"SJ";a:1:{i:0;s:52:"Свалбард и Жан Мијен ОÑтрови";}s:2:"SK";a:1:{i:0;s:16:"Словачка";}s:2:"SL";a:1:{i:0;s:21:"Сиера Леоне";}s:2:"SM";a:1:{i:0;s:19:"Сан Марино";}s:2:"SN";a:1:{i:0;s:14:"Сенегал";}s:2:"SO";a:1:{i:0;s:16:"Сомалија";}s:2:"SP";a:1:{i:0;s:12:"Србија";}s:2:"SR";a:1:{i:0;s:14:"Суринам";}s:2:"ST";a:1:{i:0;s:35:"Сао Томе и Принципе";}s:2:"SV";a:1:{i:0;s:21:"Ел Салвадор";}s:2:"SY";a:1:{i:0;s:12:"Сирија";}s:2:"SZ";a:1:{i:0;s:18:"Свазиленд";}s:2:"TC";a:1:{i:0;s:39:"Турк и ÐšÐ°Ð¸ÐºÐ¾Ñ ÐžÑтрови";}s:2:"TD";a:1:{i:0;s:6:"Чад";}s:2:"TF";a:1:{i:0;s:48:"ФранцуÑки Јужни територии";}s:2:"TG";a:1:{i:0;s:8:"Того";}s:2:"TH";a:1:{i:0;s:14:"Тајланд";}s:2:"TJ";a:1:{i:0;s:20:"ТаџикиÑтан";}s:2:"TK";a:1:{i:0;s:14:"Токелау";}s:2:"TL";a:1:{i:0;s:25:"ИÑточен Тимор";}s:2:"TM";a:1:{i:0;s:24:"ТуркмениÑтан";}s:2:"TN";a:1:{i:0;s:10:"ТуниÑ";}s:2:"TO";a:1:{i:0;s:10:"Тонга";}s:2:"TR";a:1:{i:0;s:14:"Турција";}s:2:"TT";a:1:{i:0;s:32:"Тринидад и Тобаго";}s:2:"TV";a:1:{i:0;s:12:"Тувалу";}s:2:"TW";a:1:{i:0;s:12:"Тајван";}s:2:"TZ";a:1:{i:0;s:18:"Танзанија";}s:2:"UA";a:1:{i:0;s:14:"Украина";}s:2:"UG";a:1:{i:0;s:12:"Уганда";}s:2:"US";a:1:
{i:0;s:31:"Обединети Држави";}s:2:"UY";a:1:{i:0;s:14:"Уругвај";}s:2:"UZ";a:1:{i:0;s:20:"УзбекиÑтан";}s:2:"VA";a:1:{i:0;s:14:"Ватикан";}s:2:"VC";a:1:{i:0;s:49:"Сент Винцент и Гренадините";}s:2:"VE";a:1:{i:0;s:18:"Венецуела";}s:2:"VG";a:1:{i:0;s:52:"БританÑки ДевÑтвени ОÑтрови";}s:2:"VI";a:1:{i:0;s:45:"ДевÑтвени ОÑтрови на СÐД";}s:2:"VN";a:1:{i:0;s:14:"Виетнам";}s:2:"VU";a:1:{i:0;s:12:"Ванату";}s:2:"WF";a:1:{i:0;s:41:"Ð’Ð¾Ð»Ð¸Ñ Ð¸ Футуна оÑтрови";}s:2:"WS";a:1:{i:0;s:10:"Самоа";}s:2:"YE";a:1:{i:0;s:10:"Јемен";}s:2:"YT";a:1:{i:0;s:12:"Мајоте";}s:2:"YU";a:1:{i:0;s:22:"ЈугоÑлавија";}s:2:"ZA";a:1:{i:0;s:23:"Јужна Ðфрика";}s:2:"ZM";a:1:{i:0;s:14:"Замбија";}s:2:"ZW";a:1:{i:0;s:16:"Зимбабве";}}s:10:"Currencies";a:240:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:27:"ÐндорÑки Динер";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:29:"ÐндорÑка Пезета";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:12:"Дирхам";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:24:"Ðвгани (1927-2002)";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:12:"Ðвгани";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:35:"ÐлбанÑки лек (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:23:"ÐлбанÑки Лек";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:36:"ÐлбанÑка Лек Валута";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:27:"ЕрмениÑки Драм";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:29:"ÐнголÑка Кванза";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:41:"ÐнголÑка Кванза (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:50:"ÐнголÑка нова Кванза (1990-2000)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:29:"ÐнголÑко еÑкудо";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:45:"ÐргентинÑки ÐŸÐµÐ·Ð¾Ñ (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:33:"ÐргентинÑки ПезоÑ";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:35:"ÐвÑÑ‚Ñ€
алиÑки Шилинг";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:33:"ÐвÑтралиÑки Долар";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:33:"ÐвÑтралиÑка Фунта";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:50:"БоÑанÑко-ХерцеговÑки Динар";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:88:"БоÑанÑко-ХерцеговÑки Динар конвертабилна марка";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:57:"БоÑанÑко-ХерцеговÑки нов Динар";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:31:"БарбадоÑки Долар";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:56:"БелгиÑки Франк (конвертибилен)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:27:"БелгиÑки Франк";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:50:"БелгиÑки Франк (финанÑиÑки)";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:34:"БугарÑки цврÑÑ‚ лев";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:52:"БугарÑки ÑоцијалиÑтички лев";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:30:"БугарÑки нов лев";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:34:"БугарÑки лев(1879-1952)";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:31:"БахраинÑки Динар";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:31:"БуриндиÑки Франк";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:29:"БермудÑки Долар";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:29:"БермудÑки фунта";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:29:"БрунејÑки долар";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:27:"БахамÑки Долар";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:27:"БахамÑка Фунта";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:27:"БутанÑки Рупии";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:31:"БурмезиÑки рупии";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:29:"БоцвантÑка Пула";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:50:"БелоруÑка нова рубља (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:41:"БелоруÑка Рубља (1992-1994)";}s:3:"BYR";a:2:{i
:0;s:3:"Rbl";i:1;s:29:"БелоруÑка Рубља";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:29:"БелизиÑки Долар";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:48:"БританÑко ХондурÑки Долар";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:27:"КанадÑки Долар";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:31:"ШвајцарÑки Франк";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:31:"КолумбиÑки ПезоÑ";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:37:"КоÑтариканÑки Колон";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:37:"ЧехоÑловачка корона";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:50:"ЧехоÑловачка цврÑта корона";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:27:"КубанÑки пезоÑ";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:27:"КипарÑка фунта";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:23:"Чешка корона";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:29:"ГерманÑка Марка";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:35:"ДоминиканÑки ПезоÑ";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:29:"ÐлгериÑки Динар";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:36:"ÐлгериÑки нов Франк";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:29:"ЕгипетÑка Фунта";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:27:"ШпанÑка Пезета";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:25:"ЕтиопиÑки Бир";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:29:"ЕтиопиÑки Долар";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:8:"Евро";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:23:"ФинÑка марка";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:35:"ФинÑка Марка (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:19:"Фиџи долар";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:19:"Фиџи фунта";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:31:"ФакландÑка фунта";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:29:"ФранцуÑки франк";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:25:"Габон CFA Франк";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:29:"БританÑка Фунта"
;}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:25:"ГрузиÑки лари";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:25:"ГанајÑки Седи";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:36:"ГанајÑки Ñтари Седи";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:27:"ГанајÑки фунта";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:35:"ГибралтарÑка фунта";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:31:"ГренландÑк круна";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:29:"ГамбиÑки ДалаÑи";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:27:"ГамбиÑка Фунта";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:29:"ГвинејÑки франк";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:41:"ГвинејÑки франк (1960-1972)";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:23:"Грчка драхма";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:23:"Грчка драхма";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:37:"ГватемалÑки кветцал";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:40:"ГвинејÑки БиÑау пезоÑ";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:29:"ГвијанÑки Долар";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:29:"Хонгкошки долар";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:33:"ХондурÑка лемпира";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:27:"ХрватÑки динар";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:25:"ХрватÑка Куна";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:23:"ХаитÑки гурд";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:31:"УнгарÑка форинта";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:35:"СеверноирÑка фунта";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:21:"ИрÑка фунта";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:29:"ИзраелÑки шекел";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:27:"ИзрелÑка фунта";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:36:"ИзраелÑки нов шекел";}s:3:"INR";a:2:{i:0;s:3:"INR";i:1;s:27:"ИндиÑка рупија";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:23:"Ирачки динар";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:23:"ИранÑки 
риал";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:29:"ИÑландÑка крона";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:31:"ИталијанкÑа лира";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:33:"ЈамајканÑки долар";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:33:"ЈамајканÑка фунта";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:29:"ЈорданÑки динар";}s:3:"JPY";a:2:{i:0;s:2:"Â¥";i:1;s:23:"ЈапонÑки јен";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:27:"КениÑки шилинг";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:31:"КиргиÑтанÑки Ñом";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:36:"КамбоџиÑки Ñтар рел";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:27:"КамбоџиÑки рел";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:29:"КирбатÑки долар";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:27:"КоморÑки долар";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:38:"Северно корејÑки вон";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:34:"Јужно кореÑки хван";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:43:"Јужно корејÑки Ñтар вон";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:34:"Јужно корејÑки вон";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:29:"КувајтÑки динар";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:35:"КазакÑтанÑка рубља";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:37:"КазакÑтантÑка тенга";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:19:"ЛаоÑки кип";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:25:"ЛибиÑка фунта";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:41:"ЛихнтенштајнÑки франк";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:37:"ШриланканÑка рупија";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:31:"ЦејлонÑка рупија";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:29:"ЛибериÑки долар";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:25:"ЛеÑотÑко лоти";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:29:"ЛитваниÑка лита";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:31:"ЛитваниÑки литаз
";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:35:"ЛукÑембуршки франк";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:25:"ЛатвијÑки лат";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:29:"ЛатвијÑка рубља";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:27:"ЛибијÑки динар";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:27:"ЛибијÑка фунта";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:33:"МароканÑки Дирхам";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:29:"МарконÑки франк";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:25:"МолдавÑки леу";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:31:"МакедонÑки денар";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:43:"МакедонÑки денар (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:23:"МалÑки франк";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:33:"МонголиÑки тугрик";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:23:"Макао патака";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:25:"МалтиÑка лира";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:27:"МалтиÑка финта";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:29:"МалавиÑка фунта";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:33:"МекÑиканÑки пезоÑ";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:60:"МекÑиканÑки Ñребрен Ð¿ÐµÐ·Ð¾Ñ (1861-1992)";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:31:"МалазиÑки рингит";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:33:"МозамбиÑко еÑкудо";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:35:"МозамбиÑки метикал";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:29:"ÐамибиÑки долар";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:29:"ÐигериÑка наира";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:29:"ÐигериÑка фунта";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:41:"ÐикарагванÑка кордоба";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:54:"ÐикарагванÑка златна кордоба";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:31:"ХоландÑки гилдер";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:27:"Ðор
вешка круна";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:29:"ÐепалÑка рупија";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:35:"ÐовозеланÑки долар";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:35:"Ðовозеландка фунта";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:23:"ОманÑки Риал";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:29:"ПанамÑка балбоа";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:32:"ПеруанÑки нов Ñол";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:25:"ПеруанÑки Ñол";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:48:"Папуа новогвинејÑкиа кина";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:31:"ФилипинÑки пезоÑ";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:35:"ПакиÑтанÑка рупија";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:23:"ПолÑка злота";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:35:"ПолÑка злота (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:33:"ПалеÑтинÑка фунта";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:33:"ПортугалÑко конто";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:35:"ПортугалÑко еÑкудо";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:37:"ПарагвајÑка гуарана";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:27:"КватарÑки риал";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:23:"РоманÑка леа";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:32:"РоманÑка нова леа";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:21:"РуÑка рубља";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:33:"РуÑка рубља (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:27:"РуандÑки франк";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:25:"СаудиÑки риал";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:31:"СоломонÑки долар";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:31:"СејшелÑка рупија";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:27:"СуданÑки динар";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:27:"СуданÑка фунта";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:25:"ШведÑка круна";}s:3:"
SGD";a:2:{i:0;s:2:"S$";i:1;s:33:"СингапурÑки доалр";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:36:"СловенÑки толар бон";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:29:"СловенÑки толар";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:27:"Словачка круна";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:35:"СиералеонÑко леоне";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:31:"СанмаринÑка лира";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:33:"СомалијÑки шилинг";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:33:"СуринамÑки гилдер";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:25:"ШкотÑка фунта";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:36:"СоветÑка нова рубља";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:27:"СоветÑка рубља";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:35:"ЕлÑавадорÑки колон";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:25:"СириÑка фунта";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:39:"СвазилендÑки лилаген";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:24:"‘адÑки франк";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:13:"Таи бат";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:37:"таџикиÑтанÑка рубља";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:41:"ТаџикиÑтантÑки Ñомони";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:43:"ТурментиÑтантÑки матат";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:29:"ТунезиÑки динар";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:29:"ТиморÑки еÑкудо";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:29:"ТиморÑка патака";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:21:"ТурÑка лира";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:27:"ТувалÑки долар";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:36:"ТајванÑки нов долар";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:33:"ТанзаниÑки шилинг";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:35:"УкраинÑка хривнија";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:43:"УгандиÑки шилинг (1966-198
7)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:31:"УгандиÑки шилинг";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:17:"СÐД долар";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:28:"СÐД долар (Next day)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:28:"СÐД долар (Same day)";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:41:"УругвајÑко пеÑо (1975-1993)";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:33:"УЗбекиÑтанÑки Сум";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:29:"ВатиканÑка лира";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:37:"ВенецуелÑки боливар";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:29:"ВиетнамÑки донг";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:36:"ВиетнамÑки нов донг";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:50:"ВиетнамÑки републички донг";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:50:"ВиетнамÑки национален донг";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:25:"ВанатÑки вату";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:21:"Самоа фунта";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:19:"Самоа тала";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:44:"ИÑточно карибиÑки долар";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:27:"ИÑламÑки динар";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:27:"ЈеменÑки дианр";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:25:"ЈеменÑки риал";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:37:"ЈугоÑловенÑки динар";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:64:"ЈугоÑловенÑки конвертибилен динар";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:56:"Јужно афрички ранд(финанÑиÑки)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:34:"Јужно африча фунта";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:34:"Јужно афрички ранд";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:29:"ЗамбиÑка кванча";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:27:"ЗамбиÑка фунта";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:33:"ЗаирÑко новозаире";}s
:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:23:"ЗирÑко заире";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:33:"ЗимбабвиÑки долар";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:16:"Календар";}s:9:"collation";a:1:{i:0;s:18:"Сортирање";}s:8:"currency";a:1:{i:0;s:12:"Валута";}}s:9:"Languages";a:1:{s:2:"mk";a:1:{i:0;s:20:"македонÑки";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Cyrl";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:37:"БудиÑтички календар";}s:7:"chinese";a:1:{i:0;s:31:"КинеÑки Календар";}s:9:"gregorian";a:1:{i:0;s:41:"ГрегорианÑки Календар";}s:6:"hebrew";a:1:{i:0;s:33:"ЕврејÑки Календар";}s:7:"islamic";a:1:{i:0;s:33:"ИÑламÑки Календар";}s:13:"islamic-civil";a:1:{i:0;s:52:"ИÑламÑко граѓанÑки Календар";}s:8:"japanese";a:1:{i:0;s:33:"ЈапонÑки Календар";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:16:"Директно";}s:9:"phonebook";a:1:{i:0;s:31:"Ðзбучен редоÑлед";}s:6:"pinyin";a:1:{i:0;s:25:"Сортирање Pinyin";}s:6:"stroke";a:1:{i:0;s:33:"Ритмички редоÑлед";}s:11:"traditional";a:1:{i:0;s:26:"Традиционално";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:18:"EEEE, dd MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:9:"dd.M.yyyy";i:7;s:7:"dd.M.yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:7:"нед.";i:1;s:7:"пон.";i:2;s:5:"вт.";i:3;s:7:"Ñре.";i:4;s:7:"чет.";i:5;s:7:"пет.";i:6;s:7:"Ñаб.";}s:6:"narrow";a:7:{i:0;s:2:"н";i:1;s:2:"п";i:2;s:2:"в";i:3;s:2:"Ñ
";i:4;s:2:"ч";i:5;s:2:"п";i:6;s:2:"Ñ";}s:4:"wide";a:7:{i:0;s:12:"недела";i:1;s:20:"понеделник";i:2;s:14:"вторник";i:3;s:10:"Ñреда";i:4;s:16:"четврток";i:5;s:10:"петок";i:6;s:12:"Ñабота";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:11:"пр.н.е.";i:1;s:5:"ае.";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:7:"јан.";i:1;s:7:"фев.";i:2;s:7:"мар.";i:3;s:7:"апр.";i:4;s:7:"мај.";i:5;s:7:"јун.";i:6;s:7:"јул.";i:7;s:7:"авг.";i:8;s:9:"Ñепт.";i:9;s:7:"окт.";i:10;s:9:"ноем.";i:11;s:11:"декем.";}s:6:"narrow";a:12:{i:0;s:2:"ј";i:1;s:2:"Ñ„";i:2;s:2:"м";i:3;s:2:"а";i:4;s:2:"м";i:5;s:2:"ј";i:6;s:2:"ј";i:7;s:2:"а";i:8;s:4:"Ñе";i:9;s:2:"о";i:10;s:4:"но";i:11;s:2:"д";}s:4:"wide";a:12:{i:0;s:14:"јануари";i:1;s:16:"февруари";i:2;s:8:"март";i:3;s:10:"април";i:4;s:6:"мај";i:5;s:8:"јуни";i:6;s:8:"јули";i:7;s:12:"авгуÑÑ‚";i:8;s:18:"Ñептември";i:9;s:16:"октомври";i:10;s:14:"ноември";i:11;s:16:"декември";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GuMtkHmsSEDFwWahKzUeygAZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mk_MK.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mk_MK.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mk_MK.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:21:"#,##0.###;(#,##0.###)";i:1;s:24:"¤ #,##0.00;-¤ #,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ml.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ml.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ml.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:6:{s:9:"Countries";a:1:{s:2:"IN";a:1:{i:0;s:18:"ഇനàµà´¤àµà´¯";}}s:9:"Languages";a:1:{s:2:"ml";a:1:{i:0;s:18:"മലയാളം";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Mlym";}s:14:"NumberElements";a:12:{i:0;s:1:".";i:1;s:1:",";i:2;s:1:";";i:3;s:1:"%";i:4;s:3:"൦";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.0";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:11:"AmPmMarkers";a:2:{i:0;s:18:"രാവിലെ";i:1;s:12:"വൈകàµ";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:6:"à´žà´¾";i:1;s:6:"തി";i:2;s:6:"ചൊ";i:3;s:6:"à´¬àµ";i:4;s:9:"à´µàµà´¯";i:5;s:6:"വെ";i:6;s:3:"à´¶";}s:4:"wide";a:7:{i:0;s:18:"ഞായറàµà´…";i:1;s:24:"തിങàµà´•à´³àµà´…";i:2;s:15:"ചൊവàµà´µ";i:3;s:18:"à´¬àµà´¨à´­àµà´…";i:4;s:18:"à´µàµà´¯à´¾à´´à´‚";i:5;s:18:"വെളàµà´³à´¿";i:6;s:9:"ശനി";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:9:"ജനàµ";i:1;s:12:"à´«à´¿à´¬àµ";i:2;s:15:"മാറàµà´…";i:3;s:24:"à´à´ªàµà´±à´¿à´²àµà´…";i:4;s:12:"മെയàµ";i:5;s:15:"ജൂണàµà´…";i:6;s:12:"ജൂൈല";i:7;s:6:"ആഗ";i:8;s:18:"സെപàµà´¤à´‚";i:9;s:12:"à´’à´•àµà´Ÿ";i:10;s:9:"നവം";i:11;s:12:"ഡിസം";}s:4:"wide";a:12:{i:0;s:18:"ജനàµà´µà´°à´¿";i:1;s:24:"à´«à´¿à´¬àµà´±à´µà´°à´¿";i:2;s:30:"മാറàµà´…à´šàµà´…à´šàµ";i:3;s:24:"à´à´ªàµà´±à´¿à´²àµà´…";i:4;s:12:"മെയàµ";i:5;s:15:"ജൂണàµà´…";i:6;s:12:"ജൂൈല";i:7;s:21:"ആഗസàµà´¤àµà´…";i:8;s:30:"സെപàµà´¤à´‚ബറàµà´…";i:9;s:27:"à´’à´•àµà´Ÿàµˆà´¬à´±àµà´…";i:10;s:21:"നവംബറàµà´…";i:11;s:24:"ഡിസംബറàµà´…";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ml_IN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ml_IN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ml_IN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:26:"#,##,##0.###;-#,##,##0.###";i:1;s:30:"¤ #,##,##0.00;-¤ #,##,##0.00";i:2;s:9:"#,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.0";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:8:"dd-MM-yy";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:1;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mr.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mr.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mr.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:1:{s:2:"IN";a:1:{i:0;s:12:"भारत";}}s:10:"Currencies";a:1:{s:3:"INR";a:2:{i:0;s:6:"रà¥";i:1;s:3:"INR";}}s:9:"Languages";a:141:{s:2:"aa";a:1:{i:0;s:12:"अफार";}s:2:"ab";a:1:{i:0;s:24:"अबखेजियन";}s:2:"af";a:1:{i:0;s:30:"अफà¥à¤°à¤¿à¤•à¤¾à¤¨à¥à¤¸";}s:2:"am";a:1:{i:0;s:21:"अमहारिक";}s:2:"ar";a:1:{i:0;s:18:"अरेबिक";}s:2:"as";a:1:{i:0;s:15:"असामी";}s:2:"ay";a:1:{i:0;s:12:"à¤à¤®à¤°à¤¾";}s:2:"az";a:1:{i:0;s:33:"अज़रबाइजानी";}s:2:"ba";a:1:{i:0;s:18:"बषà¥à¤•à¤¿à¤°";}s:2:"be";a:1:{i:0;s:30:"बैलोरà¥à¤¸à¤¿à¤¯à¤¨";}s:2:"bg";a:1:{i:0;s:27:"बलà¥à¤—ेरियन";}s:2:"bh";a:1:{i:0;s:18:"बीहारी";}s:2:"bi";a:1:{i:0;s:18:"बिसलमा";}s:2:"bn";a:1:{i:0;s:18:"बंगाली";}s:2:"bo";a:1:{i:0;s:24:"तिबेटियन";}s:2:"br";a:1:{i:0;s:18:"बà¥à¤°à¥‡à¤Ÿà¤¨";}s:2:"ca";a:1:{i:0;s:12:"कटलन";}s:2:"co";a:1:{i:0;s:24:"कोरà¥à¤¸à¤¿à¤•à¤¨";}s:2:"cs";a:1:{i:0;s:12:"ज़ेक";}s:2:"cy";a:1:{i:0;s:15:"वेलà¥à¤·";}s:2:"da";a:1:{i:0;s:15:"डानिष";}s:2:"de";a:1:{i:0;s:15:"जरà¥à¤®à¤¨";}s:2:"dz";a:1:{i:0;s:18:"भूटानी";}s:2:"el";a:1:{i:0;s:15:"गà¥à¤°à¥€à¤•";}s:2:"en";a:1:{i:0;s:24:"इंगà¥à¤°à¥‡à¤œà¥€";}s:2:"eo";a:1:{i:0;s:30:"इसà¥à¤ªà¤°à¤¾à¤¨à¥à¤Ÿà¥‹";}s:2:"es";a:1:{i:0;s:21:"सà¥à¤ªà¤¾à¤¨à¤¿à¤·";}s:2:"et";a:1:{i:0;s:30:"इसà¥à¤Ÿà¥‹à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"eu";a:1:{i:0;s:15:"बासà¥à¤•";}s:2:"fa";a:1:{i:0;s:24:"परà¥à¤·à¤¿à¤¯à¤¨à¥";}s:2:"fi";a:1:{i:0;s:21:"फिनà¥à¤¨à¤¿à¤·";}s:2:"fj";a:1:{i:0;s:12:"फिजी";}s:2:"fo";a:1:{i:0;s:18:"फेरोसà¥";}s:2:"fr";a:1:{i:0;s:21:"फà¥à¤°à¥‡à¤¨à¥à¤š";}s:2:"fy";a:1:{i:0;s:27:"फà¥à¤°à¤¿à¤¸à¤¿à¤¯à¤¨à¥";}s:2:"ga";a:1:{i:0;s:12:"à¤à¤°à¤¿à¤·";}s:2:"gd";a:1:{i:0;s:37:"सà¥à¤•à¤¾à¤Ÿà¤¸à¥ गेलिक";}s:2:"gl";a:1:{i:0;s:24:"गेलीशियन";}s:2:"gn";a:1:{i:0;s:18:"गौरानी";}s:2:"gu";a:1:{i:0;s:21:"गà¥à¤œà¤°à¤
¾à¤¤à¥€";}s:2:"ha";a:1:{i:0;s:12:"हौसा";}s:2:"he";a:1:{i:0;s:12:"हेबृ";}s:2:"hi";a:1:{i:0;s:18:"हिनà¥à¤¦à¥€";}s:2:"hr";a:1:{i:0;s:33:"कà¥à¤°à¥‹à¤¯à¥‡à¤·à¤¿à¤¯à¤¨à¥";}s:2:"hu";a:1:{i:0;s:27:"हंगेरियनà¥";}s:2:"hy";a:1:{i:0;s:30:"आरà¥à¤®à¥€à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"ia";a:1:{i:0;s:36:"इनà¥à¤Ÿà¤°à¤²à¤¿à¤‚गà¥à¤µà¤¾";}s:2:"id";a:1:{i:0;s:33:"इनà¥à¤¡à¥‹à¤¨à¥‡à¤·à¤¿à¤¯à¤¨";}s:2:"ie";a:1:{i:0;s:27:"इनà¥à¤Ÿà¤°à¤²à¤¿à¤‚ग";}s:2:"ik";a:1:{i:0;s:24:"इनूपियाक";}s:2:"is";a:1:{i:0;s:30:"आईसलानà¥à¤¡à¤¿à¤•";}s:2:"it";a:1:{i:0;s:21:"इटालियन";}s:2:"iu";a:1:{i:0;s:27:"इनà¥à¤•à¤¿à¤Ÿà¥à¤Ÿà¥";}s:2:"ja";a:1:{i:0;s:21:"जापनीसà¥";}s:2:"jv";a:1:{i:0;s:21:"जावनीसà¥";}s:2:"ka";a:1:{i:0;s:27:"जारà¥à¤œà¤¿à¤¯à¤¨à¥";}s:2:"kk";a:1:{i:0;s:12:"कज़क";}s:2:"kl";a:1:{i:0;s:36:"गà¥à¤°à¥€à¤¨à¤²à¤¾à¤¨à¥à¤¡à¤¿à¤•";}s:2:"km";a:1:{i:0;s:24:"कंबोडियन";}s:2:"kn";a:1:{i:0;s:15:"कनà¥à¤¨à¤¡";}s:2:"ko";a:1:{i:0;s:21:"कोरियनà¥";}s:3:"kok";a:1:{i:0;s:18:"कोंकणी";}s:2:"ks";a:1:{i:0;s:21:"कशà¥à¤®à¥€à¤°à¥€";}s:2:"ku";a:1:{i:0;s:21:"कà¥à¤°à¥à¤¦à¤¿à¤·";}s:2:"ky";a:1:{i:0;s:24:"किरà¥à¤—िज़";}s:2:"la";a:1:{i:0;s:15:"लाटिन";}s:2:"ln";a:1:{i:0;s:21:"लिंगाला";}s:2:"lo";a:1:{i:0;s:24:"लाओतियनà¥";}s:2:"lt";a:1:{i:0;s:30:"लिथà¥à¤†à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"lv";a:1:{i:0;s:51:"लाटà¥à¤µà¤¿à¤¯à¤¨à¥ (लेटà¥à¤Ÿà¤¿à¤·)";}s:2:"mg";a:1:{i:0;s:18:"मलागसी";}s:2:"mi";a:1:{i:0;s:15:"माओरी";}s:2:"mk";a:1:{i:0;s:30:"मसीडोनियनà¥";}s:2:"ml";a:1:{i:0;s:21:"मलियालम";}s:2:"mn";a:1:{i:0;s:27:"मंगोलियनà¥";}s:2:"mo";a:1:{i:0;s:33:"मोलà¥à¤¡à¤¾à¤µà¤¿à¤¯à¤¨à¥";}s:2:"mr";a:1:{i:0;s:15:"मराठी";}s:2:"ms";a:1:{i:0;s:9:"मलय";}s:2:"mt";a:1:{i:0;s:21:"मालतीसà¥";}s:2:"my";a:1:{i:0;s:21:"बरà¥à¤®à¥€à¤¸à¥";}s:2:"na";a:1:{i:
0;s:12:"नौरो";}s:2:"ne";a:1:{i:0;s:18:"नेपाली";}s:2:"nl";a:1:{i:0;s:6:"डच";}s:2:"no";a:1:{i:0;s:30:"नोरà¥à¤µà¥‡à¤œà¤¿à¤¯à¤¨";}s:2:"oc";a:1:{i:0;s:21:"ओसिटानà¥";}s:2:"om";a:1:{i:0;s:30:"ओरोमो (अफान)";}s:2:"or";a:1:{i:0;s:15:"ओरिया";}s:2:"pa";a:1:{i:0;s:18:"पंजाबी";}s:2:"pl";a:1:{i:0;s:15:"पोलिष";}s:2:"ps";a:1:{i:0;s:36:"पषà¥à¤Ÿà¥‹ (पà¥à¤·à¥à¤Ÿà¥‹)";}s:2:"pt";a:1:{i:0;s:30:"पोरà¥à¤šà¥à¤—ीसà¥";}s:2:"qu";a:1:{i:0;s:18:"कà¥à¤µà¥‡à¤šà¤“";}s:2:"rm";a:1:{i:0;s:37:"रहटो-रोमानà¥à¤¸à¥";}s:2:"rn";a:1:{i:0;s:24:"किरà¥à¤¨à¥à¤¦à¥€";}s:2:"ro";a:1:{i:0;s:27:"रोमानियनà¥";}s:4:"root";a:1:{i:0;s:15:"मराठी";}s:2:"ru";a:1:{i:0;s:18:"रषà¥à¤¯à¤¨à¥";}s:2:"rw";a:1:{i:0;s:42:"किनà¥à¤¯à¤¾à¤°à¥à¤µà¤¾à¤¨à¥à¤¡à¤¾";}s:2:"sa";a:1:{i:0;s:21:"संसà¥à¤•à¥ƒà¤¤";}s:2:"sd";a:1:{i:0;s:15:"सिंधी";}s:2:"sg";a:1:{i:0;s:21:"सांगà¥à¤°à¥‹";}s:2:"sh";a:1:{i:0;s:52:"सेरà¥à¤¬à¥‹-कà¥à¤°à¥‹à¤¯à¥‡à¤·à¤¿à¤¯à¤¨à¥";}s:2:"si";a:1:{i:0;s:27:"सिनà¥à¤¹à¤²à¥€à¤¸à¥";}s:2:"sk";a:1:{i:0;s:21:"सà¥à¤²à¥‹à¤µà¤¾à¤•";}s:2:"sl";a:1:{i:0;s:33:"सà¥à¤²à¥‹à¤µà¥‡à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"sm";a:1:{i:0;s:12:"समोन";}s:2:"sn";a:1:{i:0;s:12:"शोना";}s:2:"so";a:1:{i:0;s:18:"सोमाली";}s:2:"sq";a:1:{i:0;s:30:"आलà¥à¤¬à¥‡à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"sr";a:1:{i:0;s:27:"सेरà¥à¤¬à¤¿à¤¯à¤¨à¥";}s:2:"ss";a:1:{i:0;s:21:"सिसà¥à¤µà¤¤à¥€";}s:2:"st";a:1:{i:0;s:18:"सेसोथो";}s:2:"su";a:1:{i:0;s:24:"सà¥à¤‚दनीसà¥";}s:2:"sv";a:1:{i:0;s:21:"सà¥à¤µà¥€à¤¡à¤¿à¤·";}s:2:"sw";a:1:{i:0;s:24:"सà¥à¤µà¤¾à¤¹à¤¿à¤²à¥€";}s:2:"ta";a:1:{i:0;s:12:"तमिळ";}s:2:"te";a:1:{i:0;s:18:"तेलंगू";}s:2:"tg";a:1:{i:0;s:12:"तजिक";}s:2:"th";a:1:{i:0;s:9:"थाई";}s:2:"ti";a:1:{i:0;s:30:"तिगà¥à¤°à¤¿à¤¨à¥à¤¯à¤¾";}s:2:"tk";a:1:{i:0;s:24:"तà¥à¤°à¥à¤•à¤®à¥‡à¤¨";}s:2:"tl";a:1:{i:0;s:18:"तगालोग"
;}s:2:"tn";a:1:{i:0;s:30:"सेतà¥à¤¸à¥à¤µà¤¾à¤¨à¤¾";}s:2:"to";a:1:{i:0;s:15:"तोंगा";}s:2:"tr";a:1:{i:0;s:21:"तà¥à¤°à¥à¤•à¤¿à¤·";}s:2:"ts";a:1:{i:0;s:18:"तà¥à¤¸à¥‹à¤—ा";}s:2:"tt";a:1:{i:0;s:12:"टटार";}s:2:"tw";a:1:{i:0;s:12:"तà¥à¤µà¤¿";}s:2:"ug";a:1:{i:0;s:12:"उधूर";}s:2:"uk";a:1:{i:0;s:33:"यà¥à¤•à¥à¤°à¥‡à¤¨à¤¿à¤¯à¤¨à¥";}s:2:"ur";a:1:{i:0;s:15:"उरà¥à¤¦à¥‚";}s:2:"uz";a:1:{i:0;s:18:"उज़बेक";}s:2:"vi";a:1:{i:0;s:33:"वियतà¥à¤¨à¤¾à¤®à¥€à¤œà¤¼";}s:2:"vo";a:1:{i:0;s:18:"ओलापà¥à¤•";}s:2:"wo";a:1:{i:0;s:12:"उलोफ";}s:2:"xh";a:1:{i:0;s:24:"कà¥à¤¸à¥à¤¹à¥‹à¤¸à¤¾";}s:2:"yi";a:1:{i:0;s:18:"इदà¥à¤¦à¤¿à¤·";}s:2:"yo";a:1:{i:0;s:18:"यूरà¥à¤¬à¤¾";}s:2:"za";a:1:{i:0;s:21:"à¤à¥à¤¹à¥à¤¨à¥à¤—";}s:2:"zh";a:1:{i:0;s:18:"चिनीसà¥";}s:2:"zu";a:1:{i:0;s:12:"जà¥à¤²à¥‚";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Deva";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:11:"AmPmMarkers";a:2:{i:0;s:11:"म.पू.";i:1;s:11:"म.नं.";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:9:"रवि";i:1;s:9:"सोम";i:2;s:12:"मंगळ";i:3;s:9:"बà¥à¤§";i:4;s:12:"गà¥à¤°à¥";i:5;s:15:"शà¥à¤•à¥à¤°";i:6;s:9:"शनि";}s:4:"wide";a:7:{i:0;s:18:"रविवार";i:1;s:18:"सोमवार";i:2;s:21:"मंगळवार";i:3;s:18:"बà¥à¤§à¤µà¤¾à¤°";i:4;s:21:"गà¥à¤°à¥à¤µà¤¾à¤°";i:5;s:24:"शà¥à¤•à¥à¤°à¤µà¤¾à¤°";i:6;s:18:"शनिवार";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:24:"जानेवारी";i:1;s:24:"फेबृवारी";i:2;s:15:"मारà¥à¤š";i:3;s:18:"à¤à¤ªà¥à¤°à¤¿à¤²";i:4;s:6:"मे";i:5;s:9:"जून";i:6;s:12:"जà¥à¤²à¥ˆ";i:7;s:15:"ओगसà¥à¤Ÿ";i:8;s:27:"सेपà¥à¤Ÿà¥‡à¤‚बर";i:9;s:21:"ओकà¥à¤Ÿà¥‹à¤¬à¤°";i:10;s:27:"नोवà¥à¤¹à¥‡à¤‚बर";i:11;s:21:"डिसेंबर";}s:4:"wide";a:12:{i:0;s:24:"जानेवारी";i:1;s:24:"फेबृवारी";i:2;s:1
5:"मारà¥à¤š";i:3;s:18:"à¤à¤ªà¥à¤°à¤¿à¤²";i:4;s:6:"मे";i:5;s:9:"जून";i:6;s:12:"जà¥à¤²à¥ˆ";i:7;s:15:"ओगसà¥à¤Ÿ";i:8;s:27:"सेपà¥à¤Ÿà¥‡à¤‚बर";i:9;s:21:"ओकà¥à¤Ÿà¥‹à¤¬à¤°";i:10;s:27:"नोवà¥à¤¹à¥‡à¤‚बर";i:11;s:21:"डिसेंबर";}}}}}s:11:"zoneStrings";a:1:{i:0;a:5:{i:0;s:13:"Asia/Calcutta";i:1;s:28:"भारतीय समय";i:2;s:3:"IST";i:3;s:28:"भारतीय समय";i:4;s:3:"IST";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mr_IN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mr_IN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mr_IN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:28:"##,##,##0.###;-##,##,##0.###";i:1;s:32:"¤ ##,##,##0.00;-¤ ##,##,##0.00";i:2;s:10:"##,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:6:"d-M-yy";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:1;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ms.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ms.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ms.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:6:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:20:"Emiriah Arab Bersatu";}s:2:"AF";a:1:{i:0;s:11:"Afghanistan";}s:2:"AG";a:1:{i:0;s:19:"Antigua dan Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:7:"Albania";}s:2:"AM";a:1:{i:0;s:7:"Armenia";}s:2:"AN";a:1:{i:0;s:20:"Netherlands Antilles";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarctica";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:14:"American Samoa";}s:2:"AT";a:1:{i:0;s:7:"Austria";}s:2:"AU";a:1:{i:0;s:9:"Australia";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:10:"Azerbaijan";}s:2:"BA";a:1:{i:0;s:22:"Bosnia dan Herzegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BE";a:1:{i:0;s:7:"Belgium";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:8:"Bulgaria";}s:2:"BH";a:1:{i:0;s:7:"Bahrain";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:6:"Brunei";}s:2:"BO";a:1:{i:0;s:7:"Bolivia";}s:2:"BR";a:1:{i:0;s:6:"Brazil";}s:2:"BS";a:1:{i:0;s:7:"Bahamas";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BV";a:1:{i:0;s:13:"Bouvet Island";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:7:"Belarus";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:23:"Cocos (Keeling) Islands";}s:2:"CD";a:1:{i:0;s:32:"Democratic Republic of the Congo";}s:2:"CF";a:1:{i:0;s:22:"Republik Afrika Tengah";}s:2:"CG";a:1:{i:0;s:5:"Congo";}s:2:"CH";a:1:{i:0;s:11:"Switzerland";}s:2:"CI";a:1:{i:0;s:13:"Pantai Gading";}s:2:"CK";a:1:{i:0;s:12:"Cook Islands";}s:2:"CL";a:1:{i:0;s:4:"Cile";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:4:"Cina";}s:2:"CO";a:1:{i:0;s:8:"Colombia";}s:2:"CR";a:1:{i:0;s:10:"Kosta Rika";}s:2:"CU";a:1:{i:0;s:4:"Cuba";}s:2:"CV";a:1:{i:0;s:10:"Cape Verde";}s:2:"CX";a:1:{i:0;s:16:"Christmas Island";}s:2:"CY";a:1:{i:0;s:6:"Kibris";}s:2:"CZ";a:1:{i:0;s:14:"Republik Czech";}s:2:"DE";a:1:{i:0;s:6:"Jerman";}s:2:"DJ";a:1:{i:0;s:7:"Jibouti";}s:2:"DK";a:1:{i:0;s:
7:"Denmark";}s:2:"DM";a:1:{i:0;s:8:"Dominica";}s:2:"DO";a:1:{i:0;s:18:"Republik Dominican";}s:2:"DZ";a:1:{i:0;s:8:"Aljazair";}s:2:"EC";a:1:{i:0;s:7:"Ecuador";}s:2:"EE";a:1:{i:0;s:7:"Estonia";}s:2:"EG";a:1:{i:0;s:5:"Mesir";}s:2:"EH";a:1:{i:0;s:12:"Sahara Barat";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:8:"Sepanyol";}s:2:"ET";a:1:{i:0;s:8:"Ethiopia";}s:2:"FI";a:1:{i:0;s:7:"Finland";}s:2:"FJ";a:1:{i:0;s:4:"Fiji";}s:2:"FK";a:1:{i:0;s:16:"Falkland Islands";}s:2:"FM";a:1:{i:0;s:10:"Micronesia";}s:2:"FO";a:1:{i:0;s:13:"Faroe Islands";}s:2:"FR";a:1:{i:0;s:8:"Perancis";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:14:"United Kingdom";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:7:"Georgia";}s:2:"GF";a:1:{i:0;s:13:"French Guiana";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:9:"Greenland";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:17:"Equatorial Guinea";}s:2:"GR";a:1:{i:0;s:6:"Yunani";}s:2:"GS";a:1:{i:0;s:44:"South Georgia and the South Sandwich Islands";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinea Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:23:"Hong Kong S.A.R., China";}s:2:"HM";a:1:{i:0;s:33:"Heard Island and McDonald Islands";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:7:"Croatia";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:7:"Hungari";}s:2:"ID";a:1:{i:0;s:9:"Indonesia";}s:2:"IE";a:1:{i:0;s:7:"Ireland";}s:2:"IL";a:1:{i:0;s:6:"Israel";}s:2:"IN";a:1:{i:0;s:6:"Hindia";}s:2:"IO";a:1:{i:0;s:30:"British Indian Ocean Territory";}s:2:"IQ";a:1:{i:0;s:4:"Iraq";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:7:"Iceland";}s:2:"IT";a:1:{i:0;s:5:"Itali";}s:2:"JM";a:1:{i:0;s:7:"Jamaika";}s:2:"JO";a:1:{i:0;s:6:"Jordan";}s:2:"JP";a:1:{i:0;s:5:"Jepun";}s:2:"KE";a:1:{i:0;s:5:"Kenya";}s:2:"KG";a:1:{i:0;s:10:"Kyrgyzstan";}s:2:"KH";a:1:{i:0;s:7:"Kemboja";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s
:7:"Comoros";}s:2:"KN";a:1:{i:0;s:21:"Saint Kitts dan Nevis";}s:2:"KP";a:1:{i:0;s:11:"Utara Korea";}s:2:"KR";a:1:{i:0;s:13:"Selatan Korea";}s:2:"KW";a:1:{i:0;s:6:"Kuwait";}s:2:"KY";a:1:{i:0;s:14:"Cayman Islands";}s:2:"KZ";a:1:{i:0;s:10:"Kazakhstan";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:6:"Lubnan";}s:2:"LC";a:1:{i:0;s:11:"Saint Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberia";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:9:"Lithuania";}s:2:"LU";a:1:{i:0;s:11:"Luksembourg";}s:2:"LV";a:1:{i:0;s:6:"Latvia";}s:2:"LY";a:1:{i:0;s:5:"Libya";}s:2:"MA";a:1:{i:0;s:8:"Maghribi";}s:2:"MC";a:1:{i:0;s:6:"Monaco";}s:2:"MD";a:1:{i:0;s:7:"Moldova";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:18:"Kepulauan Marshall";}s:2:"MK";a:1:{i:0;s:9:"Macedonia";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:8:"Mongolia";}s:2:"MO";a:1:{i:0;s:19:"Macao S.A.R., China";}s:2:"MP";a:1:{i:0;s:24:"Northern Mariana Islands";}s:2:"MQ";a:1:{i:0;s:10:"Martinique";}s:2:"MR";a:1:{i:0;s:10:"Mauritania";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:6:"Maldiv";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:7:"Meksiko";}s:2:"MY";a:1:{i:0;s:8:"Malaysia";}s:2:"MZ";a:1:{i:0;s:8:"Mozambik";}s:2:"NA";a:1:{i:0;s:7:"Namibia";}s:2:"NC";a:1:{i:0;s:13:"New Caledonia";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:14:"Norfolk Island";}s:2:"NG";a:1:{i:0;s:7:"Nigeria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:7:"Belanda";}s:2:"NO";a:1:{i:0;s:6:"Norway";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:11:"New Zealand";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:16:"French Polynesia";}s:2:"PG";a:1:{i:0;s:16:"Papua New Guinea";}s:2:"PH";a:1:{i:0;s:8:"Filipina";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i
:0;s:6:"Poland";}s:2:"PM";a:1:{i:0;s:25:"Saint Pierre and Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:11:"Puerto Rico";}s:2:"PS";a:1:{i:0;s:21:"Palestinian Territory";}s:2:"PT";a:1:{i:0;s:8:"Feringgi";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Qatar";}s:2:"RE";a:1:{i:0;s:8:"Réunion";}s:2:"RO";a:1:{i:0;s:7:"Romania";}s:2:"RU";a:1:{i:0;s:6:"Russia";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:10:"Arab Saudi";}s:2:"SB";a:1:{i:0;s:17:"Kepulauan Solomon";}s:2:"SC";a:1:{i:0;s:10:"Seychelles";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:6:"Sweden";}s:2:"SG";a:1:{i:0;s:9:"Singapura";}s:2:"SH";a:1:{i:0;s:12:"Saint Helena";}s:2:"SI";a:1:{i:0;s:8:"Slovenia";}s:2:"SJ";a:1:{i:0;s:22:"Svalbard and Jan Mayen";}s:2:"SK";a:1:{i:0;s:8:"Slovakia";}s:2:"SL";a:1:{i:0;s:10:"Siera Leon";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:7:"Somalia";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:21:"Sao Tome dan Principe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:5:"Syria";}s:2:"SZ";a:1:{i:0;s:9:"Swaziland";}s:2:"TC";a:1:{i:0;s:24:"Turks and Caicos Islands";}s:2:"TD";a:1:{i:0;s:3:"Cad";}s:2:"TF";a:1:{i:0;s:27:"French Southern Territories";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:8:"Thailand";}s:2:"TJ";a:1:{i:0;s:11:"Tadjikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:11:"Timor-Leste";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:7:"Tunisia";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:5:"Turki";}s:2:"TT";a:1:{i:0;s:19:"Trinidad dan Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Taiwan";}s:2:"TZ";a:1:{i:0;s:8:"Tanzania";}s:2:"UA";a:1:{i:0;s:7:"Ukraine";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:36:"United States Minor Outlying Islands";}s:2:"US";a:1:{i:0;s:16:"Amerika Syarikat";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:10:"Uzbekistan";}s:2:"VA";a:1:{i:0;s:7:"Vatican";}s:2:"VC";a
:1:{i:0;s:28:"Saint Vincent dan Grenadines";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:22:"British Virgin Islands";}s:2:"VI";a:1:{i:0;s:19:"U.S. Virgin Islands";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:17:"Wallis and Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Yaman";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:10:"Yugoslavia";}s:2:"ZA";a:1:{i:0;s:14:"Afrika Selatan";}s:2:"ZM";a:1:{i:0;s:6:"Zambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:1:{s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:16:"Ringgit Malaysia";}}s:9:"Languages";a:1:{s:2:"ms";a:1:{i:0;s:13:"Bahasa Melayu";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:3:"Ahd";i:1;s:3:"Isn";i:2;s:3:"Sel";i:3;s:3:"Rab";i:4;s:3:"Kha";i:5;s:3:"Jum";i:6;s:3:"Sab";}s:4:"wide";a:7:{i:0;s:4:"Ahad";i:1;s:5:"Isnin";i:2;s:6:"Selasa";i:3;s:4:"Rabu";i:4;s:6:"Khamis";i:5;s:6:"Jumaat";i:6;s:5:"Sabtu";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"Jan";i:1;s:3:"Feb";i:2;s:3:"Mac";i:3;s:3:"Apr";i:4;s:3:"Mei";i:5;s:3:"Jun";i:6;s:3:"Jul";i:7;s:4:"Ogos";i:8;s:3:"Sep";i:9;s:3:"Okt";i:10;s:3:"Nov";i:11;s:3:"Dis";}s:4:"wide";a:12:{i:0;s:7:"Januari";i:1;s:8:"Februari";i:2;s:3:"Mac";i:3;s:5:"April";i:4;s:3:"Mei";i:5;s:3:"Jun";i:6;s:5:"Julai";i:7;s:4:"Ogos";i:8;s:9:"September";i:9;s:7:"Oktober";i:10;s:8:"November";i:11;s:8:"Disember";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ms_BN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ms_BN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ms_BN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:10:"Currencies";a:2:{s:3:"BND";a:2:{i:0;s:1:"$";i:1;s:3:"BND";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:3:"USD";}}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:10:"h:mm:ss aa";i:1;s:7:"H:mm:ss";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:12:"dd MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:10:"dd/MM/yyyy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ms_MY.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ms_MY.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ms_MY.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:23:"¤#,##0.00;(¤#,##0.00)";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:4:"h:mm";i:4;s:16:"EEEE dd MMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:12:"dd MMMM yyyy";i:7;s:10:"dd/MM/yyyy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mt.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mt.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mt.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:25:"Emirati Għarab Maqgħuda";}s:2:"AF";a:1:{i:0;s:10:"Afganistan";}s:2:"AG";a:1:{i:0;s:19:"Antigua and Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Angwilla";}s:2:"AL";a:1:{i:0;s:8:"Albanija";}s:2:"AM";a:1:{i:0;s:7:"Armenja";}s:2:"AN";a:1:{i:0;s:18:"Antilles Olandiżi";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarctica";}s:2:"AR";a:1:{i:0;s:10:"Arġentina";}s:2:"AS";a:1:{i:0;s:15:"Samoa Amerikana";}s:2:"AT";a:1:{i:0;s:8:"Awstrija";}s:2:"AU";a:1:{i:0;s:9:"Awstralja";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:12:"Ażerbajġan";}s:2:"BA";a:1:{i:0;s:22:"Bożnija Ħerżegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladexx";}s:2:"BE";a:1:{i:0;s:7:"Belġju";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:9:"Bulgarija";}s:2:"BH";a:1:{i:0;s:8:"Baħrajn";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:6:"Brunej";}s:2:"BO";a:1:{i:0;s:7:"Bolivja";}s:2:"BR";a:1:{i:0;s:7:"Brażil";}s:2:"BS";a:1:{i:0;s:8:"Baħamas";}s:2:"BT";a:1:{i:0;s:5:"Butan";}s:2:"BV";a:1:{i:0;s:13:"Bouvet Island";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:11:"Bjelorussja";}s:2:"BZ";a:1:{i:0;s:7:"Beliże";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:23:"Cocos (Keeling) Islands";}s:2:"CD";a:1:{i:0;s:32:"Democratic Republic of the Congo";}s:2:"CF";a:1:{i:0;s:29:"Repubblika Afrikana Ċentrali";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:8:"Svizzera";}s:2:"CI";a:1:{i:0;s:18:"Kosta ta' l-Avorju";}s:2:"CK";a:1:{i:0;s:12:"Cook Islands";}s:2:"CL";a:1:{i:0;s:5:"Ċili";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:5:"Ċina";}s:2:"CO";a:1:{i:0;s:8:"Kolumbja";}s:2:"CR";a:1:{i:0;s:10:"Kosta Rika";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:10:"Kape Verde";}s:2:"CX";a:1:{i:0;s:16:"Christmas Island";}s:2:"CY";a:1:{i:0;s:6:"Ċipru";}s:2:"CZ";a:1:{i:0;s:16:"Repubblika Ċeka";}s:2:"DE";a:1:{i:0;s:9:"Ġermanja";}s:2:"DJ";a:1:{i:0;s:
7:"Ġibuti";}s:2:"DK";a:1:{i:0;s:9:"Danimarka";}s:2:"DM";a:1:{i:0;s:8:"Dominika";}s:2:"DO";a:1:{i:0;s:21:"Republikka Domenikana";}s:2:"DZ";a:1:{i:0;s:9:"Alġerija";}s:2:"EC";a:1:{i:0;s:7:"Ekwador";}s:2:"EE";a:1:{i:0;s:7:"Estonja";}s:2:"EG";a:1:{i:0;s:7:"Eġittu";}s:2:"EH";a:1:{i:0;s:17:"Sahara tal-Punent";}s:2:"ER";a:1:{i:0;s:8:"Eritreja";}s:2:"ES";a:1:{i:0;s:6:"Spanja";}s:2:"ET";a:1:{i:0;s:8:"Etijopja";}s:2:"FI";a:1:{i:0;s:9:"Finlandja";}s:2:"FJ";a:1:{i:0;s:5:"Fiġi";}s:2:"FK";a:1:{i:0;s:16:"Falkland Islands";}s:2:"FM";a:1:{i:0;s:10:"Mikronesja";}s:2:"FO";a:1:{i:0;s:14:"Gżejjer Faroe";}s:2:"FR";a:1:{i:0;s:6:"Franza";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:10:"Ingilterra";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:8:"Ġorġja";}s:2:"GF";a:1:{i:0;s:17:"Gujana Franċiża";}s:2:"GH";a:1:{i:0;s:4:"Gana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:10:"Grinlandja";}s:2:"GM";a:1:{i:0;s:6:"Gambja";}s:2:"GN";a:1:{i:0;s:6:"Gineja";}s:2:"GP";a:1:{i:0;s:9:"Gwadelupe";}s:2:"GQ";a:1:{i:0;s:17:"Ginea Ekwatorjali";}s:2:"GR";a:1:{i:0;s:7:"Greċja";}s:2:"GS";a:1:{i:0;s:44:"South Georgia and the South Sandwich Islands";}s:2:"GT";a:1:{i:0;s:9:"Gwatemala";}s:2:"GU";a:1:{i:0;s:4:"Gwam";}s:2:"GW";a:1:{i:0;s:12:"Ginea-Bissaw";}s:2:"GY";a:1:{i:0;s:6:"Gujana";}s:2:"HK";a:1:{i:0;s:24:"Ħong Kong S.A.R., Ċina";}s:2:"HM";a:1:{i:0;s:33:"Heard Island and McDonald Islands";}s:2:"HN";a:1:{i:0;s:9:"Ħonduras";}s:2:"HR";a:1:{i:0;s:7:"Kroazja";}s:2:"HT";a:1:{i:0;s:6:"Ħaiti";}s:2:"HU";a:1:{i:0;s:8:"Ungerija";}s:2:"ID";a:1:{i:0;s:10:"Indoneżja";}s:2:"IE";a:1:{i:0;s:7:"Irlanda";}s:2:"IL";a:1:{i:0;s:7:"Iżrael";}s:2:"IN";a:1:{i:0;s:5:"Indja";}s:2:"IO";a:1:{i:0;s:30:"British Indian Ocean Territory";}s:2:"IQ";a:1:{i:0;s:4:"Iraq";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:7:"Islanda";}s:2:"IT";a:1:{i:0;s:6:"Italja";}s:2:"JM";a:1:{i:0;s:8:"Ġamajka";}s:2:"JO";a:1:{i:0;s:7:"Ġordan";}s:2:"JP";a:1:{i:0;s:7:"Ġappun";}s:2:"KE";a:1:{i:0;s:5:"Kenja";}s:2:"KG";a:1:{i:0;s:9:"Kirgistan";}s:2:"KH";a:1:{i:0;s:8:"Kambodj
a";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:7:"Komoros";}s:2:"KN";a:1:{i:0;s:21:"Saint Kitts and Nevis";}s:2:"KP";a:1:{i:0;s:14:"Koreja ta' Fuq";}s:2:"KR";a:1:{i:0;s:14:"Koreja t'Isfel";}s:2:"KW";a:1:{i:0;s:6:"Kuwajt";}s:2:"KY";a:1:{i:0;s:14:"Cayman Islands";}s:2:"KZ";a:1:{i:0;s:10:"Każakstan";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:6:"Libanu";}s:2:"LC";a:1:{i:0;s:11:"Saint Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberja";}s:2:"LS";a:1:{i:0;s:6:"Lesoto";}s:2:"LT";a:1:{i:0;s:8:"Litwanja";}s:2:"LU";a:1:{i:0;s:11:"Lussemburgu";}s:2:"LV";a:1:{i:0;s:6:"Latvja";}s:2:"LY";a:1:{i:0;s:5:"Libja";}s:2:"MA";a:1:{i:0;s:6:"Marokk";}s:2:"MC";a:1:{i:0;s:6:"Monako";}s:2:"MD";a:1:{i:0;s:7:"Maldova";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:21:"Gżejjer ta' Marshall";}s:2:"MK";a:1:{i:0;s:10:"Maċedonja";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Mjanmar";}s:2:"MN";a:1:{i:0;s:8:"Mongolja";}s:2:"MO";a:1:{i:0;s:19:"Macao S.A.R., China";}s:2:"MP";a:1:{i:0;s:24:"Gżejjer Marjana ta' Fuq";}s:2:"MQ";a:1:{i:0;s:8:"Martinik";}s:2:"MR";a:1:{i:0;s:10:"Mawritanja";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:8:"Mawrizju";}s:2:"MV";a:1:{i:0;s:8:"Maldives";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:7:"Messiku";}s:2:"MY";a:1:{i:0;s:7:"Malasja";}s:2:"MZ";a:1:{i:0;s:9:"Możambik";}s:2:"NA";a:1:{i:0;s:7:"Namibja";}s:2:"NC";a:1:{i:0;s:13:"New Caledonia";}s:2:"NE";a:1:{i:0;s:6:"Niġer";}s:2:"NF";a:1:{i:0;s:14:"Norfolk Island";}s:2:"NG";a:1:{i:0;s:8:"Niġerja";}s:2:"NI";a:1:{i:0;s:9:"Nikaragwa";}s:2:"NL";a:1:{i:0;s:6:"Olanda";}s:2:"NO";a:1:{i:0;s:9:"Norveġja";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:11:"New Zealand";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:20:"Polinesja Franċiża";}s:2:"PG";a:1:{i:0;s:18:"Papwa-Ginea Ġdida";}s:2:"PH";a:1:
{i:0;s:9:"Filippini";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:7:"Polonja";}s:2:"PM";a:1:{i:0;s:25:"Saint Pierre and Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:11:"Puerto Rico";}s:2:"PS";a:1:{i:0;s:21:"Palestinian Territory";}s:2:"PT";a:1:{i:0;s:9:"Portugall";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paragwaj";}s:2:"QA";a:1:{i:0;s:5:"Qatar";}s:2:"RE";a:1:{i:0;s:8:"Réunion";}s:2:"RO";a:1:{i:0;s:8:"Rumanija";}s:2:"RU";a:1:{i:0;s:6:"Russja";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:17:"Għarabja Sawdita";}s:2:"SB";a:1:{i:0;s:15:"Solomon Islands";}s:2:"SC";a:1:{i:0;s:10:"Seychelles";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:7:"Żvezja";}s:2:"SG";a:1:{i:0;s:8:"Singapor";}s:2:"SH";a:1:{i:0;s:12:"Saint Helena";}s:2:"SI";a:1:{i:0;s:8:"Slovenja";}s:2:"SJ";a:1:{i:0;s:22:"Svalbard and Jan Mayen";}s:2:"SK";a:1:{i:0;s:9:"Slovakkja";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:7:"Somalja";}s:2:"SP";a:1:{i:0;s:6:"Serbja";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:21:"Sao Tome and Principe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:5:"Sirja";}s:2:"SZ";a:1:{i:0;s:10:"Sważiland";}s:2:"TC";a:1:{i:0;s:24:"Turks and Caicos Islands";}s:2:"TD";a:1:{i:0;s:4:"Ċad";}s:2:"TF";a:1:{i:0;s:35:"Territorji Franċiżi ta' Nofsinhar";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:9:"Tajlandja";}s:2:"TJ";a:1:{i:0;s:11:"Taġikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelaw";}s:2:"TL";a:1:{i:0;s:15:"Timor tal-Lvant";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:6:"Tuneż";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:7:"Turkija";}s:2:"TT";a:1:{i:0;s:17:"Trinidad u Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Tajwan";}s:2:"TZ";a:1:{i:0;s:10:"Tanżanija";}s:2:"UA";a:1:{i:0;s:7:"Ukraina";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:36:"United States Minor Outlying Islands";}s:2:"US";a:1:{i:0;s:11:"Stati Uniti";}s:2:"UY";a:1:{i:0;
s:7:"Urugwaj";}s:2:"UZ";a:1:{i:0;s:11:"Użbekistan";}s:2:"VA";a:1:{i:0;s:7:"Vatikan";}s:2:"VC";a:1:{i:0;s:32:"Saint Vincent and the Grenadines";}s:2:"VE";a:1:{i:0;s:9:"Venezwela";}s:2:"VG";a:1:{i:0;s:22:"British Virgin Islands";}s:2:"VI";a:1:{i:0;s:19:"U.S. Virgin Islands";}s:2:"VN";a:1:{i:0;s:7:"Vjetnam";}s:2:"VU";a:1:{i:0;s:7:"Vanwatu";}s:2:"WF";a:1:{i:0;s:17:"Wallis and Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"YT";a:1:{i:0;s:7:"Majotte";}s:2:"YU";a:1:{i:0;s:10:"Jugoslavja";}s:2:"ZA";a:1:{i:0;s:14:"Afrika t'Isfel";}s:2:"ZM";a:1:{i:0;s:7:"Żambja";}s:2:"ZW";a:1:{i:0;s:9:"Żimbabwe";}}s:10:"Currencies";a:1:{s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:12:"Lira Maltija";}}s:9:"Languages";a:470:{s:2:"aa";a:1:{i:0;s:4:"Afar";}s:2:"ab";a:1:{i:0;s:9:"Abkażjan";}s:3:"ace";a:1:{i:0;s:8:"Aċiniż";}s:3:"ach";a:1:{i:0;s:5:"Akoli";}s:3:"ada";a:1:{i:0;s:7:"Adangme";}s:3:"ady";a:1:{i:0;s:6:"Adyghe";}s:2:"ae";a:1:{i:0;s:7:"Avestan";}s:2:"af";a:1:{i:0;s:8:"Afrikans";}s:3:"afa";a:1:{i:0;s:21:"Afro-Asjatiku (Oħra)";}s:3:"afh";a:1:{i:0;s:9:"Afriħili";}s:2:"ak";a:1:{i:0;s:4:"Akan";}s:3:"akk";a:1:{i:0;s:8:"Akkadjen";}s:3:"ale";a:1:{i:0;s:5:"Aleut";}s:3:"alg";a:1:{i:0;s:20:"Lingwi Algonqwinjani";}s:2:"am";a:1:{i:0;s:9:"Amħariku";}s:2:"an";a:1:{i:0;s:9:"Aragonese";}s:3:"ang";a:1:{i:0;s:28:"Ingliż, Antik (ca.450-1100)";}s:3:"apa";a:1:{i:0;s:13:"Lingwi Apaċi";}s:2:"ar";a:1:{i:0;s:7:"Għarbi";}s:3:"arc";a:1:{i:0;s:7:"Aramajk";}s:3:"arn";a:1:{i:0;s:10:"Arawkanjan";}s:3:"arp";a:1:{i:0;s:8:"Arapaħo";}s:3:"art";a:1:{i:0;s:20:"Artifiċjali (Oħra)";}s:3:"arw";a:1:{i:0;s:6:"Arawak";}s:2:"as";a:1:{i:0;s:8:"Assamese";}s:3:"ast";a:1:{i:0;s:8:"Asturian";}s:3:"ath";a:1:{i:0;s:17:"Lingwi Atabaskani";}s:3:"aus";a:1:{i:0;s:18:"Lingwi Awstraljani";}s:2:"av";a:1:{i:0;s:6:"Avarik";}s:3:"awa";a:1:{i:0;s:7:"Awadħi";}s:2:"ay";a:1:{i:0;s:6:"Ajmara";}s:2:"az";a:1:{i:0;s:13:"Ażerbajġani";}s:2:"ba";a:1:{i:0;s:6:"Baxkir";}s:3:"bad";a:1:{i:0;s:5:"Banda";}s:3:"bai";a:1:{i:0;s:15:"Lingwi Bamileke";}s:3:"bal";a:1:{i:0;s:7:"Baluċi"
;}s:3:"ban";a:1:{i:0;s:8:"Baliniż";}s:3:"bas";a:1:{i:0;s:4:"Basa";}s:3:"bat";a:1:{i:0;s:15:"Baltiku (Oħra)";}s:2:"be";a:1:{i:0;s:9:"Belarussu";}s:3:"bej";a:1:{i:0;s:4:"Beja";}s:3:"bem";a:1:{i:0;s:5:"Bemba";}s:3:"ber";a:1:{i:0;s:5:"Beber";}s:2:"bg";a:1:{i:0;s:7:"Bulgaru";}s:2:"bh";a:1:{i:0;s:7:"Biħari";}s:3:"bho";a:1:{i:0;s:7:"Bojpuri";}s:2:"bi";a:1:{i:0;s:7:"Bislama";}s:3:"bik";a:1:{i:0;s:5:"Bikol";}s:3:"bin";a:1:{i:0;s:4:"Bini";}s:3:"bla";a:1:{i:0;s:7:"Siksika";}s:2:"bm";a:1:{i:0;s:7:"Bambara";}s:2:"bn";a:1:{i:0;s:7:"Bengali";}s:3:"bnt";a:1:{i:0;s:5:"Bantu";}s:2:"bo";a:1:{i:0;s:8:"Tibetjan";}s:2:"br";a:1:{i:0;s:7:"Brenton";}s:3:"bra";a:1:{i:0;s:4:"Braj";}s:2:"bs";a:1:{i:0;s:8:"Bosnijan";}s:3:"btk";a:1:{i:0;s:5:"Batak";}s:3:"bua";a:1:{i:0;s:6:"Burjat";}s:3:"bug";a:1:{i:0;s:8:"Buginiż";}s:3:"byn";a:1:{i:0;s:4:"Blin";}s:2:"ca";a:1:{i:0;s:7:"Katalan";}s:3:"cad";a:1:{i:0;s:5:"Kaddo";}s:3:"cai";a:1:{i:0;s:25:"Amerika Ċentrali (Oħra)";}s:3:"car";a:1:{i:0;s:5:"Karib";}s:3:"cau";a:1:{i:0;s:15:"Kawkasu (Oħra)";}s:2:"ce";a:1:{i:0;s:7:"Ċeċen";}s:3:"ceb";a:1:{i:0;s:7:"Sibwano";}s:3:"cel";a:1:{i:0;s:15:"Keltiku (Oħra)";}s:2:"ch";a:1:{i:0;s:8:"Ċamorro";}s:3:"chb";a:1:{i:0;s:7:"Ċibċa";}s:3:"chg";a:1:{i:0;s:8:"Ċagataj";}s:3:"chk";a:1:{i:0;s:7:"Ċukese";}s:3:"chm";a:1:{i:0;s:4:"Mari";}s:3:"chn";a:1:{i:0;s:19:"Ġargon taċ-Ċinuk";}s:3:"cho";a:1:{i:0;s:7:"Ċostaw";}s:3:"chp";a:1:{i:0;s:9:"Ċipewjan";}s:3:"chr";a:1:{i:0;s:8:"Ċerokij";}s:3:"chy";a:1:{i:0;s:6:"Xajenn";}s:3:"cmc";a:1:{i:0;s:14:"Lingwi Ċamiki";}s:2:"co";a:1:{i:0;s:7:"Korsiku";}s:3:"cop";a:1:{i:0;s:7:"Koptiku";}s:3:"cpe";a:1:{i:0;s:47:"Kreoli u Piġini, Bbażat fuq l-Ingliż (Oħra)";}s:3:"cpf";a:1:{i:0;s:50:"Kreoli u Piġini, Bbażat fuq il-Franċiż (Oħra)";}s:3:"cpp";a:1:{i:0;s:45:"Creoles and pidgins, Portuguese-based (Other)";}s:2:"cr";a:1:{i:0;s:4:"Krij";}s:3:"crh";a:1:{i:0;s:30:"Crimean Turkish; Crimean Tatar";}s:3:"crp";a:1:{i:0;s:24:"Kreoli u Piġini (Oħra)";}s:2:"cs";a:1:{i:0;s:4:"Ċek";}s:3:"csb";a:1:{i:0;s:9:"Kashubian";}s:2:"cu";a:1:{i:0;s
:18:"Slaviku tal-Knisja";}s:3:"cus";a:1:{i:0;s:15:"Kuxtiku (Oħra)";}s:2:"cv";a:1:{i:0;s:6:"Ċuvax";}s:2:"cy";a:1:{i:0;s:4:"Welx";}s:2:"da";a:1:{i:0;s:6:"Daniż";}s:3:"dak";a:1:{i:0;s:6:"Dakota";}s:3:"dar";a:1:{i:0;s:6:"Dargwa";}s:3:"day";a:1:{i:0;s:5:"Dajak";}s:2:"de";a:1:{i:0;s:10:"Ġermaniż";}s:3:"del";a:1:{i:0;s:10:"Delawerjan";}s:3:"den";a:1:{i:0;s:4:"Slav";}s:3:"dgr";a:1:{i:0;s:6:"Dogrib";}s:3:"din";a:1:{i:0;s:5:"Dinka";}s:3:"doi";a:1:{i:0;s:5:"Dogri";}s:3:"dra";a:1:{i:0;s:17:"Dravidjan (Oħra)";}s:3:"dsb";a:1:{i:0;s:13:"Lower Sorbian";}s:3:"dua";a:1:{i:0;s:5:"Dwala";}s:3:"dum";a:1:{i:0;s:35:"Olandiż, Medjevali (ca. 1050-1350)";}s:2:"dv";a:1:{i:0;s:7:"Diveħi";}s:3:"dyu";a:1:{i:0;s:5:"Djula";}s:2:"dz";a:1:{i:0;s:8:"Dżongka";}s:2:"ee";a:1:{i:0;s:3:"Ewe";}s:3:"efi";a:1:{i:0;s:4:"Efik";}s:3:"egy";a:1:{i:0;s:17:"Eġizzjan (Antik)";}s:3:"eka";a:1:{i:0;s:6:"Ekajuk";}s:2:"el";a:1:{i:0;s:5:"Grieg";}s:3:"elx";a:1:{i:0;s:6:"Elamit";}s:2:"en";a:1:{i:0;s:7:"Ingliż";}s:3:"enm";a:1:{i:0;s:30:"Ingliż, Medjevali (1100-1500)";}s:2:"eo";a:1:{i:0;s:9:"Esperanto";}s:2:"es";a:1:{i:0;s:7:"Spanjol";}s:2:"et";a:1:{i:0;s:8:"Estonjan";}s:2:"eu";a:1:{i:0;s:4:"Bask";}s:3:"ewo";a:1:{i:0;s:6:"Ewondo";}s:2:"fa";a:1:{i:0;s:7:"Persjan";}s:3:"fan";a:1:{i:0;s:4:"Fang";}s:3:"fat";a:1:{i:0;s:5:"Fanti";}s:2:"ff";a:1:{i:0;s:6:"Fulaħ";}s:2:"fi";a:1:{i:0;s:10:"Finlandiż";}s:3:"fiu";a:1:{i:0;s:15:"Finno - Ugrijan";}s:2:"fj";a:1:{i:0;s:5:"Fiġi";}s:2:"fo";a:1:{i:0;s:7:"Fawriż";}s:3:"fon";a:1:{i:0;s:3:"Fon";}s:2:"fr";a:1:{i:0;s:9:"Franċiż";}s:3:"frm";a:1:{i:0;s:36:"Franċiż, Medjevali (ca. 1400-1600)";}s:3:"fro";a:1:{i:0;s:31:"Franċiż, Antik (842-ca. 1400)";}s:3:"fur";a:1:{i:0;s:9:"Frijuljan";}s:2:"fy";a:1:{i:0;s:8:"Friżjan";}s:2:"ga";a:1:{i:0;s:9:"Irlandiż";}s:3:"gaa";a:1:{i:0;s:2:"Ga";}s:3:"gay";a:1:{i:0;s:4:"Gajo";}s:3:"gba";a:1:{i:0;s:5:"Gbaja";}s:2:"gd";a:1:{i:0;s:18:"Galliku Skoċċiż";}s:3:"gem";a:1:{i:0;s:18:"Ġermaniku (Oħra)";}s:3:"gez";a:1:{i:0;s:4:"Geez";}s:3:"gil";a:1:{i:0;s:10:"Gilbertjan";}s:2:"gl";a:1:{i:0;s:9:"Galleg
jan";}s:3:"gmh";a:1:{i:0;s:43:"Ġermaniku, Medjevali Pulit (ca. 1050-1500)";}s:2:"gn";a:1:{i:0;s:7:"Gwarani";}s:3:"goh";a:1:{i:0;s:38:"Ġermaniku, Antik Pulit (ca. 750-1050)";}s:3:"gon";a:1:{i:0;s:5:"Gondi";}s:3:"gor";a:1:{i:0;s:9:"Gorontalo";}s:3:"got";a:1:{i:0;s:6:"Gotiku";}s:3:"grb";a:1:{i:0;s:6:"Ġerbo";}s:3:"grc";a:1:{i:0;s:22:"Grieg, Antik (to 1453)";}s:2:"gu";a:1:{i:0;s:9:"Guġarati";}s:2:"gv";a:1:{i:0;s:5:"Manks";}s:3:"gwi";a:1:{i:0;s:7:"Gwiċin";}s:2:"ha";a:1:{i:0;s:6:"Ħawsa";}s:3:"hai";a:1:{i:0;s:6:"Ħajda";}s:3:"haw";a:1:{i:0;s:9:"Ħawajjan";}s:2:"he";a:1:{i:0;s:6:"Ebrajk";}s:2:"hi";a:1:{i:0;s:6:"Ħindi";}s:3:"hil";a:1:{i:0;s:10:"Hiligaynon";}s:3:"him";a:1:{i:0;s:10:"Ħimaċali";}s:3:"hit";a:1:{i:0;s:7:"Ħittit";}s:3:"hmn";a:1:{i:0;s:6:"Ħmong";}s:2:"ho";a:1:{i:0;s:10:"Ħiri Motu";}s:2:"hr";a:1:{i:0;s:5:"Kroat";}s:3:"hsb";a:1:{i:0;s:13:"Upper Sorbian";}s:2:"ht";a:1:{i:0;s:7:"Haitian";}s:2:"hu";a:1:{i:0;s:8:"Ungeriż";}s:3:"hup";a:1:{i:0;s:5:"Ħupa";}s:2:"hy";a:1:{i:0;s:8:"Armenjan";}s:2:"hz";a:1:{i:0;s:7:"Ħerero";}s:2:"ia";a:1:{i:0;s:11:"Interlingua";}s:3:"iba";a:1:{i:0;s:4:"Iban";}s:2:"id";a:1:{i:0;s:11:"Indoneżjan";}s:2:"ie";a:1:{i:0;s:11:"Interlingue";}s:2:"ig";a:1:{i:0;s:4:"Igbo";}s:2:"ii";a:1:{i:0;s:10:"Sichuan Yi";}s:3:"ijo";a:1:{i:0;s:4:"Iġo";}s:2:"ik";a:1:{i:0;s:7:"Inupjak";}s:3:"ilo";a:1:{i:0;s:5:"Iloko";}s:3:"inc";a:1:{i:0;s:14:"Indjan (Oħra)";}s:3:"ine";a:1:{i:0;s:12:"Indo-Ewropew";}s:3:"inh";a:1:{i:0;s:6:"Ingush";}s:2:"io";a:1:{i:0;s:3:"Ido";}s:3:"ira";a:1:{i:0;s:7:"Iranjan";}s:3:"iro";a:1:{i:0;s:16:"Lingwi Irogwjani";}s:2:"is";a:1:{i:0;s:10:"Iżlandiż";}s:2:"it";a:1:{i:0;s:6:"Taljan";}s:2:"iu";a:1:{i:0;s:8:"Inukitut";}s:2:"ja";a:1:{i:0;s:10:"Ġappuniż";}s:3:"jbo";a:1:{i:0;s:6:"Lojban";}s:3:"jpr";a:1:{i:0;s:13:"Lhudi-Persjan";}s:3:"jrb";a:1:{i:0;s:13:"Lhudi-Għarbi";}s:2:"jv";a:1:{i:0;s:9:"Ġavaniż";}s:2:"ka";a:1:{i:0;s:9:"Ġorġjan";}s:3:"kaa";a:1:{i:0;s:11:"Kara-Kalpak";}s:3:"kab";a:1:{i:0;s:8:"Kabuljan";}s:3:"kac";a:1:{i:0;s:6:"Kaċin";}s:3:"kam";a:1:{i:0;s:5:"Kamba";}s:3:"kar";a
:1:{i:0;s:5:"Karen";}s:3:"kaw";a:1:{i:0;s:4:"Kawi";}s:3:"kbd";a:1:{i:0;s:9:"Kabardian";}s:2:"kg";a:1:{i:0;s:5:"Kongo";}s:3:"kha";a:1:{i:0;s:4:"Kasi";}s:3:"khi";a:1:{i:0;s:6:"Kojsan";}s:3:"kho";a:1:{i:0;s:8:"Kotaniż";}s:2:"ki";a:1:{i:0;s:6:"Kikuju";}s:2:"kj";a:1:{i:0;s:8:"Kuanyama";}s:2:"kk";a:1:{i:0;s:6:"Każak";}s:2:"kl";a:1:{i:0;s:10:"Kalallisut";}s:2:"km";a:1:{i:0;s:4:"Kmer";}s:3:"kmb";a:1:{i:0;s:8:"Kimbundu";}s:2:"kn";a:1:{i:0;s:7:"Kannada";}s:2:"ko";a:1:{i:0;s:7:"Korejan";}s:3:"kok";a:1:{i:0;s:7:"Konkani";}s:3:"kos";a:1:{i:0;s:8:"Kosrejan";}s:3:"kpe";a:1:{i:0;s:6:"Kpelle";}s:2:"kr";a:1:{i:0;s:6:"Kanuri";}s:3:"krc";a:1:{i:0;s:15:"Karachay-Balkar";}s:3:"kro";a:1:{i:0;s:3:"Kru";}s:3:"kru";a:1:{i:0;s:6:"Kurusk";}s:2:"ks";a:1:{i:0;s:7:"Kaxmiri";}s:2:"ku";a:1:{i:0;s:7:"Kurdiż";}s:3:"kum";a:1:{i:0;s:6:"Kumiku";}s:3:"kut";a:1:{i:0;s:7:"Kutenaj";}s:2:"kv";a:1:{i:0;s:4:"Komi";}s:2:"kw";a:1:{i:0;s:7:"Korniku";}s:2:"ky";a:1:{i:0;s:7:"Kirgiż";}s:2:"la";a:1:{i:0;s:5:"Latin";}s:3:"lad";a:1:{i:0;s:6:"Ladino";}s:3:"lah";a:1:{i:0;s:5:"Landa";}s:3:"lam";a:1:{i:0;s:5:"Lamba";}s:2:"lb";a:1:{i:0;s:12:"Letżburgiż";}s:3:"lez";a:1:{i:0;s:8:"Leżgjan";}s:2:"lg";a:1:{i:0;s:5:"Ganda";}s:2:"li";a:1:{i:0;s:10:"Limburgish";}s:2:"ln";a:1:{i:0;s:9:"Lingaljan";}s:2:"lo";a:1:{i:0;s:3:"Lao";}s:3:"lol";a:1:{i:0;s:5:"Mongo";}s:3:"loz";a:1:{i:0;s:5:"Lożi";}s:2:"lt";a:1:{i:0;s:9:"Litwanjan";}s:2:"lu";a:1:{i:0;s:12:"Luba-Katanga";}s:3:"lua";a:1:{i:0;s:11:"Luba-Luluwa";}s:3:"lui";a:1:{i:0;s:10:"Luwisinuż";}s:3:"lun";a:1:{i:0;s:5:"Lunda";}s:3:"luo";a:1:{i:0;s:4:"Luwa";}s:3:"lus";a:1:{i:0;s:5:"Luxaj";}s:2:"lv";a:1:{i:0;s:16:"Latvjan (Lettix)";}s:3:"mad";a:1:{i:0;s:8:"Maduriż";}s:3:"mag";a:1:{i:0;s:7:"Magaħi";}s:3:"mai";a:1:{i:0;s:7:"Majtili";}s:3:"mak";a:1:{i:0;s:7:"Makasar";}s:3:"man";a:1:{i:0;s:10:"Mandingwan";}s:3:"map";a:1:{i:0;s:12:"Awstronesjan";}s:3:"mas";a:1:{i:0;s:5:"Masaj";}s:3:"mdf";a:1:{i:0;s:6:"Moksha";}s:3:"mdr";a:1:{i:0;s:6:"Mandar";}s:3:"men";a:1:{i:0;s:5:"Mende";}s:2:"mg";a:1:{i:0;s:9:"Malagażi";}s:3:"mga";a:1:{i:0;s:31:"Irl
andiż, Medjevali (900-1200)";}s:2:"mh";a:1:{i:0;s:7:"Marxall";}s:2:"mi";a:1:{i:0;s:5:"Maori";}s:3:"mic";a:1:{i:0;s:6:"Mikmek";}s:3:"min";a:1:{i:0;s:11:"Minangkabaw";}s:3:"mis";a:1:{i:0;s:12:"Lingwi Oħra";}s:2:"mk";a:1:{i:0;s:11:"Maċedonjan";}s:3:"mkh";a:1:{i:0;s:16:"Mon-Kmer (Oħra)";}s:2:"ml";a:1:{i:0;s:9:"Malajalam";}s:2:"mn";a:1:{i:0;s:9:"Mongoljan";}s:3:"mnc";a:1:{i:0;s:10:"Manċurjan";}s:3:"mni";a:1:{i:0;s:8:"Manipuri";}s:3:"mno";a:1:{i:0;s:13:"Lingwi Manobo";}s:2:"mo";a:1:{i:0;s:9:"Moldavjan";}s:3:"moh";a:1:{i:0;s:6:"Moħak";}s:3:"mos";a:1:{i:0;s:5:"Mossi";}s:2:"mr";a:1:{i:0;s:6:"Marati";}s:2:"ms";a:1:{i:0;s:7:"Malajan";}s:2:"mt";a:1:{i:0;s:5:"Malti";}s:3:"mul";a:1:{i:0;s:14:"Lingwi Diversi";}s:3:"mun";a:1:{i:0;s:16:"Lingwi tal-Munda";}s:3:"mus";a:1:{i:0;s:5:"Kriek";}s:3:"mwr";a:1:{i:0;s:7:"Marwari";}s:2:"my";a:1:{i:0;s:7:"Burmiż";}s:3:"myn";a:1:{i:0;s:5:"Majan";}s:3:"myv";a:1:{i:0;s:5:"Erzya";}s:2:"na";a:1:{i:0;s:6:"Nawuru";}s:3:"nah";a:1:{i:0;s:9:"Naħwatil";}s:3:"nai";a:1:{i:0;s:34:"Indjan tal-Amerika ta' Fuq (Oħra)";}s:3:"nap";a:1:{i:0;s:10:"Neapolitan";}s:2:"nb";a:1:{i:0;s:19:"Bokmahal Norveġiż";}s:2:"nd";a:1:{i:0;s:16:"Ndebele, ta' Fuq";}s:3:"nds";a:1:{i:0;s:33:"Ġermaniż Komuni; Sassonu Komuni";}s:2:"ne";a:1:{i:0;s:8:"Nepaliż";}s:3:"new";a:1:{i:0;s:6:"Newari";}s:2:"ng";a:1:{i:0;s:6:"Ndonga";}s:3:"nia";a:1:{i:0;s:5:"Nijas";}s:3:"nic";a:1:{i:0;s:23:"Niġerjan - Kordofanjan";}s:3:"niu";a:1:{i:0;s:9:"Nijuwejan";}s:2:"nl";a:1:{i:0;s:8:"Olandiż";}s:2:"nn";a:1:{i:0;s:18:"Ninorsk Norveġiż";}s:2:"no";a:1:{i:0;s:10:"Norveġiż";}s:3:"nog";a:1:{i:0;s:5:"Nogai";}s:3:"non";a:1:{i:0;s:16:"Skandinav, Antik";}s:2:"nr";a:1:{i:0;s:16:"Ndebele, t'Isfel";}s:3:"nso";a:1:{i:0;s:13:"Soto, ta' Fuq";}s:3:"nub";a:1:{i:0;s:14:"Lingwi Nubjani";}s:2:"nv";a:1:{i:0;s:7:"Navaħo";}s:3:"nwc";a:1:{i:0;s:16:"Classical Newari";}s:2:"ny";a:1:{i:0;s:17:"Ċiċewa; Njanġa";}s:3:"nym";a:1:{i:0;s:9:"Njamweżi";}s:3:"nyn";a:1:{i:0;s:8:"Nyankole";}s:3:"nyo";a:1:{i:0;s:5:"Njoro";}s:3:"nzi";a:1:{i:0;s:6:"Nżima";}s:2:"oc";a:1:{i:0;s
:21:"Provenzal (wara 1500)";}s:2:"oj";a:1:{i:0;s:7:"Oġibwa";}s:2:"om";a:1:{i:0;s:12:"Oromo (Afan)";}s:2:"or";a:1:{i:0;s:5:"Orija";}s:2:"os";a:1:{i:0;s:9:"Ossettiku";}s:3:"osa";a:1:{i:0;s:8:"Osaġjan";}s:3:"ota";a:1:{i:0;s:21:"Tork (Imperu Ottoman)";}s:3:"oto";a:1:{i:0;s:15:"Lingwi Otomjani";}s:2:"pa";a:1:{i:0;s:8:"Punġabi";}s:3:"paa";a:1:{i:0;s:14:"Papwan (Oħra)";}s:3:"pag";a:1:{i:0;s:11:"Pangasinjan";}s:3:"pal";a:1:{i:0;s:8:"Paħlavi";}s:3:"pam";a:1:{i:0;s:8:"Pampamga";}s:3:"pap";a:1:{i:0;s:10:"Papjamento";}s:3:"pau";a:1:{i:0;s:8:"Palawjan";}s:3:"peo";a:1:{i:0;s:32:"Persjan Antik (ca. 600-400 Q.K.)";}s:3:"phi";a:1:{i:0;s:16:"Filippin (Oħra)";}s:3:"phn";a:1:{i:0;s:8:"Feniċju";}s:2:"pi";a:1:{i:0;s:4:"Pali";}s:2:"pl";a:1:{i:0;s:7:"Pollakk";}s:3:"pon";a:1:{i:0;s:8:"Ponpejan";}s:3:"pra";a:1:{i:0;s:15:"Lingwi Prakriti";}s:3:"pro";a:1:{i:0;s:28:"Provenzal, Antik (sa l-1500)";}s:2:"ps";a:1:{i:0;s:6:"Paxtun";}s:2:"pt";a:1:{i:0;s:9:"Portugiż";}s:2:"qu";a:1:{i:0;s:6:"Keċwa";}s:3:"raj";a:1:{i:0;s:10:"Raġastani";}s:3:"rap";a:1:{i:0;s:7:"Rapanwi";}s:3:"rar";a:1:{i:0;s:11:"Rarotongani";}s:2:"rm";a:1:{i:0;s:11:"Reto-Romanz";}s:2:"rn";a:1:{i:0;s:5:"Rundi";}s:2:"ro";a:1:{i:0;s:5:"Rumen";}s:3:"roa";a:1:{i:0;s:14:"Romanz (Oħra)";}s:3:"rom";a:1:{i:0;s:8:"Żingaru";}s:4:"root";a:1:{i:0;s:6:"Għerq";}s:2:"ru";a:1:{i:0;s:5:"Russu";}s:2:"rw";a:1:{i:0;s:11:"Kinjarwanda";}s:2:"sa";a:1:{i:0;s:8:"Sanskrit";}s:3:"sad";a:1:{i:0;s:7:"Sandawe";}s:3:"sah";a:1:{i:0;s:5:"Jakut";}s:3:"sai";a:1:{i:0;s:34:"Indjan tal-Amerika t'Isfel (Oħra)";}s:3:"sal";a:1:{i:0;s:7:"Salixan";}s:3:"sam";a:1:{i:0;s:8:"Samritan";}s:3:"sas";a:1:{i:0;s:5:"Saska";}s:3:"sat";a:1:{i:0;s:7:"Santali";}s:2:"sc";a:1:{i:0;s:9:"Sardinjan";}s:3:"sco";a:1:{i:0;s:10:"Skoċċiż";}s:2:"sd";a:1:{i:0;s:5:"Sindi";}s:2:"se";a:1:{i:0;s:12:"Sami ta' Fuq";}s:3:"sel";a:1:{i:0;s:6:"Selkup";}s:3:"sem";a:1:{i:0;s:8:"Semitiku";}s:2:"sg";a:1:{i:0;s:5:"Sango";}s:3:"sga";a:1:{i:0;s:27:"Irlandiż, Antik (sa l-900)";}s:3:"sgn";a:1:{i:0;s:18:"Lingwa tas-Sinjali";}s:2:"sh";a:1:{i:0;s:11:"Serbo-
Kroat";}s:3:"shn";a:1:{i:0;s:3:"Xan";}s:2:"si";a:1:{i:0;s:10:"Sinħaliż";}s:3:"sid";a:1:{i:0;s:6:"Sidamo";}s:3:"sio";a:1:{i:0;s:14:"Lingwi Suwjani";}s:3:"sit";a:1:{i:0;s:22:"Sino-Tibetjani (Oħra)";}s:2:"sk";a:1:{i:0;s:7:"Slovakk";}s:2:"sl";a:1:{i:0;s:4:"Slav";}s:3:"sla";a:1:{i:0;s:14:"Slavic (Other)";}s:2:"sm";a:1:{i:0;s:7:"Samojan";}s:3:"sma";a:1:{i:0;s:13:"Southern Sami";}s:3:"smi";a:1:{i:0;s:22:"Sami languages (Other)";}s:3:"smj";a:1:{i:0;s:9:"Lule Sami";}s:3:"smn";a:1:{i:0;s:10:"Inari Sami";}s:3:"sms";a:1:{i:0;s:10:"Skolt Sami";}s:2:"sn";a:1:{i:0;s:4:"Xona";}s:3:"snk";a:1:{i:0;s:7:"Soninke";}s:2:"so";a:1:{i:0;s:6:"Somali";}s:3:"sog";a:1:{i:0;s:7:"Sogdien";}s:3:"son";a:1:{i:0;s:6:"Songaj";}s:2:"sq";a:1:{i:0;s:8:"Albaniż";}s:2:"sr";a:1:{i:0;s:4:"Serb";}s:3:"srr";a:1:{i:0;s:5:"Serer";}s:2:"ss";a:1:{i:0;s:5:"Swati";}s:3:"ssa";a:1:{i:0;s:13:"Nilo-Saħaram";}s:2:"st";a:1:{i:0;s:13:"Soto, t'Isfel";}s:2:"su";a:1:{i:0;s:9:"Sundaniż";}s:3:"suk";a:1:{i:0;s:6:"Sukuma";}s:3:"sus";a:1:{i:0;s:4:"Susu";}s:3:"sux";a:1:{i:0;s:8:"Sumerjan";}s:2:"sv";a:1:{i:0;s:7:"Svediż";}s:2:"sw";a:1:{i:0;s:8:"Swaħili";}s:3:"syr";a:1:{i:0;s:6:"Sirjan";}s:2:"ta";a:1:{i:0;s:5:"Tamil";}s:3:"tai";a:1:{i:0;s:11:"Tai (Oħra)";}s:2:"te";a:1:{i:0;s:6:"Telugu";}s:3:"tem";a:1:{i:0;s:5:"Timne";}s:3:"ter";a:1:{i:0;s:6:"Tereno";}s:3:"tet";a:1:{i:0;s:5:"Tetum";}s:2:"tg";a:1:{i:0;s:6:"Taġik";}s:2:"th";a:1:{i:0;s:10:"Tajlandiż";}s:2:"ti";a:1:{i:0;s:8:"Tigrinja";}s:3:"tig";a:1:{i:0;s:5:"Tigre";}s:3:"tiv";a:1:{i:0;s:3:"Tiv";}s:2:"tk";a:1:{i:0;s:8:"Turkmeni";}s:3:"tkl";a:1:{i:0;s:7:"Tokelau";}s:2:"tl";a:1:{i:0;s:7:"Tagalog";}s:3:"tlh";a:1:{i:0;s:7:"Klingon";}s:3:"tli";a:1:{i:0;s:7:"Tlingit";}s:3:"tmh";a:1:{i:0;s:7:"Tamaxek";}s:2:"tn";a:1:{i:0;s:5:"Zwana";}s:2:"to";a:1:{i:0;s:27:"Tongan (Gżejjer ta' Tonga)";}s:3:"tog";a:1:{i:0;s:13:"Tonga (Njasa)";}s:3:"tpi";a:1:{i:0;s:9:"Tok Pisin";}s:2:"tr";a:1:{i:0;s:4:"Tork";}s:2:"ts";a:1:{i:0;s:6:"Tsonga";}s:3:"tsi";a:1:{i:0;s:7:"Zimxjan";}s:2:"tt";a:1:{i:0;s:5:"Tatar";}s:3:"tum";a:1:{i:0;s:7:"Tumbuka";}s:3:"tup";a:
1:{i:0;s:14:"Tupi languages";}s:3:"tut";a:1:{i:0;s:14:"Altajk (Oħra)";}s:3:"tvl";a:1:{i:0;s:6:"Tuvalu";}s:2:"tw";a:1:{i:0;s:3:"Twi";}s:2:"ty";a:1:{i:0;s:9:"Taħitjan";}s:3:"tyv";a:1:{i:0;s:8:"Tuvinjan";}s:3:"udm";a:1:{i:0;s:6:"Udmurt";}s:2:"ug";a:1:{i:0;s:5:"Wigur";}s:3:"uga";a:1:{i:0;s:9:"Ugaritiku";}s:2:"uk";a:1:{i:0;s:8:"Ukranjan";}s:3:"umb";a:1:{i:0;s:7:"Umbundu";}s:3:"und";a:1:{i:0;s:12:"Indeterminat";}s:2:"ur";a:1:{i:0;s:4:"Urdu";}s:2:"uz";a:1:{i:0;s:6:"Użbek";}s:3:"vai";a:1:{i:0;s:3:"Vai";}s:2:"ve";a:1:{i:0;s:5:"Venda";}s:2:"vi";a:1:{i:0;s:10:"Vjetnamiż";}s:2:"vo";a:1:{i:0;s:7:"Volapuk";}s:3:"vot";a:1:{i:0;s:5:"Votik";}s:2:"wa";a:1:{i:0;s:7:"Walloon";}s:3:"wak";a:1:{i:0;s:15:"Lingwi Wakaxani";}s:3:"wal";a:1:{i:0;s:6:"Walamo";}s:3:"war";a:1:{i:0;s:5:"Waraj";}s:3:"was";a:1:{i:0;s:4:"Waxo";}s:3:"wen";a:1:{i:0;s:15:"Lingwi Sorbjani";}s:2:"wo";a:1:{i:0;s:5:"Wolof";}s:3:"xal";a:1:{i:0;s:6:"Kalmyk";}s:2:"xh";a:1:{i:0;s:6:"Ħoża";}s:3:"yao";a:1:{i:0;s:3:"Jao";}s:3:"yap";a:1:{i:0;s:6:"Japese";}s:2:"yi";a:1:{i:0;s:6:"Jiddix";}s:2:"yo";a:1:{i:0;s:6:"Joruba";}s:3:"ypk";a:1:{i:0;s:14:"Lingwi Jupiċi";}s:2:"za";a:1:{i:0;s:6:"Żwang";}s:3:"zap";a:1:{i:0;s:8:"Żapotek";}s:3:"zen";a:1:{i:0;s:7:"Żenaga";}s:2:"zh";a:1:{i:0;s:7:"Ċiniż";}s:3:"znd";a:1:{i:0;s:6:"Żande";}s:2:"zu";a:1:{i:0;s:5:"Żulu";}s:3:"zun";a:1:{i:0;s:5:"Żuni";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:1;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:24:"EEEE, d 'ta''' MMMM yyyy";i:5;s:18:"d 'ta''' MMMM yyyy";i:6;s:11:"dd MMM yyyy";i:7;s:10:"dd/MM/yyyy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:4:"Ħad";i:1;s:3:"Tne";i:2;s:3:"Tli";i:3;s:3:"Erb";i:4;s:4:"Ħam";i:5;s:4:"Ġim";i:6;s:3:"Sib";}s:4:"wide";a:7:{i:0;s:8:"Il-Ħadd";i:1;s:8:"It-Tnejn";i:2;s:9:"It-Tlieta";i:3;s:9:"L-Erbgħa";i:4;s:9:"Il-Ħamis";i:5;s:11:"Il
-Ġimgħa";i:6;s:7:"Is-Sibt";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:2:"QK";i:1;s:2:"WK";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"Jan";i:1;s:3:"Fra";i:2;s:3:"Mar";i:3;s:3:"Apr";i:4;s:3:"Mej";i:5;s:4:"Ġun";i:6;s:3:"Lul";i:7;s:3:"Awi";i:8;s:3:"Set";i:9;s:3:"Ott";i:10;s:3:"Nov";i:11;s:4:"Diċ";}s:4:"wide";a:12:{i:0;s:6:"Jannar";i:1;s:4:"Frar";i:2;s:5:"Marzu";i:3;s:5:"April";i:4;s:5:"Mejju";i:5;s:6:"Ġunju";i:6;s:5:"Lulju";i:7;s:6:"Awissu";i:8;s:9:"Settembru";i:9;s:7:"Ottubru";i:10;s:8:"Novembru";i:11;s:9:"Diċembru";}}}}}s:11:"zoneStrings";a:1:{i:0;a:6:{i:0;s:12:"Europe/Malta";i:1;s:22:"Ħin Ċentrali Ewropew";i:2;s:3:"CET";i:3;s:31:"Ħin Ċentrali Ewropew tas-Sajf";i:4;s:4:"CEST";i:5;s:8:"Valletta";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mt_MT.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mt_MT.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/mt_MT.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nb.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nb.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nb.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:13:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:29:"De forente arabiske emiratene";}s:2:"AF";a:1:{i:0;s:11:"Afghanistan";}s:2:"AG";a:1:{i:0;s:18:"Antigua og Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:7:"Albania";}s:2:"AM";a:1:{i:0;s:7:"Armenia";}s:2:"AN";a:1:{i:0;s:24:"De nederlandske antiller";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:9:"Antarktis";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:16:"Amerikansk Samoa";}s:2:"AT";a:1:{i:0;s:10:"Østerrike";}s:2:"AU";a:1:{i:0;s:9:"Australia";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:12:"Aserbajdsjan";}s:2:"BA";a:1:{i:0;s:21:"Bosnia og Hercegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BE";a:1:{i:0;s:6:"Belgia";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:8:"Bulgaria";}s:2:"BH";a:1:{i:0;s:7:"Bahrain";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:17:"Brunei Darussalam";}s:2:"BO";a:1:{i:0;s:7:"Bolivia";}s:2:"BR";a:1:{i:0;s:6:"Brasil";}s:2:"BS";a:1:{i:0;s:7:"Bahamas";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BV";a:1:{i:0;s:10:"Bouvetøya";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:13:"Hviterussland";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Canada";}s:2:"CC";a:1:{i:0;s:27:"Kokosøyene (Keelingøyene)";}s:2:"CD";a:1:{i:0;s:35:"Kongo, Den demokratiske republikken";}s:2:"CF";a:1:{i:0;s:31:"Den sentralafrikanske republikk";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:6:"Sveits";}s:2:"CI";a:1:{i:0;s:15:"Elfenbenskysten";}s:2:"CK";a:1:{i:0;s:10:"Cookøyene";}s:2:"CL";a:1:{i:0;s:5:"Chile";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:4:"Kina";}s:2:"CO";a:1:{i:0;s:8:"Colombia";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:4:"Cuba";}s:2:"CV";a:1:{i:0;s:10:"Kapp Verde";}s:2:"CX";a:1:{i:0;s:13:"Christmasøya";}s:2:"CY";a:1:{i:0;s:6:"Kypros";}s:2:"CZ";a:1:{i:0;s:8:"Tsjekkia";}s:2:"DE";a:1:{i:0;s:8:"Tyskland";}s:2:"DJ";a:1:{i:0
;s:8:"Djibouti";}s:2:"DK";a:1:{i:0;s:7:"Danmark";}s:2:"DM";a:1:{i:0;s:8:"Dominica";}s:2:"DO";a:1:{i:0;s:26:"Den dominikanske republikk";}s:2:"DZ";a:1:{i:0;s:7:"Algerie";}s:2:"EC";a:1:{i:0;s:7:"Ecuador";}s:2:"EE";a:1:{i:0;s:7:"Estland";}s:2:"EG";a:1:{i:0;s:5:"Egypt";}s:2:"EH";a:1:{i:0;s:11:"Vest-Sahara";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:6:"Spania";}s:2:"ET";a:1:{i:0;s:7:"Etiopia";}s:2:"FI";a:1:{i:0;s:7:"Finland";}s:2:"FJ";a:1:{i:0;s:4:"Fiji";}s:2:"FK";a:1:{i:0;s:26:"Falklandsøyene (Malvinas)";}s:2:"FM";a:1:{i:0;s:23:"Mikronesiaføderasjonen";}s:2:"FO";a:1:{i:0;s:10:"Færøyene";}s:2:"FR";a:1:{i:0;s:9:"Frankrike";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:13:"Storbritannia";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:7:"Georgia";}s:2:"GF";a:1:{i:0;s:13:"Fransk Guyana";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:9:"Grønland";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:17:"Ekvatorial-Guinea";}s:2:"GR";a:1:{i:0;s:6:"Hellas";}s:2:"GS";a:1:{i:0;s:36:"Sør-Georgia og Sør-Sandwich-øyene";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinea-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:23:"Hong Kong S.A.R. (Kina)";}s:2:"HM";a:1:{i:0;s:25:"Heard- og McDonaldsøyene";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:7:"Kroatia";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:6:"Ungarn";}s:2:"ID";a:1:{i:0;s:9:"Indonesia";}s:2:"IE";a:1:{i:0;s:6:"Irland";}s:2:"IL";a:1:{i:0;s:6:"Israel";}s:2:"IN";a:1:{i:0;s:5:"India";}s:2:"IO";a:1:{i:0;s:35:"Britiske områder i det indiske hav";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:6:"Island";}s:2:"IT";a:1:{i:0;s:6:"Italia";}s:2:"JM";a:1:{i:0;s:7:"Jamaica";}s:2:"JO";a:1:{i:0;s:6:"Jordan";}s:2:"JP";a:1:{i:0;s:5:"Japan";}s:2:"KE";a:1:{i:0;s:5:"Kenya";}s:2:"KG";a:1:{i:0;s:11:"Kirgisistan";}s:2:"KH";a:1:{i:0;s:9:"Kambodsja";}s:2:
"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:8:"Komorene";}s:2:"KN";a:1:{i:0;s:24:"St. Christopher og Nevis";}s:2:"KP";a:1:{i:0;s:10:"Nord-Korea";}s:2:"KR";a:1:{i:0;s:10:"Sør-Korea";}s:2:"KW";a:1:{i:0;s:6:"Kuwait";}s:2:"KY";a:1:{i:0;s:12:"Caymanøyene";}s:2:"KZ";a:1:{i:0;s:10:"Kasakhstan";}s:2:"LA";a:1:{i:0;s:39:"Laos, Den folkedemokratiske republikken";}s:2:"LB";a:1:{i:0;s:7:"Libanon";}s:2:"LC";a:1:{i:0;s:9:"St. Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberia";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:7:"Litauen";}s:2:"LU";a:1:{i:0;s:10:"Luxembourg";}s:2:"LV";a:1:{i:0;s:6:"Latvia";}s:2:"LY";a:1:{i:0;s:5:"Libya";}s:2:"MA";a:1:{i:0;s:7:"Marokko";}s:2:"MC";a:1:{i:0;s:6:"Monaco";}s:2:"MD";a:1:{i:0;s:7:"Moldova";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:14:"Marshalløyene";}s:2:"MK";a:1:{i:0;s:22:"Makedonia, Republikken";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:8:"Mongolia";}s:2:"MO";a:1:{i:0;s:19:"Macao S.A.R. (Kina)";}s:2:"MP";a:1:{i:0;s:14:"Nord-Marianene";}s:2:"MQ";a:1:{i:0;s:10:"Martinique";}s:2:"MR";a:1:{i:0;s:10:"Mauritania";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:9:"Maldivene";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:6:"Mexico";}s:2:"MY";a:1:{i:0;s:8:"Malaysia";}s:2:"MZ";a:1:{i:0;s:8:"Mosambik";}s:2:"NA";a:1:{i:0;s:7:"Namibia";}s:2:"NC";a:1:{i:0;s:12:"Ny-Caledonia";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:13:"Norfolkøyene";}s:2:"NG";a:1:{i:0;s:7:"Nigeria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:9:"Nederland";}s:2:"NO";a:1:{i:0;s:5:"Norge";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:11:"New Zealand";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:16:"Fransk Polynesia";}s:2:"PG";a:1:{i:0;s:15:"Papua Ny-Guinea";}s:2:"P
H";a:1:{i:0;s:11:"Filippinene";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:5:"Polen";}s:2:"PM";a:1:{i:0;s:22:"St. Pierre og Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:11:"Puerto Rico";}s:2:"PS";a:1:{i:0;s:22:"Palestinsk territorium";}s:2:"PT";a:1:{i:0;s:8:"Portugal";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Qatar";}s:2:"RE";a:1:{i:0;s:7:"Reunion";}s:2:"RO";a:1:{i:0;s:7:"Romania";}s:2:"RU";a:1:{i:0;s:24:"Den russiske føderasjon";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:12:"Saudi Arabia";}s:2:"SB";a:1:{i:0;s:13:"Salomonøyene";}s:2:"SC";a:1:{i:0;s:11:"Seychellene";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:7:"Sverige";}s:2:"SG";a:1:{i:0;s:9:"Singapore";}s:2:"SH";a:1:{i:0;s:12:"Saint Helena";}s:2:"SI";a:1:{i:0;s:8:"Slovenia";}s:2:"SJ";a:1:{i:0;s:21:"Svalbard og Jan Mayen";}s:2:"SK";a:1:{i:0;s:8:"Slovakia";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:7:"Somalia";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:20:"Sao Tome og Principe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:5:"Syria";}s:2:"SZ";a:1:{i:0;s:9:"Swaziland";}s:2:"TC";a:1:{i:0;s:22:"Turks- og Caicosøyene";}s:2:"TD";a:1:{i:0;s:5:"Tchad";}s:2:"TF";a:1:{i:0;s:20:"Franske sørområder";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:8:"Thailand";}s:2:"TJ";a:1:{i:0;s:12:"Tadsjikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:10:"Øst-Timor";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:7:"Tunisia";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:6:"Tyrkia";}s:2:"TT";a:1:{i:0;s:18:"Trinidad og Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Taiwan";}s:2:"TZ";a:1:{i:0;s:8:"Tanzania";}s:2:"UA";a:1:{i:0;s:7:"Ukraina";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:17:"USAs mindre øyer";}s:2:"US";a:1:{i:0;s:3:"USA";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:10:"
Usbekistan";}s:2:"VA";a:1:{i:0;s:13:"Vatikanstaten";}s:2:"VC";a:1:{i:0;s:26:"St. Vincent og Grenadinene";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:22:"Jomfruøyene (britisk)";}s:2:"VI";a:1:{i:0;s:18:"Jomfruøyene (USA)";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:16:"Wallis og Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Yemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:10:"Jugoslavia";}s:2:"ZA";a:1:{i:0;s:11:"Sør-Afrika";}s:2:"ZM";a:1:{i:0;s:6:"Zambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:380:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:19:"Andorranske dinarer";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:19:"Andorranske pesetas";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:10:"UAE dirham";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:19:"Afghani (1927-2002)";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:7:"Afghani";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:19:"Affar og Issa franc";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:24:"Albanske lek (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:12:"Albanske lek";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:19:"Albanske lek valute";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:21:"Albanske dollar (FEC)";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:13:"Armenske dram";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:26:"Nederlandske antillegylden";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:17:"Angolanske kwanza";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:29:"Angolanske kwanza (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:32:"Angolanske ny kwanza (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:37:"Angolan Kwanza Reajustado (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:17:"Angolanske escudo";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:21:"Argentinske australer";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:32:"Argentinske Peso Moneda Nacional";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:29:"Argentinske pesos (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:17:"Argentinske pesos";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:21:"Østerrikske shilling";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:17:"Australske dollar"
;}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:15:"Australske pund";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:15:"Arubiske gylden";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:21:"Aserbajdsjanske Manat";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:26:"Bosnia-Hercegovina dinarer";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:37:"Bosnia-Hercegovina mark (konvertible)";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:30:"Bosnia-Hercegovina nye dinarer";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:16:"Barbadisk dollar";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:19:"Bangladeshiske taka";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:28:"Belgiske franc (konvertible)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:14:"Belgiske franc";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:28:"Belgiske franc (økonomiske)";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:20:"Bulgarske lev (hard)";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:23:"Bulgarske sosialist-lev";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:13:"Bulgarske lev";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:25:"Bulgarske lev (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:19:"Bulgarske lev (FEC)";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:18:"Bahrainske dinarer";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:16:"Burundiske franc";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:17:"Bermudiske dollar";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:15:"Bermudiske pund";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:16:"Bruneiske dollar";}s:3:"BOB";a:2:{i:0;s:2:"Bs";i:1;s:9:"Boliviano";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:21:"Boliviano (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:16:"Boliviansk pesos";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:16:"Boliviansk mvdol";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:37:"Brasiliansk cruzeiro novo (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:20:"Brasilianske cruzado";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:33:"Brasilianske cruzeiro (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:19:"Brasilianske realer";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:25:"Brasilianske cruzado novo";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:21:"Brasilianske cruzeiro";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:33:"Brasilianske cruzeiro (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BS
D";i:1;s:15:"Bahamske dollar";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:13:"Bahamske pund";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:18:"Bhutanske ngultrum";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:16:"Bhutanske rupier";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:15:"Burmesiske kyat";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:17:"Burmesiske rupier";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:15:"Botswanske pula";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:36:"Hviterussiske nye rubler (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:32:"Hviterussiske rubler (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:20:"Hviterussiske rubler";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:16:"Beliziske dollar";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:23:"Britisk Honduras-dollar";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:16:"Kanadiske dollar";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:30:"Kongolesiske franc (congolais)";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:28:"Kongolesiske republikk-franc";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:18:"Congolesiske zaire";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:29:"Sentralafrikanske franc (CFA)";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:16:"Sveitsiske franc";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:17:"Cookøyene dollar";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:16:"Chilenske condor";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:16:"Chilenske escudo";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:29:"Chilenske Unidades de Fomento";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:15:"Chilenske pesos";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:22:"Kamerunske franc (CFA)";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:27:"Kinesiske Jen Min Piao Yuan";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:25:"Kinesiske US dollar (FEC)";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:23:"Kinesiske Yuan Renminbi";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:24:"Colombianske papir-pesos";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:24:"Kongolesiske franc (CFA)";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:18:"Colombianske pesos";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:19:"Costaricanske colon";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:24:"Tsjekkoslovakiske koruna";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:31:"Tsjekkoslovakiske koru
na (hard)";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:14:"Kubanske pesos";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:38:"Kubanske Foreign Exchange Certificates";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:19:"Kappverdiske escudo";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:14:"Curacao-gylden";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:16:"Kypriotiske pund";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:17:"Tsjekkiske koruna";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:17:"Østtyske ostmark";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:10:"Tyske mark";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:15:"Tyske sperrmark";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:17:"Djiboutiske franc";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:13:"Danske kroner";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:18:"Dominikanske pesos";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:17:"Algeriske dinarer";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:19:"Algeriske nye franc";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:24:"Algeriske franc germinal";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:19:"Ecuadorianske sucre";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:45:"Ecuadorianske Unidad de Valor Constante (UVC)";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:13:"Estiske kroon";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:14:"Egyptiske pund";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:16:"Eritreiske nakfa";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:14:"Spanske peseta";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:14:"Etiopiske birr";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:16:"Etiopiske dollar";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"Euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:11:"Finske mark";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:23:"Finske mark (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:16:"Fijianske dollar";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:14:"Fijianske pund";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:20:"Falklandsøyene-pund";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:17:"Færøyske kronur";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:13:"Franske franc";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:39:"Franske franc (Germinal/Franc Poincare)";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:20:"Gabonske franc (CFA)";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:22:"Britiske pund sterl
ing";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:21:"Georgiske kupon larit";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:14:"Georgiske lari";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:15:"Ghanesiske cedi";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:21:"Ghanesiske gamle cedi";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:15:"Ghanesiske pund";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:26:"Ghanesiske revaluerte cedi";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:17:"Gibraltarske pund";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:19:"Grønlandske kroner";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:15:"Gambiske dalasi";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:13:"Gambiske pund";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:16:"Guineanske franc";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:28:"Guineanske franc (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:15:"Guineanske syli";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:16:"Guadeloupe-franc";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:36:"Ekvatorialguineanske ekwele guineana";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:27:"Ekvatorialguineanske franco";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:36:"Ekvatorialguineanske peseta guineana";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:14:"Greske drakmer";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:18:"Greske nye drakmer";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:21:"Guatemalanske quetzal";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:26:"Fransk Guyana-franc guiana";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:26:"Portugisiske guinea escudo";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:28:"Portugisiske Guinea Mil Reis";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:19:"Guinea-Bissau-pesos";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:15:"Guyanske dollar";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:15:"Hongkong-dollar";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:15:"Hoduras Lempira";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:17:"Kroatiske dinarer";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:14:"Kroatiske kuna";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:15:"Haitiske gourde";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:17:"Ungarske forinter";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:14:"Nordirske pund";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:23:"Indonesiske nica-gylden";}s:3:"IDJ";a:2:{
i:0;s:3:"IDJ";i:1;s:23:"Indonesiske Java-rupier";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:22:"Indonesiske nye rupier";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:18:"Indonesiske rupier";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:10:"Irske pund";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:17:"Israelske shekler";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:14:"Israelske pund";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:21:"Israelske nye shekler";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:20:"Manske pund sterling";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:14:"Indiske rupier";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:15:"Irakske dinarer";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:14:"Iranske rialer";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:16:"Islandske kronar";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:15:"Italienske lire";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:20:"Jersey pund sterling";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:18:"Jamaikanske dollar";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:16:"Jamaikanske pund";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:17:"Jordanske dinarer";}s:3:"JPY";a:2:{i:0;s:2:"¥";i:1;s:12:"Japanske yen";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:18:"Kenyanske shilling";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:14:"Kirgisiske som";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:24:"Kambodsjanske gamle riel";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:18:"Kambodsjanske riel";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:18:"Kiribatiske dollar";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:15:"Komoriske franc";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:29:"Nordkoreanske won (1947-1959)";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:17:"Nordkoreanske won";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:18:"Sørkoreanske hwan";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:23:"Sørkoreanske gamle won";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:17:"Sørkoreanske won";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:18:"Kuwaitiske dinarer";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:16:"Caymanske dollar";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:20:"Kasakhstanske rubler";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:19:"Kasakhstanske tenge";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:12:"Laotiske kip";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:
1;s:16:"Libanesiske pund";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:22:"Liechtensteinske franc";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:18:"Srilankiske rupier";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:16:"Ceylonske rupier";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:16:"Liberiske dollar";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:15:"Lesothiske loti";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:14:"Litauiske lita";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:17:"Litauiske talonas";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:18:"Luxemburgske franc";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:13:"Latviske lats";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:15:"Latviske rubler";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:39:"Libyske British Military Authority-lira";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:15:"Libyske dinarer";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:12:"Libyske pund";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:18:"Marokkanske dirham";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:17:"Marokkanske franc";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:26:"Monegaskiske franc nouveau";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:27:"Monegaskiske franc germinal";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:19:"Moldovske leu cupon";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:13:"Moldovske leu";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:21:"Moldovske ruble cupon";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:19:"Madagassiske ariary";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:18:"Madagassiske franc";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:21:"Marshalløyene-dollar";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:18:"Makedonske denarer";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:30:"Makedonske denarer (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:13:"Maliske franc";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:15:"Myanmarske kyat";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:23:"Myanmarske dollar (FEC)";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:16:"Mongolske tugrik";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:15:"Makaoske pataca";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:16:"Martinique-franc";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:19:"Mauritanske ouguiya";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:15:"Maltesiske lira";}s:3:"MTP";a:2:{i:0;s:3:"MTP"
;i:1;s:15:"Maltesiske pund";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:17:"Mauritiske rupier";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:17:"Maldiviske rupier";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:18:"Maldiviske rufiyaa";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:16:"Malawisle kwacha";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:14:"Malawiske pund";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:17:"Meksikanske pesos";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:34:"Meksikanske sølvpesos (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:37:"Meksikanske Unidad de Inversion (UDI)";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:18:"Malaysiske ringgit";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:19:"Mosambikiske escudo";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:20:"Mosambikiske metical";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:16:"Namibiske dollar";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:25:"Kaledonske franc germinal";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:17:"Nigerianske naira";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:16:"Nigerianske pund";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:22:"Ny-hebridene CFP-franc";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:21:"Nicaraguanske cordoba";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:25:"Nicaraguanske gullcordoba";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:25:"Nicaraguanske cordoba oro";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:19:"Nederlandske gylden";}s:3:"NOK";a:2:{i:0;s:2:"kr";i:1;s:13:"Norske kroner";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:18:"Nepalesiske rupier";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:19:"Nyzealandske dollar";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:17:"Nyzealandske pund";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:14:"Omanske rialer";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:18:"Omanske rial saidi";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:17:"Panamanske balboa";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:32:"Transdniestriansk rubler (kupon)";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:29:"Transdniestrianske nye rubler";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:25:"Transdniestrianske rubler";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:16:"Peruvianske inti";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:21:"Peruvianske sol nuevo";}s:3:"PES";a:2:{i:0;s:3:"PES"
;i:1;s:15:"Peruvianske sol";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:14:"Papuanske kina";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:17:"Filippinske pesos";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:18:"Pakistanske rupier";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:12:"Polske zloty";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:22:"Polske US dollar (FEC)";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:24:"Polske zloty (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:16:"Palestinske pund";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:18:"Portugisiske conto";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:19:"Portugisiske escudo";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:21:"Paraguayanske guarani";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:16:"Qatarske riyaler";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:16:"Reunionske franc";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:12:"Rumenske leu";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:16:"Rumenske nye leu";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:15:"Russiske rubler";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:27:"Russiske rubler (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:15:"Rwandiske franc";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:21:"Saudiarabiske riyaler";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:33:"Saudiarabiske riyaler (1936-1952)";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:17:"Salomonske dollar";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:19:"Seychelliske rupier";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:19:"Sudanesiske dinarer";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:16:"Sudanesiske pund";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:14:"Svenske kroner";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:18:"Singaporske dollar";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:18:"Sankthelenske pund";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:20:"Slovenske tolar bons";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:15:"Slovenske tolar";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:17:"Slovakiske koruna";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:19:"Sierraleonske leone";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:16:"Sanmarinske lira";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:18:"Somaliske shilling";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:22:"Somalilandske shilling";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:
17:"Surinamske gylden";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:12:"Skotske pund";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:26:"Sao Tome og Principe-dobra";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:27:"Sao Tome og Principe-escudo";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:21:"Sovjetiske nye rubler";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:17:"Sovjetiske rubler";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:19:"Salvadoranske colon";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:12:"Syriske pund";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:22:"Swazilandske lilangeni";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:28:"Turks- og Caicosøyene-crown";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:21:"Tsjadiske franc (CFA)";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:16:"Thailandske baht";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:18:"Tadsjikiske rubler";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:18:"Tadsjikiske somoni";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:16:"Turkmenske manat";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:17:"Tunisiske dinarer";}s:3:"TOP";a:2:{i:0;s:2:"T$";i:1;s:18:"Tonganske paʻanga";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:23:"Tonganske pund sterling";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:18:"Timoresiske escudo";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:18:"Timoresiske pataca";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:13:"Tyrkiske lira";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:19:"Trinidadiske dollar";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:25:"Trinidadiske gamle dollar";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:15:"Tuvalske dollar";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:20:"Taiwanske nye dollar";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:21:"Tanzanianske shilling";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:17:"Ukrainsle hryvnia";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:21:"Ukrainske karbovanetz";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:30:"Ugandiske shilling (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:18:"Ugandiske shilling";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:18:"Amerikanske dollar";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:30:"Amerikanske dollar (neste dag)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:30:"Amerikanske dollar (samme dag)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:24:"U
ruguayanske peso fuerte";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:30:"Uruguayanske pesos (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:26:"Uruguayanske peso uruguayo";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:20:"Usbekiske kupong-som";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:13:"Usbekiske sum";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:19:"Vatikanstatens lira";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:35:"Nordvietnamesiske piastre dong viet";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:26:"Nordvietnamesiske nye dong";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:45:"Nordvietnamesiske viet minh piastre dong viet";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:21:"Venezuelanske bolivar";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:31:"De britiske jomfruøyene-dollar";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:18:"Vietnamesiske dong";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:22:"Vietnamesiske nye dong";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:28:"Vietnamesiske republikk-dong";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:28:"Vietnamesiske nasjonale dong";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:14:"Vanuatisk vatu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:16:"Vestsamoisk pund";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:16:"Vestsamoisk tala";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:27:"Asian Dinar Unit of Account";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:14:"CFA Franc BEAC";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:19:"Asian Monetary Unit";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:4:"Gull";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:23:"European Composite Unit";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:22:"European Monetary Unit";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:30:"European Unit of Account (XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:30:"European Unit of Account (XBD)";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:20:"Østkaribiske dollar";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:17:"CFA Nouveau Franc";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:22:"Special Drawing Rights";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:16:"CFA Franc BCEAEC";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:22:"European Currency Unit";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:17:"French Gold Franc";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1
;s:16:"French UIC-Franc";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:16:"Islamske dinarer";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:33:"French Metropolitan Nouveau Franc";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:28:"Franske antiller-franc (CFA)";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:15:"CFA Franc BCEAO";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:9:"CFP Franc";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:26:"COMECON Transferable Ruble";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:20:"Jemenittiske dinarer";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:26:"Jemenittiske imadi-riyaler";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:19:"Jemenittiske rialer";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:27:"Jugoslaviske dinarer (hard)";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:34:"Jugoslaviske føderasjonen-dinarer";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:25:"Jugoslaviske 1994-dinarer";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:26:"Jugoslaviske noviy-dinarer";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:32:"Jugoslaviske konvertible dinarer";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:27:"Jugoslaviske oktoberdinarer";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:30:"Jugoslaviske reforerte dinarer";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:32:"Sørafrikanske rand (økonomisk)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:19:"Sørafrikanske pund";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:19:"Sørafrikanske rand";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:15:"Zambiske kwacha";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:13:"Zambiske pund";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:18:"Zairiske nye zaire";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:14:"Zairiske zaire";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:18:"Zimbabwiske dollar";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:8:"Kalendar";}s:9:"collation";a:1:{i:0;s:9:"Kollasjon";}s:8:"currency";a:1:{i:0;s:6:"Valuta";}}s:9:"Languages";a:193:{s:2:"aa";a:1:{i:0;s:4:"afar";}s:2:"ab";a:1:{i:0;s:9:"abkhasisk";}s:2:"ae";a:1:{i:0;s:8:"avestisk";}s:2:"af";a:1:{i:0;s:9:"afrikaans";}s:2:"ak";a:1:{i:0;s:4:"akan";}s:2:"am";a:1:{i:0;s:8:"amharisk";}s:2:"an";a:1:{i:0;s:8:"aragonsk";}s:2:"ar";a:1:{i:0;s:7:"arabisk";}s:2:"as";a:1:{i:0;s:8:"assamisk";}s:2:"av";a:1:{i:
0;s:7:"avarisk";}s:2:"ay";a:1:{i:0;s:6:"aymara";}s:2:"az";a:1:{i:0;s:14:"aserbajdsjansk";}s:2:"ba";a:1:{i:0;s:9:"basjkirsk";}s:2:"be";a:1:{i:0;s:12:"hviterussisk";}s:2:"bg";a:1:{i:0;s:8:"bulgarsk";}s:2:"bh";a:1:{i:0;s:6:"bihari";}s:2:"bi";a:1:{i:0;s:7:"bislama";}s:2:"bm";a:1:{i:0;s:7:"bambara";}s:2:"bn";a:1:{i:0;s:7:"bengali";}s:2:"bo";a:1:{i:0;s:9:"tibetansk";}s:2:"br";a:1:{i:0;s:8:"bretonsk";}s:2:"bs";a:1:{i:0;s:7:"bosnisk";}s:3:"byn";a:1:{i:0;s:4:"blin";}s:2:"ca";a:1:{i:0;s:9:"katalansk";}s:2:"ce";a:1:{i:0;s:11:"tsjetsjensk";}s:2:"ch";a:1:{i:0;s:8:"chamorro";}s:3:"chr";a:1:{i:0;s:8:"cherokee";}s:2:"co";a:1:{i:0;s:10:"korsikansk";}s:2:"cr";a:1:{i:0;s:4:"cree";}s:2:"cs";a:1:{i:0;s:9:"tsjekkisk";}s:2:"cu";a:1:{i:0;s:12:"kirkeslavisk";}s:2:"cv";a:1:{i:0;s:9:"tsjuvansk";}s:2:"cy";a:1:{i:0;s:8:"walisisk";}s:2:"da";a:1:{i:0;s:5:"dansk";}s:2:"de";a:1:{i:0;s:4:"tysk";}s:2:"dv";a:1:{i:0;s:6:"divehi";}s:2:"dz";a:1:{i:0;s:8:"dzongkha";}s:2:"ee";a:1:{i:0;s:3:"ewe";}s:2:"el";a:1:{i:0;s:5:"gresk";}s:2:"en";a:1:{i:0;s:7:"engelsk";}s:2:"eo";a:1:{i:0;s:9:"esperanto";}s:2:"es";a:1:{i:0;s:6:"spansk";}s:2:"et";a:1:{i:0;s:6:"estisk";}s:2:"eu";a:1:{i:0;s:7:"baskisk";}s:2:"fa";a:1:{i:0;s:7:"persisk";}s:2:"ff";a:1:{i:0;s:6:"fulani";}s:2:"fi";a:1:{i:0;s:5:"finsk";}s:2:"fj";a:1:{i:0;s:8:"fijiansk";}s:2:"fo";a:1:{i:0;s:9:"færøysk";}s:2:"fr";a:1:{i:0;s:6:"fransk";}s:2:"fy";a:1:{i:0;s:7:"frisisk";}s:2:"ga";a:1:{i:0;s:4:"irsk";}s:2:"gd";a:1:{i:0;s:14:"skotsk gælisk";}s:3:"gez";a:1:{i:0;s:3:"ges";}s:2:"gl";a:1:{i:0;s:8:"galicisk";}s:2:"gn";a:1:{i:0;s:7:"guarani";}s:2:"gu";a:1:{i:0;s:8:"gujarati";}s:2:"gv";a:1:{i:0;s:4:"manx";}s:3:"haw";a:1:{i:0;s:8:"hawaiisk";}s:2:"he";a:1:{i:0;s:8:"hebraisk";}s:2:"hi";a:1:{i:0;s:5:"hindi";}s:2:"ho";a:1:{i:0;s:9:"hiri motu";}s:2:"hr";a:1:{i:0;s:8:"kroatisk";}s:2:"ht";a:1:{i:0;s:7:"haitisk";}s:2:"hu";a:1:{i:0;s:7:"ungarsk";}s:2:"hy";a:1:{i:0;s:7:"armensk";}s:2:"hz";a:1:{i:0;s:6:"herero";}s:2:"ia";a:1:{i:0;s:11:"interlingua";}s:2:"id";a:1:{i:0;s:10:"indonesisk";}s:2:"ie";a:1:{i:0;s:11:"interlingue";}s:2:"ig
";a:1:{i:0;s:3:"ibo";}s:2:"ii";a:1:{i:0;s:10:"sichuan-yi";}s:2:"ik";a:1:{i:0;s:7:"unupiak";}s:2:"io";a:1:{i:0;s:3:"ido";}s:2:"is";a:1:{i:0;s:8:"islandsk";}s:2:"it";a:1:{i:0;s:9:"italiensk";}s:2:"iu";a:1:{i:0;s:9:"inuktitut";}s:2:"ja";a:1:{i:0;s:7:"japansk";}s:2:"jv";a:1:{i:0;s:10:"javanesisk";}s:2:"ka";a:1:{i:0;s:8:"georgisk";}s:2:"kg";a:1:{i:0;s:7:"kikongo";}s:2:"ki";a:1:{i:0;s:6:"kikuyu";}s:2:"kj";a:1:{i:0;s:8:"kuanyama";}s:2:"kk";a:1:{i:0;s:9:"kasakhisk";}s:2:"kl";a:1:{i:0;s:11:"kalaallisut";}s:2:"km";a:1:{i:0;s:5:"khmer";}s:2:"kn";a:1:{i:0;s:7:"kannada";}s:2:"ko";a:1:{i:0;s:8:"koreansk";}s:3:"kok";a:1:{i:0;s:7:"konkani";}s:2:"kr";a:1:{i:0;s:6:"kanuri";}s:2:"ks";a:1:{i:0;s:8:"kasjmiri";}s:2:"ku";a:1:{i:0;s:7:"kurdisk";}s:2:"kv";a:1:{i:0;s:4:"komi";}s:2:"kw";a:1:{i:0;s:7:"kornisk";}s:2:"ky";a:1:{i:0;s:9:"kirgisisk";}s:2:"la";a:1:{i:0;s:5:"latin";}s:2:"lb";a:1:{i:0;s:11:"luxemburgsk";}s:2:"lg";a:1:{i:0;s:5:"ganda";}s:2:"li";a:1:{i:0;s:10:"limburgisk";}s:2:"ln";a:1:{i:0;s:7:"lingala";}s:2:"lo";a:1:{i:0;s:7:"laotisk";}s:2:"lt";a:1:{i:0;s:8:"litauisk";}s:2:"lu";a:1:{i:0;s:12:"luba-katanga";}s:2:"lv";a:1:{i:0;s:7:"latvisk";}s:2:"mg";a:1:{i:0;s:11:"madagassisk";}s:2:"mh";a:1:{i:0;s:13:"marshallesisk";}s:2:"mi";a:1:{i:0;s:5:"maori";}s:2:"mk";a:1:{i:0;s:9:"makedonsk";}s:2:"ml";a:1:{i:0;s:9:"malayalam";}s:2:"mn";a:1:{i:0;s:8:"mongolsk";}s:2:"mo";a:1:{i:0;s:9:"moldavisk";}s:2:"mr";a:1:{i:0;s:7:"marathi";}s:2:"ms";a:1:{i:0;s:8:"malayisk";}s:2:"mt";a:1:{i:0;s:9:"maltesisk";}s:2:"my";a:1:{i:0;s:9:"burmesisk";}s:2:"na";a:1:{i:0;s:5:"nauru";}s:2:"nb";a:1:{i:0;s:13:"norsk bokmål";}s:2:"nd";a:1:{i:0;s:14:"ndebele (nord)";}s:2:"ne";a:1:{i:0;s:7:"nepalsk";}s:2:"ng";a:1:{i:0;s:6:"ndonga";}s:2:"nl";a:1:{i:0;s:11:"nederlandsk";}s:2:"nn";a:1:{i:0;s:13:"norsk nynorsk";}s:2:"no";a:1:{i:0;s:5:"norsk";}s:2:"nr";a:1:{i:0;s:13:"ndebele, sør";}s:2:"nv";a:1:{i:0;s:6:"navajo";}s:2:"ny";a:1:{i:0;s:6:"nyanja";}s:2:"oc";a:1:{i:0;s:22:"oksitansk (etter 1500)";}s:2:"oj";a:1:{i:0;s:6:"ojibwa";}s:2:"om";a:1:{i:0;s:5:"oromo";}s:2:"or";a:1:{i:0;s:5:
"oriya";}s:2:"os";a:1:{i:0;s:8:"ossetisk";}s:2:"pa";a:1:{i:0;s:7:"panjabi";}s:2:"pi";a:1:{i:0;s:4:"pali";}s:2:"pl";a:1:{i:0;s:5:"polsk";}s:2:"ps";a:1:{i:0;s:6:"pashto";}s:2:"pt";a:1:{i:0;s:11:"portugisisk";}s:2:"qu";a:1:{i:0;s:7:"quechua";}s:2:"rm";a:1:{i:0;s:11:"retoromansk";}s:2:"rn";a:1:{i:0;s:5:"rundi";}s:2:"ro";a:1:{i:0;s:7:"rumensk";}s:2:"ru";a:1:{i:0;s:7:"russisk";}s:2:"rw";a:1:{i:0;s:11:"kinjarwanda";}s:2:"sa";a:1:{i:0;s:8:"sanskrit";}s:2:"sc";a:1:{i:0;s:8:"sardinsk";}s:2:"sd";a:1:{i:0;s:6:"sindhi";}s:2:"se";a:1:{i:0;s:10:"nordsamisk";}s:2:"sg";a:1:{i:0;s:5:"sango";}s:2:"sh";a:1:{i:0;s:13:"serbokroatisk";}s:2:"si";a:1:{i:0;s:11:"singalesisk";}s:3:"sid";a:1:{i:0;s:6:"sidamo";}s:2:"sk";a:1:{i:0;s:9:"slovakisk";}s:2:"sl";a:1:{i:0;s:8:"slovensk";}s:2:"sm";a:1:{i:0;s:8:"samoansk";}s:2:"sn";a:1:{i:0;s:5:"shona";}s:2:"so";a:1:{i:0;s:8:"somalisk";}s:2:"sq";a:1:{i:0;s:7:"albansk";}s:2:"sr";a:1:{i:0;s:7:"serbisk";}s:2:"ss";a:1:{i:0;s:5:"swati";}s:2:"st";a:1:{i:0;s:15:"sotho (sørlig)";}s:2:"su";a:1:{i:0;s:11:"sundanesisk";}s:2:"sv";a:1:{i:0;s:6:"svensk";}s:2:"sw";a:1:{i:0;s:7:"swahili";}s:3:"syr";a:1:{i:0;s:6:"syrisk";}s:2:"ta";a:1:{i:0;s:5:"tamil";}s:2:"te";a:1:{i:0;s:6:"telugu";}s:2:"tg";a:1:{i:0;s:10:"tatsjikisk";}s:2:"th";a:1:{i:0;s:4:"thai";}s:2:"ti";a:1:{i:0;s:8:"tigrinja";}s:3:"tig";a:1:{i:0;s:6:"tigré";}s:2:"tk";a:1:{i:0;s:9:"turkmensk";}s:2:"tl";a:1:{i:0;s:7:"tagalog";}s:2:"tn";a:1:{i:0;s:6:"tswana";}s:2:"to";a:1:{i:0;s:20:"tonga (Tonga-øyene)";}s:2:"tr";a:1:{i:0;s:7:"tyrkisk";}s:2:"ts";a:1:{i:0;s:6:"tsonga";}s:2:"tt";a:1:{i:0;s:8:"tatarisk";}s:2:"tw";a:1:{i:0;s:3:"twi";}s:2:"ty";a:1:{i:0;s:8:"tahitisk";}s:2:"ug";a:1:{i:0;s:8:"uigurisk";}s:2:"uk";a:1:{i:0;s:8:"ukrainsk";}s:2:"ur";a:1:{i:0;s:4:"urdu";}s:2:"uz";a:1:{i:0;s:8:"usbekisk";}s:2:"ve";a:1:{i:0;s:5:"venda";}s:2:"vi";a:1:{i:0;s:12:"vietnamesisk";}s:2:"vo";a:1:{i:0;s:7:"volapyk";}s:2:"wa";a:1:{i:0;s:8:"vallonsk";}s:2:"wo";a:1:{i:0;s:5:"wolof";}s:2:"xh";a:1:{i:0;s:5:"xhosa";}s:2:"yi";a:1:{i:0;s:7:"jiddisk";}s:2:"yo";a:1:{i:0;s:6:"joruba";}s:2:"za";a:
1:{i:0;s:6:"zhuang";}s:2:"zh";a:1:{i:0;s:8:"kinesisk";}s:2:"zu";a:1:{i:0;s:4:"zulu";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"¤ #,##0.00;-¤ #,##0.00";i:2;s:7:"#,##0 %";i:3;s:3:"#E0";}s:7:"Scripts";a:56:{s:4:"Arab";a:1:{i:0;s:7:"arabisk";}s:4:"Armn";a:1:{i:0;s:7:"armensk";}s:4:"Beng";a:1:{i:0;s:8:"bengalsk";}s:4:"Bopo";a:1:{i:0;s:8:"bopomofo";}s:4:"Brai";a:1:{i:0;s:7:"braille";}s:4:"Buhd";a:1:{i:0;s:5:"buhid";}s:4:"Cans";a:1:{i:0;s:35:"Unified Canadian Aboriginal Symbols";}s:4:"Cher";a:1:{i:0;s:8:"cherokee";}s:4:"Copt";a:1:{i:0;s:7:"koptisk";}s:4:"Cprt";a:1:{i:0;s:10:"kypriotisk";}s:4:"Cyrl";a:1:{i:0;s:9:"kyrillisk";}s:4:"Deva";a:1:{i:0;s:10:"devanagari";}s:4:"Dsrt";a:1:{i:0;s:7:"deseret";}s:4:"Ethi";a:1:{i:0;s:8:"etiopisk";}s:4:"Geor";a:1:{i:0;s:8:"georgisk";}s:4:"Goth";a:1:{i:0;s:6:"gotisk";}s:4:"Grek";a:1:{i:0;s:5:"gresk";}s:4:"Gujr";a:1:{i:0;s:8:"gujarati";}s:4:"Guru";a:1:{i:0;s:8:"gurmukhi";}s:4:"Hang";a:1:{i:0;s:6:"hangul";}s:4:"Hani";a:1:{i:0;s:3:"han";}s:4:"Hano";a:1:{i:0;s:7:"hanunoo";}s:4:"Hans";a:1:{i:0;s:13:"forenklet han";}s:4:"Hant";a:1:{i:0;s:16:"tradisjonell han";}s:4:"Hebr";a:1:{i:0;s:8:"hebraisk";}s:4:"Hira";a:1:{i:0;s:8:"hiragana";}s:4:"Ital";a:1:{i:0;s:13:"gammelitalisk";}s:4:"Kana";a:1:{i:0;s:8:"katakana";}s:4:"Khmr";a:1:{i:0;s:5:"khmer";}s:4:"Knda";a:1:{i:0;s:7:"kannada";}s:4:"Laoo";a:1:{i:0;s:7:"laotisk";}s:4:"Latn";a:1:{i:0;s:5:"latin";}s:4:"Limb";a:1:{i:0;s:5:"limbu";}s:4:"Linb";a:1:{i:0;s:9:"lineær B";}s:4:"Mlym";a:1:{i:0;s:9:"malayalam";}s:4:"Mong";a:1:{i:0;s:8:"mongolsk";}s:4:"Mymr";a:1:{i:0;s:7:"myanmar";}s:4:"Ogam";a:1:{i:0;s:5:"ogham";}s:4:"Orya";a:1:{i:0;s:5:"oriya";}s:4:"Osma";a:1:{i:0;s:7:"osmanya";}s:4:"Qaai";a:1:{i:0;s:8:"nedarvet";}s:4:"Runr";a:1:{i:0;s:6:"runisk";}s:4:"Shaw";a:1:{i:0;s:7:"shavisk";}s:4:"Sinh";a:1:{i:0;s:7:"sin
hala";}s:4:"Syrc";a:1:{i:0;s:6:"syrisk";}s:4:"Tagb";a:1:{i:0;s:8:"tagbanwa";}s:4:"Tale";a:1:{i:0;s:6:"tai le";}s:4:"Taml";a:1:{i:0;s:5:"tamil";}s:4:"Telu";a:1:{i:0;s:6:"telugu";}s:4:"Tglg";a:1:{i:0;s:7:"tagalog";}s:4:"Thaa";a:1:{i:0;s:6:"thaana";}s:4:"Thai";a:1:{i:0;s:4:"thai";}s:4:"Tibt";a:1:{i:0;s:9:"tibetansk";}s:4:"Ugar";a:1:{i:0;s:9:"ugaritisk";}s:4:"Yiii";a:1:{i:0;s:2:"yi";}s:4:"Zyyy";a:1:{i:0;s:8:"generelt";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:20:"Buddhistisk kalender";}s:7:"chinese";a:1:{i:0;s:17:"Kinesisk kalender";}s:9:"gregorian";a:1:{i:0;s:20:"Gregoriansk kalender";}s:6:"hebrew";a:1:{i:0;s:17:"Hebraisk kalender";}s:7:"islamic";a:1:{i:0;s:16:"Islamsk kalender";}s:13:"islamic-civil";a:1:{i:0;s:22:"Islamsk sivil kalender";}s:8:"japanese";a:1:{i:0;s:16:"Japansk kalender";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:19:"Direkte rekkefølge";}s:9:"phonebook";a:1:{i:0;s:25:"Telefonkatalogrekkefølge";}s:6:"pinyin";a:1:{i:0;s:18:"Pinyin-rekkefølge";}s:6:"stroke";a:1:{i:0;s:16:"Strekrekkefølge";}s:11:"traditional";a:1:{i:0;s:24:"Tradisjonell rekkefølge";}}}s:8:"Variants";a:1:{s:7:"REVISED";a:1:{i:0;s:8:"Revidert";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:16:"'kl. 'HH.mm.ss z";i:1;s:10:"HH.mm.ss z";i:2;s:8:"HH.mm.ss";i:3;s:5:"HH.mm";i:4;s:17:"EEEE d. MMMM yyyy";i:5;s:12:"d. MMMM yyyy";i:6;s:12:"d. MMM. yyyy";i:7;s:8:"dd.MM.yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:3:"sø";i:1;s:2:"ma";i:2;s:2:"ti";i:3;s:2:"on";i:4;s:2:"to";i:5;s:2:"fr";i:6;s:3:"lø";}s:6:"narrow";a:7:{i:0;s:1:"S";i:1;s:1:"M";i:2;s:1:"T";i:3;s:1:"O";i:4;s:1:"T";i:5;s:1:"F";i:6;s:1:"L";}s:4:"wide";a:7:{i:0;s:7:"søndag";i:1;s:6:"mandag";i:2;s:7:"tirsdag";i:3;s:6:"onsdag";i:4;s:7:"torsdag";i:5;s:6:"fredag";i:6;s:7:"lørdag";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:5:"f.Kr.";i:1;s:5:"e.Kr.";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:1
1:"abbreviated";a:12:{i:0;s:3:"jan";i:1;s:3:"feb";i:2;s:3:"mar";i:3;s:3:"apr";i:4;s:3:"mai";i:5;s:3:"jun";i:6;s:3:"jul";i:7;s:3:"aug";i:8;s:3:"sep";i:9;s:3:"okt";i:10;s:3:"nov";i:11;s:3:"des";}s:6:"narrow";a:12:{i:0;s:1:"J";i:1;s:1:"F";i:2;s:1:"M";i:3;s:1:"A";i:4;s:1:"M";i:5;s:1:"J";i:6;s:1:"J";i:7;s:1:"A";i:8;s:1:"S";i:9;s:1:"O";i:10;s:1:"N";i:11;s:1:"D";}s:4:"wide";a:12:{i:0;s:6:"januar";i:1;s:7:"februar";i:2;s:4:"mars";i:3;s:5:"april";i:4;s:3:"mai";i:5;s:4:"juni";i:6;s:4:"juli";i:7;s:6:"august";i:8;s:9:"september";i:9;s:7:"oktober";i:10;s:8:"november";i:11;s:8:"desember";}}}}}s:11:"zoneStrings";a:1:{i:0;a:6:{i:0;s:16:"Europe/Bucharest";i:1;s:30:"Eastern European Standard Time";i:2;s:3:"EET";i:3;s:30:"Eastern European Daylight Time";i:4;s:4:"EEST";i:5;s:9:"Bucuresti";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nb_NO.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nb_NO.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nb_NO.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:7:"#,##0 %";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nl.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nl.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nl.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:12:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:28:"Verenigde Arabische Emiraten";}s:2:"AF";a:1:{i:0;s:11:"Afghanistan";}s:2:"AG";a:1:{i:0;s:18:"Antigua en Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:8:"Albanië";}s:2:"AM";a:1:{i:0;s:8:"Armenië";}s:2:"AN";a:1:{i:0;s:20:"Nederlandse Antillen";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarctica";}s:2:"AR";a:1:{i:0;s:11:"Argentinië";}s:2:"AS";a:1:{i:0;s:16:"Amerikaans Samoa";}s:2:"AT";a:1:{i:0;s:10:"Oostenrijk";}s:2:"AU";a:1:{i:0;s:10:"Australië";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:12:"Azerbeidzjan";}s:2:"BA";a:1:{i:0;s:19:"Bosnië Herzegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BE";a:1:{i:0;s:7:"België";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:9:"Bulgarije";}s:2:"BH";a:1:{i:0;s:7:"Bahrein";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:17:"Brunei Darussalam";}s:2:"BO";a:1:{i:0;s:7:"Bolivia";}s:2:"BR";a:1:{i:0;s:9:"Brazilië";}s:2:"BS";a:1:{i:0;s:10:"Bahama’s";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BV";a:1:{i:0;s:12:"Bouveteiland";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:11:"Wit-Rusland";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Canada";}s:2:"CC";a:1:{i:0;s:13:"Cocoseilanden";}s:2:"CD";a:1:{i:0;s:30:"Congo, Democratische Republiek";}s:2:"CF";a:1:{i:0;s:29:"Centraal-Afrikaanse Republiek";}s:2:"CG";a:1:{i:0;s:5:"Congo";}s:2:"CH";a:1:{i:0;s:11:"Zwitserland";}s:2:"CI";a:1:{i:0;s:9:"Ivoorkust";}s:2:"CK";a:1:{i:0;s:12:"Cookeilanden";}s:2:"CL";a:1:{i:0;s:5:"Chili";}s:2:"CM";a:1:{i:0;s:8:"Kameroen";}s:2:"CN";a:1:{i:0;s:5:"China";}s:2:"CO";a:1:{i:0;s:8:"Colombia";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:4:"Cuba";}s:2:"CV";a:1:{i:0;s:11:"Kaapverdië";}s:2:"CX";a:1:{i:0;s:15:"Christmaseiland";}s:2:"CY";a:1:{i:0;s:6:"Cyprus";}s:2:"CZ";a:1:{i:0;s:9:"Tsjechië";}s:2:"DE";a:1:{i:0;s:9:"Duitsland";}s:2:"DJ";a:1:{i:0;s
:8:"Djibouti";}s:2:"DK";a:1:{i:0;s:10:"Denemarken";}s:2:"DM";a:1:{i:0;s:8:"Dominica";}s:2:"DO";a:1:{i:0;s:22:"Dominicaanse Republiek";}s:2:"DZ";a:1:{i:0;s:8:"Algerije";}s:2:"EC";a:1:{i:0;s:7:"Ecuador";}s:2:"EE";a:1:{i:0;s:7:"Estland";}s:2:"EG";a:1:{i:0;s:6:"Egypte";}s:2:"EH";a:1:{i:0;s:11:"West-Sahara";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:6:"Spanje";}s:2:"ET";a:1:{i:0;s:9:"Ethiopië";}s:2:"FI";a:1:{i:0;s:7:"Finland";}s:2:"FJ";a:1:{i:0;s:4:"Fiji";}s:2:"FK";a:1:{i:0;s:16:"Falklandeilanden";}s:2:"FM";a:1:{i:0;s:31:"Micronesia, Federale Staten van";}s:2:"FO";a:1:{i:0;s:8:"Faeröer";}s:2:"FR";a:1:{i:0;s:9:"Frankrijk";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:19:"Verenigd Koninkrijk";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:8:"Georgië";}s:2:"GF";a:1:{i:0;s:12:"Frans-Guyana";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:9:"Groenland";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:18:"Equatoriaal-Guinea";}s:2:"GR";a:1:{i:0;s:11:"Griekenland";}s:2:"GS";a:1:{i:0;s:44:"Zuid-Georgië en Zuidelijke Sandwicheilanden";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinee-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:25:"Hongkong S.A.R. van China";}s:2:"HM";a:1:{i:0;s:29:"Heardeiland en McDonaldeiland";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:8:"Kroatië";}s:2:"HT";a:1:{i:0;s:6:"Haïti";}s:2:"HU";a:1:{i:0;s:9:"Hongarije";}s:2:"ID";a:1:{i:0;s:10:"Indonesië";}s:2:"IE";a:1:{i:0;s:7:"Ierland";}s:2:"IL";a:1:{i:0;s:7:"Israël";}s:2:"IN";a:1:{i:0;s:5:"India";}s:2:"IO";a:1:{i:0;s:39:"Brits Territorium in de Indische Oceaan";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:7:"IJsland";}s:2:"IT";a:1:{i:0;s:7:"Italië";}s:2:"JM";a:1:{i:0;s:7:"Jamaica";}s:2:"JO";a:1:{i:0;s:9:"Jordanië";}s:2:"JP";a:1:{i:0;s:5:"Japan";}s:2:"KE";a:1:{i:0;s:5:"Kenia";}s:2:"KG";a:1:{i:0;s:10:"Kirgizstan"
;}s:2:"KH";a:1:{i:0;s:8:"Cambodja";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:7:"Comoren";}s:2:"KN";a:1:{i:0;s:20:"Saint Kitts en Nevis";}s:2:"KP";a:1:{i:0;s:11:"Noord-Korea";}s:2:"KR";a:1:{i:0;s:10:"Zuid-Korea";}s:2:"KW";a:1:{i:0;s:7:"Koeweit";}s:2:"KY";a:1:{i:0;s:14:"Caymaneilanden";}s:2:"KZ";a:1:{i:0;s:10:"Kazachstan";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:7:"Libanon";}s:2:"LC";a:1:{i:0;s:11:"Saint Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberia";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:8:"Litouwen";}s:2:"LU";a:1:{i:0;s:9:"Luxemburg";}s:2:"LV";a:1:{i:0;s:7:"Letland";}s:2:"LY";a:1:{i:0;s:6:"Libië";}s:2:"MA";a:1:{i:0;s:7:"Marokko";}s:2:"MC";a:1:{i:0;s:6:"Monaco";}s:2:"MD";a:1:{i:0;s:19:"Republiek Moldavië";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:16:"Marshalleilanden";}s:2:"MK";a:1:{i:0;s:21:"Macedonië, Republiek";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:9:"Mongolië";}s:2:"MO";a:1:{i:0;s:22:"Macao S.A.R. van China";}s:2:"MP";a:1:{i:0;s:28:"Noordelijke Marianeneilanden";}s:2:"MQ";a:1:{i:0;s:10:"Martinique";}s:2:"MR";a:1:{i:0;s:11:"Mauritanië";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:8:"Maldiven";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:6:"Mexico";}s:2:"MY";a:1:{i:0;s:9:"Maleisië";}s:2:"MZ";a:1:{i:0;s:10:"Mozambique";}s:2:"NA";a:1:{i:0;s:8:"Namibië";}s:2:"NC";a:1:{i:0;s:16:"Nieuw-Caledonië";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:13:"Norfolkeiland";}s:2:"NG";a:1:{i:0;s:7:"Nigeria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:9:"Nederland";}s:2:"NO";a:1:{i:0;s:9:"Noorwegen";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:13:"Nieuw-Zeeland";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:16:"Frans-Polynes
ië";}s:2:"PG";a:1:{i:0;s:19:"Papoea-Nieuw-Guinea";}s:2:"PH";a:1:{i:0;s:10:"Filipijnen";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:5:"Polen";}s:2:"PM";a:1:{i:0;s:24:"Saint Pierre en Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:11:"Puerto Rico";}s:2:"PS";a:1:{i:0;s:17:"Palestijns Gebied";}s:2:"PT";a:1:{i:0;s:8:"Portugal";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Qatar";}s:2:"RE";a:1:{i:0;s:8:"Réunion";}s:2:"RO";a:1:{i:0;s:9:"Roemenië";}s:2:"RU";a:1:{i:0;s:19:"Russische Federatie";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:14:"Saoedi-Arabië";}s:2:"SB";a:1:{i:0;s:16:"Salomonseilanden";}s:2:"SC";a:1:{i:0;s:10:"Seychellen";}s:2:"SD";a:1:{i:0;s:6:"Soedan";}s:2:"SE";a:1:{i:0;s:6:"Zweden";}s:2:"SG";a:1:{i:0;s:9:"Singapore";}s:2:"SH";a:1:{i:0;s:12:"Saint Helena";}s:2:"SI";a:1:{i:0;s:9:"Slovenië";}s:2:"SJ";a:1:{i:0;s:21:"Svalbard en Jan Mayen";}s:2:"SK";a:1:{i:0;s:9:"Slowakije";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:8:"Somalië";}s:2:"SP";a:1:{i:0;s:7:"Servië";}s:2:"SR";a:1:{i:0;s:8:"Suriname";}s:2:"ST";a:1:{i:0;s:21:"Sao Tomé en Principe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:6:"Syrië";}s:2:"SZ";a:1:{i:0;s:9:"Swaziland";}s:2:"TC";a:1:{i:0;s:24:"Turks- en Caicoseilanden";}s:2:"TD";a:1:{i:0;s:6:"Tsjaad";}s:2:"TF";a:1:{i:0;s:48:"Franse Gebieden in de zuidelijke Indische Oceaan";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:8:"Thailand";}s:2:"TJ";a:1:{i:0;s:12:"Tadzjikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:10:"Oost-Timor";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:8:"Tunesië";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:7:"Turkije";}s:2:"TT";a:1:{i:0;s:18:"Trinidad en Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Taiwan";}s:2:"TZ";a:1:{i:0;s:8:"Tanzania";}s:2:"UA";a:1:{i:0;s:9:"Oekraïne";}s:2:"UG";a:1:{i:0;s:7:"Oeganda";}s:2:"UM";a:1:{i:0;s:45:"Amerika
anse ondergeschikte afgelegen eilanden";}s:2:"US";a:1:{i:0;s:16:"Verenigde Staten";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:11:"Oezbekistan";}s:2:"VA";a:1:{i:0;s:12:"Vaticaanstad";}s:2:"VC";a:1:{i:0;s:30:"Saint Vincent en de Grenadines";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:22:"Britse Maagdeneilanden";}s:2:"VI";a:1:{i:0;s:27:"Amerikaanse Maagdeneilanden";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:16:"Wallis en Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:12:"Joegoslavië";}s:2:"ZA";a:1:{i:0;s:11:"Zuid-Afrika";}s:2:"ZM";a:1:{i:0;s:6:"Zambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:380:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:15:"Andorrese diner";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:16:"Andorrese peseta";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:35:"Verenigde Arabische Emiraten-dirham";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:19:"Afghani (1927-2002)";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:7:"Afghani";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:21:"Affars en Issas-franc";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:24:"Albanese lek (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:12:"Albanese lek";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:19:"Albanese lek valute";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:33:"Albanese dollarwisselcertificaten";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:13:"Armeense dram";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:30:"Nederlands-Antilliaanse gulden";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:15:"Angolese kwanza";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:27:"Angolese kwanza (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:34:"Angolese nieuwe kwanza (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:38:"Angolese kwanza reajustado (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:15:"Angolese escudo";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:19:"Argentijnse austral";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:32:"Argentijnse peso moneda nacional";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:28:"Argentijnse peso (1983-1
985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:16:"Argentijnse peso";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:22:"Oostenrijkse schilling";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:19:"Australische dollar";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:16:"Australisch pond";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:16:"Arubaanse gulden";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:21:"Azerbeidzjaanse manat";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:15:"Bosnische dinar";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:27:"Bosnische convertibele mark";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:22:"Bosnische nieuwe dinar";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:18:"Barbadaanse dollar";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:14:"Bengalese taka";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:29:"Belgische frank (convertibel)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:15:"Belgische frank";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:28:"Belgische frank (financieel)";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:19:"Bulgaarse harde lev";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:28:"Bulgaarse socialistische lev";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:20:"Bulgaarse nieuwe lev";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:25:"Bulgaarse lev (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:31:"Bulgaarse levwisselcertificaten";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:15:"Bahreinse dinar";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:15:"Burundese franc";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:14:"Bermuda-dollar";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:12:"Bermuda-pond";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:15:"Bruneise dollar";}s:3:"BOB";a:2:{i:0;s:2:"Bs";i:1;s:9:"Boliviano";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:21:"Boliviano (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:16:"Boliviaanse peso";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:17:"Boliviaanse mvdol";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:38:"Braziliaanse cruzeiro novo (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:20:"Braziliaanse cruzado";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:33:"Braziliaanse cruzeiro (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:17:"Braziliaanse real";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:25:"Braziliaanse cruzado
 novo";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:21:"Braziliaanse cruzeiro";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:33:"Braziliaanse cruzeiro (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:17:"Bahamaanse dollar";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:14:"Bahamaans pond";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:18:"Bhutaanse ngultrum";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:15:"Bhutaanse rupee";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:12:"Birmese kyat";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:13:"Birmese rupee";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:15:"Botswaanse pula";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:39:"Wit-Russische nieuwe roebel (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:32:"Wit-Russische roebel (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:20:"Wit-Russische roebel";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:17:"Belizaanse dollar";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:22:"Brits-Hondurese dollar";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:15:"Canadese dollar";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:25:"Congolese franc congolais";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:15:"Congolese franc";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:16:"Congolese zaïre";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:29:"Centraal-Afrikaanse CFA-franc";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:15:"Zwitserse franc";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:19:"Cookeilandse dollar";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:16:"Chileense condor";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:16:"Chileense escudo";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:29:"Chileense unidades de fomento";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:14:"Chileense peso";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:20:"Kameroense CFA-franc";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:25:"Chinese jen min piao yuan";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:44:"Chinese Amerikaanse-dollarwisselcertificaten";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:21:"Chinese yuan renminbi";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:26:"Colombiaanse papieren peso";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:19:"Congolese CFA-franc";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:17:"Colombiaanse peso";}s:3:"CRC";a:2:{i:0;s:1:"C";i
:1;s:20:"Costaricaanse colón";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:23:"Tsjechoslowaakse koruna";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:29:"Tsjechoslowaakse harde koruna";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:13:"Cubaanse peso";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:27:"Cubaanse wisselcertificaten";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:20:"Kaapverdische escudo";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:15:"Curaçao-gulden";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:13:"Cyprisch pond";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:18:"Tsjechische koruna";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:19:"Oost-Duitse ostmark";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:11:"Duitse mark";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:16:"Duitse sperrmark";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:19:"Djiboutiaanse franc";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:12:"Deense kroon";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:17:"Dominicaanse peso";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:16:"Algerijnse dinar";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:23:"Algerijnse nieuwe franc";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:25:"Algerijnse franc germinal";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:18:"Ecuadoraanse sucre";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:44:"Ecuadoraanse unidad de valor constante (UVC)";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:15:"Estlandse kroon";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:14:"Egyptisch pond";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:14:"Eritrese nakfa";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:14:"Spaanse peseta";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:16:"Ethiopische birr";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:18:"Ethiopische dollar";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"Euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:12:"Finse markka";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:24:"Finse markka (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:15:"Fijische dollar";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:12:"Fijisch pond";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:20:"Falklandeilands pond";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:16:"Faeröerse kroon";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:12:"Franse franc";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:36:"Franse fra
nc germinal/franc poincare";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:18:"Gabonese CFA-franc";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:19:"Brits pond sterling";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:22:"Georgische kupon larit";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:15:"Georgische lari";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:12:"Ghanese cedi";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:17:"Ghanese oude cedi";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:12:"Ghanees pond";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:28:"Ghanese hergewaardeerde cedi";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:17:"Gibraltarees pond";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:17:"Groenlandse kroon";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:17:"Gambiaanse dalasi";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:14:"Gambiaans pond";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:13:"Guinese franc";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:25:"Guinese franc (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:12:"Guinese syli";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:17:"Guadeloupse franc";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:35:"Equatoriaal-Guinese ekwele guineana";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:26:"Equatoriaal-Guinese franco";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:35:"Equatoriaal-Guinese peseta puineana";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:15:"Griekse drachme";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:22:"Griekse nieuwe drachme";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:22:"Guatemalteekse quetzal";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:27:"Frans-Guyaanse franc guiana";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:25:"Portuguees-Guinese escudo";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:27:"Portuguees-Guinese mil reis";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:20:"Guinee-Bissause peso";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:15:"Guyaanse dollar";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:17:"Hongkongse dollar";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:16:"Hodurese lempira";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:16:"Kroatische dinar";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:15:"Kroatische kuna";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:18:"Haïtiaanse gourde";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:16:"Hongaarse forint"
;}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:15:"Noord-Iers pond";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:24:"Indonesische nica-gulden";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:24:"Indonesische Java-rupiah";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:26:"Indonesische nieuwe rupiah";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:19:"Indonesische rupiah";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:9:"Iers pond";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:19:"Israëlische shekel";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:16:"Israëlisch pond";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:26:"Israëlische nieuwe shekel";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:25:"Isle of Man pond sterling";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:13:"Indiase rupee";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:13:"Iraakse dinar";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:12:"Iraanse rial";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:15:"IJslandse kroon";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:15:"Italiaanse lire";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:20:"Jersey pond sterling";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:18:"Jamaicaanse dollar";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:15:"Jamaicaans pond";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:15:"Jordaanse dinar";}s:3:"JPY";a:2:{i:0;s:2:"¥";i:1;s:11:"Japanse yen";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:18:"Kenyaanse shilling";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:15:"Kirgizische som";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:22:"Cambodjaanse oude riel";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:17:"Cambodjaanse riel";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:19:"Kiribatische dollar";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:14:"Comorese franc";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:34:"Noord-Koreaanse Volksrepubliek-won";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:19:"Noord-Koreaanse won";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:19:"Zuid-Koreaanse hwan";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:23:"Zuid-Koreaanse oude won";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:18:"Zuid-Koreaanse won";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:15:"Koeweitse dinar";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:21:"Caymaneilandse dollar";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:20:"Kazachsta
anse roebel";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:19:"Kazachstaanse tenge";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:14:"Laotiaanse kip";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:13:"Libanees pond";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:21:"Liechtensteinse frank";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:18:"Srilankaanse rupee";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:12:"Ceylon-rupee";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:18:"Liberiaanse dollar";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:16:"Lesothaanse loti";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:14:"Litouwse litas";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:16:"Litouwse talonas";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:17:"Luxemburgse frank";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:10:"Letse lats";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:12:"Letse roebel";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:41:"Libische Britse Militaire Autoriteit-lire";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:14:"Libische dinar";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:12:"Libisch pond";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:18:"Marokkaanse dirham";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:17:"Marokkaanse franc";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:26:"Monegaskische nieuwe franc";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:28:"Monegaskische franc germinal";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:23:"Monegaskische leu cupon";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:15:"Moldavische leu";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:24:"Moldavische roebel-cupon";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:20:"Malagassische ariary";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:19:"Malagassische franc";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:23:"Marshalleilandse dollar";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:18:"Macedonische denar";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:30:"Macedonische denar (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:14:"Malinese franc";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:15:"Myanmarese kyat";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:35:"Myanmarese dollarwisselcertificaten";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:16:"Mongoolse tugrik";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:14:"Macause pataca";}s:3:"MQF";a:2:{i:0;s:3:"MQF";
i:1;s:19:"Martinikaanse franc";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:19:"Mauritaanse ouguiya";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:12:"Maltese lire";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:12:"Maltees pond";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:18:"Mauritiaanse rupee";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:17:"Maldivische rupee";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:19:"Maldivische rufiyaa";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:17:"Malawische kwacha";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:14:"Malawisch pond";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:15:"Mexicaanse peso";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:36:"Mexicaanse zilveren peso (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:36:"Mexicaanse unidad de inversion (UDI)";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:19:"Maleisische ringgit";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:20:"Mozambikaanse escudo";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:21:"Mozambikaanse metical";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:17:"Namibische dollar";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:33:"Nieuw-Caledonische franc germinal";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:17:"Nigeriaanse naira";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:15:"Nigeriaans pond";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:28:"Nieuw-Hebridiaanse CFP-franc";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:22:"Nicaraguaanse córdoba";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:29:"Nicaraguaanse gouden córdoba";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:27:"Nicaraguaanse  córdoba oro";}s:3:"NLG";a:2:{i:0;s:2:"fl";i:1;s:18:"Nederlandse gulden";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:12:"Noorse kroon";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:14:"Nepalese rupee";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:22:"Nieuw-Zeelandse dollar";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:19:"Nieuw-Zeelands pond";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:12:"Omaanse rial";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:18:"Omaanse rial saidi";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:15:"Panamese balboa";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:31:"Trans-Djnestrische roebel-kupon";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:32:"Trans-Djnestrische nieuwe roebel";}s:3:"PDR";a:2:{i:0;s:3:
"PDR";i:1;s:25:"Trans-Djnestrische roebel";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:14:"Peruaanse inti";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:20:"Peruaanse nieuwe sol";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:13:"Peruaanse sol";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:14:"Papuaanse kina";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:15:"Filipijnse peso";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:17:"Pakistaanse rupee";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:12:"Poolse zloty";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:43:"Poolse Amerikaanse-dollarwisselcertificaten";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:24:"Poolse zloty (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:15:"Palestijns pond";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:15:"Portugese conto";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:16:"Portugese escudo";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:21:"Paraguayaanse guarani";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:13:"Qatarese rial";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:16:"Réunionse franc";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:13:"Roemeense leu";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:20:"Roemeense nieuwe leu";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:16:"Russische roebel";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:28:"Russische roebel (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:14:"Rwandese franc";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:15:"Saoedische rial";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:26:"Saoedische souvereine rial";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:23:"Salomonseilandse dollar";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:15:"Seychelse rupee";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:15:"Soedanese dinar";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:14:"Soedanees pond";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:13:"Zweedse kroon";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:18:"Singaporese dollar";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:18:"Sint-Heleense pond";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:20:"Sloveense tolar bons";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:15:"Sloveense tolar";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:16:"Slowaakse koruna";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:19:"Sierraleoonse leone";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:16
:"Sanmarinese lire";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:19:"Somalische shilling";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:21:"Somalilandse shilling";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:17:"Surinaamse gulden";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:12:"Schotse pond";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:15:"Santomese dobra";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:16:"Santomese escudo";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:20:"Nieuwe sovjet-roebel";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:13:"Sovjet-roebel";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:20:"Salvadoraanse colón";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:12:"Syrisch pond";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:19:"Swazische lilangeni";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:21:"Turks en Caicos-kroon";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:18:"Tsjaadse CFA-franc";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:11:"Thaise baht";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:22:"Tadzjikistaanse roebel";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:22:"Tadzjikistaanse somoni";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:16:"Turkmeense manat";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:16:"Tunesische dinar";}s:3:"TOP";a:2:{i:0;s:2:"T$";i:1;s:18:"Tongaanse paʻanga";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:22:"Tongaans pond sterling";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:15:"Timorese escudo";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:15:"Timorese pataca";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:11:"Turkse lire";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:25:"Trinidad en Tobago-dollar";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:30:"Trinidad en Tobago-oude dollar";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:18:"Tuvaluaanse dollar";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:23:"Nieuwe Taiwanese dollar";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:21:"Tanzaniaanse shilling";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:19:"Oekraïense hryvnia";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:23:"Oekraïense karbovanetz";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:30:"Oegandese shilling (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:18:"Oegandese shilling";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:18:"Amerikaanse dollar";}s:3:"USN";a:2:{i:0;s:3:"US
N";i:1;s:33:"Amerikaanse dollar (volgende dag)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:31:"Amerikaanse dollar (zelfde dag)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:24:"Uruguayaanse peso fuerte";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:29:"Uruguayaanse peso (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:26:"Uruguayaanse peso uruguayo";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:25:"Oezbekistaanse coupon-som";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:18:"Oezbekistaanse sum";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:15:"Vaticaanse lire";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:34:"Noord-Vietnamese piastre dong viet";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:28:"Noord-Vietnamese nieuwe dong";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:44:"Noord-Vietnamese viet minh piastre dong viet";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:20:"Venezolaanse bolivar";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:29:"Britse Maagdeneilandse dollar";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:15:"Vietnamese dong";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:22:"Vietnamese nieuwe dong";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:25:"Vietnamese Republiek-dong";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:25:"Vietnamese nationale dong";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:17:"Vanuatuaanse vatu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:18:"West-Samoaans pond";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:19:"West-Samoaanse tala";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:29:"Aziatische dinar-rekeneenheid";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:14:"CFA-franc BEAC";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:28:"Aziatische monetaire eenheid";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:4:"Goud";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:30:"Europese samengestelde eenheid";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:26:"Europese monetaire eenheid";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:27:"Europese rekeneenheid (XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:27:"Europese rekeneenheid (XBD)";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:22:"Oost-Caribische dollar";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:16:"CFA nieuwe franc";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:22:"Special Drawing Rights";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;
s:16:"CFA-franc BCEAEC";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:22:"European Currency Unit";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:19:"Franse gouden franc";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:16:"Franse UIC-franc";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:18:"Islamitische dinar";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:33:"Franse metropolische nieuwe franc";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:25:"Franse antillen CFA-franc";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:15:"CFA-franc BCEAO";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:9:"CFP-franc";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:27:"COMECON transferable roebel";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:18:"Jemenitische dinar";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:23:"Jemenitische imadi rial";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:17:"Jemenitische rial";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:26:"Joegoslavische harde dinar";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:29:"Joegoslavische federale dinar";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:25:"Joegoslavische 1994-dinar";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:26:"Joegoslavische noviy-dinar";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:33:"Joegoslavische convertibele dinar";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:28:"Joegoslavische oktober-dinar";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:31:"Joegoslavische  hervormde dinar";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:33:"Zuid-Afrikaanse rand (financieel)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:19:"Zuid-Afrikaans pond";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:20:"Zuid-Afrikaanse rand";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:17:"Zambiaanse kwacha";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:14:"Zambiaans pond";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:22:"Zaïrese nieuwe zaïre";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:15:"Zaïrese zaïre";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:19:"Zimbabwaanse dollar";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:8:"Kalender";}s:9:"collation";a:1:{i:0;s:8:"Volgorde";}s:8:"currency";a:1:{i:0;s:11:"Munteenheid";}}s:9:"Languages";a:194:{s:2:"aa";a:1:{i:0;s:4:"Afar";}s:2:"ab";a:1:{i:0;s:10:"Abchazisch";}s:2:"ae";a:1:{i:0;s:9:"Avestisch";}s:2:"af";a:1:{i:0;s:9:"Af
rikaans";}s:2:"ak";a:1:{i:0;s:4:"Akan";}s:2:"am";a:1:{i:0;s:7:"Amhaars";}s:2:"an";a:1:{i:0;s:9:"Aragonees";}s:2:"ar";a:1:{i:0;s:8:"Arabisch";}s:2:"as";a:1:{i:0;s:8:"Assamees";}s:2:"av";a:1:{i:0;s:8:"Avarisch";}s:2:"ay";a:1:{i:0;s:6:"Aymara";}s:2:"az";a:1:{i:0;s:14:"Azerbeidzjaans";}s:2:"ba";a:1:{i:0;s:9:"Basjkiers";}s:2:"be";a:1:{i:0;s:12:"Wit-Russisch";}s:2:"bg";a:1:{i:0;s:8:"Bulgaars";}s:2:"bh";a:1:{i:0;s:6:"Bihari";}s:2:"bi";a:1:{i:0;s:7:"Bislama";}s:2:"bm";a:1:{i:0;s:7:"Bambara";}s:2:"bn";a:1:{i:0;s:9:"Bengalees";}s:2:"bo";a:1:{i:0;s:9:"Tibetaans";}s:2:"br";a:1:{i:0;s:7:"Bretons";}s:2:"bs";a:1:{i:0;s:8:"Bosnisch";}s:3:"byn";a:1:{i:0;s:4:"Blin";}s:2:"ca";a:1:{i:0;s:9:"Catalaans";}s:2:"ce";a:1:{i:0;s:7:"Chechen";}s:2:"ch";a:1:{i:0;s:8:"Chamorro";}s:3:"chr";a:1:{i:0;s:8:"Cherokee";}s:2:"co";a:1:{i:0;s:10:"Corsicaans";}s:2:"cr";a:1:{i:0;s:4:"Cree";}s:2:"cs";a:1:{i:0;s:10:"Tsjechisch";}s:2:"cu";a:1:{i:0;s:12:"Kerkslavisch";}s:2:"cv";a:1:{i:0;s:13:"Tsjoevasjisch";}s:2:"cy";a:1:{i:0;s:5:"Welsh";}s:2:"da";a:1:{i:0;s:5:"Deens";}s:2:"de";a:1:{i:0;s:5:"Duits";}s:2:"dv";a:1:{i:0;s:6:"Divehi";}s:2:"dz";a:1:{i:0;s:8:"Dzongkha";}s:2:"ee";a:1:{i:0;s:3:"Ewe";}s:2:"el";a:1:{i:0;s:6:"Grieks";}s:2:"en";a:1:{i:0;s:6:"Engels";}s:2:"eo";a:1:{i:0;s:9:"Esperanto";}s:2:"es";a:1:{i:0;s:6:"Spaans";}s:2:"et";a:1:{i:0;s:8:"Estlands";}s:2:"eu";a:1:{i:0;s:8:"Baskisch";}s:2:"fa";a:1:{i:0;s:8:"Perzisch";}s:2:"ff";a:1:{i:0;s:5:"Fulah";}s:2:"fi";a:1:{i:0;s:4:"Fins";}s:2:"fj";a:1:{i:0;s:7:"Fijisch";}s:2:"fo";a:1:{i:0;s:9:"Faeröers";}s:2:"fr";a:1:{i:0;s:5:"Frans";}s:2:"fy";a:1:{i:0;s:5:"Fries";}s:2:"ga";a:1:{i:0;s:4:"Iers";}s:2:"gd";a:1:{i:0;s:13:"Schots Gaelic";}s:3:"gez";a:1:{i:0;s:4:"Geez";}s:2:"gl";a:1:{i:0;s:9:"Galicisch";}s:2:"gn";a:1:{i:0;s:7:"Guarani";}s:2:"gu";a:1:{i:0;s:8:"Gujarati";}s:2:"gv";a:1:{i:0;s:4:"Manx";}s:2:"ha";a:1:{i:0;s:5:"Hausa";}s:3:"haw";a:1:{i:0;s:10:"Hawaïaans";}s:2:"he";a:1:{i:0;s:9:"Hebreeuws";}s:2:"hi";a:1:{i:0;s:5:"Hindi";}s:2:"ho";a:1:{i:0;s:9:"Hiri Motu";}s:2:"hr";a:1:{i:0;s:9:"Kroatisch";}s:2:"ht";a:1:{i:0;s:1
0:"Haïtiaans";}s:2:"hu";a:1:{i:0;s:8:"Hongaars";}s:2:"hy";a:1:{i:0;s:7:"Armeens";}s:2:"hz";a:1:{i:0;s:6:"Herero";}s:2:"ia";a:1:{i:0;s:11:"Interlingua";}s:2:"id";a:1:{i:0;s:11:"Indonesisch";}s:2:"ie";a:1:{i:0;s:11:"Interlingue";}s:2:"ig";a:1:{i:0;s:4:"Igbo";}s:2:"ii";a:1:{i:0;s:10:"Sichuan Yi";}s:2:"ik";a:1:{i:0;s:7:"Inupiaq";}s:2:"io";a:1:{i:0;s:3:"Ido";}s:2:"is";a:1:{i:0;s:8:"IJslands";}s:2:"it";a:1:{i:0;s:9:"Italiaans";}s:2:"iu";a:1:{i:0;s:9:"Inuktitut";}s:2:"ja";a:1:{i:0;s:6:"Japans";}s:2:"jv";a:1:{i:0;s:7:"Javaans";}s:2:"ka";a:1:{i:0;s:9:"Georgisch";}s:2:"kg";a:1:{i:0;s:5:"Kongo";}s:2:"ki";a:1:{i:0;s:6:"Kikuyu";}s:2:"kj";a:1:{i:0;s:8:"Kuanyama";}s:2:"kk";a:1:{i:0;s:7:"Kazachs";}s:2:"kl";a:1:{i:0;s:11:"Kalaallisut";}s:2:"km";a:1:{i:0;s:5:"Khmer";}s:2:"kn";a:1:{i:0;s:7:"Kannada";}s:2:"ko";a:1:{i:0;s:8:"Koreaans";}s:3:"kok";a:1:{i:0;s:7:"Konkani";}s:2:"kr";a:1:{i:0;s:6:"Kanuri";}s:2:"ks";a:1:{i:0;s:8:"Kashmiri";}s:2:"ku";a:1:{i:0;s:9:"Koerdisch";}s:2:"kv";a:1:{i:0;s:4:"Komi";}s:2:"kw";a:1:{i:0;s:7:"Cornish";}s:2:"ky";a:1:{i:0;s:10:"Kirgizisch";}s:2:"la";a:1:{i:0;s:6:"Latijn";}s:2:"lb";a:1:{i:0;s:10:"Luxemburgs";}s:2:"lg";a:1:{i:0;s:5:"Ganda";}s:2:"li";a:1:{i:0;s:8:"Limburgs";}s:2:"ln";a:1:{i:0;s:7:"Lingala";}s:2:"lo";a:1:{i:0;s:3:"Lao";}s:2:"lt";a:1:{i:0;s:7:"Litouws";}s:2:"lu";a:1:{i:0;s:12:"Luba-Katanga";}s:2:"lv";a:1:{i:0;s:8:"Letlands";}s:2:"mg";a:1:{i:0;s:11:"Malagasisch";}s:2:"mh";a:1:{i:0;s:11:"Marshallees";}s:2:"mi";a:1:{i:0;s:5:"Maori";}s:2:"mk";a:1:{i:0;s:11:"Macedonisch";}s:2:"ml";a:1:{i:0;s:9:"Malayalam";}s:2:"mn";a:1:{i:0;s:8:"Mongools";}s:2:"mo";a:1:{i:0;s:10:"Moldavisch";}s:2:"mr";a:1:{i:0;s:7:"Marathi";}s:2:"ms";a:1:{i:0;s:6:"Maleis";}s:2:"mt";a:1:{i:0;s:7:"Maltees";}s:2:"my";a:1:{i:0;s:7:"Birmees";}s:2:"na";a:1:{i:0;s:5:"Nauru";}s:2:"nb";a:1:{i:0;s:15:"Noors - Bokmål";}s:2:"nd";a:1:{i:0;s:15:"Ndebele, noord-";}s:2:"ne";a:1:{i:0;s:8:"Nepalees";}s:2:"ng";a:1:{i:0;s:6:"Ndonga";}s:2:"nl";a:1:{i:0;s:10:"Nederlands";}s:2:"nn";a:1:{i:0;s:15:"Noors - Nynorsk";}s:2:"no";a:1:{i:0;s:5:"Noors";}s:2:"nr";a
:1:{i:0;s:14:"Ndebele, zuid-";}s:2:"nv";a:1:{i:0;s:6:"Navajo";}s:2:"ny";a:1:{i:0;s:6:"Nyanja";}s:2:"oc";a:1:{i:0;s:23:"Langue d’Oc (na 1500)";}s:2:"oj";a:1:{i:0;s:6:"Ojibwa";}s:2:"om";a:1:{i:0;s:5:"Oromo";}s:2:"or";a:1:{i:0;s:5:"Oriya";}s:2:"os";a:1:{i:0;s:9:"Ossetisch";}s:2:"pa";a:1:{i:0;s:7:"Punjabi";}s:2:"pi";a:1:{i:0;s:4:"Pali";}s:2:"pl";a:1:{i:0;s:5:"Pools";}s:2:"ps";a:1:{i:0;s:6:"Pashto";}s:2:"pt";a:1:{i:0;s:9:"Portugees";}s:2:"qu";a:1:{i:0;s:7:"Quechua";}s:2:"rm";a:1:{i:0;s:11:"Retoromaans";}s:2:"rn";a:1:{i:0;s:5:"Rundi";}s:2:"ro";a:1:{i:0;s:8:"Roemeens";}s:2:"ru";a:1:{i:0;s:8:"Russisch";}s:2:"rw";a:1:{i:0;s:11:"Kinyarwanda";}s:2:"sa";a:1:{i:0;s:8:"Sanskrit";}s:2:"sc";a:1:{i:0;s:10:"Sardinisch";}s:2:"sd";a:1:{i:0;s:6:"Sindhi";}s:2:"se";a:1:{i:0;s:13:"Noord-Samisch";}s:2:"sg";a:1:{i:0;s:5:"Sango";}s:2:"sh";a:1:{i:0;s:14:"Servokroatisch";}s:2:"si";a:1:{i:0;s:9:"Singalees";}s:3:"sid";a:1:{i:0;s:6:"Sidamo";}s:2:"sk";a:1:{i:0;s:8:"Slowaaks";}s:2:"sl";a:1:{i:0;s:8:"Sloveens";}s:2:"sm";a:1:{i:0;s:8:"Samoaans";}s:2:"sn";a:1:{i:0;s:5:"Shona";}s:2:"so";a:1:{i:0;s:9:"Somalisch";}s:2:"sq";a:1:{i:0;s:8:"Albanees";}s:2:"sr";a:1:{i:0;s:8:"Servisch";}s:2:"ss";a:1:{i:0;s:5:"Swati";}s:2:"st";a:1:{i:0;s:11:"Sotho, zuid";}s:2:"su";a:1:{i:0;s:9:"Sundanees";}s:2:"sv";a:1:{i:0;s:6:"Zweeds";}s:2:"sw";a:1:{i:0;s:7:"Swahili";}s:3:"syr";a:1:{i:0;s:6:"Syriac";}s:2:"ta";a:1:{i:0;s:5:"Tamil";}s:2:"te";a:1:{i:0;s:8:"Teloegoe";}s:2:"tg";a:1:{i:0;s:7:"Tadzjik";}s:2:"th";a:1:{i:0;s:4:"Thai";}s:2:"ti";a:1:{i:0;s:8:"Tigrinya";}s:3:"tig";a:1:{i:0;s:5:"Tigre";}s:2:"tk";a:1:{i:0;s:9:"Turkmeens";}s:2:"tl";a:1:{i:0;s:7:"Tagalog";}s:2:"tn";a:1:{i:0;s:6:"Tswana";}s:2:"to";a:1:{i:0;s:22:"Tonga (Tonga-eilanden)";}s:2:"tr";a:1:{i:0;s:5:"Turks";}s:2:"ts";a:1:{i:0;s:6:"Tsonga";}s:2:"tt";a:1:{i:0;s:7:"Tataars";}s:2:"tw";a:1:{i:0;s:3:"Twi";}s:2:"ty";a:1:{i:0;s:9:"Tahitisch";}s:2:"ug";a:1:{i:0;s:6:"Uighur";}s:2:"uk";a:1:{i:0;s:10:"Oekraïens";}s:2:"ur";a:1:{i:0;s:4:"Urdu";}s:2:"uz";a:1:{i:0;s:8:"Oezbeeks";}s:2:"ve";a:1:{i:0;s:5:"Venda";}s:2:"vi";a:1:{i:0
;s:10:"Vietnamees";}s:2:"vo";a:1:{i:0;s:8:"Volapük";}s:2:"wa";a:1:{i:0;s:10:"Wallonisch";}s:2:"wo";a:1:{i:0;s:5:"Wolof";}s:2:"xh";a:1:{i:0;s:5:"Xhosa";}s:2:"yi";a:1:{i:0;s:8:"Jiddisch";}s:2:"yo";a:1:{i:0;s:6:"Joruba";}s:2:"za";a:1:{i:0;s:6:"Zhuang";}s:2:"zh";a:1:{i:0;s:7:"Chinees";}s:2:"zu";a:1:{i:0;s:4:"Zulu";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Scripts";a:54:{s:4:"Arab";a:1:{i:0;s:8:"Arabisch";}s:4:"Armn";a:1:{i:0;s:7:"Armeens";}s:4:"Beng";a:1:{i:0;s:9:"Bengalees";}s:4:"Bopo";a:1:{i:0;s:8:"Bopomofo";}s:4:"Brai";a:1:{i:0;s:7:"Braille";}s:4:"Buhd";a:1:{i:0;s:5:"Buhid";}s:4:"Cans";a:1:{i:0;s:38:"Verenigde Canadese Aboriginal-symbolen";}s:4:"Cher";a:1:{i:0;s:8:"Cherokee";}s:4:"Copt";a:1:{i:0;s:8:"Koptisch";}s:4:"Cprt";a:1:{i:0;s:8:"Cyprisch";}s:4:"Cyrl";a:1:{i:0;s:10:"Cyrillisch";}s:4:"Deva";a:1:{i:0;s:10:"Devanagari";}s:4:"Dsrt";a:1:{i:0;s:7:"Deseret";}s:4:"Ethi";a:1:{i:0;s:10:"Ethiopisch";}s:4:"Geor";a:1:{i:0;s:9:"Georgisch";}s:4:"Goth";a:1:{i:0;s:8:"Gothisch";}s:4:"Grek";a:1:{i:0;s:6:"Grieks";}s:4:"Gujr";a:1:{i:0;s:8:"Gujarati";}s:4:"Guru";a:1:{i:0;s:8:"Gurmukhi";}s:4:"Hang";a:1:{i:0;s:6:"Hangul";}s:4:"Hani";a:1:{i:0;s:3:"Han";}s:4:"Hano";a:1:{i:0;s:7:"Hanunoo";}s:4:"Hans";a:1:{i:0;s:17:"Vereenvoudigd Han";}s:4:"Hant";a:1:{i:0;s:16:"Traditioneel Han";}s:4:"Hebr";a:1:{i:0;s:9:"Hebreeuws";}s:4:"Hira";a:1:{i:0;s:8:"Hiragana";}s:4:"Ital";a:1:{i:0;s:12:"Oud-italisch";}s:4:"Kana";a:1:{i:0;s:8:"Katakana";}s:4:"Khmr";a:1:{i:0;s:5:"Khmer";}s:4:"Knda";a:1:{i:0;s:7:"Kannada";}s:4:"Laoo";a:1:{i:0;s:3:"Lao";}s:4:"Latn";a:1:{i:0;s:6:"Latijn";}s:4:"Limb";a:1:{i:0;s:5:"Limbu";}s:4:"Linb";a:1:{i:0;s:9:"Lineair B";}s:4:"Mlym";a:1:{i:0;s:9:"Malayalam";}s:4:"Mong";a:1:{i:0;s:8:"Mongools";}s:4:"Mymr";a:1:{i:0;s:7:"Myanmar";}s:4:"Ogam";a:1:{i:0;s:5:"Ogham";}s:4:"Orya";a:1:{i:0;s:5:"Oriya";}s:4:"Osma";a:1:{i:0;s:7:"Osmanya";}s:4:"Runr";a:1:{i:0;
s:5:"Runic";}s:4:"Shaw";a:1:{i:0;s:7:"Shavian";}s:4:"Sinh";a:1:{i:0;s:7:"Sinhala";}s:4:"Syrc";a:1:{i:0;s:6:"Syriac";}s:4:"Tagb";a:1:{i:0;s:8:"Tagbanwa";}s:4:"Tale";a:1:{i:0;s:6:"Tai Le";}s:4:"Taml";a:1:{i:0;s:5:"Tamil";}s:4:"Telu";a:1:{i:0;s:6:"Telugu";}s:4:"Tglg";a:1:{i:0;s:7:"Tagalog";}s:4:"Thaa";a:1:{i:0;s:6:"Thaana";}s:4:"Tibt";a:1:{i:0;s:9:"Tibetaans";}s:4:"Ugar";a:1:{i:0;s:10:"Ugaritisch";}s:4:"Yiii";a:1:{i:0;s:2:"Yi";}s:4:"Zyyy";a:1:{i:0;s:8:"Algemeen";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:23:"Boeddhistische kalender";}s:7:"chinese";a:1:{i:0;s:16:"Chinese kalender";}s:9:"gregorian";a:1:{i:0;s:21:"Gregoriaanse kalender";}s:6:"hebrew";a:1:{i:0;s:15:"Joodse kalender";}s:7:"islamic";a:1:{i:0;s:21:"Islamitische kalender";}s:13:"islamic-civil";a:1:{i:0;s:32:"Islamitische kalender (cyclisch)";}s:8:"japanese";a:1:{i:0;s:16:"Japanse kalender";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:16:"Directe volgorde";}s:9:"phonebook";a:1:{i:0;s:20:"Telefoonboekvolgorde";}s:6:"pinyin";a:1:{i:0;s:14:"Pinyinvolgorde";}s:6:"stroke";a:1:{i:0;s:14:"Streekvolgorde";}s:11:"traditional";a:1:{i:0;s:20:"Traditioneelvolgorde";}}}s:8:"Variants";a:1:{s:7:"REVISED";a:1:{i:0;s:9:"Gewijzigd";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:4:{s:9:"gregorian";a:4:{s:16:"DateTimePatterns";a:9:{i:0;s:15:"H:mm:ss' uur' z";i:1;s:9:"H:mm:ss z";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"d-MMM-yyyy";i:7;s:6:"d-M-yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:2:"zo";i:1;s:2:"ma";i:2;s:2:"di";i:3;s:2:"wo";i:4;s:2:"do";i:5;s:2:"vr";i:6;s:2:"za";}s:6:"narrow";a:7:{i:0;s:1:"Z";i:1;s:1:"M";i:2;s:1:"D";i:3;s:1:"W";i:4;s:1:"D";i:5;s:1:"V";i:6;s:1:"Z";}s:4:"wide";a:7:{i:0;s:6:"zondag";i:1;s:7:"maandag";i:2;s:7:"dinsdag";i:3;s:8:"woensdag";i:4;s:9:"donderdag";i:5;s:7:"vrijdag";i:6;s:8:"zaterdag";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:7:"v. Chr.";i:1;s:7:"n. Chr.";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated
";a:12:{i:0;s:3:"jan";i:1;s:3:"feb";i:2;s:3:"mrt";i:3;s:3:"apr";i:4;s:3:"mei";i:5;s:3:"jun";i:6;s:3:"jul";i:7;s:3:"aug";i:8;s:3:"sep";i:9;s:3:"okt";i:10;s:3:"nov";i:11;s:3:"dec";}s:6:"narrow";a:12:{i:0;s:1:"J";i:1;s:1:"F";i:2;s:1:"M";i:3;s:1:"A";i:4;s:1:"M";i:5;s:1:"J";i:6;s:1:"J";i:7;s:1:"A";i:8;s:1:"S";i:9;s:1:"O";i:10;s:1:"N";i:11;s:1:"D";}s:4:"wide";a:12:{i:0;s:7:"januari";i:1;s:8:"februari";i:2;s:5:"maart";i:3;s:5:"april";i:4;s:3:"mei";i:5;s:4:"juni";i:6;s:4:"juli";i:7;s:8:"augustus";i:8;s:9:"september";i:9;s:7:"oktober";i:10;s:8:"november";i:11;s:8:"december";}}}}s:6:"hebrew";a:1:{s:10:"monthNames";a:1:{s:6:"format";a:2:{s:17:"abbreviated:alias";a:1:{i:0;s:41:"nl/calendar/hebrew/monthNames/format/wide";}s:4:"wide";a:13:{i:0;s:7:"Tisjrie";i:1;s:8:"Chesjwan";i:2;s:6:"Kislev";i:3;s:5:"Tevet";i:4;s:6:"Sjevat";i:5;s:4:"Adar";i:6;s:6:"Adar B";i:7;s:5:"Nisan";i:8;s:4:"Ijar";i:9;s:5:"Sivan";i:10;s:7:"Tammoez";i:11;s:2:"Av";i:12;s:6:"Elloel";}}}}s:7:"islamic";a:2:{s:4:"eras";a:1:{s:11:"abbreviated";a:1:{i:0;s:14:"Saʻna Hizjria";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:17:"abbreviated:alias";a:1:{i:0;s:42:"nl/calendar/islamic/monthNames/format/wide";}s:4:"wide";a:12:{i:0;s:9:"Moeharram";i:1;s:5:"Safar";i:2;s:15:"Rabiʻa al awal";i:3;s:16:"Rabiʻa al thani";i:4;s:15:"Joemadʻal awal";i:5;s:16:"Joemadʻal thani";i:6;s:5:"Rajab";i:7;s:9:"Sjaʻaban";i:8;s:7:"Ramadan";i:9;s:6:"Sjawal";i:10;s:14:"Doe al kaʻaba";i:11;s:12:"Doe al hizja";}}}}s:19:"islamic-civil:alias";a:1:{i:0;s:19:"nl/calendar/islamic";}}s:11:"zoneStrings";a:17:{i:0;a:6:{i:0;s:19:"America/Los_Angeles";i:1;s:21:"Pacific-standaardtijd";i:2;s:3:"PST";i:3;s:17:"Pacific-zomertijd";i:4;s:3:"PDT";i:5;s:11:"Los Angeles";}i:1;a:6:{i:0;s:14:"America/Denver";i:1;s:22:"Mountain-standaardtijd";i:2;s:3:"MST";i:3;s:18:"Mountain-zomertijd";i:4;s:3:"MDT";i:5;s:6:"Denver";}i:2;a:6:{i:0;s:15:"America/Phoenix";i:1;s:22:"Mountain-standaardtijd";i:2;s:3:"MST";i:3;s:22:"Mountain-standaardtijd";i:4;s:3:"MST";i:5;s:7:"Phoenix";}i:3;a:6:{i:0;s:15:"America/Chicago";i:1;s:21:"Ce
ntral-standaardtijd";i:2;s:3:"CST";i:3;s:17:"Central-zomertijd";i:4;s:3:"CDT";i:5;s:7:"Chicago";}i:4;a:6:{i:0;s:16:"America/New_York";i:1;s:21:"Eastern-standaardtijd";i:2;s:3:"EST";i:3;s:17:"Eastern-zomertijd";i:4;s:3:"EDT";i:5;s:8:"New York";}i:5;a:6:{i:0;s:20:"America/Indianapolis";i:1;s:21:"Eastern-standaardtijd";i:2;s:3:"EST";i:3;s:21:"Eastern-standaardtijd";i:4;s:3:"EST";i:5;s:12:"Indianapolis";}i:6;a:6:{i:0;s:16:"Pacific/Honolulu";i:1;s:20:"Hawaï-standaardtijd";i:2;s:3:"HST";i:3;s:20:"Hawaï-standaardtijd";i:4;s:3:"HST";i:5;s:8:"Honolulu";}i:7;a:6:{i:0;s:17:"America/Anchorage";i:1;s:20:"Alaska-standaardtijd";i:2;s:3:"AST";i:3;s:16:"Alaska-zomertijd";i:4;s:3:"ADT";i:5;s:9:"Anchorage";}i:8;a:6:{i:0;s:15:"America/Halifax";i:1;s:22:"Atlantic-standaardtijd";i:2;s:3:"AST";i:3;s:18:"Atlantic-zomertijd";i:4;s:3:"ADT";i:5;s:7:"Halifax";}i:9;a:6:{i:0;s:16:"America/St_Johns";i:1;s:26:"Newfoundland-standaardtijd";i:2;s:3:"CNT";i:3;s:22:"Newfoundland-zomertijd";i:4;s:3:"CDT";i:5;s:9:"St. Johns";}i:10;a:6:{i:0;s:12:"Europe/Paris";i:1;s:29:"Midden-Europese standaardtijd";i:2;s:3:"CET";i:3;s:25:"Midden-Europese zomertijd";i:4;s:4:"CEST";i:5;s:6:"Parijs";}i:11;a:6:{i:0;s:7:"Etc/GMT";i:1;s:19:"Greenwich Mean Time";i:2;s:3:"GMT";i:3;s:19:"Greenwich Mean Time";i:4;s:3:"GMT";i:5;s:6:"Londen";}i:12;a:6:{i:0;s:17:"Africa/Casablanca";i:1;s:19:"Greenwich Mean Time";i:2;s:3:"GMT";i:3;s:19:"Greenwich Mean Time";i:4;s:3:"GMT";i:5;s:10:"Casablanca";}i:13;a:6:{i:0;s:14:"Asia/Jerusalem";i:1;s:26:"Israëlische standaardtijd";i:2;s:3:"IST";i:3;s:22:"Israëlische zomertijd";i:4;s:3:"IDT";i:5;s:9:"Jeruzalem";}i:14;a:6:{i:0;s:10:"Asia/Tokyo";i:1;s:21:"Japanse standaardtijd";i:2;s:3:"JST";i:3;s:21:"Japanse standaardtijd";i:4;s:3:"JST";i:5;s:5:"Tokyo";}i:15;a:6:{i:0;s:16:"Europe/Bucharest";i:1;s:27:"Oost-Europese standaardtijd";i:2;s:3:"EET";i:3;s:23:"Oost-Europese zomertijd";i:4;s:4:"EEST";i:5;s:9:"Boekarest";}i:16;a:6:{i:0;s:13:"Asia/Shanghai";i:1;s:21:"Chinese standaardtijd";i:2;s:3:"CTT";i:3;s:21:"Chinese standaardtijd";i:4;s:3:"CDT";i:5;s
:8:"Shanghai";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nl_BE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nl_BE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nl_BE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"¤ #,##0.00;¤ -#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:12:"HH.mm' u. 'z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"d-MMM-yyyy";i:7;s:9:"d/MM/yyyy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nl_NL.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nl_NL.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nl_NL.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"¤ #,##0.00;¤ #,##0.00-";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nn.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nn.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nn.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:29:"De forente arabiske emiratene";}s:2:"AF";a:1:{i:0;s:11:"Afghanistan";}s:2:"AG";a:1:{i:0;s:18:"Antigua og Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:7:"Albania";}s:2:"AM";a:1:{i:0;s:7:"Armenia";}s:2:"AN";a:1:{i:0;s:24:"De nederlandske antiller";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:9:"Antarktis";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:16:"Amerikansk Samoa";}s:2:"AT";a:1:{i:0;s:10:"Østerrike";}s:2:"AU";a:1:{i:0;s:9:"Australia";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:12:"Aserbajdsjan";}s:2:"BA";a:1:{i:0;s:21:"Bosnia og Hercegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BE";a:1:{i:0;s:6:"Belgia";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:8:"Bulgaria";}s:2:"BH";a:1:{i:0;s:7:"Bahrain";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:17:"Brunei Darussalam";}s:2:"BO";a:1:{i:0;s:7:"Bolivia";}s:2:"BR";a:1:{i:0;s:6:"Brasil";}s:2:"BS";a:1:{i:0;s:7:"Bahamas";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BV";a:1:{i:0;s:10:"Bouvetøya";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:13:"Hviterussland";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Canada";}s:2:"CC";a:1:{i:0;s:27:"Kokosøyene (Keelingøyene)";}s:2:"CD";a:1:{i:0;s:35:"Kongo, Den demokratiske republikken";}s:2:"CF";a:1:{i:0;s:31:"Den sentralafrikanske republikk";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:6:"Sveits";}s:2:"CI";a:1:{i:0;s:15:"Elfenbenskysten";}s:2:"CK";a:1:{i:0;s:10:"Cookøyene";}s:2:"CL";a:1:{i:0;s:5:"Chile";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:4:"Kina";}s:2:"CO";a:1:{i:0;s:8:"Colombia";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:4:"Cuba";}s:2:"CV";a:1:{i:0;s:10:"Kapp Verde";}s:2:"CX";a:1:{i:0;s:13:"Christmasøya";}s:2:"CY";a:1:{i:0;s:6:"Kypros";}s:2:"CZ";a:1:{i:0;s:8:"Tsjekkia";}s:2:"DE";a:1:{i:0;s:8:"Tyskland";}s:2:"DJ";a:1:{i:0;
s:8:"Djibouti";}s:2:"DK";a:1:{i:0;s:7:"Danmark";}s:2:"DM";a:1:{i:0;s:8:"Dominica";}s:2:"DO";a:1:{i:0;s:26:"Den dominikanske republikk";}s:2:"DZ";a:1:{i:0;s:7:"Algerie";}s:2:"EC";a:1:{i:0;s:7:"Ecuador";}s:2:"EE";a:1:{i:0;s:7:"Estland";}s:2:"EG";a:1:{i:0;s:5:"Egypt";}s:2:"EH";a:1:{i:0;s:11:"Vest-Sahara";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:6:"Spania";}s:2:"ET";a:1:{i:0;s:7:"Etiopia";}s:2:"FI";a:1:{i:0;s:7:"Finland";}s:2:"FJ";a:1:{i:0;s:4:"Fiji";}s:2:"FK";a:1:{i:0;s:26:"Falklandsøyene (Malvinas)";}s:2:"FM";a:1:{i:0;s:23:"Mikronesiaføderasjonen";}s:2:"FO";a:1:{i:0;s:10:"Færøyene";}s:2:"FR";a:1:{i:0;s:9:"Frankrike";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:13:"Storbritannia";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:7:"Georgia";}s:2:"GF";a:1:{i:0;s:13:"Fransk Guyana";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:9:"Grønland";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:17:"Ekvatorial-Guinea";}s:2:"GR";a:1:{i:0;s:6:"Hellas";}s:2:"GS";a:1:{i:0;s:36:"Sør-Georgia og Sør-Sandwich-øyene";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinea-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:23:"Hong Kong S.A.R. (Kina)";}s:2:"HM";a:1:{i:0;s:25:"Heard- og McDonaldsøyene";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:7:"Kroatia";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:6:"Ungarn";}s:2:"ID";a:1:{i:0;s:9:"Indonesia";}s:2:"IE";a:1:{i:0;s:6:"Irland";}s:2:"IL";a:1:{i:0;s:6:"Israel";}s:2:"IN";a:1:{i:0;s:5:"India";}s:2:"IO";a:1:{i:0;s:35:"Britiske områder i det indiske hav";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:6:"Island";}s:2:"IT";a:1:{i:0;s:6:"Italia";}s:2:"JM";a:1:{i:0;s:7:"Jamaica";}s:2:"JO";a:1:{i:0;s:6:"Jordan";}s:2:"JP";a:1:{i:0;s:5:"Japan";}s:2:"KE";a:1:{i:0;s:5:"Kenya";}s:2:"KG";a:1:{i:0;s:11:"Kirgisistan";}s:2:"KH";a:1:{i:0;s:9:"Kambodsja";}s:2:"
KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:8:"Komorene";}s:2:"KN";a:1:{i:0;s:24:"St. Christopher og Nevis";}s:2:"KP";a:1:{i:0;s:10:"Nord-Korea";}s:2:"KR";a:1:{i:0;s:10:"Sør-Korea";}s:2:"KW";a:1:{i:0;s:6:"Kuwait";}s:2:"KY";a:1:{i:0;s:12:"Caymanøyene";}s:2:"KZ";a:1:{i:0;s:10:"Kasakhstan";}s:2:"LA";a:1:{i:0;s:39:"Laos, Den folkedemokratiske republikken";}s:2:"LB";a:1:{i:0;s:7:"Libanon";}s:2:"LC";a:1:{i:0;s:9:"St. Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberia";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:7:"Litauen";}s:2:"LU";a:1:{i:0;s:10:"Luxembourg";}s:2:"LV";a:1:{i:0;s:6:"Latvia";}s:2:"LY";a:1:{i:0;s:5:"Libya";}s:2:"MA";a:1:{i:0;s:7:"Marokko";}s:2:"MC";a:1:{i:0;s:6:"Monaco";}s:2:"MD";a:1:{i:0;s:7:"Moldova";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:14:"Marshalløyene";}s:2:"MK";a:1:{i:0;s:22:"Makedonia, Republikken";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:8:"Mongolia";}s:2:"MO";a:1:{i:0;s:19:"Macao S.A.R. (Kina)";}s:2:"MP";a:1:{i:0;s:14:"Nord-Marianene";}s:2:"MQ";a:1:{i:0;s:10:"Martinique";}s:2:"MR";a:1:{i:0;s:10:"Mauritania";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:9:"Maldivene";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:6:"Mexico";}s:2:"MY";a:1:{i:0;s:8:"Malaysia";}s:2:"MZ";a:1:{i:0;s:8:"Mosambik";}s:2:"NA";a:1:{i:0;s:7:"Namibia";}s:2:"NC";a:1:{i:0;s:12:"Ny-Caledonia";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:13:"Norfolkøyene";}s:2:"NG";a:1:{i:0;s:7:"Nigeria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:9:"Nederland";}s:2:"NO";a:1:{i:0;s:5:"Noreg";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:11:"New Zealand";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:16:"Fransk Polynesia";}s:2:"PG";a:1:{i:0;s:15:"Papua Ny-Guinea";}s:2:"PH
";a:1:{i:0;s:11:"Filippinene";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:5:"Polen";}s:2:"PM";a:1:{i:0;s:22:"St. Pierre og Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:11:"Puerto Rico";}s:2:"PS";a:1:{i:0;s:22:"Palestinsk territorium";}s:2:"PT";a:1:{i:0;s:8:"Portugal";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Qatar";}s:2:"RE";a:1:{i:0;s:7:"Reunion";}s:2:"RO";a:1:{i:0;s:7:"Romania";}s:2:"RU";a:1:{i:0;s:24:"Den russiske føderasjon";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:12:"Saudi Arabia";}s:2:"SB";a:1:{i:0;s:13:"Salomonøyene";}s:2:"SC";a:1:{i:0;s:11:"Seychellene";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:7:"Sverige";}s:2:"SG";a:1:{i:0;s:9:"Singapore";}s:2:"SH";a:1:{i:0;s:12:"Saint Helena";}s:2:"SI";a:1:{i:0;s:8:"Slovenia";}s:2:"SJ";a:1:{i:0;s:21:"Svalbard og Jan Mayen";}s:2:"SK";a:1:{i:0;s:8:"Slovakia";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:7:"Somalia";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:20:"Sao Tome og Principe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:5:"Syria";}s:2:"SZ";a:1:{i:0;s:9:"Swaziland";}s:2:"TC";a:1:{i:0;s:22:"Turks- og Caicosøyene";}s:2:"TD";a:1:{i:0;s:5:"Tchad";}s:2:"TF";a:1:{i:0;s:20:"Franske sørområder";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:8:"Thailand";}s:2:"TJ";a:1:{i:0;s:12:"Tadsjikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:10:"Øst-Timor";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:7:"Tunisia";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:6:"Tyrkia";}s:2:"TT";a:1:{i:0;s:18:"Trinidad og Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Taiwan";}s:2:"TZ";a:1:{i:0;s:8:"Tanzania";}s:2:"UA";a:1:{i:0;s:7:"Ukraina";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:17:"USAs mindre øyer";}s:2:"US";a:1:{i:0;s:3:"USA";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:10:"U
sbekistan";}s:2:"VA";a:1:{i:0;s:13:"Vatikanstaten";}s:2:"VC";a:1:{i:0;s:26:"St. Vincent og Grenadinene";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:22:"Jomfruøyene (britisk)";}s:2:"VI";a:1:{i:0;s:18:"Jomfruøyene (USA)";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:16:"Wallis og Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Yemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:10:"Jugoslavia";}s:2:"ZA";a:1:{i:0;s:11:"Sør-Afrika";}s:2:"ZM";a:1:{i:0;s:6:"Zambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:1:{s:3:"NOK";a:2:{i:0;s:2:"kr";i:1;s:3:"NOK";}}s:9:"Languages";a:3:{s:2:"nb";a:1:{i:0;s:13:"norsk bokmål";}s:2:"nn";a:1:{i:0;s:13:"norsk nynorsk";}s:2:"no";a:1:{i:0;s:5:"norsk";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:16:"'kl. 'HH.mm.ss z";i:1;s:10:"HH.mm.ss z";i:2;s:8:"HH.mm.ss";i:3;s:5:"HH.mm";i:4;s:17:"EEEE d. MMMM yyyy";i:5;s:12:"d. MMMM yyyy";i:6;s:12:"d. MMM. yyyy";i:7;s:8:"dd.MM.yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:2:"su";i:1;s:3:"må";i:2;s:2:"ty";i:3;s:2:"on";i:4;s:2:"to";i:5;s:2:"fr";i:6;s:2:"la";}s:4:"wide";a:7:{i:0;s:6:"sundag";i:1;s:7:"måndag";i:2;s:6:"tysdag";i:3;s:6:"onsdag";i:4;s:7:"torsdag";i:5;s:6:"fredag";i:6;s:7:"laurdag";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:5:"f.Kr.";i:1;s:5:"e.Kr.";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"jan";i:1;s:3:"feb";i:2;s:3:"mar";i:3;s:3:"apr";i:4;s:3:"mai";i:5;s:3:"jun";i:6;s:3:"jul";i:7;s:3:"aug";i:8;s:3:"sep";i:9;s:3:"okt";i:10;s:3:"nov";i:11;s:3:"des";}s:4:"wide";a:12:{i:0;s:6:"januar";i:1;s:7:"februar";i:2;s:4:"mars";i:3;s:5:"ap
ril";i:4;s:3:"mai";i:5;s:4:"juni";i:6;s:4:"juli";i:7;s:6:"august";i:8;s:9:"september";i:9;s:7:"oktober";i:10;s:8:"november";i:11;s:8:"desember";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nn_NO.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nn_NO.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/nn_NO.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/no.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/no.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/no.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"__ALIAS";a:1:{i:0;s:2:"nb";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/no_NO.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/no_NO.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/no_NO.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"__ALIAS";a:1:{i:0;s:5:"nb_NO";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/no_NO_NY.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/no_NO_NY.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/no_NO_NY.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"__ALIAS";a:1:{i:0;s:5:"nn_NO";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/om.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/om.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/om.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:6:{s:9:"Countries";a:2:{s:2:"ET";a:1:{i:0;s:10:"Itoophiyaa";}s:2:"KE";a:1:{i:0;s:8:"Keeniyaa";}}s:10:"Currencies";a:1:{s:3:"KES";a:2:{i:0;s:3:"Ksh";i:1;s:3:"KES";}}s:9:"Languages";a:1:{s:2:"om";a:1:{i:0;s:6:"Oromoo";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:4:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:7;i:1;i:1;}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:3:"Dil";i:1;s:3:"Wix";i:2;s:3:"Qib";i:3;s:3:"Rob";i:4;s:3:"Kam";i:5;s:3:"Jim";i:6;s:3:"San";}s:4:"wide";a:7:{i:0;s:7:"Dilbata";i:1;s:7:"Wiixata";i:2;s:7:"Qibxata";i:3;s:6:"Roobii";i:4;s:7:"Kamiisa";i:5;s:7:"Jimaata";i:6;s:7:"Sanbata";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:2:"KD";i:1;s:2:"KB";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"Ama";i:1;s:3:"Gur";i:2;s:3:"Bit";i:3;s:3:"Elb";i:4;s:3:"Cam";i:5;s:3:"Wax";i:6;s:3:"Ado";i:7;s:3:"Hag";i:8;s:3:"Ful";i:9;s:3:"Onk";i:10;s:3:"Sad";i:11;s:3:"Mud";}s:4:"wide";a:12:{i:0;s:7:"Amajjii";i:1;s:11:"Guraandhala";i:2;s:11:"Bitooteessa";i:3;s:4:"Elba";i:4;s:6:"Caamsa";i:5;s:10:"Waxabajjii";i:6;s:10:"Adooleessa";i:7;s:7:"Hagayya";i:8;s:8:"Fuulbana";i:9;s:12:"Onkololeessa";i:10;s:7:"Sadaasa";i:11;s:6:"Muddee";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/om_ET.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/om_ET.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/om_ET.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:10:"Currencies";a:2:{s:3:"ETB";a:2:{i:0;s:1:"$";i:1;s:3:"ETB";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:3:"USD";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:11:"AmPmMarkers";a:2:{i:0;s:2:"WD";i:1;s:2:"WB";}s:16:"DateTimePatterns";a:9:{i:0;s:9:"h:mm:ss a";i:1;s:9:"h:mm:ss a";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:18:"EEEE, MMMM d, yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:9:"dd-MMM-yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/om_KE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/om_KE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/om_KE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:11:"AmPmMarkers";a:2:{i:0;s:2:"WD";i:1;s:2:"WB";}s:16:"DateTimePatterns";a:9:{i:0;s:9:"h:mm:ss a";i:1;s:9:"h:mm:ss a";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:18:"EEEE, MMMM d, yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:9:"dd-MMM-yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/or.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/or.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/or.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:6:{s:9:"Countries";a:1:{s:2:"IN";a:1:{i:0;s:12:"ଭାରତ";}}s:9:"Languages";a:1:{s:2:"or";a:1:{i:0;s:12:"ଓଡ଼ିଆ";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Orya";}s:14:"NumberElements";a:12:{i:0;s:1:".";i:1;s:1:",";i:2;s:1:";";i:3;s:1:"%";i:4;s:3:"à­¦";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.0";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:9:"ରବି";i:1;s:9:"ସୋମ";i:2;s:15:"ମଙà­à¬—ଳ";i:3;s:9:"ବà­à¬§";i:4;s:12:"ଗà­à¬°à­";i:5;s:15:"ଶà­à¬•à­à¬°";i:6;s:9:"ଶନି";}s:4:"wide";a:7:{i:0;s:18:"ରବିବାର";i:1;s:18:"ସୋମବାର";i:2;s:24:"ମଙà­à¬—ଳବାର";i:3;s:18:"ବà­à¬§à¬¬à¬¾à¬°";i:4;s:21:"ଗà­à¬°à­à¬¬à¬¾à¬°";i:5;s:24:"ଶà­à¬•à­à¬°à¬¬à¬¾à¬°";i:6;s:18:"ଶନିବାର";}}}s:10:"monthNames";a:1:{s:6:"format";a:1:{s:4:"wide";a:12:{i:0;s:21:"ଜାନà­à¬†à¬°à­€";i:1;s:30:"ଫେବà­à¬°à­à­Ÿà¬¾à¬°à­€";i:2;s:21:"ମାରà­à¬šà­à¬š";i:3;s:18:"ଅପà­à¬°à­‡à¬²";i:4;s:6:"ମେ";i:5;s:9:"ଜà­à¬¨";i:6;s:15:"ଜà­à¬²à¬¾à¬‡";i:7;s:15:"ଅଗଷà­à¬Ÿ";i:8;s:30:"ସେପà­à¬Ÿà­‡à¬®à­à¬¬à¬°";i:9;s:21:"ଅକà­à¬Ÿà­‹à¬¬à¬°";i:10;s:21:"ନଭେମà­à¬¬à¬°";i:11;s:24:"ଡିସେମà­à¬¬à¬°";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/or_IN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/or_IN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/or_IN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:28:"##,##,##0.###;-##,##,##0.###";i:1;s:32:"¤ ##,##,##0.00;-¤ ##,##,##0.00";i:2;s:10:"##,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.0";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:8:"dd-MM-yy";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:1;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pa.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pa.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pa.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:8:{s:9:"Countries";a:1:{s:2:"IN";a:1:{i:0;s:12:"ਭਾਰਤ";}}s:10:"Currencies";a:1:{s:3:"INR";a:2:{i:0;s:7:"ਰà©.";i:1;s:15:"ਰà©à¨ªà¨¿à¨¯";}}s:9:"Languages";a:1:{s:2:"pa";a:1:{i:0;s:18:"ਪੰਜਾਬੀ";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Guru";}s:14:"NumberElements";a:12:{i:0;s:1:".";i:1;s:1:",";i:2;s:1:";";i:3;s:1:"%";i:4;s:3:"੦";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:28:"##,##,##0.###;-##,##,##0.###";i:1;s:32:"¤ ##,##,##0.00;-¤ ##,##,##0.00";i:2;s:10:"##,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:11:"AmPmMarkers";a:2:{i:0;s:15:"ਸਵੇਰੇ";i:1;s:9:"ਸ਼ਾਮ";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:7:"à¨à¨¤.";i:1;s:10:"ਸੋਮ.";i:2;s:13:"ਮੰਗਲ.";i:3;s:10:"ਬà©à¨§.";i:4;s:10:"ਵੀਰ.";i:5;s:13:"ਸ਼à©à¨•à¨°.";i:6;s:10:"ਸ਼ਨੀ.";}s:4:"wide";a:7:{i:0;s:15:"à¨à¨¤à¨µà¨¾à¨°";i:1;s:18:"ਸੋਮਵਾਰ";i:2;s:21:"ਮੰਗਲਵਾਰ";i:3;s:18:"ਬà©à¨§à¨µà¨¾à¨°";i:4;s:18:"ਵੀਰਵਾਰ";i:5;s:24:"ਸ਼à©à©±à¨•à¨°à¨µà¨¾à¨°";i:6;s:24:"ਸ਼ਨੀਚਰਵਾਰ";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:15:"ਜਨਵਰੀ";i:1;s:15:"ਫ਼ਰਵਰੀ";i:2;s:12:"ਮਾਰਚ";i:3;s:18:"ਅਪà©à¨°à©ˆà¨²";i:4;s:6:"ਮਈ";i:5;s:9:"ਜੂਨ";i:6;s:15:"ਜà©à¨²à¨¾à¨ˆ";i:7;s:12:"ਅਗਸਤ";i:8;s:15:"ਸਤੰਬਰ";i:9;s:18:"ਅਕਤੂਬਰ";i:10;s:15:"ਨਵੰਬਰ";i:11;s:15:"ਦਸੰਬਰ";}s:4:"wide";a:12:{i:0;s:15:"ਜਨਵਰੀ";i:1;s:15:"ਫ਼ਰਵਰੀ";i:2;s:12:"ਮਾਰਚ";i:3;s:18:"ਅਪà©à¨°à©ˆà¨²";i:4;s:6:"ਮਈ";i:5;s:9:"ਜੂਨ";i:6;s:15:"ਜà©à¨²à¨¾à¨ˆ";i:7;s:12:"ਅਗਸਤ";i:8;s:15:"ਸਤੰਬਰ";i:9;s:18:"ਅਕਤੂਬਰ";i:10;s:15:"ਨਵੰਬਰ";i:11;s:15:"ਦਸੰਬਰ";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pa_IN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pa_IN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pa_IN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:28:"##,##,##0.###;-##,##,##0.###";i:1;s:30:"¤##,##,##0.00;-¤##,##,##0.00";i:2;s:10:"##,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:12:"hh:mm:ss a z";i:1;s:12:"hh:mm:ss a z";i:2;s:10:"hh:mm:ss a";i:3;s:7:"hh:mm a";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:6:"d-M-yy";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:1;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pl.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pl.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pl.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:10:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:6:"Andora";}s:2:"AE";a:1:{i:0;s:28:"Zjednoczone Emiraty Arabskie";}s:2:"AF";a:1:{i:0;s:10:"Afganistan";}s:2:"AG";a:1:{i:0;s:17:"Antigua i Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:7:"Albania";}s:2:"AM";a:1:{i:0;s:7:"Armenia";}s:2:"AN";a:1:{i:0;s:19:"Antyle Holenderskie";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarktyka";}s:2:"AR";a:1:{i:0;s:9:"Argentyna";}s:2:"AS";a:1:{i:0;s:19:"Samoa Amerykańskie";}s:2:"AT";a:1:{i:0;s:7:"Austria";}s:2:"AU";a:1:{i:0;s:9:"Australia";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:12:"Azerbejdżan";}s:2:"BA";a:1:{i:0;s:21:"Bośnia i Hercegowina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladesz";}s:2:"BE";a:1:{i:0;s:6:"Belgia";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:9:"Bułgaria";}s:2:"BH";a:1:{i:0;s:7:"Bahrajn";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermudy";}s:2:"BN";a:1:{i:0;s:17:"Brunei Darussalam";}s:2:"BO";a:1:{i:0;s:7:"Boliwia";}s:2:"BR";a:1:{i:0;s:8:"Brazylia";}s:2:"BS";a:1:{i:0;s:6:"Bahamy";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BV";a:1:{i:0;s:13:"Wyspa Bouveta";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:10:"Białoruś";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:25:"Wyspy Kokosowe (Keelinga)";}s:2:"CD";a:1:{i:0;s:30:"Kongo, Republika Demokratyczna";}s:2:"CF";a:1:{i:0;s:27:"Republika Środkowej Afryki";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:10:"Szwajcaria";}s:2:"CI";a:1:{i:0;s:27:"Wybrzeże Kości Słoniowej";}s:2:"CK";a:1:{i:0;s:11:"Wyspy Cooka";}s:2:"CL";a:1:{i:0;s:5:"Chile";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:5:"Chiny";}s:2:"CO";a:1:{i:0;s:8:"Kolumbia";}s:2:"CR";a:1:{i:0;s:9:"Kostaryka";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:26:"Wyspy Zielonego Przylądka";}s:2:"CX";a:1:{i:0;s:24:"Wyspa Bożego Narodzenia";}s:2:"CY";a:1:{i:0;s:4:"Cypr";}s:2:"CZ";a:1:{i:0;s:16:"Republika Czeska";}s:2:"DE";a:1:{i:0
;s:6:"Niemcy";}s:2:"DJ";a:1:{i:0;s:8:"Dżibuti";}s:2:"DK";a:1:{i:0;s:5:"Dania";}s:2:"DM";a:1:{i:0;s:8:"Dominika";}s:2:"DO";a:1:{i:0;s:23:"Republika Dominikańska";}s:2:"DZ";a:1:{i:0;s:8:"Algieria";}s:2:"EC";a:1:{i:0;s:7:"Ekwador";}s:2:"EE";a:1:{i:0;s:7:"Estonia";}s:2:"EG";a:1:{i:0;s:5:"Egipt";}s:2:"EH";a:1:{i:0;s:16:"Sahara Zachodnia";}s:2:"ER";a:1:{i:0;s:7:"Erytrea";}s:2:"ES";a:1:{i:0;s:9:"Hiszpania";}s:2:"ET";a:1:{i:0;s:7:"Etiopia";}s:2:"FI";a:1:{i:0;s:9:"Finlandia";}s:2:"FJ";a:1:{i:0;s:6:"Fidżi";}s:2:"FK";a:1:{i:0;s:19:"Falklandy (Malwiny)";}s:2:"FM";a:1:{i:0;s:29:"Mikronezja, Stany Sfederowane";}s:2:"FO";a:1:{i:0;s:11:"Wyspy Owcze";}s:2:"FR";a:1:{i:0;s:7:"Francja";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:15:"Wielka Brytania";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:6:"Gruzja";}s:2:"GF";a:1:{i:0;s:16:"Gujana Francuska";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:10:"Grenlandia";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Gwinea";}s:2:"GP";a:1:{i:0;s:9:"Gwadelupa";}s:2:"GQ";a:1:{i:0;s:17:"Gwinea Równikowa";}s:2:"GR";a:1:{i:0;s:6:"Grecja";}s:2:"GS";a:1:{i:0;s:48:"Wyspy Georgia Południowa i Sandwich Południowy";}s:2:"GT";a:1:{i:0;s:9:"Gwatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Gwinea Bissau";}s:2:"GY";a:1:{i:0;s:6:"Gujana";}s:2:"HK";a:1:{i:0;s:47:"Hongkong, Specjalny Region Administracyjny Chin";}s:2:"HM";a:1:{i:0;s:22:"Wyspy Heard i McDonald";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:9:"Chorwacja";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:6:"Węgry";}s:2:"ID";a:1:{i:0;s:9:"Indonezja";}s:2:"IE";a:1:{i:0;s:8:"Irlandia";}s:2:"IL";a:1:{i:0;s:6:"Izrael";}s:2:"IN";a:1:{i:0;s:5:"Indie";}s:2:"IO";a:1:{i:0;s:40:"Terytorium Brytyjskie Oceanu Indyjskiego";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:8:"Islandia";}s:2:"IT";a:1:{i:0;s:7:"Włochy";}s:2:"JM";a:1:{i:0;s:7:"Jamajka";}s:2:"JO";a:1:{i:0;s:8:"Jordania";}s:2:"JP";a:1:{i:0;s:7:"Japonia";}s:2:"KE";a:1:{i:0
;s:5:"Kenia";}s:2:"KG";a:1:{i:0;s:9:"Kirgistan";}s:2:"KH";a:1:{i:0;s:9:"Kambodża";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:6:"Komory";}s:2:"KN";a:1:{i:0;s:19:"Saint Kitts i Nevis";}s:2:"KP";a:1:{i:0;s:16:"Korea Północna";}s:2:"KR";a:1:{i:0;s:17:"Korea PoÅ‚udniowa";}s:2:"KW";a:1:{i:0;s:6:"Kuwejt";}s:2:"KY";a:1:{i:0;s:7:"Kajmany";}s:2:"KZ";a:1:{i:0;s:10:"Kazachstan";}s:2:"LA";a:1:{i:0;s:37:"Laos (Demokratyczna Republika Ludowa)";}s:2:"LB";a:1:{i:0;s:5:"Liban";}s:2:"LC";a:1:{i:0;s:11:"Saint Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberia";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:5:"Litwa";}s:2:"LU";a:1:{i:0;s:10:"Luksemburg";}s:2:"LV";a:1:{i:0;s:6:"Åotwa";}s:2:"LY";a:1:{i:0;s:8:"Libijska";}s:2:"MA";a:1:{i:0;s:6:"Maroko";}s:2:"MC";a:1:{i:0;s:6:"Monako";}s:2:"MD";a:1:{i:0;s:20:"MoÅ‚dawia, Republika";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:15:"Wyspy Marshalla";}s:2:"MK";a:1:{i:0;s:20:"Macedonia, Republika";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:5:"Birma";}s:2:"MN";a:1:{i:0;s:8:"Mongolia";}s:2:"MO";a:1:{i:0;s:44:"Makau, Specjalny Region Administracyjny Chin";}s:2:"MP";a:1:{i:0;s:33:"Wspólnota Marianów Północnych";}s:2:"MQ";a:1:{i:0;s:9:"Martynika";}s:2:"MR";a:1:{i:0;s:10:"Mauretania";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:8:"Malediwy";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:6:"Meksyk";}s:2:"MY";a:1:{i:0;s:7:"Malezja";}s:2:"MZ";a:1:{i:0;s:8:"Mozambik";}s:2:"NA";a:1:{i:0;s:7:"Namibia";}s:2:"NC";a:1:{i:0;s:14:"Nowa Kaledonia";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:13:"Wyspa Norfolk";}s:2:"NG";a:1:{i:0;s:7:"Nigeria";}s:2:"NI";a:1:{i:0;s:9:"Nikaragua";}s:2:"NL";a:1:{i:0;s:8:"Holandia";}s:2:"NO";a:1:{i:0;s:8:"Norwegia";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:13:"Nowa Zelandia";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";
a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:19:"Polinezja Francuska";}s:2:"PG";a:1:{i:0;s:17:"Papua Nowa Gwinea";}s:2:"PH";a:1:{i:0;s:8:"Filipiny";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:6:"Polska";}s:2:"PM";a:1:{i:0;s:21:"St. Pierre i Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:11:"Puerto Rico";}s:2:"PS";a:1:{i:0;s:23:"Terytoria Palestyńskie";}s:2:"PT";a:1:{i:0;s:10:"Portugalia";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paragwaj";}s:2:"QA";a:1:{i:0;s:5:"Katar";}s:2:"RE";a:1:{i:0;s:7:"Reunion";}s:2:"RO";a:1:{i:0;s:7:"Rumunia";}s:2:"RU";a:1:{i:0;s:18:"Federacja Rosyjska";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:16:"Arabia Saudyjska";}s:2:"SB";a:1:{i:0;s:14:"Wyspy Salomona";}s:2:"SC";a:1:{i:0;s:7:"Seszele";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:7:"Szwecja";}s:2:"SG";a:1:{i:0;s:8:"Singapur";}s:2:"SH";a:1:{i:0;s:22:"Wyspa Świętej Heleny";}s:2:"SI";a:1:{i:0;s:9:"Słowenia";}s:2:"SJ";a:1:{i:0;s:26:"Svalbard i Wyspy Jan Mayen";}s:2:"SK";a:1:{i:0;s:9:"Słowacja";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:7:"Somalia";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:38:"Wyspy Świętego Tomasza i Książęca";}s:2:"SV";a:1:{i:0;s:8:"Salwador";}s:2:"SY";a:1:{i:0;s:5:"Syria";}s:2:"SZ";a:1:{i:0;s:5:"Suazi";}s:2:"TC";a:1:{i:0;s:14:"Turks i Caicos";}s:2:"TD";a:1:{i:0;s:4:"Czad";}s:2:"TF";a:1:{i:0;s:32:"Francuskie Terytoria Południowe";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:9:"Tajlandia";}s:2:"TJ";a:1:{i:0;s:12:"Tadżykistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:14:"Timor Wschodni";}s:2:"TM";a:1:{i:0;s:9:"Turkmenia";}s:2:"TN";a:1:{i:0;s:7:"Tunezja";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:6:"Turcja";}s:2:"TT";a:1:{i:0;s:17:"Trinidad i Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Tajwan";}s:2:"TZ";a:1:{i:0;s:8:"Tanzania";}s:2:"UA";a:1:{i:0;s:7:"
Ukraina";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:36:"United States Minor Outlying Islands";}s:2:"US";a:1:{i:0;s:17:"Stany Zjednoczone";}s:2:"UY";a:1:{i:0;s:7:"Urugwaj";}s:2:"UZ";a:1:{i:0;s:10:"Uzbekistan";}s:2:"VA";a:1:{i:0;s:42:"Stolica Apostolska (Państwo Watykańskie)";}s:2:"VC";a:1:{i:0;s:32:"Saint Vincent and the Grenadines";}s:2:"VE";a:1:{i:0;s:9:"Wenezuela";}s:2:"VG";a:1:{i:0;s:26:"Brytyjskie Wyspy Dziewicze";}s:2:"VI";a:1:{i:0;s:38:"Wyspy Dziewicze, Stanów Zjednoczonych";}s:2:"VN";a:1:{i:0;s:7:"Wietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:15:"Wallis i Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"YT";a:1:{i:0;s:7:"Majotta";}s:2:"YU";a:1:{i:0;s:11:"Jugosławia";}s:2:"ZA";a:1:{i:0;s:18:"Afryka Południowa";}s:2:"ZM";a:1:{i:0;s:6:"Zambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:359:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:14:"diner andorski";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:15:"peseta andorska";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:10:"dirham ZEA";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:18:"afgani (1927-2002)";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:6:"afgani";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:28:"frank Affars and Issas Franc";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:25:"lek albański (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:13:"lek albański";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:20:"lek waluta albańska";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:53:"dolar albański dewizowy dla transakcji zagranicznych";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:14:"dram armeński";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:26:"gulden Antyle Holenderskie";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:18:"kwanza angolańska";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:30:"kwanza angolańska (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:35:"nowa kwanza angolańska (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:41:"kwanza angolańska Reajustado (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:19:"escudo angolańskie";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:20:"austral argentyński";}s:3:"ARM
";a:2:{i:0;s:3:"ARM";i:1;s:34:"peso argentyńskie Moneda Nacional";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:30:"peso argentyńskie (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:18:"peso argentyńskie";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:20:"szyling austriacki ";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:18:"dolar australijski";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:17:"funt australijski";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:14:"gulden arubski";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:22:"manat azerbejdżański";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:26:"dinar Bośni i Hercegowiny";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:40:"marka konwertybilna Bośni i Hercegowiny";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:32:"nowy dinar Bośni i Hercegowinyr";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:15:"dolar Barbadosu";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:14:"taka bengalska";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:26:"frank belgijski (zamienny)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:15:"frank belgijski";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:27:"frank belgijski (finansowy)";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:16:"dinar bahrański";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:17:"frank burundyjski";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:15:"dolar bermudzki";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:14:"funt bermudzki";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:15:"dolar brunejski";}s:3:"BOB";a:2:{i:0;s:2:"Bs";i:1;s:9:"boliviano";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:21:"boliviano (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:16:"peso boliwijskie";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:16:"mvdol boliwijski";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:38:"cruzeiro novo brazylijskie (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:20:"cruzado brazylijskie";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:32:"cruzeiro brazylijskie(1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:16:"real brazylijski";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:20:"cruzado brazylijskie";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:21:"cruzeiro brazylijskie";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:33:"cruzeiro brazylijskie (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i
:1;s:14:"dolar bahamski";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:13:"funt bahamski";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:16:"ngultrum  Bhutan";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:12:"rupia Bhutan";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:15:"kyat birmański";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:16:"rupia birmańska";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:4:"pula";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:29:"rubel białoruski (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:29:"rubel białoruski (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:17:"rubel białoruski";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:17:"dolar belizeński";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:28:"dolar Hondurasu Brytyjskiego";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:16:"dolar kanadyjski";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:15:"frank kongijski";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:21:"frank Republiki Konga";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:14:"zair kongijski";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:42:"frank CFA Republiki Środkowoafrykańskiej";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:17:"frank szwajcarski";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:16:"dolar Wysp Cooka";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:16:"condor chilijski";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:17:"escudo chilijskie";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:15:"peso chilijskie";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:18:"frank CFA Kamerunu";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:39:"Jen Min Piao juan Jen Min Piao chiński";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:43:"dolar chiński dla transakcji zagranicznych";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:13:"juan renminbi";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:27:"peso kolumbijskie papierowe";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:15:"frank CFA Konga";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:17:"peso kolumbijskie";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:20:"colon kostarykański";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:22:"korona czechosłowacka";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:22:"korona czechosłowacka";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:15:"peso kubańskie";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:51:"certyfi
katy kubańskie dla transakcji zagranicznych";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:27:"escudo Zielonego Przylądka";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:14:"gulden Curacao";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:14:"funt cypryjski";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:13:"korona czeska";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:34:"wschodnia marka wschodnioniemiecka";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:15:"marka niemiecka";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:14:"frank Dżibuti";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:14:"korona duńska";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:19:"peso dominikańskie";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:15:"dinar algierski";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:20:"nowy frank algierski";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:16:"sucre ekwadorski";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:16:"korona estońska";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:12:"funt egipski";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:16:"nakfa erytrejska";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:18:"peseta hiszpańska";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:13:"birr etiopski";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:14:"dolar etiopski";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:13:"marka fińska";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:25:"marka fińska (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:16:"dolar fidżijski";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:15:"funt fidżijski";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:23:"funt Wysp Falklandzkich";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:19:"korona Wysp Owczych";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:17:"frank francuski ";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:16:"frank CFA Gabonu";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:14:"funt szterling";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:22:"Larit gruziński kupon";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:16:"lari gruzińskie";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:14:"cedi ghańskie";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:20:"stare cedi ghańskie";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:13:"funt ghański";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:30:"cedi zrewaloryzowane ghańsk
ie";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:17:"funt gibraltarski";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:18:"korona grenlandzka";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:17:"dalasi gambijskie";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:14:"funt gambijski";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:15:"frank gwinejski";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:27:"frank gwinejski (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:15:"syli gwinejskie";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:15:"frank Gwadelupy";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:36:"ekwele gwinejskie Gwinei Równikowej";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:24:"frank Gwinei Równikowej";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:35:"peseta gujańska Gwinei Równikowej";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:14:"drachma grecka";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:19:"nowa drachma grecka";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:19:"quetzal gwatemalski";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:25:"escudo Gwinea Portugalska";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:18:"peso Guinea-Bissau";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:15:"dolar gujański";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:17:"dolar hongkoński";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:17:"lempira Hondurasu";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:15:"dinar chorwacki";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:14:"kuna chorwacka";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:18:"gourde haitańskie";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:19:"forint węgierski ";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:24:"fund północnoirlandzki";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:24:"gulden indonezyjski Nica";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:23:"rupia indonezyjska Java";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:23:"nowa rupia indonezyjska";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:18:"rupia indonezyjska";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:14:"funt irlandzki";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:16:"szekel izraelski";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:14:"funt izraelski";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:21:"nowy szekel izraelski";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:24:"funt szterling Wyspa Man";}s:3:"INR";a:2:{i:0;s
:3:"INR";i:1;s:14:"rupia indyjska";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:12:"dinar iracki";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:13:"rial irański";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:16:"korona islandzka";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:11:"lir włoski";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:21:"funt szterling Jersey";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:14:"dolar jamajski";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:14:"funt  jamajski";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:16:"dinar jordański";}s:3:"JPY";a:2:{i:0;s:2:"¥";i:1;s:13:"jen japoński";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:16:"szyling kenijski";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:12:"som kirgiski";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:25:"stary riel kambodżański";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:19:"riel kambodżański";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:14:"dolar Kiribati";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:16:"frank komoryjski";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:30:"won ludowopółnocnokoreański";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:24:"won północnokoreański";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:26:"hwan południowokoreański";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:31:"stary won południowokoreański";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:25:"won południowokoreański";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:14:"dinar kuwejcki";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:16:"dolar kajmański";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:15:"rubel kazachski";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:16:"Tenge kazachskie";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:14:"kip laotański";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:14:"funt libański";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:19:"frank Liechtenstein";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:15:"rupia lankijska";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:16:"rupia cejlońska";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:16:"dolar liberyjski";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:11:"loti Lesoto";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:12:"lit litewski";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:14:"talon litewski";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:18:"frank luksemburski";}s:3:"LVL";a:2:{i
:0;s:3:"LVL";i:1;s:14:"łat łotewski";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:15:"rubel łotewski";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:41:"lir brytyjskich władz wojskowych w Libii";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:14:"dinar libijski";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:13:"funt libijski";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:18:"dirham marokański";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:17:"frank marokański";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:17:"nowy frank Monaco";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:21:"frank Monaco Germinal";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:23:"lej kuponowy mołdawski";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:14:"lej mołdawski";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:25:"rubel kuponowy mołdawski";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:14:"ariar malgaski";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:14:"frank malgaski";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:20:"dolar Wysp Marshalla";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:17:"denar macedoński";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:29:"denar macedoński (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:14:"frank malijski";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:12:"kyat Myanmar";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:56:"dolarowy certyfikat Myanmar dla transakcji zagranicznych";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:16:"tugrik mongolski";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:12:"pataka Macao";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:15:"frank Martynika";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:20:"ouguiya mauterańska";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:15:"lira maltańska";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:15:"funt maltański";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:15:"rupia Mauritius";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:16:"rupia malediwska";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:18:"rufiyaa malediwska";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:15:"kwacha malawska";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:13:"funt malawski";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:18:"peso meksykańskie";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:38:"peso srebrne meksykańskie (1861-1992)";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:18:"ringgit 
malezyjski";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:18:"escudo mozambickie";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:16:"metical Mozambik";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:16:"dolar namibijski";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:29:"franc germinal Nowa Kaledonia";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:16:"naira nigeryjska";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:15:"funt nigeryjski";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:22:"cordoba nikaraguańska";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:27:"cordoba Gold nikaraguańska";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:26:"cordoba oro nikaraguańska";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:20:"gulden holenderski ";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:15:"korona norweska";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:14:"rupia nepalska";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:19:"dolar nowozelandzki";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:18:"funt nowozelandzki";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:10:"rial Omanu";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:19:"rial saidi omański";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:15:"balboa panamski";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:32:"rubel kuponowy naddniestrzański";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:28:"nowy rubel naddniestrzański";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:23:"rubel naddniestrzański";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:17:"inti peruwiański";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:21:"nowy sol peruwiański";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:16:"sol peruwiański";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:22:"kina Papua Nowa Gwinea";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:17:"peso filipińskie";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:18:"rupia pakistańska";}s:3:"PLN";a:2:{i:0;s:3:"zł";i:1;s:13:"złoty polski";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:51:"złoty polski dewizowy dla transakcji zagranicznych";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:25:"złoty polski (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:17:"funt palestyński";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:18:"conto portugalskie";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:19:"escudo portugalskie";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:20:"gua
rani paragwajskie";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:13:"rial katarski";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:13:"frank Reunion";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:13:"lej rumuński";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:18:"nowy lej rumuński";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:14:"rubel rosyjski";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:26:"rubel rosyjski (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:16:"frank ruandyjski";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:14:"rial saudyjski";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:25:"riyal sovereign saudyjski";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:19:"dolar Wysp Salomona";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:15:"rupia seszelska";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:15:"dinar sudański";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:14:"funt sudański";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:15:"korona szwedzka";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:17:"dolar singapurski";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:27:"funt Wyspy Świętej Heleny";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:24:"tolar słoweński bonowy";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:17:"tolar słoweński";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:16:"korona słowacka";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:18:"leone Sierra Leone";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:14:"lir San Marino";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:18:"szyling somalijski";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:18:"szyling somalijski";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:17:"gulden surinamski";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:12:"funt szkocki";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:45:"dobra Wysp Świętego Tomasza i Książęcej";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:46:"escudo Wysp Świętego Tomasza i Książęcej";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:20:"nowy rubel radziecki";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:15:"rubel radziecki";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:17:"colon salwadorski";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:13:"funt syryjski";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:15:"lilangeni Suazi";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:21:"korona Turks i Caicos";}s:3:"TDF";a:2:{i:0;s:3:"TDF
";i:1;s:15:"frank CFA Czadu";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:11:"baht tajski";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:15:"rubel tadżycki";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:17:"somoni tadżyckie";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:17:"manat turkmeński";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:16:"dinar tunezyjski";}s:3:"TOP";a:2:{i:0;s:2:"T$";i:1;s:14:"paʻanga Tonga";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:20:"funt szterling Tonga";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:16:"escudo timorskie";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:16:"pataca timorskie";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:11:"lir turecki";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:24:"dolar Trynidadu i Tobago";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:30:"stary dolar Trynidadu i Tobago";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:12:"dolar Tuvalu";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:21:"nowy dolar tajwański";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:18:"szyling tanzański";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:17:"hrywna ukraińska";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:22:"karbowaniec ukraiński";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:30:"szyling ugandyjski (1966-1987)";}s:3:"UGX";a:2:{i:0;s:3:"USh";i:1;s:18:"szyling ugandyjski";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:20:"dolar amerykański ";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:23:"peso urugwajskie Fuerte";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:28:"peso urugwajskie (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:16:"peso urugwajskie";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:20:"som kuponowy uzbecki";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:11:"som uzbecki";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:18:"lir Miasta Watykan";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:38:"piastre dong viet północnowietnamski";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:30:"nowy dong północnowietnamski";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:48:"viet minh piastre dong viet północnowietnamski";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:19:"boliwar wenezuelski";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:34:"dolar Brytyjskich Wysp Dziewiczych";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:15:"dong wietnamski";}s:3:"VNN";a
:2:{i:0;s:3:"VNN";i:1;s:20:"nowy dong wietnamski";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:27:"dong Republiki Wietnamskiej";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:24:"dong narodowy wietnamski";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:12:"vatu Vanuatu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:15:"funt samoański";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:15:"tala samoańska";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:39:"jednostla dinar rozliczeniowy azjatycki";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:14:"frank CFA BEAC";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:29:"jednostka monetarna azjatycka";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:6:"złoto";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:24:"dolar wschodniokaraibski";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:14:"nowy frank CFA";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:27:"specjalne prawa ciągnienia";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:16:"frank CFA BCEAEC";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:22:"frank złoty francuski";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:19:"UIC-frank francuski";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:14:"dinar islamski";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:33:"nowy frank Metropolii Francuskiej";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:28:"frank CFA Antyli Francuskich";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:9:"frank CFA";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:9:"frank CFP";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:25:"rubel transferowy COMECON";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:15:"dinar jemeński";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:21:"riyal Imadi jemeński";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:14:"rial jemeński";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:31:"dinar jugosławiański wymienny";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:34:"dinar Federacji jugosławiańskiej";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:27:"dinar jugosławiański 1994";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:27:"nowy dinar jugosławiański";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:31:"dinar jugosławiański wymienny";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:38:"dinar październikowy jugosławiański";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:34:"dinar reformowany jugosławiański";}s:3:"
ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:39:"rand południowoafrykański (finansowy)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:27:"funt południowoafrykański";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:27:"rand południowoafrykański";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:16:"kwacha zambijska";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:14:"funt zambijski";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:17:"nowy zair zairski";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:12:"zair zairski";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:14:"dolar Zimbabwe";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:9:"Kalendarz";}s:9:"collation";a:1:{i:0;s:10:"Sortowanie";}s:8:"currency";a:1:{i:0;s:6:"Waluta";}}s:9:"Languages";a:30:{s:2:"ar";a:1:{i:0;s:7:"arabski";}s:2:"bg";a:1:{i:0;s:10:"bułgarski";}s:2:"cs";a:1:{i:0;s:6:"czeski";}s:2:"da";a:1:{i:0;s:7:"duński";}s:2:"de";a:1:{i:0;s:9:"niemiecki";}s:2:"el";a:1:{i:0;s:6:"grecki";}s:2:"en";a:1:{i:0;s:9:"angielski";}s:2:"es";a:1:{i:0;s:11:"hiszpański";}s:2:"et";a:1:{i:0;s:9:"estoński";}s:2:"fi";a:1:{i:0;s:7:"fiński";}s:2:"fr";a:1:{i:0;s:9:"francuski";}s:2:"he";a:1:{i:0;s:9:"hebrajski";}s:2:"hr";a:1:{i:0;s:9:"chorwacki";}s:2:"hu";a:1:{i:0;s:10:"węgierski";}s:2:"it";a:1:{i:0;s:7:"włoski";}s:2:"ja";a:1:{i:0;s:9:"japoński";}s:2:"ko";a:1:{i:0;s:10:"koreański";}s:2:"lt";a:1:{i:0;s:8:"litewski";}s:2:"lv";a:1:{i:0;s:9:"łotewski";}s:2:"nl";a:1:{i:0;s:11:"holenderski";}s:2:"no";a:1:{i:0;s:8:"norweski";}s:2:"pl";a:1:{i:0;s:6:"polski";}s:2:"pt";a:1:{i:0;s:11:"portugalski";}s:2:"ro";a:1:{i:0;s:9:"rumuński";}s:2:"ru";a:1:{i:0;s:8:"rosyjski";}s:2:"sk";a:1:{i:0;s:9:"słowacki";}s:2:"sl";a:1:{i:0;s:11:"słoweński";}s:2:"sv";a:1:{i:0;s:8:"szwedzki";}s:2:"tr";a:1:{i:0;s:7:"turecki";}s:2:"zh";a:1:{i:0;s:8:"chiński";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Scripts";a:41:{s:4:"Arab";a:1:{i:0;s:7:"Arabski";}s:4:"Armn";a:1:{i:0;s:9:"Armeński";}s:4:"Beng";a:1:{i:0;s:9:"Bengal
ski";}s:4:"Cans";a:1:{i:0;s:46:"Zunifikowane symbole kanadyjskich autochtonów";}s:4:"Cher";a:1:{i:0;s:10:"Czerokezki";}s:4:"Copt";a:1:{i:0;s:9:"Koptyjski";}s:4:"Cyrl";a:1:{i:0;s:9:"Cyrylicki";}s:4:"Ethi";a:1:{i:0;s:8:"Etiopski";}s:4:"Geor";a:1:{i:0;s:10:"GruziÅ„ski";}s:4:"Goth";a:1:{i:0;s:7:"Gotycki";}s:4:"Grek";a:1:{i:0;s:6:"Grecki";}s:4:"Gujr";a:1:{i:0;s:10:"Gudżarati";}s:4:"Hano";a:1:{i:0;s:7:"Hanunoo";}s:4:"Hans";a:1:{i:0;s:15:"Uproszczony Han";}s:4:"Hant";a:1:{i:0;s:14:"Tradycyjny Han";}s:4:"Hebr";a:1:{i:0;s:9:"Hebrajski";}s:4:"Ital";a:1:{i:0;s:12:"StarowÅ‚oski";}s:4:"Khmr";a:1:{i:0;s:8:"Khmerski";}s:4:"Laoo";a:1:{i:0;s:10:"LaotaÅ„ski";}s:4:"Latn";a:1:{i:0;s:10:"ÅaciÅ„ski";}s:4:"Limb";a:1:{i:0;s:5:"Limbu";}s:4:"Linb";a:1:{i:0;s:10:"Linearny B";}s:4:"Mlym";a:1:{i:0;s:9:"Malayalam";}s:4:"Mong";a:1:{i:0;s:9:"Mongolski";}s:4:"Mymr";a:1:{i:0;s:7:"Myanmar";}s:4:"Ogam";a:1:{i:0;s:5:"Ogham";}s:4:"Orya";a:1:{i:0;s:5:"Oriya";}s:4:"Osma";a:1:{i:0;s:7:"Csmanya";}s:4:"Qaai";a:1:{i:0;s:11:"Dziedziczny";}s:4:"Runr";a:1:{i:0;s:8:"Runiczny";}s:4:"Sinh";a:1:{i:0;s:10:"Syngaleski";}s:4:"Syrc";a:1:{i:0;s:8:"Syryjski";}s:4:"Tagb";a:1:{i:0;s:8:"Tagbanwa";}s:4:"Taml";a:1:{i:0;s:8:"Tamilski";}s:4:"Telu";a:1:{i:0;s:6:"Telugu";}s:4:"Tglg";a:1:{i:0;s:7:"Tagalog";}s:4:"Thaa";a:1:{i:0;s:6:"Thaana";}s:4:"Thai";a:1:{i:0;s:6:"Tajski";}s:4:"Tibt";a:1:{i:0;s:11:"TybetaÅ„ski";}s:4:"Ugar";a:1:{i:0;s:8:"Ugarycki";}s:4:"Zyyy";a:1:{i:0;s:8:"Wspólny";}}s:5:"Types";a:2:{s:8:"calendar";a:5:{s:8:"buddhist";a:1:{i:0;s:19:"Kalendarz buddyjski";}s:7:"chinese";a:1:{i:0;s:18:"Kalendarz chiÅ„ski";}s:9:"gregorian";a:1:{i:0;s:23:"Kalendarz gregoriaÅ„ski";}s:6:"hebrew";a:1:{i:0;s:19:"Kalendarz żydowski";}s:8:"japanese";a:1:{i:0;s:19:"Kalendarz japoÅ„ski";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:22:"porzÄ…dek bezpoÅ›redni";}s:9:"phonebook";a:1:{i:0;s:33:"porzÄ…dek książki telefonicznej";}s:6:"pinyin";a:1:{i:0;s:16:"porzÄ…dek Pinyin";}s:6:"stroke";a:1:{i:0;s:19:"porzÄ…dek akcentów";}s:11:"traditional";a:1:{i:0;s:10:"tradycyjny";}}}s:7:"Version";a:
1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:17:"EEEE, d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"yyyy-MM-dd";i:7;s:8:"yy-MM-dd";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:1:"N";i:1;s:2:"Pn";i:2;s:2:"Wt";i:3;s:3:"Śr";i:4;s:2:"Cz";i:5;s:2:"Pt";i:6;s:2:"So";}s:6:"narrow";a:7:{i:0;s:1:"N";i:1;s:1:"P";i:2;s:1:"W";i:3;s:2:"Ś";i:4;s:1:"C";i:5;s:1:"P";i:6;s:1:"S";}s:4:"wide";a:7:{i:0;s:9:"niedziela";i:1;s:13:"poniedziałek";i:2;s:6:"wtorek";i:3;s:6:"środa";i:4;s:8:"czwartek";i:5;s:7:"piątek";i:6;s:6:"sobota";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:6:"p.n.e.";i:1;s:4:"n.e.";}}s:10:"monthNames";a:2:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:2:"st";i:1;s:3:"lut";i:2;s:3:"mrz";i:3;s:2:"kw";i:4;s:3:"maj";i:5;s:2:"cz";i:6;s:3:"lip";i:7;s:4:"sier";i:8;s:3:"wrz";i:9;s:4:"paź";i:10;s:3:"lis";i:11;s:2:"gr";}s:6:"narrow";a:12:{i:0;s:1:"s";i:1;s:1:"l";i:2;s:1:"m";i:3;s:1:"k";i:4;s:1:"m";i:5;s:1:"c";i:6;s:1:"l";i:7;s:1:"s";i:8;s:1:"w";i:9;s:1:"p";i:10;s:1:"l";i:11;s:1:"g";}s:4:"wide";a:12:{i:0;s:8:"stycznia";i:1;s:6:"lutego";i:2;s:5:"marca";i:3;s:8:"kwietnia";i:4;s:4:"maja";i:5;s:7:"czerwca";i:6;s:5:"lipca";i:7;s:8:"sierpnia";i:8;s:9:"września";i:9;s:13:"października";i:10;s:9:"listopada";i:11;s:7:"grudnia";}}s:11:"stand-alone";a:3:{s:11:"abbreviated";a:12:{i:0;s:2:"st";i:1;s:3:"lut";i:2;s:3:"mrz";i:3;s:2:"kw";i:4;s:3:"maj";i:5;s:2:"cz";i:6;s:3:"lip";i:7;s:4:"sier";i:8;s:3:"wrz";i:9;s:4:"paź";i:10;s:3:"lis";i:11;s:2:"gr";}s:6:"narrow";a:12:{i:0;s:1:"s";i:1;s:1:"l";i:2;s:1:"m";i:3;s:1:"k";i:4;s:1:"m";i:5;s:1:"c";i:6;s:1:"l";i:7;s:1:"s";i:8;s:1:"w";i:9;s:1:"p";i:10;s:1:"l";i:11;s:1:"g";}s:4:"wide";a:12:{i:0;s:8:"Styczeń";i:1;s:4:"Luty";i:2;s:6:"Marzec";i:3;s:9:"Kwiecień";i:4;s:3:"Maj";i:5;s:8:"Czerwiec";i:6;s:6:"Lipiec";i:7;s:9:"Sierpień";i:8;s:9:"Wrzesień";i:9;s:12:"Październik"
;i:10;s:8:"Listopad";i:11;s:9:"Grudzień";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pl_PL.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pl_PL.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pl_PL.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ps.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ps.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ps.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:63:{s:2:"AF";a:1:{i:0;s:18:"اÙغانستان";}s:2:"AL";a:1:{i:0;s:14:"البانیه";}s:2:"AO";a:1:{i:0;s:12:"انګولا";}s:2:"AQ";a:1:{i:0;s:20:"انتارکتیکا";}s:2:"AT";a:1:{i:0;s:10:"اتریش";}s:2:"BD";a:1:{i:0;s:19:"بنګله‌دیش";}s:2:"BG";a:1:{i:0;s:14:"بلغاریه";}s:2:"CA";a:1:{i:0;s:12:"کاناډا";}s:2:"CH";a:1:{i:0;s:8:"سویس";}s:2:"CN";a:1:{i:0;s:6:"چین";}s:2:"CO";a:1:{i:0;s:14:"کولمبیا";}s:2:"CU";a:1:{i:0;s:10:"کیوبا";}s:2:"DE";a:1:{i:0;s:10:"المان";}s:2:"DK";a:1:{i:0;s:12:"ډنمارک";}s:2:"DZ";a:1:{i:0;s:14:"الجزایر";}s:2:"EG";a:1:{i:0;s:6:"مصر";}s:2:"ES";a:1:{i:0;s:14:"هسپانیه";}s:2:"ET";a:1:{i:0;s:8:"حبشه";}s:2:"FI";a:1:{i:0;s:12:"Ùنلینډ";}s:2:"FR";a:1:{i:0;s:12:"Ùرانسه";}s:2:"GB";a:1:{i:0;s:14:"برتانیه";}s:2:"GH";a:1:{i:0;s:8:"ګانا";}s:2:"GN";a:1:{i:0;s:10:"ګیانا";}s:2:"GR";a:1:{i:0;s:10:"یونان";}s:2:"GT";a:1:{i:0;s:18:"ګواتیمالا";}s:2:"HN";a:1:{i:0;s:16:"هانډوراس";}s:2:"HU";a:1:{i:0;s:16:"مجارستان";}s:2:"ID";a:1:{i:0;s:18:"اندونیزیا";}s:2:"IN";a:1:{i:0;s:6:"هند";}s:2:"IQ";a:1:{i:0;s:8:"عراق";}s:2:"IS";a:1:{i:0;s:14:"آیسلینډ";}s:2:"IT";a:1:{i:0;s:14:"ایټالیه";}s:2:"JM";a:1:{i:0;s:10:"جمیکا";}s:2:"JP";a:1:{i:0;s:10:"جاپان";}s:2:"KH";a:1:{i:0;s:14:"کمبودیا";}s:2:"KW";a:1:{i:0;s:8:"کویټ";}s:2:"LA";a:1:{i:0;s:8:"لاوس";}s:2:"LB";a:1:{i:0;s:10:"لبنان";}s:2:"LR";a:1:{i:0;s:14:"لایبریا";}s:2:"LY";a:1:{i:0;s:10:"لیبیا";}s:2:"MA";a:1:{i:0;s:10:"مراکش";}s:2:"MN";a:1:{i:0;s:16:"مغولستان";}s:2:"MY";a:1:{i:0;s:14:"مالیزیا";}s:2:"NG";a:1:{i:0;s:16:"نایجیریا";}s:2:"NI";a:1:{i:0;s:16:"نکاراګوا";}s:2:"NL";a:1:{i:0;s:12:"هالÛÙ†Ú‰";}s:2:"NO";a:1:{i:0;s:10:"ناروÛ";}s:2:"NP";a:1:{i:0;s:10:"نیپال";}s:2:"NZ";a:1:{i:0;s:16:"نیوزیلنډ";}s:2:"PK";a:1:{i:0;s:14:"پاکستان";}s:2:"PL";a:1:{i:0;s:10:"پولنډ";}s:2:"PS";a:1:{i:0;s:12:"ÙÙ
„سطین";}s:2:"PT";a:1:{i:0;s:14:"پورتګال";}s:2:"RU";a:1:{i:0;s:10:"روسیه";}s:2:"RW";a:1:{i:0;s:10:"روندا";}s:2:"SA";a:1:{i:0;s:25:"سعودی عربستان";}s:2:"SE";a:1:{i:0;s:10:"سویډن";}s:2:"SV";a:1:{i:0;s:16:"سالوÛډور";}s:2:"SY";a:1:{i:0;s:10:"سوریه";}s:2:"TJ";a:1:{i:0;s:16:"تاجکستان";}s:2:"TZ";a:1:{i:0;s:14:"تنزانیا";}s:2:"UY";a:1:{i:0;s:16:"یوروګوای";}s:2:"YE";a:1:{i:0;s:6:"یمن";}}s:10:"Currencies";a:1:{s:3:"AFA";a:2:{i:0;s:12:"اÙغانÛ";i:1;s:12:"اÙغانÛ";}}s:9:"Languages";a:32:{s:2:"ar";a:1:{i:0;s:8:"عربي";}s:3:"bal";a:1:{i:0;s:10:"بلوڅي";}s:2:"de";a:1:{i:0;s:12:"الماني";}s:2:"el";a:1:{i:0;s:12:"یوناني";}s:2:"en";a:1:{i:0;s:14:"انګلیسي";}s:2:"et";a:1:{i:0;s:8:"حبشي";}s:2:"fa";a:1:{i:0;s:10:"Ùارسي";}s:2:"fi";a:1:{i:0;s:14:"Ùینلنډي";}s:2:"fr";a:1:{i:0;s:14:"Ùرانسوي";}s:2:"he";a:1:{i:0;s:8:"عبري";}s:2:"hi";a:1:{i:0;s:8:"هندي";}s:2:"hy";a:1:{i:0;s:10:"ارمني";}s:3:"ine";a:1:{i:0;s:24:"هند Ùˆ اروپایي";}s:2:"it";a:1:{i:0;s:14:"ایټالوي";}s:2:"ja";a:1:{i:0;s:12:"جاپانی";}s:2:"ku";a:1:{i:0;s:8:"کردي";}s:2:"la";a:1:{i:0;s:12:"لاتیني";}s:2:"mg";a:1:{i:0;s:12:"ملغاسي";}s:2:"mk";a:1:{i:0;s:12:"مقدوني";}s:2:"mn";a:1:{i:0;s:10:"مغولي";}s:2:"ms";a:1:{i:0;s:10:"ملایا";}s:2:"pl";a:1:{i:0;s:12:"پولنډي";}s:2:"ps";a:1:{i:0;s:8:"پښتو";}s:2:"pt";a:1:{i:0;s:16:"پورتګالي";}s:2:"ru";a:1:{i:0;s:8:"روسي";}s:2:"sa";a:1:{i:0;s:14:"سنسکریټ";}s:2:"sv";a:1:{i:0;s:12:"سویډنی";}s:2:"tg";a:1:{i:0;s:8:"تاجک";}s:2:"tk";a:1:{i:0;s:12:"ترکمني";}s:2:"tt";a:1:{i:0;s:10:"تاتار";}s:2:"uz";a:1:{i:0;s:10:"ازبکي";}s:2:"zh";a:1:{i:0;s:8:"چیني";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Arab";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:11:"AmPmMarkers";a:2:{i:0;s:6:"غ.Ù….";i:1;s:6:"غ.Ùˆ.";}s:16:"DateTimePatterns";a:9:{i:0;s:11:"H:mm:ss (z)";i:1;s:11:"H:mm:ss (z)";i:2;s:7:"H:mm:
ss";i:3;s:4:"H:mm";i:4;s:22:"EEEE د yyyy د MMMM d";i:5;s:17:"د yyyy د MMMM d";i:6;s:11:"d MMMM yyyy";i:7;s:8:"yyyy/M/d";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:3:"ÛŒ.";i:1;s:3:"د.";i:2;s:3:"س.";i:3;s:3:"Ú†.";i:4;s:3:"Ù¾.";i:5;s:3:"ج.";i:6;s:3:"Ø´.";}s:4:"wide";a:7:{i:0;s:12:"یکشنبه";i:1;s:12:"دوشنبه";i:2;s:15:"سه‌شنبه";i:3;s:16:"چهارشنبه";i:4;s:14:"پنجشنبه";i:5;s:8:"جمعه";i:6;s:8:"شنبه";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:6:"Ù‚.Ù….";i:1;s:3:"Ù….";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:6:"جنو";i:1;s:6:"Ùبر";i:2;s:6:"مار";i:3;s:6:"اپر";i:4;s:6:"مـی";i:5;s:6:"جون";i:6;s:6:"جول";i:7;s:6:"اګس";i:8;s:6:"سپت";i:9;s:6:"اکت";i:10;s:6:"نوم";i:11;s:6:"دسم";}s:4:"wide";a:12:{i:0;s:10:"جنوري";i:1;s:12:"Ùبروري";i:2;s:8:"مارچ";i:3;s:10:"اپریل";i:4;s:4:"Ù…ÛŒ";i:5;s:6:"جون";i:6;s:10:"جولای";i:7;s:8:"اګست";i:8;s:12:"سپتمبر";i:9;s:12:"اکتوبر";i:10;s:10:"نومبر";i:11;s:10:"دسمبر";}}}}}s:11:"zoneStrings";a:1:{i:0;a:6:{i:0;s:10:"Asia/Kabul";i:1;s:33:"د اÙغانستان په وخت";i:2;s:3:"AFT";i:3;s:33:"د اÙغانستان په وخت";i:4;s:3:"AFT";i:5;s:8:"کابل";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ps_AF.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ps_AF.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ps_AF.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:14:"NumberElements";a:12:{i:0;s:2:"٫";i:1;s:2:"٬";i:2;s:1:";";i:3;s:2:"٪";i:4;s:2:"۰";i:5;s:1:"#";i:6;s:3:"−";i:7;s:7:"×۱۰^";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:18:"#,##0 ¤;-#,##0 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:7;i:1;i:1;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pt.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pt.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pt.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:12:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:23:"Emirados Ãrabes Unidos";}s:2:"AF";a:1:{i:0;s:12:"Afeganistão";}s:2:"AG";a:1:{i:0;s:18:"Antígua e Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:8:"Albânia";}s:2:"AM";a:1:{i:0;s:8:"Armênia";}s:2:"AN";a:1:{i:0;s:19:"Antilhas Holandesas";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antártida";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:15:"Samoa Americana";}s:2:"AT";a:1:{i:0;s:8:"Ãustria";}s:2:"AU";a:1:{i:0;s:10:"Austrália";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:11:"Azerbaijão";}s:2:"BA";a:1:{i:0;s:20:"Bósnia-Herzegóvina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BE";a:1:{i:0;s:8:"Bélgica";}s:2:"BF";a:1:{i:0;s:13:"Burquina Faso";}s:2:"BG";a:1:{i:0;s:9:"Bulgária";}s:2:"BH";a:1:{i:0;s:7:"Bareine";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:8:"Bermudas";}s:2:"BN";a:1:{i:0;s:6:"Brunei";}s:2:"BO";a:1:{i:0;s:8:"Bolívia";}s:2:"BR";a:1:{i:0;s:6:"Brasil";}s:2:"BS";a:1:{i:0;s:7:"Bahamas";}s:2:"BT";a:1:{i:0;s:6:"Butão";}s:2:"BV";a:1:{i:0;s:11:"Ilha Bouvet";}s:2:"BW";a:1:{i:0;s:8:"Botsuana";}s:2:"BY";a:1:{i:0;s:7:"Belarus";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:7:"Canadá";}s:2:"CC";a:1:{i:0;s:21:"Ilhas Cocos (Keeling)";}s:2:"CD";a:1:{i:0;s:33:"Congo, República Democrática do";}s:2:"CF";a:1:{i:0;s:26:"República Centro-Africana";}s:2:"CG";a:1:{i:0;s:5:"Congo";}s:2:"CH";a:1:{i:0;s:7:"Suíça";}s:2:"CI";a:1:{i:0;s:15:"Costa do Marfim";}s:2:"CK";a:1:{i:0;s:10:"Ilhas Cook";}s:2:"CL";a:1:{i:0;s:5:"Chile";}s:2:"CM";a:1:{i:0;s:24:"República dos Camarões";}s:2:"CN";a:1:{i:0;s:5:"China";}s:2:"CO";a:1:{i:0;s:9:"Colômbia";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:4:"Cuba";}s:2:"CV";a:1:{i:0;s:10:"Cabo Verde";}s:2:"CX";a:1:{i:0;s:11:"Ilhas Natal";}s:2:"CY";a:1:{i:0;s:6:"Chipre";}s:2:"CZ";a:1:{i:0;s:17:"República Tcheca";}s:2:"DE";a:1:{i:0;s:8:"Alemanha";}s:2:"DJ";a:1:{i:0;s:7:
"Djibuti";}s:2:"DK";a:1:{i:0;s:9:"Dinamarca";}s:2:"DM";a:1:{i:0;s:8:"Dominica";}s:2:"DO";a:1:{i:0;s:21:"República Dominicana";}s:2:"DZ";a:1:{i:0;s:8:"Argélia";}s:2:"EC";a:1:{i:0;s:7:"Equador";}s:2:"EE";a:1:{i:0;s:8:"Estônia";}s:2:"EG";a:1:{i:0;s:5:"Egito";}s:2:"EH";a:1:{i:0;s:15:"Saara Ocidental";}s:2:"ER";a:1:{i:0;s:9:"Eritréia";}s:2:"ES";a:1:{i:0;s:7:"Espanha";}s:2:"ET";a:1:{i:0;s:8:"Etiópia";}s:2:"FI";a:1:{i:0;s:10:"Finlândia";}s:2:"FJ";a:1:{i:0;s:4:"Fiji";}s:2:"FK";a:1:{i:0;s:14:"Ilhas Malvinas";}s:2:"FM";a:1:{i:0;s:33:"Micronésia, Estados Federados da";}s:2:"FO";a:1:{i:0;s:11:"Ilhas Faroe";}s:2:"FR";a:1:{i:0;s:7:"França";}s:2:"GA";a:1:{i:0;s:6:"Gabão";}s:2:"GB";a:1:{i:0;s:11:"Reino Unido";}s:2:"GD";a:1:{i:0;s:7:"Granada";}s:2:"GE";a:1:{i:0;s:8:"Geórgia";}s:2:"GF";a:1:{i:0;s:15:"Guiana Francesa";}s:2:"GH";a:1:{i:0;s:4:"Gana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:12:"Groênlandia";}s:2:"GM";a:1:{i:0;s:7:"Gâmbia";}s:2:"GN";a:1:{i:0;s:6:"Guiné";}s:2:"GP";a:1:{i:0;s:9:"Guadalupe";}s:2:"GQ";a:1:{i:0;s:17:"Guiné Equatorial";}s:2:"GR";a:1:{i:0;s:7:"Grécia";}s:2:"GS";a:1:{i:0;s:39:"Geórgia do Sul e Ilhas Sandwich do Sul";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guiné Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guiana";}s:2:"HK";a:1:{i:0;s:43:"Hong Kong, Região Admin. Especial da China";}s:2:"HM";a:1:{i:0;s:27:"Ilha Heard e Ilhas McDonald";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:8:"Croácia";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:7:"Hungria";}s:2:"ID";a:1:{i:0;s:10:"Indonésia";}s:2:"IE";a:1:{i:0;s:7:"Irlanda";}s:2:"IL";a:1:{i:0;s:6:"Israel";}s:2:"IN";a:1:{i:0;s:6:"Ãndia";}s:2:"IO";a:1:{i:0;s:40:"Território Britânico do Oceano Ãndico";}s:2:"IQ";a:1:{i:0;s:6:"Iraque";}s:2:"IR";a:1:{i:0;s:4:"Irã";}s:2:"IS";a:1:{i:0;s:9:"Islândia";}s:2:"IT";a:1:{i:0;s:7:"Itália";}s:2:"JM";a:1:{i:0;s:7:"Jamaica";}s:2:"JO";a:1:{i:0;s:9:"Jordânia";}s:2:"JP";a:1:{i:0;s:6:"Japão";}s:2:"KE";a:1:{i:0;s:7:"Quênia";}s:2:"KG";a:1:{i:0;s:12
:"Quirguistão";}s:2:"KH";a:1:{i:0;s:7:"Camboja";}s:2:"KI";a:1:{i:0;s:9:"Quiribati";}s:2:"KM";a:1:{i:0;s:7:"Comores";}s:2:"KN";a:1:{i:0;s:23:"São Cristovão e Nevis";}s:2:"KP";a:1:{i:0;s:14:"Coréia, Norte";}s:2:"KR";a:1:{i:0;s:12:"Coréia, Sul";}s:2:"KW";a:1:{i:0;s:6:"Kuwait";}s:2:"KY";a:1:{i:0;s:12:"Ilhas Caiman";}s:2:"KZ";a:1:{i:0;s:12:"Casaquistão";}s:2:"LA";a:1:{i:0;s:38:"República Democrática Popular de Lao";}s:2:"LB";a:1:{i:0;s:7:"Líbano";}s:2:"LC";a:1:{i:0;s:12:"Santa Lúcia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:8:"Libéria";}s:2:"LS";a:1:{i:0;s:6:"Lesoto";}s:2:"LT";a:1:{i:0;s:9:"Lituânia";}s:2:"LU";a:1:{i:0;s:10:"Luxemburgo";}s:2:"LV";a:1:{i:0;s:8:"Letônia";}s:2:"LY";a:1:{i:0;s:6:"Líbia";}s:2:"MA";a:1:{i:0;s:8:"Marrocos";}s:2:"MC";a:1:{i:0;s:7:"Mônaco";}s:2:"MD";a:1:{i:0;s:22:"Moldova, República de";}s:2:"MG";a:1:{i:0;s:10:"Madagascar";}s:2:"MH";a:1:{i:0;s:14:"Ilhas Marshall";}s:2:"MK";a:1:{i:0;s:25:"Macedônia, República da";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Mianmá";}s:2:"MN";a:1:{i:0;s:9:"Mongólia";}s:2:"MO";a:1:{i:0;s:39:"Macau, Região Admin. Especial da China";}s:2:"MP";a:1:{i:0;s:23:"Ilhas Marianas do Norte";}s:2:"MQ";a:1:{i:0;s:9:"Martinica";}s:2:"MR";a:1:{i:0;s:11:"Mauritânia";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Maurício";}s:2:"MV";a:1:{i:0;s:8:"Maldivas";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:7:"México";}s:2:"MY";a:1:{i:0;s:8:"Malásia";}s:2:"MZ";a:1:{i:0;s:11:"Moçambique";}s:2:"NA";a:1:{i:0;s:8:"Namíbia";}s:2:"NC";a:1:{i:0;s:15:"Nova Caledônia";}s:2:"NE";a:1:{i:0;s:6:"Níger";}s:2:"NF";a:1:{i:0;s:12:"Ilha Norfolk";}s:2:"NG";a:1:{i:0;s:8:"Nigéria";}s:2:"NI";a:1:{i:0;s:10:"Nicarágua";}s:2:"NL";a:1:{i:0;s:14:"Países Baixos";}s:2:"NO";a:1:{i:0;s:7:"Noruega";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:14:"Nova Zelândia";}s:2:"OM";a:1:{i:0;s:4:"Omã";}s:2:"PA";a:1
:{i:0;s:7:"Panamá";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:19:"Polinésia Francesa";}s:2:"PG";a:1:{i:0;s:17:"Papua-Nova Guiné";}s:2:"PH";a:1:{i:0;s:9:"Filipinas";}s:2:"PK";a:1:{i:0;s:10:"Paquistão";}s:2:"PL";a:1:{i:0;s:8:"Polônia";}s:2:"PM";a:1:{i:0;s:23:"Saint Pierre e Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:10:"Porto Rico";}s:2:"PS";a:1:{i:0;s:24:"Território da Palestina";}s:2:"PT";a:1:{i:0;s:8:"Portugal";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguai";}s:2:"QA";a:1:{i:0;s:5:"Catar";}s:2:"RE";a:1:{i:0;s:8:"Reunião";}s:2:"RO";a:1:{i:0;s:8:"Romênia";}s:2:"RU";a:1:{i:0;s:7:"Rússia";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SA";a:1:{i:0;s:15:"Arábia Saudita";}s:2:"SB";a:1:{i:0;s:14:"Ilhas Salomão";}s:2:"SC";a:1:{i:0;s:10:"Seychelles";}s:2:"SD";a:1:{i:0;s:6:"Sudão";}s:2:"SE";a:1:{i:0;s:7:"Suécia";}s:2:"SG";a:1:{i:0;s:9:"Cingapura";}s:2:"SH";a:1:{i:0;s:12:"Santa Helena";}s:2:"SI";a:1:{i:0;s:10:"Eslovênia";}s:2:"SJ";a:1:{i:0;s:20:"Svalbard e Jan Mayen";}s:2:"SK";a:1:{i:0;s:11:"Eslováquia";}s:2:"SL";a:1:{i:0;s:10:"Serra Leoa";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:8:"Somália";}s:2:"SP";a:1:{i:0;s:7:"Sérvia";}s:2:"SR";a:1:{i:0;s:8:"Suriname";}s:2:"ST";a:1:{i:0;s:22:"São Tomé e Príncipe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:6:"Síria";}s:2:"SZ";a:1:{i:0;s:12:"Suazilândia";}s:2:"TC";a:1:{i:0;s:20:"Ilhas Turks e Caicos";}s:2:"TD";a:1:{i:0;s:5:"Chade";}s:2:"TF";a:1:{i:0;s:29:"Territórios Franceses do Sul";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:10:"Tailândia";}s:2:"TJ";a:1:{i:0;s:13:"Tadjiquistão";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:11:"Timor Leste";}s:2:"TM";a:1:{i:0;s:14:"Turcomenistão";}s:2:"TN";a:1:{i:0;s:8:"Tunísia";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:7:"Turquia";}s:2:"TT";a:1:{i:0;s:17:"Trinidad e Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Taiwan";}s:2:"TZ";a:1:{i:0;s:9:"Tanzânia";}s:2:"UA";a:1:{i:0;s:8:"Uc
rânia";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:42:"Ilhas Menores Distantes dos Estados Unidos";}s:2:"US";a:1:{i:0;s:14:"Estados Unidos";}s:2:"UY";a:1:{i:0;s:7:"Uruguai";}s:2:"UZ";a:1:{i:0;s:12:"Uzbequistão";}s:2:"VA";a:1:{i:0;s:8:"Vaticano";}s:2:"VC";a:1:{i:0;s:25:"São Vicente e Granadinas";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:25:"Ilhas Virgens Britânicas";}s:2:"VI";a:1:{i:0;s:21:"Ilhas Virgens dos EUA";}s:2:"VN";a:1:{i:0;s:7:"Vietnã";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:15:"Wallis e Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:6:"Iêmen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:11:"Iugoslávia";}s:2:"ZA";a:1:{i:0;s:14:"Ãfrica do Sul";}s:2:"ZM";a:1:{i:0;s:7:"Zâmbia";}s:2:"ZW";a:1:{i:0;s:9:"Zimbábwe";}}s:10:"Currencies";a:379:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:16:"Diner de Andorra";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:17:"Peseta de Andorra";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:34:"Dirém dos Emirados Ãrabes Unidos";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:19:"Afegane (1927-2002)";}s:3:"AFN";a:2:{i:0;s:3:"AFA";i:1;s:7:"Afegane";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:24:"Franco de Affars e Issas";}s:3:"ALL";a:2:{i:0;s:3:"ALL";i:1;s:12:"Lek Albanês";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:19:"Lek Valute Albanês";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:45:"Certificados de câmbio albaneses em dólares";}s:3:"AMD";a:2:{i:0;s:3:"AMD";i:1;s:13:"Dram Arménio";}s:3:"ANG";a:2:{i:0;s:3:"ANG";i:1;s:31:"Guilder das Antilhas Holandesas";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:15:"Cuanza angolano";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:27:"Cuanza angolano (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:32:"Cuanza novo angolano (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:38:"Cuanza angolano reajustado (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:15:"Escudo angolano";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:17:"Austral argentino";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:30:"Peso moneda nacional argentino";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:26:"Peso argentino (1983-1
985)";}s:3:"ARS";a:2:{i:0;s:3:"ARS";i:1;s:14:"Peso argentino";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:16:"Xelim austríaco";}s:3:"AUD";a:2:{i:0;s:3:"AUD";i:1;s:18:"Dólar australiano";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:17:"Libra australiana";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:16:"Guilder de Aruba";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:17:"Manat azerbaijano";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:29:"Dinar da Bósnia-Herzegóvina";}s:3:"BAM";a:2:{i:0;s:3:"BAM";i:1;s:39:"Marco bósnio-herzegóvino conversível";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:34:"Dinar novo da Bósnia-Herzegóvina";}s:3:"BBD";a:2:{i:0;s:3:"BBD";i:1;s:18:"Dólar de Barbados";}s:3:"BDT";a:2:{i:0;s:3:"BDT";i:1;s:18:"Taka de Bangladesh";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:27:"Franco belga (conversível)";}s:3:"BEF";a:2:{i:0;s:3:"BEF";i:1;s:12:"Franco belga";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:25:"Franco belga (financeiro)";}s:3:"BGL";a:2:{i:0;s:3:"BGL";i:1;s:18:"Lev forte búlgaro";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:23:"Lev socialista búlgaro";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:17:"Lev novo búlgaro";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:24:"Lev búlgaro (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:41:"Certificados de câmbio búlgaros em leva";}s:3:"BHD";a:2:{i:0;s:3:"BHD";i:1;s:15:"Dinar bareinita";}s:3:"BIF";a:2:{i:0;s:3:"BIF";i:1;s:17:"Franco do Burundi";}s:3:"BMD";a:2:{i:0;s:3:"BMD";i:1;s:19:"Dólar das Bermudas";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:18:"Libra das Bermudas";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:16:"Dólar do Brunei";}s:3:"BOB";a:2:{i:0;s:3:"BOB";i:1;s:9:"Boliviano";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:21:"Boliviano (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:14:"Peso boliviano";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:15:"Mvdol boliviano";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:35:"Cruzeiro novo brasileiro(1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:18:"Cruzado brasileiro";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:31:"Cruzeiro brasileiro (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:15:"Real brasileiro";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;
s:23:"Cruzado novo brasileiro";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:19:"Cruzeiro brasileiro";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:31:"Cruzeiro brasileiro (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:18:"Dólar das Bahamas";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:17:"Libra das Bahamas";}s:3:"BTN";a:2:{i:0;s:3:"BTN";i:1;s:18:"Ngultrum do Butão";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:15:"Rupia do Butão";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:14:"Kyat birmanês";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:15:"Rupia birmanesa";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:15:"Pula botsuanesa";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:34:"Rublo novo bielo-russo (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:29:"Rublo bielo-russo (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"BYR";i:1;s:17:"Rublo bielo-russo";}s:3:"BZD";a:2:{i:0;s:3:"BZD";i:1;s:16:"Dólar do Belize";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:29:"Dólar de Honduras Britânica";}s:3:"CAD";a:2:{i:0;s:3:"CAD";i:1;s:16:"Dólar canadense";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:16:"Franco congolês";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:29:"Franco da República do Congo";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:15:"Zaire congolês";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:40:"Franco da República Centro-Africana CFA";}s:3:"CHF";a:2:{i:0;s:3:"CHF";i:1;s:14:"Franco suíço";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:21:"Dólar das Ilhas Cook";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:14:"Condor chileno";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:14:"Escudo chileno";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:28:"Unidades de Fomento chilenas";}s:3:"CLP";a:2:{i:0;s:3:"CLP";i:1;s:12:"Peso chileno";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:24:"Franco dos Camarões CFA";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:25:"Jen Min Piao Yuan chinês";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:52:"Certificados de câmbio chineses em dólares dos EUA";}s:3:"CNY";a:2:{i:0;s:3:"CNY";i:1;s:21:"Yuan Renminbi chinês";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:24:"Peso de Papel colombiano";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:19:"Franco do Congo CFA";}s:3:"COP";a:2:{i:0;s:3:"COP";i:1;s:15:"Peso
 colombiano";}s:3:"CRC";a:2:{i:0;s:3:"CRC";i:1;s:19:"Colon da Costa Rica";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:18:"Coroa checoslovaca";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:24:"Coroa Forte checoslovaca";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:11:"Peso cubano";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:31:"Certificados de câmbio cubanos";}s:3:"CVE";a:2:{i:0;s:3:"CVE";i:1;s:20:"Escudo cabo-verdiano";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:19:"Guilder de Curaçau";}s:3:"CYP";a:2:{i:0;s:3:"CYP";i:1;s:15:"Libra de Chipre";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:25:"Coroa da República Checa";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:28:"Ostmark da Alemanha Oriental";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:13:"Marco alemão";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:17:"Sperrmark alemão";}s:3:"DJF";a:2:{i:0;s:3:"DJF";i:1;s:17:"Franco do Djibuti";}s:3:"DKK";a:2:{i:0;s:3:"DKK";i:1;s:18:"Coroa dinamarquesa";}s:3:"DOP";a:2:{i:0;s:3:"DOP";i:1;s:15:"Peso dominicano";}s:3:"DZD";a:2:{i:0;s:3:"DZD";i:1;s:14:"Dinar argelino";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:20:"Franco Novo argelino";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:24:"Franco Germinal argelino";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:17:"Sucre equatoriano";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:42:"Unidad de Valor Constante (UVC) do Equador";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:15:"Coroa estoniana";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:14:"Libra egípcia";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:18:"Nakfa da Eritréia";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:16:"Peseta espanhola";}s:3:"ETB";a:2:{i:0;s:3:"ETB";i:1;s:12:"Birr etíope";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:14:"Dólar etíope";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"Euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:16:"Marca finlandesa";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:28:"Marca finlandesa (1860-1962)";}s:3:"FJD";a:2:{i:0;s:3:"FJD";i:1;s:14:"Dólar de Fiji";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:13:"Libra de Fiji";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:18:"Libra das Malvinas";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:22:"Coroa das Ilhas Feroé";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:15:
"Franco francês";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:41:"Franco Germinal francês/Franco Poincaré";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:20:"Franco do Gabão CFA";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:26:"Libra esterlina britânica";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:20:"Cupom Lari georgiano";}s:3:"GEL";a:2:{i:0;s:3:"GEL";i:1;s:14:"Lari georgiano";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:12:"Cedi de Gana";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:19:"Cedi Antigo de Gana";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:13:"Libra de Gana";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:23:"Cedi reajustado de Gana";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:18:"Libra de Gibraltar";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:21:"Coroa de Groenlândia";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:17:"Dalasi de Gâmbia";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:16:"Libra de Gâmbia";}s:3:"GNF";a:2:{i:0;s:3:"GNF";i:1;s:16:"Franco de Guiné";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:28:"Franco de Guiné (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:14:"Syli de Guiné";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:19:"Franco de Guadalupe";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:27:"Ekwele de Guiné Equatorial";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:27:"Franco de Guiné Equatorial";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:36:"Peseta Guineana de Guiné Equatorial";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:12:"Dracma grego";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:17:"Dracma Novo grego";}s:3:"GTQ";a:2:{i:0;s:3:"GTQ";i:1;s:21:"Quetçal da Guatemala";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:25:"Franco da Guiana Francesa";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:27:"Escudo da Guiné Portuguesa";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:30:"Mil-réis da Guiné Portuguesa";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:21:"Peso da Guiné-Bissau";}s:3:"GYD";a:2:{i:0;s:3:"GYD";i:1;s:16:"Dólar da Guiana";}s:3:"HKD";a:2:{i:0;s:3:"HKD";i:1;s:19:"Dólar de Hong Kong";}s:3:"HNL";a:2:{i:0;s:3:"HNL";i:1;s:19:"Lempira de Honduras";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:12:"Dinar croata";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:11:"Kuna croata";}s:3:"HTG";a:2:{i:0;s:3:"HTG";
i:1;s:14:"Gurde do Haiti";}s:3:"HUF";a:2:{i:0;s:3:"HUF";i:1;s:16:"Forinte húngaro";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:25:"Libra da Irlanda do Norte";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:23:"Guilder Nica indonésio";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:21:"Rupia Java indonésia";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:21:"Rupia Nova indonésia";}s:3:"IDR";a:2:{i:0;s:3:"IDR";i:1;s:16:"Rupia indonésia";}s:3:"IEP";a:2:{i:0;s:3:"IEP";i:1;s:15:"Libra irlandesa";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:16:"Sheqel israelita";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:15:"Libra israelita";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:21:"Sheqel Novo israelita";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:30:"Libra esterlina da Ilha de Man";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:13:"Rupia indiana";}s:3:"IQD";a:2:{i:0;s:3:"IQD";i:1;s:15:"Dinar iraquiano";}s:3:"IRR";a:2:{i:0;s:3:"IRR";i:1;s:13:"Rial iraniano";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:15:"Coroa islandesa";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:13:"Lira italiana";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:25:"Libra esterlina de Jersey";}s:3:"JMD";a:2:{i:0;s:3:"JMD";i:1;s:16:"Dólar jamaicano";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:15:"Libra jamaicana";}s:3:"JOD";a:2:{i:0;s:3:"JOD";i:1;s:16:"Dinar jordaniano";}s:3:"JPY";a:2:{i:0;s:2:"¥";i:1;s:13:"Iene japonês";}s:3:"KES";a:2:{i:0;s:3:"KES";i:1;s:14:"Xelim queniano";}s:3:"KGS";a:2:{i:0;s:3:"KGS";i:1;s:19:"Som de Quirguistão";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:22:"Riel Antigo do Camboja";}s:3:"KHR";a:2:{i:0;s:3:"KHR";i:1;s:14:"Riel cambojano";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:19:"Dólar do Quiribati";}s:3:"KMF";a:2:{i:0;s:3:"KMF";i:1;s:17:"Franco de Comores";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:45:"Won da República Popular da Coréia do Norte";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:17:"Won norte-coreano";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:16:"Hwan sul-coreano";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:22:"Won Antigo sul-coreano";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:15:"Won sul-coreano";}s:3:"KWD";a:2:{i:0;s:3:"KWD";i:1;s:16:"Dinar coveitiano";}s:3:"KYD";a
:2:{i:0;s:3:"KYD";i:1;s:24:"Dólar das Ilhas Caimão";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:21:"Rublo do Cazaquistão";}s:3:"KZT";a:2:{i:0;s:3:"KZT";i:1;s:21:"Tenge do Cazaquistão";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:11:"Kip de Laos";}s:3:"LBP";a:2:{i:0;s:3:"LBP";i:1;s:14:"Libra libanesa";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:23:"Franco de Liechtenstein";}s:3:"LKR";a:2:{i:0;s:3:"LKR";i:1;s:18:"Rupia de Sri Lanka";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:16:"Rupia do Ceilão";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:16:"Dólar liberiano";}s:3:"LSL";a:2:{i:0;s:3:"LSL";i:1;s:14:"Loti de Lesoto";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:12:"Lita lituano";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:15:"Talonas lituano";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:20:"Franco luxemburguês";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:11:"Lats letão";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:12:"Rublo letão";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:44:"Lira líbia da Autoridade Militar Britânica";}s:3:"LYD";a:2:{i:0;s:3:"LYD";i:1;s:12:"Dinar líbio";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:12:"Libra líbia";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:17:"Dirém marroquino";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:17:"Franco marroquino";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:22:"Franco Novo de Mônaco";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:26:"Franco Germinal de Mônaco";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:19:"Cupom leu moldávio";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:16:"Leu de Moldávia";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:20:"Cupom rublo molávio";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:20:"Ariary de Madagascar";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:20:"Franco de Madagascar";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:25:"Dólar das Ilhas Marshall";}s:3:"MKD";a:2:{i:0;s:3:"MKD";i:1;s:16:"Dinar macedônio";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:28:"Dinar macedônio (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:14:"Franco de Mali";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:15:"Kyat de Mianmar";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:46:"Certificados de câmbio birmaneses em dólares";}s:3:"MNT";a:2:{i:0;s:3:"MNT";i:1;s:1
3:"Tugrik mongol";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:15:"Pataca macaense";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:19:"Franco da Martinica";}s:3:"MRO";a:2:{i:0;s:3:"MRO";i:1;s:22:"Ouguiya da Mauritânia";}s:3:"MTL";a:2:{i:0;s:3:"MTL";i:1;s:12:"Lira maltesa";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:13:"Libra maltesa";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:18:"Rupia de Maurício";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:24:"Rupia das Ilhas Maldivas";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:25:"Rupias das Ilhas Maldivas";}s:3:"MWK";a:2:{i:0;s:3:"MWK";i:1;s:17:"Cuacha do Maláui";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:16:"Libra do Maláui";}s:3:"MXN";a:2:{i:0;s:3:"MXN";i:1;s:13:"Peso mexicano";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:31:"Peso Plata mexicano (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:34:"Unidad de Inversion (UDI) mexicana";}s:3:"MYR";a:2:{i:0;s:3:"MYR";i:1;s:14:"Ringgit malaio";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:21:"Escudo de Moçambique";}s:3:"MZM";a:2:{i:0;s:3:"MZM";i:1;s:22:"Metical de Moçambique";}s:3:"NAD";a:2:{i:0;s:3:"NAD";i:1;s:18:"Dólar da Namíbia";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:34:"Franco Germinal da Nova Caledônia";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:15:"Naira nigeriana";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:15:"Libra nigeriana";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:30:"Franco CFP das Novas Hébridas";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:20:"Córdoba nicaraguano";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:25:"Córdoba Ouro nicaraguano";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:25:"Córdoba Ouro nicaraguano";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:17:"Guilder holandês";}s:3:"NOK";a:2:{i:0;s:3:"NOK";i:1;s:16:"Coroa norueguesa";}s:3:"NPR";a:2:{i:0;s:3:"NPR";i:1;s:14:"Rupia nepalesa";}s:3:"NZD";a:2:{i:0;s:3:"NZD";i:1;s:24:"Dólar da Nova Zelândia";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:23:"Libra da Nova Zelândia";}s:3:"OMR";a:2:{i:0;s:3:"OMR";i:1;s:12:"Rial de Omã";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:18:"Rial Saidi de Omã";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:16:"Balboa panamenho";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:29:"Cupom ru
blo de Transdniestria";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:28:"Rublo Novo de Transdniestria";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:23:"Rublo de Transdniestria";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:12:"Inti peruano";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:16:"Sol Novo peruano";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:11:"Sol peruano";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:25:"Kina da Papua-Nova Guiné";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:13:"Peso filipino";}s:3:"PKR";a:2:{i:0;s:3:"PKR";i:1;s:18:"Rupia paquistanesa";}s:3:"PLN";a:2:{i:0;s:3:"PLN";i:1;s:14:"Zloti polonês";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:45:"Certificados de câmbio poloneses em dólares";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:26:"Zloti polonês (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:15:"Libra palestina";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:16:"Conto português";}s:3:"PTE";a:2:{i:0;s:4:"Esc.";i:1;s:17:"Escudo português";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:17:"Guarani paraguaio";}s:3:"QAR";a:2:{i:0;s:3:"QAR";i:1;s:14:"Rial catariano";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:18:"Franco de Reunião";}s:3:"ROL";a:2:{i:0;s:3:"ROL";i:1;s:10:"Leu romeno";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:15:"Leu Novo romeno";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:11:"Rublo russo";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:23:"Rublo russo (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:15:"Franco ruandês";}s:3:"SAR";a:2:{i:0;s:3:"SAR";i:1;s:12:"Rial saudita";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:21:"Rial Soberano saudita";}s:3:"SBD";a:2:{i:0;s:3:"SBD";i:1;s:25:"Dólar das Ilhas Salomão";}s:3:"SCR";a:2:{i:0;s:3:"SCR";i:1;s:20:"Rupia das Seychelles";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:14:"Dinar sudanês";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:14:"Libra sudanesa";}s:3:"SEK";a:2:{i:0;s:3:"SEK";i:1;s:11:"Coroa sueca";}s:3:"SGD";a:2:{i:0;s:3:"SGD";i:1;s:19:"Dólar de Cingapura";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:21:"Libra de Santa Helena";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:19:"Tolar Bons esloveno";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:19:"Tolar Bons esloveno";}s:3:"SKK";a:2:{i:0;s:3:"SKK";i:1;s:14:"C
oroa eslovaca";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:19:"Leone de Serra Leoa";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:18:"Lira de San Marino";}s:3:"SOS";a:2:{i:0;s:3:"SOS";i:1;s:12:"Xelim somali";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:22:"Xelim de Somalilândia";}s:3:"SRG";a:2:{i:0;s:3:"SRG";i:1;s:19:"Guilder do Suriname";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:14:"Libra escocesa";}s:3:"STD";a:2:{i:0;s:3:"STD";i:1;s:31:"Dobra de São Tomé e Príncipe";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:32:"Escudo de São Tomé e Príncipe";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:21:"Rublo Novo soviético";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:16:"Rublo soviético";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:18:"Colom salvadorenho";}s:3:"SYP";a:2:{i:0;s:3:"SYP";i:1;s:12:"Libra síria";}s:3:"SZL";a:2:{i:0;s:3:"SZL";i:1;s:25:"Lilangeni da Suazilândia";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:24:"Coroa de Turcas e Caicos";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:19:"Franco CFA de Chade";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:15:"Baht tailandês";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:22:"Rublo do Tadjiquistão";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:15:"Somoni tadjique";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:23:"Manat do Turcomenistão";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:15:"Dinar tunisiano";}s:3:"TOP";a:2:{i:0;s:3:"TOP";i:1;s:17:"Paʻanga de Tonga";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:24:"Libra esterlina de Tonga";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:16:"Escudo timorense";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:16:"Pataca timorense";}s:3:"TRL";a:2:{i:0;s:3:"TRL";i:1;s:10:"Lira turca";}s:3:"TTD";a:2:{i:0;s:3:"TTD";i:1;s:27:"Dólar de Trinidad e Tobago";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:34:"Dólar Antigo de Trinidad e Tobago";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:16:"Dólar de Tuvalu";}s:3:"TWD";a:2:{i:0;s:3:"TWD";i:1;s:21:"Dólar Novo de Taiwan";}s:3:"TZS";a:2:{i:0;s:3:"TZS";i:1;s:18:"Xelim de Tanzânia";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:17:"Hryvnia ucraniano";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:21:"Karbovanetz ucraniano";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:27:"Xelim ugandense (196
6-1987)";}s:3:"UGX";a:2:{i:0;s:3:"UGX";i:1;s:15:"Xelim ugandense";}s:3:"USD";a:2:{i:0;s:1:"$";i:1;s:22:"Dólar norte-americano";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:37:"Dólar norte-americano (Dia seguinte)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:34:"Dólar norte-americano (Mesmo dia)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:20:"Peso Fuerte uruguaio";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:25:"Peso uruguaio (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"UYU";i:1;s:13:"Peso uruguaio";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:26:"Coupon Som do Usbequistão";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:19:"Sum do Usbequistão";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:26:"Lira da Cidade do Vaticano";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:37:"Piastre Dong Viet do Vietnã do Norte";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:29:"Dong Novo do Vietnã do Norte";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:47:"Viet Minh Piastre Dong Viet do Vietnã do Norte";}s:3:"VEB";a:2:{i:0;s:3:"VEB";i:1;s:20:"Bolívar venezuelano";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:36:"Dólar das Ilhas Virgens Britânicas";}s:3:"VND";a:2:{i:0;s:2:"đ";i:1;s:15:"Dong vietnamita";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:20:"Dong Novo vietnamita";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:29:"Dong da República do Vietnã";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:24:"Dong Nacional vietnamita";}s:3:"VUV";a:2:{i:0;s:3:"VUV";i:1;s:15:"Vatu de Vanuatu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:24:"Libra de Samoa Ocidental";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:23:"Tala de Samoa Ocidental";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:37:"Unidade de Conta asiática em dinares";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:15:"Franco CFA BEAC";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:28:"Unidade Monetária Asiática";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:4:"Ouro";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:26:"Unidade Composta Européia";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:28:"Unidade Monetária Européia";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:32:"Unidade de Conta Européia (XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:32:"Unidade de Conta Européia (XBD)";}s:3:"XCD";a:2:{i:0;s:3:"
XCD";i:1;s:25:"Dólar do Caribe Oriental";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:15:"Franco Novo CFA";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:26:"Direitos Especiais de Giro";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:17:"Franco CFA BCEAEC";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:28:"Unidade Monetária Européia";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:20:"Franco-ouro francês";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:19:"Franco UIC francês";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:15:"Dinar islâmico";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:34:"Franco Novo Metropolitano francês";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:33:"Franco CFA das Antilhas Francesas";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:16:"Franco CFA BCEAO";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:10:"Franco CFP";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:30:"Rublo transferível do COMECON";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:14:"Dinar iemenita";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:19:"Rial Imadi iemenita";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:13:"Rial iemenita";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:21:"Dinar forte iugoslavo";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:30:"Dinar da Federação Iugoslava";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:23:"Dinar iugoslavo de 1994";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:21:"Super Dinar iugoslavo";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:28:"Dinar conversível iugoslavo";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:26:"Dinar de outubro iugoslavo";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:25:"Dinar reformado iugoslavo";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:30:"Rand sul-africano (financeiro)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:18:"Libra sul-africana";}s:3:"ZAR";a:2:{i:0;s:3:"ZAR";i:1;s:17:"Rand sul-africano";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:15:"Cuacha zambiano";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:14:"Libra zambiana";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:19:"Zaire Novo zairense";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:14:"Zaire zairense";}s:3:"ZWD";a:2:{i:0;s:3:"ZWD";i:1;s:19:"Dólar do Zimbábwe";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:11:"Calendário";}s:9:"collation";a:1:{i:0;s:14:"Intercalação";}s:8:"c
urrency";a:1:{i:0;s:5:"Moeda";}}s:9:"Languages";a:452:{s:2:"aa";a:1:{i:0;s:4:"afar";}s:2:"ab";a:1:{i:0;s:9:"abkhazian";}s:3:"ace";a:1:{i:0;s:8:"achinese";}s:3:"ach";a:1:{i:0;s:5:"acoli";}s:3:"ada";a:1:{i:0;s:7:"adangme";}s:3:"ady";a:1:{i:0;s:6:"adyghe";}s:2:"ae";a:1:{i:0;s:9:"avéstico";}s:2:"af";a:1:{i:0;s:10:"africâner";}s:3:"afa";a:1:{i:0;s:23:"afro-asiático (outros)";}s:3:"afh";a:1:{i:0;s:8:"Afrihili";}s:2:"ak";a:1:{i:0;s:4:"Akan";}s:3:"akk";a:1:{i:0;s:8:"acadiano";}s:3:"ale";a:1:{i:0;s:7:"aleúte";}s:3:"alg";a:1:{i:0;s:20:"idiomas algonquianos";}s:2:"am";a:1:{i:0;s:8:"amárico";}s:2:"an";a:1:{i:0;s:9:"aragonês";}s:3:"ang";a:1:{i:0;s:34:"inglês, arcaico (aprox. 450-1100)";}s:3:"apa";a:1:{i:0;s:14:"idiomas apache";}s:2:"ar";a:1:{i:0;s:6:"árabe";}s:3:"arc";a:1:{i:0;s:8:"aramaico";}s:3:"arn";a:1:{i:0;s:8:"araucano";}s:3:"arp";a:1:{i:0;s:7:"arapaho";}s:3:"art";a:1:{i:0;s:20:"artificiais (outros)";}s:3:"arw";a:1:{i:0;s:8:"arauaqui";}s:2:"as";a:1:{i:0;s:8:"assamês";}s:3:"ast";a:1:{i:0;s:9:"asturiano";}s:3:"ath";a:1:{i:0;s:19:"idiomas atabascanos";}s:3:"aus";a:1:{i:0;s:20:"idiomas australianos";}s:2:"av";a:1:{i:0;s:6:"avaric";}s:3:"awa";a:1:{i:0;s:6:"Awadhi";}s:2:"ay";a:1:{i:0;s:6:"aimara";}s:2:"az";a:1:{i:0;s:11:"azerbaijano";}s:2:"ba";a:1:{i:0;s:7:"bashkir";}s:3:"bad";a:1:{i:0;s:5:"banda";}s:3:"bai";a:1:{i:0;s:18:"bamileke Languages";}s:3:"bal";a:1:{i:0;s:8:"balúchi";}s:3:"ban";a:1:{i:0;s:8:"balinês";}s:3:"bas";a:1:{i:0;s:4:"basa";}s:3:"bat";a:1:{i:0;s:18:"bálticos (outros)";}s:2:"be";a:1:{i:0;s:11:"bielo-russo";}s:3:"bej";a:1:{i:0;s:4:"beja";}s:3:"bem";a:1:{i:0;s:5:"bemba";}s:3:"ber";a:1:{i:0;s:7:"berbere";}s:2:"bg";a:1:{i:0;s:8:"búlgaro";}s:2:"bh";a:1:{i:0;s:5:"biari";}s:3:"bho";a:1:{i:0;s:8:"bhojpuri";}s:2:"bi";a:1:{i:0;s:8:"bislamá";}s:3:"bik";a:1:{i:0;s:5:"bikol";}s:3:"bin";a:1:{i:0;s:4:"bini";}s:3:"bla";a:1:{i:0;s:7:"siksika";}s:2:"bm";a:1:{i:0;s:7:"bambara";}s:2:"bn";a:1:{i:0;s:7:"bengali";}s:3:"bnt";a:1:{i:0;s:5:"banto";}s:2:"bo";a:1:{i:0;s:8:"tibetano";}s:2:"br";a:1:{i:0;s:7:"bretão";}s:3:"bra
";a:1:{i:0;s:4:"braj";}s:2:"bs";a:1:{i:0;s:7:"bósnio";}s:3:"btk";a:1:{i:0;s:7:"bataque";}s:3:"bua";a:1:{i:0;s:6:"Buriat";}s:3:"bug";a:1:{i:0;s:8:"Buginese";}s:3:"byn";a:1:{i:0;s:4:"Blin";}s:2:"ca";a:1:{i:0;s:8:"catalão";}s:3:"cad";a:1:{i:0;s:5:"caddo";}s:3:"cai";a:1:{i:0;s:37:"indígenas centro-americanos (outros)";}s:3:"car";a:1:{i:0;s:6:"caribe";}s:3:"cau";a:1:{i:0;s:20:"caucasianos (outros)";}s:2:"ce";a:1:{i:0;s:8:"chechene";}s:3:"ceb";a:1:{i:0;s:7:"cebuano";}s:3:"cel";a:1:{i:0;s:18:"célticos (outros)";}s:2:"ch";a:1:{i:0;s:8:"chamorro";}s:3:"chb";a:1:{i:0;s:7:"chibcha";}s:3:"chg";a:1:{i:0;s:8:"chagatai";}s:3:"chk";a:1:{i:0;s:8:"chuukese";}s:3:"chm";a:1:{i:0;s:4:"mari";}s:3:"chn";a:1:{i:0;s:14:"chinook jargon";}s:3:"cho";a:1:{i:0;s:7:"choctaw";}s:3:"chp";a:1:{i:0;s:9:"chipewyan";}s:3:"chr";a:1:{i:0;s:8:"cheroqui";}s:3:"chy";a:1:{i:0;s:7:"cheiene";}s:3:"cmc";a:1:{i:0;s:16:"chamic languages";}s:2:"co";a:1:{i:0;s:8:"córsico";}s:3:"cop";a:1:{i:0;s:5:"copta";}s:3:"cpe";a:1:{i:0;s:36:"crioulos e pídgin, inglês (outros)";}s:3:"cpf";a:1:{i:0;s:37:"crioulos e pídgin, francês (outros)";}s:3:"cpp";a:1:{i:0;s:39:"crioulos e pídgin, português (outros)";}s:2:"cr";a:1:{i:0;s:4:"cree";}s:3:"crh";a:1:{i:0;s:30:"crimean turkish; crimean tatar";}s:3:"crp";a:1:{i:0;s:28:"crioulos e pídgins (outros)";}s:2:"cs";a:1:{i:0;s:6:"tcheco";}s:3:"csb";a:1:{i:0;s:9:"kashubian";}s:2:"cu";a:1:{i:0;s:20:"eslavo eclesiástico";}s:3:"cus";a:1:{i:0;s:16:"cuxitas (outros)";}s:2:"cv";a:1:{i:0;s:7:"chuvash";}s:2:"cy";a:1:{i:0;s:6:"galês";}s:2:"da";a:1:{i:0;s:12:"dinamarquês";}s:3:"dak";a:1:{i:0;s:6:"dacota";}s:3:"dar";a:1:{i:0;s:6:"dargwa";}s:3:"day";a:1:{i:0;s:5:"dayak";}s:2:"de";a:1:{i:0;s:7:"alemão";}s:3:"del";a:1:{i:0;s:8:"delaware";}s:3:"den";a:1:{i:0;s:5:"slave";}s:3:"dgr";a:1:{i:0;s:6:"dogrib";}s:3:"din";a:1:{i:0;s:5:"dinka";}s:3:"doi";a:1:{i:0;s:5:"dogri";}s:3:"dra";a:1:{i:0;s:20:"dravídicos (outros)";}s:3:"dsb";a:1:{i:0;s:13:"Lower Sorbian";}s:3:"dua";a:1:{i:0;s:5:"duala";}s:3:"dum";a:1:{i:0;s:38:"holandês, medieval (aprox. 1
050-1350)";}s:2:"dv";a:1:{i:0;s:6:"divehi";}s:3:"dyu";a:1:{i:0;s:6:"diúla";}s:2:"dz";a:1:{i:0;s:6:"dzonga";}s:2:"ee";a:1:{i:0;s:3:"eve";}s:3:"efi";a:1:{i:0;s:6:"efique";}s:3:"egy";a:1:{i:0;s:18:"egípcio (arcaico)";}s:3:"eka";a:1:{i:0;s:6:"ekajuk";}s:2:"el";a:1:{i:0;s:5:"grego";}s:3:"elx";a:1:{i:0;s:7:"elamite";}s:2:"en";a:1:{i:0;s:7:"inglês";}s:3:"enm";a:1:{i:0;s:29:"inglês, medieval (1100-1500)";}s:2:"eo";a:1:{i:0;s:9:"esperanto";}s:2:"es";a:1:{i:0;s:8:"espanhol";}s:2:"et";a:1:{i:0;s:9:"estoniano";}s:2:"eu";a:1:{i:0;s:5:"basco";}s:3:"ewo";a:1:{i:0;s:6:"ewondo";}s:2:"fa";a:1:{i:0;s:5:"persa";}s:3:"fan";a:1:{i:0;s:6:"fangue";}s:3:"fat";a:1:{i:0;s:5:"fanti";}s:2:"ff";a:1:{i:0;s:4:"fula";}s:2:"fi";a:1:{i:0;s:10:"finlandês";}s:3:"fiu";a:1:{i:0;s:20:"ugro-finês (outros)";}s:2:"fj";a:1:{i:0;s:7:"fijiano";}s:2:"fo";a:1:{i:0;s:7:"feroês";}s:3:"fon";a:1:{i:0;s:3:"fom";}s:2:"fr";a:1:{i:0;s:8:"francês";}s:3:"frm";a:1:{i:0;s:36:"francês, medieval (aprox.1400-1600)";}s:3:"fro";a:1:{i:0;s:34:"francês, arcaico (842-aprox.1400)";}s:3:"fur";a:1:{i:0;s:8:"friulano";}s:2:"fy";a:1:{i:0;s:7:"frisão";}s:2:"ga";a:1:{i:0;s:9:"irlandês";}s:3:"gaa";a:1:{i:0;s:2:"ga";}s:3:"gay";a:1:{i:0;s:4:"gayo";}s:3:"gba";a:1:{i:0;s:5:"gbaia";}s:2:"gd";a:1:{i:0;s:17:"gaélico escocês";}s:3:"gem";a:1:{i:0;s:20:"germânicos (outros)";}s:3:"gez";a:1:{i:0;s:4:"geez";}s:3:"gil";a:1:{i:0;s:10:"gilbertês";}s:2:"gl";a:1:{i:0;s:6:"galego";}s:3:"gmh";a:1:{i:0;s:40:"alemão, medieval alto (aprox.1050-1500)";}s:2:"gn";a:1:{i:0;s:7:"guarani";}s:3:"goh";a:1:{i:0;s:38:"alemão, arcaico alto (aprox.750-1050)";}s:3:"gon";a:1:{i:0;s:5:"gondi";}s:3:"gor";a:1:{i:0;s:9:"gorontalo";}s:3:"got";a:1:{i:0;s:7:"gótico";}s:3:"grb";a:1:{i:0;s:5:"Gerbo";}s:3:"grc";a:1:{i:0;s:26:"grego, arcaico (até 1453)";}s:2:"gu";a:1:{i:0;s:8:"guzerate";}s:2:"gv";a:1:{i:0;s:4:"manx";}s:3:"gwi";a:1:{i:0;s:9:"gwichʻin";}s:2:"ha";a:1:{i:0;s:7:"hauçá";}s:3:"hai";a:1:{i:0;s:5:"haida";}s:3:"haw";a:1:{i:0;s:8:"havaiano";}s:2:"he";a:1:{i:0;s:8:"hebraico";}s:2:"hi";a:1:{i:0;s:5:"hindi";}
s:3:"hil";a:1:{i:0;s:10:"hiligaynon";}s:3:"him";a:1:{i:0;s:9:"himachali";}s:3:"hit";a:1:{i:0;s:6:"hitita";}s:3:"hmn";a:1:{i:0;s:5:"hmong";}s:2:"ho";a:1:{i:0;s:9:"hiri motu";}s:2:"hr";a:1:{i:0;s:6:"croata";}s:3:"hsb";a:1:{i:0;s:13:"upper sorbian";}s:2:"ht";a:1:{i:0;s:8:"haitiano";}s:2:"hu";a:1:{i:0;s:8:"húngaro";}s:3:"hup";a:1:{i:0;s:4:"hupa";}s:2:"hy";a:1:{i:0;s:8:"armênio";}s:2:"hz";a:1:{i:0;s:6:"herero";}s:2:"ia";a:1:{i:0;s:12:"interlíngua";}s:3:"iba";a:1:{i:0;s:4:"Iban";}s:2:"id";a:1:{i:0;s:10:"indonésio";}s:2:"ie";a:1:{i:0;s:11:"interlingue";}s:2:"ig";a:1:{i:0;s:3:"ibo";}s:2:"ii";a:1:{i:0;s:10:"sichuan yi";}s:2:"ik";a:1:{i:0;s:7:"Inupiaq";}s:3:"ilo";a:1:{i:0;s:7:"ilocano";}s:3:"inc";a:1:{i:0;s:17:"índicos (outros)";}s:3:"ine";a:1:{i:0;s:22:"indo-europeus (outros)";}s:3:"inh";a:1:{i:0;s:7:"inguche";}s:2:"io";a:1:{i:0;s:3:"ido";}s:3:"ira";a:1:{i:0;s:8:"iraniano";}s:3:"iro";a:1:{i:0;s:17:"idiomas iroqueses";}s:2:"is";a:1:{i:0;s:9:"islandês";}s:2:"it";a:1:{i:0;s:8:"italiano";}s:2:"iu";a:1:{i:0;s:9:"inuktitut";}s:2:"ja";a:1:{i:0;s:8:"japonês";}s:3:"jbo";a:1:{i:0;s:6:"lojban";}s:3:"jpr";a:1:{i:0;s:13:"judaico-persa";}s:3:"jrb";a:1:{i:0;s:16:"judaico-arábico";}s:2:"ka";a:1:{i:0;s:9:"georgiano";}s:3:"kaa";a:1:{i:0;s:11:"kara-Kalpak";}s:3:"kab";a:1:{i:0;s:6:"kabyle";}s:3:"kac";a:1:{i:0;s:6:"kachin";}s:3:"kam";a:1:{i:0;s:5:"kamba";}s:3:"kar";a:1:{i:0;s:5:"karen";}s:3:"kaw";a:1:{i:0;s:4:"kawi";}s:3:"kbd";a:1:{i:0;s:9:"kabardian";}s:2:"kg";a:1:{i:0;s:9:"congolês";}s:3:"kha";a:1:{i:0;s:5:"khasi";}s:3:"khi";a:1:{i:0;s:15:"khoisan (other)";}s:3:"kho";a:1:{i:0;s:9:"khotanese";}s:2:"ki";a:1:{i:0;s:7:"quicuio";}s:2:"kj";a:1:{i:0;s:8:"Kuanyama";}s:2:"kk";a:1:{i:0;s:7:"cazaque";}s:2:"kl";a:1:{i:0;s:12:"groenlandês";}s:2:"km";a:1:{i:0;s:4:"cmer";}s:3:"kmb";a:1:{i:0;s:9:"quimbundo";}s:2:"kn";a:1:{i:0;s:8:"canarês";}s:2:"ko";a:1:{i:0;s:7:"coreano";}s:3:"kok";a:1:{i:0;s:7:"concani";}s:3:"kos";a:1:{i:0;s:8:"kosraean";}s:3:"kpe";a:1:{i:0;s:6:"kpelle";}s:2:"kr";a:1:{i:0;s:7:"canúri";}s:3:"krc";a:1:{i:0;s:15:"karachay-Balkar
";}s:3:"kro";a:1:{i:0;s:3:"kru";}s:3:"kru";a:1:{i:0;s:6:"kurukh";}s:2:"ks";a:1:{i:0;s:8:"kashmiri";}s:2:"ku";a:1:{i:0;s:5:"curdo";}s:3:"kum";a:1:{i:0;s:5:"kumyk";}s:3:"kut";a:1:{i:0;s:7:"kutenai";}s:2:"kv";a:1:{i:0;s:4:"komi";}s:2:"kw";a:1:{i:0;s:8:"córnico";}s:2:"ky";a:1:{i:0;s:8:"quirguiz";}s:2:"la";a:1:{i:0;s:5:"latim";}s:3:"lad";a:1:{i:0;s:6:"ladino";}s:3:"lah";a:1:{i:0;s:6:"lahnda";}s:3:"lam";a:1:{i:0;s:5:"lamba";}s:2:"lb";a:1:{i:0;s:13:"luxemburguês";}s:3:"lez";a:1:{i:0;s:8:"lezghian";}s:2:"lg";a:1:{i:0;s:7:"luganda";}s:2:"li";a:1:{i:0;s:10:"limburgish";}s:2:"ln";a:1:{i:0;s:7:"lingala";}s:2:"lo";a:1:{i:0;s:8:"laosiano";}s:3:"lol";a:1:{i:0;s:5:"mongo";}s:3:"loz";a:1:{i:0;s:4:"lozi";}s:2:"lt";a:1:{i:0;s:7:"lituano";}s:2:"lu";a:1:{i:0;s:12:"luba-catanga";}s:3:"lua";a:1:{i:0;s:10:"luba-Lulua";}s:3:"lui";a:1:{i:0;s:7:"luiseno";}s:3:"lun";a:1:{i:0;s:5:"lunda";}s:3:"lus";a:1:{i:0;s:6:"lushai";}s:2:"lv";a:1:{i:0;s:6:"letão";}s:3:"mad";a:1:{i:0;s:8:"madurês";}s:3:"mag";a:1:{i:0;s:6:"magahi";}s:3:"mai";a:1:{i:0;s:8:"maithili";}s:3:"mak";a:1:{i:0;s:7:"makasar";}s:3:"man";a:1:{i:0;s:8:"mandinga";}s:3:"map";a:1:{i:0;s:12:"austronésio";}s:3:"mas";a:1:{i:0;s:6:"massai";}s:3:"mdf";a:1:{i:0;s:5:"mocsa";}s:3:"mdr";a:1:{i:0;s:6:"mandar";}s:3:"men";a:1:{i:0;s:5:"mende";}s:2:"mg";a:1:{i:0;s:7:"malgaxe";}s:3:"mga";a:1:{i:0;s:30:"irlandês, medieval (900-1200)";}s:2:"mh";a:1:{i:0;s:11:"marshallês";}s:2:"mi";a:1:{i:0;s:5:"maori";}s:3:"mic";a:1:{i:0;s:10:"miquemaque";}s:3:"min";a:1:{i:0;s:11:"minangkabau";}s:3:"mis";a:1:{i:0;s:16:"idiomas diversos";}s:2:"mk";a:1:{i:0;s:10:"macedônio";}s:3:"mkh";a:1:{i:0;s:17:"mon-khmer (other)";}s:2:"ml";a:1:{i:0;s:8:"malaiala";}s:2:"mn";a:1:{i:0;s:6:"mongol";}s:3:"mnc";a:1:{i:0;s:6:"manchu";}s:3:"mni";a:1:{i:0;s:8:"manipuri";}s:3:"mno";a:1:{i:0;s:16:"manobo languages";}s:2:"mo";a:1:{i:0;s:9:"moldávio";}s:3:"moh";a:1:{i:0;s:6:"mohawk";}s:3:"mos";a:1:{i:0;s:5:"mossi";}s:2:"mr";a:1:{i:0;s:6:"marata";}s:2:"ms";a:1:{i:0;s:6:"malaio";}s:2:"mt";a:1:{i:0;s:7:"maltês";}s:3:"mul";a:1:{i:0;s:18:"idi
omas múltiplos";}s:3:"mun";a:1:{i:0;s:13:"idiomas munda";}s:3:"mus";a:1:{i:0;s:5:"creek";}s:3:"mwr";a:1:{i:0;s:7:"marwari";}s:2:"my";a:1:{i:0;s:9:"birmanês";}s:3:"myn";a:1:{i:0;s:4:"maia";}s:3:"myv";a:1:{i:0;s:5:"erzya";}s:2:"na";a:1:{i:0;s:8:"nauruano";}s:3:"nah";a:1:{i:0;s:8:"náuatle";}s:3:"nai";a:1:{i:0;s:36:"indígenas norte-americanos (outros)";}s:3:"nap";a:1:{i:0;s:10:"napolitano";}s:2:"nb";a:1:{i:0;s:18:"bokmål norueguês";}s:2:"nd";a:1:{i:0;s:14:"ndebele, north";}s:3:"nds";a:1:{i:0;s:26:"alto alemão; baixo saxão";}s:2:"ne";a:1:{i:0;s:6:"nepali";}s:3:"new";a:1:{i:0;s:6:"newari";}s:2:"ng";a:1:{i:0;s:5:"dongo";}s:3:"nia";a:1:{i:0;s:4:"nias";}s:3:"nic";a:1:{i:0;s:27:"niger - kordofanian (other)";}s:3:"niu";a:1:{i:0;s:7:"niueano";}s:2:"nl";a:1:{i:0;s:9:"holandês";}s:2:"nn";a:1:{i:0;s:18:"nynorsk norueguês";}s:2:"no";a:1:{i:0;s:10:"norueguês";}s:3:"nog";a:1:{i:0;s:5:"nogai";}s:3:"non";a:1:{i:0;s:10:"norse, old";}s:2:"nr";a:1:{i:0;s:14:"ndebele, south";}s:3:"nso";a:1:{i:0;s:18:"soto, setentrional";}s:3:"nub";a:1:{i:0;s:15:"idiomas núbios";}s:2:"nv";a:1:{i:0;s:6:"navajo";}s:2:"ny";a:1:{i:0;s:23:"nianja; chicheua; cheua";}s:3:"nym";a:1:{i:0;s:8:"nyamwezi";}s:3:"nyn";a:1:{i:0;s:8:"nyankole";}s:3:"nyo";a:1:{i:0;s:5:"nyoro";}s:3:"nzi";a:1:{i:0;s:5:"nzima";}s:2:"oc";a:1:{i:0;s:36:"occitânico (após 1500); provençal";}s:2:"oj";a:1:{i:0;s:6:"ojibwa";}s:2:"om";a:1:{i:0;s:5:"oromo";}s:2:"or";a:1:{i:0;s:5:"oriya";}s:2:"os";a:1:{i:0;s:7:"ossetic";}s:3:"osa";a:1:{i:0;s:5:"osage";}s:3:"ota";a:1:{i:0;s:26:"turco, otomano (1500-1928)";}s:3:"oto";a:1:{i:0;s:16:"idiomas otomanos";}s:2:"pa";a:1:{i:0;s:7:"panjabi";}s:3:"paa";a:1:{i:0;s:17:"papuanos (outros)";}s:3:"pag";a:1:{i:0;s:10:"pangasinã";}s:3:"pal";a:1:{i:0;s:7:"pálavi";}s:3:"pam";a:1:{i:0;s:8:"pampanga";}s:3:"pap";a:1:{i:0;s:10:"papiamento";}s:3:"pau";a:1:{i:0;s:8:"palauano";}s:3:"peo";a:1:{i:0;s:35:"persa arcaico (aprox. 600-400 a.C.)";}s:3:"phi";a:1:{i:0;s:18:"filipinos (outros)";}s:3:"phn";a:1:{i:0;s:8:"fenício";}s:2:"pi";a:1:{i:0;s:5:"páli";}s:2:"pl";a:1
:{i:0;s:8:"polonês";}s:3:"pon";a:1:{i:0;s:9:"pohnpeian";}s:3:"pra";a:1:{i:0;s:17:"idiomas prácrito";}s:3:"pro";a:1:{i:0;s:31:"provençal, arcaico (até 1500)";}s:2:"ps";a:1:{i:0;s:15:"pashto (pushto)";}s:2:"pt";a:1:{i:0;s:10:"português";}s:2:"qu";a:1:{i:0;s:8:"quíchua";}s:3:"raj";a:1:{i:0;s:9:"rajastani";}s:3:"rap";a:1:{i:0;s:7:"rapanui";}s:3:"rar";a:1:{i:0;s:11:"rarotongano";}s:2:"rm";a:1:{i:0;s:14:"rhaeto-romance";}s:2:"rn";a:1:{i:0;s:5:"rundi";}s:2:"ro";a:1:{i:0;s:6:"romeno";}s:3:"roa";a:1:{i:0;s:17:"romances (outros)";}s:3:"rom";a:1:{i:0;s:6:"romani";}s:2:"ru";a:1:{i:0;s:5:"russo";}s:2:"rw";a:1:{i:0;s:11:"kinyarwanda";}s:2:"sa";a:1:{i:0;s:10:"sânscrito";}s:3:"sad";a:1:{i:0;s:7:"sandawe";}s:3:"sah";a:1:{i:0;s:6:"iacuto";}s:3:"sai";a:1:{i:0;s:34:"indígenas sul-americanos (outros)";}s:3:"sal";a:1:{i:0;s:18:"salishan languages";}s:3:"sam";a:1:{i:0;s:19:"aramaico samaritano";}s:3:"sas";a:1:{i:0;s:5:"sasak";}s:3:"sat";a:1:{i:0;s:7:"santali";}s:2:"sc";a:1:{i:0;s:5:"sardo";}s:3:"sco";a:1:{i:0;s:8:"escocês";}s:2:"sd";a:1:{i:0;s:5:"sindi";}s:2:"se";a:1:{i:0;s:13:"northern sami";}s:3:"sel";a:1:{i:0;s:6:"selkup";}s:3:"sem";a:1:{i:0;s:19:"semíticos (outros)";}s:2:"sg";a:1:{i:0;s:5:"sango";}s:3:"sga";a:1:{i:0;s:29:"irlandês, arcaico (até 900)";}s:3:"sgn";a:1:{i:0;s:19:"linguages de sinais";}s:2:"sh";a:1:{i:0;s:12:"servo-croata";}s:3:"shn";a:1:{i:0;s:4:"shan";}s:2:"si";a:1:{i:0;s:9:"cingalês";}s:3:"sid";a:1:{i:0;s:6:"sidamo";}s:3:"sio";a:1:{i:0;s:13:"idiomas sioux";}s:3:"sit";a:1:{i:0;s:23:"sino-tibetanos (outros)";}s:2:"sk";a:1:{i:0;s:8:"eslovaco";}s:2:"sl";a:1:{i:0;s:10:"eslovênio";}s:2:"so";a:1:{i:0;s:6:"somali";}s:3:"sog";a:1:{i:0;s:7:"sogdien";}s:3:"son";a:1:{i:0;s:6:"songai";}s:2:"sq";a:1:{i:0;s:8:"albanês";}s:2:"sr";a:1:{i:0;s:7:"sérvio";}s:3:"srr";a:1:{i:0;s:6:"serere";}s:2:"ss";a:1:{i:0;s:5:"swati";}s:3:"ssa";a:1:{i:0;s:23:"nilo-saarianos (outros)";}s:2:"st";a:1:{i:0;s:12:"soto, do sul";}s:2:"su";a:1:{i:0;s:9:"sundanês";}s:3:"suk";a:1:{i:0;s:6:"sukuma";}s:3:"sus";a:1:{i:0;s:5:"sosso";}s:3:"sux";a:1:{
i:0;s:8:"sumério";}s:2:"sv";a:1:{i:0;s:5:"sueco";}s:2:"sw";a:1:{i:0;s:7:"suaíli";}s:3:"syr";a:1:{i:0;s:8:"siríaco";}s:2:"ta";a:1:{i:0;s:6:"tâmil";}s:3:"tai";a:1:{i:0;s:12:"tai (outros)";}s:2:"te";a:1:{i:0;s:6:"telugu";}s:3:"tem";a:1:{i:0;s:5:"timne";}s:3:"ter";a:1:{i:0;s:6:"tereno";}s:3:"tet";a:1:{i:0;s:6:"tétum";}s:2:"tg";a:1:{i:0;s:8:"tadjique";}s:2:"th";a:1:{i:0;s:10:"tailandês";}s:2:"ti";a:1:{i:0;s:9:"tigrínia";}s:3:"tig";a:1:{i:0;s:6:"tigré";}s:2:"tk";a:1:{i:0;s:9:"turcomano";}s:3:"tkl";a:1:{i:0;s:11:"toquelauano";}s:3:"tli";a:1:{i:0;s:9:"tlinguite";}s:3:"tmh";a:1:{i:0;s:9:"tamaxeque";}s:2:"tn";a:1:{i:0;s:6:"tswana";}s:2:"to";a:1:{i:0;s:19:"tonga (ilhas tonga)";}s:3:"tog";a:1:{i:0;s:16:"toganês (Nyasa)";}s:3:"tpi";a:1:{i:0;s:9:"tok pisin";}s:2:"tr";a:1:{i:0;s:5:"turco";}s:2:"ts";a:1:{i:0;s:6:"tsonga";}s:3:"tsi";a:1:{i:0;s:9:"tsimshian";}s:2:"tt";a:1:{i:0;s:5:"tatar";}s:3:"tum";a:1:{i:0;s:7:"tumbuka";}s:3:"tup";a:1:{i:0;s:12:"idiomas tupi";}s:3:"tut";a:1:{i:0;s:17:"altaicos (outros)";}s:3:"tvl";a:1:{i:0;s:9:"tuvaluano";}s:2:"tw";a:1:{i:0;s:3:"twi";}s:2:"ty";a:1:{i:0;s:8:"taitiano";}s:3:"tyv";a:1:{i:0;s:8:"tuvinian";}s:3:"udm";a:1:{i:0;s:6:"udmurt";}s:2:"ug";a:1:{i:0;s:6:"uighur";}s:3:"uga";a:1:{i:0;s:10:"ugarítico";}s:2:"uk";a:1:{i:0;s:9:"ucraniano";}s:3:"umb";a:1:{i:0;s:7:"umbundu";}s:3:"und";a:1:{i:0;s:13:"indeterminado";}s:2:"ur";a:1:{i:0;s:4:"urdu";}s:2:"uz";a:1:{i:0;s:7:"usbeque";}s:2:"ve";a:1:{i:0;s:5:"venda";}s:2:"vi";a:1:{i:0;s:10:"vietnamita";}s:2:"vo";a:1:{i:0;s:9:"volapuque";}s:3:"vot";a:1:{i:0;s:5:"votic";}s:2:"wa";a:1:{i:0;s:7:"walloon";}s:3:"wak";a:1:{i:0;s:18:"wakashan languages";}s:3:"wal";a:1:{i:0;s:6:"walamo";}s:3:"war";a:1:{i:0;s:5:"waray";}s:3:"was";a:1:{i:0;s:5:"washo";}s:3:"wen";a:1:{i:0;s:17:"sorbian languages";}s:2:"wo";a:1:{i:0;s:6:"uolofe";}s:3:"xal";a:1:{i:0;s:6:"kalmyk";}s:2:"xh";a:1:{i:0;s:4:"xosa";}s:3:"yao";a:1:{i:0;s:3:"iao";}s:3:"yap";a:1:{i:0;s:6:"yapese";}s:2:"yi";a:1:{i:0;s:8:"iídiche";}s:2:"yo";a:1:{i:0;s:6:"ioruba";}s:3:"ypk";a:1:{i:0;s:16:"idiomas iúpique";}s
:2:"za";a:1:{i:0;s:6:"zhuang";}s:3:"zap";a:1:{i:0;s:8:"zapoteca";}s:3:"zen";a:1:{i:0;s:6:"zenaga";}s:2:"zh";a:1:{i:0;s:7:"chinês";}s:3:"znd";a:1:{i:0;s:5:"zande";}s:2:"zu";a:1:{i:0;s:4:"zulu";}s:3:"zun";a:1:{i:0;s:5:"zunhi";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Scripts";a:56:{s:4:"Arab";a:1:{i:0;s:6:"árabe";}s:4:"Armn";a:1:{i:0;s:8:"armênio";}s:4:"Beng";a:1:{i:0;s:7:"bengali";}s:4:"Bopo";a:1:{i:0;s:8:"bopomofo";}s:4:"Brai";a:1:{i:0;s:6:"braile";}s:4:"Buhd";a:1:{i:0;s:5:"buhid";}s:4:"Cans";a:1:{i:0;s:42:"símbolos aborígenes do Canadá Unificado";}s:4:"Cher";a:1:{i:0;s:8:"cheroqui";}s:4:"Copt";a:1:{i:0;s:8:"cóptico";}s:4:"Cprt";a:1:{i:0;s:8:"cipriota";}s:4:"Cyrl";a:1:{i:0;s:9:"cirílico";}s:4:"Deva";a:1:{i:0;s:11:"devanágari";}s:4:"Dsrt";a:1:{i:0;s:7:"deseret";}s:4:"Ethi";a:1:{i:0;s:9:"etiópico";}s:4:"Geor";a:1:{i:0;s:9:"georgiano";}s:4:"Goth";a:1:{i:0;s:7:"gótico";}s:4:"Grek";a:1:{i:0;s:5:"grego";}s:4:"Gujr";a:1:{i:0;s:8:"gujerati";}s:4:"Guru";a:1:{i:0;s:8:"gurmuqui";}s:4:"Hang";a:1:{i:0;s:6:"hangul";}s:4:"Hani";a:1:{i:0;s:3:"han";}s:4:"Hano";a:1:{i:0;s:7:"hanunoo";}s:4:"Hans";a:1:{i:0;s:16:"han simplificado";}s:4:"Hant";a:1:{i:0;s:15:"han tradicional";}s:4:"Hebr";a:1:{i:0;s:8:"hebraico";}s:4:"Hira";a:1:{i:0;s:8:"hiragana";}s:4:"Ital";a:1:{i:0;s:15:"itálico antigo";}s:4:"Kana";a:1:{i:0;s:8:"katakana";}s:4:"Khmr";a:1:{i:0;s:5:"khmer";}s:4:"Knda";a:1:{i:0;s:7:"kannada";}s:4:"Laoo";a:1:{i:0;s:3:"lao";}s:4:"Latn";a:1:{i:0;s:5:"latim";}s:4:"Limb";a:1:{i:0;s:5:"limbu";}s:4:"Linb";a:1:{i:0;s:8:"b linear";}s:4:"Mlym";a:1:{i:0;s:8:"malaiala";}s:4:"Mong";a:1:{i:0;s:6:"mongol";}s:4:"Mymr";a:1:{i:0;s:7:"myanmar";}s:4:"Ogam";a:1:{i:0;s:8:"ogâmico";}s:4:"Orya";a:1:{i:0;s:5:"oriya";}s:4:"Osma";a:1:{i:0;s:7:"osmanya";}s:4:"Qaai";a:1:{i:0;s:7:"herdado";}s:4:"Runr";a:1:{i:0;s:7:"rúnico";}s:4:"Shaw";a:1:{i:0;s:8:"shaviano";}s:4:"Sinh
";a:1:{i:0;s:9:"cingalês";}s:4:"Syrc";a:1:{i:0;s:8:"siríaco";}s:4:"Tagb";a:1:{i:0;s:8:"tagbanwa";}s:4:"Tale";a:1:{i:0;s:6:"tai Le";}s:4:"Taml";a:1:{i:0;s:6:"tâmil";}s:4:"Telu";a:1:{i:0;s:7:"télugu";}s:4:"Tglg";a:1:{i:0;s:6:"tagalo";}s:4:"Thaa";a:1:{i:0;s:6:"thaana";}s:4:"Thai";a:1:{i:0;s:10:"tailandês";}s:4:"Tibt";a:1:{i:0;s:8:"tibetano";}s:4:"Ugar";a:1:{i:0;s:10:"ugarítico";}s:4:"Yiii";a:1:{i:0;s:2:"yi";}s:4:"Zyyy";a:1:{i:0;s:5:"comum";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:19:"Calendário Budista";}s:7:"chinese";a:1:{i:0;s:19:"Calendário Chinês";}s:9:"gregorian";a:1:{i:0;s:22:"Calendário Gregoriano";}s:6:"hebrew";a:1:{i:0;s:20:"Calendário Hebraico";}s:7:"islamic";a:1:{i:0;s:21:"Calendário Islâmico";}s:13:"islamic-civil";a:1:{i:0;s:27:"Calendário Civil Islâmico";}s:8:"japanese";a:1:{i:0;s:20:"Calendário Japonês";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:12:"Ordem Direta";}s:9:"phonebook";a:1:{i:0;s:26:"Ordem de Lista Telefônica";}s:6:"pinyin";a:1:{i:0;s:13:"Ordem Pin-yin";}s:6:"stroke";a:1:{i:0;s:17:"Ordem dos Traços";}s:11:"traditional";a:1:{i:0;s:17:"Ordem Tradicional";}}}s:8:"Variants";a:1:{s:7:"REVISED";a:1:{i:0;s:8:"Revisado";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:17:"HH'H'mm'm'ss's' z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:27:"EEEE, d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"d/MMM/yyyy";i:7;s:10:"dd-MM-yyyy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:3:"dom";i:1;s:3:"seg";i:2;s:3:"ter";i:3;s:3:"qua";i:4;s:3:"qui";i:5;s:3:"sex";i:6;s:4:"sáb";}s:6:"narrow";a:7:{i:0;s:1:"D";i:1;s:1:"S";i:2;s:1:"T";i:3;s:1:"Q";i:4;s:1:"Q";i:5;s:1:"S";i:6;s:1:"S";}s:4:"wide";a:7:{i:0;s:7:"domingo";i:1;s:13:"segunda-feira";i:2;s:12:"terça-feira";i:3;s:12:"quarta-feira";i:4;s:12:"quinta-feira";i:5;s:11:"sexta-feira";i:6;s:7:"sábado";}}}s:4:"eras";a:1:{s:11:"abbr
eviated";a:2:{i:0;s:4:"a.C.";i:1;s:4:"d.C.";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:3:"jan";i:1;s:3:"fev";i:2;s:3:"mar";i:3;s:3:"abr";i:4;s:3:"mai";i:5;s:3:"jun";i:6;s:3:"jul";i:7;s:3:"ago";i:8;s:3:"set";i:9;s:3:"out";i:10;s:3:"nov";i:11;s:3:"dez";}s:6:"narrow";a:12:{i:0;s:1:"J";i:1;s:1:"F";i:2;s:1:"M";i:3;s:1:"A";i:4;s:1:"M";i:5;s:1:"J";i:6;s:1:"J";i:7;s:1:"A";i:8;s:1:"S";i:9;s:1:"O";i:10;s:1:"N";i:11;s:1:"D";}s:4:"wide";a:12:{i:0;s:7:"janeiro";i:1;s:9:"fevereiro";i:2;s:6:"março";i:3;s:5:"abril";i:4;s:4:"maio";i:5;s:5:"junho";i:6;s:5:"julho";i:7;s:6:"agosto";i:8;s:8:"setembro";i:9;s:7:"outubro";i:10;s:8:"novembro";i:11;s:8:"dezembro";}}}}}s:11:"zoneStrings";a:17:{i:0;a:6:{i:0;s:19:"America/Los_Angeles";i:1;s:29:"Horário Padrão do Pacífico";i:2;s:3:"PST";i:3;s:31:"Horário de Verão do Pacífico";i:4;s:3:"PDT";i:5;s:11:"Los Angeles";}i:1;a:6:{i:0;s:14:"America/Denver";i:1;s:25:"Horário Padrão Montanha";i:2;s:3:"MST";i:3;s:27:"Horário de Verão Montanha";i:4;s:3:"MDT";i:5;s:6:"Denver";}i:2;a:6:{i:0;s:15:"America/Phoenix";i:1;s:25:"Horário Padrão Montanha";i:2;s:3:"MST";i:3;s:25:"Horário Padrão Montanha";i:4;s:3:"MST";i:5;s:7:"Phoenix";}i:3;a:6:{i:0;s:15:"America/Chicago";i:1;s:24:"Horário Padrão Central";i:2;s:3:"CST";i:3;s:26:"Horário de Verão Central";i:4;s:3:"CDT";i:5;s:7:"Chicago";}i:4;a:6:{i:0;s:16:"America/New_York";i:1;s:25:"Horário Padrão Oriental";i:2;s:3:"EST";i:3;s:27:"Horário de Verão Oriental";i:4;s:3:"EDT";i:5;s:11:"Nova Iorque";}i:5;a:6:{i:0;s:20:"America/Indianapolis";i:1;s:25:"Horário Padrão Oriental";i:2;s:3:"EST";i:3;s:25:"Horário Padrão Oriental";i:4;s:3:"EST";i:5;s:13:"Indianápolis";}i:6;a:6:{i:0;s:16:"Pacific/Honolulu";i:1;s:26:"Horário Padrão do Havaí";i:2;s:3:"HST";i:3;s:26:"Horário Padrão do Havaí";i:4;s:3:"HST";i:5;s:8:"Honolulu";}i:7;a:6:{i:0;s:17:"America/Anchorage";i:1;s:26:"Horário Padrão do Alasca";i:2;s:3:"AST";i:3;s:28:"Horário de Verão do Alasca";i:4;s:3:"ADT";i:5;s:9:"Anchorage";}i:8;a:6:{i:0;s:15:"America/Halifa
x";i:1;s:27:"Horário Padrão Atlântico";i:2;s:3:"AST";i:3;s:29:"Horário de Verão Atlântico";i:4;s:3:"ADT";i:5;s:7:"Halifax";}i:9;a:6:{i:0;s:16:"America/St_Johns";i:1;s:30:"Horário Padrão de Terra Nova";i:2;s:3:"CNT";i:3;s:32:"Horário de Verão de Terra Nova";i:4;s:3:"CDT";i:5;s:9:"St. Johns";}i:10;a:6:{i:0;s:12:"Europe/Paris";i:1;s:31:"Horário Padrão Europa Central";i:2;s:3:"CET";i:3;s:33:"Horário de Verão Europa Central";i:4;s:4:"CEST";i:5;s:5:"Paris";}i:11;a:6:{i:0;s:7:"Etc/GMT";i:1;s:34:"Horário do Meridiano de Greenwich";i:2;s:3:"GMT";i:3;s:34:"Horário do Meridiano de Greenwich";i:4;s:3:"GMT";i:5;s:7:"Londres";}i:12;a:6:{i:0;s:17:"Africa/Casablanca";i:1;s:34:"Horário do Meridiano de Greenwich";i:2;s:3:"GMT";i:3;s:34:"Horário do Meridiano de Greenwich";i:4;s:3:"GMT";i:5;s:10:"Casablanca";}i:13;a:6:{i:0;s:14:"Asia/Jerusalem";i:1;s:26:"Horário Padrão de Israel";i:2;s:3:"IST";i:3;s:28:"Horário de Verão de Israel";i:4;s:3:"IDT";i:5;s:10:"Jerusalém";}i:14;a:6:{i:0;s:10:"Asia/Tokyo";i:1;s:26:"Horário Padrão do Japão";i:2;s:3:"JST";i:3;s:26:"Horário Padrão do Japão";i:4;s:3:"JST";i:5;s:7:"Tóquio";}i:15;a:6:{i:0;s:16:"Europe/Bucharest";i:1;s:35:"Horário Padrão da Europa Oriental";i:2;s:3:"EET";i:3;s:37:"Horário de Verão da Europa Oriental";i:4;s:4:"EEST";i:5;s:9:"Bucareste";}i:16;a:6:{i:0;s:13:"Asia/Shanghai";i:1;s:25:"Horário Padrão da China";i:2;s:3:"CTT";i:3;s:25:"Horário Padrão da China";i:4;s:3:"CDT";i:5;s:6:"Xangai";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pt_BR.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pt_BR.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pt_BR.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:19:"HH'h'mm'min'ss's' z";i:1;s:16:"H'h'm'min's's' z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:27:"EEEE, d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"dd/MM/yyyy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pt_PT.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pt_PT.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/pt_PT.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:6:{s:9:"Countries";a:59:{s:2:"AE";a:1:{i:0;s:23:"Emiratos Ãrabes Unidos";}s:2:"AM";a:1:{i:0;s:8:"Arménia";}s:2:"AQ";a:1:{i:0;s:11:"Antárctica";}s:2:"AZ";a:1:{i:0;s:11:"Azerbeijão";}s:2:"BA";a:1:{i:0;s:19:"Bósnia-Herzegovina";}s:2:"BJ";a:1:{i:0;s:5:"Benim";}s:2:"BY";a:1:{i:0;s:13:"Bielorrússia";}s:2:"CM";a:1:{i:0;s:9:"Camarões";}s:2:"CX";a:1:{i:0;s:13:"Ilha do Natal";}s:2:"CZ";a:1:{i:0;s:16:"República Checa";}s:2:"EE";a:1:{i:0;s:8:"Estónia";}s:2:"EG";a:1:{i:0;s:6:"Egipto";}s:2:"EH";a:1:{i:0;s:16:"Sahara Ocidental";}s:2:"ER";a:1:{i:0;s:8:"Eritreia";}s:2:"FK";a:1:{i:0;s:14:"Ilhas Falkland";}s:2:"GL";a:1:{i:0;s:12:"Gronelândia";}s:2:"GS";a:1:{i:0;s:36:"Ilhas South Georgia e South Sandwich";}s:2:"GW";a:1:{i:0;s:13:"Guiné-Bissau";}s:2:"HK";a:1:{i:0;s:52:"Hong Kong - Região Administrativa Especial da China";}s:2:"KE";a:1:{i:0;s:7:"Quénia";}s:2:"KG";a:1:{i:0;s:14:"Quirguizistão";}s:2:"KN";a:1:{i:0;s:19:"Saint Kitts e Nevis";}s:2:"KP";a:1:{i:0;s:15:"Coreia do Norte";}s:2:"KR";a:1:{i:0;s:13:"Coreia do Sul";}s:2:"KY";a:1:{i:0;s:13:"Ilhas Caimão";}s:2:"KZ";a:1:{i:0;s:12:"Cazaquistão";}s:2:"LA";a:1:{i:0;s:36:"Lao, República Popular Democrática";}s:2:"LV";a:1:{i:0;s:8:"Letónia";}s:2:"MC";a:1:{i:0;s:7:"Mónaco";}s:2:"MD";a:1:{i:0;s:24:"Moldávia, República da";}s:2:"MG";a:1:{i:0;s:11:"Madagáscar";}s:2:"MK";a:1:{i:0;s:25:"Macedónia, República da";}s:2:"MO";a:1:{i:0;s:48:"Macau - Região Administrativa Especial da China";}s:2:"MP";a:1:{i:0;s:22:"Ilhas Mariana do Norte";}s:2:"MU";a:1:{i:0;s:10:"Maurícias";}s:2:"NC";a:1:{i:0;s:15:"Nova Caledónia";}s:2:"PG";a:1:{i:0;s:17:"Papua Nova Guiné";}s:2:"PL";a:1:{i:0;s:8:"Polónia";}s:2:"PS";a:1:{i:0;s:24:"Território Palestiniano";}s:2:"RE";a:1:{i:0;s:7:"Reunion";}s:2:"RO";a:1:{i:0;s:8:"Roménia";}s:2:"SC";a:1:{i:0;s:9:"Seicheles";}s:2:"SG";a:1:{i:0;s:9:"Singapura";}s:2:"SI";a:1:{i:0;s:10:"Eslovénia";}s:2:"SM";a:1:{i:0;s:11:"São Marino";}s:2:"TC";a:1:{i:0;s:21:"Ilhas Turcas e Caicos";}s:2:"TD";a:1:{i:0;s:6:"Tchade";}s:2:"TF";a:1:{i:0;s:28:"Territórios Frances
es a Sul";}s:2:"TJ";a:1:{i:0;s:12:"Tajiquistão";}s:2:"TM";a:1:{i:0;s:15:"Turquemenistão";}s:2:"UM";a:1:{i:0;s:28:"Ilhas Minor Outlying (E.U.A)";}s:2:"UZ";a:1:{i:0;s:12:"Uzbaquistão";}s:2:"VA";a:1:{i:0;s:40:"Santa Sé (Estado da Cidade do Vaticano)";}s:2:"VC";a:1:{i:0;s:26:"Saint Vincent e Grenadines";}s:2:"VG";a:1:{i:0;s:24:"Ilhas Virgin Britânicas";}s:2:"VI";a:1:{i:0;s:19:"Ilhas Virgin E.U.A.";}s:2:"VN";a:1:{i:0;s:8:"Vietname";}s:2:"YE";a:1:{i:0;s:6:"Iémen";}s:2:"YU";a:1:{i:0;s:11:"Jugoslávia";}}s:10:"Currencies";a:1:{s:3:"PTE";a:3:{i:0;s:4:"Esc.";i:1;s:17:"Escudo português";i:2;a:3:{i:0;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:1;s:1:"$";i:2;s:1:",";}}}s:9:"Languages";a:4:{s:2:"cs";a:1:{i:0;s:5:"checo";}s:2:"et";a:1:{i:0;s:8:"estónio";}s:2:"pl";a:1:{i:0;s:6:"polaco";}s:2:"sl";a:1:{i:0;s:8:"esloveno";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:17:"HH'H'mm'm'ss's' z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:27:"EEEE, d' de 'MMMM' de 'yyyy";i:5;s:21:"d' de 'MMMM' de 'yyyy";i:6;s:10:"yyyy/MM/dd";i:7;s:8:"yy/MM/dd";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ro.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ro.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ro.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:8:{s:9:"Countries";a:239:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:21:"Emiratele Arabe Unite";}s:2:"AF";a:1:{i:0;s:10:"Afganistan";}s:2:"AG";a:1:{i:0;s:19:"Antigua şi Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:7:"Albania";}s:2:"AM";a:1:{i:0;s:7:"Armenia";}s:2:"AN";a:1:{i:0;s:17:"Antilele Olandeze";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarctica";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:16:"Samoa Americană";}s:2:"AT";a:1:{i:0;s:7:"Austria";}s:2:"AU";a:1:{i:0;s:9:"Australia";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:11:"Azerbaidjan";}s:2:"BA";a:1:{i:0;s:22:"Bosnia şi Herzegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BE";a:1:{i:0;s:6:"Belgia";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:8:"Bulgaria";}s:2:"BH";a:1:{i:0;s:7:"Bahrain";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:6:"Brunei";}s:2:"BO";a:1:{i:0;s:7:"Bolivia";}s:2:"BR";a:1:{i:0;s:8:"Brazilia";}s:2:"BS";a:1:{i:0;s:7:"Bahamas";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BV";a:1:{i:0;s:13:"Insula Bouvet";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:10:"Bielorusia";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Canada";}s:2:"CC";a:1:{i:0;s:24:"Insulele Cocos (Keeling)";}s:2:"CD";a:1:{i:0;s:29:"Congo, Republica Democratică";}s:2:"CF";a:1:{i:0;s:27:"Republica Central Africană";}s:2:"CG";a:1:{i:0;s:5:"Congo";}s:2:"CH";a:1:{i:0;s:9:"Eleveţia";}s:2:"CI";a:1:{i:0;s:17:"Coasta de Fildeş";}s:2:"CK";a:1:{i:0;s:13:"Insulele Cook";}s:2:"CL";a:1:{i:0;s:5:"Chile";}s:2:"CM";a:1:{i:0;s:7:"Camerun";}s:2:"CN";a:1:{i:0;s:5:"China";}s:2:"CO";a:1:{i:0;s:8:"Columbia";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:4:"Cuba";}s:2:"CV";a:1:{i:0;s:11:"Capul Verde";}s:2:"CX";a:1:{i:0;s:16:"Insula Christmas";}s:2:"CY";a:1:{i:0;s:5:"Cipru";}s:2:"CZ";a:1:{i:0;s:15:"Republica Cehă";}s:2:"DE";a:1:{i:0;s:8:"Germania";}s:2:"DJ";a:1:{i:0;s:8:"Djibouti";}s:2:
"DK";a:1:{i:0;s:9:"Danemarca";}s:2:"DM";a:1:{i:0;s:8:"Dominica";}s:2:"DO";a:1:{i:0;s:21:"Republica Dominicană";}s:2:"DZ";a:1:{i:0;s:7:"Algeria";}s:2:"EC";a:1:{i:0;s:7:"Ecuador";}s:2:"EE";a:1:{i:0;s:7:"Estonia";}s:2:"EG";a:1:{i:0;s:5:"Egipt";}s:2:"EH";a:1:{i:0;s:14:"Sahara de Vest";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:6:"Spania";}s:2:"ET";a:1:{i:0;s:7:"Etiopia";}s:2:"FI";a:1:{i:0;s:8:"Finlanda";}s:2:"FJ";a:1:{i:0;s:4:"Fiji";}s:2:"FK";a:1:{i:0;s:17:"Insulele Falkland";}s:2:"FM";a:1:{i:0;s:28:"Micronezia, Statele Federate";}s:2:"FO";a:1:{i:0;s:14:"Insulele Feroe";}s:2:"FR";a:1:{i:0;s:7:"Franţa";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:12:"Regatul Unit";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:7:"Georgia";}s:2:"GF";a:1:{i:0;s:16:"Guyana Franceză";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:10:"Groenlanda";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:7:"Guineea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:20:"Guineea Ecuatorială";}s:2:"GR";a:1:{i:0;s:6:"Grecia";}s:2:"GS";a:1:{i:0;s:41:"Insulele South Georgia şi South Sandwich";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:14:"Guineea-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:25:"R.A.S. Hong Kong a Chinei";}s:2:"HM";a:1:{i:0;s:34:"Insula Heard şi Insulele McDonald";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:8:"Croaţia";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:7:"Ungaria";}s:2:"ID";a:1:{i:0;s:9:"Indonezia";}s:2:"IE";a:1:{i:0;s:7:"Irlanda";}s:2:"IL";a:1:{i:0;s:6:"Israel";}s:2:"IN";a:1:{i:0;s:5:"India";}s:2:"IO";a:1:{i:0;s:40:"Teritoriile Britanice din Oceanul Indian";}s:2:"IQ";a:1:{i:0;s:4:"Iraq";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:7:"Islanda";}s:2:"IT";a:1:{i:0;s:6:"Italia";}s:2:"JM";a:1:{i:0;s:7:"Jamaica";}s:2:"JO";a:1:{i:0;s:8:"Iordania";}s:2:"JP";a:1:{i:0;s:7:"Japonia";}s:2:"KE";a:1:{i:0;s:5:"Kenya";}s:2:"KG";a:1:{i:0;s:9:"Kirghizia";}s:2:"KH";a:1:{i:0;s:9:"Cam
bodgia";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:7:"Comoros";}s:2:"KN";a:1:{i:0;s:21:"Saint Kitts şi Nevis";}s:2:"KP";a:1:{i:0;s:14:"Coreea de Nord";}s:2:"KR";a:1:{i:0;s:13:"Coreea de Sud";}s:2:"KW";a:1:{i:0;s:6:"Kuweit";}s:2:"KY";a:1:{i:0;s:15:"Insulele Cayman";}s:2:"KZ";a:1:{i:0;s:9:"Kazahstan";}s:2:"LA";a:1:{i:0;s:37:"Lao, Republica Democratică Populară";}s:2:"LB";a:1:{i:0;s:5:"Liban";}s:2:"LC";a:1:{i:0;s:11:"Saint Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberia";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:8:"Lituania";}s:2:"LU";a:1:{i:0;s:9:"Luxemburg";}s:2:"LV";a:1:{i:0;s:7:"Letonia";}s:2:"LY";a:1:{i:0;s:24:"Libia, Jamahiriya Arabă";}s:2:"MA";a:1:{i:0;s:5:"Maroc";}s:2:"MC";a:1:{i:0;s:6:"Monaco";}s:2:"MD";a:1:{i:0;s:18:"Moldova, Republica";}s:2:"MG";a:1:{i:0;s:10:"Madagascar";}s:2:"MH";a:1:{i:0;s:17:"Insulele Marshall";}s:2:"MK";a:1:{i:0;s:9:"Macedonia";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:8:"Mongolia";}s:2:"MO";a:1:{i:0;s:21:"R.A.S. Macao a Chinei";}s:2:"MP";a:1:{i:0;s:25:"Insulele Northern Mariana";}s:2:"MQ";a:1:{i:0;s:9:"Martinica";}s:2:"MR";a:1:{i:0;s:10:"Mauritania";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:7:"Maldive";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:5:"Mexic";}s:2:"MY";a:1:{i:0;s:8:"Malaezia";}s:2:"MZ";a:1:{i:0;s:8:"Mozambic";}s:2:"NA";a:1:{i:0;s:7:"Namibia";}s:2:"NC";a:1:{i:0;s:14:"Noua Caledonie";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:16:"Insulele Norfolk";}s:2:"NG";a:1:{i:0;s:7:"Nigeria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:6:"Olanda";}s:2:"NO";a:1:{i:0;s:8:"Norvegia";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:14:"Noua Zeelandă";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:19:"Polinezia France
ză";}s:2:"PG";a:1:{i:0;s:17:"Papua Noua Guinee";}s:2:"PH";a:1:{i:0;s:8:"Filipine";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:7:"Polonia";}s:2:"PM";a:1:{i:0;s:25:"Saint Pierre şi Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:10:"Porto Rico";}s:2:"PS";a:1:{i:0;s:22:"Teritoriul Palestinian";}s:2:"PT";a:1:{i:0;s:10:"Portugalia";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Qatar";}s:2:"RE";a:1:{i:0;s:7:"Reunion";}s:2:"RO";a:1:{i:0;s:8:"România";}s:2:"RU";a:1:{i:0;s:16:"Federaţia Rusă";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:15:"Arabia Saudită";}s:2:"SB";a:1:{i:0;s:16:"Insulele Solomon";}s:2:"SC";a:1:{i:0;s:10:"Seychelles";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:6:"Suedia";}s:2:"SG";a:1:{i:0;s:9:"Singapore";}s:2:"SH";a:1:{i:0;s:12:"Saint Helena";}s:2:"SI";a:1:{i:0;s:8:"Slovenia";}s:2:"SJ";a:1:{i:0;s:22:"Svalbard şi Jan Mayen";}s:2:"SK";a:1:{i:0;s:8:"Slovacia";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:7:"Somalia";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:21:"Sao Tome şi Principe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:5:"Siria";}s:2:"SZ";a:1:{i:0;s:9:"Swaziland";}s:2:"TC";a:1:{i:0;s:25:"Insulele Turks şi Caicos";}s:2:"TD";a:1:{i:0;s:4:"Ciad";}s:2:"TF";a:1:{i:0;s:27:"Teritoriile Franceze de Sud";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:8:"Tailanda";}s:2:"TJ";a:1:{i:0;s:11:"Tadjikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:14:"Timorul de Est";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:7:"Tunisia";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:6:"Turcia";}s:2:"TT";a:1:{i:0;s:19:"Trinidad şi Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TZ";a:1:{i:0;s:8:"Tanzania";}s:2:"UA";a:1:{i:0;s:7:"Ucraina";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:36:"United States Minor Outlying Islands";}s:2:"US";a:1:{i:0;s:13:"Stat
ele Unite";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:10:"Uzbekistan";}s:2:"VA";a:1:{i:0;s:31:"Sfântul Scaun (Statul Vatican)";}s:2:"VC";a:1:{i:0;s:28:"Saint Vincent şi Grenadines";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:26:"Insulele Virgine Britanice";}s:2:"VI";a:1:{i:0;s:23:"Insulele Virgine S.U.A.";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:17:"Wallis şi Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Yemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:10:"Iugoslavia";}s:2:"ZA";a:1:{i:0;s:13:"Africa de Sud";}s:2:"ZM";a:1:{i:0;s:6:"Zambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:1:{s:3:"ROL";a:2:{i:0;s:3:"lei";i:1;s:3:"ROL";}}s:9:"Languages";a:30:{s:2:"ar";a:1:{i:0;s:6:"Arabă";}s:2:"bg";a:1:{i:0;s:8:"Bulgară";}s:2:"cs";a:1:{i:0;s:5:"Cehă";}s:2:"da";a:1:{i:0;s:7:"Daneză";}s:2:"de";a:1:{i:0;s:8:"Germană";}s:2:"el";a:1:{i:0;s:7:"Greacă";}s:2:"en";a:1:{i:0;s:8:"Engleză";}s:2:"es";a:1:{i:0;s:9:"Spaniolă";}s:2:"et";a:1:{i:0;s:10:"Estoniană";}s:2:"fi";a:1:{i:0;s:11:"Finlandeză";}s:2:"fr";a:1:{i:0;s:9:"Franceză";}s:2:"he";a:1:{i:0;s:8:"Ebraică";}s:2:"hr";a:1:{i:0;s:7:"Croată";}s:2:"hu";a:1:{i:0;s:9:"Maghiară";}s:2:"it";a:1:{i:0;s:9:"Italiană";}s:2:"ja";a:1:{i:0;s:9:"Japoneză";}s:2:"ko";a:1:{i:0;s:9:"Coreeană";}s:2:"lt";a:1:{i:0;s:11:"Lituaniană";}s:2:"lv";a:1:{i:0;s:7:"Letonă";}s:2:"nl";a:1:{i:0;s:9:"Olandeză";}s:2:"no";a:1:{i:0;s:11:"Norvegiană";}s:2:"pl";a:1:{i:0;s:9:"Poloneză";}s:2:"pt";a:1:{i:0;s:11:"Portugheză";}s:2:"ro";a:1:{i:0;s:8:"Română";}s:2:"ru";a:1:{i:0;s:5:"Rusă";}s:2:"sk";a:1:{i:0;s:8:"Slovacă";}s:2:"sl";a:1:{i:0;s:8:"Slovenă";}s:2:"sv";a:1:{i:0;s:8:"Suedeză";}s:2:"tr";a:1:{i:0;s:6:"Turcă";}s:2:"zh";a:1:{i:0;s:8:"Chineză";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i
:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:11:"d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd.MM.yyyy";i:7;s:10:"dd.MM.yyyy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:1:"D";i:1;s:1:"L";i:2;s:2:"Ma";i:3;s:2:"Mi";i:4;s:1:"J";i:5;s:1:"V";i:6;s:1:"S";}s:4:"wide";a:7:{i:0;s:9:"duminică";i:1;s:4:"luni";i:2;s:6:"marţi";i:3;s:8:"miercuri";i:4;s:3:"joi";i:5;s:6:"vineri";i:6;s:10:"sîmbătă";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:4:"d.C.";i:1;s:7:"î.d.C.";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"Ian";i:1;s:3:"Feb";i:2;s:3:"Mar";i:3;s:3:"Apr";i:4;s:3:"Mai";i:5;s:3:"Iun";i:6;s:3:"Iul";i:7;s:3:"Aug";i:8;s:3:"Sep";i:9;s:3:"Oct";i:10;s:3:"Nov";i:11;s:3:"Dec";}s:4:"wide";a:12:{i:0;s:8:"ianuarie";i:1;s:9:"februarie";i:2;s:6:"martie";i:3;s:7:"aprilie";i:4;s:3:"mai";i:5;s:5:"iunie";i:6;s:5:"iulie";i:7;s:6:"august";i:8;s:10:"septembrie";i:9;s:9:"octombrie";i:10;s:9:"noiembrie";i:11;s:9:"decembrie";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ro_RO.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ro_RO.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ro_RO.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/root.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/root.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/root.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:11:{s:10:"Currencies";a:6:{s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:3:"EUR";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:3:"GBP";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:3:"INR";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:3:"ITL";}s:3:"JPY";a:2:{i:0;s:2:"¥";i:1;s:3:"JPY";}s:3:"USD";a:2:{i:0;s:1:"$";i:1;s:3:"USD";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Zyyy";}s:21:"MeasurementSystem:int";a:1:{i:0;i:0;}s:14:"NumberElements";a:12:{i:0;s:1:".";i:1;s:1:",";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"¤ #,##0.00;-¤ #,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:19:"PaperSize:intvector";a:2:{i:0;i:297;i:1;i:210;}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:10:"boundaries";a:5:{s:8:"grapheme";a:1:{i:0;s:4:"char";}s:4:"line";a:1:{i:0;s:4:"line";}s:8:"sentence";a:1:{i:0;s:4:"sent";}s:5:"title";a:1:{i:0;s:5:"title";}s:4:"word";a:1:{i:0;s:4:"word";}}s:8:"calendar";a:8:{s:8:"buddhist";a:2:{s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:20:"EEEE, MMMM d, yyyy G";i:5;s:14:"MMMM d, yyyy G";i:6;s:13:"MMM d, yyyy G";i:7;s:8:"M/d/yyyy";i:8;s:7:"{1} {0}";}s:4:"eras";a:1:{s:11:"abbreviated";a:1:{i:0;s:2:"BE";}}}s:7:"chinese";a:2:{s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:15:"EEEE y'x'G-Ml-d";i:5;s:10:"y'x'G-Ml-d";i:6;s:10:"y'x'G-Ml-d";i:7;s:10:"y'x'G-Ml-d";i:8;s:7:"{1} {0}";}s:11:"isLeapMonth";a:2:{i:0;s:0:"";i:1;s:1:"*";}}s:7:"default";a:1:{i:0;s:9:"gregorian";}s:9:"gregorian";a:7:{s:11:"AmPmMarkers";a:2:{i:0;s:2:"AM";i:1;s:2:"PM";}s:26:"DateTimeElements:intvector";a:2:{i:0;i:1;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:18:"EEEE, yyyy MMMM dd";i:5;s:11:"yyyy MMMM d";i:6;s:10:"yyyy MMM d";i:7;s:8:"yy/MM/dd";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:3:{s:7:"default";a:1:{i:0;s:6:"format";}s
:6:"format";a:4:{s:11:"abbreviated";a:7:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";i:5;s:1:"6";i:6;s:1:"7";}s:7:"default";a:1:{i:0;s:4:"wide";}s:6:"narrow";a:7:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";i:5;s:1:"6";i:6;s:1:"7";}s:4:"wide";a:7:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";i:5;s:1:"6";i:6;s:1:"7";}}s:11:"stand-alone";a:4:{s:11:"abbreviated";a:7:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";i:5;s:1:"6";i:6;s:1:"7";}s:7:"default";a:1:{i:0;s:4:"wide";}s:6:"narrow";a:7:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";i:5;s:1:"6";i:6;s:1:"7";}s:4:"wide";a:7:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";i:5;s:1:"6";i:6;s:1:"7";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:3:"BCE";i:1;s:2:"CE";}}s:10:"monthNames";a:3:{s:7:"default";a:1:{i:0;s:6:"format";}s:6:"format";a:4:{s:11:"abbreviated";a:12:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";i:5;s:1:"6";i:6;s:1:"7";i:7;s:1:"8";i:8;s:1:"9";i:9;s:2:"10";i:10;s:2:"11";i:11;s:2:"12";}s:7:"default";a:1:{i:0;s:4:"wide";}s:6:"narrow";a:12:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";i:5;s:1:"6";i:6;s:1:"7";i:7;s:1:"8";i:8;s:1:"9";i:9;s:2:"10";i:10;s:2:"11";i:11;s:2:"12";}s:4:"wide";a:12:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";i:5;s:1:"6";i:6;s:1:"7";i:7;s:1:"8";i:8;s:1:"9";i:9;s:2:"10";i:10;s:2:"11";i:11;s:2:"12";}}s:11:"stand-alone";a:4:{s:11:"abbreviated";a:12:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";i:5;s:1:"6";i:6;s:1:"7";i:7;s:1:"8";i:8;s:1:"9";i:9;s:2:"10";i:10;s:2:"11";i:11;s:2:"12";}s:7:"default";a:1:{i:0;s:4:"wide";}s:6:"narrow";a:12:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";i:5;s:1:"6";i:6;s:1:"7";i:7;s:1:"8";i:8;s:1:"9";i:9;s:2:"10";i:10;s:2:"11";i:11;s:2:"12";}s:4:"wide";a:12:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";i:5;s:1:"6";i:6;s:1:"7";i:7;s:1:"8";i:8;s:1:"9";i:9;s:2:"10";i:10;s:2:"11";i:11;s:2:"12";}}}s:17:"weekend:intvector";a:4:{i:0;i:7;i:1;
i:0;i:2;i:1;i:3;i:86400000;}}s:6:"hebrew";a:2:{s:4:"eras";a:1:{s:11:"abbreviated";a:1:{i:0;s:2:"AM";}}s:10:"monthNames";a:2:{s:7:"default";a:1:{i:0;s:6:"format";}s:6:"format";a:3:{s:17:"abbreviated:alias";a:1:{i:0;s:43:"root/calendar/hebrew/monthNames/format/wide";}s:7:"default";a:1:{i:0;s:4:"wide";}s:4:"wide";a:13:{i:0;s:6:"Tishri";i:1;s:7:"Heshvan";i:2;s:6:"Kislev";i:3;s:5:"Tevet";i:4;s:6:"Shevat";i:5;s:6:"Adar I";i:6;s:4:"Adar";i:7;s:5:"Nisan";i:8;s:4:"Iyar";i:9;s:5:"Sivan";i:10;s:5:"Tamuz";i:11;s:2:"Av";i:12;s:4:"Elul";}}}}s:7:"islamic";a:2:{s:4:"eras";a:1:{s:11:"abbreviated";a:1:{i:0;s:2:"AH";}}s:10:"monthNames";a:2:{s:7:"default";a:1:{i:0;s:6:"format";}s:6:"format";a:3:{s:17:"abbreviated:alias";a:1:{i:0;s:44:"root/calendar/islamic/monthNames/format/wide";}s:7:"default";a:1:{i:0;s:4:"wide";}s:4:"wide";a:12:{i:0;s:8:"Muharram";i:1;s:5:"Safar";i:2;s:8:"RabiÊ» I";i:3;s:9:"RabiÊ» II";i:4;s:8:"Jumada I";i:5;s:9:"Jumada II";i:6;s:5:"Rajab";i:7;s:8:"ShaÊ»ban";i:8;s:7:"Ramadan";i:9;s:7:"Shawwal";i:10;s:14:"DhuÊ»l-QiÊ»dah";i:11;s:13:"DhuÊ»l-Hijjah";}}}}s:19:"islamic-civil:alias";a:1:{i:0;s:21:"root/calendar/islamic";}s:8:"japanese";a:2:{s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:17:"EEEE, MMMM d, y G";i:5;s:11:"MMMM d, y G";i:6;s:10:"MMM d, y G";i:7;s:6:"M/d/yy";i:8;s:7:"{1} {0}";}s:4:"eras";a:1:{s:11:"abbreviated";a:236:{i:0;s:5:"Taika";i:1;s:7:"Hakuchi";i:2;s:7:"HakuhÅ";i:3;s:7:"ShuchÅ";i:4;s:6:"TaihÅ";i:5;s:5:"Keiun";i:6;s:5:"WadÅ";i:7;s:5:"Reiki";i:8;s:6:"YÅrÅ";i:9;s:5:"Jinki";i:10;s:7:"TempyÅ";i:11;s:14:"TempyÅ-kampÅ";i:12;s:15:"TempyÅ-shÅhÅ";i:13;s:13:"TempyÅ-hÅji";i:14;s:13:"TemphÅ-jingo";i:15;s:11:"Jingo-keiun";i:16;s:5:"HÅki";i:17;s:6:"Ten-Å";i:18;s:7:"Enryaku";i:19;s:6:"DaidÅ";i:20;s:6:"KÅnin";i:21;s:7:"TenchÅ";i:22;s:6:"ShÅwa";i:23;s:5:"KajÅ";i:24;s:5:"Ninju";i:25;s:5:"Saiko";i:26;s:6:"Tennan";i:27;s:6:"JÅgan";i:28;s:6:"Genkei";i:29;s:5:"Ninna";i:30;s:7:"KampyÅ";i:31;s:7:"ShÅtai";i:32;s:4:"Engi";i:33;s:6:"En
chÅ";i:34;s:7:"ShÅhei";i:35;s:7:"TengyÅ";i:36;s:8:"Tenryaku";i:37;s:7:"Tentoku";i:38;s:4:"ÅŒwa";i:39;s:6:"KÅhÅ";i:40;s:4:"Anna";i:41;s:7:"Tenroku";i:42;s:6:"Ten-en";i:43;s:6:"JÅgen";i:44;s:6:"Tengen";i:45;s:5:"Eikan";i:46;s:5:"Kanna";i:47;s:5:"Ei-en";i:48;s:4:"Eiso";i:49;s:9:"ShÅryaku";i:50;s:8:"ChÅtoku";i:51;s:7:"ChÅhÅ";i:52;s:6:"KankÅ";i:53;s:6:"ChÅwa";i:54;s:6:"Kannin";i:55;s:4:"Jian";i:56;s:5:"Manju";i:57;s:7:"ChÅgen";i:58;s:9:"ChÅryaku";i:59;s:8:"ChÅkyÅ«";i:60;s:7:"Kantoku";i:61;s:6:"EishÅ";i:62;s:5:"Tengi";i:63;s:6:"KÅhei";i:64;s:7:"Jiryaku";i:65;s:6:"EnkyÅ«";i:66;s:6:"ShÅho";i:67;s:9:"ShÅryaku";i:68;s:4:"Eiho";i:69;s:6:"ÅŒtoku";i:70;s:5:"Kanji";i:71;s:4:"Kaho";i:72;s:6:"EichÅ";i:73;s:8:"ShÅtoku";i:74;s:5:"KÅwa";i:75;s:6:"ChÅji";i:76;s:6:"KashÅ";i:77;s:6:"Tennin";i:78;s:6:"Ten-ei";i:79;s:6:"EikyÅ«";i:80;s:6:"Gen-ei";i:81;s:4:"Hoan";i:82;s:5:"Tenji";i:83;s:5:"Daiji";i:84;s:7:"TenshÅ";i:85;s:8:"ChÅshÅ";i:86;s:4:"Hoen";i:87;s:4:"Eiji";i:88;s:5:"KÅji";i:89;s:6:"TenyÅ";i:90;s:6:"KyÅ«an";i:91;s:6:"Ninpei";i:92;s:6:"KyÅ«ju";i:93;s:5:"Hogen";i:94;s:5:"Heiji";i:95;s:7:"Eiryaku";i:96;s:4:"ÅŒho";i:97;s:7:"ChÅkan";i:98;s:5:"Eiman";i:99;s:6:"Nin-an";i:100;s:4:"KaÅ";i:101;s:6:"ShÅan";i:102;s:5:"Angen";i:103;s:6:"JishÅ";i:104;s:5:"YÅwa";i:105;s:4:"Juei";i:106;s:8:"Genryuku";i:107;s:5:"Bunji";i:108;s:7:"KenkyÅ«";i:109;s:6:"ShÅji";i:110;s:6:"Kennin";i:111;s:7:"GenkyÅ«";i:112;s:6:"Ken-ei";i:113;s:7:"ShÅgen";i:114;s:8:"Kenryaku";i:115;s:6:"KenpÅ";i:116;s:8:"ShÅkyÅ«";i:117;s:5:"JÅÅ";i:118;s:6:"Gennin";i:119;s:6:"Karoku";i:120;s:5:"Antei";i:121;s:5:"Kanki";i:122;s:5:"JÅei";i:123;s:7:"Tempuku";i:124;s:8:"Bunryaku";i:125;s:5:"Katei";i:126;s:8:"Ryakunin";i:127;s:5:"En-Å";i:128;s:5:"Ninji";i:129;s:6:"Kangen";i:130;s:5:"HÅji";i:131;s:7:"KenchÅ";i:132;s:6:"KÅgen";i:133;s:6:"ShÅka";i:134;s:7:"ShÅgen";i:135;s:6:"Bun-Å";i:136;s:7:"KÅchÅ";i:137;s:6:"Bun-ei";i:138;s:5:"Kenji";i:139;s:5:"KÅan";i:140;s:6:"ShÅÅ";i:141;s:5:"Einin";i:142;s:6:"ShÅan";i:143;s:6:"Kengen";i:144;s:5:"Kagen";i:14
5;s:6:"Tokuji";i:146;s:5:"Enkei";i:147;s:6:"ÅŒchÅ";i:148;s:6:"ShÅwa";i:149;s:6:"BunpÅ";i:150;s:5:"GenÅ";i:151;s:7:"GenkyÅ";i:152;s:8:"ShÅchÅ«";i:153;s:6:"Kareki";i:154;s:7:"Gentoku";i:155;s:6:"GenkÅ";i:156;s:5:"Kemmu";i:157;s:5:"Engen";i:158;s:7:"KÅkoku";i:159;s:7:"ShÅhei";i:160;s:7:"Kentoku";i:161;s:7:"BunchÅ©";i:162;s:5:"Tenju";i:163;s:8:"KÅryaku";i:164;s:5:"KÅwa";i:165;s:7:"GenchÅ©";i:166;s:7:"Meitoku";i:167;s:5:"Kakei";i:168;s:5:"KÅÅ";i:169;s:7:"Meitoku";i:170;s:4:"ÅŒei";i:171;s:8:"ShÅchÅ";i:172;s:6:"EikyÅ";i:173;s:7:"Kakitsu";i:174;s:6:"Bun-an";i:175;s:7:"HÅtoku";i:176;s:8:"KyÅtoku";i:177;s:7:"KÅshÅ";i:178;s:8:"ChÅroku";i:179;s:7:"KanshÅ";i:180;s:7:"BunshÅ";i:181;s:5:"ÅŒnin";i:182;s:6:"Bunmei";i:183;s:8:"ChÅkyÅ";i:184;s:6:"Entoku";i:185;s:5:"MeiÅ";i:186;s:5:"Bunki";i:187;s:6:"EishÅ";i:188;s:5:"Taiei";i:189;s:8:"KyÅroku";i:190;s:6:"Tenmon";i:191;s:5:"KÅji";i:192;s:6:"Eiroku";i:193;s:5:"Genki";i:194;s:7:"TenshÅ";i:195;s:7:"Bunroku";i:196;s:7:"KeichÅ";i:197;s:5:"Genwa";i:198;s:6:"Kan-ei";i:199;s:6:"ShÅho";i:200;s:5:"Keian";i:201;s:6:"ShÅÅ";i:202;s:8:"Meiryaku";i:203;s:5:"Manji";i:204;s:6:"Kanbun";i:205;s:5:"EnpÅ";i:206;s:5:"Tenwa";i:207;s:7:"JÅkyÅ";i:208;s:7:"Genroku";i:209;s:5:"HÅei";i:210;s:8:"ShÅtoku";i:211;s:7:"KyÅhÅ";i:212;s:6:"Genbun";i:213;s:6:"KanpÅ";i:214;s:6:"EnkyÅ";i:215;s:6:"Kan-en";i:216;s:8:"HÅryaku";i:217;s:5:"Meiwa";i:218;s:5:"An-ei";i:219;s:6:"Tenmei";i:220;s:6:"Kansei";i:221;s:6:"KyÅwa";i:222;s:5:"Bunka";i:223;s:6:"Bunsei";i:224;s:6:"TenpÅ";i:225;s:5:"KÅka";i:226;s:4:"Kaei";i:227;s:5:"Ansei";i:228;s:6:"Man-en";i:229;s:7:"BunkyÅ«";i:230;s:5:"Genji";i:231;s:5:"KeiÅ";i:232;s:5:"Meiji";i:233;s:7:"TaishÅ";i:234;s:6:"ShÅwa";i:235;s:6:"Heisei";}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GyMdkHmsSEDFwWahKzYeugAZ";}s:11:"zoneStrings";a:1:{i:0;a:6:{i:0;s:0:"";i:1;s:0:"";i:2;s:0:"";i:3;s:0:"";i:4;s:0:"";i:5;s:0:"";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ru.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ru.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ru.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:10:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:14:"Ðндорра";}s:2:"AE";a:1:{i:0;s:56:"Объединенные ÐрабÑкие Эмираты";}s:2:"AF";a:1:{i:0;s:20:"ÐфганиÑтан";}s:2:"AG";a:1:{i:0;s:32:"Ðнтигуа и Барбуда";}s:2:"AI";a:1:{i:0;s:16:"Ðнгуилла";}s:2:"AL";a:1:{i:0;s:14:"ÐлбаниÑ";}s:2:"AM";a:1:{i:0;s:14:"ÐрмениÑ";}s:2:"AN";a:1:{i:0;s:58:"ГолландÑкие ÐнтильÑкие ОÑтрова";}s:2:"AO";a:1:{i:0;s:12:"Ðнгола";}s:2:"AQ";a:1:{i:0;s:20:"Ðнтарктида";}s:2:"AR";a:1:{i:0;s:18:"Ðргентина";}s:2:"AS";a:1:{i:0;s:35:"ÐмериканÑкое Самоа";}s:2:"AT";a:1:{i:0;s:14:"ÐвÑтриÑ";}s:2:"AU";a:1:{i:0;s:18:"ÐвÑтралиÑ";}s:2:"AW";a:1:{i:0;s:10:"Ðруба";}s:2:"AZ";a:1:{i:0;s:22:"Ðзербайджан";}s:2:"BA";a:1:{i:0;s:12:"БоÑниÑ";}s:2:"BB";a:1:{i:0;s:16:"БарбадоÑ";}s:2:"BD";a:1:{i:0;s:18:"Бангладеш";}s:2:"BE";a:1:{i:0;s:14:"БельгиÑ";}s:2:"BF";a:1:{i:0;s:23:"Буркина ФаÑо";}s:2:"BG";a:1:{i:0;s:16:"БолгариÑ";}s:2:"BH";a:1:{i:0;s:14:"Бахрейн";}s:2:"BI";a:1:{i:0;s:14:"Бурунди";}s:2:"BJ";a:1:{i:0;s:10:"Бенин";}s:2:"BM";a:1:{i:0;s:35:"БермудÑкие ОÑтрова";}s:2:"BN";a:1:{i:0;s:33:"Бруней ДаруÑÑалам";}s:2:"BO";a:1:{i:0;s:14:"БоливиÑ";}s:2:"BR";a:1:{i:0;s:16:"БразилиÑ";}s:2:"BS";a:1:{i:0;s:33:"БагамÑкие оÑтрова";}s:2:"BT";a:1:{i:0;s:10:"Бутан";}s:2:"BV";a:1:{i:0;s:21:"ОÑтров Буве";}s:2:"BW";a:1:{i:0;s:16:"БотÑвана";}s:2:"BY";a:1:{i:0;s:16:"БеларуÑÑŒ";}s:2:"BZ";a:1:{i:0;s:10:"Белиз";}s:2:"CA";a:1:{i:0;s:12:"Канада";}s:2:"CC";a:1:{i:0;s:50:"КокоÑовые ОÑтрова (Киилинг)";}s:2:"CD";a:1:{i:0;s:63:"Конго, ДемократичеÑÐºÐ°Ñ Ð ÐµÑпублика";}s:2:"CF";a:1:{i:0;s:64:"Центрально-ÐфриканÑÐºÐ°Ñ Ð ÐµÑпублика";}s:2:"CG";a:1:{i:0;s:10:"Конго";}s:2:"CH";a:1:{i:0;s:18:"Ð
¨Ð²ÐµÐ¹Ñ†Ð°Ñ€Ð¸Ñ";}s:2:"CI";a:1:{i:0;s:22:"Кот д’Ивуар";}s:2:"CK";a:1:{i:0;s:23:"ОÑтрова Кука";}s:2:"CL";a:1:{i:0;s:8:"Чили";}s:2:"CM";a:1:{i:0;s:14:"Камерун";}s:2:"CN";a:1:{i:0;s:10:"Китай";}s:2:"CO";a:1:{i:0;s:16:"КолумбиÑ";}s:2:"CR";a:1:{i:0;s:19:"КоÑта-Рика";}s:2:"CU";a:1:{i:0;s:8:"Куба";}s:2:"CV";a:1:{i:0;s:40:"ОÑтрова Зеленого МыÑа";}s:2:"CX";a:1:{i:0;s:31:"ОÑтров РождеÑтва";}s:2:"CY";a:1:{i:0;s:8:"Кипр";}s:2:"CZ";a:1:{i:0;s:35:"ЧешÑÐºÐ°Ñ Ð ÐµÑпублика";}s:2:"DE";a:1:{i:0;s:16:"ГерманиÑ";}s:2:"DJ";a:1:{i:0;s:14:"Джибути";}s:2:"DK";a:1:{i:0;s:10:"ДаниÑ";}s:2:"DM";a:1:{i:0;s:29:"ОÑтров Доминика";}s:2:"DO";a:1:{i:0;s:47:"ДоминиканÑÐºÐ°Ñ Ð ÐµÑпублика";}s:2:"DZ";a:1:{i:0;s:10:"Ðлжир";}s:2:"EC";a:1:{i:0;s:14:"Эквадор";}s:2:"EE";a:1:{i:0;s:14:"ЭÑтониÑ";}s:2:"EG";a:1:{i:0;s:12:"Египет";}s:2:"EH";a:1:{i:0;s:29:"Ð—Ð°Ð¿Ð°Ð´Ð½Ð°Ñ Ð¡Ð°Ñ…Ð°Ñ€Ð°";}s:2:"ER";a:1:{i:0;s:14:"ЭритреÑ";}s:2:"ES";a:1:{i:0;s:14:"ИÑпаниÑ";}s:2:"ET";a:1:{i:0;s:14:"ЭфиопиÑ";}s:2:"FI";a:1:{i:0;s:18:"ФинлÑндиÑ";}s:2:"FJ";a:1:{i:0;s:10:"Фиджи";}s:2:"FK";a:1:{i:0;s:41:"ФольклендÑкие ОÑтрова";}s:2:"FM";a:1:{i:0;s:68:"Федеративное ГоÑударÑтво МикронезиÑ";}s:2:"FO";a:1:{i:0;s:33:"ФарерÑкие оÑтрова";}s:2:"FR";a:1:{i:0;s:14:"ФранциÑ";}s:2:"GA";a:1:{i:0;s:10:"Габон";}s:2:"GB";a:1:{i:0;s:28:"ВеликобританиÑ";}s:2:"GD";a:1:{i:0;s:14:"Гренада";}s:2:"GE";a:1:{i:0;s:12:"ГрузиÑ";}s:2:"GF";a:1:{i:0;s:35:"ФранцузÑÐºÐ°Ñ Ð“Ð²Ð¸Ð°Ð½Ð°";}s:2:"GH";a:1:{i:0;s:8:"Гана";}s:2:"GI";a:1:{i:0;s:18:"Гибралтар";}s:2:"GL";a:1:{i:0;s:20:"ГренландиÑ";}s:2:"GM";a:1:{i:0;s:12:"ГамбиÑ";}s:2:"GN";a:1:{i:0;s:12:"ГвинеÑ";}s:2:"GP";a:1:{i:0;s:18:"Гваделупа";}s:2:"GQ";a:1:{i:0;s:41:"Ð­ÐºÐ²Ð°Ñ‚Ð¾Ñ€Ð¸Ð°Ð»ÑŒÐ½Ð°Ñ Ð“Ð
²Ð¸Ð½ÐµÑ";}s:2:"GR";a:1:{i:0;s:12:"ГрециÑ";}s:2:"GS";a:1:{i:0;s:77:"Ð®Ð¶Ð½Ð°Ñ Ð”Ð¶Ð¾Ñ€Ð´Ð¶Ð¸Ñ Ð¸ Южные Сандвичевы ОÑтрова";}s:2:"GT";a:1:{i:0;s:18:"Гватемала";}s:2:"GU";a:1:{i:0;s:8:"Гуам";}s:2:"GW";a:1:{i:0;s:25:"ГвинеÑ-БиÑÑау";}s:2:"GY";a:1:{i:0;s:12:"Гайана";}s:2:"HK";a:1:{i:0;s:115:"Гонконг (ОблаÑÑ‚ÑŒ Ñ ÐžÑобым ÐдминиÑтративным Управлением, Китай)";}s:2:"HM";a:1:{i:0;s:48:"ОÑтрова Херд и Мак-Дональд";}s:2:"HN";a:1:{i:0;s:16:"ГондураÑ";}s:2:"HR";a:1:{i:0;s:16:"ХорватиÑ";}s:2:"HT";a:1:{i:0;s:10:"Гаити";}s:2:"HU";a:1:{i:0;s:14:"ВенгриÑ";}s:2:"ID";a:1:{i:0;s:18:"ИндонезиÑ";}s:2:"IE";a:1:{i:0;s:16:"ИрландиÑ";}s:2:"IL";a:1:{i:0;s:14:"Израиль";}s:2:"IN";a:1:{i:0;s:10:"ИндиÑ";}s:2:"IO";a:1:{i:0;s:76:"БританÑкие Территории в ИндийÑком Океане";}s:2:"IQ";a:1:{i:0;s:8:"Ирак";}s:2:"IR";a:1:{i:0;s:8:"Иран";}s:2:"IS";a:1:{i:0;s:16:"ИÑландиÑ";}s:2:"IT";a:1:{i:0;s:12:"ИталиÑ";}s:2:"JM";a:1:{i:0;s:12:"Ямайка";}s:2:"JO";a:1:{i:0;s:16:"ИорданиÑ";}s:2:"JP";a:1:{i:0;s:12:"ЯпониÑ";}s:2:"KE";a:1:{i:0;s:10:"КениÑ";}s:2:"KG";a:1:{i:0;s:20:"КыргызÑтан";}s:2:"KH";a:1:{i:0;s:16:"Камбоджа";}s:2:"KI";a:1:{i:0;s:16:"Кирибати";}s:2:"KM";a:1:{i:0;s:33:"КоморÑкие ОÑтрова";}s:2:"KN";a:1:{i:0;s:33:"Сент-ÐšÐ¸Ñ‚Ñ‚Ñ Ð¸ ÐевиÑ";}s:2:"KP";a:1:{i:0;s:27:"Ð¡ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐšÐ¾Ñ€ÐµÑ";}s:2:"KR";a:1:{i:0;s:21:"Ð®Ð¶Ð½Ð°Ñ ÐšÐ¾Ñ€ÐµÑ";}s:2:"KW";a:1:{i:0;s:12:"Кувейт";}s:2:"KY";a:1:{i:0;s:33:"Каймановы ОÑтрова";}s:2:"KZ";a:1:{i:0;s:18:"КазахÑтан";}s:2:"LA";a:1:{i:0;s:8:"ЛаоÑ";}s:2:"LB";a:1:{i:0;s:10:"Ливан";}s:2:"LC";a:1:{i:0;s:19:"Сент-ЛюÑиÑ";}s:2:"LI";a:1:{i:0;s:22:"Лихтенштейн";}s:2:"LK";a:1:{i:0;s:17:"Шри-Ланка";}s:2:"LR";a:1:{i:0;s:14:"ЛибериÑ";}s:2:"LS";a:1:{
i:0;s:12:"ЛеÑото";}s:2:"LT";a:1:{i:0;s:10:"Литва";}s:2:"LU";a:1:{i:0;s:20:"ЛюкÑембург";}s:2:"LV";a:1:{i:0;s:12:"ЛатвиÑ";}s:2:"LY";a:1:{i:0;s:10:"ЛивиÑ";}s:2:"MA";a:1:{i:0;s:14:"Марокко";}s:2:"MC";a:1:{i:0;s:12:"Монако";}s:2:"MD";a:1:{i:0;s:14:"Молдова";}s:2:"MG";a:1:{i:0;s:20:"МадагаÑкар";}s:2:"MH";a:1:{i:0;s:35:"Маршалловы ОÑтрова";}s:2:"MK";a:1:{i:0;s:18:"МакедониÑ";}s:2:"ML";a:1:{i:0;s:8:"Мали";}s:2:"MM";a:1:{i:0;s:16:"Майанмар";}s:2:"MN";a:1:{i:0;s:16:"МонголиÑ";}s:2:"MO";a:1:{i:0;s:111:"Макао (ОблаÑÑ‚ÑŒ Ñ ÐžÑобым ÐдминиÑтративным Управлением, Китай)";}s:2:"MP";a:1:{i:0;s:52:"Северные МарианÑкие ОÑтрова";}s:2:"MQ";a:1:{i:0;s:16:"Мартиник";}s:2:"MR";a:1:{i:0;s:20:"МавританиÑ";}s:2:"MS";a:1:{i:0;s:18:"МонÑеррат";}s:2:"MT";a:1:{i:0;s:12:"Мальта";}s:2:"MU";a:1:{i:0;s:16:"Маврикий";}s:2:"MV";a:1:{i:0;s:16:"Мальдивы";}s:2:"MW";a:1:{i:0;s:12:"Малави";}s:2:"MX";a:1:{i:0;s:14:"МекÑика";}s:2:"MY";a:1:{i:0;s:16:"МалайзиÑ";}s:2:"MZ";a:1:{i:0;s:16:"Мозамбик";}s:2:"NA";a:1:{i:0;s:14:"ÐамибиÑ";}s:2:"NC";a:1:{i:0;s:29:"ÐÐ¾Ð²Ð°Ñ ÐšÐ°Ð»ÐµÐ´Ð¾Ð½Ð¸Ñ";}s:2:"NE";a:1:{i:0;s:10:"Ðигер";}s:2:"NF";a:1:{i:0;s:27:"ОÑтров Ðорфолк";}s:2:"NG";a:1:{i:0;s:14:"ÐигериÑ";}s:2:"NI";a:1:{i:0;s:18:"Ðикарагуа";}s:2:"NL";a:1:{i:0;s:20:"Ðидерланды";}s:2:"NO";a:1:{i:0;s:16:"ÐорвегиÑ";}s:2:"NP";a:1:{i:0;s:10:"Ðепал";}s:2:"NR";a:1:{i:0;s:10:"Ðауру";}s:2:"NU";a:1:{i:0;s:8:"Ðиуе";}s:2:"NZ";a:1:{i:0;s:27:"ÐÐ¾Ð²Ð°Ñ Ð—ÐµÐ»Ð°Ð½Ð´Ð¸Ñ";}s:2:"OM";a:1:{i:0;s:8:"Оман";}s:2:"PA";a:1:{i:0;s:12:"Панама";}s:2:"PE";a:1:{i:0;s:8:"Перу";}s:2:"PF";a:1:{i:0;s:41:"ФранцузÑÐºÐ°Ñ ÐŸÐ¾Ð»Ð¸Ð½ÐµÐ·Ð¸Ñ";}s:2:"PG";a:1:{i:0;s:34:"Папуа-ÐÐ¾Ð²Ð°Ñ Ð“Ð²Ð¸Ð½ÐµÑ";}s:2:"PH";a:1:{i:0;s:18:"Филиппины";}s:2:"PK";a:1:{i:0
;s:16:"ПакиÑтан";}s:2:"PL";a:1:{i:0;s:12:"Польша";}s:2:"PM";a:1:{i:0;s:33:"Сен-Пьер и Микелон";}s:2:"PN";a:1:{i:0;s:27:"ОÑтров ПиткÑрн";}s:2:"PR";a:1:{i:0;s:21:"ПуÑрто-Рико";}s:2:"PS";a:1:{i:0;s:43:"ПалеÑтинÑÐºÐ°Ñ Ð°Ð²Ñ‚Ð¾Ð½Ð¾Ð¼Ð¸Ñ";}s:2:"PT";a:1:{i:0;s:20:"ПортугалиÑ";}s:2:"PW";a:1:{i:0;s:10:"Палау";}s:2:"PY";a:1:{i:0;s:16:"Парагвай";}s:2:"QA";a:1:{i:0;s:10:"Катар";}s:2:"RE";a:1:{i:0;s:14:"Реюньон";}s:2:"RO";a:1:{i:0;s:14:"РумыниÑ";}s:2:"RU";a:1:{i:0;s:12:"РоÑÑиÑ";}s:2:"RW";a:1:{i:0;s:12:"Руанда";}s:2:"SA";a:1:{i:0;s:33:"СаудовÑÐºÐ°Ñ ÐравиÑ";}s:2:"SB";a:1:{i:0;s:35:"Соломоновы ОÑтрова";}s:2:"SC";a:1:{i:0;s:37:"СейшельÑкие ОÑтрова";}s:2:"SD";a:1:{i:0;s:10:"Судан";}s:2:"SE";a:1:{i:0;s:12:"ШвециÑ";}s:2:"SG";a:1:{i:0;s:16:"Сингапур";}s:2:"SH";a:1:{i:0;s:36:"ОÑтров СвÑтой Елены";}s:2:"SI";a:1:{i:0;s:16:"СловениÑ";}s:2:"SJ";a:1:{i:0;s:52:"ОÑтрова Свалбард и Жан Майен";}s:2:"SK";a:1:{i:0;s:16:"СловакиÑ";}s:2:"SL";a:1:{i:0;s:23:"Сьерра-Леоне";}s:2:"SM";a:1:{i:0;s:19:"Сан-Марино";}s:2:"SN";a:1:{i:0;s:14:"Сенегал";}s:2:"SO";a:1:{i:0;s:12:"Сомали";}s:2:"SP";a:1:{i:0;s:12:"СербиÑ";}s:2:"SR";a:1:{i:0;s:14:"Суринам";}s:2:"ST";a:1:{i:0;s:35:"Сан-Томе и ПринÑипи";}s:2:"SV";a:1:{i:0;s:18:"Сальвадор";}s:2:"SY";a:1:{i:0;s:56:"СирийÑÐºÐ°Ñ ÐрабÑÐºÐ°Ñ Ð ÐµÑпублика";}s:2:"SZ";a:1:{i:0;s:18:"Свазиленд";}s:2:"TC";a:1:{i:0;s:41:"ОÑтрова Ð¢ÑƒÑ€ÐºÑ Ð¸ КайкоÑ";}s:2:"TD";a:1:{i:0;s:6:"Чад";}s:2:"TF";a:1:{i:0;s:54:"ФранцузÑкие Южные Территории";}s:2:"TG";a:1:{i:0;s:8:"Того";}s:2:"TH";a:1:{i:0;s:14:"Таиланд";}s:2:"TJ";a:1:{i:0;s:22:"ТаджикиÑтан";}s:2:"TK";a:1:{i:0;s:14:"Токелау";}s:2:"TL";a:1:{i:0;s:29:"ВоÑточный Тимор";}s
:2:"TM";a:1:{i:0;s:24:"ТуркмениÑтан";}s:2:"TN";a:1:{i:0;s:10:"ТуниÑ";}s:2:"TO";a:1:{i:0;s:10:"Тонга";}s:2:"TR";a:1:{i:0;s:12:"ТурциÑ";}s:2:"TT";a:1:{i:0;s:32:"Тринидад и Тобаго";}s:2:"TV";a:1:{i:0;s:12:"Тувалу";}s:2:"TW";a:1:{i:0;s:14:"Тайвань";}s:2:"TZ";a:1:{i:0;s:16:"ТанзаниÑ";}s:2:"UA";a:1:{i:0;s:14:"Украина";}s:2:"UG";a:1:{i:0;s:12:"Уганда";}s:2:"UM";a:1:{i:0;s:49:"Внешние малые оÑтрова (СШÐ)";}s:2:"US";a:1:{i:0;s:33:"Соединенные Штаты";}s:2:"UY";a:1:{i:0;s:14:"Уругвай";}s:2:"UZ";a:1:{i:0;s:20:"УзбекиÑтан";}s:2:"VA";a:1:{i:0;s:48:"ГоÑударÑтво-город Ватикан";}s:2:"VC";a:1:{i:0;s:45:"Сент-ВинÑент и Гренадины";}s:2:"VE";a:1:{i:0;s:18:"ВенеÑуÑла";}s:2:"VG";a:1:{i:0;s:56:"БританÑкие ВиргинÑкие ОÑтрова";}s:2:"VI";a:1:{i:0;s:60:"ÐмериканÑкие ВиргинÑкие ОÑтрова";}s:2:"VN";a:1:{i:0;s:14:"Вьетнам";}s:2:"VU";a:1:{i:0;s:14:"Вануату";}s:2:"WF";a:1:{i:0;s:26:"Ð­Ð»Ð»Ð¸Ñ Ð¸ Футуна";}s:2:"WS";a:1:{i:0;s:10:"Самоа";}s:2:"YE";a:1:{i:0;s:10:"Йемен";}s:2:"YT";a:1:{i:0;s:14:"Майотта";}s:2:"YU";a:1:{i:0;s:18:"ЮгоÑлавиÑ";}s:2:"ZA";a:1:{i:0;s:23:"Ð®Ð¶Ð½Ð°Ñ Ðфрика";}s:2:"ZM";a:1:{i:0;s:12:"ЗамбиÑ";}s:2:"ZW";a:1:{i:0;s:16:"Зимбабве";}}s:10:"Currencies";a:141:{s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:33:"ÐндоррÑÐºÐ°Ñ Ð¿ÐµÑета";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:21:"Дирхам (ОÐЭ)";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:24:"Ðфгани (1927-2002)";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:27:"ÐрмÑнÑкий драм";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:62:"ÐидерландÑкий антильÑкий гульден";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:23:"ÐÐ¾Ð²Ð°Ñ ÐºÐ²Ð°Ð½Ð·Ð°";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:33:"ÐргентинÑкое пеÑо";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:39:"ÐвÑтралийÑкиÐ
¹ доллар";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:35:"ÐрубанÑкий гульден";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:41:"ÐзербайджанÑкий манат";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:37:"БарбадоÑÑкий доллар";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:33:"БельгийÑкий франк";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:6:"Лев";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:27:"БолгарÑкий лев";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:33:"БахрейнÑкий динар";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:35:"БурундийÑкий франк";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:33:"БермудÑкий доллар";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:33:"БрунейÑкий доллар";}s:3:"BOB";a:2:{i:0;s:2:"Bs";i:1;s:18:"Боливиано";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:31:"БразильÑкий реал";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:25:"Крузейро реал";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:31:"БагамÑкий доллар";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:16:"Ðгултрум";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:45:"БелоруÑÑкий рубль (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:45:"БелоруÑÑкий рубль (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:33:"БелоруÑÑкий рубль";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:31:"БелизÑкий доллар";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:31:"КанадÑкий доллар";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:35:"КонголезÑкий франк";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:33:"ШвейцарÑкий франк";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:27:"ЧилийÑкое пеÑо";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:27:"КитайÑкий юань";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:33:"КолумбийÑкое пеÑо";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:39:"КоÑтариканÑкий колон";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:27:"КубинÑкое пеÑо";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:25:"КипрÑкий фунÑ
‚";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:25:"ЧешÑÐºÐ°Ñ ÐºÑ€Ð¾Ð½Ð°";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:27:"ÐÐµÐ¼ÐµÑ†ÐºÐ°Ñ Ð¼Ð°Ñ€ÐºÐ°";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:25:"Франк Джибути";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:25:"ДатÑÐºÐ°Ñ ÐºÑ€Ð¾Ð½Ð°";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:35:"ДоминиканÑкое пеÑо";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:29:"ÐлжирÑкий динар";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:29:"ЕгипетÑкий фунт";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:10:"Ðакфа";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:25:"ЭфиопÑкий быр";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:8:"Евро";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:23:"Доллар Фиджи";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:50:"Фунт ФолклендÑких оÑтровов";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:33:"ФранцузÑкий франк";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:31:"ГрузинÑкий купон";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:29:"ГрузинÑкий лари";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:35:"ГибралтарÑкий фунт";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:31:"ГвинейÑкий франк";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:31:"ГайанÑкий доллар";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:35:"ГонконгÑкий доллар";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:31:"ХорватÑкий динар";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:29:"ИрландÑкий фунт";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:27:"ИракÑкий динар";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:25:"ИранÑкий риал";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:31:"ИÑландÑÐºÐ°Ñ ÐºÑ€Ð¾Ð½Ð°";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:31:"ИтальÑнÑÐºÐ°Ñ Ð»Ð¸Ñ€Ð°";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:29:"ЯмайÑкий доллар";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:31:"ИорданÑкий динар";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:33:"КенийÑкий шиллинг";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:46:"Франк КоморÑких оÑÑ
‚ровов";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:31:"КувейтÑкий динар";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:50:"Доллар Каймановых оÑтровов";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:27:"ЛиванÑкий фунт";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:35:"ЛиберийÑкий доллар";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:8:"Лоти";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:25:"ЛитовÑкий лит";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:39:"ЛюкÑембургÑкий франк";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:27:"ЛатвийÑкий лат";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:29:"ЛивийÑкий динар";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:37:"МарокканÑкий дирхам";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:27:"МолдавÑкий лей";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:37:"МалагаÑийÑкий франк";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:31:"МальтийÑÐºÐ°Ñ Ð»Ð¸Ñ€Ð°";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:35:"МаврикийÑÐºÐ°Ñ Ñ€ÑƒÐ¿Ð¸Ñ";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:35:"Квача (малавийÑкаÑ)";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:44:"МекÑиканÑкое новое пеÑо";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:27:"Доллар Ðамибии";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:29:"Ð—Ð¾Ð»Ð¾Ñ‚Ð°Ñ ÐºÐ¾Ñ€Ð´Ð¾Ð±Ð°";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:41:"ÐидерландÑкий гульден";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:31:"ÐорвежÑÐºÐ°Ñ ÐºÑ€Ð¾Ð½Ð°";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:31:"ÐепальÑÐºÐ°Ñ Ñ€ÑƒÐ¿Ð¸Ñ";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:41:"ÐовозеландÑкий доллар";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:25:"ОманÑкий риал";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:8:"Кина";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:33:"ФилиппинÑкое пеÑо";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:35:"ПакиÑтанÑÐºÐ°Ñ Ñ€ÑƒÐ¿Ð¸Ñ";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:29:"ПольÑкий злотый";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:12:"Злотый";}s:3:"PTE";
a:2:{i:0;s:3:"PTE";i:1;s:39:"ПортугальÑкое ÑÑкудо";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:27:"КатарÑкий риал";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:31:"РоÑÑийÑкий рубль";}s:3:"RUR";a:2:{i:0;s:3:"Ñ€.";i:1;s:43:"РоÑÑийÑкий рубль (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:23:"Франк Руанды";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:29:"СаудовÑкий риал";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:52:"Доллар Соломоновых оÑтровов";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:33:"СейшельÑÐºÐ°Ñ Ñ€ÑƒÐ¿Ð¸Ñ";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:29:"СуданÑкий динар";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:27:"ШведÑÐºÐ°Ñ ÐºÑ€Ð¾Ð½Ð°";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:37:"СингапурÑкий доллар";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:47:"Фунт оÑтрова СвÑтой Елены";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:29:"Ð¡Ð»Ð¾Ð²Ð°Ñ†ÐºÐ°Ñ ÐºÑ€Ð¾Ð½Ð°";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:10:"Леоне";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:37:"СомалийÑкий шиллинг";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:37:"СуринамÑкий гульден";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:10:"Добра";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:37:"СальвадорÑкий колон";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:27:"СирийÑкий фунт";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:31:"ТаджикÑкий рубль";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:33:"ТаджикÑкий Ñомони";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:29:"ТуниÑÑкий динар";}s:3:"TOP";a:2:{i:0;s:2:"T$";i:1;s:12:"Паанга";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:31:"ТиморÑкое ÑÑкудо";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:25:"Ð¢ÑƒÑ€ÐµÑ†ÐºÐ°Ñ Ð»Ð¸Ñ€Ð°";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:47:"Доллар Тринидада и Тобаго";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:46:"Ðовый тайваньÑкий доллар";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:39:"ТанзанийÑкий шил
линг";}s:3:"UAH";a:2:{i:0;s:7:"грн.";i:1;s:33:"УкраинÑÐºÐ°Ñ Ð³Ñ€Ð¸Ð²Ð½Ð°";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:43:"Карбованец (украинÑкий)";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:37:"УгандийÑкий шиллинг";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:19:"Доллар СШÐ";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:31:"УругвайÑкое пеÑо";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:25:"УзбекÑкий Ñум";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:8:"Вату";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:8:"Тала";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:26:"Франк КФРВЕÐС";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:12:"Золото";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:69:"СДР (Ñпециальные права заимÑтвованиÑ)";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:59:"ЭКЮ (единица европейÑкой валюты)";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:28:"Франк КФРВСЕÐО";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:17:"Франк КФП";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:27:"ЙеменÑкий риал";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:33:"ЮгоÑлавÑкий динар";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:8:"РÑнд";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:33:"Квача (замбийÑкаÑ)";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:19:"Ðовый заир";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:29:"Доллар Зимбабве";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:18:"Календарь";}s:9:"collation";a:1:{i:0;s:20:"Сортировка";}s:8:"currency";a:1:{i:0;s:12:"Валюта";}}s:9:"Languages";a:352:{s:2:"aa";a:1:{i:0;s:8:"Ðфар";}s:2:"ab";a:1:{i:0;s:18:"ÐбхазÑкий";}s:3:"ace";a:1:{i:0;s:16:"ÐчехÑкий";}s:3:"ach";a:1:{i:0;s:10:"Ðчоли";}s:3:"ada";a:1:{i:0;s:14:"Ðдангме";}s:3:"ady";a:1:{i:0;s:20:"ÐдыгейÑкий";}s:2:"af";a:1:{i:0;s:18:"ÐфрикаанÑ";}s:3:"afa";a:1:{i:0;s:37:"ÐфразийÑкие (другие)";}s:3:"afh";a:1:{i:0;s:16:"Ðфрихили";}s:3:"akk";a:1:{i:0;s:18:"ÐккадÑк
ий";}s:3:"ale";a:1:{i:0;s:18:"ÐлеутÑкий";}s:3:"alg";a:1:{i:0;s:35:"ÐлгонкинÑкие Ñзыки";}s:2:"am";a:1:{i:0;s:18:"ÐмхарÑкий";}s:3:"ang";a:1:{i:0;s:30:"СтароанглийÑкий";}s:2:"ar";a:1:{i:0;s:16:"ÐрабÑкий";}s:3:"arc";a:1:{i:0;s:20:"ÐрамейÑкий";}s:3:"art";a:1:{i:0;s:41:"ИÑкуÑÑтвенные (другие)";}s:3:"arw";a:1:{i:0;s:20:"ÐравакÑкий";}s:2:"as";a:1:{i:0;s:18:"ÐÑÑамÑкий";}s:3:"ath";a:1:{i:0;s:31:"ÐтапачÑкие Ñзыки";}s:3:"awa";a:1:{i:0;s:12:"Ðвадхи";}s:2:"ay";a:1:{i:0;s:12:"ÐÑмара";}s:2:"az";a:1:{i:0;s:30:"ÐзербайджанÑкий";}s:2:"ba";a:1:{i:0;s:20:"БашкирÑкий";}s:3:"bad";a:1:{i:0;s:10:"Банда";}s:3:"bai";a:1:{i:0;s:27:"Бамилеке Ñзыки";}s:3:"bal";a:1:{i:0;s:20:"БелуджÑкий";}s:3:"ban";a:1:{i:0;s:18:"БалийÑкий";}s:3:"bas";a:1:{i:0;s:8:"БаÑа";}s:3:"bat";a:1:{i:0;s:35:"БалтийÑкие (другие)";}s:2:"be";a:1:{i:0;s:22:"БелоруÑÑкий";}s:3:"bej";a:1:{i:0;s:10:"Беджа";}s:3:"bem";a:1:{i:0;s:10:"Бемба";}s:2:"bg";a:1:{i:0;s:20:"БолгарÑкий";}s:2:"bh";a:1:{i:0;s:18:"БихарÑкий";}s:3:"bho";a:1:{i:0;s:18:"Бходжпури";}s:2:"bi";a:1:{i:0;s:14:"БиÑлама";}s:3:"bik";a:1:{i:0;s:20:"БикольÑкий";}s:3:"bin";a:1:{i:0;s:8:"Бини";}s:3:"bla";a:1:{i:0;s:14:"СикÑика";}s:2:"bn";a:1:{i:0;s:22:"БенгальÑкий";}s:3:"bnt";a:1:{i:0;s:25:"Банту (другие)";}s:2:"bo";a:1:{i:0;s:18:"ТибетÑкий";}s:2:"br";a:1:{i:0;s:20:"БретонÑкий";}s:3:"bra";a:1:{i:0;s:10:"Брауи";}s:3:"bua";a:1:{i:0;s:18:"БурÑÑ‚Ñкий";}s:3:"bug";a:1:{i:0;s:18:"БугийÑкий";}s:2:"ca";a:1:{i:0;s:22:"КаталанÑкий";}s:3:"cad";a:1:{i:0;s:10:"Каддо";}s:3:"cai";a:1:{i:0;s:69:"Центральной Ðмерики индейцев (другие)";}s:3:"car";a:1:{i:0;s:10:"Кариб";}s:3:"cau";a:1:{i:0;s:35:"КавказÑкие (другие)";}s:3:"chb";a
:1:{i:0;s:10:"Чибча";}s:3:"chg";a:1:{i:0;s:22:"ЧагатайÑкий";}s:3:"chk";a:1:{i:0;s:18:"ЧукотÑкий";}s:3:"chm";a:1:{i:0;s:43:"МарийÑкий (ЧеремиÑÑкий)";}s:3:"chn";a:1:{i:0;s:23:"Чинук жаргон";}s:3:"cho";a:1:{i:0;s:12:"Чоктав";}s:3:"chr";a:1:{i:0;s:12:"Чероки";}s:3:"chy";a:1:{i:0;s:12:"Чейенн";}s:2:"co";a:1:{i:0;s:24:"КорÑиканÑкий";}s:3:"cop";a:1:{i:0;s:16:"КоптÑкий";}s:3:"cpe";a:1:{i:0;s:64:"Ðнгло-креольÑкие и пиджины (другие)";}s:3:"cpf";a:1:{i:0;s:66:"Франко-креольÑкие и пиджины (другие)";}s:3:"crp";a:1:{i:0;s:53:"КреольÑкие и пиджины (другие)";}s:2:"cs";a:1:{i:0;s:14:"ЧешÑкий";}s:3:"cus";a:1:{i:0;s:33:"КушитÑкие (другие)";}s:2:"cv";a:1:{i:0;s:18:"ЧувашÑкий";}s:2:"cy";a:1:{i:0;s:20:"ВаллийÑкий";}s:2:"da";a:1:{i:0;s:14:"ДатÑкий";}s:3:"dak";a:1:{i:0;s:12:"Дакота";}s:2:"de";a:1:{i:0;s:16:"Ðемецкий";}s:3:"del";a:1:{i:0;s:22:"ДелаварÑкий";}s:3:"din";a:1:{i:0;s:10:"Динка";}s:3:"doi";a:1:{i:0;s:10:"Догри";}s:3:"dra";a:1:{i:0;s:39:"ДравидийÑкие (другие)";}s:3:"dua";a:1:{i:0;s:10:"Дуала";}s:3:"dum";a:1:{i:0;s:53:"ÐидерландÑкий Ñредневековый";}s:3:"dyu";a:1:{i:0;s:23:"Диула (Дьюла)";}s:2:"dz";a:1:{i:0;s:18:"БутанÑкий";}s:3:"efi";a:1:{i:0;s:8:"Эфик";}s:3:"egy";a:1:{i:0;s:32:"ДревнеегипетÑкий";}s:3:"eka";a:1:{i:0;s:14:"Экаджук";}s:2:"el";a:1:{i:0;s:18:"ГречеÑкий";}s:3:"elx";a:1:{i:0;s:16:"ЭламÑкий";}s:2:"en";a:1:{i:0;s:20:"ÐнглийÑкий";}s:3:"enm";a:1:{i:0;s:32:"СреднеанглийÑкий";}s:2:"eo";a:1:{i:0;s:18:"ЭÑперанто";}s:2:"es";a:1:{i:0;s:18:"ИÑпанÑкий";}s:2:"et";a:1:{i:0;s:18:"ЭÑтонÑкий";}s:2:"eu";a:1:{i:0;s:16:"БаÑкÑкий";}s:3:"ewo";a:1:{i:0;s:12:"Эвондо";}s:2:"fa";a:1:{i:0;s:20:"ПерÑидÑкий
";}s:3:"fan";a:1:{i:0;s:8:"Фанг";}s:3:"fat";a:1:{i:0;s:10:"Фанти";}s:2:"fi";a:1:{i:0;s:14:"ФинÑкий";}s:3:"fiu";a:1:{i:0;s:42:"Финно-угорÑкие (другие)";}s:2:"fj";a:1:{i:0;s:10:"Фиджи";}s:2:"fo";a:1:{i:0;s:18:"ФарерÑкий";}s:3:"fon";a:1:{i:0;s:6:"Фон";}s:2:"fr";a:1:{i:0;s:22:"ФранцузÑкий";}s:3:"frm";a:1:{i:0;s:34:"СреднефранцузÑкий";}s:3:"fro";a:1:{i:0;s:32:"СтарофранцузÑкий";}s:2:"fy";a:1:{i:0;s:16:"ФризÑкий";}s:2:"ga";a:1:{i:0;s:20:"ИрландÑкий";}s:3:"gaa";a:1:{i:0;s:4:"Га";}s:3:"gay";a:1:{i:0;s:8:"Гайо";}s:2:"gd";a:1:{i:0;s:18:"ГаÑльÑкий";}s:3:"gem";a:1:{i:0;s:35:"ГерманÑкие (другие)";}s:3:"gez";a:1:{i:0;s:8:"ГеÑз";}s:3:"gil";a:1:{i:0;s:24:"ГильбертÑкий";}s:2:"gl";a:1:{i:0;s:22:"ГалицийÑкий";}s:3:"gmh";a:1:{i:0;s:40:"Средневерхненемецкий";}s:2:"gn";a:1:{i:0;s:14:"Гуарани";}s:3:"goh";a:1:{i:0;s:38:"Староверхненемецкий";}s:3:"gon";a:1:{i:0;s:10:"Гонди";}s:3:"got";a:1:{i:0;s:14:"ГотÑкий";}s:3:"grc";a:1:{i:0;s:30:"ДревнегречеÑкий";}s:2:"gu";a:1:{i:0;s:14:"ГуÑрати";}s:2:"ha";a:1:{i:0;s:8:"ХоÑа";}s:3:"hai";a:1:{i:0;s:10:"Хайда";}s:3:"haw";a:1:{i:0;s:18:"ГавайÑкий";}s:2:"he";a:1:{i:0;s:10:"Иврит";}s:2:"hi";a:1:{i:0;s:10:"Хинди";}s:3:"hil";a:1:{i:0;s:20:"Хилигайнон";}s:3:"him";a:1:{i:0;s:16:"Химачали";}s:2:"hr";a:1:{i:0;s:20:"ХорватÑкий";}s:2:"hu";a:1:{i:0;s:20:"ВенгерÑкий";}s:2:"hy";a:1:{i:0;s:18:"ÐрмÑнÑкий";}s:2:"ia";a:1:{i:0;s:27:"Смешанный Ñзык";}s:3:"iba";a:1:{i:0;s:16:"ИбанÑкий";}s:2:"id";a:1:{i:0;s:26:"ИндонезийÑкий";}s:2:"ie";a:1:{i:0;s:27:"Смешанный Ñзык";}s:3:"ijo";a:1:{i:0;s:8:"Иджо";}s:2:"ik";a:1:{i:0;s:14:"Инапиак";}s:3:"ilo";a:1:{i:0;s:10:"Илоко";}s:3:"inc";a:1:{i:0;s:33:"ИндийÑкие (другие)";}s:3:"ira";a:1:{i:0
;s:31:"ИранÑкие (другие)";}s:3:"iro";a:1:{i:0;s:31:"ИрокезÑкие Ñзыки";}s:2:"is";a:1:{i:0;s:20:"ИÑландÑкий";}s:2:"it";a:1:{i:0;s:22:"ИтальÑнÑкий";}s:2:"iu";a:1:{i:0;s:18:"Инактитут";}s:2:"ja";a:1:{i:0;s:16:"ЯпонÑкий";}s:3:"jpr";a:1:{i:0;s:37:"ЕврейÑко-перÑидÑкий";}s:3:"jrb";a:1:{i:0;s:33:"ЕврейÑко-арабÑкий";}s:2:"jv";a:1:{i:0;s:16:"ЯванÑкий";}s:2:"ka";a:1:{i:0;s:20:"ГрузинÑкий";}s:3:"kaa";a:1:{i:0;s:28:"КаракалпакÑкий";}s:3:"kab";a:1:{i:0;s:20:"КабильÑкий";}s:3:"kam";a:1:{i:0;s:10:"Камба";}s:3:"kar";a:1:{i:0;s:18:"КаренÑкий";}s:3:"kaw";a:1:{i:0;s:8:"Кави";}s:3:"kha";a:1:{i:0;s:10:"КхаÑи";}s:3:"khi";a:1:{i:0;s:35:"КойÑанÑкие (другие)";}s:3:"kho";a:1:{i:0;s:18:"ХотанÑкий";}s:2:"kk";a:1:{i:0;s:18:"КазахÑкий";}s:2:"kl";a:1:{i:0;s:24:"ГренландÑкий";}s:2:"km";a:1:{i:0;s:26:"КамбоджийÑкий";}s:2:"kn";a:1:{i:0;s:12:"Канада";}s:2:"ko";a:1:{i:0;s:18:"КорейÑкий";}s:3:"kok";a:1:{i:0;s:14:"Конкани";}s:3:"kpe";a:1:{i:0;s:12:"Кпелле";}s:3:"kro";a:1:{i:0;s:6:"Кру";}s:2:"ks";a:1:{i:0;s:20:"КашмирÑкий";}s:2:"ku";a:1:{i:0;s:12:"Курдиш";}s:3:"kum";a:1:{i:0;s:18:"КумыкÑкий";}s:3:"kut";a:1:{i:0;s:14:"Кутенаи";}s:2:"ky";a:1:{i:0;s:20:"КиргизÑкий";}s:2:"la";a:1:{i:0;s:18:"ЛатинÑкий";}s:3:"lad";a:1:{i:0;s:12:"Ладино";}s:3:"lah";a:1:{i:0;s:12:"Лахнда";}s:3:"lam";a:1:{i:0;s:10:"Ламба";}s:3:"lez";a:1:{i:0;s:20:"ЛезгинÑкий";}s:2:"ln";a:1:{i:0;s:14:"Лингала";}s:2:"lo";a:1:{i:0;s:16:"ЛаоÑÑкий";}s:3:"lol";a:1:{i:0;s:10:"Монго";}s:3:"loz";a:1:{i:0;s:8:"Лози";}s:2:"lt";a:1:{i:0;s:18:"ЛитовÑкий";}s:2:"lu";a:1:{i:0;s:23:"Луба-Катанга";}s:3:"lui";a:1:{i:0;s:16:"ЛуиÑеньо";}s:3:"lun";a:1:{i:0;s:10:"Лунда";}s:3:"luo";a:1:{i:0;s:39:"Луо (ÐšÐµÐ½Ð¸Ñ Ð¸ ТанзаниÑ)
";}s:2:"lv";a:1:{i:0;s:20:"ЛатвийÑкий";}s:3:"mad";a:1:{i:0;s:18:"МадурÑкий";}s:3:"mag";a:1:{i:0;s:12:"Магахи";}s:3:"mai";a:1:{i:0;s:16:"Майтхили";}s:3:"mak";a:1:{i:0;s:24:"МакаÑÑарÑкий";}s:3:"man";a:1:{i:0;s:16:"Мандинго";}s:3:"map";a:1:{i:0;s:45:"ÐвÑтронезийÑкие (другие)";}s:3:"mas";a:1:{i:0;s:10:"МаÑаи";}s:3:"men";a:1:{i:0;s:10:"Менде";}s:2:"mg";a:1:{i:0;s:26:"МалагаÑийÑкий";}s:3:"mga";a:1:{i:0;s:32:"СреднеирландÑкий";}s:2:"mi";a:1:{i:0;s:10:"Маори";}s:3:"mic";a:1:{i:0;s:12:"Микмак";}s:3:"min";a:1:{i:0;s:22:"Минангкабау";}s:3:"mis";a:1:{i:0;s:33:"Смешанные (другие)";}s:2:"mk";a:1:{i:0;s:22:"МакедонÑкий";}s:3:"mkh";a:1:{i:0;s:39:"МонкхмерÑкие (другие)";}s:2:"ml";a:1:{i:0;s:16:"МалаÑлам";}s:2:"mn";a:1:{i:0;s:22:"МонгольÑкий";}s:3:"mni";a:1:{i:0;s:22:"МанипурÑкий";}s:3:"mno";a:1:{i:0;s:23:"Манобо Ñзыки";}s:2:"mo";a:1:{i:0;s:20:"МолдавÑкий";}s:3:"moh";a:1:{i:0;s:12:"Мохаук";}s:3:"mos";a:1:{i:0;s:8:"Моей";}s:2:"mr";a:1:{i:0;s:22:"МаратийÑкий";}s:2:"ms";a:1:{i:0;s:18:"МалайÑкий";}s:2:"mt";a:1:{i:0;s:22:"МальтийÑкий";}s:3:"mul";a:1:{i:0;s:34:"Разных Ñемей Ñзыки";}s:3:"mun";a:1:{i:0;s:21:"Мунда Ñзыки";}s:3:"mus";a:1:{i:0;s:8:"Крик";}s:3:"mwr";a:1:{i:0;s:14:"Марвари";}s:2:"my";a:1:{i:0;s:20:"БирманÑкий";}s:3:"myn";a:1:{i:0;s:19:"ÐœÐ°Ð¹Ñ Ñзыки";}s:2:"na";a:1:{i:0;s:10:"Ðауру";}s:3:"nah";a:1:{i:0;s:18:"ÐцтекÑкий";}s:3:"nai";a:1:{i:0;s:63:"Северной Ðмерики индейцев (другие)";}s:2:"ne";a:1:{i:0;s:20:"ÐепальÑкий";}s:3:"new";a:1:{i:0;s:18:"ÐеварÑкий";}s:3:"nic";a:1:{i:0;s:50:"Ðигер-кордофанÑкие (другие)";}s:3:"niu";a:1:{i:0;s:8:"ÐиуÑ";}s:2:"nl";a:1:{i:0;s:22:"ГолландÑкий";}s:2:"no";a:1:{i:0;s:20:"ÐорвежÑ
кий";}s:3:"nog";a:1:{i:0;s:18:"ÐогайÑкий";}s:3:"non";a:1:{i:0;s:30:"СтаронорвежÑкий";}s:3:"nso";a:1:{i:0;s:25:"Сото Северный";}s:3:"nub";a:1:{i:0;s:29:"ÐубийÑкие Ñзыки";}s:3:"nym";a:1:{i:0;s:16:"ÐÑŒÑмвези";}s:3:"nyn";a:1:{i:0;s:16:"ÐÑŒÑнколе";}s:3:"nyo";a:1:{i:0;s:10:"Ðьоро";}s:3:"nzi";a:1:{i:0;s:10:"Ðзима";}s:2:"oc";a:1:{i:0;s:12:"Окитан";}s:2:"oj";a:1:{i:0;s:14:"Оджибва";}s:2:"om";a:1:{i:0;s:21:"Оромо (Ðфан)";}s:2:"or";a:1:{i:0;s:8:"ОриÑ";}s:2:"os";a:1:{i:0;s:20:"ОÑетинÑкий";}s:3:"osa";a:1:{i:0;s:12:"ОÑеджи";}s:3:"ota";a:1:{i:0;s:26:"Старотурецкий";}s:3:"oto";a:1:{i:0;s:33:"ОтомангÑкие Ñзыки";}s:2:"pa";a:1:{i:0;s:22:"ПанджабÑкий";}s:3:"paa";a:1:{i:0;s:60:"ПапуаÑÑко-авÑтралийÑкие (другие)";}s:3:"pag";a:1:{i:0;s:20:"ПангаÑинан";}s:3:"pal";a:1:{i:0;s:24:"ПехлевийÑкий";}s:3:"pam";a:1:{i:0;s:16:"Пампанга";}s:3:"pap";a:1:{i:0;s:20:"ПапьÑменто";}s:3:"pau";a:1:{i:0;s:10:"Палау";}s:3:"peo";a:1:{i:0;s:30:"СтароперÑидÑкий";}s:3:"phn";a:1:{i:0;s:22:"ФиникийÑкий";}s:2:"pi";a:1:{i:0;s:8:"Пали";}s:2:"pl";a:1:{i:0;s:16:"ПольÑкий";}s:3:"pon";a:1:{i:0;s:12:"Понапе";}s:3:"pra";a:1:{i:0;s:27:"Пракриты Ñзыки";}s:3:"pro";a:1:{i:0;s:38:"СтаропрованÑальÑкий";}s:2:"ps";a:1:{i:0;s:23:"Пашто (Пушто)";}s:2:"pt";a:1:{i:0;s:26:"ПортугальÑкий";}s:2:"qu";a:1:{i:0;s:10:"Кечуа";}s:3:"raj";a:1:{i:0;s:22:"РаджаÑтхани";}s:2:"rm";a:1:{i:0;s:29:"Раето-романÑкий";}s:2:"rn";a:1:{i:0;s:24:"КирундийÑкий";}s:2:"ro";a:1:{i:0;s:18:"РумынÑкий";}s:3:"roa";a:1:{i:0;s:33:"РоманÑкие (другие)";}s:3:"rom";a:1:{i:0;s:18:"ЦыганÑкий";}s:2:"ru";a:1:{i:0;s:14:"РуÑÑкий";}s:2:"rw";a:1:{i:0;s:20:"КинÑрванда";}s:2:"sa";a:1:{i:0;s:16:"СанÑкрит";}s:3
:"sad";a:1:{i:0;s:14:"Сандаве";}s:3:"sah";a:1:{i:0;s:16:"ЯкутÑкий";}s:3:"sai";a:1:{i:0;s:57:"Южной Ðмерики индейцев (другие)";}s:3:"sal";a:1:{i:0;s:29:"СалишÑкие Ñзыки";}s:3:"sam";a:1:{i:0;s:47:"СамаритÑнÑкий арамейÑкий";}s:2:"sd";a:1:{i:0;s:10:"Синди";}s:3:"sel";a:1:{i:0;s:22:"СелькупÑкий";}s:3:"sem";a:1:{i:0;s:33:"СемитÑкие (другие)";}s:2:"sg";a:1:{i:0;s:10:"Санго";}s:3:"sga";a:1:{i:0;s:30:"СтароирландÑкий";}s:2:"sh";a:1:{i:0;s:35:"СербÑко-хорватÑкий";}s:3:"shn";a:1:{i:0;s:14:"ШанÑкий";}s:2:"si";a:1:{i:0;s:22:"СингальÑкий";}s:3:"sid";a:1:{i:0;s:12:"Сидама";}s:3:"sio";a:1:{i:0;s:17:"Сиу Ñзыки";}s:3:"sit";a:1:{i:0;s:41:"СинотибетÑкие (другие)";}s:2:"sk";a:1:{i:0;s:18:"Словацкий";}s:2:"sl";a:1:{i:0;s:20:"СловенÑкий";}s:3:"sla";a:1:{i:0;s:35:"СлавÑнÑкие (другие)";}s:2:"sm";a:1:{i:0;s:10:"Самоа";}s:3:"smi";a:1:{i:0;s:27:"СаамÑкие Ñзыки";}s:2:"sn";a:1:{i:0;s:8:"Шона";}s:2:"so";a:1:{i:0;s:12:"Сомали";}s:3:"sog";a:1:{i:0;s:20:"СогдийÑкий";}s:2:"sq";a:1:{i:0;s:18:"ÐлбанÑкий";}s:2:"sr";a:1:{i:0;s:16:"СербÑкий";}s:2:"ss";a:1:{i:0;s:14:"СиÑвати";}s:3:"ssa";a:1:{i:0;s:42:"Ðило-ÑахарÑкие (другие)";}s:2:"st";a:1:{i:0;s:12:"СеÑото";}s:2:"su";a:1:{i:0;s:24:"СанданизÑкий";}s:3:"suk";a:1:{i:0;s:12:"Сукума";}s:3:"sus";a:1:{i:0;s:8:"СуÑу";}s:3:"sux";a:1:{i:0;s:18:"ШумерÑкий";}s:2:"sv";a:1:{i:0;s:16:"ШведÑкий";}s:2:"sw";a:1:{i:0;s:14:"Суахили";}s:2:"ta";a:1:{i:0;s:20:"ТамильÑкий";}s:3:"tai";a:1:{i:0;s:14:"ТатÑкий";}s:2:"te";a:1:{i:0;s:12:"Телугу";}s:3:"ter";a:1:{i:0;s:12:"Терено";}s:2:"tg";a:1:{i:0;s:20:"ТаджикÑкий";}s:2:"th";a:1:{i:0;s:14:"ТайÑкий";}s:2:"ti";a:1:{i:0;s:16:"Тигриниа";}s:3:"tig";a:1:{i:0;s:10:"Тигре";
}s:3:"tiv";a:1:{i:0;s:8:"Тиви";}s:2:"tk";a:1:{i:0;s:22:"ТуркменÑкий";}s:2:"tl";a:1:{i:0;s:14:"Тагалог";}s:3:"tli";a:1:{i:0;s:14:"Тлингит";}s:3:"tmh";a:1:{i:0;s:14:"Тамашек";}s:2:"tn";a:1:{i:0;s:16:"СетÑвана";}s:2:"to";a:1:{i:0;s:10:"Тонга";}s:3:"tog";a:1:{i:0;s:23:"Тонга (ÐÑŒÑÑа)";}s:2:"tr";a:1:{i:0;s:16:"Турецкий";}s:2:"ts";a:1:{i:0;s:12:"ТÑонга";}s:3:"tsi";a:1:{i:0;s:14:"Цимшиан";}s:2:"tt";a:1:{i:0;s:18:"ТатарÑкий";}s:3:"tut";a:1:{i:0;s:33:"ÐлтайÑкие (другие)";}s:2:"tw";a:1:{i:0;s:6:"Тви";}s:3:"tyv";a:1:{i:0;s:18:"ТувинÑкий";}s:2:"ug";a:1:{i:0;s:18:"УйгурÑкий";}s:3:"uga";a:1:{i:0;s:20:"УгаритÑкий";}s:2:"uk";a:1:{i:0;s:20:"УкраинÑкий";}s:3:"umb";a:1:{i:0;s:14:"Умбунду";}s:3:"und";a:1:{i:0;s:40:"Ðеидентифицированный";}s:2:"ur";a:1:{i:0;s:8:"Урду";}s:2:"uz";a:1:{i:0;s:18:"УзбекÑкий";}s:3:"vai";a:1:{i:0;s:6:"Ваи";}s:2:"vi";a:1:{i:0;s:22:"ВьетнамÑкий";}s:2:"vo";a:1:{i:0;s:14:"Волапак";}s:3:"vot";a:1:{i:0;s:39:"УдмуртÑкий (ВотÑцкий)";}s:3:"wak";a:1:{i:0;s:29:"ВакашÑкие Ñзыки";}s:3:"wal";a:1:{i:0;s:12:"Воламо";}s:3:"war";a:1:{i:0;s:10:"Варай";}s:3:"was";a:1:{i:0;s:8:"Вашо";}s:3:"wen";a:1:{i:0;s:27:"Лужицкие Ñзыки";}s:2:"wo";a:1:{i:0;s:10:"Волоф";}s:2:"xh";a:1:{i:0;s:8:"Хоза";}s:3:"yao";a:1:{i:0;s:4:"Яо";}s:3:"yap";a:1:{i:0;s:4:"Яп";}s:2:"yi";a:1:{i:0;s:8:"Идиш";}s:2:"yo";a:1:{i:0;s:12:"Йоруба";}s:2:"za";a:1:{i:0;s:10:"Зуанг";}s:3:"zap";a:1:{i:0;s:22:"СапотекÑкий";}s:3:"zen";a:1:{i:0;s:18:"ЗенагÑкий";}s:2:"zh";a:1:{i:0;s:18:"КитайÑкий";}s:2:"zu";a:1:{i:0;s:18:"ЗулуÑÑкий";}s:3:"zun";a:1:{i:0;s:10:"Зуньи";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Cyrl";}s:7:"Scripts";a:52:{s:4:"Arab";a:1:{i:0;s:16:"ÐрабÑкаÑ";}s:4:"Armn";a:1:{i:0;s:18:"ÐрмÑнÑкаÑ";}s:4:"Beng";a:1:{i:0;s:22:"Бенг
альÑкаÑ";}s:4:"Bopo";a:1:{i:0;s:16:"Бопомофо";}s:4:"Brai";a:1:{i:0;s:12:"БрайлÑ";}s:4:"Buhd";a:1:{i:0;s:10:"Бухид";}s:4:"Cans";a:1:{i:0;s:85:"Унифицированные Символы КанадÑких Ðборигенов";}s:4:"Cher";a:1:{i:0;s:12:"Чероки";}s:4:"Copt";a:1:{i:0;s:16:"КоптÑкаÑ";}s:4:"Cprt";a:1:{i:0;s:16:"КипрÑкаÑ";}s:4:"Cyrl";a:1:{i:0;s:18:"Кириллица";}s:4:"Deva";a:1:{i:0;s:20:"Деванагари";}s:4:"Dsrt";a:1:{i:0;s:14:"Дезерет";}s:4:"Ethi";a:1:{i:0;s:18:"ЭфиопÑкаÑ";}s:4:"Geor";a:1:{i:0;s:20:"ГрузинÑкаÑ";}s:4:"Goth";a:1:{i:0;s:14:"ГотÑкаÑ";}s:4:"Grek";a:1:{i:0;s:18:"ГречеÑкаÑ";}s:4:"Gujr";a:1:{i:0;s:18:"Гуджарати";}s:4:"Guru";a:1:{i:0;s:16:"Гурмукхи";}s:4:"Hang";a:1:{i:0;s:12:"Хангул";}s:4:"Hano";a:1:{i:0;s:12:"Хануну";}s:4:"Hebr";a:1:{i:0;s:10:"Иврит";}s:4:"Hira";a:1:{i:0;s:16:"Хирагана";}s:4:"Ital";a:1:{i:0;s:32:"СтароитальÑнÑкаÑ";}s:4:"Kana";a:1:{i:0;s:16:"Катакана";}s:4:"Khmr";a:1:{i:0;s:18:"КхмерÑкаÑ";}s:4:"Knda";a:1:{i:0;s:14:"Каннада";}s:4:"Laoo";a:1:{i:0;s:16:"ЛаоÑÑкаÑ";}s:4:"Latn";a:1:{i:0;s:16:"Латиница";}s:4:"Limb";a:1:{i:0;s:10:"Лимбу";}s:4:"Linb";a:1:{i:0;s:19:"Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð‘";}s:4:"Mlym";a:1:{i:0;s:22:"МалаÑльÑкаÑ";}s:4:"Mong";a:1:{i:0;s:22:"МонгольÑкаÑ";}s:4:"Mymr";a:1:{i:0;s:24:"МайанмарÑкаÑ";}s:4:"Ogam";a:1:{i:0;s:22:"ОгамичеÑкаÑ";}s:4:"Orya";a:1:{i:0;s:8:"ОриÑ";}s:4:"Osma";a:1:{i:0;s:18:"ОÑманÑкаÑ";}s:4:"Qaai";a:1:{i:0;s:28:"УнаÑледованнаÑ";}s:4:"Runr";a:1:{i:0;s:20:"РуничеÑкаÑ";}s:4:"Shaw";a:1:{i:0;s:21:"Ðлфавит Шоу";}s:4:"Sinh";a:1:{i:0;s:22:"СингальÑкаÑ";}s:4:"Syrc";a:1:{i:0;s:18:"СирийÑкаÑ";}s:4:"Tagb";a:1:{i:0;s:16:"Тагбанва";}s:4:"Taml";a:1:{i:0;s:20:"ТамильÑкаÑ";}s:4:"Telu";a:1:{i:0;s:12:"Телугу";}s:4:"Tglg";a:1:{i:0;s:14:"Ð
¢Ð°Ð³Ð°Ð»Ð¾Ð³";}s:4:"Thaa";a:1:{i:0;s:10:"Таана";}s:4:"Thai";a:1:{i:0;s:14:"ТайÑкаÑ";}s:4:"Tibt";a:1:{i:0;s:18:"ТибетÑкаÑ";}s:4:"Ugar";a:1:{i:0;s:20:"УгаритÑкаÑ";}s:4:"Yiii";a:1:{i:0;s:15:"Йи (ицзу)";}s:4:"Zyyy";a:1:{i:0;s:28:"ÐеопределеннаÑ";}}s:5:"Types";a:1:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:41:"БуддиÑÑ‚Ñкий календарь";}s:7:"chinese";a:1:{i:0;s:37:"КитайÑкий календарь";}s:9:"gregorian";a:1:{i:0;s:45:"ГригорианÑкий календарь";}s:6:"hebrew";a:1:{i:0;s:37:"ЕврейÑкий календарь";}s:7:"islamic";a:1:{i:0;s:37:"ИÑламÑкий календарь";}s:13:"islamic-civil";a:1:{i:0;s:60:"ИÑламÑкий гражданÑкий календарь";}s:8:"japanese";a:1:{i:0;s:35:"ЯпонÑкий календарь";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:9:"H:mm:ss z";i:1;s:9:"H:mm:ss z";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:17:"d MMMM yyyy 'г.'";i:5;s:17:"d MMMM yyyy 'г.'";i:6;s:10:"dd.MM.yyyy";i:7;s:8:"dd.MM.yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:4:"Ð’Ñ";i:1;s:4:"Пн";i:2;s:4:"Ð’Ñ‚";i:3;s:4:"Ср";i:4;s:4:"Чт";i:5;s:4:"Пт";i:6;s:4:"Сб";}s:6:"narrow";a:7:{i:0;s:2:"Ð’";i:1;s:2:"П";i:2;s:2:"Ð’";i:3;s:2:"С";i:4;s:2:"Ч";i:5;s:2:"П";i:6;s:2:"С";}s:4:"wide";a:7:{i:0;s:22:"воÑкреÑенье";i:1;s:22:"понедельник";i:2;s:14:"вторник";i:3;s:10:"Ñреда";i:4;s:14:"четверг";i:5;s:14:"пÑтница";i:6;s:14:"Ñуббота";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:11:"до н.Ñ.";i:1;s:6:"н.Ñ.";}}s:10:"monthNames";a:2:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:7:"Ñнв.";i:1;s:9:"февр.";i:2;s:10:"марта";i:3;s:7:"апр.";i:4;s:6:"маÑ";i:5;s:8:"июнÑ";i:6;s:8:"июлÑ";i:7;s:7:"авг.";i:8;s:9:"Ñент.";i:9;s:7:"окт.";i:10;s:9
:"ноÑб.";i:11;s:7:"дек.";}s:6:"narrow";a:12:{i:0;s:2:"Я";i:1;s:2:"Ф";i:2;s:2:"Ðœ";i:3;s:2:"Ð";i:4;s:2:"Ðœ";i:5;s:2:"И";i:6;s:2:"И";i:7;s:2:"Ð";i:8;s:2:"С";i:9;s:2:"О";i:10;s:2:"Ð";i:11;s:2:"Д";}s:4:"wide";a:12:{i:0;s:12:"ÑнварÑ";i:1;s:14:"февралÑ";i:2;s:10:"марта";i:3;s:12:"апрелÑ";i:4;s:6:"маÑ";i:5;s:8:"июнÑ";i:6;s:8:"июлÑ";i:7;s:14:"авгуÑта";i:8;s:16:"ÑентÑбрÑ";i:9;s:14:"октÑбрÑ";i:10;s:12:"ноÑбрÑ";i:11;s:14:"декабрÑ";}}s:11:"stand-alone";a:3:{s:11:"abbreviated";a:12:{i:0;s:7:"Ñнв.";i:1;s:9:"февр.";i:2;s:8:"март";i:3;s:7:"апр.";i:4;s:6:"май";i:5;s:8:"июнь";i:6;s:8:"июль";i:7;s:7:"авг.";i:8;s:9:"Ñент.";i:9;s:7:"окт.";i:10;s:9:"ноÑб.";i:11;s:7:"дек.";}s:6:"narrow";a:12:{i:0;s:2:"Я";i:1;s:2:"Ф";i:2;s:2:"Ðœ";i:3;s:2:"Ð";i:4;s:2:"Ðœ";i:5;s:2:"И";i:6;s:2:"И";i:7;s:2:"Ð";i:8;s:2:"С";i:9;s:2:"О";i:10;s:2:"Ð";i:11;s:2:"Д";}s:4:"wide";a:12:{i:0;s:12:"Январь";i:1;s:14:"Февраль";i:2;s:8:"Март";i:3;s:12:"Ðпрель";i:4;s:6:"Май";i:5;s:8:"Июнь";i:6;s:8:"Июль";i:7;s:12:"ÐвгуÑÑ‚";i:8;s:16:"СентÑбрь";i:9;s:14:"ОктÑбрь";i:10;s:12:"ÐоÑбрь";i:11;s:14:"Декабрь";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ru_RU.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ru_RU.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ru_RU.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"#,##0.00¤;-#,##0.00¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ru_UA.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ru_UA.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ru_UA.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:23:"EEEE, d MMMM yyyy 'г.'";i:5;s:11:"d MMMM yyyy";i:6;s:10:"d MMM yyyy";i:7;s:8:"dd.MM.yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sh.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sh.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sh.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"__ALIAS";a:1:{i:0;s:7:"sr_Latn";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sh_YU.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sh_YU.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sh_YU.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"__ALIAS";a:1:{i:0;s:10:"sr_Latn_YU";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sk.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sk.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sk.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:11:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:26:"Spojené arabské emiráty";}s:2:"AF";a:1:{i:0;s:10:"Afganistan";}s:2:"AG";a:1:{i:0;s:18:"Antigua a Barbados";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:9:"Albánsko";}s:2:"AM";a:1:{i:0;s:9:"Arménsko";}s:2:"AN";a:1:{i:0;s:17:"Holandské Antily";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarctica";}s:2:"AR";a:1:{i:0;s:10:"Argentína";}s:2:"AS";a:1:{i:0;s:15:"Americká Samoa";}s:2:"AT";a:1:{i:0;s:8:"Rakúsko";}s:2:"AU";a:1:{i:0;s:10:"Austrália";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:12:"Azerbajdžan";}s:2:"BA";a:1:{i:0;s:19:"Bosna a Hercegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:11:"Bangladéš";}s:2:"BE";a:1:{i:0;s:8:"Belgicko";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:9:"Bulharsko";}s:2:"BH";a:1:{i:0;s:7:"Bahrajn";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermudy";}s:2:"BN";a:1:{i:0;s:6:"Brunej";}s:2:"BO";a:1:{i:0;s:8:"Bolívia";}s:2:"BR";a:1:{i:0;s:9:"Brazília";}s:2:"BS";a:1:{i:0;s:6:"Bahamy";}s:2:"BT";a:1:{i:0;s:6:"Bután";}s:2:"BV";a:1:{i:0;s:15:"Bouvetov ostrov";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:10:"Bielorusko";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:30:"Kokosové (Keelingove) ostrovy";}s:2:"CD";a:1:{i:0;s:33:"Konžská demokratická republika";}s:2:"CF";a:1:{i:0;s:24:"Stredoafrická republika";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:13:"Å vajÄiarsko";}s:2:"CI";a:1:{i:0;s:19:"Pobrežie Slonoviny";}s:2:"CK";a:1:{i:0;s:15:"Cookove ostrovy";}s:2:"CL";a:1:{i:0;s:5:"ÄŒile";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:6:"Čína";}s:2:"CO";a:1:{i:0;s:8:"Kolumbia";}s:2:"CR";a:1:{i:0;s:9:"Kostarika";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:8:"Kapverdy";}s:2:"CX";a:1:{i:0;s:17:"VianoÄný ostrov";}s:2:"CY";a:1:{i:0;s:6:"Cyprus";}s:2:"CZ";a:1:{i:0;s:17:"ÄŒeská republika";}s:2:"DE";a:1:{i:0;s:7:"Nemecko";}s:2:"D
J";a:1:{i:0;s:8:"Džibuti";}s:2:"DK";a:1:{i:0;s:7:"Dánsko";}s:2:"DM";a:1:{i:0;s:8:"Dominika";}s:2:"DO";a:1:{i:0;s:23:"Dominikánska republika";}s:2:"DZ";a:1:{i:0;s:10:"Alžírsko";}s:2:"EC";a:1:{i:0;s:8:"Ekvádor";}s:2:"EE";a:1:{i:0;s:9:"Estónsko";}s:2:"EG";a:1:{i:0;s:5:"Egypt";}s:2:"EH";a:1:{i:0;s:16:"Západná Sahara";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:11:"Å panielsko";}s:2:"ET";a:1:{i:0;s:8:"Etiópia";}s:2:"FI";a:1:{i:0;s:7:"Fínsko";}s:2:"FJ";a:1:{i:0;s:6:"Fidži";}s:2:"FK";a:1:{i:0;s:20:"Falklandské ostrovy";}s:2:"FM";a:1:{i:0;s:33:"Mikronézia, Federatívne Å¡táty";}s:2:"FO";a:1:{i:0;s:16:"Faerské ostrovy";}s:2:"FR";a:1:{i:0;s:11:"Francúzsko";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:21:"Spojené kráľovstvo";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:10:"Gruzínsko";}s:2:"GF";a:1:{i:0;s:19:"Francúzska Guayana";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:10:"Gibraltár";}s:2:"GL";a:1:{i:0;s:8:"Grónsko";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:18:"Rovníková Guinea";}s:2:"GR";a:1:{i:0;s:7:"Grécko";}s:2:"GS";a:1:{i:0;s:45:"Južná Georgia a Južné Sandwichove ostrovy";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinea-Bissau";}s:2:"GY";a:1:{i:0;s:7:"Guayana";}s:2:"HK";a:1:{i:0;s:23:"Hong Kong S.A.R. Číny";}s:2:"HM";a:1:{i:0;s:38:"Heardove ostrovy a McDonaldove ostrovy";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:11:"Chorvátsko";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:9:"MaÄarsko";}s:2:"ID";a:1:{i:0;s:10:"Indonézia";}s:2:"IE";a:1:{i:0;s:6:"Ãrsko";}s:2:"IL";a:1:{i:0;s:6:"Izrael";}s:2:"IN";a:1:{i:0;s:5:"India";}s:2:"IO";a:1:{i:0;s:35:"Britské územie v Indickom oceáne";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IR";a:1:{i:0;s:5:"Irán";}s:2:"IS";a:1:{i:0;s:6:"Island";}s:2:"IT";a:1:{i:0;s:9:"Taliansko";}s:2:"JM";a:1:{i:0;s:7:"Jamajka";}s:2:"JO";a:1:{i:0;s:10:"Jordánsko";}s:2:"JP";a:1:{i:0;s:8:"Japonsko";}
s:2:"KE";a:1:{i:0;s:5:"Keňa";}s:2:"KG";a:1:{i:0;s:9:"Kirgizsko";}s:2:"KH";a:1:{i:0;s:9:"Kambodža";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:6:"Komory";}s:2:"KN";a:1:{i:0;s:19:"Saint Kitts a Nevis";}s:2:"KP";a:1:{i:0;s:16:"Kórea, Severná";}s:2:"KR";a:1:{i:0;s:15:"Kórea, Južná";}s:2:"KW";a:1:{i:0;s:6:"Kuvajt";}s:2:"KY";a:1:{i:0;s:18:"Kajmanské ostrovy";}s:2:"KZ";a:1:{i:0;s:10:"Kazachstan";}s:2:"LA";a:1:{i:0;s:38:"Laoská ľudovodemokratická republika";}s:2:"LB";a:1:{i:0;s:7:"Libanon";}s:2:"LC";a:1:{i:0;s:13:"Svätá Lucia";}s:2:"LI";a:1:{i:0;s:16:"Lichtenštajnsko";}s:2:"LK";a:1:{i:0;s:10:"Srí Lanka";}s:2:"LR";a:1:{i:0;s:8:"Libéria";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:5:"Litva";}s:2:"LU";a:1:{i:0;s:11:"Luxembursko";}s:2:"LV";a:1:{i:0;s:9:"Lotyšsko";}s:2:"LY";a:1:{i:0;s:33:"Lýbijská arabská džamahírija";}s:2:"MA";a:1:{i:0;s:6:"Maroko";}s:2:"MC";a:1:{i:0;s:6:"Monako";}s:2:"MD";a:1:{i:0;s:20:"Moldavsko, republika";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:19:"Marshallove ostrovy";}s:2:"MK";a:1:{i:0;s:22:"Macedónsko, republika";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:10:"Mjanmarsko";}s:2:"MN";a:1:{i:0;s:9:"Mongolsko";}s:2:"MO";a:1:{i:0;s:19:"Makao S.A.R. Číny";}s:2:"MP";a:1:{i:0;s:17:"Severné Mariány";}s:2:"MQ";a:1:{i:0;s:8:"Martinik";}s:2:"MR";a:1:{i:0;s:11:"Mauritánia";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:10:"Maurícius";}s:2:"MV";a:1:{i:0;s:7:"Maldivy";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:6:"Mexiko";}s:2:"MY";a:1:{i:0;s:8:"Malajzia";}s:2:"MZ";a:1:{i:0;s:8:"Mozambik";}s:2:"NA";a:1:{i:0;s:8:"Namíbia";}s:2:"NC";a:1:{i:0;s:16:"Nová Kaledónia";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:16:"Norfolkov ostrov";}s:2:"NG";a:1:{i:0;s:8:"Nigéria";}s:2:"NI";a:1:{i:0;s:9:"Nikaragua";}s:2:"NL";a:1:{i:0;s:9:"Holandsko";}s:2:"NO";a:1:{i:0;s:7:"Nórsko";}s:2:"NP";a:1:{i:0;s:6:"Nepál";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:13:"Nový
 Zéland";}s:2:"OM";a:1:{i:0;s:5:"Omán";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:22:"Francúzska Polynézia";}s:2:"PG";a:1:{i:0;s:18:"Papua Nová Guinea";}s:2:"PH";a:1:{i:0;s:9:"Filipíny";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:7:"Poľsko";}s:2:"PM";a:1:{i:0;s:23:"Saint Pierre a Miquelon";}s:2:"PN";a:1:{i:0;s:19:"Pitcairnove ostrovy";}s:2:"PR";a:1:{i:0;s:9:"Portoriko";}s:2:"PS";a:1:{i:0;s:20:"Palestínske územie";}s:2:"PT";a:1:{i:0;s:11:"Portugalsko";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguaj";}s:2:"QA";a:1:{i:0;s:5:"Katar";}s:2:"RE";a:1:{i:0;s:7:"Reunion";}s:2:"RO";a:1:{i:0;s:8:"Rumunsko";}s:2:"RU";a:1:{i:0;s:17:"Ruská federácia";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:16:"Saudská Arábia";}s:2:"SB";a:1:{i:0;s:20:"Šalamúnove ostrovy";}s:2:"SC";a:1:{i:0;s:19:"Seychelské ostrovy";}s:2:"SD";a:1:{i:0;s:6:"Sudán";}s:2:"SE";a:1:{i:0;s:9:"Švédsko";}s:2:"SG";a:1:{i:0;s:8:"Singapur";}s:2:"SH";a:1:{i:0;s:14:"Svätá Helena";}s:2:"SI";a:1:{i:0;s:9:"Slovinsko";}s:2:"SJ";a:1:{i:0;s:22:"Špicbergy a Jan Mayen";}s:2:"SK";a:1:{i:0;s:20:"Slovenská republika";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:11:"San Maríno";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:9:"Somálsko";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:34:"Svätý Tomáš a Princove ostrovy";}s:2:"SV";a:1:{i:0;s:8:"Salvador";}s:2:"SY";a:1:{i:0;s:26:"Sýrska arabská republika";}s:2:"SZ";a:1:{i:0;s:9:"Svazijsko";}s:2:"TC";a:1:{i:0;s:14:"Turks a Caicos";}s:2:"TD";a:1:{i:0;s:4:"Čad";}s:2:"TF";a:1:{i:0;s:27:"Francúzske južné územia";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:7:"Thajsko";}s:2:"TJ";a:1:{i:0;s:12:"Tadžikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:16:"Východný Timor";}s:2:"TM";a:1:{i:0;s:11:"Turkménsko";}s:2:"TN";a:1:{i:0;s:7:"Tunisko";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:7:"Turecko";}s:2:"TT";a:1:{i:0;s:17:"Trinidad a Tobago";}s:2:"TV";
a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Tajwan";}s:2:"TZ";a:1:{i:0;s:9:"Tanzánia";}s:2:"UA";a:1:{i:0;s:8:"Ukrajina";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:29:"Menšie odľahlé ostrovy USA";}s:2:"US";a:1:{i:0;s:16:"Spojené štáty";}s:2:"UY";a:1:{i:0;s:7:"Uruguaj";}s:2:"UZ";a:1:{i:0;s:10:"Uzbekistan";}s:2:"VA";a:1:{i:0;s:45:"Svätá stolica (Vatikánsky mestský štát)";}s:2:"VC";a:1:{i:0;s:28:"Svätý Vincent a Grenadíny";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:26:"Britské panenské ostrovy";}s:2:"VI";a:1:{i:0;s:23:"Panenské ostrovy - USA";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:15:"Wallis a Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:11:"Juhoslávia";}s:2:"ZA";a:1:{i:0;s:14:"Južná Afrika";}s:2:"ZM";a:1:{i:0;s:6:"Zambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:369:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:15:"Andorský diner";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:16:"Andorská peseta";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:10:"UAE dirham";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:20:"Affars a Issas frank";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:25:"Albánsky lek (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:13:"Albánsky lek";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:23:"Albánsky valutový lek";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:33:"Albánske dolárové certifikáty";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:14:"Armenský dram";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:29:"Nizozemský Antilský guilder";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:16:"Angolská kwanza";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:28:"Angolská kwanza (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:34:"Angolská nová kwanza (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:39:"Angolská kwanza Reajustado (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:16:"Angolské eskudo";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:20:"Argentinský austral";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:33:"Argentinské peso M
oneda Nacional";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:29:"Argentinské peso (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:17:"Argentinské peso";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:16:"Rakúsky Å¡iling";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:18:"Austrálsky dolár";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:17:"Austrálska libra";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:16:"Arubský guilder";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:22:"Azerbaidžanský manat";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:18:"Bosnianský dinár";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:32:"Bosnianský konvertibilná marka";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:24:"Bosnianský nový dinár";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:18:"Barbadoský dolár";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:19:"Bangladéšska taka";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:32:"Belgický frank (konvertibilný)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:15:"Belgický frank";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:28:"Belgický frank (finanÄný)";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:15:"Bulharský leva";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:30:"Bulharský socialistický leva";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:21:"Bulharský leva nový";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:27:"Bulharský leva (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:30:"Bulharské certifikáty v leva";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:17:"Bahraiský dinár";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:16:"Burundský frank";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:17:"Bermudský dolár";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:16:"Bermudská libra";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:17:"Bruneiský dolár";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:16:"Bolivíjske peso";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:17:"Bolivíjske mvdol";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:37:"Bolivíjske Cruzeiro Novo (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:19:"Bolivíjske cruzado";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:32:"Bolivíjske cruzeiro (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:16:"Bolivíjsky real";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:23:"Brazílske Cruzado Novo";}s:3
:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:19:"Brazílske cruzeiro";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:31:"Brazílske cruzeiro (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:16:"Bahamský dolár";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:15:"Bahamská libra";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:18:"Bhutansky ngultrum";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:12:"Bhutan rupia";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:12:"Burmese Kyat";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:13:"Burmese rupia";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:14:"Botswanan Pula";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:36:"Belarussian nový rubeľ (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:30:"Belarussian rubeľ (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:18:"Belarussian rubeľ";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:13:"Belize dolár";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:28:"Britiský Honduraský dolár";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:16:"Kanadský dolár";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:25:"Konžský frank Congolais";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:15:"Konžský frank";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:15:"Konžský zaire";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:13:"CAR CFA frank";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:20:"Å vajÄiarský frank";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:19:"Cook Islands dolár";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:15:"Čílsky condor";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:15:"Čílske eskudo";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:28:"Čílske Unidades de Fomento";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:13:"Čílske peso";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:21:"Camerunský CFA frank";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:26:"Čínsky Jen Min Piao Yuan";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:36:"Čínsky certifikáty v US dolároch";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:22:"Čínsky Yuan Renminbi";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:28:"Colombijské papierové peso";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:19:"Konžský CFA frank";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:17:"Colombijské peso";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:18:"Kostarikský colon";}s:3:"CSC";a:
2:{i:0;s:3:"CSC";i:1;s:23:"Československá koruna";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:23:"Československá koruna";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:14:"Kubánske peso";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:22:"Kubánske certifikáty";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:17:"Cape Verde eskudo";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:15:"Curacao guilder";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:15:"Cypruská libra";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:14:"Česká koruna";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:22:"Východonemecká marka";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:14:"Nemecká marka";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:19:"Nemecká sperrmarka";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:17:"Džibutský frank";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:13:"Dánska krone";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:18:"Dominikánske peso";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:17:"Alžírsky dinár";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:22:"Alžírsky nový frank";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:25:"Alžírsky frank Germinal";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:17:"Ekuadorský sucre";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:43:"Ekuadorský Unidad de Valor Constante (UVC)";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:15:"Estónska kroon";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:15:"Egyptská libra";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:17:"Eritrejská nakfa";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:19:"Španielská peseta";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:15:"Ethiopský birr";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:17:"Ethiopský dolár";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"Euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:13:"Finská marka";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:25:"Finská marka (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:11:"Fiji dolár";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:10:"Fiji libra";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:18:"Falklandská libra";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:21:"Faeroe Islands Kronur";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:17:"Francúzsky frank";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:41:"Francúzsky frank Germinal/frank Poincare";}s:3:"GA
F";a:2:{i:0;s:3:"GAF";i:1;s:19:"Gabúnsky CFA frank";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:14:"Britská libra";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:22:"Gruzínsky Kupon Larit";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:15:"Gruzínsky lari";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:13:"Ghanský cedi";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:20:"Ghanský starý cedi";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:14:"Ghanská libra";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:27:"Ghanský prehodnotený cedi";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:19:"Gibraltarská libra";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:14:"Grónsky krone";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:15:"Gambský dalasi";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:14:"Gambská libra";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:16:"Guinejský frank";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:28:"Guinejský frank (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:15:"Guinejský syli";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:19:"Guadeloupský frank";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:34:"Rovníková Guinea Ekwele Guineana";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:25:"Rovníková Guinea franko";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:34:"Rovníková Guinea Peseta Guineana";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:15:"Grécka drachma";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:21:"Grécka nová drachma";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:20:"Guatemalský quetzal";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:31:"Francúzska Guyana frank Guiana";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:26:"Portugalská Guinea eskudo";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:28:"Portugalské Guinea Mil Reis";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:18:"Guinea-Bissau peso";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:16:"Guyanský dolár";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:20:"Hong Kongský dolár";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:18:"Hoduraská lempira";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:18:"Chorvátsky dinár";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:16:"Chorvátska kuna";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:15:"Haitské gourde";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:17:"MaÄarský forint";}s:3:"IBP";a:2:{i:0;s
:3:"IBP";i:1;s:18:"Severoírska libra";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:24:"Indonézsky nica guilder";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:22:"Indonézska Java rupia";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:23:"Indonézska nová rupia";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:17:"Indonézska rupia";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:12:"Ãrska libra";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:17:"Izraelský Å¡ekel";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:16:"Izraelská libra";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:17:"Izraelský Å¡ekel";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:17:"Libra Isle of Man";}s:3:"INR";a:2:{i:0;s:3:"INR";i:1;s:15:"Indijská rupia";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:14:"Iracký dinár";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:13:"Iránsky rial";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:16:"Islandská krona";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:15:"Talianská lira";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:12:"Jersey libra";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:16:"Jamajský dolár";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:15:"Jamajská libra";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:17:"Jordánsky dinár";}s:3:"JPY";a:2:{i:0;s:2:"Â¥";i:1;s:13:"Japonský yen";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:16:"Keňský Å¡iling";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:13:"Kyrgyský som";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:24:"Kambodžský starý riel";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:17:"Kambodžský riel";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:15:"Kiribati dolár";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:12:"Comoro frank";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:20:"Severokórejský won";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:20:"Severokórejský won";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:19:"Juhokórejský hwan";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:25:"Juhokórejský starý won";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:18:"Juhokórejský won";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:17:"Kuvaitský dinár";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:17:"Kajmanský dolár";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:17:"Kazažský rubeľ";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:16:"Kazažský tenge";}s:3:"LAK";a:
2:{i:0;s:3:"LAK";i:1;s:11:"Laoský kip";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:17:"Libanonská libra";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:23:"Lichtenšteinský frank";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:17:"Šrilanská rupia";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:16:"Ceylonská rupia";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:17:"Libérský dolár";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:15:"Lesothský loti";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:14:"Litevská lita";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:17:"Litevský talonas";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:18:"Luxemburský frank";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:15:"Lotyšský lats";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:17:"Lotyšský rubeľ";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:18:"Libyjská BMA lira";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:16:"Libyjský dinár";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:15:"Libyjská libra";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:15:"Marocký dirham";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:14:"Marocký frank";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:22:"Monacký frank Nouveau";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:23:"Monacký frank Germinal";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:20:"Moldavský Leu Cupon";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:14:"Moldavský leu";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:17:"Moldavský rubeľ";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:21:"Madagaskarský ariary";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:20:"Madagaskarský frank";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:23:"Marshall Islands dolár";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:18:"Macedónsky denár";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:30:"Macedónsky denár (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:13:"Malský frank";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:16:"Myanmarský kyat";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:35:"Myanmarské dolárové certifikáty";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:17:"Mongolský tugrik";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:12:"Macao Pataca";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:16:"Martinique frank";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:18:"Mauritania Ouguiya";}s:3:"MTL";a:2:{i:0;s:2:"
Lm";i:1;s:13:"Maltská lira";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:14:"Maltská libra";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:16:"Mauritská rupia";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:16:"Maldivská rupia";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:18:"Maldivská rufiyaa";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:16:"Malavská kwacha";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:15:"Malavská libra";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:13:"Mexické peso";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:36:"Mexické striborné peso (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:34:"Mexické Unidad de Inversion (UDI)";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:17:"Malajský ringgit";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:19:"Mozambijské eskudo";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:20:"Mozambijské metical";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:16:"Namibský dolár";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:28:"New Caledonia frank Germinal";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:15:"Nigerská naira";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:15:"Nigerská libra";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:22:"New Hebrides CFP frank";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:21:"Nikaragujská cordoba";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:28:"Nikaragujská zlatá Cordoba";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:25:"Nikaragujská Cordoba Oro";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:19:"Nizozemský guilder";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:13:"Nórksy krone";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:15:"Nepálska rupia";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:22:"Novozélandský dolár";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:19:"Nikaragujská libra";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:14:"Ománský rial";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:20:"Ománský rial Saidi";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:16:"Panamská balboa";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:27:"Transdniestria rubeľ Kupon";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:27:"Transdniestria nový rubeľ";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:21:"Transdniestria rubeľ";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:14:"Peruvský inti";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:19:"PeruvskÃ
½ sol Nuevo";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:13:"Peruvský sol";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:23:"Papua Nová Guinea kina";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:16:"Filipínske peso";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:18:"Pakistanská rupia";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:13:"Polský zloty";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:36:"Polské certifikáty v  US dolároch";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:25:"Polský zloty (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:18:"Palestínska libra";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:18:"Portugalské conto";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:19:"Portugalské eskudo";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:20:"Paraguayské guarani";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:14:"Qatarský rial";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:13:"Reunion frank";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:13:"Rumunský leu";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:19:"Rumunský nový leu";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:13:"Ruský rubeľ";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:25:"Ruský rubeľ (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:15:"Rwandský frank";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:14:"Saudský riyal";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:14:"Saudský Riyal";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:22:"Solomon Islands dolár";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:17:"SejÅ¡elská rupia";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:16:"Sudánsky dinár";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:15:"Sudánska libra";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:15:"Å védska krona";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:19:"Singapúrsky dolár";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:5:"Libra";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:21:"Slovinský tolar Bons";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:16:"Slovinský Tolar";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:17:"Slovenská koruna";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:18:"Sierra Leone Leone";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:15:"San Marino lira";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:17:"Somálsky Å¡iling";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:17:"Somálsky Å¡iling";}s:3:"SRG";a:2:{i:0;
s:2:"Sf";i:1;s:19:"Surinamský guilder";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:15:"Škótska libra";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:25:"Sao Tome a Principe dobra";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:26:"Sao Tome a Principe eskudo";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:23:"Sovietský nový rubeľ";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:17:"Sovietský rubeľ";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:21:"El Salvadorský colon";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:13:"Syrská libra";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:19:"Swaziland lilangeni";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:20:"Turks a Caicos Crown";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:18:"Chadský CFA frank";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:13:"Thajský bát";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:23:"Tadžikistanský rubeľ";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:23:"Tadžikistanský somoni";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:17:"Turkménsky manat";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:15:"Tuniský dinár";}s:3:"TOP";a:2:{i:0;s:2:"T$";i:1;s:14:"Tonga Paʻanga";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:11:"Tonga libra";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:16:"Timorské eskudo";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:16:"Timorská pataca";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:13:"Turecká lira";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:24:"Trinidad a Tobago dolár";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:31:"Trinidad a Tobago starý dolár";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:13:"Tuvalu dolár";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:23:"Taiwanský nový dolár";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:18:"Tanzanský šiling";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:17:"Ukrainská hrivna";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:22:"Ukrainský karbovanetz";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:27:"Ugandan šiling (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:17:"Ugandský šiling";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:9:"US dolár";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:20:"US dolár (Next day)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:20:"US dolár (Same day)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:23:"Uruguajské peso Fuerte";}s:3:
"UYP";a:2:{i:0;s:3:"UYP";i:1;s:28:"Uruguajské peso (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:25:"Uruguajské peso Uruguayo";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:25:"Uzbekistanský Coupon Som";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:18:"Uzbekistanský sum";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:16:"Vatikánska lira";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:35:"Severovietnamský Piastre Dong Viet";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:28:"Severovietnamský nový Dong";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:45:"Severovietnamský Viet Minh Piastre Dong Viet";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:20:"Venezuelský bolivar";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:29:"British Virgin Islands dolár";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:16:"Vietnamský dong";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:22:"Vietnamský nový dong";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:16:"Vietnamský dong";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:26:"Vietnamský národný dong";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:12:"Vanuatu vatu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:21:"Západná Samoa libra";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:20:"Západná Samoa tala";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:14:"CFA frank BEAC";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:5:"Zlato";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:21:"East Caribbean dolár";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:17:"CFA Nouveau frank";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:28:"Å peciálne práva Äerpania";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:16:"CFA frank BCEAEC";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:24:"Francúzsky zlatý frank";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:21:"Francúzsky UIC-frank";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:16:"Islamský dinár";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:38:"Francúzsky Metropolitan Nouveau frank";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:29:"Francúzske Antilly CFA frank";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:15:"CFA frank BCEAO";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:9:"CFP frank";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:14:"COMECON rubeľ";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:16:"Jemenský dinár";}s:3:"YEI";a:2:{i:0;s:3:"YE
I";i:1;s:21:"Jemenský Imadi Riyal";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:14:"Jemenský rial";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:19:"Juhoslávsky dinár";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:19:"Juhoslávsky dinár";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:19:"Juhoslávsky dinár";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:25:"Juhoslávsky Noviy dinár";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:19:"Juhoslávsky dinár";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:31:"Juhoslávsky októbrový dinár";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:19:"Juhoslávsky dinár";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:29:"Juhoafrický rand (financial)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:18:"Juhoafrická libra";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:17:"Juhoafrický rand";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:15:"Zambská kwacha";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:14:"Zambská libra";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:20:"Zairský nový zaire";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:14:"Zairský Zaire";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:17:"Zimbabský dolár";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:9:"Kalendár";}s:9:"collation";a:1:{i:0;s:9:"Triedenie";}s:8:"currency";a:1:{i:0;s:4:"Mena";}}s:9:"Languages";a:30:{s:2:"ar";a:1:{i:0;s:8:"arabský";}s:2:"bg";a:1:{i:0;s:10:"bulharský";}s:2:"cs";a:1:{i:0;s:7:"Äeský";}s:2:"da";a:1:{i:0;s:7:"dánsky";}s:2:"de";a:1:{i:0;s:8:"nemecký";}s:2:"el";a:1:{i:0;s:7:"grécky";}s:2:"en";a:1:{i:0;s:9:"anglický";}s:2:"es";a:1:{i:0;s:11:"Å¡panielsky";}s:2:"et";a:1:{i:0;s:9:"estónsky";}s:2:"fi";a:1:{i:0;s:7:"fínsky";}s:2:"fr";a:1:{i:0;s:11:"francúzsky";}s:2:"he";a:1:{i:0;s:10:"hebrejský";}s:2:"hr";a:1:{i:0;s:11:"chorvátsky";}s:2:"hu";a:1:{i:0;s:10:"maÄarský";}s:2:"it";a:1:{i:0;s:9:"taliansky";}s:2:"ja";a:1:{i:0;s:9:"japonský";}s:2:"ko";a:1:{i:0;s:10:"kórejský";}s:2:"lt";a:1:{i:0;s:9:"litovský";}s:2:"lv";a:1:{i:0;s:10:"lotyÅ¡ský";}s:2:"nl";a:1:{i:0;s:10:"holandský";}s:2:"no";a:1:{i:0;s:7:"nórsky";}s:2:"pl";a:1:{i:0;s:8:"poľský";}s:2:"pt";a:1:{i:0;s:12:"portugalský";}s:2:"ro";a:1:{i:0;s:9:"rumunský";}s:2:"ru";a:1:{i:0;s:6:
"ruský";}s:2:"sk";a:1:{i:0;s:10:"slovenský";}s:2:"sl";a:1:{i:0;s:10:"slovinský";}s:2:"sv";a:1:{i:0;s:9:"Å¡védsky";}s:2:"tr";a:1:{i:0;s:8:"turecký";}s:2:"zh";a:1:{i:0;s:8:"Äínsky";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Scripts";a:5:{s:4:"Arab";a:1:{i:0;s:8:"Arabský";}s:4:"Armn";a:1:{i:0;s:9:"Arménsky";}s:4:"Cyrl";a:1:{i:0;s:8:"Cyrilika";}s:4:"Grek";a:1:{i:0;s:7:"Grécky";}s:4:"Zyyy";a:1:{i:0;s:7:"Obecný";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:23:"Buddhistický kalendár";}s:7:"chinese";a:1:{i:0;s:18:"Čínsky kalendár";}s:9:"gregorian";a:1:{i:0;s:23:"Gregoriánsky kalendár";}s:6:"hebrew";a:1:{i:0;s:20:"Židovský kalendár";}s:7:"islamic";a:1:{i:0;s:19:"Islamský kalendár";}s:13:"islamic-civil";a:1:{i:0;s:30:"Islamský obÄiansky kalendár";}s:8:"japanese";a:1:{i:0;s:19:"Japonský kalendár";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:16:"Priame triedenie";}s:9:"phonebook";a:1:{i:0;s:25:"Lexikografické triedenie";}s:6:"pinyin";a:1:{i:0;s:16:"Triedenie pinyin";}s:6:"stroke";a:1:{i:0;s:22:"Tiedenie podľa Å¥ahov";}s:11:"traditional";a:1:{i:0;s:10:"TradiÄné";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:9:"H:mm:ss z";i:1;s:9:"H:mm:ss z";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:18:"EEEE, d. MMMM yyyy";i:5;s:12:"d. MMMM yyyy";i:6;s:8:"d.M.yyyy";i:7;s:8:"d.M.yyyy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:2:"Ne";i:1;s:2:"Po";i:2;s:2:"Ut";i:3;s:2:"St";i:4;s:3:"Å t";i:5;s:2:"Pi";i:6;s:2:"So";}s:6:"narrow";a:7:{i:0;s:1:"N";i:1;s:1:"P";i:2;s:1:"U";i:3;s:1:"S";i:4;s:2:"Å ";i:5;s:1:"P";i:6;s:1:"S";}s:4:"wide";a:7:{i:0;s:7:"Nedeľa";i:1;s:8:"Pondelok";i:2;s:6:"Utorok";i:3;s:6:"Streda";i:4;s:8:"Å tvrtok";i:5;s:6:"Piatok";i:6;s:6:"Sob
ota";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:9:"pred n.l.";i:1;s:4:"n.l.";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:3:"jan";i:1;s:3:"feb";i:2;s:3:"mar";i:3;s:3:"apr";i:4;s:4:"máj";i:5;s:4:"jún";i:6;s:4:"júl";i:7;s:3:"aug";i:8;s:3:"sep";i:9;s:3:"okt";i:10;s:3:"nov";i:11;s:3:"dec";}s:6:"narrow";a:12:{i:0;s:1:"j";i:1;s:1:"f";i:2;s:1:"m";i:3;s:1:"a";i:4;s:1:"m";i:5;s:1:"j";i:6;s:1:"j";i:7;s:1:"a";i:8;s:1:"s";i:9;s:1:"o";i:10;s:1:"n";i:11;s:1:"d";}s:4:"wide";a:12:{i:0;s:7:"január";i:1;s:8:"február";i:2;s:5:"marec";i:3;s:6:"apríl";i:4;s:4:"máj";i:5;s:4:"jún";i:6;s:4:"júl";i:7;s:6:"august";i:8;s:9:"september";i:9;s:8:"október";i:10;s:8:"november";i:11;s:8:"december";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sk_SK.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sk_SK.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sk_SK.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sl.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sl.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sl.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:10:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:6:"Andora";}s:2:"AE";a:1:{i:0;s:25:"Združeni arabski emirati";}s:2:"AF";a:1:{i:0;s:10:"Afganistan";}s:2:"AG";a:1:{i:0;s:18:"Antigva in Barbuda";}s:2:"AI";a:1:{i:0;s:7:"Angvila";}s:2:"AL";a:1:{i:0;s:8:"Albanija";}s:2:"AM";a:1:{i:0;s:8:"Armenija";}s:2:"AN";a:1:{i:0;s:17:"Nizozemski Antili";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarktika";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:15:"AmeriÅ¡ka Samoa";}s:2:"AT";a:1:{i:0;s:8:"Avstrija";}s:2:"AU";a:1:{i:0;s:10:"Avstralija";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:12:"Azerbajdžan";}s:2:"BA";a:1:{i:0;s:20:"Bosna in Hercegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"BangladeÅ¡";}s:2:"BE";a:1:{i:0;s:7:"Belgija";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:9:"Bolgarija";}s:2:"BH";a:1:{i:0;s:7:"Bahrajn";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:6:"Brunej";}s:2:"BO";a:1:{i:0;s:8:"Bolivija";}s:2:"BR";a:1:{i:0;s:9:"Brazilija";}s:2:"BS";a:1:{i:0;s:6:"Bahami";}s:2:"BT";a:1:{i:0;s:5:"Butan";}s:2:"BV";a:1:{i:0;s:11:"Otok Bouvet";}s:2:"BW";a:1:{i:0;s:7:"Bocvana";}s:2:"BY";a:1:{i:0;s:10:"Belorusija";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:14:"Kokosovi otoki";}s:2:"CD";a:1:{i:0;s:29:"DemokratiÄna republika Kongo";}s:2:"CF";a:1:{i:0;s:27:"CentralnoafriÅ¡ka republika";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:6:"Å vica";}s:2:"CI";a:1:{i:0;s:20:"SlonokoÅ¡Äena obala";}s:2:"CK";a:1:{i:0;s:13:"Cookovi otoki";}s:2:"CL";a:1:{i:0;s:5:"ÄŒile";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:8:"Kitajska";}s:2:"CO";a:1:{i:0;s:9:"Kolumbija";}s:2:"CR";a:1:{i:0;s:9:"Kostarika";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:16:"Kapverdski otoki";}s:2:"CX";a:1:{i:0;s:14:"BožiÄni otok";}s:2:"CY";a:1:{i:0;s:5:"Ciper";}s:2:"CZ";a:1:{i:0;s:7:"ÄŒeÅ¡ka";}s:2:"DE";a:1:{i:0;s:8:"NemÄija";}s:2:"DJ";a:1:{i:0;s:8:"Džibuti";}s:2:"DK";a:1:{
i:0;s:6:"Danska";}s:2:"DM";a:1:{i:0;s:8:"Dominika";}s:2:"DO";a:1:{i:0;s:22:"Dominikanska republika";}s:2:"DZ";a:1:{i:0;s:9:"Alžirija";}s:2:"EC";a:1:{i:0;s:7:"Ekvador";}s:2:"EE";a:1:{i:0;s:8:"Estonija";}s:2:"EG";a:1:{i:0;s:5:"Egipt";}s:2:"EH";a:1:{i:0;s:14:"Zahodna Sahara";}s:2:"ER";a:1:{i:0;s:8:"Eritreja";}s:2:"ES";a:1:{i:0;s:8:"Å panija";}s:2:"ET";a:1:{i:0;s:8:"Etiopija";}s:2:"FI";a:1:{i:0;s:6:"Finska";}s:2:"FJ";a:1:{i:0;s:6:"Fidži";}s:2:"FK";a:1:{i:0;s:29:"Falklandski (Malvinski) otoki";}s:2:"FM";a:1:{i:0;s:11:"Mikronezija";}s:2:"FO";a:1:{i:0;s:14:"Fererski otoki";}s:2:"FR";a:1:{i:0;s:8:"Francija";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:16:"Velika Britanija";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:7:"Gruzija";}s:2:"GF";a:1:{i:0;s:17:"Francoska Gvajana";}s:2:"GH";a:1:{i:0;s:4:"Gana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:11:"Grenlandija";}s:2:"GM";a:1:{i:0;s:7:"Gambija";}s:2:"GN";a:1:{i:0;s:7:"Gvineja";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:20:"Ekvatorialna Gvineja";}s:2:"GR";a:1:{i:0;s:7:"GrÄija";}s:2:"GS";a:1:{i:0;s:42:"Južna Georgija in Južni Sandwich Islands";}s:2:"GT";a:1:{i:0;s:9:"Gvatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:14:"Gvineja Bissau";}s:2:"GY";a:1:{i:0;s:7:"Gvajana";}s:2:"HK";a:1:{i:0;s:25:"Hong Kong S.A.R. Kitajske";}s:2:"HM";a:1:{i:0;s:33:"Heardov otok in McDonaldovi otoki";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:8:"HrvaÅ¡ka";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:10:"Madžarska";}s:2:"ID";a:1:{i:0;s:10:"Indonezija";}s:2:"IE";a:1:{i:0;s:5:"Irska";}s:2:"IL";a:1:{i:0;s:6:"Izrael";}s:2:"IN";a:1:{i:0;s:6:"Indija";}s:2:"IO";a:1:{i:0;s:16:"Britanska Indija";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:9:"Islandija";}s:2:"IT";a:1:{i:0;s:7:"Italija";}s:2:"JM";a:1:{i:0;s:7:"Jamajka";}s:2:"JO";a:1:{i:0;s:6:"Jordan";}s:2:"JP";a:1:{i:0;s:8:"Japonska";}s:2:"KE";a:1:{i:0;s:6:"Kenija";}s:2:"KG";a:1:{i:0;s:11:"Kirgizistan";}s:2:"KH";a:1:{i:0;s:9:"Kambodža";}s:2:"
KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:6:"Komori";}s:2:"KN";a:1:{i:0;s:20:"Saint Kitts in Nevis";}s:2:"KP";a:1:{i:0;s:14:"Severna Koreja";}s:2:"KR";a:1:{i:0;s:13:"Južna Koreja";}s:2:"KW";a:1:{i:0;s:6:"Kuvajt";}s:2:"KY";a:1:{i:0;s:15:"Kajmanski otoki";}s:2:"KZ";a:1:{i:0;s:9:"Kazahstan";}s:2:"LA";a:1:{i:0;s:36:"Ljudska demokratiÄna republika Laos";}s:2:"LB";a:1:{i:0;s:7:"Libanon";}s:2:"LC";a:1:{i:0;s:11:"Saint Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Å rilanka";}s:2:"LR";a:1:{i:0;s:8:"Liberija";}s:2:"LS";a:1:{i:0;s:6:"Lesoto";}s:2:"LT";a:1:{i:0;s:5:"Litva";}s:2:"LU";a:1:{i:0;s:9:"Luxemburg";}s:2:"LV";a:1:{i:0;s:7:"Latvija";}s:2:"LY";a:1:{i:0;s:6:"Libija";}s:2:"MA";a:1:{i:0;s:6:"Maroko";}s:2:"MC";a:1:{i:0;s:6:"Monako";}s:2:"MD";a:1:{i:0;s:17:"Republika Moldova";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:17:"Marshallovi otoki";}s:2:"MK";a:1:{i:0;s:20:"Republika Makedonija";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:9:"Mongolija";}s:2:"MO";a:1:{i:0;s:21:"Makao S.A.R. Kitajske";}s:2:"MP";a:1:{i:0;s:23:"Severni Marianski otoki";}s:2:"MQ";a:1:{i:0;s:8:"Martinik";}s:2:"MR";a:1:{i:0;s:11:"Mavretanija";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:7:"Maldivi";}s:2:"MW";a:1:{i:0;s:6:"Malavi";}s:2:"MX";a:1:{i:0;s:6:"Mehika";}s:2:"MY";a:1:{i:0;s:8:"Malezija";}s:2:"MZ";a:1:{i:0;s:8:"Mozambik";}s:2:"NA";a:1:{i:0;s:8:"Namibija";}s:2:"NC";a:1:{i:0;s:15:"Nova Kaledonija";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:12:"Otok Norfolk";}s:2:"NG";a:1:{i:0;s:8:"Nigerija";}s:2:"NI";a:1:{i:0;s:9:"Nikaragva";}s:2:"NL";a:1:{i:0;s:10:"Nizozemska";}s:2:"NO";a:1:{i:0;s:9:"NorveÅ¡ka";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:14:"Nova Zelandija";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:20:"Francoska Polinezija";}s:2:"PG";a:1:
{i:0;s:18:"Papua Nova Gvineja";}s:2:"PH";a:1:{i:0;s:8:"Filipini";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:7:"Poljska";}s:2:"PM";a:1:{i:0;s:24:"Saint Pierre in Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:9:"Portoriko";}s:2:"PS";a:1:{i:0;s:19:"Palestinsko ozemlje";}s:2:"PT";a:1:{i:0;s:11:"Portugalska";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paragvaj";}s:2:"QA";a:1:{i:0;s:5:"Katar";}s:2:"RE";a:1:{i:0;s:7:"Reunion";}s:2:"RO";a:1:{i:0;s:8:"Romunija";}s:2:"RU";a:1:{i:0;s:16:"Ruska federacija";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SA";a:1:{i:0;s:15:"Saudova Arabija";}s:2:"SB";a:1:{i:0;s:18:"Salomonovo otoÄje";}s:2:"SC";a:1:{i:0;s:8:"SejÅ¡eli";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:8:"Å vedska";}s:2:"SG";a:1:{i:0;s:8:"Singapur";}s:2:"SH";a:1:{i:0;s:12:"Sveta Helena";}s:2:"SI";a:1:{i:0;s:9:"Slovenija";}s:2:"SJ";a:1:{i:0;s:21:"Svalbard in Jan Mayen";}s:2:"SK";a:1:{i:0;s:9:"SlovaÅ¡ka";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:8:"Somalija";}s:2:"SP";a:1:{i:0;s:6:"Serbia";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:20:"Sao Tome in Principe";}s:2:"SV";a:1:{i:0;s:8:"Salvador";}s:2:"SY";a:1:{i:0;s:6:"Sirija";}s:2:"SZ";a:1:{i:0;s:5:"Svazi";}s:2:"TC";a:1:{i:0;s:23:"OtoÄji Turks in Caicos";}s:2:"TD";a:1:{i:0;s:4:"ÄŒad";}s:2:"TF";a:1:{i:0;s:26:"Francoski južni teritorij";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:6:"Tajska";}s:2:"TJ";a:1:{i:0;s:12:"Tadžikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:13:"Vzhodni Timor";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:8:"Tunizija";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:8:"TurÄija";}s:2:"TT";a:1:{i:0;s:18:"Trinidad in Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Tajvan";}s:2:"TZ";a:1:{i:0;s:9:"Tanzanija";}s:2:"UA";a:1:{i:0;s:8:"Ukrajina";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:33:"AmeriÅ¡ki manjÅ¡i oddaljeni otoki";}s:2:"US";a:1:{i:0;s:25:"ZdruÅ
¾ene države Amerike";}s:2:"UY";a:1:{i:0;s:7:"Urugvaj";}s:2:"UZ";a:1:{i:0;s:10:"Uzbekistan";}s:2:"VA";a:1:{i:0;s:7:"Vatikan";}s:2:"VC";a:1:{i:0;s:26:"Saint Vincent in Grenadine";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:24:"Britanski DeviÅ¡ki otoki";}s:2:"VI";a:1:{i:0;s:24:"AmeriÅ¡ki DeviÅ¡ki otoki";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:16:"Wallis in Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:11:"Jugoslavija";}s:2:"ZA";a:1:{i:0;s:13:"Južna Afrika";}s:2:"ZM";a:1:{i:0;s:7:"Zambija";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabve";}}s:10:"Currencies";a:1:{s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:15:"Slovenski tolar";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:8:"Kolendar";}s:9:"collation";a:1:{i:0;s:8:"Zlaganje";}s:8:"currency";a:1:{i:0;s:6:"Valuta";}}s:9:"Languages";a:30:{s:2:"ar";a:1:{i:0;s:11:"ArabÅ¡Äina";}s:2:"bg";a:1:{i:0;s:13:"BolgarÅ¡Äina";}s:2:"cs";a:1:{i:0;s:10:"ÄŒeÅ¡Äina";}s:2:"da";a:1:{i:0;s:10:"DanÅ¡Äina";}s:2:"de";a:1:{i:0;s:10:"NemÅ¡Äina";}s:2:"el";a:1:{i:0;s:9:"GrÅ¡Äina";}s:2:"en";a:1:{i:0;s:12:"AngleÅ¡Äina";}s:2:"es";a:1:{i:0;s:12:"Å panÅ¡Äina";}s:2:"et";a:1:{i:0;s:12:"EstonÅ¡Äina";}s:2:"fi";a:1:{i:0;s:10:"FinÅ¡Äina";}s:2:"fr";a:1:{i:0;s:13:"FrancoÅ¡Äina";}s:2:"he";a:1:{i:0;s:13:"HebrejÅ¡Äina";}s:2:"hr";a:1:{i:0;s:11:"HrvaÅ¡Äina";}s:2:"hu";a:1:{i:0;s:14:"MadžarÅ¡Äina";}s:2:"it";a:1:{i:0;s:15:"ItalijanÅ¡Äina";}s:2:"ja";a:1:{i:0;s:12:"JaponÅ¡Äina";}s:2:"ko";a:1:{i:0;s:12:"KorejÅ¡Äina";}s:2:"lt";a:1:{i:0;s:12:"LitovÅ¡Äina";}s:2:"lv";a:1:{i:0;s:12:"LetonÅ¡Äina";}s:2:"nl";a:1:{i:0;s:14:"NizozemÅ¡Äina";}s:2:"no";a:1:{i:0;s:12:"NorveÅ¡Äina";}s:2:"pl";a:1:{i:0;s:11:"PoljÅ¡Äina";}s:2:"pt";a:1:{i:0;s:15:"PortugalÅ¡Äina";}s:2:"ro";a:1:{i:0;s:12:"RomunÅ¡Äina";}s:2:"ru";a:1:{i:0;s:9:"RuÅ¡Äina";}s:2:"sk";a:1:{i:0;s:12:"SlovaÅ¡Äina";}s:2:"sl";a:1:{i:0;s:13:"SlovenÅ¡Äina";}s:2:"sv";a:1:{i:0;s:12:"Å vedÅ¡Äina";}s:2:"tr";a:1:{i:0;s:10:"TurÅ¡Äina";}s:2:"zh";a:1:{i:0;s
:12:"KitajÅ¡Äina";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:20:"BudistiÄni kolendar";}s:7:"chinese";a:1:{i:0;s:17:"Kitajski kolendar";}s:9:"gregorian";a:1:{i:0;s:22:"Gregorijanski kolendar";}s:6:"hebrew";a:1:{i:0;s:18:"Hebrejski kolendar";}s:7:"islamic";a:1:{i:0;s:17:"Islamski kolendar";}s:13:"islamic-civil";a:1:{i:0;s:25:"Islamski civilni kolendar";}s:8:"japanese";a:1:{i:0;s:17:"Japonski kolendar";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:17:"Direktno zlaganje";}s:9:"phonebook";a:1:{i:0;s:19:"Zlaganje po abecedi";}s:6:"pinyin";a:1:{i:0;s:15:"Pinyin zlaganje";}s:6:"stroke";a:1:{i:0;s:21:"Stroke order zlaganje";}s:11:"traditional";a:1:{i:0;s:21:"Tradicionano zlaganje";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:9:"H:mm:ss z";i:1;s:9:"H:mm:ss z";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:19:"EEEE, dd. MMMM yyyy";i:5;s:13:"dd. MMMM yyyy";i:6;s:8:"yyyy.M.d";i:7;s:6:"yy.M.d";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:3:"ned";i:1;s:3:"pon";i:2;s:3:"tor";i:3;s:3:"sre";i:4;s:4:"Äet";i:5;s:3:"pet";i:6;s:3:"sob";}s:6:"narrow";a:7:{i:0;s:1:"n";i:1;s:1:"p";i:2;s:1:"t";i:3;s:1:"s";i:4;s:2:"Ä";i:5;s:1:"p";i:6;s:1:"s";}s:4:"wide";a:7:{i:0;s:7:"nedelja";i:1;s:10:"ponedeljek";i:2;s:5:"torek";i:3;s:5:"sreda";i:4;s:8:"Äetrtek";i:5;s:5:"petek";i:6;s:6:"sobota";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:8:"pr.n.Å¡.";i:1;s:6:"po Kr.";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:3:"jan";i:1;s:3:"feb";i:2;s:3:"mar";i:3;s:3:"apr";i:4;s:3:"maj";i:5;s:3:"jun";i:6;s:3:"jul";i:7;s:3:"avg";i:8;s:3:"sep";i:9;s:3:"okt";i:10;s:3:"nov";i:11;s:3:"dec";}s:6:"narrow";a:12:{i:0;s:1:"j";i:1;s:1:"f";i:2;s:
1:"m";i:3;s:1:"a";i:4;s:1:"m";i:5;s:1:"j";i:6;s:1:"j";i:7;s:1:"a";i:8;s:1:"s";i:9;s:1:"o";i:10;s:1:"n";i:11;s:1:"d";}s:4:"wide";a:12:{i:0;s:6:"januar";i:1;s:7:"februar";i:2;s:5:"marec";i:3;s:5:"april";i:4;s:3:"maj";i:5;s:5:"junij";i:6;s:5:"julij";i:7;s:6:"avgust";i:8;s:9:"september";i:9;s:7:"oktober";i:10;s:8:"november";i:11;s:8:"december";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sl_SI.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sl_SI.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sl_SI.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:6:{s:9:"Countries";a:100:{s:2:"AE";a:1:{i:0;s:30:"Imaaraadka Carabta ee Midoobay";}s:2:"AF";a:1:{i:0;s:12:"Afgaanistaan";}s:2:"AM";a:1:{i:0;s:9:"Armeeniya";}s:2:"AO";a:1:{i:0;s:7:"Angoola";}s:2:"AT";a:1:{i:0;s:9:"Osteeriya";}s:2:"AU";a:1:{i:0;s:11:"Awstraaliya";}s:2:"BA";a:1:{i:0;s:22:"Boosniya Heersigoviina";}s:2:"BB";a:1:{i:0;s:10:"Baarbadoos";}s:2:"BD";a:1:{i:0;s:14:"Bangaala-Deesh";}s:2:"BE";a:1:{i:0;s:8:"Beljiyam";}s:2:"BH";a:1:{i:0;s:7:"Baxrayn";}s:2:"BJ";a:1:{i:0;s:6:"Beniin";}s:2:"BR";a:1:{i:0;s:8:"Braasiil";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CH";a:1:{i:0;s:12:"Swiiserlaand";}s:2:"CL";a:1:{i:0;s:4:"Jili";}s:2:"CM";a:1:{i:0;s:8:"Kameruun";}s:2:"CN";a:1:{i:0;s:8:"Shiinaha";}s:2:"CU";a:1:{i:0;s:5:"Kuuba";}s:2:"DE";a:1:{i:0;s:6:"Jarmal";}s:2:"DJ";a:1:{i:0;s:7:"Jabuuti";}s:2:"DK";a:1:{i:0;s:8:"Danmaark";}s:2:"EG";a:1:{i:0;s:5:"Masar";}s:2:"ES";a:1:{i:0;s:6:"Isbeyn";}s:2:"ET";a:1:{i:0;s:8:"Itoobiya";}s:2:"FI";a:1:{i:0;s:9:"Fiinlaand";}s:2:"FR";a:1:{i:0;s:9:"Faransiis";}s:2:"GD";a:1:{i:0;s:10:"Giriinaada";}s:2:"GN";a:1:{i:0;s:4:"Gini";}s:2:"GR";a:1:{i:0;s:8:"Giriigga";}s:2:"HR";a:1:{i:0;s:11:"Korweeshiya";}s:2:"HU";a:1:{i:0;s:7:"Hangeri";}s:2:"ID";a:1:{i:0;s:11:"Indoneesiya";}s:2:"IE";a:1:{i:0;s:9:"Ayrlaanda";}s:2:"IL";a:1:{i:0;s:9:"Israa'iil";}s:2:"IN";a:1:{i:0;s:7:"Hindiya";}s:2:"IQ";a:1:{i:0;s:6:"Ciraaq";}s:2:"IR";a:1:{i:0;s:6:"Iiraan";}s:2:"IS";a:1:{i:0;s:8:"Iislaand";}s:2:"IT";a:1:{i:0;s:8:"Talyaani";}s:2:"JM";a:1:{i:0;s:7:"Jameyka";}s:2:"JO";a:1:{i:0;s:5:"Urdun";}s:2:"JP";a:1:{i:0;s:7:"Jabbaan";}s:2:"KE";a:1:{i:0;s:7:"Kiiniya";}s:2:"KH";a:1:{i:0;s:10:"Kamboodiya";}s:2:"KP";a:1:{i:0;s:17:"Kuuriyada Waqooyi";}s:2:"KR";a:1:{i:0;s:20:"Kuuriyada Koonfureed";}s:2:"KW";a:1:{i:0;s:6:"Kuwayt";}s:2:"KZ";a:1:{i:0;s:13:"Kasaakhistaan";}s:2:"LB";a:1:{i:0;s:7:"Lubnaan";}s:2:"LK";a:1:{i:0;s:11:"Siirilaanka";}s:2:"LR";a:1:{i:0;s:10:"Laybeeriya";}s:2:"LS";a:1:{i:0;s:7:"Losooto";}s:2:"LU";a:1:{i:0;s:11:"Luksemboorg";}s:2:"LV";a:1:{i:0;s:8:"Laatfiya";}s:2:"LY";a:1:{i:0;s:7:"Liibiya";}s:2:"MA";a:1:{i:0;s:7:"Marooko";}s:
2:"MC";a:1:{i:0;s:7:"Moonako";}s:2:"MK";a:1:{i:0;s:11:"Makadooniya";}s:2:"ML";a:1:{i:0;s:5:"Maali";}s:2:"MR";a:1:{i:0;s:11:"Muritaaniya";}s:2:"MT";a:1:{i:0;s:6:"Maalda";}s:2:"MV";a:1:{i:0;s:10:"Maaldiqeen";}s:2:"MW";a:1:{i:0;s:7:"Malaawi";}s:2:"MX";a:1:{i:0;s:7:"Meksiko";}s:2:"MZ";a:1:{i:0;s:9:"Musambiig";}s:2:"NA";a:1:{i:0;s:9:"Namiibiya";}s:2:"NG";a:1:{i:0;s:10:"Nayjeeriya";}s:2:"NI";a:1:{i:0;s:11:"Nikaraaguwa";}s:2:"NO";a:1:{i:0;s:8:"Noorweey";}s:2:"NZ";a:1:{i:0;s:12:"Neyuusilaand";}s:2:"OM";a:1:{i:0;s:6:"Cumaan";}s:2:"PH";a:1:{i:0;s:8:"Filibiin";}s:2:"PK";a:1:{i:0;s:9:"Bakistaan";}s:2:"PL";a:1:{i:0;s:7:"Booland";}s:2:"PT";a:1:{i:0;s:9:"Bortuqaal";}s:2:"QA";a:1:{i:0;s:5:"Qadar";}s:2:"RO";a:1:{i:0;s:9:"Rumaaniya";}s:2:"RU";a:1:{i:0;s:5:"Ruush";}s:2:"SA";a:1:{i:0;s:16:"Sacuudi Carabiya";}s:2:"SD";a:1:{i:0;s:6:"Sudaan";}s:2:"SE";a:1:{i:0;s:8:"Iswidhan";}s:2:"SL";a:1:{i:0;s:11:"Siraaliyoon";}s:2:"SO";a:1:{i:0;s:10:"Soomaaliya";}s:2:"SY";a:1:{i:0;s:7:"Suuriya";}s:2:"TD";a:1:{i:0;s:4:"Jaad";}s:2:"TG";a:1:{i:0;s:5:"Toogo";}s:2:"TH";a:1:{i:0;s:8:"Taylaand";}s:2:"TN";a:1:{i:0;s:9:"Tuniisiya";}s:2:"TR";a:1:{i:0;s:5:"Turki";}s:2:"TZ";a:1:{i:0;s:10:"Tansaaniya";}s:2:"UG";a:1:{i:0;s:7:"Ugaanda";}s:2:"US";a:1:{i:0;s:31:"Qaramada Midoobey ee Maraykanka";}s:2:"VA";a:1:{i:0;s:9:"Faatikaan";}s:2:"VE";a:1:{i:0;s:11:"Fenisuweela";}s:2:"VN";a:1:{i:0;s:9:"Fiyetnaam";}s:2:"YE";a:1:{i:0;s:5:"Yaman";}s:2:"ZA";a:1:{i:0;s:14:"Koonfur Afrika";}s:2:"ZM";a:1:{i:0;s:8:"Saambiya";}s:2:"ZW";a:1:{i:0;s:9:"Simbaabwe";}}s:10:"Currencies";a:1:{s:3:"KES";a:2:{i:0;s:3:"Ksh";i:1;s:3:"KES";}}s:9:"Languages";a:1:{s:2:"so";a:1:{i:0;s:8:"Soomaali";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:6:{s:11:"AmPmMarkers";a:2:{i:0;s:2:"sn";i:1;s:2:"gn";}s:26:"DateTimeElements:intvector";a:2:{i:0;i:7;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:9:"h:mm:ss a";i:1;s:9:"h:mm:ss a";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:19:"EEEE, MMMM dd, yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:11:"dd-MMM-yyyy";i:7;
s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:3:"Axa";i:1;s:3:"Isn";i:2;s:3:"Sal";i:3;s:3:"Arb";i:4;s:3:"Kha";i:5;s:3:"Jim";i:6;s:3:"Sab";}s:4:"wide";a:7:{i:0;s:4:"Axad";i:1;s:6:"Isniin";i:2;s:7:"Salaaso";i:3;s:6:"Arbaco";i:4;s:7:"Khamiis";i:5;s:5:"Jimco";i:6;s:5:"Sabti";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:12:"Ciise ka hor";i:1;s:12:"Ciise ka dib";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"Kob";i:1;s:3:"Lab";i:2;s:3:"Sad";i:3;s:3:"Afr";i:4;s:3:"Sha";i:5;s:3:"Lix";i:6;s:3:"Tod";i:7;s:3:"Sid";i:8;s:3:"Sag";i:9;s:3:"Tob";i:10;s:3:"KIT";i:11;s:3:"LIT";}s:4:"wide";a:12:{i:0;s:13:"Bisha Koobaad";i:1;s:12:"Bisha Labaad";i:2;s:15:"Bisha Saddexaad";i:3;s:12:"Bisha Afraad";i:4;s:13:"Bisha Shanaad";i:5;s:12:"Bisha Lixaad";i:6;s:14:"Bisha Todobaad";i:7;s:15:"Bisha Sideedaad";i:8;s:15:"Bisha Sagaalaad";i:9;s:13:"Bisha Tobnaad";i:10;s:21:"Bisha Kow iyo Tobnaad";i:11;s:22:"Bisha Laba iyo Tobnaad";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_DJ.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_DJ.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_DJ.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:10:"Currencies";a:2:{s:3:"DJF";a:2:{i:0;s:1:"$";i:1;s:3:"DJF";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:3:"USD";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_ET.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_ET.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_ET.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:10:"Currencies";a:2:{s:3:"ETB";a:2:{i:0;s:1:"$";i:1;s:3:"ETB";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:3:"USD";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_KE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_KE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_KE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_SO.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_SO.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/so_SO.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:10:"Currencies";a:2:{s:3:"SOS";a:2:{i:0;s:1:"$";i:1;s:3:"SOS";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:3:"USD";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sq.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sq.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sq.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:8:{s:9:"Countries";a:152:{s:2:"AD";a:1:{i:0;s:8:"Andorrë";}s:2:"AE";a:1:{i:0;s:27:"Emiratet Arabe te Bashkuara";}s:2:"AF";a:1:{i:0;s:10:"Afganistan";}s:2:"AG";a:1:{i:0;s:17:"Antigua e Barbuda";}s:2:"AL";a:1:{i:0;s:10:"Shqipëria";}s:2:"AM";a:1:{i:0;s:6:"Armeni";}s:2:"AO";a:1:{i:0;s:7:"Angolë";}s:2:"AR";a:1:{i:0;s:11:"Argjentinë";}s:2:"AT";a:1:{i:0;s:6:"Austri";}s:2:"AU";a:1:{i:0;s:8:"Australi";}s:2:"AZ";a:1:{i:0;s:11:"Azerbajxhan";}s:2:"BA";a:1:{i:0;s:22:"Bosnja dhe Hercegovina";}s:2:"BE";a:1:{i:0;s:9:"Belgjikë";}s:2:"BG";a:1:{i:0;s:8:"Bullgari";}s:2:"BH";a:1:{i:0;s:7:"Bahrein";}s:2:"BN";a:1:{i:0;s:6:"Brunej";}s:2:"BO";a:1:{i:0;s:6:"Bolivi";}s:2:"BT";a:1:{i:0;s:5:"Butan";}s:2:"BW";a:1:{i:0;s:8:"Botsvana";}s:2:"BY";a:1:{i:0;s:10:"Bjellorusi";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CF";a:1:{i:0;s:29:"Republika Qendrore e Afrikës";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:7:"Zvicër";}s:2:"CI";a:1:{i:0;s:18:"Bregu i Fildishtë";}s:2:"CL";a:1:{i:0;s:4:"Kili";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:5:"Kinë";}s:2:"CO";a:1:{i:0;s:7:"Kolumbi";}s:2:"CR";a:1:{i:0;s:10:"Kosta Rika";}s:2:"CU";a:1:{i:0;s:5:"Kubë";}s:2:"CV";a:1:{i:0;s:9:"Kap Verde";}s:2:"CY";a:1:{i:0;s:5:"Qipro";}s:2:"CZ";a:1:{i:0;s:20:"Republika e Çekisë";}s:2:"DE";a:1:{i:0;s:8:"Gjermani";}s:2:"DJ";a:1:{i:0;s:7:"Xhibuti";}s:2:"DK";a:1:{i:0;s:10:"Danimarkë";}s:2:"DM";a:1:{i:0;s:9:"Dominikë";}s:2:"DO";a:1:{i:0;s:21:"Republika Dominikanë";}s:2:"DZ";a:1:{i:0;s:7:"Algjeri";}s:2:"EC";a:1:{i:0;s:7:"Ekuator";}s:2:"EE";a:1:{i:0;s:6:"Estoni";}s:2:"EG";a:1:{i:0;s:6:"Egjipt";}s:2:"EH";a:1:{i:0;s:21:"Saharaja Perëndimore";}s:2:"ER";a:1:{i:0;s:6:"Eritre";}s:2:"ES";a:1:{i:0;s:7:"Spanjë";}s:2:"ET";a:1:{i:0;s:6:"Etiopi";}s:2:"FI";a:1:{i:0;s:9:"Finlandë";}s:2:"FJ";a:1:{i:0;s:5:"Fixhi";}s:2:"FM";a:1:{i:0;s:9:"Mikronezi";}s:2:"FR";a:1:{i:0;s:7:"Francë";}s:2:"GA";a:1:{i:0;s:6:"Gjabon";}s:2:"GE";a:1:{i:0;s:8:"Gjeorgji";}s:2:"GH";a:1:{i:0;s:5:"Ganë";}s:2:"GM";a:1:{i:0;s:5:"Gambi";}s:2:"GN";a:1:{i:0;s:5:"Guine";}s:2:"GQ";a:1:{i:0;s:19:"Guine
ja Ekuatoriale";}s:2:"GR";a:1:{i:0;s:5:"Greqi";}s:2:"GT";a:1:{i:0;s:10:"Guatemalë";}s:2:"GW";a:1:{i:0;s:11:"Guine Bisau";}s:2:"GY";a:1:{i:0;s:7:"Guajana";}s:2:"HR";a:1:{i:0;s:6:"Kroaci";}s:2:"HU";a:1:{i:0;s:7:"Hungari";}s:2:"ID";a:1:{i:0;s:8:"Indonezi";}s:2:"IE";a:1:{i:0;s:8:"Irlandë";}s:2:"IL";a:1:{i:0;s:6:"Izrael";}s:2:"IN";a:1:{i:0;s:4:"Indi";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IS";a:1:{i:0;s:8:"Islandë";}s:2:"IT";a:1:{i:0;s:5:"Itali";}s:2:"JM";a:1:{i:0;s:9:"Xhamajkë";}s:2:"JO";a:1:{i:0;s:7:"Jordani";}s:2:"JP";a:1:{i:0;s:6:"Japoni";}s:2:"KE";a:1:{i:0;s:5:"Kenia";}s:2:"KG";a:1:{i:0;s:9:"Kirgistan";}s:2:"KH";a:1:{i:0;s:8:"Kamboxhi";}s:2:"KI";a:1:{i:0;s:8:"Qiribati";}s:2:"KM";a:1:{i:0;s:6:"Komore";}s:2:"KN";a:1:{i:0;s:19:"Saint Kitts e Nevis";}s:2:"KP";a:1:{i:0;s:15:"Koreja e Veriut";}s:2:"KR";a:1:{i:0;s:14:"Koreja e Jugut";}s:2:"KW";a:1:{i:0;s:6:"Kuvajt";}s:2:"KZ";a:1:{i:0;s:10:"Kazakistan";}s:2:"LB";a:1:{i:0;s:5:"Liban";}s:2:"LI";a:1:{i:0;s:13:"Lihtënshtajn";}s:2:"LR";a:1:{i:0;s:6:"Liberi";}s:2:"LS";a:1:{i:0;s:6:"Lesoto";}s:2:"LT";a:1:{i:0;s:7:"Lituani";}s:2:"LU";a:1:{i:0;s:10:"Luksemburg";}s:2:"LV";a:1:{i:0;s:6:"Letoni";}s:2:"LY";a:1:{i:0;s:4:"Libi";}s:2:"MA";a:1:{i:0;s:6:"Maroko";}s:2:"MC";a:1:{i:0;s:6:"Monako";}s:2:"MD";a:1:{i:0;s:7:"Moldavi";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:15:"Ishujt Marshall";}s:2:"MK";a:1:{i:0;s:8:"Maqedoni";}s:2:"MN";a:1:{i:0;s:7:"Mongoli";}s:2:"MR";a:1:{i:0;s:9:"Mauritani";}s:2:"MT";a:1:{i:0;s:6:"Maltë";}s:2:"MV";a:1:{i:0;s:8:"Maldivit";}s:2:"MW";a:1:{i:0;s:6:"Malavi";}s:2:"MX";a:1:{i:0;s:8:"Meksikë";}s:2:"MY";a:1:{i:0;s:7:"Malajzi";}s:2:"MZ";a:1:{i:0;s:8:"Mozambik";}s:2:"NA";a:1:{i:0;s:6:"Namibi";}s:2:"NG";a:1:{i:0;s:6:"Nigeri";}s:2:"NI";a:1:{i:0;s:9:"Nikaragua";}s:2:"NL";a:1:{i:0;s:15:"Vendet e Ulëta";}s:2:"NO";a:1:{i:0;s:8:"Norvegji";}s:2:"NZ";a:1:{i:0;s:12:"Zelanda e Re";}s:2:"PG";a:1:{i:0;s:18:"Papua Guineja e Re";}s:2:"PH";a:1:{i:0;s:8:"Filipine";}s:2:"PL";a:1:{i:0;s:6:"Poloni";}s:2:"PT";a:1:{i:0;s:9:"Portugali";}s:2:"PY";a:1:{i:0;s:8:"Paraguaj";}
s:2:"QA";a:1:{i:0;s:5:"Katar";}s:2:"RO";a:1:{i:0;s:6:"Rumani";}s:2:"RU";a:1:{i:0;s:4:"Rusi";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SA";a:1:{i:0;s:14:"Arabia Saudite";}s:2:"SB";a:1:{i:0;s:14:"Ishujt Solomon";}s:2:"SC";a:1:{i:0;s:6:"Sishel";}s:2:"SE";a:1:{i:0;s:5:"Suedi";}s:2:"SG";a:1:{i:0;s:8:"Singapor";}s:2:"SI";a:1:{i:0;s:8:"Slloveni";}s:2:"SK";a:1:{i:0;s:8:"Sllovaki";}s:2:"SL";a:1:{i:0;s:11:"Siera Leone";}s:2:"SO";a:1:{i:0;s:6:"Somali";}s:2:"SP";a:1:{i:0;s:7:"Serbië";}s:2:"ST";a:1:{i:0;s:19:"Sao Tome e Prinsipe";}s:2:"SY";a:1:{i:0;s:4:"Siri";}s:2:"SZ";a:1:{i:0;s:11:"Svazilandë";}s:2:"TD";a:1:{i:0;s:4:"Çad";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:9:"Tajlandë";}s:2:"TJ";a:1:{i:0;s:11:"Taxhikistan";}s:2:"TN";a:1:{i:0;s:6:"Tunisi";}s:2:"TR";a:1:{i:0;s:5:"Turqi";}s:2:"TT";a:1:{i:0;s:17:"Trinidad e Tobago";}s:2:"TW";a:1:{i:0;s:6:"Tajvan";}s:2:"TZ";a:1:{i:0;s:7:"Tanzani";}s:2:"UA";a:1:{i:0;s:8:"Ukrainë";}s:2:"US";a:1:{i:0;s:33:"Shtetet e Bashkuara të Amerikës";}s:2:"UY";a:1:{i:0;s:7:"Uruguaj";}s:2:"VA";a:1:{i:0;s:7:"Vatikan";}s:2:"VC";a:1:{i:0;s:26:"Saint Vincent e Grenadinet";}s:2:"VE";a:1:{i:0;s:10:"Venezuelë";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"ZA";a:1:{i:0;s:14:"Afrika e Jugut";}s:2:"ZM";a:1:{i:0;s:5:"Zambi";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabve";}}s:10:"Currencies";a:1:{s:3:"ALL";a:2:{i:0;s:3:"Lek";i:1;s:3:"ALL";}}s:9:"Languages";a:1:{s:2:"sq";a:1:{i:0;s:6:"shqipe";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:6:{s:11:"AmPmMarkers";a:2:{i:0;s:2:"PD";i:1;s:2:"MD";}s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"h.mm.ss.a z";i:1;s:11:"h.mm.ss.a z";i:2;s:9:"h:mm:ss.a";i:3;s:6:"h.mm.a";i:4;s:18:"EEEE, dd MMMM yyyy";i:5;s:12:"dd MMMM yyyy";i:6;s:10:"yyyy-MM-dd";i:7;s:8:"yy-MM-dd";i:8;s:7:"{1} {0}";}s:8:"dayNames"
;a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:3:"Die";i:1;s:4:"Hën";i:2;s:3:"Mar";i:3;s:4:"Mër";i:4;s:3:"Enj";i:5;s:3:"Pre";i:6;s:3:"Sht";}s:4:"wide";a:7:{i:0;s:6:"e diel";i:1;s:8:"e hënë";i:2;s:8:"e martë";i:3;s:11:"e mërkurë";i:4;s:7:"e enjte";i:5;s:8:"e premte";i:6;s:9:"e shtunë";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:6:"p.e.r.";i:1;s:6:"n.e.r.";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"Jan";i:1;s:3:"Shk";i:2;s:3:"Mar";i:3;s:3:"Pri";i:4;s:3:"Maj";i:5;s:3:"Qer";i:6;s:3:"Kor";i:7;s:3:"Gsh";i:8;s:3:"Sht";i:9;s:3:"Tet";i:10;s:4:"Nën";i:11;s:3:"Dhj";}s:4:"wide";a:12:{i:0;s:5:"janar";i:1;s:6:"shkurt";i:2;s:4:"mars";i:3;s:5:"prill";i:4;s:3:"maj";i:5;s:7:"qershor";i:6;s:6:"korrik";i:7;s:5:"gusht";i:8;s:7:"shtator";i:9;s:5:"tetor";i:10;s:7:"nëntor";i:11;s:7:"dhjetor";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sq_AL.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sq_AL.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sq_AL.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:12:{s:9:"Countries";a:233:{s:2:"AD";a:1:{i:0;s:12:"Ðндора";}s:2:"AE";a:1:{i:0;s:48:"Уједињени ÐрапÑки Емирати";}s:2:"AF";a:1:{i:0;s:20:"ÐвганиÑтан";}s:2:"AL";a:1:{i:0;s:16:"Ðлбанија";}s:2:"AM";a:1:{i:0;s:16:"Ðрменија";}s:2:"AN";a:1:{i:0;s:31:"ХоландÑки Ðнтили";}s:2:"AO";a:1:{i:0;s:12:"Ðнгола";}s:2:"AR";a:1:{i:0;s:18:"Ðргентина";}s:2:"AT";a:1:{i:0;s:16:"ÐуÑтрија";}s:2:"AU";a:1:{i:0;s:20:"ÐуÑтралија";}s:2:"AW";a:1:{i:0;s:10:"Ðруба";}s:2:"AZ";a:1:{i:0;s:20:"Ðзербејџан";}s:2:"BA";a:1:{i:0;s:36:"БоÑна и Херцеговина";}s:2:"BB";a:1:{i:0;s:16:"БарбадоÑ";}s:2:"BD";a:1:{i:0;s:18:"Бангладеш";}s:2:"BE";a:1:{i:0;s:14:"Белгија";}s:2:"BF";a:1:{i:0;s:23:"Буркина ФаÑо";}s:2:"BG";a:1:{i:0;s:16:"БугарÑка";}s:2:"BH";a:1:{i:0;s:14:"Бахреин";}s:2:"BI";a:1:{i:0;s:14:"Бурунди";}s:2:"BJ";a:1:{i:0;s:10:"Бенин";}s:2:"BM";a:1:{i:0;s:14:"Бермуда";}s:2:"BN";a:1:{i:0;s:12:"Брунеј";}s:2:"BO";a:1:{i:0;s:16:"Боливија";}s:2:"BR";a:1:{i:0;s:12:"Браѕил";}s:2:"BS";a:1:{i:0;s:12:"Бахами";}s:2:"BT";a:1:{i:0;s:10:"Бутан";}s:2:"BV";a:1:{i:0;s:8:"Буве";}s:2:"BW";a:1:{i:0;s:14:"Боцвана";}s:2:"BY";a:1:{i:0;s:20:"БелоруÑија";}s:2:"BZ";a:1:{i:0;s:12:"БелиÑе";}s:2:"CA";a:1:{i:0;s:12:"Канада";}s:2:"CC";a:1:{i:0;s:29:"КокоÑова ОÑтрва";}s:2:"CD";a:1:{i:0;s:52:"ДемократÑка република Конго";}s:2:"CF";a:1:{i:0;s:52:"Централно Ðфричка Република";}s:2:"CG";a:1:{i:0;s:10:"Конго";}s:2:"CH";a:1:{i:0;s:20:"ШвајцарÑка";}s:2:"CI";a:1:{i:0;s:29:"Обала Слоноваче";}s:2:"CL";a:1:{i:0;s:8:"Чиле";}s:2:"CM";a:1:{i:0;s:14:"Камерун";}s:2:"CN";a:1:{i:0;s:8:"Кина";}s:2:"CO";a:1:{i:0;s:18:"Колумбија";}s:2:"CR";a:1:{i:0;s:18:"КоÑтарика";}s:2:"CU";a:1:{i:0;s:8:"Куба";}s:2:"CV";a:1:{i:0;s:19:"К
апе Верде";}s:2:"CX";a:1:{i:0;s:27:"Божићно ОÑтрво";}s:2:"CY";a:1:{i:0;s:10:"Кипар";}s:2:"CZ";a:1:{i:0;s:10:"Чешка";}s:2:"DE";a:1:{i:0;s:14:"Ðемачка";}s:2:"DJ";a:1:{i:0;s:12:"Ðибути";}s:2:"DK";a:1:{i:0;s:12:"ДанÑка";}s:2:"DM";a:1:{i:0;s:16:"Доминика";}s:2:"DO";a:1:{i:0;s:43:"ДоминиканÑка Република";}s:2:"DZ";a:1:{i:0;s:10:"Ðлжир";}s:2:"EC";a:1:{i:0;s:14:"Еквадор";}s:2:"EE";a:1:{i:0;s:16:"ЕÑтонија";}s:2:"EG";a:1:{i:0;s:12:"Египат";}s:2:"EH";a:1:{i:0;s:27:"Западна Сахара";}s:2:"ER";a:1:{i:0;s:16:"Еритреја";}s:2:"ES";a:1:{i:0;s:14:"Шпанија";}s:2:"ET";a:1:{i:0;s:16:"Етиопија";}s:2:"FI";a:1:{i:0;s:12:"ФинÑка";}s:2:"FJ";a:1:{i:0;s:8:"Фиџи";}s:2:"FK";a:1:{i:0;s:35:"ФолкландÑка ОÑтрва";}s:2:"FM";a:1:{i:0;s:22:"Микронезија";}s:2:"FO";a:1:{i:0;s:25:"ФарÑка ОÑтрва";}s:2:"FR";a:1:{i:0;s:18:"ФранцуÑка";}s:2:"GA";a:1:{i:0;s:10:"Габон";}s:2:"GB";a:1:{i:0;s:31:"Велика Британија";}s:2:"GD";a:1:{i:0;s:14:"Гренада";}s:2:"GE";a:1:{i:0;s:14:"Грузија";}s:2:"GF";a:1:{i:0;s:33:"ФранцуÑка Гвајана";}s:2:"GH";a:1:{i:0;s:8:"Гана";}s:2:"GI";a:1:{i:0;s:18:"Гибралтар";}s:2:"GL";a:1:{i:0;s:16:"Гренланд";}s:2:"GM";a:1:{i:0;s:14:"Гамбија";}s:2:"GN";a:1:{i:0;s:14:"Гвинеја";}s:2:"GP";a:1:{i:0;s:18:"Гваделупе";}s:2:"GQ";a:1:{i:0;s:41:"Екваторијална Гвинеја";}s:2:"GR";a:1:{i:0;s:10:"Грчка";}s:2:"GS";a:1:{i:0;s:67:"Јужна Ðорџија и Јужна Сендвич ОÑтрва";}s:2:"GT";a:1:{i:0;s:18:"Гватемала";}s:2:"GU";a:1:{i:0;s:8:"Гуам";}s:2:"GW";a:1:{i:0;s:25:"Гвинеја-БиÑао";}s:2:"GY";a:1:{i:0;s:14:"Гвајана";}s:2:"HK";a:1:{i:0;s:40:"Хонг Конг (С. Ð. Р. Кина)";}s:2:"HM";a:1:{i:0;s:43:"Херд и Мекдоналд ОÑтрва";}s:2:"HN";a:1:{i:0;s:16:"ХондураÑ";}s:2:"HR";
a:1:{i:0;s:16:"ХрватÑка";}s:2:"HT";a:1:{i:0;s:10:"Хаити";}s:2:"HU";a:1:{i:0;s:16:"МађарÑка";}s:2:"ID";a:1:{i:0;s:20:"Индонезија";}s:2:"IE";a:1:{i:0;s:10:"ИрÑка";}s:2:"IL";a:1:{i:0;s:12:"Израел";}s:2:"IN";a:1:{i:0;s:12:"Индија";}s:2:"IQ";a:1:{i:0;s:8:"Ирак";}s:2:"IR";a:1:{i:0;s:8:"Иран";}s:2:"IS";a:1:{i:0;s:12:"ИÑланд";}s:2:"IT";a:1:{i:0;s:14:"Италија";}s:2:"JM";a:1:{i:0;s:14:"Јамајка";}s:2:"JO";a:1:{i:0;s:12:"Јордан";}s:2:"JP";a:1:{i:0;s:10:"Јапан";}s:2:"KE";a:1:{i:0;s:12:"Кенија";}s:2:"KG";a:1:{i:0;s:20:"КиргизÑтан";}s:2:"KH";a:1:{i:0;s:14:"Камбоџа";}s:2:"KI";a:1:{i:0;s:16:"Кирибати";}s:2:"KM";a:1:{i:0;s:29:"КоморÑка ОÑтрва";}s:2:"KN";a:1:{i:0;s:31:"Сент ÐšÐ¸Ñ‚Ñ Ð¸ ÐевиÑ";}s:2:"KP";a:1:{i:0;s:27:"Северна Кореја";}s:2:"KR";a:1:{i:0;s:23:"Јужна Кореја";}s:2:"KW";a:1:{i:0;s:12:"Кувајт";}s:2:"KY";a:1:{i:0;s:31:"КајманÑка ОÑтрва";}s:2:"KZ";a:1:{i:0;s:18:"КазахÑтан";}s:2:"LA";a:1:{i:0;s:8:"ЛаоÑ";}s:2:"LB";a:1:{i:0;s:10:"Либан";}s:2:"LC";a:1:{i:0;s:21:"Сент Луција";}s:2:"LI";a:1:{i:0;s:22:"Лихтенштајн";}s:2:"LK";a:1:{i:0;s:17:"Шри Ланка";}s:2:"LR";a:1:{i:0;s:16:"Либерија";}s:2:"LS";a:1:{i:0;s:12:"ЛеÑото";}s:2:"LT";a:1:{i:0;s:18:"Литванија";}s:2:"LU";a:1:{i:0;s:20:"ЛукÑембург";}s:2:"LV";a:1:{i:0;s:16:"Летонија";}s:2:"LY";a:1:{i:0;s:12:"Либија";}s:2:"MA";a:1:{i:0;s:12:"Мароко";}s:2:"MC";a:1:{i:0;s:12:"Монако";}s:2:"MD";a:1:{i:0;s:18:"Молдавија";}s:2:"MG";a:1:{i:0;s:20:"МадагаÑкар";}s:2:"MH";a:1:{i:0;s:31:"МаршалÑка ОÑтрва";}s:2:"MK";a:1:{i:0;s:20:"Македонија";}s:2:"ML";a:1:{i:0;s:8:"Мали";}s:2:"MM";a:1:{i:0;s:16:"Мијанмар";}s:2:"MN";a:1:{i:0;s:18:"Монголија";}s:2:"MO";a:1:{i:0;s:33:"Макао (С. Ð. Р. Кина)";}s:2:"MP";a:1:{i:0;s:48:"Северна МаријаÐ
½Ñка ОÑтрва";}s:2:"MQ";a:1:{i:0;s:16:"Мартиник";}s:2:"MR";a:1:{i:0;s:22:"Мауританија";}s:2:"MS";a:1:{i:0;s:16:"МонÑерат";}s:2:"MT";a:1:{i:0;s:10:"Малта";}s:2:"MU";a:1:{i:0;s:20:"МаурицијуÑ";}s:2:"MV";a:1:{i:0;s:14:"Малдиви";}s:2:"MW";a:1:{i:0;s:12:"Малави";}s:2:"MX";a:1:{i:0;s:14:"МекÑико";}s:2:"MY";a:1:{i:0;s:16:"Малезија";}s:2:"MZ";a:1:{i:0;s:16:"Мозамбик";}s:2:"NA";a:1:{i:0;s:16:"Ðамибија";}s:2:"NC";a:1:{i:0;s:29:"Ðова Каледонија";}s:2:"NE";a:1:{i:0;s:10:"Ðигер";}s:2:"NF";a:1:{i:0;s:27:"Ðорфолк ОÑтрво";}s:2:"NG";a:1:{i:0;s:16:"Ðигерија";}s:2:"NI";a:1:{i:0;s:18:"Ðикарагва";}s:2:"NL";a:1:{i:0;s:18:"Холандија";}s:2:"NO";a:1:{i:0;s:16:"Ðорвешка";}s:2:"NP";a:1:{i:0;s:10:"Ðепал";}s:2:"NR";a:1:{i:0;s:10:"Ðауру";}s:2:"NU";a:1:{i:0;s:8:"Ðиуе";}s:2:"NZ";a:1:{i:0;s:21:"Ðови Зеланд";}s:2:"OM";a:1:{i:0;s:8:"Оман";}s:2:"PA";a:1:{i:0;s:12:"Панама";}s:2:"PE";a:1:{i:0;s:8:"Перу";}s:2:"PF";a:1:{i:0;s:39:"ФранцуÑка Полинезија";}s:2:"PG";a:1:{i:0;s:34:"Папуа Ðова Гвинеја";}s:2:"PH";a:1:{i:0;s:16:"Филипини";}s:2:"PK";a:1:{i:0;s:16:"ПакиÑтан";}s:2:"PL";a:1:{i:0;s:12:"ПољÑка";}s:2:"PM";a:1:{i:0;s:33:"Сен Пјер и Микелон";}s:2:"PN";a:1:{i:0;s:14:"Питкерн";}s:2:"PR";a:1:{i:0;s:19:"Порто Рико";}s:2:"PS";a:1:{i:0;s:43:"ПалеÑтинÑка територија";}s:2:"PT";a:1:{i:0;s:16:"Португал";}s:2:"PW";a:1:{i:0;s:10:"Палау";}s:2:"PY";a:1:{i:0;s:16:"Парагвај";}s:2:"QA";a:1:{i:0;s:10:"Катар";}s:2:"RE";a:1:{i:0;s:14:"Реинион";}s:2:"RO";a:1:{i:0;s:16:"Румунија";}s:2:"RU";a:1:{i:0;s:12:"РуÑија";}s:2:"RW";a:1:{i:0;s:12:"Руанда";}s:2:"SA";a:1:{i:0;s:33:"СаудијÑка Ðрабија";}s:2:"SB";a:1:{i:0;s:33:"СоломонÑка ОÑтрва";}s:2:"SC";a:1:{i:0;s:14:"Сејшели";}s:2:"SD";a:1:{i:0;
s:10:"Судан";}s:2:"SE";a:1:{i:0;s:14:"ШведÑка";}s:2:"SG";a:1:{i:0;s:16:"Сингапур";}s:2:"SH";a:1:{i:0;s:23:"Света Јелена";}s:2:"SI";a:1:{i:0;s:18:"Словенија";}s:2:"SJ";a:1:{i:0;s:49:"Свалбард и Јанмајен ОÑтрва";}s:2:"SK";a:1:{i:0;s:16:"Словачка";}s:2:"SL";a:1:{i:0;s:23:"Сијера Леоне";}s:2:"SM";a:1:{i:0;s:19:"Сан Марино";}s:2:"SN";a:1:{i:0;s:14:"Сенегал";}s:2:"SO";a:1:{i:0;s:16:"Сомалија";}s:2:"SR";a:1:{i:0;s:14:"Суринам";}s:2:"ST";a:1:{i:0;s:35:"Сао Томе и Принципи";}s:2:"SV";a:1:{i:0;s:16:"Салвадор";}s:2:"SY";a:1:{i:0;s:12:"Сирија";}s:2:"SZ";a:1:{i:0;s:18:"Свазиленд";}s:2:"TC";a:1:{i:0;s:39:"Ð¢ÑƒÑ€ÐºÑ Ð¸ ÐšÐ°Ñ˜ÐºÐ¾Ñ ÐžÑтрва";}s:2:"TD";a:1:{i:0;s:6:"Чад";}s:2:"TF";a:1:{i:0;s:50:"ФранцуÑке Јужне Територије";}s:2:"TG";a:1:{i:0;s:8:"Того";}s:2:"TH";a:1:{i:0;s:14:"Тајланд";}s:2:"TJ";a:1:{i:0;s:20:"ТаџикиÑтан";}s:2:"TK";a:1:{i:0;s:14:"Токелау";}s:2:"TL";a:1:{i:0;s:21:"Тимор-ЛеÑте";}s:2:"TM";a:1:{i:0;s:24:"ТуркмениÑтан";}s:2:"TN";a:1:{i:0;s:10:"ТуниÑ";}s:2:"TO";a:1:{i:0;s:10:"Тонга";}s:2:"TR";a:1:{i:0;s:12:"ТурÑка";}s:2:"TT";a:1:{i:0;s:32:"Тринидад и Тобаго";}s:2:"TV";a:1:{i:0;s:12:"Тувалу";}s:2:"TW";a:1:{i:0;s:12:"Тајван";}s:2:"TZ";a:1:{i:0;s:18:"Танзанија";}s:2:"UA";a:1:{i:0;s:16:"Украјина";}s:2:"UG";a:1:{i:0;s:12:"Уганда";}s:2:"UM";a:1:{i:0;s:43:"Мања удаљена оÑтрва СÐД";}s:2:"US";a:1:{i:0;s:48:"Сједињене Ðмеричке Државе";}s:2:"UY";a:1:{i:0;s:14:"Уругвај";}s:2:"UZ";a:1:{i:0;s:20:"УзбекиÑтан";}s:2:"VA";a:1:{i:0;s:14:"Ватикан";}s:2:"VC";a:1:{i:0;s:45:"Сент ВинÑент и Гренадини";}s:2:"VE";a:1:{i:0;s:18:"Венецуела";}s:2:"VG";a:1:{i:0;s:52:"БританÑка ДевичанÑка ОÑтрва";}s:2:"VI";a:1:{i:0;s:43:"С.Ð.Д. ДÐ
µÐ²Ð¸Ñ‡Ð°Ð½Ñка ОÑтрва";}s:2:"VN";a:1:{i:0;s:16:"Вијетнам";}s:2:"VU";a:1:{i:0;s:14:"Вануату";}s:2:"WF";a:1:{i:0;s:39:"Ð’Ð°Ð»Ð¸Ñ Ð¸ Футуна ОÑтрва";}s:2:"WS";a:1:{i:0;s:10:"Самоа";}s:2:"YE";a:1:{i:0;s:10:"Јемен";}s:2:"YT";a:1:{i:0;s:12:"Мајоте";}s:2:"YU";a:1:{i:0;s:22:"ЈугоÑлавија";}s:2:"ZA";a:1:{i:0;s:23:"Јужна Ðфрика";}s:2:"ZM";a:1:{i:0;s:14:"Замбија";}s:2:"ZW";a:1:{i:0;s:16:"Зимбабве";}}s:10:"Currencies";a:31:{s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:33:"ÐуÑтријÑки шилинг";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:35:"ÐуÑтралијÑки долар";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:37:"Конвертибилна марка";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:31:"БелгијÑки франак";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:27:"КанадÑки долар";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:33:"ШвајцарÑки франак";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:25:"Ðемачка марка";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:23:"ДанÑка круна";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:27:"ШпанÑка пезета";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:8:"ЕВРО";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:23:"ФинÑка марка";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:35:"ФинÑка марка (1860-1962)";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:31:"ФранцуÑки франак";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:29:"Фунта Ñтерлинга";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:12:"Драхма";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:27:"ХрватÑки динар";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:8:"Куна";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:21:"ИрÑка фунта";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:31:"ИталијанÑка лира";}s:3:"JPY";a:2:{i:0;s:2:"Â¥";i:1;s:6:"Јен";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:29:"КувајтÑки динар";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:37:"ЛукÑембуршки франак";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:31:"ХоландÑки Ð
³ÑƒÐ»Ð´ÐµÐ½";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:27:"Ðорвешка круна";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:35:"ПортугалÑки еÑкудо";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:21:"РуÑка рубља";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:33:"РуÑка рубља (1991-1998)";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:25:"ШведÑка круна";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:10:"Толар";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:27:"Ðмерички долар";}s:3:"YUN";a:2:{i:0;s:6:"Дин";i:1;s:3:"YUN";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:16:"Календар";}s:9:"collation";a:1:{i:0;s:18:"Сортирање";}s:8:"currency";a:1:{i:0;s:12:"Валута";}}s:9:"Languages";a:60:{s:2:"af";a:1:{i:0;s:24:"ÐфриканерÑки";}s:2:"ar";a:1:{i:0;s:14:"ÐрапÑки";}s:2:"be";a:1:{i:0;s:18:"БелоруÑки";}s:2:"bg";a:1:{i:0;s:16:"БугарÑки";}s:2:"br";a:1:{i:0;s:18:"БретонÑки";}s:2:"ca";a:1:{i:0;s:20:"КаталонÑки";}s:2:"co";a:1:{i:0;s:22:"КорзиканÑки";}s:2:"cs";a:1:{i:0;s:10:"Чешки";}s:2:"da";a:1:{i:0;s:12:"ДанÑки";}s:2:"de";a:1:{i:0;s:14:"Ðемачки";}s:2:"el";a:1:{i:0;s:10:"Грчки";}s:2:"en";a:1:{i:0;s:16:"ЕнглеÑки";}s:2:"eo";a:1:{i:0;s:18:"ЕÑперанто";}s:2:"es";a:1:{i:0;s:14:"ШпанÑки";}s:2:"et";a:1:{i:0;s:16:"ЕÑтонÑки";}s:2:"eu";a:1:{i:0;s:18:"БаÑкијÑки";}s:2:"fa";a:1:{i:0;s:18:"ПерÑијÑки";}s:2:"fi";a:1:{i:0;s:12:"ФинÑки";}s:2:"fr";a:1:{i:0;s:18:"ФранцуÑки";}s:2:"ga";a:1:{i:0;s:10:"ИрÑки";}s:2:"he";a:1:{i:0;s:18:"ХебрејÑки";}s:2:"hr";a:1:{i:0;s:16:"ХрватÑки";}s:2:"hu";a:1:{i:0;s:16:"МађарÑки";}s:2:"hy";a:1:{i:0;s:16:"ÐрменÑки";}s:2:"id";a:1:{i:0;s:24:"ИндонезијÑки";}s:2:"is";a:1:{i:0;s:18:"ИÑландÑки";}s:2:"it";a:1:{i:0;s:22:"ИталијанÑки";}s:2:"ja";a:1:{i:0;s:16:"ЈапанÑки";}s:2:"ka";a:1:{i:0;s:18:"ГрузијÑки";}s:2:"km";a:1:{i:0;s:14:"КмерÑки";}s:2:"ko";a:1:{i:0;s:16:
"КорејÑки";}s:2:"ku";a:1:{i:0;s:14:"КурдÑки";}s:2:"ky";a:1:{i:0;s:16:"КиргиÑки";}s:2:"la";a:1:{i:0;s:16:"ЛатинÑки";}s:2:"lt";a:1:{i:0;s:18:"ЛитванÑки";}s:2:"lv";a:1:{i:0;s:16:"ЛетонÑки";}s:2:"mk";a:1:{i:0;s:20:"МакедонÑки";}s:2:"mn";a:1:{i:0;s:18:"МонголÑки";}s:2:"mo";a:1:{i:0;s:18:"МолдавÑки";}s:2:"my";a:1:{i:0;s:18:"БурманÑки";}s:2:"nl";a:1:{i:0;s:18:"ХоландÑки";}s:2:"no";a:1:{i:0;s:16:"Ðорвешки";}s:2:"pl";a:1:{i:0;s:12:"ПољÑки";}s:2:"pt";a:1:{i:0;s:22:"ПортугалÑки";}s:2:"rm";a:1:{i:0;s:25:"Рето-РоманÑки";}s:2:"ro";a:1:{i:0;s:16:"РумунÑки";}s:2:"ru";a:1:{i:0;s:10:"РуÑки";}s:2:"sa";a:1:{i:0;s:16:"СанÑкрит";}s:2:"sh";a:1:{i:0;s:29:"СрпÑко-ХрватÑки";}s:2:"sk";a:1:{i:0;s:16:"Словачки";}s:2:"sl";a:1:{i:0;s:20:"Словеначки";}s:2:"sq";a:1:{i:0;s:16:"ÐлбанÑки";}s:2:"sr";a:1:{i:0;s:12:"СрпÑки";}s:2:"sv";a:1:{i:0;s:14:"ШведÑки";}s:2:"sw";a:1:{i:0;s:14:"Свахили";}s:2:"tr";a:1:{i:0;s:12:"ТурÑки";}s:2:"uk";a:1:{i:0;s:20:"УкрајинÑки";}s:2:"vi";a:1:{i:0;s:22:"ВијетнамÑки";}s:2:"yi";a:1:{i:0;s:10:"Јидиш";}s:2:"zh";a:1:{i:0;s:14:"КинеÑки";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Cyrl";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Scripts";a:18:{s:4:"Arab";a:1:{i:0;s:25:"арапÑко пиÑмо";}s:4:"Armn";a:1:{i:0;s:29:"јерменÑко пиÑмо";}s:4:"Beng";a:1:{i:0;s:29:"бенгалÑко пиÑмо";}s:4:"Brai";a:1:{i:0;s:25:"Брајево пиÑмо";}s:4:"Cher";a:1:{i:0;s:12:"Чероки";}s:4:"Copt";a:1:{i:0;s:27:"коптичко пиÑмо";}s:4:"Cyrl";a:1:{i:0;s:16:"Ћирилица";}s:4:"Deva";a:1:{i:0;s:20:"Деванагари";}s:4:"Dsrt";a:1:{i:0;s:14:"Дезерет";}s:4:"Ethi";a:1:{i:0;s:27:"етиопÑко пиÑмо";}
s:4:"Geor";a:1:{i:0;s:29:"грузијÑко пиÑмо";}s:4:"Goth";a:1:{i:0;s:12:"Готика";}s:4:"Grek";a:1:{i:0;s:21:"грчко пиÑмо";}s:4:"Hebr";a:1:{i:0;s:29:"хебрејÑко пиÑмо";}s:4:"Hira";a:1:{i:0;s:16:"Хирагана";}s:4:"Hrkt";a:1:{i:0;s:40:"Катакана или Хирагана";}s:4:"Kana";a:1:{i:0;s:16:"Катакана";}s:4:"Latn";a:1:{i:0;s:16:"Латиница";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:37:"БудиÑтички календар";}s:7:"chinese";a:1:{i:0;s:31:"КинеÑки календар";}s:9:"gregorian";a:1:{i:0;s:43:"ГрегоријанÑки календар";}s:6:"hebrew";a:1:{i:0;s:35:"ХебрејÑки календар";}s:7:"islamic";a:1:{i:0;s:33:"ИÑламÑки календар";}s:13:"islamic-civil";a:1:{i:0;s:48:"ИÑламÑки цивилни календар";}s:8:"japanese";a:1:{i:0;s:33:"ЈапанÑки календар";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:35:"Директно Ñортирање";}s:9:"phonebook";a:1:{i:0;s:36:"Сортирање по азбуци";}s:6:"pinyin";a:1:{i:0;s:29:"Пињин Ñортирање";}s:6:"stroke";a:1:{i:0;s:43:"Сортирање по броју црта";}s:11:"traditional";a:1:{i:0;s:45:"Традиционално Ñортирање";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH.mm.ss z";i:1;s:10:"HH.mm.ss z";i:2;s:8:"HH.mm.ss";i:3;s:5:"HH.mm";i:4;s:19:"EEEE, dd.MMMM.yyyy.";i:5;s:11:"dd.MM.yyyy.";i:6;s:11:"dd.MM.yyyy.";i:7;s:7:"d.M.yy.";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:6:"нед";i:1;s:6:"пон";i:2;s:6:"уто";i:3;s:6:"Ñре";i:4;s:6:"чет";i:5;s:6:"пет";i:6;s:6:"Ñуб";}s:6:"narrow";a:7:{i:0;s:2:"н";i:1;s:2:"п";i:2;s:2:"у";i:3;s:2:"Ñ";i:4;s:2:"ч";i:5;s:2:"п";i:6;s:2:"Ñ";}s:4:"wide";a:7:{i:0;s:12:"недеља";i:1;s:18:"понедељак";i:2;s:12:"ут
орак";i:3;s:10:"Ñреда";i:4;s:16:"четвртак";i:5;s:10:"петак";i:6;s:12:"Ñубота";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:11:"п. н. е.";i:1;s:6:"н. е";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:6:"јан";i:1;s:6:"феб";i:2;s:6:"мар";i:3;s:6:"апр";i:4;s:6:"мај";i:5;s:6:"јун";i:6;s:6:"јул";i:7;s:6:"авг";i:8;s:6:"Ñеп";i:9;s:6:"окт";i:10;s:6:"нов";i:11;s:6:"дец";}s:6:"narrow";a:12:{i:0;s:2:"ј";i:1;s:2:"Ñ„";i:2;s:2:"м";i:3;s:2:"а";i:4;s:2:"м";i:5;s:2:"ј";i:6;s:2:"ј";i:7;s:2:"а";i:8;s:2:"Ñ";i:9;s:2:"о";i:10;s:2:"н";i:11;s:2:"д";}s:4:"wide";a:12:{i:0;s:12:"јануар";i:1;s:14:"фебруар";i:2;s:8:"март";i:3;s:10:"април";i:4;s:6:"мај";i:5;s:6:"јун";i:6;s:6:"јул";i:7;s:12:"авгуÑÑ‚";i:8;s:18:"Ñептембар";i:9;s:14:"октобар";i:10;s:16:"новембар";i:11;s:16:"децембар";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}s:11:"zoneStrings";a:1:{i:0;a:5:{i:0;s:15:"Europe/Belgrade";i:1;s:46:"Централно ЕвропÑко Време";i:2;s:3:"CET";i:3;s:46:"Централно ЕвропÑко Време";i:4;s:3:"CET";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Cyrl.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Cyrl.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Cyrl.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Cyrl_YU.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Cyrl_YU.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Cyrl_YU.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Latn.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Latn.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Latn.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:239:{s:2:"AD";a:1:{i:0;s:6:"Andora";}s:2:"AE";a:1:{i:0;s:26:"Ujedinjeni Arapski Emirati";}s:2:"AF";a:1:{i:0;s:10:"Avganistan";}s:2:"AG";a:1:{i:0;s:17:"Antigva i Barbuda";}s:2:"AI";a:1:{i:0;s:7:"Angvila";}s:2:"AL";a:1:{i:0;s:8:"Albanija";}s:2:"AM";a:1:{i:0;s:8:"Armenija";}s:2:"AN";a:1:{i:0;s:16:"Holandski Antili";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarktika";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:15:"AmeriÄka Samoa";}s:2:"AT";a:1:{i:0;s:8:"Austrija";}s:2:"AU";a:1:{i:0;s:10:"Australija";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:12:"Azerbejdžan";}s:2:"BA";a:1:{i:0;s:19:"Bosna i Hercegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"BangladeÅ¡";}s:2:"BE";a:1:{i:0;s:7:"Belgija";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:8:"Bugarska";}s:2:"BH";a:1:{i:0;s:7:"Bahrein";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:6:"Brunej";}s:2:"BO";a:1:{i:0;s:8:"Bolivija";}s:2:"BR";a:1:{i:0;s:6:"Brazil";}s:2:"BS";a:1:{i:0;s:6:"Bahami";}s:2:"BT";a:1:{i:0;s:5:"Butan";}s:2:"BV";a:1:{i:0;s:11:"Buve Ostrva";}s:2:"BW";a:1:{i:0;s:7:"Bocvana";}s:2:"BY";a:1:{i:0;s:10:"Belorusija";}s:2:"BZ";a:1:{i:0;s:6:"Belise";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:21:"Kokos (Keling) Ostrva";}s:2:"CD";a:1:{i:0;s:27:"Demokratska Republika Kongo";}s:2:"CF";a:1:{i:0;s:28:"Centralno AfriÄka Republika";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:11:"Å vajcarska";}s:2:"CI";a:1:{i:0;s:16:"Obala SlonovaÄe";}s:2:"CK";a:1:{i:0;s:13:"Kukova Ostrva";}s:2:"CL";a:1:{i:0;s:5:"ÄŒile";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:4:"Kina";}s:2:"CO";a:1:{i:0;s:9:"Kolumbija";}s:2:"CR";a:1:{i:0;s:9:"Kostarika";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:10:"Kape Verde";}s:2:"CX";a:1:{i:0;s:16:"UskrÅ¡nja Ostrva";}s:2:"CY";a:1:{i:0;s:5:"Kipar";}s:2:"CZ";a:1:{i:0;s:7:"ÄŒeÅ¡ka";}s:2:"DE";a:1:{i:0;s:8:"NemaÄka";}s:2:"DJ";a:1:{i:0;s:8:"Džibuti";}s:2:"DK";a:1:{i:0;s:6
:"Danska";}s:2:"DM";a:1:{i:0;s:8:"Dominika";}s:2:"DO";a:1:{i:0;s:22:"Dominikanska Republika";}s:2:"DZ";a:1:{i:0;s:6:"Alžir";}s:2:"EC";a:1:{i:0;s:7:"Ekvador";}s:2:"EE";a:1:{i:0;s:8:"Estonija";}s:2:"EG";a:1:{i:0;s:6:"Egipat";}s:2:"EH";a:1:{i:0;s:14:"Zapadna Sahara";}s:2:"ER";a:1:{i:0;s:8:"Eritreja";}s:2:"ES";a:1:{i:0;s:8:"Å panija";}s:2:"ET";a:1:{i:0;s:8:"Etiopija";}s:2:"FI";a:1:{i:0;s:6:"Finska";}s:2:"FJ";a:1:{i:0;s:6:"Fidži";}s:2:"FK";a:1:{i:0;s:18:"Folklendska Ostrva";}s:2:"FM";a:1:{i:0;s:11:"Mikronezija";}s:2:"FO";a:1:{i:0;s:13:"Farska Ostrva";}s:2:"FR";a:1:{i:0;s:9:"Francuska";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:16:"Velika Britanija";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:7:"Gruzija";}s:2:"GF";a:1:{i:0;s:17:"Francuska Gvajana";}s:2:"GH";a:1:{i:0;s:4:"Gana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:8:"Grenland";}s:2:"GM";a:1:{i:0;s:7:"Gambija";}s:2:"GN";a:1:{i:0;s:7:"Gvineja";}s:2:"GP";a:1:{i:0;s:9:"Gvadelupe";}s:2:"GQ";a:1:{i:0;s:21:"Ekvatorijalna Gvineja";}s:2:"GR";a:1:{i:0;s:6:"GrÄka";}s:2:"GS";a:1:{i:0;s:43:"Južna Džordžija i Južna SendviÄ Ostrva";}s:2:"GT";a:1:{i:0;s:9:"Gvatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Gvineja-Bisao";}s:2:"GY";a:1:{i:0;s:7:"Gvajana";}s:2:"HK";a:1:{i:0;s:25:"Hong Kong (S. A. R. Kina)";}s:2:"HM";a:1:{i:0;s:23:"Herd i Mekdonald Ostrva";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:8:"Hrvatska";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:9:"MaÄ‘arska";}s:2:"ID";a:1:{i:0;s:10:"Indonezija";}s:2:"IE";a:1:{i:0;s:5:"Irska";}s:2:"IL";a:1:{i:0;s:6:"Izrael";}s:2:"IN";a:1:{i:0;s:6:"Indija";}s:2:"IO";a:1:{i:0;s:30:"British Indian Ocean Territory";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:6:"Island";}s:2:"IT";a:1:{i:0;s:7:"Italija";}s:2:"JM";a:1:{i:0;s:7:"Jamajka";}s:2:"JO";a:1:{i:0;s:6:"Jordan";}s:2:"JP";a:1:{i:0;s:5:"Japan";}s:2:"KE";a:1:{i:0;s:6:"Kenija";}s:2:"KG";a:1:{i:0;s:9:"Kirgistan";}s:2:"KH";a:1:{i:0;s:9:"Kambodža";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:
"KM";a:1:{i:0;s:15:"Komorska Ostrva";}s:2:"KN";a:1:{i:0;s:17:"Sent Kits i Nevis";}s:2:"KP";a:1:{i:0;s:14:"Severna Koreja";}s:2:"KR";a:1:{i:0;s:13:"Južna Koreja";}s:2:"KW";a:1:{i:0;s:6:"Kuvajt";}s:2:"KY";a:1:{i:0;s:16:"Kajmanska Ostrva";}s:2:"KZ";a:1:{i:0;s:9:"Kazahstan";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:5:"Liban";}s:2:"LC";a:1:{i:0;s:11:"Sent Lucija";}s:2:"LI";a:1:{i:0;s:12:"Lihtenštajn";}s:2:"LK";a:1:{i:0;s:9:"Šrilanka";}s:2:"LR";a:1:{i:0;s:8:"Liberija";}s:2:"LS";a:1:{i:0;s:6:"Lesoto";}s:2:"LT";a:1:{i:0;s:9:"Litvanija";}s:2:"LU";a:1:{i:0;s:10:"Luksemburg";}s:2:"LV";a:1:{i:0;s:8:"Letonija";}s:2:"LY";a:1:{i:0;s:6:"Libija";}s:2:"MA";a:1:{i:0;s:6:"Maroko";}s:2:"MC";a:1:{i:0;s:6:"Monako";}s:2:"MD";a:1:{i:0;s:9:"Moldavija";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:17:"Maršalska Ostrva";}s:2:"MK";a:1:{i:0;s:10:"Makedonija";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:8:"Mijanmar";}s:2:"MN";a:1:{i:0;s:9:"Mongolija";}s:2:"MO";a:1:{i:0;s:21:"Makao (S. A. R. Kina)";}s:2:"MP";a:1:{i:0;s:25:"Severna Marijanska Ostrva";}s:2:"MQ";a:1:{i:0;s:8:"Martinik";}s:2:"MR";a:1:{i:0;s:11:"Mauritanija";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauricius";}s:2:"MV";a:1:{i:0;s:7:"Maldivi";}s:2:"MW";a:1:{i:0;s:6:"Malavi";}s:2:"MX";a:1:{i:0;s:7:"Meksiko";}s:2:"MY";a:1:{i:0;s:8:"Malezija";}s:2:"MZ";a:1:{i:0;s:8:"Mozambik";}s:2:"NA";a:1:{i:0;s:8:"Namibija";}s:2:"NC";a:1:{i:0;s:15:"Nova Kaledonija";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:14:"Norfolk Ostrvo";}s:2:"NG";a:1:{i:0;s:8:"Nigerija";}s:2:"NI";a:1:{i:0;s:9:"Nikaragva";}s:2:"NL";a:1:{i:0;s:9:"Holandija";}s:2:"NO";a:1:{i:0;s:9:"Norveška";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:4:"Niue";}s:2:"NZ";a:1:{i:0;s:11:"Novi Zeland";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:20:"Francuska Polinezija";}s:2:"PG";a:1:{i:0;s:18:"Papua Nova Gvineja";}s:2:"PH";a:1:{i:0;s:8:"Filipini";}s:2:"P
K";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:7:"Poljska";}s:2:"PM";a:1:{i:0;s:18:"Sen Pjer i Mikelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:10:"Porto Riko";}s:2:"PS";a:1:{i:0;s:22:"Palestinska Teritorija";}s:2:"PT";a:1:{i:0;s:8:"Portugal";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paragvaj";}s:2:"QA";a:1:{i:0;s:5:"Katar";}s:2:"RE";a:1:{i:0;s:8:"Rejunion";}s:2:"RO";a:1:{i:0;s:8:"Rumunija";}s:2:"RU";a:1:{i:0;s:6:"Rusija";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SA";a:1:{i:0;s:17:"Saudijska Arabija";}s:2:"SB";a:1:{i:0;s:15:"Solomon Islands";}s:2:"SC";a:1:{i:0;s:8:"SejÅ¡eli";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:8:"Å vedska";}s:2:"SG";a:1:{i:0;s:8:"Singapur";}s:2:"SH";a:1:{i:0;s:12:"Saint Helena";}s:2:"SI";a:1:{i:0;s:9:"Slovenija";}s:2:"SJ";a:1:{i:0;s:20:"Svalbard i Jan Majen";}s:2:"SK";a:1:{i:0;s:9:"SlovaÄka";}s:2:"SL";a:1:{i:0;s:12:"Sijera Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:8:"Somalija";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:19:"Sao Tome i Principe";}s:2:"SV";a:1:{i:0;s:8:"Salvador";}s:2:"SY";a:1:{i:0;s:6:"Sirija";}s:2:"SZ";a:1:{i:0;s:9:"Svazilend";}s:2:"TC";a:1:{i:0;s:21:"Turks i Kajkos Ostrva";}s:2:"TD";a:1:{i:0;s:4:"ÄŒad";}s:2:"TF";a:1:{i:0;s:27:"Francuske Južne Teritorije";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:7:"Tajland";}s:2:"TJ";a:1:{i:0;s:12:"Tadžikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:11:"Timor-Leste";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:5:"Tunis";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:6:"Turska";}s:2:"TT";a:1:{i:0;s:17:"Trinidad i Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Tajvan";}s:2:"TZ";a:1:{i:0;s:9:"Tanzanija";}s:2:"UA";a:1:{i:0;s:8:"Ukrajina";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:25:"Manja Udaljena Ostrva SAD";}s:2:"US";a:1:{i:0;s:28:"Sjedinjene AmeriÄke Države";}s:2:"UY";a:1:{i:0;s:7:"Urugvaj";}s:2:"UZ";a:1:{i:0;s:10:"Uzbekistan";}s:2:"VA";a:1:{i:0;s:7:"Vatikan";}s:2:"
VC";a:1:{i:0;s:24:"Sent Vinsent i Grenadini";}s:2:"VE";a:1:{i:0;s:9:"Venecuela";}s:2:"VG";a:1:{i:0;s:28:"Britanska DeviÄanska Ostrva";}s:2:"VI";a:1:{i:0;s:25:"S.A.D. DeviÄanska Ostrva";}s:2:"VN";a:1:{i:0;s:8:"Vijetnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:14:"Valis i Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:11:"Jugoslavija";}s:2:"ZA";a:1:{i:0;s:13:"Južna Afrika";}s:2:"ZM";a:1:{i:0;s:7:"Zambija";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabve";}}s:10:"Currencies";a:1:{s:3:"YUN";a:2:{i:0;s:3:"Din";i:1;s:3:"YUN";}}s:9:"Languages";a:58:{s:2:"af";a:1:{i:0;s:12:"Afrikanerski";}s:2:"ar";a:1:{i:0;s:7:"Arapski";}s:2:"be";a:1:{i:0;s:9:"Beloruski";}s:2:"bg";a:1:{i:0;s:8:"Bugarski";}s:2:"br";a:1:{i:0;s:9:"Bretonski";}s:2:"ca";a:1:{i:0;s:10:"Katalonski";}s:2:"co";a:1:{i:0;s:11:"Korzikanski";}s:2:"cs";a:1:{i:0;s:7:"ÄŒeÅ¡ki";}s:2:"da";a:1:{i:0;s:6:"Danski";}s:2:"de";a:1:{i:0;s:8:"NemaÄki";}s:2:"el";a:1:{i:0;s:6:"GrÄki";}s:2:"en";a:1:{i:0;s:8:"Engleski";}s:2:"es";a:1:{i:0;s:8:"Å panski";}s:2:"et";a:1:{i:0;s:8:"Estonski";}s:2:"eu";a:1:{i:0;s:9:"Baskijski";}s:2:"fa";a:1:{i:0;s:9:"Persijski";}s:2:"fi";a:1:{i:0;s:6:"Finski";}s:2:"fr";a:1:{i:0;s:9:"Francuski";}s:2:"ga";a:1:{i:0;s:5:"Irski";}s:2:"he";a:1:{i:0;s:9:"Hebrejski";}s:2:"hr";a:1:{i:0;s:8:"Hrvatski";}s:2:"hu";a:1:{i:0;s:9:"MaÄ‘arski";}s:2:"hy";a:1:{i:0;s:8:"Armenski";}s:2:"id";a:1:{i:0;s:12:"Indonezijski";}s:2:"is";a:1:{i:0;s:9:"Islandski";}s:2:"it";a:1:{i:0;s:11:"Italijanski";}s:2:"ja";a:1:{i:0;s:8:"Japanski";}s:2:"ka";a:1:{i:0;s:9:"Gruzijski";}s:2:"km";a:1:{i:0;s:7:"Kmerski";}s:2:"ko";a:1:{i:0;s:8:"Korejski";}s:2:"ku";a:1:{i:0;s:7:"Kurdski";}s:2:"ky";a:1:{i:0;s:8:"Kirgiski";}s:2:"la";a:1:{i:0;s:8:"Latinski";}s:2:"lt";a:1:{i:0;s:9:"Litvanski";}s:2:"lv";a:1:{i:0;s:8:"Letonski";}s:2:"mk";a:1:{i:0;s:10:"Makedonski";}s:2:"mn";a:1:{i:0;s:9:"Mongolski";}s:2:"mo";a:1:{i:0;s:9:"Moldavski";}s:2:"my";a:1:{i:0;s:9:"Burmanski";}s:2:"nl";a:1:{i:0;s:9:"Holandski";}s:2:"no";a:1:{i:0;s:9:"NorveÅ¡ki";}s
:2:"pl";a:1:{i:0;s:7:"Poljski";}s:2:"pt";a:1:{i:0;s:11:"Portugalski";}s:2:"rm";a:1:{i:0;s:13:"Reto-Romanski";}s:2:"ro";a:1:{i:0;s:8:"Rumunski";}s:2:"ru";a:1:{i:0;s:5:"Ruski";}s:2:"sh";a:1:{i:0;s:15:"Srpsko-Hrvatski";}s:2:"sk";a:1:{i:0;s:9:"SlovaÄki";}s:2:"sl";a:1:{i:0;s:11:"SlovenaÄki";}s:2:"sq";a:1:{i:0;s:8:"Albanski";}s:2:"sr";a:1:{i:0;s:6:"Srpski";}s:2:"sv";a:1:{i:0;s:8:"Å vedski";}s:2:"sw";a:1:{i:0;s:7:"Svahili";}s:2:"tr";a:1:{i:0;s:6:"Turski";}s:2:"uk";a:1:{i:0;s:9:"Ukrajnski";}s:2:"vi";a:1:{i:0;s:11:"Vijetnamski";}s:2:"yi";a:1:{i:0;s:6:"JidiÅ¡";}s:2:"zh";a:1:{i:0;s:7:"Kineski";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:7:"Scripts";a:18:{s:4:"Arab";a:1:{i:0;s:13:"arapsko pismo";}s:4:"Armn";a:1:{i:0;s:15:"jermensko pismo";}s:4:"Beng";a:1:{i:0;s:15:"bengalsko pismo";}s:4:"Brai";a:1:{i:0;s:13:"Brajevo pismo";}s:4:"Cher";a:1:{i:0;s:7:"ÄŒeroki";}s:4:"Copt";a:1:{i:0;s:15:"koptiÄko pismo";}s:4:"Cyrl";a:1:{i:0;s:9:"Ćirilica";}s:4:"Deva";a:1:{i:0;s:10:"Devanagari";}s:4:"Dsrt";a:1:{i:0;s:7:"Dezeret";}s:4:"Ethi";a:1:{i:0;s:14:"etiopsko pismo";}s:4:"Geor";a:1:{i:0;s:15:"gruzijsko pismo";}s:4:"Goth";a:1:{i:0;s:6:"Gotika";}s:4:"Grek";a:1:{i:0;s:12:"grÄko pismo";}s:4:"Hebr";a:1:{i:0;s:15:"hebrejsko pismo";}s:4:"Hira";a:1:{i:0;s:8:"Hiragana";}s:4:"Hrkt";a:1:{i:0;s:21:"Katakana ili Hiragana";}s:4:"Kana";a:1:{i:0;s:8:"Katakana";}s:4:"Latn";a:1:{i:0;s:8:"Latinica";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:4:{s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH.mm.ss z";i:1;s:10:"HH.mm.ss z";i:2;s:8:"HH.mm.ss";i:3;s:5:"HH.mm";i:4;s:20:"EEEE, dd. MMMM yyyy.";i:5;s:16:"EEEE, d.MM.yyyy.";i:6;s:11:"dd.MM.yyyy.";i:7;s:7:"d.M.yy.";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:3:"ned";i:1;s:3:"pon";i:2;s:3:"uto";i:3;s:3:"sre";i:4;s:4:"Äet";i:5;s:3:"pet";i:6;s:3:"sub";}s:6:"narrow";a:7:{i:0;s:1:"n";i:1;s:1:"p";i:2;s:1:"u";i:3;s:1:"s";i:4;s:2:"Ä";i:5;s:1:"p";i:6;s:1:"s";}s:4:"wide";a:7:{i:0;s:7:"nedelja";i:1;s:10:"ponedeljak";i:2;s:6:"utorak";i:3;s:5:"sreda";i:4;s:9:
"Äetvrtak";i:5;s:5:"petak";i:6;s:6:"subota";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:8:"p. n. e.";i:1;s:5:"n. e.";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:3:"jan";i:1;s:3:"feb";i:2;s:3:"mar";i:3;s:3:"apr";i:4;s:3:"maj";i:5;s:3:"jun";i:6;s:3:"jul";i:7;s:3:"avg";i:8;s:3:"sep";i:9;s:3:"okt";i:10;s:3:"nov";i:11;s:3:"dec";}s:6:"narrow";a:12:{i:0;s:1:"j";i:1;s:1:"f";i:2;s:1:"m";i:3;s:1:"a";i:4;s:1:"m";i:5;s:1:"j";i:6;s:1:"j";i:7;s:1:"a";i:8;s:1:"s";i:9;s:1:"o";i:10;s:1:"n";i:11;s:1:"d";}s:4:"wide";a:12:{i:0;s:6:"januar";i:1;s:7:"februar";i:2;s:4:"mart";i:3;s:5:"april";i:4;s:3:"maj";i:5;s:3:"jun";i:6;s:3:"jul";i:7;s:6:"avgust";i:8;s:9:"septembar";i:9;s:7:"oktobar";i:10;s:8:"novembar";i:11;s:8:"decembar";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Latn_YU.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Latn_YU.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_Latn_YU.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_YU.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_YU.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sr_YU.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"__ALIAS";a:1:{i:0;s:10:"sr_Cyrl_YU";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sv.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sv.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sv.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:12:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:7:"Andorra";}s:2:"AE";a:1:{i:0;s:22:"Förenade Arabemiraten";}s:2:"AF";a:1:{i:0;s:11:"Afghanistan";}s:2:"AG";a:1:{i:0;s:19:"Antigua och Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:8:"Albanien";}s:2:"AM";a:1:{i:0;s:8:"Armenien";}s:2:"AN";a:1:{i:0;s:24:"Nederländska Antillerna";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:9:"Antarktis";}s:2:"AR";a:1:{i:0;s:9:"Argentina";}s:2:"AS";a:1:{i:0;s:17:"Amerikanska Samoa";}s:2:"AT";a:1:{i:0;s:10:"Österrike";}s:2:"AU";a:1:{i:0;s:10:"Australien";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:12:"Azerbajdzjan";}s:2:"BA";a:1:{i:0;s:23:"Bosnien och Hercegovina";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladesh";}s:2:"BE";a:1:{i:0;s:7:"Belgien";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:9:"Bulgarien";}s:2:"BH";a:1:{i:0;s:7:"Bahrain";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:6:"Brunei";}s:2:"BO";a:1:{i:0;s:7:"Bolivia";}s:2:"BR";a:1:{i:0;s:9:"Brasilien";}s:2:"BS";a:1:{i:0;s:7:"Bahamas";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BV";a:1:{i:0;s:9:"Bouvetön";}s:2:"BW";a:1:{i:0;s:8:"Botswana";}s:2:"BY";a:1:{i:0;s:11:"Vitryssland";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:27:"Kokosöarna (Keelingöarna)";}s:2:"CD";a:1:{i:0;s:29:"Demokratiska republiken Kongo";}s:2:"CF";a:1:{i:0;s:28:"Centralafrikanska republiken";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:7:"Schweiz";}s:2:"CI";a:1:{i:0;s:15:"Elfenbenskusten";}s:2:"CK";a:1:{i:0;s:10:"Cooköarna";}s:2:"CL";a:1:{i:0;s:5:"Chile";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:4:"Kina";}s:2:"CO";a:1:{i:0;s:8:"Colombia";}s:2:"CR";a:1:{i:0;s:10:"Costa Rica";}s:2:"CU";a:1:{i:0;s:4:"Kuba";}s:2:"CV";a:1:{i:0;s:9:"Kap Verde";}s:2:"CX";a:1:{i:0;s:6:"Julön";}s:2:"CY";a:1:{i:0;s:6:"Cypern";}s:2:"CZ";a:1:{i:0;s:8:"Tjeckien";}s:2:"DE";a:1:{i:0;s:8:"Tyskland";}s:2:"DJ";a:1:{i:0;s:8:"Djibouti";}s:2:"DK";a:
1:{i:0;s:7:"Danmark";}s:2:"DM";a:1:{i:0;s:8:"Dominica";}s:2:"DO";a:1:{i:0;s:23:"Dominikanska republiken";}s:2:"DZ";a:1:{i:0;s:8:"Algeriet";}s:2:"EC";a:1:{i:0;s:7:"Ecuador";}s:2:"EE";a:1:{i:0;s:7:"Estland";}s:2:"EG";a:1:{i:0;s:7:"Egypten";}s:2:"EH";a:1:{i:0;s:14:"Västra Sahara";}s:2:"ER";a:1:{i:0;s:7:"Eritrea";}s:2:"ES";a:1:{i:0;s:7:"Spanien";}s:2:"ET";a:1:{i:0;s:8:"Etiopien";}s:2:"FI";a:1:{i:0;s:7:"Finland";}s:2:"FJ";a:1:{i:0;s:4:"Fiji";}s:2:"FK";a:1:{i:0;s:15:"Falklandsöarna";}s:2:"FM";a:1:{i:0;s:11:"Mikronesien";}s:2:"FO";a:1:{i:0;s:10:"Färöarna";}s:2:"FR";a:1:{i:0;s:9:"Frankrike";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:14:"Storbritannien";}s:2:"GD";a:1:{i:0;s:7:"Grenada";}s:2:"GE";a:1:{i:0;s:8:"Georgien";}s:2:"GF";a:1:{i:0;s:14:"Franska Guyana";}s:2:"GH";a:1:{i:0;s:5:"Ghana";}s:2:"GI";a:1:{i:0;s:9:"Gibraltar";}s:2:"GL";a:1:{i:0;s:9:"Grönland";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:6:"Guinea";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:16:"Ekvatorialguinea";}s:2:"GR";a:1:{i:0;s:8:"Grekland";}s:2:"GS";a:1:{i:0;s:37:"Sydgeorgien och Södra Sandwichöarna";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:13:"Guinea-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:22:"Hongkong (S.A.R. Kina)";}s:2:"HM";a:1:{i:0;s:25:"Heard- och McDonaldöarna";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:8:"Kroatien";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:6:"Ungern";}s:2:"ID";a:1:{i:0;s:10:"Indonesien";}s:2:"IE";a:1:{i:0;s:6:"Irland";}s:2:"IL";a:1:{i:0;s:6:"Israel";}s:2:"IN";a:1:{i:0;s:6:"Indien";}s:2:"IO";a:1:{i:0;s:29:"Brittiska Indiska oceanöarna";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IR";a:1:{i:0;s:4:"Iran";}s:2:"IS";a:1:{i:0;s:6:"Island";}s:2:"IT";a:1:{i:0;s:7:"Italien";}s:2:"JM";a:1:{i:0;s:7:"Jamaica";}s:2:"JO";a:1:{i:0;s:9:"Jordanien";}s:2:"JP";a:1:{i:0;s:5:"Japan";}s:2:"KE";a:1:{i:0;s:5:"Kenya";}s:2:"KG";a:1:{i:0;s:11:"Kirgizistan";}s:2:"KH";a:1:{i:0;s:8:"Kambodja";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:
1:{i:0;s:9:"Komorerna";}s:2:"KN";a:1:{i:0;s:19:"S:t Kitts och Nevis";}s:2:"KP";a:1:{i:0;s:9:"Nordkorea";}s:2:"KR";a:1:{i:0;s:8:"Sydkorea";}s:2:"KW";a:1:{i:0;s:6:"Kuwait";}s:2:"KY";a:1:{i:0;s:12:"Caymanöarna";}s:2:"KZ";a:1:{i:0;s:9:"Kazakstan";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:7:"Libanon";}s:2:"LC";a:1:{i:0;s:9:"S:t Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberia";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:7:"Litauen";}s:2:"LU";a:1:{i:0;s:9:"Luxemburg";}s:2:"LV";a:1:{i:0;s:8:"Lettland";}s:2:"LY";a:1:{i:0;s:6:"Libyen";}s:2:"MA";a:1:{i:0;s:7:"Marocko";}s:2:"MC";a:1:{i:0;s:6:"Monaco";}s:2:"MD";a:1:{i:0;s:9:"Moldavien";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:14:"Marshallöarna";}s:2:"MK";a:1:{i:0;s:10:"Makedonien";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:9:"Mongoliet";}s:2:"MO";a:1:{i:0;s:19:"Macao (S.A.R. Kina)";}s:2:"MP";a:1:{i:0;s:14:"Nordmarianerna";}s:2:"MQ";a:1:{i:0;s:10:"Martinique";}s:2:"MR";a:1:{i:0;s:11:"Mauretanien";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:10:"Maldiverna";}s:2:"MW";a:1:{i:0;s:6:"Malawi";}s:2:"MX";a:1:{i:0;s:6:"Mexiko";}s:2:"MY";a:1:{i:0;s:8:"Malaysia";}s:2:"MZ";a:1:{i:0;s:11:"Moçambique";}s:2:"NA";a:1:{i:0;s:7:"Namibia";}s:2:"NC";a:1:{i:0;s:14:"Nya Kaledonien";}s:2:"NE";a:1:{i:0;s:5:"Niger";}s:2:"NF";a:1:{i:0;s:10:"Norfolkön";}s:2:"NG";a:1:{i:0;s:7:"Nigeria";}s:2:"NI";a:1:{i:0;s:9:"Nicaragua";}s:2:"NL";a:1:{i:0;s:14:"Nederländerna";}s:2:"NO";a:1:{i:0;s:5:"Norge";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:5:"Nauru";}s:2:"NU";a:1:{i:0;s:7:"Niueön";}s:2:"NZ";a:1:{i:0;s:11:"Nya Zeeland";}s:2:"OM";a:1:{i:0;s:4:"Oman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:18:"Franska Polynesien";}s:2:"PG";a:1:{i:0;s:16:"Papua Nya Guinea";}s:2:"PH";a:1:{i:0;s:12:"Filippinerna";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:
1:{i:0;s:5:"Polen";}s:2:"PM";a:1:{i:0;s:23:"S:t Pierre och Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:11:"Puerto Rico";}s:2:"PS";a:1:{i:0;s:23:"Palestinska territoriet";}s:2:"PT";a:1:{i:0;s:8:"Portugal";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Qatar";}s:2:"RE";a:1:{i:0;s:8:"Réunion";}s:2:"RO";a:1:{i:0;s:9:"Rumänien";}s:2:"RU";a:1:{i:0;s:8:"Ryssland";}s:2:"RW";a:1:{i:0;s:6:"Rwanda";}s:2:"SA";a:1:{i:0;s:12:"Saudiarabien";}s:2:"SB";a:1:{i:0;s:13:"Salomonöarna";}s:2:"SC";a:1:{i:0;s:12:"Seychellerna";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:7:"Sverige";}s:2:"SG";a:1:{i:0;s:9:"Singapore";}s:2:"SH";a:1:{i:0;s:10:"S:t Helena";}s:2:"SI";a:1:{i:0;s:9:"Slovenien";}s:2:"SJ";a:1:{i:0;s:22:"Svalbard och Jan Mayen";}s:2:"SK";a:1:{i:0;s:9:"Slovakien";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:7:"Somalia";}s:2:"SP";a:1:{i:0;s:7:"Serbien";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:24:"São Tomé och Príncipe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:6:"Syrien";}s:2:"SZ";a:1:{i:0;s:9:"Swaziland";}s:2:"TC";a:1:{i:0;s:23:"Turks- och Caicosöarna";}s:2:"TD";a:1:{i:0;s:5:"Tchad";}s:2:"TF";a:1:{i:0;s:24:"Franska Sydterritorierna";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:8:"Thailand";}s:2:"TJ";a:1:{i:0;s:12:"Tadzjikistan";}s:2:"TK";a:1:{i:0;s:13:"Tokelauöarna";}s:2:"TL";a:1:{i:0;s:9:"Östtimor";}s:2:"TM";a:1:{i:0;s:12:"Turkmenistan";}s:2:"TN";a:1:{i:0;s:8:"Tunisien";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:7:"Turkiet";}s:2:"TT";a:1:{i:0;s:19:"Trinidad och Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Taiwan";}s:2:"TZ";a:1:{i:0;s:8:"Tanzania";}s:2:"UA";a:1:{i:0;s:7:"Ukraina";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:15:"USAs yttre öar";}s:2:"US";a:1:{i:0;s:3:"USA";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:10:"Uzbekistan";}s:2:"VA";a:1:{i:0;s:13:"Vatikanstaten";}s:2:"VC";a:1:{i:0
;s:28:"S:t Vincent och Grenadinerna";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:23:"Brittiska Jungfruöarna";}s:2:"VI";a:1:{i:0;s:25:"Amerikanska Jungfruöarna";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:24:"Wallis- och Futunaöarna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Jemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:11:"Jugoslavien";}s:2:"ZA";a:1:{i:0;s:9:"Sydafrika";}s:2:"ZM";a:1:{i:0;s:6:"Zambia";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:366:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:16:"Andorransk diner";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:17:"Andorransk peseta";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:30:"Förenade arabemiratens dirham";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:22:"Affars och Issas-franc";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:23:"Albansk lek (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:11:"Albansk lek";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:23:"Albansk lek – Valute)";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:49:"Albansk dollar – Foreign Exchange Certificates)";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:13:"Armenisk dram";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:29:"Nederländsk antillisk gulden";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:16:"Angolansk kwanza";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:28:"Angolansk kwanza (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:31:"Angolansk ny kwanza (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:43:"Angolansk kwanza – Reajustado (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:16:"Angolansk escudo";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:18:"Argentinsk austral";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:35:"Argentinsk peso – Moneda nacional";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:27:"Argentinsk peso (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:15:"Argentinsk peso";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:22:"Österrikisk schilling";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:17:"Australisk dollar";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:16:"Australiskt pund";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:12:"Aruba-florin"
;}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:20:"Azerbajdzjansk manat";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:26:"Bosnisk-hercegovinsk dinar";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:37:"Konvertibel bosnisk-hercegovinsk mark";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:29:"Bosnisk-hercegovinsk ny dinar";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:16:"Barbadisk dollar";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:18:"Bangladeshisk taka";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:27:"Belgisk franc (konvertibel)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:13:"Belgisk franc";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:26:"Belgisk franc (finansiell)";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:19:"Bulgarisk hård lev";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:26:"Bulgarisk socialistisk lev";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:16:"Bulgarisk ny lev";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:25:"Bulgarisk lev (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:47:"Bulgarisk lev – Foreign Exchange Certificates";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:15:"Bahrainsk dinar";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:15:"Burundisk franc";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:14:"Bermuda-dollar";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:12:"Bermuda-pund";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:15:"Bruneisk dollar";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:15:"Boliviansk peso";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:16:"Boliviansk mvdol";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:37:"Brasiliansk cruzeiro novo (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:19:"Brasiliansk cruzado";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:32:"Brasiliansk cruzeiro (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:16:"Brasiliansk real";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:24:"Brasiliansk cruzado novo";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:20:"Brasiliansk cruzeiro";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:32:"Brasiliansk cruzeiro (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:16:"Bahamansk dollar";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:15:"Bahamanskt pund";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:20:"Bhutanesisk ngultrum";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:17:"Bhutanesisk rupie";}s:3:"BUK";a
:2:{i:0;s:3:"BUK";i:1;s:14:"Burmesisk kyat";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:15:"Burmesisk rupee";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:14:"Botswansk pula";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:28:"Vitrysk ny rubel (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:25:"Vitrysk rubel (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:13:"Vitrysk rubel";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:15:"Belizisk dollar";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:25:"Brittiska Honduras-dollar";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:18:"Kanadensisk dollar";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:27:"Kongolesisk franc congolais";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:17:"Kongolesisk franc";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:17:"Kongolesisk zaire";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:26:"Centralafrikansk CFA-franc";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:16:"Schweizisk franc";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:11:"Cook-dollar";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:15:"Chilensk condor";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:15:"Chilensk escudo";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:26:"Chilensk unidad de fomento";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:13:"Chilensk peso";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:19:"Kamerunsk CFA-franc";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:26:"Kinesisk jen min piao yuan";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:49:"Kinesisk USA-dollar Foreign Exchange Certificates";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:22:"Kinesisk yuan renminbi";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:23:"Colombiansk papperspeso";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:21:"Kongolesisk CFA-franc";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:16:"Colombiansk peso";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:19:"Costarikansk colón";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:15:"Tjeckisk koruna";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:21:"Tjeckisk hård koruna";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:12:"Kubansk peso";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:37:"Kubansk Foreign Exchange Certificates";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:17:"Kapverdisk escudo";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:15:"Curaçao-gulden";}s:3:"CYP";a
:2:{i:0;s:3:"£C";i:1;s:16:"Cypriotiskt pund";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:15:"Tjeckisk koruna";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:13:"Östtysk mark";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:9:"Tysk mark";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:14:"Tysk sperrmark";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:16:"Djiboutisk franc";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:11:"Dansk krona";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:16:"Dominikansk peso";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:14:"Algerisk dinar";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:17:"Algerisk ny franc";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:23:"Algerisk franc germinal";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:18:"Ecuadoriansk sucre";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:44:"Ecuadoriansk Unidad de Valor Constante (UVC)";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:13:"Estnisk krona";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:14:"Egyptiskt pund";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:16:"Eritreansk nakfa";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:13:"Spansk peseta";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:13:"Etiopisk birr";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:15:"Etiopisk dollar";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"Euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:10:"Finsk mark";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:22:"Finsk mark (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:15:"Fijiansk dollar";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:14:"Fijianskt pund";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:21:"Falklandsöarnas pund";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:15:"Färöisk krona";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:12:"Fransk franc";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:36:"Fransk Franc Germinal/Franc Poincare";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:20:"Gabonesisk CFA-franc";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:23:"Brittiskt pund sterling";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:20:"Georgisk kupon larit";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:13:"Georgisk lari";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:13:"Ghanansk cedi";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:20:"Ghanansk gammal cedi";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:14:"Ghananskt pund";}s:3:"GHR";a:2
:{i:0;s:3:"GHR";i:1;s:25:"Ghanansk omvärderad cedi";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:16:"Gibraltiskt pund";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:18:"Grönländsk krona";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:14:"Gambisk dalasi";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:13:"Gambiskt pund";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:15:"Guineansk franc";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:27:"Guineansk franc (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:14:"Guineansk syli";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:18:"Guadeloupisk franc";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:35:"Ekvatorialguineansk ekwele guineana";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:26:"Ekvatorialguineansk franco";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:35:"Ekvatorialguineansk peseta guineana";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:15:"Grekisk drachma";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:18:"Grekisk ny drachma";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:20:"Guatemalansk quetzal";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:28:"Franska Guyanas Franc Guiana";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:26:"Portugisiska Guinea-escudo";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:28:"Portugisiska Guinea-mil reis";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:18:"Guinea-Bissau-peso";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:16:"Guyanansk dollar";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:15:"Hongkong-dollar";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:17:"Hoduransk lempira";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:14:"Kroatisk dinar";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:13:"Kroatisk kuna";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:14:"Haitisk gourde";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:14:"Ungersk forint";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:19:"Nordirländskt pund";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:22:"Indonesisk nica gulden";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:22:"Indonesisk java rupiah";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:20:"Indonesisk ny rupiah";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:17:"Indonesisk rupiah";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:15:"Irländskt pund";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:16:"Israelisk shekel";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:15:"
Israeliskt pund";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:19:"Israelisk ny shekel";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:25:"Isle of Man-pund sterling";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:12:"Indisk rupie";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:13:"Irakisk dinar";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:11:"Iransk rial";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:15:"Isländsk krona";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:14:"Italiensk lira";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:20:"Jersey-pund sterling";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:17:"Jamaicansk dollar";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:16:"Jamaicanskt pund";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:14:"Jordansk dinar";}s:3:"JPY";a:2:{i:0;s:2:"¥";i:1;s:11:"Japansk yen";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:17:"Kenyansk shilling";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:17:"Kirgizistansk som";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:23:"Kambodjansk gammal riel";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:16:"Kambodjansk riel";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:17:"Kiribatisk dollar";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:14:"Komorisk franc";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:16:"Nordkoreansk won";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:16:"Nordkoreansk won";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:16:"Sydkoreansk hwan";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:22:"Sydkoreansk gammal won";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:15:"Sydkoreansk won";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:15:"Kuwaitisk dinar";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:13:"Cayman-dollar";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:14:"Kazakisk rubel";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:14:"Kazakisk tenge";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:11:"Laotisk kip";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:16:"Libanesiskt pund";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:21:"Liechtensteinsk franc";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:18:"Srilankesisk rupie";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:17:"Ceylonesisk rupie";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:15:"Liberisk dollar";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:14:"Lesothisk loti";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:12:"Lettisk lita"
;}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:15:"Lettisk talonas";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:17:"Luxemburgsk franc";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:12:"Lettisk lats";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:13:"Lettisk rubel";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:43:"Libyska brittiska militärmyndighetens lira";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:12:"Libysk dinar";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:12:"Libyskt pund";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:17:"Marockansk dirham";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:16:"Marockansk franc";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:25:"Monegaskisk franc nouveau";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:26:"Monegaskisk franc germinal";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:20:"Moldavisk leu-kupong";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:13:"Moldavisk leu";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:21:"Moldavisk rubelkupong";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:18:"Madagaskisk ariary";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:17:"Madagaskisk franc";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:20:"Marshallöisk dollar";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:16:"Makedonisk denar";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:28:"Makedonisk denar (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:12:"Malisk franc";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:15:"Myanmarisk kyat";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:51:"Myanmarisk dollar – Foreign Exchange Certificates";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:16:"Mongolisk tugrik";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:15:"Macaoisk pataca";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:19:"Martiniqueisk franc";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:18:"Mauretansk ouguiya";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:14:"Maltesisk lira";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:15:"Maltesiskt pund";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:15:"Mauritisk rupie";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:15:"Maldivisk rupie";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:17:"Maldivisk rufiyaa";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:15:"Malawisk kwacha";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:14:"Malawiskt pund";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:14:"Mexikansk p
eso";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:32:"Mexikansk silverpeso (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:35:"Mexikansk Unidad de Inversion (UDI)";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:17:"Malaysisk ringgit";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:19:"Moçambikisk escudo";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:20:"Moçambikisk metical";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:15:"Namibisk dollar";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:26:"Nykaledonsk franc germinal";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:16:"Nigeriansk naira";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:16:"Nigerianskt pund";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:21:"Nyhebridisk CFP-franc";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:21:"Nicaraguansk córdoba";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:25:"Nicaraguansk guldcórdoba";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:25:"Nicaraguansk córdoba oro";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:19:"Nederländsk gulden";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:11:"Norsk krona";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:16:"Nepalesisk rupie";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:19:"Nyzeeländsk dollar";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:18:"Nyzeeländskt pund";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:11:"Omansk rial";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:17:"Omansk rial saidi";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:16:"Panamansk balboa";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:27:"Transdniestrisk rubelkupong";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:24:"Transdniestrisk ny rubel";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:21:"Transdniestrisk rubel";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:13:"Peruansk inti";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:18:"Peruansk sol nuevo";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:12:"Peruansk sol";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:13:"Papuansk kina";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:15:"Filippinsk peso";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:16:"Pakistansk rupie";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:11:"Polsk zloty";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:45:"Polsk US-dollar Foreign Exchange Certificates";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:23:"Polsk zloty (1950-1995)";}s:3:"PSP
";a:2:{i:0;s:3:"PSP";i:1;s:16:"Palestinskt pund";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:17:"Portugisisk conto";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:18:"Portugisisk escudo";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:18:"Paraguaysk guarani";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:13:"Qatarisk rial";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:14:"Réunion-franc";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:12:"Rumänsk leu";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:15:"Rumänsk ny leu";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:10:"Rysk rubel";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:22:"Rysk rubel (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:14:"Rwandisk franc";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:13:"Saudisk riyal";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:23:"Saudisk sovereign riyal";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:14:"Salomon-dollar";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:17:"Seychellisk rupie";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:16:"Sudanesisk dinar";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:16:"Sudanesiskt pund";}s:3:"SEK";a:2:{i:0;s:2:"kr";i:1;s:12:"Svensk krona";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:20:"Singaporiansk dollar";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:15:"S:t Helena-pund";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:19:"Slovensk tolar bons";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:14:"Slovensk tolar";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:16:"Slovakisk koruna";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:18:"Sierraleonsk leone";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:15:"Sanmarinsk lira";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:17:"Somalisk shilling";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:22:"Somaliländsk shilling";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:19:"Surinamesisk gulden";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:12:"Skotskt pund";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:30:"São Tomé och Príncipe-dobra";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:31:"São Tomé och Príncipe-escudo";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:18:"Sovjetisk ny rubel";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:15:"Sovjetisk rubel";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:19:"Salvadoransk colón";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:12:"Syriskt pund"
;}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:22:"Swaziländsk lilangeni";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:22:"Turks and Caicos-crown";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:18:"Tchadisk CFA-franc";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:16:"Thailändsk baht";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:16:"Tadzjikisk rubel";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:17:"Tadzjikisk somoni";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:15:"Turkmensk manat";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:14:"Tunisisk dinar";}s:3:"TOP";a:2:{i:0;s:2:"T$";i:1;s:17:"Tongansk paʻanga";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:23:"Tonganskt pund sterling";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:17:"Timoriansk escudo";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:17:"Timoriansk pataca";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:12:"Turkisk lira";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:18:"Trinidadisk dollar";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:25:"Trinidadisk gammal dollar";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:17:"Tuvaluansk dollar";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:21:"Taiwanesisk ny dollar";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:18:"Tanzanisk shilling";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:16:"Ukrainsk hryvnia";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:20:"Ukrainsk karbovanetz";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:29:"Ugandisk shilling (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:17:"Ugandisk shilling";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:9:"US-dollar";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:22:"US-dollar (nästa dag)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:21:"US-dollar (samma dag)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:23:"Uruguayansk peso fuerte";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:28:"Uruguayansk peso (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:25:"Uruguayansk peso uruguayo";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:19:"Uzbekisk coupon som";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:12:"Uzbekisk sum";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:14:"Vatikansk lira";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:34:"Nordvietnamesisk piastre dong viet";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:24:"Nordvietnamesisk ny dong";}s:3:"VDP";a:2:{i:0;s:3:"V
DP";i:1;s:44:"Nordvietnamesisk viet minh piastre dong viet";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:20:"Venezuelansk bolivar";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:19:"Jungfruöisk dollar";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:17:"Vietnamesisk dong";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:20:"Vietnamesisk ny dong";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:17:"Vietnamesisk dong";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:27:"Vietnamesisk nationell dong";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:14:"Vanuatisk vatu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:19:"Västsamoanskt pund";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:18:"Västsamoansk tala";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:14:"CFA Franc BEAC";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:19:"Östkaribisk dollar";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:17:"CFA Nouveau Franc";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:16:"CFA Franc BCEAEC";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:16:"Fransk guldfranc";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:16:"French UIC-Franc";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:14:"Islamisk dinar";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:33:"French Metropolitan Nouveau Franc";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:26:"Fransk Antillisk CFA-franc";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:15:"CFA Franc BCEAO";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:9:"CFP-franc";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:16:"Jemenitisk dinar";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:22:"Jemenitisk imadi riyal";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:15:"Jemenitisk rial";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:23:"Jugoslavisk hård dinar";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:28:"Jugoslavisk federationsdinar";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:24:"Jugoslavisk dinar (1994)";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:30:"Dinar (Serbien och Montenegro)";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:29:"Jugoslavisk konvertibel dinar";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:24:"Jugoslavisk oktoberdinar";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:28:"Jugoslavisk reformerad dinar";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:30:"Sydafrikansk rand (finansiell)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:17:"Sydafrikansk 
rand";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:17:"Sydafrikansk rand";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:14:"Zambisk kwacha";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:13:"Zambiskt pund";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:16:"Zairisk ny zaire";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:13:"Zairisk zaire";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:17:"Zimbabwisk dollar";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:8:"kalender";}s:9:"collation";a:1:{i:0;s:17:"sorteringsordning";}s:8:"currency";a:1:{i:0;s:6:"valuta";}}s:9:"Languages";a:461:{s:2:"aa";a:1:{i:0;s:4:"afar";}s:2:"ab";a:1:{i:0;s:10:"abkhaziska";}s:3:"ace";a:1:{i:0;s:8:"achinese";}s:3:"ach";a:1:{i:0;s:6:"acholi";}s:3:"ada";a:1:{i:0;s:7:"adangme";}s:3:"ady";a:1:{i:0;s:9:"adygeiska";}s:2:"ae";a:1:{i:0;s:9:"avestiska";}s:2:"af";a:1:{i:0;s:9:"afrikaans";}s:3:"afa";a:1:{i:0;s:22:"afro-asiatiskt (andra)";}s:3:"afh";a:1:{i:0;s:8:"afrihili";}s:2:"ak";a:1:{i:0;s:4:"akan";}s:3:"akk";a:1:{i:0;s:9:"akkadiska";}s:3:"ale";a:1:{i:0;s:9:"aleutiska";}s:3:"alg";a:1:{i:0;s:15:"algonquinspråk";}s:2:"am";a:1:{i:0;s:9:"amhariska";}s:2:"an";a:1:{i:0;s:12:"aragonesiska";}s:3:"ang";a:1:{i:0;s:26:"fornengelska (ca 450-1100)";}s:3:"apa";a:1:{i:0;s:12:"apachespråk";}s:2:"ar";a:1:{i:0;s:8:"arabiska";}s:3:"arc";a:1:{i:0;s:9:"arameiska";}s:3:"arn";a:1:{i:0;s:10:"araukanska";}s:3:"arp";a:1:{i:0;s:7:"arapaho";}s:3:"art";a:1:{i:0;s:20:"artificiellt (annat)";}s:3:"arw";a:1:{i:0;s:10:"arawakiska";}s:2:"as";a:1:{i:0;s:6:"assami";}s:3:"ast";a:1:{i:0;s:9:"asturiska";}s:3:"ath";a:1:{i:0;s:18:"athapasiska språk";}s:3:"aus";a:1:{i:0;s:18:"australiska språk";}s:2:"av";a:1:{i:0;s:8:"avariska";}s:3:"awa";a:1:{i:0;s:6:"awadhi";}s:2:"ay";a:1:{i:0;s:6:"aymara";}s:2:"az";a:1:{i:0;s:15:"azerbajdzjanska";}s:2:"ba";a:1:{i:0;s:11:"basjkiriska";}s:3:"bad";a:1:{i:0;s:5:"banda";}s:3:"bai";a:1:{i:0;s:18:"bamilekiska språk";}s:3:"bal";a:1:{i:0;s:7:"baluchi";}s:3:"ban";a:1:{i:0;s:11:"balinesiska";}s:3:"bas";a:1:{i:0;s:4:"basa";}s:3:"bat";a:1:{i:0;s:16:"baltiskt (annat)";}s:2:"be";a:1:{i:0;s:8:"vitryska";}s:3:"bej";a:1:{i:0;s:5:"beyja";}
s:3:"bem";a:1:{i:0;s:5:"bemba";}s:3:"ber";a:1:{i:0;s:6:"berber";}s:2:"bg";a:1:{i:0;s:10:"bulgariska";}s:2:"bh";a:1:{i:0;s:6:"bihari";}s:3:"bho";a:1:{i:0;s:8:"bhojpuri";}s:2:"bi";a:1:{i:0;s:7:"bislama";}s:3:"bik";a:1:{i:0;s:5:"bikol";}s:3:"bin";a:1:{i:0;s:4:"bini";}s:3:"bla";a:1:{i:0;s:7:"siksika";}s:2:"bm";a:1:{i:0;s:7:"bambara";}s:2:"bn";a:1:{i:0;s:7:"bengali";}s:3:"bnt";a:1:{i:0;s:11:"bantuspråk";}s:2:"bo";a:1:{i:0;s:10:"tibetanska";}s:2:"br";a:1:{i:0;s:9:"bretonska";}s:3:"bra";a:1:{i:0;s:4:"braj";}s:2:"bs";a:1:{i:0;s:8:"bosniska";}s:3:"btk";a:1:{i:0;s:5:"batak";}s:3:"bua";a:1:{i:0;s:6:"buriat";}s:3:"bug";a:1:{i:0;s:11:"buginesiska";}s:3:"byn";a:1:{i:0;s:4:"blin";}s:2:"ca";a:1:{i:0;s:10:"katalanska";}s:3:"cad";a:1:{i:0;s:5:"caddo";}s:3:"cai";a:1:{i:0;s:36:"centralamerikanskt indianskt (annat)";}s:3:"car";a:1:{i:0;s:9:"karibiska";}s:3:"cau";a:1:{i:0;s:18:"kaukasiskt (annat)";}s:2:"ce";a:1:{i:0;s:10:"tjetjenska";}s:3:"ceb";a:1:{i:0;s:7:"cebuano";}s:3:"cel";a:1:{i:0;s:16:"keltiskt (annat)";}s:2:"ch";a:1:{i:0;s:8:"chamorro";}s:3:"chb";a:1:{i:0;s:7:"chibcha";}s:3:"chg";a:1:{i:0;s:8:"chagatai";}s:3:"chk";a:1:{i:0;s:11:"chuukesiska";}s:3:"chm";a:1:{i:0;s:4:"mari";}s:3:"chn";a:1:{i:0;s:7:"chinook";}s:3:"cho";a:1:{i:0;s:7:"choctaw";}s:3:"chp";a:1:{i:0;s:9:"chipewyan";}s:3:"chr";a:1:{i:0;s:12:"cherokesiska";}s:3:"chy";a:1:{i:0;s:8:"cheyenne";}s:3:"cmc";a:1:{i:0;s:11:"chamispråk";}s:2:"co";a:1:{i:0;s:11:"korsikanska";}s:3:"cop";a:1:{i:0;s:8:"koptiska";}s:3:"cpe";a:1:{i:0;s:46:"kreolska och pidgin, engelskbaserade (övriga)";}s:3:"cpf";a:1:{i:0;s:45:"kreolska och pidgin, franskbaserade (övriga)";}s:3:"cpp";a:1:{i:0;s:50:"kreolska och pidgin, portugisiskbaserade (övriga)";}s:2:"cr";a:1:{i:0;s:4:"cree";}s:3:"crh";a:1:{i:0;s:23:"krimturkiska; krimtatar";}s:3:"crp";a:1:{i:0;s:27:"kreolska och pidgin (annat)";}s:2:"cs";a:1:{i:0;s:9:"tjeckiska";}s:3:"csb";a:1:{i:0;s:10:"kasjubiska";}s:2:"cu";a:1:{i:0;s:13:"kyrkoslaviska";}s:3:"cus";a:1:{i:0;s:18:"kushitiska (annat)";}s:2:"cv";a:1:{i:0;s:11:"tjuvasjiska";}s:2:"cy";a:1:{i:0;s:
9:"walesiska";}s:2:"da";a:1:{i:0;s:6:"danska";}s:3:"dak";a:1:{i:0;s:6:"dakota";}s:3:"dar";a:1:{i:0;s:6:"dargwa";}s:3:"day";a:1:{i:0;s:5:"dayak";}s:2:"de";a:1:{i:0;s:5:"tyska";}s:3:"del";a:1:{i:0;s:8:"delaware";}s:3:"den";a:1:{i:0;s:5:"slave";}s:3:"dgr";a:1:{i:0;s:6:"dogrib";}s:3:"din";a:1:{i:0;s:5:"dinka";}s:3:"doi";a:1:{i:0;s:5:"dogri";}s:3:"dra";a:1:{i:0;s:18:"dravidiskt (annat)";}s:3:"dsb";a:1:{i:0;s:12:"lågsorbiska";}s:3:"dua";a:1:{i:0;s:5:"duala";}s:3:"dum";a:1:{i:0;s:33:"medelnederländska (ca 1050-1350)";}s:2:"dv";a:1:{i:0;s:6:"divehi";}s:3:"dyu";a:1:{i:0;s:5:"dyula";}s:2:"dz";a:1:{i:0;s:8:"dzongkha";}s:2:"ee";a:1:{i:0;s:3:"ewe";}s:3:"efi";a:1:{i:0;s:4:"efik";}s:3:"egy";a:1:{i:0;s:13:"fornegyptiska";}s:3:"eka";a:1:{i:0;s:6:"ekajuk";}s:2:"el";a:1:{i:0;s:8:"grekiska";}s:3:"elx";a:1:{i:0;s:10:"elamitiska";}s:2:"en";a:1:{i:0;s:8:"engelska";}s:3:"enm";a:1:{i:0;s:25:"medelengelska (1100-1500)";}s:2:"eo";a:1:{i:0;s:9:"esperanto";}s:2:"es";a:1:{i:0;s:7:"spanska";}s:2:"et";a:1:{i:0;s:8:"estniska";}s:2:"eu";a:1:{i:0;s:8:"baskiska";}s:3:"ewo";a:1:{i:0;s:6:"ewondo";}s:2:"fa";a:1:{i:0;s:5:"farsi";}s:3:"fan";a:1:{i:0;s:4:"fang";}s:3:"fat";a:1:{i:0;s:5:"fanti";}s:2:"ff";a:1:{i:0;s:6:"fulani";}s:2:"fi";a:1:{i:0;s:6:"finska";}s:3:"fiu";a:1:{i:0;s:20:"finskugriskt (annat)";}s:2:"fj";a:1:{i:0;s:10:"fidjianska";}s:2:"fo";a:1:{i:0;s:10:"färöiska";}s:2:"fr";a:1:{i:0;s:7:"franska";}s:3:"frm";a:1:{i:0;s:27:"medelfranska (ca 1400-1600)";}s:3:"fro";a:1:{i:0;s:26:"fornfranska (842- ca 1400)";}s:3:"fur";a:1:{i:0;s:11:"friulianska";}s:2:"fy";a:1:{i:0;s:8:"frisiska";}s:2:"ga";a:1:{i:0;s:18:"irländsk gaeliska";}s:3:"gaa";a:1:{i:0;s:2:"ga";}s:3:"gay";a:1:{i:0;s:4:"gayo";}s:3:"gba";a:1:{i:0;s:5:"gbaya";}s:2:"gd";a:1:{i:0;s:15:"skotsk gaeliska";}s:3:"gem";a:1:{i:0;s:17:"germanskt (annat)";}s:3:"gez";a:1:{i:0;s:4:"geez";}s:3:"gil";a:1:{i:0;s:23:"gilbertesiska; kiribati";}s:2:"gl";a:1:{i:0;s:9:"galiciska";}s:3:"gmh";a:1:{i:0;s:29:"medelhögtyska (ca.1050-1500)";}s:2:"gn";a:1:{i:0;s:8:"guaraní";}s:3:"goh";a:1:{i:0;s:27:"fornhögtyska (ca
.750-1050)";}s:3:"gon";a:1:{i:0;s:5:"gondi";}s:3:"gor";a:1:{i:0;s:9:"gorontalo";}s:3:"got";a:1:{i:0;s:7:"gotiska";}s:3:"grb";a:1:{i:0;s:5:"grebo";}s:3:"grc";a:1:{i:0;s:24:"forngrekiska (till 1453)";}s:2:"gu";a:1:{i:0;s:8:"gujarati";}s:2:"gv";a:1:{i:0;s:13:"manx gaeliska";}s:3:"gwi";a:1:{i:0;s:9:"gwichʻin";}s:2:"ha";a:1:{i:0;s:6:"haussa";}s:3:"hai";a:1:{i:0;s:5:"haida";}s:3:"haw";a:1:{i:0;s:9:"hawaiiska";}s:2:"he";a:1:{i:0;s:9:"hebreiska";}s:2:"hi";a:1:{i:0;s:5:"hindi";}s:3:"hil";a:1:{i:0;s:10:"hiligaynon";}s:3:"him";a:1:{i:0;s:9:"himachali";}s:3:"hit";a:1:{i:0;s:10:"hettitiska";}s:3:"hmn";a:1:{i:0;s:5:"hmong";}s:2:"ho";a:1:{i:0;s:9:"hiri motu";}s:2:"hr";a:1:{i:0;s:9:"kroatiska";}s:3:"hsb";a:1:{i:0;s:12:"högsorbiska";}s:2:"ht";a:1:{i:0;s:8:"haitiska";}s:2:"hu";a:1:{i:0;s:8:"ungerska";}s:3:"hup";a:1:{i:0;s:4:"hupa";}s:2:"hy";a:1:{i:0;s:9:"armeniska";}s:2:"hz";a:1:{i:0;s:6:"herero";}s:2:"ia";a:1:{i:0;s:11:"interlingua";}s:3:"iba";a:1:{i:0;s:4:"iban";}s:2:"id";a:1:{i:0;s:11:"indonesiska";}s:2:"ie";a:1:{i:0;s:11:"interlingue";}s:2:"ig";a:1:{i:0;s:3:"ibo";}s:2:"ii";a:1:{i:0;s:10:"sichuan yi";}s:2:"ik";a:1:{i:0;s:7:"inupiaq";}s:3:"ilo";a:1:{i:0;s:5:"iloko";}s:3:"inc";a:1:{i:0;s:15:"indiskt (annat)";}s:3:"ine";a:1:{i:0;s:22:"indoeuropeiskt (annat)";}s:3:"inh";a:1:{i:0;s:10:"ingusjiska";}s:2:"io";a:1:{i:0;s:3:"ido";}s:3:"ira";a:1:{i:0;s:7:"iranska";}s:3:"iro";a:1:{i:0;s:10:"irokesiska";}s:2:"is";a:1:{i:0;s:10:"isländska";}s:2:"it";a:1:{i:0;s:10:"italienska";}s:2:"iu";a:1:{i:0;s:9:"inuktitut";}s:2:"ja";a:1:{i:0;s:8:"japanska";}s:3:"jbo";a:1:{i:0;s:6:"lojban";}s:3:"jpr";a:1:{i:0;s:12:"judisk farsi";}s:3:"jrb";a:1:{i:0;s:15:"judisk arabiska";}s:2:"jv";a:1:{i:0;s:11:"javanesiska";}s:2:"ka";a:1:{i:0;s:9:"georgiska";}s:3:"kaa";a:1:{i:0;s:14:"karakalpakiska";}s:3:"kab";a:1:{i:0;s:9:"kabyliska";}s:3:"kac";a:1:{i:0;s:6:"kachin";}s:3:"kam";a:1:{i:0;s:5:"kamba";}s:3:"kar";a:1:{i:0;s:5:"karen";}s:3:"kaw";a:1:{i:0;s:4:"kawi";}s:3:"kbd";a:1:{i:0;s:11:"kabardinska";}s:2:"kg";a:1:{i:0;s:7:"kikongo";}s:3:"kha";a:1:{i:0;s:5:"khasi";}s:3
:"khi";a:1:{i:0;s:15:"khoisan (annat)";}s:3:"kho";a:1:{i:0;s:12:"khotanesiska";}s:2:"ki";a:1:{i:0;s:6:"kikuyu";}s:2:"kj";a:1:{i:0;s:8:"kuanyama";}s:2:"kk";a:1:{i:0;s:12:"kazakstanska";}s:2:"kl";a:1:{i:0;s:13:"grönländska";}s:2:"km";a:1:{i:0;s:23:"kambodjanska; khmeriska";}s:3:"kmb";a:1:{i:0;s:8:"kinbundu";}s:2:"kn";a:1:{i:0;s:20:"kanaresiska; kannada";}s:2:"ko";a:1:{i:0;s:9:"koreanska";}s:3:"kok";a:1:{i:0;s:7:"konkani";}s:3:"kos";a:1:{i:0;s:10:"kosreanska";}s:3:"kpe";a:1:{i:0;s:6:"kpelle";}s:2:"kr";a:1:{i:0;s:6:"kanuri";}s:3:"krc";a:1:{i:0;s:15:"karachay-balkar";}s:3:"kro";a:1:{i:0;s:3:"kru";}s:3:"kru";a:1:{i:0;s:6:"kurukh";}s:2:"ks";a:1:{i:0;s:11:"kashmiriska";}s:2:"ku";a:1:{i:0;s:8:"kurdiska";}s:3:"kum";a:1:{i:0;s:5:"kumyk";}s:3:"kut";a:1:{i:0;s:7:"kutenai";}s:2:"kv";a:1:{i:0;s:4:"kome";}s:2:"kw";a:1:{i:0;s:8:"korniska";}s:2:"ky";a:1:{i:0;s:10:"kirgisiska";}s:2:"la";a:1:{i:0;s:5:"latin";}s:3:"lad";a:1:{i:0;s:6:"ladino";}s:3:"lah";a:1:{i:0;s:6:"lahnda";}s:3:"lam";a:1:{i:0;s:5:"lamba";}s:2:"lb";a:1:{i:0;s:13:"luxemburgiska";}s:3:"lez";a:1:{i:0;s:8:"lezghien";}s:2:"lg";a:1:{i:0;s:7:"luganda";}s:2:"li";a:1:{i:0;s:11:"limburgiska";}s:2:"ln";a:1:{i:0;s:7:"lingala";}s:2:"lo";a:1:{i:0;s:8:"laotiska";}s:3:"lol";a:1:{i:0;s:11:"lolo; mongo";}s:3:"loz";a:1:{i:0;s:4:"lozi";}s:2:"lt";a:1:{i:0;s:9:"litauiska";}s:2:"lu";a:1:{i:0;s:12:"luba-katanga";}s:3:"lua";a:1:{i:0;s:10:"luba-lulua";}s:3:"lui";a:1:{i:0;s:8:"luiseño";}s:3:"lun";a:1:{i:0;s:5:"lunda";}s:3:"lus";a:1:{i:0;s:6:"lushai";}s:2:"lv";a:1:{i:0;s:8:"lettiska";}s:3:"mad";a:1:{i:0;s:8:"madurese";}s:3:"mag";a:1:{i:0;s:6:"magahi";}s:3:"mai";a:1:{i:0;s:8:"maithili";}s:3:"mak";a:1:{i:0;s:7:"makasar";}s:3:"man";a:1:{i:0;s:5:"mande";}s:3:"map";a:1:{i:0;s:13:"austronesiska";}s:3:"mas";a:1:{i:0;s:10:"massajiska";}s:3:"mdf";a:1:{i:0;s:6:"moksja";}s:3:"mdr";a:1:{i:0;s:6:"mandar";}s:3:"men";a:1:{i:0;s:5:"mende";}s:2:"mg";a:1:{i:0;s:12:"malagassiska";}s:3:"mga";a:1:{i:0;s:22:"medeliriska (900-1200)";}s:2:"mh";a:1:{i:0;s:12:"marshalliska";}s:2:"mi";a:1:{i:0;s:5:"maori";}s:3:"mic";a
:1:{i:0;s:7:"mic-mac";}s:3:"min";a:1:{i:0;s:11:"minangkabau";}s:3:"mis";a:1:{i:0;s:15:"blandade språk";}s:2:"mk";a:1:{i:0;s:10:"makedonska";}s:3:"mkh";a:1:{i:0;s:21:"mon-khmeriska (annat)";}s:2:"ml";a:1:{i:0;s:9:"malayalam";}s:2:"mn";a:1:{i:0;s:10:"mongoliska";}s:3:"mnc";a:1:{i:0;s:11:"manchuriska";}s:3:"mni";a:1:{i:0;s:8:"manipuri";}s:3:"mno";a:1:{i:0;s:12:"manobospråk";}s:2:"mo";a:1:{i:0;s:10:"moldaviska";}s:3:"moh";a:1:{i:0;s:6:"mohawk";}s:3:"mos";a:1:{i:0;s:5:"mossi";}s:2:"mr";a:1:{i:0;s:7:"marathi";}s:2:"ms";a:1:{i:0;s:9:"malajiska";}s:2:"mt";a:1:{i:0;s:10:"maltesiska";}s:3:"mul";a:1:{i:0;s:12:"flera språk";}s:3:"mun";a:1:{i:0;s:11:"mundaspråk";}s:3:"mus";a:1:{i:0;s:8:"muskogee";}s:3:"mwr";a:1:{i:0;s:7:"marwari";}s:2:"my";a:1:{i:0;s:9:"burmanska";}s:3:"myn";a:1:{i:0;s:4:"maya";}s:3:"myv";a:1:{i:0;s:5:"erjya";}s:2:"na";a:1:{i:0;s:5:"nauru";}s:3:"nah";a:1:{i:0;s:18:"nahuatl; aztekiska";}s:3:"nai";a:1:{i:0;s:36:"nordamerikanskt indianspråk (annat)";}s:3:"nap";a:1:{i:0;s:12:"napolitanska";}s:2:"nb";a:1:{i:0;s:14:"norskt bokmål";}s:2:"nd";a:1:{i:0;s:13:"nord­ndebele";}s:3:"nds";a:1:{i:0;s:22:"lågtyska; lågsaxiska";}s:2:"ne";a:1:{i:0;s:12:"nepalesisika";}s:3:"new";a:1:{i:0;s:6:"newari";}s:2:"ng";a:1:{i:0;s:6:"ndonga";}s:3:"nia";a:1:{i:0;s:4:"nias";}s:3:"nic";a:1:{i:0;s:22:"kordofanspråk (annat)";}s:3:"niu";a:1:{i:0;s:6:"niuean";}s:2:"nl";a:1:{i:0;s:13:"nederländska";}s:2:"nn";a:1:{i:0;s:9:"ny­norsk";}s:2:"no";a:1:{i:0;s:6:"norska";}s:3:"nog";a:1:{i:0;s:5:"nogai";}s:3:"non";a:1:{i:0;s:12:"fornnordiska";}s:2:"nr";a:1:{i:0;s:12:"syd­ndebele";}s:3:"nso";a:1:{i:0;s:11:"sotho, nord";}s:3:"nub";a:1:{i:0;s:14:"nubiska språk";}s:2:"nv";a:1:{i:0;s:6:"navaho";}s:2:"ny";a:1:{i:0;s:6:"nyanja";}s:3:"nym";a:1:{i:0;s:8:"nyamwezi";}s:3:"nyn";a:1:{i:0;s:8:"nyankole";}s:3:"nyo";a:1:{i:0;s:5:"nyoro";}s:3:"nzi";a:1:{i:0;s:5:"nzima";}s:2:"oc";a:1:{i:0;s:37:"provensalska (efter 1500); occitanska";}s:2:"oj";a:1:{i:0;s:17:"odjibwa; chippewa";}s:2:"om";a:1:{i:0;s:5:"oromo";}s:2:"or";a:1:{i:0;s:5:"oriya";}s:2:"os";a:1:{i:0;s:9
:"ossetiska";}s:3:"osa";a:1:{i:0;s:5:"osage";}s:3:"ota";a:1:{i:0;s:27:"ottomanturkiska (1500-1928)";}s:3:"oto";a:1:{i:0;s:15:"otomanguespråk";}s:2:"pa";a:1:{i:0;s:7:"panjabi";}s:3:"paa";a:1:{i:0;s:19:"papuaspråk (annat)";}s:3:"pag";a:1:{i:0;s:10:"pangasinan";}s:3:"pal";a:1:{i:0;s:7:"pahlavi";}s:3:"pam";a:1:{i:0;s:8:"pampanga";}s:3:"pap";a:1:{i:0;s:10:"papiamento";}s:3:"pau";a:1:{i:0;s:5:"palau";}s:3:"peo";a:1:{i:0;s:31:"fornpersiska (ca 600-400 f.Kr.)";}s:3:"phi";a:1:{i:0;s:26:"filippinskt språk (annat)";}s:3:"phn";a:1:{i:0;s:21:"kananeiska; feniciska";}s:2:"pi";a:1:{i:0;s:4:"pali";}s:2:"pl";a:1:{i:0;s:6:"polska";}s:3:"pon";a:1:{i:0;s:6:"ponape";}s:3:"pra";a:1:{i:0;s:7:"prakrit";}s:3:"pro";a:1:{i:0;s:28:"fornprovensalska (till 1500)";}s:2:"ps";a:1:{i:0;s:17:"pashto; afghanska";}s:2:"pt";a:1:{i:0;s:12:"portugisiska";}s:2:"qu";a:1:{i:0;s:7:"quechua";}s:3:"raj";a:1:{i:0;s:10:"rajasthani";}s:3:"rap";a:1:{i:0;s:7:"rapanui";}s:3:"rar";a:1:{i:0;s:10:"rarotongan";}s:2:"rm";a:1:{i:0;s:15:"räto­romanska";}s:2:"rn";a:1:{i:0;s:5:"rundi";}s:2:"ro";a:1:{i:0;s:9:"rumänska";}s:3:"roa";a:1:{i:0;s:16:"romanskt (annat)";}s:3:"rom";a:1:{i:0;s:6:"romani";}s:2:"ru";a:1:{i:0;s:5:"ryska";}s:2:"rw";a:1:{i:0;s:19:"rwanda; kinjarwanda";}s:2:"sa";a:1:{i:0;s:8:"sanskrit";}s:3:"sad";a:1:{i:0;s:7:"sandawe";}s:3:"sah";a:1:{i:0;s:9:"jakutiska";}s:3:"sai";a:1:{i:0;s:33:"nordamerikanskt indianskt (annat)";}s:3:"sal";a:1:{i:0;s:12:"salishspråk";}s:3:"sam";a:1:{i:0;s:9:"samariska";}s:3:"sas";a:1:{i:0;s:5:"sasak";}s:3:"sat";a:1:{i:0;s:7:"santali";}s:2:"sc";a:1:{i:0;s:8:"sardiska";}s:3:"sco";a:1:{i:0;s:7:"skotska";}s:2:"sd";a:1:{i:0;s:6:"sindhi";}s:2:"se";a:1:{i:0;s:13:"nord­samiska";}s:3:"sel";a:1:{i:0;s:6:"selkup";}s:3:"sem";a:1:{i:0;s:17:"semitiskt (annat)";}s:2:"sg";a:1:{i:0;s:5:"sango";}s:3:"sga";a:1:{i:0;s:21:"forniriska (till 900)";}s:3:"sgn";a:1:{i:0;s:12:"teckenspråk";}s:2:"sh";a:1:{i:0;s:14:"serbokroatiska";}s:3:"shn";a:1:{i:0;s:4:"shan";}s:2:"si";a:1:{i:0;s:12:"singalesiska";}s:3:"sid";a:1:{i:0;s:6:"sidamo";}s:3:"sio";a:1:{i:0;s:11
:"siouxspråk";}s:3:"sit";a:1:{i:0;s:21:"sinotibetanska språk";}s:2:"sk";a:1:{i:0;s:10:"slovakiska";}s:2:"sl";a:1:{i:0;s:9:"slovenska";}s:3:"sla";a:1:{i:0;s:16:"slaviskt (annat)";}s:2:"sm";a:1:{i:0;s:9:"samoanska";}s:3:"sma";a:1:{i:0;s:10:"sydsamiska";}s:3:"smi";a:1:{i:0;s:22:"samiskt språk (annat)";}s:3:"smj";a:1:{i:0;s:11:"lulesamiska";}s:3:"smn";a:1:{i:0;s:12:"enaresamiska";}s:3:"sms";a:1:{i:0;s:12:"skoltsamiska";}s:2:"sn";a:1:{i:0;s:15:"shona; manshona";}s:3:"snk";a:1:{i:0;s:7:"soninke";}s:2:"so";a:1:{i:0;s:9:"somaliska";}s:3:"sog";a:1:{i:0;s:8:"sogdiska";}s:3:"son";a:1:{i:0;s:7:"songhai";}s:2:"sq";a:1:{i:0;s:8:"albanska";}s:2:"sr";a:1:{i:0;s:8:"serbiska";}s:3:"srr";a:1:{i:0;s:5:"serer";}s:2:"ss";a:1:{i:0;s:5:"swati";}s:3:"ssa";a:1:{i:0;s:21:"nilosahariskt (annat)";}s:2:"st";a:1:{i:0;s:10:"syd­sotho";}s:2:"su";a:1:{i:0;s:12:"sundanesiska";}s:3:"suk";a:1:{i:0;s:6:"sukuma";}s:3:"sus";a:1:{i:0;s:4:"susu";}s:3:"sux";a:1:{i:0;s:9:"sumeriska";}s:2:"sv";a:1:{i:0;s:7:"svenska";}s:2:"sw";a:1:{i:0;s:7:"swahili";}s:3:"syr";a:1:{i:0;s:7:"syriska";}s:2:"ta";a:1:{i:0;s:5:"tamil";}s:3:"tai";a:1:{i:0;s:11:"tai (annat)";}s:2:"te";a:1:{i:0;s:6:"telugu";}s:3:"tem";a:1:{i:0;s:5:"temne";}s:3:"ter";a:1:{i:0;s:6:"tereno";}s:3:"tet";a:1:{i:0;s:5:"tetum";}s:2:"tg";a:1:{i:0;s:11:"tadzjikiska";}s:2:"th";a:1:{i:0;s:12:"thailändska";}s:2:"ti";a:1:{i:0;s:8:"tigrinja";}s:3:"tig";a:1:{i:0;s:6:"tigré";}s:3:"tiv";a:1:{i:0;s:4:"tivi";}s:2:"tk";a:1:{i:0;s:11:"turkmeniska";}s:3:"tkl";a:1:{i:0;s:11:"tokelauiska";}s:2:"tl";a:1:{i:0;s:7:"tagalog";}s:3:"tli";a:1:{i:0;s:7:"tlingit";}s:3:"tmh";a:1:{i:0;s:8:"tamashek";}s:2:"tn";a:1:{i:0;s:6:"tswana";}s:2:"to";a:1:{i:0;s:9:"tonganska";}s:3:"tog";a:1:{i:0;s:17:"tonganska (Nyasa)";}s:3:"tpi";a:1:{i:0;s:9:"tok pisin";}s:2:"tr";a:1:{i:0;s:8:"turkiska";}s:2:"ts";a:1:{i:0;s:6:"tsonga";}s:3:"tsi";a:1:{i:0;s:9:"tsimshian";}s:2:"tt";a:1:{i:0;s:9:"tatariska";}s:3:"tum";a:1:{i:0;s:7:"tumbuka";}s:3:"tup";a:1:{i:0;s:10:"tupispråk";}s:3:"tut";a:1:{i:0;s:16:"altaiskt (annat)";}s:3:"tvl";a:1:{i:0;s:11:"tuvaluansk
a";}s:2:"tw";a:1:{i:0;s:3:"twi";}s:2:"ty";a:1:{i:0;s:9:"tahitiska";}s:3:"tyv";a:1:{i:0;s:9:"tuviniska";}s:3:"udm";a:1:{i:0;s:10:"udmurtiska";}s:2:"ug";a:1:{i:0;s:9:"uiguriska";}s:3:"uga";a:1:{i:0;s:10:"ugaritiska";}s:2:"uk";a:1:{i:0;s:9:"ukrainska";}s:3:"umb";a:1:{i:0;s:7:"umbundu";}s:3:"und";a:1:{i:0;s:9:"obestämt";}s:2:"ur";a:1:{i:0;s:4:"urdu";}s:2:"uz";a:1:{i:0;s:9:"uzbekiska";}s:2:"ve";a:1:{i:0;s:5:"venda";}s:2:"vi";a:1:{i:0;s:13:"vietnamesiska";}s:2:"vo";a:1:{i:0;s:8:"volapük";}s:3:"vot";a:1:{i:0;s:7:"votiska";}s:2:"wa";a:1:{i:0;s:7:"walloon";}s:3:"wak";a:1:{i:0;s:6:"wakash";}s:3:"wal";a:1:{i:0;s:6:"walamo";}s:3:"war";a:1:{i:0;s:5:"waray";}s:3:"was";a:1:{i:0;s:5:"washo";}s:3:"wen";a:1:{i:0;s:15:"sorbiska språk";}s:2:"wo";a:1:{i:0;s:5:"wolof";}s:3:"xal";a:1:{i:0;s:11:"kalmuckiska";}s:2:"xh";a:1:{i:0;s:5:"xhosa";}s:2:"yi";a:1:{i:0;s:8:"jiddisch";}s:2:"yo";a:1:{i:0;s:6:"yoruba";}s:3:"ypk";a:1:{i:0;s:14:"yupiska språk";}s:2:"za";a:1:{i:0;s:6:"zhuang";}s:3:"zap";a:1:{i:0;s:7:"zapotek";}s:3:"zen";a:1:{i:0;s:6:"zenaga";}s:2:"zh";a:1:{i:0;s:9:"kinesiska";}s:3:"znd";a:1:{i:0;s:6:"zandé";}s:2:"zu";a:1:{i:0;s:4:"zulu";}s:3:"zun";a:1:{i:0;s:5:"zuñi";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Scripts";a:57:{s:4:"Arab";a:1:{i:0;s:8:"arabiska";}s:4:"Armn";a:1:{i:0;s:9:"armeniska";}s:4:"Beng";a:1:{i:0;s:10:"bengaliska";}s:4:"Bopo";a:1:{i:0;s:8:"bopomofo";}s:4:"Brai";a:1:{i:0;s:11:"blindskrift";}s:4:"Buhd";a:1:{i:0;s:5:"buhid";}s:4:"Cans";a:1:{i:0;s:27:"kanadensiska stavelsetecken";}s:4:"Cher";a:1:{i:0;s:8:"cherokee";}s:4:"Copt";a:1:{i:0;s:8:"koptiska";}s:4:"Cprt";a:1:{i:0;s:11:"cypriotiska";}s:4:"Cyrl";a:1:{i:0;s:10:"kyrilliska";}s:4:"Deva";a:1:{i:0;s:10:"devanagari";}s:4:"Dsrt";a:1:{i:0;s:7:"deseret";}s:4:"Ethi";a:1:{i:0;s:9:"etiopiska";}s:4:"Geor";a:1:{i:0;s:9:"georgiska";}s:4:"Goth";a:1:{i:0;s:7:"gotiska";}s:4:"Grek";a:1:{i:0;s:8:"
grekiska";}s:4:"Gujr";a:1:{i:0;s:8:"gujarati";}s:4:"Guru";a:1:{i:0;s:8:"gurmukhi";}s:4:"Hang";a:1:{i:0;s:6:"hangul";}s:4:"Hani";a:1:{i:0;s:3:"han";}s:4:"Hano";a:1:{i:0;s:7:"hanunå";}s:4:"Hans";a:1:{i:0;s:14:"förenklad han";}s:4:"Hant";a:1:{i:0;s:16:"traditionell han";}s:4:"Hebr";a:1:{i:0;s:9:"hebreiska";}s:4:"Hira";a:1:{i:0;s:8:"hiragana";}s:4:"Hrkt";a:1:{i:0;s:17:"katakana/hiragana";}s:4:"Ital";a:1:{i:0;s:12:"fornitaliska";}s:4:"Kana";a:1:{i:0;s:8:"katakana";}s:4:"Khmr";a:1:{i:0;s:9:"khmeriskt";}s:4:"Knda";a:1:{i:0;s:11:"kanaresiska";}s:4:"Laoo";a:1:{i:0;s:8:"laotiska";}s:4:"Latn";a:1:{i:0;s:8:"latinskt";}s:4:"Limb";a:1:{i:0;s:5:"limbu";}s:4:"Linb";a:1:{i:0;s:8:"linear B";}s:4:"Mlym";a:1:{i:0;s:9:"malayalam";}s:4:"Mong";a:1:{i:0;s:10:"mongoliska";}s:4:"Mymr";a:1:{i:0;s:10:"burmesiska";}s:4:"Ogam";a:1:{i:0;s:5:"ogham";}s:4:"Orya";a:1:{i:0;s:5:"oriya";}s:4:"Osma";a:1:{i:0;s:8:"osmanskt";}s:4:"Qaai";a:1:{i:0;s:5:"ärvd";}s:4:"Runr";a:1:{i:0;s:5:"runor";}s:4:"Shaw";a:1:{i:0;s:8:"shawiska";}s:4:"Sinh";a:1:{i:0;s:12:"singalesiska";}s:4:"Syrc";a:1:{i:0;s:7:"syriska";}s:4:"Tagb";a:1:{i:0;s:8:"tagbanwa";}s:4:"Tale";a:1:{i:0;s:6:"tai le";}s:4:"Taml";a:1:{i:0;s:8:"tamilskt";}s:4:"Telu";a:1:{i:0;s:6:"telugu";}s:4:"Tglg";a:1:{i:0;s:7:"tagalog";}s:4:"Thaa";a:1:{i:0;s:5:"taana";}s:4:"Thai";a:1:{i:0;s:12:"thailändska";}s:4:"Tibt";a:1:{i:0;s:10:"tibetanska";}s:4:"Ugar";a:1:{i:0;s:10:"ugaritiska";}s:4:"Yiii";a:1:{i:0;s:2:"yi";}s:4:"Zyyy";a:1:{i:0;s:7:"vanligt";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:19:"Buddistisk kalender";}s:7:"chinese";a:1:{i:0;s:17:"Kinesisk kalender";}s:9:"gregorian";a:1:{i:0;s:20:"Gregoriansk kalender";}s:6:"hebrew";a:1:{i:0;s:17:"Hebreisk kalender";}s:7:"islamic";a:1:{i:0;s:17:"Islamisk kalender";}s:13:"islamic-civil";a:1:{i:0;s:23:"Islamisk civil kalender";}s:8:"japanese";a:1:{i:0;s:16:"Japansk kalender";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:14:"Direkt ordning";}s:9:"phonebook";a:1:{i:0;s:18:"Telefonboksordning";}s:6:"pinyin";a:1:{i:0;s:13:"Pinyinordning";}s:6:"stroke"
;a:1:{i:0;s:16:"Raderingsordning";}s:11:"traditional";a:1:{i:0;s:20:"Traditionell ordning";}}}s:8:"Variants";a:1:{s:7:"REVISED";a:1:{i:0;s:9:"Reviderad";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:6:{s:11:"AmPmMarkers";a:2:{i:0;s:4:"f.m.";i:1;s:4:"e.m.";}s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:16:"'kl. 'HH.mm.ss z";i:1;s:10:"HH.mm.ss z";i:2;s:8:"HH.mm.ss";i:3;s:5:"HH.mm";i:4;s:17:"'den 'd MMMM yyyy";i:5;s:16:"'den 'd MMM yyyy";i:6;s:10:"yyyy-MM-dd";i:7;s:10:"yyyy-MM-dd";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:3:"sö";i:1;s:3:"må";i:2;s:2:"ti";i:3;s:2:"on";i:4;s:2:"to";i:5;s:2:"fr";i:6;s:3:"lö";}s:6:"narrow";a:7:{i:0;s:1:"S";i:1;s:1:"M";i:2;s:1:"T";i:3;s:1:"O";i:4;s:1:"T";i:5;s:1:"F";i:6;s:1:"L";}s:4:"wide";a:7:{i:0;s:7:"söndag";i:1;s:7:"måndag";i:2;s:6:"tisdag";i:3;s:6:"onsdag";i:4;s:7:"torsdag";i:5;s:6:"fredag";i:6;s:7:"lördag";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:5:"f.Kr.";i:1;s:5:"e.Kr.";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:3:"jan";i:1;s:3:"feb";i:2;s:3:"mar";i:3;s:3:"apr";i:4;s:3:"maj";i:5;s:3:"jun";i:6;s:3:"jul";i:7;s:3:"aug";i:8;s:3:"sep";i:9;s:3:"okt";i:10;s:3:"nov";i:11;s:3:"dec";}s:6:"narrow";a:12:{i:0;s:1:"J";i:1;s:1:"F";i:2;s:1:"M";i:3;s:1:"A";i:4;s:1:"M";i:5;s:1:"J";i:6;s:1:"J";i:7;s:1:"A";i:8;s:1:"S";i:9;s:1:"O";i:10;s:1:"N";i:11;s:1:"D";}s:4:"wide";a:12:{i:0;s:7:"januari";i:1;s:8:"februari";i:2;s:4:"mars";i:3;s:5:"april";i:4;s:3:"maj";i:5;s:4:"juni";i:6;s:4:"juli";i:7;s:7:"augusti";i:8;s:9:"september";i:9;s:7:"oktober";i:10;s:8:"november";i:11;s:8:"december";}}}}}s:11:"zoneStrings";a:17:{i:0;a:6:{i:0;s:19:"America/Los_Angeles";i:1;s:18:"Pacific, normaltid";i:2;s:3:"PST";i:3;s:18:"Pacific, sommartid";i:4;s:3:"PDT";i:5;s:11:"Los Angeles";}i:1;a:6:{i:0;s:14:"America/Denver";i:1;s:19:"Mountain, normaltid";i:2;s:3:"MST";i:3;s:19:"Mountain, sommartid";i:4;s:3:"MDT";i:5;s:6:"Denver";}i:2;a:6:{i:0;s:15:"America/Phoenix";i:1;s:19
:"Mountain, normaltid";i:2;s:3:"MST";i:3;s:19:"Mountain, sommartid";i:4;s:3:"MST";i:5;s:7:"Phoenix";}i:3;a:6:{i:0;s:15:"America/Chicago";i:1;s:18:"Central, normaltid";i:2;s:3:"CST";i:3;s:18:"Central, sommartid";i:4;s:3:"CDT";i:5;s:7:"Chicago";}i:4;a:6:{i:0;s:16:"America/New_York";i:1;s:18:"Eastern, normaltid";i:2;s:3:"EST";i:3;s:18:"Eastern, sommartid";i:4;s:3:"EDT";i:5;s:8:"New York";}i:5;a:6:{i:0;s:20:"America/Indianapolis";i:1;s:18:"Eastern, normaltid";i:2;s:3:"EST";i:3;s:18:"Eastern, normaltid";i:4;s:3:"EST";i:5;s:12:"Indianapolis";}i:6;a:6:{i:0;s:16:"Pacific/Honolulu";i:1;s:17:"Hawaii, normaltid";i:2;s:3:"HST";i:3;s:17:"Hawaii, normaltid";i:4;s:3:"HST";i:5;s:8:"Honolulu";}i:7;a:6:{i:0;s:17:"America/Anchorage";i:1;s:17:"Alaska, normaltid";i:2;s:3:"AST";i:3;s:17:"Alaska, sommartid";i:4;s:3:"ADT";i:5;s:9:"Anchorage";}i:8;a:6:{i:0;s:15:"America/Halifax";i:1;s:19:"Atlantic, normaltid";i:2;s:3:"AST";i:3;s:19:"Atlantic, sommartid";i:4;s:3:"ADT";i:5;s:7:"Halifax";}i:9;a:6:{i:0;s:16:"America/St_Johns";i:1;s:23:"Newfoundland, normaltid";i:2;s:3:"CNT";i:3;s:23:"Newfoundland, sommartid";i:4;s:3:"CDT";i:5;s:9:"St. Johns";}i:10;a:6:{i:0;s:12:"Europe/Paris";i:1;s:24:"Centraleuropa, normaltid";i:2;s:3:"CET";i:3;s:24:"Centraleuropa, sommartid";i:4;s:4:"CEST";i:5;s:5:"Paris";}i:11;a:6:{i:0;s:7:"Etc/GMT";i:1;s:12:"Greenwichtid";i:2;s:3:"GMT";i:3;s:12:"Greenwichtid";i:4;s:3:"GMT";i:5;s:6:"London";}i:12;a:6:{i:0;s:17:"Africa/Casablanca";i:1;s:12:"Greenwichtid";i:2;s:3:"GMT";i:3;s:12:"Greenwichtid";i:4;s:3:"GMT";i:5;s:10:"Casablanca";}i:13;a:6:{i:0;s:14:"Asia/Jerusalem";i:1;s:17:"Israel, normaltid";i:2;s:3:"IST";i:3;s:17:"Israel, sommartid";i:4;s:3:"IDT";i:5;s:9:"Jerusalem";}i:14;a:6:{i:0;s:10:"Asia/Tokyo";i:1;s:16:"Japan, normaltid";i:2;s:3:"JST";i:3;s:16:"Japan, normaltid";i:4;s:3:"JST";i:5;s:5:"Tokyo";}i:15;a:6:{i:0;s:16:"Europe/Bucharest";i:1;s:21:"Östeuropa, normaltid";i:2;s:3:"EET";i:3;s:21:"Östeuropa, sommartid";i:4;s:4:"EEST";i:5;s:8:"Bukarest";}i:16;a:6:{i:0;s:13:"Asia/Shanghai";i:1;s:15:"Kina, normaltid";i:2;s:3:"CTT"
;i:3;s:15:"Kina, normaltid";i:4;s:3:"CDT";i:5;s:8:"Shanghai";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sv_FI.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sv_FI.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sv_FI.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sv_SE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sv_SE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sv_SE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:7:"#,##0 %";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sw.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sw.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sw.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:78:{s:2:"AE";a:1:{i:0;s:35:"Muugano wa Falme za Nchi za Kiarabu";}s:2:"AG";a:1:{i:0;s:18:"Antigua na Barbuda";}s:2:"AR";a:1:{i:0;s:8:"Ajentina";}s:2:"BA";a:1:{i:0;s:21:"Bosnia na Herzegowina";}s:2:"BE";a:1:{i:0;s:8:"Ubelgiji";}s:2:"BR";a:1:{i:0;s:7:"Brazili";}s:2:"BS";a:1:{i:0;s:17:"Visiwa vya Bahama";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CF";a:1:{i:0;s:25:"Jamhuri ya Afrika ya Kati";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:6:"Uswisi";}s:2:"CI";a:1:{i:0;s:14:"Pwani ya Pembe";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:6:"Uchina";}s:2:"CO";a:1:{i:0;s:8:"Kolombia";}s:2:"CV";a:1:{i:0;s:10:"Rasi Verde";}s:2:"CZ";a:1:{i:0;s:16:"Jamhuri ya Czech";}s:2:"DE";a:1:{i:0;s:6:"Udachi";}s:2:"DJ";a:1:{i:0;s:6:"Jibuti";}s:2:"DK";a:1:{i:0;s:9:"Udenmarki";}s:2:"DM";a:1:{i:0;s:8:"Dominika";}s:2:"DO";a:1:{i:0;s:20:"Jamhuri ya Dominikan";}s:2:"EC";a:1:{i:0;s:6:"Ekvado";}s:2:"EG";a:1:{i:0;s:5:"Misri";}s:2:"ES";a:1:{i:0;s:9:"Uhispania";}s:2:"ET";a:1:{i:0;s:8:"Uhabeshi";}s:2:"FR";a:1:{i:0;s:8:"Ufaransa";}s:2:"GB";a:1:{i:0;s:9:"Uingereza";}s:2:"GQ";a:1:{i:0;s:16:"Guinea ya Ikweta";}s:2:"HR";a:1:{i:0;s:7:"Kroatia";}s:2:"HU";a:1:{i:0;s:8:"Hungaria";}s:2:"IL";a:1:{i:0;s:7:"Uyahudi";}s:2:"IN";a:1:{i:0;s:6:"Uhindi";}s:2:"IQ";a:1:{i:0;s:5:"Iraki";}s:2:"IR";a:1:{i:0;s:6:"Uajemi";}s:2:"IS";a:1:{i:0;s:6:"Barafu";}s:2:"IT";a:1:{i:0;s:9:"Uitaliani";}s:2:"JM";a:1:{i:0;s:7:"Jamaika";}s:2:"JP";a:1:{i:0;s:7:"Ujapani";}s:2:"KE";a:1:{i:0;s:5:"Kenya";}s:2:"KH";a:1:{i:0;s:9:"Kampuchea";}s:2:"KM";a:1:{i:0;s:17:"Visiwa vya Komoro";}s:2:"KN";a:1:{i:0;s:20:"Saint Kitts na Nevis";}s:2:"KP";a:1:{i:0;s:18:"Korea ya Kaskazini";}s:2:"KR";a:1:{i:0;s:15:"Korea ya Kusini";}s:2:"LU";a:1:{i:0;s:10:"Luksemburg";}s:2:"MA";a:1:{i:0;s:6:"Moroko";}s:2:"MC";a:1:{i:0;s:6:"Monako";}s:2:"MH";a:1:{i:0;s:19:"Visiwa vya Marshall";}s:2:"MX";a:1:{i:0;s:7:"Meksiko";}s:2:"MY";a:1:{i:0;s:7:"Malasya";}s:2:"MZ";a:1:{i:0;s:8:"Msumbiji";}s:2:"NI";a:1:{i:0;s:9:"Nikaragua";}s:2:"NL";a:1:{i:0;s:8:"Uholanzi";}s:2:"NO";a:1:{i:0;s:6:"Unorwe";}s:2:"NP";
a:1:{i:0;s:6:"Nepali";}s:2:"PG";a:1:{i:0;s:17:"Papua Guinea Mpya";}s:2:"PH";a:1:{i:0;s:8:"Filipino";}s:2:"PT";a:1:{i:0;s:5:"Ureno";}s:2:"PY";a:1:{i:0;s:8:"Paragwai";}s:2:"RU";a:1:{i:0;s:5:"Urusi";}s:2:"SA";a:1:{i:0;s:13:"Arabuni Saudi";}s:2:"SB";a:1:{i:0;s:18:"Visiwa vya Solomon";}s:2:"SC";a:1:{i:0;s:21:"Visiwa vya Shelisheli";}s:2:"SE";a:1:{i:0;s:6:"Uswidi";}s:2:"SO";a:1:{i:0;s:6:"Somali";}s:2:"ST";a:1:{i:0;s:20:"Sao Tome na Principe";}s:2:"TD";a:1:{i:0;s:5:"Chadi";}s:2:"TL";a:1:{i:0;s:18:"Timor ya Mashariki";}s:2:"TR";a:1:{i:0;s:7:"Uturuki";}s:2:"TT";a:1:{i:0;s:18:"Trinidad na Tobago";}s:2:"TZ";a:1:{i:0;s:8:"Tanzania";}s:2:"US";a:1:{i:0;s:27:"Muungano wa Nchi za Amerika";}s:2:"UY";a:1:{i:0;s:7:"Urugwai";}s:2:"VA";a:1:{i:0;s:8:"Vatikano";}s:2:"VC";a:1:{i:0;s:27:"Saint Vincent na Grenadines";}s:2:"YE";a:1:{i:0;s:6:"Yemeni";}s:2:"ZA";a:1:{i:0;s:16:"Afrika ya Kusini";}}s:10:"Currencies";a:2:{s:3:"KES";a:2:{i:0;s:3:"KSh";i:1;s:3:"KES";}s:3:"TZS";a:2:{i:0;s:3:"TSh";i:1;s:3:"TZS";}}s:9:"Languages";a:1:{s:2:"sw";a:1:{i:0;s:9:"Kiswahili";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:4:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:7;i:1;i:1;}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:3:"Jpi";i:1;s:3:"Jtt";i:2;s:3:"Jnn";i:3;s:3:"Jtn";i:4;s:3:"Alh";i:5;s:3:"Iju";i:6;s:3:"Jmo";}s:4:"wide";a:7:{i:0;s:8:"Jumapili";i:1;s:8:"Jumatatu";i:2;s:7:"Jumanne";i:3;s:8:"Jumatano";i:4;s:8:"Alhamisi";i:5;s:6:"Ijumaa";i:6;s:8:"Jumamosi";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:2:"KK";i:1;s:2:"BK";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:3:"Jan";i:1;s:3:"Feb";i:2;s:3:"Mar";i:3;s:3:"Apr";i:4;s:3:"Mei";i:5;s:3:"Jun";i:6;s:3:"Jul";i:7;s:3:"Ago";i:8;s:3:"Sep";i:9;s:3:"Okt";i:10;s:3:"Nov";i:11;s:3:"Des";}s:4:"wide";a:12:{i:0;s:7:"Januari";i:1;s:8:"Februari";i:2;s:5:"Machi";i:3;s:6:"Aprili";i:4;s:3:"Mei";i:5;s:4:"Juni";i:6;s:5:"Julai";i:7;s:6:"Agosti";i:8;s:8:"Septemba";i:9;s:6:"Oktoba";i:10;s:7:"Novemba";i:11;s:7
:"Desemba";}}}}}s:11:"zoneStrings";a:1:{i:0;a:6:{i:0;s:14:"Africa/Nairobi";i:1;s:23:"Saa za Africa Mashariki";i:2;s:3:"EAT";i:3;s:23:"Saa za Africa Mashariki";i:4;s:3:"EAT";i:5;s:7:"Nairobi";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sw_KE.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sw_KE.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sw_KE.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sw_TZ.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sw_TZ.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/sw_TZ.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ta.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ta.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ta.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:8:{s:9:"Countries";a:165:{s:2:"AD";a:1:{i:0;s:21:"அனà¯à®Ÿà¯‹à®°à®¾";}s:2:"AE";a:1:{i:0;s:62:"à®à®•à¯à®•à®¿à®¯ அரப௠கூடà¯à®Ÿà®¾à®Ÿà¯à®šà®¿";}s:2:"AF";a:1:{i:0;s:39:"ஆபà¯à®•à®¾à®©à®¿à®¸à¯à®¤à®¾à®©à¯";}s:2:"AG";a:1:{i:0;s:52:"ஆனà¯à®Ÿà®¿à®•à¯à®µà®¾ பாரà¯à®ªà¯à®Ÿà®¾";}s:2:"AL";a:1:{i:0;s:27:"அலà¯à®ªà¯‡à®©à®¿à®¯à®¾";}s:2:"AM";a:1:{i:0;s:27:"ஆரà¯à®®à¯€à®©à®¿à®¯à®¾";}s:2:"AO";a:1:{i:0;s:21:"à®…à®™à¯à®•à¯‹à®²à®¾";}s:2:"AR";a:1:{i:0;s:33:"à®…à®°à¯à®œà¯†à®£à¯à®Ÿà®¿à®©à®¾";}s:2:"AT";a:1:{i:0;s:27:"ஆஸà¯à®¤à®¿à®°à®¿à®¯à®¾";}s:2:"AU";a:1:{i:0;s:33:"ஆஸà¯à®¤à®¿à®°à¯‡à®²à®¿à®¯à®¾";}s:2:"AZ";a:1:{i:0;s:30:"அஜரà¯à®ªà¯ˆà®œà®¾à®©à¯";}s:2:"BA";a:1:{i:0;s:61:"போஸà¯à®©à®¿à®¯à®¾ ஹெரà¯à®¸à®¿à®•à¯‹à®µà®¿à®©à®¾";}s:2:"BB";a:1:{i:0;s:27:"பாரà¯à®ªà®Ÿà¯‹à®¸à¯";}s:2:"BD";a:1:{i:0;s:30:"பஙà¯à®•à®³à®¾à®¤à¯‡à®·à¯";}s:2:"BE";a:1:{i:0;s:27:"பெலà¯à®œà®¿à®¯à®®à¯";}s:2:"BF";a:1:{i:0;s:34:"பரà¯à®•à®¿à®©à¯‹ பாஸோ";}s:2:"BG";a:1:{i:0;s:27:"பலà¯à®•à¯‡à®°à®¿à®¯à®¾";}s:2:"BH";a:1:{i:0;s:21:"பஹà¯à®°à¯ˆà®©à¯";}s:2:"BI";a:1:{i:0;s:24:"பà¯à®°à¯à®£à¯à®Ÿà®¿";}s:2:"BJ";a:1:{i:0;s:18:"பெனினà¯";}s:2:"BN";a:1:{i:0;s:24:"பà¯à®°à¯‚னேயà¯";}s:2:"BO";a:1:{i:0;s:24:"பொலிவியா";}s:2:"BR";a:1:{i:0;s:24:"பிரேஸிலà¯";}s:2:"BS";a:1:{i:0;s:21:"பஹாமாஸà¯";}s:2:"BT";a:1:{i:0;s:18:"பூடானà¯";}s:2:"BW";a:1:{i:0;s:30:"போடà¯à®¸à¯à®µà®¾à®©à®¾";}s:2:"BY";a:1:{i:0;s:24:"பெலாரூஸà¯";}s:2:"BZ";a:1:{i:0;s:18:"பெலிஸà¯";}s:2:"CA";a:1:{i:0;s:12:"கனடா";}s:2:"CF";a:1:{i:0;s:74:"மதà¯à®¤à®¿à®¯ ஆபà¯à®°à®¿à®•à¯à®•à®•à¯ கà¯à®Ÿà®¿à®¯à®°à®šà¯";}s:2:"CG";a:1:{i:0;s:18:"காஙà¯à®•à¯‹";}s:2:"CH";a:1:{i:0;s:45:"ஸà¯à®µà®¿à®Ÿà¯à®šà®°à¯à®²à®¾à®¨à¯à®¤à¯";}s:2:"CI";a:1:{i:0;s:31:"à®à®µà®°à®¿ கோஸà¯à®Ÿà¯";}s:2:"CL";a:1:{i:0;s:12:"சிலி";}s:2:"CM";a:1:{i:0;s:21:"கேமரூனà¯";}s:2:"CN";a:1:{i:0;s:9:"சீன";}s:
2:"CO";a:1:{i:0;s:27:"கொலமà¯à®ªà®¿à®¯à®¾";}s:2:"CR";a:1:{i:0;s:30:"கோஸà¯à®Ÿà®¾à®°à®¿à®•à®¾";}s:2:"CU";a:1:{i:0;s:18:"கியூபா";}s:2:"CV";a:1:{i:0;s:31:"கேப௠வெரà¯à®Ÿà¯‡";}s:2:"CY";a:1:{i:0;s:21:"சைபà¯à®°à®¸à¯";}s:2:"CZ";a:1:{i:0;s:37:"செக௠கà¯à®Ÿà®¿à®¯à®°à®šà¯";}s:2:"DE";a:1:{i:0;s:21:"ஜெரà¯à®®à®©à¯";}s:2:"DJ";a:1:{i:0;s:18:"ஜிபௌடி";}s:2:"DK";a:1:{i:0;s:30:"டெனà¯à®®à®¾à®°à¯à®•à¯";}s:2:"DM";a:1:{i:0;s:24:"டொமினிகா";}s:2:"DO";a:1:{i:0;s:52:"டொமினிகன௠கà¯à®Ÿà®¿à®¯à®°à®šà¯";}s:2:"DZ";a:1:{i:0;s:27:"அலà¯à®œà¯€à®°à®¿à®¯à®¾";}s:2:"EC";a:1:{i:0;s:24:"ஈகà¯à®µà®Ÿà®¾à®°à¯";}s:2:"EE";a:1:{i:0;s:27:"எஸà¯à®Ÿà¯‹à®©à®¿à®¯à®¾";}s:2:"EG";a:1:{i:0;s:21:"எகிபà¯à®¤à¯";}s:2:"ES";a:1:{i:0;s:24:"ஸà¯à®ªà¯†à®¯à®¿à®©à¯";}s:2:"ET";a:1:{i:0;s:33:"எதியோபà¯à®ªà®¿à®¯à®¾";}s:2:"FI";a:1:{i:0;s:30:"பினà¯à®²à®¾à®¨à¯à®¤à¯";}s:2:"FJ";a:1:{i:0;s:12:"பிஜி";}s:2:"FR";a:1:{i:0;s:24:"பிரானà¯à®¸à¯";}s:2:"GA";a:1:{i:0;s:18:"காபோனà¯";}s:2:"GB";a:1:{i:0;s:49:"பிரிடிஷ௠கூடà¯à®Ÿà®°à®šà¯";}s:2:"GD";a:1:{i:0;s:21:"கிரனெடா";}s:2:"GE";a:1:{i:0;s:24:"ஜாரà¯à®œà®¿à®¯à®¾";}s:2:"GH";a:1:{i:0;s:12:"கானா";}s:2:"GM";a:1:{i:0;s:24:"காமà¯à®ªà®¿à®¯à®¾";}s:2:"GN";a:1:{i:0;s:12:"கினி";}s:2:"GQ";a:1:{i:0;s:55:"ஈகà¯à®•à¯à®µà®¿à®Ÿà¯‹à®°à®¿à®¯à®²à¯ கினி";}s:2:"GR";a:1:{i:0;s:18:"கிரீஸà¯";}s:2:"GT";a:1:{i:0;s:36:"கà¯à®µà®¾à®¤à¯à®¤à®¾à®®à®¾à®²à®¾";}s:2:"GW";a:1:{i:0;s:37:"கினி-பிஸà¯à®¸à®¾à®µà¯";}s:2:"GY";a:1:{i:0;s:15:"கயானா";}s:2:"HN";a:1:{i:0;s:30:"ஹாணà¯à®Ÿà¯à®°à®¾à®¸à¯";}s:2:"HR";a:1:{i:0;s:24:"கà¯à®°à¯‹à®šà®¿à®¯à®¾";}s:2:"HT";a:1:{i:0;s:18:"ஹெயà¯à®¤à®¿";}s:2:"HU";a:1:{i:0;s:21:"ஹஙà¯à®•à¯‡à®°à®¿";}s:2:"ID";a:1:{i:0;s:33:"இநà¯à®¤à¯‹à®©à¯‡à®·à®¿à®¯à®¾";}s:2:"IE";a:1:{i:0;s:30:"அயரà¯à®²à®¾à®¨à¯à®¤à¯";}s:2:"IL";a:1:{i:
0;s:21:"இஸà¯à®°à¯‡à®²à¯";}s:2:"IN";a:1:{i:0;s:21:"இநà¯à®¤à®¿à®¯à®¾";}s:2:"IQ";a:1:{i:0;s:15:"இராகà¯";}s:2:"IR";a:1:{i:0;s:15:"ஈரானà¯";}s:2:"IS";a:1:{i:0;s:27:"à®à®¸à¯à®²à®¾à®¨à¯à®¤à¯";}s:2:"IT";a:1:{i:0;s:21:"இதà¯à®¤à®¾à®²à®¿";}s:2:"JM";a:1:{i:0;s:27:"ஜமாயà¯à®•à¯à®•à®¾";}s:2:"JO";a:1:{i:0;s:24:"ஜொரà¯à®Ÿà®¾à®©à¯";}s:2:"JP";a:1:{i:0;s:21:"ஜபà¯à®ªà®¾à®©à¯";}s:2:"KE";a:1:{i:0;s:18:"கெனà¯à®¯à®¾";}s:2:"KG";a:1:{i:0;s:36:"கிரà¯à®•à®¿à®¸à¯à®¤à®¾à®©à¯";}s:2:"KH";a:1:{i:0;s:27:"கமà¯à®ªà¯‹à®Ÿà®¿à®¯à®¾";}s:2:"KI";a:1:{i:0;s:21:"கிரிபடி";}s:2:"KM";a:1:{i:0;s:21:"கோமரோஸà¯";}s:2:"KP";a:1:{i:0;s:25:"வட கொரியா";}s:2:"KR";a:1:{i:0;s:31:"தென௠கொரியா";}s:2:"KW";a:1:{i:0;s:24:"கà¯à®µà¯ˆà®¤à¯à®¤à¯";}s:2:"KZ";a:1:{i:0;s:27:"கஜகஸà¯à®¤à®¾à®©à¯";}s:2:"LA";a:1:{i:0;s:18:"லாவோஸà¯";}s:2:"LB";a:1:{i:0;s:21:"லெபனானà¯";}s:2:"LI";a:1:{i:0;s:42:"லிசà¯à®Ÿà¯†à®£à¯à®¸à¯à®Ÿà¯€à®©à¯";}s:2:"LK";a:1:{i:0;s:18:"இலஙà¯à®•à¯ˆ";}s:2:"LR";a:1:{i:0;s:24:"லைபீரியா";}s:2:"LS";a:1:{i:0;s:18:"லெசோதோ";}s:2:"LT";a:1:{i:0;s:30:"லிதà¯à®µà¯‡à®©à®¿à®¯à®¾";}s:2:"LU";a:1:{i:0;s:39:"லகà¯à®¸à¯à®šà®®à¯à®ªà®°à¯à®•à¯";}s:2:"LV";a:1:{i:0;s:24:"லாடà¯à®µà®¿à®¯à®¾";}s:2:"LY";a:1:{i:0;s:18:"லிபà¯à®¯à®¾";}s:2:"MA";a:1:{i:0;s:24:"மொரோகà¯à®•à¯‹";}s:2:"MC";a:1:{i:0;s:24:"மொனாகà¯à®•à¯‹";}s:2:"MD";a:1:{i:0;s:24:"மாலà¯à®Ÿà¯‹à®µà®¾";}s:2:"MK";a:1:{i:0;s:27:"மசெடோணியா";}s:2:"ML";a:1:{i:0;s:12:"மாலீ";}s:2:"MM";a:1:{i:0;s:30:"மியானà¯à®®à®¾à®°à¯";}s:2:"MN";a:1:{i:0;s:27:"மஙà¯à®•à¯‹à®²à®¿à®¯à®¾";}s:2:"MT";a:1:{i:0;s:18:"மாலà¯à®Ÿà®¾";}s:2:"MV";a:1:{i:0;s:27:"மாலதà¯à®¤à¯€à®µà¯";}s:2:"MW";a:1:{i:0;s:15:"மலாவீ";}s:2:"MX";a:1:{i:0;s:24:"மெகà¯à®šà®¿à®•à¯‹";}s:2:"MY";a:1:{i:0;s:21:"மலேஷியா";}s:2:"NA";a:1:{i:0;s:24:"னாமீà
®ªà®¿à®¯à®¾";}s:2:"NI";a:1:{i:0;s:30:"நிகாராகà¯à®µà®¾";}s:2:"NL";a:1:{i:0;s:33:"நெதரà¯à®²à®¾à®¨à¯à®¤à¯";}s:2:"NO";a:1:{i:0;s:18:"நாரà¯à®µà¯‡";}s:2:"NP";a:1:{i:0;s:21:"நேபாளமà¯";}s:2:"NR";a:1:{i:0;s:12:"நௌரà¯";}s:2:"NZ";a:1:{i:0;s:36:"நியூசிலாநà¯à®¤à¯";}s:2:"OM";a:1:{i:0;s:15:"ஓமானà¯";}s:2:"PA";a:1:{i:0;s:15:"பணாமா";}s:2:"PE";a:1:{i:0;s:12:"பெரà¯";}s:2:"PG";a:1:{i:0;s:49:"பாபà¯à®ªà¯à®µà®¾-நியூகினி";}s:2:"PH";a:1:{i:0;s:36:"பிலிபà¯à®ªà¯ˆà®©à¯à®¸à¯";}s:2:"PK";a:1:{i:0;s:30:"பாகிஸà¯à®¤à®¾à®©à¯";}s:2:"PL";a:1:{i:0;s:21:"போலநà¯à®¤à¯";}s:2:"PT";a:1:{i:0;s:39:"போரà¯à®šà¯à®šà¯à®•à¯à®•à®²à¯";}s:2:"PY";a:1:{i:0;s:21:"பாரகà¯à®µà¯‡";}s:2:"QA";a:1:{i:0;s:18:"காடாரà¯";}s:2:"RO";a:1:{i:0;s:24:"à®°à¯à®®à¯‡à®©à®¿à®¯à®¾";}s:2:"RU";a:1:{i:0;s:15:"à®°à®·à¯à®¯à®¾";}s:2:"SA";a:1:{i:0;s:37:"சவூதி அரேபியா";}s:2:"SB";a:1:{i:0;s:40:"சாலமன௠தீவà¯à®•à®³à¯";}s:2:"SE";a:1:{i:0;s:21:"ஸà¯à®µà¯€à®Ÿà®©à¯";}s:2:"SG";a:1:{i:0;s:33:"சிஙà¯à®•à®ªà¯à®ªà¯‚à®°à¯";}s:2:"SI";a:1:{i:0;s:30:"ஸà¯à®²à¯‹à®µà¯‡à®©à®¿à®¯à®¾";}s:2:"SK";a:1:{i:0;s:30:"ஸà¯à®²à¯‹à®µà®¾à®•à®¿à®¯à®¾";}s:2:"SM";a:1:{i:0;s:30:"சானà¯à®®à¯†à®°à®¿à®©à¯‹";}s:2:"SR";a:1:{i:0;s:24:"சூரினாமà¯";}s:2:"SV";a:1:{i:0;s:37:"எல௠சாலà¯à®µà®Ÿà®¾à®°à¯";}s:2:"SY";a:1:{i:0;s:18:"சிரியா";}s:2:"TD";a:1:{i:0;s:12:"சாடà¯";}s:2:"TH";a:1:{i:0;s:30:"தாயà¯à®²à®¾à®¨à¯à®¤à¯";}s:2:"TJ";a:1:{i:0;s:36:"தாஜிகிஸà¯à®¤à®¾à®©à¯";}s:2:"TM";a:1:{i:0;s:48:"தà¯à®°à¯à®•à¯à®®à¯†à®©à®¿à®¸à¯à®¤à®¾à®©à¯";}s:2:"TN";a:1:{i:0;s:24:"தà¯à®©à®¿à®šà®¿à®¯à®¾";}s:2:"TO";a:1:{i:0;s:18:"தொஙà¯à®•à®¾";}s:2:"TR";a:1:{i:0;s:24:"தà¯à®°à¯à®•à¯à®•à®¿";}s:2:"TT";a:1:{i:0;s:49:"திரினிடாட௠தொபாகோ";}s:2:"TV";a:1:{i:0;s:18:"தà¯à®µà®¾à®²à¯‚";}s:2:"TW";a:1:{i:0;s:18:"தைà
®µà®¾à®©à¯";}s:2:"UA";a:1:{i:0;s:21:"உகà¯à®°à¯ˆà®©à¯";}s:2:"US";a:1:{i:0;s:71:"à®à®•à¯à®•à®¿à®¯ அமெரிகà¯à®•à®¾ கà¯à®Ÿà®¿à®¯à®°à®šà¯";}s:2:"UY";a:1:{i:0;s:21:"உரà¯à®•à¯à®µà¯‡";}s:2:"UZ";a:1:{i:0;s:39:"உஸà¯à®ªà¯†à®•à®¿à®¸à¯à®¤à®¾à®©à¯";}s:2:"VA";a:1:{i:0;s:21:"வாடிகனà¯";}s:2:"VE";a:1:{i:0;s:27:"வெனஜà¯à®µà¯‡à®²à®¾";}s:2:"VN";a:1:{i:0;s:27:"வியடà¯à®¨à®¾à®®à¯";}s:2:"VU";a:1:{i:0;s:27:"வனà¯à®µà®¾à®Ÿà¯à®Ÿà¯";}s:2:"WS";a:1:{i:0;s:15:"சமோவா";}s:2:"YE";a:1:{i:0;s:15:"யேமனà¯";}s:2:"ZA";a:1:{i:0;s:40:"தென௠ஆபà¯à®°à®¿à®•à¯à®•à®¾";}s:2:"ZW";a:1:{i:0;s:30:"ஜிமà¯à®ªà®¾à®ªà¯à®µà¯‡";}}s:10:"Currencies";a:1:{s:3:"INR";a:2:{i:0;s:6:"ரூ";i:1;s:3:"INR";}}s:9:"Languages";a:141:{s:2:"aa";a:1:{i:0;s:15:"அபாரà¯";}s:2:"ab";a:1:{i:0;s:27:"அபà¯à®•à®¾à®¸à®¿à®©à¯";}s:2:"af";a:1:{i:0;s:30:"ஆபà¯à®°à®¿à®•à®©à¯à®¸à¯";}s:2:"am";a:1:{i:0;s:27:"à®…à®®à¯à®¹à®¾à®°à®¿à®•à¯";}s:2:"ar";a:1:{i:0;s:12:"அரபà¯";}s:2:"as";a:1:{i:0;s:21:"அஸà¯à®¸à®¾à®®à®¿";}s:2:"ay";a:1:{i:0;s:15:"அயமரா";}s:2:"az";a:1:{i:0;s:36:"அசரà¯à®ªà®¾à®¯à¯à®œà®¾à®©à®¿";}s:2:"ba";a:1:{i:0;s:25:"பாஷà¯à®•à®¿à®°à¯0";}s:2:"be";a:1:{i:0;s:30:"பைலோரà¯à®·à¯à®©à¯";}s:2:"bg";a:1:{i:0;s:30:"பலà¯à®•à¯‡à®°à®¿à®¯à®©à¯";}s:2:"bh";a:1:{i:0;s:18:"பிஹாரி";}s:2:"bi";a:1:{i:0;s:24:"பிஸà¯à®²à®¾à®®à®¾";}s:2:"bn";a:1:{i:0;s:24:"வஙà¯à®•à®¾à®³à®®à¯";}s:2:"bo";a:1:{i:0;s:24:"திபெதà¯à®¤à¯";}s:2:"br";a:1:{i:0;s:21:"பிரிடனà¯";}s:2:"ca";a:1:{i:0;s:21:"காடலானà¯";}s:2:"co";a:1:{i:0;s:27:"காரà¯à®šà®¿à®¯à®©à¯";}s:2:"cs";a:1:{i:0;s:12:"செகà¯";}s:2:"cy";a:1:{i:0;s:18:"வெலà¯à®·à¯";}s:2:"da";a:1:{i:0;s:18:"டானிஷà¯";}s:2:"de";a:1:{i:0;s:21:"ஜெரà¯à®®à®©à¯";}s:2:"dz";a:1:{i:0;s:18:"பà¯à®Ÿà®¾à®©à®¿";}s:2:"el";a:1:{i:0;s:27:"கிரேகà¯à®•à®®à¯";}s:2:"en";a:1:{i:0;s:24:"ஆஙà¯à®•à®¿à®²à®®à¯";}s:2:"eo";a:1:{i:0;s:3
0:"எஸà¯à®ªà®°à¯‡à®©à¯à®Ÿà¯‹";}s:2:"es";a:1:{i:0;s:24:"ஸà¯à®ªà¯‡à®©à®¿à®·à¯";}s:2:"et";a:1:{i:0;s:30:"எஸà¯à®Ÿà¯‹à®©à®¿à®¯à®©à¯";}s:2:"eu";a:1:{i:0;s:15:"பஸà¯à®•à¯";}s:2:"fa";a:1:{i:0;s:24:"பரà¯à®¸à®¿à®¯à®©à¯";}s:2:"fi";a:1:{i:0;s:24:"பினà¯à®©à®¿à®·à¯";}s:2:"fj";a:1:{i:0;s:12:"பிஜி";}s:2:"fo";a:1:{i:0;s:18:"பைரோஸி";}s:2:"fr";a:1:{i:0;s:24:"பிரெஞà¯à®šà¯";}s:2:"fy";a:1:{i:0;s:27:"பிரிஷியனà¯";}s:2:"ga";a:1:{i:0;s:15:"à®à®°à®¿à®·à¯";}s:2:"gd";a:1:{i:0;s:43:"ஸà¯à®•à®¾à®Ÿà¯à®¸à¯ காலெகà¯";}s:2:"gl";a:1:{i:0;s:27:"கெலிஸியனà¯";}s:2:"gn";a:1:{i:0;s:18:"கà¯à®°à®¾à®©à®¿";}s:2:"gu";a:1:{i:0;s:27:"கà¯à®œà®°à®¾à®¤à¯à®¤à®¿";}s:2:"ha";a:1:{i:0;s:12:"ஹொஸா";}s:2:"he";a:1:{i:0;s:18:"ஹà¯à®ªà¯à®°à¯";}s:2:"hi";a:1:{i:0;s:15:"இநà¯à®¤à®¿";}s:2:"hr";a:1:{i:0;s:24:"கரோஷியனà¯";}s:2:"hu";a:1:{i:0;s:30:"ஹஙà¯à®•à¯‡à®°à®¿à®¯à®©à¯";}s:2:"hy";a:1:{i:0;s:30:"ஆரà¯à®®à¯‡à®©à®¿à®¯à®©à¯";}s:2:"ia";a:1:{i:0;s:42:"இனà¯à®Ÿà®°à¯à®²à®¿à®™à¯à®•à¯à®µà®¾";}s:2:"id";a:1:{i:0;s:36:"இநà¯à®¤à¯‹à®©à¯‡à®·à®¿à®¯à®©à¯";}s:2:"ie";a:1:{i:0;s:42:"இனà¯à®Ÿà®°à¯à®²à®¿à®™à¯à®•à¯à®µà®¾";}s:2:"ik";a:1:{i:0;s:21:"இனà¯à®ªà¯†à®•à¯";}s:2:"is";a:1:{i:0;s:33:"à®à®¸à¯à®²à¯†à®©à¯à®Ÿà®¿à®•à¯";}s:2:"it";a:1:{i:0;s:30:"இதà¯à®¤à®¾à®²à®¿à®¯à®©à¯";}s:2:"iu";a:1:{i:0;s:24:"இனà¯à®•à®¿à®Ÿà®Ÿà¯";}s:2:"ja";a:1:{i:0;s:27:"ஜபà¯à®ªà®¾à®©à¯€à®¸à¯";}s:2:"jv";a:1:{i:0;s:24:"ஜாவானீஸà¯";}s:2:"ka";a:1:{i:0;s:21:"கனà¯à®©à®Ÿà®®à¯";}s:2:"kk";a:1:{i:0;s:15:"கசாகà¯";}s:2:"kl";a:1:{i:0;s:42:"கிரினà¯à®²à¯†à®©à¯à®Ÿà®¿à®•à¯";}s:2:"km";a:1:{i:0;s:30:"கமà¯à®ªà¯‹à®Ÿà®¿à®¯à®©à¯";}s:2:"kn";a:1:{i:0;s:18:"கனà¯à®©à®Ÿà®¾";}s:2:"ko";a:1:{i:0;s:21:"கொரியனà¯";}s:3:"kok";a:1:{i:0;s:21:"கொஙà¯à®•à®©à®¿";}s:2:"ks";a:1:{i:0;s:24:"காஷà¯à®®à®¿à®°à®¿";}s:2:"ku";a:1:{i:0;s:24:"கà¯à®°à¯à®¤à®¿à®·à¯";}s:2:"ky";a:1:{i:0;s:24:"கிர
à¯à®•à®¿à®·à¯";}s:2:"la";a:1:{i:0;s:18:"லாதினà¯";}s:2:"ln";a:1:{i:0;s:24:"லிஙà¯à®•à®¾à®²à®¾";}s:2:"lo";a:1:{i:0;s:27:"லோதà¯à®¤à®¿à®¯à®©à¯";}s:2:"lt";a:1:{i:0;s:33:"லà¯à®¤à¯à®¤à¯‡à®©à®¿à®¯à®©à¯";}s:2:"lv";a:1:{i:0;s:54:"லேடà¯à®µà®¿à®¯à®©à¯ (லேடà¯à®Ÿà®¿à®·à¯)";}s:2:"mg";a:1:{i:0;s:18:"மலகெஸி";}s:2:"mi";a:1:{i:0;s:12:"மோரி";}s:2:"mk";a:1:{i:0;s:36:"மெகà¯à®•à®Ÿà¯‹à®©à®¿à®¯à®©à¯";}s:2:"ml";a:1:{i:0;s:24:"மலையாளமà¯";}s:2:"mn";a:1:{i:0;s:30:"மஙà¯à®•à¯‹à®²à®¿à®¯à®©à¯";}s:2:"mo";a:1:{i:0;s:33:"மோலà¯à®Ÿà¯‡à®µà®¿à®¯à®©à¯";}s:2:"mr";a:1:{i:0;s:21:"மராதà¯à®¤à®¿";}s:2:"ms";a:1:{i:0;s:15:"மலாயà¯";}s:2:"mt";a:1:{i:0;s:24:"மாலà¯à®Ÿà®¿à®¸à¯";}s:2:"my";a:1:{i:0;s:21:"பரà¯à®®à®¿à®¸à¯";}s:2:"na";a:1:{i:0;s:12:"நாரூ";}s:2:"ne";a:1:{i:0;s:24:"நேபà¯à®ªà®¾à®²à®¿";}s:2:"nl";a:1:{i:0;s:15:"டசà¯à®šà¯";}s:2:"no";a:1:{i:0;s:33:"நாரà¯à®µà¯‡à®•à®¿à®¯à®©à¯";}s:2:"oc";a:1:{i:0;s:24:"ஆகிடியனà¯";}s:2:"om";a:1:{i:0;s:27:"ஒரோம (அபனà¯)";}s:2:"or";a:1:{i:0;s:15:"ஒரியா";}s:2:"pa";a:1:{i:0;s:21:"பஞà¯à®šà®¾à®ªà®¿";}s:2:"pl";a:1:{i:0;s:18:"போலிஷà¯";}s:2:"ps";a:1:{i:0;s:39:"பேஷà¯à®Ÿà¯‹ (பà¯à®·à¯à®Ÿà¯‹)";}s:2:"pt";a:1:{i:0;s:36:"போரà¯à®¤à¯à®¤à¯à®•à¯€à®¸à¯";}s:2:"qu";a:1:{i:0;s:18:"கியà¯à®šà®¾";}s:2:"rm";a:1:{i:0;s:43:"ரைடà¯à®Ÿà¯‹-ரோமெனà¯à®¸à¯";}s:2:"rn";a:1:{i:0;s:24:"கிரà¯à®¨à¯à®¤à®¿";}s:2:"ro";a:1:{i:0;s:27:"ரோமேனியனà¯";}s:4:"root";a:1:{i:0;s:15:"தமிழà¯";}s:2:"ru";a:1:{i:0;s:18:"ரஷியனà¯";}s:2:"rw";a:1:{i:0;s:39:"கினà¯à®¯à®°à¯à®µà¯†à®©à¯à®Ÿà®¾";}s:2:"sa";a:1:{i:0;s:33:"சமஸà¯à®•à®¿à®°à¯à®¤à®®à¯";}s:2:"sd";a:1:{i:0;s:18:"சிநà¯à®¤à®¿";}s:2:"sg";a:1:{i:0;s:24:"செனà¯à®•à¯à®°à¯‹";}s:2:"sh";a:1:{i:0;s:46:"செரà¯à®ªà¯‹-கà¯à®°à¯‹à®·à®¿à®¯à®©à¯";}s:2:"si";a:1:{i:0;s:24:"சிஙà¯à®•à®³à®®à¯";}s:2:"sk";a:1:{i:0;s
:24:"ஸà¯à®²à¯‹à®µà¯†à®•à¯";}s:2:"sl";a:1:{i:0;s:36:"ஸà¯à®²à¯‹à®µà®¿à®©à¯‡à®¯à®¿à®©à¯";}s:2:"sm";a:1:{i:0;s:18:"ஸெமோனà¯";}s:2:"sn";a:1:{i:0;s:12:"ஷோனா";}s:2:"so";a:1:{i:0;s:18:"சோமாலி";}s:2:"sq";a:1:{i:0;s:30:"அலà¯à®ªà¯†à®©à®¿à®¯à®©à¯";}s:2:"sr";a:1:{i:0;s:24:"சரà¯à®ªà®¿à®¯à®©à¯";}s:2:"ss";a:1:{i:0;s:24:"ஷிஸà¯à®µà®¾à®¤à®¿";}s:2:"st";a:1:{i:0;s:24:"ஷெஸà¯à®¸à¯‹à®¤à¯‹";}s:2:"su";a:1:{i:0;s:24:"சà¯à®Ÿà®¾à®©à¯€à®¸à¯";}s:2:"sv";a:1:{i:0;s:24:"ஷீவிடிஸà¯";}s:2:"sw";a:1:{i:0;s:24:"சà¯à®µà®¾à®¹à®¿à®²à®¿";}s:2:"ta";a:1:{i:0;s:15:"தமிழà¯";}s:2:"te";a:1:{i:0;s:24:"தெலà¯à®™à¯à®•à¯";}s:2:"tg";a:1:{i:0;s:18:"தாஜிகà¯";}s:2:"th";a:1:{i:0;s:12:"தாயà¯";}s:2:"ti";a:1:{i:0;s:30:"டிகà¯à®°à®¿à®©à¯à®¯à®¾";}s:2:"tk";a:1:{i:0;s:27:"டரà¯à®•à¯à®®à¯†à®©à¯";}s:2:"tl";a:1:{i:0;s:24:"டாகாலோகà¯";}s:2:"tn";a:1:{i:0;s:30:"ஸெடà¯à®¸à¯à®µà®¾à®©à®¾";}s:2:"to";a:1:{i:0;s:18:"டோஙà¯à®•à®¾";}s:2:"tr";a:1:{i:0;s:21:"டரà¯à®•à®¿à®·à¯";}s:2:"ts";a:1:{i:0;s:18:"ஸோஙà¯à®•à®¾";}s:2:"tt";a:1:{i:0;s:15:"டாடரà¯";}s:2:"tw";a:1:{i:0;s:18:"தà¯à®¤à®¿à®µà®¿";}s:2:"ug";a:1:{i:0;s:18:"யà¯à®•à¯à®°à¯";}s:2:"uk";a:1:{i:0;s:30:"உகà¯à®°à¯‡à®©à®¿à®¯à®©à¯";}s:2:"ur";a:1:{i:0;s:15:"உரà¯à®¤à¯";}s:2:"uz";a:1:{i:0;s:21:"உஸà¯à®ªà¯†à®•à¯";}s:2:"vi";a:1:{i:0;s:33:"வியடà¯à®¨à®¾à®®à®¿à®¸à¯";}s:2:"vo";a:1:{i:0;s:18:"ஒலபà¯à®•à¯";}s:2:"wo";a:1:{i:0;s:15:"ஒலோபà¯";}s:2:"xh";a:1:{i:0;s:12:"ஹோஷா";}s:2:"yi";a:1:{i:0;s:18:"ஈதà¯à®¤à®¿à®·";}s:2:"yo";a:1:{i:0;s:24:"யோரà¯à®ªà¯à®ªà®¾";}s:2:"za";a:1:{i:0;s:18:"ஜà¯à®µà®¾à®™à¯";}s:2:"zh";a:1:{i:0;s:15:"சீனமà¯";}s:2:"zu";a:1:{i:0;s:12:"ஜூலூ";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Taml";}s:14:"NumberPatterns";a:4:{i:0;s:26:"#,##,##0.###;-#,##,##0.###";i:1;s:30:"¤ #,##,##0.00;-¤ #,##,##0.00";i:2;s:9:"#,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:
9:"gregorian";a:4:{s:11:"AmPmMarkers";a:2:{i:0;s:12:"காலை";i:1;s:12:"மாலை";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:6:"ஞா";i:1;s:6:"தி";i:2;s:6:"செ";i:3;s:6:"பà¯";i:4;s:6:"வி";i:5;s:6:"வெ";i:6;s:3:"ச";}s:4:"wide";a:7:{i:0;s:18:"ஞாயிறà¯";i:1;s:21:"திஙà¯à®•à®³à¯";i:2;s:24:"செவà¯à®µà®¾à®¯à¯";i:3;s:15:"பà¯à®¤à®©à¯";i:4;s:21:"வியாழனà¯";i:5;s:18:"வெளà¯à®³à®¿";i:6;s:9:"சனி";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:12:"கிமà¯";i:1;s:12:"கிபி";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:7:"ஜன.";i:1;s:13:"பிபà¯.";i:2;s:13:"மாரà¯.";i:3;s:10:"à®à®ªà¯.";i:4;s:6:"மே";i:5;s:12:"ஜூனà¯";i:6;s:12:"ஜூலை";i:7;s:7:"ஆக.";i:8;s:13:"செபà¯.";i:9;s:10:"அகà¯.";i:10;s:7:"நவ.";i:11;s:10:"டிச.";}s:4:"wide";a:12:{i:0;s:15:"ஜனவரி";i:1;s:24:"பிபà¯à®°à®µà®°à®¿";i:2;s:18:"மாரà¯à®šà¯";i:3;s:18:"à®à®ªà¯à®°à®²à¯";i:4;s:6:"மே";i:5;s:12:"ஜூனà¯";i:6;s:12:"ஜூலை";i:7;s:18:"ஆகஸà¯à®Ÿà¯";i:8;s:30:"செபà¯à®Ÿà®®à¯à®ªà®°à¯";i:9;s:24:"அகà¯à®Ÿà¯‹à®ªà®°à¯";i:10;s:21:"நவமà¯à®ªà®°à¯";i:11;s:24:"டிசமà¯à®ªà®°à¯";}}}}}s:11:"zoneStrings";a:1:{i:0;a:5:{i:0;s:13:"Asia/Calcutta";i:1;s:43:"இநà¯à®¤à®¿à®¯ நேரபà¯à®ªà®Ÿà®¿";i:2;s:3:"IST";i:3;s:43:"இநà¯à®¤à®¿à®¯ நேரபà¯à®ªà®Ÿà®¿";i:4;s:3:"IST";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ta_IN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ta_IN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ta_IN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:28:"##,##,##0.###;-##,##,##0.###";i:1;s:32:"¤ ##,##,##0.00;-¤ ##,##,##0.00";i:2;s:10:"##,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:6:"d-M-yy";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:1;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/te.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/te.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/te.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:7:{s:9:"Countries";a:1:{s:2:"IN";a:1:{i:0;s:25:"భారత దేళ౦";}}s:10:"Currencies";a:1:{s:3:"INR";a:2:{i:0;s:7:"రూ.";i:1;s:3:"INR";}}s:9:"Languages";a:1:{s:2:"te";a:1:{i:0;s:18:"తెలà±à°—à±";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Telu";}s:14:"NumberElements";a:12:{i:0;s:1:".";i:1;s:1:",";i:2;s:1:";";i:3;s:1:"%";i:4;s:3:"౦";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:11:"AmPmMarkers";a:2:{i:0;s:27:"పూరà±à°µà°¾à°¹à±à°¨";i:1;s:21:"అపరాహà±à°¨";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:9:"ఆది";i:1;s:9:"సోమ";i:2;s:12:"మంగళ";i:3;s:9:"à°¬à±à°§";i:4;s:12:"à°—à±à°°à±";i:5;s:15:"à°¶à±à°•à±à°°";i:6;s:9:"శని";}s:4:"wide";a:7:{i:0;s:21:"ఆదివారం";i:1;s:21:"సోమవారం";i:2;s:24:"మంగళవారం";i:3;s:21:"à°¬à±à°§à°µà°¾à°°à°‚";i:4;s:24:"à°—à±à°°à±à°µà°¾à°°à°‚";i:5;s:27:"à°¶à±à°•à±à°°à°µà°¾à°°à°‚";i:6;s:21:"శనివారం";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:15:"జనవరి";i:1;s:24:"à°«à°¿à°¬à±à°°à°µà°°à°¿";i:2;s:18:"మారà±à°šà°¿";i:3;s:21:"à°à°ªà±à°°à°¿à°²à±";i:4;s:6:"మే";i:5;s:12:"జూనà±";i:6;s:12:"జూలై";i:7;s:18:"ఆగసà±à°Ÿà±";i:8;s:30:"సెపà±à°Ÿà±†à°‚బరà±";i:9;s:24:"à°…à°•à±à°Ÿà±‹à°¬à°°à±";i:10;s:18:"నవంబరà±";i:11;s:24:"డిసెంబరà±";}s:4:"wide";a:12:{i:0;s:15:"జనవరి";i:1;s:24:"à°«à°¿à°¬à±à°°à°µà°°à°¿";i:2;s:18:"మారà±à°šà°¿";i:3;s:21:"à°à°ªà±à°°à°¿à°²à±";i:4;s:6:"మే";i:5;s:12:"జూనà±";i:6;s:12:"జూలై";i:7;s:18:"ఆగసà±à°Ÿà±";i:8;s:30:"సెపà±à°Ÿà±†à°‚బరà±";i:9;s:24:"à°…à°•à±à°Ÿà±‹à°¬à°°à±";i:10;s:18:"నవంబరà±";i:11;s:24:"డిసెంబరà±";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/te_IN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/te_IN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/te_IN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:28:"##,##,##0.###;-##,##,##0.###";i:1;s:32:"¤ ##,##,##0.00;-¤ ##,##,##0.00";i:2;s:10:"##,##,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:11:"h:mm:ss a z";i:1;s:11:"h:mm:ss a z";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:8:"dd-MM-yy";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:1;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/th.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/th.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/th.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:9:{s:26:"BreakDictionaryData:import";a:1:{i:0;s:22:"../brkitr/thaidict.brk";}s:9:"Countries";a:206:{s:2:"AD";a:1:{i:0;s:27:"อันดอร์รา";}s:2:"AE";a:1:{i:0;s:60:"สหรัà¸à¸­à¸²à¸«à¸£à¸±à¸šà¹€à¸­à¸¡à¸´à¹€à¸£à¸•à¸ªà¹Œ";}s:2:"AF";a:1:{i:0;s:33:"อัฟà¸à¸²à¸™à¸´à¸ªà¸–าน";}s:2:"AG";a:1:{i:0;s:54:"à¹à¸­à¸™à¸•à¸´à¸à¸²à¹à¸¥à¸°à¸šà¸²à¸£à¹Œà¸šà¸¹à¸”า";}s:2:"AI";a:1:{i:0;s:24:"อันà¸à¸´à¸¥à¹ˆà¸²";}s:2:"AL";a:1:{i:0;s:27:"à¹à¸­à¸¥à¹€à¸šà¹€à¸™à¸µà¸¢";}s:2:"AM";a:1:{i:0;s:30:"อาร์เมเนีย";}s:2:"AN";a:1:{i:0;s:63:"เนเฮอร์à¹à¸¥à¸™à¸”์à¹à¸­à¸™à¸—ิลลิส";}s:2:"AO";a:1:{i:0;s:21:"à¹à¸­à¸‡à¹‚à¸à¸¥à¸²";}s:2:"AQ";a:1:{i:0;s:36:"à¹à¸­à¸™à¸•à¸²à¸£à¹Œà¸à¸•à¸´à¸à¸²";}s:2:"AR";a:1:{i:0;s:33:"อาร์เจนตินา";}s:2:"AT";a:1:{i:0;s:24:"ออสเตรีย";}s:2:"AU";a:1:{i:0;s:30:"ออสเตรเลีย";}s:2:"AW";a:1:{i:0;s:18:"อารูบา";}s:2:"AZ";a:1:{i:0;s:36:"อาเซอร์ไบจาน";}s:2:"BA";a:1:{i:0;s:69:"บอสเนียà¹à¸¥à¸°à¹€à¸®à¸­à¸£à¹Œà¹€à¸‹à¹‚à¸à¸§à¸µà¸™à¸²";}s:2:"BB";a:1:{i:0;s:27:"บาร์เบโดส";}s:2:"BD";a:1:{i:0;s:27:"บังคลาเทศ";}s:2:"BE";a:1:{i:0;s:24:"เบลเยียม";}s:2:"BF";a:1:{i:0;s:36:"บูร์à¸à¸´à¸™à¸²à¸Ÿà¸²à¹‚ซ";}s:2:"BG";a:1:{i:0;s:27:"บัลà¹à¸à¹€à¸£à¸µà¸¢";}s:2:"BH";a:1:{i:0;s:21:"บาห์เรน";}s:2:"BI";a:1:{i:0;s:21:"บุรุนดี";}s:2:"BJ";a:1:{i:0;s:15:"เบนิน";}s:2:"BM";a:1:{i:0;s:33:"เบอร์มิวด้า";}s:2:"BN";a:1:{i:0;s:15:"บรูไน";}s:2:"BO";a:1:{i:0;s:24:"โบลิเวีย";}s:2:"BR";a:1:{i:0;s:18:"บราซิล";}s:2:"BS";a:1:{i:0;s:21:"บาฮามาส";}s:2:"BT";a:1:{i:0;s:15:"ภูà¸à¸²à¸™";}s:2:"BW";a:1:{i:0;s:24:"บอตสวานา";}s:2:"BY";a:1:{i:0;s:21:"เบลารุส";}s:2:"BZ";a:1:{i:0;s:15:"เบลีช";}s:2:"CA";a:1:{i:0;s:18:"à¹à¸„นาดา";}s:2:"CF";a:1:{i:0;s:60:"สาธารà
¸“รัà¸à¹à¸­à¸Ÿà¸£à¸´à¸à¸²à¸à¸¥à¸²à¸‡";}s:2:"CG";a:1:{i:0;s:15:"คองโà¸";}s:2:"CH";a:1:{i:0;s:42:"สวิตเซอร์à¹à¸¥à¸™à¸”์";}s:2:"CI";a:1:{i:0;s:30:"โà¸à¸•à¸”ิวัวร์";}s:2:"CL";a:1:{i:0;s:12:"ชิลี";}s:2:"CM";a:1:{i:0;s:24:"à¹à¸„เมอรูน";}s:2:"CN";a:1:{i:0;s:9:"จีน";}s:2:"CO";a:1:{i:0;s:27:"โคลัมเบีย";}s:2:"CR";a:1:{i:0;s:27:"คอสตาริà¸à¸²";}s:2:"CU";a:1:{i:0;s:15:"คิวบา";}s:2:"CV";a:1:{i:0;s:27:"เคปเวิร์ด";}s:2:"CY";a:1:{i:0;s:18:"ไซปรัส";}s:2:"CZ";a:1:{i:0;s:39:"สาธารณรัà¸à¹€à¸Šà¹‡à¸";}s:2:"DE";a:1:{i:0;s:21:"เยอรมนี";}s:2:"DJ";a:1:{i:0;s:18:"จิบูตี";}s:2:"DK";a:1:{i:0;s:24:"เดนมาร์à¸";}s:2:"DM";a:1:{i:0;s:24:"โดมินิà¸à¸²";}s:2:"DO";a:1:{i:0;s:54:"สาธารณรัà¸à¹‚ดมินิà¸à¸±à¸™";}s:2:"DZ";a:1:{i:0;s:27:"à¹à¸­à¸¥à¸ˆà¸µà¹€à¸£à¸µà¸¢";}s:2:"EC";a:1:{i:0;s:27:"เอà¸à¸§à¸²à¸”อร์";}s:2:"EE";a:1:{i:0;s:27:"เอสโตเนีย";}s:2:"EG";a:1:{i:0;s:21:"อียิปต์";}s:2:"EH";a:1:{i:0;s:39:"ซาฮาราตะวันตà¸";}s:2:"ER";a:1:{i:0;s:27:"เอริเทรีย";}s:2:"ES";a:1:{i:0;s:12:"สเปน";}s:2:"ET";a:1:{i:0;s:30:"เอธิโอเปีย";}s:2:"FI";a:1:{i:0;s:24:"ฟินà¹à¸¥à¸™à¸”์";}s:2:"FJ";a:1:{i:0;s:12:"ฟิจิ";}s:2:"FK";a:1:{i:0;s:54:"หมู่เà¸à¸²à¸°à¸Ÿà¸­à¸¥à¹Œà¸„à¹à¸¥à¸™à¸”์";}s:2:"FM";a:1:{i:0;s:33:"ไมโครนีเซีย";}s:2:"FR";a:1:{i:0;s:24:"à¸à¸£à¸±à¹ˆà¸‡à¹€à¸¨à¸ª";}s:2:"GA";a:1:{i:0;s:15:"à¸à¸²à¸šà¸­à¸‡";}s:2:"GD";a:1:{i:0;s:21:"เà¸à¸£à¸™à¸²à¸”า";}s:2:"GE";a:1:{i:0;s:24:"จอร์เจีย";}s:2:"GF";a:1:{i:0;s:36:"เฟรนช์à¸à¸µà¸­à¸²à¸™à¸²";}s:2:"GH";a:1:{i:0;s:15:"à¸à¸²à¸™à¹ˆà¸²";}s:2:"GL";a:1:{i:0;s:27:"à¸à¸£à¸µà¸™à¹à¸¥à¸™à¸”์";}s:2:"GM";a:1:{i:0;s:21:"à¹à¸à¸¡à¹€à¸šà¸µà¸¢";}s:2:"GN";a:1:{i:0;s:12:"à¸à¸´à¸™à¸µ";}s:2:"GP";a:1:{i:0;s:27
:"à¸à¸±à¸§à¹€à¸”อลูป";}s:2:"GQ";a:1:{i:0;s:48:"อิเควทอเรียลà¸à¸´à¸™à¸µ";}s:2:"GR";a:1:{i:0;s:12:"à¸à¸£à¸µà¸‹";}s:2:"GT";a:1:{i:0;s:27:"à¸à¸±à¸§à¹€à¸•à¸¡à¸²à¸¥à¸²";}s:2:"GW";a:1:{i:0;s:31:"à¸à¸´à¸™à¸µ-บิสเซา";}s:2:"GY";a:1:{i:0;s:18:"à¸à¸²à¸¢à¸²à¸™à¸²";}s:2:"HK";a:1:{i:0;s:88:"ฮ่องà¸à¸‡ เขตปà¸à¸„รองพิเศษประเทศจีน";}s:2:"HN";a:1:{i:0;s:24:"ฮอนดูรัส";}s:2:"HR";a:1:{i:0;s:27:"โครเอเชีย";}s:2:"HT";a:1:{i:0;s:12:"เฮติ";}s:2:"HU";a:1:{i:0;s:21:"ฮังà¸à¸²à¸£à¸µ";}s:2:"ID";a:1:{i:0;s:33:"อินโดนีเซีย";}s:2:"IE";a:1:{i:0;s:27:"ไอร์à¹à¸¥à¸™à¸”์";}s:2:"IL";a:1:{i:0;s:24:"อิสราเอล";}s:2:"IN";a:1:{i:0;s:21:"อินเดีย";}s:2:"IQ";a:1:{i:0;s:15:"อิรัà¸";}s:2:"IR";a:1:{i:0;s:21:"อิหร่าน";}s:2:"IS";a:1:{i:0;s:27:"ไอซ์à¹à¸¥à¸™à¸”์";}s:2:"IT";a:1:{i:0;s:18:"อิตาลี";}s:2:"JM";a:1:{i:0;s:18:"จาเมà¸à¸²";}s:2:"JO";a:1:{i:0;s:21:"จอร์à¹à¸”น";}s:2:"JP";a:1:{i:0;s:21:"à¸à¸µà¹ˆà¸›à¸¸à¹ˆà¸™";}s:2:"KE";a:1:{i:0;s:15:"เคนยา";}s:2:"KG";a:1:{i:0;s:33:"คีร์à¸à¸´à¸‹à¸ªà¸–าน";}s:2:"KH";a:1:{i:0;s:21:"à¸à¸±à¸¡à¸žà¸¹à¸Šà¸²";}s:2:"KI";a:1:{i:0;s:21:"คิริบาส";}s:2:"KM";a:1:{i:0;s:21:"คอโมโรส";}s:2:"KP";a:1:{i:0;s:33:"เà¸à¸²à¸«à¸¥à¸µà¹€à¸«à¸™à¸·à¸­";}s:2:"KR";a:1:{i:0;s:27:"เà¸à¸²à¸«à¸¥à¸µà¹ƒà¸•à¹‰";}s:2:"KW";a:1:{i:0;s:15:"คูเวต";}s:2:"KY";a:1:{i:0;s:45:"หมู่เà¸à¸²à¸°à¹€à¸„ย์à¹à¸¡à¸™";}s:2:"KZ";a:1:{i:0;s:27:"คาซัคสถาน";}s:2:"LA";a:1:{i:0;s:9:"ลาว";}s:2:"LB";a:1:{i:0;s:21:"เลบานอน";}s:2:"LI";a:1:{i:0;s:33:"ลิà¸à¹€à¸•à¸™à¸ªà¹„ตน์";}s:2:"LK";a:1:{i:0;s:24:"ศรีลังà¸à¸²";}s:2:"LR";a:1:{i:0;s:24:"ไลบีเรีย";}s:2:"LS";a:1:{i:0;s:18:"เลโซโท";}s:2:"LT";a:1:{i:0;s:27:"ลิทัวเนีย";}s:2:"LU";a:1:{i:0;s:36:
"ลัà¸à¹€à¸‹à¸¡à¹€à¸šà¸´à¸£à¹Œà¸";}s:2:"LV";a:1:{i:0;s:21:"ลัตเวีย";}s:2:"LY";a:1:{i:0;s:18:"ลิเบีย";}s:2:"MA";a:1:{i:0;s:24:"โมร็อà¸à¹‚à¸";}s:2:"MC";a:1:{i:0;s:18:"โมนาโà¸";}s:2:"MD";a:1:{i:0;s:21:"มอลโดวา";}s:2:"MG";a:1:{i:0;s:33:"มาดาà¸à¸±à¸ªà¸à¸²à¸£à¹Œ";}s:2:"MK";a:1:{i:0;s:30:"มาซิโดเนีย";}s:2:"ML";a:1:{i:0;s:12:"มาลี";}s:2:"MM";a:1:{i:0;s:12:"พม่า";}s:2:"MN";a:1:{i:0;s:27:"มองโà¸à¹€à¸¥à¸µà¸¢";}s:2:"MO";a:1:{i:0;s:88:"มาเà¸à¹Šà¸² เขตปà¸à¸„รองพิเศษประเทศจีน";}s:2:"MQ";a:1:{i:0;s:27:"มาร์ตินีà¸";}s:2:"MR";a:1:{i:0;s:30:"มอริเตเนีย";}s:2:"MS";a:1:{i:0;s:39:"มอนต์เซร์à¹à¸£à¹‡à¸•";}s:2:"MT";a:1:{i:0;s:15:"มอลตา";}s:2:"MU";a:1:{i:0;s:27:"มอริเชียส";}s:2:"MW";a:1:{i:0;s:18:"มาลาวี";}s:2:"MX";a:1:{i:0;s:24:"เม็à¸à¸‹à¸´à¹‚à¸";}s:2:"MY";a:1:{i:0;s:24:"มาเลเซีย";}s:2:"MZ";a:1:{i:0;s:24:"โมà¹à¸‹à¸¡à¸šà¸´à¸„";}s:2:"NA";a:1:{i:0;s:24:"นามิเบีย";}s:2:"NC";a:1:{i:0;s:39:"นิวà¹à¸„ลีโดเนีย";}s:2:"NE";a:1:{i:0;s:21:"ไนเจอร์";}s:2:"NG";a:1:{i:0;s:24:"ไนจีเรีย";}s:2:"NI";a:1:{i:0;s:27:"นิคาราà¸à¸±à¸§";}s:2:"NL";a:1:{i:0;s:36:"เนเธอร์à¹à¸¥à¸™à¸”์";}s:2:"NO";a:1:{i:0;s:24:"นอร์เวย์";}s:2:"NP";a:1:{i:0;s:15:"เนปาล";}s:2:"NU";a:1:{i:0;s:12:"นียู";}s:2:"NZ";a:1:{i:0;s:30:"นิวซีà¹à¸¥à¸™à¸”์";}s:2:"OM";a:1:{i:0;s:15:"โอมาน";}s:2:"PA";a:1:{i:0;s:18:"ปานามา";}s:2:"PE";a:1:{i:0;s:12:"เปรู";}s:2:"PF";a:1:{i:0;s:48:"เฟรนช์โพลีนีเซีย";}s:2:"PG";a:1:{i:0;s:36:"ปาปัวนิวà¸à¸´à¸™à¸µ";}s:2:"PH";a:1:{i:0;s:30:"ฟิลิปปินส์";}s:2:"PK";a:1:{i:0;s:24:"ปาà¸à¸µà¸ªà¸–าน";}s:2:"PL";a:1:{i:0;s:21:"โปà¹à¸¥à¸™à¸”
์";}s:2:"PR";a:1:{i:0;s:33:"เปอร์โตริโà¸";}s:2:"PT";a:1:{i:0;s:24:"โปรตุเà¸à¸ª";}s:2:"PY";a:1:{i:0;s:24:"ปาราà¸à¸§à¸±à¸¢";}s:2:"QA";a:1:{i:0;s:18:"à¸à¸²à¸•à¸²à¸£à¹Œ";}s:2:"RO";a:1:{i:0;s:24:"โรมาเนีย";}s:2:"RU";a:1:{i:0;s:21:"รัสเซีย";}s:2:"RW";a:1:{i:0;s:18:"รวันดา";}s:2:"SB";a:1:{i:0;s:45:"หมู่เà¸à¸²à¸°à¹‚ซโลมอน";}s:2:"SC";a:1:{i:0;s:21:"เซเชลส์";}s:2:"SD";a:1:{i:0;s:15:"ซูดาน";}s:2:"SE";a:1:{i:0;s:18:"สวีเดน";}s:2:"SG";a:1:{i:0;s:24:"สิงคโปร์";}s:2:"SI";a:1:{i:0;s:27:"สโลวีเนีย";}s:2:"SK";a:1:{i:0;s:27:"สโลวาเà¸à¸µà¸¢";}s:2:"SL";a:1:{i:0;s:39:"เซียร์ราลีโอน";}s:2:"SM";a:1:{i:0;s:27:"ซานมารีโน";}s:2:"SN";a:1:{i:0;s:21:"เซเนà¸à¸±à¸¥";}s:2:"SO";a:1:{i:0;s:24:"โซมาเลีย";}s:2:"SP";a:1:{i:0;s:27:"เซอร์เบีย";}s:2:"SR";a:1:{i:0;s:21:"สุรินัม";}s:2:"SV";a:1:{i:0;s:36:"เอลซัลวาดอร์";}s:2:"SY";a:1:{i:0;s:18:"ซีเรีย";}s:2:"SZ";a:1:{i:0;s:30:"สวาซิà¹à¸¥à¸™à¸”์";}s:2:"TD";a:1:{i:0;s:9:"ชาด";}s:2:"TF";a:1:{i:0;s:72:"อาณาเขตทางใต้ของà¸à¸£à¸±à¹ˆà¸‡à¹€à¸¨à¸ª";}s:2:"TG";a:1:{i:0;s:12:"โตโà¸";}s:2:"TH";a:1:{i:0;s:27:"ประเทศไทย";}s:2:"TJ";a:1:{i:0;s:30:"ทาจิà¸à¸´à¸ªà¸–าน";}s:2:"TK";a:1:{i:0;s:18:"โทà¸à¸´à¹‚ล";}s:2:"TL";a:1:{i:0;s:42:"ติมอร์ตะวันออà¸";}s:2:"TM";a:1:{i:0;s:42:"เติร์à¸à¹€à¸¡à¸™à¸´à¸ªà¸–าน";}s:2:"TN";a:1:{i:0;s:24:"ตูนิเซีย";}s:2:"TO";a:1:{i:0;s:15:"ตองà¸à¸²";}s:2:"TR";a:1:{i:0;s:15:"ตุรà¸à¸µ";}s:2:"TT";a:1:{i:0;s:51:"ตรินิà¹à¸”ดà¹à¸¥à¸°à¹‚ตเบโà¸";}s:2:"TW";a:1:{i:0;s:21:"ไต้หวัน";}s:2:"TZ";a:1:{i:0;s:27:"ทานซาเนีย";}s:2:"UA";a:1:{i:0;s:18:"ยูเครน";}s:2:"UG";a:1
:{i:0;s:21:"อูà¸à¸²à¸™à¸”า";}s:2:"US";a:1:{i:0;s:36:"สหรัà¸à¸­à¹€à¸¡à¸£à¸´à¸à¸²";}s:2:"UY";a:1:{i:0;s:24:"อุรุà¸à¸§à¸±à¸¢";}s:2:"UZ";a:1:{i:0;s:33:"อุซเบà¸à¸´à¸ªà¸–าน";}s:2:"VC";a:1:{i:0;s:78:"เซนต์วินเซนต์à¹à¸¥à¸°à¹€à¸à¸£à¸™à¸²à¸”ีนส์";}s:2:"VE";a:1:{i:0;s:30:"เวเนซุเอลา";}s:2:"VG";a:1:{i:0;s:69:"บริทิชเวอร์จินไอส์à¹à¸¥à¸™à¸”์";}s:2:"VI";a:1:{i:0;s:66:"ยูเอสเวอร์จินไอส์à¹à¸¥à¸™à¸”์";}s:2:"VN";a:1:{i:0;s:24:"เวียดนาม";}s:2:"VU";a:1:{i:0;s:24:"วานูอาตู";}s:2:"WS";a:1:{i:0;s:15:"ซามัว";}s:2:"YE";a:1:{i:0;s:15:"เยเมน";}s:2:"YT";a:1:{i:0;s:15:"มายอต";}s:2:"YU";a:1:{i:0;s:33:"ยูโà¸à¸ªà¸¥à¸²à¹€à¸§à¸µà¸¢";}s:2:"ZA";a:1:{i:0;s:30:"à¹à¸­à¸Ÿà¸£à¸´à¸à¸²à¹ƒà¸•à¹‰";}s:2:"ZM";a:1:{i:0;s:21:"à¹à¸‹à¸¡à¹€à¸šà¸µà¸¢";}s:2:"ZW";a:1:{i:0;s:24:"ซิมบาบเว";}}s:10:"Currencies";a:1:{s:3:"THB";a:2:{i:0;s:3:"฿";i:1;s:9:"บาท";}}s:9:"Languages";a:139:{s:2:"aa";a:1:{i:0;s:12:"อาฟา";}s:2:"ab";a:1:{i:0;s:27:"à¹à¸­à¸šà¸à¸²à¹€à¸‹à¸µà¸¢";}s:2:"af";a:1:{i:0;s:24:"à¹à¸­à¸Ÿà¸£à¸´à¸à¸±à¸™";}s:2:"am";a:1:{i:0;s:24:"อัมฮาริค";}s:2:"ar";a:1:{i:0;s:21:"อาราบิค";}s:2:"as";a:1:{i:0;s:27:"อัสสัมมิส";}s:2:"ay";a:1:{i:0;s:18:"ไอมารา";}s:2:"az";a:1:{i:0;s:39:"อาเซอร์ไบจานี";}s:2:"ba";a:1:{i:0;s:27:"บาสช์à¸à¸µà¸£à¹Œ";}s:2:"be";a:1:{i:0;s:36:"บายโลรัสเซีย";}s:2:"bg";a:1:{i:0;s:27:"บัลà¹à¸à¹€à¸£à¸µà¸¢";}s:2:"bh";a:1:{i:0;s:18:"บิฮารี";}s:2:"bi";a:1:{i:0;s:21:"บิสลามา";}s:2:"bn";a:1:{i:0;s:21:"เบนà¸à¸²à¸£à¸µ";}s:2:"bo";a:1:{i:0;s:15:"ทิเบต";}s:2:"br";a:1:{i:0;s:18:"บรีทัน";}s:2:"ca";a:1:{i:0;s:21:"à¹à¸„ตาà¹à¸¥à¸™";}s:2:"co";a:1:{i:0;s:24:"คอร์ซิà¸à¸²";}s:2:"cs";a:1:{i:0;s:12:"เช็ค";}
s:2:"cy";a:1:{i:0;s:15:"เวลส์";}s:2:"da";a:1:{i:0;s:24:"เดนมาร์à¸";}s:2:"de";a:1:{i:0;s:21:"เยอรมัน";}s:2:"dz";a:1:{i:0;s:18:"ภูà¸à¸²à¸™à¸µ";}s:2:"el";a:1:{i:0;s:12:"à¸à¸£à¸µà¸";}s:2:"en";a:1:{i:0;s:18:"อังà¸à¸¤à¸©";}s:2:"eo";a:1:{i:0;s:33:"เอสเปอรันโต";}s:2:"es";a:1:{i:0;s:12:"สเปน";}s:2:"et";a:1:{i:0;s:27:"เอสโตเนีย";}s:2:"eu";a:1:{i:0;s:15:"à¹à¸šà¸ªà¸à¹Œ";}s:2:"fa";a:1:{i:0;s:27:"เปอร์เซีย";}s:2:"fi";a:1:{i:0;s:9:"ฟิน";}s:2:"fj";a:1:{i:0;s:12:"ฟิจิ";}s:2:"fo";a:1:{i:0;s:15:"ฟาโรส";}s:2:"fr";a:1:{i:0;s:24:"à¸à¸£à¸±à¹ˆà¸‡à¹€à¸¨à¸ª";}s:2:"fy";a:1:{i:0;s:27:"ฟรีสà¹à¸¥à¸™à¸”์";}s:2:"ga";a:1:{i:0;s:15:"ไอริช";}s:2:"gd";a:1:{i:0;s:36:"สà¸à¹‡à¸­à¸•à¸ªà¹Œà¹€à¸à¸¥à¸´à¸„";}s:2:"gl";a:1:{i:0;s:24:"à¸à¸°à¸¥à¸µà¹€à¸Šà¸µà¸¢";}s:2:"gn";a:1:{i:0;s:21:"à¸à¸±à¸§à¸£à¸²à¸™à¸µ";}s:2:"gu";a:1:{i:0;s:24:"à¸à¸¹à¸ˆà¸²à¸£à¸²à¸•à¸´";}s:2:"ha";a:1:{i:0;s:12:"โฮซา";}s:2:"he";a:1:{i:0;s:15:"ฮิบรู";}s:2:"hi";a:1:{i:0;s:15:"ฮินดี";}s:2:"hr";a:1:{i:0;s:27:"โครเอเทีย";}s:2:"hu";a:1:{i:0;s:21:"ฮังà¸à¸²à¸£à¸µ";}s:2:"hy";a:1:{i:0;s:30:"อาร์มีเนีย";}s:2:"ia";a:1:{i:0;s:42:"อินเตอร์ลิงà¸à¸§à¸²";}s:2:"id";a:1:{i:0;s:33:"อินโดนีเชีย";}s:2:"ie";a:1:{i:0;s:39:"อินเตอร์ลิงค์";}s:2:"ik";a:1:{i:0;s:27:"ไอนูเปียà¸";}s:2:"is";a:1:{i:0;s:36:"ไอซ์à¹à¸¥à¸™à¸”์ดิค";}s:2:"it";a:1:{i:0;s:18:"อิตาลี";}s:2:"iu";a:1:{i:0;s:30:"ไอนุà¸à¸•à¸´à¸•à¸±à¸—";}s:2:"ja";a:1:{i:0;s:21:"à¸à¸µà¹ˆà¸›à¸¸à¹ˆà¸™";}s:2:"jv";a:1:{i:0;s:9:"ชวา";}s:2:"ka";a:1:{i:0;s:27:"จอร์เจียน";}s:2:"kk";a:1:{i:0;s:15:"คาซัค";}s:2:"kl";a:1:{i:0;s:36:"à¸à¸£à¸µà¸™à¹à¸¥à¸™à¸”์ดิค";}s:2:"km";a:1:{i:0;s:12:"เขมร";}s:2:"kn";a:1:{i:0;s:18:"à¸à¸²à¸™à¸²à¸”า";}s:2:"ko";a:1:{i:0;s:18:"เà¸à
¸²à¸«à¸¥à¸µ";}s:2:"ks";a:1:{i:0;s:21:"คัชมีรี";}s:2:"ku";a:1:{i:0;s:12:"เคิด";}s:2:"ky";a:1:{i:0;s:24:"เคอร์à¸à¸´à¸‹";}s:2:"la";a:1:{i:0;s:15:"ละติน";}s:2:"ln";a:1:{i:0;s:21:"ลิงà¸à¸²à¸¥à¸²";}s:2:"lo";a:1:{i:0;s:9:"ลาว";}s:2:"lt";a:1:{i:0;s:27:"ลิธัวเนีย";}s:2:"lv";a:1:{i:0;s:48:"à¹à¸¥à¸•à¹€à¸§à¸µà¸¢ (เลททิสช์)";}s:2:"mg";a:1:{i:0;s:24:"มาลาà¸à¸²à¸‹à¸µ";}s:2:"mi";a:1:{i:0;s:15:"เมารี";}s:2:"mk";a:1:{i:0;s:30:"à¹à¸¡à¸‹à¸µà¹‚ดเนีย";}s:2:"ml";a:1:{i:0;s:27:"มาลายาลัม";}s:2:"mn";a:1:{i:0;s:18:"มองโà¸à¸¥";}s:2:"mo";a:1:{i:0;s:24:"โมดาเวีย";}s:2:"mr";a:1:{i:0;s:18:"มาราที";}s:2:"ms";a:1:{i:0;s:15:"มลายู";}s:2:"mt";a:1:{i:0;s:15:"มอลตา";}s:2:"my";a:1:{i:0;s:12:"พม่า";}s:2:"na";a:1:{i:0;s:12:"นอรู";}s:2:"ne";a:1:{i:0;s:15:"เนปาล";}s:2:"nl";a:1:{i:0;s:21:"ฮอลันดา";}s:2:"no";a:1:{i:0;s:24:"นอร์เวย์";}s:2:"oc";a:1:{i:0;s:24:"ออà¸à¸‹à¸´à¸—ัน";}s:2:"om";a:1:{i:0;s:36:"โอโรโม (อาฟาน)";}s:2:"or";a:1:{i:0;s:18:"โอริยา";}s:2:"pa";a:1:{i:0;s:18:"ปัà¸à¸ˆà¸²à¸›";}s:2:"pl";a:1:{i:0;s:21:"โปà¹à¸¥à¸™à¸”์";}s:2:"ps";a:1:{i:0;s:45:"พาสช์โต (พุสช์โต)";}s:2:"pt";a:1:{i:0;s:24:"โปรตุเà¸à¸ª";}s:2:"qu";a:1:{i:0;s:18:"คิวชัว";}s:2:"rm";a:1:{i:0;s:34:"เรโต-โรà¹à¸¡à¸™à¸‹à¹Œ";}s:2:"rn";a:1:{i:0;s:21:"คิรันดี";}s:2:"ro";a:1:{i:0;s:15:"โรมัน";}s:2:"ru";a:1:{i:0;s:21:"รัสเซีย";}s:2:"rw";a:1:{i:0;s:30:"คินยาวันดา";}s:2:"sa";a:1:{i:0;s:21:"สันสà¸à¸¤à¸•";}s:2:"sd";a:1:{i:0;s:15:"ซินดิ";}s:2:"sg";a:1:{i:0;s:15:"สันโค";}s:2:"sh";a:1:{i:0;s:52:"เซอร์โบ-โครเอเทียน";}s:2:"si";a:1:{i:0;s:15:"สิงหล";}s:2:"sk";a:1:{i:0;s:18:"สโลวัค";}s:2:"sl";a:1:{i:0;s:
27:"สโลเวเนีย";}s:2:"sm";a:1:{i:0;s:15:"ซามัว";}s:2:"sn";a:1:{i:0;s:12:"โซนา";}s:2:"so";a:1:{i:0;s:18:"โซมาลี";}s:2:"sq";a:1:{i:0;s:27:"à¹à¸­à¸¥à¹€à¸šà¹€à¸™à¸µà¸¢";}s:2:"sr";a:1:{i:0;s:27:"เซอร์เบีย";}s:2:"ss";a:1:{i:0;s:21:"ซีสวาติ";}s:2:"st";a:1:{i:0;s:18:"เซโสโท";}s:2:"su";a:1:{i:0;s:24:"ซันดานีส";}s:2:"sv";a:1:{i:0;s:18:"สวีเดน";}s:2:"sw";a:1:{i:0;s:21:"ซวาฮิรี";}s:2:"ta";a:1:{i:0;s:12:"ทมิฬ";}s:2:"te";a:1:{i:0;s:18:"ทิลูà¸à¸¹";}s:2:"tg";a:1:{i:0;s:15:"ทาจิค";}s:2:"th";a:1:{i:0;s:9:"ไทย";}s:2:"ti";a:1:{i:0;s:24:"ทิà¸à¸£à¸´à¸™à¸¢à¸²";}s:2:"tk";a:1:{i:0;s:27:"เติร์à¸à¹€à¸¡à¸™";}s:2:"tl";a:1:{i:0;s:24:"ตาà¸à¸²à¸¥à¹‡à¸­à¸";}s:2:"tn";a:1:{i:0;s:24:"เซตสวานา";}s:2:"to";a:1:{i:0;s:18:"ทองà¸à¹‰à¸²";}s:2:"tr";a:1:{i:0;s:15:"ตุรà¸à¸µ";}s:2:"ts";a:1:{i:0;s:15:"ซองà¸à¸²";}s:2:"tt";a:1:{i:0;s:9:"ตาด";}s:2:"tw";a:1:{i:0;s:9:"ทวี";}s:2:"ug";a:1:{i:0;s:18:"อุยà¸à¸±à¸§";}s:2:"uk";a:1:{i:0;s:18:"ยูเครน";}s:2:"ur";a:1:{i:0;s:15:"อิรดู";}s:2:"uz";a:1:{i:0;s:18:"อุสเบค";}s:2:"vi";a:1:{i:0;s:24:"เวียดนาม";}s:2:"vo";a:1:{i:0;s:21:"โวลาพุà¸";}s:2:"wo";a:1:{i:0;s:15:"วูลอฟ";}s:2:"xh";a:1:{i:0;s:12:"โซสา";}s:2:"yi";a:1:{i:0;s:15:"ยีดิช";}s:2:"yo";a:1:{i:0;s:18:"โยรูบา";}s:2:"za";a:1:{i:0;s:9:"จวง";}s:2:"zh";a:1:{i:0;s:9:"จีน";}s:2:"zu";a:1:{i:0;s:12:"ซูลู";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Thai";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:10:"boundaries";a:2:{s:4:"line";a:1:{i:0;s:7:"line_th";}s:4:"word";a:1:{i:0;s:7:"word_th";}}s:8:"calendar";a:2:{s:8:"buddhist";a:2:{s:16:"DateTimePatterns";a:9:{i:0;s:63:"H' นาฬิà¸à¸² 'm' นาที 'ss' วินาที'";i:1;s:39:"H' นาฬิà¸à¸² 'm' นาที'";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:29:"EEEE'ที่ 
'd MMMM G yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"d MMM yyyy";i:7;s:8:"d/M/yyyy";i:8;s:8:"{1}, {0}";}s:4:"eras";a:1:{s:11:"abbreviated";a:1:{i:0;s:8:"พ.ศ.";}}}s:9:"gregorian";a:5:{s:11:"AmPmMarkers";a:2:{i:0;s:30:"à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง";i:1;s:30:"หลังเที่ยง";}s:16:"DateTimePatterns";a:9:{i:0;s:63:"H' นาฬิà¸à¸² 'm' นาที 'ss' วินาที'";i:1;s:39:"H' นาฬิà¸à¸² 'm' นาที'";i:2;s:7:"H:mm:ss";i:3;s:4:"H:mm";i:4;s:29:"EEEE'ที่ 'd MMMM G yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"d MMM yyyy";i:7;s:8:"d/M/yyyy";i:8;s:8:"{1}, {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:7:"อา.";i:1;s:4:"จ.";i:2;s:4:"อ.";i:3;s:4:"พ.";i:4;s:7:"พฤ.";i:5;s:4:"ศ.";i:6;s:4:"ส.";}s:4:"wide";a:7:{i:0;s:30:"วันอาทิตย์";i:1;s:27:"วันจันทร์";i:2;s:27:"วันอังคาร";i:3;s:18:"วันพุธ";i:4;s:33:"วันพฤหัสบดี";i:5;s:24:"วันศุà¸à¸£à¹Œ";i:6;s:24:"วันเสาร์";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:54:"ปีà¸à¹ˆà¸­à¸™à¸„ริสต์à¸à¸²à¸¥à¸—ี่";i:1;s:8:"ค.ศ.";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:8:"ม.ค.";i:1;s:8:"à¸.พ.";i:2;s:11:"มี.ค.";i:3;s:11:"เม.ย.";i:4;s:8:"พ.ค.";i:5;s:11:"มิ.ย.";i:6;s:8:"à¸.ค.";i:7;s:8:"ส.ค.";i:8;s:8:"à¸.ย.";i:9;s:8:"ต.ค.";i:10;s:8:"พ.ย.";i:11;s:8:"ธ.ค.";}s:4:"wide";a:12:{i:0;s:18:"มà¸à¸£à¸²à¸„ม";i:1;s:30:"à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ";i:2;s:18:"มีนาคม";i:3;s:18:"เมษายน";i:4;s:21:"พฤษภาคม";i:5;s:24:"มิถุนายน";i:6;s:21:"à¸à¸£à¸à¸Žà¸²à¸„ม";i:7;s:21:"สิงหาคม";i:8;s:21:"à¸à¸±à¸™à¸¢à¸²à¸¢à¸™";i:9;s:18:"ตุลาคม";i:10;s:27:"พฤศจิà¸à¸²à¸¢à¸™";i:11;s:21:"ธันวาคม";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/th_TH.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/th_TH.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/th_TH.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;¤-#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/th_TH_TRADITIONAL.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/th_TH_TRADITIONAL.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/th_TH_TRADITIONAL.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:8:"calendar";a:1:{s:7:"default";a:1:{i:0;s:8:"buddhist";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ti.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ti.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ti.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:5:{s:15:"Countries:alias";a:1:{i:0;s:2:"am";}s:15:"Languages:alias";a:1:{i:0;s:2:"am";}s:12:"LocaleScript";a:1:{i:0;s:4:"Ethi";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:11:"AmPmMarkers";a:2:{i:0;s:19:"ንጉሆ ሰዓተ";i:1;s:19:"ድሕር ሰዓት";}s:26:"DateTimeElements:intvector";a:2:{i:0;i:7;i:1;i:1;}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:9:"ሰንበ";i:1;s:9:"ሰኑይ";i:2;s:9:"ሠሉስ";i:3;s:9:"ረቡዕ";i:4;s:9:"ኃሙስ";i:5;s:9:"ዓርቢ";i:6;s:9:"ቀዳáˆ";}s:4:"wide";a:7:{i:0;s:12:"ሰንበት";i:1;s:9:"ሰኑይ";i:2;s:9:"ሠሉስ";i:3;s:9:"ረቡዕ";i:4;s:9:"ኃሙስ";i:5;s:9:"ዓርቢ";i:6;s:9:"ቀዳáˆ";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:7:"á‹“/á‹“";i:1;s:7:"á‹“/áˆ";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:9:"ጃንዩ";i:1;s:9:"áŒá‰¥áˆ©";i:2;s:9:"ማርች";i:3;s:9:"ኤá•áˆ¨";i:4;s:6:"ሜይ";i:5;s:6:"áŒáŠ•";i:6;s:9:"áŒáˆ‹á‹­";i:7;s:9:"ኦገስ";i:8;s:9:"ሴá•á‰´";i:9;s:9:"ኦክተ";i:10;s:9:"ኖቬáˆ";i:11;s:9:"ዲሴáˆ";}s:4:"wide";a:12:{i:0;s:15:"ጃንዩወሪ";i:1;s:15:"áŒá‰¥áˆ©á‹ˆáˆª";i:2;s:9:"ማርች";i:3;s:12:"ኤá•áˆ¨áˆ";i:4;s:6:"ሜይ";i:5;s:6:"áŒáŠ•";i:6;s:9:"áŒáˆ‹á‹­";i:7;s:12:"ኦገስት";i:8;s:18:"ሴá•á‰´áˆá‰ áˆ­";i:9;s:18:"ኦክተá‹á‰ áˆ­";i:10;s:15:"ኖቬáˆá‰ áˆ­";i:11;s:15:"ዲሴáˆá‰ áˆ­";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ti_ER.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ti_ER.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ti_ER.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:10:"Currencies";a:2:{s:3:"ERN";a:2:{i:0;s:1:"$";i:1;s:3:"ERN";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:3:"USD";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:16:"DateTimePatterns";a:9:{i:0;s:9:"h:mm:ss a";i:1;s:9:"h:mm:ss a";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:35:"EEEEá¡ dd MMMM መዓáˆá‰² yyyy G";i:5;s:12:"dd MMMM yyyy";i:6;s:9:"dd-MMM-yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:9:"ሰንበ";i:1;s:9:"ሰኑይ";i:2;s:9:"ሰሉስ";i:3;s:9:"ረቡዕ";i:4;s:9:"ሓሙስ";i:5;s:9:"ዓርቢ";i:6;s:9:"ቀዳáˆ";}s:4:"wide";a:7:{i:0;s:12:"ሰንበት";i:1;s:9:"ሰኑይ";i:2;s:9:"ሰሉስ";i:3;s:9:"ረቡዕ";i:4;s:9:"ሓሙስ";i:5;s:9:"ዓርቢ";i:6;s:9:"ቀዳáˆ";}}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:6:"ጥሪ";i:1;s:9:"ለካቲ";i:2;s:9:"መጋቢ";i:3;s:9:"ሚያá‹";i:4;s:9:"áŒáŠ•á‰¦";i:5;s:6:"ሰáŠ";i:6;s:9:"ሓáˆáˆˆ";i:7;s:9:"áŠáˆ“ሰ";i:8;s:9:"መስከ";i:9;s:9:"ጥቅáˆ";i:10;s:9:"ሕዳር";i:11;s:9:"ታሕሳ";}s:4:"wide";a:12:{i:0;s:6:"ጥሪ";i:1;s:12:"ለካቲት";i:2;s:12:"መጋቢት";i:3;s:12:"ሚያá‹á‹«";i:4;s:12:"áŒáŠ•á‰¦á‰µ";i:5;s:6:"ሰáŠ";i:6;s:9:"ሓáˆáˆˆ";i:7;s:9:"áŠáˆ“ሰ";i:8;s:15:"መስከረáˆ";i:9;s:12:"ጥቅáˆá‰²";i:10;s:9:"ሕዳር";i:11;s:12:"ታሕሳስ";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ti_ET.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ti_ET.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/ti_ET.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:10:"Currencies";a:2:{s:3:"ETB";a:2:{i:0;s:1:"$";i:1;s:3:"ETB";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:3:"USD";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:9:"h:mm:ss a";i:1;s:9:"h:mm:ss a";i:2;s:9:"h:mm:ss a";i:3;s:6:"h:mm a";i:4;s:35:"EEEEᣠdd MMMM መዓáˆá‰² yyyy G";i:5;s:12:"dd MMMM yyyy";i:6;s:9:"dd-MMM-yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/tr.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/tr.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/tr.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:11:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:6:"Andora";}s:2:"AE";a:1:{i:0;s:26:"Birleşik Arap Emirlikleri";}s:2:"AF";a:1:{i:0;s:10:"Afganistan";}s:2:"AG";a:1:{i:0;s:18:"Antigua ve Barbuda";}s:2:"AI";a:1:{i:0;s:8:"Anguilla";}s:2:"AL";a:1:{i:0;s:10:"Arnavutluk";}s:2:"AM";a:1:{i:0;s:10:"Ermenistan";}s:2:"AN";a:1:{i:0;s:18:"Hollanda Antilleri";}s:2:"AO";a:1:{i:0;s:6:"Angola";}s:2:"AQ";a:1:{i:0;s:10:"Antarktika";}s:2:"AR";a:1:{i:0;s:8:"Arjantin";}s:2:"AS";a:1:{i:0;s:17:"Amerikan Samoası";}s:2:"AT";a:1:{i:0;s:9:"Avusturya";}s:2:"AU";a:1:{i:0;s:10:"Avustralya";}s:2:"AW";a:1:{i:0;s:5:"Aruba";}s:2:"AZ";a:1:{i:0;s:10:"Azerbaycan";}s:2:"BA";a:1:{i:0;s:12:"Bosna Hersek";}s:2:"BB";a:1:{i:0;s:8:"Barbados";}s:2:"BD";a:1:{i:0;s:10:"Bangladeş";}s:2:"BE";a:1:{i:0;s:8:"Belçika";}s:2:"BF";a:1:{i:0;s:12:"Burkina Faso";}s:2:"BG";a:1:{i:0;s:11:"Bulgaristan";}s:2:"BH";a:1:{i:0;s:7:"Bahreyn";}s:2:"BI";a:1:{i:0;s:7:"Burundi";}s:2:"BJ";a:1:{i:0;s:5:"Benin";}s:2:"BM";a:1:{i:0;s:7:"Bermuda";}s:2:"BN";a:1:{i:0;s:6:"Brunei";}s:2:"BO";a:1:{i:0;s:7:"Bolivya";}s:2:"BR";a:1:{i:0;s:8:"Brezilya";}s:2:"BS";a:1:{i:0;s:9:"Bahamalar";}s:2:"BT";a:1:{i:0;s:6:"Bhutan";}s:2:"BV";a:1:{i:0;s:13:"Bouvet Adası";}s:2:"BW";a:1:{i:0;s:8:"Botsvana";}s:2:"BY";a:1:{i:0;s:11:"Beyaz Rusya";}s:2:"BZ";a:1:{i:0;s:6:"Belize";}s:2:"CA";a:1:{i:0;s:6:"Kanada";}s:2:"CC";a:1:{i:0;s:24:"Cocos (Keeling) Adaları";}s:2:"CD";a:1:{i:0;s:28:"Kongo Demokratik Cumhuriyeti";}s:2:"CF";a:1:{i:0;s:23:"Orta Afrika Cumhuriyeti";}s:2:"CG";a:1:{i:0;s:5:"Kongo";}s:2:"CH";a:1:{i:0;s:9:"İsviçre";}s:2:"CI";a:1:{i:0;s:18:"Fildişi Sahilleri";}s:2:"CK";a:1:{i:0;s:13:"Cook Adaları";}s:2:"CL";a:1:{i:0;s:5:"Şili";}s:2:"CM";a:1:{i:0;s:7:"Kamerun";}s:2:"CN";a:1:{i:0;s:4:"Çin";}s:2:"CO";a:1:{i:0;s:9:"Kolombiya";}s:2:"CR";a:1:{i:0;s:10:"Kosta Rika";}s:2:"CU";a:1:{i:0;s:5:"Küba";}s:2:"CV";a:1:{i:0;s:10:"Cape Verde";}s:2:"CX";a:1:{i:0;s:16:"Christmas Adası";}s:2:"CY";a:1:{i:0;s:8:"Kıbrıs";}s:2:"CZ";a:1:{i:0;s:16:"Çek Cumhuriyeti";}s:2:"DE";a:1:{i:0;s:7:"Almanya";}s:2:"DJ";a:1:{i:0;s:6:"C
ibuti";}s:2:"DK";a:1:{i:0;s:9:"Danimarka";}s:2:"DM";a:1:{i:0;s:7:"Dominik";}s:2:"DO";a:1:{i:0;s:19:"Dominik Cumhuriyeti";}s:2:"DZ";a:1:{i:0;s:7:"Cezayir";}s:2:"EC";a:1:{i:0;s:7:"Ekvator";}s:2:"EE";a:1:{i:0;s:7:"Estonya";}s:2:"EG";a:1:{i:0;s:7:"Mısır";}s:2:"EH";a:1:{i:0;s:12:"Batı Sahara";}s:2:"ER";a:1:{i:0;s:6:"Eritre";}s:2:"ES";a:1:{i:0;s:8:"İspanya";}s:2:"ET";a:1:{i:0;s:8:"Etiyopya";}s:2:"FI";a:1:{i:0;s:10:"Finlandiya";}s:2:"FJ";a:1:{i:0;s:4:"Fiji";}s:2:"FK";a:1:{i:0;s:30:"Falkland Adaları (Malvinalar)";}s:2:"FM";a:1:{i:0;s:29:"Mikronezya Federal Eyaletleri";}s:2:"FO";a:1:{i:0;s:14:"Faroe Adaları";}s:2:"FR";a:1:{i:0;s:6:"Fransa";}s:2:"GA";a:1:{i:0;s:5:"Gabon";}s:2:"GB";a:1:{i:0;s:18:"Birleşik Krallık";}s:2:"GD";a:1:{i:0;s:7:"Granada";}s:2:"GE";a:1:{i:0;s:10:"Gürcistan";}s:2:"GF";a:1:{i:0;s:18:"Fransız Guyanası";}s:2:"GH";a:1:{i:0;s:4:"Gana";}s:2:"GI";a:1:{i:0;s:12:"Cebelitarık";}s:2:"GL";a:1:{i:0;s:9:"Grönland";}s:2:"GM";a:1:{i:0;s:6:"Gambia";}s:2:"GN";a:1:{i:0;s:4:"Gine";}s:2:"GP";a:1:{i:0;s:10:"Guadeloupe";}s:2:"GQ";a:1:{i:0;s:14:"Ekvator Ginesi";}s:2:"GR";a:1:{i:0;s:10:"Yunanistan";}s:2:"GS";a:1:{i:0;s:42:"Güney Georgia ve Güney Sandwich Adaları";}s:2:"GT";a:1:{i:0;s:9:"Guatemala";}s:2:"GU";a:1:{i:0;s:4:"Guam";}s:2:"GW";a:1:{i:0;s:11:"Gine-Bissau";}s:2:"GY";a:1:{i:0;s:6:"Guyana";}s:2:"HK";a:1:{i:0;s:20:"Hong Kong SAR - Çin";}s:2:"HM";a:1:{i:0;s:33:"Heard Adası ve McDonald Adaları";}s:2:"HN";a:1:{i:0;s:8:"Honduras";}s:2:"HR";a:1:{i:0;s:12:"Hırvatistan";}s:2:"HT";a:1:{i:0;s:5:"Haiti";}s:2:"HU";a:1:{i:0;s:10:"Macaristan";}s:2:"ID";a:1:{i:0;s:9:"Endonezya";}s:2:"IE";a:1:{i:0;s:8:"İrlanda";}s:2:"IL";a:1:{i:0;s:7:"İsrail";}s:2:"IN";a:1:{i:0;s:9:"Hindistan";}s:2:"IO";a:1:{i:0;s:31:"Hint Okyanusu İngiliz Bölgesi";}s:2:"IQ";a:1:{i:0;s:4:"Irak";}s:2:"IR";a:1:{i:0;s:5:"İran";}s:2:"IS";a:1:{i:0;s:8:"İzlanda";}s:2:"IT";a:1:{i:0;s:7:"İtalya";}s:2:"JM";a:1:{i:0;s:7:"Jamaika";}s:2:"JO";a:1:{i:0;s:7:"Ürdün";}s:2:"JP";a:1:{i:0;s:7:"Japonya";}s:2:"KE";a:1:{i:0;s:5:"Kenya";}s:2:"KG";a:1:{i:0;s:13:"K
ırgızistan";}s:2:"KH";a:1:{i:0;s:9:"Kamboçya";}s:2:"KI";a:1:{i:0;s:8:"Kiribati";}s:2:"KM";a:1:{i:0;s:8:"Komorlar";}s:2:"KN";a:1:{i:0;s:24:"Saint Kittler ve Neviler";}s:2:"KP";a:1:{i:0;s:10:"Kuzey Kore";}s:2:"KR";a:1:{i:0;s:11:"Güney Kore";}s:2:"KW";a:1:{i:0;s:6:"Kuveyt";}s:2:"KY";a:1:{i:0;s:15:"Kayman Adaları";}s:2:"KZ";a:1:{i:0;s:10:"Kazakistan";}s:2:"LA";a:1:{i:0;s:4:"Laos";}s:2:"LB";a:1:{i:0;s:7:"Lübnan";}s:2:"LC";a:1:{i:0;s:11:"Saint Lucia";}s:2:"LI";a:1:{i:0;s:13:"Liechtenstein";}s:2:"LK";a:1:{i:0;s:9:"Sri Lanka";}s:2:"LR";a:1:{i:0;s:7:"Liberya";}s:2:"LS";a:1:{i:0;s:7:"Lesotho";}s:2:"LT";a:1:{i:0;s:8:"Litvanya";}s:2:"LU";a:1:{i:0;s:11:"Lüksemburg";}s:2:"LV";a:1:{i:0;s:7:"Letonya";}s:2:"LY";a:1:{i:0;s:5:"Libya";}s:2:"MA";a:1:{i:0;s:3:"Fas";}s:2:"MC";a:1:{i:0;s:6:"Monako";}s:2:"MD";a:1:{i:0;s:20:"Moldovya Cumhuriyeti";}s:2:"MG";a:1:{i:0;s:10:"Madagaskar";}s:2:"MH";a:1:{i:0;s:17:"Marshall Adaları";}s:2:"MK";a:1:{i:0;s:21:"Makedonya Cumhuriyeti";}s:2:"ML";a:1:{i:0;s:4:"Mali";}s:2:"MM";a:1:{i:0;s:7:"Myanmar";}s:2:"MN";a:1:{i:0;s:11:"Moğolistan";}s:2:"MO";a:1:{i:0;s:17:"Makao S.A.R. Çin";}s:2:"MP";a:1:{i:0;s:22:"Kuzey Mariana Adaları";}s:2:"MQ";a:1:{i:0;s:8:"Martinik";}s:2:"MR";a:1:{i:0;s:9:"Moritanya";}s:2:"MS";a:1:{i:0;s:10:"Montserrat";}s:2:"MT";a:1:{i:0;s:5:"Malta";}s:2:"MU";a:1:{i:0;s:9:"Mauritius";}s:2:"MV";a:1:{i:0;s:9:"Maldivler";}s:2:"MW";a:1:{i:0;s:6:"Malavi";}s:2:"MX";a:1:{i:0;s:7:"Meksika";}s:2:"MY";a:1:{i:0;s:7:"Malezya";}s:2:"MZ";a:1:{i:0;s:8:"Mozambik";}s:2:"NA";a:1:{i:0;s:7:"Namibya";}s:2:"NC";a:1:{i:0;s:14:"Yeni Kaledonya";}s:2:"NE";a:1:{i:0;s:5:"Nijer";}s:2:"NF";a:1:{i:0;s:14:"Norfolk Adası";}s:2:"NG";a:1:{i:0;s:7:"Nijerya";}s:2:"NI";a:1:{i:0;s:9:"Nikaragua";}s:2:"NL";a:1:{i:0;s:8:"Hollanda";}s:2:"NO";a:1:{i:0;s:7:"Norveç";}s:2:"NP";a:1:{i:0;s:5:"Nepal";}s:2:"NR";a:1:{i:0;s:12:"Nauru Adası";}s:2:"NU";a:1:{i:0;s:13:"Niue Adaları";}s:2:"NZ";a:1:{i:0;s:12:"Yeni Zelanda";}s:2:"OM";a:1:{i:0;s:5:"Umman";}s:2:"PA";a:1:{i:0;s:6:"Panama";}s:2:"PE";a:1:{i:0;s:4:"Peru";}s:2:"PF";a:1:{i:0;s:21
:"Fransız Polinezyası";}s:2:"PG";a:1:{i:0;s:15:"Papua Yeni Gine";}s:2:"PH";a:1:{i:0;s:10:"Filipinler";}s:2:"PK";a:1:{i:0;s:8:"Pakistan";}s:2:"PL";a:1:{i:0;s:7:"Polonya";}s:2:"PM";a:1:{i:0;s:24:"Saint Pierre ve Miquelon";}s:2:"PN";a:1:{i:0;s:8:"Pitcairn";}s:2:"PR";a:1:{i:0;s:10:"Porto Riko";}s:2:"PS";a:1:{i:0;s:17:"Filistin Bölgesi";}s:2:"PT";a:1:{i:0;s:8:"Portekiz";}s:2:"PW";a:1:{i:0;s:5:"Palau";}s:2:"PY";a:1:{i:0;s:8:"Paraguay";}s:2:"QA";a:1:{i:0;s:5:"Katar";}s:2:"RE";a:1:{i:0;s:7:"Reunion";}s:2:"RO";a:1:{i:0;s:7:"Romanya";}s:2:"RU";a:1:{i:0;s:17:"Rusya Federasyonu";}s:2:"RW";a:1:{i:0;s:6:"Ruanda";}s:2:"SA";a:1:{i:0;s:15:"Suudi Arabistan";}s:2:"SB";a:1:{i:0;s:16:"Solomon Adaları";}s:2:"SC";a:1:{i:0;s:10:"Seyşeller";}s:2:"SD";a:1:{i:0;s:5:"Sudan";}s:2:"SE";a:1:{i:0;s:7:"İsveç";}s:2:"SG";a:1:{i:0;s:8:"Singapur";}s:2:"SH";a:1:{i:0;s:12:"Saint Helena";}s:2:"SI";a:1:{i:0;s:8:"Slovenya";}s:2:"SJ";a:1:{i:0;s:21:"Svalbard ve Jan Mayen";}s:2:"SK";a:1:{i:0;s:8:"Slovakya";}s:2:"SL";a:1:{i:0;s:12:"Sierra Leone";}s:2:"SM";a:1:{i:0;s:10:"San Marino";}s:2:"SN";a:1:{i:0;s:7:"Senegal";}s:2:"SO";a:1:{i:0;s:6:"Somali";}s:2:"SP";a:1:{i:0;s:10:"Sırbistan";}s:2:"SR";a:1:{i:0;s:7:"Surinam";}s:2:"ST";a:1:{i:0;s:20:"Sao Tome ve Principe";}s:2:"SV";a:1:{i:0;s:11:"El Salvador";}s:2:"SY";a:1:{i:0;s:6:"Suriye";}s:2:"SZ";a:1:{i:0;s:9:"Svaziland";}s:2:"TC";a:1:{i:0;s:24:"Turks ve Caicos Adaları";}s:2:"TD";a:1:{i:0;s:4:"Çad";}s:2:"TF";a:1:{i:0;s:26:"Fransız Güney Bölgeleri";}s:2:"TG";a:1:{i:0;s:4:"Togo";}s:2:"TH";a:1:{i:0;s:7:"Tayland";}s:2:"TJ";a:1:{i:0;s:10:"Tacikistan";}s:2:"TK";a:1:{i:0;s:7:"Tokelau";}s:2:"TL";a:1:{i:0;s:11:"Doğu Timor";}s:2:"TM";a:1:{i:0;s:13:"Türkmenistan";}s:2:"TN";a:1:{i:0;s:5:"Tunus";}s:2:"TO";a:1:{i:0;s:5:"Tonga";}s:2:"TR";a:1:{i:0;s:8:"Türkiye";}s:2:"TT";a:1:{i:0;s:18:"Trinidad ve Tobago";}s:2:"TV";a:1:{i:0;s:6:"Tuvalu";}s:2:"TW";a:1:{i:0;s:6:"Tayvan";}s:2:"TZ";a:1:{i:0;s:8:"Tanzanya";}s:2:"UA";a:1:{i:0;s:7:"Ukrayna";}s:2:"UG";a:1:{i:0;s:6:"Uganda";}s:2:"UM";a:1:{i:0;s:52:"Amerika Birleşik Devletler
i Küçük Dış Adaları";}s:2:"US";a:1:{i:0;s:28:"Amerika Birleşik Devletleri";}s:2:"UY";a:1:{i:0;s:7:"Uruguay";}s:2:"UZ";a:1:{i:0;s:11:"Özbekistan";}s:2:"VA";a:1:{i:0;s:38:"Kutsal Devlet (Vatikan Şehir Devleti)";}s:2:"VC";a:1:{i:0;s:28:"Saint Vincent ve Grenadinler";}s:2:"VE";a:1:{i:0;s:9:"Venezuela";}s:2:"VG";a:1:{i:0;s:24:"İngiliz Virgin Adaları";}s:2:"VI";a:1:{i:0;s:19:"ABD Virgin Adaları";}s:2:"VN";a:1:{i:0;s:7:"Vietnam";}s:2:"VU";a:1:{i:0;s:7:"Vanuatu";}s:2:"WF";a:1:{i:0;s:16:"Wallis ve Futuna";}s:2:"WS";a:1:{i:0;s:5:"Samoa";}s:2:"YE";a:1:{i:0;s:5:"Yemen";}s:2:"YT";a:1:{i:0;s:7:"Mayotte";}s:2:"YU";a:1:{i:0;s:10:"Yugoslavya";}s:2:"ZA";a:1:{i:0;s:13:"Güney Afrika";}s:2:"ZM";a:1:{i:0;s:7:"Zambiya";}s:2:"ZW";a:1:{i:0;s:8:"Zimbabwe";}}s:10:"Currencies";a:380:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:14:"Andora Dinarı";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:16:"Andora Pezetası";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:34:"Birleşik Arap Emirlikleri Dirhemi";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:31:"Afganistan Afganisi (1927-2002)";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:19:"Afganistan Afganisi";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:27:"Afarlar ve İssalar Frangı";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:27:"Arnavutluk Leki (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:15:"Arnavutluk Leki";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:22:"Arnavutluk Leki Valute";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:19:"Arnavut Doları FEC";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:17:"Ermenistan Dramı";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:26:"Hollanda Antilleri Guldeni";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:16:"Angola Kvanzası";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:28:"Angola Kvanzası (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:33:"Yeni Angola Kvanzası (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:39:"Angola Kvanzası Reajustado (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:16:"Angola Esküdosu";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:17:"Arjantin Australi";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:31:"Arjantin Pezosu Moneda Nacional";}s:3:"ARP";a:2:{i:0;s:
3:"ARP";i:1;s:27:"Arjantin Pezosu (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:15:"Arjantin Pezosu";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:17:"Avusturya Şilini";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:18:"Avustralya Doları";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:18:"Avustralya Lirası";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:13:"Aruba Florini";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:18:"Azerbaycan Manatı";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:20:"Bosna Hersek Dinarı";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:30:"Konvertibl Bosna Hersek Markı";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:25:"Yeni Bosna Hersek Dinarı";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:16:"Barbados Doları";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:18:"Bangladeş Takası";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:29:"Belçika Frangı (konvertibl)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:16:"Belçika Frangı";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:27:"Belçika Frangı (finansal)";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:21:"Bulgar Levası (Hard)";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:24:"Sosyalist Bulgar Levası";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:19:"Yeni Bulgar Levası";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:26:"Bulgar Levası (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:18:"Bulgar Levası FEC";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:15:"Bahreyn Dinarı";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:15:"Burundi Frangı";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:15:"Bermuda Doları";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:15:"Bermuda Lirası";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:14:"Brunei Doları";}s:3:"BOB";a:2:{i:0;s:2:"Bs";i:1;s:19:"Bolivya Bolivyanosu";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:31:"Bolivya Bolivyanosu (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:14:"Bolivya Pezosu";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:13:"Bolivya Mvdol";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:36:"Yeni Brezilya Kruzeirosu (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:18:"Brezilya Kruzadosu";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:31:"Brezilya Kruzeirosu (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:14:"Brezilya Reali";}s:3:"BRN";a:2:{i:0;s:3
:"BRN";i:1;s:23:"Yeni Brezilya Kruzadosu";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:19:"Brezilya Kruzeirosu";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:31:"Brezilya Kruzeirosu (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:14:"Bahama Doları";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:14:"Bahama Lirası";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:16:"Bhutan Ngultrumu";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:13:"Bhutan Rupisi";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:12:"Burma Kyatı";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:12:"Burma Rupisi";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:16:"Botsvana Pulası";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:36:"Yeni Beyaz Rusya Rublesi (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:31:"Beyaz Rusya Rublesi (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:19:"Beyaz Rusya Rublesi";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:14:"Belize Doları";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:27:"İngiliz Hondurası Doları";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:14:"Kanada Doları";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:13:"Kongo Frangı";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:25:"Kongo Cumhuriyeti Frangı";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:13:"Kongo Zairesi";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:31:"Orta Afrika Cumhuriyeti Frangı";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:17:"İsviçre Frangı";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:21:"Cook Adaları Doları";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:12:"Şili Condor";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:15:"Şili Esküdosu";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:25:"Şili Unidades de Fomento";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:12:"Şili Pezosu";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:19:"Kamerun CFA Frangı";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:24:"Çin Jen Min Piao Yuanı";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:20:"Çin ABD Doları FEC";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:20:"Çin Yuanı Renminbi";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:24:"Kolombiya Kağıt Pezosu";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:17:"Kongo CFA Frangı";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:16:"Kolombiya Pezosu";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:17:"Kosta Rika Ko
lonu";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:21:"Çekoslavak Korunası";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:28:"Çekoslavak Korunası (Hard)";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:12:"Küba Pezosu";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:9:"Küba FEC";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:20:"Cape Verde Esküdosu";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:15:"Kurasao Florini";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:23:"Güney Kıbrıs Lirası";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:26:"Çek Cumhuriyeti Korunası";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:18:"Doğu Alman Markı";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:12:"Alman Markı";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:15:"Alman Sperrmark";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:14:"Cibuti Frangı";}s:3:"DKK";a:2:{i:0;s:3:"DKr";i:1;s:15:"Danimarka Kronu";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:14:"Dominik Pezosu";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:15:"Cezayir Dinarı";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:20:"Yeni Cezayir Frangı";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:26:"Cezayir Frangı (Germinal)";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:15:"Ekvator Sukresi";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:39:"Ekvator Unidad de Valor Constante (UVC)";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:13:"Estonya Krunu";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:15:"Mısır Lirası";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:15:"Eritre Nakfası";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:19:"İspanyol Pezetası";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:14:"Etiyopya Birri";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:16:"Etiyopya Doları";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:4:"Euro";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:13:"Fin Markkası";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:25:"Fin Markkası (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:12:"Fiji Doları";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:12:"Fiji Lirası";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:25:"Falkland Adaları Lirası";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:20:"Faroe Adaları Kronu";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:16:"Fransız Frangı";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:42:"Fransız Frangı (Germinal/Franc Poincare)";
}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:17:"Gabon CFA Frangı";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:17:"İngiliz Sterlini";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:23:"Gürcistan Kupon Larisi";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:17:"Gürcistan Larisi";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:11:"Gana Sedisi";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:16:"Eski Gana Sedisi";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:12:"Gana Lirası";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:16:"Yeni Gana Sedisi";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:20:"Cebelitarık Lirası";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:15:"Grönland Kronu";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:16:"Gambiya Dalasisi";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:15:"Gambiya Lirası";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:12:"Gine Frangı";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:24:"Gine Frangı (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:9:"Gine Syli";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:18:"Guadeloupe Frangı";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:23:"Ekvator Ginesi Ekuelesi";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:22:"Ekvator Ginesi Frangı";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:24:"Ekvator Ginesi Pezetası";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:14:"Yunan Drahmisi";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:19:"Yeni Yunan Drahmisi";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:17:"Guatemala Ketzali";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:26:"Fransız Guyanası Frangı";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:25:"Portekiz Ginesi Esküdosu";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:24:"Portekiz Ginesi Mil Reis";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:18:"Gine-Bissau Pezosu";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:14:"Guyana Doları";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:17:"Hong Kong Doları";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:19:"Honduras Lempirası";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:15:"Hırvat Dinarı";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:15:"Hırvat Kunası";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:11:"Haiti Gurdu";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:13:"Macar Forinti";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:22:"Kuzey İrlanda Lirası";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:
1;s:22:"Endonezya Nica Florini";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:23:"Endonezya Java Rupiahı";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:23:"Yeni Endonezya Rupiahı";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:18:"Endonezya Rupiahı";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s:16:"İrlanda Lirası";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:15:"İsrail Şekeli";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:15:"İsrail Lirası";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:20:"Yeni İsrail Şekeli";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:19:"Man Adası Sterlini";}s:3:"INR";a:2:{i:0;s:3:"INR";i:1;s:16:"Hindistan Rupisi";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:12:"Irak Dinarı";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:12:"İran Riyali";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:14:"İzlanda Kronu";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:15:"İtalyan Lireti";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:15:"Jersey Sterlini";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:15:"Jamaika Doları";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:15:"Jamaika Lirası";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:15:"Ürdün Dinarı";}s:3:"JPY";a:2:{i:0;s:2:"¥";i:1;s:10:"Japon Yeni";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:13:"Kenya Şilini";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:13:"Kırgız Somu";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:20:"Eski Kamboçya Rieli";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:15:"Kamboçya Rieli";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:16:"Kiribati Doları";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:16:"Komorlar Frangı";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:32:"Kuzey Kore Halk Cumhuriyeti Wonu";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:15:"Kuzey Kore Wonu";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:18:"Güney Kore Hwanı";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:21:"Eski Güney Kore Wonu";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:16:"Güney Kore Wonu";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:14:"Kuveyt Dinarı";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:23:"Kayman Adaları Doları";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:18:"Kazakistan Rublesi";}s:3:"KZT";a:2:{i:0;s:1:"T";i:1;s:18:"Kazakistan Tengesi";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:9:"Laos Kipi";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;
s:15:"Lübnan Lirası";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:21:"Liechtenstein Frangı";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:16:"Sri Lanka Rupisi";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:13:"Seylan Rupisi";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:15:"Liberya Doları";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:14:"Lesotho Lotisi";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:16:"Litvanya Litası";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:15:"Litvanya Talonu";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:19:"Lüksemburg Frangı";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:13:"Letonya Latı";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:15:"Letonya Rublesi";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:39:"Libya İngiliz Askeri Yönetimi Lirası";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:13:"Libya Dinarı";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:13:"Libya Lirası";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:11:"Fas Dirhemi";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:11:"Fas Frangı";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:16:"Yeni Fas Frangı";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:22:"Fas Frangı (Germinal)";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:20:"Moldova Leyi (Cupon)";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:12:"Moldova Leyi";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:23:"Moldova Rublesi (Cupon)";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:17:"Madagaskar Ariary";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:18:"Madagaskar Frangı";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:25:"Marshall Adaları Doları";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:17:"Makedonya Dinarı";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:29:"Makedonya Dinarı (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:12:"Mali Frangı";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:14:"Myanmar Kyatı";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:19:"Myanmar Doları FEC";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:14:"Moğol Tugriki";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:15:"Makao Patacası";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:16:"Martinik Frangı";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:20:"Moritanya Ouguiyası";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:13:"Malta Lirası";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:13:"Malta Lirası";}s:3:"MUR";a:2:{i:0;
s:3:"MUR";i:1;s:16:"Mauritius Rupisi";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:22:"Maldiv Adaları Rupisi";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:23:"Maldiv Adaları Rufiyaa";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:16:"Malavi Kvaçası";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:14:"Malavi Lirası";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:14:"Meksika Pezosu";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:35:"Gümüş Meksika Pezosu (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:33:"Meksika Unidad de Inversion (UDI)";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:15:"Malezya Ringiti";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:18:"Mozambik Esküdosu";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:18:"Mozambik Meticalı";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:15:"Namibya Doları";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:33:"Yeni Kaledonya Frangı (Germinal)";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:16:"Nijerya Nairası";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:15:"Nijerya Lirası";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:26:"Yeni Hebridler CFP Frangı";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:20:"Nikaragua Kordobası";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:27:"Altın Nikaragua Kordobası";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:26:"Nikaragua Kordobası (Oro)";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:16:"Hollanda Florini";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:13:"Norveç Kronu";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:12:"Nepal Rupisi";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:20:"Yeni Zelanda Doları";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:20:"Yeni Zelanda Lirası";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:12:"Umman Riyali";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:20:"Umman Riyali (Saidi)";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:16:"Panama Balboası";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:30:"Transdniestria Rublesi (Kupon)";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:27:"Yeni Transdniestria Rublesi";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:22:"Transdniestria Rublesi";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:10:"Peru İnti";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:14:"Yeni Peru Solu";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:9:"Peru Solu";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:23:"Papu
a Yeni Gine Kinası";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:17:"Filipinler Pezosu";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:15:"Pakistan Rupisi";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:15:"Polonya Zlotisi";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:23:"Polonya ABD Doları FEC";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:27:"Polonya Zlotisi (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:16:"Filistin Lirası";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:14:"Portekiz Conto";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:18:"Portekiz Esküdosu";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:18:"Paraguay Guaranisi";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:12:"Katar Riyali";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:15:"Reunion Frangı";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:10:"Romen Leyi";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:15:"Yeni Romen Leyi";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:11:"Rus Rublesi";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:23:"Rus Rublesi (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:14:"Ruanda Frangı";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:22:"Suudi Arabistan Riyali";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:34:"Suudi Arabistan Riyali (Sovereign)";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:24:"Solomon Adaları Doları";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:17:"Seyşeller Rupisi";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:13:"Sudan Dinarı";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:13:"Sudan Lirası";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:13:"İsveç Kronu";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:16:"Singapur Doları";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:20:"Saint Helena Lirası";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:23:"Slovenya Toları (Bons)";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:16:"Slovenya Toları";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:16:"Slovak Korunası";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:20:"Sierra Leone Leonesi";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:18:"San Marino Lirası";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:14:"Somali Şilini";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:18:"Somaliland Şilini";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:15:"Surinam Guldeni";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:17:"İskoçya Lirası";}s:3:"STD
";a:2:{i:0;s:2:"Db";i:1;s:29:"Sao Tome ve Principe Dobrası";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:30:"Sao Tome ve Principe Esküdosu";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:19:"Yeni Sovyet Rublesi";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:14:"Sovyet Rublesi";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:18:"El Salvador Kolonu";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:14:"Suriye Lirası";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:21:"Swaziland Lilangenisi";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:31:"Turks ve Caicos Adaları Crownu";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:16:"Çad CFA Frangı";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:14:"Tayland Bahtı";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:18:"Tacikistan Rublesi";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:19:"Tacikistan Somonisi";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:21:"Türkmenistan Manatı";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:13:"Tunus Dinarı";}s:3:"TOP";a:2:{i:0;s:2:"T$";i:1;s:17:"Tonga Paʻangası";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:14:"Tonga Sterlini";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:15:"Timor Esküdosu";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:15:"Timor Patacası";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:13:"Türk Lirası";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:26:"Trinidad ve Tobago Doları";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:31:"Eski Trinidad ve Tobago Doları";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:14:"Tuvalu Doları";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:19:"Yeni Tayvan Doları";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:16:"Tanzanya Şilini";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:17:"Ukrayna Grivnası";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:19:"Ukrayna Karbovanetz";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:26:"Uganda Şilini (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:14:"Uganda Şilini";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:11:"ABD Doları";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:25:"ABD Doları (Ertesi gün)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:24:"ABD Doları (Aynı gün)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:23:"Uruguay Pezosu (Fuerte)";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:26:"Uruguay Pezosu (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1
;s:25:"Uruguay Pezosu (Uruguayo)";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:25:"Özbekistan Sumu (Coupon)";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:16:"Özbekistan Sumu";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:30:"Vatikan Şehir Devleti Lirası";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:31:"Kuzey Vietnam Piastre Dong Viet";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:24:"Yeni Kuzey Vietnam Dongu";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:41:"Kuzey Vietnam Viet Minh Piastre Dong Viet";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:19:"Venezuela Bolivarı";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:32:"İngiliz Virgin Adaları Doları";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:13:"Vietnam Dongu";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:18:"Yeni Vietnam Dongu";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:25:"Vietnam Cumhuriyeti Dongu";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:20:"Vietnam Ulusal Dongu";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:14:"Vanuatu Vatusu";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:19:"Batı Samoa Lirası";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:19:"Batı Samoa Talası";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:25:"Asya Hesap Birimi Dinarı";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:16:"CFA Frangı BEAC";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:16:"Asya Para Birimi";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:6:"Altın";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:23:"Birleşik Avrupa Birimi";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:18:"Avrupa Para Birimi";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:25:"Avrupa Hesap Birimi (XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:25:"Avrupa Hesap Birimi (XBD)";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:21:"Doğu Karayip Doları";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:14:"CFA Yeni Frank";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:25:"Özel Çekme Hakkı (SDR)";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:16:"CFA Frank BCEAEC";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:18:"Avrupa Para Birimi";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:23:"Fransız Altın Frangı";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:20:"Fransız UIC-Frangı";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:14:"İslam Dinarı";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:23:"Ana Fransa yeni Frangı"
;}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:30:"Fransız Antilleri CFA Frangı";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:17:"CFA Frangı BCEAO";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:11:"CFP Frangı";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:35:"COMECON Transfer Edilebilir Rublesi";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:13:"Yemen Dinarı";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:20:"Yemen Riyali (Imadi)";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:12:"Yemen Riyali";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:23:"Yugoslav Dinarı (Hard)";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:28:"Yugoslav Federasyonu Dinarı";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:21:"Yugoslav 1994 Dinarı";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:21:"Yeni Yugoslav Dinarı";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:27:"Konvertibl Yugoslav Dinarı";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:21:"Yugoslav Ekim Dinarı";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:27:"Yugoslav Dinarı (Reformed)";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:31:"Güney Afrika Randı (finansal)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:21:"Güney Afrika Lirası";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:20:"Güney Afrika Randı";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:17:"Zambiya Kvaçası";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:15:"Zambiya Lirası";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:18:"Yeni Zaire Zairesi";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:13:"Zaire Zairesi";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:16:"Zimbabwe Doları";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:6:"Takvim";}s:9:"collation";a:1:{i:0;s:9:"Sıralama";}s:8:"currency";a:1:{i:0;s:11:"Para Birimi";}}s:9:"Languages";a:138:{s:2:"aa";a:1:{i:0;s:4:"Afar";}s:2:"ab";a:1:{i:0;s:6:"Abazca";}s:2:"af";a:1:{i:0;s:13:"Afrikaan Dili";}s:2:"am";a:1:{i:0;s:7:"Amharik";}s:2:"ar";a:1:{i:0;s:7:"Arapça";}s:2:"ay";a:1:{i:0;s:6:"Aymara";}s:2:"az";a:1:{i:0;s:7:"Azerice";}s:2:"ba";a:1:{i:0;s:14:"Başkırt Dili";}s:2:"be";a:1:{i:0;s:12:"Beyaz Rusça";}s:2:"bg";a:1:{i:0;s:8:"Bulgarca";}s:2:"bh";a:1:{i:0;s:6:"Bihari";}s:2:"bi";a:1:{i:0;s:7:"Bislama";}s:2:"bn";a:1:{i:0;s:11:"Bengal Dili";}s:2:"bo";a:1:{i:0;s:8:"Tibetçe";}s:2:"br";a:1:{i:0;
s:11:"Breton Dili";}s:2:"ca";a:1:{i:0;s:12:"Katalan Dili";}s:2:"co";a:1:{i:0;s:12:"Korsika Dili";}s:2:"cs";a:1:{i:0;s:7:"Çekçe";}s:2:"cy";a:1:{i:0;s:8:"Gal Dili";}s:2:"da";a:1:{i:0;s:5:"Danca";}s:2:"de";a:1:{i:0;s:7:"Almanca";}s:2:"dz";a:1:{i:0;s:11:"Bhutan Dili";}s:2:"el";a:1:{i:0;s:7:"Yunanca";}s:2:"en";a:1:{i:0;s:10:"İngilizce";}s:2:"eo";a:1:{i:0;s:9:"Esperanto";}s:2:"es";a:1:{i:0;s:11:"İspanyolca";}s:2:"et";a:1:{i:0;s:12:"Estonya Dili";}s:2:"eu";a:1:{i:0;s:9:"Bask Dili";}s:2:"fa";a:1:{i:0;s:7:"Farsça";}s:2:"fi";a:1:{i:0;s:5:"Fince";}s:2:"fj";a:1:{i:0;s:9:"Fiji Dili";}s:2:"fo";a:1:{i:0;s:10:"Faroe Dili";}s:2:"fr";a:1:{i:0;s:10:"Fransızca";}s:2:"fy";a:1:{i:0;s:11:"Frizye Dili";}s:2:"ga";a:1:{i:0;s:13:"İrlanda Dili";}s:2:"gd";a:1:{i:0;s:16:"İskoç Gal Dili";}s:2:"gl";a:1:{i:0;s:13:"Galiçya Dili";}s:2:"gn";a:1:{i:0;s:7:"Guarani";}s:2:"gu";a:1:{i:0;s:8:"Gujarati";}s:2:"ha";a:1:{i:0;s:5:"Hausa";}s:2:"he";a:1:{i:0;s:9:"İbranice";}s:2:"hi";a:1:{i:0;s:9:"Hint Dili";}s:2:"hr";a:1:{i:0;s:10:"Hırvatça";}s:2:"hu";a:1:{i:0;s:7:"Macarca";}s:2:"hy";a:1:{i:0;s:8:"Ermenice";}s:2:"ia";a:1:{i:0;s:11:"Interlingua";}s:2:"id";a:1:{i:0;s:14:"Endonezya Dili";}s:2:"ie";a:1:{i:0;s:11:"Interlingue";}s:2:"ik";a:1:{i:0;s:7:"Inupiak";}s:2:"is";a:1:{i:0;s:10:"İzlandaca";}s:2:"it";a:1:{i:0;s:10:"İtalyanca";}s:2:"iu";a:1:{i:0;s:9:"Inuktitut";}s:2:"ja";a:1:{i:0;s:7:"Japonca";}s:2:"jv";a:1:{i:0;s:9:"Java Dili";}s:2:"ka";a:1:{i:0;s:9:"Gürcüce";}s:2:"kk";a:1:{i:0;s:10:"Kazak Dili";}s:2:"kl";a:1:{i:0;s:14:"Grönland Dili";}s:2:"km";a:1:{i:0;s:14:"Kamboçya Dili";}s:2:"kn";a:1:{i:0;s:7:"Kannada";}s:2:"ko";a:1:{i:0;s:6:"Korece";}s:2:"ks";a:1:{i:0;s:9:"Keşmirce";}s:2:"ku";a:1:{i:0;s:8:"Kürtçe";}s:2:"ky";a:1:{i:0;s:10:"Kırgızca";}s:2:"la";a:1:{i:0;s:7:"Latince";}s:2:"ln";a:1:{i:0;s:7:"Lingala";}s:2:"lo";a:1:{i:0;s:9:"Laos Dili";}s:2:"lt";a:1:{i:0;s:13:"Litvanya Dili";}s:2:"lv";a:1:{i:0;s:12:"Letonya Dili";}s:2:"mg";a:1:{i:0;s:11:"Malaga Dili";}s:2:"mi";a:1:{i:0;s:5:"Maori";}s:2:"mk";a:1:{i:0;s:9:"Makedonca";}s:2:"ml";a:1:{i:0;s:9:
"Malayalam";}s:2:"mn";a:1:{i:0;s:11:"Moğol Dili";}s:2:"mo";a:1:{i:0;s:13:"Moldavya Dili";}s:2:"mr";a:1:{i:0;s:7:"Marathi";}s:2:"ms";a:1:{i:0;s:5:"Malay";}s:2:"mt";a:1:{i:0;s:10:"Malta Dili";}s:2:"my";a:1:{i:0;s:13:"Birmanya Dili";}s:2:"na";a:1:{i:0;s:5:"Nauru";}s:2:"ne";a:1:{i:0;s:10:"Nepal Dili";}s:2:"nl";a:1:{i:0;s:13:"Hollanda Dili";}s:2:"no";a:1:{i:0;s:10:"Norveççe";}s:2:"oc";a:1:{i:0;s:7:"Occitan";}s:2:"om";a:1:{i:0;s:12:"Oromo (Afan)";}s:2:"or";a:1:{i:0;s:5:"Oriya";}s:2:"pa";a:1:{i:0;s:11:"Pencap Dili";}s:2:"pl";a:1:{i:0;s:12:"Polonya Dili";}s:2:"ps";a:1:{i:0;s:12:"Peştun Dili";}s:2:"pt";a:1:{i:0;s:10:"Portekizce";}s:2:"qu";a:1:{i:0;s:7:"Quechua";}s:2:"rm";a:1:{i:0;s:17:"Rhaeto-Roman Dili";}s:2:"rn";a:1:{i:0;s:7:"Kirundi";}s:2:"ro";a:1:{i:0;s:7:"Romence";}s:2:"ru";a:1:{i:0;s:6:"Rusça";}s:2:"rw";a:1:{i:0;s:11:"Kinyarwanda";}s:2:"sa";a:1:{i:0;s:11:"Sanskritçe";}s:2:"sd";a:1:{i:0;s:6:"Sindhi";}s:2:"sg";a:1:{i:0;s:6:"Sangho";}s:2:"sh";a:1:{i:0;s:18:"Sırp-Hırvat Dili";}s:2:"si";a:1:{i:0;s:11:"Sinhal Dili";}s:2:"sk";a:1:{i:0;s:9:"Slovakça";}s:2:"sl";a:1:{i:0;s:8:"Slovence";}s:2:"sm";a:1:{i:0;s:10:"Samoa Dili";}s:2:"sn";a:1:{i:0;s:5:"Shona";}s:2:"so";a:1:{i:0;s:11:"Somali Dili";}s:2:"sq";a:1:{i:0;s:10:"Arnavutça";}s:2:"sr";a:1:{i:0;s:8:"Sırpça";}s:2:"ss";a:1:{i:0;s:7:"Siswati";}s:2:"st";a:1:{i:0;s:7:"Sesotho";}s:2:"su";a:1:{i:0;s:10:"Sudan Dili";}s:2:"sv";a:1:{i:0;s:10:"İsveççe";}s:2:"sw";a:1:{i:0;s:7:"Swahili";}s:2:"ta";a:1:{i:0;s:5:"Tamil";}s:2:"te";a:1:{i:0;s:6:"Telugu";}s:2:"tg";a:1:{i:0;s:10:"Tacik Dili";}s:2:"th";a:1:{i:0;s:8:"Tay Dili";}s:2:"ti";a:1:{i:0;s:8:"Tigrinya";}s:2:"tk";a:1:{i:0;s:10:"Türkmence";}s:2:"tl";a:1:{i:0;s:7:"Tagalog";}s:2:"tn";a:1:{i:0;s:8:"Setswana";}s:2:"to";a:1:{i:0;s:5:"Tonga";}s:2:"tr";a:1:{i:0;s:8:"Türkçe";}s:2:"ts";a:1:{i:0;s:6:"Tsonga";}s:2:"tt";a:1:{i:0;s:7:"Tatarca";}s:2:"tw";a:1:{i:0;s:3:"Twi";}s:2:"ug";a:1:{i:0;s:7:"Uygurca";}s:2:"uk";a:1:{i:0;s:9:"Ukraynaca";}s:2:"ur";a:1:{i:0;s:6:"Urduca";}s:2:"uz";a:1:{i:0;s:9:"Özbekçe";}s:2:"vi";a:1:{i:0;s:12:"Vietnam 
Dili";}s:2:"vo";a:1:{i:0;s:7:"Volapuk";}s:2:"wo";a:1:{i:0;s:5:"Wolof";}s:2:"xh";a:1:{i:0;s:5:"Xhosa";}s:2:"yi";a:1:{i:0;s:7:"Yiddiş";}s:2:"yo";a:1:{i:0;s:6:"Yoruba";}s:2:"za";a:1:{i:0;s:6:"Zhuang";}s:2:"zh";a:1:{i:0;s:6:"Çince";}s:2:"zu";a:1:{i:0;s:4:"Zulu";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Scripts";a:17:{s:4:"Arab";a:1:{i:0;s:7:"Arapça";}s:4:"Armn";a:1:{i:0;s:8:"Ermenice";}s:4:"Cher";a:1:{i:0;s:7:"Çeroki";}s:4:"Cprt";a:1:{i:0;s:8:"Kıbrıs";}s:4:"Cyrl";a:1:{i:0;s:5:"Kiril";}s:4:"Ethi";a:1:{i:0;s:8:"Etiyopya";}s:4:"Geor";a:1:{i:0;s:9:"Gürcüce";}s:4:"Goth";a:1:{i:0;s:5:"Gotik";}s:4:"Grek";a:1:{i:0;s:5:"Yunan";}s:4:"Hani";a:1:{i:0;s:3:"Hun";}s:4:"Hans";a:1:{i:0;s:9:"Basit Han";}s:4:"Hant";a:1:{i:0;s:14:"Geleneksel Han";}s:4:"Hebr";a:1:{i:0;s:9:"İbranice";}s:4:"Mong";a:1:{i:0;s:8:"Moğolca";}s:4:"Thai";a:1:{i:0;s:5:"Tayca";}s:4:"Tibt";a:1:{i:0;s:8:"Tibetçe";}s:4:"Zyyy";a:1:{i:0;s:5:"Ortak";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:14:"Budist Takvimi";}s:7:"chinese";a:1:{i:0;s:12:"Çin Takvimi";}s:9:"gregorian";a:1:{i:0;s:13:"Miladi Takvim";}s:6:"hebrew";a:1:{i:0;s:14:"Yahudi Takvimi";}s:7:"islamic";a:1:{i:0;s:12:"Hicri Takvim";}s:13:"islamic-civil";a:1:{i:0;s:12:"Arap Takvimi";}s:8:"japanese";a:1:{i:0;s:13:"Japon Takvimi";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:14:"Düz Sıralama";}s:9:"phonebook";a:1:{i:0;s:28:"Telefon Defteri Sıralaması";}s:6:"pinyin";a:1:{i:0;s:19:"Pinyin Sıralaması";}s:6:"stroke";a:1:{i:0;s:19:"Stroke Sıralaması";}s:11:"traditional";a:1:{i:0;s:10:"Geleneksel";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:17:"dd MMMM yyyy EEEE";i:5;s:17:"dd MMMM yyyy EEEE";i:6;s:1
1:"dd.MMM.yyyy";i:7;s:10:"dd.MM.yyyy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:3:"Paz";i:1;s:3:"Pzt";i:2;s:3:"Sal";i:3;s:4:"Çar";i:4;s:3:"Per";i:5;s:3:"Cum";i:6;s:3:"Cmt";}s:6:"narrow";a:7:{i:0;s:1:"P";i:1;s:1:"P";i:2;s:1:"S";i:3;s:2:"Ç";i:4;s:1:"P";i:5;s:1:"C";i:6;s:1:"C";}s:4:"wide";a:7:{i:0;s:5:"Pazar";i:1;s:9:"Pazartesi";i:2;s:5:"Salı";i:3;s:10:"Çarşamba";i:4;s:9:"Perşembe";i:5;s:4:"Cuma";i:6;s:9:"Cumartesi";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:3:"MÖ";i:1;s:2:"MS";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:3:"Oca";i:1;s:4:"Şub";i:2;s:3:"Mar";i:3;s:3:"Nis";i:4;s:3:"May";i:5;s:3:"Haz";i:6;s:3:"Tem";i:7;s:4:"Ağu";i:8;s:3:"Eyl";i:9;s:3:"Eki";i:10;s:3:"Kas";i:11;s:3:"Ara";}s:6:"narrow";a:12:{i:0;s:1:"O";i:1;s:2:"Ş";i:2;s:1:"M";i:3;s:1:"N";i:4;s:1:"M";i:5;s:1:"H";i:6;s:1:"T";i:7;s:1:"A";i:8;s:1:"E";i:9;s:1:"E";i:10;s:1:"K";i:11;s:1:"A";}s:4:"wide";a:12:{i:0;s:4:"Ocak";i:1;s:6:"Şubat";i:2;s:4:"Mart";i:3;s:5:"Nisan";i:4;s:6:"Mayıs";i:5;s:7:"Haziran";i:6;s:6:"Temmuz";i:7;s:8:"Ağustos";i:8;s:6:"Eylül";i:9;s:4:"Ekim";i:10;s:6:"Kasım";i:11;s:7:"Aralık";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/tr_TR.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/tr_TR.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/tr_TR.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/uk.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/uk.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/uk.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:11:{s:9:"Countries";a:239:{s:2:"AD";a:1:{i:0;s:14:"Ðндорра";}s:2:"AE";a:1:{i:0;s:50:"Обʼєднані ÐрабÑькі Емірати";}s:2:"AF";a:1:{i:0;s:20:"ÐфганіÑтан";}s:2:"AG";a:1:{i:0;s:32:"Ðнтигуа Ñ– Барбуда";}s:2:"AI";a:1:{i:0;s:14:"ÐнгільÑ";}s:2:"AL";a:1:{i:0;s:14:"ÐлбаніÑ";}s:2:"AM";a:1:{i:0;s:16:"ВірменіÑ";}s:2:"AN";a:1:{i:0;s:62:"ÐідерландÑькі ÐнтільÑькі ОÑтрови";}s:2:"AO";a:1:{i:0;s:12:"Ðнгола";}s:2:"AQ";a:1:{i:0;s:20:"Ðнтарктика";}s:2:"AR";a:1:{i:0;s:18:"Ðргентина";}s:2:"AS";a:1:{i:0;s:35:"ÐмериканÑьке Самоа";}s:2:"AT";a:1:{i:0;s:14:"ÐвÑтріÑ";}s:2:"AU";a:1:{i:0;s:18:"ÐвÑтраліÑ";}s:2:"AW";a:1:{i:0;s:10:"Ðруба";}s:2:"AZ";a:1:{i:0;s:22:"Ðзербайджан";}s:2:"BA";a:1:{i:0;s:38:"БоÑÐ½Ñ–Ñ Ñ– Герцоговина";}s:2:"BB";a:1:{i:0;s:16:"БарбадоÑ";}s:2:"BD";a:1:{i:0;s:18:"Бангладеш";}s:2:"BE";a:1:{i:0;s:14:"БельгіÑ";}s:2:"BF";a:1:{i:0;s:23:"Буркіна-ФаÑо";}s:2:"BG";a:1:{i:0;s:16:"БолгаріÑ";}s:2:"BH";a:1:{i:0;s:14:"Бахрейн";}s:2:"BI";a:1:{i:0;s:14:"Бурунді";}s:2:"BJ";a:1:{i:0;s:10:"Бенін";}s:2:"BM";a:1:{i:0;s:14:"Бермуди";}s:2:"BN";a:1:{i:0;s:12:"Бруней";}s:2:"BO";a:1:{i:0;s:14:"БолівіÑ";}s:2:"BR";a:1:{i:0;s:16:"БразиліÑ";}s:2:"BS";a:1:{i:0;s:12:"Багами";}s:2:"BT";a:1:{i:0;s:10:"Бутан";}s:2:"BV";a:1:{i:0;s:22:"Буве, оÑтрів";}s:2:"BW";a:1:{i:0;s:16:"БотÑвана";}s:2:"BY";a:1:{i:0;s:16:"БілоруÑÑŒ";}s:2:"BZ";a:1:{i:0;s:10:"Беліз";}s:2:"CA";a:1:{i:0;s:12:"Канада";}s:2:"CC";a:1:{i:0;s:31:"КокоÑові оÑтрови";}s:2:"CD";a:1:{i:0;s:57:"Конго, Демократична РеÑпубліка";}s:2:"CF";a:1:{i:0;s:64:"Центрально-ÐфриканÑька РеÑпубліка";}s:2:"CG";a:1:{i:0;s:10:"Конго";}s:2:"CH";a:1:{i:0;s:18:"ШвейцаріÑ";}s:2:"CI";a:1:{i:0;s:22:"Кот-д’ІвуÐ
°Ñ€";}s:2:"CK";a:1:{i:0;s:23:"ОÑтрови Кука";}s:2:"CL";a:1:{i:0;s:8:"Чилі";}s:2:"CM";a:1:{i:0;s:14:"Камерун";}s:2:"CN";a:1:{i:0;s:10:"Китай";}s:2:"CO";a:1:{i:0;s:16:"КолумбіÑ";}s:2:"CR";a:1:{i:0;s:19:"КоÑта-Рика";}s:2:"CU";a:1:{i:0;s:8:"Куба";}s:2:"CV";a:1:{i:0;s:19:"Кабо-Верде";}s:2:"CX";a:1:{i:0;s:25:"ОÑтрів Різдва";}s:2:"CY";a:1:{i:0;s:8:"Кіпр";}s:2:"CZ";a:1:{i:0;s:33:"ЧеÑька реÑпубліка";}s:2:"DE";a:1:{i:0;s:18:"Ðімеччина";}s:2:"DJ";a:1:{i:0;s:14:"Джібуті";}s:2:"DK";a:1:{i:0;s:10:"ДаніÑ";}s:2:"DM";a:1:{i:0;s:14:"Домінік";}s:2:"DO";a:1:{i:0;s:47:"ДомініканÑька РеÑпубліка";}s:2:"DZ";a:1:{i:0;s:10:"Ðлжир";}s:2:"EC";a:1:{i:0;s:14:"Еквадор";}s:2:"EE";a:1:{i:0;s:14:"ЕÑтоніÑ";}s:2:"EG";a:1:{i:0;s:12:"Єгипет";}s:2:"EH";a:1:{i:0;s:27:"Західна Сахара";}s:2:"ER";a:1:{i:0;s:14:"ЕритреÑ";}s:2:"ES";a:1:{i:0;s:14:"ІÑпаніÑ";}s:2:"ET";a:1:{i:0;s:14:"ЕфіопіÑ";}s:2:"FI";a:1:{i:0;s:18:"ФінлÑндіÑ";}s:2:"FJ";a:1:{i:0;s:10:"Фіджі";}s:2:"FK";a:1:{i:0;s:58:"ФолклендÑькі ОÑтрови (Мальвіни)";}s:2:"FM";a:1:{i:0;s:20:"МікронезіÑ";}s:2:"FO";a:1:{i:0;s:33:"ФарерÑькі оÑтрови";}s:2:"FR";a:1:{i:0;s:14:"ФранціÑ";}s:2:"GA";a:1:{i:0;s:10:"Габон";}s:2:"GB";a:1:{i:0;s:28:"ВеликобританіÑ";}s:2:"GD";a:1:{i:0;s:14:"Гренада";}s:2:"GE";a:1:{i:0;s:12:"ГрузіÑ";}s:2:"GF";a:1:{i:0;s:33:"Французька Гвіана";}s:2:"GH";a:1:{i:0;s:8:"Гана";}s:2:"GI";a:1:{i:0;s:18:"Гібралтар";}s:2:"GL";a:1:{i:0;s:20:"ГренландіÑ";}s:2:"GM";a:1:{i:0;s:12:"ГамбіÑ";}s:2:"GN";a:1:{i:0;s:12:"ГвінеÑ";}s:2:"GP";a:1:{i:0;s:18:"Гваделупа";}s:2:"GQ";a:1:{i:0;s:39:"Екваторіальна ГвінеÑ";}s:2:"GR";a:1:{i:0;s:12:"ГреціÑ";}s:2:"GS";a:1:{i:0;s:91:"Південна Ð”Ð¶Ð¾Ñ€Ð´Ð¶Ñ–Ñ Ñ‚Ð° Південні СандвÑ
–чеві ОÑтрови";}s:2:"GT";a:1:{i:0;s:18:"Гватемала";}s:2:"GU";a:1:{i:0;s:8:"Гуам";}s:2:"GW";a:1:{i:0;s:25:"ГвінеÑ-БіÑÑау";}s:2:"GY";a:1:{i:0;s:12:"Гайана";}s:2:"HK";a:1:{i:0;s:36:"Гонконг, С.Ð.Р. Китаю";}s:2:"HM";a:1:{i:0;s:48:"ОÑтрови Херд Ñ– Мак-Дональд";}s:2:"HN";a:1:{i:0;s:16:"ГондураÑ";}s:2:"HR";a:1:{i:0;s:16:"ХорватіÑ";}s:2:"HT";a:1:{i:0;s:10:"Гаїті";}s:2:"HU";a:1:{i:0;s:16:"Угорщина";}s:2:"ID";a:1:{i:0;s:18:"ІндонезіÑ";}s:2:"IE";a:1:{i:0;s:16:"ІрландіÑ";}s:2:"IL";a:1:{i:0;s:14:"Ізраїль";}s:2:"IN";a:1:{i:0;s:10:"ІндіÑ";}s:2:"IO";a:1:{i:0;s:75:"БританÑькі території ІндійÑького океану";}s:2:"IQ";a:1:{i:0;s:8:"Ірак";}s:2:"IR";a:1:{i:0;s:8:"Іран";}s:2:"IS";a:1:{i:0;s:16:"ІÑландіÑ";}s:2:"IT";a:1:{i:0;s:12:"ІталіÑ";}s:2:"JM";a:1:{i:0;s:12:"Ямайка";}s:2:"JO";a:1:{i:0;s:16:"ЙорданіÑ";}s:2:"JP";a:1:{i:0;s:12:"ЯпоніÑ";}s:2:"KE";a:1:{i:0;s:10:"КеніÑ";}s:2:"KG";a:1:{i:0;s:20:"КиргизÑтан";}s:2:"KH";a:1:{i:0;s:16:"Камбоджа";}s:2:"KI";a:1:{i:0;s:16:"Кірибаті";}s:2:"KM";a:1:{i:0;s:33:"КоморÑькі ОÑтрови";}s:2:"KN";a:1:{i:0;s:31:"Сент-ÐšÑ–Ñ‚Ñ Ñ– ÐевіÑ";}s:2:"KP";a:1:{i:0;s:27:"Північна КореÑ";}s:2:"KR";a:1:{i:0;s:27:"Південна КореÑ";}s:2:"KW";a:1:{i:0;s:12:"Кувейт";}s:2:"KY";a:1:{i:0;s:33:"Кайманові оÑтрови";}s:2:"KZ";a:1:{i:0;s:18:"КазахÑтан";}s:2:"LA";a:1:{i:0;s:8:"ЛаоÑ";}s:2:"LB";a:1:{i:0;s:10:"Ліван";}s:2:"LC";a:1:{i:0;s:19:"Сент-ЛюÑÑ–Ñ";}s:2:"LI";a:1:{i:0;s:22:"Ліхтенштейн";}s:2:"LK";a:1:{i:0;s:17:"Шрі-Ланка";}s:2:"LR";a:1:{i:0;s:14:"ЛіберіÑ";}s:2:"LS";a:1:{i:0;s:12:"ЛеÑото";}s:2:"LT";a:1:{i:0;s:10:"Литва";}s:2:"LU";a:1:{i:0;s:20:"ЛюкÑембург";}s:2:"LV";a:1:{i:0;s:12:"ЛатвіÑ";}s:2:"LY";a:1:{i:0;s:10:"ЛівіÑ";}s:2:"MA";a:1:{i:0;
s:14:"Марокко";}s:2:"MC";a:1:{i:0;s:12:"Монако";}s:2:"MD";a:1:{i:0;s:14:"Молдова";}s:2:"MG";a:1:{i:0;s:20:"МадагаÑкар";}s:2:"MH";a:1:{i:0;s:35:"Маршаллові ОÑтрови";}s:2:"MK";a:1:{i:0;s:18:"МакедоніÑ";}s:2:"ML";a:1:{i:0;s:8:"Малі";}s:2:"MM";a:1:{i:0;s:12:"МʼÑнма";}s:2:"MN";a:1:{i:0;s:16:"МонголіÑ";}s:2:"MO";a:1:{i:0;s:32:"Макао, С.Ð.Р. Китаю";}s:2:"MP";a:1:{i:0;s:52:"Північні МаріанÑькі ОÑтрови";}s:2:"MQ";a:1:{i:0;s:18:"Мартиніка";}s:2:"MR";a:1:{i:0;s:20:"МавританіÑ";}s:2:"MS";a:1:{i:0;s:18:"МонÑеррат";}s:2:"MT";a:1:{i:0;s:12:"Мальта";}s:2:"MU";a:1:{i:0;s:16:"Маврикій";}s:2:"MV";a:1:{i:0;s:16:"Мальдіви";}s:2:"MW";a:1:{i:0;s:12:"Малаві";}s:2:"MX";a:1:{i:0;s:14:"МекÑика";}s:2:"MY";a:1:{i:0;s:16:"МалайзіÑ";}s:2:"MZ";a:1:{i:0;s:16:"Мозамбік";}s:2:"NA";a:1:{i:0;s:14:"ÐамібіÑ";}s:2:"NC";a:1:{i:0;s:27:"Ðова КаледоніÑ";}s:2:"NE";a:1:{i:0;s:10:"Ðігер";}s:2:"NF";a:1:{i:0;s:27:"ОÑтрів Ðорфолк";}s:2:"NG";a:1:{i:0;s:14:"ÐігеріÑ";}s:2:"NI";a:1:{i:0;s:18:"Ðікарагуа";}s:2:"NL";a:1:{i:0;s:20:"Ðідерланди";}s:2:"NO";a:1:{i:0;s:16:"ÐорвегіÑ";}s:2:"NP";a:1:{i:0;s:10:"Ðепал";}s:2:"NR";a:1:{i:0;s:10:"Ðауру";}s:2:"NU";a:1:{i:0;s:6:"ÐÑ–Ñ";}s:2:"NZ";a:1:{i:0;s:25:"Ðова ЗеландіÑ";}s:2:"OM";a:1:{i:0;s:8:"Оман";}s:2:"PA";a:1:{i:0;s:12:"Панама";}s:2:"PE";a:1:{i:0;s:8:"Перу";}s:2:"PF";a:1:{i:0;s:39:"Французька ПолінезіÑ";}s:2:"PG";a:1:{i:0;s:32:"Папуа Ðова ГвінеÑ";}s:2:"PH";a:1:{i:0;s:18:"Філіппіни";}s:2:"PK";a:1:{i:0;s:16:"ПакиÑтан";}s:2:"PL";a:1:{i:0;s:12:"Польща";}s:2:"PM";a:1:{i:0;s:33:"Сен-Пʼєр Ñ– Мікелон";}s:2:"PN";a:1:{i:0;s:14:"Піткерн";}s:2:"PR";a:1:{i:0;s:21:"Пуерто-Ріко";}s:2:"PS";a:1:{i:0;s:18:"ПалеÑтина";}s:2:"PT";a:1:{i:0;s:20:"Португ
аліÑ";}s:2:"PW";a:1:{i:0;s:10:"Палау";}s:2:"PY";a:1:{i:0;s:16:"Парагвай";}s:2:"QA";a:1:{i:0;s:10:"Катар";}s:2:"RE";a:1:{i:0;s:16:"Реюньйон";}s:2:"RO";a:1:{i:0;s:14:"РумуніÑ";}s:2:"RU";a:1:{i:0;s:10:"РоÑÑ–Ñ";}s:2:"RW";a:1:{i:0;s:12:"Руанда";}s:2:"SA";a:1:{i:0;s:33:"СаудівÑька ÐравіÑ";}s:2:"SB";a:1:{i:0;s:35:"Соломонові ОÑтрови";}s:2:"SC";a:1:{i:0;s:14:"Сейшели";}s:2:"SD";a:1:{i:0;s:10:"Судан";}s:2:"SE";a:1:{i:0;s:12:"ШвеціÑ";}s:2:"SG";a:1:{i:0;s:16:"Сінгапур";}s:2:"SH";a:1:{i:0;s:16:"Св. Єлена";}s:2:"SI";a:1:{i:0;s:16:"СловеніÑ";}s:2:"SJ";a:1:{i:0;s:51:"Свалбард Ñ– Ян Майєн, оÑтрови";}s:2:"SK";a:1:{i:0;s:16:"СловакіÑ";}s:2:"SL";a:1:{i:0;s:23:"Сьєрра-Леоне";}s:2:"SM";a:1:{i:0;s:19:"Сан-Маріно";}s:2:"SN";a:1:{i:0;s:14:"Сенегал";}s:2:"SO";a:1:{i:0;s:12:"Сомалі";}s:2:"SR";a:1:{i:0;s:14:"Суринам";}s:2:"ST";a:1:{i:0;s:35:"Сан-Томе Ñ– ПрінÑіпі";}s:2:"SV";a:1:{i:0;s:18:"Сальвадор";}s:2:"SY";a:1:{i:0;s:56:"СирійÑька ÐрабÑька РеÑпубліка";}s:2:"SZ";a:1:{i:0;s:18:"Свазіленд";}s:2:"TC";a:1:{i:0;s:26:"Ð¢ÐµÑ€ÐºÑ Ñ– КайкоÑ";}s:2:"TD";a:1:{i:0;s:6:"Чад";}s:2:"TF";a:1:{i:0;s:56:"Французькі Південні Території";}s:2:"TG";a:1:{i:0;s:8:"Того";}s:2:"TH";a:1:{i:0;s:14:"Таїланд";}s:2:"TJ";a:1:{i:0;s:22:"ТаджикиÑтан";}s:2:"TK";a:1:{i:0;s:14:"Токелау";}s:2:"TL";a:1:{i:0;s:25:"Східний Тимор";}s:2:"TM";a:1:{i:0;s:24:"ТуркмениÑтан";}s:2:"TN";a:1:{i:0;s:10:"ТуніÑ";}s:2:"TO";a:1:{i:0;s:10:"Тонга";}s:2:"TR";a:1:{i:0;s:18:"Туреччина";}s:2:"TT";a:1:{i:0;s:32:"Тринідад Ñ– Тобаго";}s:2:"TV";a:1:{i:0;s:12:"Тувалу";}s:2:"TW";a:1:{i:0;s:14:"Тайвань";}s:2:"TZ";a:1:{i:0;s:57:"ТанзаніÑ, Обʼєднана РеÑпубліка";}s:2:"UA";a:1:{i:0;s:14:"Україна";}
s:2:"UG";a:1:{i:0;s:12:"Уганда";}s:2:"UM";a:1:{i:0;s:40:"Віддалені ОÑтрови СШÐ";}s:2:"US";a:1:{i:0;s:6:"СШÐ";}s:2:"UY";a:1:{i:0;s:14:"Уругвай";}s:2:"UZ";a:1:{i:0;s:20:"УзбекиÑтан";}s:2:"VA";a:1:{i:0;s:14:"Ватикан";}s:2:"VC";a:1:{i:0;s:45:"Сент-ВінÑент Ñ– Гренадини";}s:2:"VE";a:1:{i:0;s:18:"ВенеÑуела";}s:2:"VG";a:1:{i:0;s:54:"ВіргінÑькі оÑтрови (БританіÑ)";}s:2:"VI";a:1:{i:0;s:44:"ВіргінÑькі оÑтрови (СШÐ)";}s:2:"VN";a:1:{i:0;s:14:"Вʼєтнам";}s:2:"VU";a:1:{i:0;s:14:"Вануату";}s:2:"WF";a:1:{i:0;s:44:"Ð’Ð°Ð»Ð»Ñ–Ñ Ñ– Футуна, оÑтрови";}s:2:"WS";a:1:{i:0;s:10:"Самоа";}s:2:"YE";a:1:{i:0;s:8:"Ємен";}s:2:"YT";a:1:{i:0;s:10:"Майот";}s:2:"YU";a:1:{i:0;s:18:"ЮгоÑлавіÑ";}s:2:"ZA";a:1:{i:0;s:6:"ПÐР";}s:2:"ZM";a:1:{i:0;s:12:"ЗамбіÑ";}s:2:"ZW";a:1:{i:0;s:16:"Зімбабве";}}s:10:"Currencies";a:348:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:33:"ÐндоррÑький динар";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:33:"ÐндоррÑька пеÑета";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:19:"Дирхем ОÐЕ";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:24:"Ðфгані (1927-2002)";}s:3:"AFN";a:2:{i:0;s:2:"Af";i:1;s:12:"Ðфгані";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:43:"Франк ÐффарÑу та ІÑааÑу";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:39:"ÐлбанÑький лек (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"lek";i:1;s:27:"ÐлбанÑький лек";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:27:"ÐлбанÑький лек";}s:3:"AMD";a:2:{i:0;s:4:"dram";i:1;s:31:"ВірменÑький драм";}s:3:"ANG";a:2:{i:0;s:5:"NA f.";i:1;s:54:"Гульден ÐідерландÑьких Ðнтіл";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:33:"ÐнгольÑька кванза";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:45:"ÐнгольÑька кванза (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:54:"ÐнгольÑька нова кванза (1990-2000)";}s:
3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:35:"ÐнгольÑький еÑкудо";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:41:"ÐргентинÑький авÑтрал";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:45:"ÐргентинÑьке пеÑо (1983-1985)";}s:3:"ARS";a:2:{i:0;s:4:"Arg$";i:1;s:33:"ÐргентинÑьке пеÑо";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:37:"ÐвÑтрійÑький шилінг";}s:3:"AUD";a:2:{i:0;s:2:"$A";i:1;s:39:"ÐвÑтралійÑький долар";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:37:"ÐвÑтралійÑький фунт";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:33:"ÐрубÑький гульден";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:43:"ÐзербайджанÑький манат";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:47:"Динар БоÑнії Ñ– Гецоговини";}s:3:"BAM";a:2:{i:0;s:2:"KM";i:1;s:74:"Конвертована марка БоÑнії Ñ– Герцоговини";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:60:"Ðовий динар БоÑнії Ñ– Герцоговини";}s:3:"BBD";a:2:{i:0;s:4:"BDS$";i:1;s:35:"БарбадоÑький долар";}s:3:"BDT";a:2:{i:0;s:2:"Tk";i:1;s:33:"БангладеÑька така";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:64:"БельгійÑький франк (конвертований)";}s:3:"BEF";a:2:{i:0;s:2:"BF";i:1;s:35:"БельгійÑький франк";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:58:"БельгійÑький франк (фінанÑовий)";}s:3:"BGL";a:2:{i:0;s:3:"lev";i:1;s:44:"БолгарÑький твердий лев";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:58:"БолгарÑький ÑоціаліÑтичний лев";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:40:"БолгарÑький новий лев";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:41:"БолгарÑький лев (1879-1952)";}s:3:"BHD";a:2:{i:0;s:2:"BD";i:1;s:35:"БахрейнÑький динар";}s:3:"BIF";a:2:{i:0;s:3:"Fbu";i:1;s:37:"БурундійÑький франк";}s:3:"BMD";a:2:{i:0;s:4:"Ber$";i:1;s:33:"БермудÑький долар";}s:3:"BM
P";a:2:{i:0;s:3:"BMP";i:1;s:31:"БермудÑький фунт";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:34:"БрунейÑький доларr";}s:3:"BOB";a:2:{i:0;s:2:"Bs";i:1;s:18:"Болівіано";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:30:"Болівіано (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:31:"БолівійÑьке пеÑо";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:35:"БолівійÑький мвдол";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:60:"БразильÑьке нове крузейро (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:37:"БразильÑьке крузадо";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:51:"БразильÑьке крузейро (1990-1993)";}s:3:"BRL";a:2:{i:0;s:2:"R$";i:1;s:33:"БразильÑький реал";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:46:"БразильÑьке нове крузадо";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:39:"БразильÑьке крузейро";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:51:"БразильÑьке крузейро (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:31:"БагамÑький долар";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:29:"БагамÑький фунт";}s:3:"BTN";a:2:{i:0;s:2:"Nu";i:1;s:37:"БутанÑький нгултрум";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:29:"БутанÑька рупіÑ";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:31:"БірманÑький кіат";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:31:"БірманÑька рупіÑ";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:31:"БотÑванÑька пула";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:56:"БілоруÑький новий рубль (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:45:"БілоруÑький рубль (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"Rbl";i:1;s:33:"БілоруÑький рубль";}s:3:"BZD";a:2:{i:0;s:3:"BZ$";i:1;s:29:"Белізький долар";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:54:"Долар БританÑького ГондураÑу";}s:3:"CAD";a:2:{i:0;s:4:"Can$";i:1;s:31:"КанадÑький долар";}s:
3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:35:"Конголезький франк";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:56:"Франк Конголезької РеÑпубліки";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:33:"Конголезький заїр";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:76:"Франк ЦентральноафриканÑької РеÑпубліки";}s:3:"CHF";a:2:{i:0;s:3:"SwF";i:1;s:35:"ШвейцарÑький франк";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:36:"Долар ОÑтровів Кука";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:33:"ЧилійÑький кондор";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:33:"ЧилійÑький еÑкудо";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:23:"ЧилійÑький UF";}s:3:"CLP";a:2:{i:0;s:3:"Ch$";i:1;s:27:"ЧилійÑьке пеÑо";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:35:"КамерунÑький франк";}s:3:"CNY";a:2:{i:0;s:1:"Y";i:1;s:29:"КитайÑький юань";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:50:"КолумбійÑьке паперове пеÑо";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:35:"Конголезький франк";}s:3:"COP";a:2:{i:0;s:4:"Col$";i:1;s:33:"КолумбійÑьке пеÑо";}s:3:"CRC";a:2:{i:0;s:1:"C";i:1;s:42:"КоÑта-риканÑький колон";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:37:"ЧехоÑловацька крона";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:50:"ЧехоÑловацька тверда крона";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:27:"КубинÑьке пеÑо";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:56:"КубинÑькі валютні Ñертифікати";}s:3:"CVE";a:2:{i:0;s:5:"CVEsc";i:1;s:32:"ЕÑкудо Кабо-Верде";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:27:"Гульден КураÑÑŽ";}s:3:"CYP";a:2:{i:0;s:3:"£C";i:1;s:27:"КіпрÑький фунт";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:23:"ЧеÑька крона";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:27:"Ðімецька марка";}s:3:"DJF";a:2:{i:0;s:2:"DF";i:1;s:25:"Франк Джібуті";}s:3:"DKK";a:2:{i:0
;s:3:"DKr";i:1;s:25:"ДатÑька крона";}s:3:"DOP";a:2:{i:0;s:3:"RD$";i:1;s:35:"ДомініканÑьке пеÑо";}s:3:"DZD";a:2:{i:0;s:2:"DA";i:1;s:31:"ÐлжирÑький динар";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:42:"ÐлжирÑький новий франк";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:33:"ЕквадорÑьке Ñукре";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:29:"ЕквадорÑький UVС";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:29:"ЕÑтонÑька крона";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:31:"ЄгипетÑький фунт";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:33:"ЕритрейÑька накфа";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:31:"ІÑпанÑька пеÑета";}s:3:"ETB";a:2:{i:0;s:2:"Br";i:1;s:27:"ЕфіопÑький бир";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:31:"ЕфіопÑький долар";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:8:"Євро";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:33:"ФінлÑндÑька марка";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:45:"ФінлÑндÑька марка (1860-1962)";}s:3:"FJD";a:2:{i:0;s:2:"F$";i:1;s:33:"ФіджійÑький долар";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:31:"ФіджійÑький фунт";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:35:"ФолклендÑький фунт";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:29:"ФарерÑька крона";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:33:"Французький франк";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:31:"ГабонÑький франк";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:52:"ÐнглійÑький фунт Ñтерлінгів";}s:3:"GEL";a:2:{i:0;s:4:"lari";i:1;s:31:"ГрузинÑький ларі";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:25:"ГанÑький Ñеді";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:38:"ГанÑький Ñтарий Ñеді";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:25:"ГанÑький фунт";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:50:"ГанÑький переоцінений Ñеді";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:37:"ГібралтарÑÑ
ŒÐºÐ¸Ð¹ фунт";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:35:"ГренландÑька крона";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:33:"ГамбійÑька далаÑÑ–";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:31:"ГамбійÑький фунт";}s:3:"GNF";a:2:{i:0;s:2:"GF";i:1;s:35:"ГвійнейÑький франк";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:45:"ГвінейÑький франк (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:29:"ГвінейÑьке Ñілі";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:37:"ГваделупÑький франк";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:52:"Франк Екваторіальної Гвінеї";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:27:"Грецька драхма";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:36:"Грецька нова драхма";}s:3:"GTQ";a:2:{i:0;s:1:"Q";i:1;s:43:"ГватемальÑький кетÑаль";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:46:"Франк Французької Гвіани";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:54:"ЕÑкудо ПортугальÑької Гвінеї";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:58:"ÐœÑ–Ð»ÑŒÑ€ÐµÐ¹Ñ ÐŸÐ¾Ñ€Ñ‚ÑƒÐ³Ð°Ð»ÑŒÑької Гвінеї";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:32:"ПеÑо Гвінеї-БіÑау";}s:3:"GYD";a:2:{i:0;s:2:"G$";i:1;s:31:"ГайÑнÑький долар";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:39:"ГонконгівÑький долар";}s:3:"HNL";a:2:{i:0;s:1:"L";i:1;s:37:"ГондураÑька лемпіра";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:33:"ХорватÑький динар";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:29:"ХорватÑька куна";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:31:"ГаїтÑнÑький гурд";}s:3:"HUF";a:2:{i:0;s:2:"Ft";i:1;s:31:"УгорÑький форинт";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:45:"ПівнічноірланÑький фунт";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:46:"ІндонезійÑька нова рупіÑ";}s:3:"IDR";a:2:{i:0;s:2:"Rp";i:1;s:37:"ІндонезійÑька рупіÑ";}s:3:"IEP";a:2:{i:0;s:4:"IR£";i:1;s
:31:"ІрландÑький фунт";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:37:"ІзраїльÑький шекель";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:33:"ІзраїльÑький фунт";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:48:"ІзраїльÑький новий шекель";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:51:"Фунт Ñтерлінгів ОÑтрова Мен";}s:3:"INR";a:2:{i:0;s:3:"INR";i:1;s:29:"ІндійÑька рупіÑ";}s:3:"IQD";a:2:{i:0;s:2:"ID";i:1;s:29:"ІракÑький динар";}s:3:"IRR";a:2:{i:0;s:2:"RI";i:1;s:27:"ІранÑький ріал";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:31:"ІÑландÑька крона";}s:3:"ITL";a:2:{i:0;s:3:"₤";i:1;s:29:"ІталійÑька ліра";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:42:"Фунт Ñтерлінгів ДжерÑÑ–";}s:3:"JMD";a:2:{i:0;s:2:"J$";i:1;s:29:"ЯмайÑький долар";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:27:"ЯмайÑький фунт";}s:3:"JOD";a:2:{i:0;s:2:"JD";i:1;s:33:"ЙорданÑький динар";}s:3:"JPY";a:2:{i:0;s:2:"Â¥";i:1;s:23:"ЯпонÑька єна";}s:3:"KES";a:2:{i:0;s:4:"K Sh";i:1;s:33:"КенійÑький шилінг";}s:3:"KGS";a:2:{i:0;s:3:"som";i:1;s:27:"Киргизький Ñом";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:52:"КамбоджійÑький Ñтарий рієль";}s:3:"KHR";a:2:{i:0;s:2:"CR";i:1;s:39:"КамбоджійÑький рієль";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:27:"Долар Кірибаті";}s:3:"KMF";a:2:{i:0;s:2:"CF";i:1;s:31:"КоморÑький франк";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:38:"Вона Північної Кореї";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:49:"Стара вона Південної Кореї";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:38:"Вона Південної Кореї";}s:3:"KWD";a:2:{i:0;s:2:"KD";i:1;s:33:"КувейтÑький динар";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:48:"Долар Кайманових оÑтровів";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:39:"КазахÑтанÑький рубль";}s:
3:"KZT";a:2:{i:0;s:1:"T";i:1;s:39:"КазахÑтанÑький тенге";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:23:"ЛаоÑький кіп";}s:3:"LBP";a:2:{i:0;s:2:"LL";i:1;s:29:"ЛіванÑький фунт";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:43:"ЛіхтенштейнÑький франк";}s:3:"LKR";a:2:{i:0;s:5:"SL Re";i:1;s:38:"Шрі-ланкійÑька рупіÑ";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:31:"ЦейлонÑька рупіÑ";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:35:"ЛіберійÑький долар";}s:3:"LSL";a:2:{i:0;s:1:"M";i:1;s:29:"ЛеÑотÑький лоті";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:27:"ЛитовÑький літ";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:31:"ЛитовÑький талон";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:39:"ЛюкÑембурзький франк";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:29:"ЛатвійÑький лат";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:33:"ЛатвійÑький рубль";}s:3:"LYD";a:2:{i:0;s:2:"LD";i:1;s:31:"ЛівійÑький динар";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:29:"ЛівійÑький фунт";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:39:"МарокканÑький дирхем";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:37:"МарокканÑький франк";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:42:"МонакÑький новий франк";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:29:"МолдовÑький лей";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:50:"МолдовÑький рублевий купон";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:43:"МадагаÑкарÑький аріарі";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:41:"МадагаÑкарÑький франк";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:51:"Долар Маршаллових оÑтровівr";}s:3:"MKD";a:2:{i:0;s:4:"MDen";i:1;s:35:"МакедонÑький динар";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:47:"МакедонÑький динар (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:31:"МалійÑький франк";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i
:1;s:21:"КʼÑÑ‚ МʼÑнми";}s:3:"MNT";a:2:{i:0;s:3:"Tug";i:1;s:37:"МонгольÑький тугрик";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:23:"Макао патака";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:37:"МартинікÑький франк";}s:3:"MRO";a:2:{i:0;s:2:"UM";i:1;s:33:"МавританÑька угіÑ";}s:3:"MTL";a:2:{i:0;s:2:"Lm";i:1;s:31:"МальтійÑька ліра";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:33:"МальтійÑький фунт";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:35:"МаврикійÑька рупіÑ";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:33:"МальдівÑька рупіÑ";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:33:"МальдівÑька руфіÑ";}s:3:"MWK";a:2:{i:0;s:2:"MK";i:1;s:33:"МалавійÑька квача";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:33:"МалавійÑький фунт";}s:3:"MXN";a:2:{i:0;s:4:"MEX$";i:1;s:33:"МекÑиканÑьке пеÑо";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:58:"МекÑиканÑьке Ñрібне пеÑо (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:30:"МекÑиканÑький UDI";}s:3:"MYR";a:2:{i:0;s:2:"RM";i:1;s:39:"МалайзійÑький рингіт";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:37:"Мозамбіцький еÑкудо";}s:3:"MZM";a:2:{i:0;s:2:"Mt";i:1;s:39:"Мозамбіцький метикал";}s:3:"NAD";a:2:{i:0;s:2:"N$";i:1;s:35:"ÐамібійÑький долар";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:40:"Франк Ðової Каледонії";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:33:"ÐігерійÑька найра";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:33:"ÐігерійÑький фунт";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:50:"Франк ГебрідÑьких оÑтровів";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:43:"ÐікарагуанÑька кордоба";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:56:"ÐікарагуанÑька золота кордоба";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:50:"ÐікарагуанÑька кордоба оро";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;
s:43:"ÐідерландÑький гульден";}s:3:"NOK";a:2:{i:0;s:3:"NKr";i:1;s:29:"Ðорвезька крона";}s:3:"NPR";a:2:{i:0;s:3:"Nrs";i:1;s:31:"ÐепальÑька рупіÑ";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:42:"ÐовозеландÑький доларr";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:39:"ÐовозеландÑький фунт";}s:3:"OMR";a:2:{i:0;s:2:"RO";i:1;s:27:"ОманÑький ріал";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:38:"ОманÑький ріал Ñаїді";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:33:"ПанамÑька бальбоа";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:60:"ПридніÑтровÑький рублевий купон";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:54:"ПридніÑтровÑький новий рубль";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:43:"ПридніÑтровÑький рубль";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:31:"ПеруанÑький інті";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:40:"ПеруанÑький новий Ñол";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:29:"ПеруанÑький Ñол";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:43:"Кіна Папуа Ðової Гвінеї";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:33:"ФіліппінÑьке пеÑо";}s:3:"PKR";a:2:{i:0;s:3:"Pra";i:1;s:35:"ПакиÑтанÑька рупіÑ";}s:3:"PLN";a:2:{i:0;s:2:"Zl";i:1;s:31:"ПольÑький злотий";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:43:"ПольÑький злотий (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:35:"ПалеÑтинÑький фунт";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:39:"ПортугальÑький конто";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:41:"ПортугальÑький еÑкудо";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:41:"ПарагвайÑький гуарані";}s:3:"QAR";a:2:{i:0;s:2:"QR";i:1;s:29:"КатарÑький ріал";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:37:"РеюньйонÑький франк";}s:3:"ROL";a:2:{i:0;s:3:"leu";i:1;s:27:"РумунÑький лей";}s:3:"RON";a:2:{i:0;
s:3:"RON";i:1;s:38:"РумунÑький новий лей";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:31:"РоÑійÑький рубль";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:43:"РоÑійÑький рубль (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:35:"РуандійÑький франк";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:31:"СаудівÑький ріал";}s:3:"SBD";a:2:{i:0;s:3:"SI$";i:1;s:50:"Долар Соломонових ОÑтровів";}s:3:"SCR";a:2:{i:0;s:2:"SR";i:1;s:33:"СейшельÑька рупіÑ";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:31:"СуданÑький динар";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:29:"СуданÑький фунт";}s:3:"SEK";a:2:{i:0;s:3:"SKr";i:1;s:27:"ШведÑька крона";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:37:"СінгапурÑький долар";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:32:"Фунт СвÑтої Єлени";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:33:"СловенÑький толар";}s:3:"SKK";a:2:{i:0;s:2:"Sk";i:1;s:29:"Словацька крона";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:34:"Леоне Сьєрра-Леоне";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:28:"Ліра Сан-Марино";}s:3:"SOS";a:2:{i:0;s:7:"So. Sh.";i:1;s:37:"СомалійÑький шилінг";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:37:"СомалійÑький шилінг";}s:3:"SRG";a:2:{i:0;s:2:"Sf";i:1;s:39:"СуринамÑький гульден";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:33:"ШотландÑький фунт";}s:3:"STD";a:2:{i:0;s:2:"Db";i:1;s:46:"Добра Сан-Томе Ñ– ПрінÑіпі";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:48:"ЕÑкудо Сан-Томе Ñ– ПрінÑіпі";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:42:"РадÑнÑький новий рубль";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:31:"РадÑнÑький рубль";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:46:"Ель-СальвадорÑький колон";}s:3:"SYP";a:2:{i:0;s:2:"LS";i:1;s:29:"СирійÑький фунт";}s:3:"SZL";a:2:{i:0;s:1:"E";i:1;s:45:"СвазіÐ
»ÐµÐ½Ð´Ñькі лілангені";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:41:"Крона ТеркÑа Ñ– КайкоÑа";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:19:"Франк Чаду";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:31:"ТаїландÑький бат";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:31:"Таджицький рубль";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:33:"Таджицький Ñомоні";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:35:"ТуркменÑький манат";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:29:"ТуніÑький динар";}s:3:"TOP";a:2:{i:0;s:2:"T$";i:1;s:23:"Паанга Тонго";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:40:"Фунт Ñтерлінгів Тонго";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:33:"ТіморÑький еÑкудо";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:31:"ТіморÑька патака";}s:3:"TRL";a:2:{i:0;s:2:"TL";i:1;s:25:"Турецька ліра";}s:3:"TTD";a:2:{i:0;s:3:"TT$";i:1;s:45:"Долар Тринідаду Ñ– Тобаго";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:58:"Старий долар Тринідаду Ñ– Тобаго";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:23:"Долар Тувалу";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:44:"Ðовий тайванÑький долар";}s:3:"TZS";a:2:{i:0;s:4:"T Sh";i:1;s:39:"ТанзанійÑький шилінг";}s:3:"UAH";a:2:{i:0;s:7:"грн.";i:1;s:3:"UAH";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:45:"УкраїнÑький карбованець";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:49:"УгандійÑький шилінг (1966-1987)";}s:3:"UGX";a:2:{i:0;s:4:"U Sh";i:1;s:37:"УгандійÑький шилінг";}s:3:"USD";a:2:{i:0;s:1:"$";i:1;s:17:"Долар СШÐ";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:44:"УругвайÑьке Ñильне пеÑо";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:43:"УругвайÑьке пеÑо (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"Ur$";i:1;s:31:"УругвайÑьке пеÑо";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:25:"Узбецький Ñум";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:31:"ВаÑ
‚иканÑька ліра";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:57:"Ðовий донг Північного Вʼєтнаму";}s:3:"VEB";a:2:{i:0;s:2:"Be";i:1;s:43:"ВенеÑуельÑький болівар";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:73:"Долар БританÑьких ВіргінÑьких ОÑтровів";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:33:"ВʼєтнамÑький донг";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:44:"ВʼєтнамÑький новий донг";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:54:"Донг ВʼєтнамÑької РеÑпубліки";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:58:"ВʼєтнамÑький національний донг";}s:3:"VUV";a:2:{i:0;s:2:"VT";i:1;s:29:"ВануатÑька вату";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:38:"Фунт Західного Самоа";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:38:"Тала Західного Самоа";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:101:"Франк ЦентральноафриканÑького фінанÑового товариÑтва";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:48:"ÐзіатÑька валютна одиницÑ";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:12:"Золото";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:52:"ЄвропейÑька грошова одиницÑ";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:68:"ЄвропейÑька розрахункова Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ (XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:68:"ЄвропейÑька розрахункова Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ (XBD)";}s:3:"XCD";a:2:{i:0;s:3:"EC$";i:1;s:40:"Долар Східних Кирибів";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:28:"Ðовий франк КФÐ";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:54:"Спеціальні права запозиченнÑ";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:24:"Франк КФРBCEAEC";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:52:"ЄвропейÑька валютна одиницÑ";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:48:"Французький золотий франк";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s
:37:"Французький франк UIC";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:31:"ІÑламÑький динар";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:54:"Франк французьких метрополій";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:73:"Франк Французьких ÐнтильÑьких ОÑтровів";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:95:"Франк ЗахідноафриканÑького фінанÑового товариÑтва";}s:3:"XPF";a:2:{i:0;s:4:"CFPF";i:1;s:62:"Французький тихоокеанÑький франк";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:17:"Рубль РЕВ";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:29:"ЄменÑький динар";}s:3:"YER";a:2:{i:0;s:3:"YRl";i:1;s:27:"ЄменÑький ріал";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:50:"ЮгоÑлавÑький твердий динар";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:54:"Динар ЮгоÑлавÑької Федерації";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:40:"ЮгоÑлавÑький динар 1994";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:46:"ЮгоÑлавÑький новий динар";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:62:"ЮгоÑлавÑький конвертований динар";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:54:"ЮгоÑлавÑький жовтневий динар";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:60:"ЮгоÑлавÑький реформований динар";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:49:"ПівденноафриканÑький ранд";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:49:"ПівденноафриканÑький фунт";}s:3:"ZAR";a:2:{i:0;s:1:"R";i:1;s:49:"ПівденноафриканÑький ранд";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:31:"ЗамбійÑька квача";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:31:"ЗамбійÑький фунт";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:38:"ЗаїрÑький новий заїр";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:27:"ЗаїрÑький заїр";}s:3:"ZWD";a:2:{i:0;s:2:"Z$";i:1;s:39:"Зімбабв
ійÑький долар";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:16:"Календар";}s:9:"collation";a:1:{i:0;s:20:"СортуваннÑ";}s:8:"currency";a:1:{i:0;s:12:"Валюта";}}s:9:"Languages";a:138:{s:2:"aa";a:1:{i:0;s:16:"ÐфарÑька";}s:2:"ab";a:1:{i:0;s:16:"Ðбхазька";}s:2:"af";a:1:{i:0;s:16:"ÐфриканÑ";}s:2:"am";a:1:{i:0;s:14:"Ðмхарік";}s:2:"ar";a:1:{i:0;s:16:"ÐрабÑька";}s:2:"as";a:1:{i:0;s:18:"ÐÑÑамÑька";}s:2:"ay";a:1:{i:0;s:12:"Ðймара";}s:2:"az";a:1:{i:0;s:30:"ÐзербайджанÑька";}s:2:"ba";a:1:{i:0;s:20:"БашкирÑька";}s:2:"be";a:1:{i:0;s:20:"БілоруÑька";}s:2:"bg";a:1:{i:0;s:20:"БолгарÑька";}s:2:"bh";a:1:{i:0;s:22:"БіхарійÑька";}s:2:"bi";a:1:{i:0;s:24:"БіÑламійÑька";}s:2:"bn";a:1:{i:0;s:22:"БенгальÑька";}s:2:"bo";a:1:{i:0;s:18:"ТибетÑька";}s:2:"br";a:1:{i:0;s:20:"БретонÑька";}s:2:"ca";a:1:{i:0;s:22:"КаталонÑька";}s:2:"co";a:1:{i:0;s:24:"КорÑиканÑька";}s:2:"cs";a:1:{i:0;s:12:"ЧеÑька";}s:2:"cy";a:1:{i:0;s:20:"ВаллійÑька";}s:2:"da";a:1:{i:0;s:14:"ДатÑька";}s:2:"de";a:1:{i:0;s:16:"Ðімецька";}s:2:"dz";a:1:{i:0;s:15:"Дзонг-ке";}s:2:"el";a:1:{i:0;s:14:"Грецька";}s:2:"en";a:1:{i:0;s:20:"ÐнглійÑька";}s:2:"eo";a:1:{i:0;s:18:"ЕÑперанто";}s:2:"es";a:1:{i:0;s:18:"ІÑпанÑька";}s:2:"et";a:1:{i:0;s:18:"ЕÑтонÑька";}s:2:"eu";a:1:{i:0;s:12:"БаÑків";}s:2:"fa";a:1:{i:0;s:14:"ПерÑька";}s:2:"fi";a:1:{i:0;s:14:"ФінÑька";}s:2:"fj";a:1:{i:0;s:10:"Фіджі";}s:2:"fo";a:1:{i:0;s:18:"ФарерÑька";}s:2:"fr";a:1:{i:0;s:20:"Французька";}s:2:"fy";a:1:{i:0;s:14:"Фризька";}s:2:"ga";a:1:{i:0;s:20:"ІрландÑька";}s:2:"gd";a:1:{i:0;s:18:"ГаельÑька";}s:2:"gl";a:1:{i:0;s:22:"ГаліÑійÑька";}s:2:"gn";a:1:{i:0;s:14:"Гуарані";}s:2:"gu";a:1:{i:0;s:14:"ГуÑраті";}s:2:"ha";a:1:{i:0;s:10:"ХауÑа";}s:2:"he";
a:1:{i:0;s:10:"Іврит";}s:2:"hi";a:1:{i:0;s:10:"Гінді";}s:2:"hr";a:1:{i:0;s:20:"ХорватÑька";}s:2:"hu";a:1:{i:0;s:16:"УгорÑька";}s:2:"hy";a:1:{i:0;s:20:"ВірменÑька";}s:2:"ia";a:1:{i:0;s:22:"Інтерлінгва";}s:2:"id";a:1:{i:0;s:26:"ІндонезійÑька";}s:2:"ie";a:1:{i:0;s:22:"Інтерлінгва";}s:2:"ik";a:1:{i:0;s:14:"Інупіак";}s:2:"is";a:1:{i:0;s:20:"ІÑландÑька";}s:2:"it";a:1:{i:0;s:20:"ІталійÑька";}s:2:"ja";a:1:{i:0;s:16:"ЯпонÑька";}s:2:"jv";a:1:{i:0;s:16:"ЯванÑька";}s:2:"ka";a:1:{i:0;s:20:"ГрузинÑька";}s:2:"kk";a:1:{i:0;s:18:"КазахÑька";}s:2:"kl";a:1:{i:0;s:22:"КалаалліÑут";}s:2:"km";a:1:{i:0;s:18:"КхмерÑька";}s:2:"kn";a:1:{i:0;s:14:"Каннада";}s:2:"ko";a:1:{i:0;s:18:"КорейÑька";}s:2:"ks";a:1:{i:0;s:20:"КашмірÑька";}s:2:"ku";a:1:{i:0;s:16:"КурдÑька";}s:2:"ky";a:1:{i:0;s:18:"Киргизька";}s:2:"la";a:1:{i:0;s:18:"ЛатинÑька";}s:2:"ln";a:1:{i:0;s:14:"Лінгала";}s:2:"lo";a:1:{i:0;s:14:"ЛаоÑька";}s:2:"lt";a:1:{i:0;s:18:"ЛитовÑька";}s:2:"lv";a:1:{i:0;s:20:"ЛатвійÑька";}s:2:"mg";a:1:{i:0;s:26:"МалагаÑійÑька";}s:2:"mi";a:1:{i:0;s:10:"Маорі";}s:2:"mk";a:1:{i:0;s:22:"МакедонÑька";}s:2:"ml";a:1:{i:0;s:18:"МалайÑлам";}s:2:"mn";a:1:{i:0;s:22:"МонгольÑька";}s:2:"mo";a:1:{i:0;s:20:"МолдавÑька";}s:2:"mr";a:1:{i:0;s:14:"Маратхі";}s:2:"ms";a:1:{i:0;s:18:"МалайÑька";}s:2:"mt";a:1:{i:0;s:22:"МальтійÑька";}s:2:"my";a:1:{i:0;s:20:"БірманÑька";}s:2:"na";a:1:{i:0;s:10:"Ðауру";}s:2:"ne";a:1:{i:0;s:20:"ÐепальÑька";}s:2:"nl";a:1:{i:0;s:22:"ГолландÑька";}s:2:"no";a:1:{i:0;s:18:"Ðорвезька";}s:2:"oc";a:1:{i:0;s:12:"Окитан";}s:2:"om";a:1:{i:0;s:10:"Оромо";}s:2:"or";a:1:{i:0;s:8:"ОріÑ";}s:2:"pa";a:1:{i:0;s:16:"Панджабі";}s:2:"pl";a:1:{i:0;s:16:"ПольÑька";}s:2:"ps";a:1
:{i:0;s:10:"Пашто";}s:2:"pt";a:1:{i:0;s:26:"ПортугальÑька";}s:2:"qu";a:1:{i:0;s:10:"Кечуа";}s:2:"rm";a:1:{i:0;s:45:"РетророманÑькі діалекти";}s:2:"rn";a:1:{i:0;s:24:"КірундійÑька";}s:2:"ro";a:1:{i:0;s:18:"РумунÑька";}s:2:"ru";a:1:{i:0;s:18:"РоÑійÑька";}s:2:"rw";a:1:{i:0;s:20:"Кінаруанда";}s:2:"sa";a:1:{i:0;s:16:"СанÑкрит";}s:2:"sd";a:1:{i:0;s:14:"Сіндтхі";}s:2:"sg";a:1:{i:0;s:12:"Сангро";}s:2:"sh";a:1:{i:0;s:37:"СербÑько-хорватÑька";}s:2:"si";a:1:{i:0;s:22:"СингальÑька";}s:2:"sk";a:1:{i:0;s:18:"Словацька";}s:2:"sl";a:1:{i:0;s:20:"СловенÑька";}s:2:"sm";a:1:{i:0;s:20:"СамоанÑька";}s:2:"sn";a:1:{i:0;s:8:"Шона";}s:2:"so";a:1:{i:0;s:12:"Сомалі";}s:2:"sq";a:1:{i:0;s:18:"ÐлбанÑька";}s:2:"sr";a:1:{i:0;s:16:"СербÑька";}s:2:"ss";a:1:{i:0;s:14:"СіÑваті";}s:2:"st";a:1:{i:0;s:43:"Сото, південний діалект";}s:2:"su";a:1:{i:0;s:18:"СуданÑька";}s:2:"sv";a:1:{i:0;s:16:"ШведÑька";}s:2:"sw";a:1:{i:0;s:14:"Суахілі";}s:2:"ta";a:1:{i:0;s:20:"ТамільÑька";}s:2:"te";a:1:{i:0;s:12:"Телугу";}s:2:"tg";a:1:{i:0;s:18:"Таджицька";}s:2:"th";a:1:{i:0;s:14:"ТайÑька";}s:2:"ti";a:1:{i:0;s:14:"Тигріні";}s:2:"tk";a:1:{i:0;s:22:"ТуркменÑька";}s:2:"tl";a:1:{i:0;s:20:"ТагальÑька";}s:2:"tn";a:1:{i:0;s:22:"СетÑванÑька";}s:2:"to";a:1:{i:0;s:38:"Тонга (оÑтрови Тонга)";}s:2:"tr";a:1:{i:0;s:16:"Турецька";}s:2:"ts";a:1:{i:0;s:12:"ТÑонго";}s:2:"tt";a:1:{i:0;s:18:"ТатарÑька";}s:2:"tw";a:1:{i:0;s:6:"Тві";}s:2:"ug";a:1:{i:0;s:18:"УйгурÑька";}s:2:"uk";a:1:{i:0;s:20:"УкраїнÑька";}s:2:"ur";a:1:{i:0;s:8:"Урду";}s:2:"uz";a:1:{i:0;s:16:"Узбецька";}s:2:"vi";a:1:{i:0;s:22:"ВʼєтнамÑька";}s:2:"vo";a:1:{i:0;s:14:"Волапак";}s:2:"wo";a:1:{i:0;s:10:"Волоф";}s:2:"xh";a:1:{i:0;s
:10:"КхоÑа";}s:2:"yi";a:1:{i:0;s:8:"Ідиш";}s:2:"yo";a:1:{i:0;s:12:"Йоруба";}s:2:"za";a:1:{i:0;s:10:"Зуанг";}s:2:"zh";a:1:{i:0;s:18:"КитайÑька";}s:2:"zu";a:1:{i:0;s:16:"ЗулуÑька";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Cyrl";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:2:" ";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:7:"Scripts";a:52:{s:4:"Arab";a:1:{i:0;s:18:"ÐрабÑький";}s:4:"Armn";a:1:{i:0;s:22:"ВірменÑький";}s:4:"Beng";a:1:{i:0;s:24:"БенгальÑький";}s:4:"Bopo";a:1:{i:0;s:16:"Бопомофо";}s:4:"Brai";a:1:{i:0;s:12:"БрайлÑ";}s:4:"Buhd";a:1:{i:0;s:10:"Бухід";}s:4:"Cans";a:1:{i:0;s:75:"Уніфіковані Ñимволи канадÑьких туземців";}s:4:"Cher";a:1:{i:0;s:12:"Черокі";}s:4:"Copt";a:1:{i:0;s:18:"КоптÑький";}s:4:"Cprt";a:1:{i:0;s:18:"КіпрÑький";}s:4:"Cyrl";a:1:{i:0;s:20:"Кириличний";}s:4:"Deva";a:1:{i:0;s:20:"Деванагарі";}s:4:"Dsrt";a:1:{i:0;s:14:"Дезерет";}s:4:"Ethi";a:1:{i:0;s:20:"ЕфіопÑький";}s:4:"Geor";a:1:{i:0;s:22:"ГрузинÑький";}s:4:"Goth";a:1:{i:0;s:16:"ГотÑький";}s:4:"Grek";a:1:{i:0;s:16:"Грецький";}s:4:"Gujr";a:1:{i:0;s:14:"ГуÑраті";}s:4:"Guru";a:1:{i:0;s:16:"Гурмукхі";}s:4:"Hang";a:1:{i:0;s:12:"Хангул";}s:4:"Hano";a:1:{i:0;s:12:"Хануну";}s:4:"Hebr";a:1:{i:0;s:20:"ЄврейÑький";}s:4:"Hira";a:1:{i:0;s:16:"Хірагана";}s:4:"Ital";a:1:{i:0;s:34:"ДавньоіталійÑький";}s:4:"Kana";a:1:{i:0;s:16:"Катакана";}s:4:"Khmr";a:1:{i:0;s:20:"КхмерÑький";}s:4:"Knda";a:1:{i:0;s:14:"Каннада";}s:4:"Laoo";a:1:{i:0;s:16:"ЛаоÑький";}s:4:"Latn";a:1:{i:0;s:20:"ЛатинÑький";}s:4:"Limb";a:1:{i:0;s:5:"Limbu";}s:4:"Linb";a:1:{i:0;s:19:"Лінійний Ð’";}s:4:"Mlym";a:1:{i:0;s:18:"МалайÑлам";}s:4:"Mong";a:1:{i:0;s:24:"МонгольÑький";}s:4
:"Mymr";a:1:{i:0;s:14:"МʼÑнмар";}s:4:"Ogam";a:1:{i:0;s:34:"ДавньоірландÑький";}s:4:"Orya";a:1:{i:0;s:8:"ОріÑ";}s:4:"Osma";a:1:{i:0;s:20:"ОÑманÑький";}s:4:"Qaai";a:1:{i:0;s:24:"УÑпадкований";}s:4:"Runr";a:1:{i:0;s:8:"Руни";}s:4:"Shaw";a:1:{i:0;s:6:"Шоу";}s:4:"Sinh";a:1:{i:0;s:24:"СингальÑький";}s:4:"Syrc";a:1:{i:0;s:20:"СирійÑький";}s:4:"Tagb";a:1:{i:0;s:16:"Тагбанва";}s:4:"Tale";a:1:{i:0;s:11:"Тай-лі";}s:4:"Taml";a:1:{i:0;s:22:"ТамільÑький";}s:4:"Telu";a:1:{i:0;s:12:"Телугу";}s:4:"Tglg";a:1:{i:0;s:22:"ТагальÑький";}s:4:"Thaa";a:1:{i:0;s:10:"Таана";}s:4:"Thai";a:1:{i:0;s:16:"ТайÑький";}s:4:"Tibt";a:1:{i:0;s:20:"ТибетÑький";}s:4:"Yiii";a:1:{i:0;s:4:"Йї";}s:4:"Zyyy";a:1:{i:0;s:24:"Ðевизначений";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:39:"БуддійÑький календар";}s:7:"chinese";a:1:{i:0;s:37:"КитайÑький календар";}s:9:"gregorian";a:1:{i:0;s:45:"ГригоріанÑький календар";}s:6:"hebrew";a:1:{i:0;s:37:"ЄврейÑький календар";}s:7:"islamic";a:1:{i:0;s:45:"МуÑульманÑький календар";}s:13:"islamic-civil";a:1:{i:0;s:66:"МуÑульманÑький друкований календар";}s:8:"japanese";a:1:{i:0;s:35:"ЯпонÑький календар";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:27:"ПрÑмий порÑдок";}s:9:"phonebook";a:1:{i:0;s:29:"Телефонна книга";}s:6:"pinyin";a:1:{i:0;s:21:"ПорÑдок Pinyin";}s:6:"stroke";a:1:{i:0;s:33:"Штриховий порÑдок";}s:11:"traditional";a:1:{i:0;s:22:"Традиційний";}}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:5:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:23:"EEEE, d MMMM yyyy 'Ñ€.'";i:5;s:11:"d MMMM yy
yy";i:6;s:10:"d MMM yyyy";i:7;s:8:"dd.MM.yy";i:8;s:7:"{1} {0}";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:4:"Ðд";i:1;s:4:"Пн";i:2;s:4:"Ð’Ñ‚";i:3;s:4:"Ср";i:4;s:4:"Чт";i:5;s:4:"Пт";i:6;s:4:"Сб";}s:6:"narrow";a:7:{i:0;s:2:"Ð";i:1;s:2:"П";i:2;s:2:"Ð’";i:3;s:2:"С";i:4;s:2:"Ч";i:5;s:2:"П";i:6;s:2:"С";}s:4:"wide";a:7:{i:0;s:12:"ÐеділÑ";i:1;s:18:"Понеділок";i:2;s:16:"Вівторок";i:3;s:12:"Середа";i:4;s:12:"Четвер";i:5;s:16:"ПʼÑтницÑ";i:6;s:12:"Субота";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:11:"до н.е.";i:1;s:6:"н.е.";}}s:10:"monthNames";a:2:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:6:"Січ";i:1;s:6:"Лют";i:2;s:6:"Бер";i:3;s:6:"Кві";i:4;s:6:"Тра";i:5;s:6:"Чер";i:6;s:6:"Лип";i:7;s:6:"Сер";i:8;s:6:"Вер";i:9;s:6:"Жов";i:10;s:6:"ЛиÑ";i:11;s:6:"Гру";}s:6:"narrow";a:12:{i:0;s:2:"С";i:1;s:2:"Л";i:2;s:2:"Б";i:3;s:2:"К";i:4;s:2:"Т";i:5;s:2:"Ч";i:6;s:2:"Л";i:7;s:2:"С";i:8;s:2:"Ð’";i:9;s:2:"Ж";i:10;s:2:"Л";i:11;s:2:"Г";}s:4:"wide";a:12:{i:0;s:10:"ÑічнÑ";i:1;s:12:"лютого";i:2;s:14:"березнÑ";i:3;s:12:"квітнÑ";i:4;s:12:"травнÑ";i:5;s:12:"червнÑ";i:6;s:10:"липнÑ";i:7;s:12:"ÑерпнÑ";i:8;s:14:"вереÑнÑ";i:9;s:12:"жовтнÑ";i:10;s:18:"лиÑтопада";i:11;s:12:"груднÑ";}}s:11:"stand-alone";a:3:{s:11:"abbreviated";a:12:{i:0;s:6:"Січ";i:1;s:6:"Лют";i:2;s:6:"Бер";i:3;s:6:"Кві";i:4;s:6:"Тра";i:5;s:6:"Чер";i:6;s:6:"Лип";i:7;s:6:"Сер";i:8;s:6:"Вер";i:9;s:6:"Жов";i:10;s:6:"ЛиÑ";i:11;s:6:"Гру";}s:6:"narrow";a:12:{i:0;s:2:"С";i:1;s:2:"Л";i:2;s:2:"Б";i:3;s:2:"К";i:4;s:2:"Т";i:5;s:2:"Ч";i:6;s:2:"Л";i:7;s:2:"С";i:8;s:2:"Ð’";i:9;s:2:"Ж";i:10;s:2:"Л";i:11;s:2:"Г";}s:4:"wide";a:12:{i:0;s:12:"Січень";i:1;s:10:"Лютий";i:2;s:16:"Березень";i:3;s:14:"Квітень";i:4;s:14:"Травень";i:5;s:14:"Червень";i:6;s:12:"Липень";i:7;s:14:"Серпень";i:8;
s:16:"ВереÑень";i:9;s:14:"Жовтень";i:10;s:16:"ЛиÑтопад";i:11;s:14:"Грудень";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/uk_UA.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/uk_UA.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/uk_UA.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/vi.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/vi.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/vi.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:8:{s:9:"Countries";a:187:{s:2:"AE";a:1:{i:0;s:49:"Các Tiểu VÆ°Æ¡ng quốc A-rập Thống nhất";}s:2:"AF";a:1:{i:0;s:14:"Ãp-ga-ni-xtan";}s:2:"AG";a:1:{i:0;s:24:"An-ti-gu-a và Ba-bu-Ä‘a";}s:2:"AL";a:1:{i:0;s:8:"An-ba-ni";}s:2:"AM";a:1:{i:0;s:12:"Ãc-mê-ni-a";}s:2:"AO";a:1:{i:0;s:11:"Ä‚ng-gô-la";}s:2:"AR";a:1:{i:0;s:13:"Ãc-hen-ti-na";}s:2:"AT";a:1:{i:0;s:3:"Ão";}s:2:"AU";a:1:{i:0;s:3:"Úc";}s:2:"AZ";a:1:{i:0;s:16:"Ai-déc-bai-gian";}s:2:"BA";a:1:{i:0;s:28:"Bô-xni-a Héc-xê-gô-vi-na";}s:2:"BB";a:1:{i:0;s:14:"Bác-ba-đốt";}s:2:"BD";a:1:{i:0;s:14:"Băng-la-đét";}s:2:"BE";a:1:{i:0;s:4:"Bỉ";}s:2:"BF";a:1:{i:0;s:20:"Buốc-ki-na Pha-xô";}s:2:"BG";a:1:{i:0;s:9:"Bun-ga-ri";}s:2:"BH";a:1:{i:0;s:6:"Ba-ren";}s:2:"BI";a:1:{i:0;s:10:"Bu-run-Ä‘i";}s:2:"BJ";a:1:{i:0;s:8:"Bê-nanh";}s:2:"BN";a:1:{i:0;s:8:"Bru-nây";}s:2:"BO";a:1:{i:0;s:11:"Bô-li-vi-a";}s:2:"BR";a:1:{i:0;s:7:"Bra-xin";}s:2:"BS";a:1:{i:0;s:8:"Ba-ha-ma";}s:2:"BW";a:1:{i:0;s:12:"Bốt-xoa-na";}s:2:"BY";a:1:{i:0;s:11:"Bê-la-rút";}s:2:"BZ";a:1:{i:0;s:10:"Bê-li-xê";}s:2:"CA";a:1:{i:0;s:9:"Ca-na-Ä‘a";}s:2:"CF";a:1:{i:0;s:21:"Cá»™ng hòa Trung Phi";}s:2:"CG";a:1:{i:0;s:9:"Công-gô";}s:2:"CH";a:1:{i:0;s:10:"Thụy SÄ©";}s:2:"CI";a:1:{i:0;s:16:"Bá» Biển Ngà";}s:2:"CL";a:1:{i:0;s:7:"Chi-lê";}s:2:"CM";a:1:{i:0;s:10:"Ca-mÆ¡-run";}s:2:"CN";a:1:{i:0;s:12:"Trung Quốc";}s:2:"CO";a:1:{i:0;s:13:"Cô-lôm-bi-a";}s:2:"CR";a:1:{i:0;s:15:"Cốt-xta Ri-ca";}s:2:"CU";a:1:{i:0;s:5:"Cu Ba";}s:2:"CV";a:1:{i:0;s:7:"Cáp-ve";}s:2:"CY";a:1:{i:0;s:4:"Síp";}s:2:"CZ";a:1:{i:0;s:16:"Cá»™ng hòa Séc";}s:2:"DE";a:1:{i:0;s:6:"Äức";}s:2:"DJ";a:1:{i:0;s:8:"Gi-bu-ti";}s:2:"DK";a:1:{i:0;s:11:"Äan Mạch";}s:2:"DZ";a:1:{i:0;s:10:"An-giê-ri";}s:2:"EC";a:1:{i:0;s:11:"Ê-cu-a-Ä‘o";}s:2:"EE";a:1:{i:0;s:11:"E-xtô-ni-a";}s:2:"EG";a:1:{i:0;s:8:"Ai Cập";}s:2:"EH";a:1:{i:0;s:11:"Tây Sahara";}s:2:"ER";a:1:{i:0;s:15:"Ê-ri-tÆ¡-rê-a";}s:2:"ES";a:1:{i:0;s:12:"Tây Ban Nha";}s:2:"ET";a:1:{i:0;s:13:"Ê-ti-ô-pi-a";}s:2:"FI";a:1:{i:0;s:10:"Phần Lan";}s:2:"FJ";a:1:{i:0;s:6
:"Phi-gi";}s:2:"FM";a:1:{i:0;s:16:"Mi-crô-nê-xi-a";}s:2:"FR";a:1:{i:0;s:5:"Pháp";}s:2:"GA";a:1:{i:0;s:8:"Ga-bông";}s:2:"GB";a:1:{i:0;s:18:"VÆ°Æ¡ng quốc Anh";}s:2:"GD";a:1:{i:0;s:11:"Grê-na-Ä‘a";}s:2:"GE";a:1:{i:0;s:8:"Gru-di-a";}s:2:"GH";a:1:{i:0;s:6:"Gha-na";}s:2:"GM";a:1:{i:0;s:9:"Găm-bi-a";}s:2:"GN";a:1:{i:0;s:7:"Ghi-nê";}s:2:"GQ";a:1:{i:0;s:20:"Ghi-nê Xích-đạo";}s:2:"GR";a:1:{i:0;s:8:"Hy Lạp";}s:2:"GT";a:1:{i:0;s:13:"Goa-tê-ma-la";}s:2:"GW";a:1:{i:0;s:16:"Ghi-nê Bít-xao";}s:2:"GY";a:1:{i:0;s:8:"Guy-a-na";}s:2:"HN";a:1:{i:0;s:13:"Hôn-Ä‘u-rát";}s:2:"HR";a:1:{i:0;s:11:"Crô-a-ti-a";}s:2:"HT";a:1:{i:0;s:7:"Ha-i-ti";}s:2:"HU";a:1:{i:0;s:10:"Hung-ga-ri";}s:2:"ID";a:1:{i:0;s:11:"Nam DÆ°Æ¡ng";}s:2:"IE";a:1:{i:0;s:6:"Ai-len";}s:2:"IL";a:1:{i:0;s:8:"I-xra-en";}s:2:"IN";a:1:{i:0;s:10:"Ấn Äá»™";}s:2:"IQ";a:1:{i:0;s:7:"I-rắc";}s:2:"IR";a:1:{i:0;s:5:"I-ran";}s:2:"IS";a:1:{i:0;s:10:"Ai-xÆ¡-len";}s:2:"IT";a:1:{i:0;s:2:"Ã";}s:2:"JM";a:1:{i:0;s:9:"Ha-mai-ca";}s:2:"JO";a:1:{i:0;s:12:"Gióc-Ä‘a-ni";}s:2:"JP";a:1:{i:0;s:12:"Nhật Bản";}s:2:"KE";a:1:{i:0;s:8:"Kê-ni-a";}s:2:"KG";a:1:{i:0;s:16:"CÆ°-rÆ¡-gÆ°-xtan";}s:2:"KH";a:1:{i:0;s:9:"Campuchia";}s:2:"KI";a:1:{i:0;s:11:"Ki-ri-ba-ti";}s:2:"KM";a:1:{i:0;s:7:"Cô-mô";}s:2:"KN";a:1:{i:0;s:19:"Xan-kít và Nê-vi";}s:2:"KP";a:1:{i:0;s:19:"Bắc Triá»u Tiên";}s:2:"KR";a:1:{i:0;s:11:"Hàn Quốc";}s:2:"KW";a:1:{i:0;s:8:"Cô-oét";}s:2:"KZ";a:1:{i:0;s:13:"Ka-dắc-xtan";}s:2:"LA";a:1:{i:0;s:4:"Lào";}s:2:"LB";a:1:{i:0;s:8:"Li-băng";}s:2:"LC";a:1:{i:0;s:9:"Xan Lu-xi";}s:2:"LI";a:1:{i:0;s:14:"Lich-ten-xtên";}s:2:"LK";a:1:{i:0;s:10:"Xri Lan-ca";}s:2:"LR";a:1:{i:0;s:11:"Li-bê-ri-a";}s:2:"LS";a:1:{i:0;s:12:"Lê-xô-thô";}s:2:"LT";a:1:{i:0;s:12:"Li-tu-a-ni-a";}s:2:"LU";a:1:{i:0;s:13:"Lúc-xăm-bua";}s:2:"LV";a:1:{i:0;s:9:"Lát-vi-a";}s:2:"LY";a:1:{i:0;s:5:"Li-bi";}s:2:"MA";a:1:{i:0;s:8:"Ma-rốc";}s:2:"MC";a:1:{i:0;s:10:"Mô-na-cô";}s:2:"MD";a:1:{i:0;s:12:"Môn-đô-va";}s:2:"MG";a:1:{i:0;s:15:"Ma-Ä‘a-gát-xca";}s:2:"MH";a:1:{i:0;s:22:"Quần đảo Mác-sa
n";}s:2:"MK";a:1:{i:0;s:16:"Ma-xê-đô-ni-a";}s:2:"ML";a:1:{i:0;s:5:"Ma-li";}s:2:"MM";a:1:{i:0;s:8:"Mi-an-ma";}s:2:"MN";a:1:{i:0;s:10:"Mông Cổ";}s:2:"MR";a:1:{i:0;s:12:"Mô-ri-ta-ni";}s:2:"MT";a:1:{i:0;s:6:"Man-ta";}s:2:"MU";a:1:{i:0;s:10:"Mô-ri-xÆ¡";}s:2:"MV";a:1:{i:0;s:11:"Man-Ä‘i-vÆ¡";}s:2:"MW";a:1:{i:0;s:8:"Ma-la-uy";}s:2:"MX";a:1:{i:0;s:10:"Mê-hi-cô";}s:2:"MY";a:1:{i:0;s:11:"Ma-lay-xi-a";}s:2:"MZ";a:1:{i:0;s:14:"Mô-dăm-bích";}s:2:"NA";a:1:{i:0;s:11:"Nam-mi-bi-a";}s:2:"NE";a:1:{i:0;s:7:"Ni-giê";}s:2:"NG";a:1:{i:0;s:12:"Ni-giê-ri-a";}s:2:"NI";a:1:{i:0;s:12:"Ni-ca-ra-goa";}s:2:"NL";a:1:{i:0;s:7:"Hà Lan";}s:2:"NO";a:1:{i:0;s:5:"Na Uy";}s:2:"NP";a:1:{i:0;s:7:"Nê-pan";}s:2:"NZ";a:1:{i:0;s:11:"Niu Di-lân";}s:2:"OM";a:1:{i:0;s:6:"Ô-man";}s:2:"PA";a:1:{i:0;s:8:"Pa-na-ma";}s:2:"PE";a:1:{i:0;s:6:"Pê-ru";}s:2:"PG";a:1:{i:0;s:19:"Pa-pu-a Niu Ghi-nê";}s:2:"PH";a:1:{i:0;s:11:"Phi-lip-pin";}s:2:"PK";a:1:{i:0;s:10:"Pa-ki-xtan";}s:2:"PL";a:1:{i:0;s:6:"Ba Lan";}s:2:"PT";a:1:{i:0;s:14:"Bồ Äào Nha";}s:2:"PY";a:1:{i:0;s:10:"Pa-ra-goay";}s:2:"QA";a:1:{i:0;s:5:"Ca-ta";}s:2:"RO";a:1:{i:0;s:8:"Ru-ma-ni";}s:2:"RU";a:1:{i:0;s:3:"Nga";}s:2:"RW";a:1:{i:0;s:9:"Ru-an-Ä‘a";}s:2:"SA";a:1:{i:0;s:15:"A-rập Xê-út";}s:2:"SB";a:1:{i:0;s:27:"Quần đảo Xô-lô-mông";}s:2:"SC";a:1:{i:0;s:8:"Xây-sen";}s:2:"SD";a:1:{i:0;s:9:"Xu-đăng";}s:2:"SE";a:1:{i:0;s:14:"Thụy Äiển";}s:2:"SG";a:1:{i:0;s:9:"Xin-ga-po";}s:2:"SI";a:1:{i:0;s:13:"Xlô-ven-ni-a";}s:2:"SK";a:1:{i:0;s:12:"Xlô-va-ki-a";}s:2:"SL";a:1:{i:0;s:16:"Xi-ê-ra Lê-ôn";}s:2:"SM";a:1:{i:0;s:13:"Xan Ma-ri-nô";}s:2:"SN";a:1:{i:0;s:11:"Xê-nê-gan";}s:2:"SO";a:1:{i:0;s:9:"Xô-ma-li";}s:2:"SP";a:1:{i:0;s:8:"Séc-bia";}s:2:"SR";a:1:{i:0;s:9:"Xu-ri-nam";}s:2:"ST";a:1:{i:0;s:27:"Xao Tô-mê và Prin-xi-pê";}s:2:"SV";a:1:{i:0;s:13:"En-san-va-Ä‘o";}s:2:"SY";a:1:{i:0;s:5:"Xi-ri";}s:2:"SZ";a:1:{i:0;s:10:"Xoa-di-len";}s:2:"TD";a:1:{i:0;s:4:"Sát";}s:2:"TG";a:1:{i:0;s:7:"Tô-gô";}s:2:"TH";a:1:{i:0;s:9:"Thái Lan";}s:2:"TJ";a:1:{i:0;s:15:"Tát-gi-ki-xtan";}s:2:"TM";a:1:{
i:0;s:18:"Tuốc-mê-ni-xtan";}s:2:"TN";a:1:{i:0;s:9:"Tuy-ni-di";}s:2:"TO";a:1:{i:0;s:8:"Tông-ga";}s:2:"TR";a:1:{i:0;s:15:"Thổ NhÄ© Kỳ";}s:2:"TT";a:1:{i:0;s:27:"Tri-ni-đát và Tô-ba-gô";}s:2:"TV";a:1:{i:0;s:8:"Tu-va-lu";}s:2:"TW";a:1:{i:0;s:10:"Äài Loan";}s:2:"TZ";a:1:{i:0;s:11:"Tan-da-ni-a";}s:2:"UA";a:1:{i:0;s:9:"U-crai-na";}s:2:"UG";a:1:{i:0;s:9:"U-gan-Ä‘a";}s:2:"US";a:1:{i:0;s:8:"Hoa Kỳ";}s:2:"UY";a:1:{i:0;s:9:"U-ru-goay";}s:2:"UZ";a:1:{i:0;s:17:"U-dÆ¡-bê-ki-xtan";}s:2:"VA";a:1:{i:0;s:11:"Va-ti-căng";}s:2:"VC";a:1:{i:0;s:27:"Xan Vin-xen và Grê-na-din";}s:2:"VE";a:1:{i:0;s:16:"Vê-nê-zu-ê-la";}s:2:"VN";a:1:{i:0;s:10:"Việt Nam";}s:2:"VU";a:1:{i:0;s:10:"Va-nu-a-tu";}s:2:"WS";a:1:{i:0;s:6:"Xa-moa";}s:2:"YE";a:1:{i:0;s:8:"Y-ê-men";}s:2:"YU";a:1:{i:0;s:7:"Nam TÆ°";}s:2:"ZA";a:1:{i:0;s:7:"Nam Phi";}s:2:"ZM";a:1:{i:0;s:9:"Dăm-bi-a";}s:2:"ZW";a:1:{i:0;s:12:"Dim-ba-bu-ê";}}s:10:"Currencies";a:1:{s:3:"VND";a:2:{i:0;s:2:"Ä‘";i:1;s:7:"đồng";}}s:9:"Languages";a:60:{s:2:"ar";a:1:{i:0;s:15:"Tiếng A-rập";}s:2:"az";a:1:{i:0;s:24:"Tiếng Ai-déc-bai-gian";}s:2:"be";a:1:{i:0;s:19:"Tiếng Bê-la-rút";}s:2:"bg";a:1:{i:0;s:17:"Tiếng Bun-ga-ri";}s:2:"bo";a:1:{i:0;s:19:"Tiếng Tây Tạng";}s:2:"ca";a:1:{i:0;s:19:"Tiếng Ca-ta-lăng";}s:2:"cs";a:1:{i:0;s:12:"Tiếng Séc";}s:2:"da";a:1:{i:0;s:19:"Tiếng Äan Mạch";}s:2:"de";a:1:{i:0;s:14:"Tiếng Äức";}s:2:"el";a:1:{i:0;s:16:"Tiếng Hy Lạp";}s:2:"en";a:1:{i:0;s:11:"Tiếng Anh";}s:2:"eo";a:1:{i:0;s:25:"Tiếng Quốc Tế Ngữ";}s:2:"es";a:1:{i:0;s:20:"Tiếng Tây Ban Nha";}s:2:"et";a:1:{i:0;s:19:"Tiếng E-xtô-ni-a";}s:2:"fa";a:1:{i:0;s:14:"Tiếng Ba TÆ°";}s:2:"fi";a:1:{i:0;s:18:"Tiếng Phần Lan";}s:2:"fr";a:1:{i:0;s:13:"Tiếng Pháp";}s:2:"ga";a:1:{i:0;s:14:"Tiếng Ai-len";}s:2:"he";a:1:{i:0;s:16:"Tiếng Hê-brÆ¡";}s:2:"hi";a:1:{i:0;s:15:"Tiếng Hin-Ä‘i";}s:2:"hr";a:1:{i:0;s:19:"Tiếng Crô-a-ti-a";}s:2:"hu";a:1:{i:0;s:18:"Tiếng Hung-ga-ri";}s:2:"hy";a:1:{i:0;s:18:"Tiếng Ãc-mê-ni";}s:2:"ia";a:1:{i:0;s:30:"Tiếng Khoa
 Há»c Quốc Tế";}s:2:"id";a:1:{i:0;s:23:"Tiếng In-đô-nê-xia";}s:2:"is";a:1:{i:0;s:18:"Tiếng Ai-xÆ¡-len";}s:2:"it";a:1:{i:0;s:10:"Tiếng Ã";}s:2:"ja";a:1:{i:0;s:14:"Tiếng Nhật";}s:2:"jv";a:1:{i:0;s:14:"Tiếng Gia-va";}s:2:"km";a:1:{i:0;s:17:"Tiếng Campuchia";}s:2:"kn";a:1:{i:0;s:18:"Tiếng Kan-na-Ä‘a";}s:2:"ko";a:1:{i:0;s:19:"Tiếng Hàn Quốc";}s:2:"la";a:1:{i:0;s:15:"Tiếng La-tinh";}s:2:"lo";a:1:{i:0;s:12:"Tiếng Lào";}s:2:"lt";a:1:{i:0;s:15:"Tiếng Lít-va";}s:2:"lv";a:1:{i:0;s:17:"Tiếng Lát-vi-a";}s:2:"mk";a:1:{i:0;s:24:"Tiếng Ma-xê-đô-ni-a";}s:2:"mn";a:1:{i:0;s:18:"Tiếng Mông Cổ";}s:2:"ms";a:1:{i:0;s:19:"Tiếng Ma-lay-xi-a";}s:2:"ne";a:1:{i:0;s:15:"Tiếng Nê-pan";}s:2:"nl";a:1:{i:0;s:15:"Tiếng Hà Lan";}s:2:"no";a:1:{i:0;s:13:"Tiếng Na Uy";}s:2:"pl";a:1:{i:0;s:14:"Tiếng Ba Lan";}s:2:"pt";a:1:{i:0;s:22:"Tiếng Bồ Äào Nha";}s:2:"ro";a:1:{i:0;s:16:"Tiếng Ru-ma-ni";}s:2:"ru";a:1:{i:0;s:11:"Tiếng Nga";}s:2:"sa";a:1:{i:0;s:14:"Tiếng Phạn";}s:2:"sk";a:1:{i:0;s:17:"Tiếng Xlô-vác";}s:2:"sl";a:1:{i:0;s:16:"Tiếng Xlô-ven";}s:2:"so";a:1:{i:0;s:17:"Tiếng Xô-ma-li";}s:2:"sq";a:1:{i:0;s:16:"Tiếng An-ba-ni";}s:2:"sr";a:1:{i:0;s:15:"Tiếng Séc-bi";}s:2:"sv";a:1:{i:0;s:22:"Tiếng Thụy Äiển";}s:2:"th";a:1:{i:0;s:13:"Tiếng Thái";}s:2:"tr";a:1:{i:0;s:23:"Tiếng Thổ NhÄ© Kỳ";}s:2:"uk";a:1:{i:0;s:17:"Tiếng U-crai-na";}s:2:"uz";a:1:{i:0;s:20:"Tiếng U-dÆ¡-bếch";}s:2:"vi";a:1:{i:0;s:14:"Tiếng Việt";}s:2:"yi";a:1:{i:0;s:14:"Tiếng Y-Ä‘it";}s:2:"zh";a:1:{i:0;s:20:"Tiếng Trung Quốc";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Latn";}s:14:"NumberElements";a:12:{i:0;s:1:",";i:1;s:1:".";i:2;s:1:";";i:3;s:1:"%";i:4;s:1:"0";i:5;s:1:"#";i:6;s:1:"-";i:7;s:1:"E";i:8;s:3:"‰";i:9;s:3:"∞";i:10;s:3:"�";i:11;s:1:"+";}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;-#,##0.00 ¤";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:6:{s:11:"AmPmMarkers";a:2:{i:0;s:2:"
SA";i:1;s:2:"CH";}s:26:"DateTimeElements:intvector";a:2:{i:0;i:2;i:1;i:1;}s:16:"DateTimePatterns";a:9:{i:0;s:10:"HH:mm:ss z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:33:"EEEE, 'ngày' dd MMMM 'năm' yyyy";i:5;s:33:"'Ngày' dd 'tháng' M 'năm' yyyy";i:6;s:10:"dd-MM-yyyy";i:7;s:10:"dd/MM/yyyy";i:8;s:7:"{0} {1}";}s:8:"dayNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:7:{i:0;s:2:"CN";i:1;s:4:"Th 2";i:2;s:4:"Th 3";i:3;s:4:"Th 4";i:4;s:4:"Th 5";i:5;s:4:"Th 6";i:6;s:4:"Th 7";}s:4:"wide";a:7:{i:0;s:12:"Chủ nhật";i:1;s:9:"Thứ hai";i:2;s:8:"Thứ ba";i:3;s:9:"Thứ tÆ°";i:4;s:10:"Thứ năm";i:5;s:10:"Thứ sáu";i:6;s:11:"Thứ bảy";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:6:"tr. CN";i:1;s:6:"sau CN";}}s:10:"monthNames";a:1:{s:6:"format";a:2:{s:11:"abbreviated";a:12:{i:0;s:5:"thg 1";i:1;s:5:"thg 2";i:2;s:5:"thg 3";i:3;s:5:"thg 4";i:4;s:5:"thg 5";i:5;s:5:"thg 6";i:6;s:5:"thg 7";i:7;s:5:"thg 8";i:8;s:5:"thg 9";i:9;s:6:"thg 10";i:10;s:6:"thg 11";i:11;s:6:"thg 12";}s:4:"wide";a:12:{i:0;s:12:"tháng má»™t";i:1;s:10:"tháng hai";i:2;s:9:"tháng ba";i:3;s:10:"tháng tÆ°";i:4;s:11:"tháng năm";i:5;s:11:"tháng sáu";i:6;s:12:"tháng bảy";i:7;s:11:"tháng tám";i:8;s:12:"tháng chín";i:9;s:14:"tháng mÆ°á»i";i:10;s:20:"tháng mÆ°á»i má»™t";i:11;s:18:"tháng mÆ°á»i hai";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/vi_VN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/vi_VN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/vi_VN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:12:{s:9:"Countries";a:240:{s:2:"AD";a:1:{i:0;s:9:"安é“å°”";}s:2:"AE";a:1:{i:0;s:24:"阿拉伯è”åˆé…‹é•¿å›½";}s:2:"AF";a:1:{i:0;s:9:"阿富汗";}s:2:"AG";a:1:{i:0;s:21:"安æ瓜和巴布达";}s:2:"AI";a:1:{i:0;s:9:"安圭拉";}s:2:"AL";a:1:{i:0;s:15:"阿尔巴尼亚";}s:2:"AM";a:1:{i:0;s:12:"亚美尼亚";}s:2:"AN";a:1:{i:0;s:24:"è·å±žå®‰çš„列斯群岛";}s:2:"AO";a:1:{i:0;s:9:"安哥拉";}s:2:"AQ";a:1:{i:0;s:9:"å—æžæ´²";}s:2:"AR";a:1:{i:0;s:9:"阿根廷";}s:2:"AS";a:1:{i:0;s:15:"美属è¨æ‘©äºš";}s:2:"AT";a:1:{i:0;s:9:"奥地利";}s:2:"AU";a:1:{i:0;s:12:"澳大利亚";}s:2:"AW";a:1:{i:0;s:9:"阿é²å·´";}s:2:"AZ";a:1:{i:0;s:12:"阿塞拜疆";}s:2:"BA";a:1:{i:0;s:30:"波斯尼亚和黑山共和国";}s:2:"BB";a:1:{i:0;s:12:"巴巴多斯";}s:2:"BD";a:1:{i:0;s:12:"孟加拉国";}s:2:"BE";a:1:{i:0;s:9:"比利时";}s:2:"BF";a:1:{i:0;s:15:"布基纳法索";}s:2:"BG";a:1:{i:0;s:12:"ä¿åŠ åˆ©äºš";}s:2:"BH";a:1:{i:0;s:6:"å·´æž—";}s:2:"BI";a:1:{i:0;s:9:"布隆迪";}s:2:"BJ";a:1:{i:0;s:6:"è´å®";}s:2:"BM";a:1:{i:0;s:9:"百慕大";}s:2:"BN";a:1:{i:0;s:6:"文莱";}s:2:"BO";a:1:{i:0;s:12:"玻利维亚";}s:2:"BR";a:1:{i:0;s:6:"巴西";}s:2:"BS";a:1:{i:0;s:9:"巴哈马";}s:2:"BT";a:1:{i:0;s:6:"ä¸ä¸¹";}s:2:"BV";a:1:{i:0;s:12:"布维特岛";}s:2:"BW";a:1:{i:0;s:12:"åšèŒ¨ç“¦çº³";}s:2:"BY";a:1:{i:0;s:12:"白俄罗斯";}s:2:"BZ";a:1:{i:0;s:9:"伯利兹";}s:2:"CA";a:1:{i:0;s:9:"加拿大";}s:2:"CC";a:1:{i:0;s:15:"科科斯群岛";}s:2:"CD";a:1:{i:0;s:21:"刚果民主共和国";}s:2:"CF";a:1:{i:0;s:15:"中éžå…±å’Œå›½";}s:2:"CG";a:1:{i:0;s:6:"刚果";}s:2:"CH";a:1:{i:0;s:6:"瑞士";}s:2:"CI";a:1:{i:0;s:12:"象牙海岸";}s:2:"CK";a:1:{i:0;s:12:"库克群岛";}s:2:"CL";a:1:{i:0;s:6:"智利";}s:2:"CM";a:1:{i:0;s:9:"喀麦隆";}s:2:"CN";a:1:{i:0;s:6:"中国";}s:2:"CO";a:1:{i:0;s:12:"哥伦比亚";}s:2:"CR";a:1:{i:0;s:15:"哥斯达黎加";}s:2:"CU";a:1:{i:0;s:6:"å¤å·´";}s:2:"CV";a:1:{i:0;s:9:"佛得角";}s:2:"CX";a:1:{i:0;s:9:"圣诞岛";}s:2:"CY";a:1:{i:0;s:12:"塞浦路斯";}s:2:"CZ";a:1:{i:0;s:15:"æ·å…‹å…±å’Œå›½";}s:2:"DE"
;a:1:{i:0;s:6:"德国";}s:2:"DJ";a:1:{i:0;s:9:"å‰å¸ƒæ";}s:2:"DK";a:1:{i:0;s:6:"丹麦";}s:2:"DM";a:1:{i:0;s:15:"多米尼加岘";}s:2:"DO";a:1:{i:0;s:21:"多米尼加共和国";}s:2:"DZ";a:1:{i:0;s:15:"阿尔åŠåˆ©äºš";}s:2:"EC";a:1:{i:0;s:12:"厄瓜多尔";}s:2:"EE";a:1:{i:0;s:12:"爱沙尼亚";}s:2:"EG";a:1:{i:0;s:6:"埃åŠ";}s:2:"EH";a:1:{i:0;s:12:"西撒哈拉";}s:2:"ER";a:1:{i:0;s:15:"厄立特里亚";}s:2:"ES";a:1:{i:0;s:9:"西ç­ç‰™";}s:2:"ET";a:1:{i:0;s:15:"埃塞俄比亚";}s:2:"FI";a:1:{i:0;s:6:"芬兰";}s:2:"FJ";a:1:{i:0;s:6:"æ–济";}s:2:"FK";a:1:{i:0;s:15:"ç¦å…‹å…°ç¾¤å²›";}s:2:"FM";a:1:{i:0;s:24:"密克罗尼西亚è”邦";}s:2:"FO";a:1:{i:0;s:12:"法罗群岛";}s:2:"FR";a:1:{i:0;s:6:"法国";}s:2:"GA";a:1:{i:0;s:6:"加蓬";}s:2:"GB";a:1:{i:0;s:6:"英国";}s:2:"GD";a:1:{i:0;s:12:"格林纳达";}s:2:"GE";a:1:{i:0;s:12:"æ ¼é²å‰äºš";}s:2:"GF";a:1:{i:0;s:15:"法属圭亚那";}s:2:"GH";a:1:{i:0;s:6:"加纳";}s:2:"GI";a:1:{i:0;s:12:"直布罗陀";}s:2:"GL";a:1:{i:0;s:9:"格陵兰";}s:2:"GM";a:1:{i:0;s:9:"冈比亚";}s:2:"GN";a:1:{i:0;s:9:"几内亚";}s:2:"GP";a:1:{i:0;s:15:"瓜德罗普岛";}s:2:"GQ";a:1:{i:0;s:15:"赤é“几内亚";}s:2:"GR";a:1:{i:0;s:6:"希腊";}s:2:"GS";a:1:{i:0;s:33:"å—ä½æ²»äºšå’Œå—三明治群岛";}s:2:"GT";a:1:{i:0;s:12:"å±åœ°é©¬æ‹‰";}s:2:"GU";a:1:{i:0;s:6:"关岛";}s:2:"GW";a:1:{i:0;s:15:"几内亚比ç»";}s:2:"GY";a:1:{i:0;s:9:"圭亚那";}s:2:"HK";a:1:{i:0;s:27:"中国香港特别行政区";}s:2:"HM";a:1:{i:0;s:27:"赫德与麦克å”纳群岛";}s:2:"HN";a:1:{i:0;s:12:"洪都拉斯";}s:2:"HR";a:1:{i:0;s:12:"克罗地亚";}s:2:"HT";a:1:{i:0;s:6:"海地";}s:2:"HU";a:1:{i:0;s:9:"匈牙利";}s:2:"ID";a:1:{i:0;s:15:"å°åº¦å°¼è¥¿äºš";}s:2:"IE";a:1:{i:0;s:9:"爱尔兰";}s:2:"IL";a:1:{i:0;s:9:"以色列";}s:2:"IN";a:1:{i:0;s:6:"å°åº¦";}s:2:"IO";a:1:{i:0;s:21:"英属å°åº¦æ´‹é¢†åœ°";}s:2:"IQ";a:1:{i:0;s:9:"伊拉克";}s:2:"IR";a:1:{i:0;s:6:"伊朗";}s:2:"IS";a:1:{i:0;s:6:"冰岛";}s:2:"IT";a:1:{i:0;s:9:"æ„大利";}s:2:"JM";a:1:{i:0;s:9:"牙买加";}s:2:"JO";a:1:{i:0;s:6:"约旦";
}s:2:"JP";a:1:{i:0;s:6:"日本";}s:2:"KE";a:1:{i:0;s:9:"肯尼亚";}s:2:"KG";a:1:{i:0;s:18:"å‰å°”å‰å…‹æ–¯å¦";}s:2:"KH";a:1:{i:0;s:9:"柬埔寨";}s:2:"KI";a:1:{i:0;s:12:"基里巴斯";}s:2:"KM";a:1:{i:0;s:9:"科摩罗";}s:2:"KN";a:1:{i:0;s:21:"圣基茨和尼维斯";}s:2:"KP";a:1:{i:0;s:9:"北æœé²œ";}s:2:"KR";a:1:{i:0;s:6:"韩国";}s:2:"KW";a:1:{i:0;s:9:"科å¨ç‰¹";}s:2:"KY";a:1:{i:0;s:12:"开曼群岛";}s:2:"KZ";a:1:{i:0;s:15:"哈è¨å…‹æ–¯å¦";}s:2:"LA";a:1:{i:0;s:27:"è€æŒäººæ°‘民主共和国";}s:2:"LB";a:1:{i:0;s:9:"黎巴嫩";}s:2:"LC";a:1:{i:0;s:12:"圣å¢è¥¿äºš";}s:2:"LI";a:1:{i:0;s:15:"列支敦士登";}s:2:"LK";a:1:{i:0;s:12:"斯里兰å¡";}s:2:"LR";a:1:{i:0;s:12:"利比里亚";}s:2:"LS";a:1:{i:0;s:9:"莱索托";}s:2:"LT";a:1:{i:0;s:9:"立陶宛";}s:2:"LU";a:1:{i:0;s:9:"å¢æ£®å ¡";}s:2:"LV";a:1:{i:0;s:12:"拉脱维亚";}s:2:"LY";a:1:{i:0;s:9:"利比亚";}s:2:"MA";a:1:{i:0;s:9:"摩洛哥";}s:2:"MC";a:1:{i:0;s:9:"摩纳哥";}s:2:"MD";a:1:{i:0;s:21:"摩尔多瓦共和国";}s:2:"MG";a:1:{i:0;s:15:"马达加斯加";}s:2:"MH";a:1:{i:0;s:15:"马ç»å°”群岛";}s:2:"MK";a:1:{i:0;s:15:"马其顿王国";}s:2:"ML";a:1:{i:0;s:6:"马里";}s:2:"MM";a:1:{i:0;s:6:"缅甸";}s:2:"MN";a:1:{i:0;s:6:"è’™å¤";}s:2:"MO";a:1:{i:0;s:27:"中国澳门特别行政区";}s:2:"MP";a:1:{i:0;s:21:"北马里亚纳群岛";}s:2:"MQ";a:1:{i:0;s:15:"马æ尼克岛";}s:2:"MR";a:1:{i:0;s:15:"毛里塔尼亚";}s:2:"MS";a:1:{i:0;s:18:"蒙特塞拉群岛";}s:2:"MT";a:1:{i:0;s:9:"马耳他";}s:2:"MU";a:1:{i:0;s:12:"毛里求斯";}s:2:"MV";a:1:{i:0;s:12:"马尔代夫";}s:2:"MW";a:1:{i:0;s:9:"马拉维";}s:2:"MX";a:1:{i:0;s:9:"墨西哥";}s:2:"MY";a:1:{i:0;s:12:"马æ¥è¥¿äºš";}s:2:"MZ";a:1:{i:0;s:12:"莫桑比克";}s:2:"NA";a:1:{i:0;s:12:"纳米比亚";}s:2:"NC";a:1:{i:0;s:18:"新喀里多尼亚";}s:2:"NE";a:1:{i:0;s:9:"尼日尔";}s:2:"NF";a:1:{i:0;s:12:"诺ç¦å…‹å²›";}s:2:"NG";a:1:{i:0;s:12:"尼日利亚";}s:2:"NI";a:1:{i:0;s:12:"尼加拉瓜";}s:2:"NL";a:1:{i:0;s:6:"è·å…°";}s:2:"NO";a:1:{i:0;s:6:"挪å¨";}s:2:"NP";a:1:{i:0;s:9:"尼泊尔";}s
:2:"NR";a:1:{i:0;s:6:"ç‘™é²";}s:2:"NU";a:1:{i:0;s:6:"纽埃";}s:2:"NZ";a:1:{i:0;s:9:"新西兰";}s:2:"OM";a:1:{i:0;s:6:"阿曼";}s:2:"PA";a:1:{i:0;s:9:"巴拿马";}s:2:"PE";a:1:{i:0;s:6:"秘é²";}s:2:"PF";a:1:{i:0;s:21:"法属波利尼西亚";}s:2:"PG";a:1:{i:0;s:21:"巴布亚新几内亚";}s:2:"PH";a:1:{i:0;s:9:"è²å¾‹å®¾";}s:2:"PK";a:1:{i:0;s:12:"巴基斯å¦";}s:2:"PL";a:1:{i:0;s:6:"波兰";}s:2:"PM";a:1:{i:0;s:24:"圣皮埃尔和密克隆";}s:2:"PN";a:1:{i:0;s:12:"皮特凯æ©";}s:2:"PR";a:1:{i:0;s:12:"波多黎å„";}s:2:"PS";a:1:{i:0;s:18:"å·´å‹’æ–¯å¦é¢†åœŸ";}s:2:"PT";a:1:{i:0;s:9:"è‘¡è„牙";}s:2:"PW";a:1:{i:0;s:6:"帕劳";}s:2:"PY";a:1:{i:0;s:9:"巴拉圭";}s:2:"QA";a:1:{i:0;s:9:"å¡å¡”å°”";}s:2:"RE";a:1:{i:0;s:9:"留尼汪";}s:2:"RO";a:1:{i:0;s:12:"罗马尼亚";}s:2:"RU";a:1:{i:0;s:15:"ä¿„ç½—æ–¯è”邦";}s:2:"RW";a:1:{i:0;s:9:"å¢æ—ºè¾¾";}s:2:"SA";a:1:{i:0;s:15:"沙特阿拉伯";}s:2:"SB";a:1:{i:0;s:15:"所罗门群岛";}s:2:"SC";a:1:{i:0;s:9:"塞舌尔";}s:2:"SD";a:1:{i:0;s:6:"è‹ä¸¹";}s:2:"SE";a:1:{i:0;s:6:"ç‘žå…¸";}s:2:"SG";a:1:{i:0;s:9:"新加å¡";}s:2:"SH";a:1:{i:0;s:12:"圣赫勒拿";}s:2:"SI";a:1:{i:0;s:15:"斯洛文尼亚";}s:2:"SJ";a:1:{i:0;s:27:"斯瓦尔巴特和扬马延";}s:2:"SK";a:1:{i:0;s:12:"斯洛ä¼å…‹";}s:2:"SL";a:1:{i:0;s:12:"塞拉利昂";}s:2:"SM";a:1:{i:0;s:12:"圣马力诺";}s:2:"SN";a:1:{i:0;s:12:"塞内加尔";}s:2:"SO";a:1:{i:0;s:9:"索马里";}s:2:"SP";a:1:{i:0;s:12:"塞尔维亚";}s:2:"SR";a:1:{i:0;s:9:"è‹é‡Œå—";}s:2:"ST";a:1:{i:0;s:24:"圣多美和普林西比";}s:2:"SV";a:1:{i:0;s:12:"è¨å°”瓦多";}s:2:"SY";a:1:{i:0;s:9:"å™åˆ©äºš";}s:2:"SZ";a:1:{i:0;s:12:"æ–¯å¨å£«å…°";}s:2:"TC";a:1:{i:0;s:27:"特克斯和凯科斯群岛";}s:2:"TD";a:1:{i:0;s:6:"ä¹å¾—";}s:2:"TF";a:1:{i:0;s:21:"法属å—åŠçƒé¢†åœ°";}s:2:"TG";a:1:{i:0;s:6:"多哥";}s:2:"TH";a:1:{i:0;s:6:"泰国";}s:2:"TJ";a:1:{i:0;s:15:"å¡”å‰å…‹æ–¯å¦";}s:2:"TK";a:1:{i:0;s:9:"托克劳";}s:2:"TL";a:1:{i:0;s:9:"东å¸æ±¶";}s:2:"TM";a:1:{i:0;s:15:"土库曼斯å¦";}s:2:"TN";a:1:{i:0;s:9:"çªå°¼æ–¯";}s:2:"TO";a:1:{i:0;
s:6:"汤加";}s:2:"TR";a:1:{i:0;s:9:"土耳其";}s:2:"TT";a:1:{i:0;s:24:"特立尼达和多巴哥";}s:2:"TV";a:1:{i:0;s:9:"图瓦å¢";}s:2:"TW";a:1:{i:0;s:6:"å°æ¹¾";}s:2:"TZ";a:1:{i:0;s:12:"å¦æ¡‘尼亚";}s:2:"UA";a:1:{i:0;s:9:"乌克兰";}s:2:"UG";a:1:{i:0;s:9:"乌干达";}s:2:"UM";a:1:{i:0;s:18:"美国边远å°å²›";}s:2:"US";a:1:{i:0;s:6:"美国";}s:2:"UY";a:1:{i:0;s:9:"乌拉圭";}s:2:"UZ";a:1:{i:0;s:18:"乌兹别克斯å¦";}s:2:"VA";a:1:{i:0;s:9:"梵蒂冈";}s:2:"VC";a:1:{i:0;s:30:"圣文森特和格林纳ä¸æ–¯";}s:2:"VE";a:1:{i:0;s:12:"委内瑞拉";}s:2:"VG";a:1:{i:0;s:18:"英属维京群岛";}s:2:"VI";a:1:{i:0;s:18:"美属维京群岛";}s:2:"VN";a:1:{i:0;s:6:"越å—";}s:2:"VU";a:1:{i:0;s:12:"瓦努阿图";}s:2:"WF";a:1:{i:0;s:21:"瓦利斯和富图纳";}s:2:"WS";a:1:{i:0;s:9:"è¨æ‘©äºš";}s:2:"YE";a:1:{i:0;s:6:"也门";}s:2:"YT";a:1:{i:0;s:9:"马约特";}s:2:"YU";a:1:{i:0;s:12:"å—斯拉夫";}s:2:"ZA";a:1:{i:0;s:6:"å—éž";}s:2:"ZM";a:1:{i:0;s:9:"赞比亚";}s:2:"ZW";a:1:{i:0;s:12:"津巴布韦";}}s:10:"Currencies";a:365:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:21:"安é“尔第纳尔元";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:21:"安é“尔比塞塔元";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:18:"阿è”酋迪拉姆";}s:3:"AFA";a:2:{i:0;s:3:"AFA";i:1;s:24:"阿富汗尼 (1927-2002)";}s:3:"AFN";a:2:{i:0;s:3:"AFN";i:1;s:12:"阿富汗尼";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:21:"阿å‘和伊è¨æ³•éƒŽ";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:33:"阿尔巴尼亚列克 (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"ALL";i:1;s:21:"阿尔巴尼亚列克";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:24:"阿尔巴尼亚列克å¸";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:27:"阿尔巴尼亚元外汇券";}s:3:"AMD";a:2:{i:0;s:3:"AMD";i:1;s:21:"亚美尼亚德拉姆";}s:3:"ANG";a:2:{i:0;s:3:"ANG";i:1;s:18:"è·å…°å®‰æ›¿å…°ç›¾";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:15:"安戈拉宽扎";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:27:"安戈拉宽扎 (1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:30:"安戈拉新宽扎 (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:38:"
安戈拉宽扎 Reajustado (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:21:"安哥拉埃斯库多";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:18:"阿根廷奥斯特";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:24:"阿根廷比索标准局";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:27:"阿根廷比索 (1983-1985)";}s:3:"ARS";a:2:{i:0;s:3:"ARS";i:1;s:15:"阿根廷比索";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:15:"奥地利西令";}s:3:"AUD";a:2:{i:0;s:3:"AUD";i:1;s:15:"澳大利亚元";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:15:"澳大利亚磅";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:21:"阿é²å·´åŸºå°”å¾·å…ƒ";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:40:"波士尼亚-赫塞哥维纳第纳尔元";}s:3:"BAM";a:2:{i:0;s:3:"BAM";i:1;s:37:"波士尼亚-赫塞哥维纳兑æ¢åˆ¸";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:43:"波士尼亚-赫塞哥维纳新第纳尔元";}s:3:"BBD";a:2:{i:0;s:3:"BBD";i:1;s:15:"巴巴多斯元";}s:3:"BDT";a:2:{i:0;s:3:"BDT";i:1;s:15:"孟加拉达å¡";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:24:"比利时法郎兑æ¢åˆ¸";}s:3:"BEF";a:2:{i:0;s:3:"BEF";i:1;s:15:"比利时法郎";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:27:"比利时法郎(金èžï¼‰";}s:3:"BGL";a:2:{i:0;s:3:"BGL";i:1;s:21:"ä¿åŠ åˆ©äºšç¡¬åˆ—å…‹";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:30:"ä¿åŠ åˆ©äºšç¤¾ä¼šä¸»ä¹‰åˆ—å…‹";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:21:"ä¿åŠ åˆ©äºšæ–°åˆ—å…‹";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:30:"ä¿åŠ åˆ©äºšåˆ—å…‹ (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:27:"ä¿åŠ åˆ©äºšåˆ—克外汇券";}s:3:"BHD";a:2:{i:0;s:3:"BHD";i:1;s:18:"巴林第纳尔元";}s:3:"BIF";a:2:{i:0;s:3:"BIF";i:1;s:15:"布隆迪法郎";}s:3:"BMD";a:2:{i:0;s:3:"BMD";i:1;s:12:"百慕大元";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:12:"百慕大磅";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:9:"汶莱元";}s:3:"BOB";a:2:{i:0;s:3:"BOB";i:1;s:12:"玻利维亚";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:24:"玻利维亚 (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:18:"玻利维亚比索";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:30:"巴西克é²èµ›ç½— (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:18:"å
·´è¥¿å…‹é²å¡žç½—";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:30:"巴西克é²å¡žç½— (1990-1993)";}s:3:"BRL";a:2:{i:0;s:3:"BRL";i:1;s:12:"巴西里尔";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:31:"巴西克é²å¡žç½— Cruzado Novo";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:18:"巴西克é²å¡žç½—";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:30:"巴西克é²å¡žç½— (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:12:"巴哈马元";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:12:"巴哈马磅";}s:3:"BTN";a:2:{i:0;s:3:"BTN";i:1;s:15:"ä¸ä¸¹åŠªæ‰Žå§†";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:12:"ä¸ä¸¹å¢æ¯”";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:6:"ç¼…å…ƒ";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:12:"缅甸å¢æ¯”";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:15:"波渣那扑拉";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:33:"白俄罗斯新å¢å¸ƒ (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:30:"白俄罗斯å¢å¸ƒ (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"BYR";i:1;s:18:"白俄罗斯å¢å¸ƒ";}s:3:"BZD";a:2:{i:0;s:3:"BZD";i:1;s:12:"伯利兹元";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:18:"属洪都拉斯元";}s:3:"CAD";a:2:{i:0;s:3:"CAD";i:1;s:12:"加拿大元";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:12:"刚果法郎";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:21:"刚果共和国法郎";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:15:"刚果扎伊尔";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:26:"中éžå…±å’Œå›½ CFA 法郎";}s:3:"CHF";a:2:{i:0;s:3:"CHF";i:1;s:12:"瑞士法郎";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:15:"库克群岛元";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:12:"智利肯æœ";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:18:"智利埃斯库多";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:26:"智利 Unidades de Fomento";}s:3:"CLP";a:2:{i:0;s:3:"CLP";i:1;s:13:"智利 比索";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:20:"喀麦隆 CFA 法郎";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:18:"中国人民票元";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:21:"中国美元外汇券";}s:3:"CNY";a:2:{i:0;s:3:"ï¿¥";i:1;s:9:"人民å¸";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:21:"哥伦比亚纸比索";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:17:"刚果 CFA 法郎"
;}s:3:"COP";a:2:{i:0;s:3:"COP";i:1;s:18:"哥伦比亚比索";}s:3:"CRC";a:2:{i:0;s:3:"CRC";i:1;s:21:"哥斯达黎加科隆";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:12:"æ·å…‹å…‹éƒŽ";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:15:"æ·å…‹ç¡¬å…‹éƒŽ";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:12:"å¤å·´æ¯”ç´¢";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:15:"å¤å·´å¤–汇券";}s:3:"CVE";a:2:{i:0;s:3:"CVE";i:1;s:21:"佛得角埃斯库多";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:9:"库拉盾";}s:3:"CYP";a:2:{i:0;s:3:"CYP";i:1;s:15:"塞浦路斯磅";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:12:"æ·å…‹å…‹éƒŽ";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:21:"东德奥斯特马克";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:12:"德国马克";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:18:"德国å¸è¡é©¬å…‹";}s:3:"DJF";a:2:{i:0;s:3:"DJF";i:1;s:15:"å‰å¸ƒæ法郎";}s:3:"DKK";a:2:{i:0;s:3:"DKK";i:1;s:12:"丹麦克朗";}s:3:"DOP";a:2:{i:0;s:3:"DOP";i:1;s:18:"多米尼加比索";}s:3:"DZD";a:2:{i:0;s:3:"DZD";i:1;s:27:"阿尔åŠåˆ©äºšç¬¬çº³å°”å…ƒ";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:24:"阿尔åŠåˆ©äºšæ–°æ³•éƒŽ";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:30:"阿尔åŠåˆ©äºšæ³•éƒŽæ¯”斯查";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:21:"厄瓜多尔è‹å…‹é›·";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:18:"爱沙尼亚克朗";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:9:"埃åŠç£…";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:24:"厄立特里亚纳ç¦å¡";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:18:"西ç­ç‰™é©¬èµ›å¡”";}s:3:"ETB";a:2:{i:0;s:3:"ETB";i:1;s:21:"埃塞俄比亚比尔";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:18:"埃塞俄比亚元";}s:3:"EUR";a:2:{i:0;s:3:"€";i:1;s:6:"欧元";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:12:"芬兰玛å¡";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:24:"èŠ¬å…°çŽ›å¡ (1860-1962)";}s:3:"FJD";a:2:{i:0;s:3:"FJD";i:1;s:9:"æ–济元";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:9:"æ–济磅";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:18:"ç¦å…‹å…°ç¾¤å²›ç£…";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:18:"法罗群岛克朗";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:12:"法国法郎";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:37:"法国法郎比斯æŸ
¥/法郎庞加莱";}s:3:"GBP";a:2:{i:0;s:2:"£";i:1;s:6:"英磅";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:24:"乔治亚库蓬拉瑞特";}s:3:"GEL";a:2:{i:0;s:3:"GEL";i:1;s:21:"乔治亚库蓬拉瑞";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:12:"加纳塞第";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:15:"加纳旧塞第";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:9:"加纳磅";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:21:"加纳é‡è¯„估塞第";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:15:"直布罗陀磅";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:15:"格陵兰克朗";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:18:"冈比亚达拉西";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:12:"冈比亚磅";}s:3:"GNF";a:2:{i:0;s:3:"GNF";i:1;s:15:"几内亚法郎";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:27:"几内亚法郎 (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:13:"几内亚Syli";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:21:"瓜德罗普岛法郎";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:27:"赤é“几内亚爱克å¨ä¹";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:21:"赤é“几内亚法郎";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:24:"赤é“几内亚匹塞塔";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:18:"希腊德拉克马";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:21:"希腊新德拉克马";}s:3:"GTQ";a:2:{i:0;s:3:"GTQ";i:1;s:12:"å±åœ°é©¬æ‹‰";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:24:"法国属圭亚那法郎";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:30:"è‘¡è„牙几内亚埃斯库多";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:27:"è‘¡è„牙几内亚迷洱瑞";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:15:"几内亚比索";}s:3:"GYD";a:2:{i:0;s:3:"GYD";i:1;s:12:"圭亚那元";}s:3:"HKD";a:2:{i:0;s:3:"HK$";i:1;s:6:"港元";}s:3:"HNL";a:2:{i:0;s:3:"HNL";i:1;s:21:"洪都拉斯勒皮拉";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:24:"克罗地亚第纳尔元";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:21:"克罗地亚库娜元";}s:3:"HTG";a:2:{i:0;s:3:"HTG";i:1;s:12:"海地å¤å¾·";}s:3:"HUF";a:2:{i:0;s:3:"HUF";i:1;s:18:"匈牙利缶瑞特";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:15:"北爱尔兰磅";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:24:"å°åº¦å°¼è¥¿äºš
å°¼å¡ç›¾";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:24:"å°åº¦å°¼è¥¿äºšçˆªå“‡ç›¾";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:21:"å°åº¦å°¼è¥¿äºšæ–°ç›¾";}s:3:"IDR";a:2:{i:0;s:3:"IDR";i:1;s:18:"å°åº¦å°¼è¥¿äºšç›¾";}s:3:"IEP";a:2:{i:0;s:3:"IEP";i:1;s:12:"爱尔兰磅";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:18:"以色列谢客尔";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:12:"以色列磅";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:21:"以色列新谢客尔";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:9:"曼岛磅";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:12:"å°åº¦å¢æ¯”";}s:3:"IQD";a:2:{i:0;s:3:"IQD";i:1;s:21:"伊拉克第纳尔元";}s:3:"IRR";a:2:{i:0;s:3:"IRR";i:1;s:16:"伊朗里亚 å°”";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:12:"冰岛克朗";}s:3:"ITL";a:2:{i:0;s:3:"ITL";i:1;s:15:"æ„大利里拉";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:9:"泽西磅";}s:3:"JMD";a:2:{i:0;s:3:"JMD";i:1;s:12:"牙买加元";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:12:"牙买加磅";}s:3:"JOD";a:2:{i:0;s:3:"JOD";i:1;s:18:"约旦第纳尔元";}s:3:"JPY";a:2:{i:0;s:4:"JPÂ¥";i:1;s:6:"日元";}s:3:"KES";a:2:{i:0;s:3:"KES";i:1;s:15:"肯尼亚先令";}s:3:"KGS";a:2:{i:0;s:3:"KGS";i:1;s:21:"å‰å°”å‰æ–¯å¦è¨å§†";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:18:"柬埔寨旧里尔";}s:3:"KHR";a:2:{i:0;s:3:"KHR";i:1;s:15:"柬埔寨里尔";}s:3:"KID";a:2:{i:0;s:3:"KID";i:1;s:15:"基里巴斯元";}s:3:"KMF";a:2:{i:0;s:3:"KMF";i:1;s:15:"科摩罗法郎";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:18:"北æœé²œäººæ°‘å¸";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:12:"北æœé²œå¸";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:9:"韩国元";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:12:"韩国旧å¸";}s:3:"KRW";a:2:{i:0;s:3:"₩";i:1;s:9:"韩国å¸";}s:3:"KWD";a:2:{i:0;s:3:"KWD";i:1;s:21:"科å¨ç‰¹ç¬¬çº³å°”å…ƒ";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:12:"开曼岛元";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:15:"哈è¨å…‹å¢å¸ƒ";}s:3:"KZT";a:2:{i:0;s:3:"KZT";i:1;s:15:"哈è¨å…‹è…¾é¢";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:12:"è€æŒåŸºæ™®";}s:3:"LBP";a:2:{i:0;s:3:"LBP";i:1;s:12:"黎巴嫩磅";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:21:"å
ˆ—支敦士登法郎";}s:3:"LKR";a:2:{i:0;s:3:"LKR";i:1;s:18:"斯里兰å¡å¢æ¯”";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:12:"锡兰å¢æ¯”";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:12:"利比亚元";}s:3:"LSL";a:2:{i:0;s:3:"LSL";i:1;s:9:"莱索托";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:15:"立陶宛利塔";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:21:"立陶宛塔咯å‘å¸";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:15:"å¢æ£®å ¡æ³•éƒŽ";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:18:"拉脱维亚拉特";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:18:"拉脱维亚å¢å¸ƒ";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:33:"利比亚英国军队军方里拉";}s:3:"LYD";a:2:{i:0;s:3:"LYD";i:1;s:21:"利比亚第纳尔元";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:12:"利比亚磅";}s:3:"MAD";a:2:{i:0;s:3:"MAD";i:1;s:18:"摩洛哥迪拉姆";}s:3:"MAF";a:2:{i:0;s:3:"MAF";i:1;s:15:"摩洛哥法郎";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:18:"摩洛哥新法郎";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:27:"摩洛哥é©å‘½æ—¶æœŸè´§å¸";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:18:"å—特市列伊å¸";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:15:"å—特市列伊";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:15:"å—特市å¢å¸ƒ";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:24:"马达加斯加阿日瑞";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:21:"马达加斯加法郎";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:18:"马ç»å°”群岛元";}s:3:"MKD";a:2:{i:0;s:3:"MKD";i:1;s:15:"马其顿戴纳";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:27:"马其顿戴纳 (1992-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:12:"马里法郎";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:15:"缅甸开亚特";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:18:"缅甸元外汇券";}s:3:"MNT";a:2:{i:0;s:3:"MNT";i:1;s:18:"è’™å¤å›¾æ ¼é‡Œå…‹";}s:3:"MOP";a:2:{i:0;s:1:"P";i:1;s:9:"澳门元";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:15:"马蒂尼法郎";}s:3:"MRO";a:2:{i:0;s:3:"MRO";i:1;s:21:"里塔尼亚乌å‰äºš";}s:3:"MTL";a:2:{i:0;s:3:"MTL";i:1;s:15:"马尔他里拉";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:12:"马尔他磅";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:18:"毛里求斯å¢æ¯”";}s:3:"MVP";a:2
:{i:0;s:3:"MVP";i:1;s:24:"马尔代夫群岛å¢æ¯”";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:27:"马尔代夫群岛芦è²äºš";}s:3:"MWK";a:2:{i:0;s:3:"MWK";i:1;s:15:"马拉维夸æ°";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:12:"马拉维磅";}s:3:"MXN";a:2:{i:0;s:3:"MXN";i:1;s:15:"墨西哥比索";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:30:"墨西哥银比索 (1861-1992)";}s:3:"MYR";a:2:{i:0;s:3:"MYR";i:1;s:15:"马æ¥è¥¿äºšå¸";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:24:"莫桑比克埃斯库多";}s:3:"MZM";a:2:{i:0;s:3:"MZM";i:1;s:15:"莫桑比克å¸";}s:3:"NAD";a:2:{i:0;s:3:"NAD";i:1;s:15:"纳米比亚元";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:27:"æ–°å¡é‡Œå¤šå°¼äºšæ–°æ³•éƒŽ";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:19:"尼日利亚奈拉.";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:15:"尼日利亚磅";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:26:"新赫布里底 CFP 法郎";}s:3:"NIC";a:2:{i:0;s:3:"NIC";i:1;s:21:"尼加拉瓜科多巴";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:24:"尼加拉瓜金科多巴";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:24:"尼加拉瓜金哥多åŽ";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:9:"è·å…°ç›¾";}s:3:"NOK";a:2:{i:0;s:3:"NOK";i:1;s:12:"挪å¨å…‹æœ—";}s:3:"NPR";a:2:{i:0;s:3:"NPR";i:1;s:15:"尼泊尔å¢æ¯”";}s:3:"NZD";a:2:{i:0;s:3:"NZD";i:1;s:12:"新西兰元";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:12:"新西兰磅";}s:3:"OMR";a:2:{i:0;s:3:"OMR";i:1;s:12:"阿曼里尔";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:18:"阿曼里尔塞迪";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:18:"巴拿马巴波亚";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:15:"车城å¢å¸ƒåˆ¸";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:15:"车城新å¢å¸ƒ";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:12:"车城å¢å¸ƒ";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:12:"秘é²å› è’‚";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:21:"秘é²ç´¢é¢å¥´è‰¾æŒ";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:12:"秘é²ç´¢é¢";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:27:"巴布亚新几内亚基那";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:15:"è²å¾‹å®¾æ¯”ç´¢";}s:3:"PKR";a:2:{i:0;s:3:"PKR";i:1;s:18:"巴基斯å¦å¢æ¯”";}s:3:"PLN";a:2:{i:0;s:3:"PLN";i:
1;s:15:"波兰兹罗æ";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:22:"波兰美元 外汇券";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:27:"波兰兹罗æ (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:15:"å·´å‹’æ–¯å¦ç£…";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:15:"è‘¡è„牙倥涂";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:15:"è‘¡è„牙铃木";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:12:"巴拉圭å¸";}s:3:"QAR";a:2:{i:0;s:3:"QAR";i:1;s:18:"å¡å¡”尔里亚尔";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:24:"留尼汪è”åˆä¼šæ³•éƒŽ";}s:3:"ROL";a:2:{i:0;s:3:"ROL";i:1;s:15:"罗马尼亚镭";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:18:"罗马尼亚新镭";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:12:"俄国å¢å¸ƒ";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:24:"俄国å¢å¸ƒ (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:15:"å¢æ—ºè¾¾æ³•éƒŽ";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:15:"沙特里亚尔";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:21:"沙特特æƒé‡Œäºšå°”";}s:3:"SBD";a:2:{i:0;s:3:"SBD";i:1;s:18:"所罗门群岛元";}s:3:"SCR";a:2:{i:0;s:3:"SCR";i:1;s:15:"塞舌尔å¢æ¯”";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:18:"è‹ä¸¹ç¬¬çº³å°”å…ƒ";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:9:"è‹ä¸¹ç£…";}s:3:"SEK";a:2:{i:0;s:3:"SEK";i:1;s:12:"瑞士克朗";}s:3:"SGD";a:2:{i:0;s:2:"S$";i:1;s:12:"新加å¡å…ƒ";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:15:"圣赫勒拿磅";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:24:"斯洛文尼亚淘拉磅";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:21:"斯洛文尼亚淘拉";}s:3:"SKK";a:2:{i:0;s:3:"SKK";i:1;s:21:"斯洛ä¼å…‹ç§‘路那";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:15:"赛拉里昂å¸";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:18:"圣马利诺里拉";}s:3:"SOS";a:2:{i:0;s:3:"SOS";i:1;s:15:"索马里先令";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:21:"索马里大陆先令";}s:3:"SRG";a:2:{i:0;s:3:"SRG";i:1;s:15:"è‹é‡Œå—基尔";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:12:"è‹æ ¼å…°ç£…";}s:3:"STD";a:2:{i:0;s:3:"STD";i:1;s:30:"圣多美普林西比都比拉";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:27:"圣多美普林西比铃木";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:15:"è‹è”æ–°å¢å
¸ƒ";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:12:"è‹è”å¢å¸ƒ";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:21:"è¨å°”瓦多科洛涅";}s:3:"SYP";a:2:{i:0;s:3:"SYP";i:1;s:12:"å™åˆ©äºšç£…";}s:3:"SZL";a:2:{i:0;s:3:"SZL";i:1;s:15:"æ–¯å¨å£«å…°å¸";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:33:"特克斯和凯科斯群岛克朗";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:6:"æ³°é“¢";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:21:"å¡”å‰å…‹æ–¯å¦å¢å¸ƒ";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:24:"å¡”å‰å…‹æ–¯å¦ç´¢èŽ«å°¼";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:18:"土库曼斯å¦å¸";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:21:"çªå°¼æ–¯ç¬¬çº³å°”å…ƒ";}s:3:"TOP";a:2:{i:0;s:3:"TOP";i:1;s:9:"汤加å¸";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:9:"汤加磅";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:18:"å¸æ±¶åŸƒæ–¯åº“多";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:15:"å¸æ±¶å¸•å¡”å¡";}s:3:"TRL";a:2:{i:0;s:3:"TRL";i:1;s:15:"土耳其里拉";}s:3:"TTD";a:2:{i:0;s:3:"TTD";i:1;s:27:"特立尼达和多巴哥元";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:30:"特立尼达和多巴哥旧元";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:12:"图瓦å¢å…ƒ";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:9:"æ–°å°å¸";}s:3:"TZS";a:2:{i:0;s:3:"TZS";i:1;s:18:"å¦æ¡‘尼亚先令";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:18:"乌克兰赫里纳";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:12:"乌克兰å¸";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;s:27:"乌干达先令 (1966-1987)";}s:3:"UGX";a:2:{i:0;s:3:"UGX";i:1;s:15:"乌干达先令";}s:3:"USD";a:2:{i:0;s:3:"US$";i:1;s:6:"美元";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:18:"美元 (下一天)";}s:3:"USS";a:2:{i:0;s:3:"USS";i:1;s:18:"美元 (åŒä¸€å¤©)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:24:"乌拉圭比索ä¼å°”特";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:27:"乌拉圭比索 (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"UYU";i:1;s:15:"乌拉圭比索";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:27:"乌兹别克斯å¦è´§å¸åˆ¸";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:21:"乌兹别克斯å¦å¸";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:15:"梵谛冈里拉";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:21:"北越皮艾斯特盾";}s:3:"VDN";a
:2:{i:0;s:3:"VDN";i:1;s:24:"北越皮艾斯特新盾";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:24:"北越皮艾斯特明盾";}s:3:"VEB";a:2:{i:0;s:3:"VEB";i:1;s:18:"内瑞拉åšåˆ©ç“¦";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:21:"英国维京群岛å¸";}s:3:"VND";a:2:{i:0;s:3:"VND";i:1;s:9:"越å—盾";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:12:"越å—明盾";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:18:"越å—共和国盾";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:15:"越å—国家盾";}s:3:"VUV";a:2:{i:0;s:3:"VUV";i:1;s:12:"瓦努阿图";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:15:"西è¨æ‘©äºšç£…";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:18:"西è¨æ‘©äºšå¡”拉";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:30:"亚洲第纳尔元å¸æˆ·å•ä½";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:18:"亚洲货å¸å•ä½";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:6:"黄金";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:18:"欧洲å¤åˆå•ä½";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:18:"欧洲金èžå•ä½";}s:3:"XCD";a:2:{i:0;s:3:"XCD";i:1;s:15:"东加勒比元";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:15:"特别æ款æƒ";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:18:"欧洲货å¸å•ä½";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:15:"法国金法郎";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:21:"伊斯兰第纳尔元";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:24:"法国城市åŒä½›æ³•éƒŽ";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:29:"法国安的列斯 CFA 法郎";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:18:"也门第纳尔元";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:21:"也门阿马迪里尔";}s:3:"YER";a:2:{i:0;s:3:"YER";i:1;s:12:"也门里尔";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:27:"å—斯拉夫硬第纳尔元";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:30:"å—斯拉夫è”邦第纳尔元";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:30:"å—斯拉夫 1994 第纳尔元";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:30:"å—斯拉夫åŒå¨ç¬¬çº³å°”å…ƒ";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:30:"å—斯拉夫兑æ¢ç¬¬çº³å°”å…ƒ";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:30:"å—斯拉夫å月第纳尔元";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:30:"å—斯拉夫改é©ç¬¬çº³å°”å…ƒ";}s:3:
"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:21:"å—éžå…°ç‰¹ (金èž)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:9:"å—éžç£…";}s:3:"ZAR";a:2:{i:0;s:3:"ZAR";i:1;s:12:"å—éžå…°ç‰¹";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:18:"赞比亚马拉维";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:12:"赞比亚磅";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:15:"新扎伊尔元";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:12:"扎伊尔元";}s:3:"ZWD";a:2:{i:0;s:3:"ZWD";i:1;s:15:"津巴布韦元";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:6:"日历";}s:9:"collation";a:1:{i:0;s:6:"对照";}s:8:"currency";a:1:{i:0;s:6:"è´§å¸";}}s:9:"Languages";a:461:{s:2:"aa";a:1:{i:0;s:9:"阿法文";}s:2:"ab";a:1:{i:0;s:18:"阿布哈西亚文";}s:3:"ace";a:1:{i:0;s:9:"亚é½æ–‡";}s:3:"ach";a:1:{i:0;s:12:"阿乔利文";}s:3:"ada";a:1:{i:0;s:12:"阿当梅文";}s:3:"ady";a:1:{i:0;s:12:"阿迪何文";}s:2:"ae";a:1:{i:0;s:15:"阿维斯塔文";}s:2:"af";a:1:{i:0;s:15:"å—éžè·å…°æ–‡";}s:3:"afa";a:1:{i:0;s:18:"其他亚éžè¯­ç³»";}s:3:"afh";a:1:{i:0;s:18:"阿弗里希利文";}s:2:"ak";a:1:{i:0;s:9:"阿肯文";}s:3:"akk";a:1:{i:0;s:12:"阿å¡å¾·æ–‡";}s:3:"ale";a:1:{i:0;s:24:"阿留申群岛之土语";}s:3:"alg";a:1:{i:0;s:21:"其他阿尔贡语系";}s:2:"am";a:1:{i:0;s:15:"阿姆哈拉文";}s:3:"ang";a:1:{i:0;s:12:"中å¤è‹±è¯­";}s:3:"apa";a:1:{i:0;s:12:"阿帕切文";}s:2:"ar";a:1:{i:0;s:12:"阿拉伯文";}s:3:"arc";a:1:{i:0;s:12:"阿拉米文";}s:3:"arn";a:1:{i:0;s:12:"阿劳åŽæ–‡";}s:3:"arp";a:1:{i:0;s:15:"阿拉帕éœæ–‡";}s:3:"art";a:1:{i:0;s:18:"其他人工语言";}s:3:"arw";a:1:{i:0;s:15:"阿拉瓦克文";}s:2:"as";a:1:{i:0;s:12:"阿è¨å§†æ–‡";}s:3:"ast";a:1:{i:0;s:24:"阿斯图里亚æ€ç‰¹è¯­";}s:3:"ath";a:1:{i:0;s:27:"其他阿撒巴斯å¡è¯­ç³»";}s:3:"aus";a:1:{i:0;s:18:"澳大利亚语系";}s:2:"av";a:1:{i:0;s:12:"阿瓦尔文";}s:3:"awa";a:1:{i:0;s:12:"阿瓦乔文";}s:2:"ay";a:1:{i:0;s:12:"艾马拉文";}s:2:"az";a:1:{i:0;s:15:"阿塞拜疆文";}s:2:"ba";a:1:{i:0;s:15:"巴什客尔文";}s:3:"bad";a:1:{i:0;s:9:"ç­è¾¾æ–‡";}s:3:"bai";a:1:{i:0;s:15:"巴米累克文";}s:3:"bal";a:1
:{i:0;s:12:"俾路支文";}s:3:"ban";a:1:{i:0;s:9:"巴里文";}s:3:"bas";a:1:{i:0;s:9:"å·´è¨æ–‡";}s:3:"bat";a:1:{i:0;s:27:"波罗的海地区之语言";}s:2:"be";a:1:{i:0;s:15:"白俄罗斯文";}s:3:"bej";a:1:{i:0;s:9:"别札文";}s:3:"bem";a:1:{i:0;s:12:"别姆巴文";}s:3:"ber";a:1:{i:0;s:27:"北éžå›žæ•™åœŸæ—之语言";}s:2:"bg";a:1:{i:0;s:15:"ä¿åŠ åˆ©äºšæ–‡";}s:2:"bh";a:1:{i:0;s:12:"比哈尔文";}s:3:"bho";a:1:{i:0;s:15:"åšæ°æ™®å°”æ–‡";}s:2:"bi";a:1:{i:0;s:15:"比斯拉马文";}s:3:"bik";a:1:{i:0;s:12:"毕库尔文";}s:3:"bin";a:1:{i:0;s:9:"比尼文";}s:3:"bla";a:1:{i:0;s:15:"å¸å…‹å¸å¡æ–‡";}s:2:"bm";a:1:{i:0;s:12:"ç­å·´æ‹‰æ–‡";}s:2:"bn";a:1:{i:0;s:12:"孟加拉文";}s:3:"bnt";a:1:{i:0;s:9:"ç­å›¾æ–‡";}s:2:"bo";a:1:{i:0;s:9:"西è—æ–‡";}s:2:"br";a:1:{i:0;s:15:"布里多尼文";}s:3:"bra";a:1:{i:0;s:12:"布拉æ°æ–‡";}s:2:"bs";a:1:{i:0;s:15:"波斯尼亚文";}s:3:"btk";a:1:{i:0;s:12:"巴塔克文";}s:3:"bua";a:1:{i:0;s:15:"布里亚特文";}s:3:"bug";a:1:{i:0;s:9:"布å‰æ–‡";}s:3:"byn";a:1:{i:0;s:9:"布林文";}s:2:"ca";a:1:{i:0;s:18:"加泰罗尼亚文";}s:3:"cad";a:1:{i:0;s:9:"å¡å¤šæ–‡";}s:3:"cai";a:1:{i:0;s:27:"其他中美å°ç¬¬å®‰è¯­ç³»";}s:3:"car";a:1:{i:0;s:12:"巴勒比文";}s:3:"cau";a:1:{i:0;s:21:"其他高加索语系";}s:2:"ce";a:1:{i:0;s:9:"车臣文";}s:3:"ceb";a:1:{i:0;s:9:"宿务文";}s:3:"cel";a:1:{i:0;s:21:"其他凯尔特语系";}s:2:"ch";a:1:{i:0;s:12:"查莫罗文";}s:3:"chb";a:1:{i:0;s:12:"契布å¡æ–‡";}s:3:"chg";a:1:{i:0;s:9:"查加文";}s:3:"chk";a:1:{i:0;s:12:"楚å¾å…‹æ–‡";}s:3:"chm";a:1:{i:0;s:9:"马里文";}s:3:"chn";a:1:{i:0;s:12:"契努克文";}s:3:"cho";a:1:{i:0;s:12:"乔克托文";}s:3:"chp";a:1:{i:0;s:12:"佩瓦扬文";}s:3:"chr";a:1:{i:0;s:12:"彻罗基文";}s:3:"chy";a:1:{i:0;s:9:"å¤å»¶æ–‡";}s:3:"cmc";a:1:{i:0;s:12:"查米克文";}s:2:"co";a:1:{i:0;s:12:"科西嘉文";}s:3:"cop";a:1:{i:0;s:12:"科普特文";}s:3:"cpe";a:1:{i:0;s:24:"ä¸çº¯ç²¹ä¹‹è‹±å›½æ–¹è¨€";}s:3:"cpf";a:1:{i:0;s:24:"ä¸çº¯ç²¹ä¹‹æ³•å›½æ–¹è¨€";}s:3:"cpp";a:1:{i:0;s:24:"ä¸çº¯ç²¹ä¹‹è‘¡å›½æ–¹è¨€";}s
:2:"cr";a:1:{i:0;s:12:"克里æ—æ–‡";}s:3:"crh";a:1:{i:0;s:48:"克里米亚土耳其文;克里米亚塔塔文";}s:3:"crp";a:1:{i:0;s:27:"克里奥尔语和皮钦文";}s:2:"cs";a:1:{i:0;s:9:"æ·å…‹æ–‡";}s:3:"csb";a:1:{i:0;s:9:"å¡èˆ’æ–‡";}s:2:"cu";a:1:{i:0;s:18:"宗教斯拉夫文";}s:3:"cus";a:1:{i:0;s:21:"其他库施特语系";}s:2:"cv";a:1:{i:0;s:12:"楚瓦什文";}s:2:"cy";a:1:{i:0;s:12:"å¨å°”士文";}s:2:"da";a:1:{i:0;s:9:"丹麦文";}s:3:"dak";a:1:{i:0;s:12:"达科他文";}s:3:"dar";a:1:{i:0;s:15:"达尔格瓦文";}s:3:"day";a:1:{i:0;s:12:"达雅克文";}s:2:"de";a:1:{i:0;s:6:"å¾·æ–‡";}s:3:"del";a:1:{i:0;s:24:"特拉瓦å°ç¬¬å®‰äººæ–‡";}s:3:"den";a:1:{i:0;s:12:"å¸é›·å¤«æ–‡";}s:3:"dgr";a:1:{i:0;s:12:"多格æ¥æ–‡";}s:3:"din";a:1:{i:0;s:9:"ä¸å¡æ–‡";}s:3:"doi";a:1:{i:0;s:12:"多格æ¥æ–‡";}s:3:"dra";a:1:{i:0;s:21:"其他德拉维语系";}s:3:"dsb";a:1:{i:0;s:18:"下塞尔维亚文";}s:3:"dua";a:1:{i:0;s:12:"都阿拉文";}s:3:"dum";a:1:{i:0;s:15:"中å¤è·å…°æ–‡";}s:2:"dv";a:1:{i:0;s:12:"迪维希文";}s:3:"dyu";a:1:{i:0;s:12:"迪尤拉文";}s:2:"dz";a:1:{i:0;s:9:"ä¸ä¸¹æ–‡";}s:2:"ee";a:1:{i:0;s:6:"幽文";}s:2:"el";a:1:{i:0;s:9:"希腊文";}s:3:"elx";a:1:{i:0;s:15:"艾拉米特文";}s:2:"en";a:1:{i:0;s:6:"英文";}s:3:"enm";a:1:{i:0;s:12:"中å¤è‹±æ–‡";}s:2:"eo";a:1:{i:0;s:9:"世界文";}s:2:"es";a:1:{i:0;s:12:"西ç­ç‰™æ–‡";}s:2:"et";a:1:{i:0;s:15:"爱沙尼亚文";}s:2:"eu";a:1:{i:0;s:12:"巴斯克文";}s:3:"ewo";a:1:{i:0;s:9:"æ—ºæœæ–‡";}s:2:"fa";a:1:{i:0;s:9:"波斯文";}s:3:"fan";a:1:{i:0;s:9:"芳格文";}s:3:"fat";a:1:{i:0;s:9:"芳蒂文";}s:2:"ff";a:1:{i:0;s:9:"夫拉文";}s:2:"fi";a:1:{i:0;s:9:"芬兰文";}s:3:"fiu";a:1:{i:0;s:21:"芬匈文(其他)";}s:2:"fj";a:1:{i:0;s:9:"æ–济文";}s:2:"fo";a:1:{i:0;s:9:"法罗文";}s:3:"fon";a:1:{i:0;s:6:"丰文";}s:2:"fr";a:1:{i:0;s:6:"法文";}s:3:"frm";a:1:{i:0;s:12:"中å¤æ³•æ–‡";}s:3:"fro";a:1:{i:0;s:9:"å¤æ³•æ–‡";}s:3:"fur";a:1:{i:0;s:12:"弗留利文";}s:2:"fy";a:1:{i:0;s:15:"弗里斯兰文";}s:2:"ga";a:1:{i:0;s:12:"爱尔兰文";}s:3:"gaa";a:1:{
i:0;s:6:"加文";}s:3:"gay";a:1:{i:0;s:9:"迦约文";}s:3:"gba";a:1:{i:0;s:12:"葛巴亚文";}s:2:"gd";a:1:{i:0;s:20:"è‹æ ¼å…°- 盖尔文";}s:3:"gez";a:1:{i:0;s:9:"å‰å…¹æ–‡";}s:3:"gil";a:1:{i:0;s:18:"å‰å°”伯特斯文";}s:2:"gl";a:1:{i:0;s:15:"加利西亚文";}s:3:"gmh";a:1:{i:0;s:18:"中å¤é«˜åœ°å¾·æ–‡";}s:2:"gn";a:1:{i:0;s:12:"瓜拉尼文";}s:3:"goh";a:1:{i:0;s:18:"å¤ä»£é«˜åœ°å¾·æ–‡";}s:3:"gon";a:1:{i:0;s:9:"å²—å¾·æ–‡";}s:3:"gor";a:1:{i:0;s:18:"科洛涅达罗文";}s:3:"got";a:1:{i:0;s:9:"哥达文";}s:3:"grb";a:1:{i:0;s:12:"格列åšæ–‡";}s:3:"grc";a:1:{i:0;s:12:"å¤å¸Œè…Šæ–‡";}s:2:"gu";a:1:{i:0;s:15:"å¤åŠ æ‹‰ææ–‡";}s:2:"gv";a:1:{i:0;s:12:"马æ©å²›æ–‡";}s:3:"gwi";a:1:{i:0;s:15:"å‰ç»´å…‹ç´æ–‡";}s:2:"ha";a:1:{i:0;s:9:"豪撒文";}s:3:"hai";a:1:{i:0;s:9:"海达文";}s:3:"haw";a:1:{i:0;s:12:"å¤å¨å¤·æ–‡";}s:2:"he";a:1:{i:0;s:12:"希伯æ¥æ–‡";}s:2:"hi";a:1:{i:0;s:9:"å°åœ°æ–‡";}s:3:"hil";a:1:{i:0;s:15:"希利盖农文";}s:3:"him";a:1:{i:0;s:15:"赫马查利文";}s:3:"hit";a:1:{i:0;s:9:"西å°æ–‡";}s:3:"hmn";a:1:{i:0;s:9:"赫蒙文";}s:2:"ho";a:1:{i:0;s:15:"新里木托文";}s:2:"hr";a:1:{i:0;s:15:"克罗地亚文";}s:3:"hsb";a:1:{i:0;s:12:"上索布文";}s:2:"hu";a:1:{i:0;s:12:"匈牙利文";}s:3:"hup";a:1:{i:0;s:9:"胡帕文";}s:2:"hy";a:1:{i:0;s:15:"亚美尼亚文";}s:2:"hz";a:1:{i:0;s:12:"赫雷罗文";}s:2:"ia";a:1:{i:0;s:15:"拉ä¸å›½é™…æ–‡";}s:3:"iba";a:1:{i:0;s:9:"伊ç­æ–‡";}s:2:"id";a:1:{i:0;s:18:"å°åº¦å°¼è¥¿äºšæ–‡";}s:2:"ie";a:1:{i:0;s:15:"拉ä¸å›½é™…æ–‡";}s:2:"ig";a:1:{i:0;s:12:"伊格åšæ–‡";}s:2:"ii";a:1:{i:0;s:9:"å››å·è¯";}s:3:"ijo";a:1:{i:0;s:9:"伊乔文";}s:2:"ik";a:1:{i:0;s:18:"ä¾å¥´çš®ç»´å…‹æ–‡";}s:3:"ilo";a:1:{i:0;s:15:"伊洛干诺文";}s:3:"inc";a:1:{i:0;s:21:"å°åº¦æ–‡ï¼ˆå…¶ä»–)";}s:3:"ine";a:1:{i:0;s:18:"其他å°æ¬§è¯­ç³»";}s:3:"inh";a:1:{i:0;s:12:"å°å¤ä»€æ–‡";}s:2:"io";a:1:{i:0;s:30:"爱德莪文(人工语言)";}s:3:"ira";a:1:{i:0;s:9:"伊朗文";}s:3:"iro";a:1:{i:0;s:18:"伊洛郭伊费文";}s:2:"is";a:1:{i:0;s:9:"冰岛文";}s:2:"it";a:1:{i:0;s:12:"æ„大利æ–
‡";}s:2:"iu";a:1:{i:0;s:15:"爱斯基摩文";}s:2:"ja";a:1:{i:0;s:6:"日文";}s:3:"jbo";a:1:{i:0;s:27:"æ´›å‰èˆ¬ï¼ˆäººå·¥è¯­è¨€ï¼‰";}s:3:"jpr";a:1:{i:0;s:18:"犹太波斯语系";}s:3:"jrb";a:1:{i:0;s:21:"犹太阿拉伯语系";}s:2:"jv";a:1:{i:0;s:9:"爪哇文";}s:2:"ka";a:1:{i:0;s:15:"æ ¼é²å‰äºšæ–‡";}s:3:"kaa";a:1:{i:0;s:21:"å¡æ‹‰å¡å°”帕克文";}s:3:"kab";a:1:{i:0;s:12:"å¡æ¯”尔文";}s:3:"kac";a:1:{i:0;s:9:"å¡ç´æ–‡";}s:3:"kam";a:1:{i:0;s:12:"å¡å§†å·´æ–‡";}s:3:"kar";a:1:{i:0;s:9:"喀伦文";}s:3:"kaw";a:1:{i:0;s:9:"å¡å¨æ–‡";}s:3:"kbd";a:1:{i:0;s:15:"å¡å·´å°”达文";}s:2:"kg";a:1:{i:0;s:9:"刚果文";}s:3:"kha";a:1:{i:0;s:9:"å¡è¥¿æ–‡";}s:3:"khi";a:1:{i:0;s:18:"其他科伊桑文";}s:3:"kho";a:1:{i:0;s:9:"和田文";}s:2:"ki";a:1:{i:0;s:12:"å‰åº“尤文";}s:2:"kj";a:1:{i:0;s:12:"å…³çŠçŽ›æ–‡";}s:2:"kk";a:1:{i:0;s:12:"哈è¨å…‹æ–‡";}s:2:"kl";a:1:{i:0;s:12:"格陵兰文";}s:2:"km";a:1:{i:0;s:12:"柬埔寨文";}s:3:"kmb";a:1:{i:0;s:12:"金邦æœæ–‡";}s:2:"kn";a:1:{i:0;s:12:"埃纳德文";}s:2:"ko";a:1:{i:0;s:6:"韩文";}s:3:"kok";a:1:{i:0;s:12:"刚å¡å°¼æ–‡";}s:3:"kos";a:1:{i:0;s:15:"柯å¸ç‘žæ©æ–‡";}s:3:"kpe";a:1:{i:0;s:12:"克佩列文";}s:2:"kr";a:1:{i:0;s:12:"å¡åŠªé‡Œæ–‡";}s:3:"krc";a:1:{i:0;s:21:"å¡æ‹‰å¡å°”帕克文";}s:3:"kro";a:1:{i:0;s:9:"å…‹é²æ–‡";}s:3:"kru";a:1:{i:0;s:12:"库é²å…‹æ–‡";}s:2:"ks";a:1:{i:0;s:15:"克什米尔文";}s:2:"ku";a:1:{i:0;s:12:"库尔德文";}s:3:"kum";a:1:{i:0;s:12:"库梅克文";}s:3:"kut";a:1:{i:0;s:12:"库特内文";}s:2:"kv";a:1:{i:0;s:9:"科米文";}s:2:"kw";a:1:{i:0;s:12:"凯尔特文";}s:2:"ky";a:1:{i:0;s:15:"å‰å°”å‰æ–¯æ–‡";}s:2:"la";a:1:{i:0;s:9:"拉ä¸æ–‡";}s:3:"lad";a:1:{i:0;s:12:"拉迪诺文";}s:3:"lah";a:1:{i:0;s:12:"拉亨达文";}s:3:"lam";a:1:{i:0;s:9:"å…°å·´æ–‡";}s:2:"lb";a:1:{i:0;s:12:"å¢æ£®å ¡æ–‡";}s:3:"lez";a:1:{i:0;s:15:"莱兹ä¾æ˜‚æ–‡";}s:2:"lg";a:1:{i:0;s:12:"å¢å¹²è¾¾æ–‡";}s:2:"li";a:1:{i:0;s:15:"淋布尔å‰æ–‡";}s:2:"ln";a:1:{i:0;s:12:"林加拉文";}s:2:"lo";a:1:{i:0;s:9:"è€æŒæ–‡";}s:3:"lol";a:1:{i:0;s:9:"è’™å¤æ–‡";}s:3:"loz";a:1:{i
:0;s:9:"洛兹文";}s:2:"lt";a:1:{i:0;s:12:"立陶宛文";}s:2:"lu";a:1:{i:0;s:18:"é²å·´åŠ ä¸¹åŠ æ–‡";}s:3:"lua";a:1:{i:0;s:15:"é²å·´é²ç“¦æ–‡";}s:3:"lui";a:1:{i:0;s:15:"路易塞诺文";}s:3:"lun";a:1:{i:0;s:9:"隆达文";}s:3:"luo";a:1:{i:0;s:9:"å¢å¥¥æ–‡";}s:3:"lus";a:1:{i:0;s:9:"å¢æ™’æ–‡";}s:2:"lv";a:1:{i:0;s:15:"拉脫維亞文";}s:3:"mad";a:1:{i:0;s:12:"马都拉文";}s:3:"mag";a:1:{i:0;s:12:"马加伊文";}s:3:"mai";a:1:{i:0;s:12:"迈蒂利文";}s:3:"mak";a:1:{i:0;s:12:"望加锡文";}s:3:"man";a:1:{i:0;s:12:"曼ä¸å“¥æ–‡";}s:3:"map";a:1:{i:0;s:30:"马æ¥äºšçŽ»é‡Œå°¼è¥¿äºšè¯­ç³»";}s:3:"mas";a:1:{i:0;s:9:"è¨ä¼Šè¯­";}s:3:"mdf";a:1:{i:0;s:12:"莫克沙文";}s:3:"mdr";a:1:{i:0;s:9:"曼达尔";}s:3:"men";a:1:{i:0;s:9:"门迪文";}s:2:"mg";a:1:{i:0;s:15:"马尔加什文";}s:3:"mga";a:1:{i:0;s:18:"中å¤çˆ±å°”å…°æ–‡";}s:2:"mh";a:1:{i:0;s:12:"马ç»å°”æ–‡";}s:2:"mi";a:1:{i:0;s:9:"毛利文";}s:3:"mic";a:1:{i:0;s:15:"米克马克文";}s:3:"min";a:1:{i:0;s:15:"ç±³å—å¡ä¿æ–‡";}s:3:"mis";a:1:{i:0;s:18:"å„ç§ä¸åŒè¯­è¨€";}s:2:"mk";a:1:{i:0;s:12:"马其顿文";}s:3:"mkh";a:1:{i:0;s:18:"其他蒙å‰è”‘æ–‡";}s:2:"ml";a:1:{i:0;s:18:"马æ¥äºšæ‹‰å§†æ–‡";}s:2:"mn";a:1:{i:0;s:9:"è’™å¤æ–‡";}s:3:"mnc";a:1:{i:0;s:6:"满文";}s:3:"mni";a:1:{i:0;s:15:"曼尼普里文";}s:3:"mno";a:1:{i:0;s:15:"马诺åšæ±¡æ–‡";}s:2:"mo";a:1:{i:0;s:15:"摩尔多瓦文";}s:3:"moh";a:1:{i:0;s:12:"æ‘©éœå…‹æ–‡";}s:3:"mos";a:1:{i:0;s:9:"莫西文";}s:2:"mr";a:1:{i:0;s:12:"马拉地文";}s:2:"ms";a:1:{i:0;s:9:"马æ¥æ–‡";}s:2:"mt";a:1:{i:0;s:12:"马耳他文";}s:3:"mul";a:1:{i:0;s:12:"多ç§è¯­è¨€";}s:3:"mun";a:1:{i:0;s:9:"蒙达文";}s:3:"mus";a:1:{i:0;s:15:"摩斯科格文";}s:3:"mwr";a:1:{i:0;s:15:"马尔尼里文";}s:2:"my";a:1:{i:0;s:9:"缅甸文";}s:3:"myn";a:1:{i:0;s:9:"玛雅文";}s:3:"myv";a:1:{i:0;s:12:"俄日亚文";}s:2:"na";a:1:{i:0;s:9:"ç‘™é²æ–‡";}s:3:"nah";a:1:{i:0;s:15:"纳瓦特尔文";}s:3:"nai";a:1:{i:0;s:27:"其他北美å°ç¬¬å®‰è¯­ç³»";}s:3:"nap";a:1:{i:0;s:12:"拿波里文";}s:2:"nb";a:1:{i:0;s:21:"挪å¨åšå…‹é©¬å°”æ–‡";
}s:2:"nd";a:1:{i:0;s:18:"北æ©å¾·è´å‹’æ–‡";}s:3:"nds";a:1:{i:0;s:42:"德国北部的德文;低地è¨å…‹é€Šæ–‡";}s:2:"ne";a:1:{i:0;s:12:"尼泊尔文";}s:3:"new";a:1:{i:0;s:12:"尼瓦尔文";}s:2:"ng";a:1:{i:0;s:12:"æ©ä¸œåŠ æ–‡";}s:3:"nia";a:1:{i:0;s:12:"尼尔å¸æ–‡";}s:3:"nic";a:1:{i:0;s:27:"其他尼日尔刚果语系";}s:3:"niu";a:1:{i:0;s:9:"纽埃文";}s:2:"nl";a:1:{i:0;s:9:"è·å…°æ–‡";}s:2:"nn";a:1:{i:0;s:21:"挪å¨å°¼è¯ºæ–¯å…‹æ–‡";}s:2:"no";a:1:{i:0;s:9:"挪å¨æ–‡";}s:3:"nog";a:1:{i:0;s:9:"诺盖文";}s:3:"non";a:1:{i:0;s:15:"å¤è¯ºå°”斯文";}s:2:"nr";a:1:{i:0;s:21:"å—部æ©å¾·è´å‹’æ–‡";}s:3:"nso";a:1:{i:0;s:12:"北索托文";}s:3:"nub";a:1:{i:0;s:12:"努比亚文";}s:2:"nv";a:1:{i:0;s:12:"纳瓦éœæ–‡";}s:2:"ny";a:1:{i:0;s:36:"尼昂加文;切瓦文;切瓦文";}s:3:"nym";a:1:{i:0;s:18:"尼亚姆韦é½æ–‡";}s:3:"nyn";a:1:{i:0;s:15:"尼昂科勒文";}s:3:"nyo";a:1:{i:0;s:15:"尼约罗语æ—";}s:3:"nzi";a:1:{i:0;s:12:"尼兹玛文";}s:2:"oc";a:1:{i:0;s:12:"奥西å¦æ–‡";}s:2:"oj";a:1:{i:0;s:15:"奥季布瓦文";}s:2:"om";a:1:{i:0;s:9:"阿曼文";}s:2:"or";a:1:{i:0;s:12:"欧里亚文";}s:2:"os";a:1:{i:0;s:12:"奥塞ææ–‡";}s:3:"osa";a:1:{i:0;s:12:"奥è¨å“²æ–‡";}s:3:"ota";a:1:{i:0;s:21:"奥托曼土耳其文";}s:3:"oto";a:1:{i:0;s:15:"奥托米语系";}s:2:"pa";a:1:{i:0;s:12:"æ—é®æ™®æ–‡";}s:3:"paa";a:1:{i:0;s:18:"其他巴布亚文";}s:3:"pag";a:1:{i:0;s:15:"邦阿西å—æ–‡";}s:3:"pal";a:1:{i:0;s:12:"帕拉维文";}s:3:"pam";a:1:{i:0;s:12:"邦æ¿ç‰™æ–‡";}s:3:"pap";a:1:{i:0;s:18:"帕皮亚内托文";}s:3:"pau";a:1:{i:0;s:9:"帕劳文";}s:3:"peo";a:1:{i:0;s:15:"å¤è€æ³¢æ–¯è¯­";}s:3:"phi";a:1:{i:0;s:21:"其他è²å¾‹å®¾è¯­ç³»";}s:3:"phn";a:1:{i:0;s:12:"腓利基文";}s:2:"pi";a:1:{i:0;s:9:"帕利文";}s:2:"pl";a:1:{i:0;s:9:"波兰文";}s:3:"pon";a:1:{i:0;s:12:"波那è´æ–‡";}s:3:"pra";a:1:{i:0;s:48:"å°åº¦å¤ä»£åŠä¸­ä¸–纪之中部åŠåŒ—部方言";}s:3:"pro";a:1:{i:0;s:15:"普罗文斯文";}s:2:"ps";a:1:{i:0;s:12:"普什图文";}s:2:"pt";a:1:{i:0;s:12:"è‘¡è„牙文";}s:2:"qu";a:1:{i:0;s:12:"ç›–ä¸
˜äºšæ–‡";}s:3:"raj";a:1:{i:0;s:15:"拉贾斯å¦æ–‡";}s:3:"rap";a:1:{i:0;s:12:"拉帕努文";}s:3:"rar";a:1:{i:0;s:15:"拉罗汤加文";}s:2:"rm";a:1:{i:0;s:18:"里托罗曼斯文";}s:2:"rn";a:1:{i:0;s:12:"基隆迪文";}s:2:"ro";a:1:{i:0;s:15:"罗马尼亚文";}s:3:"roa";a:1:{i:0;s:18:"其他拉ä¸è¯­ç³»";}s:3:"rom";a:1:{i:0;s:12:"å‰æ™®èµ›æ–‡";}s:2:"ru";a:1:{i:0;s:6:"ä¿„æ–‡";}s:2:"rw";a:1:{i:0;s:12:"å¢æ—ºè¾¾æ–‡";}s:2:"sa";a:1:{i:0;s:6:"梵文";}s:3:"sad";a:1:{i:0;s:12:"散达维文";}s:3:"sah";a:1:{i:0;s:12:"雅库特文";}s:3:"sai";a:1:{i:0;s:24:"其他å—美å°ç¬¬å®‰æ–‡";}s:3:"sal";a:1:{i:0;s:12:"è¨åˆ©ä»€æ–‡";}s:3:"sam";a:1:{i:0;s:15:"è¨çŽ›åˆ©äºšæ–‡";}s:3:"sas";a:1:{i:0;s:12:"å¡žå¡žå¡æ–‡";}s:3:"sat";a:1:{i:0;s:12:"桑嗒利文";}s:2:"sc";a:1:{i:0;s:9:"è¨ä¸æ–‡";}s:3:"sco";a:1:{i:0;s:12:"è‹æ ¼å…°æ–‡";}s:2:"sd";a:1:{i:0;s:9:"è‹ä¸¹æ–‡";}s:2:"se";a:1:{i:0;s:12:"北è¨è¿·æ–‡";}s:3:"sel";a:1:{i:0;s:15:"塞尔库普文";}s:3:"sem";a:1:{i:0;s:18:"其他闪æ—语系";}s:2:"sg";a:1:{i:0;s:9:"桑戈文";}s:3:"sga";a:1:{i:0;s:15:"å¤çˆ±å°”å…°æ–‡";}s:3:"sgn";a:1:{i:0;s:6:"手语";}s:2:"sh";a:1:{i:0;s:28:"塞波尼斯-克罗地亚文";}s:3:"shn";a:1:{i:0;s:6:"掸文";}s:2:"si";a:1:{i:0;s:12:"僧伽罗文";}s:3:"sid";a:1:{i:0;s:12:"悉达摩文";}s:3:"sio";a:1:{i:0;s:15:"è‹è¯­è¯¸è¯­è¨€";}s:3:"sit";a:1:{i:0;s:18:"其他汉è—语系";}s:2:"sk";a:1:{i:0;s:15:"斯洛ä¼å…‹æ–‡";}s:2:"sl";a:1:{i:0;s:18:"斯洛文尼亚文";}s:3:"sla";a:1:{i:0;s:21:"其他斯拉夫语系";}s:2:"sm";a:1:{i:0;s:12:"è¨æ‘©äºšæ–‡";}s:3:"sma";a:1:{i:0;s:12:"å—è¨è¿·æ–‡";}s:3:"smi";a:1:{i:0;s:15:"其他è¨è¿·æ–‡";}s:3:"smj";a:1:{i:0;s:15:"å¢ä¹è¨è¿·æ–‡";}s:3:"smn";a:1:{i:0;s:18:"ä¾çº³æ—¥è¨è¿·æ–‡";}s:3:"sms";a:1:{i:0;s:18:"å¸å¯‡ç‰¹è¨è¿·æ–‡";}s:2:"sn";a:1:{i:0;s:15:"塞内加尔文";}s:3:"snk";a:1:{i:0;s:12:"索尼基文";}s:2:"so";a:1:{i:0;s:12:"索马里文";}s:3:"sog";a:1:{i:0;s:15:"索格迪亚文";}s:3:"son";a:1:{i:0;s:9:"æ¡‘æµ·æ–‡";}s:2:"sq";a:1:{i:0;s:18:"阿尔巴尼亚文";}s:2:"sr";a:1:{i:0;s:15:"塞尔维亚文";}s:3:"srr";a:1:{i:
0;s:12:"谢列尔文";}s:2:"ss";a:1:{i:0;s:15:"辛辛那ææ–‡";}s:3:"ssa";a:1:{i:0;s:24:"其他尼罗è¨å“ˆå…°æ–‡";}s:2:"st";a:1:{i:0;s:12:"塞索托文";}s:2:"su";a:1:{i:0;s:9:"è‹ä¸¹æ–‡";}s:3:"suk";a:1:{i:0;s:12:"è‹åº“马文";}s:3:"sus";a:1:{i:0;s:9:"è‹è‹æ–‡";}s:3:"sux";a:1:{i:0;s:9:"è‹é©¬æ–‡";}s:2:"sv";a:1:{i:0;s:9:"瑞典文";}s:2:"sw";a:1:{i:0;s:15:"斯瓦希里文";}s:3:"syr";a:1:{i:0;s:12:"å™åˆ©äºšæ–‡";}s:2:"ta";a:1:{i:0;s:12:"泰米尔文";}s:3:"tai";a:1:{i:0;s:12:"其他泰文";}s:2:"te";a:1:{i:0;s:12:"æ³°å¢å›ºæ–‡";}s:3:"tem";a:1:{i:0;s:12:"体姆å‘æ–‡";}s:3:"ter";a:1:{i:0;s:12:"特å–诺文";}s:3:"tet";a:1:{i:0;s:12:"特图们文";}s:2:"tg";a:1:{i:0;s:12:"å¡”å‰å…‹æ–‡";}s:2:"th";a:1:{i:0;s:6:"æ³°æ–‡";}s:2:"ti";a:1:{i:0;s:18:"æ格里尼亚文";}s:3:"tig";a:1:{i:0;s:12:"æ格雷文";}s:3:"tiv";a:1:{i:0;s:9:"蒂夫文";}s:2:"tk";a:1:{i:0;s:12:"土库曼文";}s:3:"tkl";a:1:{i:0;s:12:"陀克娄文";}s:2:"tl";a:1:{i:0;s:15:"塔加路æ—æ–‡";}s:3:"tli";a:1:{i:0;s:15:"特林å‰ç‰¹æ–‡";}s:3:"tmh";a:1:{i:0;s:15:"塔玛åŽå…‹æ–‡";}s:2:"tn";a:1:{i:0;s:12:"çªå°¼æ–¯æ–‡";}s:2:"to";a:1:{i:0;s:9:"汤加文";}s:3:"tog";a:1:{i:0;s:30:"汤加文(尼亚è¨åœ°åŒºï¼‰";}s:3:"tpi";a:1:{i:0;s:15:"托克皮辛文";}s:2:"tr";a:1:{i:0;s:12:"土耳其文";}s:2:"ts";a:1:{i:0;s:12:"特æ¾åŠ æ–‡";}s:3:"tsi";a:1:{i:0;s:15:"蒂姆西亚文";}s:2:"tt";a:1:{i:0;s:9:"éž‘é¼æ–‡";}s:3:"tum";a:1:{i:0;s:12:"通布å¡æ–‡";}s:3:"tup";a:1:{i:0;s:9:"图匹文";}s:3:"tut";a:1:{i:0;s:21:"其他阿尔泰语系";}s:3:"tvl";a:1:{i:0;s:12:"图瓦å¢æ–‡";}s:2:"tw";a:1:{i:0;s:9:"å°æ¹¾æ–‡";}s:2:"ty";a:1:{i:0;s:12:"塔西ææ–‡";}s:3:"tyv";a:1:{i:0;s:9:"图瓦文";}s:3:"udm";a:1:{i:0;s:18:"乌德穆尔特文";}s:2:"ug";a:1:{i:0;s:12:"ç»´å¾å°”æ–‡";}s:3:"uga";a:1:{i:0;s:15:"乌加里特文";}s:2:"uk";a:1:{i:0;s:12:"乌克兰文";}s:3:"umb";a:1:{i:0;s:12:"姆崩æœæ–‡";}s:3:"und";a:1:{i:0;s:12:"未定语ç§";}s:2:"ur";a:1:{i:0;s:12:"乌尔都文";}s:2:"uz";a:1:{i:0;s:15:"乌兹别克文";}s:3:"vai";a:1:{i:0;s:9:"瓦伊文";}s:2:"ve";a:1:{i:0;s:9
:"文达文";}s:2:"vi";a:1:{i:0;s:9:"越å—æ–‡";}s:2:"vo";a:1:{i:0;s:15:"沃拉普克文";}s:3:"vot";a:1:{i:0;s:12:"沃æå…‹æ–‡";}s:2:"wa";a:1:{i:0;s:9:"è¯éš†æ–‡";}s:3:"wak";a:1:{i:0;s:12:"瓦喀山文";}s:3:"wal";a:1:{i:0;s:12:"瓦拉莫文";}s:3:"war";a:1:{i:0;s:9:"佤瑞文";}s:3:"was";a:1:{i:0;s:9:"瓦ç»æ–‡";}s:3:"wen";a:1:{i:0;s:15:"索布诸语言";}s:2:"wo";a:1:{i:0;s:12:"沃尔夫文";}s:3:"xal";a:1:{i:0;s:15:"å¡å•¦è¿·å…‹æ–‡";}s:2:"xh";a:1:{i:0;s:9:"ç­å›¾æ–‡";}s:3:"yao";a:1:{i:0;s:9:"瑶æ—æ–‡";}s:3:"yap";a:1:{i:0;s:9:"雅浦文";}s:2:"yi";a:1:{i:0;s:9:"ä¾åœ°æ–‡";}s:2:"yo";a:1:{i:0;s:12:"约é²å·´æ–‡";}s:3:"ypk";a:1:{i:0;s:12:"喻皮克文";}s:2:"za";a:1:{i:0;s:6:"è—æ–‡";}s:3:"zap";a:1:{i:0;s:15:"è¨æ³¢è’‚å…‹æ–‡";}s:3:"zen";a:1:{i:0;s:12:"泽纳加文";}s:2:"zh";a:1:{i:0;s:6:"中文";}s:3:"znd";a:1:{i:0;s:9:"赞德文";}s:2:"zu";a:1:{i:0;s:9:"祖é²æ–‡";}s:3:"zun";a:1:{i:0;s:9:"祖尼语";}}s:12:"LocaleScript";a:1:{i:0;s:4:"Hani";}s:7:"Scripts";a:53:{s:4:"Arab";a:1:{i:0;s:12:"阿拉伯语";}s:4:"Armn";a:1:{i:0;s:15:"亚美尼亚语";}s:4:"Beng";a:1:{i:0;s:12:"孟加拉语";}s:4:"Bopo";a:1:{i:0;s:12:"汉语拼音";}s:4:"Brai";a:1:{i:0;s:12:"布拉耶语";}s:4:"Buhd";a:1:{i:0;s:12:"布希德语";}s:4:"Cans";a:1:{i:0;s:30:"加拿大土著统一符å·è¯­";}s:4:"Cher";a:1:{i:0;s:12:"切罗基语";}s:4:"Copt";a:1:{i:0;s:12:"克普特语";}s:4:"Cprt";a:1:{i:0;s:15:"塞浦路斯语";}s:4:"Cyrl";a:1:{i:0;s:12:"西里尔语";}s:4:"Deva";a:1:{i:0;s:6:"梵文";}s:4:"Dsrt";a:1:{i:0;s:15:"戴泽雷特语";}s:4:"Ethi";a:1:{i:0;s:18:"埃塞俄比亚语";}s:4:"Geor";a:1:{i:0;s:12:"乔治亚语";}s:4:"Goth";a:1:{i:0;s:9:"哥特语";}s:4:"Grek";a:1:{i:0;s:9:"希腊语";}s:4:"Gujr";a:1:{i:0;s:15:"å¤å‰æ‹‰ç‰¹è¯­";}s:4:"Guru";a:1:{i:0;s:15:"æžœé²ç©†å¥‡è¯­";}s:4:"Hang";a:1:{i:0;s:6:"韩语";}s:4:"Hani";a:1:{i:0;s:6:"汉语";}s:4:"Hano";a:1:{i:0;s:12:"汉奴罗语";}s:4:"Hans";a:1:{i:0;s:12:"简体汉语";}s:4:"Hant";a:1:{i:0;s:12:"ç¹ä½“汉语";}s:4:"Hebr";a:1:{i:0;s:12:"希伯æ¥è¯­";}s:4:"Hira";a:1:{i:0;s:9:"å¹³å‡å
";}s:4:"Ital";a:1:{i:0;s:15:"å¤æ„大利语";}s:4:"Kana";a:1:{i:0;s:9:"片å‡å";}s:4:"Khmr";a:1:{i:0;s:9:"高棉语";}s:4:"Knda";a:1:{i:0;s:15:"å¡çº³å¡”克语";}s:4:"Laoo";a:1:{i:0;s:9:"è€æŒè¯­";}s:4:"Latn";a:1:{i:0;s:9:"拉ä¸è¯­";}s:4:"Limb";a:1:{i:0;s:9:"林布语";}s:4:"Mlym";a:1:{i:0;s:18:"马拉亚拉姆语";}s:4:"Mong";a:1:{i:0;s:9:"è’™å¤è¯­";}s:4:"Mymr";a:1:{i:0;s:6:"缅甸";}s:4:"Ogam";a:1:{i:0;s:9:"欧甘语";}s:4:"Orya";a:1:{i:0;s:12:"奥里亚语";}s:4:"Osma";a:1:{i:0;s:15:"奥斯曼亚语";}s:4:"Runr";a:1:{i:0;s:9:"北欧语";}s:4:"Shaw";a:1:{i:0;s:15:"è§ä¼¯çº³å¼è¯­";}s:4:"Sinh";a:1:{i:0;s:12:"辛哈拉语";}s:4:"Syrc";a:1:{i:0;s:12:"å™åˆ©äºšè¯­";}s:4:"Tagb";a:1:{i:0;s:15:"塔格ç­ç“¦è¯­";}s:4:"Tale";a:1:{i:0;s:9:"æ³°ä¹è¯­";}s:4:"Taml";a:1:{i:0;s:12:"泰米尔语";}s:4:"Telu";a:1:{i:0;s:12:"æ³°å¢å›ºè¯­";}s:4:"Tglg";a:1:{i:0;s:12:"塔加路语";}s:4:"Thaa";a:1:{i:0;s:12:"塔安娜语";}s:4:"Thai";a:1:{i:0;s:6:"泰语";}s:4:"Tibt";a:1:{i:0;s:6:"è—语";}s:4:"Ugar";a:1:{i:0;s:15:"乌加里特语";}s:4:"Yiii";a:1:{i:0;s:6:"å½è¯­";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:12:"佛教日历";}s:7:"chinese";a:1:{i:0;s:6:"农历";}s:9:"gregorian";a:1:{i:0;s:6:"公历";}s:6:"hebrew";a:1:{i:0;s:15:"希伯æ¥æ—¥åŽ†";}s:7:"islamic";a:1:{i:0;s:15:"伊斯兰日历";}s:13:"islamic-civil";a:1:{i:0;s:21:"伊斯兰希å‰æ¥åŽ†";}s:8:"japanese";a:1:{i:0;s:12:"日本日历";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:6:"顺åº";}s:9:"phonebook";a:1:{i:0;s:15:"电è¯ç°¿é¡ºåº";}s:6:"pinyin";a:1:{i:0;s:12:"拼音顺åº";}s:6:"stroke";a:1:{i:0;s:12:"笔划顺åº";}s:11:"traditional";a:1:{i:0;s:12:"传统历法";}}}s:8:"Variants";a:1:{s:7:"REVISED";a:1:{i:0;s:9:"已修订";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:4:{s:11:"AmPmMarkers";a:2:{i:0;s:6:"上åˆ";i:1;s:6:"下åˆ";}s:8:"dayNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:7:{i:0;s:3:"æ—¥";i:1;s:3:"一";i:2;s:3:"二";i:3;s:3:"三";i:4;s:3:"å››";i:5;s:3:"五";i:6;s:3:"å…­";}s:6:"narrow";a:7:{i:
0;s:3:"æ—¥";i:1;s:3:"一";i:2;s:3:"二";i:3;s:3:"三";i:4;s:3:"å››";i:5;s:3:"五";i:6;s:3:"å…­";}s:4:"wide";a:7:{i:0;s:9:"星期日";i:1;s:9:"星期一";i:2;s:9:"星期二";i:3;s:9:"星期三";i:4;s:9:"星期四";i:5;s:9:"星期五";i:6;s:9:"星期六";}}}s:4:"eras";a:1:{s:11:"abbreviated";a:2:{i:0;s:9:"公元å‰";i:1;s:6:"公元";}}s:10:"monthNames";a:1:{s:6:"format";a:3:{s:11:"abbreviated";a:12:{i:0;s:6:"一月";i:1;s:6:"二月";i:2;s:6:"三月";i:3;s:6:"四月";i:4;s:6:"五月";i:5;s:6:"六月";i:6;s:6:"七月";i:7;s:6:"八月";i:8;s:6:"ä¹æœˆ";i:9;s:6:"å月";i:10;s:9:"å一月";i:11;s:9:"å二月";}s:6:"narrow";a:12:{i:0;s:4:"1月";i:1;s:4:"2月";i:2;s:4:"3月";i:3;s:4:"4月";i:4;s:4:"5月";i:5;s:4:"6月";i:6;s:4:"7月";i:7;s:4:"8月";i:8;s:4:"9月";i:9;s:5:"10月";i:10;s:5:"11月";i:11;s:5:"12月";}s:4:"wide";a:12:{i:0;s:6:"一月";i:1;s:6:"二月";i:2;s:6:"三月";i:3;s:6:"四月";i:4;s:6:"五月";i:5;s:6:"六月";i:6;s:6:"七月";i:7;s:6:"八月";i:8;s:6:"ä¹æœˆ";i:9;s:6:"å月";i:10;s:9:"å一月";i:11;s:9:"å二月";}}}}}s:17:"localPatternChars";a:1:{i:0;s:24:"GanjkHmsSEDFwWxhKzAeugXZ";}s:11:"zoneStrings";a:17:{i:0;a:6:{i:0;s:19:"America/Los_Angeles";i:1;s:21:"太平洋标准时间";i:2;s:3:"PST";i:3;s:21:"太平洋å¤ä»¤æ—¶é—´";i:4;s:3:"PDT";i:5;s:9:"æ´›æ‰çŸ¶";}i:1;a:6:{i:0;s:14:"America/Denver";i:1;s:18:"山区标准时间";i:2;s:3:"MST";i:3;s:18:"山区å¤ä»¤æ—¶é—´";i:4;s:3:"MDT";i:5;s:6:"丹佛";}i:2;a:6:{i:0;s:15:"America/Phoenix";i:1;s:18:"山区标准时间";i:2;s:3:"MST";i:3;s:18:"山区标准时间";i:4;s:3:"MST";i:5;s:9:"凤凰城";}i:3;a:6:{i:0;s:15:"America/Chicago";i:1;s:18:"中央标准时间";i:2;s:3:"CST";i:3;s:18:"中央å¤ä»¤æ—¶é—´";i:4;s:3:"CDT";i:5;s:9:"èŠåŠ å“¥";}i:4;a:6:{i:0;s:16:"America/New_York";i:1;s:18:"东部标准时间";i:2;s:3:"EST";i:3;s:18:"东部å¤ä»¤æ—¶é—´";i:4;s:3:"EDT";i:5;s:6:"纽约";}i:5;a:6:{i:0;s:20:"America/Indianapolis";i:1;s:18:"东部标准时间";i:2;s:3:"EST";i:3;s:18:"东部标准时间";i:4;s:3:"EST";i:5;s:21:"å°åœ°å®‰çº³æ³¢åˆ©æ–¯";}i:6;a:6:{i:
0;s:16:"Pacific/Honolulu";i:1;s:21:"å¤å¨å¤·æ ‡å‡†æ—¶é—´";i:2;s:3:"HST";i:3;s:21:"å¤å¨å¤·æ ‡å‡†æ—¶é—´";i:4;s:3:"HST";i:5;s:9:"檀香山";}i:7;a:6:{i:0;s:17:"America/Anchorage";i:1;s:24:"阿拉斯加标准时间";i:2;s:3:"AST";i:3;s:24:"阿拉斯加å¤ä»¤æ—¶é—´";i:4;s:3:"ADT";i:5;s:12:"安克雷奇";}i:8;a:6:{i:0;s:15:"America/Halifax";i:1;s:21:"大西洋标准时间";i:2;s:3:"AST";i:3;s:21:"大西洋å¤ä»¤æ—¶é—´";i:4;s:3:"ADT";i:5;s:15:"哈利法克斯";}i:9;a:6:{i:0;s:16:"America/St_Johns";i:1;s:21:"纽芬兰标准时间";i:2;s:3:"CNT";i:3;s:21:"纽芬兰å¤ä»¤æ—¶é—´";i:4;s:3:"CDT";i:5;s:9:"圣约翰";}i:10;a:6:{i:0;s:12:"Europe/Paris";i:1;s:18:"中欧标准时间";i:2;s:3:"CET";i:3;s:18:"中欧å¤ä»¤æ—¶é—´";i:4;s:4:"CEST";i:5;s:6:"巴黎";}i:11;a:6:{i:0;s:7:"Etc/GMT";i:1;s:24:"格林å¨æ²»æ ‡å‡†æ—¶é—´";i:2;s:3:"GMT";i:3;s:24:"格林å¨æ²»æ ‡å‡†æ—¶é—´";i:4;s:3:"GMT";i:5;s:6:"伦敦";}i:12;a:6:{i:0;s:17:"Africa/Casablanca";i:1;s:24:"格林å¨æ²»æ ‡å‡†æ—¶é—´";i:2;s:3:"GMT";i:3;s:24:"格林å¨æ²»æ ‡å‡†æ—¶é—´";i:4;s:3:"GMT";i:5;s:15:"å¡è¨å¸ƒå…°å¡";}i:13;a:6:{i:0;s:14:"Asia/Jerusalem";i:1;s:21:"以色列标准时间";i:2;s:3:"IST";i:3;s:21:"以色列å¤ä»¤æ—¶é—´";i:4;s:3:"IDT";i:5;s:12:"耶路撒冷";}i:14;a:6:{i:0;s:10:"Asia/Tokyo";i:1;s:18:"日本标准时间";i:2;s:3:"JST";i:3;s:18:"日本标准时间";i:4;s:3:"JST";i:5;s:6:"东京";}i:15;a:6:{i:0;s:16:"Europe/Bucharest";i:1;s:18:"东欧标准时间";i:2;s:3:"EET";i:3;s:18:"东欧å¤ä»¤æ—¶é—´";i:4;s:4:"EEST";i:5;s:15:"布加勒斯特";}i:16;a:6:{i:0;s:13:"Asia/Shanghai";i:1;s:18:"中国标准时间";i:2;s:3:"CTT";i:3;s:18:"中国标准时间";i:4;s:3:"CDT";i:5;s:6:"上海";}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_CN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_CN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_CN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"__ALIAS";a:1:{i:0;s:10:"zh_Hans_CN";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_HK.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_HK.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_HK.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"__ALIAS";a:1:{i:0;s:10:"zh_Hant_HK";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hans.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hans.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hans.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hans_CN.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hans_CN.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hans_CN.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:3:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:24:"ahh'时'mm'分'ss'秒' z";i:1;s:22:"ahh'时'mm'分'ss'秒'";i:2;s:9:"ahh:mm:ss";i:3;s:5:"ah:mm";i:4;s:25:"yyyy'年'M'月'd'日'EEEE";i:5;s:21:"yyyy'年'M'月'd'日'";i:6;s:8:"yyyy-M-d";i:7;s:6:"yy-M-d";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hans_SG.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hans_SG.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hans_SG.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:5:{s:9:"Countries";a:7:{s:2:"AU";a:1:{i:0;s:6:"澳洲";}s:2:"CZ";a:1:{i:0;s:6:"æ·å…‹";}s:2:"ID";a:1:{i:0;s:6:"å°å°¼";}s:2:"KR";a:1:{i:0;s:6:"å—韩";}s:2:"MK";a:1:{i:0;s:9:"马其顿";}s:2:"NZ";a:1:{i:0;s:9:"纽西兰";}s:2:"SA";a:1:{i:0;s:15:"沙地阿拉伯";}}s:9:"Languages";a:2:{s:4:"root";a:1:{i:0;s:7:"æ ¹ æº";}s:2:"sh";a:1:{i:0;s:27:"塞尔维亚克罗地亚文";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:10:"a hh:mm:ss";i:1;s:10:"a hh:mm:ss";i:2;s:7:"a hh:mm";i:3;s:7:"a hh:mm";i:4;s:12:"dd MMMM yyyy";i:5;s:11:"dd MMM yyyy";i:6;s:9:"dd-MMM-yy";i:7;s:8:"dd/MM/yy";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:10:{s:9:"Countries";a:202:{s:2:"AD";a:1:{i:0;s:9:"安é“爾";}s:2:"AE";a:1:{i:0;s:24:"阿拉伯è¯åˆå¤§å…¬åœ‹";}s:2:"AG";a:1:{i:0;s:21:"安地å¡åŠå·´å¸ƒé”";}s:2:"AI";a:1:{i:0;s:12:"安圭拉島";}s:2:"AL";a:1:{i:0;s:15:"阿爾巴尼亞";}s:2:"AM";a:1:{i:0;s:12:"亞美尼亞";}s:2:"AN";a:1:{i:0;s:18:"è·å±¬å®‰åœ°åˆ—æ–¯";}s:2:"AQ";a:1:{i:0;s:9:"å—極洲";}s:2:"AS";a:1:{i:0;s:21:"美屬薩摩亞群島";}s:2:"AT";a:1:{i:0;s:9:"奧地利";}s:2:"AU";a:1:{i:0;s:6:"澳洲";}s:2:"AW";a:1:{i:0;s:9:"阿路巴";}s:2:"AZ";a:1:{i:0;s:12:"亞塞拜然";}s:2:"BA";a:1:{i:0;s:30:"波士尼亞與赫塞格維ç´";}s:2:"BB";a:1:{i:0;s:9:"å·´è²å¤š";}s:2:"BD";a:1:{i:0;s:9:"孟加拉";}s:2:"BE";a:1:{i:0;s:9:"比利時";}s:2:"BF";a:1:{i:0;s:15:"布基ç´æ³•ç´¢";}s:2:"BG";a:1:{i:0;s:12:"ä¿åŠ åˆ©äºž";}s:2:"BI";a:1:{i:0;s:9:"浦隆地";}s:2:"BJ";a:1:{i:0;s:6:"è²å—";}s:2:"BM";a:1:{i:0;s:9:"百慕é”";}s:2:"BN";a:1:{i:0;s:6:"汶èŠ";}s:2:"BO";a:1:{i:0;s:12:"玻利維亞";}s:2:"BS";a:1:{i:0;s:9:"巴哈馬";}s:2:"BV";a:1:{i:0;s:9:"布å¨å³¶";}s:2:"BW";a:1:{i:0;s:9:"波札那";}s:2:"BY";a:1:{i:0;s:12:"白俄羅斯";}s:2:"BZ";a:1:{i:0;s:9:"è²é‡Œæ–¯";}s:2:"CC";a:1:{i:0;s:15:"å¯å¯æ–¯ç¾¤å³¶";}s:2:"CD";a:1:{i:0;s:21:"剛果民主共和國";}s:2:"CF";a:1:{i:0;s:15:"中éžå…±å’Œåœ‹";}s:2:"CG";a:1:{i:0;s:6:"剛果";}s:2:"CI";a:1:{i:0;s:12:"科特迪瓦";}s:2:"CK";a:1:{i:0;s:12:"庫克群島";}s:2:"CM";a:1:{i:0;s:9:"喀麥隆";}s:2:"CN";a:1:{i:0;s:21:"中è¯äººæ°‘共和國";}s:2:"CO";a:1:{i:0;s:12:"哥倫比亞";}s:2:"CR";a:1:{i:0;s:15:"哥斯大黎加";}s:2:"CV";a:1:{i:0;s:9:"維德角";}s:2:"CX";a:1:{i:0;s:9:"è–誕島";}s:2:"CY";a:1:{i:0;s:12:"賽普勒斯";}s:2:"CZ";a:1:{i:0;s:15:"æ·å…‹å…±å’Œåœ‹";}s:2:"DE";a:1:{i:0;s:6:"德國";}s:2:"DJ";a:1:{i:0;s:9:"å‰å¸ƒåœ°";}s:2:"DK";a:1:{i:0;s:6:"丹麥";}s:2:"DM";a:1:{i:0;s:12:"多明尼加";}s:2:"DO";a:1:{i:0;s:21:"多明尼加共和國";}s:2:"DZ";a:1:{i:0;s:15:"阿爾åŠåˆ©äºž";}s:2:"EC";a:1:{i:0;s:12:"厄瓜多爾";}s:2:"EE";a:1:{i:0;s:12:"愛沙尼亞";}s:2:"ER";a:1:{i:0;s:12:"厄利垂亞"
;}s:2:"ET";a:1:{i:0;s:12:"衣索比亞";}s:2:"FI";a:1:{i:0;s:6:"芬蘭";}s:2:"FJ";a:1:{i:0;s:6:"æ–æ¿Ÿ";}s:2:"FK";a:1:{i:0;s:15:"ç¦å…‹è˜­ç¾¤å³¶";}s:2:"FM";a:1:{i:0;s:24:"密克羅尼西亞群島";}s:2:"FO";a:1:{i:0;s:12:"法羅群島";}s:2:"FR";a:1:{i:0;s:6:"法國";}s:2:"GA";a:1:{i:0;s:6:"加彭";}s:2:"GB";a:1:{i:0;s:6:"英國";}s:2:"GD";a:1:{i:0;s:12:"格瑞ç´é”";}s:2:"GE";a:1:{i:0;s:18:"喬治亞共和國";}s:2:"GF";a:1:{i:0;s:15:"法屬圭亞那";}s:2:"GH";a:1:{i:0;s:6:"迦ç´";}s:2:"GI";a:1:{i:0;s:12:"直布羅陀";}s:2:"GL";a:1:{i:0;s:9:"格陵蘭";}s:2:"GM";a:1:{i:0;s:9:"甘比亞";}s:2:"GN";a:1:{i:0;s:9:"幾內亞";}s:2:"GP";a:1:{i:0;s:12:"哥德普洛";}s:2:"GQ";a:1:{i:0;s:15:"赤é“幾內亞";}s:2:"GR";a:1:{i:0;s:6:"希臘";}s:2:"GS";a:1:{i:0;s:33:"å—喬治亞與å—三明治群島";}s:2:"GT";a:1:{i:0;s:12:"瓜地馬拉";}s:2:"GU";a:1:{i:0;s:6:"關島";}s:2:"GW";a:1:{i:0;s:15:"幾內亞比索";}s:2:"GY";a:1:{i:0;s:9:"蓋亞ç´";}s:2:"HK";a:1:{i:0;s:42:"中è¯äººæ°‘共和國香港特別行政å€";}s:2:"HM";a:1:{i:0;s:27:"赫德與麥克當諾群島";}s:2:"HN";a:1:{i:0;s:12:"å®éƒ½æ‹‰æ–¯";}s:2:"HR";a:1:{i:0;s:15:"克羅埃西亞";}s:2:"ID";a:1:{i:0;s:6:"å°å°¼";}s:2:"IE";a:1:{i:0;s:9:"愛爾蘭";}s:2:"IO";a:1:{i:0;s:21:"英屬å°åº¦æ´‹é ˜åœŸ";}s:2:"IS";a:1:{i:0;s:6:"冰島";}s:2:"IT";a:1:{i:0;s:9:"義大利";}s:2:"JM";a:1:{i:0;s:9:"牙買加";}s:2:"JO";a:1:{i:0;s:6:"ç´„æ—¦";}s:2:"KE";a:1:{i:0;s:6:"肯亞";}s:2:"KG";a:1:{i:0;s:12:"å‰çˆ¾å‰æ–¯";}s:2:"KH";a:1:{i:0;s:6:"高棉";}s:2:"KI";a:1:{i:0;s:12:"å‰é‡Œå·´æ–¯";}s:2:"KM";a:1:{i:0;s:15:"科摩羅群島";}s:2:"KN";a:1:{i:0;s:30:"è–克里斯多ç¦åŠå°¼ç¶­æ–¯";}s:2:"KP";a:1:{i:0;s:6:"北韓";}s:2:"KR";a:1:{i:0;s:6:"å—韓";}s:2:"KY";a:1:{i:0;s:12:"開曼群島";}s:2:"KZ";a:1:{i:0;s:9:"哈薩克";}s:2:"LA";a:1:{i:0;s:6:"寮國";}s:2:"LC";a:1:{i:0;s:12:"è–露西亞";}s:2:"LI";a:1:{i:0;s:15:"列支敦斯登";}s:2:"LK";a:1:{i:0;s:12:"斯里蘭å¡";}s:2:"LR";a:1:{i:0;s:12:"賴比瑞亞";}s:2:"LS";a:1:{i:0;s:9:"賴索扥";}s:2:"LU";a:1:{i:0;s:9:"盧森堡";
}s:2:"LV";a:1:{i:0;s:12:"拉脫維亞";}s:2:"LY";a:1:{i:0;s:9:"利比亞";}s:2:"MC";a:1:{i:0;s:9:"æ‘©ç´å“¥";}s:2:"MD";a:1:{i:0;s:12:"摩爾多瓦";}s:2:"MG";a:1:{i:0;s:15:"馬é”加斯加";}s:2:"MH";a:1:{i:0;s:15:"馬紹爾群島";}s:2:"MK";a:1:{i:0;s:9:"馬其頓";}s:2:"ML";a:1:{i:0;s:6:"馬利";}s:2:"MM";a:1:{i:0;s:6:"緬甸";}s:2:"MO";a:1:{i:0;s:42:"中è¯äººæ°‘共和國澳門特別行政å€";}s:2:"MP";a:1:{i:0;s:15:"北馬里安ç´";}s:2:"MQ";a:1:{i:0;s:15:"馬ä¸å°¼å…‹å³¶";}s:2:"MR";a:1:{i:0;s:15:"茅利塔尼亞";}s:2:"MS";a:1:{i:0;s:18:"蒙特色拉特島";}s:2:"MT";a:1:{i:0;s:9:"馬爾他";}s:2:"MU";a:1:{i:0;s:12:"模里西斯";}s:2:"MV";a:1:{i:0;s:12:"馬爾地夫";}s:2:"MW";a:1:{i:0;s:9:"馬拉å¨";}s:2:"MY";a:1:{i:0;s:12:"馬來西亞";}s:2:"MZ";a:1:{i:0;s:12:"莫三比克";}s:2:"NA";a:1:{i:0;s:12:"ç´ç±³æ¯”亞";}s:2:"NC";a:1:{i:0;s:24:"新喀里多尼亞群島";}s:2:"NE";a:1:{i:0;s:6:"尼日";}s:2:"NF";a:1:{i:0;s:12:"諾ç¦å…‹å³¶";}s:2:"NG";a:1:{i:0;s:12:"奈åŠåˆ©äºž";}s:2:"NL";a:1:{i:0;s:6:"è·è˜­";}s:2:"NP";a:1:{i:0;s:9:"尼泊爾";}s:2:"NR";a:1:{i:0;s:6:"諾魯";}s:2:"NU";a:1:{i:0;s:9:"ç´å¨å³¶";}s:2:"NZ";a:1:{i:0;s:9:"ç´è¥¿è˜­";}s:2:"OM";a:1:{i:0;s:12:"阿曼王國";}s:2:"PA";a:1:{i:0;s:9:"巴拿馬";}s:2:"PE";a:1:{i:0;s:6:"秘魯";}s:2:"PF";a:1:{i:0;s:21:"法屬玻里尼西亞";}s:2:"PG";a:1:{i:0;s:21:"巴布亞ç´å¹¾å…§äºž";}s:2:"PH";a:1:{i:0;s:9:"è²å¾‹è³“";}s:2:"PL";a:1:{i:0;s:6:"波蘭";}s:2:"PM";a:1:{i:0;s:21:"è–彼德與密啟崙";}s:2:"PN";a:1:{i:0;s:9:"皮特康";}s:2:"PR";a:1:{i:0;s:12:"玻多黎克";}s:2:"PS";a:1:{i:0;s:12:"å·´å‹’æ–¯å¦";}s:2:"PW";a:1:{i:0;s:6:"帛ç‰";}s:2:"QA";a:1:{i:0;s:6:"å¡é”";}s:2:"RE";a:1:{i:0;s:9:"留尼旺";}s:2:"RO";a:1:{i:0;s:12:"羅馬尼亞";}s:2:"RU";a:1:{i:0;s:9:"ä¿„ç¾…æ–¯";}s:2:"RW";a:1:{i:0;s:9:"盧安é”";}s:2:"SA";a:1:{i:0;s:18:"æ²™çƒåœ°é˜¿æ‹‰ä¼¯";}s:2:"SB";a:1:{i:0;s:15:"索羅門群島";}s:2:"SC";a:1:{i:0;s:9:"塞席爾";}s:2:"SD";a:1:{i:0;s:6:"蘇丹";}s:2:"SH";a:1:{i:0;s:15:"è–赫勒拿島";}s:2:"SI";a:1:{i:0;s:15:"斯洛維尼亞";}s:2:"
SJ";a:1:{i:0;s:24:"冷岸åŠå¤®éº¥æ©ç¾¤å³¶";}s:2:"SL";a:1:{i:0;s:9:"ç…å­å±±";}s:2:"SM";a:1:{i:0;s:12:"è–馬利諾";}s:2:"SN";a:1:{i:0;s:12:"塞內加爾";}s:2:"SO";a:1:{i:0;s:12:"索馬利亞";}s:2:"SP";a:1:{i:0;s:12:"塞爾維亞";}s:2:"SR";a:1:{i:0;s:9:"蘇利å—";}s:2:"ST";a:1:{i:0;s:24:"è–多美åŠæ™®æž—西比";}s:2:"SV";a:1:{i:0;s:12:"薩爾瓦多";}s:2:"SY";a:1:{i:0;s:9:"敘利亞";}s:2:"SZ";a:1:{i:0;s:12:"å²ç“¦æ¿Ÿè˜­";}s:2:"TC";a:1:{i:0;s:27:"土克斯åŠé–‹ç§‘斯群島";}s:2:"TD";a:1:{i:0;s:6:"查德";}s:2:"TF";a:1:{i:0;s:15:"法國å—屬地";}s:2:"TG";a:1:{i:0;s:15:"多哥共和國";}s:2:"TH";a:1:{i:0;s:6:"泰國";}s:2:"TJ";a:1:{i:0;s:9:"å¡”å‰å…‹";}s:2:"TK";a:1:{i:0;s:15:"托克勞群島";}s:2:"TL";a:1:{i:0;s:9:"æ±å¸æ–‡";}s:2:"TM";a:1:{i:0;s:9:"土庫曼";}s:2:"TN";a:1:{i:0;s:12:"çªå°¼è¥¿äºž";}s:2:"TO";a:1:{i:0;s:6:"æ±åŠ ";}s:2:"TT";a:1:{i:0;s:21:"åƒé‡Œé”åŠæ‰˜å·´å“¥";}s:2:"TV";a:1:{i:0;s:9:"å瓦魯";}s:2:"TW";a:1:{i:0;s:6:"臺ç£";}s:2:"TZ";a:1:{i:0;s:12:"å¦å°šå°¼äºž";}s:2:"UA";a:1:{i:0;s:9:"çƒå…‹è˜­";}s:2:"UG";a:1:{i:0;s:9:"çƒå¹²é”";}s:2:"UM";a:1:{i:0;s:18:"美屬邊疆群島";}s:2:"US";a:1:{i:0;s:6:"美國";}s:2:"UY";a:1:{i:0;s:9:"çƒæ‹‰åœ­";}s:2:"UZ";a:1:{i:0;s:12:"çƒèŒ²åˆ¥å…‹";}s:2:"VA";a:1:{i:0;s:9:"梵å¸å²¡";}s:2:"VC";a:1:{i:0;s:24:"è–文森åŠæ ¼ç‘žé‚£ä¸";}s:2:"VE";a:1:{i:0;s:12:"委內瑞拉";}s:2:"VG";a:1:{i:0;s:21:"英屬維爾京群島";}s:2:"VI";a:1:{i:0;s:21:"美屬維爾京群島";}s:2:"VU";a:1:{i:0;s:9:"è¬é‚£æœ";}s:2:"WF";a:1:{i:0;s:27:"瓦利斯和ç¦æœç´ç¾¤å³¶";}s:2:"WS";a:1:{i:0;s:15:"薩摩亞群島";}s:2:"YE";a:1:{i:0;s:6:"葉門";}s:2:"YT";a:1:{i:0;s:9:"馬約特";}s:2:"ZM";a:1:{i:0;s:9:"尚比亞";}s:2:"ZW";a:1:{i:0;s:9:"辛巴å¨";}}s:10:"Currencies";a:366:{s:3:"ADD";a:2:{i:0;s:3:"ADD";i:1;s:18:"安é“爾第ç´çˆ¾";}s:3:"ADP";a:2:{i:0;s:3:"ADP";i:1;s:18:"安é“爾陪士特";}s:3:"AED";a:2:{i:0;s:3:"AED";i:1;s:33:"阿拉伯è¯åˆå¤§å…¬åœ‹è¿ªçˆ¾æ±—";}s:3:"AIF";a:2:{i:0;s:3:"AIF";i:1;s:24:"阿法爾和伊薩法郎";}s:3:"ALK";a:2:{i:0;s:3:"ALK";i:1;s:33:"é˜
¿çˆ¾å·´å°¼äºžåˆ—å…‹ (1946-1961)";}s:3:"ALL";a:2:{i:0;s:3:"ALL";i:1;s:21:"阿爾巴尼亞列克";}s:3:"ALV";a:2:{i:0;s:3:"ALV";i:1;s:24:"阿爾巴尼亞列克幣";}s:3:"ALX";a:2:{i:0;s:3:"ALX";i:1;s:27:"阿爾巴尼亞元外匯券";}s:3:"AMD";a:2:{i:0;s:3:"AMD";i:1;s:21:"亞美尼亞德拉姆";}s:3:"ANG";a:2:{i:0;s:3:"ANG";i:1;s:20:"è·è˜­ 安梯蘭 盾";}s:3:"AOA";a:2:{i:0;s:3:"AOA";i:1;s:15:"安哥拉寬扎";}s:3:"AOK";a:2:{i:0;s:3:"AOK";i:1;s:26:"安哥拉寬扎(1977-1990)";}s:3:"AON";a:2:{i:0;s:3:"AON";i:1;s:30:"安哥拉新寬扎 (1990-2000)";}s:3:"AOR";a:2:{i:0;s:3:"AOR";i:1;s:41:"安哥拉新寬扎 Reajustado (1995-1999)";}s:3:"AOS";a:2:{i:0;s:3:"AOS";i:1;s:21:"安哥拉埃斯庫多";}s:3:"ARA";a:2:{i:0;s:3:"ARA";i:1;s:24:"阿根廷奧斯特ç´çˆ¾";}s:3:"ARM";a:2:{i:0;s:3:"ARM";i:1;s:31:"阿根廷披索 Moneda Nacional";}s:3:"ARP";a:2:{i:0;s:3:"ARP";i:1;s:26:"阿根廷披索(1983-1985)";}s:3:"ARS";a:2:{i:0;s:3:"ARS";i:1;s:15:"阿根廷披索";}s:3:"ATS";a:2:{i:0;s:3:"ATS";i:1;s:15:"奧地利先令";}s:3:"AUD";a:2:{i:0;s:3:"AUD";i:1;s:6:"澳幣";}s:3:"AUP";a:2:{i:0;s:3:"AUP";i:1;s:15:"澳大利亞鎊";}s:3:"AWG";a:2:{i:0;s:3:"AWG";i:1;s:12:"阿魯巴盾";}s:3:"AZM";a:2:{i:0;s:3:"AZM";i:1;s:21:"阿塞拜彊馬特ç´";}s:3:"BAD";a:2:{i:0;s:3:"BAD";i:1;s:37:"波士尼亞-黑塞哥維那第ç´çˆ¾";}s:3:"BAM";a:2:{i:0;s:3:"BAM";i:1;s:43:"波士尼亞-黑塞哥維那å¯è½‰æ›é¦¬å…‹";}s:3:"BAN";a:2:{i:0;s:3:"BAN";i:1;s:40:"波士尼亞-黑塞哥維那新第ç´çˆ¾";}s:3:"BBD";a:2:{i:0;s:3:"BBD";i:1;s:12:"å·´è²å¤šå…ƒ";}s:3:"BDT";a:2:{i:0;s:3:"BDT";i:1;s:15:"孟加拉塔å¡";}s:3:"BEC";a:2:{i:0;s:3:"BEC";i:1;s:31:"比利時法郎 (å¯è½‰æ›ï¼‰";}s:3:"BEF";a:2:{i:0;s:3:"BEF";i:1;s:15:"比利時法郎";}s:3:"BEL";a:2:{i:0;s:3:"BEL";i:1;s:28:"比利時法郎 (金èžï¼‰";}s:3:"BGL";a:2:{i:0;s:3:"BGL";i:1;s:21:"ä¿åŠ åˆ©äºžç¡¬åˆ—å¼—";}s:3:"BGM";a:2:{i:0;s:3:"BGM";i:1;s:31:"ä¿åŠ åˆ©äºž 社會主義列弗";}s:3:"BGN";a:2:{i:0;s:3:"BGN";i:1;s:21:"ä¿åŠ åˆ©äºžæ–°åˆ—å¼—";}s:3:"BGO";a:2:{i:0;s:3:"BGO";i:1;s:30:"ä¿åŠ åˆ©äº
žåˆ—å¼— (1879-1952)";}s:3:"BGX";a:2:{i:0;s:3:"BGX";i:1;s:27:"ä¿åŠ åˆ©äºžåˆ—弗外匯券";}s:3:"BHD";a:2:{i:0;s:3:"BHD";i:1;s:15:"巴林第ç´çˆ¾";}s:3:"BIF";a:2:{i:0;s:3:"BIF";i:1;s:15:"蒲隆地法郎";}s:3:"BMD";a:2:{i:0;s:3:"BMD";i:1;s:12:"百慕é”å¹£";}s:3:"BMP";a:2:{i:0;s:3:"BMP";i:1;s:12:"百慕é”鎊";}s:3:"BND";a:2:{i:0;s:3:"BND";i:1;s:9:"汶èŠå…ƒ";}s:3:"BOB";a:2:{i:0;s:3:"BOB";i:1;s:24:"玻利維亞貨幣單ä½";}s:3:"BOL";a:2:{i:0;s:3:"BOL";i:1;s:39:"çŽ»åˆ©ç¶­äºžèˆŠè²¨å¹£å–®ä½ (1863-1962)";}s:3:"BOP";a:2:{i:0;s:3:"BOP";i:1;s:18:"玻利維亞披索";}s:3:"BOV";a:2:{i:0;s:3:"BOV";i:1;s:19:"玻利維亞 幕多";}s:3:"BRB";a:2:{i:0;s:3:"BRB";i:1;s:37:"巴西克魯薩多 農瓦 (1967-1986)";}s:3:"BRC";a:2:{i:0;s:3:"BRC";i:1;s:30:"巴西克魯賽羅 (1986-1989)";}s:3:"BRE";a:2:{i:0;s:3:"BRE";i:1;s:30:"巴西克魯賽羅 (1990-1993)";}s:3:"BRL";a:2:{i:0;s:3:"BRL";i:1;s:12:"巴西里拉";}s:3:"BRN";a:2:{i:0;s:3:"BRN";i:1;s:26:"巴西 å…‹å¦‚çˆ¾é” è¾²ç“¦";}s:3:"BRR";a:2:{i:0;s:3:"BRR";i:1;s:18:"巴西克魯賽羅";}s:3:"BRZ";a:2:{i:0;s:3:"BRZ";i:1;s:30:"巴西克魯賽羅 (1942-1967)";}s:3:"BSD";a:2:{i:0;s:3:"BSD";i:1;s:12:"巴哈馬元";}s:3:"BSP";a:2:{i:0;s:3:"BSP";i:1;s:12:"巴哈馬鎊";}s:3:"BTR";a:2:{i:0;s:3:"BTR";i:1;s:12:"ä¸ä¸¹ç›§å¸ƒ";}s:3:"BUK";a:2:{i:0;s:3:"BUK";i:1;s:9:"緬甸元";}s:3:"BUR";a:2:{i:0;s:3:"BUR";i:1;s:12:"緬甸盧布";}s:3:"BWP";a:2:{i:0;s:3:"BWP";i:1;s:18:"波札那 - 普拉";}s:3:"BYB";a:2:{i:0;s:3:"BYB";i:1;s:33:"白俄羅斯新盧布 (1994-1999)";}s:3:"BYL";a:2:{i:0;s:3:"BYL";i:1;s:30:"白俄羅斯盧布 (1992-1994)";}s:3:"BYR";a:2:{i:0;s:3:"BYR";i:1;s:18:"白俄羅斯盧布";}s:3:"BZD";a:2:{i:0;s:3:"BZD";i:1;s:12:"伯利茲元";}s:3:"BZH";a:2:{i:0;s:3:"BZH";i:1;s:25:"英國的洪都拉斯元r";}s:3:"CAD";a:2:{i:0;s:3:"CAD";i:1;s:6:"加幣";}s:3:"CDF";a:2:{i:0;s:3:"CDF";i:1;s:12:"剛果法郎";}s:3:"CDG";a:2:{i:0;s:3:"CDG";i:1;s:21:"剛果共和國法郎";}s:3:"CDL";a:2:{i:0;s:3:"CDL";i:1;s:15:"剛果扎伊爾";}s:3:"CFF";a:2:{i:0;s:3:"CFF";i:1;s:27:"中éžå…±å’Œåœ‹è¥¿éžæ³•éƒ
Ž";}s:3:"CKD";a:2:{i:0;s:3:"CKD";i:1;s:15:"庫克群島元";}s:3:"CLC";a:2:{i:0;s:3:"CLC";i:1;s:13:"智利 康導";}s:3:"CLE";a:2:{i:0;s:3:"CLE";i:1;s:18:"智利埃斯庫多";}s:3:"CLF";a:2:{i:0;s:3:"CLF";i:1;s:21:"å¡æž—æ²¹é”佛曼跎";}s:3:"CLP";a:2:{i:0;s:3:"CLP";i:1;s:12:"智利披索";}s:3:"CMF";a:2:{i:0;s:3:"CMF";i:1;s:21:"å¡éº¥éš†è¥¿éžæ³•éƒŽ";}s:3:"CNP";a:2:{i:0;s:3:"CNP";i:1;s:18:"中國人民幣元";}s:3:"CNX";a:2:{i:0;s:3:"CNX";i:1;s:21:"中國美元外匯券";}s:3:"CNY";a:2:{i:0;s:3:"CNY";i:1;s:9:"人民幣";}s:3:"COB";a:2:{i:0;s:3:"COB";i:1;s:21:"哥倫比亞披索鈔";}s:3:"COF";a:2:{i:0;s:3:"COF";i:1;s:18:"剛果西éžæ³•éƒŽ";}s:3:"COP";a:2:{i:0;s:3:"COP";i:1;s:18:"哥倫比亞披索";}s:3:"CRC";a:2:{i:0;s:3:"CRC";i:1;s:21:"哥斯大黎加科郎";}s:3:"CSC";a:2:{i:0;s:3:"CSC";i:1;s:12:"æ·å…‹å…‹æœ—";}s:3:"CSK";a:2:{i:0;s:3:"CSK";i:1;s:27:"æ·å…‹æ–¯æ´›ä¼å…‹ç¡¬å…‹æœ—";}s:3:"CUP";a:2:{i:0;s:3:"CUP";i:1;s:12:"å¤å·´æŠ«ç´¢";}s:3:"CUX";a:2:{i:0;s:3:"CUX";i:1;s:18:"å¤å·´äººå¤–匯券";}s:3:"CVE";a:2:{i:0;s:3:"CVE";i:1;s:21:"維德角埃斯庫多";}s:3:"CWG";a:2:{i:0;s:3:"CWG";i:1;s:13:"庫拉克 盾";}s:3:"CYP";a:2:{i:0;s:3:"CYP";i:1;s:15:"賽浦路斯鎊";}s:3:"CZK";a:2:{i:0;s:3:"CZK";i:1;s:12:"æ·å…‹å…‹æœ—";}s:3:"DDM";a:2:{i:0;s:3:"DDM";i:1;s:18:"æ±å¾·æ±å¾·é¦¬å…‹";}s:3:"DEM";a:2:{i:0;s:3:"DEM";i:1;s:12:"德國馬克";}s:3:"DES";a:2:{i:0;s:3:"DES";i:1;s:25:"德國 蘇馬克Sperrmark";}s:3:"DJF";a:2:{i:0;s:3:"DJF";i:1;s:15:"å‰å¸ƒåœ°æ³•éƒŽ";}s:3:"DKK";a:2:{i:0;s:3:"DKK";i:1;s:15:"丹麥克羅ç´";}s:3:"DOP";a:2:{i:0;s:3:"DOP";i:1;s:18:"多明尼加披索";}s:3:"DZD";a:2:{i:0;s:3:"DZD";i:1;s:24:"阿爾åŠåˆ©äºžç¬¬ç´çˆ¾";}s:3:"DZF";a:2:{i:0;s:3:"DZF";i:1;s:24:"阿爾åŠåˆ©äºžæ–°æ³•éƒŽ";}s:3:"DZG";a:2:{i:0;s:3:"DZG";i:1;s:30:"阿爾åŠåˆ©äºžæ³•éƒŽ Germinal";}s:3:"ECS";a:2:{i:0;s:3:"ECS";i:1;s:18:"厄瓜多蘇克雷";}s:3:"ECV";a:2:{i:0;s:3:"ECV";i:1;s:39:"厄瓜多爾由里é”ç“¦åº·æ–¯å¦ (UVC)";}s:3:"EEK";a:2:{i:0;s:3:"EEK";i:1;s:18:"愛沙尼亞克朗";}s:3:"EGP";a:2:{i:0;s:3:"EGP";i:1;s:9:"埃åŠéŽŠ
";}s:3:"ERN";a:2:{i:0;s:3:"ERN";i:1;s:24:"厄立特里亞ç´å…‹æ³•";}s:3:"ESP";a:2:{i:0;s:3:"ESP";i:1;s:18:"西ç­ç‰™é™ªå£«ç‰¹";}s:3:"ETB";a:2:{i:0;s:3:"ETB";i:1;s:18:"衣索比亞比爾";}s:3:"ETD";a:2:{i:0;s:3:"ETD";i:1;s:18:"埃賽俄比亞元";}s:3:"EUR";a:2:{i:0;s:3:"EUR";i:1;s:6:"æ­å…ƒ";}s:3:"FIM";a:2:{i:0;s:3:"FIM";i:1;s:12:"芬蘭馬克";}s:3:"FIN";a:2:{i:0;s:3:"FIN";i:1;s:24:"芬蘭馬克 (1860-1962)";}s:3:"FJD";a:2:{i:0;s:3:"FJD";i:1;s:9:"æ–æ¿Ÿå…ƒ";}s:3:"FJP";a:2:{i:0;s:3:"FJP";i:1;s:9:"æ–濟鎊";}s:3:"FKP";a:2:{i:0;s:3:"FKP";i:1;s:18:"ç¦å…‹è˜­ç¾¤å³¶éŽŠ";}s:3:"FOK";a:2:{i:0;s:3:"FOK";i:1;s:15:"法羅島克朗";}s:3:"FRF";a:2:{i:0;s:3:"FRF";i:1;s:12:"法國法郎";}s:3:"FRG";a:2:{i:0;s:3:"FRG";i:1;s:38:"法國法郎 æ·ç±³é‚£/é¾åŠ èŠæ³•éƒŽ";}s:3:"GAF";a:2:{i:0;s:3:"GAF";i:1;s:18:"加蓬西éžæ³•éƒŽ";}s:3:"GBP";a:2:{i:0;s:3:"GBP";i:1;s:6:"英鎊";}s:3:"GEK";a:2:{i:0;s:3:"GEK";i:1;s:20:"喬治 åº«æ— æ‹‰é‡Œ";}s:3:"GEL";a:2:{i:0;s:3:"GEL";i:1;s:12:"喬治拉里";}s:3:"GHC";a:2:{i:0;s:3:"GHC";i:1;s:12:"迦ç´ä»™è”•";}s:3:"GHO";a:2:{i:0;s:3:"GHO";i:1;s:15:"迦ç´èˆŠä»™è”•";}s:3:"GHP";a:2:{i:0;s:3:"GHP";i:1;s:9:"迦ç´éŽŠ";}s:3:"GHR";a:2:{i:0;s:3:"GHR";i:1;s:30:"迦ç´é‡æ–°ä¼°ä»·å¾Œçš„仙蔕";}s:3:"GIP";a:2:{i:0;s:3:"GIP";i:1;s:15:"直布羅陀鎊";}s:3:"GLK";a:2:{i:0;s:3:"GLK";i:1;s:18:"格陵蘭克羅鈉";}s:3:"GMD";a:2:{i:0;s:3:"GMD";i:1;s:18:"甘比亞é”拉西";}s:3:"GMP";a:2:{i:0;s:3:"GMP";i:1;s:12:"岡比亞鎊";}s:3:"GNF";a:2:{i:0;s:3:"GNF";i:1;s:15:"幾內亞法郎";}s:3:"GNI";a:2:{i:0;s:3:"GNI";i:1;s:27:"幾內亞法郎 (1960-1972)";}s:3:"GNS";a:2:{i:0;s:3:"GNS";i:1;s:15:"幾內亞西里";}s:3:"GPF";a:2:{i:0;s:3:"GPF";i:1;s:21:"瓜德羅普島法郎";}s:3:"GQE";a:2:{i:0;s:3:"GQE";i:1;s:24:"赤é“幾內亞埃奎勒";}s:3:"GQF";a:2:{i:0;s:3:"GQF";i:1;s:24:"赤é“幾內亞佛朗哥";}s:3:"GQP";a:2:{i:0;s:3:"GQP";i:1;s:24:"赤é“幾內亞比塞塔";}s:3:"GRD";a:2:{i:0;s:3:"GRD";i:1;s:18:"希臘德拉克馬";}s:3:"GRN";a:2:{i:0;s:3:"GRN";i:1;s:21:"希臘新德拉克馬";}s:3:"GTQ";a:2:{i:0;s:3:"GTQ
";i:1;s:21:"瓜地馬拉格查爾";}s:3:"GUF";a:2:{i:0;s:3:"GUF";i:1;s:30:"法屬圭亞那法郎圭亞那";}s:3:"GWE";a:2:{i:0;s:3:"GWE";i:1;s:27:"葡屬幾內亞埃斯庫多";}s:3:"GWM";a:2:{i:0;s:3:"GWM";i:1;s:27:"葡屬幾內亞米爾里斯";}s:3:"GWP";a:2:{i:0;s:3:"GWP";i:1;s:21:"幾內亞披索披索";}s:3:"GYD";a:2:{i:0;s:3:"GYD";i:1;s:12:"圭亞那元";}s:3:"HNL";a:2:{i:0;s:3:"HNL";i:1;s:21:"洪都拉斯倫皮拉";}s:3:"HRD";a:2:{i:0;s:3:"HRD";i:1;s:21:"克羅地亞第ç´çˆ¾";}s:3:"HRK";a:2:{i:0;s:3:"HRK";i:1;s:18:"克羅地亞庫ç´";}s:3:"HUF";a:2:{i:0;s:3:"HUF";i:1;s:18:"匈牙利 - ç¦æž—";}s:3:"IBP";a:2:{i:0;s:3:"IBP";i:1;s:15:"北愛爾蘭鎊";}s:3:"IDG";a:2:{i:0;s:3:"IDG";i:1;s:24:"å°åº¦å°¼è¥¿äºžå°¼å¯ç›¾";}s:3:"IDJ";a:2:{i:0;s:3:"IDJ";i:1;s:27:"å°åº¦å°¼è¥¿äºžçˆªå“‡ç›§å¸ƒ";}s:3:"IDN";a:2:{i:0;s:3:"IDN";i:1;s:24:"å°åº¦å°¼è¥¿äºžæ–°ç›§å¸ƒ";}s:3:"IDR";a:2:{i:0;s:3:"IDR";i:1;s:15:"å°å°¼ - 盧布";}s:3:"IEP";a:2:{i:0;s:3:"IEP";i:1;s:12:"愛爾蘭鎊";}s:3:"ILL";a:2:{i:0;s:3:"ILL";i:1;s:18:"以色列è¬å®¢çˆ¾";}s:3:"ILP";a:2:{i:0;s:3:"ILP";i:1;s:12:"以色列鎊";}s:3:"ILS";a:2:{i:0;s:3:"ILS";i:1;s:21:"以色列新è¬å…‹çˆ¾";}s:3:"IMP";a:2:{i:0;s:3:"IMP";i:1;s:15:"曼城島英鎊";}s:3:"INR";a:2:{i:0;s:18:"=0#Rs.|1#Re.|1<Rs.";i:1;s:12:"å°åº¦ç›§å¸ƒ";}s:3:"IQD";a:2:{i:0;s:3:"IQD";i:1;s:18:"伊拉克第ç´çˆ¾";}s:3:"IRR";a:2:{i:0;s:3:"IRR";i:1;s:15:"伊朗里亞爾";}s:3:"ISK";a:2:{i:0;s:3:"ISK";i:1;s:12:"冰島克朗";}s:3:"ITL";a:2:{i:0;s:3:"ITL";i:1;s:15:"義大利里拉";}s:3:"JEP";a:2:{i:0;s:3:"JEP";i:1;s:9:"澤西鎊";}s:3:"JMD";a:2:{i:0;s:3:"JMD";i:1;s:12:"牙買加元";}s:3:"JMP";a:2:{i:0;s:3:"JMP";i:1;s:12:"牙買加鎊";}s:3:"JOD";a:2:{i:0;s:3:"JOD";i:1;s:15:"約旦第ç´çˆ¾";}s:3:"JPY";a:2:{i:0;s:4:"JPÂ¥";i:1;s:6:"日圓";}s:3:"KES";a:2:{i:0;s:3:"KES";i:1;s:15:"肯尼亞先令";}s:3:"KGS";a:2:{i:0;s:3:"KGS";i:1;s:18:"å‰çˆ¾å‰æ–¯ç´¢é¦¬";}s:3:"KHO";a:2:{i:0;s:3:"KHO";i:1;s:18:"柬埔寨舊瑞爾";}s:3:"KHR";a:2:{i:0;s:3:"KHR";i:1;s:15:"柬埔寨瑞爾";}s:3:"KMF";a:2:{i:0;s:3:"KMF";i:1;s:15:"ç§
‘摩羅法郎";}s:3:"KPP";a:2:{i:0;s:3:"KPP";i:1;s:18:"北æœé®®äººæ°‘å¹£";}s:3:"KPW";a:2:{i:0;s:3:"KPW";i:1;s:12:"北æœé®®å¹£";}s:3:"KRH";a:2:{i:0;s:3:"KRH";i:1;s:13:"韓國 哈瓦";}s:3:"KRO";a:2:{i:0;s:3:"KRO";i:1;s:12:"å—韓舊幣";}s:3:"KRW";a:2:{i:0;s:3:"KRW";i:1;s:9:"韓國圜";}s:3:"KWD";a:2:{i:0;s:3:"KWD";i:1;s:18:"科å¨ç‰¹ç¬¬ç´çˆ¾";}s:3:"KYD";a:2:{i:0;s:3:"KYD";i:1;s:18:"開曼群島美元";}s:3:"KZR";a:2:{i:0;s:3:"KZR";i:1;s:21:"å¡æ‰Žå…‹æ–¯å¦ç›§å¸ƒ";}s:3:"KZT";a:2:{i:0;s:3:"KZT";i:1;s:21:"å¡æ‰Žå…‹æ–¯å¦å¦å‰";}s:3:"LAK";a:2:{i:0;s:3:"LAK";i:1;s:13:"è€æ’¾ é–‹æ™®";}s:3:"LBP";a:2:{i:0;s:3:"LBP";i:1;s:12:"黎巴嫩鎊";}s:3:"LIF";a:2:{i:0;s:3:"LIF";i:1;s:21:"列支敦斯登法郎";}s:3:"LKR";a:2:{i:0;s:3:"LKR";i:1;s:18:"斯里蘭å¡ç›§å¸ƒ";}s:3:"LNR";a:2:{i:0;s:3:"LNR";i:1;s:12:"錫蘭盧布";}s:3:"LRD";a:2:{i:0;s:3:"LRD";i:1;s:15:"賴比瑞亞元";}s:3:"LSL";a:2:{i:0;s:3:"LSL";i:1;s:15:"賴索托羅蒂";}s:3:"LTL";a:2:{i:0;s:3:"LTL";i:1;s:15:"立陶宛里塔";}s:3:"LTT";a:2:{i:0;s:3:"LTT";i:1;s:15:"立陶宛特羅";}s:3:"LUF";a:2:{i:0;s:3:"LUF";i:1;s:15:"盧森堡法郎";}s:3:"LVL";a:2:{i:0;s:3:"LVL";i:1;s:24:"拉脫維亞拉特銀幣";}s:3:"LVR";a:2:{i:0;s:3:"LVR";i:1;s:18:"拉脫維亞盧布";}s:3:"LYB";a:2:{i:0;s:3:"LYB";i:1;s:36:"利比亞英國的è»äº‹ç•¶å±€é‡Œæ‹‰";}s:3:"LYD";a:2:{i:0;s:3:"LYD";i:1;s:18:"利比亞第ç´çˆ¾";}s:3:"LYP";a:2:{i:0;s:3:"LYP";i:1;s:12:"利比亞鎊";}s:3:"MCF";a:2:{i:0;s:3:"MCF";i:1;s:18:"æ‘©ç´å“¥æ–°æ³•éƒŽ";}s:3:"MCG";a:2:{i:0;s:3:"MCG";i:1;s:25:"æ‘©ç´å“¥æ³•éƒŽ 傑米那";}s:3:"MDC";a:2:{i:0;s:3:"MDC";i:1;s:21:"æ‘©æœé›²åˆ—伊庫æ—";}s:3:"MDL";a:2:{i:0;s:3:"MDL";i:1;s:15:"æ‘©æœé›²åˆ—伊";}s:3:"MDR";a:2:{i:0;s:3:"MDR";i:1;s:21:"æ‘©æœé›²ç›§å¸ƒåº«æ—";}s:3:"MGA";a:2:{i:0;s:3:"MGA";i:1;s:24:"馬é”加斯加艾瑞爾";}s:3:"MGF";a:2:{i:0;s:3:"MGF";i:1;s:21:"馬é”加斯加法郎";}s:3:"MHD";a:2:{i:0;s:3:"MHD";i:1;s:21:"馬紹爾群島美元";}s:3:"MKD";a:2:{i:0;s:3:"MKD";i:1;s:18:"馬其頓第ç´çˆ¾";}s:3:"MKN";a:2:{i:0;s:3:"MKN";i:1;s:29:"馬其頓第ç´çˆ¾(1992
-1993)";}s:3:"MLF";a:2:{i:0;s:3:"MLF";i:1;s:12:"馬里法郎";}s:3:"MMK";a:2:{i:0;s:3:"MMK";i:1;s:9:"緬甸元";}s:3:"MMX";a:2:{i:0;s:3:"MMX";i:1;s:21:"緬甸美元外匯券";}s:3:"MNT";a:2:{i:0;s:3:"MNT";i:1;s:18:"è’™å¤åœ–格里克";}s:3:"MOP";a:2:{i:0;s:3:"MOP";i:1;s:9:"澳門元";}s:3:"MQF";a:2:{i:0;s:3:"MQF";i:1;s:21:"馬æ尼克島法郎";}s:3:"MRO";a:2:{i:0;s:3:"MRO";i:1;s:24:"茅利塔尼亞çƒå‰äºž";}s:3:"MTL";a:2:{i:0;s:3:"MTL";i:1;s:15:"馬爾他里拉";}s:3:"MTP";a:2:{i:0;s:3:"MTP";i:1;s:12:"馬爾他鎊";}s:3:"MUR";a:2:{i:0;s:3:"MUR";i:1;s:18:"模里西斯盧布";}s:3:"MVP";a:2:{i:0;s:3:"MVP";i:1;s:18:"馬爾地夫盧布";}s:3:"MVR";a:2:{i:0;s:3:"MVR";i:1;s:27:"馬爾地夫海島盧éžäºž";}s:3:"MWK";a:2:{i:0;s:3:"MWK";i:1;s:18:"馬拉維克瓦查";}s:3:"MWP";a:2:{i:0;s:3:"MWP";i:1;s:12:"馬拉維鎊";}s:3:"MXN";a:2:{i:0;s:3:"MXN";i:1;s:18:"墨西哥 - 披索";}s:3:"MXP";a:2:{i:0;s:3:"MXP";i:1;s:30:"墨西哥銀披索 (1861-1992)";}s:3:"MXV";a:2:{i:0;s:3:"MXV";i:1;s:26:"墨西哥法律å轉(UDI)";}s:3:"MYR";a:2:{i:0;s:3:"MYR";i:1;s:24:"馬來西亞 - æž—å‰ç‰¹";}s:3:"MZE";a:2:{i:0;s:3:"MZE";i:1;s:24:"莫桑比克埃斯庫多";}s:3:"MZM";a:2:{i:0;s:3:"MZM";i:1;s:24:"莫三比克梅蒂å¡çˆ¾";}s:3:"NAD";a:2:{i:0;s:3:"NAD";i:1;s:15:"ç´ç±³æ¯”亞元";}s:3:"NCF";a:2:{i:0;s:3:"NCF";i:1;s:29:"赫布里底群島 CFP 法郎";}s:3:"NGN";a:2:{i:0;s:3:"NGN";i:1;s:18:"奈åŠåˆ©äºžå¥ˆæ‹‰";}s:3:"NGP";a:2:{i:0;s:3:"NGP";i:1;s:15:"奈åŠåˆ©äºžéŽŠ";}s:3:"NHF";a:2:{i:0;s:3:"NHF";i:1;s:32:"新赫布里底群島 CFP 法郎";}s:3:"NIG";a:2:{i:0;s:3:"NIG";i:1;s:27:"尼加拉瓜金金哥多è¯";}s:3:"NIO";a:2:{i:0;s:3:"NIO";i:1;s:25:"尼加拉瓜 金哥多è¯";}s:3:"NLG";a:2:{i:0;s:3:"NLG";i:1;s:9:"è·è˜­ç›¾";}s:3:"NOK";a:2:{i:0;s:3:"NOK";i:1;s:15:"挪å¨å…‹ç¾…ç´";}s:3:"NPR";a:2:{i:0;s:3:"NPR";i:1;s:15:"尼泊爾盧布";}s:3:"NZD";a:2:{i:0;s:3:"$NZ";i:1;s:12:"ç´è¥¿è˜­å¹£";}s:3:"NZP";a:2:{i:0;s:3:"NZP";i:1;s:12:"ç´è¥¿è˜­éŽŠ";}s:3:"OMR";a:2:{i:0;s:3:"OMR";i:1;s:12:"阿曼里奧";}s:3:"OMS";a:2:{i:0;s:3:"OMS";i:1;s:22:"é
˜¿æ›¼é‡Œäºžçˆ¾ä»™è”•i";}s:3:"PAB";a:2:{i:0;s:3:"PAB";i:1;s:18:"巴拿馬巴波亞";}s:3:"PDK";a:2:{i:0;s:3:"PDK";i:1;s:18:"車城盧布 Kupon";}s:3:"PDN";a:2:{i:0;s:3:"PDN";i:1;s:15:"車城新盧布";}s:3:"PDR";a:2:{i:0;s:3:"PDR";i:1;s:12:"車城盧布";}s:3:"PEI";a:2:{i:0;s:3:"PEI";i:1;s:12:"祕魯因蒂";}s:3:"PEN";a:2:{i:0;s:3:"PEN";i:1;s:18:"秘魯新太陽幣";}s:3:"PES";a:2:{i:0;s:3:"PES";i:1;s:15:"秘魯太陽幣";}s:3:"PGK";a:2:{i:0;s:3:"PGK";i:1;s:27:"巴布亞ç´å¹¾å…§äºžåŸºé‚£";}s:3:"PHP";a:2:{i:0;s:3:"PHP";i:1;s:15:"è²å¾‹è³“披索";}s:3:"PKR";a:2:{i:0;s:3:"PKR";i:1;s:18:"巴基斯å¦ç›§å¸ƒ";}s:3:"PLN";a:2:{i:0;s:3:"PLN";i:1;s:15:"波蘭茲羅æ";}s:3:"PLX";a:2:{i:0;s:3:"PLX";i:1;s:21:"波蘭美元外匯券";}s:3:"PLZ";a:2:{i:0;s:3:"PLZ";i:1;s:27:"波蘭茲羅æ (1950-1995)";}s:3:"PSP";a:2:{i:0;s:3:"PSP";i:1;s:15:"å·´å‹’æ–¯å¦éŽŠ";}s:3:"PTC";a:2:{i:0;s:3:"PTC";i:1;s:16:"è‘¡è„牙 康拖";}s:3:"PTE";a:2:{i:0;s:3:"PTE";i:1;s:21:"è‘¡è„牙埃斯庫多";}s:3:"PYG";a:2:{i:0;s:3:"PYG";i:1;s:18:"巴拉圭瓜拉尼";}s:3:"QAR";a:2:{i:0;s:3:"QAR";i:1;s:18:"å¡é”爾里亞爾";}s:3:"REF";a:2:{i:0;s:3:"REF";i:1;s:18:"留尼汪島法郎";}s:3:"ROL";a:2:{i:0;s:3:"ROL";i:1;s:18:"羅馬尼亞列伊";}s:3:"RON";a:2:{i:0;s:3:"RON";i:1;s:21:"羅馬尼亞新列伊";}s:3:"RUB";a:2:{i:0;s:3:"RUB";i:1;s:15:"俄羅斯盧布";}s:3:"RUR";a:2:{i:0;s:3:"RUR";i:1;s:27:"俄羅斯盧布 (1991-1998)";}s:3:"RWF";a:2:{i:0;s:3:"RWF";i:1;s:15:"盧安é”法郎";}s:3:"SAR";a:2:{i:0;s:3:"SRl";i:1;s:15:"æ²™çƒåœ°é‡Œé›…";}s:3:"SAS";a:2:{i:0;s:3:"SAS";i:1;s:21:"æ²™çƒåœ°å®—主里雅";}s:3:"SBD";a:2:{i:0;s:3:"SBD";i:1;s:18:"索羅門群島元";}s:3:"SCR";a:2:{i:0;s:3:"SCR";i:1;s:21:"塞舌爾群島盧布";}s:3:"SDD";a:2:{i:0;s:3:"SDD";i:1;s:15:"蘇丹第ç´çˆ¾";}s:3:"SDP";a:2:{i:0;s:3:"SDP";i:1;s:9:"蘇丹鎊";}s:3:"SEK";a:2:{i:0;s:3:"SEK";i:1;s:15:"瑞典克羅ç´";}s:3:"SGD";a:2:{i:0;s:3:"SGD";i:1;s:12:"新加å¡å¹£";}s:3:"SHP";a:2:{i:0;s:3:"SHP";i:1;s:16:"è–赫勒拿 鎊";}s:3:"SIB";a:2:{i:0;s:3:"SIB";i:1;s:26:"斯洛文尼亞 Tolar Bon
s";}s:3:"SIT";a:2:{i:0;s:3:"SIT";i:1;s:21:"斯洛維尼亞托勒";}s:3:"SKK";a:2:{i:0;s:3:"SKK";i:1;s:18:"斯洛ä¼å…‹å…‹æœ—";}s:3:"SLL";a:2:{i:0;s:3:"SLL";i:1;s:15:"ç…å­å±±åˆ©æ˜‚";}s:3:"SML";a:2:{i:0;s:3:"SML";i:1;s:18:"è–馬利諾里拉";}s:3:"SOS";a:2:{i:0;s:3:"SOS";i:1;s:18:"索馬利亞先令";}s:3:"SQS";a:2:{i:0;s:3:"SQS";i:1;s:18:"索馬里蘭先令";}s:3:"SRG";a:2:{i:0;s:3:"SRG";i:1;s:12:"蘇里å—盾";}s:3:"SSP";a:2:{i:0;s:3:"SSP";i:1;s:12:"蘇格蘭鎊";}s:3:"STD";a:2:{i:0;s:3:"STD";i:1;s:39:"è–多美島和普林西比島多布拉";}s:3:"STE";a:2:{i:0;s:3:"STE";i:1;s:42:"è–多美島和普林西比島埃斯庫多";}s:3:"SUN";a:2:{i:0;s:3:"SUN";i:1;s:15:"蘇è¯æ–°ç›§å¸ƒ";}s:3:"SUR";a:2:{i:0;s:3:"SUR";i:1;s:12:"蘇è¯ç›§å¸ƒ";}s:3:"SVC";a:2:{i:0;s:3:"SVC";i:1;s:25:"愛爾 薩爾瓦多科郎";}s:3:"SYP";a:2:{i:0;s:3:"SYP";i:1;s:12:"敘利亞鎊";}s:3:"SZL";a:2:{i:0;s:3:"SZL";i:1;s:19:"æ–¯å¨å£«è˜­ 里郎";}s:3:"TCC";a:2:{i:0;s:3:"TCC";i:1;s:27:"土耳其人和凱科斯冠";}s:3:"TDF";a:2:{i:0;s:3:"TDF";i:1;s:20:"ä¹å¾— è¥¿éž æ³•éƒŽ";}s:3:"THB";a:2:{i:0;s:3:"THB";i:1;s:6:"泰銖";}s:3:"TJR";a:2:{i:0;s:3:"TJR";i:1;s:21:"å¡”å‰å…‹æ–¯å¦ç›§å¸ƒ";}s:3:"TJS";a:2:{i:0;s:3:"TJS";i:1;s:25:"å¡”å‰å…‹æ–¯å¦ 索莫尼";}s:3:"TMM";a:2:{i:0;s:3:"TMM";i:1;s:18:"土庫曼馬ç´ç‰¹";}s:3:"TND";a:2:{i:0;s:3:"TND";i:1;s:21:"çªå°¼è¥¿äºžç¬¬ç´çˆ¾";}s:3:"TOP";a:2:{i:0;s:3:"TOP";i:1;s:12:"æ±åŠ æ½˜åŠ ";}s:3:"TOS";a:2:{i:0;s:3:"TOS";i:1;s:12:"湯加英鎊";}s:3:"TPE";a:2:{i:0;s:3:"TPE";i:1;s:19:"å¸æ±¶ 埃斯庫多";}s:3:"TPP";a:2:{i:0;s:3:"TPP";i:1;s:9:"å¸æ±¶å…ƒ";}s:3:"TTD";a:2:{i:0;s:3:"TTD";i:1;s:22:"åƒé‡Œé”åŠæ‰˜å·´å“¥r";}s:3:"TTO";a:2:{i:0;s:3:"TTO";i:1;s:31:"特立尼é”和多巴哥舊元r";}s:3:"TVD";a:2:{i:0;s:3:"TVD";i:1;s:15:"å瓦魯美元";}s:3:"TWD";a:2:{i:0;s:3:"NT$";i:1;s:9:"新臺幣";}s:3:"TZS";a:2:{i:0;s:3:"TZS";i:1;s:19:"å¦æ¡‘尼亞 先令";}s:3:"UAH";a:2:{i:0;s:3:"UAH";i:1;s:21:"çƒå…‹è˜­æ ¼é‡Œå¤«é‚£";}s:3:"UAK";a:2:{i:0;s:3:"UAK";i:1;s:25:"çƒå…‹è˜­ å¡æœ¬ç“¦é‚£èŒ²";}s:3:"UGS";a:2:{i:0;s:3:"UGS";i:1;
s:27:"çƒå¹²é”先令 (1966-1987)";}s:3:"UGX";a:2:{i:0;s:3:"UGX";i:1;s:15:"çƒå¹²é”先令";}s:3:"USN";a:2:{i:0;s:3:"USN";i:1;s:18:"美元 (第二天)";}s:3:"UYF";a:2:{i:0;s:3:"UYF";i:1;s:24:"çƒæ‹‰åœ­æŠ«ç´¢ç¦åŽ„特";}s:3:"UYP";a:2:{i:0;s:3:"UYP";i:1;s:27:"çƒæ‹‰åœ­æŠ«ç´¢ (1975-1993)";}s:3:"UYU";a:2:{i:0;s:3:"UYU";i:1;s:15:"çƒæ‹‰åœ­æŠ«ç´¢";}s:3:"UZC";a:2:{i:0;s:3:"UZC";i:1;s:32:"çƒèŒ²åˆ¥å…‹æ–¯å¦ 庫邦 索馬";}s:3:"UZS";a:2:{i:0;s:3:"UZS";i:1;s:25:"çƒèŒ²åˆ¥å…‹æ–¯å¦ 薩木";}s:3:"VAL";a:2:{i:0;s:3:"VAL";i:1;s:18:"梵蒂岡城里拉";}s:3:"VDD";a:2:{i:0;s:3:"VDD";i:1;s:31:"åŒ—è¶Šå— çš®é˜¿æ–¯ç‰¹è¶Šå—盾";}s:3:"VDN";a:2:{i:0;s:3:"VDN";i:1;s:15:"北越å—新盾";}s:3:"VDP";a:2:{i:0;s:3:"VDP";i:1;s:35:"åŒ—è¶Šå— å 皮阿斯特越å—盾";}s:3:"VEB";a:2:{i:0;s:3:"VEB";i:1;s:21:"委內瑞拉åšåˆ©ç“¦";}s:3:"VGD";a:2:{i:0;s:3:"VGD";i:1;s:24:"英屬維爾斯群島元";}s:3:"VNN";a:2:{i:0;s:3:"VNN";i:1;s:12:"越å—新盾";}s:3:"VNR";a:2:{i:0;s:3:"VNR";i:1;s:19:"越å—共和國 盾";}s:3:"VNS";a:2:{i:0;s:3:"VNS";i:1;s:15:"越å—國家盾";}s:3:"VUV";a:2:{i:0;s:3:"VUV";i:1;s:15:"è¬é‚£æœè¬æœ";}s:3:"WSP";a:2:{i:0;s:3:"WSP";i:1;s:15:"西薩摩亞鎊";}s:3:"WST";a:2:{i:0;s:3:"WST";i:1;s:18:"西薩摩亞塔拉";}s:3:"XAD";a:2:{i:0;s:3:"XAD";i:1;s:27:"亞洲第ç´çˆ¾æœƒè¨ˆå–®ä½";}s:3:"XAF";a:2:{i:0;s:3:"XAF";i:1;s:18:"è¥¿éž æ³•éƒŽ BEAC";}s:3:"XAM";a:2:{i:0;s:3:"XAM";i:1;s:18:"亞洲貨幣單ä½";}s:3:"XAU";a:2:{i:0;s:3:"XAU";i:1;s:6:"黃金";}s:3:"XBA";a:2:{i:0;s:3:"XBA";i:1;s:18:"æ­æ´²ç¶œåˆå–®ä½";}s:3:"XBB";a:2:{i:0;s:3:"XBB";i:1;s:18:"æ­æ´²è²¨å¹£å–®ä½";}s:3:"XBC";a:2:{i:0;s:3:"XBC";i:1;s:23:"æ­æ´²æœƒè¨ˆå–®ä½(XBC)";}s:3:"XBD";a:2:{i:0;s:3:"XBD";i:1;s:23:"æ­æ´²æœƒè¨ˆå–®ä½(XBD)";}s:3:"XCD";a:2:{i:0;s:3:"XCD";i:1;s:15:"格瑞那é”å…ƒ";}s:3:"XCF";a:2:{i:0;s:3:"XCF";i:1;s:17:"è¥¿éž æ–° 法郎";}s:3:"XDR";a:2:{i:0;s:3:"XDR";i:1;s:15:"特殊æ款權";}s:3:"XEF";a:2:{i:0;s:3:"XEF";i:1;s:20:"è¥¿éž æ³•éƒŽ BCEAEC";}s:3:"XEU";a:2:{i:0;s:3:"XEU";i:1;s:18:"æ­æ´²è²¨å¹£å–®ä½";}s:3:"XFO";a:2:{i:0;s:3:"XFO";i:1;s:15:"
法國金法郎";}s:3:"XFU";a:2:{i:0;s:3:"XFU";i:1;s:17:"法國 UIC 法郎";}s:3:"XID";a:2:{i:0;s:3:"XID";i:1;s:18:"伊斯蘭第ç´çˆ¾";}s:3:"XMF";a:2:{i:0;s:3:"XMF";i:1;s:25:"法國大城市新 法郎";}s:3:"XNF";a:2:{i:0;s:3:"XNF";i:1;s:38:"法國安的列斯群島 è¥¿éž æ³•éƒŽ";}s:3:"XOF";a:2:{i:0;s:3:"XOF";i:1;s:19:"è¥¿éž æ³•éƒŽ BCEAO";}s:3:"XPF";a:2:{i:0;s:3:"XPF";i:1;s:10:"CFP 法郎";}s:3:"XTR";a:2:{i:0;s:3:"XTR";i:1;s:23:"COMECON å¯è½‰ç§»ç›§å¸ƒ";}s:3:"YDD";a:2:{i:0;s:3:"YDD";i:1;s:15:"葉門第ç´çˆ¾";}s:3:"YEI";a:2:{i:0;s:3:"YEI";i:1;s:24:"也門阿馬迪里亞爾";}s:3:"YER";a:2:{i:0;s:3:"YER";i:1;s:15:"也門里亞爾";}s:3:"YUD";a:2:{i:0;s:3:"YUD";i:1;s:27:"å—斯拉夫第ç´çˆ¾ç¡¬å¹£";}s:3:"YUF";a:2:{i:0;s:3:"YUF";i:1;s:27:"å—斯拉夫è¯é‚¦ç¬¬ç´çˆ¾";}s:3:"YUG";a:2:{i:0;s:3:"YUG";i:1;s:29:"å—斯拉夫人1994 第ç´çˆ¾";}s:3:"YUM";a:2:{i:0;s:3:"YUM";i:1;s:30:"å—斯拉夫挪å¨äºžç¬¬ç´çˆ¾";}s:3:"YUN";a:2:{i:0;s:3:"YUN";i:1;s:31:"å—斯拉夫 å¯è½‰æ›ç¬¬ç´çˆ¾";}s:3:"YUO";a:2:{i:0;s:3:"YUO";i:1;s:28:"å—斯拉夫å月 第ç´çˆ¾";}s:3:"YUR";a:2:{i:0;s:3:"YUR";i:1;s:33:"å—斯拉夫改制後的第ç´çˆ¾";}s:3:"ZAL";a:2:{i:0;s:3:"ZAL";i:1;s:24:"å—éž - 蘭特 (金èž)";}s:3:"ZAP";a:2:{i:0;s:3:"ZAP";i:1;s:9:"å—éžéŽŠ";}s:3:"ZAR";a:2:{i:0;s:3:"ZAR";i:1;s:12:"å—éžè˜­ç‰¹";}s:3:"ZMK";a:2:{i:0;s:3:"ZMK";i:1;s:18:"尚比亞克瓦查";}s:3:"ZMP";a:2:{i:0;s:3:"ZMP";i:1;s:12:"贊比亞鎊";}s:3:"ZRN";a:2:{i:0;s:3:"ZRN";i:1;s:18:"薩伊扎新伊爾";}s:3:"ZRZ";a:2:{i:0;s:3:"ZRZ";i:1;s:18:"扎伊爾扎伊爾";}s:3:"ZWD";a:2:{i:0;s:3:"ZWD";i:1;s:12:"辛巴å¨å…ƒ";}}s:4:"Keys";a:3:{s:8:"calendar";a:1:{i:0;s:6:"曆法";}s:9:"collation";a:1:{i:0;s:6:"æ ¡å°";}s:8:"currency";a:1:{i:0;s:6:"貨幣";}}s:9:"Languages";a:370:{s:2:"ab";a:1:{i:0;s:18:"阿布哈西亞文";}s:3:"ace";a:1:{i:0;s:9:"亞齊文";}s:3:"ach";a:1:{i:0;s:12:"阿僑利文";}s:3:"ada";a:1:{i:0;s:12:"阿當莫文";}s:3:"ady";a:1:{i:0;s:12:"阿迪å„æ–‡";}s:2:"ae";a:1:{i:0;s:15:"阿緯斯陀文";}s:2:"af";a:1:{i:0;s:15:"å—éžè·è˜­æ–‡";}s:3:"afa
";a:1:{i:0;s:24:"éžé–ƒæ—åŠéžäºžèªžè¨€";}s:2:"ak";a:1:{i:0;s:9:"阿åŽæ–‡";}s:3:"ale";a:1:{i:0;s:12:"阿留申文";}s:3:"alg";a:1:{i:0;s:15:"阿爾岡昆文";}s:2:"an";a:1:{i:0;s:12:"阿拉貢文";}s:3:"ang";a:1:{i:0;s:23:"å¤è‹±æ–‡ (ca.450-1100)";}s:3:"apa";a:1:{i:0;s:15:"阿帕奇語言";}s:3:"arn";a:1:{i:0;s:12:"阿勞åŽæ–‡";}s:3:"art";a:1:{i:0;s:18:"其他人工語言";}s:2:"as";a:1:{i:0;s:12:"阿薩姆文";}s:3:"ast";a:1:{i:0;s:18:"阿斯圖里亞文";}s:3:"ath";a:1:{i:0;s:18:"阿薩巴斯å¡æ–‡";}s:3:"aus";a:1:{i:0;s:12:"澳洲英文";}s:2:"av";a:1:{i:0;s:9:"阿法文";}s:2:"ay";a:1:{i:0;s:12:"艾馬拉文";}s:2:"az";a:1:{i:0;s:15:"亞塞拜然文";}s:2:"ba";a:1:{i:0;s:15:"巴什客爾文";}s:3:"bad";a:1:{i:0;s:9:"ç­é”æ–‡";}s:3:"ban";a:1:{i:0;s:9:"巴厘文";}s:3:"bas";a:1:{i:0;s:9:"å·´è–©æ–‡";}s:3:"bat";a:1:{i:0;s:24:"波羅的文(其他)";}s:2:"be";a:1:{i:0;s:15:"白俄羅斯文";}s:3:"bej";a:1:{i:0;s:9:"è²æ‰Žæ–‡";}s:3:"bem";a:1:{i:0;s:12:"別姆巴文";}s:3:"ber";a:1:{i:0;s:12:"æŸæŸçˆ¾æ–‡";}s:2:"bg";a:1:{i:0;s:15:"ä¿åŠ åˆ©äºžæ–‡";}s:2:"bh";a:1:{i:0;s:12:"比哈爾文";}s:3:"bho";a:1:{i:0;s:15:"åšå‚‘普爾文";}s:2:"bi";a:1:{i:0;s:15:"比斯拉馬文";}s:3:"bik";a:1:{i:0;s:12:"比科爾文";}s:3:"bla";a:1:{i:0;s:15:"錫克錫å¡æ–‡";}s:3:"bnt";a:1:{i:0;s:9:"ç­åœ–æ–‡";}s:2:"bo";a:1:{i:0;s:6:"è—æ–‡";}s:2:"bs";a:1:{i:0;s:15:"波士尼亞文";}s:3:"bua";a:1:{i:0;s:15:"布里阿特文";}s:3:"bug";a:1:{i:0;s:12:"布å‰æ–¯æ–‡";}s:2:"ca";a:1:{i:0;s:18:"加泰羅尼亞文";}s:3:"cai";a:1:{i:0;s:30:"中美å°ç¬¬å®‰æ–‡ï¼ˆå…¶ä»–)";}s:3:"cau";a:1:{i:0;s:24:"高加索文(其他)";}s:2:"ce";a:1:{i:0;s:9:"車臣文";}s:3:"ceb";a:1:{i:0;s:12:"宿務æ—æ–‡";}s:3:"cel";a:1:{i:0;s:24:"克爾特文(其他)";}s:2:"ch";a:1:{i:0;s:12:"查莫洛文";}s:3:"chb";a:1:{i:0;s:12:"奇布查文";}s:3:"chk";a:1:{i:0;s:12:"處奇斯文";}s:3:"chm";a:1:{i:0;s:9:"馬里文";}s:3:"chn";a:1:{i:0;s:12:"契奴克文";}s:3:"cho";a:1:{i:0;s:12:"喬克托文";}s:3:"chp";a:1:{i:0;s:15:"奇佩瓦æšæ–‡";}s:3:"chr";a:1:{i:0
;s:12:"柴羅基文";}s:3:"chy";a:1:{i:0;s:12:"沙伊安文";}s:3:"cpe";a:1:{i:0;s:50:"æ­æ´²è…”調和洋涇濱,æºè‡ªè‹±æ–‡çš„(其他)";}s:3:"cpf";a:1:{i:0;s:50:"æ­æ´²è…”調和洋涇濱,æºè‡ªæ³•æ–‡çš„(其他)";}s:3:"cpp";a:1:{i:0;s:56:"æ­æ´²è…”調和洋涇濱,æºè‡ªè‘¡è„牙文的(其他)";}s:2:"cr";a:1:{i:0;s:9:"克裡文";}s:3:"crh";a:1:{i:0;s:69:"克里米亞åŠå³¶çš„土耳其文;克里米亞åŠå³¶çš„塔塔爾文";}s:3:"crp";a:1:{i:0;s:27:"克里奧爾文和皮欽文";}s:3:"csb";a:1:{i:0;s:12:"å¡èˆ’布文";}s:3:"cus";a:1:{i:0;s:27:"庫施特語系(其他)";}s:2:"cv";a:1:{i:0;s:12:"楚瓦甚文";}s:2:"cy";a:1:{i:0;s:12:"å¨çˆ¾å£«æ–‡";}s:2:"da";a:1:{i:0;s:9:"丹麥文";}s:3:"dak";a:1:{i:0;s:12:"é”科他文";}s:3:"dar";a:1:{i:0;s:15:"é”爾格瓦文";}s:3:"day";a:1:{i:0;s:12:"迪雅克文";}s:3:"del";a:1:{i:0;s:9:"德拉瓦";}s:3:"den";a:1:{i:0;s:9:"斯拉夫";}s:3:"dgr";a:1:{i:0;s:15:"多格里布文";}s:3:"doi";a:1:{i:0;s:12:"多格來文";}s:3:"dra";a:1:{i:0;s:24:"德拉å¨æ–‡ï¼ˆå…¶ä»–)";}s:3:"dsb";a:1:{i:0;s:12:"下索布文";}s:3:"dua";a:1:{i:0;s:12:"æœäºžæ‹‰æ–‡";}s:3:"dum";a:1:{i:0;s:31:"è·è˜­ï¼Œä¸­å¤ (ca. 1050-1350)";}s:2:"dv";a:1:{i:0;s:12:"迪維西文";}s:2:"ee";a:1:{i:0;s:9:"埃緯文";}s:3:"efi";a:1:{i:0;s:12:"埃è²å…‹æ–‡";}s:3:"egy";a:1:{i:0;s:13:"å¤åŸƒåŠæ–‡)";}s:3:"eka";a:1:{i:0;s:15:"艾å¡æœ±å…‹æ–‡";}s:2:"el";a:1:{i:0;s:9:"希臘文";}s:3:"elx";a:1:{i:0;s:9:"埃蘭文";}s:3:"enm";a:1:{i:0;s:30:"英文,中世紀 (1100-1500)";}s:2:"eo";a:1:{i:0;s:9:"世界語";}s:2:"et";a:1:{i:0;s:15:"愛沙尼亞文";}s:3:"ewo";a:1:{i:0;s:12:"ä¾æ±ªéƒ½æ–‡";}s:3:"fan";a:1:{i:0;s:9:"芳æ—æ–‡";}s:2:"ff";a:1:{i:0;s:9:"富拉文";}s:2:"fi";a:1:{i:0;s:9:"芬蘭文";}s:3:"fiu";a:1:{i:0;s:30:"芬蘭-çƒæˆˆçˆ¾æ—æ–‡(其他)";}s:2:"fj";a:1:{i:0;s:9:"æ–æ¿Ÿæ–‡";}s:2:"fo";a:1:{i:0;s:9:"法羅文";}s:3:"fon";a:1:{i:0;s:6:"è±æ–‡";}s:2:"fy";a:1:{i:0;s:15:"弗里斯蘭文";}s:2:"ga";a:1:{i:0;s:12:"愛爾蘭文";}s:3:"gaa";a:1:{i:0;s:9:"加æ—æ–‡";}s:3:"gay";a:1:{i:0;s:9:"加約文";}s:3:"gba";a:1:{i:0
;s:12:"葛巴亞文";}s:2:"gd";a:1:{i:0;s:21:"蘇格蘭 - 蓋爾文";}s:3:"gem";a:1:{i:0;s:17:"德國的(其他)";}s:3:"gez";a:1:{i:0;s:9:"å‰èŒ²æ–‡";}s:3:"gil";a:1:{i:0;s:21:"å‰çˆ¾ä¼¯ç‰¹ç¾¤å³¶æ–‡";}s:2:"gl";a:1:{i:0;s:15:"加里西亞文";}s:3:"gmh";a:1:{i:0;s:41:"å¾·æ–‡, 中å¤å…¨ç››æ™‚期 (ca.1050-1500)";}s:3:"goh";a:1:{i:0;s:39:"å¾·æ–‡,上å¤å…¨ç››æ™‚期 (ca.750-1050)";}s:3:"gon";a:1:{i:0;s:9:"岡德文";}s:3:"gor";a:1:{i:0;s:15:"科隆é”ç¾…æ–‡";}s:3:"got";a:1:{i:0;s:9:"哥特文";}s:3:"grb";a:1:{i:0;s:9:"å“¥åšèªž";}s:3:"grc";a:1:{i:0;s:23:"å¤å¸Œè‡˜æ–‡ (至 1453)";}s:2:"gu";a:1:{i:0;s:15:"å‰äºžæ‹‰å¡”æ–‡";}s:2:"gv";a:1:{i:0;s:9:"曼島文";}s:3:"gwi";a:1:{i:0;s:9:"圭契文";}s:3:"hai";a:1:{i:0;s:9:"æµ·é”æ–‡";}s:2:"he";a:1:{i:0;s:12:"希伯來文";}s:2:"hi";a:1:{i:0;s:12:"北å°åº¦æ–‡";}s:3:"hil";a:1:{i:0;s:15:"希利蓋農文";}s:3:"him";a:1:{i:0;s:15:"赫馬查利文";}s:3:"hit";a:1:{i:0;s:9:"赫梯文";}s:3:"hmn";a:1:{i:0;s:6:"å­Ÿæ–‡";}s:2:"ho";a:1:{i:0;s:18:"西里莫圖土文";}s:2:"hr";a:1:{i:0;s:18:"克羅埃西亞文";}s:2:"ht";a:1:{i:0;s:9:"海地人";}s:2:"hy";a:1:{i:0;s:15:"亞美尼亞文";}s:2:"hz";a:1:{i:0;s:12:"赫雷羅文";}s:2:"ia";a:1:{i:0;s:15:"拉ä¸åœ‹éš›æ–‡";}s:2:"id";a:1:{i:0;s:9:"å°å°¼æ–‡";}s:2:"ie";a:1:{i:0;s:15:"拉ä¸åœ‹éš›æ–‡";}s:2:"ig";a:1:{i:0;s:9:"伊布文";}s:2:"ii";a:1:{i:0;s:9:"å››å·è©±";}s:3:"ijo";a:1:{i:0;s:9:"伊喬文";}s:2:"ik";a:1:{i:0;s:18:"ä¾å¥´çš®ç¶­å…‹æ–‡";}s:3:"ilo";a:1:{i:0;s:12:"伊洛闊文";}s:3:"inc";a:1:{i:0;s:24:"å°åº¦èªžç³»ï¼ˆå…¶ä»–)";}s:3:"ine";a:1:{i:0;s:24:"å°æ­èªžç³»ï¼ˆå…¶ä»–)";}s:2:"io";a:1:{i:0;s:9:"伊朗文";}s:3:"ira";a:1:{i:0;s:12:"伊芳朗文";}s:3:"iro";a:1:{i:0;s:12:"易洛é­æ–‡";}s:2:"is";a:1:{i:0;s:9:"冰島文";}s:2:"it";a:1:{i:0;s:12:"義大利文";}s:2:"iu";a:1:{i:0;s:12:"å› ç´ç‰¹æ–‡";}s:3:"jbo";a:1:{i:0;s:9:"é‚輯文";}s:3:"jpr";a:1:{i:0;s:19:"猶太教-波斯文";}s:3:"jrb";a:1:{i:0;s:22:"猶太教-阿拉伯文";}s:2:"ka";a:1:{i:0;s:12:"喬治亞文";}s:3:"kaa";a:1:{i:0;s:21:"å¡æ‹‰å¡çˆ¾å¸•å…‹æ–‡";}s:3:"kab";a:1:{i:
0;s:12:"å¡æ¯”爾文";}s:3:"kar";a:1:{i:0;s:9:"克倫文";}s:3:"kbd";a:1:{i:0;s:15:"å¡å·´çˆ¾é”æ–‡";}s:2:"kg";a:1:{i:0;s:9:"剛果文";}s:3:"kho";a:1:{i:0;s:17:"å’Œé—[與é—]æ–‡";}s:2:"ki";a:1:{i:0;s:12:"å‰åº«å°¤äºº";}s:2:"kj";a:1:{i:0;s:12:"廣亞馬文";}s:2:"kk";a:1:{i:0;s:12:"哈薩克文";}s:2:"kl";a:1:{i:0;s:12:"格陵蘭文";}s:2:"km";a:1:{i:0;s:9:"高棉文";}s:2:"kn";a:1:{i:0;s:12:"åŽé‚£é”æ–‡";}s:2:"ko";a:1:{i:0;s:6:"韓文";}s:3:"kok";a:1:{i:0;s:9:"貢根文";}s:3:"kos";a:1:{i:0;s:15:"科斯雷æ©æ–‡";}s:2:"kr";a:1:{i:0;s:12:"å¡åŠªè£¡æ–‡";}s:3:"krc";a:1:{i:0;s:25:"å¡æ‹‰æŸ´-包爾å¡çˆ¾æ–‡";}s:3:"kro";a:1:{i:0;s:9:"克魯文";}s:3:"kru";a:1:{i:0;s:12:"庫魯科文";}s:2:"ks";a:1:{i:0;s:15:"克什米爾文";}s:2:"ku";a:1:{i:0;s:12:"庫爾德文";}s:3:"kum";a:1:{i:0;s:12:"庫密克文";}s:3:"kut";a:1:{i:0;s:12:"庫特奈文";}s:2:"kw";a:1:{i:0;s:12:"康瓦耳文";}s:2:"ky";a:1:{i:0;s:15:"å‰çˆ¾å‰æ–¯æ–‡";}s:3:"lad";a:1:{i:0;s:12:"拉迪諾文";}s:3:"lah";a:1:{i:0;s:12:"拉亨é”æ–‡";}s:3:"lam";a:1:{i:0;s:9:"蘭巴文";}s:2:"lb";a:1:{i:0;s:12:"盧森堡文";}s:3:"lez";a:1:{i:0;s:12:"立陶宛文";}s:2:"lg";a:1:{i:0;s:9:"å¹²é”æ–‡";}s:2:"li";a:1:{i:0;s:9:"æž—å ¡æ–‡";}s:2:"lo";a:1:{i:0;s:9:"寮國文";}s:3:"loz";a:1:{i:0;s:9:"洛齊文";}s:2:"lu";a:1:{i:0;s:18:"魯巴加丹加文";}s:3:"lua";a:1:{i:0;s:18:"魯巴魯魯亞文";}s:3:"lui";a:1:{i:0;s:15:"路易塞諾文";}s:3:"lun";a:1:{i:0;s:12:"盧æ©é”æ–‡";}s:3:"luo";a:1:{i:0;s:9:"盧奧文";}s:3:"lus";a:1:{i:0;s:9:"盧晒文";}s:3:"mad";a:1:{i:0;s:12:"馬都拉文";}s:3:"mag";a:1:{i:0;s:12:"馬加伊文";}s:3:"mai";a:1:{i:0;s:12:"é‚蒂利文";}s:3:"mak";a:1:{i:0;s:12:"望加錫文";}s:3:"map";a:1:{i:0;s:9:"å—島文";}s:3:"mas";a:1:{i:0;s:9:"馬賽文";}s:3:"mdr";a:1:{i:0;s:9:"曼é”æ–‡";}s:3:"men";a:1:{i:0;s:9:"門德文";}s:2:"mg";a:1:{i:0;s:15:"馬爾加什文";}s:3:"mga";a:1:{i:0;s:32:"æ„›çˆ¾è˜­æ–‡ï¼Œä¸­å¤ (900-1200)";}s:2:"mh";a:1:{i:0;s:12:"馬紹爾文";}s:3:"mic";a:1:{i:0;s:15:"米克馬克文";}s:3:"min";a:1:{i:0;s:15:"ç±³å—å¡å ¡æ–‡";}s:
3:"mis";a:1:{i:0;s:12:"其他語言";}s:2:"mk";a:1:{i:0;s:12:"馬其頓文";}s:3:"mkh";a:1:{i:0;s:18:"其他高棉語系";}s:2:"ml";a:1:{i:0;s:18:"馬來亞拉姆文";}s:3:"mnc";a:1:{i:0;s:9:"滿æ—æ–‡";}s:3:"mni";a:1:{i:0;s:15:"曼尼普裡文";}s:3:"mno";a:1:{i:0;s:12:"馬諾波文";}s:2:"mo";a:1:{i:0;s:15:"摩爾多瓦文";}s:3:"moh";a:1:{i:0;s:12:"莫éœå…‹æ–‡";}s:2:"mr";a:1:{i:0;s:12:"馬拉地文";}s:2:"ms";a:1:{i:0;s:9:"馬來文";}s:2:"mt";a:1:{i:0;s:12:"馬爾他文";}s:3:"mul";a:1:{i:0;s:12:"多種語言";}s:3:"mun";a:1:{i:0;s:9:"è’™é”æ–‡";}s:3:"mus";a:1:{i:0;s:12:"克里克文";}s:3:"mwr";a:1:{i:0;s:15:"馬爾尼裡文";}s:2:"my";a:1:{i:0;s:9:"緬甸文";}s:3:"myn";a:1:{i:0;s:9:"馬雅文";}s:3:"myv";a:1:{i:0;s:15:"厄爾茲亞文";}s:2:"na";a:1:{i:0;s:9:"諾魯文";}s:3:"nah";a:1:{i:0;s:12:"ç´ç“¦ç‰¹æ–‡";}s:3:"nai";a:1:{i:0;s:24:"其他北美å°åœ°å®‰æ–‡";}s:2:"nb";a:1:{i:0;s:21:"挪å¨æ³¢å…‹é»˜çˆ¾æ–‡";}s:2:"nd";a:1:{i:0;s:15:"北地畢列文";}s:3:"nds";a:1:{i:0;s:35:"德國北部的德文; è–©å…‹éœæ–‡";}s:2:"ne";a:1:{i:0;s:12:"尼泊爾文";}s:3:"new";a:1:{i:0;s:12:"尼瓦爾文";}s:2:"ng";a:1:{i:0;s:12:"æ©æ±åŠ æ–‡";}s:3:"nia";a:1:{i:0;s:12:"尼亞斯文";}s:3:"nic";a:1:{i:0;s:24:"其他尼日剛果語系";}s:3:"niu";a:1:{i:0;s:9:"ç´åŸƒæ–‡";}s:2:"nl";a:1:{i:0;s:9:"è·è˜­æ–‡";}s:2:"nn";a:1:{i:0;s:12:"新挪å¨æ–‡";}s:3:"nog";a:1:{i:0;s:9:"諾蓋文";}s:3:"non";a:1:{i:0;s:15:"å¤è«¾çˆ¾æ–¯æ–‡";}s:2:"nr";a:1:{i:0;s:15:"å—地畢列文";}s:3:"nub";a:1:{i:0;s:12:"努比亞文";}s:2:"nv";a:1:{i:0;s:12:"ç´ç“¦ç´„æ–‡";}s:2:"ny";a:1:{i:0;s:12:"å°¼æšè³ˆæ–‡";}s:3:"nym";a:1:{i:0;s:15:"å°¼æšéŸ‹é½Šæ–‡";}s:3:"nyn";a:1:{i:0;s:15:"å°¼æšç§‘èŠæ–‡";}s:3:"nyo";a:1:{i:0;s:12:"尼奧囉文";}s:3:"nzi";a:1:{i:0;s:12:"尼茲馬文";}s:2:"oc";a:1:{i:0;s:12:"奧西å¦æ–‡";}s:2:"oj";a:1:{i:0;s:15:"奧æ°å¸ƒç“¦æ–‡";}s:2:"or";a:1:{i:0;s:12:"æ­é‡Œäºžæ–‡";}s:2:"os";a:1:{i:0;s:12:"奧塞ææ–‡";}s:3:"osa";a:1:{i:0;s:12:"æ­å¡žå¥‡æ–‡";}s:3:"ota";a:1:{i:0;s:33:"鄂圖曼土耳其文 (1500-1928)";}s:3:"oto";a:1:{i:0;s:12:"奧
托米文";}s:3:"paa";a:1:{i:0;s:24:"其他巴布亞諸語言";}s:3:"pag";a:1:{i:0;s:12:"潘加辛文";}s:3:"pal";a:1:{i:0;s:12:"巴列維文";}s:3:"pam";a:1:{i:0;s:12:"潘帕嘉文";}s:3:"pap";a:1:{i:0;s:18:"帕皮阿門托文";}s:3:"pau";a:1:{i:0;s:9:"帛ç‰æ–‡";}s:3:"peo";a:1:{i:0;s:30:"å¤æ³¢æ–¯æ–‡ (ca.600-400 B.C.)";}s:3:"phi";a:1:{i:0;s:18:"其他è²å¾‹è³“æ–‡";}s:3:"phn";a:1:{i:0;s:12:"腓尼基文";}s:2:"pi";a:1:{i:0;s:9:"巴利文";}s:2:"pl";a:1:{i:0;s:9:"波蘭文";}s:3:"pon";a:1:{i:0;s:12:"波那è²æ–‡";}s:3:"pra";a:1:{i:0;s:48:"å°åº¦å¤ä»£åŠä¸­ä¸–紀之中部åŠåŒ—部方言";}s:3:"pro";a:1:{i:0;s:25:"普羅文斯文 (to 1500)";}s:2:"ps";a:1:{i:0;s:12:"普什圖文";}s:2:"qu";a:1:{i:0;s:12:"蓋丘亞文";}s:3:"raj";a:1:{i:0;s:18:"拉賈斯å¦è«¸æ–‡";}s:3:"rap";a:1:{i:0;s:12:"復活島文";}s:3:"rar";a:1:{i:0;s:15:"拉羅通加文";}s:2:"rm";a:1:{i:0;s:18:"里托羅曼斯文";}s:2:"ro";a:1:{i:0;s:15:"羅馬尼亞文";}s:3:"roa";a:1:{i:0;s:15:"其他羅曼文";}s:3:"rom";a:1:{i:0;s:12:"å‰æ™®è³½æ–‡";}s:2:"rw";a:1:{i:0;s:12:"盧安é”æ–‡";}s:3:"sad";a:1:{i:0;s:12:"æ¡‘é”韋文";}s:3:"sah";a:1:{i:0;s:12:"雅庫特文";}s:3:"sal";a:1:{i:0;s:12:"薩利甚文";}s:3:"sam";a:1:{i:0;s:24:"薩瑪利亞阿拉姆文";}s:3:"sas";a:1:{i:0;s:12:"æ’’æ’’å…‹æ–‡";}s:3:"sat";a:1:{i:0;s:12:"散塔利文";}s:2:"sc";a:1:{i:0;s:9:"æ’’ä¸æ–‡";}s:2:"sd";a:1:{i:0;s:9:"蘇丹文";}s:2:"se";a:1:{i:0;s:15:"北方薩米文";}s:3:"sel";a:1:{i:0;s:15:"瑟爾å¡æ™®æ–‡";}s:3:"sem";a:1:{i:0;s:18:"其他閃æ—語言";}s:3:"sga";a:1:{i:0;s:28:"å¤æ„›çˆ¾è˜­æ–‡ï¼ˆè‡³ 900)";}s:3:"sgn";a:1:{i:0;s:6:"手語";}s:2:"sh";a:1:{i:0;s:30:"塞爾維亞克羅埃西亞文";}s:3:"shn";a:1:{i:0;s:6:"撣文";}s:2:"si";a:1:{i:0;s:12:"僧伽羅文";}s:3:"sid";a:1:{i:0;s:12:"希é”æ‘©æ–‡";}s:3:"sio";a:1:{i:0;s:9:"大蘇文";}s:3:"sit";a:1:{i:0;s:15:"其他漢è—æ–‡";}s:2:"sl";a:1:{i:0;s:18:"斯洛維尼亞文";}s:3:"sla";a:1:{i:0;s:18:"其他斯拉夫文";}s:2:"sm";a:1:{i:0;s:12:"薩摩亞文";}s:3:"sma";a:1:{i:0;s:12:"å—薩米文";}s:3:"smi";a:1:{i:0;s:15
:"其他薩米文";}s:3:"smj";a:1:{i:0;s:15:"魯勒薩米文";}s:3:"smn";a:1:{i:0;s:18:"伊ç´è£¡è–©ç±³æ–‡";}s:3:"sms";a:1:{i:0;s:18:"斯科特薩米文";}s:2:"sn";a:1:{i:0;s:15:"塞內加爾文";}s:2:"so";a:1:{i:0;s:12:"索馬利文";}s:3:"sog";a:1:{i:0;s:18:"索格底亞ç´æ–‡";}s:2:"sq";a:1:{i:0;s:18:"阿爾巴尼亞文";}s:2:"sr";a:1:{i:0;s:15:"塞爾維亞文";}s:3:"srr";a:1:{i:0;s:12:"塞雷爾文";}s:3:"ssa";a:1:{i:0;s:36:"éžæ´²æ’’哈拉沙漠邊緣地帶文";}s:2:"su";a:1:{i:0;s:9:"蘇丹文";}s:3:"suk";a:1:{i:0;s:12:"蘇庫馬文";}s:3:"sus";a:1:{i:0;s:9:"蘇蘇文";}s:3:"sux";a:1:{i:0;s:9:"蘇美文";}s:2:"sw";a:1:{i:0;s:15:"å²ç“¦å¸Œé‡Œæ–‡";}s:3:"syr";a:1:{i:0;s:15:"å¤æ•˜åˆ©äºžæ–‡";}s:2:"ta";a:1:{i:0;s:12:"å¦ç±³çˆ¾æ–‡";}s:2:"te";a:1:{i:0;s:12:"泰盧固文";}s:3:"tem";a:1:{i:0;s:9:"æ姆文";}s:3:"ter";a:1:{i:0;s:12:"泰雷諾文";}s:3:"tet";a:1:{i:0;s:9:"æ³°é “æ–‡";}s:2:"ti";a:1:{i:0;s:18:"æ格利尼亞文";}s:3:"tig";a:1:{i:0;s:12:"蒂格雷文";}s:3:"tiv";a:1:{i:0;s:9:"æ夫文";}s:2:"tk";a:1:{i:0;s:12:"土庫曼文";}s:3:"tkl";a:1:{i:0;s:12:"托克勞文";}s:3:"tli";a:1:{i:0;s:15:"特林基特文";}s:3:"tmh";a:1:{i:0;s:15:"塔馬奇克文";}s:2:"tn";a:1:{i:0;s:15:"çªå°¼è¥¿äºžæ–‡";}s:2:"to";a:1:{i:0;s:9:"æ±åŠ æ–‡";}s:3:"tog";a:1:{i:0;s:23:"湯加文(尼亞薩文)";}s:3:"tpi";a:1:{i:0;s:12:"托比辛文";}s:3:"tsi";a:1:{i:0;s:12:"欽西安文";}s:2:"tt";a:1:{i:0;s:9:"韃é¼æ–‡";}s:3:"tum";a:1:{i:0;s:15:"圖姆布å¡æ–‡";}s:3:"tup";a:1:{i:0;s:9:"圖皮文";}s:3:"tut";a:1:{i:0;s:21:"其他阿爾泰諸文";}s:3:"tvl";a:1:{i:0;s:12:"å瓦魯文";}s:2:"tw";a:1:{i:0;s:12:"ç¹é«”中文";}s:2:"ty";a:1:{i:0;s:12:"大溪地文";}s:3:"tyv";a:1:{i:0;s:9:"土凡文";}s:3:"udm";a:1:{i:0;s:15:"沃蒂艾克文";}s:2:"ug";a:1:{i:0;s:12:"維å¾çˆ¾æ–‡";}s:3:"uga";a:1:{i:0;s:12:"çƒåŠ åˆ—æ–‡";}s:2:"uk";a:1:{i:0;s:12:"çƒå…‹è˜­æ–‡";}s:3:"umb";a:1:{i:0;s:12:"姆本æœæ–‡";}s:3:"und";a:1:{i:0;s:12:"未確定的";}s:2:"ur";a:1:{i:0;s:12:"çƒçˆ¾éƒ½æ–‡";}s:2:"uz";a:1:{i:0;s:15:"çƒèŒ²åˆ¥å…‹æ–‡";}s:3:"vai";a:1:{i:0;s
:9:"越å—æ–‡";}s:2:"ve";a:1:{i:0;s:9:"溫é”æ–‡";}s:2:"wa";a:1:{i:0;s:9:"瓦隆文";}s:3:"wak";a:1:{i:0;s:15:"夸基武特文";}s:3:"war";a:1:{i:0;s:9:"瓦瑞文";}s:3:"was";a:1:{i:0;s:9:"瓦紹文";}s:3:"wen";a:1:{i:0;s:9:"文德文";}s:2:"wo";a:1:{i:0;s:12:"沃爾夫文";}s:3:"xal";a:1:{i:0;s:15:"å¡çˆ¾æ¢…å…‹æ–‡";}s:2:"xh";a:1:{i:0;s:9:"ç­åœ–æ–‡";}s:3:"yao";a:1:{i:0;s:6:"瑤文";}s:2:"yi";a:1:{i:0;s:12:"æ„第緒文";}s:2:"yo";a:1:{i:0;s:12:"約魯巴文";}s:3:"ypk";a:1:{i:0;s:15:"愛斯基摩文";}s:2:"za";a:1:{i:0;s:6:"壯文";}s:3:"zap";a:1:{i:0;s:15:"薩波特克文";}s:3:"zen";a:1:{i:0;s:12:"澤ç´åŠ æ–‡";}s:3:"znd";a:1:{i:0;s:9:"è´Šå¾·æ–‡";}s:2:"zu";a:1:{i:0;s:9:"祖魯文";}s:3:"zun";a:1:{i:0;s:9:"祖尼文";}}s:12:"LocaleScript";a:2:{i:0;s:4:"Hani";i:1;s:4:"Bopo";}s:7:"Scripts";a:48:{s:4:"Arab";a:1:{i:0;s:12:"阿拉伯文";}s:4:"Armn";a:1:{i:0;s:15:"亞美尼亞文";}s:4:"Beng";a:1:{i:0;s:12:"孟加拉文";}s:4:"Bopo";a:1:{i:0;s:18:"漢語注音符號";}s:4:"Brai";a:1:{i:0;s:18:"盲人用點字法";}s:4:"Cans";a:1:{i:0;s:30:"加拿大原ä½æ°‘通用字符";}s:4:"Cher";a:1:{i:0;s:12:"柴羅基文";}s:4:"Copt";a:1:{i:0;s:12:"科普特文";}s:4:"Cprt";a:1:{i:0;s:15:"塞浦路斯文";}s:4:"Cyrl";a:1:{i:0;s:15:"斯拉夫語系";}s:4:"Dsrt";a:1:{i:0;s:15:"德瑟雷特文";}s:4:"Ethi";a:1:{i:0;s:15:"衣索匹亞文";}s:4:"Geor";a:1:{i:0;s:12:"喬治亞文";}s:4:"Goth";a:1:{i:0;s:9:"歌德文";}s:4:"Grek";a:1:{i:0;s:9:"希臘文";}s:4:"Gujr";a:1:{i:0;s:15:"å‰äºžæ‹‰å¡”æ–‡";}s:4:"Guru";a:1:{i:0;s:15:"å¤çˆ¾ç©†å¥‡æ–‡";}s:4:"Hang";a:1:{i:0;s:6:"諺文";}s:4:"Hani";a:1:{i:0;s:6:"漢語";}s:4:"Hano";a:1:{i:0;s:12:"哈努努文";}s:4:"Hans";a:1:{i:0;s:12:"簡體漢語";}s:4:"Hant";a:1:{i:0;s:12:"ç¹é«”漢語";}s:4:"Hebr";a:1:{i:0;s:12:"希伯來文";}s:4:"Ital";a:1:{i:0;s:15:"å¤æ„大利文";}s:4:"Khmr";a:1:{i:0;s:9:"高棉文";}s:4:"Knda";a:1:{i:0;s:12:"åŽé‚£é”æ–‡";}s:4:"Laoo";a:1:{i:0;s:9:"寮國文";}s:4:"Latn";a:1:{i:0;s:9:"拉ä¸æ–‡";}s:4:"Limb";a:1:{i:0;s:9:"林佈文";}s:4:"Mlym";a:1:{i:0;s:18:"馬來亞æ
‹‰å§†æ–‡";}s:4:"Mong";a:1:{i:0;s:9:"è’™å¤æ–‡";}s:4:"Mymr";a:1:{i:0;s:9:"緬甸文";}s:4:"Ogam";a:1:{i:0;s:9:"æ­ç”˜æ–‡";}s:4:"Orya";a:1:{i:0;s:12:"æ­åˆ©äºžæ–‡";}s:4:"Osma";a:1:{i:0;s:15:"æ­æ–¯æ›¼äºžæ–‡";}s:4:"Runr";a:1:{i:0;s:15:"å¤åŒ—æ­æ–‡å­—";}s:4:"Shaw";a:1:{i:0;s:15:"ç°«æŸç´å­—符";}s:4:"Sinh";a:1:{i:0;s:9:"錫蘭文";}s:4:"Syrc";a:1:{i:0;s:12:"æ•åˆ©äºžæ–‡";}s:4:"Tagb";a:1:{i:0;s:9:"å—島文";}s:4:"Taml";a:1:{i:0;s:12:"å¦ç±³çˆ¾æ–‡";}s:4:"Telu";a:1:{i:0;s:12:"æ³°é­¯å¤æ–‡";}s:4:"Tglg";a:1:{i:0;s:12:"塔加拉文";}s:4:"Thaa";a:1:{i:0;s:12:"塔安那文";}s:4:"Thai";a:1:{i:0;s:6:"æ³°æ–‡";}s:4:"Tibt";a:1:{i:0;s:9:"西è—æ–‡";}s:4:"Ugar";a:1:{i:0;s:12:"çƒåŠ åˆ—æ–‡";}s:4:"Yiii";a:1:{i:0;s:6:"彞文";}}s:5:"Types";a:2:{s:8:"calendar";a:7:{s:8:"buddhist";a:1:{i:0;s:12:"佛教曆法";}s:7:"chinese";a:1:{i:0;s:6:"農曆";}s:9:"gregorian";a:1:{i:0;s:6:"公曆";}s:6:"hebrew";a:1:{i:0;s:15:"希伯來曆法";}s:7:"islamic";a:1:{i:0;s:15:"伊斯蘭曆法";}s:13:"islamic-civil";a:1:{i:0;s:21:"伊斯蘭城市曆法";}s:8:"japanese";a:1:{i:0;s:12:"日本曆法";}}s:9:"collation";a:5:{s:6:"direct";a:1:{i:0;s:12:"直接順åº";}s:9:"phonebook";a:1:{i:0;s:15:"電話簿順åº";}s:6:"pinyin";a:1:{i:0;s:12:"拼音順åº";}s:6:"stroke";a:1:{i:0;s:12:"筆劃顺åº";}s:11:"traditional";a:1:{i:0;s:12:"傳統曆法";}}}s:8:"Variants";a:1:{s:7:"REVISED";a:1:{i:0;s:9:"已修訂";}}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:1:{s:16:"DateTimePatterns";a:9:{i:0;s:24:"ahh'時'mm'分'ss'秒' z";i:1;s:22:"ahh'時'mm'分'ss'秒'";i:2;s:9:"a h:mm:ss";i:3;s:6:"a h:mm";i:4;s:25:"yyyy'å¹´'M'月'd'æ—¥'EEEE";i:5;s:21:"yyyy'å¹´'M'月'd'æ—¥'";i:6;s:8:"yyyy/M/d";i:7;s:8:"yyyy/M/d";i:8;s:7:"{1} {0}";}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant_HK.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant_HK.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant_HK.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:9:"Countries";a:1:{s:2:"MO";a:1:{i:0;s:21:"澳門特別行政å€";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:23:"¤#,##0.00;(¤#,##0.00)";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:16:"DateTimePatterns";a:9:{i:0;s:24:"ahh'時'mm'分'ss'秒' z";i:1;s:22:"ahh'時'mm'分'ss'秒'";i:2;s:9:"ahh:mm:ss";i:3;s:5:"ah:mm";i:4;s:26:"yyyy'å¹´'M'月'd'æ—¥' EEEE";i:5;s:21:"yyyy'å¹´'M'月'd'æ—¥'";i:6;s:21:"yyyy'å¹´'M'月'd'æ—¥'";i:7;s:19:"yy'å¹´'M'月'd'æ—¥'";i:8;s:7:"{1} {0}";}s:10:"monthNames";a:1:{s:6:"format";a:1:{s:11:"abbreviated";a:12:{i:0;s:4:"1月";i:1;s:4:"2月";i:2;s:4:"3月";i:3;s:4:"4月";i:4;s:4:"5月";i:5;s:4:"6月";i:6;s:4:"7月";i:7;s:4:"8月";i:8;s:4:"9月";i:9;s:5:"10月";i:10;s:5:"11月";i:11;s:5:"12月";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant_MO.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant_MO.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant_MO.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:4:{s:9:"Countries";a:1:{s:2:"MO";a:1:{i:0;s:21:"澳門特別行政å€";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:23:"¤#,##0.00;(¤#,##0.00)";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:2:{s:16:"DateTimePatterns";a:9:{i:0;s:24:"ahh'時'mm'分'ss'秒' z";i:1;s:22:"ahh'時'mm'分'ss'秒'";i:2;s:9:"ahh:mm:ss";i:3;s:5:"ah:mm";i:4;s:28:"yyyy'å¹´'MM'月'dd'æ—¥' EEEE";i:5;s:23:"yyyy'å¹´'MM'月'dd'æ—¥'";i:6;s:21:"yyyy'å¹´'M'月'd'æ—¥'";i:7;s:19:"yy'å¹´'M'月'd'æ—¥'";i:8;s:7:"{1} {0}";}s:10:"monthNames";a:1:{s:6:"format";a:1:{s:11:"abbreviated";a:12:{i:0;s:4:"1月";i:1;s:4:"2月";i:2;s:4:"3月";i:3;s:4:"4月";i:4;s:4:"5月";i:5;s:4:"6月";i:6;s:4:"7月";i:7;s:4:"8月";i:8;s:4:"9月";i:9;s:5:"10月";i:10;s:5:"11月";i:11;s:5:"12月";}}}}}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant_TW.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant_TW.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_Hant_TW.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:2:{s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:22:"¤#,##0.00;-¤#,##0.00";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_MO.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_MO.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_MO.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"__ALIAS";a:1:{i:0;s:10:"zh_Hant_MO";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_SG.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_SG.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_SG.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"__ALIAS";a:1:{i:0;s:10:"zh_Hans_SG";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_TW.dat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_TW.dat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/i18n/zh_TW.dat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+a:1:{s:7:"__ALIAS";a:1:{i:0;s:10:"zh_Hant_TW";}}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/actions/actions.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/actions/actions.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/actions/actions.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * defaultActions module.
+ *
+ * @package    symfony
+ * @subpackage action
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: actions.class.php 3313 2007-01-20 07:00:37Z fabien $
+ */
+class defaultActions extends sfActions
+{
+  /**
+   * Congratulations page for creating an application
+   *
+   */
+  public function executeIndex()
+  {
+  }
+
+  /**
+   * Congratulations page for creating a module
+   *
+   */
+  public function executeModule()
+  {
+  }
+
+  /**
+   * Error page for page not found (404) error
+   *
+   */
+  public function executeError404()
+  {
+  }
+
+  /**
+   * Warning page for restricted area - requires login
+   *
+   */
+  public function executeSecure()
+  {
+  }
+
+  /**
+   * Warning page for restricted area - requires credentials
+   *
+   */
+  public function executeLogin()
+  {
+  }
+
+  /**
+   * Website temporarily unavailable
+   *
+   */
+  public function executeUnavailable()
+  {
+  }
+
+  /**
+   * Website disabled by the site administrator (in settings.yml)
+   *
+   */
+  public function executeDisabled()
+  {
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/actions/actions.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/defaultLayout.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/defaultLayout.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/defaultLayout.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,24 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+
+<?php include_http_metas() ?>
+<?php include_metas() ?>
+<?php include_title() ?>
+
+<?php use_stylesheet('/sf/sf_default/css/screen.css', 'last') ?>
+
+<link rel="shortcut icon" href="/favicon.ico" />
+
+<!--[if lt IE 7.]>
+<?php echo stylesheet_tag('/sf/sf_default/css/ie.css') ?>
+<![endif]-->
+
+</head>
+<body>
+<div class="sfTContainer">
+  <?php echo link_to(image_tag('/sf/sf_default/images/sfTLogo.png', array('alt' => 'symfony PHP Framework', 'class' => 'sfTLogo', 'size' => '186x39')), 'http://www.symfony-project.com/') ?>
+  <?php echo $sf_data->getRaw('sf_content') ?>
+</div>
+</body>
+</html>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/defaultLayout.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/disabledSuccess.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/disabledSuccess.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/disabledSuccess.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,19 @@
+<?php decorate_with(sfLoader::getTemplatePath('default', 'defaultLayout.php')) ?>
+
+<div class="sfTMessageContainer sfTAlert"> 
+  <?php echo image_tag('/sf/sf_default/images/icons/disabled48.png', array('alt' => 'module disabled', 'class' => 'sfTMessageIcon', 'size' => '48x48')) ?>
+  <div class="sfTMessageWrap">
+    <h1>This Module is Unavailable</h1>
+    <h5>This module has been disabled by a site administrator.</h5>
+  </div>
+</div>
+<dl class="sfTMessageInfo">
+
+  <dt>What's next</dt>
+  <dd>
+    <ul class="sfTIconList">
+      <li class="sfTLinkMessage"><a href="javascript:history.go(-1)">Back to previous page</a></li>
+      <li class="sfTLinkMessage"><?php echo link_to('Go to Homepage', '@homepage') ?></li>
+    </ul>
+  </dd>
+</dl>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/disabledSuccess.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/error404Success.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/error404Success.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/error404Success.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,27 @@
+<?php decorate_with(sfLoader::getTemplatePath('default', 'defaultLayout.php')) ?>
+
+<div class="sfTMessageContainer sfTAlert"> 
+  <?php echo image_tag('/sf/sf_default/images/icons/cancel48.png', array('alt' => 'page not found', 'class' => 'sfTMessageIcon', 'size' => '48x48')) ?>
+  <div class="sfTMessageWrap">
+    <h1>Oops! Page Not Found</h1>
+    <h5>The server returned a 404 response.</h5>
+  </div>
+</div>
+<dl class="sfTMessageInfo">
+  <dt>Did you type the URL?</dt>
+  <dd>You may have typed the address (URL) incorrectly. Check it to make sure you've got the exact right spelling, capitalization, etc.</dd>
+
+  <dt>Did you follow a link from somewhere else at this site?</dt>
+  <dd>If you reached this page from another part of this site, please email us at <?php echo mail_to('[email]') ?> so we can correct our mistake.</dd>
+
+  <dt>Did you follow a link from another site?</dt>
+  <dd>Links from other sites can sometimes be outdated or misspelled. Email us at <?php echo mail_to('[email]') ?> where you came from and we can try to contact the other site in order to fix the problem.</dd>
+
+  <dt>What's next</dt>
+  <dd>
+    <ul class="sfTIconList">
+      <li class="sfTLinkMessage"><a href="javascript:history.go(-1)">Back to previous page</a></li>
+      <li class="sfTLinkMessage"><?php echo link_to('Go to Homepage', '@homepage') ?></li>
+    </ul>
+  </dd>
+</dl>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/error404Success.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/indexSuccess.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/indexSuccess.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/indexSuccess.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,25 @@
+<?php decorate_with(sfLoader::getTemplatePath('default', 'defaultLayout.php')) ?>
+
+<div class="sfTMessageContainer sfTMessage"> 
+  <?php echo image_tag('/sf/sf_default/images/icons/ok48.png', array('alt' => 'ok', 'class' => 'sfTMessageIcon', 'size' => '48x48')) ?>
+  <div class="sfTMessageWrap">
+    <h1>Symfony Project Created</h1>
+    <h5>Congratulations! You have successfully created your symfony project.</h5>
+  </div>
+</div>
+<dl class="sfTMessageInfo">
+  <dt>Project setup successful</dt>
+  <dd>This project uses the symfony libraries. If you see no image in this page, you may need to configure your web server so that it gains access to the <code>symfony_data/web/sf/</code> directory.</dd>
+
+  <dt>This is a temporary page</dt>
+  <dd>This page is part of the symfony <code>default</code> module. It will disappear as soon as you define a <code>homepage</code> route in your <code>routing.yml</code>.</dd>
+
+  <dt>What's next</dt>
+  <dd>
+    <ul class="sfTIconList">
+      <li class="sfTDatabaseMessage">Create your data model</li>
+      <li class="sfTColorMessage">Customize the layout of the generated templates</li>
+      <li class="sfTLinkMessage"><?php echo link_to('Learn more from the online documentation', 'http://www.symfony-project.com/content/documentation.html') ?></li>
+    </ul>
+  </dd>
+</dl>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/indexSuccess.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/loginSuccess.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/loginSuccess.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/loginSuccess.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,23 @@
+<?php decorate_with(sfLoader::getTemplatePath('default', 'defaultLayout.php')) ?>
+
+<div class="sfTMessageContainer sfTLock"> 
+  <?php echo image_tag('/sf/sf_default/images/icons/lock48.png', array('alt' => 'credentials required', 'class' => 'sfTMessageIcon', 'size' => '48x48')) ?>
+  <div class="sfTMessageWrap">
+    <h1>Credentials Required</h1>
+    <h5>This page is in a restricted area.</h5>
+  </div>
+</div>
+<dl class="sfTMessageInfo">
+  <dt>You do not have the proper credentials to access this page</dt>
+  <dd>Even though you are already logged in, this page requires special credentials that you currently don't have. </dd>
+
+  <dt>How to access this page</dt>
+  <dd>You must ask a site administrator to grant you some special credentials.</dd>
+
+  <dt>What's next</dt>
+  <dd>
+    <ul class="sfTIconList">
+      <li class="sfTLinkMessage"><a href="javascript:history.go(-1)">Back to previous page</a></li>
+    </ul>
+  </dd>
+</dl>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/loginSuccess.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/moduleSuccess.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/moduleSuccess.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/moduleSuccess.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,23 @@
+<?php decorate_with(sfLoader::getTemplatePath('default', 'defaultLayout.php')) ?>
+
+<div class="sfTMessageContainer sfTMessage"> 
+  <?php echo image_tag('/sf/sf_default/images/icons/ok48.png', array('alt' => 'module created', 'class' => 'sfTMessageIcon', 'size' => '48x48')) ?>
+  <div class="sfTMessageWrap">
+    <h1>Module "<?php echo $sf_params->get('module') ?>" created</h1>
+    <h5>Congratulations! You have successfully created a symfony module.</h5>
+  </div>
+</div>
+<dl class="sfTMessageInfo">
+  <dt>This is a temporary page</dt>
+  <dd>This page is part of the symfony <code>default</code> module. It will disappear as soon as you override the <code>index</code> action in the new module.</dd>
+
+  <dt>What's next</dt>
+  <dd>
+    <ul class="sfTIconList">
+      <li class="sfTDirectoryMessage">Browse to the <code>apps/<?php echo SF_APP ?>/modules/<?php echo $sf_params->get('module') ?>/</code> directory</li>
+      <li class="sfTEditMessage">In <code>actions/actions.class.php</code>, edit the <code>executeIndex()</code> method and remove the final <code>forward</code></li>
+      <li class="sfTColorMessage">Customize the <code>templates/indexSuccess.php</code> template</li>
+      <li class="sfTLinkMessage"><?php echo link_to('Learn more from the online documentation', 'http://www.symfony-project.com/content/documentation.html') ?></li>
+    </ul>
+  </dd>
+</dl>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/moduleSuccess.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/secureSuccess.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/secureSuccess.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/secureSuccess.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,21 @@
+<?php decorate_with(sfLoader::getTemplatePath('default', 'defaultLayout.php')) ?>
+
+<div class="sfTMessageContainer sfTLock"> 
+  <?php echo image_tag('/sf/sf_default/images/icons/lock48.png', array('alt' => 'login required', 'class' => 'sfTMessageIcon', 'size' => '48x48')) ?>
+  <div class="sfTMessageWrap">
+    <h1>Login Required</h1>
+    <h5>This page is not public.</h5>
+  </div>
+</div>
+<dl class="sfTMessageInfo">
+  <dt>How to access this page</dt>
+  <dd>You must proceed to the login page and enter your id and password.</dd>
+
+  <dt>What's Next</dt>
+  <dd>
+    <ul class="sfTIconList">
+      <li class="sfTLinkMessage"><?php echo link_to('Proceed to login', sfConfig::get('sf_login_module').'/'.sfConfig::get('sf_login_action')) ?></li>
+      <li class="sfTLinkMessage"><a href="javascript:history.go(-1)">Back to previous page</a></li>
+    </ul>
+  </dd>
+</dl>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/secureSuccess.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/unavailableSuccess.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/unavailableSuccess.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/unavailableSuccess.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,9 @@
+<?php decorate_with(sfLoader::getTemplatePath('default', 'defaultLayout.php')) ?>
+
+<div class="sfTMessageContainer sfTAlert"> 
+  <?php echo image_tag('/sf/sf_default/images/icons/tools48.png', array('alt' => 'website unavailable', 'class' => 'sfTMessageIcon', 'size' => '48x48')) ?>
+  <div class="sfTMessageWrap">
+    <h1>Website Currently Unavailable</h1>
+    <h5>This website has been temporarily disabled. Please try again later.</h5>
+  </div>
+</div>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/modules/default/templates/unavailableSuccess.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/app.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/app.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/app.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,2 @@
+# default values
+#all:


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/app.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/cache.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/cache.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/cache.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,4 @@
+default:
+  enabled:     off
+  with_layout: false
+  lifetime:    86400


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/cache.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/config.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/config.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/config.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,8 @@
+<?php
+
+// include project configuration
+include(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
+
+// symfony bootstraping
+require_once($sf_symfony_lib_dir.'/util/sfCore.class.php');
+sfCore::bootstrap($sf_symfony_lib_dir, $sf_symfony_data_dir);


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/config.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/factories.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/factories.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/factories.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+cli:
+  controller:
+    class: sfConsoleController
+  request:
+    class: sfConsoleRequest
+  response:
+    class: sfConsoleResponse
+
+test:
+  storage:
+    class: sfSessionTestStorage
+
+#all:
+#  controller:
+#    class: sfFrontWebController
+#
+#  request:
+#    class: sfWebRequest
+#
+#  response:
+#    class: sfWebResponse
+#
+#  user:
+#    class: myUser
+#
+#  storage:
+#    class: sfSessionStorage
+#    param:
+#      session_name: symfony
+#
+#  view_cache:
+#    class: sfFileCache
+#    param:
+#      automaticCleaningFactor: 0
+#      cacheDir:                %SF_TEMPLATE_CACHE_DIR%


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/factories.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/filters.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/filters.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/filters.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,10 @@
+rendering: ~
+web_debug: ~
+security:  ~
+
+# generally, you will want to insert your own filters here
+
+cache:     ~
+common:    ~
+flash:     ~
+execution: ~


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/filters.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/i18n.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/i18n.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/i18n.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,7 @@
+#all:
+#  default_culture:     en
+#  source:              XLIFF
+#  debug:               off
+#  cache:               on
+#  untranslated_prefix: "[T]"
+#  untranslated_suffix: "[/T]"


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/i18n.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/logging.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/logging.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/logging.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,22 @@
+prod:
+  enabled: off
+  level:   err
+  rotate:  on
+  purge:   off
+
+#all:
+#  enabled: on
+#  level:   debug
+#  rotate:  off
+#  period:  7
+#  history: 10
+#  purge:   on
+#  loggers:
+#    sf_web_debug:
+#      class: sfWebDebugLogger
+#      param:
+#        condition: %SF_WEB_DEBUG%
+#    sf_file_debug:
+#      class: sfFileLogger
+#      param:
+#        file: %SF_LOG_DIR%/%SF_APP%_%SF_ENVIRONMENT%.log


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/logging.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/routing.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/routing.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/routing.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,15 @@
+# default rules
+homepage:
+  url:   /
+  param: { module: default, action: index }
+
+default_symfony:
+  url:   /symfony/:action/*
+  param: { module: default }
+
+default_index:
+  url:   /:module
+  param: { action: index }
+
+default:
+  url:   /:module/:action/*


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/routing.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/security.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/security.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/security.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,2 @@
+default:
+  is_secure: off


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/security.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/settings.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/settings.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/settings.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,103 @@
+prod:
+  .settings:
+    no_script_name:           ##NO_SCRIPT_NAME##
+
+dev:
+  .settings:
+    # E_ALL | E_STRICT = 4095
+    error_reporting:        4095
+    web_debug:              on
+    cache:                  off
+    no_script_name:         off
+    etag:                   off
+
+test:
+  .settings:
+    # E_ALL | E_STRICT & ~E_NOTICE = 2047
+    error_reporting:        2047
+    cache:                  off
+    web_debug:              off
+    no_script_name:         off
+    etag:                   off
+
+#all:
+#  .actions:
+#    default_module:         default   # Default module and action to be called when
+#    default_action:         index     # A routing rule doesn't set it
+#
+#    error_404_module:       default   # To be called when a 404 error is raised
+#    error_404_action:       error404  # Or when the requested URL doesn't match any route
+#
+#    login_module:           default   # To be called when a non-authenticated user
+#    login_action:           login     # Tries to access a secure page
+#
+#    secure_module:          default   # To be called when a user doesn't have
+#    secure_action:          secure    # The credentials required for an action
+#
+#    module_disabled_module: default   # To be called when a user requests 
+#    module_disabled_action: disabled  # A module disabled in the module.yml
+#
+#    unavailable_module:     default   # To be called when a user requests a page
+#    unavailable_action:  unavailable  # From an application disabled via the available setting below
+#
+#  .settings:
+#    available:              on        # Enable the whole application. Switch to off to redirect all requests to the unavailable module and action.
+#
+#    # Optional features. Deactivating unused features boots performance a bit.
+#    use_database:           on        # Enable database manager. Set to off if you don't use a database.
+#    use_security:           on        # Enable security features (login and credentials). Set to off for public applications.
+#    use_flash:              on        # Enable flash parameter feature. Set to off if you never use the set_flash() method in actions.
+#    i18n:                   off       # Enable interface translation. Set to off if your application should not be translated.
+#    check_symfony_version:  off       # Enable check of symfony version for every request. Set to on to have symfony clear the cache automatically when the framework is upgraded. Set to off if you always clear the cache after an upgrade.
+#    use_process_cache:      on        # Enable symfony optimizations based on PHP accelerators. Set to off for tests or when you have enabled a PHP accelerator in your server but don't want symfony to use it internally.
+#    compressed:             off       # Enable PHP response compression. Set to on to compress the outgoing HTML via the PHP handler.
+#    check_lock:             off       # Enable the application lock system triggered by the clear-cache and disable tasks. Set to on to have all requests to disabled applications redirected to the $sf_symfony_data_dir/web/arrors/unavailable.php page.
+#
+#    # Output escaping settings
+#    escaping_strategy:      bc        # Determines how variables are made available to templates. Accepted values: bc, both, on, off. The value off deactivates escaping completely and gives a slight boost.
+#    escaping_method:   ESC_ENTITIES   # Function or helper used for escaping. Accepted values: ESC_RAW, ESC_ENTITIES, ESC_JS, ESC_JS_NO_ENTITIES.
+#
+#    # Routing settings
+#    suffix:                 .         # Default suffix for generated URLs. If set to a single dot (.), no suffix is added. Possible values: .html, .php, and so on.
+#    no_script_name:         off       # Enable the front controller name in generated URLs
+#
+#    # Validation settings, used for error generation by the Validation helper
+#    validation_error_prefix:    ' &darr;&nbsp;'
+#    validation_error_suffix:    ' &nbsp;&darr;'
+#    validation_error_class:     form_error
+#    validation_error_id_prefix: error_for_
+#
+#    # Cache settings
+#    cache:                  off       # Enable the template cache
+#    etag:                   on        # Enable etag handling
+#
+#    # Logging and debugging settings
+#    web_debug:              off       # Enable the web debug toolbar
+#    error_reporting:        341       # Determines which events are logged. The default value is E_PARSE | E_COMPILE_ERROR | E_ERROR | E_CORE_ERROR | E_USER_ERROR = 341
+#
+#    # Assets paths
+#    rich_text_js_dir:       js/tiny_mce
+#    prototype_web_dir:      /sf/prototype
+#    admin_web_dir:          /sf/sf_admin
+#    web_debug_web_dir:      /sf/sf_web_debug
+#
+#    # Helpers included in all templates by default
+#    standard_helpers:       [Partial, Cache, Form]
+#
+#    # Activated modules from plugins or from the symfony core
+#    enabled_modules:        [default]
+#
+#    # Charset used for the response
+#    charset:                utf-8
+#
+#    # Miscellaneous
+#    strip_comments:         on         # Remove comments in core framework classes as defined in the core_compile.yml
+#    autoloading_functions:  ~          # Functions called when a class is requested and this it is not already loaded. Expects an array of callables. Used by the framework bridges.
+#    timeout:                1800       # Session timeout, in seconds
+#    max_forwards:           5
+#    path_info_array:        SERVER
+#    path_info_key:          PATH_INFO
+#    url_format:             PATH
+#
+#    # ORM
+#    orm:                    propel


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/settings.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/view.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/view.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/view.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,17 @@
+default:
+  http_metas:
+    content-type: text/html
+
+  metas:
+    title:        symfony project
+    robots:       index, follow
+    description:  symfony project
+    keywords:     symfony, project
+    language:     en
+
+  stylesheets:    [main]
+
+  javascripts:    []
+
+  has_layout:     on
+  layout:         layout


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/config/view.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/i18n/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/lib/myUser.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/lib/myUser.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/lib/myUser.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,5 @@
+<?php
+
+class myUser extends sfBasicSecurityUser
+{
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/lib/myUser.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/modules/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/templates/layout.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/templates/layout.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/templates/layout.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+
+<?php include_http_metas() ?>
+<?php include_metas() ?>
+
+<?php include_title() ?>
+
+<link rel="shortcut icon" href="/favicon.ico" />
+
+</head>
+<body>
+
+<?php echo $sf_data->getRaw('sf_content') ?>
+
+</body>
+</html>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/app/templates/layout.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/web/index.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/web/index.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/web/index.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,10 @@
+<?php
+
+define('SF_ROOT_DIR',    realpath(dirname(__FILE__).'/..'));
+define('SF_APP',         '##APP_NAME##');
+define('SF_ENVIRONMENT', 'prod');
+define('SF_DEBUG',       false);
+
+require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
+
+sfContext::getInstance()->getController()->dispatch();


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/web/index.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/web/index_dev.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/web/index_dev.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/web/index_dev.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,10 @@
+<?php
+
+define('SF_ROOT_DIR',    realpath(dirname(__FILE__).'/..'));
+define('SF_APP',         '##APP_NAME##');
+define('SF_ENVIRONMENT', 'dev');
+define('SF_DEBUG',       true);
+
+require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
+
+sfContext::getInstance()->getController()->dispatch();


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/app/web/index_dev.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/batch/default.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/batch/default.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/batch/default.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * ##BATCH_NAME## batch script
+ *
+ * Here goes a brief description of the purpose of the batch script
+ *
+ * @package    ##PROJECT_NAME##
+ * @subpackage batch
+ * @version    $Id$
+ */
+
+define('SF_ROOT_DIR',    realpath(dirname(__file__).'/..'));
+define('SF_APP',         '##APP_NAME##');
+define('SF_ENVIRONMENT', '##ENV_NAME##');
+define('SF_DEBUG',       ##DEBUG##);
+
+require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
+
+// initialize database manager
+//$databaseManager = new sfDatabaseManager();
+//$databaseManager->initialize();
+
+// batch process here


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/batch/default.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/batch/rotate_log.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/batch/rotate_log.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/batch/rotate_log.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * Log rotation batch script
+ *
+ * This script is used to manage log rotation, and should be called automatically by a cron task daily
+ *
+ * @package    ##PROJECT_NAME##
+ * @subpackage batch
+ * @version    $Id: rotate_log.php 3148 2007-01-04 19:34:28Z fabien $
+ */
+
+define('SF_ROOT_DIR',    realpath(dirname(__file__).'/..'));
+define('SF_APP',         '##APP_NAME##');
+define('SF_ENVIRONMENT', '##ENV_NAME##');
+define('SF_DEBUG',       ##DEBUG##);
+
+require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
+
+if (sfConfig::get('sf_logging_enabled') && sfConfig::get('sf_logging_rotate'))
+{
+  sfLogManager::rotate(SF_APP, SF_ENVIRONMENT, sfConfig::get('sf_logging_period'), sfConfig::get('sf_logging_history'));
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/batch/rotate_log.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/controller/controller.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/controller/controller.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/controller/controller.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,10 @@
+<?php
+
+define('SF_ROOT_DIR',    realpath(dirname(__file__).'/..'));
+define('SF_APP',         '##APP_NAME##');
+define('SF_ENVIRONMENT', '##ENV_NAME##');
+define('SF_DEBUG',       ##DEBUG##);
+
+require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
+
+sfContext::getInstance()->getController()->dispatch();


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/controller/controller.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/actions/actions.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/actions/actions.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/actions/actions.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * ##MODULE_NAME## actions.
+ *
+ * @package    ##PROJECT_NAME##
+ * @subpackage ##MODULE_NAME##
+ * @author     ##AUTHOR_NAME##
+ * @version    SVN: $Id: actions.class.php 2692 2006-11-15 21:03:55Z fabien $
+ */
+class ##MODULE_NAME##Actions extends sfActions
+{
+  /**
+   * Executes index action
+   *
+   */
+  public function executeIndex()
+  {
+    $this->forward('default', 'module');
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/actions/actions.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/config/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/lib/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/templates/indexSuccess.php
===================================================================


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/templates/indexSuccess.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/module/validate/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/test/actionsTest.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/test/actionsTest.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/test/actionsTest.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,15 @@
+<?php
+
+include(dirname(__FILE__).'/../../bootstrap/functional.php');
+
+// create a new test browser
+$browser = new sfTestBrowser();
+$browser->initialize();
+
+$browser->
+  get('/##MODULE_NAME##/index')->
+  isStatusCode(200)->
+  isRequestParameter('module', '##MODULE_NAME##')->
+  isRequestParameter('action', 'index')->
+  checkResponseElement('body', '!/This is a temporary page/')
+;


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/module/test/actionsTest.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/apps/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/batch/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/cache/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/config.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/config.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/config.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,5 @@
+<?php
+
+// symfony directories
+$sf_symfony_lib_dir  = '##SYMFONY_LIB_DIR##';
+$sf_symfony_data_dir = '##SYMFONY_DATA_DIR##';


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/config.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/databases.yml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/databases.yml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/databases.yml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,5 @@
+#all:
+#  propel:
+#    class:          sfPropelDatabase
+#    param:
+#      dsn:          mysql://root:@localhost/dbname


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/databases.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/propel.ini
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/propel.ini	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/propel.ini	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,44 @@
+propel.targetPackage       = lib.model
+propel.packageObjectModel  = true
+propel.project             = ##PROJECT_NAME##
+propel.database            = mysql
+propel.database.createUrl  = mysql://localhost/
+propel.database.url        = mysql://localhost/##PROJECT_NAME##
+
+propel.addGenericAccessors = true
+propel.addGenericMutators  = true
+propel.addTimeStamp        = false
+
+propel.schema.validate     = false
+
+; directories
+propel.home                    = .
+propel.output.dir              = ##PROJECT_DIR##
+propel.schema.dir              = ${propel.output.dir}/config
+propel.conf.dir                = ${propel.output.dir}/config
+propel.phpconf.dir             = ${propel.output.dir}/config
+propel.sql.dir                 = ${propel.output.dir}/data/sql
+propel.runtime.conf.file       = runtime-conf.xml
+propel.php.dir                 = ${propel.output.dir}
+propel.default.schema.basename = schema
+propel.datadump.mapper.from    = *schema.xml
+propel.datadump.mapper.to      = *data.xml
+
+; builder settings
+propel.builder.peer.class              = addon.propel.builder.SfPeerBuilder
+propel.builder.object.class            = addon.propel.builder.SfObjectBuilder
+
+propel.builder.objectstub.class        = addon.propel.builder.SfExtensionObjectBuilder
+propel.builder.peerstub.class          = addon.propel.builder.SfExtensionPeerBuilder
+propel.builder.objectmultiextend.class = addon.propel.builder.SfMultiExtendObjectBuilder
+propel.builder.mapbuilder.class        = addon.propel.builder.SfMapBuilderBuilder
+propel.builder.interface.class         = propel.engine.builder.om.php5.PHP5InterfaceBuilder
+propel.builder.node.class              = propel.engine.builder.om.php5.PHP5NodeBuilder
+propel.builder.nodepeer.class          = propel.engine.builder.om.php5.PHP5NodePeerBuilder
+propel.builder.nodestub.class          = propel.engine.builder.om.php5.PHP5ExtensionNodeBuilder
+propel.builder.nodepeerstub.class      = propel.engine.builder.om.php5.PHP5ExtensionNodePeerBuilder
+
+propel.builder.addIncludes = false
+propel.builder.addComments = false
+
+propel.builder.addBehaviors = false

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/properties.ini
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/properties.ini	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/properties.ini	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,2 @@
+[symfony]
+  name=##PROJECT_NAME##

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/rsync_exclude.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/rsync_exclude.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/rsync_exclude.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,4 @@
+.svn
+/web/uploads/*
+/cache/*
+/log/*

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/schema.yml
===================================================================


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/config/schema.yml
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/data/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/data/model/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/data/sql/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/doc/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/lib/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/lib/model/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/log/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/plugins/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/symfony
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/symfony	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/symfony	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,14 @@
+#!/usr/bin/env php
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+chdir(dirname(__FILE__));
+include('config/config.php');
+include($sf_symfony_data_dir.'/bin/symfony.php');

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/bootstrap/functional.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/bootstrap/functional.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/bootstrap/functional.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+// guess current application
+if (!isset($app))
+{
+  $traces = debug_backtrace();
+  $caller = $traces[0];
+  $app = array_pop(explode(DIRECTORY_SEPARATOR, dirname($caller['file'])));
+}
+
+// define symfony constant
+define('SF_ROOT_DIR',    realpath(dirname(__FILE__).'/../..'));
+define('SF_APP',         $app);
+define('SF_ENVIRONMENT', 'test');
+define('SF_DEBUG',       true);
+
+// initialize symfony
+require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
+
+// remove all cache
+sfToolkit::clearDirectory(sfConfig::get('sf_cache_dir'));


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/bootstrap/functional.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/bootstrap/unit.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/bootstrap/unit.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/bootstrap/unit.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,17 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+$_test_dir = realpath(dirname(__FILE__).'/..');
+define('SF_ROOT_DIR', realpath($_test_dir.'/..'));
+
+// symfony directories
+include(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
+
+require_once($sf_symfony_lib_dir.'/vendor/lime/lime.php');


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/bootstrap/unit.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/functional/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/test/unit/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/.htaccess
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/.htaccess	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/.htaccess	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,25 @@
+Options +FollowSymLinks +ExecCGI
+
+<IfModule mod_rewrite.c>
+  RewriteEngine On
+
+  # uncomment the following line, if you are having trouble
+  # getting no_script_name to work
+  #RewriteBase /
+
+  # we skip all files with .something
+  RewriteCond %{REQUEST_URI} \..+$
+  RewriteCond %{REQUEST_URI} !\.html$
+  RewriteRule .* - [L]
+
+  # we check if the .html version is here (caching)
+  RewriteRule ^$ index.html [QSA]
+  RewriteRule ^([^.]+)$ $1.html [QSA]
+  RewriteCond %{REQUEST_FILENAME} !-f
+
+  # no, so we redirect to our front web controller
+  RewriteRule ^(.*)$ index.php [QSA,L]
+</IfModule>
+
+# big crash from our front web controller
+ErrorDocument 500 "<h2>Application error</h2>symfony application failed to start properly"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/css/main.css
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/css/main.css	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/css/main.css	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,27 @@
+ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,body,html,p,blockquote,fieldset,input
+{ margin: 0; padding: 0; }
+a img,:link img,:visited img { border: none; }
+
+a
+{
+  text-decoration: none;
+}
+
+a:hover
+{
+  text-decoration: underline;
+}
+
+body, td
+{
+  margin: 0;
+  padding: 0;
+  font-family: Arial, Verdana, sans-serif;
+  font-size: 11px;
+  background-color: #fff;
+}
+
+body
+{
+  padding: 20px;
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/images/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/js/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/robots.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/robots.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/robots.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,2 @@
+#User-agent: *
+#Disallow:

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/uploads/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/skeleton/project/web/uploads/assets/.sf
===================================================================

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeBase.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeBase.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeBase.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+pake_task('project_exists');
+pake_task('app_exists', 'project_exists');
+pake_task('module_exists', 'app_exists');
+
+function run_project_exists($task, $args)
+{
+  if (!file_exists('symfony'))
+  {
+    throw new Exception('you must be in a symfony project directory');
+  }
+
+  pake_properties('config/properties.ini');
+}
+
+function run_app_exists($task, $args)
+{
+  if (!count($args))
+  {
+    throw new Exception('you must provide your application name');
+  }
+
+  if (!is_dir(getcwd().'/apps/'.$args[0]))
+  {
+    throw new Exception('application "'.$args[0].'" does not exist');
+  }
+}
+
+function run_module_exists($task, $args)
+{
+  if (count($args) < 2)
+  {
+    throw new Exception('you must provide your module name');
+  }
+
+  if (!is_dir(getcwd().'/apps/'.$args[0].'/modules/'.$args[1]))
+  {
+    throw new Exception('module "'.$args[1].'" does not exist');
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeBase.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeEnvironment.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeEnvironment.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeEnvironment.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+pake_desc('synchronise project with another machine');
+pake_task('sync', 'project_exists');
+
+function run_sync($task, $args)
+{
+  if (!count($args))
+  {
+    throw new Exception('You must provide an environment to synchronize.');
+  }
+
+  $env = $args[0];
+
+  $dryrun = isset($args[1]) ? $args[1] : false;
+
+  if (!file_exists('config/rsync_exclude.txt'))
+  {
+    throw new Exception('You must create a rsync_exclude file for your project.');
+  }
+
+  $host = $task->get_property('host', $env);
+  $dir  = $task->get_property('dir', $env);
+  try
+  {
+    $user = $task->get_property('user', $env).'@';
+  }
+  catch (pakeException $e)
+  {
+    $user = '';
+  }
+
+  if (substr($dir, -1) != '/')
+  {
+    $dir .= '/';
+  }
+
+  $ssh = 'ssh';
+
+  try
+  {
+    $port = $task->get_property('port', $env);
+    $ssh = '"ssh -p'.$port.'"';
+  }
+  catch (pakeException $e) {}
+
+  try
+  {
+    $parameters = $task->get_property('parameters', $env);
+  }
+  catch (pakeException $e)
+  {
+    $parameters = '-azC --force --delete';
+    if (file_exists('config/rsync_exclude.txt'))
+    {
+      $parameters .= ' --exclude-from=config/rsync_exclude.txt';
+    }
+
+    if (file_exists('config/rsync_include.txt'))
+    {
+      $parameters .= ' --include-from=config/rsync_include.txt';
+    }
+
+    if (file_exists('config/rsync.txt'))
+    {
+      $parameters .= ' --files-from=config/rsync.txt';
+    }
+  }
+
+  $dry_run = ($dryrun == 'go' || $dryrun == 'ok') ? '' : '--dry-run';
+  $cmd = "rsync --progress $dry_run $parameters -e $ssh ./ $user$host:$dir";
+
+  echo pake_sh($cmd);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeEnvironment.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeGenerator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeGenerator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeGenerator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,284 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+pake_desc('initialize a new symfony project');
+pake_task('init-project');
+pake_alias('new', 'init-project');
+
+pake_desc('initialize a new symfony application');
+pake_task('init-app', 'project_exists');
+pake_alias('app', 'init-app');
+
+pake_desc('initialize a new symfony module');
+pake_task('init-module', 'app_exists');
+pake_alias('module', 'init-module');
+
+pake_desc('initialize a new symfony batch script');
+pake_task('init-batch', 'project_exists');
+pake_alias('batch', 'init-batch');
+
+pake_desc('initialize a new symfony controller script');
+pake_task('init-controller', 'app_exists');
+pake_alias('controller', 'init-controller');
+
+function run_init_project($task, $args)
+{
+  if (file_exists('symfony'))
+  {
+    throw new Exception('A symfony project already exists in this directory.');
+  }
+
+  if (!count($args))
+  {
+    throw new Exception('You must provide a project name.');
+  }
+
+  $project_name = $args[0];
+
+  $sf_root_dir = sfConfig::get('sf_root_dir');
+
+  // create basic project structure
+  $finder = pakeFinder::type('any')->ignore_version_control()->discard('.sf');
+  pake_mirror($finder, sfConfig::get('sf_symfony_data_dir').'/skeleton/project', $sf_root_dir);
+
+  $finder = pakeFinder::type('file')->name('properties.ini', 'apache.conf', 'propel.ini');
+  pake_replace_tokens($finder, $sf_root_dir, '##', '##', array('PROJECT_NAME' => $project_name));
+
+  $finder = pakeFinder::type('file')->name('propel.ini');
+  pake_replace_tokens($finder, $sf_root_dir, '##', '##', array('PROJECT_DIR' => $sf_root_dir));
+
+  // update config/config.php
+  pake_replace_tokens('config.php', sfConfig::get('sf_config_dir'), '##', '##', array(
+    'SYMFONY_LIB_DIR'  => sfConfig::get('sf_symfony_lib_dir'),
+    'SYMFONY_DATA_DIR' => sfConfig::get('sf_symfony_data_dir'),
+  ));
+
+  run_fix_perms($task, $args);
+}
+
+function run_init_app($task, $args)
+{
+  if (!count($args))
+  {
+    throw new Exception('You must provide your application name.');
+  }
+
+  $app = $args[0];
+
+  $sf_root_dir = sfConfig::get('sf_root_dir');
+  $app_dir = $sf_root_dir.'/'.sfConfig::get('sf_apps_dir_name').'/'.$app;
+
+  if (is_dir($app_dir))
+  {
+    throw new Exception(sprintf('The directory "%s" already exists.', $app_dir));
+  }
+
+  // create basic application structure
+  $finder = pakeFinder::type('any')->ignore_version_control()->discard('.sf');
+  pake_mirror($finder, sfConfig::get('sf_symfony_data_dir').'/skeleton/app/app', $app_dir);
+
+  // create $app.php or index.php if it is our first app
+  $index_name = 'index';
+  $first_app = file_exists(sfConfig::get('sf_web_dir').'/index.php') ? false : true;
+  if (!$first_app)
+  {
+    $index_name = $app;
+  }
+
+  // set no_script_name value in settings.yml for production environment
+  $finder = pakeFinder::type('file')->name('settings.yml');
+  pake_replace_tokens($finder, $app_dir.'/'.sfConfig::get('sf_app_config_dir_name'), '##', '##', array('NO_SCRIPT_NAME' => ($first_app ? 'on' : 'off')));
+
+  pake_copy(sfConfig::get('sf_symfony_data_dir').'/skeleton/app/web/index.php', sfConfig::get('sf_web_dir').'/'.$index_name.'.php');
+  pake_copy(sfConfig::get('sf_symfony_data_dir').'/skeleton/app/web/index_dev.php', sfConfig::get('sf_web_dir').'/'.$app.'_dev.php');
+
+  $finder = pakeFinder::type('file')->name($index_name.'.php', $app.'_dev.php');
+  pake_replace_tokens($finder, sfConfig::get('sf_web_dir'), '##', '##', array('APP_NAME' => $app));
+
+  run_fix_perms($task, $args);
+
+  // create test dir
+  pake_mkdirs($sf_root_dir.'/test/functional/'.$app);
+}
+
+function run_init_module($task, $args)
+{
+  if (count($args) < 2)
+  {
+    throw new Exception('You must provide your module name.');
+  }
+
+  $app    = $args[0];
+  $module = $args[1];
+  $sf_root_dir = sfConfig::get('sf_root_dir');
+  $module_dir  = $sf_root_dir.'/'.sfConfig::get('sf_apps_dir_name').'/'.$app.'/'.sfConfig::get('sf_app_module_dir_name').'/'.$module;
+
+  if (is_dir($module_dir))
+  {
+    throw new Exception(sprintf('The directory "%s" already exists.', $module_dir));
+  }
+
+  try
+  {
+    $author_name = $task->get_property('author', 'symfony');
+  }
+  catch (pakeException $e)
+  {
+    $author_name = 'Your name here';
+  }
+
+  $constants = array(
+    'PROJECT_NAME' => $task->get_property('name', 'symfony'),
+    'APP_NAME'     => $app,
+    'MODULE_NAME'  => $module,
+    'AUTHOR_NAME'  => $author_name,
+  );
+
+  if (is_readable(sfConfig::get('sf_data_dir').'/skeleton/module'))
+  {
+    $sf_skeleton_dir = sfConfig::get('sf_data_dir').'/skeleton/module';
+  }
+  else
+  {
+    $sf_skeleton_dir = sfConfig::get('sf_symfony_data_dir').'/skeleton/module';
+  }
+
+  // create basic application structure
+  $finder = pakeFinder::type('any')->ignore_version_control()->discard('.sf');
+  pake_mirror($finder, $sf_skeleton_dir.'/module', $module_dir);
+
+  // create basic test
+  pake_copy($sf_skeleton_dir.'/test/actionsTest.php', $sf_root_dir.'/test/functional/'.$app.'/'.$module.'ActionsTest.php');
+
+  // customize test file
+  pake_replace_tokens($module.'ActionsTest.php', $sf_root_dir.'/test/functional/'.$app, '##', '##', $constants);
+
+  // customize php and yml files
+  $finder = pakeFinder::type('file')->name('*.php', '*.yml');
+  pake_replace_tokens($finder, $module_dir, '##', '##', $constants);
+}
+
+function run_init_batch($task, $args)
+{
+  // handling two required arguments (application and batch name)
+  if (count($args) < 1)
+  {
+    throw new Exception('You must provide the batch skeleton name');
+  }
+
+  // TODO: add finder here to locate batch skeleton locally or in symfony dirs, and send path to skeletons function
+  $batch = '_batch_'.$args[0];
+
+  if (!function_exists($batch))
+  {
+    throw new Exception(sprintf('The specified batch "%s" does not exist.', $args[0]));
+  }
+
+  $batch($task, $args);
+
+  if (!file_exists(sfConfig::get('sf_symfony_data_dir').'/skeleton/batch/'.$args[0].'.php'))
+  {
+    throw new Exception('The skeleton you specified could not be found.');
+  }
+}
+
+function _batch_default($task, $args)
+{
+  if (count($args) < 2)
+  {
+    throw new Exception('You must provide the destination script name');
+  }
+  if (count($args) < 3)
+  {
+    throw new Exception('You must provide the application name');
+  }
+
+  $batch = $args[1];
+  $app   = $args[2];
+
+  // handling two optional arguments (environment and debug)
+  $env   = isset($args[3]) ? $args[3] : 'dev';
+  $debug = isset($args[4]) ? $args[4] : true;
+
+  $constants = array(
+    'PROJECT_NAME' => $task->get_property('name', 'symfony'),
+    'APP_NAME'     => $app,
+    'BATCH_NAME'   => $batch,
+    'ENV_NAME'     => $env,
+    'DEBUG'        => (boolean) $debug,
+  );
+
+  $sf_bin_dir = sfConfig::get('sf_bin_dir');
+
+  pake_copy(sfConfig::get('sf_symfony_data_dir').'/skeleton/batch/default.php', $sf_bin_dir.'/'.$batch.'.php');
+  pake_replace_tokens($batch.'.php', $sf_bin_dir, '##', '##', $constants);
+}
+
+function _batch_rotate_log($task, $args)
+{
+  if (count($args) < 2)
+  {
+    throw new Exception('You must provide the application');
+  }
+  if (count($args) < 3)
+  {
+    throw new Exception('You must provide the environment');
+  }
+
+  $app = $args[1];
+  $env = $args[2];
+  $batch = 'rotate_log_'.$app.'_'.$env;
+
+  // handling two optional arguments (environment and debug)
+  $env   = isset($args[3]) ? $args[3] : 'dev';
+  $debug = isset($args[4]) ? $args[4] : true;
+
+  $constants = array(
+    'PROJECT_NAME' => $task->get_property('name', 'symfony'),
+    'APP_NAME'     => $app,
+    'BATCH_NAME'   => $batch,
+    'ENV_NAME'     => $env,
+    'DEBUG'        => (boolean) $debug,
+  );
+
+  $sf_bin_dir = sfConfig::get('sf_bin_dir');
+
+  pake_copy(sfConfig::get('sf_symfony_data_dir').'/skeleton/batch/rotate_log.php', $sf_bin_dir.'/'.$batch.'.php');
+  pake_replace_tokens($batch.'.php', $sf_bin_dir, '##', '##', $constants);
+}
+
+function run_init_controller($task, $args)
+{
+  // handling two required arguments (application and batch name)
+  if (count($args) < 2)
+  {
+    throw new Exception('You must provide the environment name');
+  }
+
+  $app = $args[0];
+  $env = $args[1];
+
+  // handling two optional arguments (environment and debug)
+  $controller   = isset($args[2]) ? $args[2] : $app.'_'.$env;
+  $debug        = isset($args[3]) ? $args[3] : true;
+
+  $constants = array(
+    'PROJECT_NAME'    => $task->get_property('name', 'symfony'),
+    'APP_NAME'        => $app,
+    'CONTROLLER_NAME' => $controller,
+    'ENV_NAME'        => $env,
+    'DEBUG'           => (boolean) $debug,
+  );
+
+  $sf_web_dir = sfConfig::get('sf_web_dir');
+
+  pake_copy(sfConfig::get('sf_symfony_data_dir').'/skeleton/controller/controller.php', $sf_web_dir.'/'.$controller.'.php');
+  pake_replace_tokens($controller.'.php', $sf_web_dir, '##', '##', $constants);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeGenerator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeMisc.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeMisc.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeMisc.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,338 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+pake_desc('clear cached information');
+pake_task('clear-cache', 'project_exists');
+pake_alias('cc', 'clear-cache');
+
+pake_desc('clear controllers');
+pake_task('clear-controllers', 'project_exists');
+
+pake_desc('fix directories permissions');
+pake_task('fix-perms', 'project_exists');
+
+pake_desc('rotates an applications log files');
+pake_task('log-rotate', 'app_exists');
+
+pake_desc('purges an applications log files');
+pake_task('log-purge', 'project_exists');
+
+pake_desc('enables an application in a given environment');
+pake_task('enable', 'app_exists');
+
+pake_desc('disables an application in a given environment');
+pake_task('disable', 'app_exists');
+
+/**
+ * fixes permissions in a symfony project
+ *
+ * @example symfony fix-perms
+ *
+ * @param object $task
+ * @param array $args
+ */
+function run_fix_perms($task, $args)
+{
+  $sf_root_dir = sfConfig::get('sf_root_dir');
+
+  pake_chmod(sfConfig::get('sf_cache_dir_name'), $sf_root_dir, 0777);
+  pake_chmod(sfConfig::get('sf_log_dir_name'), $sf_root_dir, 0777);
+  pake_chmod(sfConfig::get('sf_web_dir_name').DIRECTORY_SEPARATOR.sfConfig::get('sf_upload_dir_name'), $sf_root_dir, 0777);
+  pake_chmod('symfony', $sf_root_dir, 0777);
+
+  $dirs = array(sfConfig::get('sf_cache_dir_name'), sfConfig::get('sf_web_dir_name').DIRECTORY_SEPARATOR.sfConfig::get('sf_upload_dir_name'), sfConfig::get('sf_log_dir_name'));
+  $dir_finder = pakeFinder::type('dir')->ignore_version_control();
+  $file_finder = pakeFinder::type('file')->ignore_version_control();
+  foreach ($dirs as $dir)
+  {
+    pake_chmod($dir_finder, $dir, 0777);
+    pake_chmod($file_finder, $dir, 0666);
+  }
+}
+
+/**
+ * clears symfony project cache
+ *
+ * @example symfony clear-cache
+ * @example symfony cc
+ *
+ * @param object $task
+ * @param array $args
+ */
+function run_clear_cache($task, $args)
+{
+  if (!file_exists('cache'))
+  {
+    throw new Exception('Cache directory does not exist.');
+  }
+
+  $cache_dir = sfConfig::get('sf_cache_dir_name');
+
+  // app
+  $main_app = '';
+  if (isset($args[0]))
+  {
+    $main_app = $args[0];
+  }
+
+  // type (template, i18n or config)
+  $main_type = '';
+  if (isset($args[1]))
+  {
+    $main_type = $args[1];
+  }
+
+  // declare type that must be cleaned safely (with a lock file during cleaning)
+  $safe_types = array(sfConfig::get('sf_app_config_dir_name'), sfConfig::get('sf_app_i18n_dir_name'));
+
+  // finder to remove all files in a cache directory
+  $finder = pakeFinder::type('file')->ignore_version_control()->discard('.sf');
+
+  // finder to find directories (1 level) in a directory
+  $dir_finder = pakeFinder::type('dir')->ignore_version_control()->discard('.sf')->maxdepth(0)->relative();
+
+  // iterate through applications
+  $apps = array();
+  if ($main_app)
+  {
+    $apps[] = $main_app;
+  }
+  else
+  {
+    $apps = $dir_finder->in($cache_dir);
+  }
+
+  foreach ($apps as $app)
+  {
+    if (!is_dir($cache_dir.'/'.$app))
+    {
+      continue;
+    }
+
+    // remove cache for all environments
+    foreach ($dir_finder->in($cache_dir.'/'.$app) as $env)
+    {
+      // which types?
+      $types = array();
+      if ($main_type)
+      {
+        $types[] = $main_type;
+      }
+      else
+      {
+        $types = $dir_finder->in($cache_dir.'/'.$app.'/'.$env);
+      }
+
+      $sf_root_dir = sfConfig::get('sf_root_dir');
+      foreach ($types as $type)
+      {
+        $sub_dir = $cache_dir.'/'.$app.'/'.$env.'/'.$type;
+
+        if (!is_dir($sub_dir))
+        {
+          continue;
+        }
+
+        // remove cache files
+        if (in_array($type, $safe_types))
+        {
+          $lock_name = $app.'_'.$env;
+          _safe_cache_remove($finder, $sub_dir, $lock_name);
+        }
+        else
+        {
+          pake_remove($finder, $sf_root_dir.'/'.$sub_dir);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * clears all controllers in your web directory other than one running in a produciton environment
+ *
+ * @example symfony clear-controllers
+ *
+ * @param object $task
+ * @param array $args
+ */
+function run_clear_controllers($task, $args)
+{
+  $web_dir = sfConfig::get('sf_web_dir');
+  $app_dir = sfConfig::get('sf_app_dir');
+
+  $apps = count($args) > 1 ? $args : null;
+
+  // get controller
+  $controllers = pakeFinder::type('file')->ignore_version_control()->maxdepth(1)->name('*.php')->in($web_dir);
+
+  foreach ($controllers as $controller)
+  {
+    $contents = file_get_contents($controller);
+    preg_match('/\'SF_APP\',[\s]*\'(.*)\'\)/', $contents, $found_app);
+    preg_match('/\'SF_ENVIRONMENT\',[\s]*\'(.*)\'\)/', $contents, $env);
+
+    // remove file if it has found an application and the environment is not production
+    if (isset($found_app[1]) && isset($env[1]) && $env[1] != 'prod')
+    {
+      pake_remove($controller, '');
+    }
+  }
+}
+
+/**
+ * safely removes directory via pake
+ *
+ * @param object $finder
+ * @param string $sub_dir
+ * @param string $lock_name
+ */
+function _safe_cache_remove($finder, $sub_dir, $lock_name)
+{
+  $sf_root_dir = sfConfig::get('sf_root_dir');
+
+  // create a lock file
+  pake_touch($sf_root_dir.'/'.$lock_name.'.lck', '');
+
+  // change mode so the web user can remove it if we die
+  pake_chmod($lock_name.'.lck', $sf_root_dir, 0777);
+
+  // remove cache files
+  pake_remove($finder, $sf_root_dir.'/'.$sub_dir);
+
+  // release lock
+  pake_remove($sf_root_dir.'/'.$lock_name.'.lck', '');
+}
+
+/**
+ * forces rotation of the given log file
+ *
+ * @example symfony log-rotate
+ *
+ * @param object $task
+ * @param array $args
+ */
+function run_log_rotate($task, $args)
+{
+  // handling two required arguments (application and environment)
+  if (count($args) < 2)
+  {
+    throw new Exception('You must provide the environment of the log to rotate');
+  }
+  $app = $args[0];
+  $env = $args[1];
+
+  // define constants
+  define('SF_ROOT_DIR',    sfConfig::get('sf_root_dir'));
+  define('SF_APP',         $app);
+  define('SF_ENVIRONMENT', $env);
+  define('SF_DEBUG',       true);
+
+  // get configuration
+  require_once SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php';
+
+  sfLogManager::rotate($app, $env, sfConfig::get('sf_logging_period'), sfConfig::get('sf_logging_history'), true);
+}
+
+/**
+ * purges the application log directory as per settings in logging.yml
+ *
+ * @example symfony log-purge
+ *
+ * @param object $task
+ * @param array $args
+ */
+function run_log_purge($task, $args)
+{
+  $sf_symfony_data_dir = sfConfig::get('sf_symfony_data_dir');
+
+  $default_logging = sfYaml::load($sf_symfony_data_dir.'/config/logging.yml');
+  $app_dir = sfConfig::get('sf_app_dir');
+  $apps = pakeFinder::type('dir')->maxdepth(0)->relative()->ignore_version_control()->in('apps');
+  $ignore = array('all', 'default');
+
+  foreach ($apps as $app)
+  {
+    $logging = sfYaml::load($app_dir.'/'.$app.'/config/logging.yml');
+    $logging = array_merge($default_logging, $logging);
+
+    foreach ($logging as $env => $config)
+    {
+      if (in_array($env, $ignore))
+      {
+        continue;
+      }
+      $props = array_merge($default_logging['default'], is_array($config) ? $config : array());
+      $active = isset($props['active']) ? $props['active'] : true;
+      $purge  = isset($props['purge']) ? $props['purge'] : true;
+      if ($active && $purge)
+      {
+        $filename = sfConfig::get('sf_log_dir').'/'.$app.'_'.$env.'.log';
+        if (file_exists($filename))
+        {
+          pake_remove($filename, '');
+        }
+      }
+    }
+  }
+}
+
+function run_enable($task, $args)
+{
+  // handling two required arguments (application and environment)
+  if (count($args) < 2)
+  {
+    throw new Exception('You must provide an environment for the application.');
+  }
+
+  $app = $args[0];
+  $env = $args[1];
+
+  $lockFile = $app.'_'.$env.'.clilock';
+  $locks = pakeFinder::type('file')->prune('.svn')->discard('.svn')->maxdepth(0)->name($lockFile)->relative()->in('./');
+
+  if (file_exists(sfConfig::get('sf_root_dir').'/'.$lockFile))
+  {
+    pake_remove($lockFile, '');
+    run_clear_cache($task, array()); 
+    pake_echo_action('enable', "$app [$env] has been ENABLED");
+
+    return;
+  }
+
+  pake_echo_action('enable', "$app [$env] is currently ENABLED");
+}
+
+function run_disable($task, $args)
+{
+  // handling two required arguments (application and environment)
+  if (count($args) < 2)
+  {
+    throw new Exception('You must provide an environment for the application.');
+  }
+
+  $app = $args[0];
+  $env = $args[1];
+
+  $lockFile = $app.'_'.$env.'.clilock';
+
+  if (!file_exists(sfConfig::get('sf_root_dir').'/'.$lockFile))
+  {
+    pake_touch(sfConfig::get('sf_root_dir').'/'.$lockFile, '777');
+
+    pake_echo_action('enable', "$app [$env] has been DISABLED");
+
+    return;
+  }
+
+  pake_echo_action('enable', "$app [$env] is currently DISABLED");
+
+  return;
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeMisc.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePlugins.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePlugins.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePlugins.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,279 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+pake_desc('install a new plugin');
+pake_task('plugin-install', 'project_exists');
+
+pake_desc('upgrade a plugin');
+pake_task('plugin-upgrade', 'project_exists');
+
+pake_desc('uninstall a plugin');
+pake_task('plugin-uninstall', 'project_exists');
+
+pake_desc('list installed plugins');
+pake_task('plugin-list', 'project_exists');
+
+// symfony plugin-install pluginName
+function run_plugin_install($task, $args)
+{
+  if (!isset($args[0]))
+  {
+    throw new Exception('You must provide the plugin name.');
+  }
+
+  $config = _pear_init();
+
+  // install plugin
+  $packages = array($args[0]);
+  pake_echo_action('plugin', 'installing plugin "'.$args[0].'"');
+  list($ret, $error) = _pear_run_command($config, 'install', array(), $packages);
+
+  if ($error)
+  {
+    throw new Exception($error);
+  }
+
+  _install_web_content(_get_plugin_name($args[0]));
+}
+
+function run_plugin_upgrade($task, $args)
+{
+  if (!isset($args[0]))
+  {
+    throw new Exception('You must provide the plugin name.');
+  }
+
+  $config = _pear_init();
+
+  // upgrade plugin
+  $packages = array($args[0]);
+  pake_echo_action('plugin', 'upgrading plugin "'.$args[0].'"');
+  list($ret, $error) = _pear_run_command($config, 'upgrade', array('loose' => true, 'nodeps' => true), $packages);
+
+  if ($error)
+  {
+    throw new Exception($error);
+  }
+
+  $plugin_name = _get_plugin_name($args[0]);
+  _uninstall_web_content($plugin_name);
+  _install_web_content($plugin_name);
+}
+
+function run_plugin_uninstall($task, $args)
+{
+  if (!isset($args[0]))
+  {
+    throw new Exception('You must provide the plugin name.');
+  }
+
+  _uninstall_web_content(_get_plugin_name($args[0]));
+
+  $config = _pear_init();
+
+  // uninstall plugin
+  $packages = array($args[0]);
+  pake_echo_action('plugin', 'uninstalling plugin "'.$args[0].'"');
+  list($ret, $error) = _pear_run_command($config, 'uninstall', array(), $packages);
+
+  if ($error)
+  {
+    throw new Exception($error);
+  }
+}
+
+function run_plugin_list($task, $args)
+{
+  pake_echo('Installed plugins:');
+
+  $config = _pear_init();
+  $registry = $config->getRegistry();
+  $installed = $registry->packageInfo(null, null, null);
+  foreach ($installed as $channel => $packages)
+  {
+    foreach ($packages as $package)
+    {
+      $pobj = $registry->getPackage(isset($package['package']) ? $package['package'] : $package['name'], $channel);
+      pake_echo(sprintf(" %-40s %10s-%-6s %s", pakeColor::colorize($pobj->getPackage(), 'INFO'), $pobj->getVersion(), $pobj->getState() ? $pobj->getState() : null, pakeColor::colorize(sprintf('# %s (%s)', $channel, $registry->getChannel($channel)->getAlias()), 'COMMENT')));
+    }
+  }
+}
+
+function _pear_run_command($config, $command, $opts, $params)
+{
+  ob_start('_pear_echo_message', 2);
+  $cmd = PEAR_Command::factory($command, $config);
+  $ret = ob_get_clean();
+  if (PEAR::isError($cmd))
+  {
+    throw new Exception($cmd->getMessage());
+  }
+
+  ob_start('_pear_echo_message', 2);
+  $ok   = $cmd->run($command, $opts, $params);
+  $ret .= ob_get_clean();
+
+  $ret = trim($ret);
+
+  return PEAR::isError($ok) ? array($ret, $ok->getMessage()) : array($ret, null);
+}
+
+function _pear_echo_message($message)
+{
+  $t = '';
+  foreach (explode("\n", $message) as $longline)
+  {
+    foreach (explode("\n", wordwrap($longline, 62)) as $line)
+    {
+      if ($line = trim($line))
+      {
+        $t .= pake_format_action('pear', $line);
+      }
+    }
+  }
+
+  return $t;
+}
+
+function _pear_init()
+{
+  require_once 'PEAR.php';
+  require_once 'PEAR/Frontend.php';
+  require_once 'PEAR/Config.php';
+  require_once 'PEAR/Registry.php';
+  require_once 'PEAR/Command.php';
+  require_once 'PEAR/Remote.php';
+
+  // current symfony release
+  $sf_version = preg_replace('/\-\w+$/', '', file_get_contents(sfConfig::get('sf_symfony_lib_dir').'/VERSION'));
+
+  // PEAR
+  PEAR_Command::setFrontendType('CLI');
+  $ui = &PEAR_Command::getFrontendObject();
+
+  // read user/system configuration (don't use the singleton)
+  $config = new PEAR_Config();
+  $config_file = sfConfig::get('sf_plugins_dir').DIRECTORY_SEPARATOR.'.pearrc';
+
+  // change the configuration for symfony use
+  $config->set('php_dir',  sfConfig::get('sf_plugins_dir'));
+  $config->set('data_dir', sfConfig::get('sf_plugins_dir'));
+  $config->set('test_dir', sfConfig::get('sf_plugins_dir'));
+  $config->set('doc_dir',  sfConfig::get('sf_plugins_dir'));
+  $config->set('bin_dir',  sfConfig::get('sf_plugins_dir'));
+
+  // change the PEAR temp dir
+  $config->set('cache_dir',    sfConfig::get('sf_cache_dir'));
+  $config->set('download_dir', sfConfig::get('sf_cache_dir'));
+  $config->set('tmp_dir',      sfConfig::get('sf_cache_dir'));
+
+  // save out configuration file
+  $config->writeConfigFile($config_file, 'user');
+
+  // use our configuration file
+  $config = &PEAR_Config::singleton($config_file);
+
+  $config->set('verbose', 1);
+  $ui->setConfig($config);
+
+  date_default_timezone_set('UTC');
+
+  // register our channel
+  $symfony_channel = array(
+    'attribs' => array(
+      'version' => '1.0',
+      'xmlns' => 'http://pear.php.net/channel-1.0',
+      'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
+      'xsi:schemaLocation' => 'http://pear.php.net/dtd/channel-1.0 http://pear.php.net/dtd/channel-1.0.xsd',
+    ),
+
+    'name' => 'pear.symfony-project.com',
+    'summary' => 'symfony project PEAR channel',
+    'suggestedalias' => 'symfony',
+    'servers' => array(
+      'primary' => array(
+        'rest' => array(
+          'baseurl' => array(
+            array(
+              'attribs' => array('type' => 'REST1.0'),
+              '_content' => 'http://pear.symfony-project.com/Chiara_PEAR_Server_REST/',
+            ),
+            array(
+              'attribs' => array('type' => 'REST1.1'),
+              '_content' => 'http://pear.symfony-project.com/Chiara_PEAR_Server_REST/',
+            ),
+          ),
+        ),
+      ),
+    ),
+    '_lastmodified' => array(
+      'ETag' => "113845-297-dc93f000", 
+      'Last-Modified' => date('r'),
+    ),
+  );
+  pake_mkdirs(sfConfig::get('sf_plugins_dir').'/.channels/.alias');
+  file_put_contents(sfConfig::get('sf_plugins_dir').'/.channels/pear.symfony-project.com.reg', serialize($symfony_channel));
+  file_put_contents(sfConfig::get('sf_plugins_dir').'/.channels/.alias/symfony.txt', 'pear.symfony-project.com');
+
+  // register symfony for dependencies
+  $symfony = array(
+    'name'          => 'symfony',
+    'channel'       => 'pear.symfony-project.com',
+    'date'          => date('Y-m-d'),
+    'time'          => date('H:i:s'),
+    'version'       => array('release' => $sf_version, 'api' => '1.0.0'),
+    'stability'     => array('release' => 'stable', 'api' => 'stable'),
+    'xsdversion'    => '2.0',
+    '_lastmodified' => time(),
+    'old'           => array('version' => $sf_version, 'release_state' => 'stable'),
+  );
+  $dir = sfConfig::get('sf_plugins_dir').DIRECTORY_SEPARATOR.'.registry'.DIRECTORY_SEPARATOR.'.channel.pear.symfony-project.com';
+  pake_mkdirs($dir);
+  file_put_contents($dir.DIRECTORY_SEPARATOR.'symfony.reg', serialize($symfony));
+
+  return $config;
+}
+
+function _get_plugin_name($arg)
+{
+  $plugin_name = (false !== $pos = strrpos($arg, '/')) ? substr($arg, $pos + 1) : $arg;
+  $plugin_name = (false !== $pos = strrpos($plugin_name, '-')) ? substr($plugin_name, 0, $pos) : $plugin_name;
+
+  return $plugin_name;
+}
+
+function _install_web_content($plugin_name)
+{
+  $web_dir = sfConfig::get('sf_plugins_dir').DIRECTORY_SEPARATOR.$plugin_name.DIRECTORY_SEPARATOR.'web';
+  if (is_dir($web_dir))
+  {
+    pake_echo_action('plugin', 'installing web data for plugin');
+    pake_symlink($web_dir, sfConfig::get('sf_web_dir').DIRECTORY_SEPARATOR.$plugin_name, true);
+  }
+}
+
+function _uninstall_web_content($plugin_name)
+{
+  $web_dir = sfConfig::get('sf_plugins_dir').DIRECTORY_SEPARATOR.$plugin_name.DIRECTORY_SEPARATOR.'web';
+  $target_dir = sfConfig::get('sf_web_dir').DIRECTORY_SEPARATOR.$plugin_name;
+  if (is_dir($web_dir) && is_dir($target_dir))
+  {
+    pake_echo_action('plugin', 'uninstalling web data for plugin');
+    if (is_link($target_dir))
+    {
+      pake_remove($target_dir, '');
+    }
+    else
+    {
+      pake_remove(pakeFinder::type('any'), $target_dir);
+      pake_remove($target_dir, '');
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePlugins.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePropel.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePropel.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePropel.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,383 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+pake_desc('create classes for current model');
+pake_task('propel-build-model', 'project_exists');
+
+pake_desc('create sql for current model');
+pake_task('propel-build-sql', 'project_exists');
+
+pake_desc('create schema.xml from existing database');
+pake_task('propel-build-schema', 'project_exists');
+
+pake_desc('create schema.xml from schema.yml');
+pake_task('propel-convert-yml-schema', 'project_exists');
+
+pake_desc('create schema.yml from schema.xml');
+pake_task('propel-convert-xml-schema', 'project_exists');
+
+pake_desc('load data from fixtures directory');
+pake_task('propel-load-data', 'project_exists');
+
+pake_desc('dump data to fixtures directory');
+pake_task('propel-dump-data', 'project_exists');
+
+pake_desc('create database for current model');
+pake_task('propel-build-db', 'project_exists');
+
+pake_desc('insert sql for current model');
+pake_task('propel-insert-sql', 'project_exists');
+
+pake_desc('generate propel model and sql and initialize database');
+pake_task('propel-build-all', 'project_exists');
+
+pake_desc('generate propel model and sql and initialize database, and load data');
+pake_task('propel-build-all-load', 'propel-build-all');
+
+function run_propel_convert_yml_schema($task, $args)
+{
+  _propel_convert_yml_schema(true);
+}
+
+function run_propel_convert_xml_schema($task, $args)
+{
+  _propel_convert_xml_schema(true);
+}
+
+function _propel_convert_yml_schema($check_schema = true, $prefix = '')
+{
+  $finder = pakeFinder::type('file')->name('*schema.yml');
+  $dirs = array('config');
+  if ($pluginDirs = glob(sfConfig::get('sf_root_dir').'/plugins/*/config'))
+  {
+    $dirs = array_merge($dirs, $pluginDirs);
+  }
+  $schemas = $finder->in($dirs);
+  if ($check_schema && !count($schemas))
+  {
+    throw new Exception('You must create a schema.yml file.');
+  }
+
+  $db_schema = new sfPropelDatabaseSchema();
+  foreach ($schemas as $schema)
+  {
+    $db_schema->loadYAML($schema);
+
+    pake_echo_action('schema', 'converting "'.$schema.'"'.' to XML');
+
+    $localprefix = $prefix;
+
+    // change prefix for plugins
+    if (preg_match('#plugins[/\\\\]([^/\\\\]+)[/\\\\]#', $schema, $match))
+    {
+      $localprefix = $prefix.$match[1].'-';
+    }
+
+    // save converted xml files in original directories
+    $xml_file_name = str_replace('.yml', '.xml', basename($schema));
+
+    $file = str_replace(basename($schema), $localprefix.$xml_file_name,  $schema);
+    pake_echo_action('schema', 'putting '.$file);    
+    file_put_contents($file, $db_schema->asXML());
+  }
+}
+
+function _propel_convert_xml_schema($check_schema = true, $prefix = '')
+{
+  $finder = pakeFinder::type('file')->name('*schema.xml');
+
+  $schemas = array_merge($finder->in('config'), $finder->in(glob(sfConfig::get('sf_root_dir').'/plugins/*/config')));
+  if ($check_schema && !count($schemas))
+  {
+    throw new Exception('You must create a schema.xml file.');
+  }
+
+  $db_schema = new sfPropelDatabaseSchema();
+  foreach ($schemas as $schema)
+  {
+    $db_schema->loadXML($schema);
+
+    $localprefix = $prefix;
+
+    // change prefix for plugins
+    if (preg_match('#plugins[/\\\\]([^/\\\\]+)[/\\\\]#', $schema, $match))
+    {
+      $localprefix = $prefix.$match[1].'-';
+    }
+
+    // save converted xml files in original directories
+    $yml_file_name = str_replace('.xml', '.yml', basename($schema));
+    
+    $file = str_replace(basename($schema), $prefix.$yml_file_name,  $schema);
+    pake_echo_action('schema', 'putting '.$file);    
+    file_put_contents($file, $db_schema->asYAML());
+  }
+}
+
+function _propel_copy_xml_schema_from_plugins($prefix = '')
+{
+  $schemas = pakeFinder::type('file')->name('*schema.xml')->in(glob(sfConfig::get('sf_root_dir').'/plugins/*/config'));
+
+  foreach ($schemas as $schema)
+  {
+    // reset local prefix
+    $localprefix = '';
+
+    // change prefix for plugins
+    if (preg_match('#plugins[/\\\\]([^/\\\\]+)[/\\\\]#', $schema, $match))
+    {
+      // if the plugin name is not in the schema filename, add it
+      if (!strstr(basename($schema), $match[1]))
+      {
+        $localprefix = $match[1].'-';
+      }
+    }
+
+    // if the prefix is not in the schema filename, add it
+    if (!strstr(basename($schema), $prefix))
+    {
+      $localprefix = $prefix.$localprefix;
+    }
+
+    pake_copy($schema, 'config'.DIRECTORY_SEPARATOR.$localprefix.basename($schema));
+    if ('' === $localprefix)
+    {
+      pake_remove($schema, '');
+    }
+  }
+}
+
+function run_propel_build_all($task, $args)
+{
+  run_propel_build_model($task, $args);
+  run_propel_build_sql($task, $args);
+  run_propel_insert_sql($task, $args);
+}
+
+function run_propel_build_all_load($task, $args)
+{
+  run_propel_build_all($task, $args);
+  run_propel_load_data($task, $args);
+}
+
+function run_propel_build_model($task, $args)
+{
+  _propel_convert_yml_schema(false, 'generated-');
+  _propel_copy_xml_schema_from_plugins('generated-');
+  _call_phing($task, 'om');
+  $finder = pakeFinder::type('file')->name('generated-*schema.xml');
+  pake_remove($finder, array('config', 'plugins'));
+}
+
+function run_propel_build_sql($task, $args)
+{
+  _propel_convert_yml_schema(false, 'generated-');
+  _propel_copy_xml_schema_from_plugins('generated-');
+  _call_phing($task, 'sql');
+  $finder = pakeFinder::type('file')->name('generated-*schema.xml');
+  pake_remove($finder, 'config');
+}
+
+function run_propel_build_db($task, $args)
+{
+  _call_phing($task, 'create-db', false);
+}
+
+function run_propel_insert_sql($task, $args)
+{
+  _propel_convert_yml_schema(false, 'generated-');
+  _propel_copy_xml_schema_from_plugins('generated-');
+  _call_phing($task, 'insert-sql');
+  $finder = pakeFinder::type('file')->name('generated-*schema.xml');
+  pake_remove($finder, 'config');
+}
+
+function run_propel_build_schema($task, $args)
+{
+  _call_phing($task, 'creole', false);
+
+  // fix database name
+  if (file_exists('config/schema.xml'))
+  {
+    $schema = file_get_contents('config/schema.xml');
+    $schema = preg_replace('/<database\s+name="[^"]+"/s', '<database name="propel"', $schema);
+    file_put_contents('config/schema.xml', $schema);
+  }
+
+  if (!isset($args[0]) || $args[0] != 'xml')
+  {
+    _propel_convert_xml_schema(false, '');
+    $finder = pakeFinder::type('file')->name('schema.xml');
+    pake_remove($finder, 'config');
+  }
+}
+
+/**
+ * Dumps yml database data to fixtures directory.
+ *
+ * @example symfony dump-data frontend data.yml
+ * @example symfony dump-data frontend data.yml dev
+ *
+ * @param object $task
+ * @param array $args
+ */
+function run_propel_dump_data($task, $args)
+{
+  if (!count($args))
+  {
+    throw new Exception('You must provide the app.');
+  }
+
+  $app = $args[0];
+
+  if (!is_dir(sfConfig::get('sf_app_dir').DIRECTORY_SEPARATOR.$app))
+  {
+    throw new Exception('The app "'.$app.'" does not exist.');
+  }
+
+  if (!isset($args[1]))
+  {
+    throw new Exception('You must provide a filename.');
+  }
+
+  $filename = $args[1];
+
+  $env = empty($args[2]) ? 'dev' : $args[2];
+
+  // define constants
+  define('SF_ROOT_DIR',    sfConfig::get('sf_root_dir'));
+  define('SF_APP',         $app);
+  define('SF_ENVIRONMENT', $env);
+  define('SF_DEBUG',       true);
+
+  // get configuration
+  require_once SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php';
+
+  $databaseManager = new sfDatabaseManager();
+  $databaseManager->initialize();
+
+  if (!sfToolkit::isPathAbsolute($filename))
+  {
+    $dir = sfConfig::get('sf_data_dir').DIRECTORY_SEPARATOR.'fixtures';
+    pake_mkdirs($dir);
+    $filename = $dir.DIRECTORY_SEPARATOR.$filename;
+  }
+
+  pake_echo_action('propel', sprintf('dumping data to "%s"', $filename));
+
+  $data = new sfPropelData();
+  $data->dumpData($filename);
+}
+
+/**
+ * Loads yml data from fixtures directory and inserts into database.
+ *
+ * @example symfony load-data frontend
+ * @example symfony load-data frontend dev fixtures append
+ *
+ * @todo replace delete argument with flag -d
+ *
+ * @param object $task
+ * @param array $args
+ */
+function run_propel_load_data($task, $args)
+{
+  if (!count($args))
+  {
+    throw new Exception('You must provide the app.');
+  }
+
+  $app = $args[0];
+
+  if (!is_dir(sfConfig::get('sf_app_dir').DIRECTORY_SEPARATOR.$app))
+  {
+    throw new Exception('The app "'.$app.'" does not exist.');
+  }
+
+  if (count($args) > 1 && $args[count($args) - 1] == 'append')
+  {
+    array_pop($args);
+    $delete = false;
+  }
+  else
+  {
+    $delete = true;
+  }
+
+  $env = empty($args[1]) ? 'dev' : $args[1];
+
+  // define constants
+  define('SF_ROOT_DIR',    sfConfig::get('sf_root_dir'));
+  define('SF_APP',         $app);
+  define('SF_ENVIRONMENT', $env);
+  define('SF_DEBUG',       true);
+
+  // get configuration
+  require_once SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php';
+
+  if (count($args) == 1)
+  {
+    if (!$pluginDirs = glob(sfConfig::get('sf_root_dir').'/plugins/*/data'))
+    {
+      $pluginDirs = array();
+    }
+    $fixtures_dirs = pakeFinder::type('dir')->name('fixtures')->in(array_merge($pluginDirs, array(sfConfig::get('sf_data_dir'))));
+  }
+  else
+  {
+    $fixtures_dirs = array_slice($args, 1);
+  }
+
+  $databaseManager = new sfDatabaseManager();
+  $databaseManager->initialize();
+
+  $data = new sfPropelData();
+  $data->setDeleteCurrentData($delete);
+
+  foreach ($fixtures_dirs as $fixtures_dir)
+  {
+    if (!is_readable($fixtures_dir))
+    {
+      continue;
+    }
+
+    pake_echo_action('propel', sprintf('load data from "%s"', $fixtures_dir));
+    $data->loadData($fixtures_dir);
+  }
+}
+
+function _call_phing($task, $task_name, $check_schema = true)
+{
+  $schemas = pakeFinder::type('file')->name('*schema.xml')->relative()->follow_link()->in('config');
+  if ($check_schema && !$schemas)
+  {
+    throw new Exception('You must create a schema.yml or schema.xml file.');
+  }
+
+  // call phing targets
+  pake_import('Phing', false);
+  if (false === strpos('propel-generator', get_include_path()))
+  {
+    set_include_path(sfConfig::get('sf_symfony_lib_dir').'/vendor/propel-generator/classes'.PATH_SEPARATOR.get_include_path());
+  }
+  set_include_path(sfConfig::get('sf_root_dir').PATH_SEPARATOR.get_include_path());
+
+  // needed to include the right Propel builders
+  set_include_path(sfConfig::get('sf_symfony_lib_dir').PATH_SEPARATOR.get_include_path());
+
+  $options = array(
+    'project.dir'       => sfConfig::get('sf_root_dir').'/config',
+    'build.properties'  => 'propel.ini',
+    'propel.output.dir' => sfConfig::get('sf_root_dir'),
+  );
+  pakePhingTask::call_phing($task, array($task_name), sfConfig::get('sf_symfony_lib_dir').'/vendor/propel-generator/build.xml', $options);
+
+  chdir(sfConfig::get('sf_root_dir'));
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePropel.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePropelAdminGenerator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePropelAdminGenerator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePropelAdminGenerator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+pake_desc('initialize a new propel admin module');
+pake_task('propel-init-admin', 'app_exists');
+
+function run_propel_init_admin($task, $args)
+{
+  if (count($args) < 2)
+  {
+    throw new Exception('You must provide your module name.');
+  }
+
+  if (count($args) < 3)
+  {
+    throw new Exception('You must provide your model class name.');
+  }
+
+  $app         = $args[0];
+  $module      = $args[1];
+  $model_class = $args[2];
+  $theme       = isset($args[3]) ? $args[3] : 'default';
+
+  try
+  {
+    $author_name = $task->get_property('author', 'symfony');
+  }
+  catch (pakeException $e)
+  {
+    $author_name = 'Your name here';
+  }
+
+  $constants = array(
+    'PROJECT_NAME' => $task->get_property('name', 'symfony'),
+    'APP_NAME'     => $app,
+    'MODULE_NAME'  => $module,
+    'MODEL_CLASS'  => $model_class,
+    'AUTHOR_NAME'  => $author_name,
+    'THEME'        => $theme, 
+  );
+
+  $moduleDir = sfConfig::get('sf_root_dir').'/'.sfConfig::get('sf_apps_dir_name').'/'.$app.'/'.sfConfig::get('sf_app_module_dir_name').'/'.$module;
+
+  // create module structure
+  $finder = pakeFinder::type('any')->ignore_version_control()->discard('.sf');
+  $dirs = sfLoader::getGeneratorSkeletonDirs('sfPropelAdmin', $theme);
+  foreach ($dirs as $dir)
+  {
+    if (is_dir($dir))
+    {
+      pake_mirror($finder, $dir, $moduleDir);
+      break;
+    }
+  }
+
+  // customize php and yml files
+  $finder = pakeFinder::type('file')->name('*.php', '*.yml');
+  pake_replace_tokens($finder, $moduleDir, '##', '##', $constants);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePropelAdminGenerator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePropelCrudGenerator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePropelCrudGenerator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePropelCrudGenerator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,134 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+pake_desc('initialize a new propel CRUD module');
+pake_task('propel-init-crud', 'app_exists');
+
+pake_desc('generate a new propel CRUD module');
+pake_task('propel-generate-crud', 'app_exists');
+
+function run_propel_init_crud($task, $args)
+{
+  if (count($args) < 2)
+  {
+    throw new Exception('You must provide your module name.');
+  }
+
+  if (count($args) < 3)
+  {
+    throw new Exception('You must provide your model class name.');
+  }
+
+  $app         = $args[0];
+  $module      = $args[1];
+  $model_class = $args[2];
+
+  try
+  {
+    $author_name = $task->get_property('author', 'symfony');
+  }
+  catch (pakeException $e)
+  {
+    $author_name = 'Your name here';
+  }
+
+  $constants = array(
+    'PROJECT_NAME' => $task->get_property('name', 'symfony'),
+    'APP_NAME'     => $app,
+    'MODULE_NAME'  => $module,
+    'MODEL_CLASS'  => $model_class,
+    'AUTHOR_NAME'  => $author_name,
+  );
+
+  $sf_root_dir = sfConfig::get('sf_root_dir');
+  $moduleDir   = $sf_root_dir.'/'.sfConfig::get('sf_apps_dir_name').'/'.$app.'/'.sfConfig::get('sf_app_module_dir_name').'/'.$module;
+
+  // create basic application structure
+  $finder = pakeFinder::type('any')->ignore_version_control()->discard('.sf');
+  pake_mirror($finder, sfConfig::get('sf_symfony_data_dir').'/generator/sfPropelCrud/default/skeleton', $moduleDir);
+
+  // create basic test
+  pake_copy(sfConfig::get('sf_symfony_data_dir').'/skeleton/module/test/actionsTest.php', $sf_root_dir.'/test/functional/'.$app.'/'.$module.'ActionsTest.php');
+
+  // customize test file
+  pake_replace_tokens($module.'ActionsTest.php', $sf_root_dir.'/test/functional/'.$app, '##', '##', $constants);
+
+  // customize php and yml files
+  $finder = pakeFinder::type('file')->name('*.php', '*.yml');
+  pake_replace_tokens($finder, $moduleDir, '##', '##', $constants);
+}
+
+function run_propel_generate_crud($task, $args)
+{
+  if (count($args) < 2)
+  {
+    throw new Exception('You must provide your module name.');
+  }
+
+  if (count($args) < 3)
+  {
+    throw new Exception('You must provide your model class name.');
+  }
+
+  $theme = isset($args[3]) ? $args[3] : 'default';
+
+  $app         = $args[0];
+  $module      = $args[1];
+  $model_class = $args[2];
+
+  $sf_root_dir = sfConfig::get('sf_root_dir');
+
+  // generate module
+  $tmp_dir = $sf_root_dir.DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR.md5(uniqid(rand(), true));
+  sfConfig::set('sf_module_cache_dir', $tmp_dir);
+  $generator_manager = new sfGeneratorManager();
+  $generator_manager->initialize();
+  $generator_manager->generate('sfPropelCrudGenerator', array('model_class' => $model_class, 'moduleName' => $module, 'theme' => $theme));
+
+  $moduleDir = $sf_root_dir.'/'.sfConfig::get('sf_apps_dir_name').'/'.$app.'/'.sfConfig::get('sf_app_module_dir_name').'/'.$module;
+
+  // copy our generated module
+  $finder = pakeFinder::type('any');
+  pake_mirror($finder, $tmp_dir.'/auto'.ucfirst($module), $moduleDir);
+
+  // change module name
+  pake_replace_tokens($moduleDir.'/actions/actions.class.php', getcwd(), '', '', array('auto'.ucfirst($module) => $module));
+
+  try
+  {
+    $author_name = $task->get_property('author', 'symfony');
+  }
+  catch (pakeException $e)
+  {
+    $author_name = 'Your name here';
+  }
+
+  $constants = array(
+    'PROJECT_NAME' => $task->get_property('name', 'symfony'),
+    'APP_NAME'     => $app,
+    'MODULE_NAME'  => $module,
+    'MODEL_CLASS'  => $model_class,
+    'AUTHOR_NAME'  => $author_name,
+  );
+
+  // customize php and yml files
+  $finder = pakeFinder::type('file')->name('*.php', '*.yml');
+  pake_replace_tokens($finder, $moduleDir, '##', '##', $constants);
+
+  // create basic test
+  pake_copy(sfConfig::get('sf_symfony_data_dir').'/skeleton/module/test/actionsTest.php', $sf_root_dir.'/test/functional/'.$app.'/'.$module.'ActionsTest.php');
+
+  // customize test file
+  pake_replace_tokens($module.'ActionsTest.php', $sf_root_dir.'/test/functional/'.$app, '##', '##', $constants);
+
+  // delete temp files
+  $finder = pakeFinder::type('any');
+  pake_remove($finder, $tmp_dir);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakePropelCrudGenerator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeSymfony.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeSymfony.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeSymfony.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,90 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+pake_desc('freeze symfony libraries');
+pake_task('freeze', 'project_exists');
+
+pake_desc('unfreeze symfony libraries');
+pake_task('unfreeze', 'project_exists');
+
+function run_freeze($task, $args)
+{
+  // check that the symfony librairies are not already freeze for this project
+  if (is_readable('lib/symfony'))
+  {
+    throw new Exception('You can only freeze when lib/symfony is empty.');
+  }
+
+  if (is_readable('data/symfony'))
+  {
+    throw new Exception('You can only freeze when data/symfony is empty.');
+  }
+
+  if (is_readable('web/sf'))
+  {
+    throw new Exception('You can only freeze when web/sf is empty.');
+  }
+
+  if (is_link('web/sf'))
+  {
+    pake_remove('web/sf', '');
+  }
+
+  $symfony_lib_dir  = sfConfig::get('sf_symfony_lib_dir');
+  $symfony_data_dir = sfConfig::get('sf_symfony_data_dir');
+
+  pake_echo_action('freeze', 'freezing lib found in "'.$symfony_lib_dir.'"');
+  pake_echo_action('freeze', 'freezing data found in "'.$symfony_data_dir.'"');
+
+  pake_mkdirs('lib'.DIRECTORY_SEPARATOR.'symfony');
+  pake_mkdirs('data'.DIRECTORY_SEPARATOR.'symfony');
+
+  $finder = pakeFinder::type('any')->ignore_version_control();
+  pake_mirror($finder, $symfony_lib_dir, 'lib/symfony');
+  pake_mirror($finder, $symfony_data_dir, 'data/symfony');
+
+  pake_rename('data/symfony/web/sf', 'web/sf');
+
+  // change symfony paths in config/config.php
+  file_put_contents('config/config.php.bak', "$symfony_lib_dir#$symfony_data_dir");
+  _change_symfony_dirs("dirname(__FILE__).'/../lib/symfony'", "dirname(__FILE__).'/../data/symfony'");
+
+  // install the command line
+  pake_copy($symfony_data_dir.'/bin/symfony.php', 'symfony.php');
+}
+
+function run_unfreeze($task, $args)
+{
+  // remove lib/symfony and data/symfony directories
+  if (!is_dir('lib/symfony'))
+  {
+    throw new Exception('You can unfreeze only if you froze the symfony libraries before.');
+  }
+
+  $dirs = explode('#', file_get_contents('config/config.php.bak'));
+  _change_symfony_dirs('\''.$dirs[0].'\'', '\''.$dirs[1].'\'');
+
+  $finder = pakeFinder::type('any');
+  pake_remove($finder, 'lib/symfony');
+  pake_remove('lib/symfony', '');
+  pake_remove($finder, 'data/symfony');
+  pake_remove('data/symfony', '');
+  pake_remove('symfony.php', '');
+  pake_remove($finder, 'web/sf');
+  pake_remove('web/sf', '');
+}
+
+function _change_symfony_dirs($symfony_lib_dir, $symfony_data_dir)
+{
+  $content = file_get_contents('config/config.php');
+  $content = preg_replace("/^(\s*.sf_symfony_lib_dir\s*=\s*).+?;/m", "$1$symfony_lib_dir;", $content);
+  $content = preg_replace("/^(\s*.sf_symfony_data_dir\s*=\s*).+?;/m", "$1$symfony_data_dir;", $content);
+  file_put_contents('config/config.php', $content);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeSymfony.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeTest.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeTest.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeTest.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,100 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+pake_desc('launch unit tests');
+pake_task('test-unit', 'project_exists');
+
+pake_desc('launch functional tests for an application');
+pake_task('test-functional', 'project_exists');
+
+pake_desc('launch all tests');
+pake_task('test-all', 'project_exists');
+
+function run_test_all($task, $args)
+{
+  require_once(sfConfig::get('sf_symfony_lib_dir').'/vendor/lime/lime.php');
+
+  $h = new lime_harness(new lime_output_color());
+  $h->base_dir = sfConfig::get('sf_test_dir');
+
+  // register all tests
+  $finder = pakeFinder::type('file')->ignore_version_control()->follow_link()->name('*Test.php');
+  $h->register($finder->in($h->base_dir));
+
+  $h->run();
+}
+
+function run_test_functional($task, $args)
+{
+  if (!count($args))
+  {
+    throw new Exception('You must provide the app to test.');
+  }
+
+  $app = $args[0];
+
+  if (!is_dir(sfConfig::get('sf_app_dir').DIRECTORY_SEPARATOR.$app))
+  {
+    throw new Exception(sprintf('The app "%s" does not exist.', $app));
+  }
+
+  if (isset($args[1]))
+  {
+    foreach (array_splice($args, 1) as $path)
+    {
+      $files = pakeFinder::type('file')->ignore_version_control()->follow_link()->name(basename($path).'Test.php')->in(sfConfig::get('sf_test_dir').DIRECTORY_SEPARATOR.'functional'.DIRECTORY_SEPARATOR.$app.DIRECTORY_SEPARATOR.dirname($path));
+      foreach ($files as $file)
+      {
+        include($file);
+      }
+    }
+  }
+  else
+  {
+    require_once(sfConfig::get('sf_symfony_lib_dir').'/vendor/lime/lime.php');
+
+    $h = new lime_harness(new lime_output_color());
+    $h->base_dir = sfConfig::get('sf_test_dir').'/functional/'.$app;
+
+    // register functional tests
+    $finder = pakeFinder::type('file')->ignore_version_control()->follow_link()->name('*Test.php');
+    $h->register($finder->in($h->base_dir));
+
+    $h->run();
+  }
+}
+
+function run_test_unit($task, $args)
+{
+  if (isset($args[0]))
+  {
+    foreach ($args as $path)
+    {
+      $files = pakeFinder::type('file')->ignore_version_control()->follow_link()->name(basename($path).'Test.php')->in(sfConfig::get('sf_test_dir').DIRECTORY_SEPARATOR.'unit'.DIRECTORY_SEPARATOR.dirname($path));
+      foreach ($files as $file)
+      {
+        include($file);
+      }
+    }
+  }
+  else
+  {
+    require_once(sfConfig::get('sf_symfony_lib_dir').'/vendor/lime/lime.php');
+
+    $h = new lime_harness(new lime_output_color());
+    $h->base_dir = sfConfig::get('sf_test_dir').'/unit';
+
+    // register unit tests
+    $finder = pakeFinder::type('file')->ignore_version_control()->follow_link()->name('*Test.php');
+    $h->register($finder->in($h->base_dir));
+
+    $h->run();
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeTest.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeUpgrade.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeUpgrade.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeUpgrade.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,777 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+pake_desc('upgrade to a new symfony release');
+pake_task('upgrade');
+
+pake_desc('downgrade to a previous symfony release');
+pake_task('downgrade', 'project_exists');
+
+function run_downgrade($task, $args)
+{
+  throw new Exception('I have no downgrade script for this release.');
+}
+
+function run_upgrade($task, $args)
+{
+  if (!isset($args[0]))
+  {
+    throw new Exception('You must provide the upgrade script to use (1.0 to upgrade to symfony 1.0 for example).');
+  }
+
+  $version = $args[0];
+
+   if ($version == '1.0')
+   {
+     run_upgrade_1_0($task, $args);
+   }
+   else
+   {
+     throw new Exception('I have no upgrade script for this release.');
+   }
+}
+
+function run_upgrade_1_0($task, $args)
+{
+  // check we have a project
+  if (!file_exists('symfony') && !file_exists('SYMFONY'))
+  {
+    throw new Exception('You must be in a symfony project directory');
+  }
+
+  // upgrade propel.ini
+  _upgrade_1_0_propel_ini();
+
+  // upgrade i18n support
+  _upgrade_1_0_i18n();
+
+  // upgrade model classes
+  _upgrade_1_0_propel_model();
+
+  // migrate activate to enabled
+  _upgrade_1_0_activate();
+
+  // find all applications for this project
+  $apps = pakeFinder::type('directory')->name(sfConfig::get('sf_app_module_dir_name'))->mindepth(1)->maxdepth(1)->relative()->in(sfConfig::get('sf_apps_dir_name'));
+
+  // install symfony CLI
+  if (file_exists(sfConfig::get('sf_root_dir').'/SYMFONY'))
+  {
+    pake_remove(sfConfig::get('sf_root_dir').'/SYMFONY', '');
+  }
+  pake_copy(sfConfig::get('sf_symfony_data_dir').'/skeleton/project/symfony', sfConfig::get('sf_root_dir').'/symfony');
+  pake_chmod('symfony', sfConfig::get('sf_root_dir'), 0777);
+
+  // update schemas
+  _upgrade_1_0_schemas();
+
+  // add bootstrap files for tests
+  _add_1_0_test_bootstraps();
+
+  // upgrade main config.php
+  _upgrade_1_0_main_config_php();
+
+  // upgrade all applications
+  foreach ($apps as $app_module_dir)
+  {
+    $app = str_replace(DIRECTORY_SEPARATOR.sfConfig::get('sf_app_module_dir_name'), '', $app_module_dir);
+    pake_echo_action('upgrade 1.0', pakeColor::colorize(sprintf('upgrading application "%s"', $app), array('fg' => 'cyan')));
+
+    $app_dir = sfConfig::get('sf_apps_dir_name').'/'.$app;
+
+    // upgrade config.php
+    _upgrade_1_0_config_php($app_dir);
+
+    // upgrade filters.yml
+    _upgrade_1_0_filters_yml($app_dir);
+
+    // upgrade all modules
+    $dir = $app_dir.'/'.sfConfig::get('sf_app_module_dir_name');
+    if ($dir)
+    {
+      // template dirs
+      $template_dirs   = pakeFinder::type('directory')->name('templates')->mindepth(1)->maxdepth(1)->in($dir);
+      $template_dirs[] = $app_dir.'/'.sfConfig::get('sf_app_template_dir_name');
+
+      _upgrade_1_0_deprecated_for_templates($template_dirs);
+
+      _upgrade_1_0_date_form_helpers($template_dirs);
+
+      _upgrade_1_0_deprecated_for_generator($app_dir);
+
+      _upgrade_1_0_cache_yml($app_dir);
+
+      // actions dirs
+      $action_dirs = pakeFinder::type('directory')->name('actions')->mindepth(1)->maxdepth(1)->in($dir);
+
+      _upgrade_1_0_deprecated_for_actions($action_dirs);
+
+      // view.yml
+      _upgrade_1_0_view_yml($app_dir);
+
+      _upgrade_1_0_php_files($app_dir);
+    }
+  }
+
+  pake_echo_action('upgrade 1.0', 'done');
+
+  pake_mkdirs(sfConfig::get('sf_root_dir').'/plugins');
+  if (is_dir(sfConfig::get('sf_lib_dir').'/plugins'))
+  {
+    pake_echo_comment('WARNING: you must re-install all your plugins');
+  }
+
+  pake_echo_comment('Now, you must:');
+  pake_echo_comment(' - rebuild your model classes: symfony propel-build-model');
+  pake_echo_comment(' - clear the cache: symfony cc');
+}
+
+function _upgrade_1_0_i18n()
+{
+  $dirs = array(sfConfig::get('sf_lib_dir_name'), sfConfig::get('sf_apps_dir_name'));
+  $finder = pakeFinder::type('file')->name('*.php');
+
+  $seen = false;
+  foreach ($finder->in($dirs) as $php_file)
+  {
+    $content = file_get_contents($php_file);
+
+    $count = 0;
+    $content = str_replace('sfConfig::get(\'sf_i18n_instance\')', 'sfContext::getInstance()->getI18N()', $content, $count);
+
+    if ($count && !$seen)
+    {
+      $seen = true;
+      pake_echo_comment('sfConfig::get(\'sf_i18n_instance\') is deprecated');
+      pake_echo_comment(' use sfContext::getInstance()->getI18N()');
+    }
+
+    if ($count)
+    {
+      file_put_contents($php_file, $content);
+    }
+  }
+}
+
+function _upgrade_1_0_php_files($app_dir)
+{
+  pake_echo_action('upgrade 1.0', 'upgrading sf/ path configuration');
+
+  $php_files = pakeFinder::type('file')->name('*.php')->in($app_dir);
+  foreach ($php_files as $php_file)
+  {
+    $content = file_get_contents($php_file);
+
+    $deprecated = array(
+      "'/sf/js/prototype"     => "sfConfig::get('sf_prototype_web_dir').'/js",
+      "'/sf/css/prototype"    => "sfConfig::get('sf_prototype_web_dir').'/css",
+      "'/sf/js/sf_admin"      => "sfConfig::get('sf_admin_web_dir').'/js",
+      "'/sf/css/sf_admin"     => "sfConfig::get('sf_admin_web_dir').'/css",
+      "'/sf/images/sf_admin"  => "sfConfig::get('sf_admin_web_dir').'/images",
+    );
+    $seen = array();
+    $updated = false;
+    foreach ($deprecated as $old => $new)
+    {
+      $count = 0;
+      $content = str_replace($old, $new, $content, $count);
+      if ($count)
+      {
+        $updated = true;
+      }
+      if ($count && !isset($seen[$old]))
+      {
+        $seen[$old] = true;
+        pake_echo_comment(sprintf('%s is deprecated', $old));
+        pake_echo_comment(sprintf(' use %s', $new));
+      }
+    }
+
+    if ($updated)
+    {
+      file_put_contents($php_file, $content);
+    }
+  }
+}
+
+function _upgrade_1_0_activate()
+{
+  pake_echo_action('upgrade 1.0', 'migrate activate to enabled');
+
+  $config_files = array(
+    'settings.yml' => array(
+      'activated_modules:' => 'enabled_modules:  ',
+    ),
+    'cache.yml' => array(
+      'activate:' => 'enabled: ',
+    ),
+    'logging.yml' => array(
+      'active:' => 'enabled:',
+    ),
+    '*.php' => array(
+      'sf_logging_'.'active' => 'sf_logging_enabled',
+    ),
+    'apps/*/modules/*/validate/*.yml' => array(
+      'activate:' => 'enabled: ',
+    ),
+  );
+  $seen = array();
+  foreach ($config_files as $config_file => $changed)
+  {
+    list($dir, $config_file) = array(dirname($config_file), basename($config_file));
+    $files = pakeFinder::type('file')->name($config_file)->in(sfConfig::get('sf_root_dir').DIRECTORY_SEPARATOR.$dir);
+    foreach ($files as $file)
+    {
+      $content = file_get_contents($file);
+
+      $updated = false;
+      foreach ($changed as $old => $new)
+      {
+        $content = str_replace($old, $new, $content, $count);
+        if ($count)
+        {
+          $updated = true;
+        }
+        if ($count && !isset($seen[$config_file.$old]))
+        {
+          $seen[$config_file.$old] = true;
+
+          pake_echo_comment(sprintf('%s is deprecated in %s', $old, $config_file));
+          pake_echo_comment(sprintf(' use %s', $new));
+        }
+      }
+
+      if ($updated)
+      {
+        file_put_contents($file, $content);
+      }
+    }
+  }
+}
+
+function _upgrade_1_0_view_yml($app_dir)
+{
+  pake_echo_action('upgrade 1.0', 'upgrading view configuration');
+
+  $yml_files = pakeFinder::type('file')->name('*.yml')->in($app_dir);
+  foreach ($yml_files as $yml_file)
+  {
+    $content = file_get_contents($yml_file);
+
+    $deprecated = array(
+      '/sf/js/prototype'     => '%SF_PROTOTYPE_WEB_DIR%/js',
+      '/sf/css/prototype'    => '%SF_PROTOTYPE_WEB_DIR%/css',
+      '/sf/js/sf_admin'      => '%SF_ADMIN_WEB_DIR%/js',
+      '/sf/css/sf_admin'     => '%SF_ADMIN_WEB_DIR%/css',
+      '/sf/images/sf_admin'  => '%SF_ADMIN_WEB_DIR%/images',
+    );
+    $seen = array();
+    $updated = false;
+    foreach ($deprecated as $old => $new)
+    {
+      $count = 0;
+      $content = str_replace($old, $new, $content, $count);
+      if ($count)
+      {
+        $updated = true;
+      }
+      if ($count && !isset($seen[$old]))
+      {
+        $seen[$old] = true;
+        pake_echo_comment(sprintf('%s is deprecated', $old));
+        pake_echo_comment(sprintf(' use %s', $new));
+      }
+    }
+
+    if ($updated)
+    {
+      file_put_contents($yml_file, $content);
+    }
+  }
+}
+
+function _upgrade_1_0_cache_yml($app_dir)
+{
+  pake_echo_action('upgrade 1.0', 'upgrading cache configuration');
+
+  $yml_files = pakeFinder::type('files')->name('cache.yml')->in($app_dir);
+
+  $seen = false;
+  foreach ($yml_files as $yml_file)
+  {
+    $content = file_get_contents($yml_file);
+
+    $count = 0;
+    $updated = false;
+    $content = preg_replace_callback('/type\:(\s*)(.+)$/m', '_upgrade_1_0_cache_yml_callback', $content, -1, $count);
+    if ($count)
+    {
+      $updated = true;
+    }
+    if ($count && !$seen)
+    {
+      $seen = true;
+      pake_echo_comment('"type" has been removed in cache.yml');
+      pake_echo_comment('  read the doc about "with_layout"');
+    }
+
+    if ($updated)
+    {
+      file_put_contents($yml_file, $content);
+    }
+  }
+}
+
+function _upgrade_1_0_cache_yml_callback($match)
+{
+  return 'with_layout:'.str_repeat(' ', max(1, strlen($match[1]) - 6)).(0 === strpos($match[2], 'page') ? 'true' : 'false');
+}
+
+function _upgrade_1_0_deprecated_for_generator($app_dir)
+{
+  pake_echo_action('upgrade 1.0', 'upgrading deprecated helpers in generator.yml');
+
+  $yml_files = pakeFinder::type('files')->name('generator.yml')->in($app_dir);
+
+  $seen = array();
+  $deprecated_str = array(
+    'admin_input_upload_tag' => 'admin_input_file_tag',
+  );
+  foreach ($yml_files as $yml_file)
+  {
+    $updated = false;
+    foreach ($deprecated_str as $old => $new)
+    {
+      $content = file_get_contents($yml_file);
+
+      $count = 0;
+      $content = str_replace($old, $new, $content, $count);
+      if ($count)
+      {
+        $updated = true;
+      }
+      if ($count && !isset($seen[$old]))
+      {
+        $seen[$old] = true;
+        pake_echo_comment(sprintf('%s() has been removed', $old));
+        pake_echo_comment(sprintf(' use %s()', $new));
+      }
+    }
+
+    if ($updated)
+    {
+      file_put_contents($yml_file, $content);
+    }
+  }
+}
+
+function _upgrade_1_0_deprecated_for_actions($action_dirs)
+{
+  pake_echo_action('upgrade 1.0', 'upgrading deprecated methods in actions');
+
+  $php_files = pakeFinder::type('file')->name('*.php')->in($action_dirs);
+  foreach ($php_files as $php_file)
+  {
+    $content = file_get_contents($php_file);
+
+    $deprecated = array(
+      '$this->addHttpMeta'   => '$this->getContext()->getResponse()->addHttpMeta',
+      '$this->addMeta'       => '$this->getContext()->getResponse()->addMeta',
+      '$this->setTitle'      => '$this->getContext()->getResponse()->setTitle',
+      '$this->addStylesheet' => '$this->getContext()->getResponse()->addStylesheet',
+      '$this->addJavascript' => '$this->getContext()->getResponse()->addJavascript',
+    );
+    $seen = array();
+    $updated = false;
+    foreach ($deprecated as $old => $new)
+    {
+      $count = 0;
+      $content = str_replace($old, $new, $content, $count);
+      if ($count)
+      {
+        $updated = true;
+      }
+      if ($count && !isset($seen[$old]))
+      {
+        $seen[$old] = true;
+        pake_echo_comment(sprintf('%s has been removed', $old));
+        pake_echo_comment(sprintf(' use %s', $new));
+      }
+    }
+
+    if ($updated)
+    {
+      file_put_contents($php_file, $content);
+    }
+  }
+}
+
+function _upgrade_1_0_date_form_helpers($template_dirs)
+{
+  pake_echo_action('upgrade 1.0', 'upgrading date form helpers');
+
+  $helpers = array(
+    'select_day_tag', 'select_month_tag', 'select_year_tag', 'select_date_tag', 'select_second_tag', 'select_minute_tag',
+    'select_hour_tag', 'select_ampm_tag', 'select_time_tag', 'select_datetime_tag', 'select_number_tag', 'select_timezone_tag',
+  );
+  $regex = '/('.implode('|', $helpers).')/';
+
+  $php_files = pakeFinder::type('file')->name('*.php')->in($template_dirs);
+  $seen = false;
+  foreach ($php_files as $php_file)
+  {
+    $updated = false;
+
+    $content = file_get_contents($php_file);
+
+    if (preg_match($regex, $content) && false === strpos($content, 'DateForm'))
+    {
+      $content = "<?php use_helper('DateForm') ?>\n\n".$content;
+
+      $updated = true;
+      if (!$seen)
+      {
+        $seen = true;
+
+        pake_echo_comment('date form helpers has been moved to the DateForm helper group');
+        pake_echo_comment(' add use_helper(\'DateForm\')');
+      }
+    }
+
+    if ($updated)
+    {
+      file_put_contents($php_file, $content);
+    }
+  }
+}
+
+function _upgrade_1_0_deprecated_for_templates($template_dirs)
+{
+  pake_echo_action('upgrade 1.0', 'upgrading deprecated helpers');
+
+  $php_files = pakeFinder::type('file')->name('*.php')->in($template_dirs);
+  $seen = array();
+  $deprecated_str = array(
+    'use_helpers'                   => 'use_helper',
+    'object_admin_input_upload_tag' => 'object_admin_input_file_tag',
+    'input_upload_tag'              => 'input_file_tag',
+    '$sf_last_module'               => '$sf_context->getModuleName()',
+    '$sf_last_action'               => '$sf_context->getActionName()',
+    '$sf_first_module'              => '$sf_context->getActionStack()->getFirstEntry()->getModuleName()',
+    '$sf_first_action'              => '$sf_context->getActionStack()->getFirstEntry()->getActionName()',
+  );
+  foreach ($php_files as $php_file)
+  {
+    $content = file_get_contents($php_file);
+
+    $updated = false;
+    $count = 0;
+
+    foreach ($deprecated_str as $old => $new)
+    {
+      $content = str_replace($old, $new, $content, $count);
+      if ($count)
+      {
+        $updated = true;
+      }
+      if ($count && !isset($seen[$old]))
+      {
+        $seen[$old] = true;
+        pake_echo_comment(sprintf('%s has been removed', $old));
+        pake_echo_comment(sprintf(' use %s', $new));
+      }
+    }
+
+    if ($updated)
+    {
+      file_put_contents($php_file, $content);
+    }
+  }
+}
+
+function _upgrade_1_0_config_php($app_dir)
+{
+  pake_echo_action('upgrade 1.0', 'upgrading config.php');
+
+  pake_copy(sfConfig::get('sf_symfony_data_dir').'/skeleton/app/app/config/config.php', $app_dir.DIRECTORY_SEPARATOR.sfConfig::get('sf_config_dir_name').DIRECTORY_SEPARATOR.'config.php');
+}
+
+function _upgrade_1_0_filters_yml($app_dir)
+{
+  pake_echo_action('upgrade 1.0', 'upgrading filters.yml');
+
+  $configFile = $app_dir.DIRECTORY_SEPARATOR.sfConfig::get('sf_config_dir_name').DIRECTORY_SEPARATOR.'filters.yml';
+  $content = file_get_contents($configFile);
+
+  // default symfony filters
+  $default = file_get_contents(sfConfig::get('sf_symfony_data_dir').'/skeleton/app/app/config/filters.yml');
+
+  $placeholder = '# generally, you will want to insert your own filters here';
+
+  // upgrade module filters.yml
+  $seen = false;
+  $yml_files = pakeFinder::type('file')->name('filters.yml')->in($app_dir.DIRECTORY_SEPARATOR.'modules');
+  foreach ($yml_files as $yml_file)
+  {
+    $module_content = file_get_contents($yml_file);
+
+    if (false === strpos($module_content, 'rendering:'))
+    {
+      $lb = (strpos($module_content, "\r\n") !== false) ? "\r\n" : "\n";
+
+      $module_content = str_replace($placeholder, $placeholder.$lb.$content.$lb.$module_content, $default);
+
+      file_put_contents($yml_file, $module_content);
+
+      if (!$seen)
+      {
+        pake_echo_comment('filters.yml now contains core symfony filters');
+      }
+
+      $seen = true;
+    }
+  }
+
+  // upgrade app filters.yml
+  if (false === strpos($content, 'rendering:'))
+  {
+    $lb = (strpos($content, "\r\n") !== false) ? "\r\n" : "\n";
+    $content = str_replace($placeholder, $placeholder.$lb.$content, $default);
+
+    file_put_contents($configFile, $content);
+
+    if (!$seen)
+    {
+      pake_echo_comment('filters.yml now contains core symfony filters');
+    }
+  }
+
+  // upgrade project filters.yml
+  $configFile = sfConfig::get('sf_config_dir').DIRECTORY_SEPARATOR.'filters.yml';
+  if (is_readable($configFile))
+  {
+    $content = file_get_contents($configFile);
+    if (false === strpos($content, 'rendering:'))
+    {
+      $lb = (strpos($content, "\r\n") !== false) ? "\r\n" : "\n";
+      $content = str_replace($placeholder, $placeholder.$lb.$content, $default);
+
+      file_put_contents($configFile, $content);
+
+      if (!$seen)
+      {
+        pake_echo_comment('filters.yml now contains core symfony filters');
+      }
+    }
+  }
+}
+
+function _upgrade_1_0_main_config_php()
+{
+  pake_echo_action('upgrade 1.0', 'upgrading main config.php');
+
+  $content = file_get_contents(sfConfig::get('sf_root_dir').'/config/config.php');
+
+  if (false === strpos($content, 'sf_symfony_lib_dir'))
+  {
+    pake_echo_comment('symfony lib and data dir are now configured in main config.php');
+
+    $lib_dir = sfConfig::get('sf_symfony_lib_dir');
+    $data_dir = sfConfig::get('sf_symfony_data_dir');
+    if (is_link('lib/symfony') && is_link('data/symfony'))
+    {
+      $config = <<<EOF
+
+
+\$sf_symfony_lib_dir  = dirname(__FILE__).'/../lib/symfony';
+\$sf_symfony_data_dir = dirname(__FILE__).'/../data/symfony';
+
+EOF;
+    }
+    else
+    {
+      $config = <<<EOF
+
+
+\$sf_symfony_lib_dir  = '$lib_dir';
+\$sf_symfony_data_dir = '$data_dir';
+
+EOF;
+    }
+
+    $content = preg_replace('/^<\?php/s', '<?php'.$config, $content);
+
+    file_put_contents(sfConfig::get('sf_root_dir').'/config/config.php', $content);
+  }
+}
+
+function _upgrade_1_0_propel_model()
+{
+  pake_echo_action('upgrade 1.0', 'upgrading require in models');
+
+  $seen = false;
+  $php_files = pakeFinder::type('file')->name('*.php')->in(sfConfig::get('sf_lib_dir').'/model');
+  foreach ($php_files as $php_file)
+  {
+    $content = file_get_contents($php_file);
+
+    $count1 = 0;
+    $count2 = 0;
+    $updated = false;
+    $content = str_replace('require_once \'model', 'require_once \'lib/model', $content, $count1);
+    $content = str_replace('include_once \'model', 'include_once \'lib/model', $content, $count2);
+    if ($count1 || $count2)
+    {
+      $updated = true;
+    }
+    if (($count1 || $count2) && !$seen)
+    {
+      $seen = true;
+      pake_echo_comment('model require must be lib/model/...');
+      pake_echo_comment('  instead of model/...');
+    }
+
+    if ($updated)
+    {
+      file_put_contents($php_file, $content);
+    }
+  }
+}
+
+function _upgrade_1_0_schemas()
+{
+  pake_echo_action('upgrade 1.0', 'upgrading schemas');
+
+  $seen = false;
+  $xml_files = pakeFinder::type('file')->name('*schema.xml')->in(sfConfig::get('sf_config_dir'));
+  foreach ($xml_files as $xml_file)
+  {
+    $content = file_get_contents($xml_file);
+
+    if (preg_match('/<database[^>]*package[^>]*>/', $content))
+    {
+      continue;
+    }
+
+    $count = 0;
+    $updated = false;
+    $content = str_replace('<database', '<database package="lib.model"', $content, $count);
+    if ($count)
+    {
+      $updated = true;
+    }
+    if ($count && !$seen)
+    {
+      $seen = true;
+      pake_echo_comment('schema.xml must now have a database package');
+      pake_echo_comment('  default is package="lib.model"');
+    }
+
+    if ($updated)
+    {
+      file_put_contents($xml_file, $content);
+    }
+  }
+}
+
+function _upgrade_1_0_propel_ini()
+{
+  pake_echo_action('upgrade 1.0', 'upgrading propel.ini configuration file');
+
+  $propel_file = sfConfig::get('sf_config_dir').DIRECTORY_SEPARATOR.'propel.ini';
+
+  if (is_readable($propel_file))
+  {
+    $updated = false;
+    $propel_ini = file_get_contents($propel_file);
+
+    $count = 0;
+
+    // new target package (needed for new plugin system)
+    $propel_ini = preg_replace('#propel\.targetPackage(\s*)=(\s*)model#', 'propel.targetPackage$1=$2lib.model', $propel_ini, -1, $count);
+    if ($count)
+    {
+      $updated = true;
+    }
+    $propel_ini = preg_replace('#propel.php.dir(\s*)=(\s*)\${propel.output.dir}/lib#', 'propel.php.dir$1=$2\${propel.output.dir}', $propel_ini, -1, $count);
+    if ($count)
+    {
+      $updated = true;
+    }
+
+    if (false === strpos($propel_ini, 'propel.packageObjectModel'))
+    {
+      $updated = true;
+      $propel_ini = rtrim($propel_ini);
+      $propel_ini .= "\npropel.packageObjectModel = true\n";
+    }
+
+    // new propel builder class to be able to remove require_* and strip comments
+    $propel_ini = str_replace('propel.engine.builder.om.php5.PHP5ExtensionObjectBuilder', 'addon.propel.builder.SfExtensionObjectBuilder', $propel_ini, $count);
+    if ($count)
+    {
+      $updated = true;
+    }
+    $propel_ini = str_replace('propel.engine.builder.om.php5.PHP5ExtensionPeerBuilder', 'addon.propel.builder.SfExtensionPeerBuilder', $propel_ini, $count);
+    if ($count)
+    {
+      $updated = true;
+    }
+    $propel_ini = str_replace('propel.engine.builder.om.php5.PHP5MultiExtendObjectBuilder', 'addon.propel.builder.SfMultiExtendObjectBuilder', $propel_ini, $count);
+    if ($count)
+    {
+      $updated = true;
+    }
+    $propel_ini = str_replace('propel.engine.builder.om.php5.PHP5MapBuilderBuilder', 'addon.propel.builder.SfMapBuilderBuilder', $propel_ini, $count);
+    if ($count)
+    {
+      $updated = true;
+    }
+
+    // replace old symfony.addon.propel path to addon.propel
+    $propel_ini = str_replace('symfony.addon.propel.builder.', 'addon.propel.builder.', $propel_ini, $count);
+    if ($count)
+    {
+      $updated = true;
+    }
+
+    if (false === strpos($propel_ini, 'addIncludes'))
+    {
+      $updated = true;
+      $propel_ini .= <<<EOF
+
+propel.builder.addIncludes  = false
+propel.builder.addComments  = false
+propel.builder.addBehaviors = false
+
+EOF;
+
+      pake_echo_comment('there are 3 new propel.ini options:');
+      pake_echo_comment(' - propel.builder.addIncludes');
+      pake_echo_comment(' - propel.builder.addComments');
+      pake_echo_comment(' - propel.builder.addBehaviors');
+    }
+
+    if ($updated)
+    {
+      file_put_contents($propel_file, $propel_ini);
+    }
+  }
+}
+
+function _add_1_0_test_bootstraps()
+{
+  pake_echo_action('upgrade 1.0', 'add test bootstrap files');
+
+  pake_mkdirs(sfConfig::get('sf_root_dir').'/test/bootstrap');
+
+  pake_copy(sfConfig::get('sf_symfony_data_dir').'/skeleton/project/test/bootstrap/functional.php', sfConfig::get('sf_root_dir').'/test/bootstrap/functional.php');
+  pake_copy(sfConfig::get('sf_symfony_data_dir').'/skeleton/project/test/bootstrap/unit.php', sfConfig::get('sf_root_dir').'/test/bootstrap/unit.php');
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/tasks/sfPakeUpgrade.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/errors/error500.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/errors/error500.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/errors/error500.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<?php $path = sfConfig::get('sf_relative_url_root', preg_replace('#/[^/]+\.php5?$#', '', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : (isset($_SERVER['ORIG_SCRIPT_NAME']) ? $_SERVER['ORIG_SCRIPT_NAME'] : ''))) ?>
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="title" content="symfony project" />
+<meta name="robots" content="index, follow" />
+<meta name="description" content="symfony project" />
+<meta name="keywords" content="symfony, project" />
+<meta name="language" content="en" />
+<title>symfony project</title>
+
+<link rel="shortcut icon" href="/favicon.ico" />
+<link rel="stylesheet" type="text/css" media="screen" href="<?php echo $path ?>/sf/sf_default/css/screen.css" />
+<!--[if lt IE 7.]>
+<link rel="stylesheet" type="text/css" media="screen" href="<?php echo $path ?>/sf/sf_default/css/ie.css" />
+<![endif]-->
+
+</head>
+<body>
+<div class="sfTContainer">
+  <a title="symfony website" href="http://www.symfony-project.com/"><img alt="symfony PHP Framework" class="sfTLogo" src="<?php echo $path ?>/sf/sf_default/images/sfTLogo.png" height="39" width="186" /></a>
+  <div class="sfTMessageContainer sfTAlert">
+    <img alt="page not found" class="sfTMessageIcon" src="<?php echo $path ?>/sf/sf_default/images/icons/tools48.png" height="48" width="48" />
+    <div class="sfTMessageWrap">
+      <h1>Oops! An Error Occurred</h1>
+      <h5>The server returned a "500 Internal Server Error".</h5>
+    </div>
+  </div>
+
+  <dl class="sfTMessageInfo">
+    <dt>Something is broken</dt>
+    <dd>Please e-mail us at [email] and let us know what you were doing when this error occurred. We will fix it as soon as possible.
+    Sorry for any inconvenience caused.</dd>
+
+    <dt>What's next</dt>
+    <dd>
+      <ul class="sfTIconList">
+        <li class="sfTLinkMessage"><a href="javascript:history.go(-1)">Back to previous page</a></li>
+        <li class="sfTLinkMessage"><a href="/">Go to Homepage</a></li>
+      </ul>
+    </dd>
+  </dl>
+</div>
+</body>
+</html>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/errors/error500.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/errors/unavailable.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/errors/unavailable.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/errors/unavailable.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<?php $path = preg_replace('#/[^/]+\.php5?$#', '', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : (isset($_SERVER['ORIG_SCRIPT_NAME']) ? $_SERVER['ORIG_SCRIPT_NAME'] : '')) ?>
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="title" content="symfony project" />
+<meta name="robots" content="index, follow" />
+<meta name="description" content="symfony project" />
+<meta name="keywords" content="symfony, project" />
+<meta name="language" content="en" />
+<title>symfony project</title>
+
+<link rel="shortcut icon" href="/favicon.ico" />
+<link rel="stylesheet" type="text/css" media="screen" href="<?php echo $path ?>/sf/sf_default/css/screen.css" />
+<!--[if lt IE 7.]>
+<link rel="stylesheet" type="text/css" media="screen" href="<?php echo $path ?>/sf/sf_default/css/ie.css" />
+<![endif]-->
+
+</head>
+<body>
+<div class="sfTContainer">
+  <a title="symfony website" href="http://www.symfony-project.com/"><img alt="symfony PHP Framework" class="sfTLogo" src="<?php echo $path ?>/sf/sf_default/images/sfTLogo.png" height="39" width="186" /></a>
+  <div class="sfTMessageContainer sfTAlert">
+    <img alt="page not found" class="sfTMessageIcon" src="<?php echo $path ?>/sf/sf_default/images/icons/tools48.png" height="48" width="48" />
+    <div class="sfTMessageWrap">
+      <h1>Website Temporarily Unavailable</h1>
+      <h5>Please try again in a few seconds...</h5>
+    </div>
+  </div>
+
+  <dl class="sfTMessageInfo">
+    <dt>What's next</dt>
+    <dd>
+      <ul class="sfTIconList">
+        <li class="sfTReloadMessage"><a href="javascript:window.location.reload()">Try again: Reload Page</a></li>
+      </ul>
+    </dd>
+  </dl>
+</div>
+</body>
+</html>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/errors/unavailable.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/calendar-setup.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/calendar-setup.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/calendar-setup.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,203 @@
+/*  Copyright Mihai Bazon, 2002, 2003  |  http://dynarch.com/mishoo/
+ * ---------------------------------------------------------------------------
+ *
+ * The DHTML Calendar
+ *
+ * Details and latest version at:
+ * http://dynarch.com/mishoo/calendar.epl
+ *
+ * This script is distributed under the GNU Lesser General Public License.
+ * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
+ *
+ * This file defines helper functions for setting up the calendar.  They are
+ * intended to help non-programmers get a working calendar on their site
+ * quickly.  This script should not be seen as part of the calendar.  It just
+ * shows you what one can do with the calendar, while in the same time
+ * providing a quick and simple method for setting it up.  If you need
+ * exhaustive customization of the calendar creation process feel free to
+ * modify this code to suit your needs (this is recommended and much better
+ * than modifying calendar.js itself).
+ */
+
+// $Id: calendar-setup.js 3016 2006-12-11 12:49:54Z chtito $
+
+/**
+ *  This function "patches" an input field (or other element) to use a calendar
+ *  widget for date selection.
+ *
+ *  The "params" is a single object that can have the following properties:
+ *
+ *    prop. name   | description
+ *  -------------------------------------------------------------------------------------------------
+ *   inputField    | the ID of an input field to store the date
+ *   displayArea   | the ID of a DIV or other element to show the date
+ *   button        | ID of a button or other element that will trigger the calendar
+ *   eventName     | event that will trigger the calendar, without the "on" prefix (default: "click")
+ *   ifFormat      | date format that will be stored in the input field
+ *   daFormat      | the date format that will be used to display the date in displayArea
+ *   singleClick   | (true/false) wether the calendar is in single click mode or not (default: true)
+ *   firstDay      | numeric: 0 to 6.  "0" means display Sunday first, "1" means display Monday first, etc.
+ *   align         | alignment (default: "Br"); if you don't know what's this see the calendar documentation
+ *   range         | array with 2 elements.  Default: [1900, 2999] -- the range of years available
+ *   weekNumbers   | (true/false) if it's true (default) the calendar will display week numbers
+ *   flat          | null or element ID; if not null the calendar will be a flat calendar having the parent with the given ID
+ *   flatCallback  | function that receives a JS Date object and returns an URL to point the browser to (for flat calendar)
+ *   disableFunc   | function that receives a JS Date object and should return true if that date has to be disabled in the calendar
+ *   onSelect      | function that gets called when a date is selected.  You don't _have_ to supply this (the default is generally okay)
+ *   onClose       | function that gets called when the calendar is closed.  [default]
+ *   onUpdate      | function that gets called after the date is updated in the input field.  Receives a reference to the calendar.
+ *   date          | the date that the calendar will be initially displayed to
+ *   showsTime     | default: false; if true the calendar will include a time selector
+ *   timeFormat    | the time format; can be "12" or "24", default is "12"
+ *   electric      | if true (default) then given fields/date areas are updated for each move; otherwise they're updated only on close
+ *   step          | configures the step of the years in drop-down boxes; default: 2
+ *   position      | configures the calendar absolute position; default: null
+ *   cache         | if "true" (but default: "false") it will reuse the same calendar object, where possible
+ *   showOthers    | if "true" (but default: "false") it will show days from other months too
+ *
+ *  None of them is required, they all have default values.  However, if you
+ *  pass none of "inputField", "displayArea" or "button" you'll get a warning
+ *  saying "nothing to setup".
+ */
+Calendar.setup = function (params) {
+	function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } };
+
+	param_default("inputField",      null);
+	param_default("displayArea",     null);
+	param_default("button",          null);
+	param_default("eventName",       "click");
+	param_default("ifFormat",        "%Y/%m/%d");
+	param_default("daFormat",        "%Y/%m/%d");
+	param_default("singleClick",     true);
+	param_default("disableFunc",     null);
+	param_default("dateStatusFunc",  params["disableFunc"]);	// takes precedence if both are defined
+	param_default("dateTooltipFunc", null);
+	param_default("dateText",        null);
+	param_default("firstDay",        null);
+	param_default("align",           "Br");
+	param_default("range",           [0000, 2999]);
+	param_default("weekNumbers",     true);
+	param_default("flat",            null);
+	param_default("flatCallback",    null);
+	param_default("onSelect",        null);
+	param_default("onClose",         null);
+	param_default("onUpdate",        null);
+	param_default("date",            null);
+	param_default("showsTime",       false);
+	param_default("timeFormat",      "24");
+	param_default("electric",        true);
+	param_default("step",            2);
+	param_default("position",        null);
+	param_default("cache",           false);
+	param_default("showOthers",      false);
+	param_default("multiple",        null);
+
+	var tmp = ["inputField", "displayArea", "button"];
+	for (var i in tmp) {
+		if (typeof params[tmp[i]] == "string") {
+			params[tmp[i]] = document.getElementById(params[tmp[i]]);
+		}
+	}
+	if (!(params.flat || params.multiple || params.inputField || params.displayArea || params.button)) {
+		alert("Calendar.setup:\n  Nothing to setup (no fields found).  Please check your code");
+		return false;
+	}
+
+	function onSelect(cal) {
+		var p = cal.params;
+		var update = (cal.dateClicked || p.electric);
+		if (update && p.inputField) {
+			p.inputField.value = cal.date.print(p.ifFormat);
+			if (typeof p.inputField.onchange == "function")
+				p.inputField.onchange();
+		}
+		if (update && p.displayArea)
+			p.displayArea.innerHTML = cal.date.print(p.daFormat);
+		if (update && typeof p.onUpdate == "function")
+			p.onUpdate(cal);
+		if (update && p.flat) {
+			if (typeof p.flatCallback == "function")
+				p.flatCallback(cal);
+		}
+		if (update && p.singleClick && cal.dateClicked)
+			cal.callCloseHandler();
+	};
+
+	if (params.flat != null) {
+		if (typeof params.flat == "string")
+			params.flat = document.getElementById(params.flat);
+		if (!params.flat) {
+			alert("Calendar.setup:\n  Flat specified but can't find parent.");
+			return false;
+		}
+		var cal = new Calendar(params.firstDay, params.date, params.onSelect || onSelect);
+		cal.setDateToolTipHandler(params.dateTooltipFunc);
+		cal.showsOtherMonths = params.showOthers;
+		cal.showsTime = params.showsTime;
+		cal.time24 = (params.timeFormat == "24");
+		cal.params = params;
+		cal.weekNumbers = params.weekNumbers;
+		cal.setRange(params.range[0], params.range[1]);
+		cal.setDateStatusHandler(params.dateStatusFunc);
+		cal.getDateText = params.dateText;
+		if (params.ifFormat) {
+			cal.setDateFormat(params.ifFormat);
+		}
+		if (params.inputField && typeof params.inputField.value == "string") {
+			cal.parseDate(params.inputField.value);
+		}
+		cal.create(params.flat);
+		cal.show();
+		return false;
+	}
+
+	var triggerEl = params.button || params.displayArea || params.inputField;
+	triggerEl["on" + params.eventName] = function() {
+		var dateEl = params.inputField || params.displayArea;
+		var dateFmt = params.inputField ? params.ifFormat : params.daFormat;
+		var mustCreate = false;
+		var cal = window.calendar;
+		if (dateEl)
+			params.date = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt);
+		if (!(cal && params.cache)) {
+			window.calendar = cal = new Calendar(params.firstDay,
+							     params.date,
+							     params.onSelect || onSelect,
+							     params.onClose || function(cal) { cal.hide(); });
+			cal.setDateToolTipHandler(params.dateTooltipFunc);
+			cal.showsTime = params.showsTime;
+			cal.time24 = (params.timeFormat == "24");
+			cal.weekNumbers = params.weekNumbers;
+			mustCreate = true;
+		} else {
+			if (params.date)
+				cal.setDate(params.date);
+			cal.hide();
+		}
+		if (params.multiple) {
+			cal.multiple = {};
+			for (var i = params.multiple.length; --i >= 0;) {
+				var d = params.multiple[i];
+				var ds = d.print("%Y%m%d");
+				cal.multiple[ds] = d;
+			}
+		}
+		cal.showsOtherMonths = params.showOthers;
+		cal.yearStep = params.step;
+		cal.setRange(params.range[0], params.range[1]);
+		cal.params = params;
+		cal.setDateStatusHandler(params.dateStatusFunc);
+		cal.getDateText = params.dateText;
+		cal.setDateFormat(dateFmt);
+		if (mustCreate)
+			cal.create();
+		cal.refresh();
+		if (!params.position)
+			cal.showAtElement(params.button || params.displayArea || params.inputField, params.align);
+		else
+			cal.showAt(params.position[0], params.position[1]);
+		return false;
+	};
+
+	return cal;
+};

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/calendar-system.css
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/calendar-system.css	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/calendar-system.css	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,252 @@
+/* The main calendar widget.  DIV containing a table. */
+
+.calendar {
+  position: relative;
+  display: none;
+  border: 1px solid;
+  border-color: #fff #000 #000 #fff;
+  font-size: 11px;
+  cursor: default;
+  background: Window;
+  color: WindowText;
+  font-family: tahoma,verdana,sans-serif;
+  z-index: 10;
+}
+
+.calendar table {
+  border: 1px solid;
+  border-color: #fff #000 #000 #fff;
+  font-size: 11px;
+  cursor: default;
+  background: Window;
+  color: WindowText;
+  font-family: tahoma,verdana,sans-serif;
+}
+
+/* Header part -- contains navigation buttons and day names. */
+
+.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
+  text-align: center;
+  padding: 1px;
+  border: 1px solid;
+  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
+  background: ButtonFace;
+}
+
+.calendar .nav {
+  background: ButtonFace url(menuarrow.gif) no-repeat 100% 100%;
+}
+
+.calendar thead .title { /* This holds the current "month, year" */
+  font-weight: bold;
+  padding: 1px;
+  border: 1px solid #000;
+  background: ActiveCaption;
+  color: CaptionText;
+  text-align: center;
+}
+
+.calendar thead .headrow { /* Row <TR> containing navigation buttons */
+}
+
+.calendar thead .daynames { /* Row <TR> containing the day names */
+}
+
+.calendar thead .name { /* Cells <TD> containing the day names */
+  border-bottom: 1px solid ButtonShadow;
+  padding: 2px;
+  text-align: center;
+  background: ButtonFace;
+  color: ButtonText;
+}
+
+.calendar thead .weekend { /* How a weekend day name shows in header */
+  color: #f00;
+}
+
+.calendar thead .hilite { /* How do the buttons in header appear when hover */
+  border: 2px solid;
+  padding: 0px;
+  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
+}
+
+.calendar thead .active { /* Active (pressed) buttons in header */
+  border-width: 1px;
+  padding: 2px 0px 0px 2px;
+  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
+}
+
+/* The body part -- contains all the days in month. */
+
+.calendar tbody .day { /* Cells <TD> containing month days dates */
+  width: 2em;
+  text-align: right;
+  padding: 2px 4px 2px 2px;
+}
+.calendar tbody .day.othermonth {
+  font-size: 80%;
+  color: #aaa;
+}
+.calendar tbody .day.othermonth.oweekend {
+  color: #faa;
+}
+
+.calendar table .wn {
+  padding: 2px 3px 2px 2px;
+  border-right: 1px solid ButtonShadow;
+  background: ButtonFace;
+  color: ButtonText;
+}
+
+.calendar tbody .rowhilite td {
+  background: Highlight;
+  color: HighlightText;
+}
+
+.calendar tbody td.hilite { /* Hovered cells <TD> */
+  padding: 1px 3px 1px 1px;
+  border-top: 1px solid #fff;
+  border-right: 1px solid #000;
+  border-bottom: 1px solid #000;
+  border-left: 1px solid #fff;
+}
+
+.calendar tbody td.active { /* Active (pressed) cells <TD> */
+  padding: 2px 2px 0px 2px;
+  border: 1px solid;
+  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
+}
+
+.calendar tbody td.selected { /* Cell showing selected date */
+  font-weight: bold;
+  border: 1px solid;
+  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
+  padding: 2px 2px 0px 2px;
+  background: ButtonFace;
+  color: ButtonText;
+}
+
+.calendar tbody td.weekend { /* Cells showing weekend days */
+  color: #f00;
+}
+
+.calendar tbody td.today { /* Cell showing today date */
+  font-weight: bold;
+  color: #00f;
+}
+
+.calendar tbody td.disabled { color: GrayText; }
+
+.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
+  visibility: hidden;
+}
+
+.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
+  display: none;
+}
+
+/* The footer part -- status bar and "Close" button */
+
+.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
+}
+
+.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
+  background: ButtonFace;
+  padding: 1px;
+  border: 1px solid;
+  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
+  color: ButtonText;
+  text-align: center;
+}
+
+.calendar tfoot .hilite { /* Hover style for buttons in footer */
+  border-top: 1px solid #fff;
+  border-right: 1px solid #000;
+  border-bottom: 1px solid #000;
+  border-left: 1px solid #fff;
+  padding: 1px;
+  background: #e4e0d8;
+}
+
+.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
+  padding: 2px 0px 0px 2px;
+  border-top: 1px solid #000;
+  border-right: 1px solid #fff;
+  border-bottom: 1px solid #fff;
+  border-left: 1px solid #000;
+}
+
+/* Combo boxes (menus that display months/years for direct selection) */
+
+.calendar .combo {
+  position: absolute;
+  display: none;
+  width: 4em;
+  top: 0px;
+  left: 0px;
+  cursor: default;
+  border: 1px solid;
+  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
+  background: Menu;
+  color: MenuText;
+  font-size: 90%;
+  padding: 1px;
+  z-index: 100;
+}
+
+.calendar .combo .label,
+.calendar .combo .label-IEfix {
+  text-align: center;
+  padding: 1px;
+}
+
+.calendar .combo .label-IEfix {
+  width: 4em;
+}
+
+.calendar .combo .active {
+  padding: 0px;
+  border: 1px solid #000;
+}
+
+.calendar .combo .hilite {
+  background: Highlight;
+  color: HighlightText;
+}
+
+.calendar td.time {
+  border-top: 1px solid ButtonShadow;
+  padding: 1px 0px;
+  text-align: center;
+  background-color: ButtonFace;
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute,
+.calendar td.time .ampm {
+  padding: 0px 3px 0px 4px;
+  border: 1px solid #889;
+  font-weight: bold;
+  background-color: Menu;
+}
+
+.calendar td.time .ampm {
+  text-align: center;
+}
+
+.calendar td.time .colon {
+  padding: 0px 2px 0px 3px;
+  font-weight: bold;
+}
+
+.calendar td.time span.hilite {
+  border-color: #000;
+  background-color: Highlight;
+  color: HighlightText;
+}
+
+.calendar td.time span.active {
+  border-color: #f00;
+  background-color: #000;
+  color: #0f0;
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/calendar.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/calendar.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/calendar.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1809 @@
+/*  Copyright Mihai Bazon, 2002-2005  |  www.bazon.net/mishoo
+ * -----------------------------------------------------------
+ *
+ * The DHTML Calendar, version 1.0 "It is happening again"
+ *
+ * Details and latest version at:
+ * www.dynarch.com/projects/calendar
+ *
+ * This script is developed by Dynarch.com.  Visit us at www.dynarch.com.
+ *
+ * This script is distributed under the GNU Lesser General Public License.
+ * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
+ */
+
+// $Id: calendar.js 3060 2006-12-17 06:06:52Z chtito $
+
+/** The Calendar object constructor. */
+Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) {
+	// member variables
+	this.activeDiv = null;
+	this.currentDateEl = null;
+	this.getDateStatus = null;
+	this.getDateToolTip = null;
+	this.getDateText = null;
+	this.timeout = null;
+	this.onSelected = onSelected || null;
+	this.onClose = onClose || null;
+	this.dragging = false;
+	this.hidden = false;
+	this.minYear = 1970;
+	this.maxYear = 2050;
+	this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"];
+	this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"];
+	this.isPopup = true;
+	this.weekNumbers = true;
+	this.firstDayOfWeek = typeof firstDayOfWeek == "number" ? firstDayOfWeek : Calendar._FD; // 0 for Sunday, 1 for Monday, etc.
+	this.showsOtherMonths = false;
+	this.dateStr = dateStr;
+	this.ar_days = null;
+	this.showsTime = false;
+	this.time24 = true;
+	this.yearStep = 2;
+	this.hiliteToday = true;
+	this.multiple = null;
+	// HTML elements
+	this.table = null;
+	this.element = null;
+	this.tbody = null;
+	this.firstdayname = null;
+	// Combo boxes
+	this.monthsCombo = null;
+	this.yearsCombo = null;
+	this.hilitedMonth = null;
+	this.activeMonth = null;
+	this.hilitedYear = null;
+	this.activeYear = null;
+	// Information
+	this.dateClicked = false;
+
+	// one-time initializations
+	if (typeof Calendar._SDN == "undefined") {
+		// table of short day names
+		if (typeof Calendar._SDN_len == "undefined")
+			Calendar._SDN_len = 3;
+		var ar = new Array();
+		for (var i = 8; i > 0;) {
+			ar[--i] = Calendar._DN[i].substr(0, Calendar._SDN_len);
+		}
+		Calendar._SDN = ar;
+		// table of short month names
+		if (typeof Calendar._SMN_len == "undefined")
+			Calendar._SMN_len = 3;
+		ar = new Array();
+		for (var i = 12; i > 0;) {
+			ar[--i] = Calendar._MN[i].substr(0, Calendar._SMN_len);
+		}
+		Calendar._SMN = ar;
+	}
+};
+
+// ** constants
+
+/// "static", needed for event handlers.
+Calendar._C = null;
+
+/// detect a special case of "web browser"
+Calendar.is_ie = ( /msie/i.test(navigator.userAgent) &&
+		   !/opera/i.test(navigator.userAgent) );
+
+Calendar.is_ie5 = ( Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent) );
+
+/// detect Opera browser
+Calendar.is_opera = /opera/i.test(navigator.userAgent);
+
+/// detect KHTML-based browsers
+Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
+
+// BEGIN: UTILITY FUNCTIONS; beware that these might be moved into a separate
+//        library, at some point.
+
+Calendar.getAbsolutePos = function(el) {
+	var SL = 0, ST = 0;
+	var is_div = /^div$/i.test(el.tagName);
+	if (is_div && el.scrollLeft)
+		SL = el.scrollLeft;
+	if (is_div && el.scrollTop)
+		ST = el.scrollTop;
+	var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
+	if (el.offsetParent) {
+		var tmp = this.getAbsolutePos(el.offsetParent);
+		r.x += tmp.x;
+		r.y += tmp.y;
+	}
+	return r;
+};
+
+Calendar.isRelated = function (el, evt) {
+	var related = evt.relatedTarget;
+	if (!related) {
+		var type = evt.type;
+		if (type == "mouseover") {
+			related = evt.fromElement;
+		} else if (type == "mouseout") {
+			related = evt.toElement;
+		}
+	}
+	while (related) {
+		if (related == el) {
+			return true;
+		}
+		related = related.parentNode;
+	}
+	return false;
+};
+
+Calendar.removeClass = function(el, className) {
+	if (!(el && el.className)) {
+		return;
+	}
+	var cls = el.className.split(" ");
+	var ar = new Array();
+	for (var i = cls.length; i > 0;) {
+		if (cls[--i] != className) {
+			ar[ar.length] = cls[i];
+		}
+	}
+	el.className = ar.join(" ");
+};
+
+Calendar.addClass = function(el, className) {
+	Calendar.removeClass(el, className);
+	el.className += " " + className;
+};
+
+// FIXME: the following 2 functions totally suck, are useless and should be replaced immediately.
+Calendar.getElement = function(ev) {
+	var f = Calendar.is_ie ? window.event.srcElement : ev.currentTarget;
+	while (f.nodeType != 1 || /^div$/i.test(f.tagName))
+		f = f.parentNode;
+	return f;
+};
+
+Calendar.getTargetElement = function(ev) {
+	var f = Calendar.is_ie ? window.event.srcElement : ev.target;
+	while (f.nodeType != 1)
+		f = f.parentNode;
+	return f;
+};
+
+Calendar.stopEvent = function(ev) {
+	ev || (ev = window.event);
+	if (Calendar.is_ie) {
+		ev.cancelBubble = true;
+		ev.returnValue = false;
+	} else {
+		ev.preventDefault();
+		ev.stopPropagation();
+	}
+	return false;
+};
+
+Calendar.addEvent = function(el, evname, func) {
+	if (el.attachEvent) { // IE
+		el.attachEvent("on" + evname, func);
+	} else if (el.addEventListener) { // Gecko / W3C
+		el.addEventListener(evname, func, true);
+	} else {
+		el["on" + evname] = func;
+	}
+};
+
+Calendar.removeEvent = function(el, evname, func) {
+	if (el.detachEvent) { // IE
+		el.detachEvent("on" + evname, func);
+	} else if (el.removeEventListener) { // Gecko / W3C
+		el.removeEventListener(evname, func, true);
+	} else {
+		el["on" + evname] = null;
+	}
+};
+
+Calendar.createElement = function(type, parent) {
+	var el = null;
+	if (document.createElementNS) {
+		// use the XHTML namespace; IE won't normally get here unless
+		// _they_ "fix" the DOM2 implementation.
+		el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
+	} else {
+		el = document.createElement(type);
+	}
+	if (typeof parent != "undefined") {
+		parent.appendChild(el);
+	}
+	return el;
+};
+
+// END: UTILITY FUNCTIONS
+
+// BEGIN: CALENDAR STATIC FUNCTIONS
+
+/** Internal -- adds a set of events to make some element behave like a button. */
+Calendar._add_evs = function(el) {
+	with (Calendar) {
+		addEvent(el, "mouseover", dayMouseOver);
+		addEvent(el, "mousedown", dayMouseDown);
+		addEvent(el, "mouseout", dayMouseOut);
+		if (is_ie) {
+			addEvent(el, "dblclick", dayMouseDblClick);
+			el.setAttribute("unselectable", true);
+		}
+	}
+};
+
+Calendar.findMonth = function(el) {
+	if (typeof el.month != "undefined") {
+		return el;
+	} else if (typeof el.parentNode.month != "undefined") {
+		return el.parentNode;
+	}
+	return null;
+};
+
+Calendar.findYear = function(el) {
+	if (typeof el.year != "undefined") {
+		return el;
+	} else if (typeof el.parentNode.year != "undefined") {
+		return el.parentNode;
+	}
+	return null;
+};
+
+Calendar.showMonthsCombo = function () {
+	var cal = Calendar._C;
+	if (!cal) {
+		return false;
+	}
+	var cal = cal;
+	var cd = cal.activeDiv;
+	var mc = cal.monthsCombo;
+	if (cal.hilitedMonth) {
+		Calendar.removeClass(cal.hilitedMonth, "hilite");
+	}
+	if (cal.activeMonth) {
+		Calendar.removeClass(cal.activeMonth, "active");
+	}
+	var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];
+	Calendar.addClass(mon, "active");
+	cal.activeMonth = mon;
+	var s = mc.style;
+	s.display = "block";
+	if (cd.navtype < 0)
+		s.left = cd.offsetLeft + "px";
+	else {
+		var mcw = mc.offsetWidth;
+		if (typeof mcw == "undefined")
+			// Konqueror brain-dead techniques
+			mcw = 50;
+		s.left = (cd.offsetLeft + cd.offsetWidth - mcw) + "px";
+	}
+	s.top = (cd.offsetTop + cd.offsetHeight) + "px";
+};
+
+Calendar.showYearsCombo = function (fwd) {
+	var cal = Calendar._C;
+	if (!cal) {
+		return false;
+	}
+	var cal = cal;
+	var cd = cal.activeDiv;
+	var yc = cal.yearsCombo;
+	if (cal.hilitedYear) {
+		Calendar.removeClass(cal.hilitedYear, "hilite");
+	}
+	if (cal.activeYear) {
+		Calendar.removeClass(cal.activeYear, "active");
+	}
+	cal.activeYear = null;
+	var Y = cal.date.getFullYear() + (fwd ? 1 : -1);
+	var yr = yc.firstChild;
+	var show = false;
+	for (var i = 12; i > 0; --i) {
+		if (Y >= cal.minYear && Y <= cal.maxYear) {
+			yr.innerHTML = Y;
+			yr.year = Y;
+			yr.style.display = "block";
+			show = true;
+		} else {
+			yr.style.display = "none";
+		}
+		yr = yr.nextSibling;
+		Y += fwd ? cal.yearStep : -cal.yearStep;
+	}
+	if (show) {
+		var s = yc.style;
+		s.display = "block";
+		if (cd.navtype < 0)
+			s.left = cd.offsetLeft + "px";
+		else {
+			var ycw = yc.offsetWidth;
+			if (typeof ycw == "undefined")
+				// Konqueror brain-dead techniques
+				ycw = 50;
+			s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px";
+		}
+		s.top = (cd.offsetTop + cd.offsetHeight) + "px";
+	}
+};
+
+// event handlers
+
+Calendar.tableMouseUp = function(ev) {
+	var cal = Calendar._C;
+	if (!cal) {
+		return false;
+	}
+	if (cal.timeout) {
+		clearTimeout(cal.timeout);
+	}
+	var el = cal.activeDiv;
+	if (!el) {
+		return false;
+	}
+	var target = Calendar.getTargetElement(ev);
+	ev || (ev = window.event);
+	Calendar.removeClass(el, "active");
+	if (target == el || target.parentNode == el) {
+		Calendar.cellClick(el, ev);
+	}
+	var mon = Calendar.findMonth(target);
+	var date = null;
+	if (mon) {
+		date = new Date(cal.date);
+		if (mon.month != date.getMonth()) {
+			date.setMonth(mon.month);
+			cal.setDate(date);
+			cal.dateClicked = false;
+			cal.callHandler();
+		}
+	} else {
+		var year = Calendar.findYear(target);
+		if (year) {
+			date = new Date(cal.date);
+			if (year.year != date.getFullYear()) {
+				date.setFullYear(year.year);
+				cal.setDate(date);
+				cal.dateClicked = false;
+				cal.callHandler();
+			}
+		}
+	}
+	with (Calendar) {
+		removeEvent(document, "mouseup", tableMouseUp);
+		removeEvent(document, "mouseover", tableMouseOver);
+		removeEvent(document, "mousemove", tableMouseOver);
+		cal._hideCombos();
+		_C = null;
+		return stopEvent(ev);
+	}
+};
+
+Calendar.tableMouseOver = function (ev) {
+	var cal = Calendar._C;
+	if (!cal) {
+		return;
+	}
+	var el = cal.activeDiv;
+	var target = Calendar.getTargetElement(ev);
+	if (target == el || target.parentNode == el) {
+		Calendar.addClass(el, "hilite active");
+		Calendar.addClass(el.parentNode, "rowhilite");
+	} else {
+		if (typeof el.navtype == "undefined" || (el.navtype != 50 && (el.navtype == 0 || Math.abs(el.navtype) > 2)))
+			Calendar.removeClass(el, "active");
+		Calendar.removeClass(el, "hilite");
+		Calendar.removeClass(el.parentNode, "rowhilite");
+	}
+	ev || (ev = window.event);
+	if (el.navtype == 50 && target != el) {
+		var pos = Calendar.getAbsolutePos(el);
+		var w = el.offsetWidth;
+		var x = ev.clientX;
+		var dx;
+		var decrease = true;
+		if (x > pos.x + w) {
+			dx = x - pos.x - w;
+			decrease = false;
+		} else
+			dx = pos.x - x;
+
+		if (dx < 0) dx = 0;
+		var range = el._range;
+		var current = el._current;
+		var count = Math.floor(dx / 10) % range.length;
+		for (var i = range.length; --i >= 0;)
+			if (range[i] == current)
+				break;
+		while (count-- > 0)
+			if (decrease) {
+				if (--i < 0)
+					i = range.length - 1;
+			} else if ( ++i >= range.length )
+				i = 0;
+		var newval = range[i];
+		el.innerHTML = newval;
+
+		cal.onUpdateTime();
+	}
+	var mon = Calendar.findMonth(target);
+	if (mon) {
+		if (mon.month != cal.date.getMonth()) {
+			if (cal.hilitedMonth) {
+				Calendar.removeClass(cal.hilitedMonth, "hilite");
+			}
+			Calendar.addClass(mon, "hilite");
+			cal.hilitedMonth = mon;
+		} else if (cal.hilitedMonth) {
+			Calendar.removeClass(cal.hilitedMonth, "hilite");
+		}
+	} else {
+		if (cal.hilitedMonth) {
+			Calendar.removeClass(cal.hilitedMonth, "hilite");
+		}
+		var year = Calendar.findYear(target);
+		if (year) {
+			if (year.year != cal.date.getFullYear()) {
+				if (cal.hilitedYear) {
+					Calendar.removeClass(cal.hilitedYear, "hilite");
+				}
+				Calendar.addClass(year, "hilite");
+				cal.hilitedYear = year;
+			} else if (cal.hilitedYear) {
+				Calendar.removeClass(cal.hilitedYear, "hilite");
+			}
+		} else if (cal.hilitedYear) {
+			Calendar.removeClass(cal.hilitedYear, "hilite");
+		}
+	}
+	return Calendar.stopEvent(ev);
+};
+
+Calendar.tableMouseDown = function (ev) {
+	if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) {
+		return Calendar.stopEvent(ev);
+	}
+};
+
+Calendar.calDragIt = function (ev) {
+	var cal = Calendar._C;
+	if (!(cal && cal.dragging)) {
+		return false;
+	}
+	var posX;
+	var posY;
+	if (Calendar.is_ie) {
+		posY = window.event.clientY + document.body.scrollTop;
+		posX = window.event.clientX + document.body.scrollLeft;
+	} else {
+		posX = ev.pageX;
+		posY = ev.pageY;
+	}
+	cal.hideShowCovered();
+	var st = cal.element.style;
+	st.left = (posX - cal.xOffs) + "px";
+	st.top = (posY - cal.yOffs) + "px";
+	return Calendar.stopEvent(ev);
+};
+
+Calendar.calDragEnd = function (ev) {
+	var cal = Calendar._C;
+	if (!cal) {
+		return false;
+	}
+	cal.dragging = false;
+	with (Calendar) {
+		removeEvent(document, "mousemove", calDragIt);
+		removeEvent(document, "mouseup", calDragEnd);
+		tableMouseUp(ev);
+	}
+	cal.hideShowCovered();
+};
+
+Calendar.dayMouseDown = function(ev) {
+	var el = Calendar.getElement(ev);
+	if (el.disabled) {
+		return false;
+	}
+	var cal = el.calendar;
+	cal.activeDiv = el;
+	Calendar._C = cal;
+	if (el.navtype != 300) with (Calendar) {
+		if (el.navtype == 50) {
+			el._current = el.innerHTML;
+			addEvent(document, "mousemove", tableMouseOver);
+		} else
+			addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver);
+		addClass(el, "hilite active");
+		addEvent(document, "mouseup", tableMouseUp);
+	} else if (cal.isPopup) {
+		cal._dragStart(ev);
+	}
+	if (el.navtype == -1 || el.navtype == 1) {
+		if (cal.timeout) clearTimeout(cal.timeout);
+		cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250);
+	} else if (el.navtype == -2 || el.navtype == 2) {
+		if (cal.timeout) clearTimeout(cal.timeout);
+		cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250);
+	} else {
+		cal.timeout = null;
+	}
+	return Calendar.stopEvent(ev);
+};
+
+Calendar.dayMouseDblClick = function(ev) {
+	Calendar.cellClick(Calendar.getElement(ev), ev || window.event);
+	if (Calendar.is_ie) {
+		document.selection.empty();
+	}
+};
+
+Calendar.dayMouseOver = function(ev) {
+	var el = Calendar.getElement(ev);
+	if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) {
+		return false;
+	}
+	if (el.ttip) {
+		if (el.ttip.substr(0, 1) == "_") {
+			el.ttip = el.caldate.print(el.calendar.ttDateFormat) + el.ttip.substr(1);
+		}
+		el.calendar.tooltips.innerHTML = el.ttip;
+	}
+	if (el.navtype != 300) {
+		Calendar.addClass(el, "hilite");
+		if (el.caldate) {
+			Calendar.addClass(el.parentNode, "rowhilite");
+			var cal = el.calendar;
+			if (cal && cal.getDateToolTip) {
+				var d = el.caldate;
+				window.status = d;
+				el.title = cal.getDateToolTip(d, d.getFullYear(), d.getMonth(), d.getDate());
+			}
+		}
+	}
+	return Calendar.stopEvent(ev);
+};
+
+Calendar.dayMouseOut = function(ev) {
+	with (Calendar) {
+		var el = getElement(ev);
+		if (isRelated(el, ev) || _C || el.disabled)
+			return false;
+		removeClass(el, "hilite");
+		if (el.caldate)
+			removeClass(el.parentNode, "rowhilite");
+		if (el.calendar)
+			el.calendar.tooltips.innerHTML = _TT["SEL_DATE"];
+		// return stopEvent(ev);
+	}
+};
+
+/**
+ *  A generic "click" handler :) handles all types of buttons defined in this
+ *  calendar.
+ */
+Calendar.cellClick = function(el, ev) {
+	var cal = el.calendar;
+	var closing = false;
+	var newdate = false;
+	var date = null;
+	if (typeof el.navtype == "undefined") {
+		if (cal.currentDateEl) {
+			Calendar.removeClass(cal.currentDateEl, "selected");
+			Calendar.addClass(el, "selected");
+			closing = (cal.currentDateEl == el);
+			if (!closing) {
+				cal.currentDateEl = el;
+			}
+		}
+		cal.date.setDateOnly(el.caldate);
+		date = cal.date;
+		var other_month = !(cal.dateClicked = !el.otherMonth);
+		if (!other_month && !cal.currentDateEl && cal.multiple)
+			cal._toggleMultipleDate(new Date(date));
+		else
+			newdate = !el.disabled;
+		// a date was clicked
+		if (other_month)
+			cal._init(cal.firstDayOfWeek, date);
+	} else {
+		if (el.navtype == 200) {
+			Calendar.removeClass(el, "hilite");
+			cal.callCloseHandler();
+			return;
+		}
+		date = new Date(cal.date);
+		if (el.navtype == 0)
+			date.setDateOnly(new Date()); // TODAY
+		// unless "today" was clicked, we assume no date was clicked so
+		// the selected handler will know not to close the calenar when
+		// in single-click mode.
+		// cal.dateClicked = (el.navtype == 0);
+		cal.dateClicked = false;
+		var year = date.getFullYear();
+		var mon = date.getMonth();
+		function setMonth(m) {
+			var day = date.getDate();
+			var max = date.getMonthDays(m);
+			if (day > max) {
+				date.setDate(max);
+			}
+			date.setMonth(m);
+		};
+		switch (el.navtype) {
+		    case 400:
+			Calendar.removeClass(el, "hilite");
+			var text = Calendar._TT["ABOUT"];
+			if (typeof text != "undefined") {
+				text += cal.showsTime ? Calendar._TT["ABOUT_TIME"] : "";
+			} else {
+				// FIXME: this should be removed as soon as lang files get updated!
+				text = "Help and about box text is not translated into this language.\n" +
+					"If you know this language and you feel generous please update\n" +
+					"the corresponding file in \"lang\" subdir to match calendar-en.js\n" +
+					"and send it back to <mihai_bazon en yahoo.com> to get it into the distribution  ;-)\n\n" +
+					"Thank you!\n" +
+					"http://dynarch.com/mishoo/calendar.epl\n";
+			}
+			alert(text);
+			return;
+		    case -2:
+			if (year > cal.minYear) {
+				date.setFullYear(year - 1);
+			}
+			break;
+		    case -1:
+			if (mon > 0) {
+				setMonth(mon - 1);
+			} else if (year-- > cal.minYear) {
+				date.setFullYear(year);
+				setMonth(11);
+			}
+			break;
+		    case 1:
+			if (mon < 11) {
+				setMonth(mon + 1);
+			} else if (year < cal.maxYear) {
+				date.setFullYear(year + 1);
+				setMonth(0);
+			}
+			break;
+		    case 2:
+			if (year < cal.maxYear) {
+				date.setFullYear(year + 1);
+			}
+			break;
+		    case 100:
+			cal.setFirstDayOfWeek(el.fdow);
+			return;
+		    case 50:
+			var range = el._range;
+			var current = el.innerHTML;
+			for (var i = range.length; --i >= 0;)
+				if (range[i] == current)
+					break;
+			if (ev && ev.shiftKey) {
+				if (--i < 0)
+					i = range.length - 1;
+			} else if ( ++i >= range.length )
+				i = 0;
+			var newval = range[i];
+			el.innerHTML = newval;
+			cal.onUpdateTime();
+			return;
+		    case 0:
+			// TODAY will bring us here
+			if ((typeof cal.getDateStatus == "function") &&
+			    cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) {
+				return false;
+			}
+			break;
+		}
+		if (!date.equalsTo(cal.date)) {
+			cal.setDate(date);
+			newdate = true;
+		} else if (el.navtype == 0)
+			newdate = closing = true;
+	}
+	if (newdate) {
+		ev && cal.callHandler();
+	}
+	if (closing) {
+		Calendar.removeClass(el, "hilite");
+		ev && cal.callCloseHandler();
+	}
+};
+
+// END: CALENDAR STATIC FUNCTIONS
+
+// BEGIN: CALENDAR OBJECT FUNCTIONS
+
+/**
+ *  This function creates the calendar inside the given parent.  If _par is
+ *  null than it creates a popup calendar inside the BODY element.  If _par is
+ *  an element, be it BODY, then it creates a non-popup calendar (still
+ *  hidden).  Some properties need to be set before calling this function.
+ */
+Calendar.prototype.create = function (_par) {
+	var parent = null;
+	if (! _par) {
+		// default parent is the document body, in which case we create
+		// a popup calendar.
+		parent = document.getElementsByTagName("body")[0];
+		this.isPopup = true;
+	} else {
+		parent = _par;
+		this.isPopup = false;
+	}
+	this.date = this.dateStr ? new Date(this.dateStr) : new Date();
+
+	var table = Calendar.createElement("table");
+	this.table = table;
+	table.cellSpacing = 0;
+	table.cellPadding = 0;
+	table.calendar = this;
+	Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown);
+
+	var div = Calendar.createElement("div");
+	this.element = div;
+	div.className = "calendar";
+	if (this.isPopup) {
+		div.style.position = "absolute";
+		div.style.display = "none";
+	}
+	div.appendChild(table);
+
+	var thead = Calendar.createElement("thead", table);
+	var cell = null;
+	var row = null;
+
+	var cal = this;
+	var hh = function (text, cs, navtype) {
+		cell = Calendar.createElement("td", row);
+		cell.colSpan = cs;
+		cell.className = "button";
+		if (navtype != 0 && Math.abs(navtype) <= 2)
+			cell.className += " nav";
+		Calendar._add_evs(cell);
+		cell.calendar = cal;
+		cell.navtype = navtype;
+		cell.innerHTML = "<div unselectable='on'>" + text + "</div>";
+		return cell;
+	};
+
+	row = Calendar.createElement("tr", thead);
+	var title_length = 6;
+	(this.isPopup) && --title_length;
+	(this.weekNumbers) && ++title_length;
+
+	hh("?", 1, 400).ttip = Calendar._TT["INFO"];
+	this.title = hh("", title_length, 300);
+	this.title.className = "title";
+	if (this.isPopup) {
+		this.title.ttip = Calendar._TT["DRAG_TO_MOVE"];
+		this.title.style.cursor = "move";
+		hh("&#x00d7;", 1, 200).ttip = Calendar._TT["CLOSE"];
+	}
+
+	row = Calendar.createElement("tr", thead);
+	row.className = "headrow";
+
+	this._nav_py = hh("&#x00ab;", 1, -2);
+	this._nav_py.ttip = Calendar._TT["PREV_YEAR"];
+
+	this._nav_pm = hh("&#x2039;", 1, -1);
+	this._nav_pm.ttip = Calendar._TT["PREV_MONTH"];
+
+	this._nav_now = hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0);
+	this._nav_now.ttip = Calendar._TT["GO_TODAY"];
+
+	this._nav_nm = hh("&#x203a;", 1, 1);
+	this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"];
+
+	this._nav_ny = hh("&#x00bb;", 1, 2);
+	this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"];
+
+	// day names
+	row = Calendar.createElement("tr", thead);
+	row.className = "daynames";
+	if (this.weekNumbers) {
+		cell = Calendar.createElement("td", row);
+		cell.className = "name wn";
+		cell.innerHTML = Calendar._TT["WK"];
+	}
+	for (var i = 7; i > 0; --i) {
+		cell = Calendar.createElement("td", row);
+		if (!i) {
+			cell.navtype = 100;
+			cell.calendar = this;
+			Calendar._add_evs(cell);
+		}
+	}
+	this.firstdayname = (this.weekNumbers) ? row.firstChild.nextSibling : row.firstChild;
+	this._displayWeekdays();
+
+	var tbody = Calendar.createElement("tbody", table);
+	this.tbody = tbody;
+
+	for (i = 6; i > 0; --i) {
+		row = Calendar.createElement("tr", tbody);
+		if (this.weekNumbers) {
+			cell = Calendar.createElement("td", row);
+		}
+		for (var j = 7; j > 0; --j) {
+			cell = Calendar.createElement("td", row);
+			cell.calendar = this;
+			Calendar._add_evs(cell);
+		}
+	}
+
+	if (this.showsTime) {
+		row = Calendar.createElement("tr", tbody);
+		row.className = "time";
+
+		cell = Calendar.createElement("td", row);
+		cell.className = "time";
+		cell.colSpan = 2;
+		cell.innerHTML = Calendar._TT["TIME"] || "&nbsp;";
+
+		cell = Calendar.createElement("td", row);
+		cell.className = "time";
+		cell.colSpan = this.weekNumbers ? 4 : 3;
+
+		(function(){
+			function makeTimePart(className, init, range_start, range_end) {
+				var part = Calendar.createElement("span", cell);
+				part.className = className;
+				part.innerHTML = init;
+				part.calendar = cal;
+				part.ttip = Calendar._TT["TIME_PART"];
+				part.navtype = 50;
+				part._range = [];
+				if (typeof range_start != "number")
+					part._range = range_start;
+				else {
+					for (var i = range_start; i <= range_end; ++i) {
+						var txt;
+						if (i < 10 && range_end >= 10) txt = '0' + i;
+						else txt = '' + i;
+						part._range[part._range.length] = txt;
+					}
+				}
+				Calendar._add_evs(part);
+				return part;
+			};
+			var hrs = cal.date.getHours();
+			var mins = cal.date.getMinutes();
+			var t12 = !cal.time24;
+			var pm = (hrs > 12);
+			if (t12 && pm) hrs -= 12;
+			var H = makeTimePart("hour", hrs, t12 ? 1 : 0, t12 ? 12 : 23);
+			var span = Calendar.createElement("span", cell);
+			span.innerHTML = ":";
+			span.className = "colon";
+			var M = makeTimePart("minute", mins, 0, 59);
+			var AP = null;
+			cell = Calendar.createElement("td", row);
+			cell.className = "time";
+			cell.colSpan = 2;
+			if (t12)
+				AP = makeTimePart("ampm", pm ? "pm" : "am", ["am", "pm"]);
+			else
+				cell.innerHTML = "&nbsp;";
+
+			cal.onSetTime = function() {
+				var pm, hrs = this.date.getHours(),
+					mins = this.date.getMinutes();
+				if (t12) {
+					pm = (hrs >= 12);
+					if (pm) hrs -= 12;
+					if (hrs == 0) hrs = 12;
+					AP.innerHTML = pm ? "pm" : "am";
+				}
+				H.innerHTML = (hrs < 10) ? ("0" + hrs) : hrs;
+				M.innerHTML = (mins < 10) ? ("0" + mins) : mins;
+			};
+
+			cal.onUpdateTime = function() {
+				var date = this.date;
+				var h = parseInt(H.innerHTML, 10);
+				if (t12) {
+					if (/pm/i.test(AP.innerHTML) && h < 12)
+						h += 12;
+					else if (/am/i.test(AP.innerHTML) && h == 12)
+						h = 0;
+				}
+				var d = date.getDate();
+				var m = date.getMonth();
+				var y = date.getFullYear();
+				date.setHours(h);
+				date.setMinutes(parseInt(M.innerHTML, 10));
+				date.setFullYear(y);
+				date.setMonth(m);
+				date.setDate(d);
+				this.dateClicked = false;
+				this.callHandler();
+			};
+		})();
+	} else {
+		this.onSetTime = this.onUpdateTime = function() {};
+	}
+
+	var tfoot = Calendar.createElement("tfoot", table);
+
+	row = Calendar.createElement("tr", tfoot);
+	row.className = "footrow";
+
+	cell = hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300);
+	cell.className = "ttip";
+	if (this.isPopup) {
+		cell.ttip = Calendar._TT["DRAG_TO_MOVE"];
+		cell.style.cursor = "move";
+	}
+	this.tooltips = cell;
+
+	div = Calendar.createElement("div", this.element);
+	this.monthsCombo = div;
+	div.className = "combo";
+	for (i = 0; i < Calendar._MN.length; ++i) {
+		var mn = Calendar.createElement("div");
+		mn.className = Calendar.is_ie ? "label-IEfix" : "label";
+		mn.month = i;
+		mn.innerHTML = Calendar._SMN[i];
+		div.appendChild(mn);
+	}
+
+	div = Calendar.createElement("div", this.element);
+	this.yearsCombo = div;
+	div.className = "combo";
+	for (i = 12; i > 0; --i) {
+		var yr = Calendar.createElement("div");
+		yr.className = Calendar.is_ie ? "label-IEfix" : "label";
+		div.appendChild(yr);
+	}
+
+	this._init(this.firstDayOfWeek, this.date);
+	parent.appendChild(this.element);
+};
+
+/** keyboard navigation, only for popup calendars */
+Calendar._keyEvent = function(ev) {
+	var cal = window._dynarch_popupCalendar;
+	if (!cal || cal.multiple)
+		return false;
+	(Calendar.is_ie) && (ev = window.event);
+	var act = (Calendar.is_ie || ev.type == "keypress"),
+		K = ev.keyCode;
+	if (ev.ctrlKey) {
+		switch (K) {
+		    case 37: // KEY left
+			act && Calendar.cellClick(cal._nav_pm);
+			break;
+		    case 38: // KEY up
+			act && Calendar.cellClick(cal._nav_py);
+			break;
+		    case 39: // KEY right
+			act && Calendar.cellClick(cal._nav_nm);
+			break;
+		    case 40: // KEY down
+			act && Calendar.cellClick(cal._nav_ny);
+			break;
+		    default:
+			return false;
+		}
+	} else switch (K) {
+	    case 32: // KEY space (now)
+		Calendar.cellClick(cal._nav_now);
+		break;
+	    case 27: // KEY esc
+		act && cal.callCloseHandler();
+		break;
+	    case 37: // KEY left
+	    case 38: // KEY up
+	    case 39: // KEY right
+	    case 40: // KEY down
+		if (act) {
+			var prev, x, y, ne, el, step;
+			prev = K == 37 || K == 38;
+			step = (K == 37 || K == 39) ? 1 : 7;
+			function setVars() {
+				el = cal.currentDateEl;
+				var p = el.pos;
+				x = p & 15;
+				y = p >> 4;
+				ne = cal.ar_days[y][x];
+			};setVars();
+			function prevMonth() {
+				var date = new Date(cal.date);
+				date.setDate(date.getDate() - step);
+				cal.setDate(date);
+			};
+			function nextMonth() {
+				var date = new Date(cal.date);
+				date.setDate(date.getDate() + step);
+				cal.setDate(date);
+			};
+			while (1) {
+				switch (K) {
+				    case 37: // KEY left
+					if (--x >= 0)
+						ne = cal.ar_days[y][x];
+					else {
+						x = 6;
+						K = 38;
+						continue;
+					}
+					break;
+				    case 38: // KEY up
+					if (--y >= 0)
+						ne = cal.ar_days[y][x];
+					else {
+						prevMonth();
+						setVars();
+					}
+					break;
+				    case 39: // KEY right
+					if (++x < 7)
+						ne = cal.ar_days[y][x];
+					else {
+						x = 0;
+						K = 40;
+						continue;
+					}
+					break;
+				    case 40: // KEY down
+					if (++y < cal.ar_days.length)
+						ne = cal.ar_days[y][x];
+					else {
+						nextMonth();
+						setVars();
+					}
+					break;
+				}
+				break;
+			}
+			if (ne) {
+				if (!ne.disabled)
+					Calendar.cellClick(ne);
+				else if (prev)
+					prevMonth();
+				else
+					nextMonth();
+			}
+		}
+		break;
+	    case 13: // KEY enter
+		if (act)
+			Calendar.cellClick(cal.currentDateEl, ev);
+		break;
+	    default:
+		return false;
+	}
+	return Calendar.stopEvent(ev);
+};
+
+/**
+ *  (RE)Initializes the calendar to the given date and firstDayOfWeek
+ */
+Calendar.prototype._init = function (firstDayOfWeek, date) {
+	var today = new Date(),
+		TY = today.getFullYear(),
+		TM = today.getMonth(),
+		TD = today.getDate();
+	this.table.style.visibility = "hidden";
+	var year = date.getFullYear();
+	if (year < this.minYear) {
+		year = this.minYear;
+		date.setFullYear(year);
+	} else if (year > this.maxYear) {
+		year = this.maxYear;
+		date.setFullYear(year);
+	}
+	this.firstDayOfWeek = firstDayOfWeek;
+	this.date = new Date(date);
+	var month = date.getMonth();
+	var mday = date.getDate();
+	var no_days = date.getMonthDays();
+
+	// calendar voodoo for computing the first day that would actually be
+	// displayed in the calendar, even if it's from the previous month.
+	// WARNING: this is magic. ;-)
+	date.setDate(1);
+	var day1 = (date.getDay() - this.firstDayOfWeek) % 7;
+	if (day1 < 0)
+		day1 += 7;
+	date.setDate(-day1);
+	date.setDate(date.getDate() + 1);
+
+	var row = this.tbody.firstChild;
+	var MN = Calendar._SMN[month];
+	var ar_days = this.ar_days = new Array();
+	var weekend = Calendar._TT["WEEKEND"];
+	var dates = this.multiple ? (this.datesCells = {}) : null;
+	for (var i = 0; i < 6; ++i, row = row.nextSibling) {
+		var cell = row.firstChild;
+		if (this.weekNumbers) {
+			cell.className = "day wn";
+			cell.innerHTML = date.getWeekNumber();
+			cell = cell.nextSibling;
+		}
+		row.className = "daysrow";
+		var hasdays = false, iday, dpos = ar_days[i] = [];
+		for (var j = 0; j < 7; ++j, cell = cell.nextSibling, date.setDate(iday + 1)) {
+			iday = date.getDate();
+			var wday = date.getDay();
+			cell.className = "day";
+			cell.pos = i << 4 | j;
+			dpos[j] = cell;
+			var current_month = (date.getMonth() == month);
+			if (!current_month) {
+				if (this.showsOtherMonths) {
+					cell.className += " othermonth";
+					cell.otherMonth = true;
+				} else {
+					cell.className = "emptycell";
+					cell.innerHTML = "&nbsp;";
+					cell.disabled = true;
+					continue;
+				}
+			} else {
+				cell.otherMonth = false;
+				hasdays = true;
+			}
+			cell.disabled = false;
+			cell.innerHTML = this.getDateText ? this.getDateText(date, iday) : iday;
+			if (dates)
+				dates[date.print("%Y%m%d")] = cell;
+			if (this.getDateStatus) {
+				var status = this.getDateStatus(date, year, month, iday);
+				if (status === true) {
+					cell.className += " disabled";
+					cell.disabled = true;
+				} else {
+					if (/disabled/i.test(status))
+						cell.disabled = true;
+					cell.className += " " + status;
+				}
+			}
+			if (!cell.disabled) {
+				cell.caldate = new Date(date);
+				cell.ttip = "_";
+				if (!this.multiple && current_month
+				    && iday == mday && this.hiliteToday) {
+					cell.className += " selected";
+					this.currentDateEl = cell;
+				}
+				if (date.getFullYear() == TY &&
+				    date.getMonth() == TM &&
+				    iday == TD) {
+					cell.className += " today";
+					cell.ttip += Calendar._TT["PART_TODAY"];
+				}
+				if (weekend.indexOf(wday.toString()) != -1)
+					cell.className += cell.otherMonth ? " oweekend" : " weekend";
+			}
+		}
+		if (!(hasdays || this.showsOtherMonths))
+			row.className = "emptyrow";
+	}
+	this.title.innerHTML = Calendar._MN[month] + ", " + year;
+	this.onSetTime();
+	this.table.style.visibility = "visible";
+	this._initMultipleDates();
+	// PROFILE
+	// this.tooltips.innerHTML = "Generated in " + ((new Date()) - today) + " ms";
+};
+
+Calendar.prototype._initMultipleDates = function() {
+	if (this.multiple) {
+		for (var i in this.multiple) {
+			var cell = this.datesCells[i];
+			var d = this.multiple[i];
+			if (!d)
+				continue;
+			if (cell)
+				cell.className += " selected";
+		}
+	}
+};
+
+Calendar.prototype._toggleMultipleDate = function(date) {
+	if (this.multiple) {
+		var ds = date.print("%Y%m%d");
+		var cell = this.datesCells[ds];
+		if (cell) {
+			var d = this.multiple[ds];
+			if (!d) {
+				Calendar.addClass(cell, "selected");
+				this.multiple[ds] = date;
+			} else {
+				Calendar.removeClass(cell, "selected");
+				delete this.multiple[ds];
+			}
+		}
+	}
+};
+
+Calendar.prototype.setDateToolTipHandler = function (unaryFunction) {
+	this.getDateToolTip = unaryFunction;
+};
+
+/**
+ *  Calls _init function above for going to a certain date (but only if the
+ *  date is different than the currently selected one).
+ */
+Calendar.prototype.setDate = function (date) {
+	if (!date.equalsTo(this.date)) {
+		this._init(this.firstDayOfWeek, date);
+	}
+};
+
+/**
+ *  Refreshes the calendar.  Useful if the "disabledHandler" function is
+ *  dynamic, meaning that the list of disabled date can change at runtime.
+ *  Just * call this function if you think that the list of disabled dates
+ *  should * change.
+ */
+Calendar.prototype.refresh = function () {
+	this._init(this.firstDayOfWeek, this.date);
+};
+
+/** Modifies the "firstDayOfWeek" parameter (pass 0 for Synday, 1 for Monday, etc.). */
+Calendar.prototype.setFirstDayOfWeek = function (firstDayOfWeek) {
+	this._init(firstDayOfWeek, this.date);
+	this._displayWeekdays();
+};
+
+/**
+ *  Allows customization of what dates are enabled.  The "unaryFunction"
+ *  parameter must be a function object that receives the date (as a JS Date
+ *  object) and returns a boolean value.  If the returned value is true then
+ *  the passed date will be marked as disabled.
+ */
+Calendar.prototype.setDateStatusHandler = Calendar.prototype.setDisabledHandler = function (unaryFunction) {
+	this.getDateStatus = unaryFunction;
+};
+
+/** Customization of allowed year range for the calendar. */
+Calendar.prototype.setRange = function (a, z) {
+	this.minYear = a;
+	this.maxYear = z;
+};
+
+/** Calls the first user handler (selectedHandler). */
+Calendar.prototype.callHandler = function () {
+	if (this.onSelected) {
+		this.onSelected(this, this.date.print(this.dateFormat));
+	}
+};
+
+/** Calls the second user handler (closeHandler). */
+Calendar.prototype.callCloseHandler = function () {
+	if (this.onClose) {
+		this.onClose(this);
+	}
+	this.hideShowCovered();
+};
+
+/** Removes the calendar object from the DOM tree and destroys it. */
+Calendar.prototype.destroy = function () {
+	var el = this.element.parentNode;
+	el.removeChild(this.element);
+	Calendar._C = null;
+	window._dynarch_popupCalendar = null;
+};
+
+/**
+ *  Moves the calendar element to a different section in the DOM tree (changes
+ *  its parent).
+ */
+Calendar.prototype.reparent = function (new_parent) {
+	var el = this.element;
+	el.parentNode.removeChild(el);
+	new_parent.appendChild(el);
+};
+
+// This gets called when the user presses a mouse button anywhere in the
+// document, if the calendar is shown.  If the click was outside the open
+// calendar this function closes it.
+Calendar._checkCalendar = function(ev) {
+	var calendar = window._dynarch_popupCalendar;
+	if (!calendar) {
+		return false;
+	}
+	var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev);
+	for (; el != null && el != calendar.element; el = el.parentNode);
+	if (el == null) {
+		// calls closeHandler which should hide the calendar.
+		window._dynarch_popupCalendar.callCloseHandler();
+		return Calendar.stopEvent(ev);
+	}
+};
+
+/** Shows the calendar. */
+Calendar.prototype.show = function () {
+	var rows = this.table.getElementsByTagName("tr");
+	for (var i = rows.length; i > 0;) {
+		var row = rows[--i];
+		Calendar.removeClass(row, "rowhilite");
+		var cells = row.getElementsByTagName("td");
+		for (var j = cells.length; j > 0;) {
+			var cell = cells[--j];
+			Calendar.removeClass(cell, "hilite");
+			Calendar.removeClass(cell, "active");
+		}
+	}
+	this.element.style.display = "block";
+	this.hidden = false;
+	if (this.isPopup) {
+		window._dynarch_popupCalendar = this;
+		Calendar.addEvent(document, "keydown", Calendar._keyEvent);
+		Calendar.addEvent(document, "keypress", Calendar._keyEvent);
+		Calendar.addEvent(document, "mousedown", Calendar._checkCalendar);
+	}
+	this.hideShowCovered();
+};
+
+/**
+ *  Hides the calendar.  Also removes any "hilite" from the class of any TD
+ *  element.
+ */
+Calendar.prototype.hide = function () {
+	if (this.isPopup) {
+		Calendar.removeEvent(document, "keydown", Calendar._keyEvent);
+		Calendar.removeEvent(document, "keypress", Calendar._keyEvent);
+		Calendar.removeEvent(document, "mousedown", Calendar._checkCalendar);
+	}
+	this.element.style.display = "none";
+	this.hidden = true;
+	this.hideShowCovered();
+};
+
+/**
+ *  Shows the calendar at a given absolute position (beware that, depending on
+ *  the calendar element style -- position property -- this might be relative
+ *  to the parent's containing rectangle).
+ */
+Calendar.prototype.showAt = function (x, y) {
+	var s = this.element.style;
+	s.left = x + "px";
+	s.top = y + "px";
+	this.show();
+};
+
+/** Shows the calendar near a given element. */
+Calendar.prototype.showAtElement = function (el, opts) {
+	var self = this;
+	var p = Calendar.getAbsolutePos(el);
+	if (!opts || typeof opts != "string") {
+		this.showAt(p.x, p.y + el.offsetHeight);
+		return true;
+	}
+	function fixPosition(box) {
+		if (box.x < 0)
+			box.x = 0;
+		if (box.y < 0)
+			box.y = 0;
+		var cp = document.createElement("div");
+		var s = cp.style;
+		s.position = "absolute";
+		s.right = s.bottom = s.width = s.height = "0px";
+		document.body.appendChild(cp);
+		var br = Calendar.getAbsolutePos(cp);
+		document.body.removeChild(cp);
+		if (Calendar.is_ie) {
+			br.y += document.body.scrollTop;
+			br.x += document.body.scrollLeft;
+		} else {
+			br.y += window.scrollY;
+			br.x += window.scrollX;
+		}
+		var tmp = box.x + box.width - br.x;
+		if (tmp > 0) box.x -= tmp;
+		tmp = box.y + box.height - br.y;
+		if (tmp > 0) box.y -= tmp;
+	};
+	this.element.style.display = "block";
+	Calendar.continuation_for_the_fucking_khtml_browser = function() {
+		var w = self.element.offsetWidth;
+		var h = self.element.offsetHeight;
+		self.element.style.display = "none";
+		var valign = opts.substr(0, 1);
+		var halign = "l";
+		if (opts.length > 1) {
+			halign = opts.substr(1, 1);
+		}
+		// vertical alignment
+		switch (valign) {
+		    case "T": p.y -= h; break;
+		    case "B": p.y += el.offsetHeight; break;
+		    case "C": p.y += (el.offsetHeight - h) / 2; break;
+		    case "t": p.y += el.offsetHeight - h; break;
+		    case "b": break; // already there
+		}
+		// horizontal alignment
+		switch (halign) {
+		    case "L": p.x -= w; break;
+		    case "R": p.x += el.offsetWidth; break;
+		    case "C": p.x += (el.offsetWidth - w) / 2; break;
+		    case "l": p.x += el.offsetWidth - w; break;
+		    case "r": break; // already there
+		}
+		p.width = w;
+		p.height = h + 40;
+		self.monthsCombo.style.display = "none";
+		fixPosition(p);
+		self.showAt(p.x, p.y);
+	};
+	if (Calendar.is_khtml)
+		setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()", 10);
+	else
+		Calendar.continuation_for_the_fucking_khtml_browser();
+};
+
+/** Customizes the date format. */
+Calendar.prototype.setDateFormat = function (str) {
+	this.dateFormat = str;
+};
+
+/** Customizes the tooltip date format. */
+Calendar.prototype.setTtDateFormat = function (str) {
+	this.ttDateFormat = str;
+};
+
+/**
+ *  Tries to identify the date represented in a string.  If successful it also
+ *  calls this.setDate which moves the calendar to the given date.
+ */
+Calendar.prototype.parseDate = function(str, fmt) {
+	if (!fmt)
+		fmt = this.dateFormat;
+	this.setDate(Date.parseDate(str, fmt));
+};
+
+Calendar.prototype.hideShowCovered = function () {
+	if (!Calendar.is_ie && !Calendar.is_opera)
+		return;
+	function getVisib(obj){
+		var value = obj.style.visibility;
+		if (!value) {
+			if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { // Gecko, W3C
+				if (!Calendar.is_khtml)
+					value = document.defaultView.
+						getComputedStyle(obj, "").getPropertyValue("visibility");
+				else
+					value = '';
+			} else if (obj.currentStyle) { // IE
+				value = obj.currentStyle.visibility;
+			} else
+				value = '';
+		}
+		return value;
+	};
+
+	var tags = new Array("applet", "iframe", "select");
+	var el = this.element;
+
+	var p = Calendar.getAbsolutePos(el);
+	var EX1 = p.x;
+	var EX2 = el.offsetWidth + EX1;
+	var EY1 = p.y;
+	var EY2 = el.offsetHeight + EY1;
+
+	for (var k = tags.length; k > 0; ) {
+		var ar = document.getElementsByTagName(tags[--k]);
+		var cc = null;
+
+		for (var i = ar.length; i > 0;) {
+			cc = ar[--i];
+
+			p = Calendar.getAbsolutePos(cc);
+			var CX1 = p.x;
+			var CX2 = cc.offsetWidth + CX1;
+			var CY1 = p.y;
+			var CY2 = cc.offsetHeight + CY1;
+
+			if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
+				if (!cc.__msh_save_visibility) {
+					cc.__msh_save_visibility = getVisib(cc);
+				}
+				cc.style.visibility = cc.__msh_save_visibility;
+			} else {
+				if (!cc.__msh_save_visibility) {
+					cc.__msh_save_visibility = getVisib(cc);
+				}
+				cc.style.visibility = "hidden";
+			}
+		}
+	}
+};
+
+/** Internal function; it displays the bar with the names of the weekday. */
+Calendar.prototype._displayWeekdays = function () {
+	var fdow = this.firstDayOfWeek;
+	var cell = this.firstdayname;
+	var weekend = Calendar._TT["WEEKEND"];
+	for (var i = 0; i < 7; ++i) {
+		cell.className = "day name";
+		var realday = (i + fdow) % 7;
+		if (i) {
+			cell.ttip = Calendar._TT["DAY_FIRST"].replace("%s", Calendar._DN[realday]);
+			cell.navtype = 100;
+			cell.calendar = this;
+			cell.fdow = realday;
+			Calendar._add_evs(cell);
+		}
+		if (weekend.indexOf(realday.toString()) != -1) {
+			Calendar.addClass(cell, "weekend");
+		}
+		cell.innerHTML = Calendar._SDN[(i + fdow) % 7];
+		cell = cell.nextSibling;
+	}
+};
+
+/** Internal function.  Hides all combo boxes that might be displayed. */
+Calendar.prototype._hideCombos = function () {
+	this.monthsCombo.style.display = "none";
+	this.yearsCombo.style.display = "none";
+};
+
+/** Internal function.  Starts dragging the element. */
+Calendar.prototype._dragStart = function (ev) {
+	if (this.dragging) {
+		return;
+	}
+	this.dragging = true;
+	var posX;
+	var posY;
+	if (Calendar.is_ie) {
+		posY = window.event.clientY + document.body.scrollTop;
+		posX = window.event.clientX + document.body.scrollLeft;
+	} else {
+		posY = ev.clientY + window.scrollY;
+		posX = ev.clientX + window.scrollX;
+	}
+	var st = this.element.style;
+	this.xOffs = posX - parseInt(st.left);
+	this.yOffs = posY - parseInt(st.top);
+	with (Calendar) {
+		addEvent(document, "mousemove", calDragIt);
+		addEvent(document, "mouseup", calDragEnd);
+	}
+};
+
+// BEGIN: DATE OBJECT PATCHES
+
+/** Adds the number of days array to the Date object. */
+Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
+
+/** Constants used for time computations */
+Date.SECOND = 1000 /* milliseconds */;
+Date.MINUTE = 60 * Date.SECOND;
+Date.HOUR   = 60 * Date.MINUTE;
+Date.DAY    = 24 * Date.HOUR;
+Date.WEEK   =  7 * Date.DAY;
+
+Date.parseDate = function(str, fmt) {
+	var today = new Date();
+	var y = 0;
+	var m = -1;
+	var d = 0;
+	var a = str.split(/\W+/);
+	var b = fmt.match(/%./g);
+	var i = 0, j = 0;
+	var hr = 0;
+	var min = 0;
+	for (i = 0; i < a.length; ++i) {
+		if (!a[i])
+			continue;
+		switch (b[i]) {
+		    case "%d":
+		    case "%e":
+			d = parseInt(a[i], 10);
+			break;
+
+		    case "%m":
+			m = parseInt(a[i], 10) - 1;
+			break;
+
+		    case "%Y":
+		    case "%y":
+			y = parseInt(a[i], 10);
+			(y < 100) && (y += (y > 29) ? 1900 : 2000);
+			break;
+
+		    case "%b":
+		    case "%B":
+			for (j = 0; j < 12; ++j) {
+				if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; }
+			}
+			break;
+
+		    case "%H":
+		    case "%I":
+		    case "%k":
+		    case "%l":
+			hr = parseInt(a[i], 10);
+			break;
+
+		    case "%P":
+		    case "%p":
+			if (/pm/i.test(a[i]) && hr < 12)
+				hr += 12;
+			else if (/am/i.test(a[i]) && hr >= 12)
+				hr -= 12;
+			break;
+
+		    case "%M":
+			min = parseInt(a[i], 10);
+			break;
+		}
+	}
+	if (isNaN(y)) y = today.getFullYear();
+	if (isNaN(m)) m = today.getMonth();
+	if (isNaN(d)) d = today.getDate();
+	if (isNaN(hr)) hr = today.getHours();
+	if (isNaN(min)) min = today.getMinutes();
+	if (y != 0 && m != -1 && d != 0)
+		return new Date(y, m, d, hr, min, 0);
+	y = 0; m = -1; d = 0;
+	for (i = 0; i < a.length; ++i) {
+		if (a[i].search(/[a-zA-Z]+/) != -1) {
+			var t = -1;
+			for (j = 0; j < 12; ++j) {
+				if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; }
+			}
+			if (t != -1) {
+				if (m != -1) {
+					d = m+1;
+				}
+				m = t;
+			}
+		} else if (parseInt(a[i], 10) <= 12 && m == -1) {
+			m = a[i]-1;
+		} else if (parseInt(a[i], 10) > 31 && y == 0) {
+			y = parseInt(a[i], 10);
+			(y < 100) && (y += (y > 29) ? 1900 : 2000);
+		} else if (d == 0) {
+			d = a[i];
+		}
+	}
+	if (y == 0)
+		y = today.getFullYear();
+	if (m != -1 && d != 0)
+		return new Date(y, m, d, hr, min, 0);
+	return today;
+};
+
+/** Returns the number of days in the current month */
+Date.prototype.getMonthDays = function(month) {
+	var year = this.getFullYear();
+	if (typeof month == "undefined") {
+		month = this.getMonth();
+	}
+	if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))) && month == 1) {
+		return 29;
+	} else {
+		return Date._MD[month];
+	}
+};
+
+/** Returns the number of day in the year. */
+Date.prototype.getDayOfYear = function() {
+	var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
+	var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
+	var time = now - then;
+	return Math.floor(time / Date.DAY);
+};
+
+/** Returns the number of the week in year, as defined in ISO 8601. */
+Date.prototype.getWeekNumber = function() {
+	var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
+	var DoW = d.getDay();
+	d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu
+	var ms = d.valueOf(); // GMT
+	d.setMonth(0);
+	d.setDate(4); // Thu in Week 1
+	return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
+};
+
+/** Checks date and time equality */
+Date.prototype.equalsTo = function(date) {
+	return ((this.getFullYear() == date.getFullYear()) &&
+		(this.getMonth() == date.getMonth()) &&
+		(this.getDate() == date.getDate()) &&
+		(this.getHours() == date.getHours()) &&
+		(this.getMinutes() == date.getMinutes()));
+};
+
+/** Set only the year, month, date parts (keep existing time) */
+Date.prototype.setDateOnly = function(date) {
+	var tmp = new Date(date);
+	this.setDate(1);
+	this.setFullYear(tmp.getFullYear());
+	this.setMonth(tmp.getMonth());
+	this.setDate(tmp.getDate());
+};
+
+/** Prints the date in a string according to the given format. */
+Date.prototype.print = function (str) {
+	var m = this.getMonth();
+	var d = this.getDate();
+	var y = this.getFullYear();
+	var wn = this.getWeekNumber();
+	var w = this.getDay();
+	var s = {};
+	var hr = this.getHours();
+	var pm = (hr >= 12);
+	var ir = (pm) ? (hr - 12) : hr;
+	var dy = this.getDayOfYear();
+	if (ir == 0)
+		ir = 12;
+	var min = this.getMinutes();
+	var sec = this.getSeconds();
+	s["%a"] = Calendar._SDN[w]; // abbreviated weekday name [FIXME: I18N]
+	s["%A"] = Calendar._DN[w]; // full weekday name
+	s["%b"] = Calendar._SMN[m]; // abbreviated month name [FIXME: I18N]
+	s["%B"] = Calendar._MN[m]; // full month name
+	// FIXME: %c : preferred date and time representation for the current locale
+	s["%C"] = 1 + Math.floor(y / 100); // the century number
+	s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31)
+	s["%e"] = d; // the day of the month (range 1 to 31)
+	// FIXME: %D : american date style: %m/%d/%y
+	// FIXME: %E, %F, %G, %g, %h (man strftime)
+	s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format)
+	s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format)
+	s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366)
+	s["%k"] = hr;		// hour, range 0 to 23 (24h format)
+	s["%l"] = ir;		// hour, range 1 to 12 (12h format)
+	s["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m); // month, range 01 to 12
+	s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59
+	s["%n"] = "\n";		// a newline character
+	s["%p"] = pm ? "PM" : "AM";
+	s["%P"] = pm ? "pm" : "am";
+	// FIXME: %r : the time in am/pm notation %I:%M:%S %p
+	// FIXME: %R : the time in 24-hour notation %H:%M
+	s["%s"] = Math.floor(this.getTime() / 1000);
+	s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59
+	s["%t"] = "\t";		// a tab character
+	// FIXME: %T : the time in 24-hour notation (%H:%M:%S)
+	s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn;
+	s["%u"] = w + 1;	// the day of the week (range 1 to 7, 1 = MON)
+	s["%w"] = w;		// the day of the week (range 0 to 6, 0 = SUN)
+	// FIXME: %x : preferred date representation for the current locale without the time
+	// FIXME: %X : preferred time representation for the current locale without the date
+	s["%y"] = ('' + y).substr(2, 2); // year without the century (range 00 to 99)
+	s["%Y"] = y;		// year with the century
+	s["%%"] = "%";		// a literal '%' character
+
+	var re = /%./g;
+	if (!Calendar.is_ie5 && !Calendar.is_khtml) {
+		str = str.replace(re, function (par) { return s[par]; });
+		return str;
+	}
+
+	var a = str.match(re);
+	for (var i = 0; i < a.length; i++) {
+		var tmp = s[a[i]];
+		if (tmp) {
+			re = new RegExp(a[i], 'g');
+			str = str.replace(re, tmp);
+		}
+	}
+
+	return str;
+};
+
+Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear;
+Date.prototype.setFullYear = function(y) {
+	var d = new Date(this);
+	d.__msh_oldSetFullYear(y);
+	if (d.getMonth() != this.getMonth())
+		this.setDate(28);
+	this.__msh_oldSetFullYear(y);
+};
+
+// END: DATE OBJECT PATCHES
+
+
+// global object that remembers the calendar
+window._dynarch_popupCalendar = null;

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-af.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-af.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-af.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,39 @@
+// ** I18N Afrikaans
+Calendar._DN = new Array
+("Sondag",
+ "Maandag",
+ "Dinsdag",
+ "Woensdag",
+ "Donderdag",
+ "Vrydag",
+ "Saterdag",
+ "Sondag");
+Calendar._MN = new Array
+("Januarie",
+ "Februarie",
+ "Maart",
+ "April",
+ "Mei",
+ "Junie",
+ "Julie",
+ "Augustus",
+ "September",
+ "Oktober",
+ "November",
+ "Desember");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["TOGGLE"] = "Verander eerste dag van die week";
+Calendar._TT["PREV_YEAR"] = "Vorige jaar (hou vir keuselys)";
+Calendar._TT["PREV_MONTH"] = "Vorige maand (hou vir keuselys)";
+Calendar._TT["GO_TODAY"] = "Gaan na vandag";
+Calendar._TT["NEXT_MONTH"] = "Volgende maand (hou vir keuselys)";
+Calendar._TT["NEXT_YEAR"] = "Volgende jaar (hou vir keuselys)";
+Calendar._TT["SEL_DATE"] = "Kies datum";
+Calendar._TT["DRAG_TO_MOVE"] = "Sleep om te skuif";
+Calendar._TT["PART_TODAY"] = " (vandag)";
+Calendar._TT["MON_FIRST"] = "Vertoon Maandag eerste";
+Calendar._TT["SUN_FIRST"] = "Display Sunday first";
+Calendar._TT["CLOSE"] = "Close";
+Calendar._TT["TODAY"] = "Today";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-bg.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-bg.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-bg.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,128 @@
+// ** I18N
+
+// Calendar BG language
+// Author: Mihai Bazon, <mihai_bazon en yahoo.com>
+// Translator: Valentin Sheiretsky, <valio en valio.eu.org>
+// Encoding: utf8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("ÐеделÑ",
+ "Понеделник",
+ "Вторник",
+ "СрÑда",
+ "Четвъртък",
+ "Петък",
+ "Събота",
+ "ÐеделÑ");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Ðед",
+ "Пон",
+ "Вто",
+ "СрÑ",
+ "Чет",
+ "Пет",
+ "Съб",
+ "Ðед");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Януари",
+ "Февруари",
+ "Март",
+ "Ðприл",
+ "Май",
+ "Юни",
+ "Юли",
+ "ÐвгуÑÑ‚",
+ "Септември",
+ "Октомври",
+ "Ðоември",
+ "Декември");
+
+// short month names
+Calendar._SMN = new Array
+("Яну",
+ "Фев",
+ "Мар",
+ "Ðпр",
+ "Май",
+ "Юни",
+ "Юли",
+ "Ðвг",
+ "Сеп",
+ "Окт",
+ "Ðое",
+ "Дек");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° календара";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Date selection:\n" +
+"- Use the \xab, \xbb buttons to select year\n" +
+"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
+"- Hold mouse button on any of the above buttons for faster selection.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Time selection:\n" +
+"- Click on any of the time parts to increase it\n" +
+"- or Shift-click to decrease it\n" +
+"- or click and drag for faster selection.";
+
+Calendar._TT["PREV_YEAR"] = "Предна година (задръжте за меню)";
+Calendar._TT["PREV_MONTH"] = "Преден меÑец (задръжте за меню)";
+Calendar._TT["GO_TODAY"] = "Изберете днеÑ";
+Calendar._TT["NEXT_MONTH"] = "Следващ меÑец (задръжте за меню)";
+Calendar._TT["NEXT_YEAR"] = "Следваща година (задръжте за меню)";
+Calendar._TT["SEL_DATE"] = "Изберете дата";
+Calendar._TT["DRAG_TO_MOVE"] = "ПремеÑтване";
+Calendar._TT["PART_TODAY"] = " (днеÑ)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "%s като първи ден";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Затворете";
+Calendar._TT["TODAY"] = "ДнеÑ";
+Calendar._TT["TIME_PART"] = "(Shift-)Click или drag за да промените ÑтойноÑтта";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%A - %e %B %Y";
+
+Calendar._TT["WK"] = "Седм";
+Calendar._TT["TIME"] = "ЧаÑ:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ca.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ca.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ca.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,125 @@
+// ** I18N
+
+// Calendar CA language
+// Author: Mihai Bazon, <mihai_bazon en yahoo.com>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Diumenge",
+ "Dilluns",
+ "Dimarts",
+ "Dimecres",
+ "Dijous",
+ "Divendres",
+ "Dissabte",
+ "Diumenge");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Diu",
+ "Dil",
+ "Dmt",
+ "Dmc",
+ "Dij",
+ "Div",
+ "Dis",
+ "Diu");
+
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Gener",
+ "Febrer",
+ "Març",
+ "Abril",
+ "Maig",
+ "Juny",
+ "Juliol",
+ "Agost",
+ "Setembre",
+ "Octubre",
+ "Novembre",
+ "Desembre");
+
+// short month names
+Calendar._SMN = new Array
+("Gen",
+ "Feb",
+ "Mar",
+ "Abr",
+ "Mai",
+ "Jun",
+ "Jul",
+ "Ago",
+ "Set",
+ "Oct",
+ "Nov",
+ "Des");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Sobre el calendari";
+
+Calendar._TT["ABOUT"] =
+"DHTML Selector de Data/Hora\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Sel.lecció de Dates:\n" +
+"- Fes servir els botons \xab, \xbb per sel.leccionar l'any\n" +
+"- Fes servir els botons " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " per se.lecciconar el mes\n" +
+"- Manté el ratolí apretat en qualsevol dels anteriors per sel.lecció ràpida.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Time selection:\n" +
+"- claca en qualsevol de les parts de la hora per augmentar-les\n" +
+"- o Shift-click per decrementar-la\n" +
+"- or click and arrastra per sel.lecció ràpida.";
+
+Calendar._TT["PREV_YEAR"] = "Any anterior (Mantenir per menu)";
+Calendar._TT["PREV_MONTH"] = "Mes anterior (Mantenir per menu)";
+Calendar._TT["GO_TODAY"] = "Anar a avui";
+Calendar._TT["NEXT_MONTH"] = "Mes següent (Mantenir per menu)";
+Calendar._TT["NEXT_YEAR"] = "Any següent (Mantenir per menu)";
+Calendar._TT["SEL_DATE"] = "Sel.leccionar data";
+Calendar._TT["DRAG_TO_MOVE"] = "Arrastrar per moure";
+Calendar._TT["PART_TODAY"] = " (avui)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Mostra %s primer";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Tanca";
+Calendar._TT["TODAY"] = "Avui";
+Calendar._TT["TIME_PART"] = "(Shift-)Click a arrastra per canviar el valor";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "st";
+Calendar._TT["TIME"] = "Hora:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-cs.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-cs.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-cs.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,72 @@
+/*
+	calendar-cs.js
+	language: Czech
+	encoding: utf-8
+	author: Mishal (mishal AT mishal DOT cz) 
+	        (opraven formát dnů, měsíců + kosmetické změny :-))
+	        Lubos Jerabek (xnet en seznam.cz)
+	        Jan Uhlir (espinosa en centrum.cz)
+*/
+
+// ** I18N
+Calendar._DN  = new Array('nedÄ›le','pondÄ›lí','úterý','stÅ™eda','Ätvrtek','pátek','sobota','nedÄ›le');
+Calendar._SDN = new Array('ne','po','út','st','Ät','pá','so','ne');
+Calendar._MN  = new Array('leden','únor','bÅ™ezen','duben','kvÄ›ten','Äerven','Äervenec','srpen','září','říjen','listopad','prosinec');
+Calendar._SMN = new Array('led','úno','bÅ™e','dub','kvÄ›','Ärn','Ävc','srp','zář','říj','lis','pro');
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 0;
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "O komponentě kalendář";
+Calendar._TT["TOGGLE"] = "Změna prvního dne v týdnu";
+Calendar._TT["PREV_YEAR"] = "Předchozí rok (přidrž pro menu)";
+Calendar._TT["PREV_MONTH"] = "Předchozí měsíc (přidrž pro menu)";
+Calendar._TT["GO_TODAY"] = "Dnešní datum";
+Calendar._TT["NEXT_MONTH"] = "Další měsíc (přidrž pro menu)";
+Calendar._TT["NEXT_YEAR"] = "Další rok (přidrž pro menu)";
+Calendar._TT["SEL_DATE"] = "Vyber datum";
+Calendar._TT["DRAG_TO_MOVE"] = "Chyť a táhni, pro přesun";
+Calendar._TT["PART_TODAY"] = " (dnes)";
+Calendar._TT["MON_FIRST"] = "Ukaž jako první Pondělí";
+//Calendar._TT["SUN_FIRST"] = "Ukaž jako první Neděli";
+
+Calendar._TT["ABOUT"] =
+"DHTML Kalendář\n" +
+"(c) dynarch.com 2002-2005 / Autor: Mihai Bazon\n" + // don't translate this this ;-)
+"Aktuální verzi najdete na: http://www.dynarch.com/projects/calendar/\n" +
+"Distribuováno pod licencí GNU LGPL.  Viz. http://gnu.org/licenses/lgpl.html" +
+"\n\n" +
+"Výběr datumu:\n" +
+"- Použijte \xab, \xbb tlaÄítka k výbÄ›ru roku\n" +
+"- Použijte tlaÄítka " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " k výbÄ›ru mÄ›síce\n" +
+"- Podržte tlaÄítko myÅ¡i na jakémkoliv z tÄ›chto tlaÄítek pro rychlejší výbÄ›r.";
+
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"VýbÄ›r Äasu:\n" +
+"- KliknÄ›te na jakoukoliv z Äástí výbÄ›ru Äasu pro zvýšení.\n" +
+"- nebo shift-click pro snížení\n" +
+"- nebo klikněte a táhněte pro rychlejší výběr.";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Zobraz %s první";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Zavřít";
+Calendar._TT["TODAY"] = "Dnes";
+Calendar._TT["TIME_PART"] = "(Shift-)Klikni nebo táhni pro změnu hodnoty";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "d.m.yy";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "týden";
+Calendar._TT["TIME"] = "ÄŒas:";
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-da.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-da.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-da.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar DA language
+// Author: Michael Thingmand Henriksen, <michael (a) thingmand dot dk>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Søndag",
+"Mandag",
+"Tirsdag",
+"Onsdag",
+"Torsdag",
+"Fredag",
+"Lørdag",
+"Søndag");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Søn",
+"Man",
+"Tir",
+"Ons",
+"Tor",
+"Fre",
+"Lør",
+"Søn");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Januar",
+"Februar",
+"Marts",
+"April",
+"Maj",
+"Juni",
+"Juli",
+"August",
+"September",
+"Oktober",
+"November",
+"December");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+"Feb",
+"Mar",
+"Apr",
+"Maj",
+"Jun",
+"Jul",
+"Aug",
+"Sep",
+"Okt",
+"Nov",
+"Dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Om Kalenderen";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For den seneste version besøg: http://www.dynarch.com/projects/calendar/\n"; +
+"Distribueret under GNU LGPL. Se http://gnu.org/licenses/lgpl.html for detajler." +
+"\n\n" +
+"Valg af dato:\n" +
+"- Brug \xab, \xbb knapperne for at vælge år\n" +
+"- Brug " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " knapperne for at vælge måned\n" +
+"- Hold knappen på musen nede på knapperne ovenfor for hurtigere valg.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Valg af tid:\n" +
+"- Klik på en vilkårlig del for større værdi\n" +
+"- eller Shift-klik for for mindre værdi\n" +
+"- eller klik og træk for hurtigere valg.";
+
+Calendar._TT["PREV_YEAR"] = "Ét år tilbage (hold for menu)";
+Calendar._TT["PREV_MONTH"] = "Én måned tilbage (hold for menu)";
+Calendar._TT["GO_TODAY"] = "GÃ¥ til i dag";
+Calendar._TT["NEXT_MONTH"] = "Én måned frem (hold for menu)";
+Calendar._TT["NEXT_YEAR"] = "Ét år frem (hold for menu)";
+Calendar._TT["SEL_DATE"] = "Vælg dag";
+Calendar._TT["DRAG_TO_MOVE"] = "Træk vinduet";
+Calendar._TT["PART_TODAY"] = " (i dag)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Vis %s først";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Luk";
+Calendar._TT["TODAY"] = "I dag";
+Calendar._TT["TIME_PART"] = "(Shift-)klik eller træk for at ændre værdi";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "Uge";
+Calendar._TT["TIME"] = "Tid:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-de.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-de.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-de.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar EN language
+// Author: Mihai Bazon, <mihai_bazon en yahoo.com>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Sonntag",
+ "Montag",
+ "Dienstag",
+ "Mittwoch",
+ "Donnerstag",
+ "Freitag",
+ "Samstag",
+ "Sonntag");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("So",
+ "Mo",
+ "Di",
+ "Mi",
+ "Do",
+ "Fr",
+ "Sa",
+ "So");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Januar",
+ "Februar",
+ "M\u00e4rz",
+ "April",
+ "Mai",
+ "Juni",
+ "Juli",
+ "August",
+ "September",
+ "Oktober",
+ "November",
+ "Dezember");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "M\u00e4r",
+ "Apr",
+ "Mai",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Okt",
+ "Nov",
+ "Dez");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "\u00DCber dieses Kalendarmodul";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Datum ausw\u00e4hlen:\n" +
+"- Benutzen Sie die \xab, \xbb Buttons um das Jahr zu w\u00e4hlen\n" +
+"- Benutzen Sie die " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " Buttons um den Monat zu w\u00e4hlen\n" +
+"- F\u00fcr eine Schnellauswahl halten Sie die Maustaste \u00fcber diesen Buttons fest.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Zeit ausw\u00e4hlen:\n" +
+"- Klicken Sie auf die Teile der Uhrzeit, um diese zu erh\u00F6hen\n" +
+"- oder klicken Sie mit festgehaltener Shift-Taste um diese zu verringern\n" +
+"- oder klicken und festhalten f\u00fcr Schnellauswahl.";
+
+Calendar._TT["PREV_YEAR"] = "Voriges Jahr (Schnellauswahl: festhalten)";
+Calendar._TT["PREV_MONTH"] = "Voriger Monat (Schnellauswahl: festhalten)";
+Calendar._TT["GO_TODAY"] = "Heute ausw\u00e4hlen";
+Calendar._TT["NEXT_MONTH"] = "N\u00e4chst. Monat (Schnellauswahl: festhalten)";
+Calendar._TT["NEXT_YEAR"] = "N\u00e4chst. Jahr (Schnellauswahl: festhalten)";
+Calendar._TT["SEL_DATE"] = "Datum ausw\u00e4hlen";
+Calendar._TT["DRAG_TO_MOVE"] = "Zum Bewegen festhalten";
+Calendar._TT["PART_TODAY"] = " (Heute)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Woche beginnt mit %s ";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Schlie\u00dfen";
+Calendar._TT["TODAY"] = "Heute";
+Calendar._TT["TIME_PART"] = "(Shift-)Klick oder Festhalten und Ziehen um den Wert zu \u00e4ndern";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "Zeit:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-el.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-el.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-el.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,103 @@
+// ** I18N
+Calendar._DN = new Array
+("ΚυÏιακή",
+ "ΔευτέÏα",
+ "ΤÏίτη",
+ "ΤετάÏτη",
+ "Πέμπτη",
+ "ΠαÏασκευή",
+ "Σάββατο",
+ "ΚυÏιακή");
+
+Calendar._SDN = new Array
+("Κυ",
+ "Δε",
+ "TÏ",
+ "Τε",
+ "Πε",
+ "Πα",
+ "Σα",
+ "Κυ");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+Calendar._MN = new Array
+("ΙανουάÏιος",
+ "ΦεβÏουάÏιος",
+ "ΜάÏτιος",
+ "ΑπÏίλιος",
+ "Μάϊος",
+ "ΙοÏνιος",
+ "ΙοÏλιος",
+ "ΑÏγουστος",
+ "ΣεπτέμβÏιος",
+ "ΟκτώβÏιος",
+ "ÎοέμβÏιος",
+ "ΔεκέμβÏιος");
+
+Calendar._SMN = new Array
+("Ιαν",
+ "Φεβ",
+ "ΜαÏ",
+ "ΑπÏ",
+ "Μαι",
+ "Ιουν",
+ "Ιουλ",
+ "Αυγ",
+ "Σεπ",
+ "Οκτ",
+ "Îοε",
+ "Δεκ");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Για το ημεÏολόγιο";
+
+Calendar._TT["ABOUT"] =
+"Επιλογέας ημεÏομηνίας/ÏŽÏας σε DHTML\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Για τελευταία έκδοση: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Επιλογή ημεÏομηνίας:\n" +
+"- ΧÏησιμοποιείστε τα κουμπιά \xab, \xbb για επιλογή έτους\n" +
+"- ΧÏησιμοποιείστε τα κουμπιά " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " για επιλογή μήνα\n" +
+"- ΚÏατήστε κουμπί Ï€Î¿Î½Ï„Î¹ÎºÎ¿Ï Ï€Î±Ï„Î·Î¼Î­Î½Î¿ στα παÏαπάνω κουμπιά για πιο γÏήγοÏη επιλογή.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Επιλογή ÏŽÏας:\n" +
+"- Κάντε κλικ σε ένα από τα μέÏη της ÏŽÏας για αÏξηση\n" +
+"- ή Shift-κλικ για μείωση\n" +
+"- ή κλικ και μετακίνηση για πιο γÏήγοÏη επιλογή.";
+Calendar._TT["TOGGLE"] = "ΜπάÏα Ï€Ïώτης ημέÏας της εβδομάδας";
+Calendar._TT["PREV_YEAR"] = "ΠÏοηγ. έτος (κÏατήστε για το μενοÏ)";
+Calendar._TT["PREV_MONTH"] = "ΠÏοηγ. μήνας (κÏατήστε για το μενοÏ)";
+Calendar._TT["GO_TODAY"] = "ΣήμεÏα";
+Calendar._TT["NEXT_MONTH"] = "Επόμενος μήνας (κÏατήστε για το μενοÏ)";
+Calendar._TT["NEXT_YEAR"] = "Επόμενο έτος (κÏατήστε για το μενοÏ)";
+Calendar._TT["SEL_DATE"] = "Επιλέξτε ημεÏομηνία";
+Calendar._TT["DRAG_TO_MOVE"] = "ΣÏÏτε για να μετακινήσετε";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Display %s first";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["PART_TODAY"] = " (σήμεÏα)";
+Calendar._TT["MON_FIRST"] = "Εμφάνιση ΔευτέÏας Ï€Ïώτα";
+Calendar._TT["SUN_FIRST"] = "Εμφάνιση ΚυÏιακής Ï€Ïώτα";
+Calendar._TT["CLOSE"] = "Κλείσιμο";
+Calendar._TT["TODAY"] = "ΣήμεÏα";
+Calendar._TT["TIME_PART"] = "(Shift-)κλικ ή μετακίνηση για αλλαγή";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-y";
+Calendar._TT["TT_DATE_FORMAT"] = "D, d M";
+
+Calendar._TT["WK"] = "εβδ";
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-en.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-en.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-en.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar EN language
+// Author: Mihai Bazon, <mihai_bazon en yahoo.com>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday",
+ "Sunday");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Sun",
+ "Mon",
+ "Tue",
+ "Wed",
+ "Thu",
+ "Fri",
+ "Sat",
+ "Sun");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 0;
+
+// full month names
+Calendar._MN = new Array
+("January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "About the calendar";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Date selection:\n" +
+"- Use the \xab, \xbb buttons to select year\n" +
+"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
+"- Hold mouse button on any of the above buttons for faster selection.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Time selection:\n" +
+"- Click on any of the time parts to increase it\n" +
+"- or Shift-click to decrease it\n" +
+"- or click and drag for faster selection.";
+
+Calendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)";
+Calendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)";
+Calendar._TT["GO_TODAY"] = "Go Today";
+Calendar._TT["NEXT_MONTH"] = "Next month (hold for menu)";
+Calendar._TT["NEXT_YEAR"] = "Next year (hold for menu)";
+Calendar._TT["SEL_DATE"] = "Select date";
+Calendar._TT["DRAG_TO_MOVE"] = "Drag to move";
+Calendar._TT["PART_TODAY"] = " (today)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Display %s first";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Close";
+Calendar._TT["TODAY"] = "Today";
+Calendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "Time:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-es.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-es.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-es.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,129 @@
+// ** I18N
+
+// Calendar ES (spanish) language
+// Author: Mihai Bazon, <mihai_bazon en yahoo.com>
+// Updater: Servilio Afre Puentes <servilios en yahoo.com>
+// Updated: 2004-06-03
+// Encoding: utf-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Domingo",
+ "Lunes",
+ "Martes",
+ "Miércoles",
+ "Jueves",
+ "Viernes",
+ "Sábado",
+ "Domingo");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Dom",
+ "Lun",
+ "Mar",
+ "Mié",
+ "Jue",
+ "Vie",
+ "Sáb",
+ "Dom");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Enero",
+ "Febrero",
+ "Marzo",
+ "Abril",
+ "Mayo",
+ "Junio",
+ "Julio",
+ "Agosto",
+ "Septiembre",
+ "Octubre",
+ "Noviembre",
+ "Diciembre");
+
+// short month names
+Calendar._SMN = new Array
+("Ene",
+ "Feb",
+ "Mar",
+ "Abr",
+ "May",
+ "Jun",
+ "Jul",
+ "Ago",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dic");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Acerca del calendario";
+
+Calendar._TT["ABOUT"] =
+"Selector DHTML de Fecha/Hora\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Para conseguir la última versión visite: http://www.dynarch.com/projects/calendar/\n" +
+"Distribuido bajo licencia GNU LGPL. Visite http://gnu.org/licenses/lgpl.html para más detalles." +
+"\n\n" +
+"Selección de fecha:\n" +
+"- Use los botones \xab, \xbb para seleccionar el año\n" +
+"- Use los botones " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " para seleccionar el mes\n" +
+"- Mantenga pulsado el ratón en cualquiera de estos botones para una selección rápida.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Selección de hora:\n" +
+"- Pulse en cualquiera de las partes de la hora para incrementarla\n" +
+"- o pulse las mayúsculas mientras hace clic para decrementarla\n" +
+"- o haga clic y arrastre el ratón para una selección más rápida.";
+
+Calendar._TT["PREV_YEAR"] = "Año anterior (mantener para menú)";
+Calendar._TT["PREV_MONTH"] = "Mes anterior (mantener para menú)";
+Calendar._TT["GO_TODAY"] = "Ir a hoy";
+Calendar._TT["NEXT_MONTH"] = "Mes siguiente (mantener para menú)";
+Calendar._TT["NEXT_YEAR"] = "Año siguiente (mantener para menú)";
+Calendar._TT["SEL_DATE"] = "Seleccionar fecha";
+Calendar._TT["DRAG_TO_MOVE"] = "Arrastrar para mover";
+Calendar._TT["PART_TODAY"] = " (hoy)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Hacer %s primer día de la semana";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Cerrar";
+Calendar._TT["TODAY"] = "Hoy";
+Calendar._TT["TIME_PART"] = "(Mayúscula-)Clic o arrastre para cambiar valor";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d/%m/%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%A, %e de %B de %Y";
+
+Calendar._TT["WK"] = "sem";
+Calendar._TT["TIME"] = "Hora:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-eu.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-eu.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-eu.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,129 @@
+// ** I18N
+
+// Calendar EU (basque) language
+// Author: Xabier Bayon <admin en gaztesarea.net>
+// Updater: Xabier Bayon <admin en gaztesarea.net>
+// Updated: 2005-04-05
+// Encoding: utf-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Igandea",
+ "Astelehena",
+ "Asteartea",
+ "Asteazkena",
+ "Osteguna",
+ "Ostirala",
+ "Larunbata",
+ "Igandea");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Ig",
+ "Al",
+ "Ar",
+ "Az",
+ "Os",
+ "Ol",
+ "La",
+ "Ig");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Urtarrila",
+ "Otsaila",
+ "Martxoa",
+ "Apirila",
+ "Maiatza",
+ "Ekaina",
+ "Uztaila",
+ "Abuztua",
+ "Iraila",
+ "Urria",
+ "Azaroa",
+ "Abendua");
+
+// short month names
+Calendar._SMN = new Array
+("Urt",
+ "Ots",
+ "Mar",
+ "Apr",
+ "Mai",
+ "Eka",
+ "Uzt",
+ "Abu",
+ "Ira",
+ "Urr",
+ "Aza",
+ "Abe");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Egutegiari buruz";
+
+Calendar._TT["ABOUT"] =
+"Data/ordua DHTML hautatzailea\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Bertsio berriena eskuratzeko: http://www.dynarch.com/projects/calendar/\n" +
+"GNU LGPL baimenpean banatua. http://gnu.org/licenses/lgpl.html orrira joan zehaztasun gehiagotarako." +
+"\n\n" +
+"Data nola aukeratu:\n" +
+"- \xab, \xbb botoiak erabili urtea aukeratzeko\n" +
+"- " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " botoiak erabili hilabetea aukeratzeko\n" +
+"- Aukera azkar burutzeko saguaren botoia sakatuta mantendu.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Ordua nola aukeratu:\n" +
+"- Orduan sakatu gehitzeko\n" +
+"- Maiuskula sakatuta ordu kopurua gutxituko da\n" +
+"- Saguaren botoia sakatu eta arrastatuz arinago burutuko da.";
+
+Calendar._TT["PREV_YEAR"] = "Aurreko urtea (Menurako mantendu)";
+Calendar._TT["PREV_MONTH"] = "Aurreko hilabetea (Menurako mantendu)";
+Calendar._TT["GO_TODAY"] = "Gaurkora jo";
+Calendar._TT["NEXT_MONTH"] = "Hurrengo hilabetea (Menurako mantendu)";
+Calendar._TT["NEXT_YEAR"] = "Hurrengo urtea (Menurako mantendu)";
+Calendar._TT["SEL_DATE"] = "Data aukeratu";
+Calendar._TT["DRAG_TO_MOVE"] = "Mugitzeko arrastatu";
+Calendar._TT["PART_TODAY"] = " (gaur)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "%s asteko lehenengo eguna bihurtu";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Itxi";
+Calendar._TT["TODAY"] = "Gaur";
+Calendar._TT["TIME_PART"] = "(Mayúscula-)Clic o arrastre para cambiar valor";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y/%m/%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%Yko %Bren %e, %A";
+
+Calendar._TT["WK"] = "ast";
+Calendar._TT["TIME"] = "Ordua:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-fi.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-fi.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-fi.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,112 @@
+// ** I18N
+
+// Calendar FI language (Finnish, Suomi)
+// Author: Jarno Käyhkö, <gambler en phnet.fi>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// full day names
+Calendar._DN = new Array
+("Sunnuntai",
+ "Maanantai",
+ "Tiistai",
+ "Keskiviikko",
+ "Torstai",
+ "Perjantai",
+ "Lauantai",
+ "Sunnuntai");
+
+// short day names
+Calendar._SDN = new Array
+("Su",
+ "Ma",
+ "Ti",
+ "Ke",
+ "To",
+ "Pe",
+ "La",
+ "Su");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Tammikuu",
+ "Helmikuu",
+ "Maaliskuu",
+ "Huhtikuu",
+ "Toukokuu",
+ "Kesäkuu",
+ "Heinäkuu",
+ "Elokuu",
+ "Syyskuu",
+ "Lokakuu",
+ "Marraskuu",
+ "Joulukuu");
+
+// short month names
+Calendar._SMN = new Array
+("Tam",
+ "Hel",
+ "Maa",
+ "Huh",
+ "Tou",
+ "Kes",
+ "Hei",
+ "Elo",
+ "Syy",
+ "Lok",
+ "Mar",
+ "Jou");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Tietoja kalenterista";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Uusin versio osoitteessa: http://www.dynarch.com/projects/calendar/\n" +
+"Julkaistu GNU LGPL lisenssin alaisuudessa. Lisätietoja osoitteessa http://gnu.org/licenses/lgpl.html" +
+"\n\n" +
+"Päivämäärä valinta:\n" +
+"- Käytä \xab, \xbb painikkeita valitaksesi vuosi\n" +
+"- Käytä " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " painikkeita valitaksesi kuukausi\n" +
+"- Pitämällä hiiren painiketta minkä tahansa yllä olevan painikkeen kohdalla, saat näkyviin valikon nopeampaan siirtymiseen.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Ajan valinta:\n" +
+"- Klikkaa kellonajan numeroita lisätäksesi aikaa\n" +
+"- tai pitämällä Shift-näppäintä pohjassa saat aikaa taaksepäin\n" +
+"- tai klikkaa ja pidä hiiren painike pohjassa sekä liikuta hiirtä muuttaaksesi aikaa nopeasti eteen- ja taaksepäin.";
+
+Calendar._TT["PREV_YEAR"] = "Edell. vuosi (paina hetki, näet valikon)";
+Calendar._TT["PREV_MONTH"] = "Edell. kuukausi (paina hetki, näet valikon)";
+Calendar._TT["GO_TODAY"] = "Siirry tähän päivään";
+Calendar._TT["NEXT_MONTH"] = "Seur. kuukausi (paina hetki, näet valikon)";
+Calendar._TT["NEXT_YEAR"] = "Seur. vuosi (paina hetki, näet valikon)";
+Calendar._TT["SEL_DATE"] = "Valitse päivämäärä";
+Calendar._TT["DRAG_TO_MOVE"] = "Siirrä kalenterin paikkaa";
+Calendar._TT["PART_TODAY"] = " (tänään)";
+Calendar._TT["MON_FIRST"] = "Näytä maanantai ensimmäisenä";
+Calendar._TT["SUN_FIRST"] = "Näytä sunnuntai ensimmäisenä";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Display %s first";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Sulje";
+Calendar._TT["TODAY"] = "Tänään";
+Calendar._TT["TIME_PART"] = "(Shift-) Klikkaa tai liikuta muuttaaksesi aikaa";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%d.%m.%Y";
+
+Calendar._TT["WK"] = "Vko";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-fr.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-fr.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-fr.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,129 @@
+// ** I18N
+
+// Calendar EN language
+// Author: Mihai Bazon, <mihai_bazon en yahoo.com>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// Translator: André Liechti, <developer en sysco.ch> (2006-01-04) from scratch for version 1.x
+
+// full day names
+Calendar._DN = new Array
+("Dimanche",
+ "Lundi",
+ "Mardi",
+ "Mercredi",
+ "Jeudi",
+ "Vendredi",
+ "Samedi",
+ "Dimanche");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Dim",
+ "Lun",
+ "Mar",
+ "Mer",
+ "Jeu",
+ "Ven",
+ "Sam",
+ "Dim");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Janvier",
+ "Février",
+ "Mars",
+ "Avril",
+ "Mai",
+ "Juin",
+ "Juillet",
+ "Août",
+ "Septembre",
+ "Octobre",
+ "Novembre",
+ "Décembre");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Fév",
+ "Mar",
+ "Avr",
+ "Mai",
+ "Juin",
+ "Juil",
+ "Aou",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Déc");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "À propos du calendrier";
+
+Calendar._TT["ABOUT"] =
+"Sélecteur DHTML de date/heure\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Pour la version actuelle, visitez: http://www.dynarch.com/projects/calendar/\n" +
+"Distribué sous licence GNU LGPL.  Voir http://gnu.org/licenses/lgpl.html pour les détails." + "\n(licence traduite en français: http://www.rodage.org/lgpl.fr.html)" +
+"\n\n" +
+"Sélection de la date:\n" +
+"- Utiliser les boutons \xab, \xbb pour sélectionner l'année\n" +
+"- Utiliser les boutons " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " pour sélectionner le mois\n" +
+"- En conservant pressé le bouton de la souris sur l'un de ces boutons, la sélection devient plus rapide.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Sélection de l\'heure:\n" +
+"- Cliquer sur l'une des parties du temps pour l'augmenter\n" +
+"- ou Maj-clic pour le diminuer\n" +
+"- ou faire un cliquer-déplacer horizontal pour une modification plus rapide.";
+
+Calendar._TT["PREV_YEAR"] = "Année préc. (maintenir pour afficher menu)";
+Calendar._TT["PREV_MONTH"] = "Mois préc. (maintenir pour afficher menu)";
+Calendar._TT["GO_TODAY"] = "Atteindre la date du jour";
+Calendar._TT["NEXT_MONTH"] = "Mois suiv. (maintenir pour afficher menu)";
+Calendar._TT["NEXT_YEAR"] = "Année suiv. (maintenir pour afficher menu)";
+Calendar._TT["SEL_DATE"] = "Sélectionner une date";
+Calendar._TT["DRAG_TO_MOVE"] = "Glisser pour déplacer";
+Calendar._TT["PART_TODAY"] = " (aujourd'hui)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Afficher %s en premier";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Fermer";
+Calendar._TT["TODAY"] = "Aujourd'hui";
+Calendar._TT["TIME_PART"] = "(Maj-)Clic ou glisser pour changer la valeur";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%A, %e %B";
+
+Calendar._TT["WK"] = "sem.";
+Calendar._TT["TIME"] = "Heure:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-he.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-he.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-he.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,123 @@
+// ** I18N
+
+// Calendar EN language
+// Author: Idan Sofer, <idan en idanso.dyndns.org>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("ר×שון",
+ "שני",
+ "שלישי",
+ "רביעי",
+ "חמישי",
+ "שישי",
+ "שבת",
+ "ר×שון");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("×",
+ "ב",
+ "×’",
+ "ד",
+ "×”",
+ "ו",
+ "ש",
+ "×");
+
+// full month names
+Calendar._MN = new Array
+("ינו×ר",
+ "פברו×ר",
+ "מרץ",
+ "×פריל",
+ "מ××™",
+ "יוני",
+ "יולי",
+ "×וגוסט",
+ "ספטמבר",
+ "×וקטובר",
+ "נובמבר",
+ "דצמבר");
+
+// short month names
+Calendar._SMN = new Array
+("×™× ×",
+ "פבר",
+ "מרץ",
+ "×פר",
+ "מ××™",
+ "יונ",
+ "יול",
+ "×וג",
+ "ספט",
+ "×וק",
+ "נוב",
+ "דצמ");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "×ודות השנתון";
+
+Calendar._TT["ABOUT"] =
+"בחרן ת×ריך/שעה DHTML\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"×”×’×™×¨×¡× ×”×חרונה זמינה ב: http://www.dynarch.com/projects/calendar/\n" +
+"מופץ תחת זיכיון ×” GNU LGPL.  עיין ב http://gnu.org/licenses/lgpl.html ×œ×¤×¨×˜×™× × ×•×¡×¤×™×." +
+"\n\n" +
+בחירת ת×ריך:\n" +
+"- השתמש ×‘×›×¤×ª×•×¨×™× \xab, \xbb לבחירת שנה\n" +
+"- השתמש ×‘×›×¤×ª×•×¨×™× " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " לבחירת חודש\n" +
+"- החזק העכבר לחוץ מעל ×”×›×¤×ª×•×¨×™× ×”×ž×•×–×›×¨×™× ×œ×¢×™×œ לבחירה מהירה יותר.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"בחירת זמן:\n" +
+"- לחץ על כל ×חד מחלקי הזמן כדי להוסיף\n" +
+"- ×ו shift בשילוב ×¢× ×œ×—×™×¦×” כדי להחסיר\n" +
+"- ×ו לחץ וגרור לפעולה מהירה יותר.";
+
+Calendar._TT["PREV_YEAR"] = "שנה קודמת - החזק לקבלת תפריט";
+Calendar._TT["PREV_MONTH"] = "חודש ×§×•×“× - החזק לקבלת תפריט";
+Calendar._TT["GO_TODAY"] = "עבור להיו×";
+Calendar._TT["NEXT_MONTH"] = "חודש ×”×‘× - החזק לתפריט";
+Calendar._TT["NEXT_YEAR"] = "שנה הב××” - החזק לתפריט";
+Calendar._TT["SEL_DATE"] = "בחר ת×ריך";
+Calendar._TT["DRAG_TO_MOVE"] = "גרור להזזה";
+Calendar._TT["PART_TODAY"] = " )היו×(";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "הצג %s קוד×";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "6";
+
+Calendar._TT["CLOSE"] = "סגור";
+Calendar._TT["TODAY"] = "היו×";
+Calendar._TT["TIME_PART"] = "(שיפט-)לחץ וגרור כדי לשנות ערך";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "שעה::";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-hr.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-hr.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-hr.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,64 @@
+/* Croatian language file for the DHTML Calendar version 0.9.2 
+* Author Krunoslav Zubrinic <krunoslav.zubrinic en vip.hr>, June 2003.
+* Feel free to use this script under the terms of the GNU Lesser General
+* Public License, as long as you do not remove or alter this notice.
+*/
+Calendar._DN = new Array
+("Nedjelja",
+ "Ponedjeljak",
+ "Utorak",
+ "Srijeda",
+ "ÄŒetvrtak",
+ "Petak",
+ "Subota",
+ "Nedjelja");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+Calendar._MN = new Array
+("SijeÄanj",
+ "VeljaÄa",
+ "Ožujak",
+ "Travanj",
+ "Svibanj",
+ "Lipanj",
+ "Srpanj",
+ "Kolovoz",
+ "Rujan",
+ "Listopad",
+ "Studeni",
+ "Prosinac");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["TOGGLE"] = "Promjeni dan s kojim poÄinje tjedan";
+Calendar._TT["PREV_YEAR"] = "Prethodna godina (dugi pritisak za meni)";
+Calendar._TT["PREV_MONTH"] = "Prethodni mjesec (dugi pritisak za meni)";
+Calendar._TT["GO_TODAY"] = "Idi na tekući dan";
+Calendar._TT["NEXT_MONTH"] = "Slijedeći mjesec (dugi pritisak za meni)";
+Calendar._TT["NEXT_YEAR"] = "Slijedeća godina (dugi pritisak za meni)";
+Calendar._TT["SEL_DATE"] = "Izaberite datum";
+Calendar._TT["DRAG_TO_MOVE"] = "Pritisni i povuci za promjenu pozicije";
+Calendar._TT["PART_TODAY"] = " (today)";
+Calendar._TT["MON_FIRST"] = "Prikaži ponedjeljak kao prvi dan";
+Calendar._TT["SUN_FIRST"] = "Prikaži nedjelju kao prvi dan";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Display %s first";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Zatvori";
+Calendar._TT["TODAY"] = "Danas";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-y";
+Calendar._TT["TT_DATE_FORMAT"] = "DD, dd.mm.y";
+
+Calendar._TT["WK"] = "Tje";
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-hu.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-hu.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-hu.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,128 @@
+// ** I18N
+
+// Calendar HU language
+// Author: ???
+// Modifier: KARASZI Istvan, <jscalendar en spam.raszi.hu>
+// Encoding: utf8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Vasárnap",
+ "Hétfő",
+ "Kedd",
+ "Szerda",
+ "Csütörtök",
+ "Péntek",
+ "Szombat",
+ "Vasárnap");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("v",
+ "h",
+ "k",
+ "sze",
+ "cs",
+ "p",
+ "szo",
+ "v");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("január",
+ "február",
+ "március",
+ "április",
+ "május",
+ "június",
+ "július",
+ "augusztus",
+ "szeptember",
+ "október",
+ "november",
+ "december");
+
+// short month names
+Calendar._SMN = new Array
+("jan",
+ "feb",
+ "már",
+ "ápr",
+ "máj",
+ "jún",
+ "júl",
+ "aug",
+ "sze",
+ "okt",
+ "nov",
+ "dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "A kalendáriumról";
+
+Calendar._TT["ABOUT"] =
+"DHTML dátum/idő kiválasztó\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"a legfrissebb verzió megtalálható: http://www.dynarch.com/projects/calendar/\n" +
+"GNU LGPL alatt terjesztve.  Lásd a http://gnu.org/licenses/lgpl.html oldalt a részletekhez." +
+"\n\n" +
+"Dátum választás:\n" +
+"- használja a \xab, \xbb gombokat az év kiválasztásához\n" +
+"- használja a " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " gombokat a hónap kiválasztásához\n" +
+"- tartsa lenyomva az egérgombot a gyors választáshoz.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Idő választás:\n" +
+"- kattintva növelheti az időt\n" +
+"- shift-tel kattintva csökkentheti\n" +
+"- lenyomva tartva és húzva gyorsabban kiválaszthatja.";
+
+Calendar._TT["PREV_YEAR"] = "Előző év (tartsa nyomva a menühöz)";
+Calendar._TT["PREV_MONTH"] = "Előző hónap (tartsa nyomva a menühöz)";
+Calendar._TT["GO_TODAY"] = "Mai napra ugrás";
+Calendar._TT["NEXT_MONTH"] = "Köv. hónap (tartsa nyomva a menühöz)";
+Calendar._TT["NEXT_YEAR"] = "Köv. év (tartsa nyomva a menühöz)";
+Calendar._TT["SEL_DATE"] = "Válasszon dátumot";
+Calendar._TT["DRAG_TO_MOVE"] = "Húzza a mozgatáshoz";
+Calendar._TT["PART_TODAY"] = " (ma)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "%s legyen a hét első napja";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Bezár";
+Calendar._TT["TODAY"] = "Ma";
+Calendar._TT["TIME_PART"] = "(Shift-)Klikk vagy húzás az érték változtatásához";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%b %e, %a";
+
+Calendar._TT["WK"] = "hét";
+Calendar._TT["TIME"] = "idő:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-it.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-it.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-it.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,128 @@
+// ** I18N
+
+// Calendar EN language
+// Author: Mihai Bazon, <mihai_bazon en yahoo.com>
+// Translator: Fabio Di Bernardini, <altraqua en email.it>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Domenica",
+ "Lunedì",
+ "Martedì",
+ "Mercoledì",
+ "Giovedì",
+ "Venerdì",
+ "Sabato",
+ "Domenica");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Dom",
+ "Lun",
+ "Mar",
+ "Mer",
+ "Gio",
+ "Ven",
+ "Sab",
+ "Dom");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Gennaio",
+ "Febbraio",
+ "Marzo",
+ "Aprile",
+ "Maggio",
+ "Giugno",
+ "Luglio",
+ "Augosto",
+ "Settembre",
+ "Ottobre",
+ "Novembre",
+ "Dicembre");
+
+// short month names
+Calendar._SMN = new Array
+("Gen",
+ "Feb",
+ "Mar",
+ "Apr",
+ "Mag",
+ "Giu",
+ "Lug",
+ "Ago",
+ "Set",
+ "Ott",
+ "Nov",
+ "Dic");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Informazioni sul calendario";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Per gli aggiornamenti: http://www.dynarch.com/projects/calendar/\n" +
+"Distribuito sotto licenza GNU LGPL.  Vedi http://gnu.org/licenses/lgpl.html per i dettagli." +
+"\n\n" +
+"Selezione data:\n" +
+"- Usa \xab, \xbb per selezionare l'anno\n" +
+"- Usa  " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " per i mesi\n" +
+"- Tieni premuto a lungo il mouse per accedere alle funzioni di selezione veloce.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Selezione orario:\n" +
+"- Clicca sul numero per incrementarlo\n" +
+"- o Shift+click per decrementarlo\n" +
+"- o click e sinistra o destra per variarlo.";
+
+Calendar._TT["PREV_YEAR"] = "Anno prec.(clicca a lungo per il menù)";
+Calendar._TT["PREV_MONTH"] = "Mese prec. (clicca a lungo per il menù)";
+Calendar._TT["GO_TODAY"] = "Oggi";
+Calendar._TT["NEXT_MONTH"] = "Pross. mese (clicca a lungo per il menù)";
+Calendar._TT["NEXT_YEAR"] = "Pross. anno (clicca a lungo per il menù)";
+Calendar._TT["SEL_DATE"] = "Seleziona data";
+Calendar._TT["DRAG_TO_MOVE"] = "Trascina per spostarlo";
+Calendar._TT["PART_TODAY"] = " (oggi)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Mostra prima %s";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Chiudi";
+Calendar._TT["TODAY"] = "Oggi";
+Calendar._TT["TIME_PART"] = "(Shift-)Click o trascina per cambiare il valore";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a:%b:%e";
+
+Calendar._TT["WK"] = "set";
+Calendar._TT["TIME"] = "Ora:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ja.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ja.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ja.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,135 @@
+// ** I18N
+
+// Calendar JA language
+// Author: AKIMOTO, Hiroki, <akimoto aaaa---t cybozu.co.jp>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// FYI: Locale identifiers for Japanese/Japan are a bit confusing. Use 'ja'.
+//  'ja'   Japanese, Language Code
+//  'JP'   Japan, Country Code
+//  So, 'ja-JP' locale means Japanese in Japan, however, there are no other
+//  countries Japanese primarily used so usually '-JP' is omittable.
+//  Not a small amount of internationalized software use 'jp' in mistake,
+//  but as you see now that the locale name 'ja' is the right one.
+
+// full day names
+Calendar._DN = new Array
+("æ—¥",
+ "月",
+ "ç«",
+ "æ°´",
+ "木",
+ "金",
+ "土",
+ "æ—¥");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("æ—¥",
+ "月",
+ "ç«",
+ "æ°´",
+ "木",
+ "金",
+ "土",
+ "æ—¥");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 0;
+
+// full month names
+Calendar._MN = new Array
+("1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月");
+
+// short month names
+Calendar._SMN = new Array
+("1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "ã“ã®ã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã«ã¤ã„ã¦";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"最新版ã®æƒ…å ±: http://www.dynarch.com/projects/calendar/\n" +
+"GNU LGPL ã§é…布ã•ã‚Œã¦ã„ã¾ã™ã€‚ 詳細㯠http://gnu.org/licenses/lgpl.html ã‚’ã”覧ãã ã•ã„。" +
+"\n\n" +
+"日付ã®é¸æŠž:\n" +
+"- ボタン \xab, \xbb ã§å¹´ã‚’é¸æŠžã—ã¾ã™\n" +
+"- ボタン " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " ã§æœˆã‚’é¸æŠžã—ã¾ã™\n" +
+"- 上記ボタンã§ãƒžã‚¦ã‚¹ã‚’押ã—ãŸã¾ã¾ã«ã™ã‚‹ã¨ã€ã‚ˆã‚Šå¤§ããªç§»å‹•ãŒã§ãã¾ã™";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Time selection:\n" +
+"- Click on any of the time parts to increase it\n" +
+"- or Shift-click to decrease it\n" +
+"- or click and drag for faster selection.";
+
+Calendar._TT["PREV_YEAR"] = "å‰å¹´";
+Calendar._TT["PREV_MONTH"] = "å‰æœˆ";
+Calendar._TT["GO_TODAY"] = "今日";
+Calendar._TT["NEXT_MONTH"] = "翌月";
+Calendar._TT["NEXT_YEAR"] = "翌年";
+Calendar._TT["SEL_DATE"] = "日付é¸æŠž";
+Calendar._TT["DRAG_TO_MOVE"] = "ウィンドウã®ç§»å‹•";
+Calendar._TT["PART_TODAY"] = " (今日)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "%s曜日を週ã®å…ˆé ­ã«";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "é–‰ã˜ã‚‹";
+Calendar._TT["TODAY"] = "今日";
+Calendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%m月 %d日 (%a)";
+
+Calendar._TT["WK"] = "週";
+Calendar._TT["TIME"] = "Time:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ko.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ko.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ko.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,134 @@
+// ** I18N
+
+// Calendar EN language
+// Author: Mihai Bazon, <mihai_bazon en yahoo.com>
+// Translation: Yourim Yi <yyi en yourim.net>
+// Encoding: EUC-KR
+// lang : ko
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+
+Calendar._DN = new Array
+("ì¼ìš”ì¼",
+ "월요ì¼",
+ "화요ì¼",
+ "수요ì¼",
+ "목요ì¼",
+ "금요ì¼",
+ "토요ì¼",
+ "ì¼ìš”ì¼");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("ì¼",
+ "ì›”",
+ "í™”",
+ "수",
+ "목",
+ "금",
+ "토",
+ "ì¼");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("1ì›”",
+ "2ì›”",
+ "3ì›”",
+ "4ì›”",
+ "5ì›”",
+ "6ì›”",
+ "7ì›”",
+ "8ì›”",
+ "9ì›”",
+ "10ì›”",
+ "11ì›”",
+ "12ì›”");
+
+// short month names
+Calendar._SMN = new Array
+("1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "calendar ì— ëŒ€í•´ì„œ";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"\n"+
+"최신 ë²„ì „ì„ ë°›ìœ¼ì‹œë ¤ë©´ http://www.dynarch.com/projects/calendar/ ì— ë°©ë¬¸í•˜ì„¸ìš”\n" +
+"\n"+
+"GNU LGPL ë¼ì´ì„¼ìŠ¤ë¡œ ë°°í¬ë©ë‹ˆë‹¤. \n"+
+"ë¼ì´ì„¼ìŠ¤ì— 대한 ìžì„¸í•œ ë‚´ìš©ì€ http://gnu.org/licenses/lgpl.html ì„ ì½ìœ¼ì„¸ìš”." +
+"\n\n" +
+"날짜 ì„ íƒ:\n" +
+"- ì—°ë„를 ì„ íƒí•˜ë ¤ë©´ \xab, \xbb ë²„íŠ¼ì„ ì‚¬ìš©í•©ë‹ˆë‹¤\n" +
+"- ë‹¬ì„ ì„ íƒí•˜ë ¤ë©´ " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " ë²„íŠ¼ì„ ëˆ„ë¥´ì„¸ìš”\n" +
+"- ê³„ì† ëˆ„ë¥´ê³  있으면 위 ê°’ë“¤ì„ ë¹ ë¥´ê²Œ ì„ íƒí•˜ì‹¤ 수 있습니다.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"시간 ì„ íƒ:\n" +
+"- 마우스로 누르면 ì‹œê°„ì´ ì¦ê°€í•©ë‹ˆë‹¤\n" +
+"- Shift 키와 함께 누르면 ê°ì†Œí•©ë‹ˆë‹¤\n" +
+"- 누른 ìƒíƒœì—ì„œ 마우스를 움ì§ì´ë©´ 좀 ë” ë¹ ë¥´ê²Œ ê°’ì´ ë³€í•©ë‹ˆë‹¤.\n";
+
+Calendar._TT["PREV_YEAR"] = "지난 í•´ (길게 누르면 목ë¡)";
+Calendar._TT["PREV_MONTH"] = "지난 달 (길게 누르면 목ë¡)";
+Calendar._TT["GO_TODAY"] = "오늘 날짜로";
+Calendar._TT["NEXT_MONTH"] = "ë‹¤ìŒ ë‹¬ (길게 누르면 목ë¡)";
+Calendar._TT["NEXT_YEAR"] = "ë‹¤ìŒ í•´ (길게 누르면 목ë¡)";
+Calendar._TT["SEL_DATE"] = "날짜를 ì„ íƒí•˜ì„¸ìš”";
+Calendar._TT["DRAG_TO_MOVE"] = "마우스 드래그로 ì´ë™ 하세요";
+Calendar._TT["PART_TODAY"] = " (오늘)";
+Calendar._TT["MON_FIRST"] = "월요ì¼ì„ í•œ ì£¼ì˜ ì‹œìž‘ ìš”ì¼ë¡œ";
+Calendar._TT["SUN_FIRST"] = "ì¼ìš”ì¼ì„ í•œ ì£¼ì˜ ì‹œìž‘ ìš”ì¼ë¡œ";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Display %s first";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "닫기";
+Calendar._TT["TODAY"] = "오늘";
+Calendar._TT["TIME_PART"] = "(Shift-)í´ë¦­ ë˜ëŠ” 드래그 하세요";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%b/%e [%a]";
+
+Calendar._TT["WK"] = "주";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-lt.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-lt.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-lt.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,128 @@
+// ** I18N
+
+// Calendar LT language
+// Author: Martynas Majeris, <martynas en solmetra.lt>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Sekmadienis",
+ "Pirmadienis",
+ "Antradienis",
+ "TreÄiadienis",
+ "Ketvirtadienis",
+ "Pentadienis",
+ "Šeštadienis",
+ "Sekmadienis");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Sek",
+ "Pir",
+ "Ant",
+ "Tre",
+ "Ket",
+ "Pen",
+ "Šeš",
+ "Sek");
+
+// full month names
+Calendar._MN = new Array
+("Sausis",
+ "Vasaris",
+ "Kovas",
+ "Balandis",
+ "Gegužė",
+ "Birželis",
+ "Liepa",
+ "Rugpjūtis",
+ "RugsÄ—jis",
+ "Spalis",
+ "Lapkritis",
+ "Gruodis");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// short month names
+Calendar._SMN = new Array
+("Sau",
+ "Vas",
+ "Kov",
+ "Bal",
+ "Geg",
+ "Bir",
+ "Lie",
+ "Rgp",
+ "Rgs",
+ "Spa",
+ "Lap",
+ "Gru");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Apie kalendorių";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"NaujausiÄ… versijÄ… rasite: http://www.dynarch.com/projects/calendar/\n" +
+"Platinamas pagal GNU LGPL licencijÄ…. Aplankykite http://gnu.org/licenses/lgpl.html" +
+"\n\n" +
+"Datos pasirinkimas:\n" +
+"- Metų pasirinkimas: \xab, \xbb\n" +
+"- MÄ—nesio pasirinkimas: " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + "\n" +
+"- Nuspauskite ir laikykite pelės klavišą greitesniam pasirinkimui.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Laiko pasirinkimas:\n" +
+"- Spustelkite ant valandų arba minuÄių - skaiÄius padidÄ—s vienetu.\n" +
+"- Jei spausite kartu su Shift, skaiÄius sumažės.\n" +
+"- Greitam pasirinkimui spustelkite ir pajudinkite pelÄ™.";
+
+Calendar._TT["PREV_YEAR"] = "Ankstesni metai (laikykite, jei norite meniu)";
+Calendar._TT["PREV_MONTH"] = "Ankstesnis mÄ—nuo (laikykite, jei norite meniu)";
+Calendar._TT["GO_TODAY"] = "Pasirinkti Å¡iandienÄ…";
+Calendar._TT["NEXT_MONTH"] = "Kitas mÄ—nuo (laikykite, jei norite meniu)";
+Calendar._TT["NEXT_YEAR"] = "Kiti metai (laikykite, jei norite meniu)";
+Calendar._TT["SEL_DATE"] = "Pasirinkite datÄ…";
+Calendar._TT["DRAG_TO_MOVE"] = "Tempkite";
+Calendar._TT["PART_TODAY"] = " (Å¡iandien)";
+Calendar._TT["MON_FIRST"] = "Pirma savaitÄ—s diena - pirmadienis";
+Calendar._TT["SUN_FIRST"] = "Pirma savaitÄ—s diena - sekmadienis";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Display %s first";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Uždaryti";
+Calendar._TT["TODAY"] = "Å iandien";
+Calendar._TT["TIME_PART"] = "Spustelkite arba tempkite jei norite pakeisti";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%A, %Y-%m-%d";
+
+Calendar._TT["WK"] = "sav";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-lv.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-lv.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-lv.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,128 @@
+// ** I18N
+
+// Calendar LV language
+// Author: Juris Valdovskis, <juris en dc.lv>
+// Encoding: utf8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Svētdiena",
+ "Pirmdiena",
+ "Otrdiena",
+ "Trešdiena",
+ "Ceturdiena",
+ "Piektdiena",
+ "Sestdiena",
+ "Svētdiena");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Sv",
+ "Pr",
+ "Ot",
+ "Tr",
+ "Ce",
+ "Pk",
+ "Se",
+ "Sv");
+
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("JanvÄris",
+ "FebruÄris",
+ "Marts",
+ "Aprīlis",
+ "Maijs",
+ "JÅ«nijs",
+ "JÅ«lijs",
+ "Augusts",
+ "Septembris",
+ "Oktobris",
+ "Novembris",
+ "Decembris");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "Mai",
+ "JÅ«n",
+ "JÅ«l",
+ "Aug",
+ "Sep",
+ "Okt",
+ "Nov",
+ "Dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Par kalendÄru";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Datuma izvēle:\n" +
+"- Izmanto \xab, \xbb pogas, lai izvēlētos gadu\n" +
+"- Izmanto " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + "pogas, lai izvēlētos mēnesi\n" +
+"- Turi nospiestu peles pogu uz jebkuru no augstÄk minÄ“tajÄm pogÄm, lai paÄtrinÄtu izvÄ“li.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Laika izvēle:\n" +
+"- UzklikÅ¡Ä·ini uz jebkuru no laika daļÄm, lai palielinÄtu to\n" +
+"- vai Shift-klikÅ¡Ä·is, lai samazinÄtu to\n" +
+"- vai noklikÅ¡Ä·ini un velc uz attiecÄ«go virzienu lai mainÄ«tu ÄtrÄk.";
+
+Calendar._TT["PREV_YEAR"] = "Iepr. gads (turi izvēlnei)";
+Calendar._TT["PREV_MONTH"] = "Iepr. mēnesis (turi izvēlnei)";
+Calendar._TT["GO_TODAY"] = "Å odien";
+Calendar._TT["NEXT_MONTH"] = "NÄkoÅ¡ais mÄ“nesis (turi izvÄ“lnei)";
+Calendar._TT["NEXT_YEAR"] = "NÄkoÅ¡ais gads (turi izvÄ“lnei)";
+Calendar._TT["SEL_DATE"] = "Izvēlies datumu";
+Calendar._TT["DRAG_TO_MOVE"] = "Velc, lai pÄrvietotu";
+Calendar._TT["PART_TODAY"] = " (Å¡odien)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "AttÄ“lot %s kÄ pirmo";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "1,7";
+
+Calendar._TT["CLOSE"] = "Aizvērt";
+Calendar._TT["TODAY"] = "Å odien";
+Calendar._TT["TIME_PART"] = "(Shift-)KlikÅ¡Ä·is vai pÄrvieto, lai mainÄ«tu";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %e %b";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "Laiks:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-nl.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-nl.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-nl.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,76 @@
+// ** I18N
+Calendar._DN = new Array
+("Zondag",
+ "Maandag",
+ "Dinsdag",
+ "Woensdag",
+ "Donderdag",
+ "Vrijdag",
+ "Zaterdag",
+ "Zondag");
+
+Calendar._SDN_len = 2;
+
+Calendar._MN = new Array
+("Januari",
+ "Februari",
+ "Maart",
+ "April",
+ "Mei",
+ "Juni",
+ "Juli",
+ "Augustus",
+ "September",
+ "Oktober",
+ "November",
+ "December");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Info";
+
+Calendar._TT["ABOUT"] =
+"DHTML Datum/Tijd Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" +
+"Ga voor de meest recente versie naar: http://www.dynarch.com/projects/calendar/\n" +
+"Verspreid onder de GNU LGPL. Zie http://gnu.org/licenses/lgpl.html voor details." +
+"\n\n" +
+"Datum selectie:\n" +
+"- Gebruik de \xab \xbb knoppen om een jaar te selecteren\n" +
+"- Gebruik de " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " knoppen om een maand te selecteren\n" +
+"- Houd de muis ingedrukt op de genoemde knoppen voor een snellere selectie.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Tijd selectie:\n" +
+"- Klik op een willekeurig onderdeel van het tijd gedeelte om het te verhogen\n" +
+"- of Shift-klik om het te verlagen\n" +
+"- of klik en sleep voor een snellere selectie.";
+
+//Calendar._TT["TOGGLE"] = "Selecteer de eerste week-dag";
+Calendar._TT["PREV_YEAR"] = "Vorig jaar (ingedrukt voor menu)";
+Calendar._TT["PREV_MONTH"] = "Vorige maand (ingedrukt voor menu)";
+Calendar._TT["GO_TODAY"] = "Ga naar Vandaag";
+Calendar._TT["NEXT_MONTH"] = "Volgende maand (ingedrukt voor menu)";
+Calendar._TT["NEXT_YEAR"] = "Volgend jaar (ingedrukt voor menu)";
+Calendar._TT["SEL_DATE"] = "Selecteer datum";
+Calendar._TT["DRAG_TO_MOVE"] = "Klik en sleep om te verplaatsen";
+Calendar._TT["PART_TODAY"] = " (vandaag)";
+//Calendar._TT["MON_FIRST"] = "Toon Maandag eerst";
+//Calendar._TT["SUN_FIRST"] = "Toon Zondag eerst";
+
+Calendar._TT["DAY_FIRST"] = "Toon %s eerst";
+
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Sluiten";
+Calendar._TT["TODAY"] = "(vandaag)";
+Calendar._TT["TIME_PART"] = "(Shift-)Klik of sleep om de waarde te veranderen";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %e %b %Y";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "Tijd:";
+
+Calendar._SMN_len = 3;
+Calendar._FD = 0;

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-no.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-no.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-no.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,129 @@
+// ** I18N
+
+// Calendar NO language
+// Author: Daniel Holmen, <daniel.holmen en ciber.no>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Søndag",
+ "Mandag",
+ "Tirsdag",
+ "Onsdag",
+ "Torsdag",
+ "Fredag",
+ "Lørdag",
+ "Søndag");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Søn",
+ "Man",
+ "Tir",
+ "Ons",
+ "Tor",
+ "Fre",
+ "Lør",
+ "Søn");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 0;
+
+// full month names
+Calendar._MN = new Array
+("Januar",
+ "Februar",
+ "Mars",
+ "April",
+ "Mai",
+ "Juni",
+ "Juli",
+ "August",
+ "September",
+ "Oktober",
+ "November",
+ "Desember");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "Mai",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Okt",
+ "Nov",
+ "Des");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Om kalenderen";
+
+Calendar._TT["ABOUT"] =
+"DHTML Dato-/Tidsvelger\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For nyeste versjon, gå til: http://www.dynarch.com/projects/calendar/\n" +
+"Distribuert under GNU LGPL.  Se http://gnu.org/licenses/lgpl.html for detaljer." +
+"\n\n" +
+"Datovalg:\n" +
+"- Bruk knappene \xab og \xbb for å velge år\n" +
+"- Bruk knappene " + String.fromCharCode(0x2039) + " og " + String.fromCharCode(0x203a) + " for å velge måned\n" +
+"- Hold inne musknappen eller knappene over for raskere valg.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Tidsvalg:\n" +
+"- Klikk på en av tidsdelene for å øke den\n" +
+"- eller Shift-klikk for å senke verdien\n" +
+"- eller klikk-og-dra for raskere valg..";
+
+Calendar._TT["PREV_YEAR"] = "Forrige. år (hold for meny)";
+Calendar._TT["PREV_MONTH"] = "Forrige. måned (hold for meny)";
+Calendar._TT["GO_TODAY"] = "GÃ¥ til idag";
+Calendar._TT["NEXT_MONTH"] = "Neste måned (hold for meny)";
+Calendar._TT["NEXT_YEAR"] = "Neste år (hold for meny)";
+Calendar._TT["SEL_DATE"] = "Velg dato";
+Calendar._TT["DRAG_TO_MOVE"] = "Dra for å flytte";
+Calendar._TT["PART_TODAY"] = " (idag)";
+Calendar._TT["MON_FIRST"] = "Vis mandag først";
+Calendar._TT["SUN_FIRST"] = "Vis søndag først";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Vis %s først";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0";
+
+Calendar._TT["CLOSE"] = "Lukk";
+Calendar._TT["TODAY"] = "Idag";
+Calendar._TT["TIME_PART"] = "(Shift-)Klikk eller dra for å endre verdi";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "uke";
+Calendar._TT["TIME"] = "Tid:";
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-pl.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-pl.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-pl.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar PL language
+// Author: Krzychu Danek, <krzychu.danek en gmail.com>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Niedziela",
+ "Poniedziałek",
+ "Wtorek",
+ "Åšroda",
+ "Czwartek",
+ "PiÄ…tek",
+ "Sobota",
+ "Niedziela");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("N",
+ "Pon",
+ "Wt",
+ "Åšr",
+ "Czw",
+ "Pi",
+ "So",
+ "N");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Styczeń",
+ "Luty",
+ "Marzec",
+ "Kwiecień",
+ "Maj",
+ "Czerwiec",
+ "Lipiec",
+ "Sierpień",
+ "Wrzesień",
+ "Październik",
+ "Listopad",
+ "Grudzień");
+
+// short month names
+Calendar._SMN = new Array
+("Sty",
+ "Lut",
+ "Mar",
+ "Kwi",
+ "Maj",
+ "Cze",
+ "Lip",
+ "Sie",
+ "Wrz",
+ "Paź",
+ "Lis",
+ "Gru");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "O kalendarzu";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Wybór daty:\n" +
+"- aby wybrać rok użyj przycisków \xab, \xbb\n" +
+"- aby wybrać miesiąc użyj przycisków " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + "\n" +
+"- aby przyspieszyć wybór przytrzymaj wciśnięty przycisk myszy nad ww. przyciskami.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Wybór czasu:\n" +
+"- aby zwiększyć wartość kliknij na dowolnym elemencie selekcji czasu\n" +
+"- aby zmniejszyć wartość użyj dodatkowo klawisza Shift\n" +
+"- możesz również poruszać myszkę w lewo i prawo wraz z wciśniętym lewym klawiszem.";
+
+Calendar._TT["PREV_YEAR"] = "Poprz. rok (przytrzymaj dla menu)";
+Calendar._TT["PREV_MONTH"] = "Poprz. miesiÄ…c (przytrzymaj dla menu)";
+Calendar._TT["GO_TODAY"] = "Pokaż dziś";
+Calendar._TT["NEXT_MONTH"] = "Nast. miesiÄ…c (przytrzymaj dla menu)";
+Calendar._TT["NEXT_YEAR"] = "Nast. rok (przytrzymaj dla menu)";
+Calendar._TT["SEL_DATE"] = "Wybierz datÄ™";
+Calendar._TT["DRAG_TO_MOVE"] = "Przesuń okienko";
+Calendar._TT["PART_TODAY"] = " (dziÅ›)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Pokaż dzień %s jako pierwszy";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Zamknij";
+Calendar._TT["TODAY"] = "DziÅ›";
+Calendar._TT["TIME_PART"] = "(Shift-)klik | drag, aby zmienić wartość";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "Czas:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-pt.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-pt.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-pt.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,130 @@
+// ** I18N
+
+// Calendar pt_BR language
+// Author: Adalberto Machado, <betosm en terra.com.br>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Domingo",
+ "Segunda",
+ "Terca",
+ "Quarta",
+ "Quinta",
+ "Sexta",
+ "Sabado",
+ "Domingo");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Dom",
+ "Seg",
+ "Ter",
+ "Qua",
+ "Qui",
+ "Sex",
+ "Sab",
+ "Dom");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 0;
+
+// full month names
+Calendar._MN = new Array
+("Janeiro",
+ "Fevereiro",
+ "Marco",
+ "Abril",
+ "Maio",
+ "Junho",
+ "Julho",
+ "Agosto",
+ "Setembro",
+ "Outubro",
+ "Novembro",
+ "Dezembro");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Fev",
+ "Mar",
+ "Abr",
+ "Mai",
+ "Jun",
+ "Jul",
+ "Ago",
+ "Set",
+ "Out",
+ "Nov",
+ "Dez");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Sobre o calendario";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Ultima versao visite: http://www.dynarch.com/projects/calendar/\n" +
+"Distribuido sobre GNU LGPL.  Veja http://gnu.org/licenses/lgpl.html para detalhes." +
+"\n\n" +
+"Selecao de data:\n" +
+"- Use os botoes \xab, \xbb para selecionar o ano\n" +
+"- Use os botoes " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " para selecionar o mes\n" +
+"- Segure o botao do mouse em qualquer um desses botoes para selecao rapida.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Selecao de hora:\n" +
+"- Clique em qualquer parte da hora para incrementar\n" +
+"- ou Shift-click para decrementar\n" +
+"- ou clique e segure para selecao rapida.";
+
+Calendar._TT["PREV_YEAR"] = "Ant. ano (segure para menu)";
+Calendar._TT["PREV_MONTH"] = "Ant. mes (segure para menu)";
+Calendar._TT["GO_TODAY"] = "Hoje";
+Calendar._TT["NEXT_MONTH"] = "Prox. mes (segure para menu)";
+Calendar._TT["NEXT_YEAR"] = "Prox. ano (segure para menu)";
+Calendar._TT["SEL_DATE"] = "Selecione a data";
+Calendar._TT["DRAG_TO_MOVE"] = "Arraste para mover";
+Calendar._TT["PART_TODAY"] = " (hoje)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Mostre %s primeiro";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Fechar";
+Calendar._TT["TODAY"] = "Hoje";
+Calendar._TT["TIME_PART"] = "(Shift-)Click ou arraste para mudar valor";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d/%m/%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %e %b";
+
+Calendar._TT["WK"] = "sm";
+Calendar._TT["TIME"] = "Hora:";
+
+Calendar._SMN_len = 3;
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-pt_BR.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-pt_BR.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-pt_BR.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,112 @@
+// ** I18N
+
+// Calendar pt-BR language
+// Author: Fernando Dourado, <fernando.dourado en ig.com.br>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Domingo",
+ "Segunda",
+ "Terça",
+ "Quarta",
+ "Quinta",
+ "Sexta",
+ "Sabádo",
+ "Domingo");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+// [No changes using default values]
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 0;
+
+// full month names
+Calendar._MN = new Array
+("Janeiro",
+ "Fevereiro",
+ "Março",
+ "Abril",
+ "Maio",
+ "Junho",
+ "Julho",
+ "Agosto",
+ "Setembro",
+ "Outubro",
+ "Novembro",
+ "Dezembro");
+
+// short month names
+// [No changes using default values]
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Sobre o calendário";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Translate to portuguese Brazil (pt-BR) by Fernando Dourado (fernando.dourado en ig.com.br)\n" +
+"Tradução para o português Brasil (pt-BR) por Fernando Dourado (fernando.dourado en ig.com.br)" +
+"\n\n" +
+"Selecionar data:\n" +
+"- Use as teclas \xab, \xbb para selecionar o ano\n" +
+"- Use as teclas " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " para selecionar o mês\n" +
+"- Clique e segure com o mouse em qualquer botão para selecionar rapidamente.";
+
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Selecionar hora:\n" +
+"- Clique em qualquer uma das partes da hora para aumentar\n" +
+"- ou Shift-clique para diminuir\n" +
+"- ou clique e arraste para selecionar rapidamente.";
+
+Calendar._TT["PREV_YEAR"] = "Ano anterior (clique e segure para menu)";
+Calendar._TT["PREV_MONTH"] = "Mês anterior (clique e segure para menu)";
+Calendar._TT["GO_TODAY"] = "Ir para a data atual";
+Calendar._TT["NEXT_MONTH"] = "Próximo mês (clique e segure para menu)";
+Calendar._TT["NEXT_YEAR"] = "Próximo ano (clique e segure para menu)";
+Calendar._TT["SEL_DATE"] = "Selecione uma data";
+Calendar._TT["DRAG_TO_MOVE"] = "Clique e segure para mover";
+Calendar._TT["PART_TODAY"] = " (hoje)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Exibir %s primeiro";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Fechar";
+Calendar._TT["TODAY"] = "Hoje";
+Calendar._TT["TIME_PART"] = "(Shift-)Clique ou arraste para mudar o valor";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d/%m/%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%d de %B de %Y";
+
+Calendar._TT["WK"] = "sem";
+Calendar._TT["TIME"] = "Hora:";
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ro.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ro.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ro.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,72 @@
+// ** I18N
+Calendar._DN = new Array
+("Duminică",
+ "Luni",
+ "Marţi",
+ "Miercuri",
+ "Joi",
+ "Vineri",
+ "Sâmbătă",
+ "Duminică");
+Calendar._SDN_len = 2;
+
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+Calendar._MN = new Array
+("Ianuarie",
+ "Februarie",
+ "Martie",
+ "Aprilie",
+ "Mai",
+ "Iunie",
+ "Iulie",
+ "August",
+ "Septembrie",
+ "Octombrie",
+ "Noiembrie",
+ "Decembrie");
+
+// tooltips
+Calendar._TT = {};
+
+Calendar._TT["INFO"] = "Despre calendar";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Pentru ultima versiune vizitaţi: http://www.dynarch.com/projects/calendar/\n" +
+"Distribuit sub GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Selecţia datei:\n" +
+"- Folosiţi butoanele \xab, \xbb pentru a selecta anul\n" +
+"- Folosiţi butoanele " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " pentru a selecta luna\n" +
+"- Tineţi butonul mouse-ului apăsat pentru selecţie mai rapidă.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Selecţia orei:\n" +
+"- Click pe ora sau minut pentru a mări valoarea cu 1\n" +
+"- Sau Shift-Click pentru a micÅŸora valoarea cu 1\n" +
+"- Sau Click ÅŸi drag pentru a selecta mai repede.";
+
+Calendar._TT["PREV_YEAR"] = "Anul precedent (lung pt menu)";
+Calendar._TT["PREV_MONTH"] = "Luna precedentă (lung pt menu)";
+Calendar._TT["GO_TODAY"] = "Data de azi";
+Calendar._TT["NEXT_MONTH"] = "Luna următoare (lung pt menu)";
+Calendar._TT["NEXT_YEAR"] = "Anul următor (lung pt menu)";
+Calendar._TT["SEL_DATE"] = "Selectează data";
+Calendar._TT["DRAG_TO_MOVE"] = "Trage pentru a miÅŸca";
+Calendar._TT["PART_TODAY"] = " (astăzi)";
+Calendar._TT["DAY_FIRST"] = "Afişează %s prima zi";
+Calendar._TT["WEEKEND"] = "0,6";
+Calendar._TT["CLOSE"] = "ÃŽnchide";
+Calendar._TT["TODAY"] = "Astăzi";
+Calendar._TT["TIME_PART"] = "(Shift-)Click sau drag pentru a selecta";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%A, %d %B";
+
+Calendar._TT["WK"] = "spt";
+Calendar._TT["TIME"] = "Ora:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ru.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ru.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-ru.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar RU language
+// Translation: Sly Golovanov, http://golovanov.net, <sly en golovanov.net>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("воÑкреÑенье",
+ "понедельник",
+ "вторник",
+ "Ñреда",
+ "четверг",
+ "пÑтница",
+ "Ñуббота",
+ "воÑкреÑенье");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("вÑк",
+ "пон",
+ "втр",
+ "Ñрд",
+ "чет",
+ "пÑÑ‚",
+ "Ñуб",
+ "вÑк");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Ñнварь",
+ "февраль",
+ "март",
+ "апрель",
+ "май",
+ "июнь",
+ "июль",
+ "авгуÑÑ‚",
+ "ÑентÑбрь",
+ "октÑбрь",
+ "ноÑбрь",
+ "декабрь");
+
+// short month names
+Calendar._SMN = new Array
+("Ñнв",
+ "фев",
+ "мар",
+ "апр",
+ "май",
+ "июн",
+ "июл",
+ "авг",
+ "Ñен",
+ "окт",
+ "ноÑ",
+ "дек");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "О календаре...";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Как выбрать дату:\n" +
+"- При помощи кнопок \xab, \xbb можно выбрать год\n" +
+"- При помощи кнопок " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " можно выбрать меÑÑц\n" +
+"- Подержите Ñти кнопки нажатыми, чтобы поÑвилоÑÑŒ меню быÑтрого выбора.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Как выбрать времÑ:\n" +
+"- При клике на чаÑах или минутах они увеличиваютÑÑ\n" +
+"- при клике Ñ Ð½Ð°Ð¶Ð°Ñ‚Ð¾Ð¹ клавишей Shift они уменьшаютÑÑ\n" +
+"- еÑли нажать и двигать мышкой влево/вправо, они будут менÑÑ‚ÑŒÑÑ Ð±Ñ‹Ñтрее.";
+
+Calendar._TT["PREV_YEAR"] = "Ðа год назад (удерживать Ð´Ð»Ñ Ð¼ÐµÐ½ÑŽ)";
+Calendar._TT["PREV_MONTH"] = "Ðа меÑÑц назад (удерживать Ð´Ð»Ñ Ð¼ÐµÐ½ÑŽ)";
+Calendar._TT["GO_TODAY"] = "СегоднÑ";
+Calendar._TT["NEXT_MONTH"] = "Ðа меÑÑц вперед (удерживать Ð´Ð»Ñ Ð¼ÐµÐ½ÑŽ)";
+Calendar._TT["NEXT_YEAR"] = "Ðа год вперед (удерживать Ð´Ð»Ñ Ð¼ÐµÐ½ÑŽ)";
+Calendar._TT["SEL_DATE"] = "Выберите дату";
+Calendar._TT["DRAG_TO_MOVE"] = "ПеретаÑкивайте мышкой";
+Calendar._TT["PART_TODAY"] = " (ÑегоднÑ)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Первый день недели будет %s";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Закрыть";
+Calendar._TT["TODAY"] = "СегоднÑ";
+Calendar._TT["TIME_PART"] = "(Shift-)клик или нажать и двигать";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%e %b, %a";
+
+Calendar._TT["WK"] = "нед";
+Calendar._TT["TIME"] = "ВремÑ:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sk.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sk.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sk.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar EN language
+// Author: Mihai Bazon, <mihai_bazon en yahoo.com>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Nedeľa",
+ "Pondelok",
+ "Utorok",
+ "Streda",
+ "Å tvrtok",
+ "Piatok",
+ "Sobota",
+ "Nedeľa");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Ne",
+ "Po",
+ "Ut",
+ "St",
+ "Å t",
+ "Pi",
+ "So",
+ "Ne");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Január",
+ "Február",
+ "Marec",
+ "Apríl",
+ "Máj",
+ "Jún",
+ "Júl",
+ "August",
+ "September",
+ "Október",
+ "November",
+ "December");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "Máj",
+ "Jún",
+ "Júl",
+ "Aug",
+ "Sep",
+ "Okt",
+ "Nov",
+ "Dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "O kalendári";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Autor: Mihai Bazon\n" + // don't translate this this ;-)
+"Poslednú verziu nájdete na: http://www.dynarch.com/projects/calendar/\n" +
+"Distribuované pod licenciou GNU LGPL /http://gnu.org/licenses/lgpl.html/" +
+"\n\n" +
+"Výber dátumu:\n" +
+"- Použite tlaÄidlá \xab, \xbb pre výber roku\n" +
+"- Použite tlaÄidlá " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " pre výber mesiaca\n" +
+"- Podrž tlaÄidlo myÅ¡i nad akýmkoľvek tlaÄidlom pre rýchlejší výber.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Výber Äasu:\n" +
+"- Kliknutie na niektorú položku Äasu ju zväÄší\n" +
+"- Shift-kliknutie ju zmenší\n" +
+"- ak necháte tlaÄítko myÅ¡i stlaÄené, posúvaním meníte hodnotu.";
+
+Calendar._TT["PREV_YEAR"] = "Predošlý rok (podržte pre menu)";
+Calendar._TT["PREV_MONTH"] = "Predošlý mesiac (podržte pre menu)";
+Calendar._TT["GO_TODAY"] = "Prejsť na dnešok";
+Calendar._TT["NEXT_MONTH"] = "Nasled. mesiac (podržte pre menu)";
+Calendar._TT["NEXT_YEAR"] = "Nasled. rok (podržte pre menu)";
+Calendar._TT["SEL_DATE"] = "Vyberte dátum";
+Calendar._TT["DRAG_TO_MOVE"] = "Podržaním tlaÄítka zmeňte polohu";
+Calendar._TT["PART_TODAY"] = " (dnes)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Zobraz %s first";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Zavrieť";
+Calendar._TT["TODAY"] = "Dnes";
+Calendar._TT["TIME_PART"] = "(Shift-)klik/ťahanie zmení hodnotu";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "týž";
+Calendar._TT["TIME"] = "ÄŒas:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sl.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sl.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sl.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,109 @@
+/* Slovenian language file for the DHTML Calendar version 0.9.2 
+* Author David Milost <mercy en volja.net>, January 2004.
+* Feel free to use this script under the terms of the GNU Lesser General
+* Public License, as long as you do not remove or alter this notice.
+*/
+ // full day names
+Calendar._DN = new Array
+("Nedelja",
+ "Ponedeljek",
+ "Torek",
+ "Sreda",
+ "ÄŒetrtek",
+ "Petek",
+ "Sobota",
+ "Nedelja");
+ // short day names
+ Calendar._SDN = new Array
+("Ned",
+ "Pon",
+ "Tor",
+ "Sre",
+ "ÄŒet",
+ "Pet",
+ "Sob",
+ "Ned");
+// short month names
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "Maj",
+ "Jun",
+ "Jul",
+ "Avg",
+ "Sep",
+ "Okt",
+ "Nov",
+ "Dec");
+  // full month names
+Calendar._MN = new Array
+("Januar",
+ "Februar",
+ "Marec",
+ "April",
+ "Maj",
+ "Junij",
+ "Julij",
+ "Avgust",
+ "September",
+ "Oktober",
+ "November",
+ "December");
+
+// tooltips
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "O koledarju";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Za zadnjo verzijo pojdine na naslov: http://www.dynarch.com/projects/calendar/\n" +
+"Distribuirano pod GNU LGPL.  Poglejte http://gnu.org/licenses/lgpl.html za podrobnosti." +
+"\n\n" +
+"Izbor datuma:\n" +
+"- Uporabite \xab, \xbb gumbe za izbor leta\n" +
+"- Uporabite " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " gumbe za izbor meseca\n" +
+"- Zadržite klik na kateremkoli od zgornjih gumbov za hiter izbor.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Izbor ćasa:\n" +
+"- Kliknite na katerikoli del ćasa za poveć. le-tega\n" +
+"- ali Shift-click za zmanj. le-tega\n" +
+"- ali kliknite in povlecite za hiter izbor.";
+
+Calendar._TT["TOGGLE"] = "Spremeni dan s katerim se prićne teden";
+Calendar._TT["PREV_YEAR"] = "Predhodnje leto (dolg klik za meni)";
+Calendar._TT["PREV_MONTH"] = "Predhodnji mesec (dolg klik za meni)";
+Calendar._TT["GO_TODAY"] = "Pojdi na tekoći dan";
+Calendar._TT["NEXT_MONTH"] = "Naslednji mesec (dolg klik za meni)";
+Calendar._TT["NEXT_YEAR"] = "Naslednje leto (dolg klik za meni)";
+Calendar._TT["SEL_DATE"] = "Izberite datum";
+Calendar._TT["DRAG_TO_MOVE"] = "Pritisni in povleci za spremembo pozicije";
+Calendar._TT["PART_TODAY"] = " (danes)";
+Calendar._TT["MON_FIRST"] = "Prikaži ponedeljek kot prvi dan";
+Calendar._TT["SUN_FIRST"] = "Prikaži nedeljo kot prvi dan";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Display %s first";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Zapri";
+Calendar._TT["TODAY"] = "Danes";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "Ted";
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sq.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sq.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sq.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,104 @@
+// Calendar ALBANIAN language
+//author Rigels Gordani rige en hotmail.com
+
+// ditet
+Calendar._DN = new Array
+("E Diele",
+"E Hene",
+"E Marte",
+"E Merkure",
+"E Enjte",
+"E Premte",
+"E Shtune",
+"E Diele");
+
+//ditet shkurt
+Calendar._SDN = new Array
+("Die",
+"Hen",
+"Mar",
+"Mer",
+"Enj",
+"Pre",
+"Sht",
+"Die");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// muajt
+Calendar._MN = new Array
+("Janar",
+"Shkurt",
+"Mars",
+"Prill",
+"Maj",
+"Qeshor",
+"Korrik",
+"Gusht",
+"Shtator",
+"Tetor",
+"Nentor",
+"Dhjetor");
+
+// muajte shkurt
+Calendar._SMN = new Array
+("Jan",
+"Shk",
+"Mar",
+"Pri",
+"Maj",
+"Qes",
+"Kor",
+"Gus",
+"Sht",
+"Tet",
+"Nen",
+"Dhj");
+
+// ndihmesa
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Per kalendarin";
+
+Calendar._TT["ABOUT"] =
+"Zgjedhes i ores/dates ne DHTML \n" +
+"\n\n" +"Zgjedhja e Dates:\n" +
+"- Perdor butonat \xab, \xbb per te zgjedhur vitin\n" +
+"- Perdor  butonat" + String.fromCharCode(0x2039) + ", " + 
+String.fromCharCode(0x203a) +
+" per te  zgjedhur muajin\n" +
+"- Mbani shtypur butonin e mousit per nje zgjedje me te shpejte.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Zgjedhja e kohes:\n" +
+"- Kliko tek ndonje nga pjeset e ores per ta rritur ate\n" +
+"- ose kliko me Shift per ta zvogeluar ate\n" +
+"- ose cliko dhe terhiq per zgjedhje me te shpejte.";
+
+Calendar._TT["PREV_YEAR"] = "Viti i shkuar (prit per menune)";
+Calendar._TT["PREV_MONTH"] = "Muaji i shkuar (prit per menune)";
+Calendar._TT["GO_TODAY"] = "Sot";
+Calendar._TT["NEXT_MONTH"] = "Muaji i ardhshem (prit per menune)";
+Calendar._TT["NEXT_YEAR"] = "Viti i ardhshem (prit per menune)";
+Calendar._TT["SEL_DATE"] = "Zgjidh daten";
+Calendar._TT["DRAG_TO_MOVE"] = "Terhiqe per te levizur";
+Calendar._TT["PART_TODAY"] = " (sot)";
+
+// "%s" eshte dita e pare e javes
+// %s do te zevendesohet me emrin e dite
+Calendar._TT["DAY_FIRST"] = "Trego te %s te paren";
+
+
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Mbyll";
+Calendar._TT["TODAY"] = "Sot";
+Calendar._TT["TIME_PART"] = "Kliko me (Shift-)ose terhiqe per te ndryshuar vleren";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "Java";
+Calendar._TT["TIME"] = "Koha:";
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sr.js
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sr.js
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sv.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sv.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-sv.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,132 @@
+// ** I18N
+
+// Calendar SV language (Swedish, svenska)
+// Author: Mihai Bazon, <mihai_bazon en yahoo.com>
+// Translation team: <sv en li.org>
+// Translator: Leonard Norrgård <leonard.norrgard en refactor.fi>
+// Last translator: Emil Ljungdahl <emil en kratern.se>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("söndag",
+ "måndag",
+ "tisdag",
+ "onsdag",
+ "torsdag",
+ "fredag",
+ "lördag",
+ "söndag");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("sön",
+ "mån",
+ "tis",
+ "ons",
+ "tor",
+ "fre",
+ "lör",
+ "sön");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("januari",
+ "februari",
+ "mars",
+ "april",
+ "maj",
+ "juni",
+ "juli",
+ "augusti",
+ "september",
+ "oktober",
+ "november",
+ "december");
+
+// short month names
+Calendar._SMN = new Array
+("jan",
+ "feb",
+ "mar",
+ "apr",
+ "maj",
+ "jun",
+ "jul",
+ "aug",
+ "sep",
+ "okt",
+ "nov",
+ "dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Om kalendern";
+
+Calendar._TT["ABOUT"] =
+"DHTML Datum/tid-väljare\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"För senaste version gå till: http://www.dynarch.com/projects/calendar/\n" +
+"Distribueras under GNU LGPL.  Se http://gnu.org/licenses/lgpl.html för detaljer." +
+"\n\n" +
+"Val av datum:\n" +
+"- Använd knapparna \xab, \xbb för att välja år\n" +
+"- Använd knapparna " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " för att välja månad\n" +
+"- Håll musknappen nedtryckt på någon av ovanstående knappar för snabbare val.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Val av tid:\n" +
+"- Klicka på en del av tiden för att öka den delen\n" +
+"- eller skift-klicka för att minska den\n" +
+"- eller klicka och drag för snabbare val.";
+
+Calendar._TT["PREV_YEAR"] = "Föregående år (håll för menu)";
+Calendar._TT["PREV_MONTH"] = "Föregående månad (håll för menu)";
+Calendar._TT["GO_TODAY"] = "GÃ¥ till dagens datum";
+Calendar._TT["NEXT_MONTH"] = "Följande månad (håll för menu)";
+Calendar._TT["NEXT_YEAR"] = "Följande år (håll för menu)";
+Calendar._TT["SEL_DATE"] = "Välj datum";
+Calendar._TT["DRAG_TO_MOVE"] = "Drag för att flytta";
+Calendar._TT["PART_TODAY"] = " (idag)";
+Calendar._TT["MON_FIRST"] = "Visa måndag först";
+Calendar._TT["SUN_FIRST"] = "Visa söndag först";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Visa %s först";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0";
+
+Calendar._TT["CLOSE"] = "Stäng";
+Calendar._TT["TODAY"] = "Idag";
+Calendar._TT["TIME_PART"] = "(Skift-)klicka eller drag för att ändra tid";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%A %d %b %Y";
+
+Calendar._TT["WK"] = "vecka";
+Calendar._TT["TIME"] = "Tid:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-tr.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-tr.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-tr.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,73 @@
+//////////////////////////////////////////////////////////////////////////////////////////////
+//	Turkish Translation by Nuri AKMAN
+//	Location: Ankara/TURKEY
+//	e-mail	: nuriakman en hotmail.com
+//	Date	: April, 9 2003
+//
+//	Note: if Turkish Characters does not shown on you screen
+//		  please include falowing line your html code:
+//
+//		  <meta http-equiv="Content-Type" content="text/html; charset=utf8">
+//
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+// ** I18N
+Calendar._DN = new Array
+("Pazar",
+ "Pazartesi",
+ "Salı",
+ "Çarşamba",
+ "PerÅŸembe",
+ "Cuma",
+ "Cumartesi",
+ "Pazar");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+Calendar._MN = new Array
+("Ocak",
+ "Åžubat",
+ "Mart",
+ "Nisan",
+ "Mayıs",
+ "Haziran",
+ "Temmuz",
+ "AÄŸustos",
+ "Eylül",
+ "Ekim",
+ "Kasım",
+ "Aralık");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["TOGGLE"] = "Haftanın ilk gününü kaydır";
+Calendar._TT["PREV_YEAR"] = "Önceki Yıl (Menü için basılı tutunuz)";
+Calendar._TT["PREV_MONTH"] = "Önceki Ay (Menü için basılı tutunuz)";
+Calendar._TT["GO_TODAY"] = "Bugün'e git";
+Calendar._TT["NEXT_MONTH"] = "Sonraki Ay (Menü için basılı tutunuz)";
+Calendar._TT["NEXT_YEAR"] = "Sonraki Yıl (Menü için basılı tutunuz)";
+Calendar._TT["SEL_DATE"] = "Tarih seçiniz";
+Calendar._TT["DRAG_TO_MOVE"] = "Taşımak için sürükleyiniz";
+Calendar._TT["PART_TODAY"] = " (bugün)";
+Calendar._TT["MON_FIRST"] = "Takvim Pazartesi gününden başlasın";
+Calendar._TT["SUN_FIRST"] = "Takvim Pazar gününden başlasın";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Display %s first";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Kapat";
+Calendar._TT["TODAY"] = "Bugün";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-y";
+Calendar._TT["TT_DATE_FORMAT"] = "d MM y, DD";
+
+Calendar._TT["WK"] = "Hafta";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-zh.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-zh.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/lang/calendar-zh.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,123 @@
+// ** I18N
+
+// Calendar ZH language
+// Author: muziq, <muziq en sina.com>
+// Encoding: GB2312 or GBK
+// Distributed under the same terms as the calendar itself.
+
+// full day names
+Calendar._DN = new Array
+("星期日",
+ "星期一",
+ "星期二",
+ "星期三",
+ "星期四",
+ "星期五",
+ "星期六",
+ "星期日");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("æ—¥",
+ "一",
+ "二",
+ "三",
+ "å››",
+ "五",
+ "å…­",
+ "æ—¥");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 0;
+
+// full month names
+Calendar._MN = new Array
+("一月",
+ "二月",
+ "三月",
+ "四月",
+ "五月",
+ "六月",
+ "七月",
+ "八月",
+ "ä¹æœˆ",
+ "å月",
+ "å一月",
+ "å二月");
+
+// short month names
+Calendar._SMN = new Array
+("一月",
+ "二月",
+ "三月",
+ "四月",
+ "五月",
+ "六月",
+ "七月",
+ "八月",
+ "ä¹æœˆ",
+ "å月",
+ "å一月",
+ "å二月");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "帮助";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"选择日期:\n" +
+"- 点击 \xab, \xbb 按钮选择年份\n" +
+"- 点击 " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " 按钮选择月份\n" +
+"- 长按以上按钮å¯ä»Žèœå•ä¸­å¿«é€Ÿé€‰æ‹©å¹´ä»½æˆ–月份";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"选择时间:\n" +
+"- 点击å°æ—¶æˆ–分钟å¯ä½¿æ”¹æ•°å€¼åŠ ä¸€\n" +
+"- 按ä½Shift键点击å°æ—¶æˆ–分钟å¯ä½¿æ”¹æ•°å€¼å‡ä¸€\n" +
+"- 点击拖动鼠标å¯è¿›è¡Œå¿«é€Ÿé€‰æ‹©";
+
+Calendar._TT["PREV_YEAR"] = "上一年 (按ä½å‡ºèœå•)";
+Calendar._TT["PREV_MONTH"] = "上一月 (按ä½å‡ºèœå•)";
+Calendar._TT["GO_TODAY"] = "转到今日";
+Calendar._TT["NEXT_MONTH"] = "下一月 (按ä½å‡ºèœå•)";
+Calendar._TT["NEXT_YEAR"] = "下一年 (按ä½å‡ºèœå•)";
+Calendar._TT["SEL_DATE"] = "选择日期";
+Calendar._TT["DRAG_TO_MOVE"] = "拖动";
+Calendar._TT["PART_TODAY"] = " (今日)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "最左边显示%s";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "关闭";
+Calendar._TT["TODAY"] = "今日";
+Calendar._TT["TIME_PART"] = "(Shift-)点击鼠标或拖动改å˜å€¼";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%A, %b %eæ—¥";
+
+Calendar._TT["WK"] = "周";
+Calendar._TT["TIME"] = "时间:";

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/active-bg.gif
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/active-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/dark-bg.gif
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/dark-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/hover-bg.gif
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/hover-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/menuarrow.gif
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/menuarrow.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/normal-bg.gif
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/normal-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/rowhover-bg.gif
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/rowhover-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/status-bg.gif
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/status-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/theme.css
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/theme.css	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/theme.css	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,242 @@
+/* Distributed as part of The Coolest DHTML Calendar
+   Author: Mihai Bazon, www.bazon.net/mishoo
+   Copyright Dynarch.com 2005, www.dynarch.com
+*/
+
+/* The main calendar widget.  DIV containing a table. */
+
+div.calendar { position: relative; }
+
+.calendar, .calendar table {
+  border: 1px solid #bdb2bf;
+  font-size: 11px;
+  color: #000;
+  cursor: default;
+  background: url("normal-bg.gif");
+  font-family: "trebuchet ms",verdana,tahoma,sans-serif;
+  border-collapse: separate;
+}
+
+.calendar td
+{
+  background: url("normal-bg.gif");
+}
+
+.calendar {
+  border-color: #797979;
+}
+
+/* Header part -- contains navigation buttons and day names. */
+
+.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
+  text-align: center;    /* They are the navigation buttons */
+  padding: 2px;          /* Make the buttons seem like they're pressing */
+  background: url("title-bg.gif") repeat-x 0 100%; color: #000;
+  font-weight: bold;
+}
+
+.calendar .nav {
+  font-family: verdana,tahoma,sans-serif;
+}
+
+.calendar .nav div {
+  background: transparent url("menuarrow.gif") no-repeat 100% 100%;
+}
+
+.calendar thead tr { background: url("title-bg.gif") repeat-x 0 100%; color: #000; }
+
+.calendar thead .title { /* This holds the current "month, year" */
+  font-weight: bold;      /* Pressing it will take you to the current date */
+  text-align: center;
+  padding: 2px;
+  background: url("title-bg.gif") repeat-x 0 100%; color: #000;
+}
+
+.calendar thead .headrow { /* Row <TR> containing navigation buttons */
+}
+
+.calendar thead .name { /* Cells <TD> containing the day names */
+  border-bottom: 1px solid #797979;
+  padding: 2px;
+  text-align: center;
+  color: #000;
+}
+
+.calendar thead .weekend { /* How a weekend day name shows in header */
+  color: #c44;
+}
+
+.calendar thead .hilite { /* How do the buttons in header appear when hover */
+  background: url("hover-bg.gif");
+  border-bottom: 1px solid #797979;
+  padding: 2px 2px 1px 2px;
+}
+
+.calendar thead .active { /* Active (pressed) buttons in header */
+  background: url("active-bg.gif"); color: #fff;
+  padding: 3px 1px 0px 3px;
+  border-bottom: 1px solid #797979;
+}
+
+.calendar thead .daynames { /* Row <TR> containing the day names */
+  background: url("dark-bg.gif");
+}
+
+/* The body part -- contains all the days in month. */
+
+.calendar tbody .day { /* Cells <TD> containing month days dates */
+  font-family: verdana,tahoma,sans-serif;
+  width: 2em;
+  color: #000;
+  text-align: right;
+  padding: 2px 4px 2px 2px;
+}
+.calendar tbody .day.othermonth {
+  font-size: 80%;
+  color: #999;
+}
+.calendar tbody .day.othermonth.oweekend {
+  color: #f99;
+}
+
+.calendar table .wn {
+  padding: 2px 3px 2px 2px;
+  border-right: 1px solid #797979;
+  background: url("dark-bg.gif");
+}
+
+.calendar tbody .rowhilite td,
+.calendar tbody .rowhilite td.wn {
+  background: url("rowhover-bg.gif");
+}
+
+.calendar tbody td.today { font-weight: bold; /* background: url("today-bg.gif") no-repeat 70% 50%; */ }
+
+.calendar tbody td.hilite { /* Hovered cells <TD> */
+  background: url("hover-bg.gif");
+  padding: 1px 3px 1px 1px;
+  border: 1px solid #bbb;
+}
+
+.calendar tbody td.active { /* Active (pressed) cells <TD> */
+  padding: 2px 2px 0px 2px;
+}
+
+.calendar tbody td.weekend { /* Cells showing weekend days */
+  color: #c44;
+}
+
+.calendar tbody td.selected { /* Cell showing selected date */
+  font-weight: bold;
+  border: 1px solid #797979;
+  padding: 1px 3px 1px 1px;
+  background: url("active-bg.gif"); color: #fff;
+}
+
+.calendar tbody .disabled { color: #999; }
+
+.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
+  visibility: hidden;
+}
+
+.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
+  display: none;
+}
+
+/* The footer part -- status bar and "Close" button */
+
+.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
+  text-align: center;
+  background: #565;
+  color: #fff;
+}
+
+.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
+  padding: 2px;
+  background: url("status-bg.gif") repeat-x 0 0; color: #000;
+}
+
+.calendar tfoot .hilite { /* Hover style for buttons in footer */
+  background: #afa;
+  border: 1px solid #084;
+  color: #000;
+  padding: 1px;
+}
+
+.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
+  background: #7c7;
+  padding: 2px 0px 0px 2px;
+}
+
+/* Combo boxes (menus that display months/years for direct selection) */
+
+.calendar .combo {
+  position: absolute;
+  display: none;
+  top: 0px;
+  left: 0px;
+  width: 4em;
+  cursor: default;
+  border-width: 0 1px 1px 1px;
+  border-style: solid;
+  border-color: #797979;
+  background: url("normal-bg.gif"); color: #000;
+  z-index: 100;
+  font-size: 90%;
+}
+
+.calendar .combo .label,
+.calendar .combo .label-IEfix {
+  text-align: center;
+  padding: 1px;
+}
+
+.calendar .combo .label-IEfix {
+  width: 4em;
+}
+
+.calendar .combo .hilite {
+  background: url("hover-bg.gif"); color: #000;
+}
+
+.calendar .combo .active {
+  background: url("active-bg.gif"); color: #fff;
+  font-weight: bold;
+}
+
+.calendar td.time {
+  border-top: 1px solid #797979;
+  padding: 1px 0px;
+  text-align: center;
+  background: url("dark-bg.gif");
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute,
+.calendar td.time .ampm {
+  padding: 0px 5px 0px 6px;
+  font-weight: bold;
+  background: url("normal-bg.gif"); color: #000;
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute {
+  font-family: monospace;
+}
+
+.calendar td.time .ampm {
+  text-align: center;
+}
+
+.calendar td.time .colon {
+  padding: 0px 2px 0px 3px;
+  font-weight: bold;
+}
+
+.calendar td.time span.hilite {
+  background: url("hover-bg.gif"); color: #000;
+}
+
+.calendar td.time span.active {
+  background: url("active-bg.gif"); color: #fff;
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/title-bg.gif
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/title-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/today-bg.gif
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/calendar/skins/aqua/today-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/css/input_auto_complete_tag.css
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/css/input_auto_complete_tag.css	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/css/input_auto_complete_tag.css	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+div.auto_complete
+{
+  width: 350px;
+  background: #fff;
+}
+
+div.auto_complete ul
+{
+  width: 100%;
+  margin: 0;
+  padding: 0;
+  list-style-type: none;
+  border: 1px solid #bbb;
+}
+
+div.auto_complete ul li
+{
+  margin: 0;
+  padding: 3px;
+  border-bottom: 1px solid #eee;
+  list-style-type: none;
+}
+
+div.auto_complete ul li.selected
+{
+  background-color: #ffb;
+}
+
+div.auto_complete ul strong.highlight
+{
+  margin: 0;
+  padding: 0;
+  color: #800;
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/builder.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/builder.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/builder.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,131 @@
+// script.aculo.us builder.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+
+// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+var Builder = {
+  NODEMAP: {
+    AREA: 'map',
+    CAPTION: 'table',
+    COL: 'table',
+    COLGROUP: 'table',
+    LEGEND: 'fieldset',
+    OPTGROUP: 'select',
+    OPTION: 'select',
+    PARAM: 'object',
+    TBODY: 'table',
+    TD: 'table',
+    TFOOT: 'table',
+    TH: 'table',
+    THEAD: 'table',
+    TR: 'table'
+  },
+  // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
+  //       due to a Firefox bug
+  node: function(elementName) {
+    elementName = elementName.toUpperCase();
+    
+    // try innerHTML approach
+    var parentTag = this.NODEMAP[elementName] || 'div';
+    var parentElement = document.createElement(parentTag);
+    try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+      parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
+    } catch(e) {}
+    var element = parentElement.firstChild || null;
+      
+    // see if browser added wrapping tags
+    if(element && (element.tagName.toUpperCase() != elementName))
+      element = element.getElementsByTagName(elementName)[0];
+    
+    // fallback to createElement approach
+    if(!element) element = document.createElement(elementName);
+    
+    // abort if nothing could be created
+    if(!element) return;
+
+    // attributes (or text)
+    if(arguments[1])
+      if(this._isStringOrNumber(arguments[1]) ||
+        (arguments[1] instanceof Array)) {
+          this._children(element, arguments[1]);
+        } else {
+          var attrs = this._attributes(arguments[1]);
+          if(attrs.length) {
+            try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+              parentElement.innerHTML = "<" +elementName + " " +
+                attrs + "></" + elementName + ">";
+            } catch(e) {}
+            element = parentElement.firstChild || null;
+            // workaround firefox 1.0.X bug
+            if(!element) {
+              element = document.createElement(elementName);
+              for(attr in arguments[1]) 
+                element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
+            }
+            if(element.tagName.toUpperCase() != elementName)
+              element = parentElement.getElementsByTagName(elementName)[0];
+            }
+        } 
+
+    // text, or array of children
+    if(arguments[2])
+      this._children(element, arguments[2]);
+
+     return element;
+  },
+  _text: function(text) {
+     return document.createTextNode(text);
+  },
+
+  ATTR_MAP: {
+    'className': 'class',
+    'htmlFor': 'for'
+  },
+
+  _attributes: function(attributes) {
+    var attrs = [];
+    for(attribute in attributes)
+      attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
+          '="' + attributes[attribute].toString().escapeHTML() + '"');
+    return attrs.join(" ");
+  },
+  _children: function(element, children) {
+    if(typeof children=='object') { // array can hold nodes and text
+      children.flatten().each( function(e) {
+        if(typeof e=='object')
+          element.appendChild(e)
+        else
+          if(Builder._isStringOrNumber(e))
+            element.appendChild(Builder._text(e));
+      });
+    } else
+      if(Builder._isStringOrNumber(children)) 
+         element.appendChild(Builder._text(children));
+  },
+  _isStringOrNumber: function(param) {
+    return(typeof param=='string' || typeof param=='number');
+  },
+  build: function(html) {
+    var element = this.node('div');
+    $(element).update(html.strip());
+    return element.down();
+  },
+  dump: function(scope) { 
+    if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope 
+  
+    var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
+      "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
+      "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
+      "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
+      "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
+      "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
+  
+    tags.each( function(tag){ 
+      scope[tag] = function() { 
+        return Builder.node.apply(Builder, [tag].concat($A(arguments)));  
+      } 
+    });
+  }
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/controls.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/controls.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/controls.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,835 @@
+// script.aculo.us controls.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+
+// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005, 2006 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
+//           (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com)
+// Contributors:
+//  Richard Livsey
+//  Rahul Bhargava
+//  Rob Wills
+// 
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+// Autocompleter.Base handles all the autocompletion functionality 
+// that's independent of the data source for autocompletion. This
+// includes drawing the autocompletion menu, observing keyboard
+// and mouse events, and similar.
+//
+// Specific autocompleters need to provide, at the very least, 
+// a getUpdatedChoices function that will be invoked every time
+// the text inside the monitored textbox changes. This method 
+// should get the text for which to provide autocompletion by
+// invoking this.getToken(), NOT by directly accessing
+// this.element.value. This is to allow incremental tokenized
+// autocompletion. Specific auto-completion logic (AJAX, etc)
+// belongs in getUpdatedChoices.
+//
+// Tokenized incremental autocompletion is enabled automatically
+// when an autocompleter is instantiated with the 'tokens' option
+// in the options parameter, e.g.:
+// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
+// will incrementally autocomplete with a comma as the token.
+// Additionally, ',' in the above example can be replaced with
+// a token array, e.g. { tokens: [',', '\n'] } which
+// enables autocompletion on multiple tokens. This is most 
+// useful when one of the tokens is \n (a newline), as it 
+// allows smart autocompletion after linebreaks.
+
+if(typeof Effect == 'undefined')
+  throw("controls.js requires including script.aculo.us' effects.js library");
+
+var Autocompleter = {}
+Autocompleter.Base = function() {};
+Autocompleter.Base.prototype = {
+  baseInitialize: function(element, update, options) {
+    this.element     = $(element); 
+    this.update      = $(update);  
+    this.hasFocus    = false; 
+    this.changed     = false; 
+    this.active      = false; 
+    this.index       = 0;     
+    this.entryCount  = 0;
+
+    if(this.setOptions)
+      this.setOptions(options);
+    else
+      this.options = options || {};
+
+    this.options.paramName    = this.options.paramName || this.element.name;
+    this.options.tokens       = this.options.tokens || [];
+    this.options.frequency    = this.options.frequency || 0.4;
+    this.options.minChars     = this.options.minChars || 1;
+    this.options.onShow       = this.options.onShow || 
+      function(element, update){ 
+        if(!update.style.position || update.style.position=='absolute') {
+          update.style.position = 'absolute';
+          Position.clone(element, update, {
+            setHeight: false, 
+            offsetTop: element.offsetHeight
+          });
+        }
+        Effect.Appear(update,{duration:0.15});
+      };
+    this.options.onHide = this.options.onHide || 
+      function(element, update){ new Effect.Fade(update,{duration:0.15}) };
+
+    if(typeof(this.options.tokens) == 'string') 
+      this.options.tokens = new Array(this.options.tokens);
+
+    this.observer = null;
+    
+    this.element.setAttribute('autocomplete','off');
+
+    Element.hide(this.update);
+
+    Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
+    Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
+  },
+
+  show: function() {
+    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
+    if(!this.iefix && 
+      (navigator.appVersion.indexOf('MSIE')>0) &&
+      (navigator.userAgent.indexOf('Opera')<0) &&
+      (Element.getStyle(this.update, 'position')=='absolute')) {
+      new Insertion.After(this.update, 
+       '<iframe id="' + this.update.id + '_iefix" '+
+       'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
+       'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
+      this.iefix = $(this.update.id+'_iefix');
+    }
+    if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
+  },
+  
+  fixIEOverlapping: function() {
+    Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
+    this.iefix.style.zIndex = 1;
+    this.update.style.zIndex = 2;
+    Element.show(this.iefix);
+  },
+
+  hide: function() {
+    this.stopIndicator();
+    if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
+    if(this.iefix) Element.hide(this.iefix);
+  },
+
+  startIndicator: function() {
+    if(this.options.indicator) Element.show(this.options.indicator);
+  },
+
+  stopIndicator: function() {
+    if(this.options.indicator) Element.hide(this.options.indicator);
+  },
+
+  onKeyPress: function(event) {
+    if(this.active)
+      switch(event.keyCode) {
+       case Event.KEY_TAB:
+       case Event.KEY_RETURN:
+         this.selectEntry();
+         Event.stop(event);
+       case Event.KEY_ESC:
+         this.hide();
+         this.active = false;
+         Event.stop(event);
+         return;
+       case Event.KEY_LEFT:
+       case Event.KEY_RIGHT:
+         return;
+       case Event.KEY_UP:
+         this.markPrevious();
+         this.render();
+         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+         return;
+       case Event.KEY_DOWN:
+         this.markNext();
+         this.render();
+         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+         return;
+      }
+     else 
+       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || 
+         (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;
+
+    this.changed = true;
+    this.hasFocus = true;
+
+    if(this.observer) clearTimeout(this.observer);
+      this.observer = 
+        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
+  },
+
+  activate: function() {
+    this.changed = false;
+    this.hasFocus = true;
+    this.getUpdatedChoices();
+  },
+
+  onHover: function(event) {
+    var element = Event.findElement(event, 'LI');
+    if(this.index != element.autocompleteIndex) 
+    {
+        this.index = element.autocompleteIndex;
+        this.render();
+    }
+    Event.stop(event);
+  },
+  
+  onClick: function(event) {
+    var element = Event.findElement(event, 'LI');
+    this.index = element.autocompleteIndex;
+    this.selectEntry();
+    this.hide();
+  },
+  
+  onBlur: function(event) {
+    // needed to make click events working
+    setTimeout(this.hide.bind(this), 250);
+    this.hasFocus = false;
+    this.active = false;     
+  }, 
+  
+  render: function() {
+    if(this.entryCount > 0) {
+      for (var i = 0; i < this.entryCount; i++)
+        this.index==i ? 
+          Element.addClassName(this.getEntry(i),"selected") : 
+          Element.removeClassName(this.getEntry(i),"selected");
+        
+      if(this.hasFocus) { 
+        this.show();
+        this.active = true;
+      }
+    } else {
+      this.active = false;
+      this.hide();
+    }
+  },
+  
+  markPrevious: function() {
+    if(this.index > 0) this.index--
+      else this.index = this.entryCount-1;
+    this.getEntry(this.index).scrollIntoView(true);
+  },
+  
+  markNext: function() {
+    if(this.index < this.entryCount-1) this.index++
+      else this.index = 0;
+    this.getEntry(this.index).scrollIntoView(false);
+  },
+  
+  getEntry: function(index) {
+    return this.update.firstChild.childNodes[index];
+  },
+  
+  getCurrentEntry: function() {
+    return this.getEntry(this.index);
+  },
+  
+  selectEntry: function() {
+    this.active = false;
+    this.updateElement(this.getCurrentEntry());
+  },
+
+  updateElement: function(selectedElement) {
+    if (this.options.updateElement) {
+      this.options.updateElement(selectedElement);
+      return;
+    }
+    var value = '';
+    if (this.options.select) {
+      var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
+      if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
+    } else
+      value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
+    
+    var lastTokenPos = this.findLastToken();
+    if (lastTokenPos != -1) {
+      var newValue = this.element.value.substr(0, lastTokenPos + 1);
+      var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
+      if (whitespace)
+        newValue += whitespace[0];
+      this.element.value = newValue + value;
+    } else {
+      this.element.value = value;
+    }
+    this.element.focus();
+    
+    if (this.options.afterUpdateElement)
+      this.options.afterUpdateElement(this.element, selectedElement);
+  },
+
+  updateChoices: function(choices) {
+    if(!this.changed && this.hasFocus) {
+      this.update.innerHTML = choices;
+      Element.cleanWhitespace(this.update);
+      Element.cleanWhitespace(this.update.down());
+
+      if(this.update.firstChild && this.update.down().childNodes) {
+        this.entryCount = 
+          this.update.down().childNodes.length;
+        for (var i = 0; i < this.entryCount; i++) {
+          var entry = this.getEntry(i);
+          entry.autocompleteIndex = i;
+          this.addObservers(entry);
+        }
+      } else { 
+        this.entryCount = 0;
+      }
+
+      this.stopIndicator();
+      this.index = 0;
+      
+      if(this.entryCount==1 && this.options.autoSelect) {
+        this.selectEntry();
+        this.hide();
+      } else {
+        this.render();
+      }
+    }
+  },
+
+  addObservers: function(element) {
+    Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
+    Event.observe(element, "click", this.onClick.bindAsEventListener(this));
+  },
+
+  onObserverEvent: function() {
+    this.changed = false;   
+    if(this.getToken().length>=this.options.minChars) {
+      this.startIndicator();
+      this.getUpdatedChoices();
+    } else {
+      this.active = false;
+      this.hide();
+    }
+  },
+
+  getToken: function() {
+    var tokenPos = this.findLastToken();
+    if (tokenPos != -1)
+      var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
+    else
+      var ret = this.element.value;
+
+    return /\n/.test(ret) ? '' : ret;
+  },
+
+  findLastToken: function() {
+    var lastTokenPos = -1;
+
+    for (var i=0; i<this.options.tokens.length; i++) {
+      var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
+      if (thisTokenPos > lastTokenPos)
+        lastTokenPos = thisTokenPos;
+    }
+    return lastTokenPos;
+  }
+}
+
+Ajax.Autocompleter = Class.create();
+Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
+  initialize: function(element, update, url, options) {
+    this.baseInitialize(element, update, options);
+    this.options.asynchronous  = true;
+    this.options.onComplete    = this.onComplete.bind(this);
+    this.options.defaultParams = this.options.parameters || null;
+    this.url                   = url;
+  },
+
+  getUpdatedChoices: function() {
+    entry = encodeURIComponent(this.options.paramName) + '=' + 
+      encodeURIComponent(this.getToken());
+
+    this.options.parameters = this.options.callback ?
+      this.options.callback(this.element, entry) : entry;
+
+    if(this.options.defaultParams) 
+      this.options.parameters += '&' + this.options.defaultParams;
+
+    new Ajax.Request(this.url, this.options);
+  },
+
+  onComplete: function(request) {
+    this.updateChoices(request.responseText);
+  }
+
+});
+
+// The local array autocompleter. Used when you'd prefer to
+// inject an array of autocompletion options into the page, rather
+// than sending out Ajax queries, which can be quite slow sometimes.
+//
+// The constructor takes four parameters. The first two are, as usual,
+// the id of the monitored textbox, and id of the autocompletion menu.
+// The third is the array you want to autocomplete from, and the fourth
+// is the options block.
+//
+// Extra local autocompletion options:
+// - choices - How many autocompletion choices to offer
+//
+// - partialSearch - If false, the autocompleter will match entered
+//                    text only at the beginning of strings in the 
+//                    autocomplete array. Defaults to true, which will
+//                    match text at the beginning of any *word* in the
+//                    strings in the autocomplete array. If you want to
+//                    search anywhere in the string, additionally set
+//                    the option fullSearch to true (default: off).
+//
+// - fullSsearch - Search anywhere in autocomplete array strings.
+//
+// - partialChars - How many characters to enter before triggering
+//                   a partial match (unlike minChars, which defines
+//                   how many characters are required to do any match
+//                   at all). Defaults to 2.
+//
+// - ignoreCase - Whether to ignore case when autocompleting.
+//                 Defaults to true.
+//
+// It's possible to pass in a custom function as the 'selector' 
+// option, if you prefer to write your own autocompletion logic.
+// In that case, the other options above will not apply unless
+// you support them.
+
+Autocompleter.Local = Class.create();
+Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
+  initialize: function(element, update, array, options) {
+    this.baseInitialize(element, update, options);
+    this.options.array = array;
+  },
+
+  getUpdatedChoices: function() {
+    this.updateChoices(this.options.selector(this));
+  },
+
+  setOptions: function(options) {
+    this.options = Object.extend({
+      choices: 10,
+      partialSearch: true,
+      partialChars: 2,
+      ignoreCase: true,
+      fullSearch: false,
+      selector: function(instance) {
+        var ret       = []; // Beginning matches
+        var partial   = []; // Inside matches
+        var entry     = instance.getToken();
+        var count     = 0;
+
+        for (var i = 0; i < instance.options.array.length &&  
+          ret.length < instance.options.choices ; i++) { 
+
+          var elem = instance.options.array[i];
+          var foundPos = instance.options.ignoreCase ? 
+            elem.toLowerCase().indexOf(entry.toLowerCase()) : 
+            elem.indexOf(entry);
+
+          while (foundPos != -1) {
+            if (foundPos == 0 && elem.length != entry.length) { 
+              ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" + 
+                elem.substr(entry.length) + "</li>");
+              break;
+            } else if (entry.length >= instance.options.partialChars && 
+              instance.options.partialSearch && foundPos != -1) {
+              if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
+                partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
+                  elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
+                  foundPos + entry.length) + "</li>");
+                break;
+              }
+            }
+
+            foundPos = instance.options.ignoreCase ? 
+              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : 
+              elem.indexOf(entry, foundPos + 1);
+
+          }
+        }
+        if (partial.length)
+          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
+        return "<ul>" + ret.join('') + "</ul>";
+      }
+    }, options || {});
+  }
+});
+
+// AJAX in-place editor
+//
+// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor
+
+// Use this if you notice weird scrolling problems on some browsers,
+// the DOM might be a bit confused when this gets called so do this
+// waits 1 ms (with setTimeout) until it does the activation
+Field.scrollFreeActivate = function(field) {
+  setTimeout(function() {
+    Field.activate(field);
+  }, 1);
+}
+
+Ajax.InPlaceEditor = Class.create();
+Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
+Ajax.InPlaceEditor.prototype = {
+  initialize: function(element, url, options) {
+    this.url = url;
+    this.element = $(element);
+
+    this.options = Object.extend({
+      paramName: "value",
+      okButton: true,
+      okText: "ok",
+      cancelLink: true,
+      cancelText: "cancel",
+      savingText: "Saving...",
+      clickToEditText: "Click to edit",
+      okText: "ok",
+      rows: 1,
+      onComplete: function(transport, element) {
+        new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
+      },
+      onFailure: function(transport) {
+        alert("Error communicating with the server: " + transport.responseText.stripTags());
+      },
+      callback: function(form) {
+        return Form.serialize(form);
+      },
+      handleLineBreaks: true,
+      loadingText: 'Loading...',
+      savingClassName: 'inplaceeditor-saving',
+      loadingClassName: 'inplaceeditor-loading',
+      formClassName: 'inplaceeditor-form',
+      highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
+      highlightendcolor: "#FFFFFF",
+      externalControl: null,
+      submitOnBlur: false,
+      ajaxOptions: {},
+      evalScripts: false
+    }, options || {});
+
+    if(!this.options.formId && this.element.id) {
+      this.options.formId = this.element.id + "-inplaceeditor";
+      if ($(this.options.formId)) {
+        // there's already a form with that name, don't specify an id
+        this.options.formId = null;
+      }
+    }
+    
+    if (this.options.externalControl) {
+      this.options.externalControl = $(this.options.externalControl);
+    }
+    
+    this.originalBackground = Element.getStyle(this.element, 'background-color');
+    if (!this.originalBackground) {
+      this.originalBackground = "transparent";
+    }
+    
+    this.element.title = this.options.clickToEditText;
+    
+    this.onclickListener = this.enterEditMode.bindAsEventListener(this);
+    this.mouseoverListener = this.enterHover.bindAsEventListener(this);
+    this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
+    Event.observe(this.element, 'click', this.onclickListener);
+    Event.observe(this.element, 'mouseover', this.mouseoverListener);
+    Event.observe(this.element, 'mouseout', this.mouseoutListener);
+    if (this.options.externalControl) {
+      Event.observe(this.options.externalControl, 'click', this.onclickListener);
+      Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
+      Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
+    }
+  },
+  enterEditMode: function(evt) {
+    if (this.saving) return;
+    if (this.editing) return;
+    this.editing = true;
+    this.onEnterEditMode();
+    if (this.options.externalControl) {
+      Element.hide(this.options.externalControl);
+    }
+    Element.hide(this.element);
+    this.createForm();
+    this.element.parentNode.insertBefore(this.form, this.element);
+    if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField);
+    // stop the event to avoid a page refresh in Safari
+    if (evt) {
+      Event.stop(evt);
+    }
+    return false;
+  },
+  createForm: function() {
+    this.form = document.createElement("form");
+    this.form.id = this.options.formId;
+    Element.addClassName(this.form, this.options.formClassName)
+    this.form.onsubmit = this.onSubmit.bind(this);
+
+    this.createEditField();
+
+    if (this.options.textarea) {
+      var br = document.createElement("br");
+      this.form.appendChild(br);
+    }
+
+    if (this.options.okButton) {
+      okButton = document.createElement("input");
+      okButton.type = "submit";
+      okButton.value = this.options.okText;
+      okButton.className = 'editor_ok_button';
+      this.form.appendChild(okButton);
+    }
+
+    if (this.options.cancelLink) {
+      cancelLink = document.createElement("a");
+      cancelLink.href = "#";
+      cancelLink.appendChild(document.createTextNode(this.options.cancelText));
+      cancelLink.onclick = this.onclickCancel.bind(this);
+      cancelLink.className = 'editor_cancel';      
+      this.form.appendChild(cancelLink);
+    }
+  },
+  hasHTMLLineBreaks: function(string) {
+    if (!this.options.handleLineBreaks) return false;
+    return string.match(/<br/i) || string.match(/<p>/i);
+  },
+  convertHTMLLineBreaks: function(string) {
+    return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");
+  },
+  createEditField: function() {
+    var text;
+    if(this.options.loadTextURL) {
+      text = this.options.loadingText;
+    } else {
+      text = this.getText();
+    }
+
+    var obj = this;
+    
+    if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
+      this.options.textarea = false;
+      var textField = document.createElement("input");
+      textField.obj = this;
+      textField.type = "text";
+      textField.name = this.options.paramName;
+      textField.value = text;
+      textField.style.backgroundColor = this.options.highlightcolor;
+      textField.className = 'editor_field';
+      var size = this.options.size || this.options.cols || 0;
+      if (size != 0) textField.size = size;
+      if (this.options.submitOnBlur)
+        textField.onblur = this.onSubmit.bind(this);
+      this.editField = textField;
+    } else {
+      this.options.textarea = true;
+      var textArea = document.createElement("textarea");
+      textArea.obj = this;
+      textArea.name = this.options.paramName;
+      textArea.value = this.convertHTMLLineBreaks(text);
+      textArea.rows = this.options.rows;
+      textArea.cols = this.options.cols || 40;
+      textArea.className = 'editor_field';      
+      if (this.options.submitOnBlur)
+        textArea.onblur = this.onSubmit.bind(this);
+      this.editField = textArea;
+    }
+    
+    if(this.options.loadTextURL) {
+      this.loadExternalText();
+    }
+    this.form.appendChild(this.editField);
+  },
+  getText: function() {
+    return this.element.innerHTML;
+  },
+  loadExternalText: function() {
+    Element.addClassName(this.form, this.options.loadingClassName);
+    this.editField.disabled = true;
+    new Ajax.Request(
+      this.options.loadTextURL,
+      Object.extend({
+        asynchronous: true,
+        onComplete: this.onLoadedExternalText.bind(this)
+      }, this.options.ajaxOptions)
+    );
+  },
+  onLoadedExternalText: function(transport) {
+    Element.removeClassName(this.form, this.options.loadingClassName);
+    this.editField.disabled = false;
+    this.editField.value = transport.responseText.stripTags();
+    Field.scrollFreeActivate(this.editField);
+  },
+  onclickCancel: function() {
+    this.onComplete();
+    this.leaveEditMode();
+    return false;
+  },
+  onFailure: function(transport) {
+    this.options.onFailure(transport);
+    if (this.oldInnerHTML) {
+      this.element.innerHTML = this.oldInnerHTML;
+      this.oldInnerHTML = null;
+    }
+    return false;
+  },
+  onSubmit: function() {
+    // onLoading resets these so we need to save them away for the Ajax call
+    var form = this.form;
+    var value = this.editField.value;
+    
+    // do this first, sometimes the ajax call returns before we get a chance to switch on Saving...
+    // which means this will actually switch on Saving... *after* we've left edit mode causing Saving...
+    // to be displayed indefinitely
+    this.onLoading();
+    
+    if (this.options.evalScripts) {
+      new Ajax.Request(
+        this.url, Object.extend({
+          parameters: this.options.callback(form, value),
+          onComplete: this.onComplete.bind(this),
+          onFailure: this.onFailure.bind(this),
+          asynchronous:true, 
+          evalScripts:true
+        }, this.options.ajaxOptions));
+    } else  {
+      new Ajax.Updater(
+        { success: this.element,
+          // don't update on failure (this could be an option)
+          failure: null }, 
+        this.url, Object.extend({
+          parameters: this.options.callback(form, value),
+          onComplete: this.onComplete.bind(this),
+          onFailure: this.onFailure.bind(this)
+        }, this.options.ajaxOptions));
+    }
+    // stop the event to avoid a page refresh in Safari
+    if (arguments.length > 1) {
+      Event.stop(arguments[0]);
+    }
+    return false;
+  },
+  onLoading: function() {
+    this.saving = true;
+    this.removeForm();
+    this.leaveHover();
+    this.showSaving();
+  },
+  showSaving: function() {
+    this.oldInnerHTML = this.element.innerHTML;
+    this.element.innerHTML = this.options.savingText;
+    Element.addClassName(this.element, this.options.savingClassName);
+    this.element.style.backgroundColor = this.originalBackground;
+    Element.show(this.element);
+  },
+  removeForm: function() {
+    if(this.form) {
+      if (this.form.parentNode) Element.remove(this.form);
+      this.form = null;
+    }
+  },
+  enterHover: function() {
+    if (this.saving) return;
+    this.element.style.backgroundColor = this.options.highlightcolor;
+    if (this.effect) {
+      this.effect.cancel();
+    }
+    Element.addClassName(this.element, this.options.hoverClassName)
+  },
+  leaveHover: function() {
+    if (this.options.backgroundColor) {
+      this.element.style.backgroundColor = this.oldBackground;
+    }
+    Element.removeClassName(this.element, this.options.hoverClassName)
+    if (this.saving) return;
+    this.effect = new Effect.Highlight(this.element, {
+      startcolor: this.options.highlightcolor,
+      endcolor: this.options.highlightendcolor,
+      restorecolor: this.originalBackground
+    });
+  },
+  leaveEditMode: function() {
+    Element.removeClassName(this.element, this.options.savingClassName);
+    this.removeForm();
+    this.leaveHover();
+    this.element.style.backgroundColor = this.originalBackground;
+    Element.show(this.element);
+    if (this.options.externalControl) {
+      Element.show(this.options.externalControl);
+    }
+    this.editing = false;
+    this.saving = false;
+    this.oldInnerHTML = null;
+    this.onLeaveEditMode();
+  },
+  onComplete: function(transport) {
+    this.leaveEditMode();
+    this.options.onComplete.bind(this)(transport, this.element);
+  },
+  onEnterEditMode: function() {},
+  onLeaveEditMode: function() {},
+  dispose: function() {
+    if (this.oldInnerHTML) {
+      this.element.innerHTML = this.oldInnerHTML;
+    }
+    this.leaveEditMode();
+    Event.stopObserving(this.element, 'click', this.onclickListener);
+    Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
+    Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
+    if (this.options.externalControl) {
+      Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
+      Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
+      Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
+    }
+  }
+};
+
+Ajax.InPlaceCollectionEditor = Class.create();
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
+  createEditField: function() {
+    if (!this.cached_selectTag) {
+      var selectTag = document.createElement("select");
+      var collection = this.options.collection || [];
+      var optionTag;
+      collection.each(function(e,i) {
+        optionTag = document.createElement("option");
+        optionTag.value = (e instanceof Array) ? e[0] : e;
+        if((typeof this.options.value == 'undefined') && 
+          ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true;
+        if(this.options.value==optionTag.value) optionTag.selected = true;
+        optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
+        selectTag.appendChild(optionTag);
+      }.bind(this));
+      this.cached_selectTag = selectTag;
+    }
+
+    this.editField = this.cached_selectTag;
+    if(this.options.loadTextURL) this.loadExternalText();
+    this.form.appendChild(this.editField);
+    this.options.callback = function(form, value) {
+      return "value=" + encodeURIComponent(value);
+    }
+  }
+});
+
+// Delayed observer, like Form.Element.Observer, 
+// but waits for delay after last key input
+// Ideal for live-search fields
+
+Form.Element.DelayedObserver = Class.create();
+Form.Element.DelayedObserver.prototype = {
+  initialize: function(element, delay, callback) {
+    this.delay     = delay || 0.5;
+    this.element   = $(element);
+    this.callback  = callback;
+    this.timer     = null;
+    this.lastValue = $F(this.element); 
+    Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
+  },
+  delayedListener: function(event) {
+    if(this.lastValue == $F(this.element)) return;
+    if(this.timer) clearTimeout(this.timer);
+    this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
+    this.lastValue = $F(this.element);
+  },
+  onTimerEvent: function() {
+    this.timer = null;
+    this.callback(this.element, $F(this.element));
+  }
+};

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/dragdrop.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/dragdrop.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/dragdrop.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,944 @@
+// script.aculo.us dragdrop.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+
+// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005, 2006 Sammi Williams (http://www.oriontransfer.co.nz, sammi en oriontransfer.co.nz)
+// 
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+if(typeof Effect == 'undefined')
+  throw("dragdrop.js requires including script.aculo.us' effects.js library");
+
+var Droppables = {
+  drops: [],
+
+  remove: function(element) {
+    this.drops = this.drops.reject(function(d) { return d.element==$(element) });
+  },
+
+  add: function(element) {
+    element = $(element);
+    var options = Object.extend({
+      greedy:     true,
+      hoverclass: null,
+      tree:       false
+    }, arguments[1] || {});
+
+    // cache containers
+    if(options.containment) {
+      options._containers = [];
+      var containment = options.containment;
+      if((typeof containment == 'object') && 
+        (containment.constructor == Array)) {
+        containment.each( function(c) { options._containers.push($(c)) });
+      } else {
+        options._containers.push($(containment));
+      }
+    }
+    
+    if(options.accept) options.accept = [options.accept].flatten();
+
+    Element.makePositioned(element); // fix IE
+    options.element = element;
+
+    this.drops.push(options);
+  },
+  
+  findDeepestChild: function(drops) {
+    deepest = drops[0];
+      
+    for (i = 1; i < drops.length; ++i)
+      if (Element.isParent(drops[i].element, deepest.element))
+        deepest = drops[i];
+    
+    return deepest;
+  },
+
+  isContained: function(element, drop) {
+    var containmentNode;
+    if(drop.tree) {
+      containmentNode = element.treeNode; 
+    } else {
+      containmentNode = element.parentNode;
+    }
+    return drop._containers.detect(function(c) { return containmentNode == c });
+  },
+  
+  isAffected: function(point, element, drop) {
+    return (
+      (drop.element!=element) &&
+      ((!drop._containers) ||
+        this.isContained(element, drop)) &&
+      ((!drop.accept) ||
+        (Element.classNames(element).detect( 
+          function(v) { return drop.accept.include(v) } ) )) &&
+      Position.within(drop.element, point[0], point[1]) );
+  },
+
+  deactivate: function(drop) {
+    if(drop.hoverclass)
+      Element.removeClassName(drop.element, drop.hoverclass);
+    this.last_active = null;
+  },
+
+  activate: function(drop) {
+    if(drop.hoverclass)
+      Element.addClassName(drop.element, drop.hoverclass);
+    this.last_active = drop;
+  },
+
+  show: function(point, element) {
+    if(!this.drops.length) return;
+    var affected = [];
+    
+    if(this.last_active) this.deactivate(this.last_active);
+    this.drops.each( function(drop) {
+      if(Droppables.isAffected(point, element, drop))
+        affected.push(drop);
+    });
+        
+    if(affected.length>0) {
+      drop = Droppables.findDeepestChild(affected);
+      Position.within(drop.element, point[0], point[1]);
+      if(drop.onHover)
+        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
+      
+      Droppables.activate(drop);
+    }
+  },
+
+  fire: function(event, element) {
+    if(!this.last_active) return;
+    Position.prepare();
+
+    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
+      if (this.last_active.onDrop) 
+        this.last_active.onDrop(element, this.last_active.element, event);
+  },
+
+  reset: function() {
+    if(this.last_active)
+      this.deactivate(this.last_active);
+  }
+}
+
+var Draggables = {
+  drags: [],
+  observers: [],
+  
+  register: function(draggable) {
+    if(this.drags.length == 0) {
+      this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
+      this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
+      this.eventKeypress  = this.keyPress.bindAsEventListener(this);
+      
+      Event.observe(document, "mouseup", this.eventMouseUp);
+      Event.observe(document, "mousemove", this.eventMouseMove);
+      Event.observe(document, "keypress", this.eventKeypress);
+    }
+    this.drags.push(draggable);
+  },
+  
+  unregister: function(draggable) {
+    this.drags = this.drags.reject(function(d) { return d==draggable });
+    if(this.drags.length == 0) {
+      Event.stopObserving(document, "mouseup", this.eventMouseUp);
+      Event.stopObserving(document, "mousemove", this.eventMouseMove);
+      Event.stopObserving(document, "keypress", this.eventKeypress);
+    }
+  },
+  
+  activate: function(draggable) {
+    if(draggable.options.delay) { 
+      this._timeout = setTimeout(function() { 
+        Draggables._timeout = null; 
+        window.focus(); 
+        Draggables.activeDraggable = draggable; 
+      }.bind(this), draggable.options.delay); 
+    } else {
+      window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
+      this.activeDraggable = draggable;
+    }
+  },
+  
+  deactivate: function() {
+    this.activeDraggable = null;
+  },
+  
+  updateDrag: function(event) {
+    if(!this.activeDraggable) return;
+    var pointer = [Event.pointerX(event), Event.pointerY(event)];
+    // Mozilla-based browsers fire successive mousemove events with
+    // the same coordinates, prevent needless redrawing (moz bug?)
+    if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
+    this._lastPointer = pointer;
+    
+    this.activeDraggable.updateDrag(event, pointer);
+  },
+  
+  endDrag: function(event) {
+    if(this._timeout) { 
+      clearTimeout(this._timeout); 
+      this._timeout = null; 
+    }
+    if(!this.activeDraggable) return;
+    this._lastPointer = null;
+    this.activeDraggable.endDrag(event);
+    this.activeDraggable = null;
+  },
+  
+  keyPress: function(event) {
+    if(this.activeDraggable)
+      this.activeDraggable.keyPress(event);
+  },
+  
+  addObserver: function(observer) {
+    this.observers.push(observer);
+    this._cacheObserverCallbacks();
+  },
+  
+  removeObserver: function(element) {  // element instead of observer fixes mem leaks
+    this.observers = this.observers.reject( function(o) { return o.element==element });
+    this._cacheObserverCallbacks();
+  },
+  
+  notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag'
+    if(this[eventName+'Count'] > 0)
+      this.observers.each( function(o) {
+        if(o[eventName]) o[eventName](eventName, draggable, event);
+      });
+    if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
+  },
+  
+  _cacheObserverCallbacks: function() {
+    ['onStart','onEnd','onDrag'].each( function(eventName) {
+      Draggables[eventName+'Count'] = Draggables.observers.select(
+        function(o) { return o[eventName]; }
+      ).length;
+    });
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Draggable = Class.create();
+Draggable._dragging    = {};
+
+Draggable.prototype = {
+  initialize: function(element) {
+    var defaults = {
+      handle: false,
+      reverteffect: function(element, top_offset, left_offset) {
+        var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
+        new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
+          queue: {scope:'_draggable', position:'end'}
+        });
+      },
+      endeffect: function(element) {
+        var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0;
+        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, 
+          queue: {scope:'_draggable', position:'end'},
+          afterFinish: function(){ 
+            Draggable._dragging[element] = false 
+          }
+        }); 
+      },
+      zindex: 1000,
+      revert: false,
+      scroll: false,
+      scrollSensitivity: 20,
+      scrollSpeed: 15,
+      snap: false,  // false, or xy or [x,y] or function(x,y){ return [x,y] }
+      delay: 0
+    };
+    
+    if(!arguments[1] || typeof arguments[1].endeffect == 'undefined')
+      Object.extend(defaults, {
+        starteffect: function(element) {
+          element._opacity = Element.getOpacity(element);
+          Draggable._dragging[element] = true;
+          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); 
+        }
+      });
+    
+    var options = Object.extend(defaults, arguments[1] || {});
+
+    this.element = $(element);
+    
+    if(options.handle && (typeof options.handle == 'string'))
+      this.handle = this.element.down('.'+options.handle, 0);
+    
+    if(!this.handle) this.handle = $(options.handle);
+    if(!this.handle) this.handle = this.element;
+    
+    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
+      options.scroll = $(options.scroll);
+      this._isScrollChild = Element.childOf(this.element, options.scroll);
+    }
+
+    Element.makePositioned(this.element); // fix IE    
+
+    this.delta    = this.currentDelta();
+    this.options  = options;
+    this.dragging = false;   
+
+    this.eventMouseDown = this.initDrag.bindAsEventListener(this);
+    Event.observe(this.handle, "mousedown", this.eventMouseDown);
+    
+    Draggables.register(this);
+  },
+  
+  destroy: function() {
+    Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
+    Draggables.unregister(this);
+  },
+  
+  currentDelta: function() {
+    return([
+      parseInt(Element.getStyle(this.element,'left') || '0'),
+      parseInt(Element.getStyle(this.element,'top') || '0')]);
+  },
+  
+  initDrag: function(event) {
+    if(typeof Draggable._dragging[this.element] != 'undefined' &&
+      Draggable._dragging[this.element]) return;
+    if(Event.isLeftClick(event)) {    
+      // abort on form elements, fixes a Firefox issue
+      var src = Event.element(event);
+      if((tag_name = src.tagName.toUpperCase()) && (
+        tag_name=='INPUT' ||
+        tag_name=='SELECT' ||
+        tag_name=='OPTION' ||
+        tag_name=='BUTTON' ||
+        tag_name=='TEXTAREA')) return;
+        
+      var pointer = [Event.pointerX(event), Event.pointerY(event)];
+      var pos     = Position.cumulativeOffset(this.element);
+      this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
+      
+      Draggables.activate(this);
+      Event.stop(event);
+    }
+  },
+  
+  startDrag: function(event) {
+    this.dragging = true;
+    
+    if(this.options.zindex) {
+      this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
+      this.element.style.zIndex = this.options.zindex;
+    }
+    
+    if(this.options.ghosting) {
+      this._clone = this.element.cloneNode(true);
+      Position.absolutize(this.element);
+      this.element.parentNode.insertBefore(this._clone, this.element);
+    }
+    
+    if(this.options.scroll) {
+      if (this.options.scroll == window) {
+        var where = this._getWindowScroll(this.options.scroll);
+        this.originalScrollLeft = where.left;
+        this.originalScrollTop = where.top;
+      } else {
+        this.originalScrollLeft = this.options.scroll.scrollLeft;
+        this.originalScrollTop = this.options.scroll.scrollTop;
+      }
+    }
+    
+    Draggables.notify('onStart', this, event);
+        
+    if(this.options.starteffect) this.options.starteffect(this.element);
+  },
+  
+  updateDrag: function(event, pointer) {
+    if(!this.dragging) this.startDrag(event);
+    Position.prepare();
+    Droppables.show(pointer, this.element);
+    Draggables.notify('onDrag', this, event);
+    
+    this.draw(pointer);
+    if(this.options.change) this.options.change(this);
+    
+    if(this.options.scroll) {
+      this.stopScrolling();
+      
+      var p;
+      if (this.options.scroll == window) {
+        with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
+      } else {
+        p = Position.page(this.options.scroll);
+        p[0] += this.options.scroll.scrollLeft + Position.deltaX;
+        p[1] += this.options.scroll.scrollTop + Position.deltaY;
+        p.push(p[0]+this.options.scroll.offsetWidth);
+        p.push(p[1]+this.options.scroll.offsetHeight);
+      }
+      var speed = [0,0];
+      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
+      if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
+      if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
+      if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
+      this.startScrolling(speed);
+    }
+    
+    // fix AppleWebKit rendering
+    if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+    
+    Event.stop(event);
+  },
+  
+  finishDrag: function(event, success) {
+    this.dragging = false;
+
+    if(this.options.ghosting) {
+      Position.relativize(this.element);
+      Element.remove(this._clone);
+      this._clone = null;
+    }
+
+    if(success) Droppables.fire(event, this.element);
+    Draggables.notify('onEnd', this, event);
+
+    var revert = this.options.revert;
+    if(revert && typeof revert == 'function') revert = revert(this.element);
+    
+    var d = this.currentDelta();
+    if(revert && this.options.reverteffect) {
+      this.options.reverteffect(this.element, 
+        d[1]-this.delta[1], d[0]-this.delta[0]);
+    } else {
+      this.delta = d;
+    }
+
+    if(this.options.zindex)
+      this.element.style.zIndex = this.originalZ;
+
+    if(this.options.endeffect) 
+      this.options.endeffect(this.element);
+      
+    Draggables.deactivate(this);
+    Droppables.reset();
+  },
+  
+  keyPress: function(event) {
+    if(event.keyCode!=Event.KEY_ESC) return;
+    this.finishDrag(event, false);
+    Event.stop(event);
+  },
+  
+  endDrag: function(event) {
+    if(!this.dragging) return;
+    this.stopScrolling();
+    this.finishDrag(event, true);
+    Event.stop(event);
+  },
+  
+  draw: function(point) {
+    var pos = Position.cumulativeOffset(this.element);
+    if(this.options.ghosting) {
+      var r   = Position.realOffset(this.element);
+      pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
+    }
+    
+    var d = this.currentDelta();
+    pos[0] -= d[0]; pos[1] -= d[1];
+    
+    if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
+      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
+      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
+    }
+    
+    var p = [0,1].map(function(i){ 
+      return (point[i]-pos[i]-this.offset[i]) 
+    }.bind(this));
+    
+    if(this.options.snap) {
+      if(typeof this.options.snap == 'function') {
+        p = this.options.snap(p[0],p[1],this);
+      } else {
+      if(this.options.snap instanceof Array) {
+        p = p.map( function(v, i) {
+          return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))
+      } else {
+        p = p.map( function(v) {
+          return Math.round(v/this.options.snap)*this.options.snap }.bind(this))
+      }
+    }}
+    
+    var style = this.element.style;
+    if((!this.options.constraint) || (this.options.constraint=='horizontal'))
+      style.left = p[0] + "px";
+    if((!this.options.constraint) || (this.options.constraint=='vertical'))
+      style.top  = p[1] + "px";
+    
+    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
+  },
+  
+  stopScrolling: function() {
+    if(this.scrollInterval) {
+      clearInterval(this.scrollInterval);
+      this.scrollInterval = null;
+      Draggables._lastScrollPointer = null;
+    }
+  },
+  
+  startScrolling: function(speed) {
+    if(!(speed[0] || speed[1])) return;
+    this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
+    this.lastScrolled = new Date();
+    this.scrollInterval = setInterval(this.scroll.bind(this), 10);
+  },
+  
+  scroll: function() {
+    var current = new Date();
+    var delta = current - this.lastScrolled;
+    this.lastScrolled = current;
+    if(this.options.scroll == window) {
+      with (this._getWindowScroll(this.options.scroll)) {
+        if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
+          var d = delta / 1000;
+          this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
+        }
+      }
+    } else {
+      this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
+      this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000;
+    }
+    
+    Position.prepare();
+    Droppables.show(Draggables._lastPointer, this.element);
+    Draggables.notify('onDrag', this);
+    if (this._isScrollChild) {
+      Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
+      Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
+      Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
+      if (Draggables._lastScrollPointer[0] < 0)
+        Draggables._lastScrollPointer[0] = 0;
+      if (Draggables._lastScrollPointer[1] < 0)
+        Draggables._lastScrollPointer[1] = 0;
+      this.draw(Draggables._lastScrollPointer);
+    }
+    
+    if(this.options.change) this.options.change(this);
+  },
+  
+  _getWindowScroll: function(w) {
+    var T, L, W, H;
+    with (w.document) {
+      if (w.document.documentElement && documentElement.scrollTop) {
+        T = documentElement.scrollTop;
+        L = documentElement.scrollLeft;
+      } else if (w.document.body) {
+        T = body.scrollTop;
+        L = body.scrollLeft;
+      }
+      if (w.innerWidth) {
+        W = w.innerWidth;
+        H = w.innerHeight;
+      } else if (w.document.documentElement && documentElement.clientWidth) {
+        W = documentElement.clientWidth;
+        H = documentElement.clientHeight;
+      } else {
+        W = body.offsetWidth;
+        H = body.offsetHeight
+      }
+    }
+    return { top: T, left: L, width: W, height: H };
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var SortableObserver = Class.create();
+SortableObserver.prototype = {
+  initialize: function(element, observer) {
+    this.element   = $(element);
+    this.observer  = observer;
+    this.lastValue = Sortable.serialize(this.element);
+  },
+  
+  onStart: function() {
+    this.lastValue = Sortable.serialize(this.element);
+  },
+  
+  onEnd: function() {
+    Sortable.unmark();
+    if(this.lastValue != Sortable.serialize(this.element))
+      this.observer(this.element)
+  }
+}
+
+var Sortable = {
+  SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
+  
+  sortables: {},
+  
+  _findRootElement: function(element) {
+    while (element.tagName.toUpperCase() != "BODY") {  
+      if(element.id && Sortable.sortables[element.id]) return element;
+      element = element.parentNode;
+    }
+  },
+
+  options: function(element) {
+    element = Sortable._findRootElement($(element));
+    if(!element) return;
+    return Sortable.sortables[element.id];
+  },
+  
+  destroy: function(element){
+    var s = Sortable.options(element);
+    
+    if(s) {
+      Draggables.removeObserver(s.element);
+      s.droppables.each(function(d){ Droppables.remove(d) });
+      s.draggables.invoke('destroy');
+      
+      delete Sortable.sortables[s.element.id];
+    }
+  },
+
+  create: function(element) {
+    element = $(element);
+    var options = Object.extend({ 
+      element:     element,
+      tag:         'li',       // assumes li children, override with tag: 'tagname'
+      dropOnEmpty: false,
+      tree:        false,
+      treeTag:     'ul',
+      overlap:     'vertical', // one of 'vertical', 'horizontal'
+      constraint:  'vertical', // one of 'vertical', 'horizontal', false
+      containment: element,    // also takes array of elements (or id's); or false
+      handle:      false,      // or a CSS class
+      only:        false,
+      delay:       0,
+      hoverclass:  null,
+      ghosting:    false,
+      scroll:      false,
+      scrollSensitivity: 20,
+      scrollSpeed: 15,
+      format:      this.SERIALIZE_RULE,
+      onChange:    Prototype.emptyFunction,
+      onUpdate:    Prototype.emptyFunction
+    }, arguments[1] || {});
+
+    // clear any old sortable with same element
+    this.destroy(element);
+
+    // build options for the draggables
+    var options_for_draggable = {
+      revert:      true,
+      scroll:      options.scroll,
+      scrollSpeed: options.scrollSpeed,
+      scrollSensitivity: options.scrollSensitivity,
+      delay:       options.delay,
+      ghosting:    options.ghosting,
+      constraint:  options.constraint,
+      handle:      options.handle };
+
+    if(options.starteffect)
+      options_for_draggable.starteffect = options.starteffect;
+
+    if(options.reverteffect)
+      options_for_draggable.reverteffect = options.reverteffect;
+    else
+      if(options.ghosting) options_for_draggable.reverteffect = function(element) {
+        element.style.top  = 0;
+        element.style.left = 0;
+      };
+
+    if(options.endeffect)
+      options_for_draggable.endeffect = options.endeffect;
+
+    if(options.zindex)
+      options_for_draggable.zindex = options.zindex;
+
+    // build options for the droppables  
+    var options_for_droppable = {
+      overlap:     options.overlap,
+      containment: options.containment,
+      tree:        options.tree,
+      hoverclass:  options.hoverclass,
+      onHover:     Sortable.onHover
+    }
+    
+    var options_for_tree = {
+      onHover:      Sortable.onEmptyHover,
+      overlap:      options.overlap,
+      containment:  options.containment,
+      hoverclass:   options.hoverclass
+    }
+
+    // fix for gecko engine
+    Element.cleanWhitespace(element); 
+
+    options.draggables = [];
+    options.droppables = [];
+
+    // drop on empty handling
+    if(options.dropOnEmpty || options.tree) {
+      Droppables.add(element, options_for_tree);
+      options.droppables.push(element);
+    }
+
+    (this.findElements(element, options) || []).each( function(e) {
+      // handles are per-draggable
+      var handle = options.handle ? 
+        $(e).down('.'+options.handle,0) : e;    
+      options.draggables.push(
+        new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
+      Droppables.add(e, options_for_droppable);
+      if(options.tree) e.treeNode = element;
+      options.droppables.push(e);      
+    });
+    
+    if(options.tree) {
+      (Sortable.findTreeElements(element, options) || []).each( function(e) {
+        Droppables.add(e, options_for_tree);
+        e.treeNode = element;
+        options.droppables.push(e);
+      });
+    }
+
+    // keep reference
+    this.sortables[element.id] = options;
+
+    // for onupdate
+    Draggables.addObserver(new SortableObserver(element, options.onUpdate));
+
+  },
+
+  // return all suitable-for-sortable elements in a guaranteed order
+  findElements: function(element, options) {
+    return Element.findChildren(
+      element, options.only, options.tree ? true : false, options.tag);
+  },
+  
+  findTreeElements: function(element, options) {
+    return Element.findChildren(
+      element, options.only, options.tree ? true : false, options.treeTag);
+  },
+
+  onHover: function(element, dropon, overlap) {
+    if(Element.isParent(dropon, element)) return;
+
+    if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
+      return;
+    } else if(overlap>0.5) {
+      Sortable.mark(dropon, 'before');
+      if(dropon.previousSibling != element) {
+        var oldParentNode = element.parentNode;
+        element.style.visibility = "hidden"; // fix gecko rendering
+        dropon.parentNode.insertBefore(element, dropon);
+        if(dropon.parentNode!=oldParentNode) 
+          Sortable.options(oldParentNode).onChange(element);
+        Sortable.options(dropon.parentNode).onChange(element);
+      }
+    } else {
+      Sortable.mark(dropon, 'after');
+      var nextElement = dropon.nextSibling || null;
+      if(nextElement != element) {
+        var oldParentNode = element.parentNode;
+        element.style.visibility = "hidden"; // fix gecko rendering
+        dropon.parentNode.insertBefore(element, nextElement);
+        if(dropon.parentNode!=oldParentNode) 
+          Sortable.options(oldParentNode).onChange(element);
+        Sortable.options(dropon.parentNode).onChange(element);
+      }
+    }
+  },
+  
+  onEmptyHover: function(element, dropon, overlap) {
+    var oldParentNode = element.parentNode;
+    var droponOptions = Sortable.options(dropon);
+        
+    if(!Element.isParent(dropon, element)) {
+      var index;
+      
+      var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
+      var child = null;
+            
+      if(children) {
+        var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
+        
+        for (index = 0; index < children.length; index += 1) {
+          if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
+            offset -= Element.offsetSize (children[index], droponOptions.overlap);
+          } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
+            child = index + 1 < children.length ? children[index + 1] : null;
+            break;
+          } else {
+            child = children[index];
+            break;
+          }
+        }
+      }
+      
+      dropon.insertBefore(element, child);
+      
+      Sortable.options(oldParentNode).onChange(element);
+      droponOptions.onChange(element);
+    }
+  },
+
+  unmark: function() {
+    if(Sortable._marker) Sortable._marker.hide();
+  },
+
+  mark: function(dropon, position) {
+    // mark on ghosting only
+    var sortable = Sortable.options(dropon.parentNode);
+    if(sortable && !sortable.ghosting) return; 
+
+    if(!Sortable._marker) {
+      Sortable._marker = 
+        ($('dropmarker') || Element.extend(document.createElement('DIV'))).
+          hide().addClassName('dropmarker').setStyle({position:'absolute'});
+      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
+    }    
+    var offsets = Position.cumulativeOffset(dropon);
+    Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});
+    
+    if(position=='after')
+      if(sortable.overlap == 'horizontal') 
+        Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
+      else
+        Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});
+    
+    Sortable._marker.show();
+  },
+  
+  _tree: function(element, options, parent) {
+    var children = Sortable.findElements(element, options) || [];
+  
+    for (var i = 0; i < children.length; ++i) {
+      var match = children[i].id.match(options.format);
+
+      if (!match) continue;
+      
+      var child = {
+        id: encodeURIComponent(match ? match[1] : null),
+        element: element,
+        parent: parent,
+        children: [],
+        position: parent.children.length,
+        container: $(children[i]).down(options.treeTag)
+      }
+      
+      /* Get the element containing the children and recurse over it */
+      if (child.container)
+        this._tree(child.container, options, child)
+      
+      parent.children.push (child);
+    }
+
+    return parent; 
+  },
+
+  tree: function(element) {
+    element = $(element);
+    var sortableOptions = this.options(element);
+    var options = Object.extend({
+      tag: sortableOptions.tag,
+      treeTag: sortableOptions.treeTag,
+      only: sortableOptions.only,
+      name: element.id,
+      format: sortableOptions.format
+    }, arguments[1] || {});
+    
+    var root = {
+      id: null,
+      parent: null,
+      children: [],
+      container: element,
+      position: 0
+    }
+    
+    return Sortable._tree(element, options, root);
+  },
+
+  /* Construct a [i] index for a particular node */
+  _constructIndex: function(node) {
+    var index = '';
+    do {
+      if (node.id) index = '[' + node.position + ']' + index;
+    } while ((node = node.parent) != null);
+    return index;
+  },
+
+  sequence: function(element) {
+    element = $(element);
+    var options = Object.extend(this.options(element), arguments[1] || {});
+    
+    return $(this.findElements(element, options) || []).map( function(item) {
+      return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
+    });
+  },
+
+  setSequence: function(element, new_sequence) {
+    element = $(element);
+    var options = Object.extend(this.options(element), arguments[2] || {});
+    
+    var nodeMap = {};
+    this.findElements(element, options).each( function(n) {
+        if (n.id.match(options.format))
+            nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
+        n.parentNode.removeChild(n);
+    });
+   
+    new_sequence.each(function(ident) {
+      var n = nodeMap[ident];
+      if (n) {
+        n[1].appendChild(n[0]);
+        delete nodeMap[ident];
+      }
+    });
+  },
+  
+  serialize: function(element) {
+    element = $(element);
+    var options = Object.extend(Sortable.options(element), arguments[1] || {});
+    var name = encodeURIComponent(
+      (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
+    
+    if (options.tree) {
+      return Sortable.tree(element, arguments[1]).children.map( function (item) {
+        return [name + Sortable._constructIndex(item) + "[id]=" + 
+                encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
+      }).flatten().join('&');
+    } else {
+      return Sortable.sequence(element, arguments[1]).map( function(item) {
+        return name + "[]=" + encodeURIComponent(item);
+      }).join('&');
+    }
+  }
+}
+
+// Returns true if child is contained within element
+Element.isParent = function(child, element) {
+  if (!child.parentNode || child == element) return false;
+  if (child.parentNode == element) return true;
+  return Element.isParent(child.parentNode, element);
+}
+
+Element.findChildren = function(element, only, recursive, tagName) {    
+  if(!element.hasChildNodes()) return null;
+  tagName = tagName.toUpperCase();
+  if(only) only = [only].flatten();
+  var elements = [];
+  $A(element.childNodes).each( function(e) {
+    if(e.tagName && e.tagName.toUpperCase()==tagName &&
+      (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
+        elements.push(e);
+    if(recursive) {
+      var grandchildren = Element.findChildren(e, only, recursive, tagName);
+      if(grandchildren) elements.push(grandchildren);
+    }
+  });
+
+  return (elements.length>0 ? elements.flatten() : []);
+}
+
+Element.offsetSize = function (element, type) {
+  return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/effects.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/effects.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/effects.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1090 @@
+// script.aculo.us effects.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+
+// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Contributors:
+//  Justin Palmer (http://encytemedia.com/)
+//  Mark Pilgrim (http://diveintomark.org/)
+//  Martin Bialasinki
+// 
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/ 
+
+// converts rgb() and #xxx to #xxxxxx format,  
+// returns self (or first argument) if not convertable  
+String.prototype.parseColor = function() {  
+  var color = '#';
+  if(this.slice(0,4) == 'rgb(') {  
+    var cols = this.slice(4,this.length-1).split(',');  
+    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  
+  } else {  
+    if(this.slice(0,1) == '#') {  
+      if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
+      if(this.length==7) color = this.toLowerCase();  
+    }  
+  }  
+  return(color.length==7 ? color : (arguments[0] || this));  
+}
+
+/*--------------------------------------------------------------------------*/
+
+Element.collectTextNodes = function(element) {  
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue : 
+      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
+  }).flatten().join('');
+}
+
+Element.collectTextNodesIgnoreClass = function(element, className) {  
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue : 
+      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 
+        Element.collectTextNodesIgnoreClass(node, className) : ''));
+  }).flatten().join('');
+}
+
+Element.setContentZoom = function(element, percent) {
+  element = $(element);  
+  element.setStyle({fontSize: (percent/100) + 'em'});   
+  if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+  return element;
+}
+
+Element.getOpacity = function(element){
+  return $(element).getStyle('opacity');
+}
+
+Element.setOpacity = function(element, value){
+  return $(element).setStyle({opacity:value});
+}
+
+Element.getInlineOpacity = function(element){
+  return $(element).style.opacity || '';
+}
+
+Element.forceRerendering = function(element) {
+  try {
+    element = $(element);
+    var n = document.createTextNode(' ');
+    element.appendChild(n);
+    element.removeChild(n);
+  } catch(e) { }
+};
+
+/*--------------------------------------------------------------------------*/
+
+Array.prototype.call = function() {
+  var args = arguments;
+  this.each(function(f){ f.apply(this, args) });
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Effect = {
+  _elementDoesNotExistError: {
+    name: 'ElementDoesNotExistError',
+    message: 'The specified DOM element does not exist, but is required for this effect to operate'
+  },
+  tagifyText: function(element) {
+    if(typeof Builder == 'undefined')
+      throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
+      
+    var tagifyStyle = 'position:relative';
+    if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
+    
+    element = $(element);
+    $A(element.childNodes).each( function(child) {
+      if(child.nodeType==3) {
+        child.nodeValue.toArray().each( function(character) {
+          element.insertBefore(
+            Builder.node('span',{style: tagifyStyle},
+              character == ' ' ? String.fromCharCode(160) : character), 
+              child);
+        });
+        Element.remove(child);
+      }
+    });
+  },
+  multiple: function(element, effect) {
+    var elements;
+    if(((typeof element == 'object') || 
+        (typeof element == 'function')) && 
+       (element.length))
+      elements = element;
+    else
+      elements = $(element).childNodes;
+      
+    var options = Object.extend({
+      speed: 0.1,
+      delay: 0.0
+    }, arguments[2] || {});
+    var masterDelay = options.delay;
+
+    $A(elements).each( function(element, index) {
+      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
+    });
+  },
+  PAIRS: {
+    'slide':  ['SlideDown','SlideUp'],
+    'blind':  ['BlindDown','BlindUp'],
+    'appear': ['Appear','Fade']
+  },
+  toggle: function(element, effect) {
+    element = $(element);
+    effect = (effect || 'appear').toLowerCase();
+    var options = Object.extend({
+      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
+    }, arguments[2] || {});
+    Effect[element.visible() ? 
+      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
+  }
+};
+
+var Effect2 = Effect; // deprecated
+
+/* ------------- transitions ------------- */
+
+Effect.Transitions = {
+  linear: Prototype.K,
+  sinoidal: function(pos) {
+    return (-Math.cos(pos*Math.PI)/2) + 0.5;
+  },
+  reverse: function(pos) {
+    return 1-pos;
+  },
+  flicker: function(pos) {
+    return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
+  },
+  wobble: function(pos) {
+    return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
+  },
+  pulse: function(pos, pulses) { 
+    pulses = pulses || 5; 
+    return (
+      Math.round((pos % (1/pulses)) * pulses) == 0 ? 
+            ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 
+        1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
+      );
+  },
+  none: function(pos) {
+    return 0;
+  },
+  full: function(pos) {
+    return 1;
+  }
+};
+
+/* ------------- core effects ------------- */
+
+Effect.ScopedQueue = Class.create();
+Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
+  initialize: function() {
+    this.effects  = [];
+    this.interval = null;
+  },
+  _each: function(iterator) {
+    this.effects._each(iterator);
+  },
+  add: function(effect) {
+    var timestamp = new Date().getTime();
+    
+    var position = (typeof effect.options.queue == 'string') ? 
+      effect.options.queue : effect.options.queue.position;
+    
+    switch(position) {
+      case 'front':
+        // move unstarted effects after this effect  
+        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
+            e.startOn  += effect.finishOn;
+            e.finishOn += effect.finishOn;
+          });
+        break;
+      case 'with-last':
+        timestamp = this.effects.pluck('startOn').max() || timestamp;
+        break;
+      case 'end':
+        // start effect after last queued effect has finished
+        timestamp = this.effects.pluck('finishOn').max() || timestamp;
+        break;
+    }
+    
+    effect.startOn  += timestamp;
+    effect.finishOn += timestamp;
+
+    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
+      this.effects.push(effect);
+    
+    if(!this.interval) 
+      this.interval = setInterval(this.loop.bind(this), 15);
+  },
+  remove: function(effect) {
+    this.effects = this.effects.reject(function(e) { return e==effect });
+    if(this.effects.length == 0) {
+      clearInterval(this.interval);
+      this.interval = null;
+    }
+  },
+  loop: function() {
+    var timePos = new Date().getTime();
+    for(var i=0, len=this.effects.length;i<len;i++) 
+      if(this.effects[i]) this.effects[i].loop(timePos);
+  }
+});
+
+Effect.Queues = {
+  instances: $H(),
+  get: function(queueName) {
+    if(typeof queueName != 'string') return queueName;
+    
+    if(!this.instances[queueName])
+      this.instances[queueName] = new Effect.ScopedQueue();
+      
+    return this.instances[queueName];
+  }
+}
+Effect.Queue = Effect.Queues.get('global');
+
+Effect.DefaultOptions = {
+  transition: Effect.Transitions.sinoidal,
+  duration:   1.0,   // seconds
+  fps:        60.0,  // max. 60fps due to Effect.Queue implementation
+  sync:       false, // true for combining
+  from:       0.0,
+  to:         1.0,
+  delay:      0.0,
+  queue:      'parallel'
+}
+
+Effect.Base = function() {};
+Effect.Base.prototype = {
+  position: null,
+  start: function(options) {
+    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
+    this.currentFrame = 0;
+    this.state        = 'idle';
+    this.startOn      = this.options.delay*1000;
+    this.finishOn     = this.startOn + (this.options.duration*1000);
+    this.event('beforeStart');
+    if(!this.options.sync)
+      Effect.Queues.get(typeof this.options.queue == 'string' ? 
+        'global' : this.options.queue.scope).add(this);
+  },
+  loop: function(timePos) {
+    if(timePos >= this.startOn) {
+      if(timePos >= this.finishOn) {
+        this.render(1.0);
+        this.cancel();
+        this.event('beforeFinish');
+        if(this.finish) this.finish(); 
+        this.event('afterFinish');
+        return;  
+      }
+      var pos   = (timePos - this.startOn) / (this.finishOn - this.startOn);
+      var frame = Math.round(pos * this.options.fps * this.options.duration);
+      if(frame > this.currentFrame) {
+        this.render(pos);
+        this.currentFrame = frame;
+      }
+    }
+  },
+  render: function(pos) {
+    if(this.state == 'idle') {
+      this.state = 'running';
+      this.event('beforeSetup');
+      if(this.setup) this.setup();
+      this.event('afterSetup');
+    }
+    if(this.state == 'running') {
+      if(this.options.transition) pos = this.options.transition(pos);
+      pos *= (this.options.to-this.options.from);
+      pos += this.options.from;
+      this.position = pos;
+      this.event('beforeUpdate');
+      if(this.update) this.update(pos);
+      this.event('afterUpdate');
+    }
+  },
+  cancel: function() {
+    if(!this.options.sync)
+      Effect.Queues.get(typeof this.options.queue == 'string' ? 
+        'global' : this.options.queue.scope).remove(this);
+    this.state = 'finished';
+  },
+  event: function(eventName) {
+    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
+    if(this.options[eventName]) this.options[eventName](this);
+  },
+  inspect: function() {
+    var data = $H();
+    for(property in this)
+      if(typeof this[property] != 'function') data[property] = this[property];
+    return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
+  }
+}
+
+Effect.Parallel = Class.create();
+Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
+  initialize: function(effects) {
+    this.effects = effects || [];
+    this.start(arguments[1]);
+  },
+  update: function(position) {
+    this.effects.invoke('render', position);
+  },
+  finish: function(position) {
+    this.effects.each( function(effect) {
+      effect.render(1.0);
+      effect.cancel();
+      effect.event('beforeFinish');
+      if(effect.finish) effect.finish(position);
+      effect.event('afterFinish');
+    });
+  }
+});
+
+Effect.Event = Class.create();
+Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
+  initialize: function() {
+    var options = Object.extend({
+      duration: 0
+    }, arguments[0] || {});
+    this.start(options);
+  },
+  update: Prototype.emptyFunction
+});
+
+Effect.Opacity = Class.create();
+Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    // make this work on IE on elements without 'layout'
+    if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
+      this.element.setStyle({zoom: 1});
+    var options = Object.extend({
+      from: this.element.getOpacity() || 0.0,
+      to:   1.0
+    }, arguments[1] || {});
+    this.start(options);
+  },
+  update: function(position) {
+    this.element.setOpacity(position);
+  }
+});
+
+Effect.Move = Class.create();
+Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      x:    0,
+      y:    0,
+      mode: 'relative'
+    }, arguments[1] || {});
+    this.start(options);
+  },
+  setup: function() {
+    // Bug in Opera: Opera returns the "real" position of a static element or
+    // relative element that does not have top/left explicitly set.
+    // ==> Always set top and left for position relative elements in your stylesheets 
+    // (to 0 if you do not need them) 
+    this.element.makePositioned();
+    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
+    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
+    if(this.options.mode == 'absolute') {
+      // absolute movement, so we need to calc deltaX and deltaY
+      this.options.x = this.options.x - this.originalLeft;
+      this.options.y = this.options.y - this.originalTop;
+    }
+  },
+  update: function(position) {
+    this.element.setStyle({
+      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',
+      top:  Math.round(this.options.y  * position + this.originalTop)  + 'px'
+    });
+  }
+});
+
+// for backwards compatibility
+Effect.MoveBy = function(element, toTop, toLeft) {
+  return new Effect.Move(element, 
+    Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
+};
+
+Effect.Scale = Class.create();
+Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
+  initialize: function(element, percent) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      scaleX: true,
+      scaleY: true,
+      scaleContent: true,
+      scaleFromCenter: false,
+      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
+      scaleFrom: 100.0,
+      scaleTo:   percent
+    }, arguments[2] || {});
+    this.start(options);
+  },
+  setup: function() {
+    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
+    this.elementPositioning = this.element.getStyle('position');
+    
+    this.originalStyle = {};
+    ['top','left','width','height','fontSize'].each( function(k) {
+      this.originalStyle[k] = this.element.style[k];
+    }.bind(this));
+      
+    this.originalTop  = this.element.offsetTop;
+    this.originalLeft = this.element.offsetLeft;
+    
+    var fontSize = this.element.getStyle('font-size') || '100%';
+    ['em','px','%','pt'].each( function(fontSizeType) {
+      if(fontSize.indexOf(fontSizeType)>0) {
+        this.fontSize     = parseFloat(fontSize);
+        this.fontSizeType = fontSizeType;
+      }
+    }.bind(this));
+    
+    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
+    
+    this.dims = null;
+    if(this.options.scaleMode=='box')
+      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
+    if(/^content/.test(this.options.scaleMode))
+      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
+    if(!this.dims)
+      this.dims = [this.options.scaleMode.originalHeight,
+                   this.options.scaleMode.originalWidth];
+  },
+  update: function(position) {
+    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
+    if(this.options.scaleContent && this.fontSize)
+      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
+    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
+  },
+  finish: function(position) {
+    if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
+  },
+  setDimensions: function(height, width) {
+    var d = {};
+    if(this.options.scaleX) d.width = Math.round(width) + 'px';
+    if(this.options.scaleY) d.height = Math.round(height) + 'px';
+    if(this.options.scaleFromCenter) {
+      var topd  = (height - this.dims[0])/2;
+      var leftd = (width  - this.dims[1])/2;
+      if(this.elementPositioning == 'absolute') {
+        if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
+        if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
+      } else {
+        if(this.options.scaleY) d.top = -topd + 'px';
+        if(this.options.scaleX) d.left = -leftd + 'px';
+      }
+    }
+    this.element.setStyle(d);
+  }
+});
+
+Effect.Highlight = Class.create();
+Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
+    this.start(options);
+  },
+  setup: function() {
+    // Prevent executing on elements not in the layout flow
+    if(this.element.getStyle('display')=='none') { this.cancel(); return; }
+    // Disable background image during the effect
+    this.oldStyle = {};
+    if (!this.options.keepBackgroundImage) {
+      this.oldStyle.backgroundImage = this.element.getStyle('background-image');
+      this.element.setStyle({backgroundImage: 'none'});
+    }
+    if(!this.options.endcolor)
+      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
+    if(!this.options.restorecolor)
+      this.options.restorecolor = this.element.getStyle('background-color');
+    // init color calculations
+    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
+    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
+  },
+  update: function(position) {
+    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
+      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
+  },
+  finish: function() {
+    this.element.setStyle(Object.extend(this.oldStyle, {
+      backgroundColor: this.options.restorecolor
+    }));
+  }
+});
+
+Effect.ScrollTo = Class.create();
+Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    this.start(arguments[1] || {});
+  },
+  setup: function() {
+    Position.prepare();
+    var offsets = Position.cumulativeOffset(this.element);
+    if(this.options.offset) offsets[1] += this.options.offset;
+    var max = window.innerHeight ? 
+      window.height - window.innerHeight :
+      document.body.scrollHeight - 
+        (document.documentElement.clientHeight ? 
+          document.documentElement.clientHeight : document.body.clientHeight);
+    this.scrollStart = Position.deltaY;
+    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
+  },
+  update: function(position) {
+    Position.prepare();
+    window.scrollTo(Position.deltaX, 
+      this.scrollStart + (position*this.delta));
+  }
+});
+
+/* ------------- combination effects ------------- */
+
+Effect.Fade = function(element) {
+  element = $(element);
+  var oldOpacity = element.getInlineOpacity();
+  var options = Object.extend({
+  from: element.getOpacity() || 1.0,
+  to:   0.0,
+  afterFinishInternal: function(effect) { 
+    if(effect.options.to!=0) return;
+    effect.element.hide().setStyle({opacity: oldOpacity}); 
+  }}, arguments[1] || {});
+  return new Effect.Opacity(element,options);
+}
+
+Effect.Appear = function(element) {
+  element = $(element);
+  var options = Object.extend({
+  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
+  to:   1.0,
+  // force Safari to render floated elements properly
+  afterFinishInternal: function(effect) {
+    effect.element.forceRerendering();
+  },
+  beforeSetup: function(effect) {
+    effect.element.setOpacity(effect.options.from).show(); 
+  }}, arguments[1] || {});
+  return new Effect.Opacity(element,options);
+}
+
+Effect.Puff = function(element) {
+  element = $(element);
+  var oldStyle = { 
+    opacity: element.getInlineOpacity(), 
+    position: element.getStyle('position'),
+    top:  element.style.top,
+    left: element.style.left,
+    width: element.style.width,
+    height: element.style.height
+  };
+  return new Effect.Parallel(
+   [ new Effect.Scale(element, 200, 
+      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 
+     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 
+     Object.extend({ duration: 1.0, 
+      beforeSetupInternal: function(effect) {
+        Position.absolutize(effect.effects[0].element)
+      },
+      afterFinishInternal: function(effect) {
+         effect.effects[0].element.hide().setStyle(oldStyle); }
+     }, arguments[1] || {})
+   );
+}
+
+Effect.BlindUp = function(element) {
+  element = $(element);
+  element.makeClipping();
+  return new Effect.Scale(element, 0,
+    Object.extend({ scaleContent: false, 
+      scaleX: false, 
+      restoreAfterFinish: true,
+      afterFinishInternal: function(effect) {
+        effect.element.hide().undoClipping();
+      } 
+    }, arguments[1] || {})
+  );
+}
+
+Effect.BlindDown = function(element) {
+  element = $(element);
+  var elementDimensions = element.getDimensions();
+  return new Effect.Scale(element, 100, Object.extend({ 
+    scaleContent: false, 
+    scaleX: false,
+    scaleFrom: 0,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+    restoreAfterFinish: true,
+    afterSetup: function(effect) {
+      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
+    },  
+    afterFinishInternal: function(effect) {
+      effect.element.undoClipping();
+    }
+  }, arguments[1] || {}));
+}
+
+Effect.SwitchOff = function(element) {
+  element = $(element);
+  var oldOpacity = element.getInlineOpacity();
+  return new Effect.Appear(element, Object.extend({
+    duration: 0.4,
+    from: 0,
+    transition: Effect.Transitions.flicker,
+    afterFinishInternal: function(effect) {
+      new Effect.Scale(effect.element, 1, { 
+        duration: 0.3, scaleFromCenter: true,
+        scaleX: false, scaleContent: false, restoreAfterFinish: true,
+        beforeSetup: function(effect) { 
+          effect.element.makePositioned().makeClipping();
+        },
+        afterFinishInternal: function(effect) {
+          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
+        }
+      })
+    }
+  }, arguments[1] || {}));
+}
+
+Effect.DropOut = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.getStyle('top'),
+    left: element.getStyle('left'),
+    opacity: element.getInlineOpacity() };
+  return new Effect.Parallel(
+    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 
+      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
+    Object.extend(
+      { duration: 0.5,
+        beforeSetup: function(effect) {
+          effect.effects[0].element.makePositioned(); 
+        },
+        afterFinishInternal: function(effect) {
+          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
+        } 
+      }, arguments[1] || {}));
+}
+
+Effect.Shake = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.getStyle('top'),
+    left: element.getStyle('left') };
+    return new Effect.Move(element, 
+      { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+        effect.element.undoPositioned().setStyle(oldStyle);
+  }}) }}) }}) }}) }}) }});
+}
+
+Effect.SlideDown = function(element) {
+  element = $(element).cleanWhitespace();
+  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
+  var oldInnerBottom = element.down().getStyle('bottom');
+  var elementDimensions = element.getDimensions();
+  return new Effect.Scale(element, 100, Object.extend({ 
+    scaleContent: false, 
+    scaleX: false, 
+    scaleFrom: window.opera ? 0 : 1,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+    restoreAfterFinish: true,
+    afterSetup: function(effect) {
+      effect.element.makePositioned();
+      effect.element.down().makePositioned();
+      if(window.opera) effect.element.setStyle({top: ''});
+      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
+    },
+    afterUpdateInternal: function(effect) {
+      effect.element.down().setStyle({bottom:
+        (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.undoClipping().undoPositioned();
+      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
+    }, arguments[1] || {})
+  );
+}
+
+Effect.SlideUp = function(element) {
+  element = $(element).cleanWhitespace();
+  var oldInnerBottom = element.down().getStyle('bottom');
+  return new Effect.Scale(element, window.opera ? 0 : 1,
+   Object.extend({ scaleContent: false, 
+    scaleX: false, 
+    scaleMode: 'box',
+    scaleFrom: 100,
+    restoreAfterFinish: true,
+    beforeStartInternal: function(effect) {
+      effect.element.makePositioned();
+      effect.element.down().makePositioned();
+      if(window.opera) effect.element.setStyle({top: ''});
+      effect.element.makeClipping().show();
+    },  
+    afterUpdateInternal: function(effect) {
+      effect.element.down().setStyle({bottom:
+        (effect.dims[0] - effect.element.clientHeight) + 'px' });
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});
+      effect.element.down().undoPositioned();
+    }
+   }, arguments[1] || {})
+  );
+}
+
+// Bug in opera makes the TD containing this element expand for a instance after finish 
+Effect.Squish = function(element) {
+  return new Effect.Scale(element, window.opera ? 1 : 0, { 
+    restoreAfterFinish: true,
+    beforeSetup: function(effect) {
+      effect.element.makeClipping(); 
+    },  
+    afterFinishInternal: function(effect) {
+      effect.element.hide().undoClipping(); 
+    }
+  });
+}
+
+Effect.Grow = function(element) {
+  element = $(element);
+  var options = Object.extend({
+    direction: 'center',
+    moveTransition: Effect.Transitions.sinoidal,
+    scaleTransition: Effect.Transitions.sinoidal,
+    opacityTransition: Effect.Transitions.full
+  }, arguments[1] || {});
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    height: element.style.height,
+    width: element.style.width,
+    opacity: element.getInlineOpacity() };
+
+  var dims = element.getDimensions();    
+  var initialMoveX, initialMoveY;
+  var moveX, moveY;
+  
+  switch (options.direction) {
+    case 'top-left':
+      initialMoveX = initialMoveY = moveX = moveY = 0; 
+      break;
+    case 'top-right':
+      initialMoveX = dims.width;
+      initialMoveY = moveY = 0;
+      moveX = -dims.width;
+      break;
+    case 'bottom-left':
+      initialMoveX = moveX = 0;
+      initialMoveY = dims.height;
+      moveY = -dims.height;
+      break;
+    case 'bottom-right':
+      initialMoveX = dims.width;
+      initialMoveY = dims.height;
+      moveX = -dims.width;
+      moveY = -dims.height;
+      break;
+    case 'center':
+      initialMoveX = dims.width / 2;
+      initialMoveY = dims.height / 2;
+      moveX = -dims.width / 2;
+      moveY = -dims.height / 2;
+      break;
+  }
+  
+  return new Effect.Move(element, {
+    x: initialMoveX,
+    y: initialMoveY,
+    duration: 0.01, 
+    beforeSetup: function(effect) {
+      effect.element.hide().makeClipping().makePositioned();
+    },
+    afterFinishInternal: function(effect) {
+      new Effect.Parallel(
+        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
+          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
+          new Effect.Scale(effect.element, 100, {
+            scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 
+            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
+        ], Object.extend({
+             beforeSetup: function(effect) {
+               effect.effects[0].element.setStyle({height: '0px'}).show(); 
+             },
+             afterFinishInternal: function(effect) {
+               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); 
+             }
+           }, options)
+      )
+    }
+  });
+}
+
+Effect.Shrink = function(element) {
+  element = $(element);
+  var options = Object.extend({
+    direction: 'center',
+    moveTransition: Effect.Transitions.sinoidal,
+    scaleTransition: Effect.Transitions.sinoidal,
+    opacityTransition: Effect.Transitions.none
+  }, arguments[1] || {});
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    height: element.style.height,
+    width: element.style.width,
+    opacity: element.getInlineOpacity() };
+
+  var dims = element.getDimensions();
+  var moveX, moveY;
+  
+  switch (options.direction) {
+    case 'top-left':
+      moveX = moveY = 0;
+      break;
+    case 'top-right':
+      moveX = dims.width;
+      moveY = 0;
+      break;
+    case 'bottom-left':
+      moveX = 0;
+      moveY = dims.height;
+      break;
+    case 'bottom-right':
+      moveX = dims.width;
+      moveY = dims.height;
+      break;
+    case 'center':  
+      moveX = dims.width / 2;
+      moveY = dims.height / 2;
+      break;
+  }
+  
+  return new Effect.Parallel(
+    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
+      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
+      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
+    ], Object.extend({            
+         beforeStartInternal: function(effect) {
+           effect.effects[0].element.makePositioned().makeClipping(); 
+         },
+         afterFinishInternal: function(effect) {
+           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
+       }, options)
+  );
+}
+
+Effect.Pulsate = function(element) {
+  element = $(element);
+  var options    = arguments[1] || {};
+  var oldOpacity = element.getInlineOpacity();
+  var transition = options.transition || Effect.Transitions.sinoidal;
+  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
+  reverser.bind(transition);
+  return new Effect.Opacity(element, 
+    Object.extend(Object.extend({  duration: 2.0, from: 0,
+      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
+    }, options), {transition: reverser}));
+}
+
+Effect.Fold = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    width: element.style.width,
+    height: element.style.height };
+  element.makeClipping();
+  return new Effect.Scale(element, 5, Object.extend({   
+    scaleContent: false,
+    scaleX: false,
+    afterFinishInternal: function(effect) {
+    new Effect.Scale(element, 1, { 
+      scaleContent: false, 
+      scaleY: false,
+      afterFinishInternal: function(effect) {
+        effect.element.hide().undoClipping().setStyle(oldStyle);
+      } });
+  }}, arguments[1] || {}));
+};
+
+Effect.Morph = Class.create();
+Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      style: {}
+    }, arguments[1] || {});
+    if (typeof options.style == 'string') {
+      if(options.style.indexOf(':') == -1) {
+        var cssText = '', selector = '.' + options.style;
+        $A(document.styleSheets).reverse().each(function(styleSheet) {
+          if (styleSheet.cssRules) cssRules = styleSheet.cssRules;
+          else if (styleSheet.rules) cssRules = styleSheet.rules;
+          $A(cssRules).reverse().each(function(rule) {
+            if (selector == rule.selectorText) {
+              cssText = rule.style.cssText;
+              throw $break;
+            }
+          });
+          if (cssText) throw $break;
+        });
+        this.style = cssText.parseStyle();
+        options.afterFinishInternal = function(effect){
+          effect.element.addClassName(effect.options.style);
+          effect.transforms.each(function(transform) {
+            if(transform.style != 'opacity')
+              effect.element.style[transform.style.camelize()] = '';
+          });
+        }
+      } else this.style = options.style.parseStyle();
+    } else this.style = $H(options.style)
+    this.start(options);
+  },
+  setup: function(){
+    function parseColor(color){
+      if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
+      color = color.parseColor();
+      return $R(0,2).map(function(i){
+        return parseInt( color.slice(i*2+1,i*2+3), 16 ) 
+      });
+    }
+    this.transforms = this.style.map(function(pair){
+      var property = pair[0].underscore().dasherize(), value = pair[1], unit = null;
+
+      if(value.parseColor('#zzzzzz') != '#zzzzzz') {
+        value = value.parseColor();
+        unit  = 'color';
+      } else if(property == 'opacity') {
+        value = parseFloat(value);
+        if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
+          this.element.setStyle({zoom: 1});
+      } else if(Element.CSS_LENGTH.test(value)) 
+        var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/),
+          value = parseFloat(components[1]), unit = (components.length == 3) ? components[2] : null;
+
+      var originalValue = this.element.getStyle(property);
+      return $H({ 
+        style: property, 
+        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), 
+        targetValue: unit=='color' ? parseColor(value) : value,
+        unit: unit
+      });
+    }.bind(this)).reject(function(transform){
+      return (
+        (transform.originalValue == transform.targetValue) ||
+        (
+          transform.unit != 'color' &&
+          (isNaN(transform.originalValue) || isNaN(transform.targetValue))
+        )
+      )
+    });
+  },
+  update: function(position) {
+    var style = $H(), value = null;
+    this.transforms.each(function(transform){
+      value = transform.unit=='color' ?
+        $R(0,2).inject('#',function(m,v,i){
+          return m+(Math.round(transform.originalValue[i]+
+            (transform.targetValue[i] - transform.originalValue[i])*position)).toColorPart() }) : 
+        transform.originalValue + Math.round(
+          ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;
+      style[transform.style] = value;
+    });
+    this.element.setStyle(style);
+  }
+});
+
+Effect.Transform = Class.create();
+Object.extend(Effect.Transform.prototype, {
+  initialize: function(tracks){
+    this.tracks  = [];
+    this.options = arguments[1] || {};
+    this.addTracks(tracks);
+  },
+  addTracks: function(tracks){
+    tracks.each(function(track){
+      var data = $H(track).values().first();
+      this.tracks.push($H({
+        ids:     $H(track).keys().first(),
+        effect:  Effect.Morph,
+        options: { style: data }
+      }));
+    }.bind(this));
+    return this;
+  },
+  play: function(){
+    return new Effect.Parallel(
+      this.tracks.map(function(track){
+        var elements = [$(track.ids) || $$(track.ids)].flatten();
+        return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });
+      }).flatten(),
+      this.options
+    );
+  }
+});
+
+Element.CSS_PROPERTIES = $w(
+  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 
+  'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
+  'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
+  'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
+  'fontSize fontWeight height left letterSpacing lineHeight ' +
+  'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
+  'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
+  'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
+  'right textIndent top width wordSpacing zIndex');
+  
+Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
+
+String.prototype.parseStyle = function(){
+  var element = Element.extend(document.createElement('div'));
+  element.innerHTML = '<div style="' + this + '"></div>';
+  var style = element.down().style, styleRules = $H();
+  
+  Element.CSS_PROPERTIES.each(function(property){
+    if(style[property]) styleRules[property] = style[property]; 
+  });
+  if(/MSIE/.test(navigator.userAgent) && !window.opera && this.indexOf('opacity') > -1) {
+    styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1];
+  }
+  return styleRules;
+};
+
+Element.morph = function(element, style) {
+  new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));
+  return element;
+};
+
+['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
+ 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( 
+  function(f) { Element.Methods[f] = Element[f]; }
+);
+
+Element.Methods.visualEffect = function(element, effect, options) {
+  s = effect.gsub(/_/, '-').camelize();
+  effect_class = s.charAt(0).toUpperCase() + s.substring(1);
+  new Effect[effect_class](element, options);
+  return $(element);
+};
+
+Element.addMethods();
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/index.html
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/index.html	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/index.html	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,4 @@
+<html>
+<body>
+</body>
+</html>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/prototype.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/prototype.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/prototype.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,2515 @@
+/*  Prototype JavaScript framework, version 1.5.0
+ *  (c) 2005-2007 Sam Stephenson
+ *
+ *  Prototype is freely distributable under the terms of an MIT-style license.
+ *  For details, see the Prototype web site: http://prototype.conio.net/
+ *
+/*--------------------------------------------------------------------------*/
+
+var Prototype = {
+  Version: '1.5.0',
+  BrowserFeatures: {
+    XPath: !!document.evaluate
+  },
+
+  ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
+  emptyFunction: function() {},
+  K: function(x) { return x }
+}
+
+var Class = {
+  create: function() {
+    return function() {
+      this.initialize.apply(this, arguments);
+    }
+  }
+}
+
+var Abstract = new Object();
+
+Object.extend = function(destination, source) {
+  for (var property in source) {
+    destination[property] = source[property];
+  }
+  return destination;
+}
+
+Object.extend(Object, {
+  inspect: function(object) {
+    try {
+      if (object === undefined) return 'undefined';
+      if (object === null) return 'null';
+      return object.inspect ? object.inspect() : object.toString();
+    } catch (e) {
+      if (e instanceof RangeError) return '...';
+      throw e;
+    }
+  },
+
+  keys: function(object) {
+    var keys = [];
+    for (var property in object)
+      keys.push(property);
+    return keys;
+  },
+
+  values: function(object) {
+    var values = [];
+    for (var property in object)
+      values.push(object[property]);
+    return values;
+  },
+
+  clone: function(object) {
+    return Object.extend({}, object);
+  }
+});
+
+Function.prototype.bind = function() {
+  var __method = this, args = $A(arguments), object = args.shift();
+  return function() {
+    return __method.apply(object, args.concat($A(arguments)));
+  }
+}
+
+Function.prototype.bindAsEventListener = function(object) {
+  var __method = this, args = $A(arguments), object = args.shift();
+  return function(event) {
+    return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
+  }
+}
+
+Object.extend(Number.prototype, {
+  toColorPart: function() {
+    var digits = this.toString(16);
+    if (this < 16) return '0' + digits;
+    return digits;
+  },
+
+  succ: function() {
+    return this + 1;
+  },
+
+  times: function(iterator) {
+    $R(0, this, true).each(iterator);
+    return this;
+  }
+});
+
+var Try = {
+  these: function() {
+    var returnValue;
+
+    for (var i = 0, length = arguments.length; i < length; i++) {
+      var lambda = arguments[i];
+      try {
+        returnValue = lambda();
+        break;
+      } catch (e) {}
+    }
+
+    return returnValue;
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var PeriodicalExecuter = Class.create();
+PeriodicalExecuter.prototype = {
+  initialize: function(callback, frequency) {
+    this.callback = callback;
+    this.frequency = frequency;
+    this.currentlyExecuting = false;
+
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  stop: function() {
+    if (!this.timer) return;
+    clearInterval(this.timer);
+    this.timer = null;
+  },
+
+  onTimerEvent: function() {
+    if (!this.currentlyExecuting) {
+      try {
+        this.currentlyExecuting = true;
+        this.callback(this);
+      } finally {
+        this.currentlyExecuting = false;
+      }
+    }
+  }
+}
+String.interpret = function(value){
+  return value == null ? '' : String(value);
+}
+
+Object.extend(String.prototype, {
+  gsub: function(pattern, replacement) {
+    var result = '', source = this, match;
+    replacement = arguments.callee.prepareReplacement(replacement);
+
+    while (source.length > 0) {
+      if (match = source.match(pattern)) {
+        result += source.slice(0, match.index);
+        result += String.interpret(replacement(match));
+        source  = source.slice(match.index + match[0].length);
+      } else {
+        result += source, source = '';
+      }
+    }
+    return result;
+  },
+
+  sub: function(pattern, replacement, count) {
+    replacement = this.gsub.prepareReplacement(replacement);
+    count = count === undefined ? 1 : count;
+
+    return this.gsub(pattern, function(match) {
+      if (--count < 0) return match[0];
+      return replacement(match);
+    });
+  },
+
+  scan: function(pattern, iterator) {
+    this.gsub(pattern, iterator);
+    return this;
+  },
+
+  truncate: function(length, truncation) {
+    length = length || 30;
+    truncation = truncation === undefined ? '...' : truncation;
+    return this.length > length ?
+      this.slice(0, length - truncation.length) + truncation : this;
+  },
+
+  strip: function() {
+    return this.replace(/^\s+/, '').replace(/\s+$/, '');
+  },
+
+  stripTags: function() {
+    return this.replace(/<\/?[^>]+>/gi, '');
+  },
+
+  stripScripts: function() {
+    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
+  },
+
+  extractScripts: function() {
+    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
+    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
+    return (this.match(matchAll) || []).map(function(scriptTag) {
+      return (scriptTag.match(matchOne) || ['', ''])[1];
+    });
+  },
+
+  evalScripts: function() {
+    return this.extractScripts().map(function(script) { return eval(script) });
+  },
+
+  escapeHTML: function() {
+    var div = document.createElement('div');
+    var text = document.createTextNode(this);
+    div.appendChild(text);
+    return div.innerHTML;
+  },
+
+  unescapeHTML: function() {
+    var div = document.createElement('div');
+    div.innerHTML = this.stripTags();
+    return div.childNodes[0] ? (div.childNodes.length > 1 ?
+      $A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) :
+      div.childNodes[0].nodeValue) : '';
+  },
+
+  toQueryParams: function(separator) {
+    var match = this.strip().match(/([^?#]*)(#.*)?$/);
+    if (!match) return {};
+
+    return match[1].split(separator || '&').inject({}, function(hash, pair) {
+      if ((pair = pair.split('='))[0]) {
+        var name = decodeURIComponent(pair[0]);
+        var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;
+
+        if (hash[name] !== undefined) {
+          if (hash[name].constructor != Array)
+            hash[name] = [hash[name]];
+          if (value) hash[name].push(value);
+        }
+        else hash[name] = value;
+      }
+      return hash;
+    });
+  },
+
+  toArray: function() {
+    return this.split('');
+  },
+
+  succ: function() {
+    return this.slice(0, this.length - 1) +
+      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
+  },
+
+  camelize: function() {
+    var parts = this.split('-'), len = parts.length;
+    if (len == 1) return parts[0];
+
+    var camelized = this.charAt(0) == '-'
+      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
+      : parts[0];
+
+    for (var i = 1; i < len; i++)
+      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
+
+    return camelized;
+  },
+
+  capitalize: function(){
+    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
+  },
+
+  underscore: function() {
+    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
+  },
+
+  dasherize: function() {
+    return this.gsub(/_/,'-');
+  },
+
+  inspect: function(useDoubleQuotes) {
+    var escapedString = this.replace(/\\/g, '\\\\');
+    if (useDoubleQuotes)
+      return '"' + escapedString.replace(/"/g, '\\"') + '"';
+    else
+      return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+  }
+});
+
+String.prototype.gsub.prepareReplacement = function(replacement) {
+  if (typeof replacement == 'function') return replacement;
+  var template = new Template(replacement);
+  return function(match) { return template.evaluate(match) };
+}
+
+String.prototype.parseQuery = String.prototype.toQueryParams;
+
+var Template = Class.create();
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
+Template.prototype = {
+  initialize: function(template, pattern) {
+    this.template = template.toString();
+    this.pattern  = pattern || Template.Pattern;
+  },
+
+  evaluate: function(object) {
+    return this.template.gsub(this.pattern, function(match) {
+      var before = match[1];
+      if (before == '\\') return match[2];
+      return before + String.interpret(object[match[3]]);
+    });
+  }
+}
+
+var $break    = new Object();
+var $continue = new Object();
+
+var Enumerable = {
+  each: function(iterator) {
+    var index = 0;
+    try {
+      this._each(function(value) {
+        try {
+          iterator(value, index++);
+        } catch (e) {
+          if (e != $continue) throw e;
+        }
+      });
+    } catch (e) {
+      if (e != $break) throw e;
+    }
+    return this;
+  },
+
+  eachSlice: function(number, iterator) {
+    var index = -number, slices = [], array = this.toArray();
+    while ((index += number) < array.length)
+      slices.push(array.slice(index, index+number));
+    return slices.map(iterator);
+  },
+
+  all: function(iterator) {
+    var result = true;
+    this.each(function(value, index) {
+      result = result && !!(iterator || Prototype.K)(value, index);
+      if (!result) throw $break;
+    });
+    return result;
+  },
+
+  any: function(iterator) {
+    var result = false;
+    this.each(function(value, index) {
+      if (result = !!(iterator || Prototype.K)(value, index))
+        throw $break;
+    });
+    return result;
+  },
+
+  collect: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push((iterator || Prototype.K)(value, index));
+    });
+    return results;
+  },
+
+  detect: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      if (iterator(value, index)) {
+        result = value;
+        throw $break;
+      }
+    });
+    return result;
+  },
+
+  findAll: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  grep: function(pattern, iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      var stringValue = value.toString();
+      if (stringValue.match(pattern))
+        results.push((iterator || Prototype.K)(value, index));
+    })
+    return results;
+  },
+
+  include: function(object) {
+    var found = false;
+    this.each(function(value) {
+      if (value == object) {
+        found = true;
+        throw $break;
+      }
+    });
+    return found;
+  },
+
+  inGroupsOf: function(number, fillWith) {
+    fillWith = fillWith === undefined ? null : fillWith;
+    return this.eachSlice(number, function(slice) {
+      while(slice.length < number) slice.push(fillWith);
+      return slice;
+    });
+  },
+
+  inject: function(memo, iterator) {
+    this.each(function(value, index) {
+      memo = iterator(memo, value, index);
+    });
+    return memo;
+  },
+
+  invoke: function(method) {
+    var args = $A(arguments).slice(1);
+    return this.map(function(value) {
+      return value[method].apply(value, args);
+    });
+  },
+
+  max: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (result == undefined || value >= result)
+        result = value;
+    });
+    return result;
+  },
+
+  min: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (result == undefined || value < result)
+        result = value;
+    });
+    return result;
+  },
+
+  partition: function(iterator) {
+    var trues = [], falses = [];
+    this.each(function(value, index) {
+      ((iterator || Prototype.K)(value, index) ?
+        trues : falses).push(value);
+    });
+    return [trues, falses];
+  },
+
+  pluck: function(property) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push(value[property]);
+    });
+    return results;
+  },
+
+  reject: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (!iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  sortBy: function(iterator) {
+    return this.map(function(value, index) {
+      return {value: value, criteria: iterator(value, index)};
+    }).sort(function(left, right) {
+      var a = left.criteria, b = right.criteria;
+      return a < b ? -1 : a > b ? 1 : 0;
+    }).pluck('value');
+  },
+
+  toArray: function() {
+    return this.map();
+  },
+
+  zip: function() {
+    var iterator = Prototype.K, args = $A(arguments);
+    if (typeof args.last() == 'function')
+      iterator = args.pop();
+
+    var collections = [this].concat(args).map($A);
+    return this.map(function(value, index) {
+      return iterator(collections.pluck(index));
+    });
+  },
+
+  size: function() {
+    return this.toArray().length;
+  },
+
+  inspect: function() {
+    return '#<Enumerable:' + this.toArray().inspect() + '>';
+  }
+}
+
+Object.extend(Enumerable, {
+  map:     Enumerable.collect,
+  find:    Enumerable.detect,
+  select:  Enumerable.findAll,
+  member:  Enumerable.include,
+  entries: Enumerable.toArray
+});
+var $A = Array.from = function(iterable) {
+  if (!iterable) return [];
+  if (iterable.toArray) {
+    return iterable.toArray();
+  } else {
+    var results = [];
+    for (var i = 0, length = iterable.length; i < length; i++)
+      results.push(iterable[i]);
+    return results;
+  }
+}
+
+Object.extend(Array.prototype, Enumerable);
+
+if (!Array.prototype._reverse)
+  Array.prototype._reverse = Array.prototype.reverse;
+
+Object.extend(Array.prototype, {
+  _each: function(iterator) {
+    for (var i = 0, length = this.length; i < length; i++)
+      iterator(this[i]);
+  },
+
+  clear: function() {
+    this.length = 0;
+    return this;
+  },
+
+  first: function() {
+    return this[0];
+  },
+
+  last: function() {
+    return this[this.length - 1];
+  },
+
+  compact: function() {
+    return this.select(function(value) {
+      return value != null;
+    });
+  },
+
+  flatten: function() {
+    return this.inject([], function(array, value) {
+      return array.concat(value && value.constructor == Array ?
+        value.flatten() : [value]);
+    });
+  },
+
+  without: function() {
+    var values = $A(arguments);
+    return this.select(function(value) {
+      return !values.include(value);
+    });
+  },
+
+  indexOf: function(object) {
+    for (var i = 0, length = this.length; i < length; i++)
+      if (this[i] == object) return i;
+    return -1;
+  },
+
+  reverse: function(inline) {
+    return (inline !== false ? this : this.toArray())._reverse();
+  },
+
+  reduce: function() {
+    return this.length > 1 ? this : this[0];
+  },
+
+  uniq: function() {
+    return this.inject([], function(array, value) {
+      return array.include(value) ? array : array.concat([value]);
+    });
+  },
+
+  clone: function() {
+    return [].concat(this);
+  },
+
+  size: function() {
+    return this.length;
+  },
+
+  inspect: function() {
+    return '[' + this.map(Object.inspect).join(', ') + ']';
+  }
+});
+
+Array.prototype.toArray = Array.prototype.clone;
+
+function $w(string){
+  string = string.strip();
+  return string ? string.split(/\s+/) : [];
+}
+
+if(window.opera){
+  Array.prototype.concat = function(){
+    var array = [];
+    for(var i = 0, length = this.length; i < length; i++) array.push(this[i]);
+    for(var i = 0, length = arguments.length; i < length; i++) {
+      if(arguments[i].constructor == Array) {
+        for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
+          array.push(arguments[i][j]);
+      } else {
+        array.push(arguments[i]);
+      }
+    }
+    return array;
+  }
+}
+var Hash = function(obj) {
+  Object.extend(this, obj || {});
+};
+
+Object.extend(Hash, {
+  toQueryString: function(obj) {
+    var parts = [];
+
+	  this.prototype._each.call(obj, function(pair) {
+      if (!pair.key) return;
+
+      if (pair.value && pair.value.constructor == Array) {
+        var values = pair.value.compact();
+        if (values.length < 2) pair.value = values.reduce();
+        else {
+        	key = encodeURIComponent(pair.key);
+          values.each(function(value) {
+            value = value != undefined ? encodeURIComponent(value) : '';
+            parts.push(key + '=' + encodeURIComponent(value));
+          });
+          return;
+        }
+      }
+      if (pair.value == undefined) pair[1] = '';
+      parts.push(pair.map(encodeURIComponent).join('='));
+	  });
+
+    return parts.join('&');
+  }
+});
+
+Object.extend(Hash.prototype, Enumerable);
+Object.extend(Hash.prototype, {
+  _each: function(iterator) {
+    for (var key in this) {
+      var value = this[key];
+      if (value && value == Hash.prototype[key]) continue;
+
+      var pair = [key, value];
+      pair.key = key;
+      pair.value = value;
+      iterator(pair);
+    }
+  },
+
+  keys: function() {
+    return this.pluck('key');
+  },
+
+  values: function() {
+    return this.pluck('value');
+  },
+
+  merge: function(hash) {
+    return $H(hash).inject(this, function(mergedHash, pair) {
+      mergedHash[pair.key] = pair.value;
+      return mergedHash;
+    });
+  },
+
+  remove: function() {
+    var result;
+    for(var i = 0, length = arguments.length; i < length; i++) {
+      var value = this[arguments[i]];
+      if (value !== undefined){
+        if (result === undefined) result = value;
+        else {
+          if (result.constructor != Array) result = [result];
+          result.push(value)
+        }
+      }
+      delete this[arguments[i]];
+    }
+    return result;
+  },
+
+  toQueryString: function() {
+    return Hash.toQueryString(this);
+  },
+
+  inspect: function() {
+    return '#<Hash:{' + this.map(function(pair) {
+      return pair.map(Object.inspect).join(': ');
+    }).join(', ') + '}>';
+  }
+});
+
+function $H(object) {
+  if (object && object.constructor == Hash) return object;
+  return new Hash(object);
+};
+ObjectRange = Class.create();
+Object.extend(ObjectRange.prototype, Enumerable);
+Object.extend(ObjectRange.prototype, {
+  initialize: function(start, end, exclusive) {
+    this.start = start;
+    this.end = end;
+    this.exclusive = exclusive;
+  },
+
+  _each: function(iterator) {
+    var value = this.start;
+    while (this.include(value)) {
+      iterator(value);
+      value = value.succ();
+    }
+  },
+
+  include: function(value) {
+    if (value < this.start)
+      return false;
+    if (this.exclusive)
+      return value < this.end;
+    return value <= this.end;
+  }
+});
+
+var $R = function(start, end, exclusive) {
+  return new ObjectRange(start, end, exclusive);
+}
+
+var Ajax = {
+  getTransport: function() {
+    return Try.these(
+      function() {return new XMLHttpRequest()},
+      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
+      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
+    ) || false;
+  },
+
+  activeRequestCount: 0
+}
+
+Ajax.Responders = {
+  responders: [],
+
+  _each: function(iterator) {
+    this.responders._each(iterator);
+  },
+
+  register: function(responder) {
+    if (!this.include(responder))
+      this.responders.push(responder);
+  },
+
+  unregister: function(responder) {
+    this.responders = this.responders.without(responder);
+  },
+
+  dispatch: function(callback, request, transport, json) {
+    this.each(function(responder) {
+      if (typeof responder[callback] == 'function') {
+        try {
+          responder[callback].apply(responder, [request, transport, json]);
+        } catch (e) {}
+      }
+    });
+  }
+};
+
+Object.extend(Ajax.Responders, Enumerable);
+
+Ajax.Responders.register({
+  onCreate: function() {
+    Ajax.activeRequestCount++;
+  },
+  onComplete: function() {
+    Ajax.activeRequestCount--;
+  }
+});
+
+Ajax.Base = function() {};
+Ajax.Base.prototype = {
+  setOptions: function(options) {
+    this.options = {
+      method:       'post',
+      asynchronous: true,
+      contentType:  'application/x-www-form-urlencoded',
+      encoding:     'UTF-8',
+      parameters:   ''
+    }
+    Object.extend(this.options, options || {});
+
+    this.options.method = this.options.method.toLowerCase();
+    if (typeof this.options.parameters == 'string')
+      this.options.parameters = this.options.parameters.toQueryParams();
+  }
+}
+
+Ajax.Request = Class.create();
+Ajax.Request.Events =
+  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
+  _complete: false,
+
+  initialize: function(url, options) {
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+    this.request(url);
+  },
+
+  request: function(url) {
+    this.url = url;
+    this.method = this.options.method;
+    var params = this.options.parameters;
+
+    if (!['get', 'post'].include(this.method)) {
+      // simulate other verbs over post
+      params['_method'] = this.method;
+      this.method = 'post';
+    }
+
+    params = Hash.toQueryString(params);
+    if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_='
+
+    // when GET, append parameters to URL
+    if (this.method == 'get' && params)
+      this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params;
+
+    try {
+      Ajax.Responders.dispatch('onCreate', this, this.transport);
+
+      this.transport.open(this.method.toUpperCase(), this.url,
+        this.options.asynchronous);
+
+      if (this.options.asynchronous)
+        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);
+
+      this.transport.onreadystatechange = this.onStateChange.bind(this);
+      this.setRequestHeaders();
+
+      var body = this.method == 'post' ? (this.options.postBody || params) : null;
+
+      this.transport.send(body);
+
+      /* Force Firefox to handle ready state 4 for synchronous requests */
+      if (!this.options.asynchronous && this.transport.overrideMimeType)
+        this.onStateChange();
+
+    }
+    catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  onStateChange: function() {
+    var readyState = this.transport.readyState;
+    if (readyState > 1 && !((readyState == 4) && this._complete))
+      this.respondToReadyState(this.transport.readyState);
+  },
+
+  setRequestHeaders: function() {
+    var headers = {
+      'X-Requested-With': 'XMLHttpRequest',
+      'X-Prototype-Version': Prototype.Version,
+      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
+    };
+
+    if (this.method == 'post') {
+      headers['Content-type'] = this.options.contentType +
+        (this.options.encoding ? '; charset=' + this.options.encoding : '');
+
+      /* Force "Connection: close" for older Mozilla browsers to work
+       * around a bug where XMLHttpRequest sends an incorrect
+       * Content-length header. See Mozilla Bugzilla #246651.
+       */
+      if (this.transport.overrideMimeType &&
+          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
+            headers['Connection'] = 'close';
+    }
+
+    // user-defined headers
+    if (typeof this.options.requestHeaders == 'object') {
+      var extras = this.options.requestHeaders;
+
+      if (typeof extras.push == 'function')
+        for (var i = 0, length = extras.length; i < length; i += 2)
+          headers[extras[i]] = extras[i+1];
+      else
+        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
+    }
+
+    for (var name in headers)
+      this.transport.setRequestHeader(name, headers[name]);
+  },
+
+  success: function() {
+    return !this.transport.status
+        || (this.transport.status >= 200 && this.transport.status < 300);
+  },
+
+  respondToReadyState: function(readyState) {
+    var state = Ajax.Request.Events[readyState];
+    var transport = this.transport, json = this.evalJSON();
+
+    if (state == 'Complete') {
+      try {
+        this._complete = true;
+        (this.options['on' + this.transport.status]
+         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
+         || Prototype.emptyFunction)(transport, json);
+      } catch (e) {
+        this.dispatchException(e);
+      }
+
+      if ((this.getHeader('Content-type') || 'text/javascript').strip().
+        match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))
+          this.evalResponse();
+    }
+
+    try {
+      (this.options['on' + state] || Prototype.emptyFunction)(transport, json);
+      Ajax.Responders.dispatch('on' + state, this, transport, json);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+
+    if (state == 'Complete') {
+      // avoid memory leak in MSIE: clean up
+      this.transport.onreadystatechange = Prototype.emptyFunction;
+    }
+  },
+
+  getHeader: function(name) {
+    try {
+      return this.transport.getResponseHeader(name);
+    } catch (e) { return null }
+  },
+
+  evalJSON: function() {
+    try {
+      var json = this.getHeader('X-JSON');
+      return json ? eval('(' + json + ')') : null;
+    } catch (e) { return null }
+  },
+
+  evalResponse: function() {
+    try {
+      return eval(this.transport.responseText);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  dispatchException: function(exception) {
+    (this.options.onException || Prototype.emptyFunction)(this, exception);
+    Ajax.Responders.dispatch('onException', this, exception);
+  }
+});
+
+Ajax.Updater = Class.create();
+
+Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
+  initialize: function(container, url, options) {
+    this.container = {
+      success: (container.success || container),
+      failure: (container.failure || (container.success ? null : container))
+    }
+
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+
+    var onComplete = this.options.onComplete || Prototype.emptyFunction;
+    this.options.onComplete = (function(transport, param) {
+      this.updateContent();
+      onComplete(transport, param);
+    }).bind(this);
+
+    this.request(url);
+  },
+
+  updateContent: function() {
+    var receiver = this.container[this.success() ? 'success' : 'failure'];
+    var response = this.transport.responseText;
+
+    if (!this.options.evalScripts) response = response.stripScripts();
+
+    if (receiver = $(receiver)) {
+      if (this.options.insertion)
+        new this.options.insertion(receiver, response);
+      else
+        receiver.update(response);
+    }
+
+    if (this.success()) {
+      if (this.onComplete)
+        setTimeout(this.onComplete.bind(this), 10);
+    }
+  }
+});
+
+Ajax.PeriodicalUpdater = Class.create();
+Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
+  initialize: function(container, url, options) {
+    this.setOptions(options);
+    this.onComplete = this.options.onComplete;
+
+    this.frequency = (this.options.frequency || 2);
+    this.decay = (this.options.decay || 1);
+
+    this.updater = {};
+    this.container = container;
+    this.url = url;
+
+    this.start();
+  },
+
+  start: function() {
+    this.options.onComplete = this.updateComplete.bind(this);
+    this.onTimerEvent();
+  },
+
+  stop: function() {
+    this.updater.options.onComplete = undefined;
+    clearTimeout(this.timer);
+    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
+  },
+
+  updateComplete: function(request) {
+    if (this.options.decay) {
+      this.decay = (request.responseText == this.lastText ?
+        this.decay * this.options.decay : 1);
+
+      this.lastText = request.responseText;
+    }
+    this.timer = setTimeout(this.onTimerEvent.bind(this),
+      this.decay * this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    this.updater = new Ajax.Updater(this.container, this.url, this.options);
+  }
+});
+function $(element) {
+  if (arguments.length > 1) {
+    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
+      elements.push($(arguments[i]));
+    return elements;
+  }
+  if (typeof element == 'string')
+    element = document.getElementById(element);
+  return Element.extend(element);
+}
+
+if (Prototype.BrowserFeatures.XPath) {
+  document._getElementsByXPath = function(expression, parentElement) {
+    var results = [];
+    var query = document.evaluate(expression, $(parentElement) || document,
+      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    for (var i = 0, length = query.snapshotLength; i < length; i++)
+      results.push(query.snapshotItem(i));
+    return results;
+  };
+}
+
+document.getElementsByClassName = function(className, parentElement) {
+  if (Prototype.BrowserFeatures.XPath) {
+    var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
+    return document._getElementsByXPath(q, parentElement);
+  } else {
+    var children = ($(parentElement) || document.body).getElementsByTagName('*');
+    var elements = [], child;
+    for (var i = 0, length = children.length; i < length; i++) {
+      child = children[i];
+      if (Element.hasClassName(child, className))
+        elements.push(Element.extend(child));
+    }
+    return elements;
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+if (!window.Element)
+  var Element = new Object();
+
+Element.extend = function(element) {
+  if (!element || _nativeExtensions || element.nodeType == 3) return element;
+
+  if (!element._extended && element.tagName && element != window) {
+    var methods = Object.clone(Element.Methods), cache = Element.extend.cache;
+
+    if (element.tagName == 'FORM')
+      Object.extend(methods, Form.Methods);
+    if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
+      Object.extend(methods, Form.Element.Methods);
+
+    Object.extend(methods, Element.Methods.Simulated);
+
+    for (var property in methods) {
+      var value = methods[property];
+      if (typeof value == 'function' && !(property in element))
+        element[property] = cache.findOrStore(value);
+    }
+  }
+
+  element._extended = true;
+  return element;
+};
+
+Element.extend.cache = {
+  findOrStore: function(value) {
+    return this[value] = this[value] || function() {
+      return value.apply(null, [this].concat($A(arguments)));
+    }
+  }
+};
+
+Element.Methods = {
+  visible: function(element) {
+    return $(element).style.display != 'none';
+  },
+
+  toggle: function(element) {
+    element = $(element);
+    Element[Element.visible(element) ? 'hide' : 'show'](element);
+    return element;
+  },
+
+  hide: function(element) {
+    $(element).style.display = 'none';
+    return element;
+  },
+
+  show: function(element) {
+    $(element).style.display = '';
+    return element;
+  },
+
+  remove: function(element) {
+    element = $(element);
+    element.parentNode.removeChild(element);
+    return element;
+  },
+
+  update: function(element, html) {
+    html = typeof html == 'undefined' ? '' : html.toString();
+    $(element).innerHTML = html.stripScripts();
+    setTimeout(function() {html.evalScripts()}, 10);
+    return element;
+  },
+
+  replace: function(element, html) {
+    element = $(element);
+    html = typeof html == 'undefined' ? '' : html.toString();
+    if (element.outerHTML) {
+      element.outerHTML = html.stripScripts();
+    } else {
+      var range = element.ownerDocument.createRange();
+      range.selectNodeContents(element);
+      element.parentNode.replaceChild(
+        range.createContextualFragment(html.stripScripts()), element);
+    }
+    setTimeout(function() {html.evalScripts()}, 10);
+    return element;
+  },
+
+  inspect: function(element) {
+    element = $(element);
+    var result = '<' + element.tagName.toLowerCase();
+    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
+      var property = pair.first(), attribute = pair.last();
+      var value = (element[property] || '').toString();
+      if (value) result += ' ' + attribute + '=' + value.inspect(true);
+    });
+    return result + '>';
+  },
+
+  recursivelyCollect: function(element, property) {
+    element = $(element);
+    var elements = [];
+    while (element = element[property])
+      if (element.nodeType == 1)
+        elements.push(Element.extend(element));
+    return elements;
+  },
+
+  ancestors: function(element) {
+    return $(element).recursivelyCollect('parentNode');
+  },
+
+  descendants: function(element) {
+    return $A($(element).getElementsByTagName('*'));
+  },
+
+  immediateDescendants: function(element) {
+    if (!(element = $(element).firstChild)) return [];
+    while (element && element.nodeType != 1) element = element.nextSibling;
+    if (element) return [element].concat($(element).nextSiblings());
+    return [];
+  },
+
+  previousSiblings: function(element) {
+    return $(element).recursivelyCollect('previousSibling');
+  },
+
+  nextSiblings: function(element) {
+    return $(element).recursivelyCollect('nextSibling');
+  },
+
+  siblings: function(element) {
+    element = $(element);
+    return element.previousSiblings().reverse().concat(element.nextSiblings());
+  },
+
+  match: function(element, selector) {
+    if (typeof selector == 'string')
+      selector = new Selector(selector);
+    return selector.match($(element));
+  },
+
+  up: function(element, expression, index) {
+    return Selector.findElement($(element).ancestors(), expression, index);
+  },
+
+  down: function(element, expression, index) {
+    return Selector.findElement($(element).descendants(), expression, index);
+  },
+
+  previous: function(element, expression, index) {
+    return Selector.findElement($(element).previousSiblings(), expression, index);
+  },
+
+  next: function(element, expression, index) {
+    return Selector.findElement($(element).nextSiblings(), expression, index);
+  },
+
+  getElementsBySelector: function() {
+    var args = $A(arguments), element = $(args.shift());
+    return Selector.findChildElements(element, args);
+  },
+
+  getElementsByClassName: function(element, className) {
+    return document.getElementsByClassName(className, element);
+  },
+
+  readAttribute: function(element, name) {
+    element = $(element);
+    if (document.all && !window.opera) {
+      var t = Element._attributeTranslations;
+      if (t.values[name]) return t.values[name](element, name);
+      if (t.names[name])  name = t.names[name];
+      var attribute = element.attributes[name];
+      if(attribute) return attribute.nodeValue;
+    }
+    return element.getAttribute(name);
+  },
+
+  getHeight: function(element) {
+    return $(element).getDimensions().height;
+  },
+
+  getWidth: function(element) {
+    return $(element).getDimensions().width;
+  },
+
+  classNames: function(element) {
+    return new Element.ClassNames(element);
+  },
+
+  hasClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    var elementClassName = element.className;
+    if (elementClassName.length == 0) return false;
+    if (elementClassName == className ||
+        elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
+      return true;
+    return false;
+  },
+
+  addClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    Element.classNames(element).add(className);
+    return element;
+  },
+
+  removeClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    Element.classNames(element).remove(className);
+    return element;
+  },
+
+  toggleClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);
+    return element;
+  },
+
+  observe: function() {
+    Event.observe.apply(Event, arguments);
+    return $A(arguments).first();
+  },
+
+  stopObserving: function() {
+    Event.stopObserving.apply(Event, arguments);
+    return $A(arguments).first();
+  },
+
+  // removes whitespace-only text node children
+  cleanWhitespace: function(element) {
+    element = $(element);
+    var node = element.firstChild;
+    while (node) {
+      var nextNode = node.nextSibling;
+      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+        element.removeChild(node);
+      node = nextNode;
+    }
+    return element;
+  },
+
+  empty: function(element) {
+    return $(element).innerHTML.match(/^\s*$/);
+  },
+
+  descendantOf: function(element, ancestor) {
+    element = $(element), ancestor = $(ancestor);
+    while (element = element.parentNode)
+      if (element == ancestor) return true;
+    return false;
+  },
+
+  scrollTo: function(element) {
+    element = $(element);
+    var pos = Position.cumulativeOffset(element);
+    window.scrollTo(pos[0], pos[1]);
+    return element;
+  },
+
+  getStyle: function(element, style) {
+    element = $(element);
+    if (['float','cssFloat'].include(style))
+      style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');
+    style = style.camelize();
+    var value = element.style[style];
+    if (!value) {
+      if (document.defaultView && document.defaultView.getComputedStyle) {
+        var css = document.defaultView.getComputedStyle(element, null);
+        value = css ? css[style] : null;
+      } else if (element.currentStyle) {
+        value = element.currentStyle[style];
+      }
+    }
+
+    if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none'))
+      value = element['offset'+style.capitalize()] + 'px';
+
+    if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
+      if (Element.getStyle(element, 'position') == 'static') value = 'auto';
+    if(style == 'opacity') {
+      if(value) return parseFloat(value);
+      if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
+        if(value[1]) return parseFloat(value[1]) / 100;
+      return 1.0;
+    }
+    return value == 'auto' ? null : value;
+  },
+
+  setStyle: function(element, style) {
+    element = $(element);
+    for (var name in style) {
+      var value = style[name];
+      if(name == 'opacity') {
+        if (value == 1) {
+          value = (/Gecko/.test(navigator.userAgent) &&
+            !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;
+          if(/MSIE/.test(navigator.userAgent) && !window.opera)
+            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
+        } else if(value === '') {
+          if(/MSIE/.test(navigator.userAgent) && !window.opera)
+            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
+        } else {
+          if(value < 0.00001) value = 0;
+          if(/MSIE/.test(navigator.userAgent) && !window.opera)
+            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
+              'alpha(opacity='+value*100+')';
+        }
+      } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
+      element.style[name.camelize()] = value;
+    }
+    return element;
+  },
+
+  getDimensions: function(element) {
+    element = $(element);
+    var display = $(element).getStyle('display');
+    if (display != 'none' && display != null) // Safari bug
+      return {width: element.offsetWidth, height: element.offsetHeight};
+
+    // All *Width and *Height properties give 0 on elements with display none,
+    // so enable the element temporarily
+    var els = element.style;
+    var originalVisibility = els.visibility;
+    var originalPosition = els.position;
+    var originalDisplay = els.display;
+    els.visibility = 'hidden';
+    els.position = 'absolute';
+    els.display = 'block';
+    var originalWidth = element.clientWidth;
+    var originalHeight = element.clientHeight;
+    els.display = originalDisplay;
+    els.position = originalPosition;
+    els.visibility = originalVisibility;
+    return {width: originalWidth, height: originalHeight};
+  },
+
+  makePositioned: function(element) {
+    element = $(element);
+    var pos = Element.getStyle(element, 'position');
+    if (pos == 'static' || !pos) {
+      element._madePositioned = true;
+      element.style.position = 'relative';
+      // Opera returns the offset relative to the positioning context, when an
+      // element is position relative but top and left have not been defined
+      if (window.opera) {
+        element.style.top = 0;
+        element.style.left = 0;
+      }
+    }
+    return element;
+  },
+
+  undoPositioned: function(element) {
+    element = $(element);
+    if (element._madePositioned) {
+      element._madePositioned = undefined;
+      element.style.position =
+        element.style.top =
+        element.style.left =
+        element.style.bottom =
+        element.style.right = '';
+    }
+    return element;
+  },
+
+  makeClipping: function(element) {
+    element = $(element);
+    if (element._overflow) return element;
+    element._overflow = element.style.overflow || 'auto';
+    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
+      element.style.overflow = 'hidden';
+    return element;
+  },
+
+  undoClipping: function(element) {
+    element = $(element);
+    if (!element._overflow) return element;
+    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
+    element._overflow = null;
+    return element;
+  }
+};
+
+Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf});
+
+Element._attributeTranslations = {};
+
+Element._attributeTranslations.names = {
+  colspan:   "colSpan",
+  rowspan:   "rowSpan",
+  valign:    "vAlign",
+  datetime:  "dateTime",
+  accesskey: "accessKey",
+  tabindex:  "tabIndex",
+  enctype:   "encType",
+  maxlength: "maxLength",
+  readonly:  "readOnly",
+  longdesc:  "longDesc"
+};
+
+Element._attributeTranslations.values = {
+  _getAttr: function(element, attribute) {
+    return element.getAttribute(attribute, 2);
+  },
+
+  _flag: function(element, attribute) {
+    return $(element).hasAttribute(attribute) ? attribute : null;
+  },
+
+  style: function(element) {
+    return element.style.cssText.toLowerCase();
+  },
+
+  title: function(element) {
+    var node = element.getAttributeNode('title');
+    return node.specified ? node.nodeValue : null;
+  }
+};
+
+Object.extend(Element._attributeTranslations.values, {
+  href: Element._attributeTranslations.values._getAttr,
+  src:  Element._attributeTranslations.values._getAttr,
+  disabled: Element._attributeTranslations.values._flag,
+  checked:  Element._attributeTranslations.values._flag,
+  readonly: Element._attributeTranslations.values._flag,
+  multiple: Element._attributeTranslations.values._flag
+});
+
+Element.Methods.Simulated = {
+  hasAttribute: function(element, attribute) {
+    var t = Element._attributeTranslations;
+    attribute = t.names[attribute] || attribute;
+    return $(element).getAttributeNode(attribute).specified;
+  }
+};
+
+// IE is missing .innerHTML support for TABLE-related elements
+if (document.all && !window.opera){
+  Element.Methods.update = function(element, html) {
+    element = $(element);
+    html = typeof html == 'undefined' ? '' : html.toString();
+    var tagName = element.tagName.toUpperCase();
+    if (['THEAD','TBODY','TR','TD'].include(tagName)) {
+      var div = document.createElement('div');
+      switch (tagName) {
+        case 'THEAD':
+        case 'TBODY':
+          div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>';
+          depth = 2;
+          break;
+        case 'TR':
+          div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>';
+          depth = 3;
+          break;
+        case 'TD':
+          div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>';
+          depth = 4;
+      }
+      $A(element.childNodes).each(function(node){
+        element.removeChild(node)
+      });
+      depth.times(function(){ div = div.firstChild });
+
+      $A(div.childNodes).each(
+        function(node){ element.appendChild(node) });
+    } else {
+      element.innerHTML = html.stripScripts();
+    }
+    setTimeout(function() {html.evalScripts()}, 10);
+    return element;
+  }
+};
+
+Object.extend(Element, Element.Methods);
+
+var _nativeExtensions = false;
+
+if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))
+  ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {
+    var className = 'HTML' + tag + 'Element';
+    if(window[className]) return;
+    var klass = window[className] = {};
+    klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;
+  });
+
+Element.addMethods = function(methods) {
+  Object.extend(Element.Methods, methods || {});
+
+  function copy(methods, destination, onlyIfAbsent) {
+    onlyIfAbsent = onlyIfAbsent || false;
+    var cache = Element.extend.cache;
+    for (var property in methods) {
+      var value = methods[property];
+      if (!onlyIfAbsent || !(property in destination))
+        destination[property] = cache.findOrStore(value);
+    }
+  }
+
+  if (typeof HTMLElement != 'undefined') {
+    copy(Element.Methods, HTMLElement.prototype);
+    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
+    copy(Form.Methods, HTMLFormElement.prototype);
+    [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {
+      copy(Form.Element.Methods, klass.prototype);
+    });
+    _nativeExtensions = true;
+  }
+}
+
+var Toggle = new Object();
+Toggle.display = Element.toggle;
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.Insertion = function(adjacency) {
+  this.adjacency = adjacency;
+}
+
+Abstract.Insertion.prototype = {
+  initialize: function(element, content) {
+    this.element = $(element);
+    this.content = content.stripScripts();
+
+    if (this.adjacency && this.element.insertAdjacentHTML) {
+      try {
+        this.element.insertAdjacentHTML(this.adjacency, this.content);
+      } catch (e) {
+        var tagName = this.element.tagName.toUpperCase();
+        if (['TBODY', 'TR'].include(tagName)) {
+          this.insertContent(this.contentFromAnonymousTable());
+        } else {
+          throw e;
+        }
+      }
+    } else {
+      this.range = this.element.ownerDocument.createRange();
+      if (this.initializeRange) this.initializeRange();
+      this.insertContent([this.range.createContextualFragment(this.content)]);
+    }
+
+    setTimeout(function() {content.evalScripts()}, 10);
+  },
+
+  contentFromAnonymousTable: function() {
+    var div = document.createElement('div');
+    div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
+    return $A(div.childNodes[0].childNodes[0].childNodes);
+  }
+}
+
+var Insertion = new Object();
+
+Insertion.Before = Class.create();
+Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
+  initializeRange: function() {
+    this.range.setStartBefore(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.parentNode.insertBefore(fragment, this.element);
+    }).bind(this));
+  }
+});
+
+Insertion.Top = Class.create();
+Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(true);
+  },
+
+  insertContent: function(fragments) {
+    fragments.reverse(false).each((function(fragment) {
+      this.element.insertBefore(fragment, this.element.firstChild);
+    }).bind(this));
+  }
+});
+
+Insertion.Bottom = Class.create();
+Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.appendChild(fragment);
+    }).bind(this));
+  }
+});
+
+Insertion.After = Class.create();
+Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
+  initializeRange: function() {
+    this.range.setStartAfter(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.parentNode.insertBefore(fragment,
+        this.element.nextSibling);
+    }).bind(this));
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+  initialize: function(element) {
+    this.element = $(element);
+  },
+
+  _each: function(iterator) {
+    this.element.className.split(/\s+/).select(function(name) {
+      return name.length > 0;
+    })._each(iterator);
+  },
+
+  set: function(className) {
+    this.element.className = className;
+  },
+
+  add: function(classNameToAdd) {
+    if (this.include(classNameToAdd)) return;
+    this.set($A(this).concat(classNameToAdd).join(' '));
+  },
+
+  remove: function(classNameToRemove) {
+    if (!this.include(classNameToRemove)) return;
+    this.set($A(this).without(classNameToRemove).join(' '));
+  },
+
+  toString: function() {
+    return $A(this).join(' ');
+  }
+};
+
+Object.extend(Element.ClassNames.prototype, Enumerable);
+var Selector = Class.create();
+Selector.prototype = {
+  initialize: function(expression) {
+    this.params = {classNames: []};
+    this.expression = expression.toString().strip();
+    this.parseExpression();
+    this.compileMatcher();
+  },
+
+  parseExpression: function() {
+    function abort(message) { throw 'Parse error in selector: ' + message; }
+
+    if (this.expression == '')  abort('empty expression');
+
+    var params = this.params, expr = this.expression, match, modifier, clause, rest;
+    while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
+      params.attributes = params.attributes || [];
+      params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
+      expr = match[1];
+    }
+
+    if (expr == '*') return this.params.wildcard = true;
+
+    while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {
+      modifier = match[1], clause = match[2], rest = match[3];
+      switch (modifier) {
+        case '#':       params.id = clause; break;
+        case '.':       params.classNames.push(clause); break;
+        case '':
+        case undefined: params.tagName = clause.toUpperCase(); break;
+        default:        abort(expr.inspect());
+      }
+      expr = rest;
+    }
+
+    if (expr.length > 0) abort(expr.inspect());
+  },
+
+  buildMatchExpression: function() {
+    var params = this.params, conditions = [], clause;
+
+    if (params.wildcard)
+      conditions.push('true');
+    if (clause = params.id)
+      conditions.push('element.readAttribute("id") == ' + clause.inspect());
+    if (clause = params.tagName)
+      conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
+    if ((clause = params.classNames).length > 0)
+      for (var i = 0, length = clause.length; i < length; i++)
+        conditions.push('element.hasClassName(' + clause[i].inspect() + ')');
+    if (clause = params.attributes) {
+      clause.each(function(attribute) {
+        var value = 'element.readAttribute(' + attribute.name.inspect() + ')';
+        var splitValueBy = function(delimiter) {
+          return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
+        }
+
+        switch (attribute.operator) {
+          case '=':       conditions.push(value + ' == ' + attribute.value.inspect()); break;
+          case '~=':      conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;
+          case '|=':      conditions.push(
+                            splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()
+                          ); break;
+          case '!=':      conditions.push(value + ' != ' + attribute.value.inspect()); break;
+          case '':
+          case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break;
+          default:        throw 'Unknown operator ' + attribute.operator + ' in selector';
+        }
+      });
+    }
+
+    return conditions.join(' && ');
+  },
+
+  compileMatcher: function() {
+    this.match = new Function('element', 'if (!element.tagName) return false; \
+      element = $(element); \
+      return ' + this.buildMatchExpression());
+  },
+
+  findElements: function(scope) {
+    var element;
+
+    if (element = $(this.params.id))
+      if (this.match(element))
+        if (!scope || Element.childOf(element, scope))
+          return [element];
+
+    scope = (scope || document).getElementsByTagName(this.params.tagName || '*');
+
+    var results = [];
+    for (var i = 0, length = scope.length; i < length; i++)
+      if (this.match(element = scope[i]))
+        results.push(Element.extend(element));
+
+    return results;
+  },
+
+  toString: function() {
+    return this.expression;
+  }
+}
+
+Object.extend(Selector, {
+  matchElements: function(elements, expression) {
+    var selector = new Selector(expression);
+    return elements.select(selector.match.bind(selector)).map(Element.extend);
+  },
+
+  findElement: function(elements, expression, index) {
+    if (typeof expression == 'number') index = expression, expression = false;
+    return Selector.matchElements(elements, expression || '*')[index || 0];
+  },
+
+  findChildElements: function(element, expressions) {
+    return expressions.map(function(expression) {
+      return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) {
+        var selector = new Selector(expr);
+        return results.inject([], function(elements, result) {
+          return elements.concat(selector.findElements(result || element));
+        });
+      });
+    }).flatten();
+  }
+});
+
+function $$() {
+  return Selector.findChildElements(document, $A(arguments));
+}
+var Form = {
+  reset: function(form) {
+    $(form).reset();
+    return form;
+  },
+
+  serializeElements: function(elements, getHash) {
+    var data = elements.inject({}, function(result, element) {
+      if (!element.disabled && element.name) {
+        var key = element.name, value = $(element).getValue();
+        if (value != undefined) {
+          if (result[key]) {
+            if (result[key].constructor != Array) result[key] = [result[key]];
+            result[key].push(value);
+          }
+          else result[key] = value;
+        }
+      }
+      return result;
+    });
+
+    return getHash ? data : Hash.toQueryString(data);
+  }
+};
+
+Form.Methods = {
+  serialize: function(form, getHash) {
+    return Form.serializeElements(Form.getElements(form), getHash);
+  },
+
+  getElements: function(form) {
+    return $A($(form).getElementsByTagName('*')).inject([],
+      function(elements, child) {
+        if (Form.Element.Serializers[child.tagName.toLowerCase()])
+          elements.push(Element.extend(child));
+        return elements;
+      }
+    );
+  },
+
+  getInputs: function(form, typeName, name) {
+    form = $(form);
+    var inputs = form.getElementsByTagName('input');
+
+    if (!typeName && !name) return $A(inputs).map(Element.extend);
+
+    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
+      var input = inputs[i];
+      if ((typeName && input.type != typeName) || (name && input.name != name))
+        continue;
+      matchingInputs.push(Element.extend(input));
+    }
+
+    return matchingInputs;
+  },
+
+  disable: function(form) {
+    form = $(form);
+    form.getElements().each(function(element) {
+      element.blur();
+      element.disabled = 'true';
+    });
+    return form;
+  },
+
+  enable: function(form) {
+    form = $(form);
+    form.getElements().each(function(element) {
+      element.disabled = '';
+    });
+    return form;
+  },
+
+  findFirstElement: function(form) {
+    return $(form).getElements().find(function(element) {
+      return element.type != 'hidden' && !element.disabled &&
+        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
+    });
+  },
+
+  focusFirstElement: function(form) {
+    form = $(form);
+    form.findFirstElement().activate();
+    return form;
+  }
+}
+
+Object.extend(Form, Form.Methods);
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element = {
+  focus: function(element) {
+    $(element).focus();
+    return element;
+  },
+
+  select: function(element) {
+    $(element).select();
+    return element;
+  }
+}
+
+Form.Element.Methods = {
+  serialize: function(element) {
+    element = $(element);
+    if (!element.disabled && element.name) {
+      var value = element.getValue();
+      if (value != undefined) {
+        var pair = {};
+        pair[element.name] = value;
+        return Hash.toQueryString(pair);
+      }
+    }
+    return '';
+  },
+
+  getValue: function(element) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    return Form.Element.Serializers[method](element);
+  },
+
+  clear: function(element) {
+    $(element).value = '';
+    return element;
+  },
+
+  present: function(element) {
+    return $(element).value != '';
+  },
+
+  activate: function(element) {
+    element = $(element);
+    element.focus();
+    if (element.select && ( element.tagName.toLowerCase() != 'input' ||
+      !['button', 'reset', 'submit'].include(element.type) ) )
+      element.select();
+    return element;
+  },
+
+  disable: function(element) {
+    element = $(element);
+    element.disabled = true;
+    return element;
+  },
+
+  enable: function(element) {
+    element = $(element);
+    element.blur();
+    element.disabled = false;
+    return element;
+  }
+}
+
+Object.extend(Form.Element, Form.Element.Methods);
+var Field = Form.Element;
+var $F = Form.Element.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element.Serializers = {
+  input: function(element) {
+    switch (element.type.toLowerCase()) {
+      case 'checkbox':
+      case 'radio':
+        return Form.Element.Serializers.inputSelector(element);
+      default:
+        return Form.Element.Serializers.textarea(element);
+    }
+  },
+
+  inputSelector: function(element) {
+    return element.checked ? element.value : null;
+  },
+
+  textarea: function(element) {
+    return element.value;
+  },
+
+  select: function(element) {
+    return this[element.type == 'select-one' ?
+      'selectOne' : 'selectMany'](element);
+  },
+
+  selectOne: function(element) {
+    var index = element.selectedIndex;
+    return index >= 0 ? this.optionValue(element.options[index]) : null;
+  },
+
+  selectMany: function(element) {
+    var values, length = element.length;
+    if (!length) return null;
+
+    for (var i = 0, values = []; i < length; i++) {
+      var opt = element.options[i];
+      if (opt.selected) values.push(this.optionValue(opt));
+    }
+    return values;
+  },
+
+  optionValue: function(opt) {
+    // extend element because hasAttribute may not be native
+    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.TimedObserver = function() {}
+Abstract.TimedObserver.prototype = {
+  initialize: function(element, frequency, callback) {
+    this.frequency = frequency;
+    this.element   = $(element);
+    this.callback  = callback;
+
+    this.lastValue = this.getValue();
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    var value = this.getValue();
+    var changed = ('string' == typeof this.lastValue && 'string' == typeof value
+      ? this.lastValue != value : String(this.lastValue) != String(value));
+    if (changed) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  }
+}
+
+Form.Element.Observer = Class.create();
+Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.Observer = Class.create();
+Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = function() {}
+Abstract.EventObserver.prototype = {
+  initialize: function(element, callback) {
+    this.element  = $(element);
+    this.callback = callback;
+
+    this.lastValue = this.getValue();
+    if (this.element.tagName.toLowerCase() == 'form')
+      this.registerFormCallbacks();
+    else
+      this.registerCallback(this.element);
+  },
+
+  onElementEvent: function() {
+    var value = this.getValue();
+    if (this.lastValue != value) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  },
+
+  registerFormCallbacks: function() {
+    Form.getElements(this.element).each(this.registerCallback.bind(this));
+  },
+
+  registerCallback: function(element) {
+    if (element.type) {
+      switch (element.type.toLowerCase()) {
+        case 'checkbox':
+        case 'radio':
+          Event.observe(element, 'click', this.onElementEvent.bind(this));
+          break;
+        default:
+          Event.observe(element, 'change', this.onElementEvent.bind(this));
+          break;
+      }
+    }
+  }
+}
+
+Form.Element.EventObserver = Class.create();
+Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.EventObserver = Class.create();
+Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+if (!window.Event) {
+  var Event = new Object();
+}
+
+Object.extend(Event, {
+  KEY_BACKSPACE: 8,
+  KEY_TAB:       9,
+  KEY_RETURN:   13,
+  KEY_ESC:      27,
+  KEY_LEFT:     37,
+  KEY_UP:       38,
+  KEY_RIGHT:    39,
+  KEY_DOWN:     40,
+  KEY_DELETE:   46,
+  KEY_HOME:     36,
+  KEY_END:      35,
+  KEY_PAGEUP:   33,
+  KEY_PAGEDOWN: 34,
+
+  element: function(event) {
+    return event.target || event.srcElement;
+  },
+
+  isLeftClick: function(event) {
+    return (((event.which) && (event.which == 1)) ||
+            ((event.button) && (event.button == 1)));
+  },
+
+  pointerX: function(event) {
+    return event.pageX || (event.clientX +
+      (document.documentElement.scrollLeft || document.body.scrollLeft));
+  },
+
+  pointerY: function(event) {
+    return event.pageY || (event.clientY +
+      (document.documentElement.scrollTop || document.body.scrollTop));
+  },
+
+  stop: function(event) {
+    if (event.preventDefault) {
+      event.preventDefault();
+      event.stopPropagation();
+    } else {
+      event.returnValue = false;
+      event.cancelBubble = true;
+    }
+  },
+
+  // find the first node with the given tagName, starting from the
+  // node the event was triggered on; traverses the DOM upwards
+  findElement: function(event, tagName) {
+    var element = Event.element(event);
+    while (element.parentNode && (!element.tagName ||
+        (element.tagName.toUpperCase() != tagName.toUpperCase())))
+      element = element.parentNode;
+    return element;
+  },
+
+  observers: false,
+
+  _observeAndCache: function(element, name, observer, useCapture) {
+    if (!this.observers) this.observers = [];
+    if (element.addEventListener) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.addEventListener(name, observer, useCapture);
+    } else if (element.attachEvent) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.attachEvent('on' + name, observer);
+    }
+  },
+
+  unloadCache: function() {
+    if (!Event.observers) return;
+    for (var i = 0, length = Event.observers.length; i < length; i++) {
+      Event.stopObserving.apply(this, Event.observers[i]);
+      Event.observers[i][0] = null;
+    }
+    Event.observers = false;
+  },
+
+  observe: function(element, name, observer, useCapture) {
+    element = $(element);
+    useCapture = useCapture || false;
+
+    if (name == 'keypress' &&
+        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
+        || element.attachEvent))
+      name = 'keydown';
+
+    Event._observeAndCache(element, name, observer, useCapture);
+  },
+
+  stopObserving: function(element, name, observer, useCapture) {
+    element = $(element);
+    useCapture = useCapture || false;
+
+    if (name == 'keypress' &&
+        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
+        || element.detachEvent))
+      name = 'keydown';
+
+    if (element.removeEventListener) {
+      element.removeEventListener(name, observer, useCapture);
+    } else if (element.detachEvent) {
+      try {
+        element.detachEvent('on' + name, observer);
+      } catch (e) {}
+    }
+  }
+});
+
+/* prevent memory leaks in IE */
+if (navigator.appVersion.match(/\bMSIE\b/))
+  Event.observe(window, 'unload', Event.unloadCache, false);
+var Position = {
+  // set to true if needed, warning: firefox performance problems
+  // NOT neeeded for page scrolling, only if draggable contained in
+  // scrollable elements
+  includeScrollOffsets: false,
+
+  // must be called before calling withinIncludingScrolloffset, every time the
+  // page is scrolled
+  prepare: function() {
+    this.deltaX =  window.pageXOffset
+                || document.documentElement.scrollLeft
+                || document.body.scrollLeft
+                || 0;
+    this.deltaY =  window.pageYOffset
+                || document.documentElement.scrollTop
+                || document.body.scrollTop
+                || 0;
+  },
+
+  realOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.scrollTop  || 0;
+      valueL += element.scrollLeft || 0;
+      element = element.parentNode;
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  cumulativeOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  positionedOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+      if (element) {
+        if(element.tagName=='BODY') break;
+        var p = Element.getStyle(element, 'position');
+        if (p == 'relative' || p == 'absolute') break;
+      }
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  offsetParent: function(element) {
+    if (element.offsetParent) return element.offsetParent;
+    if (element == document.body) return element;
+
+    while ((element = element.parentNode) && element != document.body)
+      if (Element.getStyle(element, 'position') != 'static')
+        return element;
+
+    return document.body;
+  },
+
+  // caches x/y coordinate pair to use with overlap
+  within: function(element, x, y) {
+    if (this.includeScrollOffsets)
+      return this.withinIncludingScrolloffsets(element, x, y);
+    this.xcomp = x;
+    this.ycomp = y;
+    this.offset = this.cumulativeOffset(element);
+
+    return (y >= this.offset[1] &&
+            y <  this.offset[1] + element.offsetHeight &&
+            x >= this.offset[0] &&
+            x <  this.offset[0] + element.offsetWidth);
+  },
+
+  withinIncludingScrolloffsets: function(element, x, y) {
+    var offsetcache = this.realOffset(element);
+
+    this.xcomp = x + offsetcache[0] - this.deltaX;
+    this.ycomp = y + offsetcache[1] - this.deltaY;
+    this.offset = this.cumulativeOffset(element);
+
+    return (this.ycomp >= this.offset[1] &&
+            this.ycomp <  this.offset[1] + element.offsetHeight &&
+            this.xcomp >= this.offset[0] &&
+            this.xcomp <  this.offset[0] + element.offsetWidth);
+  },
+
+  // within must be called directly before
+  overlap: function(mode, element) {
+    if (!mode) return 0;
+    if (mode == 'vertical')
+      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
+        element.offsetHeight;
+    if (mode == 'horizontal')
+      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
+        element.offsetWidth;
+  },
+
+  page: function(forElement) {
+    var valueT = 0, valueL = 0;
+
+    var element = forElement;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+
+      // Safari fix
+      if (element.offsetParent==document.body)
+        if (Element.getStyle(element,'position')=='absolute') break;
+
+    } while (element = element.offsetParent);
+
+    element = forElement;
+    do {
+      if (!window.opera || element.tagName=='BODY') {
+        valueT -= element.scrollTop  || 0;
+        valueL -= element.scrollLeft || 0;
+      }
+    } while (element = element.parentNode);
+
+    return [valueL, valueT];
+  },
+
+  clone: function(source, target) {
+    var options = Object.extend({
+      setLeft:    true,
+      setTop:     true,
+      setWidth:   true,
+      setHeight:  true,
+      offsetTop:  0,
+      offsetLeft: 0
+    }, arguments[2] || {})
+
+    // find page position of source
+    source = $(source);
+    var p = Position.page(source);
+
+    // find coordinate system to use
+    target = $(target);
+    var delta = [0, 0];
+    var parent = null;
+    // delta [0,0] will do fine with position: fixed elements,
+    // position:absolute needs offsetParent deltas
+    if (Element.getStyle(target,'position') == 'absolute') {
+      parent = Position.offsetParent(target);
+      delta = Position.page(parent);
+    }
+
+    // correct by body offsets (fixes Safari)
+    if (parent == document.body) {
+      delta[0] -= document.body.offsetLeft;
+      delta[1] -= document.body.offsetTop;
+    }
+
+    // set position
+    if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
+    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
+    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
+    if(options.setHeight) target.style.height = source.offsetHeight + 'px';
+  },
+
+  absolutize: function(element) {
+    element = $(element);
+    if (element.style.position == 'absolute') return;
+    Position.prepare();
+
+    var offsets = Position.positionedOffset(element);
+    var top     = offsets[1];
+    var left    = offsets[0];
+    var width   = element.clientWidth;
+    var height  = element.clientHeight;
+
+    element._originalLeft   = left - parseFloat(element.style.left  || 0);
+    element._originalTop    = top  - parseFloat(element.style.top || 0);
+    element._originalWidth  = element.style.width;
+    element._originalHeight = element.style.height;
+
+    element.style.position = 'absolute';
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.width  = width + 'px';
+    element.style.height = height + 'px';
+  },
+
+  relativize: function(element) {
+    element = $(element);
+    if (element.style.position == 'relative') return;
+    Position.prepare();
+
+    element.style.position = 'relative';
+    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
+    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
+
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.height = element._originalHeight;
+    element.style.width  = element._originalWidth;
+  }
+}
+
+// Safari returns margins on body which is incorrect if the child is absolutely
+// positioned.  For performance reasons, redefine Position.cumulativeOffset for
+// KHTML/WebKit only.
+if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
+  Position.cumulativeOffset = function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      if (element.offsetParent == document.body)
+        if (Element.getStyle(element, 'position') == 'absolute') break;
+
+      element = element.offsetParent;
+    } while (element);
+
+    return [valueL, valueT];
+  }
+}
+
+Element.addMethods();
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/scriptaculous.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/scriptaculous.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/scriptaculous.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,51 @@
+// script.aculo.us scriptaculous.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+
+// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// 
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+var Scriptaculous = {
+  Version: '1.7.0',
+  require: function(libraryName) {
+    // inserting via DOM fails in Safari 2.0, so brute force approach
+    document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
+  },
+  load: function() {
+    if((typeof Prototype=='undefined') || 
+       (typeof Element == 'undefined') || 
+       (typeof Element.Methods=='undefined') ||
+       parseFloat(Prototype.Version.split(".")[0] + "." +
+                  Prototype.Version.split(".")[1]) < 1.5)
+       throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");
+    
+    $A(document.getElementsByTagName("script")).findAll( function(s) {
+      return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
+    }).each( function(s) {
+      var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
+      var includes = s.src.match(/\?.*load=([a-z,]*)/);
+      (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each(
+       function(include) { Scriptaculous.require(path+include+'.js') });
+    });
+  }
+}
+
+Scriptaculous.load();
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/slider.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/slider.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/slider.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,278 @@
+// script.aculo.us slider.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+
+// Copyright (c) 2005, 2006 Marty Haught, Thomas Fuchs 
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+if(!Control) var Control = {};
+Control.Slider = Class.create();
+
+// options:
+//  axis: 'vertical', or 'horizontal' (default)
+//
+// callbacks:
+//  onChange(value)
+//  onSlide(value)
+Control.Slider.prototype = {
+  initialize: function(handle, track, options) {
+    var slider = this;
+    
+    if(handle instanceof Array) {
+      this.handles = handle.collect( function(e) { return $(e) });
+    } else {
+      this.handles = [$(handle)];
+    }
+    
+    this.track   = $(track);
+    this.options = options || {};
+
+    this.axis      = this.options.axis || 'horizontal';
+    this.increment = this.options.increment || 1;
+    this.step      = parseInt(this.options.step || '1');
+    this.range     = this.options.range || $R(0,1);
+    
+    this.value     = 0; // assure backwards compat
+    this.values    = this.handles.map( function() { return 0 });
+    this.spans     = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
+    this.options.startSpan = $(this.options.startSpan || null);
+    this.options.endSpan   = $(this.options.endSpan || null);
+
+    this.restricted = this.options.restricted || false;
+
+    this.maximum   = this.options.maximum || this.range.end;
+    this.minimum   = this.options.minimum || this.range.start;
+
+    // Will be used to align the handle onto the track, if necessary
+    this.alignX = parseInt(this.options.alignX || '0');
+    this.alignY = parseInt(this.options.alignY || '0');
+    
+    this.trackLength = this.maximumOffset() - this.minimumOffset();
+
+    this.handleLength = this.isVertical() ? 
+      (this.handles[0].offsetHeight != 0 ? 
+        this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) : 
+      (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth : 
+        this.handles[0].style.width.replace(/px$/,""));
+
+    this.active   = false;
+    this.dragging = false;
+    this.disabled = false;
+
+    if(this.options.disabled) this.setDisabled();
+
+    // Allowed values array
+    this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
+    if(this.allowedValues) {
+      this.minimum = this.allowedValues.min();
+      this.maximum = this.allowedValues.max();
+    }
+
+    this.eventMouseDown = this.startDrag.bindAsEventListener(this);
+    this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
+    this.eventMouseMove = this.update.bindAsEventListener(this);
+
+    // Initialize handles in reverse (make sure first handle is active)
+    this.handles.each( function(h,i) {
+      i = slider.handles.length-1-i;
+      slider.setValue(parseFloat(
+        (slider.options.sliderValue instanceof Array ? 
+          slider.options.sliderValue[i] : slider.options.sliderValue) || 
+         slider.range.start), i);
+      Element.makePositioned(h); // fix IE
+      Event.observe(h, "mousedown", slider.eventMouseDown);
+    });
+    
+    Event.observe(this.track, "mousedown", this.eventMouseDown);
+    Event.observe(document, "mouseup", this.eventMouseUp);
+    Event.observe(document, "mousemove", this.eventMouseMove);
+    
+    this.initialized = true;
+  },
+  dispose: function() {
+    var slider = this;    
+    Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
+    Event.stopObserving(document, "mouseup", this.eventMouseUp);
+    Event.stopObserving(document, "mousemove", this.eventMouseMove);
+    this.handles.each( function(h) {
+      Event.stopObserving(h, "mousedown", slider.eventMouseDown);
+    });
+  },
+  setDisabled: function(){
+    this.disabled = true;
+  },
+  setEnabled: function(){
+    this.disabled = false;
+  },  
+  getNearestValue: function(value){
+    if(this.allowedValues){
+      if(value >= this.allowedValues.max()) return(this.allowedValues.max());
+      if(value <= this.allowedValues.min()) return(this.allowedValues.min());
+      
+      var offset = Math.abs(this.allowedValues[0] - value);
+      var newValue = this.allowedValues[0];
+      this.allowedValues.each( function(v) {
+        var currentOffset = Math.abs(v - value);
+        if(currentOffset <= offset){
+          newValue = v;
+          offset = currentOffset;
+        } 
+      });
+      return newValue;
+    }
+    if(value > this.range.end) return this.range.end;
+    if(value < this.range.start) return this.range.start;
+    return value;
+  },
+  setValue: function(sliderValue, handleIdx){
+    if(!this.active) {
+      this.activeHandleIdx = handleIdx || 0;
+      this.activeHandle    = this.handles[this.activeHandleIdx];
+      this.updateStyles();
+    }
+    handleIdx = handleIdx || this.activeHandleIdx || 0;
+    if(this.initialized && this.restricted) {
+      if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
+        sliderValue = this.values[handleIdx-1];
+      if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
+        sliderValue = this.values[handleIdx+1];
+    }
+    sliderValue = this.getNearestValue(sliderValue);
+    this.values[handleIdx] = sliderValue;
+    this.value = this.values[0]; // assure backwards compat
+    
+    this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] = 
+      this.translateToPx(sliderValue);
+    
+    this.drawSpans();
+    if(!this.dragging || !this.event) this.updateFinished();
+  },
+  setValueBy: function(delta, handleIdx) {
+    this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, 
+      handleIdx || this.activeHandleIdx || 0);
+  },
+  translateToPx: function(value) {
+    return Math.round(
+      ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * 
+      (value - this.range.start)) + "px";
+  },
+  translateToValue: function(offset) {
+    return ((offset/(this.trackLength-this.handleLength) * 
+      (this.range.end-this.range.start)) + this.range.start);
+  },
+  getRange: function(range) {
+    var v = this.values.sortBy(Prototype.K); 
+    range = range || 0;
+    return $R(v[range],v[range+1]);
+  },
+  minimumOffset: function(){
+    return(this.isVertical() ? this.alignY : this.alignX);
+  },
+  maximumOffset: function(){
+    return(this.isVertical() ? 
+      (this.track.offsetHeight != 0 ? this.track.offsetHeight :
+        this.track.style.height.replace(/px$/,"")) - this.alignY : 
+      (this.track.offsetWidth != 0 ? this.track.offsetWidth : 
+        this.track.style.width.replace(/px$/,"")) - this.alignY);
+  },  
+  isVertical:  function(){
+    return (this.axis == 'vertical');
+  },
+  drawSpans: function() {
+    var slider = this;
+    if(this.spans)
+      $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
+    if(this.options.startSpan)
+      this.setSpan(this.options.startSpan,
+        $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
+    if(this.options.endSpan)
+      this.setSpan(this.options.endSpan, 
+        $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
+  },
+  setSpan: function(span, range) {
+    if(this.isVertical()) {
+      span.style.top = this.translateToPx(range.start);
+      span.style.height = this.translateToPx(range.end - range.start + this.range.start);
+    } else {
+      span.style.left = this.translateToPx(range.start);
+      span.style.width = this.translateToPx(range.end - range.start + this.range.start);
+    }
+  },
+  updateStyles: function() {
+    this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
+    Element.addClassName(this.activeHandle, 'selected');
+  },
+  startDrag: function(event) {
+    if(Event.isLeftClick(event)) {
+      if(!this.disabled){
+        this.active = true;
+        
+        var handle = Event.element(event);
+        var pointer  = [Event.pointerX(event), Event.pointerY(event)];
+        var track = handle;
+        if(track==this.track) {
+          var offsets  = Position.cumulativeOffset(this.track); 
+          this.event = event;
+          this.setValue(this.translateToValue( 
+           (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
+          ));
+          var offsets  = Position.cumulativeOffset(this.activeHandle);
+          this.offsetX = (pointer[0] - offsets[0]);
+          this.offsetY = (pointer[1] - offsets[1]);
+        } else {
+          // find the handle (prevents issues with Safari)
+          while((this.handles.indexOf(handle) == -1) && handle.parentNode) 
+            handle = handle.parentNode;
+            
+          if(this.handles.indexOf(handle)!=-1) {
+            this.activeHandle    = handle;
+            this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
+            this.updateStyles();
+            
+            var offsets  = Position.cumulativeOffset(this.activeHandle);
+            this.offsetX = (pointer[0] - offsets[0]);
+            this.offsetY = (pointer[1] - offsets[1]);
+          }
+        }
+      }
+      Event.stop(event);
+    }
+  },
+  update: function(event) {
+   if(this.active) {
+      if(!this.dragging) this.dragging = true;
+      this.draw(event);
+      // fix AppleWebKit rendering
+      if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+      Event.stop(event);
+   }
+  },
+  draw: function(event) {
+    var pointer = [Event.pointerX(event), Event.pointerY(event)];
+    var offsets = Position.cumulativeOffset(this.track);
+    pointer[0] -= this.offsetX + offsets[0];
+    pointer[1] -= this.offsetY + offsets[1];
+    this.event = event;
+    this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
+    if(this.initialized && this.options.onSlide)
+      this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
+  },
+  endDrag: function(event) {
+    if(this.active && this.dragging) {
+      this.finishDrag(event, true);
+      Event.stop(event);
+    }
+    this.active = false;
+    this.dragging = false;
+  },  
+  finishDrag: function(event, success) {
+    this.active = false;
+    this.dragging = false;
+    this.updateFinished();
+  },
+  updateFinished: function() {
+    if(this.initialized && this.options.onChange) 
+      this.options.onChange(this.values.length>1 ? this.values : this.value, this);
+    this.event = null;
+  }
+}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/unittest.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/unittest.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/prototype/js/unittest.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,564 @@
+// script.aculo.us unittest.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+
+// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com)
+//           (c) 2005, 2006 Michael Schuerig (http://www.schuerig.de/michael/)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+// experimental, Firefox-only
+Event.simulateMouse = function(element, eventName) {
+  var options = Object.extend({
+    pointerX: 0,
+    pointerY: 0,
+    buttons:  0,
+    ctrlKey:  false,
+    altKey:   false,
+    shiftKey: false,
+    metaKey:  false
+  }, arguments[2] || {});
+  var oEvent = document.createEvent("MouseEvents");
+  oEvent.initMouseEvent(eventName, true, true, document.defaultView, 
+    options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY, 
+    options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, $(element));
+  
+  if(this.mark) Element.remove(this.mark);
+  this.mark = document.createElement('div');
+  this.mark.appendChild(document.createTextNode(" "));
+  document.body.appendChild(this.mark);
+  this.mark.style.position = 'absolute';
+  this.mark.style.top = options.pointerY + "px";
+  this.mark.style.left = options.pointerX + "px";
+  this.mark.style.width = "5px";
+  this.mark.style.height = "5px;";
+  this.mark.style.borderTop = "1px solid red;"
+  this.mark.style.borderLeft = "1px solid red;"
+  
+  if(this.step)
+    alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));
+  
+  $(element).dispatchEvent(oEvent);
+};
+
+// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2.
+// You need to downgrade to 1.0.4 for now to get this working
+// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much
+Event.simulateKey = function(element, eventName) {
+  var options = Object.extend({
+    ctrlKey: false,
+    altKey: false,
+    shiftKey: false,
+    metaKey: false,
+    keyCode: 0,
+    charCode: 0
+  }, arguments[2] || {});
+
+  var oEvent = document.createEvent("KeyEvents");
+  oEvent.initKeyEvent(eventName, true, true, window, 
+    options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
+    options.keyCode, options.charCode );
+  $(element).dispatchEvent(oEvent);
+};
+
+Event.simulateKeys = function(element, command) {
+  for(var i=0; i<command.length; i++) {
+    Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)});
+  }
+};
+
+var Test = {}
+Test.Unit = {};
+
+// security exception workaround
+Test.Unit.inspect = Object.inspect;
+
+Test.Unit.Logger = Class.create();
+Test.Unit.Logger.prototype = {
+  initialize: function(log) {
+    this.log = $(log);
+    if (this.log) {
+      this._createLogTable();
+    }
+  },
+  start: function(testName) {
+    if (!this.log) return;
+    this.testName = testName;
+    this.lastLogLine = document.createElement('tr');
+    this.statusCell = document.createElement('td');
+    this.nameCell = document.createElement('td');
+    this.nameCell.className = "nameCell";
+    this.nameCell.appendChild(document.createTextNode(testName));
+    this.messageCell = document.createElement('td');
+    this.lastLogLine.appendChild(this.statusCell);
+    this.lastLogLine.appendChild(this.nameCell);
+    this.lastLogLine.appendChild(this.messageCell);
+    this.loglines.appendChild(this.lastLogLine);
+  },
+  finish: function(status, summary) {
+    if (!this.log) return;
+    this.lastLogLine.className = status;
+    this.statusCell.innerHTML = status;
+    this.messageCell.innerHTML = this._toHTML(summary);
+    this.addLinksToResults();
+  },
+  message: function(message) {
+    if (!this.log) return;
+    this.messageCell.innerHTML = this._toHTML(message);
+  },
+  summary: function(summary) {
+    if (!this.log) return;
+    this.logsummary.innerHTML = this._toHTML(summary);
+  },
+  _createLogTable: function() {
+    this.log.innerHTML =
+    '<div id="logsummary"></div>' +
+    '<table id="logtable">' +
+    '<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' +
+    '<tbody id="loglines"></tbody>' +
+    '</table>';
+    this.logsummary = $('logsummary')
+    this.loglines = $('loglines');
+  },
+  _toHTML: function(txt) {
+    return txt.escapeHTML().replace(/\n/g,"<br/>");
+  },
+  addLinksToResults: function(){ 
+    $$("tr.failed .nameCell").each( function(td){ // todo: limit to children of this.log
+      td.title = "Run only this test"
+      Event.observe(td, 'click', function(){ window.location.search = "?tests=" + td.innerHTML;});
+    });
+    $$("tr.passed .nameCell").each( function(td){ // todo: limit to children of this.log
+      td.title = "Run all tests"
+      Event.observe(td, 'click', function(){ window.location.search = "";});
+    });
+  }
+}
+
+Test.Unit.Runner = Class.create();
+Test.Unit.Runner.prototype = {
+  initialize: function(testcases) {
+    this.options = Object.extend({
+      testLog: 'testlog'
+    }, arguments[1] || {});
+    this.options.resultsURL = this.parseResultsURLQueryParameter();
+    this.options.tests      = this.parseTestsQueryParameter();
+    if (this.options.testLog) {
+      this.options.testLog = $(this.options.testLog) || null;
+    }
+    if(this.options.tests) {
+      this.tests = [];
+      for(var i = 0; i < this.options.tests.length; i++) {
+        if(/^test/.test(this.options.tests[i])) {
+          this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"]));
+        }
+      }
+    } else {
+      if (this.options.test) {
+        this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])];
+      } else {
+        this.tests = [];
+        for(var testcase in testcases) {
+          if(/^test/.test(testcase)) {
+            this.tests.push(
+               new Test.Unit.Testcase(
+                 this.options.context ? ' -> ' + this.options.titles[testcase] : testcase, 
+                 testcases[testcase], testcases["setup"], testcases["teardown"]
+               ));
+          }
+        }
+      }
+    }
+    this.currentTest = 0;
+    this.logger = new Test.Unit.Logger(this.options.testLog);
+    setTimeout(this.runTests.bind(this), 1000);
+  },
+  parseResultsURLQueryParameter: function() {
+    return window.location.search.parseQuery()["resultsURL"];
+  },
+  parseTestsQueryParameter: function(){
+    if (window.location.search.parseQuery()["tests"]){
+        return window.location.search.parseQuery()["tests"].split(',');
+    };
+  },
+  // Returns:
+  //  "ERROR" if there was an error,
+  //  "FAILURE" if there was a failure, or
+  //  "SUCCESS" if there was neither
+  getResult: function() {
+    var hasFailure = false;
+    for(var i=0;i<this.tests.length;i++) {
+      if (this.tests[i].errors > 0) {
+        return "ERROR";
+      }
+      if (this.tests[i].failures > 0) {
+        hasFailure = true;
+      }
+    }
+    if (hasFailure) {
+      return "FAILURE";
+    } else {
+      return "SUCCESS";
+    }
+  },
+  postResults: function() {
+    if (this.options.resultsURL) {
+      new Ajax.Request(this.options.resultsURL, 
+        { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false });
+    }
+  },
+  runTests: function() {
+    var test = this.tests[this.currentTest];
+    if (!test) {
+      // finished!
+      this.postResults();
+      this.logger.summary(this.summary());
+      return;
+    }
+    if(!test.isWaiting) {
+      this.logger.start(test.name);
+    }
+    test.run();
+    if(test.isWaiting) {
+      this.logger.message("Waiting for " + test.timeToWait + "ms");
+      setTimeout(this.runTests.bind(this), test.timeToWait || 1000);
+    } else {
+      this.logger.finish(test.status(), test.summary());
+      this.currentTest++;
+      // tail recursive, hopefully the browser will skip the stackframe
+      this.runTests();
+    }
+  },
+  summary: function() {
+    var assertions = 0;
+    var failures = 0;
+    var errors = 0;
+    var messages = [];
+    for(var i=0;i<this.tests.length;i++) {
+      assertions +=   this.tests[i].assertions;
+      failures   +=   this.tests[i].failures;
+      errors     +=   this.tests[i].errors;
+    }
+    return (
+      (this.options.context ? this.options.context + ': ': '') + 
+      this.tests.length + " tests, " + 
+      assertions + " assertions, " + 
+      failures   + " failures, " +
+      errors     + " errors");
+  }
+}
+
+Test.Unit.Assertions = Class.create();
+Test.Unit.Assertions.prototype = {
+  initialize: function() {
+    this.assertions = 0;
+    this.failures   = 0;
+    this.errors     = 0;
+    this.messages   = [];
+  },
+  summary: function() {
+    return (
+      this.assertions + " assertions, " + 
+      this.failures   + " failures, " +
+      this.errors     + " errors" + "\n" +
+      this.messages.join("\n"));
+  },
+  pass: function() {
+    this.assertions++;
+  },
+  fail: function(message) {
+    this.failures++;
+    this.messages.push("Failure: " + message);
+  },
+  info: function(message) {
+    this.messages.push("Info: " + message);
+  },
+  error: function(error) {
+    this.errors++;
+    this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");
+  },
+  status: function() {
+    if (this.failures > 0) return 'failed';
+    if (this.errors > 0) return 'error';
+    return 'passed';
+  },
+  assert: function(expression) {
+    var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"';
+    try { expression ? this.pass() : 
+      this.fail(message); }
+    catch(e) { this.error(e); }
+  },
+  assertEqual: function(expected, actual) {
+    var message = arguments[2] || "assertEqual";
+    try { (expected == actual) ? this.pass() :
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) + 
+        '", actual "' + Test.Unit.inspect(actual) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertInspect: function(expected, actual) {
+    var message = arguments[2] || "assertInspect";
+    try { (expected == actual.inspect()) ? this.pass() :
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) + 
+        '", actual "' + Test.Unit.inspect(actual) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertEnumEqual: function(expected, actual) {
+    var message = arguments[2] || "assertEnumEqual";
+    try { $A(expected).length == $A(actual).length && 
+      expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ?
+        this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) + 
+          ', actual ' + Test.Unit.inspect(actual)); }
+    catch(e) { this.error(e); }
+  },
+  assertNotEqual: function(expected, actual) {
+    var message = arguments[2] || "assertNotEqual";
+    try { (expected != actual) ? this.pass() : 
+      this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertIdentical: function(expected, actual) { 
+    var message = arguments[2] || "assertIdentical"; 
+    try { (expected === actual) ? this.pass() : 
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
+        '", actual "' + Test.Unit.inspect(actual) + '"'); } 
+    catch(e) { this.error(e); } 
+  },
+  assertNotIdentical: function(expected, actual) { 
+    var message = arguments[2] || "assertNotIdentical"; 
+    try { !(expected === actual) ? this.pass() : 
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
+        '", actual "' + Test.Unit.inspect(actual) + '"'); } 
+    catch(e) { this.error(e); } 
+  },
+  assertNull: function(obj) {
+    var message = arguments[1] || 'assertNull'
+    try { (obj==null) ? this.pass() : 
+      this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertMatch: function(expected, actual) {
+    var message = arguments[2] || 'assertMatch';
+    var regex = new RegExp(expected);
+    try { (regex.exec(actual)) ? this.pass() :
+      this.fail(message + ' : regex: "' +  Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertHidden: function(element) {
+    var message = arguments[1] || 'assertHidden';
+    this.assertEqual("none", element.style.display, message);
+  },
+  assertNotNull: function(object) {
+    var message = arguments[1] || 'assertNotNull';
+    this.assert(object != null, message);
+  },
+  assertType: function(expected, actual) {
+    var message = arguments[2] || 'assertType';
+    try { 
+      (actual.constructor == expected) ? this.pass() : 
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
+        '", actual "' + (actual.constructor) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertNotOfType: function(expected, actual) {
+    var message = arguments[2] || 'assertNotOfType';
+    try { 
+      (actual.constructor != expected) ? this.pass() : 
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
+        '", actual "' + (actual.constructor) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertInstanceOf: function(expected, actual) {
+    var message = arguments[2] || 'assertInstanceOf';
+    try { 
+      (actual instanceof expected) ? this.pass() : 
+      this.fail(message + ": object was not an instance of the expected type"); }
+    catch(e) { this.error(e); } 
+  },
+  assertNotInstanceOf: function(expected, actual) {
+    var message = arguments[2] || 'assertNotInstanceOf';
+    try { 
+      !(actual instanceof expected) ? this.pass() : 
+      this.fail(message + ": object was an instance of the not expected type"); }
+    catch(e) { this.error(e); } 
+  },
+  assertRespondsTo: function(method, obj) {
+    var message = arguments[2] || 'assertRespondsTo';
+    try {
+      (obj[method] && typeof obj[method] == 'function') ? this.pass() : 
+      this.fail(message + ": object doesn't respond to [" + method + "]"); }
+    catch(e) { this.error(e); }
+  },
+  assertReturnsTrue: function(method, obj) {
+    var message = arguments[2] || 'assertReturnsTrue';
+    try {
+      var m = obj[method];
+      if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
+      m() ? this.pass() : 
+      this.fail(message + ": method returned false"); }
+    catch(e) { this.error(e); }
+  },
+  assertReturnsFalse: function(method, obj) {
+    var message = arguments[2] || 'assertReturnsFalse';
+    try {
+      var m = obj[method];
+      if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
+      !m() ? this.pass() : 
+      this.fail(message + ": method returned true"); }
+    catch(e) { this.error(e); }
+  },
+  assertRaise: function(exceptionName, method) {
+    var message = arguments[2] || 'assertRaise';
+    try { 
+      method();
+      this.fail(message + ": exception expected but none was raised"); }
+    catch(e) {
+      ((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e); 
+    }
+  },
+  assertElementsMatch: function() {
+    var expressions = $A(arguments), elements = $A(expressions.shift());
+    if (elements.length != expressions.length) {
+      this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions');
+      return false;
+    }
+    elements.zip(expressions).all(function(pair, index) {
+      var element = $(pair.first()), expression = pair.last();
+      if (element.match(expression)) return true;
+      this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect());
+    }.bind(this)) && this.pass();
+  },
+  assertElementMatches: function(element, expression) {
+    this.assertElementsMatch([element], expression);
+  },
+  benchmark: function(operation, iterations) {
+    var startAt = new Date();
+    (iterations || 1).times(operation);
+    var timeTaken = ((new Date())-startAt);
+    this.info((arguments[2] || 'Operation') + ' finished ' + 
+       iterations + ' iterations in ' + (timeTaken/1000)+'s' );
+    return timeTaken;
+  },
+  _isVisible: function(element) {
+    element = $(element);
+    if(!element.parentNode) return true;
+    this.assertNotNull(element);
+    if(element.style && Element.getStyle(element, 'display') == 'none')
+      return false;
+    
+    return this._isVisible(element.parentNode);
+  },
+  assertNotVisible: function(element) {
+    this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1]));
+  },
+  assertVisible: function(element) {
+    this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1]));
+  },
+  benchmark: function(operation, iterations) {
+    var startAt = new Date();
+    (iterations || 1).times(operation);
+    var timeTaken = ((new Date())-startAt);
+    this.info((arguments[2] || 'Operation') + ' finished ' + 
+       iterations + ' iterations in ' + (timeTaken/1000)+'s' );
+    return timeTaken;
+  }
+}
+
+Test.Unit.Testcase = Class.create();
+Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), {
+  initialize: function(name, test, setup, teardown) {
+    Test.Unit.Assertions.prototype.initialize.bind(this)();
+    this.name           = name;
+    
+    if(typeof test == 'string') {
+      test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,');
+      test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)');
+      this.test = function() {
+        eval('with(this){'+test+'}');
+      }
+    } else {
+      this.test = test || function() {};
+    }
+    
+    this.setup          = setup || function() {};
+    this.teardown       = teardown || function() {};
+    this.isWaiting      = false;
+    this.timeToWait     = 1000;
+  },
+  wait: function(time, nextPart) {
+    this.isWaiting = true;
+    this.test = nextPart;
+    this.timeToWait = time;
+  },
+  run: function() {
+    try {
+      try {
+        if (!this.isWaiting) this.setup.bind(this)();
+        this.isWaiting = false;
+        this.test.bind(this)();
+      } finally {
+        if(!this.isWaiting) {
+          this.teardown.bind(this)();
+        }
+      }
+    }
+    catch(e) { this.error(e); }
+  }
+});
+
+// *EXPERIMENTAL* BDD-style testing to please non-technical folk
+// This draws many ideas from RSpec http://rspec.rubyforge.org/
+
+Test.setupBDDExtensionMethods = function(){
+  var METHODMAP = {
+    shouldEqual:     'assertEqual',
+    shouldNotEqual:  'assertNotEqual',
+    shouldEqualEnum: 'assertEnumEqual',
+    shouldBeA:       'assertType',
+    shouldNotBeA:    'assertNotOfType',
+    shouldBeAn:      'assertType',
+    shouldNotBeAn:   'assertNotOfType',
+    shouldBeNull:    'assertNull',
+    shouldNotBeNull: 'assertNotNull',
+    
+    shouldBe:        'assertReturnsTrue',
+    shouldNotBe:     'assertReturnsFalse',
+    shouldRespondTo: 'assertRespondsTo'
+  };
+  Test.BDDMethods = {};
+  for(m in METHODMAP) {
+    Test.BDDMethods[m] = eval(
+      'function(){'+
+      'var args = $A(arguments);'+
+      'var scope = args.shift();'+
+      'scope.'+METHODMAP[m]+'.apply(scope,(args || []).concat([this])); }');
+  }
+  [Array.prototype, String.prototype, Number.prototype].each(
+    function(p){ Object.extend(p, Test.BDDMethods) }
+  );
+}
+
+Test.context = function(name, spec, log){
+  Test.setupBDDExtensionMethods();
+  
+  var compiledSpec = {};
+  var titles = {};
+  for(specName in spec) {
+    switch(specName){
+      case "setup":
+      case "teardown":
+        compiledSpec[specName] = spec[specName];
+        break;
+      default:
+        var testName = 'test'+specName.gsub(/\s+/,'-').camelize();
+        var body = spec[specName].toString().split('\n').slice(1);
+        if(/^\{/.test(body[0])) body = body.slice(1);
+        body.pop();
+        body = body.map(function(statement){ 
+          return statement.strip()
+        });
+        compiledSpec[testName] = body.join('\n');
+        titles[testName] = specName;
+    }
+  }
+  new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name });
+};
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/css/main.css
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/css/main.css	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/css/main.css	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,353 @@
+#sf_admin_container ul, #sf_admin_container ol, #sf_admin_container li, #sf_admin_container h1, #sf_admin_container h2, #sf_admin_container h3, #sf_admin_container h4, #sf_admin_container h5, #sf_admin_container h6, #sf_admin_container pre, #sf_admin_container form, #sf_admin_container body, #sf_admin_container html, #sf_admin_container p, #sf_admin_container blockquote, #sf_admin_container fieldset, #sf_admin_container input { margin: 0; padding: 0; }
+#sf_admin_container a img,:link img,:visited img { border: none; }
+
+#sf_admin_container a:link, #sf_admin_container a:visited
+{
+  text-decoration: none;
+}
+
+#sf_admin_container a:hover
+{
+  text-decoration: underline;
+}
+
+#sf_admin_container td
+{
+  margin: 0;
+  padding: 20px;
+  font-family: Arial, sans-serif;
+  font-size: 11px;
+  background-color: #fff;
+}
+
+#sf_admin_container p
+{
+  margin-bottom: 5px;
+}
+
+#sf_admin_container #sf_admin_bar
+{
+  margin-top: 8px;
+  position: absolute;
+  right: 20px;
+  width: 250px;
+}
+
+#sf_admin_container #sf_admin_content
+{
+  margin-right: 270px;
+}
+
+#sf_admin_container h1
+{
+  margin: 8px 0;
+  padding: 3px;
+  padding-left: 0px;
+  color: #555;
+  font-family: "Trebuchet MS", Arial, Verdana, sans-serif;
+  font-size: 25px;
+}
+
+#sf_admin_container fieldset h2
+{
+  padding: 3px;
+  color: #333;
+  background-color: #ccf;
+  font-size: 11px;
+}
+
+#sf_admin_container input, #sf_admin_container textarea, #sf_admin_container select
+{
+  padding: 3px;
+  font-family: Arial, sans-serif;
+  font-size: 11px;
+  border: 1px solid #ddd;
+  vertical-align:middle;
+}
+
+#sf_admin_container label
+{
+  display: block;
+  padding: 0 1em 3px 0;
+  float: left;
+  text-align: left;
+  width: 8em;
+  color: #666;
+  font-weight: normal !important;
+}
+
+#sf_admin_container label.required
+{
+  color: #333 !important;
+  font-weight: bold !important;
+}
+
+#sf_admin_container .sf_admin_filters input[type="checkbox"] + label
+{
+  display: inline;
+  float: none;
+}
+
+#sf_admin_container .save-ok
+{
+  margin-bottom: 10px;
+  border: 1px solid #73B65A;
+}
+
+#sf_admin_container .save-ok h2
+{
+  margin: 0 !important;
+  padding: 5px 20px 5px 25px;
+  font-size: 11px;
+  color: #fff;
+  background: #73B65A url(/sf/sf_admin/images/ok.png) no-repeat 5px 2px;
+}
+
+#sf_admin_container .form-row
+{
+  clear: both;
+  padding: 10px;
+  border-bottom: 1px solid #ddd;
+}
+
+#sf_admin_container .form-row .content
+{
+  padding-left: 9em;
+}
+
+#sf_admin_container .form-errors
+{
+  margin-bottom: 10px;
+  border: 1px solid #f33;
+  background-color: #ffc;
+}
+
+#sf_admin_container .form-errors h2
+{
+  padding: 5px 20px 5px 25px;
+  font-size: 11px;
+  color: #fff;
+  background: #f33 url(/sf/sf_admin/images/error.png) no-repeat 5px 2px;
+}
+
+#sf_admin_container .form-errors dl
+{
+  padding: 5px;
+}
+
+#sf_admin_container .form-errors dt
+{
+  font-weight: bold;
+  float: left;
+  padding-right: 5px;
+}
+
+#sf_admin_container .form-errors dd
+{
+  margin: 0;
+}
+
+#sf_admin_container .form-error
+{
+  color: #f33;
+}
+
+#sf_admin_container .form-error input, #sf_admin_container .form-error select, #sf_admin_container .form-error textarea
+{
+  border: 1px solid #f33;
+}
+
+#sf_admin_container fieldset
+{
+  margin-bottom: 3px;
+  border: 1px solid #ddd;
+  border-bottom: 0px;
+  background-color: #fff;
+}
+
+#sf_admin_container fieldset.collapsed * { display:none; }
+#sf_admin_container fieldset.collapsed h2, #sf_admin_container fieldset.collapsed { display:block !important; }
+#sf_admin_container fieldset.collapsed .collapse-toggle { display: inline !important; }
+#sf_admin_container fieldset.collapse h2 a.collapse-toggle { color:#ffc; }
+#sf_admin_container fieldset.collapse h2 a.collapse-toggle:hover { text-decoration:underline; }
+
+#sf_admin_container .float-left
+{
+  float: left;
+}
+
+#sf_admin_container .float-right
+{
+  float: right;
+}
+
+#sf_admin_container ul.sf_admin_td_actions
+{
+  list-style-type: none;
+}
+
+#sf_admin_container ul.sf_admin_td_actions li
+{
+  list-style-type: none;
+  display: inline;
+}
+
+#sf_admin_container ul.sf_admin_actions
+{
+  margin: 10px 0;
+  list-style-type: none;
+  text-align: right;
+}
+
+#sf_admin_container ul.sf_admin_actions a
+{
+  color: #333;
+}
+
+#sf_admin_container ul.sf_admin_actions li
+{
+  list-style-type: none;
+  display: inline;
+}
+
+#sf_admin_container ul.sf_admin_actions input
+{
+  padding: 3px 3px 3px 20px;
+  color: #333;
+  font-size: 11px;
+  font-family: Arial, sans-serif;
+  border: 0px;
+  border-right: 4px solid #999;
+  background-color: #ffc;
+  cursor: hand;
+  cursor: pointer;
+}
+
+#sf_admin_container .sf_admin_action_create
+{
+  background: url(/sf/sf_admin/images/add.png) no-repeat 3px 2px;
+  border-right: 4px solid #73B65A !important;
+}
+
+#sf_admin_container .sf_admin_action_save
+{
+  background: url(/sf/sf_admin/images/save.png) no-repeat 3px 2px;
+  border-right: 4px solid #73B65A !important;
+}
+
+#sf_admin_container .sf_admin_action_save_and_add
+{
+  background: url(/sf/sf_admin/images/save.png) no-repeat 3px 2px;
+  border-right: 4px solid #73B65A !important;
+}
+
+#sf_admin_container .sf_admin_action_save_and_list
+{
+  background: url(/sf/sf_admin/images/save.png) no-repeat 3px 2px;
+  border-right: 4px solid #73B65A !important;
+}
+
+#sf_admin_container .sf_admin_action_delete
+{
+  background: url(/sf/sf_admin/images/delete.png) no-repeat 3px 2px;
+  border-right: 4px solid #E75C58 !important;
+}
+
+#sf_admin_container .sf_admin_action_cancel
+{
+  background: url(/sf/sf_admin/images/cancel.png) no-repeat 3px 2px;
+  border-right: 4px solid #E75C58 !important;
+}
+
+#sf_admin_container .sf_admin_action_filter
+{
+  background: url(/sf/sf_admin/images/filter.png) no-repeat 3px 2px;
+  border-right: 4px solid #66f !important;
+}
+
+#sf_admin_container .sf_admin_action_reset_filter
+{
+  background: url(/sf/sf_admin/images/reset.png) no-repeat 3px 2px;
+  border-right: 4px solid #E75C58 !important;
+}
+
+#sf_admin_container .sf_admin_action_list
+{
+  background: url(/sf/sf_admin/images/list.png) no-repeat 3px 2px;
+  border-right: 4px solid #66f !important;
+}
+
+#sf_admin_container .sf_admin_default_action
+{
+  background-color: #fc6 !important;
+  font-weight: bold !important;
+}
+
+#sf_admin_container .sf_admin_list
+{
+  width: 100%;
+  border: 1px solid #ddd;
+  border-bottom: 0px;
+  border-right: 0px;
+}
+
+#sf_admin_container .sf_admin_list th
+{
+  padding: 2px;
+  background-color: #ccf;
+  text-align: left;
+}
+
+#sf_admin_container .sf_admin_list th a
+{
+  color: #333;
+}
+
+#sf_admin_container .sf_admin_list td
+{
+  padding: 3px;
+  border-bottom: 1px solid #ddd;
+  border-right: 1px solid #ddd;
+}
+
+#sf_admin_container .sf_admin_filters li
+{
+  list-style-type: none;
+}
+
+#sf_admin_container .sf_admin_row_0 td
+{
+  
+}
+
+#sf_admin_container .sf_admin_row_1 td
+{
+  background-color: #eef;
+}
+
+#sf_admin_container .sf_admin_edit_help
+{
+  color: #aaa;
+}
+
+#sf_admin_container .mceEditor td
+{
+  padding: 0px;
+}
+
+#sf_admin_container select.sf_admin_multiple, #sf_admin_container select.sf_admin_multiple-selected
+{
+  width: 12em;
+}
+
+#sf_admin_container ul.sf_admin_checklist li
+{
+  list-style: none;
+  line-height: 1.5em;
+}
+
+#sf_admin_container ul.sf_admin_checklist li label
+{
+  display: inline;
+  float: none;
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/add.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/add.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/cancel.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/cancel.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/date.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/date.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/default_icon.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/default_icon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/delete.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/delete.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/delete_icon.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/delete_icon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/edit.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/edit.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/edit_icon.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/edit_icon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/error.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/error.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/filter.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/filter.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/first.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/first.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/help.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/help.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/last.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/last.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/list.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/list.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/next.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/next.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/ok.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/ok.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/previous.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/previous.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/reset.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/reset.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/save.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/save.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/tick.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/images/tick.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/js/collapse.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/js/collapse.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/js/collapse.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,87 @@
+// django javascript file
+
+// Finds all fieldsets with class="collapse", collapses them, and gives each
+// one a "show" link that uncollapses it. The "show" link becomes a "hide"
+// link when the fieldset is visible.
+
+function findForm(node) {
+  // returns the node of the form containing the given node
+  if (node.tagName.toLowerCase() != 'form') {
+    return findForm(node.parentNode);
+  }
+  return node;
+}
+
+var CollapsedFieldsets = {
+  collapse_re: /\bcollapse\b/,   // Class of fieldsets that should be dealt with.
+  collapsed_re: /\bcollapsed\b/, // Class that fieldsets get when they're hidden.
+  collapsed_class: 'collapsed',
+  init: function() {
+    var fieldsets = document.getElementsByTagName('fieldset');
+    var collapsed_seen = false;
+    for (var i = 0, fs; fs = fieldsets[i]; i++) {
+      // Collapse this fieldset if it has the correct class, and if it
+      // doesn't have any errors. (Collapsing shouldn't apply in the case
+      // of error messages.)
+      if (fs.className.match(CollapsedFieldsets.collapse_re) && !CollapsedFieldsets.fieldset_has_errors(fs)) {
+        collapsed_seen = true;
+        // Give it an additional class, used by CSS to hide it.
+        fs.className += ' ' + CollapsedFieldsets.collapsed_class;
+        // (<a id="fieldsetcollapser3" class="collapse-toggle" href="#">show</a>)
+        var collapse_link = document.createElement('a');
+        collapse_link.className = 'collapse-toggle';
+        collapse_link.id = 'fieldsetcollapser' + i;
+        collapse_link.onclick = new Function('CollapsedFieldsets.show('+i+'); return false;');
+        collapse_link.href = '#';
+        collapse_link.innerHTML = 'show';
+        var h2 = fs.getElementsByTagName('h2')[0];
+        h2.appendChild(document.createTextNode(' ['));
+        h2.appendChild(collapse_link);
+        h2.appendChild(document.createTextNode(']'));
+      }
+    }
+    if (collapsed_seen) {
+      // Expand all collapsed fieldsets when form is submitted.
+      Event.observe(findForm(document.getElementsByTagName('fieldset')[0]), 'submit', function() { CollapsedFieldsets.uncollapse_all(); }, false);
+    }
+  },
+  fieldset_has_errors: function(fs) {
+    // Returns true if any fields in the fieldset have validation errors.
+    var divs = fs.getElementsByTagName('div');
+    for (var i=0; i<divs.length; i++) {
+      if (divs[i].className.match(/\bform-error\b/)) {
+        return true;
+      }
+    }
+    return false;
+  },
+  show: function(fieldset_index) {
+    var fs = document.getElementsByTagName('fieldset')[fieldset_index];
+    // Remove the class name that causes the "display: none".
+    fs.className = fs.className.replace(CollapsedFieldsets.collapsed_re, '');
+    // Toggle the "show" link to a "hide" link
+    var collapse_link = document.getElementById('fieldsetcollapser' + fieldset_index);
+    collapse_link.onclick = new Function('CollapsedFieldsets.hide('+fieldset_index+'); return false;');
+    collapse_link.innerHTML = 'hide';
+  },
+  hide: function(fieldset_index) {
+    var fs = document.getElementsByTagName('fieldset')[fieldset_index];
+    // Add the class name that causes the "display: none".
+    fs.className += ' ' + CollapsedFieldsets.collapsed_class;
+    // Toggle the "hide" link to a "show" link
+    var collapse_link = document.getElementById('fieldsetcollapser' + fieldset_index);
+        collapse_link.onclick = new Function('CollapsedFieldsets.show('+fieldset_index+'); return false;');
+    collapse_link.innerHTML = 'show';
+  },
+  
+  uncollapse_all: function() {
+    var fieldsets = document.getElementsByTagName('fieldset');
+    for (var i=0; i<fieldsets.length; i++) {
+      if (fieldsets[i].className.match(CollapsedFieldsets.collapsed_re)) {
+        CollapsedFieldsets.show(i);
+      }
+    }
+  }
+}
+
+Event.observe(window, 'load', CollapsedFieldsets.init, false);

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/js/double_list.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/js/double_list.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_admin/js/double_list.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+
+function double_list_move(src, dest)
+{
+  for (var i = 0; i < src.options.length; i++)
+  {
+    if (src.options[i].selected)
+    {
+      dest.options[dest.length] = new Option(src.options[i].text, src.options[i].value);
+      src.options[i] = null;
+      --i;
+    }
+  }
+}
+
+function double_list_submit()
+{
+  var form = $('sf_admin_edit_form');
+  var element;
+
+  // find multiple selects with name beginning 'associated_' and select all their options
+  for (var i = 0; i < form.elements.length; i++)
+  {
+    element = form.elements[i];
+    if (element.type == 'select-multiple')
+    {
+      if (element.className == 'sf_admin_multiple-selected')
+      {
+        for (var j = 0; j < element.options.length; j++)
+        {
+          element.options[j].selected = true;
+        }
+      }
+    }
+  }
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/css/ie.css
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/css/ie.css	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/css/ie.css	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,4 @@
+img
+{
+  behavior: url("/sf/sf_default/css/pngfix.htc");
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/css/pngfix.htc
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/css/pngfix.htc	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/css/pngfix.htc	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,86 @@
+<public:component lightWeight="true">
+<public:attach event="onpropertychange" onevent="propertyChanged()" />
+<public:attach event="onbeforeprint" onevent="beforePrint()" for="window"/>
+<public:attach event="onafterprint" onevent="afterPrint()" for="window"/>
+<script>
+
+/*
+ * PNG Behavior
+ *
+ * This script was created by Erik Arvidsson (http://webfx.eae.net/contact.html#erik)
+ * for WebFX (http://webfx.eae.net)
+ * Copyright 2002-2004
+ *
+ * For usage see license at http://webfx.eae.net/license.html
+ *
+ * Version: 1.02
+ * Created: 2001-??-??	First working version
+ * Updated: 2002-03-28	Fixed issue when starting with a non png image and
+ *                      switching between non png images
+ *          2003-01-06	Fixed RegExp to correctly work with IE 5.0x
+ *          2004-05-09  When printing revert to original
+ *
+ */
+
+var supported = /MSIE ((5\.5)|[6789])/.test(navigator.userAgent) &&
+				navigator.platform == "Win32";
+
+var realSrc;
+var blankSrc = "/sf/sf_default/images/trans.gif";
+var isPrinting = false;
+
+if (supported) fixImage();
+
+function propertyChanged() {
+	if (!supported || isPrinting) return;
+
+	var pName = event.propertyName;
+	if (pName != "src") return;
+	// if not set to blank
+	if (!new RegExp(blankSrc).test(src))
+		fixImage();
+};
+
+function fixImage() {
+	// get src
+	var src = element.src;
+
+	// check for real change
+	if (src == realSrc && /\.png$/i.test(src)) {
+		element.src = blankSrc;
+		return;
+	}
+
+	if ( ! new RegExp(blankSrc).test(src)) {
+		// backup old src
+		realSrc = src;
+	}
+
+	// test for png
+	if (/\.png$/i.test(realSrc)) {
+		// set blank image
+		element.src = blankSrc;
+		// set filter
+		element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft." +
+					"AlphaImageLoader(src='" + src + "',sizingMethod='scale')";
+	}
+	else {
+		// remove filter
+		element.runtimeStyle.filter = "";
+	}
+}
+
+function beforePrint() {
+	isPrinting = true;
+	element.src = realSrc;
+	element.runtimeStyle.filter = "";
+	realSrc = null;
+}
+
+function afterPrint() {
+	isPrinting = false;
+	fixImage();
+}
+
+</script>
+</public:component>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/css/screen.css
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/css/screen.css	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/css/screen.css	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,182 @@
+body
+{
+  font-family: "Trebuchet MS", Geneva, Arial, Helvetica, sans-serif;
+  margin: 0;
+  padding: 0;
+  font-size: 80%;
+  background-image: url(../images/bg_body.jpg);
+  background-repeat: repeat-x;
+  background-color: #E4D7C5;
+  color: #81571F;
+  text-align: center;
+}
+
+img
+{
+  border: none;
+}
+
+a
+{
+  color: #81571F;
+  text-decoration: underline;
+}
+
+a:hover
+{
+  color: #CC0000;
+  text-decoration: none;
+}
+
+code
+{
+  font-size:120%;
+}
+
+.sfTContainer
+{
+  position: relative;
+  text-align: left;
+  width: 515px;
+  margin: 0 auto;
+  padding: 0;
+  margin-top: 115px;
+}
+
+.sfTMessageContainer
+{
+  padding: 5px;
+  margin-top: 25px;
+  float: left;
+  width: 515px;
+}
+
+.sfTMessage
+{
+  background-image: url(../images/bg_sfTMessage.jpg);
+  background-repeat: repeat-x;
+  background-color: #E8DDCF;
+  border: 1px solid #FFFFFF;
+  border-bottom-color: #C2AB8C;
+  border-right-color: #C2AB8C;
+}
+
+.sfTAlert
+{
+  background-image: url(../images/bg_sfTAlert.jpg);
+  background-repeat: repeat-x;
+  background-color: #F8E1D1;
+  border: 1px solid #FFFFFF;
+  border-bottom-color: #F0B17C;
+  border-right-color: #F0B17C;
+}
+
+.sfTLock
+{
+  background-image: url(../images/bg_sfTLock.jpg);
+  background-repeat: repeat-x;
+  background-color: #DEE8F2;
+  border: 1px solid #FFFFFF;
+  border-bottom-color: #B1C4EC;
+  border-right-color: #B1C4EC;
+}
+
+.sfTMessageContainer .sfTMessageWrap
+{
+  float: left;
+  width: 440px;
+}
+
+.sfTMessageContainer .sfTMessageWrap h1
+{
+  color: #503512;
+  font-weight: normal;
+  font-size: 165%;
+  padding: 0;
+  margin: 0;
+  line-height: 100%;
+  padding-top: 5px;
+}
+
+.sfTMessageContainer .sfTMessageWrap h5
+{
+  font-weight: normal;
+  font-size: 100%;
+  padding: 0;
+  margin: 0;
+}
+
+.sfTMessageContainer img.sfTMessageIcon
+{
+  width: 48px;
+  height: 48px;
+  float: left;
+  margin-right: 12px;
+  margin-left: 5px;
+}
+
+.sfTMessageInfo
+{
+  margin: 0;
+  padding: 0;
+  margin-top: 15px;
+  float: left;
+  width: 440px;
+}
+
+.sfTMessageInfo dt
+{
+  font-weight: bolder;
+  font-size: 115%;
+  margin: 5px 0;
+}
+
+.sfTMessageInfo dd
+{
+  margin: 0;
+  padding: 0;
+}
+
+.sfTIconList
+{
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+
+.sfTIconList li
+{
+  clear: left;
+  line-height: 170%;
+  padding-left: 20px;
+}
+
+.sfTIconList li.sfTDatabaseMessage
+{
+  background: url(../images/icons/db16.png) no-repeat top left;
+}
+
+.sfTIconList li.sfTColorMessage
+{
+  background: url(../images/icons/colour16.png) no-repeat top left;
+}
+
+.sfTIconList li.sfTLinkMessage
+{
+  background: url(../images/icons/linkOut16.png) no-repeat top left;
+}
+
+.sfTIconList li.sfTDirectoryMessage
+{
+  background: url(../images/icons/folder16.png) no-repeat top left;
+}
+
+.sfTIconList li.sfTEditMessage
+{
+  background: url(../images/icons/edit16.png) no-repeat top left;
+}
+
+.sfTIconList li.sfTReloadMessage
+{
+  background: url(../images/icons/reload16.png) no-repeat top left;
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/bg_body.jpg
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/bg_body.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/bg_sfTAlert.jpg
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/bg_sfTAlert.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/bg_sfTLock.jpg
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/bg_sfTLock.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/bg_sfTMessage.jpg
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/bg_sfTMessage.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/cancel48.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/cancel48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/colour16.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/colour16.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/db16.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/db16.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/disabled48.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/disabled48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/edit16.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/edit16.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/folder16.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/folder16.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/linkOut16.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/linkOut16.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/lock48.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/lock48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/ok48.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/ok48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/reload16.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/reload16.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/tools48.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/icons/tools48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/sfTLogo.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/sfTLogo.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/trans.gif
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_default/images/trans.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/css/main.css
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/css/main.css	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/css/main.css	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,272 @@
+#sfWebDebug
+{
+  padding: 0;
+  margin: 0;
+  font-family: Arial, sans-serif;
+  font-size: 12px;
+  color: #333;
+  text-align: left;
+  line-height: 12px;
+}
+
+#sfWebDebug a, #sfWebDebug a:hover
+{
+  text-decoration: none;
+  border: none;
+  background-color: transparent;
+  color: #000;
+}
+
+#sfWebDebug img
+{
+  border: 0;
+}
+
+#sfWebDebugBar
+{
+  position: absolute;
+  margin: 0;
+  padding: 1px 0;
+  right: 0px;
+  top: 0px;
+  opacity: 0.80;
+  filter: alpha(opacity:80);
+  z-index: 10000;
+}
+
+#sfWebDebugBar[id]
+{
+  position: fixed;
+}
+
+#sfWebDebugBar img
+{
+  vertical-align: middle;
+}
+
+#sfWebDebugBar .menu
+{
+  padding: 5px;
+  display: inline;
+}
+
+#sfWebDebugBar .menu li
+{
+  display: inline;
+  list-style: none;
+  margin: 0;
+  padding: 0 5px;
+  border-right: 1px solid #aaa;
+}
+
+#sfWebDebugBar .menu li.last
+{
+  margin: 0;
+  padding: 0;
+  border: 0;
+}
+
+#sfWebDebugDatabaseDetails li
+{
+  margin: 0;
+  margin-left: 30px;
+  padding: 5px 0;
+}
+
+#sfWebDebugShortMessages li
+{
+  margin-bottom: 10px;
+  padding: 5px;
+  background-color: #ddd;
+}
+
+#sfWebDebugShortMessages li
+{
+  list-style: none;
+}
+
+#sfWebDebugDetails
+{
+  margin-right: 7px;
+}
+
+#sfWebDebug pre
+{
+  line-height: 1.3;
+  margin-bottom: 10px;
+}
+
+#sfWebDebug h1
+{
+  font-size: 16px;
+  font-weight: bold;
+  margin-bottom: 20px;
+  padding: 0;
+  border: 0px;
+  background-color: #eee;
+}
+
+#sfWebDebug h2
+{
+  font-size: 14px;
+  font-weight: bold;
+  margin: 10px 0;
+  padding: 0;
+  border: 0px;
+  background: none;
+}
+
+#sfWebDebug .top
+{
+  position: absolute;
+  left: 0px;
+  top: 0px;
+  width: 100%;
+  padding: 10px;
+  z-index: 9999;
+  background-color: #efefef;
+  border-bottom: 1px solid #aaa;
+}
+
+#sfWebDebugLog
+{
+  margin: 0;
+  padding: 3px;
+  font-size: 11px;
+}
+
+#sfWebDebugLogMenu li
+{
+  display: inline;
+  list-style: none;
+  margin: 0;
+  padding: 0 5px;
+  border-right: 1px solid #aaa;
+}
+
+#sfWebDebugConfigSummary
+{
+  display: inline;
+  padding: 5px;
+  background-color: #ddd;
+  border: 1px solid #aaa;
+  margin: 20px 0;
+}
+
+#sfWebDebugConfigSummary li
+{
+  list-style: none;
+  display: inline;
+  margin: 0;
+  padding: 0 5px;
+  border-right: 1px solid #aaa;
+}
+
+#sfWebDebugConfigSummary li.last
+{
+  margin: 0;
+  padding: 0;
+  border: 0;
+}
+
+.sfWebDebugInfo, .sfWebDebugInfo td
+{
+  background-color: #ddd;
+}
+
+.sfWebDebugWarning, .sfWebDebugWarning td
+{
+  background-color: orange;
+}
+
+.sfWebDebugError, .sfWebDebugError td
+{
+  background-color: #f99;
+}
+
+.sfWebDebugLogNumber
+{
+  width: 1%;
+}
+
+.sfWebDebugLogType
+{
+  width: 1%;
+  white-space: nowrap;
+  color: darkgreen;
+}
+
+.sfWebDebugLogInfo
+{
+  color: blue;
+}
+
+.ison
+{
+  color: #3f3;
+  margin-right: 5px;
+}
+
+.isoff
+{
+  color: #f33;
+  margin-right: 5px;
+  text-decoration: line-through;
+}
+
+.sfWebDebugLogs
+{
+  padding: 0;
+  margin: 0;
+  border: 1px solid #999;
+  font-family: Arial;
+  font-size: 11px;
+}
+
+.sfWebDebugLogs tr
+{
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+
+.sfWebDebugLogs td
+{
+  margin: 0;
+  border: 0;
+  padding: 1px 3px;
+  vertical-align: top;
+}
+
+.sfWebDebugLogs th
+{
+  margin: 0;
+  border: 0;
+  padding: 3px 5px;
+  vertical-align: top;
+  background-color: #999;
+  color: #eee;
+  white-space: nowrap;
+}
+
+.sfWebDebugDebugInfo
+{
+  margin-left: 10px;
+  padding-left: 5px;
+  border-left: 1px solid #aaa;
+}
+
+.sfWebDebugCache
+{
+  padding: 0;
+  margin: 0;
+  font-family: Arial;
+  position: absolute;
+  overflow: hidden;
+  z-index: 995;
+  font-size: 9px;
+  padding: 2px;
+  filter:alpha(opacity=85);
+  -moz-opacity:0.85;
+  opacity: 0.85;
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/close.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/close.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/comment.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/comment.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/config.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/config.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/database.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/database.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/error.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/error.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/info.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/info.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/memory.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/memory.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/reload.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/reload.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/sf.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/sf.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/time.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/time.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/toggle.gif
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/toggle.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/warning.png
===================================================================
(Binary files differ)


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/images/warning.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/js/main.js
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/js/main.js	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/data/web/sf/sf_web_debug/js/main.js	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,130 @@
+function sfWebDebugGetElementsByClassName(strClass, strTag, objContElm)
+{
+  // http://muffinresearch.co.uk/archives/2006/04/29/getelementsbyclassname-deluxe-edition/
+  strTag = strTag || "*";
+  objContElm = objContElm || document;
+  var objColl = (strTag == '*' && document.all) ? document.all : objContElm.getElementsByTagName(strTag);
+  var arr = new Array();
+  var delim = strClass.indexOf('|') != -1  ? '|' : ' ';
+  var arrClass = strClass.split(delim);
+  var j = objColl.length;
+  for (var i = 0; i < j; i++) {
+    if(objColl[i].className == undefined) continue;
+    var arrObjClass = objColl[i].className.split(' ');
+    if (delim == ' ' && arrClass.length > arrObjClass.length) continue;
+    var c = 0;
+    comparisonLoop:
+    {
+      var l = arrObjClass.length;
+      for (var k = 0; k < l; k++) {
+        var n = arrClass.length;
+        for (var m = 0; m < n; m++) {
+          if (arrClass[m] == arrObjClass[k]) c++;
+          if (( delim == '|' && c == 1) || (delim == ' ' && c == arrClass.length)) {
+            arr.push(objColl[i]);
+            break comparisonLoop;
+          }
+        }
+      }
+    }
+  }
+  return arr;
+}
+
+function sfWebDebugToggleMenu()
+{
+  var element = document.getElementById('sfWebDebugDetails');
+
+  var cacheElements = sfWebDebugGetElementsByClassName('sfWebDebugCache');
+  var mainCacheElements = sfWebDebugGetElementsByClassName('sfWebDebugActionCache');
+
+  if (element.style.display != 'none')
+  {
+    document.getElementById('sfWebDebugLog').style.display = 'none';
+    document.getElementById('sfWebDebugConfig').style.display = 'none';
+    document.getElementById('sfWebDebugDatabaseDetails').style.display = 'none';
+    document.getElementById('sfWebDebugTimeDetails').style.display = 'none';
+
+    // hide all cache information
+    for (var i = 0; i < cacheElements.length; ++i)
+    {
+      cacheElements[i].style.display = 'none';
+    }
+    for (var i = 0; i < mainCacheElements.length; ++i)
+    {
+      mainCacheElements[i].style.border = 'none';
+    }
+  }
+  else
+  {
+    for (var i = 0; i < cacheElements.length; ++i)
+    {
+      cacheElements[i].style.display = '';
+    }
+    for (var i = 0; i < mainCacheElements.length; ++i)
+    {
+      mainCacheElements[i].style.border = '1px solid #f00';
+    }
+  }
+
+  sfWebDebugToggle('sfWebDebugDetails');
+  sfWebDebugToggle('sfWebDebugShowMenu');
+  sfWebDebugToggle('sfWebDebugHideMenu');
+}
+
+function sfWebDebugShowDetailsFor(element)
+{
+  if (element != 'sfWebDebugLog') document.getElementById('sfWebDebugLog').style.display='none';
+  if (element != 'sfWebDebugConfig') document.getElementById('sfWebDebugConfig').style.display='none';
+  if (element != 'sfWebDebugDatabaseDetails') document.getElementById('sfWebDebugDatabaseDetails').style.display='none';
+  if (element != 'sfWebDebugTimeDetails') document.getElementById('sfWebDebugTimeDetails').style.display='none';
+
+  sfWebDebugToggle(element);
+}
+
+function sfWebDebugToggle(element)
+{
+  if (typeof element == 'string')
+    element = document.getElementById(element);
+
+  if (element)
+    element.style.display = element.style.display == 'none' ? '' : 'none';
+}
+
+function sfWebDebugToggleMessages(klass)
+{
+  var elements = sfWebDebugGetElementsByClassName(klass);
+
+  var x = elements.length;
+  for (var i = 0; i < x; ++i)
+  {
+    sfWebDebugToggle(elements[i]);
+  }
+}
+
+function sfWebDebugToggleAllLogLines(show, klass)
+{
+  var elements = sfWebDebugGetElementsByClassName(klass);
+  var x = elements.length;
+  for (var i = 0; i < x; ++i)
+  {
+    elements[i].style.display = show ? '' : 'none';
+  }
+}
+
+function sfWebDebugShowOnlyLogLines(type)
+{
+  var types = new Array();
+  types[0] = 'info';
+  types[1] = 'warning';
+  types[2] = 'error';
+  for (klass in types)
+  {
+    var elements = sfWebDebugGetElementsByClassName('sfWebDebug' + types[klass].substring(0, 1).toUpperCase() + types[klass].substring(1, types[klass].length));
+    var x = elements.length;
+    for (var i = 0; i < x; ++i)
+    {
+      elements[i].style.display = (type == types[klass]) ? '' : 'none';
+    }
+  }
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/01-Introducing-Symfony.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/01-Introducing-Symfony.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/01-Introducing-Symfony.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,262 @@
+Chapter 1 - Introducing Symfony
+===============================
+
+What can symfony do for you? What's required to use it? This chapter answers these questions.
+
+Symfony in Brief
+----------------
+
+A framework streamlines application development by automating many of the patterns employed for a given purpose. A framework also adds structure to the code, prompting the developer to write better, more readable, and more maintainable code. Ultimately, a framework makes programming easier, since it packages complex operations into simple statements.
+
+Symfony is a complete framework designed to optimize the development of web applications by way of several key features. For starters, it separates a web application's business rules, server logic, and presentation views. It contains numerous tools and classes aimed at shortening the development time of a complex web application. Additionally, it automates common tasks so that the developer can focus entirely on the specifics of an application. The end result of these advantages means there is no need to reinvent the wheel every time a new web application is built!
+
+Symfony was written entirely in PHP 5. It has been thoroughly tested in various real-world projects, and is actually in use for high-demand e-business websites. It is compatible with most of the available databases engines, including MySQL, PostgreSQL, Oracle, and Microsoft SQL Server. It runs on *nix and Windows platforms. Let's begin with a closer look at its features.
+
+### Symfony Features
+
+Symfony was built in order to fulfill the following requirements:
+
+  * Easy to install and configure on most platforms (and guaranteed to work on standard *nix and Windows platforms)
+  * Database engine-independent
+  * Simple to use, in most cases, but still flexible enough to adapt to complex cases
+  * Based on the premise of convention over configuration--the developer needs to configure only the unconventional
+  * Compliant with most web best practices and design patterns
+  * Enterprise-ready--adaptable to existing information technology (IT) policies and architectures, and stable enough for long-term projects
+  * Very readable code, with phpDocumentor comments, for easy maintenance
+  * Easy to extend, allowing for integration with other vendor libraries
+
+#### Automated Web Project Features
+
+Most of the common features of web projects are automated within symfony, as follows:
+
+  * The built-in internationalization layer allows for both data and interface translation, as well as content localization.
+  * The presentation uses templates and layouts that can be built by HTML designers without any knowledge of the framework. Helpers reduce the amount of presentation code to write by encapsulating large portions of code in simple function calls.
+  * Forms support automated validation and repopulation, and this ensures a good quality of data in the database and a better user experience.
+  * Output escaping protects applications from attacks via corrupted data.
+  * The cache management features reduce bandwidth usage and server load.
+  * Authentication and credential features facilitate the creation of restricted sections and user security management.
+  * Routing and smart URLs make the page address part of the interface and search-engine friendly.
+  * Built-in e-mail and API management features allow web applications to go beyond the classic browser interactions.
+  * Lists are more user-friendly thanks to automated pagination, sorting, and filtering.
+  * Factories, plug-ins, and mixins provide a high level of extensibility.
+  * Ajax interactions are easy to implement thanks to one-line helpers that encapsulate cross-browser-compatible JavaScript effects.
+
+#### Development Environment and Tools
+
+To fulfill the requirements of enterprises having their own coding guidelines and project management rules, symfony can be entirely customized. It provides, by default, several development environments and is bundled with multiple tools that automate common software-engineering tasks:
+
+  * The code-generation tools are great for prototyping and one-click back-end administration.
+  * The built-in unit and functional testing framework provides the perfect tools to allow test-driven development.
+  * The debug panel accelerates debugging by displaying all the information the developer needs on the page he's working on.
+  * The command-line interface automates application deployment between two servers.
+  * Live configuration changes are possible and effective.
+  * The logging features give administrators full details about an application's activities.
+
+### Who Made Symfony and Why?
+
+The first version of symfony was released in October 2005 by project founder Fabien Potencier, coauthor of this book. Fabien is the CEO of Sensio ([http://www.sensio.com/](http://www.sensio.com/)), a French web agency well known for its innovative views on web development.
+
+Back in 2003, Fabien spent some time inquiring about the existing open source development tools for web applications in PHP. He found that none fulfilled the previously described requirements. When PHP 5 was released, he decided that the available tools had reached a mature enough stage to be integrated into a full-featured framework. He subsequently spent a year developing the symfony core, basing his work on the Mojavi Model-View-Controller (MVC) framework, the Propel object-relational mapping (ORM), and the Ruby on Rails templating helpers.
+
+Fabien originally built symfony for Sensio's projects, because having an effective framework at your disposal presents an ideal way to develop applications faster and more efficiently. It also makes web development more intuitive, and the resulting applications are more robust and easier to maintain. The framework entered the proving grounds when it was employed to build an e-commerce website for a lingerie retailer, and subsequently was applied to other projects.
+
+After successfully using symfony for a few projects, Fabien decided to release it under an open source license. He did so to donate this work to the community, to benefit from user feedback, to showcase Sensio's experience, and because it's fun.
+
+>**Note**
+>Why "symfony" and not "FooBarFramework"? Because Fabien wanted a short name containing an s, as in Sensio, and an f, as in framework--easy to remember and not associated with another development tool. Also, he doesn't like capital letters. symfony was close enough, even if not completely English, and it was also available as a project name. The other alternative was "baguette."
+
+For symfony to be a successful open source project, it needed to have extensive documentation, in English, to increase the adoption rate. Fabien asked fellow Sensio employee François Zaninotto, the other author of this book, to dig into the code and write an online book about it. It took quite a while, but when the project was made public, it was documented well enough to appeal to numerous developers. The rest is history.
+
+### The Symfony Community
+
+As soon as the symfony website ([http://www.symfony-project.com/](http://www.symfony-project.com/)) was launched, numerous developers from around the world downloaded and installed the framework, read the online documentation, and built their first application with symfony, and the buzz began to mount.
+
+Web application frameworks were getting popular at that time, and the need for a full-featured framework in PHP was high. Symfony offered a compelling solution due to its impressive code quality and significant amount of documentation--two major advantages over the other players in the framework category. Contributors soon began to surface, proposing patches and enhancements, proofreading the documentation, and performing other much-needed roles.
+
+The public source repository and ticketing system offer a variety of ways to contribute, and all volunteers are welcome. Fabien is still the main committer in the trunk of the source code repository, and guarantees the quality of the code.
+
+Today, the symfony forum, mailing lists, and Internet Relay Chat (IRC) channel offer ideal support outlets, with seemingly each question getting an average of four answers. Newcomers install symfony every day, and the wiki and code snippets sections host a lot of user-contributed documentation. The number of known symfony applications increases by an average of five per week, and counting.
+
+The symfony community is the third strength of the framework, and we hope that you will join it after reading this book.
+
+### Is Symfony for Me?
+
+Whether you are a PHP 5 expert or a newcomer to web application programming, you will be able to use symfony. The main factor in deciding whether or not to do so is the size of your project.
+
+If you want to develop a simple website with five to ten pages, limited access to a database, and no obligations to ensuring its performance or providing documentation, then you should stick with PHP alone. You wouldn't gain much from a web application framework, and using object orientation or an MVC model would likely only slow down your development process. As a side note, symfony is not optimized to run efficiently on a shared server where PHP scripts can run only in Common Gateway Interface (CGI) mode.
+
+On the other hand, if you develop more complex web applications, with heavy business logic, PHP alone is not enough. If you plan on maintaining or extending your application in the future, you will need your code to be lightweight, readable, and effective. If you want to use the latest advances in user interaction (like Ajax) in an intuitive way, you can't just write hundreds of lines of JavaScript. If you want to have fun and develop fast, then PHP alone will probably be disappointing. In all these cases, symfony is for you.
+
+And, of course, if you are a professional web developer, you already know all the benefits of web application frameworks, and you need one that is mature, well documented, and has a large community. Search no more, for symfony is your solution.
+
+>**TIP**
+>If you would like a visual demonstration, take a look at the screencasts available from the symfony website. You will see how fast and fun it is to develop applications with symfony.
+
+Fundamental Concepts
+--------------------
+
+Before you get started with symfony, you should understand a few basic concepts. Feel free to skip ahead if you already know the meaning of OOP, ORM, RAD, DRY, KISS, TDD, YAML, and PEAR.
+
+### PHP 5
+
+Symfony is developed in PHP 5 ([http://www.php.net/](http://www.php.net/)) and dedicated to building web applications with the same language. Therefore, a solid understanding of PHP 5 is required to get the most out of the framework.
+
+Developers who already know PHP 4 but not PHP 5 should mainly focus on the language's new object-oriented model.
+
+### Object-Oriented Programming (OOP)
+
+Object-oriented programming (OOP) will not be explained in this chapter. It needs a whole book itself! Because symfony makes extensive use of the object-oriented mechanisms available as of PHP 5, OOP is a prerequisite to learning symfony.
+
+Wikipedia explains OOP as follows:
+
+The idea behind object-oriented programming is that a computer program may be seen as comprising a collection of individual units, or objects, that act on each other, as opposed to a traditional view in which a program may be seen as a collection of functions, or simply as a list of instructions to the computer.
+
+PHP 5 implements the object-oriented paradigms of class, object, method, inheritance, and much more. Those who are not familiar with these concepts are advised to read the related PHP documentation, available at [http://www.php.net/manual/en/language.oop5.basic.php](http://www.php.net/manual/en/language.oop5.basic.php).
+
+### Magic Methods
+
+One of the strengths of PHP's object capabilities is the use of magic methods. These are methods that can be used to override the default behavior of classes without modifying the outside code. They make the PHP syntax less verbose and more extensible. They are easy to recognize, because the names of the magic methods start with two underscores (`__`).
+
+For instance, when displaying an object, PHP implicitly looks for a `__toString()` method for this object to see if a custom display format was defined by the developer:
+
+    [php]
+    $myObject = new myClass();
+    echo $myObject;
+    // Will look for a magic method
+    echo $myObject->__toString();
+
+Symfony uses magic methods, so you should have a thorough understanding of them. They are described in the PHP documentation ([http://www.php.net/manual/en/language.oop5.magic.php](http://www.php.net/manual/en/language.oop5.magic.php)).
+
+### PHP Extension and Application Repository (PEAR)
+
+PEAR is "a framework and distribution system for reusable PHP components." PEAR allows you to download, install, upgrade, and uninstall PHP scripts. When using a PEAR package, you don't need to worry about where to put scripts, how to make them available, or how to extend the command-line interface (CLI).
+
+PEAR is a community-driven project written in PHP and shipped with standard PHP distributions.
+
+>**TIP**
+>The PEAR website, [http://pear.php.net/](http://pear.php.net/), provides documentation and packages grouped by categories.
+
+PEAR is the most professional way to install vendor libraries in PHP. Symfony advises the use of PEAR to keep a central installation point for use across multiple projects. The symfony plug-ins are PEAR packages with a special configuration. The symfony framework itself is available as a PEAR package.
+
+You don't need to know all about the PEAR syntax to use symfony. You just need to understand what it does and have it installed. You can check that PEAR is installed in your computer by typing the following in a CLI:
+
+    > pear info pear
+
+This command will return the version number of your PEAR installation.
+
+The symfony project has its own PEAR repository, or channel. Note that channels are available only since version 1.4.0 of PEAR, so you should upgrade if your version is older. To upgrade your version of PEAR, issue the following command:
+
+    > pear upgrade PEAR
+
+### Object-Relational Mapping (ORM)
+
+Databases are relational. PHP 5 and symfony are object-oriented. In order to access the database in an object-oriented way, an interface translating the object logic to the relational logic is required. This interface is called an object-relational mapping, or ORM.
+
+An ORM is made up of objects that give access to data and keep business rules within themselves.
+
+One benefit of an object/relational abstraction layer is that it prevents you from using a syntax that is specific to a given database. It automatically translates calls to the model objects to SQL queries optimized for the current database.
+
+This means that switching to another database system in the middle of a project is easy. Imagine that you have to write a quick prototype for an application, but the client has not decided yet which database system would best suit his needs. You can start building your application with SQLite, for instance, and switch to MySQL, PostgreSQL, or Oracle when the client is ready to decide. Just change one line in a configuration file, and it works.
+
+An abstraction layer encapsulates the data logic. The rest of the application does not need to know about the SQL queries, and the SQL that accesses the database is easy to find. Developers who specialize in database programming also know clearly where to go.
+
+Using objects instead of records, and classes instead of tables, has another benefit: you can add new accessors to your tables. For instance, if you have a table called `Client` with two fields, `FirstName` and `LastName`, you might like to be able to require just a `Name`. In an object-oriented world, this is as easy as adding a new accessor method to the `Client` class, like this:
+
+    [php]
+    public function getName()
+    {
+      return $this->getFirstName().' '.$this->getLastName();
+    }
+
+All the repeated data-access functions and the business logic of the data can be maintained within such objects. For instance, consider a class ShoppingCart in which you keep items (which are objects). To retrieve the full amount of the shopping cart for the checkout, you can add a `getTotal()` method, like this:
+
+    [php]
+    public function getTotal()
+    {
+      $total = 0;
+      foreach ($this->getItems() as $item)
+      {
+        $total += $item->getPrice() * $item->getQuantity();
+      }
+      return $total;
+    }
+
+And that's it. Imagine how long it would have required to write a SQL query doing the same thing!
+
+Propel, another open source project, is currently one of the best object/relational abstraction layers for PHP 5. Symfony integrates Propel seamlessly into the framework, so most of the data manipulation described in this book follows the Propel syntax. This book will describe how to use the Propel objects, but for a more complete reference, a visit to the Propel website ([http://propel.phpdb.org/trac/](http://propel.phpdb.org/trac/)) is recommended.
+
+### Rapid Application Development (RAD)
+
+Programming web applications has long been a tedious and slow job. Following the usual software engineering life cycles (like the one proposed by the Rational Unified Process, for instance), the development of web applications could not start before a complete set of requirements was written, a lot of Unified Modeling Language (UML) diagrams were drawn, and tons of preliminary documentation were produced. This was due to the general speed of development, to the lack of versatility of programming languages (you had to build, compile, restart, and who knows what else before actually seeing your program run), and most of all, to the fact that clients were quite reasonable and didn't change their minds constantly.
+
+Today, business moves faster, and clients tend to constantly change their minds in the course of the project development. Of course, they expect the development team to adapt to their needs and modify the structure of an application quickly. Fortunately, the use of scripting languages like Perl and PHP makes it easy to apply other programming strategies, such as rapid application development (RAD) or agile software development.
+
+One of the ideas of these methodologies is to start developing as soon as possible so that the client can review a working prototype and offer additional direction. Then the application gets built in an iterative process, releasing increasingly feature-rich versions in short development cycles.
+
+The consequences for the developer are numerous. A developer doesn't need to think about the future when implementing a feature. The method used should be as simple and straightforward as possible. This is well illustrated by the maxim of the KISS principle: Keep It Simple, Stupid.
+
+When the requirements evolve or when a feature is added, existing code usually has to be partly rewritten. This process is called refactoring, and happens a lot in the course of a web application development. Code is moved to other places according to its nature. Duplicated portions of code are refactored to a single place, thus applying the Don't Repeat Yourself (DRY) principle.
+
+And to make sure that the application still runs when it changes constantly, it needs a full set of unit tests that can be automated. If well written, unit tests are a solid way to ensure that nothing is broken by adding or refactoring code. Some development methodologies even stipulate writing tests before coding--that's called test-driven development (TDD).
+
+>**NOTE**
+>There are many other principles and good habits related to agile development. One of the most effective agile development methodologies is called Extreme Programming (abbreviated as XP), and the XP literature will teach you a lot about how to develop an application in a fast and effective way. A good starting place is the XP series books by Kent Beck (Addison-Wesley).
+
+Symfony is the perfect tool for RAD. As a matter of fact, the framework was built by a web agency applying the RAD principle for its own projects. This means that learning to use symfony is not about learning a new language, but more about applying the right reflexes and the best judgment in order to build applications in a more effective way.
+
+The symfony project website proposes a step-by-step tutorial illustrating the development of an application in an agile way. It is called askeet ([http://www.symfony-project.com/askeet](http://www.symfony-project.com/askeet)), and is recommended reading for those who want to learn more about agile development.
+
+### YAML
+
+According to the official YAML website ([http://www.yaml.org/](http://www.yaml.org/)), YAML is "a straightforward machine parsable data serialization format designed for human readability and interaction with scripting languages." Put another way, YAML is a very simple language used to describe data in an XML-like way but with a much simpler syntax. It is especially useful to describe data that can be translated into arrays and hashes, like this:
+
+    [php]
+    $house = array(
+      'family' => array(
+        'name'     => 'Doe',
+        'parents'  => array('John', 'Jane'),
+        'children' => array('Paul', 'Mark', 'Simone')
+      ),
+      'address' => array(
+        'number'   => 34,
+        'street'   => 'Main Street',
+        'city'     => 'Nowheretown',
+        'zipcode'  => '12345'
+      )
+    );
+
+This PHP array can be automatically created by parsing the YAML string:
+
+    house:
+      family:
+        name:     Doe
+        parents:
+          - John
+          - Jane
+        children:
+          - Paul
+          - Mark
+          - Simone
+      address:
+        number: 34
+        street: Main Street
+        city: Nowheretown
+        zipcode: 12345
+
+In YAML, structure is shown through indentation, sequence items are denoted by a dash, and key/value pairs within a map are separated by a colon. YAML also has a shorthand syntax to describe the same structure with fewer lines, where arrays are explicitly shown with `[]` and hashes with `{}`. Therefore, the previous YAML data can be written in a shorter way, as follows:
+
+    house:
+      family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
+      address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 12345 }
+
+YAML is an acronym for Yet Another Markup Language and pronounced "yamel." The format has been around since 2001, and YAML parsers exist for a large variety of languages.
+
+>**TIP**
+>The specifications of the YAML format are available at [http://www.yaml.org/](http://www.yaml.org/).
+
+As you can see, YAML is much faster to write than XML (no more closing tags or explicit quotes), and it is more powerful than `.ini` files (which don't support hierarchy). That is why symfony uses YAML as the preferred language to store configuration. You will see a lot of YAML files in this book, but it is so straightforward that you probably don't need to learn more about it.
+
+Summary
+-------
+
+Symfony is a PHP 5 web application framework. It adds a new layer on top of the PHP language, providing tools that speed up the development of complex web applications. This book will tell you all about it, and you just need to be familiar with the basic concepts of modern programming to understand it--namely object-oriented programming (OOP), object-relational mapping (ORM), and rapid application development (RAD). The only required technical background is knowledge of PHP 5.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/02-Exploring-Symfony-s-Code.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/02-Exploring-Symfony-s-Code.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/02-Exploring-Symfony-s-Code.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,711 @@
+Chapter 2 - Exploring Symfony's Code
+====================================
+
+At first glance, the code behind a symfony-driven application can seem quite daunting. It consists of many directories and scripts, and the files are a mix of PHP classes, HTML, and even an intermingling of the two. You'll also see references to classes that are otherwise nowhere to be found within the application folder, and the directory depth stretches to six levels. But once you understand the reason behind all of this seeming complexity, you'll suddenly feel like it's so natural that you wouldn't trade the symfony application structure for any other. This chapter explains away that intimidated feeling.
+
+The MVC Pattern
+---------------
+
+Symfony is based on the classic web design pattern known as the MVC architecture, which consists of three levels:
+
+  * The model represents the information on which the application operates--its business logic.
+  * The view renders the model into a web page suitable for interaction with the user.
+  * The controller responds to user actions and invokes changes on the model or view as appropriate.
+
+Figure 2-1 illustrates the MVC pattern.
+
+The MVC architecture separates the business logic (model) and the presentation (view), resulting in greater maintainability. For instance, if your application should run on both standard web browsers and handheld devices, you just need a new view; you can keep the original controller and model. The controller helps to hide the detail of the protocol used for the request (HTTP, console mode, mail, and so on) from the model and the view. And the model abstracts the logic of the data, which makes the view and the action independent of, for instance, the type of database used by the application.
+
+Figure 2-1 - The MVC pattern
+
+![The MVC pattern](/images/book/F0201.png "The MVC pattern")
+
+### MVC Layering
+
+To help you understand MVC's advantages, let's see how to convert a basic PHP application to an MVC-architectured application. A list of posts for a weblog application will be a perfect example.
+
+#### Flat Programming
+
+In a flat PHP file, displaying a list of database entries might look like the script presented in Listing 2-1.
+
+Listing 2-1 - A Flat Script
+
+    [php]
+    <?php
+
+    // Connecting, selecting database
+    $link = mysql_connect('localhost', 'myuser', 'mypassword');
+    mysql_select_db('blog_db', $link);
+
+    // Performing SQL query
+    $result = mysql_query('SELECT date, title FROM post', $link);
+
+    ?>
+
+    <html>
+      <head>
+        <title>List of Posts</title>
+      </head>
+      <body>
+       <h1>List of Posts</h1>
+       <table>
+         <tr><th>Date</th><th>Title</th></tr>
+    <?php
+    // Printing results in HTML
+    while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
+    {
+    echo "\t<tr>\n";
+    printf("\t\t<td> %s </td>\n", $row['date']);
+    printf("\t\t<td> %s </td>\n", $row['title']);
+    echo "\t</tr>\n";
+    }
+    ?>
+        </table>
+      </body>
+    </html>
+
+    <?php
+
+    // Closing connection
+    mysql_close($link);
+
+    ?>
+
+That's quick to write, fast to execute, and impossible to maintain. The following are the major problems with this code:
+
+  * There is no error-checking (what if the connection to the database fails?).
+  * HTML and PHP code are mixed, even interwoven together.
+  * The code is tied to a MySQL database.
+
+#### Isolating the Presentation
+
+The `echo` and `printf` calls in Listing 2-1 make the code difficult to read. Modifying the HTML code to enhance the presentation is a hassle with the current syntax. So the code can be split into two parts. First, the pure PHP code with all the business logic goes in a controller script, as shown in Listing 2-2.
+
+Listing 2-2 - The Controller Part, in `index.php`
+
+    [php]
+    <?php
+
+     // Connecting, selecting database
+     $link = mysql_connect('localhost', 'myuser', 'mypassword');
+     mysql_select_db('blog_db', $link);
+
+     // Performing SQL query
+     $result = mysql_query('SELECT date, title FROM post', $link);
+
+     // Filling up the array for the view
+     $posts = array();
+     while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
+     {
+        $posts[] = $row;
+     }
+
+     // Closing connection
+     mysql_close($link);
+
+     // Requiring the view
+     require('view.php');
+
+     ?>
+
+The HTML code, containing template-like PHP syntax, is stored in a view script, as shown in Listing 2-3.
+
+Listing 2-3 - The View Part, in `view.php`
+
+    [php]
+    <html>
+      <head>
+        <title>List of Posts</title>
+      </head>
+      <body>
+        <h1>List of Posts</h1>
+        <table>
+          <tr><th>Date</th><th>Title</th></tr>
+        <?php foreach ($posts as $post): ?>
+          <tr>
+            <td><?php echo $post['date'] ?></td>
+            <td><?php echo $post['title'] ?></td>
+          </tr>
+        <?php endforeach; ?>
+        </table>
+      </body>
+    </html>
+
+A good rule of thumb to determine whether the view is clean enough is that it should contain only a minimum amount of PHP code, in order to be understood by an HTML designer without PHP knowledge. The most common statements in views are echo, if/endif, foreach/endforeach, and that's about all. Also, there should not be PHP code echoing HTML tags.
+
+All the logic is moved to the controller script, and contains only pure PHP code, with no HTML inside. As a matter of fact, you should imagine that the same controller could be reused for a totally different presentation, perhaps in a PDF file or an XML structure.
+
+#### Isolating the Data Manipulation
+
+Most of the controller script code is dedicated to data manipulation. But what if you need the list of posts for another controller, say one that would output an RSS feed of the weblog posts? What if you want to keep all the database queries in one place, to avoid code duplication? What if you decide to change the data model so that the `post` table gets renamed `weblog_post`? What if you want to switch to PostgreSQL instead of MySQL? In order to make all that possible, you need to remove the data-manipulation code from the controller and put it in another script, called the model, as shown in Listing 2-4.
+
+Listing 2-4 - The Model Part, in `model.php`
+
+    [php]
+    <?php
+
+    function getAllPosts()
+    {
+      // Connecting, selecting database
+      $link = mysql_connect('localhost', 'myuser', 'mypassword');
+      mysql_select_db('blog_db', $link);
+
+      // Performing SQL query
+      $result = mysql_query('SELECT date, title FROM post', $link);
+
+      // Filling up the array
+      $posts = array();
+      while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
+      {
+         $posts[] = $row;
+      }
+
+      // Closing connection
+      mysql_close($link);
+
+      return $posts;
+    }
+
+    ?>
+
+The revised controller is presented in Listing 2-5.
+
+Listing 2-5 - The Controller Part, Revised, in `index.php`
+
+    [php]
+    <?php
+
+    // Requiring the model
+    require_once('model.php');
+
+    // Retrieving the list of posts
+    $posts = getAllPosts();
+
+    // Requiring the view
+    require('view.php');
+
+    ?>
+
+The controller becomes easier to read. Its sole task is to get the data from the model and pass it to the view. In more complex applications, the controller also deals with the request, the user session, the authentication, and so on. The use of explicit names for the functions of the model even makes code comments unnecessary in the controller.
+
+The model script is dedicated to data access and can be organized accordingly. All parameters that don't depend on the data layer (like request parameters) must be given by the controller and not accessed directly by the model. The model functions can be easily reused in another controller.
+
+### Layer Separation Beyond MVC
+
+So the principle of the MVC architecture is to separate the code into three layers, according to its nature. Data logic code is placed within the model, presentation code within the view, and application logic within the controller.
+
+Other additional design patterns can make the coding experience even easier. The model, view, and controller layers can be further subdivided.
+
+#### Database Abstraction
+
+The model layer can be split into a data access layer and a database abstraction layer. That way, data access functions will not use database-dependent query statements, but call some other functions that will do the queries themselves. If you change your database system later, only the database abstraction layer will need updating.
+
+An example of a MySQL-specific data access layer is presented in Listing 2-6, followed by a sample database abstraction layer in Listing 2-7.
+
+Listing 2-6 - The Database Abstraction Part of the Model
+
+    [php]
+    <?php
+
+    function open_connection($host, $user, $password)
+    {
+      return mysql_connect($host, $user, $password);
+    }
+
+    function close_connection($link)
+    {
+      mysql_close($link);
+    }
+
+    function query_database($query, $database, $link)
+    {
+      mysql_select_db($database, $link);
+
+      return mysql_query($query, $link);
+    }
+
+    function fetch_results($result)
+    {
+      return mysql_fetch_array($result, MYSQL_ASSOC);
+    }
+
+Listing 2-7 - The Data Access Part of the Model
+
+    [php]
+    function getAllPosts()
+    {
+      // Connecting to database
+      $link = open_connection('localhost', 'myuser', 'mypassword');
+
+      // Performing SQL query
+      $result = query_database('SELECT date, title FROM post', 'blog_db', $link);
+
+      // Filling up the array
+      $posts = array();
+      while ($row = fetch_results($result))
+      {
+         $posts[] = $row;
+      }
+
+      // Closing connection
+      close_connection($link);
+
+      return $posts;
+    }
+
+    ?>
+
+You can check that no database-engine dependent functions can be found in the data access layer, making it database-independent. Additionally, the functions created in the database abstraction layer can be reused for many other model functions that need access to the database.
+
+>**NOTE**
+>The examples in Listings 2-6 and 2-7 are still not very satisfactory, and there is some work left to do to have a full database abstraction (abstracting the SQL code through a database-independent query builder, moving all functions into a class, and so on). But the purpose of this book is not to show you how to write all that code by hand, and you will see in Chapter 8 that symfony natively does all the abstraction very well.
+
+#### View Elements
+
+The view layer can also benefit from some code separation. A web page often contains consistent elements throughout an application: the page headers, the graphical layout, the footer, and the global navigation. Only the inner part of the page changes. That's why the view is separated into a layout and a template. The layout is usually global to the application, or to a group of pages. The template only puts in shape the variables made available by the controller. Some logic is needed to make these components work together, and this view logic layer will keep the name view. According to these principles, the view part of Listing 2-3 can be separated into three parts, as shown in Listings 2-8, 2-9, and 2-10.
+
+Listing 2-8 - The Template Part of the View, in `mytemplate.php`
+
+    [php]
+    <h1>List of Posts</h1>
+    <table>
+    <tr><th>Date</th><th>Title</th></tr>
+    <?php foreach ($posts as $post): ?>
+      <tr>
+        <td><?php echo $post['date'] ?></td>
+        <td><?php echo $post['title'] ?></td>
+      </tr>
+    <?php endforeach; ?>
+    </table>
+
+Listing 2-9 - The View Logic Part of the View
+
+    [php]
+    <?php
+
+    $title = 'List of Posts';
+    $content = include('mytemplate.php');
+
+    ?>
+
+Listing 2-10 - The Layout Part of the View
+
+    [php]
+    <html>
+      <head>
+        <title><?php echo $title ?></title>
+      </head>
+      <body>
+        <?php echo $content ?>
+      </body>
+    </html>
+
+#### Action and Front Controller
+
+The controller doesn't do much in the previous example, but in real web applications, the controller has a lot of work. An important part of this work is common to all the controllers of the application. The common tasks include request handling, security handling, loading the application configuration, and similar chores. This is why the controller is often divided into a front controller, which is unique for the whole application, and actions, which contain only the controller code specific to one page.
+
+One of the great advantages of a front controller is that it offers a unique entry point to the whole application. If you ever decide to close the access to the application, you will just need to edit the front controller script. In an application without a front controller, each individual controller would need to be turned off.
+
+#### Object Orientation
+
+All the previous examples use procedural programming. The OOP capabilities of modern languages make the programming even easier, since objects can encapsulate logic, inherit from one another, and provide clean naming conventions.
+
+Implementing an MVC architecture in a language that is not object-oriented raises namespace and code-duplication issues, and the overall code is difficult to read.
+
+Object orientation allows developers to deal with such things as the view object, the controller object, and the model classes, and to transform all the functions in the previous examples into methods. It is a must for MVC architectures.
+
+>**TIP**
+>If you want to learn more about design patterns for web applications in an object-oriented context, read Patterns of Enterprise Application Architecture by Martin Fowler (Addison-Wesley, ISBN: 0-32112-742-0). Code examples in Fowler's book are in Java or C#, but are still quite readable for a PHP developer.
+
+### Symfony's MVC Implementation
+
+Hold on a minute. For a single page listing the posts in a weblog, how many components are required? As illustrated in Figure 2-2, we have the following parts:
+
+  * Model layer
+    * Database abstraction
+    * Data access
+  * View layer
+    * View
+    * Template
+    * Layout
+  * Controller layer
+    * Front controller
+    * Action
+
+Seven scripts--a whole lot of files to open and to modify each time you create a new page! However, symfony makes things easy. While taking the best of the MVC architecture, symfony implements it in a way that makes application development fast and painless.
+
+First of all, the front controller and the layout are common to all actions in an application. You can have multiple controllers and layouts, but you need only one of each. The front controller is pure MVC logic component, and you will never need to write a single one, because symfony will generate it for you.
+
+The other good news is that the classes of the model layer are also generated automatically, based on your data structure. This is the job of the Propel library, which provides class skeletons and code generation. If Propel finds foreign key constraints or date fields, it will provide special accessor and mutator methods that will make data manipulation a piece of cake. And the database abstraction is totally invisible to you, because it is dealt with by another component, called Creole. So if you decide to change your database engine at one moment, you have zero code to rewrite. You just need to change one configuration parameter.
+
+And the last thing is that the view logic can be easily translated as a simple configuration file, with no programming needed.
+
+Figure 2-2 - Symfony workflow
+
+![Symfony workflow](/images/book/F0202.png "Symfony workflow")
+
+That means that the list of posts described in our example would require only three files to work in symfony, as shown in Listings 2-11, 2-12, and 2-13.
+
+Listing 2-11 - `list` Action, in `myproject/apps/myapp/modules/weblog/actions/actions.class.php`
+
+    [php]
+    <?php
+    class weblogActions extends sfActions
+    {
+      public function executeList()
+      {
+        $this->posts = PostPeer::doSelect(new Criteria());
+      }
+    }
+
+    ?>
+
+Listing 2-12 - `list` Template, in `myproject/apps/myapp/modules/weblog/templates/listSuccess.php`
+
+    [php]
+    <h1>List of Posts</h1>
+    <table>
+    <tr><th>Date</th><th>Title</th></tr>
+    <?php foreach ($posts as $post): ?>
+      <tr>
+        <td><?php echo $post->getDate() ?></td>
+        <td><?php echo $post->getTitle() ?></td>
+      </tr>
+    <?php endforeach; ?>
+    </table>
+
+Listing 2-13 - `list` View, in `myproject/apps/myapp/modules/weblog/config/view.yml`
+
+    listSuccess:
+      metas: { title: List of Posts }
+
+In addition, you will still need to define a layout, as shown in Listing 2-14, but it will be reused many times.
+
+Listing 2-14 - Layout, in `myproject/apps/myapp/templates/layout.php`
+
+    [php]
+    <html>
+      <head>
+        <?php echo include_title() ?>
+      </head>
+      <body>
+        <?php echo $sf_data->getRaw('sf_content') ?>
+      </body>
+    </html>
+
+And that is really all you need. This is the exact code required to display the very same page as the flat script shown earlier in Listing 2-1. The rest (making all the components work together) is handled by symfony. If you count the lines, you will see that creating the list of posts in an MVC architecture with symfony doesn't require more time or coding than writing a flat file. Nevertheless, it gives you huge advantages, notably clear code organization, reusability, flexibility, and much more fun. And as a bonus, you have XHTML conformance, debug capabilities, easy configuration, database abstraction, smart URL routing, multiple environments, and many more development tools.
+
+### Symfony Core Classes
+
+The MVC implementation in symfony uses several classes that you will meet quite often in this book:
+
+  * `sfController` is the controller class. It decodes the request and hands it to the action.
+  * `sfRequest` stores all the request elements (parameters, cookies, headers, and so on).
+  * `sfResponse` contains the response headers and contents. This is the object that will eventually be converted to an HTML response and be sent to the user.
+  * The context singleton (retrieved by `sfContext::getInstance()`) stores a reference to all the core objects and the current configuration; it is accessible from everywhere.
+
+You will learn more about these objects in Chapter 6.
+
+As you can see, all the symfony classes use the `sf` prefix, as do the symfony core variables in the templates. This should avoid name collisions with your own classes and variables, and make the core framework classes sociable and easy to recognize.
+
+>**NOTE**
+>Among the coding standards used in symfony, UpperCamelCase is the standard for class and variable naming. Two exceptions exist: core symfony classes start with `sf`, which is lowercase, and variables found in templates use the underscore-separated syntax.
+
+Code Organization
+-----------------
+
+Now that you know the different components of a symfony application, you're probably wondering how they are organized. Symfony organizes code in a project structure and puts the project files into a standard tree structure.
+
+### Project Structure: Applications, Modules, and Actions
+
+In symfony, a project is a set of services and operations available under a given domain name, sharing the same object model.
+
+Inside a project, the operations are grouped logically into applications. An application can normally run independently of the other applications of the same project. In most cases, a project will contain two applications: one for the front-office and one for the back-office, sharing the same database. But you can also have one project containing many mini-sites, with each site as a different application. Note that hyperlinks between applications must be in the absolute form.
+
+Each application is a set of one or more modules. A module usually represents a page or a group of pages with a similar purpose. For example, you might have the modules `home`, `articles`, `help`, `shoppingCart`, `account`, and so on.
+
+Modules hold actions, which represent the various actions that can be done in a module. For example, a `shoppingCart` module can have `add`, `show`, and `update` actions. Generally, actions can be described by a verb. Dealing with actions is almost like dealing with pages in a classic web application, although two actions can result in the same page (for instance, adding a comment to a post in a weblog will redisplay the post with the new comment).
+
+>**TIP**
+>If this represents too many levels for a beginning project, it is very easy to group all actions into one single module, so that the file structure can be kept simple. When the application gets more complex, it will be time to organize actions into separate modules. As mentioned in Chapter 1, rewriting code to improve its structure or readability (but preserving its behavior) is called refactoring, and you will do this a lot when applying RAD principles.
+
+Figure 2-3 shows a sample code organization for a weblog project, in a project/ application/module/action structure. But be aware that the actual file tree structure of the project will differ from the setup shown in the figure.
+
+Figure 2-3 - Example of code organization
+
+![Example of code organization](/images/book/F0203.png "Example of code organization")
+
+### File Tree Structure
+
+All web projects generally share the same types of contents, such as the following:
+
+  * A database, such as MySQL or PostgreSQL
+  * Static files (HTML, images, JavaScript files, style sheets, and so on)
+  * Files uploaded by the site users and administrators
+  * PHP classes and libraries
+  * Foreign libraries (third-party scripts)
+  * Batch files (scripts to be launched by a command line or via a cron table)
+  * Log files (traces written by the application and/or the server)
+  * Configuration files
+
+Symfony provides a standard file tree structure to organize all these contents in a logical way, consistent with the architecture choices (MVC pattern and project/application/module grouping). This is the tree structure that is automatically created when initializing every project, application, or module. Of course, you can customize it completely, to reorganize the files and directories at your convenience or to match your client's requirements.
+
+#### Root Tree Structure
+
+These are the directories found at the root of a symfony project:
+
+    apps/
+      frontend/
+      backend/
+    batch/
+    cache/
+    config/
+    data/
+      sql/
+    doc/
+    lib/
+      model/
+    log/
+    plugins/
+    test/
+      unit/
+      functional/
+    web/
+      css/
+      images/
+      js/
+      uploads/
+
+Table 2-1 describes the contents of these directories.
+
+Table 2-1 - Root Directories
+
+Directory  |  Description
+---------- | ------------
+`apps/`    | Contains one directory for each application of the project (typically, `frontend` and `backend` for the front and back office).
+`batch/`   | Contains PHP scripts called from a command line or a scheduler, to run batch processes.
+`cache/`   | Contains the cached version of the configuration, and (if you activate it) the cache version of the actions and templates of the project. The cache mechanism (detailed in Chapter 12) uses these files to speed up the answer to web requests. Each application will have a subdirectory here, containing preprocessed PHP and HTML files.
+`config/`  | Holds the general configuration of the project.
+`data/`    | Here, you can store the data files of the project, like a database schema, a SQL file that creates tables, or even a SQLite database file.
+`doc/`     | Stores the project documentation, including your own documents and the documentation generated by PHPdoc.
+`lib/`     | Dedicated to foreign classes or libraries. Here, you can add the code that needs to be shared among your applications. The `model/` subdirectory stores the object model of the project (described in Chapter 8).
+`log/`     | Stores the applicable log files generated directly by symfony. It can also contain web server log files, database log files, or log files from any part of the project. Symfony creates one log file per application and per environment (log files are discussed in Chapter 16).
+`plugins/` | Stores the plug-ins installed in the application (plug-ins are discussed in Chapter 17).
+`test/`    | Contains unit and functional tests written in PHP and compatible with the symfony testing framework (discussed in Chapter 15). During the project setup, symfony automatically adds some stubs with a few basic tests.
+`web/`     | The root for the web server. The only files accessible from the Internet are the ones located in this directory.
+
+#### Application Tree Structure
+
+The tree structure of all application directories is the same:
+
+    apps/
+      [application name]/
+        config/
+        i18n/
+        lib/
+        modules/
+        templates/
+          layout.php
+          error.php
+          error.txt
+
+Table 2-2 describes the application subdirectories.
+
+Table 2-2 - Application Subdirectories
+
+Directory    | Description
+------------ | -----------
+`config/`    | Holds a hefty set of YAML configuration files. This is where most of the application configuration is, apart from the default parameters that can be found in the framework itself. Note that the default parameters can still be overridden here if needed. You'll learn more about application configuration in the Chapter 5.
+`i18n/`      | Contains files used for the internationalization of the application--mostly interface translation files (Chapter 13 deals with internationalization). You can bypass this directory if you choose to use a database for internationalization.
+`lib/`       | Contains classes and libraries that are specific to the application.
+`modules/`   | Stores all the modules that contain the features of the application.
+`templates/` | Lists the global templates of the application--the ones that are shared by all modules. By default, it contains a `layout.php` file, which is the main layout in which the module templates are inserted.
+
+>**NOTE**
+>The `i18n/`, `lib/`, and `modules/` directories are empty for a new application.
+
+The classes of an application are not able to access methods or attributes in other applications of the same project. Also note that hyperlinks between two applications of the same project must be in absolute form. You need to keep this last constraint in mind during initialization, when you choose how to divide your project into applications.
+
+#### Module Tree Structure
+
+Each application contains one or more modules. Each module has its own subdirectory in the `modules` directory, and the name of this directory is chosen during the setup.
+
+This is the typical tree structure of a module:
+
+    apps/
+      [application name]/
+        modules/
+          [module name]/
+              actions/
+                actions.class.php
+              config/
+              lib/
+              templates/
+                indexSuccess.php
+              validate/
+
+Table 2-3 describes the module subdirectories.
+
+Table 2-3 -  Module Subdirectories
+
+Directory    | Description
+------------ | ------------
+`actions/`   | Generally contains a single class file named `actions.class.php`, in which you can store all the actions of the module. You can also write different actions of a module in separate files.
+`config/`    | Can contain custom configuration files with local parameters for the module.
+`lib/`       | Stores classes and libraries specific to the module.
+`templates/` | Contains the templates corresponding to the actions of the module. A default template, called `indexSuccess.php`, is created during module setup.
+`validate/`  | Dedicated to configuration files used for form validation (discussed in Chapter 10).
+
+>**NOTE**
+>The `config/`, `lib/`, and `validate/` directories are empty for a new module.
+
+#### Web Tree Structure
+
+There are very few constraints for the `web` directory, which is the directory of publicly accessible files. Following a few basic naming conventions will provide default behaviors and useful shortcuts in the templates. Here is an example of a `web` directory structure:
+
+    web/
+      css/
+      images/
+      js/
+      uploads/
+
+Conventionally, the static files are distributed in the directories listed in Table 2-4.
+
+Table 2-4 - Typical Web Subdirectories
+
+Directory  | Description
+---------- | -----------
+`css/`     | Contains style sheets with a `.css` extension.
+`images/`  | Contains images with a `.jpg`, `.png`, or `.gif` format.
+`js/`      | Holds JavaScript files with a `.js` extension.
+`uploads/` | Must contain the files uploaded by the users. Even though the directory usually contains images, it is distinct from the images directory so that the synchronization of the development and production servers does not affect the uploaded images.
+
+>**NOTE**
+>Even though it is highly recommended that you maintain the default tree structure, it is possible to modify it for specific needs, such as to allow a project to run in a server with different tree structure rules and coding conventions. Refer to Chapter 19 for more information about modifying the file tree structure.
+
+Common Instruments
+------------------
+
+A few techniques are used repeatedly in symfony, and you will meet them quite often in this book and in your own projects. These include parameter holders, constants, and class autoloading.
+
+### Parameter Holders
+
+Many of the symfony classes contain a parameter holder. It is a convenient way to encapsulate attributes with clean getter and setter methods. For instance, the sfResponse class holds a parameter holder that you can retrieve by calling the `getParameterHolder()` method. Each parameter holder stores data the same way, as illustrated in Listing 2-15.
+
+Listing 2-15 - Using the `sfResponse` Parameter Holder
+
+    [php]
+    $response->getParameterHolder()->set('foo', 'bar');
+    echo $response->getParameterHolder()->get('foo');
+     => 'bar'
+
+Most of the classes using a parameter holder provide proxy methods to shorten the code needed for get/set operations. This is the case for the `sfResponse` object, so you can do the same as in Listing 2-15 with the code of Listing 2-16.
+
+Listing 2-16 - Using the `sfResponse` Parameter Holder Proxy Methods
+
+    [php]
+    $response->setParameter('foo', 'bar');
+    echo $response->getParameter('foo');
+     => 'bar'
+
+The parameter holder getter accepts a default value as a second argument. This provides a useful fallback mechanism that is much more concise than possible with a conditional statement. See Listing 2-17 for an example.
+
+Listing 2-17 - Using the Attribute Holder Getter's Default Value
+
+    [php]
+    // The 'foobar' parameter is not defined, so the getter returns an empty value
+    echo $response->getParameter('foobar');
+     => null
+
+    // A default value can be used by putting the getter in a condition
+    if ($response->hasParameter('foobar'))
+    {
+      echo $response->getParameter('foobar');
+    }
+    else
+    {
+      echo 'default';
+    }
+     => default
+
+    // But it is much faster to use the second getter argument for that
+    echo $response->getParameter('foobar', 'default');
+     => default
+
+The parameter holders even support namespaces. If you specify a third argument to a setter or a getter, it is used as a namespace, and the parameter will be defined only within that namespace. Listing 2-18 shows an example.
+
+Listing 2-18 - Using the `sfResponse` Parameter Holder Namespace
+
+    [php]
+    $response->setParameter('foo', 'bar1');
+    $response->setParameter('foo', 'bar2', 'my/name/space');
+    echo $response->getParameter('foo');
+     => 'bar1'
+    echo $response->getParameter('foo', null, 'my/name/space');
+     => 'bar2'
+
+Of course, you can add a parameter holder to your own classes to take advantage of its syntax facilities. Listing 2-19 shows how to define a class with a parameter holder.
+
+Listing 2-19 - Adding a Parameter Holder to a Class
+
+    [php]
+    class MyClass
+    {
+      protected $parameter_holder = null;
+
+      public function initialize ($parameters = array())
+      {
+        $this->parameter_holder = new sfParameterHolder();
+        $this->parameter_holder->add($parameters);
+      }
+
+      public function getParameterHolder()
+      {
+        return $this->parameter_holder;
+      }
+    }
+
+### Constants
+
+Surprisingly, you will find very few constants in symfony. This is because constants have a major drawback in PHP: you can't change their value once they are defined. So symfony uses its own configuration object, called sfConfig, which replaces constants. It provides static methods to access parameters from everywhere. Listing 2-20 demonstrates the use of sfConfig class methods.
+
+Listing 2-20 - Using the `sfConfig` Class Methods Instead of Constants
+
+    [php]
+    // Instead of PHP constants,
+    define('SF_FOO', 'bar');
+    echo SF_FOO;
+    // Symfony uses the sfConfig object
+    sfConfig::set('sf_foo', 'bar');
+    echo sfConfig::get('sf_foo');
+
+The sfConfig methods support default values, and you can call the sfConfig::set() method more than once on the same parameter to change its value. Chapter 5 discusses `sfConfig` methods in more detail.
+
+### Class Autoloading
+
+Classically, when you use a class method or create an object in PHP, you need to include the class definition first.
+
+    [php]
+    include 'classes/MyClass.php';
+    $myObject = new MyClass();
+
+But on large projects with many classes and a deep directory structure, keeping track of all the class files to include and their paths takes a lot of time. By providing an __autoload() function (or a `spl_autoload_register()` function), symfony makes `include` statements unnecessary, and you can write directly:
+
+    [php]
+    $myObject = new MyClass();
+
+Symfony will then look for a `MyClass` definition in all files ending with `php` in one of the project's `lib/` directories. If the class definition is found, it will be included automatically.
+
+So if you store all your classes in lib/ directories, you don't need to include classes anymore. That's why the symfony projects usually do not contain any `include` or `require` statements.
+
+>**NOTE**
+>For better performance, the symfony autoloading scans a list of directories (defined in an internal configuration file) during the first request. It then registers all the classes these directories contain and stores the class/file correspondence in a PHP file as an associative array. That way, future requests don't need to do the directory scan anymore. This is why you need to clear the cache every time you add or move a class file in your project by calling the `symfony clear-cache` command. You will learn more about the cache in Chapter 12, and about the autoloading configuration in Chapter 19.
+
+Summary
+-------
+
+Using an MVC framework forces you to divide and organize your code according to the framework conventions. Presentation code goes to the view, data manipulation code goes to the model, and the request manipulation logic goes to the controller. It makes the application of the MVC pattern both very helpful and quite restricting.
+
+Symfony is an MVC framework written in PHP 5. Its structure is designed to get the best of the MVC pattern, but with great ease of use. Thanks to its versatility and configurability, symfony is suitable for all web application projects.
+
+Now that you understand the underlying theory behind symfony, you are almost ready to develop your first application. But before that, you need a symfony installation up and running on your development server.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/03-Running-Symfony.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/03-Running-Symfony.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/03-Running-Symfony.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,428 @@
+Chapter 3 - Running Symfony
+===========================
+
+As you've learned in previous chapters, the symfony framework is a set of files written in PHP. A symfony project uses these files, so installing symfony means getting these files and making them available for the project.
+
+Being a PHP 5 framework, symfony requires PHP 5. Make sure you have it installed by opening a command line and typing this command:
+
+    > php -v
+
+    PHP 5.2.0 (cli) (built: Nov 2 2006 11:57:36)
+    Copyright (c) 1997-2006 The PHP Group
+    Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies
+
+If the version number is 5.0 or higher, then you're ready for the installation, as described in this chapter.
+
+Installing the Sandbox
+----------------------
+
+If you just want to see what symfony is capable of, you'll probably go for the fast installation. In that case, you need the sandbox.
+
+The sandbox is a simple archive of files. It contains an empty symfony project including all the required libraries (symfony, pake, lime, Creole, Propel, and Phing), a default application, and basic configuration. It will work out of the box, without specific server configuration or any additional packages.
+
+To install it, download the sandbox archive from [http://www.symfony-project.com/get/sf_sandbox.tgz](http://www.symfony-project.com/get/sf_sandbox.tgz). Unpack it under the root web directory configured for your server (usually `web/` or `www/`). For the purposes of uniformity, this chapter will assume you unpacked it to the directory `sf_sandbox/`.
+
+>**CAUTION**
+>Having all the files under the root web directory is fine for your own tests in a local host, but is a bad practice in a production server. It makes all the internals of your application visible to end users.
+
+Test your installation by executing the symfony CLI. Go to the new `sf_sandbox/` directory and type the following on a *nix system:
+
+    > ./symfony -V
+
+On Windows, issue this command:
+
+    > symfony -V
+
+You should see the sandbox version number:
+
+    symfony version 1.0.0
+
+Now make sure that your web server can browse the sandbox by requesting this URL:
+
+    http://localhost/sf_sandbox/web/frontend_dev.php/
+
+You should see a congratulations page that looks like Figure 3-1, and it means that your installation is finished. If not, then an error message will guide you through the configuration changes needed. You can also refer to the "Troubleshooting" section later in this chapter.
+
+Figure 3-1 - Sandbox congratulations page
+
+![Sandbox congratulations page](/images/book/F0301.jpg "Sandbox congratulations page")
+
+The sandbox is intended for you to practice with symfony on a local computer, not to develop complex applications that may end up on the Web. However, the version of symfony shipped with the sandbox is fully functional and equivalent to the one you can install via PEAR.
+
+To uninstall a sandbox, just remove the `sf_sandbox/` directory from your `web/` folder.
+
+Installing the Symfony Libraries
+--------------------------------
+
+When developing an application, you will probably need to install symfony twice: once for your development environment and once for the host server (unless your host already has symfony installed). For each server, you will probably want to avoid duplication by keeping all the symfony files in a single place, whether you develop only one application or several applications.
+
+Since the symfony framework evolves quickly, a new stable version could very well be released only a few days after your first installation. You need to think of the framework upgrade as a major concern, and that's another reason why you should share one instance of the symfony libraries across all your symfony projects.
+
+When it comes to installing the libraries for a real application development, you have two alternatives:
+
+  * The PEAR installation is recommended for most people. It can be easily shared and upgraded, and the installation process is straightforward.
+  * The Subversion (SVN) installation is meant to be used only by advanced PHP developers, who want to take advantage of the latest patches, add features of their own, and/or contribute to the symfony project.
+
+Symfony integrates a few other packages:
+
+  * pake is a CLI utility.
+  * lime is a unit testing utility.
+  * Creole is a database abstraction engine. Just like PHP Data Objects (PDO), it provides an interface between your code and the database SQL code, and makes it possible to switch to another engine.
+  * Propel is for ORM. It provides object persistence and query service.
+  * Phing is a CLI for Propel.
+
+Pake and lime are developed by the symfony team. Creole, Propel, and Phing come from another team and are released under the GNU Lesser Public General License (LGPL). All these packages are bundled with symfony.
+
+### Installing the Symfony PEAR Package
+
+The symfony PEAR package contains the symfony libraries and all its dependencies. It also contains a script that will extend your CLI to include the `symfony` command.
+
+The first step to install it is to add the symfony channel to PEAR, by issuing this command:
+
+    > pear channel-discover pear.symfony-project.com
+
+To see the libraries available in this channel, type the following:
+
+    > pear remote-list -c symfony
+
+Now you are ready to install the latest stable version of symfony. Issue this command:
+
+    > pear install symfony/symfony
+
+    downloading symfony-1.0.0.tgz ...
+    Starting to download symfony-1.0.0.tgz (1,283,270 bytes)
+    .................................................................
+    .................................................................
+    .............done: 1,283,270 bytes
+    install ok: channel://pear.symfony-project.com/symfony-1.0.0
+
+That's it. The symfony files and CLI are installed. Check that the installation succeeded by calling the new `symfony` command line, asking for the version number:
+
+    > symfony -V
+
+    symfony version 1.0.0
+
+>**TIP**
+>If you prefer to install the most recent beta, which has the latest bug fixes and enhancements, type `pear install symfony/symfony-beta` instead. Beta releases are not completely stable and are generally not recommended for production environments.
+
+The symfony libraries are now installed in directories as follows:
+
+  * `$php_dir/symfony/` contains the main libraries.
+  * `$data_dir/symfony/` contains the skeleton of symfony applications; default modules; and configuration, i18n data, and so on.
+  * `$doc_dir/symfony/` contains the documentation.
+  * `$test_dir/symfony/` contains unit tests.
+
+The _dir variables are part of your PEAR configuration. To see their values, type the following:
+
+    > pear config-show
+
+### Checking Out Symfony from the SVN Repository
+
+For production servers, or when PEAR is not an option, you can download the latest version of the symfony libraries directly from the symfony Subversion repository by requesting a checkout:
+
+    > mkdir /path/to/symfony
+    > cd /path/to/symfony
+    > svn checkout http://svn.symfony-project.com/tags/RELEASE_1_0_0/ .
+
+The `symfony` command, available only for PEAR installations, is a call to the `/path/to/symfony/data/bin/symfony` script. So the following would be the equivalent to the `symfony -V` command for an SVN installation:
+
+    > php /path/to/symfony/data/bin/symfony -V
+
+    symfony version 1.0.0
+
+If you chose an SVN installation, you probably already have an existing symfony project. For this project to make use of the symfony files, you need to change the two variables defined in your project's `config/config.php` file, as follows:
+
+    [php]
+    <?php
+
+    $sf_symfony_lib_dir  = '/path/to/symfony/lib/';
+    $sf_symfony_data_dir = '/path/to/symfony/data/';
+
+Chapter 19 proposes other ways to link a project with a symfony installation (including symbolic links and relative paths).
+
+>**TIP**
+>Alternatively, you can also download the PEAR package ([http://pear.symfony-project.com/get/symfony-1.0.0.tgz](http://pear.symfony-project.com/get/symfony-1.0.0.tgz)) and unpack it somewhere. You will have the same result as with a checkout.
+
+Setting Up an Application
+-------------------------
+
+As you learned in Chapter 2, symfony gathers related applications in projects. All the applications of a project share the same databases. In order to set up an application, you must first set up a project.
+
+### Creating the Project
+
+Each symfony project follows a predefined directory structure. The symfony command line automates the creation of new projects by initiating the skeleton of the project, with the proper tree structure and access rights. So to create a project, simply create a new directory and ask symfony to make it a project.
+
+For a PEAR installation, issue these commands:
+
+    > mkdir ~/myproject
+    > cd ~/myproject
+    > symfony init-project myproject
+
+For an SVN installation, create a project with these commands:
+
+    > mkdir ~/myproject
+    > cd ~/myproject
+    > php /path/to/symfony/data/bin/symfony init-project myproject
+
+The `symfony` command must always be called from the project's root directory (`myproject/` in the preceding examples), because all the tasks performed by this command are project-specific.
+
+Symfony will create a directory structure that looks like this:
+
+    apps/
+    batch/
+    cache/
+    config/
+    data/
+    doc/
+    lib/
+    log/
+    plugins/
+    test/
+    web/
+
+>**TIP**
+>The `init-project` task adds a `symfony` script in the project root directory. This PHP script does the same as the `symfony` command installed by PEAR, so you can call `php symfony` instead of `symfony` if you don't have native command-line support (for SVN installations).
+
+### Creating the Application
+
+The project is not yet ready to be viewed, because it requires at least one application. To initialize it, use the `symfony init-app` command and pass the name of the application as an argument:
+
+    > symfony init-app myapp
+
+This will create a `myapp/` directory in the `apps/` folder of the project root, with a default application configuration and a set of directories ready to host the file of your website:
+
+    apps/
+      myapp/
+        config/
+        i18n/
+        lib/
+        modules/
+        templates/
+
+Some PHP files corresponding to the front controllers of each default environment are also created in the project `web` directory:
+
+    web/
+      index.php
+      myapp_dev.php
+
+`index.php` is the production front controller of the new application. Because you created the first application of the project, symfony created a file called `index.php` instead of `myapp.php` (if you now add a new application called `mynewapp`, the new production front controller will be named `mynewapp.php`). To run your application in the development environment, call the front controller `myapp_dev.php`. You'll learn more about these environments in Chapter 5.
+
+Configuring the Web Server
+--------------------------
+
+The scripts of the `web/` directory are the entry points to the application. To be able to access them from the Internet, the web server must be configured. In your development server, as well as in a professional hosting solution, you probably have access to the Apache configuration and you can set up a virtual host. On a shared-host server, you probably have access only to an `.htaccess` file.
+
+### Setting Up a Virtual Host
+
+Listing 3-1 is an example of Apache configuration, where a new virtual host is added in the `httpd.conf` file.
+
+Listing 3-1 - Sample Apache Configuration, in `apache/conf/httpd.conf`
+
+    <VirtualHost *:80>
+      ServerName myapp.example.com
+      DocumentRoot "/home/steve/myproject/web"
+      DirectoryIndex index.php
+      Alias /sf /$sf_symfony_data_dir/web/sf
+      <Directory "/$sf_symfony_data_dir/web/sf">
+        AllowOverride All
+        Allow from All
+      </Directory>
+      <Directory "/home/steve/myproject/web">
+        AllowOverride All
+        Allow from All
+      </Directory>
+    </VirtualHost>
+
+In the configuration in Listing 3-1, the `/path/to/symfony/data` placeholder must be replaced by the actual path. For example, for a PEAR installation in *nix, you should type something like this:
+
+        Alias /sf /usr/local/lib/php/data/symfony/web/sf
+
+>**NOTE**
+>The alias to the `web/sf/` directory is not mandatory. It allows Apache to find images, style sheets, and JavaScript files for the web debug toolbar, the admin generator, the default symfony pages, and the Ajax support. An alternative to this alias would be to create a symbolic link (symlink) or copy the `/path/to/symfony/data/web/sf/` directory to `myproject/web/sf/`.
+
+Restart Apache, and that's it. Your newly created application can now be called and viewed through a standard web browser at the following URL:
+
+    http://localhost/myapp_dev.php/
+
+You should see a congratulations page similar to the one shown earlier in Figure 3-1.
+
+>**SIDEBAR**
+>URL Rewriting
+>
+>Symfony uses URL rewriting to display "smart URLs"--meaningful locations that display well on search engines and hide all the technical data from the user. You will learn more about this feature, called routing, in Chapter 9.
+>
+>If your version of Apache is not compiled with the `mod_rewrite` module, check that you have the `mod_rewrite` Dynamic Shared Object (DSO) installed and the following lines in your `httpd.conf`:
+>
+>
+>    AddModule mod_rewrite.c
+>    LoadModule rewrite_module modules/mod_rewrite.so
+>
+>
+>For Internet Information Services (IIS), you will need `isapi/rewrite` installed and running. Check the symfony online documentation for a detailed IIS installation guide.
+
+### Configuring a Shared-Host Server
+
+Setting up an application in a shared host is a little trickier, since the host usually has a specific directory layout that you can't change.
+
+>**CAUTION**
+>Doing tests and development directly in a shared host is not a good practice. One reason is that it makes the application visible even if it is not finished, revealing its internals and opening large security breaches. Another reason is that the performance of shared hosts is often not sufficient to browse your application with the debug tools on efficiently. So you should not start your development with a shared-host installation, but rather build your application locally and deploy it to the shared host when it is finished. Chapter 16 will tell you more about deployment techniques and tools.
+
+Let's imagine that your shared host requires that the web folder is named `www/` instead of `web/`, and that it doesn't give you access to the `httpd.conf` file, but only to an `.htaccess` file in the web folder.
+
+In a symfony project, every path to a directory is configurable. Chapter 19 will tell you more about it, but in the meantime, you can still rename the `web` directory to `www` and have the application take it into account by changing the configuration, as shown in Listing 3-2. These lines are to be added to the end of the application `config.php` file.
+
+Listing 3-2 - Changing the Default Directory Structure Settings, in `apps/myapp/config/config.php`
+
+    [php]
+    $sf_root_dir = sfConfig::get('sf_root_dir');
+    sfConfig::add(array(
+      'sf_web_dir_name' => $sf_web_dir_name = 'www',
+      'sf_web_dir'      => $sf_root_dir.DIRECTORY_SEPARATOR.$sf_web_dir_name,
+      'sf_upload_dir'   => $sf_root_dir.DIRECTORY_SEPARATOR.$sf_web_dir_name.DIRECTORY_SEPARATOR.sfConfig::get('sf_upload_dir_name'),
+    ));
+
+The project web root contains an .htaccess file by default. It is shown in Listing 3-3. Modify it as necessary to match your shared host requirements.
+
+Listing 3-3 - Default `.htaccess` Configuration, Now in `myproject/www/.htaccess`
+
+    Options +FollowSymLinks +ExecCGI
+
+    <IfModule mod_rewrite.c>
+      RewriteEngine On
+
+      # we skip all files with .something
+      RewriteCond %{REQUEST_URI} \..+$
+      RewriteCond %{REQUEST_URI} !\.html$
+      RewriteRule .* - [L]
+
+      # we check if the .html version is here (caching)
+      RewriteRule ^$ index.html [QSA]
+      RewriteRule ^([^.]+)$ $1.html [QSA]
+      RewriteCond %{REQUEST_FILENAME} !-f
+
+      # no, so we redirect to our front web controller
+      RewriteRule ^(.*)$ index.php [QSA,L]
+    </IfModule>
+
+    # big crash from our front web controller
+    ErrorDocument 500 "<h2>Application error</h2>symfony applicationfailed to start properly"
+
+You should now be ready to browse your application. Check the congratulation page by requesting this URL:
+
+    http://www.example.com/myapp_dev.php/
+
+>**SIDEBAR**
+>Other Server Configurations
+>
+>Symfony is compatible with other server configurations. You can, for instance, access a symfony application using an alias instead of a virtual host. You can also run a symfony application with an IIS server. There are as many techniques as there are configurations, and it is not the purpose of this book to explain them all.
+>
+>To find directions for a specific server configuration, refer to the symfony wiki ([http://www.symfony-project.com/trac/wiki](http://www.symfony-project.com/trac/wiki)), which contains many step-by-step tutorials.
+
+Troubleshooting
+---------------
+
+If you encounter problems during the installation, try to make the best out of the errors or exceptions thrown to the shell or to the browser. They are often self-explanatory and may even contain links to specific resources on the Web about your issue.
+
+### Typical Problems
+
+If you are still having problems getting symfony running, check the following:
+
+  * Some PHP installations come with both a PHP 4 and a PHP 5 command. In that case, the command line is probably `php5` instead of `php`, so try calling `php5 symfony` instead of the `symfony` command. You may also need to add `SetEnv PHP_VER 5` to your `.htaccess` configuration, or rename the scripts of the `web/` directory from `.php` to `.php5`. The error thrown by a PHP 4 command line trying to access symfony looks like this:
+
+        Parse error, unexpected ',', expecting '(' in .../symfony.php on line 19.
+
+  * The memory limit, defined in the `php.ini`, must be set to `16M` at least. The usual symptom for this problem is an error message when installing symfony via PEAR or using the command line.
+
+        Allowed memory size of 8388608 bytes exhausted
+
+  * The `zend.ze1_compatibility_mode` setting must be set to `off` in your `php.ini`. If it is not, trying to browse to one of the web scripts will produce an "implicit cloning" error:
+
+        Strict Standards: Implicit cloning object of class 'sfTimer'because of 'zend.ze1_compatibility_mode'
+
+  * The `log/` and `cache/` directories of your project must be writable by the web server. Attempts to browse a symfony application without these directory permissions will result in an exception:
+
+        sfCacheException [message] Unable to write cache file"/usr/myproject/cache/frontend/prod/config/config_config_handlers.yml.php"
+
+  * The include path of your system must include the path to the `php` command, and the include path of your `php.ini` must contain a path to PEAR (if you use PEAR).
+  * Sometimes, there is more than one `php.ini` on a server's file system (for instance, if you use the WAMP package). Call `phpinfo()` to know the exact location of the `php.ini` file used by your application.
+
+>**NOTE**
+>Although it is not mandatory, it is strongly advised, for performance reasons, to set the `magic_quotes_gpc` and `register_globals` settings to `off` in your `php.ini`.
+
+### Symfony Resources
+
+You can check if your problem has already happened to someone else and find solutions in various places:
+
+  * The symfony installation forum ([http://www.symfony-project.com/forum/](http://www.symfony-project.com/forum/)) is full of installation questions about a given platform, environment, configuration, host, and so on.
+  * The archives of the users mailing-list ([http://groups.google.fr/group/symfony-users](http://groups.google.fr/group/symfony-users)) are also searchable. You may find similar experiences to your own there.
+  * The symfony wiki ([http://www.symfony-project.com/trac/wiki#Installingsymfony](http://www.symfony-project.com/trac/wiki#Installingsymfony)) contains step-by-step tutorials, contributed by symfony users, about installation.
+
+If you don't find any answer, try posing your question to the symfony community. You can post your query in the forum, the mailing list, or even drop to the `#symfony` IRC channel to get feedback from the most active members of the community.
+
+Source Versioning
+-----------------
+
+Once the setup of the application is done, starting a source versioning (or version control) process is recommended. Source versioning keeps track of all modifications in the code, gives access to previous releases, facilitates patching, and allows for efficient team work. Symfony natively supports CVS, although Subversion ([http://subversion.tigris.org/](http://subversion.tigris.org/)) is recommended. The following examples show the commands for Subversion, and assume that you already have a Subversion server installed and that you wish to create a new repository for your project. For Windows users, a recommended Subversion client is TortoiseSVN ([http://tortoisesvn.tigris.org/](http://tortoisesvn.tigris.org/)). For more information about source versioning and the commands used here, consult the Subversion documentation.
+
+The following example assumes that `$SVNREP_DIR` is defined as an environment variable. If you don't have it defined, you will need to substitute the actual location of the repository in place of `$SVNREP_DIR`.
+
+So let's create the new repository for the `myproject` project:
+
+    > svnadmin create $SVNREP_DIR/myproject
+
+Then the base structure (layout) of the repository is created with the `trunk`, `tags`, and `branches` directories with this pretty long command:
+
+    > svn mkdir -m "layout creation" file:///$SVNREP_DIR/myproject/trunk file:///$SVNREP_DIR/myproject/tags file:///$SVNREP_DIR/myproject/branches
+
+This will be your first revision. Now you need to import the files of the project except the cache and log temporary files:
+
+    > cd ~/myproject
+    > rm -rf cache/*
+    > rm -rf log/*
+    > svn import -m "initial import" . file:///$SVNREP_DIR/myproject/trunk
+
+Check the committed files by typing the following:
+
+    > svn ls file:///$SVNREP_DIR/myproject/trunk/
+
+That seems good. Now the SVN repository has the reference version (and the history) of all your project files. This means that the files of the actual `~/myproject/` directory need to refer to the repository. To do that, first rename the `myproject/` directory--you will erase it soon if everything works well--and do a checkout of the repository in a new directory:
+
+    > cd ~
+    > mv myproject myproject.origin
+    > svn co file:///$SVNREP_DIR/myproject/trunk myproject
+    > ls myproject
+
+That's it. Now you can work on the files located in ~`/myproject/` and commit your modifications to the repository. Don't forget to do some cleanup and erase the `myproject.origin/` directory, which is now useless.
+
+There is one remaining thing to set up. If you commit your working directory to the repository, you may copy some unwanted files, like the ones located in the `cache` and `log` directories of your project. So you need to specify an ignore list to SVN for this project. You also need to set full access to the `cache/` and `log/` directories again:
+
+    > cd ~/myproject
+    > chmod 777 cache
+    > chmod 777 log
+    > svn propedit svn:ignore log
+    > svn propedit svn:ignore cache
+
+The default text editor configured for SVN should launch. If this doesn't happen, make Subversion use your preferred editor by typing this:
+
+    > export SVN_EDITOR=<name of editor>
+    > svn propedit svn:ignore log
+    > svn propedit svn:ignore cache
+
+Now simply add all files from the subdirectories of `myproject/` that SVN should ignore when committing:
+
+    *
+
+Save and quit. You're finished.
+
+Summary
+-------
+
+To test and play with symfony on your local server, your best option for installation is definitely the sandbox, which contains a preconfigured symfony environment.
+
+For a real development or in a production server, opt for the PEAR installation or the SVN checkout. This will install the symfony libraries, and you still need to initialize a project and an application. The last step of the application setup is the server configuration, which can be done in many ways. Symfony works perfectly fine with a virtual host, and it is the recommended solution.
+
+If you have any problems during installation, you will find many tutorials and answers to frequently asked questions on the symfony website. If necessary, you can submit your problem to the symfony community, and you will get a quick and effective answer.
+
+Once your project is initiated, it is a good habit to start a version-control process.
+
+Now that you are ready to use symfony, it is time to see how to build a basic web application.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/04-The-Basics-of-Page-Creation.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/04-The-Basics-of-Page-Creation.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/04-The-Basics-of-Page-Creation.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,357 @@
+Chapter 4 - The Basics Of Page Creation
+=======================================
+
+Curiously, the first tutorial that programmers follow when learning a new language or a framework is the one that displays "Hello, world!" on the screen. It is strange to think of the computer as something that can greet the whole world, since every attempt in the artificial intelligence field has so far resulted in poor conversational abilities. But symfony isn't dumber than any other program, and the proof is, you can create a page that says "Hello, `<Your Name Here>`" with it.
+
+This chapter will teach you how to create a module, which is a structural element that groups pages. You will also learn how to create a page, which is divided into an action and a template, because of the MVC pattern. Links and forms are the basic web interactions; you will see how to insert them in a template and handle them in an action.
+
+Creating a Module Skeleton
+--------------------------
+
+As Chapter 2 explained, symfony groups pages into modules. Before creating a page, you need to create a module, which is initially an empty shell with a file structure that symfony can recognize.
+
+The symfony command line automates the creation of modules. You just need to call the `in`it-module task with the application name and the module name as arguments. In the previous chapter, you created a `myapp` application. To add a `mymodule` module to this application, type the following commands:
+
+    > cd ~/myproject
+    > symfony init-module myapp mymodule
+
+    >> dir+      ~/myproject/apps/myapp/modules/mymodule
+    >> dir+      ~/myproject/apps/myapp/modules/mymodule/actions
+    >> file+     ~/myproject/apps/myapp/modules/mymodule/actions/actions.class.php
+    >> dir+      ~/myproject/apps/myapp/modules/mymodule/config
+    >> dir+      ~/myproject/apps/myapp/modules/mymodule/lib
+    >> dir+      ~/myproject/apps/myapp/modules/mymodule/templates
+    >> file+     ~/myproject/apps/myapp/modules/mymodule/templates/indexSuccess.php
+    >> dir+      ~/myproject/apps/myapp/modules/mymodule/validate
+    >> file+     ~/myproject/test/functional/myapp/mymoduleActionsTest.php
+    >> tokens    ~/myproject/test/functional/myapp/mymoduleActionsTest.php
+    >> tokens    ~/myproject/apps/myapp/modules/mymodule/actions/actions.class.php
+    >> tokens    ~/myproject/apps/myapp/modules/mymodule/templates/indexSuccess.php
+
+Apart from the `actions/`, `config/`, `lib/`, `templates/`, and `validate/` directories, this command created only three files. The one in the test/ folder concerns unit tests, and you don't need to bother with it until Chapter 15. The `actions.class.php` (shown in Listing 4-1) forwards to the default module congratulation page. The `templates/indexSuccess.php` file is empty.
+
+Listing 4-1 - The Default Generated Action, in `actions/actions.class.php`
+
+    [php]
+    <?php
+
+    class mymoduleActions extends sfActions
+    {
+      public function executeIndex()
+      {
+        $this->forward('default', 'module');
+      }
+    }
+
+>**NOTE**
+>If you look at an actual `actions.class.php` file, you will find more than these few lines, including a lot of comments. This is because symfony recommends using PHP comments to document your project and prepares each class file to be compatible with the phpDocumentor tool ([http://www.phpdoc.org/](http://www.phpdoc.org/)).
+
+For each new module, symfony creates a default `index` action. It is composed of an action method called `executeIndex` and a template file called `indexSuccess.php`. The meanings of the `execute` prefix and `Success` suffix will be explained in Chapters 6 and 7, respectively. In the meantime, you can consider that this naming is a convention. You can see the corresponding page (reproduced in Figure 4-1) by browsing to the following URL:
+
+    http://localhost/myapp_dev.php/mymodule/index
+
+The default `index` action will not be used in this chapter, so you can remove the `executeIndex()` method from the `actions.class.php` file, and delete the `indexSuccess.php` file from the `templates/` directory.
+
+>**NOTE**
+>Symfony offers other ways to initiate a module than the command line. One of them is to create the directories and files yourself. In many cases, actions and templates of a module are meant to manipulate data of a given table. As the necessary code to create, retrieve, update, and delete records from a table is often the same, symfony provides a mechanism called scaffolding to generate this code for you. Refer to Chapter 14 for more information about this technique.
+
+Figure 4-1 - The default generated index page
+
+![The default generated index page](/images/book/F0401.jpg "The default generated index page")
+
+Adding a Page
+-------------
+
+In symfony, the logic behind pages is stored in the action, and the presentation is in templates. Pages without logic (still) require an empty action.
+
+### Adding an Action
+
+The "Hello, world!" page will be accessible through a `myAction` action. To create it, just add an `executeMyAction` method to the `mymoduleActions` class, as shown in Listing 4-2.
+
+Listing 4-2 - Adding an Action Is Like Adding an Execute Method to the Action Class
+
+    [php]
+    <?php
+
+    class mymoduleActions extends sfActions
+    {
+      public function executeMyAction()
+      {
+      }
+    }
+
+The name of the action method is always `execute``Xxx``()`, where the second part of the name is the action name with the first letter capitalized.
+
+Now, if you request the following URL:
+
+    http://localhost/myapp_dev.php/mymodule/myAction
+
+symfony will complain that the `myActionSuccess.php` template is missing. That's normal; in symfony, a page is always made of an action and a template.
+
+>**CAUTION**
+>URLs (not domain names) are case-sensitive, and so is symfony (even though the method names are case-insensitive in PHP). This means that if you add an `executemyaction()` method, or an `executeMyaction()`, and then you call `myAction` with the browser, symfony will return a 404 error.
+
+-
+
+>**SIDEBAR**
+>URLs are part of the response
+>
+>Symfony contains a routing system that allows you to have a complete separation between the actual action name and the form of the URL needed to call it. This allows for custom formatting of the URL as if it were part of the response. You are no longer limited by the file structure nor by the request parameters; the URL for an action can look like the phrase you want. For instance, the call to the index action of a module called article usually looks like this:
+>
+>     http://localhost/myapp_dev.php/article/index?id=123
+>
+>This URL retrieves a given article from a database. In this example, it retrieves an article (with `id=123`) in the Europe section that specifically discusses finance in France. But the URL can be written in a completely different way with a simple change in the `routing.yml` configuration file:
+>
+>     http://localhost/articles/europe/france/finance.html
+>
+>Not only is the resulting URL search engine-friendly, it is also significant for the user, who can then use the address bar as a pseudo command line to do custom queries, as in the following:
+>
+>     http://localhost/articles/tagged/finance+france+euro
+>
+>Symfony knows how to parse and generate smart URLs for the user. The routing system automatically peels the request parameters from a smart URL and makes them available to the action. It also formats the hyperlinks included in the response so that they look "smart." You will learn more about this feature in Chapter 9.
+>
+>Overall, this means that the way you name the actions of your applications should not be influenced by the way the URL used to call them should look, but by the actions' functions in the application. An action name explains what the action actually does, and it's often a verb in the infinitive form (like `show`, `list`, `edit`, and so on). Action names can be made totally invisible to the end user, so don't hesitate to use explicit action names (like `listByName` or `showWithComments`). You will economize on code comments to explain your action function, plus the code will be much easier to read.
+
+### Adding a Template
+
+The action expects a template to render itself. A template is a file located in the `templates/` directory of a module, named by the action and the action termination. The default action termination is a "success," so the template file to be created for the `myAction` action is to be called `myActionSuccess.php`.
+
+Templates are supposed to contain only presentational code, so keep as little PHP code in them as possible. As a matter of fact, a page displaying "Hello, world!" can have a template as simple as the one in Listing 4-3.
+
+Listing 4-3 - The `mymodule/templates/myActionSuccess.php` Template
+
+    [php]
+    <p>Hello, world!</p>
+
+If you need to execute some PHP code in the template, you should avoid using the usual PHP syntax, as shown in Listing 4-4. Instead, write your templates using the PHP alternative syntax, as shown in Listing 4-5, to keep the code understandable for non-PHP programmers. Not only will the final code be correctly indented, but it will also help you keep the complex PHP code in the action, because only control statements (`if`, `foreach`, `while`, and so on) have an alternative syntax.
+
+Listing 4-4 - The Usual PHP Syntax, Good for Actions, But Bad for Templates
+
+    [php]
+    <p>Hello, world!</p>
+    <?php
+
+    if ($test)
+    {
+      echo "<p>".time()."</p>";
+    }
+
+    ?>
+
+Listing 4-5 - The Alternative PHP Syntax, Good for Templates
+
+    [php]
+    <p>Hello, world!</p>
+    <?php if ($test): ?>
+    <p><?php echo time(); ?></p>
+    <?php endif; ?>
+
+>**TIP**
+>A good rule of thumb to check if the template syntax is readable enough is that the file should not contain HTML code echoed by PHP or curly brackets. And most of the time, when opening a `<?php`, you will close it with `?>` in the same line.
+
+### Passing Information from the Action to the Template
+
+The job of the action is to do all the complicated calculation, data retrieval, and tests, and to set variables for the template to be echoed or tested. Symfony makes the attributes of the action class (accessed via `$this->variableName` in the action) directly accessible to the template in the global namespace (via `$variableName`). Listings 4-6 and 4-7 show how to pass information from the action to the template.
+
+Listing 4-6 - Setting an Action Attribute in the Action to Make It Available to the Template
+
+    [php]
+    <?php
+
+    class mymoduleActions extends sfActions
+    {
+      public function executeMyAction()
+      {
+        $today = getdate();
+        $this->hour = $today['hours'];
+      }
+    }
+
+Listing 4-7 - The Template Has Direct Access to the Action Attributes
+
+    [php]
+    <p>Hello, world!</p>
+    <?php if ($hour >= 18): ?>
+    <p>Or should I say good evening? It's already <?php echo $hour ?>.</p>
+    <?php endif; ?>
+
+>**NOTE**
+>The template already has access to a few pieces of data without the need of any variable setup in the action. Every template can call methods of the `$sf_context`, `$sf_request`, `$sf_params`, and `$sf_user` objects. They contain data related to the current context, request, request parameters, and session. You will soon learn how to use them efficiently.
+
+Gathering Information from the User with Forms
+----------------------------------------------
+
+Forms are a good way to get information from the user. Writing form and form elements in HTML can sometimes be cumbersome, especially when you want to be XHTML-compliant. You could include form elements in symfony templates the usual way, as shown in Listing 4-8, but symfony provides helpers that make this task easier.
+
+Listing 4-8 - Templates Can Include Usual HTML Code
+
+    [php]
+    <p>Hello, world!</p>
+    <?php if ($hour >= 18): ?>
+    <p>Or should I say good evening? It's already <?php echo $hour ?>.</p>
+    <?php endif; ?>	
+    <form method="post" target="/myapp_dev.php/mymodule/anotherAction">
+      <label for="name">What is your name?</label>
+      <input type="text" name="name" id="name" value="" />
+      <input type="submit" value="Ok" />
+    </form>
+
+A helper is a PHP function defined by symfony that is meant to be used within templates. It outputs some HTML code and is faster to use than writing the actual HTML code by yourself. Using symfony helpers, you can have the same result as in Listing 4-8 with the code shown in Listing 4-9.
+
+Listing 4-9 - It Is Faster and Easier to Use Helpers Than to Use HTML Tags
+
+    [php]
+    <p>Hello, world!</p>
+    <?php if ($hour >= 18): ?>
+    <p>Or should I say good evening? It's already <?php echo $hour ?>.</p>
+    <?php endif; ?>
+    <?php echo form_tag('mymodule/anotherAction') ?>
+      <?php echo label_for('name', 'What is your name?') ?>
+      <?php echo input_tag('name') ?>
+      <?php echo submit_tag('Ok') ?>
+    </form>
+
+>**SIDEBAR**
+>Helpers are here to help you
+>
+>If, in the example in Listing 4-9, you think the helper version is not really faster to write than the HTML one, consider this one:
+>
+>     [php]
+>     <?php
+>     $card_list = array(
+>       'VISA' => 'Visa',
+>       'MAST' => 'MasterCard',
+>       'AMEX' => 'American Express',
+>       'DISC' => 'Discover');
+>     echo select_tag('cc_type', options_for_select($card_list, 'AMEX'));
+>     ?>
+>
+>This outputs the following HTML:
+>
+>     [php]
+>     <select name="cc_type" id="cc_type">
+>       <option value="VISA">Visa</option>
+>       <option value="MAST">MasterCard</option>
+>       <option value="AMEX" selected="selected">American Express</option>
+>       <option value="DISC">Discover</option>
+>     </select>
+>
+>The benefit of helpers in templates is raw speed of coding, clarity of code, and concision. The only price to pay is the time to learn them, which will end when you finish this book, and the time to write <?php echo ?>, for which you should already have a shortcut in your favorite text editor. So you could not use the symfony helpers in templates and write HTML the way you always did, but this would be a great loss and much less fun.
+
+Note that the use of the short opening tags (`<?=`, equivalent to `<?php echo`) is not recommended for professional web applications, since your production web server may be able to understand more than one scripting language and consequently get confused. Besides, the short opening tags do not work with the default PHP configuration and need server tweaking to be activated. Ultimately, when you have to deal with XML and validation, it falls short because `<?` has a special meaning in XML.
+
+Form manipulation deserves a whole chapter of its own, since symfony provides many tools, mostly helpers, to make it easier. You will learn more about these helpers in Chapter 10.
+
+Linking to Another Action
+-------------------------
+
+You already know that there is a total decoupling between an action name and the URL used to call it. So if you create a link to `anotherAction` in a template as in Listing 4-10, it will only work with the default routing. If you later decide to change the way the URLs look, then you will need to review all templates to change the hyperlinks.
+
+Listing 4-10 - Hyperlinks, the Classic Way
+
+    [php]
+    <a href="/myapp_dev.php/mymodule/anotherAction?name=anonymous">
+      I never say my name
+    </a>
+
+To avoid this hassle, you should always use the `link_to()` helper to create hyperlinks to your application's actions. Listing 4-11 demonstrates the use of the hyperlink helper.
+
+Listing 4-11 - The `link_to()` Helper
+
+    [php]
+    <p>Hello, world!</p>
+    <?php if ($hour >= 18): ?>
+    <p>Or should I say good evening? It's already <?php echo $hour ?>.</p>
+    <?php endif; ?>
+    <?php echo form_tag('mymodule/anotherAction') ?>
+      <?php echo label_for('name', 'What is your name?') ?>
+      <?php echo input_tag('name') ?>
+      <?php echo submit_tag('Ok') ?>
+      <?php echo link_to('I never say my name','mymodule/anotherAction?name=anonymous') ?>
+    </form>
+
+The resulting HTML will be the same as previously, except that when you change your routing rules, all the templates will behave correctly and reformat the URLs accordingly.
+
+The `link_to()` helper, like many other helpers, accepts another argument for special options and additional tag attributes. Listing 4-12 shows an example of an option argument and the resulting HTML. The option argument is either an associative array or a simple string showing `key=value` couples separated by blanks.
+
+Listing 4-12 - Most Helpers Accept an Option Argument
+
+    [php]
+    // Option argument as an associative array
+    <?php echo link_to('I never say my name', 'mymodule/anotherAction?name=anonymous',
+      array(
+        'class'    => 'special_link',
+        'confirm'  => 'Are you sure?',
+        'absolute' => true
+    )) ?>
+
+    // Option argument as a string
+    <?php echo link_to('I never say my name', 'mymodule/anotherAction?name=anonymous',
+      'class=special_link confirm=Are you sure? absolute=true') ?>
+
+    // Both calls output the same
+     => <a class="special_link" onclick="return confirm('Are you sure?');"
+        href="http://localhost/myapp_dev.php/mymodule/anotherAction/name/anonymous">
+        I never say my name</a>
+
+Whenever you use a symfony helper that outputs an HTML tag, you can insert additional tag attributes (like the `class` attribute in the example in Listing 4-12) in the option argument. You can even write these attributes in the "quick-and-dirty" HTML 4.0 way (without double quotes), and symfony will output them in nicely formatted XHTML. That's another reason why helpers are faster to write than HTML.
+
+>**NOTE**
+>Because it requires an additional parsing and transformation, the string syntax is a little slower than the array syntax.
+
+Like the form helpers, the link helpers are numerous and have many options. Chapter 9 will describe them in detail.
+
+Getting Information from the Request
+------------------------------------
+
+Whether the user sends information via a form (usually in a POST request) or via the URL (GET request), you can retrieve the related data from the action with the `getRequestParameter()` method of the `sfActions` object. Listing 4-13 shows how, in `anotherAction`, you retrieve the value of the `name` parameter.
+
+Listing 4-13 - Getting Data from the Request Parameter in the Action
+
+    [php]
+    <?php
+
+    class mymoduleActions extends sfActions
+    {
+      ...
+
+      public function executeAnotherAction()
+      {
+        $this->name = $this->getRequestParameter('name');
+      }
+    }
+
+If the data manipulation is simple, you don't even need to use the action to retrieve the request parameters. The template has access to an object called `$sf_params`, which offers a `get`() method to retrieve the request parameters, just like the getRequestParameter() in the action.
+
+If `executeAnotherAction()` were empty, Listing 4-14 shows how the `anotherActionSuccess.php` template would retrieve the same `name` parameter.
+
+Listing 4-14 - Getting Data from the Request Parameter Directly in the Template
+
+    [php]
+    <p>Hello, <?php echo $sf_params->get('name') ?>!</p>
+
+>**NOTE**
+>Why not use the `$_POST`, `$_GET`, or `$_REQUEST` variables instead? Because then your URLs will be formatted differently (as in `http://localhost/articles/europe/france/finance.html`, without `?` nor `=`), the usual PHP variables won't work anymore, and only the routing system will be able to retrieve the request parameters. And you may want to add input filtering to prevent malicious code injection, which is only possible if you keep all request parameters in one clean parameter holder.
+
+The `$sf_params` object is more powerful than just giving a getter equivalent to an array. For instance, if you only want to test the existence of a request parameter, you can simply use the `$sf_params->has()` method instead of testing the actual value with `get()`, as in Listing 4-15.
+
+Listing 4-15 - Testing the Existence of a Request Parameter in the Template
+
+    [php]
+    <?php if ($sf_params->has('name')): ?>
+      <p>Hello, <?php echo $sf_params->get('name') ?>!</p>
+    <?php else: ?>
+      <p>Hello, John Doe!</p>
+    <?php endif; ?>
+
+You may have already guessed that this can be written in a single line. As with most getter methods in symfony, both the `getRequestParameter()` method in the action and the `$sf_params->get()` method in the template (which, as a matter of fact, calls the same method on the same object) accept a second argument: the default value to be used if the request parameter is not present.
+
+    [php]
+    <p>Hello, <?php echo $sf_params->get('name', 'John Doe') ?>!</p>
+
+Summary
+-------
+
+In symfony, pages are composed of an action (a method in the `actions/actions.class.php` file prefixed with `execute`) and a template (a file in the `templates/` directory, usually ending with `Success.php`). They are grouped in modules, according to their function in the application. Writing templates is facilitated by helpers, which are functions provided by symfony that return HTML code. And you need to think of the URL as a part of the response, which can be formatted as needed, so you should refrain for using any direct reference to the URL in action naming or request parameter retrieval.
+
+Once you know these basic principles, you can already write a whole web application with symfony. But it would take you way too long, since almost every task you will have to achieve during the course of the application development is facilitated one way or another by some symfony feature . . . which is why the book doesn't stop now.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/05-Configuring-Symfony.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/05-Configuring-Symfony.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/05-Configuring-Symfony.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,656 @@
+Chapter 5 - Configuring Symfony
+===============================
+
+To be simple and easy to use, symfony defines a few conventions, which should satisfy the most common requirements of standard applications without need for modification. However, using a set of simple and powerful configuration files, it is possible to customize almost everything about the way the framework and your application interact with each other. With these files, you will also be able to add specific parameters for your applications.
+
+This chapter explains how the configuration system works:
+
+  * The symfony configuration is kept in files written in YAML, although you can always choose another format.
+  * Configuration files are at the project, application, and module levels in a project's directory structure.
+  * You can define several sets of configuration settings; in symfony, a set of configuration is called an environment.
+  * The values defined in the configuration files are available from the PHP code of your application.
+  * Additionally, symfony authorizes PHP code in YAML files and other tricks to make the configuration system even more flexible.
+
+The Configuration System
+------------------------
+
+Regardless of purpose, most web applications share a common set of characteristics. For instance, some sections can be restricted to a subset of users, or the pages can be decorated by a layout, or a form can be filled with the user input after a failed validation. A framework defines a structure for emulating these characteristics, and the developer can further tweak them by changing a configuration setting. This strategy saves a lot of development time, since many changes don't require a single line of code, even if there is a lot of code behind. It is also much more efficient, because it ensures such information can be maintained in a single and easily identifiable location.
+
+However, this approach has two serious drawbacks:
+
+  * Developers end up writing endlessly complex XML files.
+  * In a PHP architecture, every request takes much longer to process.
+
+Taking these disadvantages into account, symfony uses configuration files only for what they are best at doing. As a matter of fact, the ambition of the configuration system in symfony is to be:
+
+  * Powerful: Almost every aspect that can be managed using configuration files is managed using configuration files.
+  * Simple: Many aspects of configuration are not shown in a normal application, since they seldom need to be changed.
+  * Easy: Configuration files are easy to read, to modify, and to create by the developer.
+  * Customizable: The default configuration language is YAML, but it can be INI, XML, or whatever format the developer prefers.
+  * Fast: The configuration files are never processed by the application but by the configuration system, which compiles them into a fast-processing chunk of code for the PHP server.
+
+### YAML Syntax and Symfony Conventions
+
+For its configuration, symfony uses the YAML format by default, instead of more traditional INI or XML formats. YAML shows structure through indentation and is fast to write. Its advantages and basic rules were already described in Chapter 1. However, you need to keep a few conventions in mind when writing YAML files. This section introduces several of the most prominent conventions. For a complete dissertation on the topic, visit the YAML website ([http://www.yaml.org/](http://www.yaml.org/)).
+
+First of all, never use tabs in YAML files; use spaces instead. YAML parsers can't understand files with tabs, so indent your lines with spaces (a double blank is the symfony convention for indentation), as shown in Listing 5-1.
+
+Listing 5-1 - YAML Files Forbid Tabs
+
+    # Never use tabs
+    all:
+    -> mail:
+    -> -> webmaster:  webmaster en example.com
+
+    # Use blanks instead
+    all:
+      mail:
+        webmaster: webmaster en example.com
+
+If your parameters are strings starting or ending with spaces, enclose the value in single quotes. If a string parameter contains special characters, also enclose the value in single quotes, as shown in Listing 5-2.
+
+Listing 5-2 - Nonstandard Strings Should Be Enclosed in Single Quotes
+
+    error1: This field is compulsory
+    error2: '  This field is compulsory  '
+    error3: 'Don''t leave this field blank'   # Single quotes must be doubled
+
+You can define long strings in multiple lines, and also multiple-line strings, with the special string headers (> and |) plus an additional indentation. Listing 5-3 demonstrates this convention.
+
+Listing 5-3 - Defining Long and Multiline Strings
+
+    accomplishment: >           # Folded style, introduced by >
+      Mark set a major league   # Each line break is folded to a space
+      home run record in 1998.  # Makes YAML more readable
+    stats: |                    # Literal style, introduced by |
+      65 Home Runs              # All line breaks count
+      0.278 Batting Average     # Indentation doesn't appear in the resulting string
+
+To define a value as an array, enclose the elements in square brackets or use the expanded syntax with dashes, as shown in Listing 5-4.
+
+Listing 5-4 - YAML Array Syntax
+
+    # Shorthand syntax for arrays
+    players: [ Mark McGwire, Sammy Sosa, Ken Griffey ]
+
+    # Expanded syntax for arrays
+    players:
+      - Mark McGwire
+      - Sammy Sosa
+      - Ken Griffey
+
+To define a value as an associative array, or hash, enclose the elements in curly brackets and always insert a space between the key and the value in the `key: value` couple. You can also use the expanded syntax by adding indentation and a carriage return for every new key, as shown in Listing 5-5.
+
+Listing 5-5 - YAML Associative Array Syntax
+
+    # Incorrect syntax, blanks are missing after the colon
+    mail: {webmaster:webmaster en example.com,contact:contact en example.com}
+
+    # Correct shorthand syntax for associative arrays
+    mail: { webmaster: webmaster en example.com, contact: contact en example.com }
+
+    # Expanded syntax for associative arrays
+    mail:
+      webmaster: webmaster en example.com
+      contact:   contact en example.com
+
+To give a Boolean value, use either `on`, `1`, or `true` for a positive value and `off`, `0`, or `false` for a negative one. Listing 5-6 shows the possible Boolean values.
+
+Listing 5-6 - YAML Boolean Values Syntax
+
+    true_values:   [ on, 1, true ]
+    false_values:  [ off, 0, false ]
+
+Don't hesitate to add comments (starting with the hash mark, `#`) and extra spaces to values to make your YAML files more readable, as shown in Listing 5-7.
+
+Listing 5-7 - YAML Comments Syntax and Value Alignment
+
+    # This is a comment line
+    mail:
+      webmaster: webmaster en example.com
+      contact:   contact en example.com
+      admin:     admin en example.com   # extra spaces allow nice alignment of values
+
+In some symfony configuration files, you will sometimes see lines that start with a hash mark (and, as such, ignored by the YAML parsers) but look like usual settings lines. This is a symfony convention: the default configuration, inherited from other YAML files located in the symfony core, is repeated in commented lines in your application configuration, for your information. If you want to change the value of such a parameter, you need to uncomment the line first, as shown in Listing 5-8.
+
+Listing 5-8 - Default Configuration Is Shown Commented
+
+    # The cache is off by default
+    settings:
+    # cache: off
+
+    # If you want to change this setting, uncomment the line first
+    settings:
+      cache: on
+
+Symfony sometimes groups the parameter definitions into categories. All settings of a given category appear indented under the category header. Structuring long lists of `key: value` pairs by grouping them into categories improves the readability of the configuration. Category headers start with a dot (`.`). Listing 5-9 shows an example of categories.
+
+Listing 5-9 - Category Headers Look Like Keys, But Start with a Dot
+
+    all:
+      .general:
+        tax:        19.6
+
+      mail:
+        webmaster:  webmaster en example.com
+
+In this example, `mail` is a key and `general` is only a category header. Everything works as if the category header didn't exist, as shown in Listing 5-10. The `tax` parameter is actually a direct child of the `all` key.
+
+Listing 5-10 - Category Headers Are Only There for Readability and Are Actually Ignored
+
+    all:
+      tax:          19.6
+
+      mail:
+        webmaster:  webmaster en example.com
+
+>**SIDEBAR**
+>And if you don't like YAML
+>
+>YAML is just an interface to define settings to be used by PHP code, so the configuration defined in YAML files ends up being transformed into PHP. After browsing an application, check its cached configuration (in `cache/myapp/dev/config/`, for instance). You will see the PHP files corresponding to your YAML configuration. You will learn more about the configuration cache later in this chapter.
+>
+>The good news is that if you don't want to use YAML files, you can still do what the configuration files do by hand, in PHP or via another format (XML, INT, and so on). Throughout this book, you will meet alternative ways to define configuration without YAML, and you will even learn to replace the symfony configuration handlers (in Chapter 19). If you use them wisely, these tricks will enable you to bypass configuration files or define your own configuration format.
+
+### Help, a YAML File Killed My App!
+
+The YAML files are parsed into PHP hashes and arrays, and then the values are used in various parts of the application to modify the behavior of the view, the controller, or the model. Many times, when there is a problem in a YAML file, it is not detected until the value actually needs to be used. Moreover, the error or exception that is thrown then is usually not clearly related to the YAML configuration file.
+
+If your application suddenly stops working after a configuration change, you should check that you didn't make any of the common mistakes of the inattentive YAML coder:
+
+  * You miss a space between a key and its value:
+
+        key1:value1      # A space is missing after the :
+
+  * Keys in a sequence are not indented the same way:
+
+        all:
+          key1:  value1
+           key2: value2  # Indentation is not the same as the other sequence members
+          key3:  value3
+
+  * There is a reserved YAML character in a key or a value, without string delimiters:
+
+        message: tell him: go way    # :, [, ], { and } are reserved in YAML
+        message: 'tell him: go way'  # Correct syntax
+
+  * You are modifying a commented line:
+
+        # key: value     # Will never be taken into account due to the leading #
+
+  * You set values with the same key name twice at the same level:
+
+        key1: value1
+        key2: value2
+        key1: value3     # key1 is defined twice, the value is the last one defined
+
+  * You think that the setting takes a special type, while it is always a string, until you convert it:
+
+        income: 12,345   # Until you convert it, this is still a string
+
+Overview of the Configuration Files
+-----------------------------------
+
+Configuration is distributed into files, by subject. The files contain parameter definitions, or settings. Some of these parameters can be overridden at several levels (project, application, and module); some are specific to a certain level. The next chapters will deal with the configuration files related to their main topic, and Chapter 19 will deal with advanced configuration.
+
+### Project Configuration
+
+There are a few project configuration files by default. Here are the files that can be found in the `myproject/config/` directory:
+
+  * `config.php`: This is the very first file executed by any request or command. It contains the path to the framework files, and you can change it to use a different installation. If you add some `define` statements at the end of this file, the constants will be accessible from every application of the project. See Chapter 19 for advanced usage of this file.
+  * `databases.yml`: This is where you define the access and connection settings to the database (host, login, password, database name, and so on). Chapter 8 will tell you more about it. It can also be overridden at the application level.
+  * `properties.ini`: This file holds a few parameters used by the command line tool, including the project name and the connection settings for distant servers. See Chapter 16 for an overview of the features using this file.
+  * `rs`ync_exclude.txt: This file specifies which directories must be excluded from the synchronization between servers. It is discussed in Chapter 16.
+  * `schema.yml` and `propel.ini`: These are data access configuration files used by Propel (symfony's ORM layer). They are used to make the Propel libraries work with the symfony classes and the data of your project. `schema.yml` contains a representation of the project's relational data model. `propel.ini` is automatically generated, so you probably do not need to modify it. If you don't use Propel, these files are not needed. Chapter 8 will tell you more about their use.
+
+These files are mostly used by external components or by the command line, or they need to be processed even before any YAML parsing program can be loaded by the framework. That's why some of them don't use the YAML format.
+
+### Application Configuration
+
+The main part of the configuration is the application configuration. It is defined in the front controller (in the `web/` directory) for the main constants, in YAML files located in the application `config/` directory, in `i18n/` directories for the internationalization files, and in the framework files for invisible--although useful--additional application configuration.
+
+#### Front Controller Configuration
+
+The very first application configuration is actually found in the front controller; that is the very first script executed by a request. Take a look at the default `web/index.php` in Listing 5-11.
+
+Listing 5-11 - The Default Production Front Controller
+
+    [php]
+    <?php
+
+    define('SF_ROOT_DIR',    dirname(__FILE__).'/..');
+    define('SF_APP',         'myapp');
+    define('SF_ENVIRONMENT', 'prod');
+    define('SF_DEBUG',       true);
+
+    require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
+
+    sfContext::getInstance()->getController()->dispatch();
+
+After defining the name of the application (`myapp`) and the environment (`prod`), the general configuration file is called before the dispatching. So a few useful constants are defined here:
+
+  * `SF_ROOT_DIR`: Project root directory (normally, should remain at its default value, unless you change the file structure).
+  * `SF_APP`: Application name in the project. Necessary to compute file paths.
+  * `SF_ENVIRONMENT`: Environment name (`prod`, `dev`, or any other project-specific environment that you define). Will determine which configuration settings are to be used. Environments are explained later in this chapter.
+  * `SF_DEBUG`: Activation of the debug mode (see Chapter 16 for details).
+
+If you want to change one of these values, you probably need an additional front controller. The next chapter will tell you more about front controllers and how to create a new one.
+
+>**SIDEBAR**
+>The root directory can be anywhere
+>
+>Only the files and scripts located under the web root (the `web/` directory in a symfony project) are available from the outside. The front controller scripts, images, style sheets, and JavaScript files are public. All the other files must be outside the server web root--that means they can be anywhere else.
+>
+>The non-public files of a project are accessed by the front controller from the SF_ROOT_DIR path. Classically, the root directory is one level up the `web/` directory. But you can choose a completely different structure. Imagine that your main directory structure is made of two directories, one public and one private:
+>
+>
+>     symfony/    # Private area
+>       apps/
+>       batch/
+>       cache/
+>       ...
+>     www/        # Public area
+>       images/
+>       css/
+>       js/
+>       index.php
+>
+>
+>In this case, the root directory is the `symfony/` directory. So the `index.php` front controller simply needs to define the `SF_ROOT_DIR` as follows for the application to work:
+>
+>     define('SF_ROOT_DIR', dirname(__FILE__).'/../symfony');
+
+Chapter 19 will give you more information about how to tweak symfony to make it work on a specific directory structure.
+
+#### Main Application Configuration
+
+The main application configuration is stored in files located in the `myproject/apps/myapp/config/` directory:
+
+  * `app.yml`: This file should contain the application-specific configuration; that is, global variables defining business or applicative logic specific to an application, which don't need to be stored in a database. Tax rates, shipping fares, and e-mail addresses are often stored in this file. It is empty by default.
+  * `config.php`: This file bootstraps the application, which means that it does all the very basic initializations to allow the application to start. This is where you can customize your directory structure or add application-specific constants (Chapter 19 provides more details). It starts by including the project's `config.php`.
+  * `factories.yml`: Symfony defines its own class to handle the view, the request, the response, the session, and so on. If you want to use your own classes instead, this is where you can specify them. Chapter 19 provides more information.
+  * `filters.yml`: Filters are portions of code executed for every request. This file is where you define which filters are to be processed, and it can be overridden for each module. Chapter 6 discusses filters in more detail.
+  * `logging.yml`: This file defines which level of detail must be recorded in the logs, to help you manage and debug your application. The use of this configuration is explained in Chapter 16.
+  * `routing.yml`: The routing rules, which allow transforming unreadable and unbookmarkable URLs into "smart" and explicit ones, are stored in this file. For new applications, a few default rules exist. Chapter 9 is all about links and routing.
+  * `settings.yml`: The main settings of a symfony application are defined in this file. This is where you specify if your application has internationalization, its default language, the request timeout and whether caching is turned on. With a one-line change in this file, you can shut down the application so you can perform maintenance or upgrade one of its components. The common settings and their use are described in Chapter 19.
+  * `view.yml`: The structure of the default view (name of the layout, title, and meta tags; default style sheets and JavaScript files to be included; default content-type, and so on) is set in this file. It also defines the default value of the meta and title tags. Chapter 7 will tell you more about this file. These settings can be overridden for each module.
+
+#### Internationalization Configuration
+
+Internationalized applications can display pages in several languages. This requires specific configuration. There are two configuration places for internationalization:
+
+  * `i18n.yml` of the application `config/` directory: This file defines general translation settings, such as the default culture for the translation, whether the translations come from files or a database, and their format.
+  * Translation files in the application `i18n/` directory: These are basically dictionaries, giving a translation for each of the phrases used in the application templates so that the pages show translated text when the user switches language.
+
+Note that the activation of the i18n features is set in the `settings.yml` file. You will find more information about these features in Chapter 13.
+
+#### Additional Application Configuration
+
+A second set of configuration files is in the symfony installation directory (in `$sf_symfony_ data_dir/config/`) and doesn't appear in the configuration directory of your applications. The settings defined there are defaults that seldom need to be modified, or that are global to all projects. However, if you need to modify them, just create an empty file with the same name in your `myproject/apps/myapp/config/` directory, and override the settings you want to change. The settings defined in an application always have precedence over the ones defined in the framework. The following are the configuration files in the symfony installation config/ directory:
+
+  * `autoload.yml`: This file contains the settings of the autoloading feature. This feature exempts you from requiring custom classes in your code if they are located in specific directories. It is described in detail in Chapter 19.
+  * `constants.php`: This file contains the default application file structure. To override the settings of this file, use the application `config.php`, as explained in Chapter 19.
+  * `core_compile.yml` and `bootstrap_compile.yml`: These are lists of classes to be included to start an application (in `bootstrap_compile.yml`) and to process a request (in `core_compile.yml`). These classes are actually concatenated into an optimized PHP file without comments, which will accelerate the execution by minimizing the file access operations (one file is loaded instead of more than forty for each request). This is especially useful if you don't use a PHP accelerator. Optimization techniques are described in Chapter 18.
+  * `config_handlers.yml`: This is where you can add or modify the handlers used to process each configuration file. Chapter 19 provides more details.
+  * `php.yml`: This file checks that the variables of the `php.ini` file are properly defined and allows you to override them, if necessary. Check Chapter 19 for details.
+
+### Module Configuration
+
+By default, a module has no specific configuration. But, if required, you can override some application-level settings for a given module. For instance, you might do this to change the HTML description of all the actions of a module, or to include a specific JavaScript file. You can also choose to add new parameters restricted to a specific module to preserve encapsulation.
+
+As you may have guessed, module configuration files must be located in a `myproject/apps/myapp/modules/mymodule/config/` directory. These files are as follows:
+
+  * `generator.yml`: For modules generated according to a database table (scaffoldings and administrations), this file defines how the interface displays rows and fields, and which interactions are proposed to the user (filters, sorting, buttons, and so on). Chapter 14 will tell you more about it.
+  * `module.yml`: This file contains custom parameters specific to a module (equivalent to the `app.`yml, but at the module level) and action configuration. Chapter 6 provides more details.
+  * `security.yml`: This file sets access restrictions for actions. This is where you specify that a page can be viewed only by registered users or by a subset of registered users with special permissions. Chapter 6 will tell you more about it.
+  * `view.yml`: This file contains configuration for the views of one or all of the actions of a module. It overrides the application `view.yml` and is described in Chapter 7.
+  * Data validation files: Although located in the `validate/` directory instead of the `config/` one, the YAML data validation files, used to control the data entered in forms, are also module configuration files. You will learn how to use them in Chapter 10.
+
+Most module configuration files offer the ability to define parameters for all the views or all the actions of a module, or for a subset of them.
+
+>**SIDEBAR**
+>Too many files?
+>
+>You might be overwhelmed by the number of configuration files present in the application. But please keep the following in mind:
+>
+>Most of the time, you don't need to change the configuration, since the default conventions match the most common requirements. Each configuration file is related to a particular feature, and the next chapters will detail their use one by one. When you focus on a single file, you can see clearly what it does and how it is organized. For professional web development, the default configuration is often not completely adapted. The configuration files allow for an easy modification of the symfony mechanisms without code. Imagine the amount of PHP code necessary to achieve the same amount of control. If all the configuration were located in one file, not only would the file be completely unreadable, but you could not redefine configuration at several levels (see the "Configuration Cascade" section later in this chapter).
+>
+>The configuration system is one of the great strengths of symfony, because it makes symfony usable for almost every kind of web application, and not only for the ones for which the framework was originally designed.
+
+Environments
+------------
+
+During the course of application development, you will probably need to keep several sets of configuration in parallel. For instance, you will need to have the connection settings for your tests database available during development, and the ones for your real data available for production. To answer the need of concurrent configurations, symfony offers different environments.
+
+### What Is an Environment?
+
+An application can run in various environments. The different environments share the same PHP code (apart from the front controller), but can have completely different configurations. For each application, symfony provides three default environments: production (`prod`), test (test), and development (dev). You're also free to add as many custom environments as you wish.
+
+So basically, environments and configuration are synonyms. For instance, a test environment will log alerts and errors, while a `prod` environment will only log errors. Cache acceleration is often deactivated in the `dev` environment, but activated in the `test` and `prod` environments. The `dev` and `test` environments may need test data, stored in a database distinct from the one used in the production environment. So the database configuration will be different between the two environments. All environments can live together on the same machine, although a production server generally contains only the `prod` environment.
+
+In the `dev` environment, the logging and debugging settings are all enabled, since maintenance is more important than performance. On the contrary, the prod environment has settings optimized for performance by default, so the production configuration turns off many features. A good rule of thumb is to navigate in the development environment until you are satisfied with the feature you are working on, and then switch to the production environment to check its speed.
+
+The test environment differs from the dev and prod environment in other ways. You interact with this environment solely through the command line for the purpose of functional testing and batch scripting. Consequently, the test environment is close to the production one, but it is not accessed through a web browser. It simulates the use of cookies and other HTTP specific components.
+
+To change the environment in which you're browsing your application, just change the front controller. Until now, you have seen only the development environment, since the URLs used in the example called the development front controller:
+
+    http://localhost/myapp_dev.php/mymodule/index
+
+However, if you want to see how the application reacts in production, call the production front controller instead:
+
+    http://localhost/index.php/mymodule/index
+
+If your web server has mod_rewrite enabled, you can even use the custom symfony rewriting rules, written in `web/.htaccess`. They define the production front controller as the default execution script and allow for URLs like this:
+
+    http://localhost/mymodule/index
+
+>**SIDEBAR**
+>Environments and servers
+>
+>Don't mix up the notions of environment and server. In symfony, different environments are different configurations, and correspond to a front controller (the script that executes the request). Different servers correspond to different domain names in the URL.
+>
+>
+>     http://localhost/myapp_dev.php/mymodule/index
+>            _________ _____________
+>             server    environment
+>
+>
+>Usually, developers work on applications in a development server, disconnected from the Internet and where all the server and PHP configuration can be changed at will. When the time comes for releasing the application to production, the application files are transferred to the production server and made accessible to the end users.
+>
+>This means that many environments are available on each server. For instance, you can run in the production environment even on your development server. However, most of the time, only the production environment should be accessible in the production server, to avoid public visibility of server configuration and security risks.
+>
+>To add a new environment, you don't need to create a directory or to use the symfony CLI. Simply create a new front controller and change the environment name definition in it. This environment inherits all the default configuration plus the settings that are common to all environments. The next chapter will show you how to do this.
+
+### Configuration Cascade
+
+The same setting can be defined more than once, in different places. For instance, you may want to set the mime-type of your pages to `text/html` for all of the application, except for the pages of an `rss` module, which will need a `text/xml` mime-type. Symfony gives you the ability to write the first setting in `myapp/config/view.yml` and the second in `myapp/modules/rss/config/view.yml`. The configuration system knows that a setting defined at the module level must override a setting defined at the application level.
+
+In fact, there are several configuration levels in symfony:
+
+  * Granularity levels:
+    * The default configuration located in the framework
+    * The global configuration for the whole project (in `myproject/config/`)
+    * The local configuration for an application of the project (in `myproject/apps/myapp/config/`)
+    * The local configuration restricted to a module (in `myproject/apps/myapp/modules/mymodule/config/`)
+  * Environment levels:
+    * Specific to one environment
+    * For all environments
+
+Of all the properties that can be customized, many are environment-dependent. Consequently, many YAML configuration files are divided by environment, plus a tail section for all environments. The result is that typical symfony configuration looks like Listing 5-12.
+
+Listing 5-12 - The Structure of Symfony Configuration Files
+
+    # Production environment settings
+    prod:
+      ...
+
+    # Development environment settings
+    dev:
+      ...
+
+    # Test environment settings
+    test:
+      ...
+
+    # Custom environment settings
+    myenv:
+      ...
+
+    # Settings for all environments
+    all:
+      ...
+
+In addition, the framework itself defines default values in files that are not located in the project tree structure, but in the $sf_symfony_data_dir/config/ directory of your symfony installation. The default configuration is set in these files as shown in Listing 5-13. These settings are inherited by all applications.
+
+Listing 5-13 - The Default Configuration, in `$sf_symfony_data_dir/config/settings.yml`
+
+     # Default settings:
+     default:
+       default_module:         default
+       default_action:         index
+       ...
+
+These default definitions are repeated in the project, application, and module configuration files as comments, as shown in Listing 5-14, so that you know that some parameters are defined by default and that they can be modified.
+
+Listing 5-14 - The Default Configuration, Repeated for Information, in `myapp/config/settings.yml`
+
+    #all:
+     #  default_module:         default
+     #  default_action:         index
+     ...
+
+This means that a property can be defined several times, and the actual value results from a definition cascade. A parameter definition in a named environment has precedence over the same parameter definition for all environments, which has precedence over a definition in the default configuration. A parameter definition at the module level has precedence over the same parameter definition at the application level, which has precedence over a definition at the project level. This can be wrapped up in the following priority list:
+
+  1. Module
+  2. Application
+  3. Project
+  4. Specific environment
+  5. All environments
+  6. Default
+
+The Configuration Cache
+-----------------------
+
+Parsing YAML and dealing with the configuration cascade at runtime represent a significant overhead for each request. Symfony has a built-in configuration cache mechanism designed to speed up requests.
+
+The configuration files, whatever their format, are processed by some special classes, called handlers, that transform them into fast-processing PHP code. In the development environment, the handlers check the configuration for changes at each request, to promote interactivity. They parse the recently modified files so that you can see a change in a YAML file immediately. But in the production environment, the processing occurs once during the first request, and then the processed PHP code is stored in the cache for subsequent requests. The performance is guaranteed, since every request in production will just execute some well-optimized PHP code.
+
+For instance, if the `app.yml` file contains this:
+
+    all:                   # Setting for all environments
+      mail:
+        webmaster:         webmaster en example.com
+
+then the file `config_app.yml.php`, located in the `cache/` folder of your project, will contain this:
+
+    [php]
+    <?php
+
+    sfConfig::add(array(
+      'app_mail_webmaster' => 'webmaster en example.com',
+    ));
+
+As a consequence, most of the time, the YAML files aren't even parsed by the framework, which relies on the configuration cache instead. However, in the development environment, symfony will systematically compare the dates of modification of the YAML files and the cached files, and reprocess only the ones that have changed since the previous request.
+
+This presents a major advantage over many PHP frameworks, where configuration files are compiled at every request, even in production. Unlike Java, PHP doesn't share an execution context between requests. For other PHP frameworks, keeping the flexibility of XML configuration files requires a major performance hit to process all the configuration at every request. This is not the case in symfony. Thanks to the cache system, the overhead caused by configuration is very low.
+
+There is an important consequence of this mechanism. If you change the configuration in the production environment, you need to force the reparsing of all the configuration files for your modification to be taken into account. For that, you just need to clear the cache, either by deleting the content of the cache/ directory or, more easily, by calling the clear-cache symfony task:
+
+    > symfony clear-cache
+
+Accessing the Configuration from Code
+-------------------------------------
+
+All the configuration files are eventually transformed into PHP, and many of the settings they contain are automatically used by the framework, without further intervention. However, you sometimes need to access some of the settings defined in the configuration files from your code (in actions, templates, custom classes, and so on). The settings defined in settings.yml, app.yml, module.yml, logging.yml, and i18n.yml are available through a special class called sfConfig.
+
+### The sfConfig Class
+
+You can access settings from within the application code through the `sfConfig` class. It is a registry for configuration parameters, with a simple getter class method, accessible from every part of the code:
+
+    [php]
+    // Retrieve a setting
+    parameter = sfConfig::get('param_name', $default_value);
+
+Note that you can also define, or override, a setting from within PHP code:
+
+    [php]
+    // Define a setting
+    sfConfig::set('param_name', $value);
+
+The parameter name is the concatenation of several elements, separated by underscores, in this order:
+
+  * A prefix related to the configuration file name (`sf_` for `settings.yml`, `app_` for `app.yml`, `mod_` for `module.yml`, `sf_i18n_` for `i18n.yml`, and `sf_logging_` for `logging.yml`)
+  * The parent keys (if defined), in lowercase
+  * The name of the key, in lowercase
+
+The environment is not included, since your PHP code will have access only to the values defined for the environment in which it's executed.
+
+For instance, if you need to access the values defined in the app.yml file shown in Listing 5-15, you will need the code shown in Listing 5-16.
+
+Listing 5-15 - Sample `app.yml` Configuration
+
+    all:
+      version:        1.5
+      .general:
+        tax:          19.6
+      default_user:
+        name:         John Doe
+      mail:
+        webmaster:    webmaster en example.com
+        contact:      contact en example.com
+    dev:
+      mail:
+        webmaster:    dummy en example.com
+        contact:      dummy en example.com
+
+Listing 5-16 - Accessing Configuration Settings in PHP in the `dev` Environment
+
+    [php]
+    echo sfConfig::get('app_version');
+     => '1.5'
+    echo sfConfig::get('app_tax');   // Remember that category headers are ignored
+     => '19.6'
+    echo sfConfig::get('app_default_user_name);
+     => 'John Doe'
+    echo sfConfig::get('app_mail_webmaster');
+     => 'dummy en example.com'
+    echo sfConfig::get('app_mail_contact');
+     => 'dummy en example.com'
+
+So symfony configuration settings have all the advantages of PHP constants, but without the disadvantages, since the value can be changed.
+
+On that account, the `settings.yml` file, where you can set the framework settings for an application, is the equivalent to a list of `sfConfig::set()` calls. Listing 5-17 is interpreted as shown in Listing 5-18.
+
+Listing 5-17 - Extract of `settings.yml`
+
+    all:
+      .settings:
+        available:              on
+        path_info_array:        SERVER
+        path_info_key:          PATH_INFO
+        url_format:             PATH
+
+Listing 5-18 - What Symfony Does When Parsing `settings.yml`
+
+    [php]
+    sfConfig::add(array(
+      'sf_available' => true,
+      'sf_path_info_array' => 'SERVER',
+      'sf_path_info_key' => 'PATH_INFO',
+      'sf_url_format' => 'PATH',
+    ));
+
+Refer to Chapter 19 for the meanings of the settings found in the `settings.yml` file.
+
+### Custom Application Settings and app.yml
+
+Most of the settings related to the features of an application should be stored in the `app.yml` file, located in the `myproject/apps/myapp/config/` directory. This file is environment-dependent and empty by default. Put in every setting that you want to be easily changed, and use the `sfConfig` class to access these settings from your code. Listing 5-19 shows an example.
+
+Listing 5-19 - Sample `app.yml` to Define Credit Card Operators Accepted for a Given Site
+
+    all:
+      creditcards:
+        fake:             off
+        visa:             on
+        americanexpress:  on
+
+    dev:
+      creditcards:
+        fake:             on
+
+To know if the `fake` credit cards are accepted in the current environment, get the value of:
+
+    [php]
+    sfConfig::get('app_creditcards_fake');
+
+>**TIP**
+>Each time you are tempted to define a constant or a setting in one of your scripts, think about if it would be better located in the app.yml file. This is a very convenient place to store all application settings.
+
+When your need for custom parameters becomes hard to handle with the `app.yml` syntax, you may need to define a syntax of your own. In that case, you can store the configuration in a new file, interpreted by a new configuration handler. Refer to Chapter 19 for more information about configuration handlers.
+
+Tips for Getting More from Configuration Files
+----------------------------------------------
+
+There are a few last tricks to learn before writing your own YAML files. They will allow you to avoid configuration duplication and to deal with your own YAML formats.
+
+### Using Constants in YAML Configuration Files
+
+Some configuration settings rely on the value of other settings. To avoid setting the same value twice, symfony supports constants in YAML files. On encountering a setting name (one that can be accessed by `sfConfig::get()`) in capital letters enclosed in `%` signs, the configuration handlers replace them with their current value. See Listing 5-20 for an example.
+
+Listing 5-20 - Using Constants in YAML Files, Example from `autoload.yml`
+
+    autoload:
+      symfony:
+        name:           symfony
+        path:           %SF_SYMFONY_LIB_DIR%
+        recursive:      on
+        exclude:        [vendor]
+
+The path parameter will take the value returned by sfConfig::get('sf_symfony_lib_dir'). If you want one configuration file to rely on another, you need to make sure that the file you rely on is already parsed (look in the symfony source to find out the order in which the configuration files are parsed). `app.yml` is one of the last files parsed, so you may rely on others in it.
+
+### Using Scriptable Configuration
+
+It may happen that your configuration relies on external parameters (such as a database or another configuration file). To deal with these particular cases, the symfony configuration files are parsed as PHP files before being passed to the YAML parser. It means that you can put PHP code in YAML files, as in Listing 5-21.
+
+Listing 5-21 - YAML Files Can Contain PHP
+
+    all:
+      translation:
+        format:  <?php echo sfConfig::get('sf_i18n') == true ? 'xliff' : 'none' ?>
+
+But be aware that the configuration is parsed very early in the life of a request, so you will not have any symfony built-in methods or functions to help you.
+
+>**CAUTION**
+>In the production environment, the configuration is cached, so the configuration files are parsed (and executed) only once after the cache is cleared.
+
+### Browsing Your Own YAML File
+
+Whenever you want to read a YAML file directly, you can use the `sfYaml` class. It is a YAML parser that can turn a YAML file into a PHP associative array. Listing 5-22 presents a sample YAML file, and Listing 5-23 shows you how to parse it.
+
+Listing 5-22 - Sample `test.yml` File
+
+    house:
+      family:
+        name:     Doe
+        parents:  [John, Jane]
+        children: [Paul, Mark, Simone]
+      address:
+        number:   34
+        street:   Main Street
+        city:     Nowheretown
+        zipcode:  12345
+
+Listing 5-23 - Using the `sfYaml` Class to Turn a YAML File into an Associative Array
+
+    [php]
+    $test = sfYaml::load('/path/to/test.yml');
+    print_r($test);
+
+    Array(
+      [house] => Array(
+        [family] => Array(
+          [name] => Doe
+          [parents] => Array(
+            [0] => John
+            [1] => Jane
+          )
+          [children] => Array(
+            [0] => Paul
+            [1] => Mark
+            [2] => Simone
+          )
+        )
+        [address] => Array(
+          [number] => 34
+          [street] => Main Street
+          [city] => Nowheretown
+          [zipcode] => 12345
+        )
+      )
+    )
+
+Summary
+-------
+
+The symfony configuration system uses the YAML language to be simple and readable. The ability to deal with multiple environments and to set parameters through a definition cascade offers versatility to the developer. Some of the configuration can be accessed from within the code via the `sfConfig` object, especially the application settings stored in the `app.yml` file.
+
+Yes, symfony does have a lot of configuration files, but this approach makes it more adaptable. Remember that you don't need to bother with them unless your application requires a high level of customization.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/06-Inside-the-Controller-Layer.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/06-Inside-the-Controller-Layer.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/06-Inside-the-Controller-Layer.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1067 @@
+Chapter 6 - Inside The Controller Layer
+=======================================
+
+In symfony, the controller layer, which contains the code linking the business logic and the presentation, is split into several components that you use for different purposes:
+
+  * The front controller is the unique entry point to the application. It loads the configuration and determines the action to execute.
+  * Actions contain the applicative logic. They check the integrity of the request and prepare the data needed by the presentation layer.
+  * The request, response, and session objects give access to the request parameters, the response headers, and the persistent user data. They are used very often in the controller layer.
+  * Filters are portions of code executed for every request, before or after the action. For example, the security and validation filters are commonly used in web applications. You can extend the framework by creating your own filters.
+
+This chapter describes all these components, but don't be intimidated by their number. For a basic page, you will probably need to write only a few lines in the action class, and that's all. The other controller components will be of use only in specific situations.
+
+The Front Controller
+--------------------
+
+All web requests are handled by a single front controller, which is the unique entry point to the whole application in a given environment.
+
+When the front controller receives a request, it uses the routing system to match an action name and a module name with the URL typed (or clicked) by the user. For instance, the following request URL calls the `index.php` script (that's the front controller) and will be understood as a call to the action `myAction` of the module `mymodule`:
+
+    http://localhost/index.php/mymodule/myAction
+
+If you are not interested in symfony's internals, that's all that you need to know about the front controller. It is an indispensable component of the symfony MVC architecture, but you will seldom need to change it. So you can jump to the next section unless you really want to know about the guts of the front controller.
+
+### The Front Controller's Job in Detail
+
+The front controller does the dispatching of the request, but that means a little more than just determining the action to execute. In fact, it executes the code that is common to all actions, including the following:
+
+  1. Define the core constants.
+  2. Locate the symfony libraries.
+  3. Load and initiate the core framework classes.
+  4. Load the configuration.
+  5. Decode the request URL to determine the action to execute and the request parameters.
+  6. If the action does not exist, redirect to the 404 error action.
+  7. Activate filters (for instance, if the request needs authentication).
+  8. Execute the filters, first pass.
+  9. Execute the action and render the view.
+  10. Execute the filters, second pass.
+  11. Output the response.
+
+### The Default Front Controller
+
+The default front controller, called `index.php` and located in the `web/` directory of the project, is a simple PHP file, as shown in Listing 6-1.
+
+Listing 6-1 - The Default Production Front Controller
+
+    [php]
+    <?php
+
+    define('SF_ROOT_DIR',    realpath(dirname(__FILE__).'/..'));
+    define('SF_APP',         'myapp');
+    define('SF_ENVIRONMENT', 'prod');
+    define('SF_DEBUG',       false);
+
+    require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
+
+    sfContext::getInstance()->getController()->dispatch();
+
+The constants definition corresponds to the first step described in the previous section. Then the front controller includes the application config.php, which takes care of steps 2 through 4. The call to the `dispatch()` method of the `sfController` object (which is the core controller object of the symfony MVC architecture) dispatches the request, taking care of steps 5 through 7. The last steps are handled by the filter chain, as explained later in this chapter.
+
+### Calling Another Front Controller to Switch the Environment
+
+One front controller exists per environment. As a matter of fact, it is the very existence of a front controller that defines an environment. The environment is defined in the `SF_ENVIRONMENT` constant.
+
+To change the environment in which you're browsing your application, just choose another front controller. The default front controllers available when you create a new application with the `symfony init-app` task are `index.php` for the production environment and `myapp_dev.php` for the development environment (provided that your application is called `myapp`). The default `mod_rewrite` configuration will use `index.php` when the URL doesn't contain a front controller script name. So both of these URLs display the same page (`mymodule/index`) in the production environment:
+
+    http://localhost/index.php/mymodule/index
+    http://localhost/mymodule/index
+
+and this URL displays that same page in the development environment:
+
+    http://localhost/myapp_dev.php/mymodule/index
+
+Creating a new environment is as easy as creating a new front controller. For instance, you may need a staging environment to allow your customers to test the application before going to production. To create this staging environment, just copy `web/myapp_dev.php` into `web/myapp_staging.php`, and change the value of the `SF_ENVIRONMENT` constant to `staging`. Now, in all the configuration files, you can add a new `staging:` section to set specific values for this environment, as shown in Listing 6-2.
+
+Listing 6-2 - Sample `app.yml` with Specific Settings for the Staging Environment
+
+    staging:
+      mail:
+        webmaster:    dummy en mysite.com
+        contact:      dummy en mysite.com
+    all:
+      mail:
+        webmaster:    webmaster en mysite.com
+        contact:      contact en mysite.com
+
+If you want to see how the application reacts in this new environment, call the related front controller:
+
+    http://localhost/myapp_staging.php/mymodule/index
+
+### Batch Files
+
+You may want to execute a script from the command line (or via a cron table) with access to all the symfony classes and features, for instance to launch batch e-mail jobs or to periodically update your model through a process-intensive calculation. For such a script, you need to include the same lines as in a front controller at the beginning. Listing 6-3 shows an example of the beginning of a batch script.
+
+Listing 6-3 - Sample Batch Script
+
+    [php]
+    <?php
+
+    define('SF_ROOT_DIR',    realpath(dirname(__FILE__).'/..'));
+    define('SF_APP',         'myapp');
+    define('SF_ENVIRONMENT', 'prod');
+    define('SF_DEBUG',       false);
+
+    require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
+
+    // add code here
+
+You can see that the only missing line is the call to the `dispatch()` method of the sfController object, which can be used only with a web server, not in a batch process. Defining an application and an environment gives you access to a specific configuration. Including the application `config.php` initiates the context and the autoloading.
+
+>**TIP**
+>The symfony CLI offers an `init-batch` task, which automatically creates a skeleton similar to the one in Listing 6-3 in the `batch/` directory. Just pass it an application name, an environment name, and a batch name as arguments.
+
+Actions
+-------
+
+The actions are the heart of an application, because they contain all the application's logic. They use the model and define variables for the view. When you make a web request in a symfony application, the URL defines an action and the request parameters.
+
+### The Action Class
+
+Actions are methods named `executeActionName` of a class named `moduleNameActions` inheriting from the `sfActions` class, and grouped by modules. The action class of a module is stored in an `actions.class.php` file, in the module's `actions/` directory.
+
+Listing 6-4 shows an example of an `actions.class.php` file with only an `index` action for the whole `mymodule` module.
+
+Listing 6-4 - Sample Action Class, in `apps/myapp/modules/mymodule/actions/actions.class.php`
+
+    [php]
+    class mymoduleActions extends sfActions
+    {
+      public function executeIndex()
+      {
+
+      }
+    }
+
+>**CAUTION**
+>Even if method names are not case-sensitive in PHP, they are in symfony. So don't forget that the action methods must start with a lowercase `execute`, followed by the exact action name with the first letter capitalized.
+
+In order to request an action, you need to call the front controller script with the module name and action name as parameters. By default, this is done by appending the couple `module_name`/`acti`on_name to the script. This means that the action defined in Listing 6-4 can be called by this URL:
+
+    http://localhost/index.php/mymodule/index
+
+Adding more actions just means adding more `execute` methods to the `sfActions` object, as shown in Listing 6-5.
+
+Listing 6-5 - Action Class with Two Actions, in myapp/modules/mymodule/actions/actions.cla`ss.php`
+
+    [php]
+    class mymoduleActions extends sfActions
+    {
+      public function executeIndex()
+      {
+        ...
+      }
+
+      public function executeList()
+      {
+        ...
+      }
+    }
+
+If the size of an action class grows too much, you probably need to do some refactoring and move some code to the model layer. Actions should often be kept short (not more than a few lines), and all the business logic should usually be in the model.
+
+Still, the number of actions in a module can be important enough to lead you to split it in two modules.
+
+>**SIDEBAR**
+>Symfony coding standards
+>
+>In the code examples given in this book, you probably noticed that the opening and closing curly braces (`{` and `}`) occupy one line each. This standard makes the code easier to read.
+>
+>Among the other coding standards of the framework, indentation is always done by two blank spaces; tabs are not used. This is because tabs have a different space value according to the text editor you use, and because code with mixed tab and blank indentation is impossible to read.
+>
+>Core and generated symfony PHP files do not end with the usual `?>` closing tag. This is because it is not really needed, and because it can create problems in the output if you ever have blanks after this tag.
+>
+>And if you really pay attention, you will see that a line never ends with a blank space in symfony. The reason, this time, is more prosaic: lines ending with blanks look ugly in Fabien's text editor.
+
+### Alternative Action Class Syntax
+
+An alternative action syntax is available to dispatch the actions in separate files, one file per action. In this case, each action class extends `sfAction` (instead of `sfActions`) and is named `actionNameAction`. The actual action method is simply named `execute`. The file name is the same as the class name. This means that the equivalent of Listing 6-5 can be written with the two files shown in Listings 6-6 and 6-7.
+
+Listing 6-6 - Single Action File, in `myapp/modules/mymodule/actions/indexAction.class.php`
+
+    [php]
+    class indexAction extends sfAction
+    {
+      public function execute()
+      {
+        ...
+      }
+    }
+
+Listing 6-7 - Single Action File, in `myapp/modules/mymodule/actions/listAction.class.php`
+
+    [php]
+    class listAction extends sfAction
+    {
+      public function execute()
+      {
+        ...
+      }
+    }
+
+### Retrieving Information in the Action
+
+The action class offers a way to access controller-related information and the core symfony objects. Listing 6-8 demonstrates how to use them.
+
+Listing 6-8 - `sfActions` Common Methods
+
+    [php]
+    class mymoduleActions extends sfActions
+    {
+      public function executeIndex()
+      {
+        // Retrieving request parameters
+        $password    = $this->getRequestParameter('password');
+
+        // Retrieving controller information
+        $moduleName  = $this->getModuleName();
+        $actionName  = $this->getActionName();
+
+        // Retrieving framework core objects
+        $request     = $this->getRequest();
+        $userSession = $this->getUser();
+        $response    = $this->getResponse();
+        $controller  = $this->getController();
+        $context     = $this->getContext();
+
+        // Setting action variables to pass information to the template
+        $this->setVar('foo', 'bar');
+        $this->foo = 'bar';            // Shorter version
+
+      }
+    }
+
+>**SIDEBAR**
+>The context singleton
+>
+>You already saw, in the front controller, a call to sfContext::getInstance(). In an action, the getContext() method returns the same singleton. It is a very useful object that stores a reference to all the symfony core objects related to a given request, and offers an accessor for each of them:
+>
+>`sfController`: The controller object (`->getController()`) `sfRequest`: The request object (`->getRequest()`) `sfResponse`: The response object (`->getResponse()`) `sfUser`: The user session object (`->getUser()`) `sfDatabaseConnection`: The database connection (`->getDatabaseConnection()`) `sfLogger`: The logger object (`->getLogger()`) `sfI18N`: The internationalization object (`->getI18N()`)
+>
+>You can call the `sfContext::getInstance()` singleton from any part of the code.
+
+### Action Termination
+
+Various behaviors are possible at the conclusion of an action's execution. The value returned by the action method determines how the view will be rendered. Constants of the `sfView` class are used to specify which template is to be used to display the result of the action.
+
+If there is a default view to call (this is the most common case), the action should end as follows:
+
+    [php]
+    return sfView::SUCCESS;
+
+Symfony will then look for a template called `actionNameSuccess.php`. This is defined as the default action behavior, so if you omit the `return` statement in an action method, symfony will also look for an `actionNameSuccess.php` template. Empty actions will also trigger that behavior. See Listing 6-9 for examples of successful action termination.
+
+Listing 6-9 - Actions That Will Call the `indexSuccess.php` and `listSuccess.php` Templates
+
+    [php]
+    public function executeIndex()
+    {
+      return sfView::SUCCESS;
+    }
+
+    public function executeList()
+    {
+    }
+
+If there is an error view to call, the action should end like this:
+
+    [php]
+    return sfView::ERROR;
+
+Symfony will then look for a template called `actionNameError.php`.
+
+To call a custom view, use this ending:
+
+    [php]
+    return 'MyResult';
+
+Symfony will then look for a template called `actionNameMyResult.php`.
+
+If there is no view to call--for instance, in the case of an action executed in a batch process--the action should end as follows:
+
+    [php]
+    return sfView::NONE;
+
+No template will be executed in that case. It means that you can bypass completely the view layer and output HTML code directly from an action. As shown in Listing 6-10, symfony provides a specific renderText() method for this case. This can be useful when you need extreme responsiveness of the action, such as for Ajax interactions, which will be discussed in Chapter 11.
+
+Listing 6-10 - Bypassing the View by Echoing the Response and Returning `sfView::NONE`
+
+    [php]
+    public function executeIndex()
+    {
+      echo "<html><body>Hello, World!</body></html>";
+
+      return sfView::NONE;
+    }
+
+    // Is equivalent to
+    public function executeIndex()
+    {
+      return $this->renderText("<html><body>Hello, World!</body></html>");
+    }
+
+In some cases, you need to send an empty response but with some headers defined in it (especially the `X-JSON` header). Define the headers via the `sfResponse` object, discussed in the next chapter, and return the `sfView::HEADER_ONLY` constant, as shown in Listing 6-11.
+
+Listing 6-11 - Escaping View Rendering and Sending Only Headers
+
+    [php]
+    public function executeRefresh()
+    {
+      $output = '<"title","My basic letter"],["name","Mr Brown">';
+      $this->getResponse()->setHttpHeader("X-JSON", '('.$output.')');
+
+      return sfView::HEADER_ONLY;
+    }
+
+If the action must be rendered by a specific template, ignore the `return` statement and use the `setTemplate()` method instead.
+
+    [php]
+    $this->setTemplate('myCustomTemplate');
+
+### Skipping to Another Action
+
+In some cases, the action execution ends by requesting a new action execution. For instance, an action handling a form submission in a POST request usually redirects to another action after updating the database. Another example is an action alias: the `index` action is often a way to display a list, and actually forwards to a `list` action.
+
+The action class provides two methods to execute another action:
+
+  * If the action forwards the call to another action:
+
+        [php]
+        $this->forward('otherModule', 'index');
+
+  * If the action results in a web redirection:
+
+        [php]
+        $this->redirect('otherModule/index');
+        $this->redirect('http://www.google.com/');
+
+>**NOTE**
+>The code located after a forward or a redirect in an action is never executed. You can consider that these calls are equivalent to a `return` statement. They throw an `sfStopException` to stop the execution of the action; this exception is later caught by symfony and simply ignored.
+
+The choice between a redirect or a forward is sometimes tricky. To choose the best solution, keep in mind that a forward is internal to the application and transparent to the user. As far as the user is concerned, the displayed URL is the same as the one requested. In contrast, a redirect is a message to the user's browser, involving a new request from it and a change in the final resulting URL.
+
+If the action is called from a submitted form with `method="post"`, you should always do a redirect. The main advantage is that if the user refreshes the resulting page, the form will not be submitted again; in addition, the back button works as expected by displaying the form and not an alert asking the user if he wants to resubmit a POST request.
+
+There is a special kind of forward that is used very commonly. The `forward404()` method forwards to a "page not found" action. This method is often called when a parameter necessary to the action execution is not present in the request (thus detecting a wrongly typed URL). Listing 6-12 shows an example of a `show` action expecting an `id` parameter.
+
+Listing 6-12 - Use of the `forward404()` Method
+
+    [php]
+    public function executeShow()
+    {
+      $article = ArticlePeer::retrieveByPK($this->getRequestParameter('id'));
+      if (!$article)
+      {
+        $this->forward404();
+      }
+    }
+
+>**TIP**
+>If you are looking for the error 404 action and template, you will find them in the `$sf_symfony_ data_dir/modules/default/` directory. You can customize this page by adding a new `default` module to your application, overriding the one located in the framework, and by defining an `error404` action and an error404Success template inside. Alternatively, you can set the error_404_module and error_404_ action constants in the `settings.yml` file to use an existing action.
+
+Experience shows that, most of the time, an action makes a redirect or a forward after testing something, such as in Listing 6-12. That's why the sfActions class has a few more methods, named `forwardIf()`, `forwardUnless()`, `forward404If()`, `forward404Unless()`, `redirectIf()`, and `redirectUnless()`. These methods simply take an additional parameter representing a condition that triggers the execution if tested true (for the `xxxIf()` methods) or false (for the `xxxUnless()` methods), as illustrated in Listing 6-13.
+
+Listing 6-13 - Use of the `forward404If()` Method
+
+    [php]
+    // This action is equivalent to the one shown in Listing 6-12
+    public function executeShow()
+    {
+      $article = ArticlePeer::retrieveByPK($this->getRequestParameter('id'));
+      $this->forward404If(!$article);
+    }
+
+    // So is this one
+    public function executeShow()
+    {
+      $article = ArticlePeer::retrieveByPK($this->getRequestParameter('id'));
+      $this->forward404Unless($article);
+    }
+
+Using these methods will not only keep your code short, but it will also make it more readable.
+
+>**TIP**
+>When the action calls forward404() or its fellow methods, symfony throws an sfError404Exception that manages the 404 response. This means that if you need to display a 404 message from somewhere where you don't want to access the controller, you can just throw a similar exception.
+
+### Repeating Code for Several Actions of a Module
+
+The convention to name actions `executeActionName()` (in the case of an `sfActions` class) or execute() (in the case of an sfAction class) guarantees that symfony will find the action method. It gives you the ability to add other methods of your own that will not be considered as actions, as long as they don't start with `execute`.
+
+There is another useful convention for when you need to repeat several statements in each action before the actual action execution. You can then extract them into the `preExecute()` method of your action class. You can probably guess how to repeat statements after every action is executed: wrap them in a `postExecute()` method. The syntax of these methods is shown in Listing 6-14.
+
+Listing 6-14 - Using `preExecute`, `postExecute`, and Custom Methods in an Action Class
+
+    [php]
+    class mymoduleActions extends sfActions
+    {
+      public function preExecute()
+      {
+        // The code inserted here is executed at the beginning of each action call
+        ...
+      }
+
+      public function executeIndex()
+      {
+        ...
+      }
+
+      public function executeList()
+      {
+        ...
+        $this->myCustomMethod();  // Methods of the action class are accessible
+      }
+
+      public function postExecute()
+      {
+        // The code inserted here is executed at the end of each action call
+        ...
+      }
+
+      protected function myCustomMethod()
+      {
+        // You can also add your own methods, as long as they don't start with "execute"
+        // In that case, it's better to declare them as protected or private
+        ...
+      }
+    }
+
+Accessing the Request
+---------------------
+
+You're familiar with the `getRequestParameter('myparam')` method, used to retrieve the value of a request parameter by its name. As a matter of fact, this method is a proxy for a chain of calls to the request's parameter holder `getRequest()->getParameter('myparam')`. The action class has access to the request object, called `sfWebRequest` in symfony, and to all its methods, via the `getRequest()` method. Table 6-1 lists the most useful `sfWebRequest` methods.
+
+Table 6-1 - Methods of the `sfWebRequest` Object
+
+Name                             | Function                               |  Sample Output
+-------------------------------- | -------------------------------------- | -----------------------------------------------------------------------
+**Request Information**          |                                        |
+`getMethod()`                    | Request method                         | Returns `sfRequest::GET` or `sfRequest::POST` constants
+`getMethodName()`                | Request method name                    | `'POST'`
+`getHttpHeader('Server')`        | Value of a given HTTP header           | `'Apache/2.0.59 (Unix) DAV/2 PHP/5.1.6'`
+`getCookie('foo')`               | Value of a named cookie                | `'bar'`
+`isXmlHttpRequest()`*            | Is it an Ajax request?                 | `true`
+`isSecure()`                     | Is it an SSL request?                  | `true`
+**Request Parameters**           |                                        |
+`hasParameter('foo')`            | Is a parameter present in the request? | `true`
+`getParameter('foo')`            | Value of a named parameter             | `'bar'`
+`getParameterHolder()->getAll()` | Array of all request parameters        |
+**URI-Related Information**      |                                        |
+`getUri()`                       | Full URI                               | `'http://localhost/myapp_dev.php/mymodule/myaction'`
+`getPathInfo()`                  | Path info                              | `'/mymodule/myaction'`
+`getReferer()`**                 | Referrer                               | `'http://localhost/myapp_dev.php/'`
+`getHost()`                      | Host name                              | `'localhost'`
+`getScriptName()`                | Front controller path and name         | `'myapp_dev.php'`
+**Client Browser Information**   |                                        |
+`getLanguages()`                 | Array of accepted languages            | `Array( ` ` [0] => fr ` ` [1] => fr_FR ` ` [2] => en_US ` ` [3] => en )`
+`getCharsets()`                  | Array of accepted charsets             | `Array( ` ` [0] => ISO-8859-1 ` ` [1] => UTF-8 ` ` [2] => * )`
+getAcceptableContentType()       | Array of accepted content types        | `Array( [0] => text/xml [1] => text/html`
+
+* *Works only with prototype*
+
+** *Sometimes blocked by proxies*
+
+The `sfActions` class offers a few proxies to access the request methods more quickly, as shown in Listing 6-15.
+
+Listing 6-15 - Accessing the `sfRequest` Object Methods from an Action
+
+    [php]
+    class mymoduleActions extends sfActions
+    {
+      public function executeIndex()
+      {
+        $hasFoo = $this->getRequest()->hasParameter('foo');
+        $hasFoo = $this->hasRequestParameter('foo');  // Shorter version
+        $foo     = $this->getRequest()->getParameter('foo');
+        $foo     = $this->getRequestParameter('foo');  // Shorter version
+      }
+    }
+
+For multipart requests to which users attach files, the `sfWebRequest` object provides a means to access and move these files, as shown in Listing 6-16.
+
+Listing 6-16 - The `sfWebRequest` Object Knows How to Handle Attached Files
+
+    [php]
+    class mymoduleActions extends sfActions
+    {
+      public function executeUpload()
+      {
+        if ($this->getRequest()->hasFiles())
+        {
+          foreach ($this->getRequest()->getFileNames() as $fileName)
+          {
+            $fileSize  = $this->getRequest()->getFileSize($fileName);
+            $fileType  = $this->getRequest()->getFileType($fileName);
+            $fileError = $this->getRequest()->hasFileError($fileName);
+            $uploadDir = sfConfig::get('sf_upload_dir');
+            $this->getRequest()->moveFile('file', $uploadDir.'/'.$fileName);
+          }
+        }
+      }
+    }
+
+You don't have to worry about whether your server supports the `$_SERVER` or the `$_ENV` variables, or about default values or server-compatibility issues--the `sfWebRequest` methods do it all for you. Besides, their names are so evident that you will no longer need to browse the PHP documentation to find out how to get information from the request.
+
+User Session
+------------
+
+Symfony automatically manages user sessions and is able to keep persistent data between requests for users. It uses the built-in PHP session-handling mechanisms and enhances them to make them more configurable and easier to use.
+
+### Accessing the User Session
+
+The session object for the current user is accessed in the action with the `getUser()` method and is an instance of the `sfUser` class. This class contains a parameter holder that allows you to store any user attribute in it. This data will be available to other requests until the end of the user session, as shown in Listing 6-17. User attributes can store any type of data (strings, arrays, and associative arrays). They can be set for every individual user, even if that user is not identified.
+
+Listing 6-17 - The `sfUser` Object Can Hold Custom User Attributes Existing Across Requests
+
+    [php]
+    class mymoduleActions extends sfActions
+    {
+      public function executeFirstPage()
+      {
+        $nickname = $this->getRequestParameter('nickname');
+
+        // Store data in the user session
+        $this->getUser()->setAttribute('nickname', $nickname);
+      }
+
+      public function executeSecondPage()
+      {
+        // Retrieve data from the user session with a default value
+        $nickname = $this->getUser()->getAttribute('nickname', 'Anonymous Coward');
+      }
+    }
+
+>**CAUTION**
+>You can store objects in the user session, but it is strongly discouraged. This is because the session object is serialized between requests and stored in a file. When the session is deserialized, the class of the stored objects must already be loaded, and that's not always the case. In addition, there can be "stalled" objects if you store Propel objects.
+
+Like many getters in symfony, the `getAttribute()` method accepts a second argument, specifying the default value to be used when the attribute is not defined. To check whether an attribute has been defined for a user, use the `hasAttribute()` method. The attributes are stored in a parameter holder that can be accessed by the `getAttributeHolder()` method. It allows for easy cleanup of the user attributes with the usual parameter holder methods, as shown in Listing 6-18.
+
+Listing 6-18 - Removing Data from the User Session
+
+    [php]
+    class mymoduleActions extends sfActions
+    {
+      public function executeRemoveNickname()
+      {
+        $this->getUser()->getAttributeHolder()->remove('nickname');
+      }
+
+      public function executeCleanup()
+      {
+        $this->getUser()->getAttributeHolder()->clear();
+      }
+    }
+
+The user session attributes are also available in the templates by default via the `$sf_user` variable, which stores the current `sfUser` object, as shown in Listing 6-19.
+
+Listing 6-19 - Templates Also Have Access to the User Session Attributes
+
+    [php]
+    <p>
+      Hello, <?php echo $sf_user->getAttribute('nickname') ?>
+    </p>
+
+>**NOTE**
+>If you need to store information just for the duration of the current request--for instance, to pass information through a chain of action calls--you may prefer the `sfRequest` class, which also has `getAttribute()` and `setAttribute()` methods. Only the attributes of the `sfUser` object are persistent between requests.
+
+### Flash Attributes
+
+A recurrent problem with user attributes is the cleaning of the user session once the attribute is not needed anymore. For instance, you may want to display a confirmation after updating data via a form. As the form-handling action makes a redirect, the only way to pass information from this action to the action it redirects to is to store the information in the user session. But once the confirmation message is displayed, you need to clear the attribute; otherwise, it will remain in the session until it expires.
+
+The flash attribute is an ephemeral attribute that you can define and forget, knowing that it will disappear after the very next request and leave the user session clean for the future. In your action, define the flash attribute like this:
+
+    [php]
+    $this->setFlash('attrib', $value);
+
+The template will be rendered and delivered to the user, who will then make a new request to another action. In this second action, just get the value of the flash attribute like this:
+
+    [php]
+    $value = $this->getFlash('attrib');
+
+Then forget about it. After delivering this second page, the `attrib` flash attribute will be flushed. And even if you don't require it during this second action, the flash will disappear from the session anyway.
+
+If you need to access a flash attribute from a template, use the `$sf_flash` object:
+
+    [php]
+    <?php if ($sf_flash->has('attrib')): ?>
+      <?php echo $sf_flash->get('attrib') ?>
+    <?php endif; ?>
+
+or just:
+
+    [php]
+    <?php echo $sf_flash->get('attrib') ?>
+
+Flash attributes are a clean way of passing information to the very next request.
+
+### Session Management
+
+Symfony's session-handling feature completely masks the client and server storage of the session IDs to the developer. However, if you want to modify the default behaviors of the session-management mechanisms, it is still possible. This is mostly for advanced users.
+
+On the client side, sessions are handled by cookies. The symfony session cookie is called `symfony`, but you can change its name by editing the `factories.yml` configuration file, as shown in Listing 6-20.
+
+Listing 6-20 - Changing the Session Cookie Name, in `apps/myapp/config/factories.yml`
+
+    all:
+      storage:
+        class: sfSessionStorage
+        param:
+          session_name: my_cookie_name
+
+>**TIP**
+>The session is started (with the PHP function `session_start()`) only if the `auto_start` parameter is set to true in factories.yml (which is the case by default). If you want to start the user session manually, disable this setting of the storage factory.
+
+Symfony's session handling is based on PHP sessions. This means that if you want the client-side management of sessions to be handled by URL parameters instead of cookies, you just need to change the use_trans_sid setting in your php.ini. Be aware that this is not recommended.
+
+    session.use_trans_sid = 1
+
+On the server side, symfony stores user sessions in files by default. You can store them in your database by changing the value of the `class` parameter in `factories.yml`, as shown in Listing 6-21.
+
+Listing 6-21 - Changing the Server Session Storage, in `apps/myapp/config/factories.yml`
+
+    all:
+      storage:
+        class: sfMySQLSessionStorage
+        param:
+          db_table: SESSION_TABLE_NAME      # Name of the table storing the sessions
+          database: DATABASE_CONNECTION     # Name of the database connection to use
+
+The available session storage classes are `sfMySQLSessionStorage`, `sfPostgreSQLSessionStorage`, and `sfPDOSessionStorage`; the latter is preferred. The optional `database` setting defines the database connection to be used; symfony will then use `databases.yml` (see Chapter 8) to determine the connection settings (host, database name, user, and password) for this connection.
+
+Session expiration occurs automatically after sf_timeout seconds. This constant is 30 minutes by default and can be modified for each environment in the `settings.yml` configuration file, as shown in Listing 6-22.
+
+Listing 6-22 - Changing Session Lifetime, in `apps/myapp/config/settings.yml`
+
+    default:
+      .settings:
+        timeout:     1800           # Session lifetime in seconds
+
+Action Security
+---------------
+
+The ability to execute an action can be restricted to users with certain privileges. The tools provided by symfony for this purpose allow the creation of secure applications, where users need to be authenticated before accessing some features or parts of the application. Securing an application requires two steps: declaring the security requirements for each action and logging in users with privileges so that they can access these secure actions.
+
+### Access Restriction
+
+Before being executed, every action passes by a special filter that checks if the current user has the privileges to access the requested action. In symfony, privileges are composed of two parts:
+
+  * Secure actions require users to be authenticated.
+  * Credentials are named security privileges that allow organizing security by group.
+
+Restricting access to an action is simply made by creating and editing a YAML configuration file called `security.yml` in the module `config/` directory. In this file, you can specify the security requirements that users must fulfill for each action or for `all` actions. Listing 6-23 shows a sample `security.yml`.
+
+Listing 6-23 - Setting Access Restrictions, in `apps/myapp/modules/mymodule/config/security.yml`
+
+    read:
+      is_secure:   off       # All users can request the read action
+
+    update:
+      is_secure:   on        # The update action is only for authenticated users
+
+    delete:
+      is_secure:   on        # Only for authenticated users
+      credentials: admin     # With the admin credential
+
+    all:
+      is_secure:  off        # off is the default value anyway
+
+Actions are not secure by default, so when there is no `security.yml` or no mention of an action in it, actions are accessible by everyone. If there is a `security.yml`, symfony looks for the name of the requested action and, if it exists, checks the fulfillment of the security requirements. What happens when a user tries to access a restricted action depends on his credentials:
+
+  * If the user is authenticated and has the proper credentials, the action is executed.
+  * If the user is not identified, he will be redirected to the default login action.
+  * If the user is identified but doesn't have the proper credentials, he will be redirected to the default secure action, shown in Figure 6-1.
+
+The default login and secure pages are pretty simple, and you will probably want to customize them. You can configure which actions are to be called in case of insufficient privileges in the application `settings.yml` by changing the value of the properties shown in Listing 6-24.
+
+Figure 6-1 - The default secure action page
+
+![The default secure action page](/images/book/F0601.jpg "The default secure action page")
+
+Listing 6-24 - Default Security Actions Are Defined in `apps/myapp/config/settings.yml`
+
+    all:
+      .actions:
+        login_module:           default
+        login_action:           login
+
+        secure_module:          default
+        secure_action:          secure
+
+### Granting Access
+
+To get access to restricted actions, users need to be authenticated and/or to have certain credentials. You can extend a user's privileges by calling methods of the `sfUser` object. The authenticated status of the user is set by the `setAuthenticated()` method. Listing 6-25 shows a simple example of user authentication.
+
+Listing 6-25 - Setting the Authenticated Status of a User
+
+    [php]
+    class myAccountActions extends sfActions
+    {
+      public function executeLogin()
+      {
+        if ($this->getRequestParameter('login') == 'foobar')
+        {
+          $this->getUser()->setAuthenticated(true);
+        }
+      }
+
+      public function executeLogout()
+      {
+        $this->getUser()->setAuthenticated(false);
+      }
+    }
+
+Credentials are a bit more complex to deal with, since you can check, add, remove, and clear credentials. Listing 6-26 describes the credential methods of the `sfUser` class.
+
+Listing 6-26 - Dealing with User Credentials in an Action
+
+    [php]
+    class myAccountActions extends sfActions
+    {
+      public function executeDoThingsWithCredentials()
+      {
+        $user = $this->getUser();
+
+        // Add one or more credentials
+        $user->addCredential('foo');
+        $user->addCredentials('foo', 'bar');
+
+        // Check if the user has a credential
+        echo $user->hasCredential('foo');                     =>   true
+
+        // Check if the user has one of the credentials
+        echo $user->hasCredential(array('foo', 'bar'));       =>   true
+
+        // Check if the user has both credentials
+        echo $user->hasCredential(array('foo', 'bar'), true); =>   true
+
+        // Remove a credential
+        $user->removeCredential('foo');
+        echo $user->hasCredential('foo');                     =>   false
+
+        // Remove all credentials (useful in the logout process)
+        $user->clearCredentials();
+        echo $user->hasCredential('bar');                     =>   false
+      }
+    }
+
+If a user has the `'foo'` credential, that user will be able to access the actions for which the `security.yml` requires that credential. Credentials can also be used to display only authorized content in a template, as shown in Listing 6-27.
+
+Listing 6-27 - Dealing with User Credentials in a Template
+
+    [php]
+    <ul>
+      <li><?php echo link_to('section1', 'content/section1') ?></li>
+      <li><?php echo link_to('section2', 'content/section2') ?></li>
+      <?php if ($sf_user->hasCredential('section3')): ?>
+      <li><?php echo link_to('section3', 'content/section3') ?></li>
+      <?php endif; ?>
+    </ul>
+
+As for the authenticated status, credentials are often given to users during the login process. This is why the `sfUser` object is often extended to add login and logout methods, in order to set the security status of users in a central place.
+
+>**TIP**
+>Among the symfony plug-ins, the `sfGuardPlugin` extends the session class to make login and logout easy. Refer to Chapter 17 for more information.
+
+### Complex Credentials
+
+The YAML syntax used in the security.yml file allows you to restrict access to users having a combination of credentials, using either AND-type or OR-type associations. With such a combination, you can build a complex workflow and user privilege management system--for instance, a content management system (CMS) back-office accessible only to users with the admin credential, where articles can be edited only by users with the `editor` credential and published only by the ones with the `publisher` credential. Listing 6-28 shows this example.
+
+Listing 6-28 - Credentials Combination Syntax
+
+    editArticle:
+      credentials: [ admin, editor ]              # admin AND editor
+
+    publishArticle:
+      credentials: [ admin, publisher ]           # admin AND publisher
+
+    userManagement:
+      credentials: [[ admin, superuser ]]         # admin OR superuser
+
+Each time you add a new level of square brackets, the logic swaps between AND and OR. So you can create very complex credential combinations, such as this:
+
+    credentials: [[root, [supplier, [owner, quasiowner]], accounts]]
+                 # root OR (supplier AND (owner OR quasiowner)) OR accounts
+
+Validation and Error-Handling Methods
+-------------------------------------
+
+Validating the action input--mostly request parameters--is a repetitive and tedious task. Symfony offers a built-in request validation system, using methods of the action class.
+
+Let's start with an example. When a user makes a request for `myAction`, symfony always looks for a method called `validateMyAction()` first. If it is found, then symfony executes it. The return value of this validation method determines the next method to be executed: if it returns `true`, then `executeMyAction()` is executed; otherwise, `handleErrorMyAction()` is executed. And, if in the latter case, handleErrorMyAction() doesn't exist, symfony looks for a generic handleError() method. If that doesn't exist either, it simply returns `sfView::ERROR` to render the `myActionError. php` template. Figure 6-2 depicts this process.
+
+Figure 6-2 - The validation process
+
+![The validation process](/images/book/F0602.png "The validation process")
+
+So the key to validation is to respect the naming conventions for the action methods:
+
+  * `validateActionName` is the validation method, returning `true` or `false`. It is the first method looked for when the action `ActionName` is requested. If it doesn't exist, the action method is executed directly.
+  * `hand`leErrorActionName is the method called when the validation method fails. If it doesn't exist, the `Error` template is displayed.
+  * `executeActionName` is the action method. It must exist for all actions.
+
+Listing 6-29 shows an example of an action class with validation methods. Whether the validation passes or fails in this example, the `myActionSuccess.php` template will be executed, but not with the same parameters.
+
+Listing 6-29 - Sample Validation Methods
+
+    [php]
+    class mymoduleActions extends sfActions
+    {
+      public function validateMyAction()
+      {
+        return ($this->getRequestParameter('id') > 0);
+      }
+
+      public function handleErrorMyAction()
+      {
+        $this->message = "Invalid parameters";
+
+        return sfView::SUCCESS;
+      }
+
+      public function executeMyAction()
+      {
+        $this->message = "The parameters are correct";
+      }
+    }
+
+You can put any code you want in the `validate()` methods. Just make sure they return either `true` or `false`. As it is a method of the `sfActions` class, it has access to the `sfRequest` and `sfUser` objects as well, which can be really useful for input and context validation.
+
+You could use this mechanism to implement form validation (that is, control the values entered by the user in a form before processing it), but this is the type of repetitive task for which symfony provides automated tools, as described in Chapter 10.
+
+Filters
+-------
+
+The security process can be understood as a filter by which all requests must pass before executing the action. According to some tests executed in the filter, the processing of the request is modified--for instance, by changing the action executed (default/secure instead of the requested action in the case of the security filter). Symfony extends this idea to filter classes. You can specify any number of filter classes to be executed before the action execution or before the response rendering, and do this for every request. You can see filters as a way to package some code, similar to `preExecute()` and `postExecute()`, but at a higher level (for a whole application instead of for a whole module).
+
+### The Filter Chain
+
+Symfony actually sees the processing of a request as a chain of filters. When a request is received by the framework, the first filter (which is always the `sfRenderingFilter`) is executed. At some point, it calls the next filter in the chain, then the next, and so on. When the last filter (which is always `sfExecutionFilter`) is executed, the previous filter can finish, and so on back to the rendering filter. Figure 6-3 illustrates this idea with a sequence diagram, using an artificially small filter chain (the real one contains more filters).
+
+Figure 6-3 - Sample filter chain
+
+![Sample filter chain](/images/book/F0603.png "Sample filter chain")
+
+This process justifies the structure of the filter classes. They all extend the `sfFilter` class, and contain one `execute()` method, expecting a `$filterChain` object as parameter. Somewhere in this method, the filter passes to the next filter in the chain by calling `$filterChain->execute()`. See Listing 6-30 for an example. So basically, filters are divided into two parts:
+
+  * The code before the call to `$filterChain->execute()` executes before the action execution.
+  * The code after the call to `$filterChain->execute()` executes after the action execution and before the rendering.
+
+Listing 6-30 - Filter Class Struture
+
+    [php]
+    class myFilter extends sfFilter
+    {
+      public function execute ($filterChain)
+      {
+        // Code to execute before the action execution
+        ...
+
+        // Execute next filter in the chain
+        $filterChain->execute();
+
+        // Code to execute after the action execution, before the rendering
+        ...
+      }
+    }
+
+The default filter chain is defined in an application configuration file called `filters.yml`, and is shown in Listing 6-31. This file lists the filters that are to be executed for every request.
+
+Listing 6-31 - Default Filter Chain, in `myapp/config/filters.yml`
+
+    rendering: ~
+    web_debug: ~
+    security:  ~
+
+    # Generally, you will want to insert your own filters here
+
+    cache:     ~
+    common:    ~
+    flash:     ~
+    execution: ~
+
+These declarations have no parameter (the tilde character, `~`, means "null" in YAML), because they inherit the parameters defined in the symfony core. In the core, symfony defines `class` and `param` settings for each of these filters. For instance, Listing 6-32 shows the default parameters for the `rendering` filter.
+
+Listing 6-32 - Default Parameters of the rendering Filter, in $sf_symfony_data_dir/config/filters.yml
+
+    rendering:
+      class: sfRenderingFilter   # Filter class
+      param:                     # Filter parameters
+        type: rendering
+
+By leaving the empty value (`~`) in the application `filters.yml`, you tell symfony to apply the filter with the default settings defined in the core.
+
+You can customize the filter chain in various ways:
+
+  * Disable some filters from the chain by adding an `enabled: off` parameter. For instance, to disable the web debug filter, write:
+
+        web_debug:
+          enabled: off
+
+  * Do not remove an entry from the `filters.yml` to disable a filter; symfony would throw an exception in this case.
+  * Add your own declarations somewhere in the chain (usually after the `security` filter) to add a custom filter (as discussed in the next section). Be aware that the `rendering` filter must be the first entry, and the `execution` filter must be the last entry of the filter chain.
+  * Override the default class and parameters of the default filters (notably to modify the security system and use your own security filter).
+
+>**TIP**
+>The `enabled: off` parameter works well to disable your own filters, but you can deactivate the default filters via the `settings.yml` file, by modifying the values of the `web_debug`, `use_security`, `cache`, and `use_flash` settings. This is because each of the default filters has a `condition` parameter that tests the value of these settings.
+
+### Building Your Own Filter
+
+It is pretty simple to build a filter. Create a class definition similar to the one shown in Listing 6-30, and place it in one of the project's lib/ folders to take advantage of the autoloading feature.
+
+As an action can forward or redirect to another action and consequently relaunch the full chain of filters, you might want to restrict the execution of your own filters to the first action call of the request. The `isFirstCall()` method of the `sfFilter` class returns a Boolean for this purpose. This call only makes sense before the action execution.
+
+These concepts are clearer with an example. Listing 6-33 shows a filter used to auto-log users with a specific `MyWebSite` cookie, which is supposedly created by the login action. It is a rudimentary but working way to implement the "remember me" feature offered in login forms.
+
+Listing 6-33 - Sample Filter Class File, Saved in `apps/myapp/lib/rememberFilter.class.php`
+
+    [php]
+    class rememberFilter extends sfFilter
+    {
+      public function execute($filterChain)
+      {
+        // Execute this filter only once
+        if ($this->isFirstCall())
+        {
+          // Filters don't have direct access to the request and user objects.
+          // You will need to use the context object to get them
+          $request = $this->getContext()->getRequest();
+          $user    = $this->getContext()->getUser();
+
+          if ($request->getCookie('MyWebSite'))
+          {
+            // sign in
+            $user->setAuthenticated(true);
+          }
+        }
+
+        // Execute next filter
+        $filterChain->execute();
+      }
+    }
+
+In some cases, instead of continuing the filter chain execution, you will need to forward to a specific action at the end of a filter. `sfFilter` doesn't have a `forward()` method, but `sfController` does, so you can simply do that by calling the following:
+
+    [php]
+    return $this->getController()->forward('mymodule', 'myAction');
+
+>**NOTE**
+>The `sfFilter` class has an `initialize()` method, executed when the filter object is created. You can override it in your custom filter if you need to deal with filter parameters (defined in `filters.yml`, as described next) in your own way.
+
+### Filter Activation and Parameters
+
+Creating a filter file is not enough to activate it. You need to add your filter to the filter chain, and for that, you must declare the filter class in the `filters.yml`, located in the application or in the module `config/` directory, as shown in Listing 6-34.
+
+Listing 6-34 - Sample Filter Activation File, Saved in `apps/myapp/config/filters.yml`
+
+    rendering: ~
+    web_debug: ~
+    security:  ~
+
+    remember:                 # Filters need a unique name
+      class: rememberFilter
+      param:
+        cookie_name: MyWebSite
+        condition:   %APP_ENABLE_REMEMBER_ME%
+
+    cache:     ~
+    common:    ~
+    flash:     ~
+    execution: ~
+
+When activated, the filter is executed for each request. The filter configuration file can contain one or more parameter definitions under the `param` key. The filter class has the ability to get the value of these parameters with the getParameter() method. Listing 6-35 demonstrates how to get a filter parameter value.
+
+Listing 6-35 - Getting the Parameter Value, in `apps/myapp/lib/rememberFilter.class.php`
+
+    [php]
+    class rememberFilter extends sfFilter
+    {
+      public function execute ($filterChain)
+      {
+          ...
+          if ($request->getCookie($this->getParameter('cookie_name')))
+          ...
+      }
+    }
+
+The `condition` parameter is tested by the filter chain to see if the filter must be executed. So your filter declarations can rely on an application configuration, just like the one in Listing 6-34. The remember filter will be executed only if your application `app.yml` shows this:
+
+    all:
+      enable_remember_me: on
+
+### Sample Filters
+
+The filter feature is useful to repeat code for every action. For instance, if you use a distant analytics system, you probably need to put a code snippet calling a distant tracker script in every page. You could put this code in the global layout, but then it would be active for all of the application. Alternatively, you could place it in a filter, such as the one shown in Listing 6-36, and activate it on a per-module basis.
+
+Listing 6-36 - Google Analytics Filter
+
+    [php]
+    class sfGoogleAnalyticsFilter extends sfFilter
+    {
+      public function execute($filterChain)
+      {
+        // Nothing to do before the action
+        $filterChain->execute();
+
+        // Decorate the response with the tracker code
+        $googleCode = '
+    <script src="http://www.google-analytics.com/urchin.js"  type="text/javascript">
+    </script>
+    <script type="text/javascript">
+      _uacct="UA-'.$this->getParameter('google_id').'";urchinTracker();
+    </script>';
+        $response = $this->getContext()->getResponse();
+        $response->setContent(str_ireplace('</body>', $googleCode.'</body>',$response->getContent()));
+       }
+    }
+
+Be aware that this filter is not perfect, as it should not add the tracker on responses that are not HTML.
+
+Another example would be a filter that switches the request to SSL if it is not already, to secure the communication, as shown in Listing 6-37.
+
+Listing 6-37 - Secure Communication Filter
+
+    [php]
+    class sfSecureFilter extends sfFilter
+    {
+      public function execute($filterChain)
+      {
+        $context = $this->getContext();
+        $request = $context->getRequest();
+        if (!$request->isSecure())
+        {
+          $secure_url = str_replace('http', 'https', $request->getUri());
+          return $context->getController()->redirect($secure_url);
+          // We don't continue the filter chain
+        }
+        else
+        {
+          // The request is already secure, so we can continue
+          $filterChain->execute();
+        }
+      }
+    }
+
+Filters are used extensively in plug-ins, as they allow you to extend the features of an application globally. Refer to Chapter 17 to learn more about plug-ins, and see the online wiki ([http://www.symfony-project.com/trac/wiki](http://www.symfony-project.com/trac/wiki)) for more filter examples.
+
+Module Configuration
+--------------------
+
+A few module behaviors rely on configuration. To modify them, you must create a `module.yml` file in the module's `config/` directory and define settings on a per-environment basis (or under the `all:` header for all environments). Listing 6-38 shows an example of a `module.yml` file for the `mymodule` module.
+
+Listing 6-38 - Module Configuration, in `apps/myapp/modules/mymodule/config/module.yml`
+
+    all:                 # For all environments
+      enabled:     true
+      is_internal: false
+      view_name:   sfPhpView
+
+The enabled parameter allows you to disable all actions of a module. All actions are redirected to the `module_disabled_module`/`module_disabled_action` action (as defined in `settings.yml`).
+
+The is_internal parameter allows you to restrict the execution of all actions of a module to internal calls. For example, this is useful for mail actions that you must be able to call from another action, to send an e-mail message, but not from the outside.
+
+The view_name parameter defines the view class. It must inherit from `sfView`. Overriding this value allows you to use other view systems, with other templating engines, such as Smarty.
+
+Summary
+-------
+
+In symfony, the controller layer is split into two parts: the front controller, which is the unique entry point to the application for a given environment, and the actions, which contain the page logic. An action has the ability to determine how its view will be executed, by returning one of the `sfView` constants. Inside an action, you can manipulate the different elements of the context, including the request object (`sfRequest`) and the current user session object (`sfUser`).
+
+Combining the power of the session object, the action object, and the security configuration provides a complete security system, with access restriction and credentials. Special `validate()` and `handleError()` methods in actions allow handling of request validation. And if the `preExecute()` and `postExecute()` methods are made for reusability of code inside a module, the filters authorize the same reusability for all the applications by making controller code executed for every request.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/07-Inside-the-View-Layer.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/07-Inside-the-View-Layer.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/07-Inside-the-View-Layer.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,986 @@
+Chapter 7 - Inside The View Layer
+=================================
+
+The view is responsible for rendering the output correlated to a particular action. In symfony, the view consists of several parts, with each part designed to be easily modified by the person who usually works with it.
+
+* Web designers generally work on the templates (the presentation of the current action data) and on the layout (containing the code common to all pages). These are written in HTML with small embedded chunks of PHP, which are mostly calls to helpers.
+* For reusability, developers usually package template code fragments into partials or components. They use slots and component slots to affect more than one zone of the layout. Web designers can work on these template fragments as well.
+* Developers focus on the YAML view configuration file (setting the properties of the response and other interface elements) and on the response object. When dealing with variables in the templates, the risks of cross-site scripting must not be ignored, and a good comprehension of output escaping techniques is required to safely record user data.
+
+But whatever your role is, you will find useful tools to speed up the tedious job of presenting the results of the action. This chapter covers all of these tools.
+
+Templating
+----------
+
+Listing 7-1 shows a typical symfony template. It contains some HTML code and some basic PHP code, usually calls to variables defined in the action (via `$this->name = 'foo';`) and helpers.
+
+Listing 7-1 - A Sample indexSuccess.php Template
+
+    [php]
+    <h1>Welcome</h1>
+    <p>Welcome back, <?php echo $name ?>!</p>
+    <ul>What would you like to do?
+      <li><?php echo link_to('Read the last articles', 'article/read') ?></li>
+      <li><?php echo link_to('Start writing a new one', 'article/write') ?></li>
+    </ul>
+
+As explained in Chapter 4, the alternative PHP syntax is preferable for templates to make them readable for non-PHP developers. You should keep PHP code to a minimum in templates, since these files are the ones used to design the GUI of the application, and are sometimes created and maintained by another team, specialized in presentation but not in application logic. Keeping the logic inside the action also makes it easier to have several templates for a single action, without any code duplication.
+
+### Helpers
+
+Helpers are PHP functions that return HTML code and can be used in templates. In Listing 7-1, the `link_to()` function is a helper. Sometimes, helpers are just time-savers, packaging code snippets frequently used in templates. For instance, you can easily imagine the function definition for this helper:
+
+    [php]
+    <?php echo input_tag('nickname') ?>
+     => <input type="text" name="nickname" id="nickname" value="" />
+
+It should look like Listing 7-2.
+
+Listing 7-2 - Sample Helper Definition
+
+    [php]
+    function input_tag($name, $value = null)
+    {
+      return '<input type="text" name="'.$name.'" id="'.$name.'"value="'.$value.'" />';
+    }
+
+As a matter of fact, the `input_tag()` function built into symfony is a little more complicated than that, as it accepts a third parameter to add other attributes to the `<input>` tag. You can check its complete syntax and options in the online API documentation ([http://www.symfony-project.com/api/symfony.html](http://www.symfony-project.com/api/symfony.html)).
+
+Most of the time, helpers carry intelligence and save you long and complex coding:
+
+    [php]
+    <?php echo auto_link_text('Please visit our website www.example.com') ?>
+     => Please visit our website <a href="http://www.example.com">www.example.com</a>
+
+Helpers facilitate the process of writing templates and produce the best possible HTML code in terms of performance and accessibility. You can always use plain HTML, but helpers are usually faster to write.
+
+>**TIP**
+>You may wonder why the helpers are named according to the underscore syntax rather than the camelCase convention, used everywhere else in symfony. This is because helpers are functions, and all the core PHP functions use the underscore syntax convention.
+
+#### Declaring Helpers
+
+The symfony files containing helper definitions are not autoloaded (since they contain functions, not classes). Helpers are grouped by purpose. For instance, all the helper functions dealing with text are defined in a file called `TextHelper.php`, called the `Text` helper group. So if you need to use a helper in a template, you must load the related helper group earlier in the template by declaring it with the `use_helper()` function. Listing 7-3 shows a template using the `auto_link_text()` helper, which is part of the `Text` helper group.
+
+Listing 7-3 - Declaring the Use of a Helper
+
+    [php]
+    // Use a specific helper group in this template
+    <?php echo use_helper('Text') ?>
+    ...
+    <h1>Description</h1>
+    <p><?php echo auto_link_text($description) ?></p>
+
+>**TIP**
+>If you need to declare more than one helper group, add more arguments to the `use_helper()` call. For instance, to load both the `Text` and the `Javascript` helper groups in a template, call `<?php echo ` use_helper('Text', 'Javascript') ?>`.
+
+A few helpers are available by default in every template, without need for declaration. These are helpers of the following helper groups:
+
+  * `Helper`: Required for helper inclusion (the `use_helper()` function is, in fact, a helper itself)
+  * `Tag`: Basic tag helper, used by almost every helper
+  * `Url`: Links and URL management helpers
+  * `Asset`: Helpers populating the HTML `<head>` section, and providing easy links to external assets (images, JavaScript, and style sheet files)
+  * `Partial`: Helpers allowing for inclusion of template fragments
+  * `Cache`: Manipulation of cached code fragments
+  * `Form`: Form input helpers
+
+The list of the standard helpers, loaded by default for every template, is configurable in the `settings.yml` file. So if you know that you will not use the helpers of the `Cache` group, or that you will always use the ones of the Text group, modify the standard_helpers setting accordingly. This will speed up your application a bit. You cannot remove the first four helper groups in the preceding list (`Helper`, `Tag`, `Url`, and `Asset`), because they are compulsory for the templating engine to work properly. Consequently, they don't even appear in the list of standard helpers.
+
+>**TIP**
+>If you ever need to use a helper outside a template, you can still load a helper group from anywhere by calling `sfLoader::loadHelpers($helpers)`, where `$helpers` is a helper group name or an array of helper group names. For instance, if you want to use `auto_link_text()` in an action, you need to call `sfLoader::loadHelpers('Text')` first.
+
+#### Frequently Used Helpers
+
+You will learn about some helpers in detail in later chapters, in relation with the feature they are helping. Listing 7-4 gives a brief list of the default helpers that are used a lot, together with the HTML code they return.
+
+Listing 7-4 - Common Default Helpers
+
+    [php]
+    // Helper group
+    <?php echo use_helper('HelperName') ?>
+    <?php echo use_helper('HelperName1', 'HelperName2', 'HelperName3') ?>
+
+    // Tag group
+    <?php echo tag('input', array('name' => 'foo', 'type' => 'text')) ?>
+    <?php echo tag('input', 'name=foo type=text') ?>  // Alternative options syntax
+     => <input name="foo" type="text" />
+    <?php echo content_tag('textarea', 'dummy content', 'name=foo') ?>
+     => <textarea name="foo">dummy content</textarea>
+
+    // Url group
+    <?php echo link_to('click me', 'mymodule/myaction') ?>
+    => <a href="/route/to/myaction">click me</a>  // Depends on the routing settings
+
+    // Asset group
+    <?php echo image_tag('myimage', 'alt=foo size=200x100') ?>
+     => <img src="/images/myimage.png" alt="foo" width="200" height="100"/>
+    <?php echo javascript_include_tag('myscript') ?>
+     => <script language="JavaScript" type="text/javascript" src="/js/myscript.js"></script>
+    <?php echo stylesheet_tag('style') ?>
+     => <link href="/stylesheets/style.css" media="screen" rel="stylesheet"type="text/css" />
+
+There are many other helpers in symfony, and it would take a full book to describe all of them. The best reference for helpers is the online API documentation ([http:// www.symfony-project.com/api/symfony.html](http://www.symfony-project.com/api/symfony.html)), where all the helpers are well documented, with their syntax, options, and examples.
+
+#### Adding Your Own Helpers
+
+Symfony ships with a lot of helpers for various purposes, but if you don't find what you need in the API documentation, you will probably want to create a new helper. This is very easy to do.
+
+Helper functions (regular PHP functions returning HTML code) should be saved in a file called `FooBarHelper.php`, where `FooBar` is the name of the helper group. Store the file in the `apps/myapp/lib/helper/` directory (or in any `helper/` directory created under one of the `lib/` folders of your project) so it can be found automatically by the `use_helper('FooBar')` helper for inclusion.
+
+>**TIP**
+>This system even allows you to override the existing symfony helpers. For instance, to redefine all the helpers of the `Text` helper group, just create a `TextHelper.php` file in your `apps/myapp/lib/helper/` directory. Whenever you call `use_helper('Text')`, symfony will use your helper group rather than its own. But be careful: as the original file is not even loaded, you must redefine all the functions of a helper group to override it; otherwise, some of the original helpers will not be available at all.
+
+### Page Layout
+
+The template shown in Listing 7-1 is not a valid XHTML document. The `DOCTYPE` definition and the `<html>` and `<body>` tags are missing. That's because they are stored somewhere else in the application, in a file called `layout.php`, which contains the page layout. This file, also called the global template, stores the HTML code that is common to all pages of the application to avoid repeating it in every template. The content of the template is integrated into the layout, or, if you change the point of view, the layout "decorates" the template. This is an application of the decorator design pattern, illustrated in Figure 7-1.
+
+>**TIP**
+>For more information about the decorator and other design patterns, see *Patterns of Enterprise Application Architecture* by Martin Fowler (Addison-Wesley, ISBN: 0-32112-742-0).
+
+Figure 7-1 - Decorating a template with a layout
+
+![Decorating a template with a layout](/images/book/F0701.png "Decorating a template with a layout")
+
+Listing 7-5 shows the default page layout, located in the application `templates/` directory.
+
+Listing 7-5 - Default Layout, in `myproject/apps/myapp/templates/layout.php`
+
+    [php]
+    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">
+    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+    <head>
+      <?php echo include_http_metas() ?>
+      <?php echo include_metas() ?>
+      <?php echo include_title() ?>
+      <link rel="shortcut icon" href="/favicon.ico" />
+    </head>
+    <body>
+
+    <?php echo $sf_data->getRaw('sf_content') ?>
+
+    </body>
+    </html>
+
+The helpers called in the `<head>` section grab information from the response object and the view configuration. The `<body>` tag outputs the result of the template. With this layout, the default configuration, and the sample template in Listing 7-1, the processed view looks like Listing 7-6.
+
+Listing 7-6 - The Layout, the View Configuration, and the Template Assembled
+
+    [php]
+    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">
+    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+    <head>
+      <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+      <meta name="title" content="symfony project" />
+      <meta name="robots" content="index, follow" />
+      <meta name="description" content="symfony project" />
+      <meta name="keywords" content="symfony, project" />
+      <title>symfony project</title>
+      <link rel="stylesheet" type="text/css" href="/css/main.css" />
+      <link rel="shortcut icon" href="/favicon.ico">
+    </head>
+    <body>
+
+    <h1>Welcome</h1>
+    <p>Welcome back, <?php echo $name ?>!</p>
+    <ul>What would you like to do?
+      <li><?php echo link_to('Read the last articles', 'article/read') ?></li>
+      <li><?php echo link_to('Start writing a new one', 'article/write') ?></li>
+    </ul>
+
+    </body>
+    </html>
+
+The global template can be entirely customized for each application. Add in any HTML code you need. This layout is often used to hold the site navigation, logo, and so on. You can even have more than one layout, and decide which layout should be used for each action. Don't worry about JavaScript and style sheet inclusion for now; the "View Configuration" section later in this chapter shows how to handle that.
+
+### Template Shortcuts
+
+In templates, a few symfony variables are always available. These shortcuts give access to the most commonly needed information in templates, through the core symfony objects:
+
+  * `$sf_context`: The whole context object (`instance of sfContext`)
+  * `$sf_request`: The request object (`instance of` `sfRequest`)
+  * `$sf_params`: Parameters of the request
+  * `$sf_user`: The current user session object (`instance of` `sfUser`)
+
+The previous chapter detailed useful methods of the `sfRequest` and `sfUser` objects. You can actually call these methods in templates through the `$sf_request` and `$sf_user` variables. For instance, if the request includes a `total` parameter, its value is available in the template with the following:
+
+    [php]
+    // Long version
+    <?php echo $sf_request->getParameter('total'); ?>
+
+    // Shorter version
+    <?php echo $sf_params->get('total'); ?>
+
+    // Equivalent to the following action code
+    echo $this->getRequestParameter('total');
+
+Code Fragments
+--------------
+
+You may often need to include some HTML or PHP code in several pages. To avoid repeating that code, the PHP `include()` statement will suffice most of the time.
+
+For instance, if many of the templates of your application need to use the same fragment of code, save it in a file called `myFragment.php` in the global template directory (`myproject/apps/myapp/templates/`) and include it in your templates as follows:
+
+    [php]
+    <?php include(sfConfig::get('sf_app_template_dir').'/myFragment.php') ?>
+
+But this is not a very clean way to package a fragment, mostly because you can have different variable names between the fragment and the various templates including it. In addition, the symfony cache system (described in Chapter 12) has no way to detect an include, so the fragment cannot be cached independently from the template. Symfony provides three alternative types of intelligent code fragments to replace `include`s:
+
+  * If the logic is lightweight, you will just want to include a template file having access to some data you pass to it. For that, you will use a partial.
+  * If the logic is heavier (for instance, if you need to access the data model and/or modify the content according to the session), you will prefer to separate the presentation from the logic. For that, you will use a component.
+  * If the fragment is meant to replace a specific part of the layout, for which default content may already exist, you will use a slot.
+
+>**Note**
+>Another code fragment type, called a component slot, is to be used when the nature of the fragment depends on the context (for instance, if the fragment needs to be different for the actions of a given module). Component slots are described later in this chapter.
+
+The inclusion of these fragments is achieved by helpers of the Partial group. These helpers are available from any symfony template, without initial declaration.
+
+### Partials
+
+A partial is a reusable chunk of template code. For instance, in a publication application, the template code displaying an article is used in the article detail page, and also in the list of the best articles and the list of latest articles. This code is a perfect candidate for a partial, as illustrated in Figure 7-2.
+
+Figure 7-2 - Reusing partials in templates
+
+![Reusing partials in templates](/images/book/F0702.png "Reusing partials in templates")
+
+Just like templates, partials are files located in the `templates/` directory, and they contain HTML code with embedded PHP. A partial file name always starts with an underscore (`_`), and that helps to distinguish partials from templates, since they are located in the same `templates/` folders.
+
+A template can include partials whether it is in the same module, in another module, or in the global `templates/` directory. Include a partial by using the `include_partial()` helper, and specify the module and partial name as a parameter (but omit the leading underscore and the trailing `.php`), as described in Listing 7-7.
+
+Listing 7-7 - Including a Partial in a Template of the `mymodule` Module
+
+    [php]
+    // Include the myapp/modules/mymodule/templates/_mypartial1.php partial
+    // As the template and the partial are in the same module,
+    // you can omit the module name
+    <?php include_partial('mypartial1') ?>
+
+    // Include the myapp/modules/foobar/templates/_mypartial2.php partial
+    // The module name is compulsory in that case
+    <?php include_partial('foobar/mypartial2') ?>
+
+    // Include the myapp/templates/_mypartial3.php partial
+    // It is considered as part of the 'global' module
+    <?php include_partial('global/mypartial3') ?>
+
+Partials have access to the usual symfony helpers and template shortcuts. But since partials can be called from anywhere in the application, they do not have automatic access to the variables defined in the action calling the templates that includes them, unless passed explicitly as an argument. For instance, if you want a partial to have access to a `$total` variable, the action must hand it to the template, and then the template to the helper as a second argument of the `include_partial()` call, as shown in Listings 7-8, 7-9, and 7-10.
+
+Listing 7-8 - The Action Defines a Variable, in `mymodule/actions/actions.class.php`
+
+    [php]
+    class mymoduleActions extends sfActions
+    {
+      public function executeIndex()
+      {
+        $this->total = 100;
+      }
+    }
+
+Listing 7-9 - The Template Passes the Variable to the Partial, in mymodule/templates/indexSucc`ess.php`
+
+    [php]
+    <p>Hello, world!</p>
+    <?php include_partial('mypartial',
+    array('mytotal' => $total)
+    ) ?>
+
+Listing 7-10 - The Partial Can Now Use the Variable, in `mymodule/templates/_mypartial.php`
+
+    [php]
+    <p>Total: <?php echo $mytotal ?></p>
+
+>**TIP**
+>All the helpers so far were called by `<?php echo functionName() ?>`. The partial helper, however, is simply called by `<?php include_partial() ?>`, without `echo`, to make it behave similar to the regular PHP `include()` statement. If you ever need a function that returns the content of a partial without actually displaying it, use `get_partial()` instead. All the `include_` helpers described in this chapter have a `get_` counterpart that can be called together with an `echo` statement.
+
+### Components
+
+In Chapter 2, the first sample script was split into two parts to separate the logic from the presentation. Just like the MVC pattern applies to actions and templates, you may need to split a partial into a logic part and a presentation part. In such a case, you should use a component.
+
+A component is like an action, except it's much faster. The logic of a component is kept in a class inheriting from `sfComponents`, located in an `action/components.class.php` file. Its presentation is kept in a partial. Methods of the `sfComponents` class start with the word `execute`, just like actions, and they can pass variables to their presentation counterpart in the same way that actions can pass variables. Partials that serve as presentation for components are named by the component (without the leading `execute`, but with an underscore instead). Table 7-1 compares the naming conventions for actions and components.
+
+Table 7-1 - Action and Component Naming Conventions
+
+Convention               |  Actions              |  Components
+------------------------ | --------------------- | ----------------------
+Logic file               | `actions.class.php`   | `components.class.php`
+Logic class extends      | `sfActions`           | `sfComponents`
+Method naming            | `executeMyAction()`   | `executeMyComponent()`
+Presentation file naming | `myActionSuccess.php` | `_myComponent.php`
+
+>**TIP**
+>Just as you can separate actions files, the `sfComponents` class has an `sfComponent` counterpart that allows for single component files with the same type of syntax.
+
+For instance, suppose you have a sidebar displaying the latest news headlines for a given subject, depending on the user's profile, which is reused in several pages. The queries necessary to get the news headlines are too complex to appear in a simple partial, so they need to be moved to an action-like file--a component. Figure 7-3 illustrates this example.
+
+For this example, shown in Listings 7-11 and 7-12, the component will be kept in its own module (called `news`), but you can mix components and actions in a single module if it makes sense from a functional point of view.
+
+Figure 7-3 - Using components in templates
+
+![Using components in templates](/images/book/F0703.png "Using components in templates")
+
+Listing 7-11 - The Components Class, in `modules/news/actions/components.class.php`
+
+    [php]
+    <?php
+
+    class newsComponents extends sfComponents
+    {
+      public function executeHeadlines()
+      {
+        $c = new Criteria();
+        $c->addDescendingOrderByColumn(NewsPeer::PUBLISHED_AT);
+        $c->setLimit(5);
+        $this->news = NewsPeer::doSelect($c);
+      }
+    }
+
+Listing 7-12 - The Partial, in `modules/news/templates/_headlines.php`
+
+    [php]
+    <div>
+      <h1>Latest news</h1>
+      <ul>
+      <?php foreach($news as $headline): ?>
+        <li>
+          <?php echo $headline->getPublishedAt() ?>
+          <?php echo link_to($headline->getTitle(),'news/show?id='.$headline->getId()) ?>
+        </li>
+      <?php endforeach ?>
+      </ul>
+    </div>
+
+Now, every time you need the component in a template, just call this:
+
+    [php]
+    <?php include_component('news', 'headlines') ?>
+
+Just like the partials, components accept additional parameters in the shape of an associative array. The parameters are available to the partial under their name, and in the component via the `$this` object. See Listing 7-13 for an example.
+
+Listing 7-13 - Passing Parameters to a Component and Its Template
+
+    [php]
+    // Call to the component
+    <?php include_component('news', 'headlines', array('foo' => 'bar')) ?>
+
+    // In the component itself
+    echo $this->foo;
+     => 'bar'
+
+    // In the _headlines.php partial
+    echo $foo;
+     => 'bar'
+
+You can include components in components, or in the global layout, as in any regular template. Like actions, components' `execute` methods can pass variables to the related partial and have access to the same shortcuts. But the similarities stop there. A component doesn't handle security or validation, cannot be called from the Internet (only from the application itself), and doesn't have various return possibilities. That's why a component is faster to execute than an action.
+
+### Slots
+
+Partials and components are great for reusability. But in many cases, code fragments are required to fill a layout with more than one dynamic zone. For instance, suppose that you want to add some custom tags in the `<head>` section of the layout, depending on the content of the action. Or, suppose that the layout has one major dynamic zone, which is filled by the result of the action, plus a lot of other smaller ones, which have a default content defined in the layout but can be overridden at the template level.
+
+For these situations, the solution is a slot. Basically, a slot is a placeholder that you can put in any of the view elements (in the layout, a template, or a partial). Filling this placeholder is just like setting a variable. The filling code is stored globally in the response, so you can define it anywhere (in the layout, a template, or a partial). Just make sure to define a slot before including it, and remember that the layout is executed after the template (this is the decoration process), and the partials are executed when they are called in a template. Does it sound too abstract? Let's see an example.
+
+Imagine a layout with one zone for the template and two slots: one for the sidebar and the other for the footer. The slot values are defined in the templates. During the decoration process, the layout code wraps the template code, and the slots are filled with the previously defined values, as illustrated in Figure 7-4. The sidebar and the footer can then be contextual to the main action. This is like having a layout with more than one "hole."
+
+Figure 7-4 - Layout slots defined in a template
+
+![Layout slots defined in a template](/images/book/F0704.png "Layout slots defined in a template")
+
+Seeing some code will clarify things further. To include a slot, use the `include_slot()` helper. The `has_slot()` helper returns `true` if the slot has been defined before, providing a fallback mechanism as a bonus. For instance, define a placeholder for a `'sidebar'` slot in the layout and its default content as shown in Listing 7-14.
+
+Listing 7-14 - Including a `'sidebar'` Slot in the Layout
+
+    [php]
+    <div id="sidebar">
+    <?php if (has_slot('sidebar')): ?>
+      <?php include_slot('sidebar') ?>
+    <?php else: ?>
+      <!-- default sidebar code -->
+      <h1>Contextual zone</h1>
+      <p>This zone contains links and information
+      relative to the main content of the page.</p>
+    <?php endif; ?>
+    </div>
+
+Each template has the ability to define the contents of a slot (actually, even partials can do it). As slots are meant to hold HTML code, symfony offers a convenient way to define them: just write the slot code between a call to the `slot()` and `end_slot()` helpers, as in Listing 7-15.
+
+Listing 7-15 - Overriding the `'sidebar'` Slot Content in a Template
+
+    [php]
+    ...
+    <?php slot('sidebar') ?>
+      <!-- custom sidebar code for the current template-->
+      <h1>User details</h1>
+      <p>name:  <?php echo $user->getName() ?></p>
+      <p>email: <?php echo $user->getEmail() ?></p>
+    <?php end_slot() ?>
+
+The code between the slot helpers is executed in the context of the template, so it has access to all the variables that were defined in the action. Symfony will automatically put the result of this code in the response object. It will not be displayed in the template, but made available for future `include_slot()` calls, like the one in Listing 7-14.
+
+Slots are very useful to define zones meant to display contextual content. They can also be used to add HTML code to the layout for certain actions only. For instance, a template displaying the list of the latest news might want to add a link to an RSS feed in the `<head>` part of the layout. This is achieved simply by adding a `'feed'` slot in the layout and overriding it in the template of the list.
+
+>**SIDEBAR**
+>Where to find template fragments
+>
+>People working on templates are usually web designers, who may not know symfony very well and may have difficulties finding template fragments, since they can be scattered all over the application. These few guidelines will make them more comfortable with the symfony templating system.
+>
+>First of all, although a symfony project contains many directories, all the layouts, templates, and template fragments files reside in directories named `templates/`. So as far as a web designer is concerned, a project structure can be reduced to something like this:
+>
+>
+>     myproject/
+>       apps/
+>         application1/
+>           templates/       # Layouts for application 1
+>           modules/
+>             module1/
+>               templates/   # Templates and partials for module 1
+>             module2/
+>               templates/   # Templates and partials for module 2
+>             module3/
+>               templates/   # Templates and partials for module 3
+>
+>
+>All other directories can be ignored.
+>
+>When meeting an `include_partial()`, web designers just need to understand that only the first argument is important. This argument's pattern is `module_name/partial_name`, and that means that the presentation code is to be found in `modules/module_name/templates/_partial_name.php`.
+>
+>For the `include_component()` helper, module name and partial name are the first two arguments. As for the rest, a general idea about what helpers are and which helpers are the most common in templates should be enough to start designing templates for symfony applications.
+
+View Configuration
+------------------
+
+In symfony, a view consists of two distinct parts:
+
+  * The HTML presentation of the action result (stored in the template, in the layout, and in the template fragments)
+  * All the rest, including the following:
+
+    * Meta declarations: Keywords, description, or cache duration.
+    * Page title: Not only does it help users with several browser windows open to find yours, but it is also very important for search sites' indexing.
+    * File inclusions: JavaScript and style sheet files.
+    * Layout: Some actions require a custom layout (pop-ups, ads, and so on) or no layout at all (such as Ajax actions).
+
+In the view, all that is not HTML is called view configuration, and symfony provides two ways to manipulate it. The usual way is through the `view.yml` configuration file. It can be used whenever the values don't depend on the context or on database queries. When you need to set dynamic values, the alternative method is to set the view configuration via the `sfResponse` object attributes directly in the action.
+
+>**NOTE**
+>If you ever set a view configuration parameter both via the `sfResponse` object and via the `view.yml` file, the `sfResponse` definition takes precedence.
+
+### The view.yml File
+
+Each module can have one `view.yml` file defining the settings of its views. This allows you to define view settings for a whole module and per view in a single file. The first-level keys of the `view.yml` file are the module view names. Listing 7-16 shows an example of view configuration.
+
+Listing 7-16 - Sample Module-Level `view.yml`
+
+    editSuccess:
+      metas:
+        title: Edit your profile
+
+    editError:
+      metas:
+        title: Error in the profile edition
+
+    all:
+      stylesheets: [my_style]
+      metas:
+        title: My website
+
+>**CAUTION**
+>Be aware that the main keys in the `view.yml` file are view names, not action names. As a reminder, a view name is composed of an action name and an action termination. For instance, if the `edit` action returns `sfView::SUCCESS` (or returns nothing at all, since it is the default action termination), then the view name is `editSuccess`.
+
+The default settings for the module are defined under the `all:` key in the module `view.yml`. The default settings for all the application views are defined in the application `view.yml`. Once again, you recognize the configuration cascade principle:
+
+  * In `apps/myapp/modules/mymodule/config/view.yml`, the per-view definitions apply only to one view and override the module-level definitions.
+  * In `apps/myapp/modules/mymodule/config/view.yml`, the `all:` definitions apply to all the actions of the module and override the application-level definitions.
+  * In `apps/myapp/config/view.yml`, the `default:` definitions apply to all modules and all actions of the application.
+
+>**TIP**
+>Module-level `view.yml` files don't exist by default. The first time you need to adjust a view configuration parameter for a module, you will have to create an empty `view.yml` in its `config/` directory.
+
+After seeing the default template in Listing 7-5 and an example of a final response in Listing 7-6, you may wonder where the header values come from. As a matter of fact, they are the default view settings, defined in the application `view.yml` and shown in Listing 7-17.
+
+Listing 7-17 - Default Application-Level View Configuration, in `apps/myapp/config/view.yml`
+
+    default:
+      http_metas:
+        content-type: text/html
+
+      metas:
+        title:        symfony project
+        robots:       index, follow
+        description:  symfony project
+        keywords:     symfony, project
+        language:     en
+
+      stylesheets:    [main]
+
+      javascripts:    [ ]
+
+      has_layout:     on
+      layout:         layout
+
+Each of these settings will be described in detail in the "View Configuration Settings" section.
+
+### The Response Object
+
+Although part of the view layer, the response object is often modified by the action. Actions can access the symfony response object, called `sfResponse`, via the `getResponse()` method. Listing 7-18 lists some of the `sfResponse` methods often used from within an action.
+
+Listing 7-18 - Actions Have Access to the `sfResponse` Object Methods
+
+    [php]
+    class mymoduleActions extends sfActions
+    {
+      public function executeIndex()
+      {
+        $response = $this->getResponse();
+
+        // HTTP headers
+        $response->setContentType('text/xml');
+        $response->setHttpHeader('Content-Language', 'en');
+        $response->setStatusCode(403);
+        $response->addVaryHttpHeader('Accept-Language');
+        $response->addCacheControlHttpHeader('no-cache');
+
+        // Cookies
+        $response->setCookie($name, $content, $expire, $path, $domain);
+
+        // Metas and page headers
+        $response->addMeta('robots', 'NONE');
+        $response->addMeta('keywords', 'foo bar');
+        $response->setTitle('My FooBar Page');
+        $response->addStyleSheet('custom_style');
+        $response->addJavaScript('custom_behavior');
+      }
+    }
+
+In addition to the setter methods shown here, the `sfResponse` class has getters that return the current value of the response attributes.
+
+The header setters are very powerful in symfony. Headers are sent as late as possible (in the sfRenderingFilter), so you can alter them as much as you want and as late as you want. They also provide very useful shortcuts. For instance, if you don't specify a charset when you call `setContentType()`, symfony automatically adds the default charset defined in the `settings.yml` file.
+
+    [php]
+    $response->setContentType('text/xml');
+    echo $response->getContentType();
+     => 'text/xml; charset=utf-8'
+
+The status code of responses in symfony is compliant with the HTTP specification. Exceptions return a status 500, pages not found return a status 404, normal pages return a status 200, pages not modified can be reduced to a simple header with status code 304 (see Chapter 12 for details), and so on. But you can override these defaults by setting your own status code in the action with the `setStatusCode()` response method. You can specify a custom code and a custom message, or simply a custom code--in which case, symfony will add the most common message for this code.
+
+    [php]
+    $response->setStatusCode(404, 'This page no longer exists');
+
+>**TIP**
+>Before sending the headers, symfony normalizes their names. So you don't need to bother about writing `content-language` instead of `Content-Language` in a call to `setHttpHeader()`, as symfony will understand the former and automatically transform it to the latter.
+
+### View Configuration Settings
+
+You may have noticed that there are two kinds of view configuration settings:
+
+  * The ones that have a unique value (the value is a string in the view.yml file and the response uses a `set` method for those)
+  * The ones with multiple values (for which `view.yml` uses arrays and the response uses an `add` method)
+
+Keep in mind that the configuration cascade erases the unique value settings but piles up the multiple values settings. This will become more apparent as you progress through this chapter.
+
+#### Meta Tag Configuration
+
+The information written in the `<meta>` tags in the response is not displayed in a browser but is useful for robots and search engines. It also controls the cache settings of every page. Define these tags under the `http_metas:` and `metas:` keys in `view.yml`, as in Listing 7-19, or with the `addHttpMeta()` and `addMeta()` response methods in the action, as in Listing 7-20.
+
+Listing 7-19 - Meta Definition As Key: Value Pairs in `view.yml`
+
+    http_metas:
+      cache-control: public
+
+    metas:
+      description:   Finance in France
+      keywords:      finance, France
+
+Listing 7-20 - Meta Definition As Response Settings in the Action
+
+    [php]
+    $this->getResponse()->addHttpMeta('cache-control', 'public');
+    $this->getResponse()->addMeta('description', 'Finance in France');
+    $this->getResponse()->addMeta('keywords', 'finance, France');
+
+Adding an existing key will replace its current content by default. For HTTP meta tags, you can add a third parameter and set it to `false` to have the `addHttpMeta()` method (as well as the `setHttpHeader()`) append the value to the existing one, rather than replacing it.
+
+    [php]
+    $this->getResponse()->addHttpMeta('accept-language', 'en');
+    $this->getResponse()->addHttpMeta('accept-language', 'fr', false);
+    echo $this->getResponse()->getHttpHeader('accept-language');
+     => 'en, fr'
+
+In order to have these meta tags appear in the final document, the `include_http_metas()` and `include_metas()` helpers must be called in the `<head>` section (this is the case in the default layout; see Listing 7-5). Symfony automatically aggregates the settings from all the `view.yml` files (including the default one shown in Listing 7-17) and the response attribute to output proper `<meta>` tags. The example in Listing 7-19 ends up as shown in Listing 7-21.
+
+Listing 7-21 - Meta Tags Output in the Final Page
+
+    [php]
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+    <meta http-equiv="cache-control" content="public" />
+    <meta name="robots" content="index, follow" />
+    <meta name="description" content="Finance in France" />
+    <meta name="keywords" content="finance, France" />
+
+As a bonus, the HTTP header of the response is also impacted by the `http-metas:` definition, even if you don't have any `include_http_metas()` helpers in the layout, or if you have no layout at all. For instance, if you need to send a page as plain text, define the following `view.yml`:
+
+    http_metas:
+      content-type: text/plain
+
+    has_layout: false
+
+#### Title Configuration
+
+The page title is a key part to search engine indexing. It is also very useful with modern browsers that provide tabbed browsing. In HTML, the title is both a tag and meta information of the page, so the `view.yml` file sees the title: key as a child of the `metas:` key. Listing 7-22 shows the title definition in `view.yml`, and Listing 7-23 shows the definition in the action.
+
+Listing 7-22 - Title Definition in `view.yml`
+
+    indexSuccess:
+      metas:
+        title: Three little piggies
+
+Listing 7-23 - Title Definition in the Action--Allows for Dynamic Titles
+
+    [php]
+    $this->getResponse()->setTitle(sprintf('%d little piggies', $number));
+
+In the `<head>` section of the final document, the title definition sets the `<meta name="title">` tag if the `include_metas()` helper is present, and the `<title>` tag if the `include_title()` helper is present. If both are included (as in the default layout of Listing 7-5), the title appears twice in the document source (see Listing 7-6), which is harmless.
+
+#### File Inclusion Configuration
+
+Adding a specific style sheet or JavaScript file to a view is easy, as Listings 7-24 and 7-25 demonstrate.
+
+Listing 7-24 - File Inclusion in `view.yml`
+
+    indexSuccess:
+      stylesheets: [mystyle1, mystyle2]
+      javascripts: [myscript]
+
+Listing 7-25 - File Inclusion in the Action
+
+    [php]
+    $this->getResponse()->addStylesheet('mystyle1');
+    $this->getResponse()->addStylesheet('mystyle2');
+    $this->getResponse()->addJavascript('myscript');
+
+In each case, the argument is a file name. If the file has a logical extension (`.css` for a style sheet and `.js` for a JavaScript file), you can omit it. If the file has a logical location (`/css/` for a style sheet and `/js/` for a JavaScript file), you can omit it as well. Symfony is smart enough to figure out the correct extension or location.
+
+Unlike the meta and title definitions, the file inclusion definitions don't require any helper in the template or layout to be included. This means that the previous settings will output the HTML code of Listing 7-26, whatever the content of the template and the layout.
+
+Listing 7-26 - File Inclusion Result--No Need for a Helper Call in the Layout
+
+    [php]
+    <head>
+    ...
+    <link rel="stylesheet" type="text/css" media="screen" href="/css/mystyle1.css" />
+    <link rel="stylesheet" type="text/css" media="screen" href="/css/mystyle2.css" />
+    <script language="javascript" type="text/javascript" src="/js/myscript.js">
+    </script>
+    </head>
+
+>**NOTE**
+>Style sheet and JavaScript inclusions in the response are performed by a filter called sfCommonFilter. It looks for a `<head>` tag in the response, and adds the `<link>` and `<script>` just before the closing `</head>`. This means that the inclusion can't take place if there is no `<head>` tag in your layout or templates.
+
+Remember that the configuration cascade principle applies, so any file inclusion defined in the application `view.yml` makes it appear in every page of the application. Listings 7-27, 7-28, and 7-29 demonstrate this principle.
+
+Listing 7-27 - Sample Application `view.yml`
+
+    default:
+      stylesheets: [main]
+
+Listing 7-28 - Sample Module `view.yml`
+
+    indexSuccess:
+      stylesheets: [special]
+
+    all:
+      stylesheets: [additional]
+
+Listing 7-29 - Resulting `indexSuccess` View
+
+    [php]
+    <link rel="stylesheet" type="text/css" media="screen" href="/css/main.css" />
+    <link rel="stylesheet" type="text/css" media="screen" href="/css/additional.css" />
+    <link rel="stylesheet" type="text/css" media="screen" href="/css/special.css" />
+
+If you need to remove a file defined at a higher level, just add a minus sign (`-`) in front of the file name in the lower-level definition, as shown in Listing 7-30.
+
+Listing 7-30 - Sample Module `view.yml` That Removes the Files Defined at the Application Level
+
+    indexSuccess:
+      stylesheets: [-main, special]
+
+    all:
+      stylesheets: [additional]
+
+To remove all style sheets or JavaScript files, use the following syntax:
+
+    indexSuccess:
+      stylesheets: [-*]
+      javascripts: [-*]
+
+You can be more accurate and define an additional parameter to force the position where to include the file (first or last position):
+
+    // In the view.yml
+    indexSuccess:
+      stylesheets: [special: { position: first }]
+
+    [php]
+    // In the action
+    $this->getResponse()->addStylesheet('special', 'first');
+
+To specify media for a style sheet inclusion, you can change the default style sheet tag options, as shown in Listings 7-31, 7-32, and 7-33.
+
+Listing 7-31 - Style Sheet Inclusion with Media in `view.yml`
+
+    indexSuccess:
+      stylesheets: [main, paper: { media: print }]
+
+Listing 7-32 - Style Sheet Inclusion with Media in the Action
+
+    [php]
+    $this->getResponse()->addStylesheet('paper', '', array('media' => 'print'));
+
+Listing 7-33 - Resulting View
+
+    [php]
+    <link rel="stylesheet" type="text/css" media="print" href="/css/paper.css" />
+
+#### Layout Configuration
+
+According to the graphical charter of your website, you may have several layouts. Classic websites have at least two: the default layout and the pop-up layout.
+
+You have already seen that the default layout is `myproject/apps/myapp/templates/layout.php`. Additional layouts must be added in the same global `templates/` directory. If you want a view to use a `myapp/templates/my_layout.php` file, use the syntax shown in Listing 7-34 in `view.yml` or in Listing 7-35 in the action.
+
+Listing 7-34 - Layout Definition in `view.yml`
+
+    indexSuccess:
+      layout: my_layout
+
+Listing 7-35 - Layout Definition in the Action
+
+    [php]
+    $this->setLayout('my_layout');
+
+Some views don't need any layout at all (for instance, plain text pages or RSS feeds). In that case, set `has_layout` to `false`, as shown in Listings 7-36 and 7-37.
+
+Listing 7-36 - Layout Removal in `view.yml`
+
+    indexSuccess:
+      has_layout: false
+
+Listing 7-37 - Layout Removal in the Action
+
+    [php]
+    $this->setLayout(false);
+
+>**NOTE**
+>Ajax actions views have no layout by default.
+
+Component Slots
+---------------
+
+Combining the power of view components and view configuration brings a new perspective to view development: the component slot system. It is an alternative to slots focusing on reusability and layer separation. So component slots are more structured than slots, but a little slower to execute.
+
+Just like slots, component slots are named placeholders that you can declare in the view elements. The difference resides in the way the filling code is determined. For a slot, the code is set in another view element; for a component slot, the code results from the execution of a component, and the name of this component comes from the view configuration. You will understand component slots more clearly after seeing them in action.
+
+To set a component slot placeholder, use the `include_component_slot()` helper. This function expects a label as a parameter. For instance, suppose that the `layout.php` file of the application contains a contextual sidebar. Listing 7-38 shows how the component slot helper would be included.
+
+Listing 7-38 - Including a Component Slot with the Name `'sidebar'`
+
+    [php]
+    ...
+    <div id="sidebar">
+      <?php include_component_slot('sidebar') ?>
+    </div>
+
+Define the correspondence between the component slot label and a component name in the view configuration. For instance, set the default component for the `sidebar` component slot in the application `view.yml`, under the `components` header. The key is the component slot label; the value must be an array containing a module and a component name. Listing 7-39 shows an example.
+
+Listing 7-39 - Defining the Default `'sidebar'` Slot Component, in `myapp/config/view.yml`
+
+    default:
+      components:
+        sidebar:  [bar, default]
+
+So when the layout is executed, the `sidebar` component slot is filled with the result of the `executeDefault()` method of the barComponents class located in the bar module, and this method will display the `_default.php` partial located in `modules/bar/templates/`.
+
+The configuration cascade gives you the ability to override this setting for a given module. For instance, in a `user` module, you may want the contextual component to display the user name and the number of articles that the user published. In that case, specialize the sidebar slot setting in the module `view.yml`, as shown in Listing 7-40.
+
+Listing 7-40 - Specializing the 'sidebar' Slot Component, in `myapp/modules/user/config/view.yml`
+
+    all:
+      components:
+        sidebar:  [bar, user]
+
+The component definitions to handle this slot should look like the ones in Listing 7-41.
+
+Listing 7-41 - Components Used by the 'sidebar' Slot, in `modules/bar/actions/components.class.php`
+
+    [php]
+    class barComponents extends sfComponents
+    {
+      public function executeDefault()
+      {
+      }
+
+      public function executeUser()
+      {
+        $current_user = $this->getUser()->getCurrentUser();
+        $c = new Criteria();
+        $c->add(ArticlePeer::AUTHOR_ID, $current_user->getId());
+        $this->nb_articles = ArticlePeer::doCount($c);
+        $this->current_user = $current_user;
+      }
+    }
+
+Listing 7-42 shows the views for these two components.
+
+Listing 7-42 - Partials Used by the `'sidebar'` Slot Components, in `modules/bar/templates/`
+
+    [php]
+    // _default.php
+    <p>This zone contains contextual information.</p>
+
+    // _user.php
+    <p>User name: <?php echo $current_user->getName() ?></p>
+    <p><?php echo $nb_articles ?> articles published</p>
+
+Component slots can be used for breadcrumbs, contextual navigations, and dynamic insertions of all kinds. As components, they can be used in the global layout and regular templates, or even in other components. The configuration setting the component of a slot is always taken from the configuration of the last action called.
+
+If you need to suspend the use of a component slot for a given module, just declare an empty module/component for it, as shown in Listing 7-43.
+
+Listing 7-43 - Disabling a Component Slot in `view.yml`
+
+    all:
+      components:
+        sidebar:  []
+
+Output Escaping
+---------------
+
+When you insert dynamic data in a template, you must be sure about the data integrity. For instance, if data comes from forms filled in by anonymous users, there is a risk that it may include malicious scripts intended to launch cross-site scripting (XSS) attacks. You must be able to escape the output data, so that any HTML tag it contains becomes harmless.
+
+As an example, suppose that a user fills an input field with the following value:
+
+    [php]
+    <script>alert(document.cookie)</script>
+
+If you echo this value without caution, the JavaScript will execute on every browser and allow for much more dangerous attacks than just displaying an alert. This is why you must escape the value before displaying it, so that it becomes something like this:
+
+    [php]
+    &lt;script&gt;alert(document.cookie)&lt;/script&gt;
+
+You could escape your output manually by enclosing every unsure value in a call to `htmlentities()`, but that approach would be very repetitive and error-prone. Instead, symfony provides a special system, called output escaping, which automatically escapes every variable output in a template. It is activated by a simple parameter in the application `settings.yml`.
+
+### Activating Output Escaping
+
+Output escaping is configured globally for an application in the `settings.yml` file. Two parameters control the way that output escaping works: the strategy determines how the variables are made available to the view, and the method is the default escaping function applied to the data.
+
+The next sections describe these settings in detail but, basically, all you need to do to activate output escaping is to set the `escaping_strategy` parameter to `both` instead of its default value `bc`, as shown in Listing 7-44.
+
+Listing 7-44 - Activating Output Escaping, in `myapp/config/settings.yml`
+
+    all:
+      .settings:
+        escaping_strategy: both
+        escaping_method:   ESC_ENTITIES
+
+This will add `htmlentities()` to all variable output by default. For instance, suppose that you define a `test` variable in an action as follows:
+
+    [php]
+    $this->test = '<script>alert(document.cookie)</script>';
+
+With output escaping turned on, echoing this variable in the template will output the escaped data:
+
+    [php]
+    echo $test;
+     => &gt;&lt;script&gt;alert(document.cookie)&lt;/script&gt;
+
+Activating output escaping also gives access to an `$sf_data` variable in every template. It is a container object referencing all the escaped variables. So you can also output the test variable with the following:
+
+    [php]
+    echo $sf_data->get('test');
+    => &gt;&lt;script&gt;alert(document.cookie)&lt;/script&gt;
+
+>**TIP**
+>The $sf_data object implements the Array interface, so instead of using the `$sf_data->get('myvariable')`, you can retrieve escaped values by calling `$sf_data['myvariable']`. But it is not a real array, so functions like `print_r()` will not work as expected.
+
+This object also gives you access to the unescaped, or raw, data. This is useful when a variable stores HTML code meant to be interpreted by the browser, provided that you trust this variable. Call the `getRaw()` method when you need to output the raw data.
+
+    [php]
+    echo $sf_data->getRaw('test');
+     => <script>alert(document.cookie)</script>
+
+You will have to access raw data each time you need variables containing HTML to be really interpreted as HTML. You can now understand why the default layout uses `$sf_data->getRaw('sf_content')` to include the template, rather than a simpler `$sf_content`, which breaks when output escaping is activated.
+
+### Escaping Strategy
+
+The `escaping_strategy` setting determines the way variables are output by default. The following are the possible values:
+
+  * `bc` (backward compatible mode): Variables are not escaped, but an escaped version of each variable is available through the `$sf_data` container. So the data is raw by default, unless you choose to use the escaped value via the `$sf_data` object. This is the default value, and you should be aware that with this strategy, your application is subject to XSS attack risks.
+  * `both`: All variables are escaped by default. Values are also made available in the `$sf_data` container. This is the recommended strategy, since you will be at risk only if you voluntarily output raw data. In some cases, you will have to use unescaped data--for instance, if you output a variable that contains HTML with the intention that this HTML be rendered as such in the browser. So be aware that if you switch to this strategy with a partially developed application, some features may break. The best choice is to use this setting right from the beginning.
+  * `on`: Values are available only in the `$sf_data` container. This is the most secure and fastest way to deal with escaping, because each time you output a variable, you must choose if you want to use the escaped version with `get()` or the raw version with `getRaw()`. So you are always aware of the possibility that data may be corrupted.
+  * `off`: Turns off output escaping. The `$sf_data` container is not available in templates. You can choose to use this strategy rather than `bc` to speed up your application if you are sure that you will never need to access escaped data.
+
+### Escaping Helpers
+
+Escaping helpers are functions returning an escaped version of their input. They can be provided as a default `escaping_method` in the `settings.yml` file or to specify an escaping method for a specific value in the view. The following escaping helpers are available:
+
+  * `ESC_RAW`: Doesn't escape the value.
+  * `ESC_ENTITIES`: Applies the PHP function `htmlentities()` to the input with `ENT_QUOTES` as the quote style.
+  * `ESC_JS`: Escapes a value to be put into a JavaScript string that is going to be used as HTML. This is useful for escaping things where HTML is going to be dynamically changed using JavaScript.
+  * `ESC_JS_NO_ENTITIES`: Escapes a value to be put into a JavaScript string but does not add entities. This is useful if the value is going to be displayed using a dialog box (for example, for a `myString` variable used in `javascript:alert(myString);`).
+
+### Escaping Arrays and Objects
+
+Output escaping not only works for strings, but also for arrays and objects. Any values that are objects or arrays will pass on their escaped state to their children. Assuming your strategy is set to `both`, Listing 7-45 demonstrates the escaping cascade.
+
+Listing 7-45 - Escaping Also Works for Arrays and Objects
+
+    [php]
+    // Class definition
+    class myClass
+    {
+      public function testSpecialChars($value = '')
+      {
+        return '<'.$value.'>';
+      }
+    }
+
+    // In the action
+    $this->test_array = array('&', '<', '>');
+    $this->test_array_of_arrays = array(array('&'));
+    $this->test_object = new myClass();
+
+    // In the template
+    <?php foreach($test_array as $value): ?>
+      <?php echo $value ?>
+    <?php enforeach; ?>
+     => &amp; &lt; &gt;
+    <?php echo $test_array_of_arrays[0][0] ?>
+     => &amp;
+    <?php echo $test_object->testSpecialChars('&') ?>
+     => &lt;&amp;&gt;
+
+As a matter of fact, the variables in the template are not of the type you might expect. The output escaping system "decorates" them and transforms them into special objects:
+
+    [php]
+    <?php echo get_class($test_array) ?>
+     => sfOutputEscaperArrayDecorator
+    <?php echo get_class($test_object) ?>
+     => sfOutputEscaperObjectDecorator
+
+This explains why some usual PHP functions (like `array_shift()`, `print_r()`, and so on) don't work on escaped arrays anymore. But they can be still be accessed using `[]`, be traversed using foreach, and they give back the right result with `count()` (`count()` works only with PHP 5.2 or later). And in templates, the data should be read-only anyway, so most access will be through the methods that do work.
+
+You still have a way to retrieve the raw data through the `$sf_data` object. In addition, methods of escaped objects are altered to accept an additional parameter: an escaping method. So you can choose an alternative escaping method each time you display a variable in a template, or opt for the `ESC_RAW` helper to deactivate escaping. See Listing 7-46 for an example.
+
+Listing 7-46 - Methods of Escaped Objects Accept an Additional Parameter
+
+    [php]
+    <?php echo $test_object->testSpecialChars('&') ?>
+    => &lt;&amp;&gt;
+    // The three following lines return the same value
+    <?php echo $test_object->testSpecialChars('&', ESC_RAW) ?>
+    <?php echo $sf_data->getRaw('test_object')->testSpecialChars('&') ?>
+    <?php echo $sf_data->get('test_object', ESC_RAW)->testSpecialChars('&') ?>
+     => <&>
+
+If you deal with objects in your templates, you will use the additional parameter trick a lot, since it is the fastest way to get raw data on a method call.
+
+>**CAUTION**
+>The usual symfony variables are also escaped when you turn on output escaping. So be aware that `$sf_user`, `$sf_request`, `$sf_param`, and `$sf_context` still work, but their methods return escaped data, unless you add `ESC_RAW` as a final argument to their method calls.
+
+Summary
+-------
+
+All kinds of tools are available to manipulate the presentation layer. The templates are built in seconds, thanks to helpers. The layouts, partials, components, and component slots bring both modularity and reusability. The view configuration takes advantage of the speed of YAML to handle (mostly) page headers. The configuration cascade exempts you from defining every setting for each view. For every modification of the presentation that depends on dynamic data, the action has access to the `sfResponse` object. And the view is secure from XSS attacks, thanks to the output escaping system.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/08-Inside-the-Model-Layer.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/08-Inside-the-Model-Layer.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/08-Inside-the-Model-Layer.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,964 @@
+Chapter 8 - Inside The Model Layer
+==================================
+
+Much of the discussion so far has been devoted to building pages, and processing requests and responses. But the business logic of a web application relies mostly on its data model. Symfony's default model component is based on an object/relational mapping layer known as the Propel project ([http://propel.phpdb.org/](http://propel.phpdb.org/)). In a symfony application, you access data stored in a database and modify it through objects; you never address the database explicitly. This maintains a high level of abstraction and portability.
+
+This chapter explains how to create an object data model, and the way to access and modify the data in Propel. It also demonstrates the integration of Propel in Symfony.
+
+Why Use an ORM and an Abstraction Layer?
+----------------------------------------
+
+Databases are relational. PHP 5 and symfony are object-oriented. In order to most effectively access the database in an object-oriented context, an interface translating the object logic to the relational logic is required. As explained in Chapter 1, this interface is called an object-relational mapping (ORM), and it is made up of objects that give access to data and keep business rules within themselves.
+
+The main benefit of an ORM is reusability, allowing the methods of a data object to be called from various parts of the application, even from different applications. The ORM layer also encapsulates the data logic--for instance, the calculation of a forum user rating based on how many contributions were made and how popular these contributions are. When a page needs to display such a user rating, it simply calls a method of the data model, without worrying about the details of the calculation. If the calculation changes afterwards, you will just need to modify the rating method in the model, leaving the rest of the application unchanged.
+
+Using objects instead of records, and classes instead of tables, has another benefit: They allow you to add new accessors to your objects that don't necessarily match a column in a table. For instance, if you have a table called `client` with two fields named `first_name` and `last_name`, you might like to be able to require just a `Name`. In an object-oriented world, it is as easy as adding a new accessor method to the `Client` class, as in Listing 8-1. From the application point of view, there is no difference between the `FirstName`, `LastName`, and `Name` attributes of the `Client` class. Only the class itself can determine which attributes correspond to a database column.
+
+Listing 8-1 - Accessors Mask the Actual Table Structure in a Model Class
+
+    [php]
+    public function getName()
+    {
+      return $this->getFirstName.' '.$this->getLastName();
+    }
+
+All the repeated data-access functions and the business logic of the data itself can be kept in such objects. Suppose you have a `ShoppingCart` class in which you keep `Items` (which are objects). To get the full amount of the shopping cart for the checkout, write a custom method to encapsulate the actual calculation, as shown in Listing 8-2.
+
+Listing 8-2 - Accessors Mask the Data Logic
+
+    [php]
+    public function getTotal()
+    {
+      $total = 0;
+      foreach ($this->getItems() as $item)
+      {
+        $total += $item->getPrice() * $item->getQuantity();
+      }
+
+      return $total;
+    }
+
+There is another important point to consider when building data-access procedures: Database vendors use different SQL syntax variants. Switching to another database management system (DBMS) forces you to rewrite part of the SQL queries that were designed for the previous one. If you build your queries using a database-independent syntax, and leave the actual SQL translation to a third-party component, you can switch database systems without pain. This is the goal of the database abstraction layer. It forces you to use a specific syntax for queries, and does the dirty job of conforming to the DBMS particulars and optimizing the SQL code.
+
+The main benefit of an abstraction layer is portability, because it makes switching to another database possible, even in the middle of a project. Suppose that you need to write a quick prototype for an application, but the client hasn't decided yet which database system would best suit his needs. You can start building your application with SQLite, for instance, and switch to MySQL, PostgreSQL, or Oracle when the client is ready to decide. Just change one line in a configuration file, and it works.
+
+Symfony uses Propel as the ORM, and Propel uses Creole for database abstraction. These two third-party components, both developed by the Propel team, are seamlessly integrated into symfony, and you can consider them as part of the framework. Their syntax and conventions, described in this chapter, were adapted so that they differ from the symfony ones as little as possible.
+
+>**NOTE**
+>In a symfony project, all the applications share the same model. That's the whole point of the project level: regrouping applications that rely on common business rules. This is the reason that the model is independent from the applications and the model files are stored in a `lib/model/` directory at the root of the project.
+
+Symfony's Database Schema
+-------------------------
+
+In order to create the data object model that symfony will use, you need to translate whatever relational model your database has to an object data model. The ORM needs a description of the relational model to do the mapping, and this is called a schema. In a schema, you define the tables, their relations, and the characteristics of their columns.
+
+Symfony's syntax for schemas uses the YAML format. The `schema.yml` files must be located in the `myproject/config/` directory.
+
+>**NOTE**
+>Symfony also understands the Propel native XML schema format, as described in the "Beyond the schema.yml: The schema.xml" section later in this chapter.
+
+### Schema Example
+
+How do you translate a database structure into a schema? An example is the best way to understand it. Imagine that you have a blog database with two tables: `blog_article` and `blog_comment`, with the structure shown in Figure 8-1.
+
+Figure 8-1 - A blog database table structure
+
+![A blog database table structure](/images/book/F0801.png "A blog database table structure")
+
+The related `schema.yml` file should look like Listing 8-3.
+
+Listing 8-3 - Sample `schema.yml`
+
+    propel:
+      blog_article:
+        _attributes: { phpName: Article }
+        id:
+        title:       varchar(255)
+        content:     longvarchar
+        created_at:
+      blog_comment:
+        _attributes: { phpName: Comment }
+        id:
+        article_id:
+        author:      varchar(255)
+        content:     longvarchar
+        created_at:
+
+Notice that the name of the database itself (`blog`) doesn't appear in the `schema.yml` file. Instead, the database is described under a connection name (`propel` in this example). This is because the actual connection settings can depend on the environment in which your application runs. For instance, when you run your application in the development environment, you will access a development database (maybe `blog_dev`), but with the same schema as the production database. The connection settings will be specified in the `databases.yml` file, described in the "Database Connections" section later in this chapter. The schema doesn't contain any detailed connection to settings, only a connection name, to maintain database abstraction.
+
+### Basic Schema Syntax
+
+In a `schema.yml` file, the first key represents a connection name. It can contain several tables, each having a set of columns. According to the YAML syntax, the keys end with a colon, and the structure is shown through indentation (one or more spaces, but no tabulations).
+
+A table can have special attributes, including the `phpName` (the name of the class that will be generated). If you don't mention a phpName for a table, symfony creates it based on the camelCase version of the table name.
+
+>**TIP**
+>The camelCase convention removes underscores from words, and capitalizes the first letter of inner words. The default camelCase versions of `blog_article` and `blog_comment` are `BlogArticle` and `BlogComment`. The name of this convention comes from the appearance of capitals inside a long word, suggestive of the humps of a camel.
+
+A table contains columns. The column value can be defined in three different ways:
+
+  * If you define nothing, symfony will guess the best attributes according to the column name and a few conventions that will be described in the "Empty Columns" section later in this chapter. For instance, the `id` column in Listing 8-3 doesn't need to be defined. Symfony will make it an auto-incremented integer, primary key of the table. The article_id in the `blog_comment` table will be understood as a foreign key to the `blog_article` table (columns ending with `_id` are considered to be foreign keys, and the related table is automatically determined according to the first part of the column name). Columns called `created_at` are automatically set to the `timestamp` type. For all these columns, you don't need to specify any type. This is one of the reasons why `schema.yml` is so easy to write.
+  * If you define only one attribute, it is the column type. Symfony understands the usual column types: `boolean`, `integer`, `float`, `date`, `varchar(size)`, `longvarchar` (converted, for instance, to `text` in MySQL), and so on. For text content over 256 characters, you need to use the `longvarchar` type, which has no size (but cannot exceed 65KB in MySQL). Note that the `date` and `timestamp` types have the usual limitations of Unix dates and cannot be set to a date prior to 1970-01-01. As you may need to set older dates (for instance, for dates of birth), a format of dates "before Unix" can be used with bu_date and b`u_timestamp`.
+  * If you need to define other column attributes (like default value, required, and so on), you should write the column attributes as a set of `key: value`. This extended schema syntax is described later in the chapter.
+
+Columns can also have a `phpName` attribute, which is the capitalized version of the name (`Id`, `Title`, `Content`, and so on) and doesn't need overriding in most cases.
+
+Tables can also contain explicit foreign keys and indexes, as well as a few database-specific structure definitions. Refer to the "Extended Schema Syntax" section later in this chapter to learn more.
+
+Model Classes
+-------------
+
+The schema is used to build the model classes of the ORM layer. To save execution time, these classes are generated with a command-line task called `propel-build-model`.
+
+    > symfony propel-build-model
+
+Typing this command will launch the analysis of the schema and the generation of base data model classes in the `lib/model/om/` directory of your project:
+
+  * `BaseArticle.php`
+  * `BaseArticlePeer.php`
+  * `BaseComment.php`
+  * `BaseCommentPeer.php`
+
+In addition, the actual data model classes will be created in `lib/model/`:
+
+  * `Article.php`
+  * `ArticlePeer.php`
+  * `Comment.php`
+  * `CommentPeer.php`
+
+You defined only two tables, and you end up with eight files. There is nothing wrong, but it deserves some explanation.
+
+### Base and Custom Classes
+
+Why keep two versions of the data object model in two different directories?
+
+You will probably need to add custom methods and properties to the model objects (think about the `getName()` method in Listing 8-1). But as your project develops, you will also add tables or columns. Whenever you change the `schema.yml` file, you need to regenerate the object model classes by making a new call to propel-build-model. If your custom methods were written in the classes actually generated, they would be erased after each generation.
+
+The `Base` classes kept in the `lib/model/om/` directory are the ones directly generated from the schema. You should never modify them, since every new build of the model will completely erase these files.
+
+On the other hand, the custom object classes, kept in the `lib/model/` directory, actually inherit from the `Base` ones. When the `propel-build-model` task is called on an existing model, these classes are not modified. So this is where you can add custom methods.
+
+Listing 8-4 presents an example of a custom model class as created by the first call to the `propel-build-model` task.
+
+Listing 8-4 - Sample Model Class File, in `lib/model/Article.php`
+
+    [php]
+    <?php
+
+    class Article extends BaseArticle
+    {
+    }
+
+It inherits all the methods of the `BaseArticle` class, but a modification in the schema will not affect it.
+
+The mechanism of custom classes extending base classes allows you to start coding, even without knowing the final relational model of your database. The related file structure makes the model both customizable and evolutionary.
+
+### Object and Peer Classes
+
+`Article` and `Comment` are object classes that represent a record in the database. They give access to the columns of a record and to related records. This means that you will be able to know the title of an article by calling a method of an Article object, as in the example shown in Listing 8-5.
+
+Listing 8-5 - Getters for Record Columns Are Available in the Object Class
+
+    [php]
+    $article = new Article();
+    ...
+    $title = $article->getTitle();
+
+`ArticlePeer` and `CommentPeer` are peer classes; that is, classes that contain static methods to operate on the tables. They provide a way to retrieve records from the tables. Their methods usually return an object or a collection of objects of the related object class, as shown in Listing 8-6.
+
+Listing 8-6 - Static Methods to Retrieve Records Are Available in the Peer Class
+
+    [php]
+    $articles = ArticlePeer::retrieveByPks(array(123, 124, 125));
+    // $articles is an array of objects of class Article
+
+>**NOTE**
+>From a data model point of view, there cannot be any peer object. That's why the methods of the peer classes are called with a `::` (for static method call), instead of the usual `->` (for instance method call).
+
+So combining object and peer classes in a base and a custom version results in four classes generated per table described in the schema. In fact, there is a fifth class created in the `lib/model/map/` directory, which contains metadata information about the table that is needed for the runtime environment. But as you will probably never change this class, you can forget about it.
+
+Accessing Data
+--------------
+
+In symfony, your data is accessed through objects. If you are used to the relational model and using SQL to retrieve and alter your data, the object model methods will likely look complicated. But once you've tasted the power of object orientation for data access, you will probably like it a lot.
+
+But first, let's make sure we share the same vocabulary. Relational and object data model use similar concepts, but they each have their own nomenclature:
+
+Relational    | Object-Oriented
+------------- | ---------------
+Table         | Class
+Row, record   | Object
+Field, column | Property
+
+### Retrieving the Column Value
+
+When symfony builds the model, it creates one base object class for each of the tables defined in the `schema.yml`. Each of these classes comes with default constructors, accessors, and mutators based on the column definitions: The `new`, `getXXX()`, and `setXXX()` methods help to create objects and give access to the object properties, as shown in Listing 8-7.
+
+Listing 8-7 - Generated Object Class Methods
+
+    [php]
+    $article = new Article();
+    $article->setTitle('My first article');
+    $article->setContent('This is my very first article.\n Hope you enjoy it!');
+
+    $title   = $article->getTitle();
+    $content = $article->getContent();
+
+>**NOTE**
+>The generated object class is called `Article`, which is the `phpName` given to the `blog_article` table. If the `phpName` were not defined in the schema, the class would have been called `BlogArticle`. The accessors and mutators use a camelCase variant of the column names, so the `getTitle()` method retrieves the value of the `title` column.
+
+To set several fields at one time, you can use the `fromArray()` method, also generated for each object class, as shown in Listing 8-8.
+
+Listing 8-8 - The `fromArray()` Method Is a Multiple Setter
+
+    [php]
+    $article->fromArray(array(
+      'title'   => 'My first article',
+      'content' => 'This is my very first article.\n Hope you enjoy it!',
+    ));
+
+### Retrieving Related Records
+
+The `article_id` column in the `blog_comment` table implicitly defines a foreign key to the `blog_article` table. Each comment is related to one article, and one article can have many comments. The generated classes contain five methods translating this relationship in an object-oriented way, as follows:
+
+  * `$comment->getArticle()`: To get the related `Article` object
+  * `$comment->getArticleId()`: To get the ID of the related `Article` object
+  * `$comment->setArticle($article)`: To define the related `Article` object
+  * `$comment->setArticleId($id)`: To define the related `Article` object from an ID
+  * `$article->getComments()`: To get the related `Comment` objects
+
+The `getArticleId()` and `setArticleId()` methods show that you can consider the article_id column as a regular column and set the relationships by hand, but they are not very interesting. The benefit of the object-oriented approach is much more apparent in the three other methods. Listing 8-9 shows how to use the generated setters.
+
+Listing 8-9 - Foreign Keys Are Translated into a Special Setter
+
+    [php]
+    $comment = new Comment();
+    $comment->setAuthor('Steve');
+    $comment->setContent('Gee, dude, you rock: best article ever!);
+
+    // Attach this comment to the previous $article object
+    $comment->setArticle($article);
+
+    // Alternative syntax
+    // Only makes sense if the object is already saved in the database
+    $comment->setArticleId($article->getId());
+
+Listing 8-10 shows how to use the generated getters. It also demonstrates how to chain method calls on model objects.
+
+Listing 8-10 - Foreign Keys Are Translated into Special Getters
+
+    [php]
+    // Many to one relationship
+    echo $comment->getArticle()->getTitle();
+     => My first article
+    echo $comment->getArticle()->getContent();
+     => This is my very first article.
+        Hope you enjoy it!
+
+    // One to many relationship
+    $comments = $article->getComments();
+
+The `getArticle()` method returns an object of class `Article`, which benefits from the `getTitle()` accessor. This is much better than doing the join yourself, which may take a few lines of code (starting from the `$comment->getArticleId()` call).
+
+The `$comments` variable in Listing 8-10 contains an array of objects of class `Comment`. You can display the first one with `$comments[0]` or iterate through the collection with `foreach ($comments as $comment)`.
+
+>**NOTE**
+>Objects from the model are defined with a singular name by convention, and you can now understand why. The foreign key defined in the `blog_comment` table causes the creation of a `getComments()` method, named by adding an `s` to the `Comment` object name. If you gave the model object a plural name, the generation would lead to a method named `getCommentss()`, which doesn't make sense.
+
+### Saving and Deleting Data
+
+By calling the `new` constructor, you created a new object, but not an actual record in the `blog_article` table. Modifying the object has no effect on the database either. In order to save the data into the database, you need to call the `save()` method of the object.
+
+    [php]
+    $article->save();
+
+The ORM is smart enough to detect relationships between objects, so saving the `$article` object also saves the related `$comment` object. It also knows if the saved object has an existing counterpart in the database, so the call to `save()` is sometimes translated in SQL by an `INSERT`, and sometimes by an `UPDATE`. The primary key is automatically set by the `save()` method, so after saving, you can retrieve the new primary key with `$article->getId()`.
+
+>**TIP**
+>You can check if an object is new by calling isNew(). And if you wonder if an object has been modified and deserves saving, call its `isModified()` method.
+
+If you read comments to your articles, you might change your mind about the interest of publishing on the Internet. And if you don't appreciate the irony of article reviewers, you can easily delete the comments with the `delete()` method, as shown in Listing 8-11.
+
+Listing 8-11 - Delete Records from the Database with the `delete()`Method on the Related Object
+
+    [php]
+    foreach ($article->getComments() as $comment)
+    {
+      $comment->delete();
+    }
+
+>**TIP**
+>Even after calling the `delete()` method, an object remains available until the end of the request. To determine if an object is deleted in the database, call the `isDeleted()` method.
+
+### Retrieving Records by Primary Key
+
+If you know the primary key of a particular record, use the `retrieveByPk()` class method of the peer class to get the related object.
+
+    [php]
+    $article = ArticlePeer::retrieveByPk(7);
+
+The `schema.yml` file defines the `id` field as the primary key of the `blog_article` table, so this statement will actually return the article that has `id` 7. As you used the primary key, you know that only one record will be returned; the `$article` variable contains an object of class `Article`.
+
+In some cases, a primary key may consist of more than one column. In those cases, the `retrieveByPK()` method accepts multiple parameters, one for each primary key column.
+
+You can also select multiple objects based on their primary keys, by calling the generated `retrieveByPKs()` method, which expects an array of primary keys as a parameter.
+
+### Retrieving Records with Criteria
+
+When you want to retrieve more than one record, you need to call the `doSelect()` method of the peer class corresponding to the objects you want to retrieve. For instance, to retrieve objects of class `Article`, call `ArticlePeer::doSelect()`.
+
+The first parameter of the `doSelect()` method is an object of class `Criteria`, which is a simple query definition class defined without SQL for the sake of database abstraction.
+
+An empty `Criteria` returns all the objects of the class. For instance, the code shown in Listing 8-12 retrieves all the articles.
+
+Listing 8-12 - Retrieving Records by Criteria with `doSelect()`--Empty Criteria
+
+    [php]
+    $c = new Criteria();
+    $articles = ArticlePeer::doSelect($c);
+
+    // Will result in the following SQL query
+    SELECT blog_article.ID, blog_article.TITLE, blog_article.CONTENT,
+           blog_article.CREATED_AT
+    FROM   blog_article;
+
+>**SIDEBAR**
+>Hydrating
+>
+>The call to `::doSelect()` is actually much more powerful than a simple SQL query. First, the SQL is optimized for the DBMS you choose. Second, any value passed to the `Criteria` is escaped before being integrated into the SQL code, which prevents SQL injection risks. Third, the method returns an array of objects, rather than a result set. The ORM automatically creates and populates objects based on the database result set. This process is called hydrating.
+
+For a more complex object selection, you need an equivalent of the WHERE, ORDER BY, GROUP BY, and other SQL statements. The `Criteria` object has methods and parameters for all these conditions. For example, to get all comments written by Steve, ordered by date, build a `Criteria` as shown in Listing 8-13.
+
+Listing 8-13 - Retrieving Records by Criteria with `doSelect()`--Criteria with Conditions
+
+    [php]
+    $c = new Criteria();
+    $c->add(CommentPeer::AUTHOR, 'Steve');
+    $c->addAscendingOrderByColumn(CommentPeer::CREATED_AT);
+    $comments = CommentPeer::doSelect($c);
+
+    // Will result in the following SQL query
+    SELECT blog_comment.ARTICLE_ID, blog_comment.AUTHOR, blog_comment.CONTENT,
+           blog_comment.CREATED_AT
+    FROM   blog_comment
+    WHERE  blog_comment.author = 'Steve'
+    ORDER BY blog_comment.CREATED_AT ASC;
+
+The class constants passed as parameters to the add() methods refer to the property names. They are named after the capitalized version of the column names. For instance, to address the `content` column of the `blog_article` table, use the `ArticlePeer::CONTENT` class constant.
+
+>**NOTE**
+>Why use `CommentPeer::AUTHOR` instead of `blog_comment.AUTHOR`, which is the way it will be output in the SQL query anyway? Suppose that you need to change the name of the author field to `contributor` in the database. If you used `blog_comment.AUTHOR`, you would have to change it in every call to the model. On the other hand, by using `CommentPeer::AUTHOR`, you simply need to change the column name in the `schema.yml` file, keep `phpName` as `AUTHOR`, and rebuild the model.
+
+Table 8-1 compares the SQL syntax with the `Criteria` object syntax.
+
+Table 8-1 - SQL and Criteria Object Syntax
+
+SQL                                                          | Criteria
+------------------------------------------------------------ | -----------------------------------------------
+`WHERE column = value`                                       | `->add(column, value);`
+`WHERE column <> value`                                      | `->add(column, value, Criteria::NOT_EQUAL);`
+**Other Comparison Operators**                               | 
+`> , <`                                                      | `Criteria::GREATER_THAN, Criteria::LESS_THAN`
+`>=, <=`                                                     | `Criteria::GREATER_EQUAL, Criteria::LESS_EQUAL`
+`IS NULL, IS NOT NULL`                                       | `Criteria::ISNULL, Criteria::ISNOTNULL`
+`LIKE, ILIKE`                                                | `Criteria::LIKE, Criteria::ILIKE`
+`IN, NOT IN`                                                 | `Criteria::IN, Criteria::NOT_IN`
+**Other SQL Keywords**                                       |
+`ORDER BY column ASC`                                        | `->addAscendingOrderByColumn(column);`
+`ORDER BY column DESC`                                       | `->addDescendingOrderByColumn(column);`
+`LIMIT limit`                                                | `->setLimit(limit)`
+`OFFSET offset`                                              | `->setOffset(offset) `
+`FROM table1, table2 WHERE table1.col1 = table2.col2`        | `->addJoin(col1, col2)`
+`FROM table1 LEFT JOIN table2 ON table1.col1 = table2.col2`  | `->addJoin(col1, col2, Criteria::LEFT_JOIN)`
+`FROM table1 RIGHT JOIN table2 ON table1.col1 = table2.col2` | `->addJoin(col1, col2, Criteria::RIGHT_JOIN)`
+
+>**TIP**
+>The best way to discover and understand which methods are available in generated classes is to look at the `Base` files in the `lib/model/om/` folder after generation. The method names are pretty explicit, but if you need more comments on them, set the `propel.builder.addComments` parameter to `true` in the `config/propel.ini` file and rebuild the model.
+
+Listing 8-14 shows another example of `Criteria` with multiple conditions. It retrieves all the comments by Steve on articles containing the word "enjoy," ordered by date.
+
+Listing 8-14 - Another Example of Retrieving Records by Criteria with `doSelect()`--Criteria with Conditions
+
+    [php]
+    $c = new Criteria();
+    $c->add(CommentPeer::AUTHOR, 'Steve');
+    $c->addJoin(CommentPeer::ARTICLE_ID, ArticlePeer::ID);
+    $c->add(ArticlePeer::CONTENT, '%enjoy%', Criteria::LIKE);
+    $c->addAscendingOrderByColumn(CommentPeer::CREATED_AT);
+    $comments = CommentPeer::doSelect($c);
+
+    // Will result in the following SQL query
+    SELECT blog_comment.ID, blog_comment.ARTICLE_ID, blog_comment.AUTHOR,
+           blog_comment.CONTENT, blog_comment.CREATED_AT
+    FROM   blog_comment, blog_article
+    WHERE  blog_comment.AUTHOR = 'Steve'
+           AND blog_article.CONTENT LIKE '%enjoy%'
+           AND blog_comment.ARTICLE_ID = blog_article.ID
+    ORDER BY blog_comment.CREATED_AT ASC
+
+Just as SQL is a simple language that allows you to build very complex queries, the Criteria object can handle conditions with any level of complexity. But since many developers think first in SQL before translating a condition into object-oriented logic, the `Criteria` object may be difficult to comprehend at first. The best way to understand it is to learn from examples and sample applications. The symfony project website, for instance, is full of `Criteria` building examples that will enlighten you in many ways.
+
+In addition to the `doSelect()` method, every peer class has a `doCount()` method, which simply counts the number of records satisfying the criteria passed as a parameter and returns the count as an integer. As there is no object to return, the hydrating process doesn't occur in this case, and the `doCount()` method is faster than `doSelect()`.
+
+The peer classes also provide `doDelete()`, `doInsert()`, and `doUpdate()` methods, which all expect a `Criteria` as a parameter. These methods allow you to issue `DELETE`, `INSERT`, and `UPDATE` queries to your database. Check the generated peer classes in your model for more details on these Propel methods.
+
+Finally, if you just want the first object returned, replace `doSelect()` with a `doSelectOne()` call. This may be the case when you know that a `Criteria` will return only one result, and the advantage is that this method returns an object rather than an array of objects.
+
+>**TIP**
+>When a `doSelect()` query returns a large number of results, you might want to display only a subset of it in your response. Symfony provides a pager class called sfPropelPager, which automates the pagination of results. Check the API documentation at [http://www.symfony-project.com/api/symfony.html](http://www.symfony-project.com/api/symfony.html) for more information and usage examples.
+
+### Using Raw SQL Queries
+
+Sometimes, you don't want to retrieve objects, but want to get only synthetic results calculated by the database. For instance, to get the latest creation date of all articles, it doesn't make sense to retrieve all the articles and to loop on the array. You will prefer to ask the database to return only the result, because it will skip the object hydrating process.
+
+On the other hand, you don't want to call the PHP commands for database management directly, because then you would lose the benefit of database abstraction. This means that you need to bypass the ORM (Propel) but not the database abstraction (Creole).
+
+Querying the database with Creole requires that you do the following:
+
+  1. Get a database connection.
+  2. Build a query string.
+  3. Create a statement out of it.
+  4. Iterate on the result set that results from the statement execution.
+
+If this looks like gibberish to you, the code in Listing 8-15 will probably be more explicit.
+
+Listing 8-15 - Custom SQL Query with Creole
+
+    [php]
+    $connection = Propel::getConnection();
+    $query = 'SELECT MAX(%s) AS max FROM %s';
+    $query = sprintf($query, ArticlePeer::CREATED_AT, ArticlePeer::TABLE_NAME);
+    $statement = $connnection->prepareStatement($query);
+    $resultset = $statement->executeQuery();
+    $resultset->next();
+    $max = $resultset->getInt('max');
+
+Just like Propel selections, Creole queries are tricky when you first start using them. Once again, examples from existing applications and tutorials will show you the right way.
+
+>**CAUTION**
+>If you are tempted to bypass this process and access the database directly, you risk losing the security and abstraction provided by Creole. Doing it the Creole way is longer, but it forces you to use good practices that guarantee the performance, portability, and security of your application. This is especially true for queries that contain parameters coming from a untrusted source (such as an Internet user). Creole does all the necessary escaping and secures your database. Accessing the database directly puts you at risk of SQL-injection attacks.
+
+### Using Special Date Columns
+
+Usually, when a table has a column called `created_at`, it is used to store a timestamp of the date when the record was created. The same applies to updated_at columns, which are to be updated each time the record itself is updated, to the value of the current time.
+
+The good news is that symfony will recognize the names of these columns and handle their updates for you. You don't need to manually set the `created_at` and `updated_at` columns; they will automatically be updated, as shown in Listing 8-16. The same applies for columns named `created_on` and `updated_on`.
+
+Listing 8-16 - `created_at` and `updated_at` Columns Are Dealt with Automatically
+
+    [php]
+    $comment = new Comment();
+    $comment->setAuthor('Steve');
+    $comment->save();
+
+    // Show the creation date
+    echo $comment->getCreatedAt();
+      => [date of the database INSERT operation]
+
+Additionally, the getters for date columns accept a date format as an argument:
+
+    [php]
+    echo $comment->getCreatedAt('Y-m-d');
+
+>**SIDEBAR**
+>Refactoring to the Data layer
+>
+>When developing a symfony project, you often start by writing the domain logic code in the actions. But the database queries and model manipulation should not be stored in the controller layer. So all the logic related to the data should be moved to the model layer. Whenever you need to do the same request in more than one place in your actions, think about transferring the related code to the model. It helps to keep the actions short and readable.
+>
+>For example, imagine the code needed in a blog to retrieve the ten most popular articles for a given tag (passed as request parameter). This code should not be in an action, but in the model. In fact, if you need to display this list in a template, the action should simply look like this:
+>
+>     [php]
+>     public function executeShowPopularArticlesForTag()
+>     {
+>       $tag = TagPeer::retrieveByName($this->getRequestParameter('tag'));
+>       $this->foward404Unless($tag);
+>       $this->articles = $tag->getPopularArticles(10);
+>     }
+>
+>The action creates an object of class `Tag` from the request parameter. Then all the code needed to query the database is located in a `getPopularArticles()` method of this class. It makes the action more readable, and the model code can easily be reused in another action.
+>
+>Moving code to a more appropriate location is one of the techniques of refactoring. If you do it often, your code will be easy to maintain and to understand by other developers. A good rule of thumb about when to do refactoring to the data layer is that the code of an action should rarely contain more than ten lines of PHP code.
+
+Database Connections
+--------------------
+
+The data model is independent from the database used, but you will definitely use a database. The minimum information required by symfony to send requests to the project database is the name, the access codes, and the type of database. These connection settings should be entered in the `databases.yml` file located in the `config/` directory. Listing 8-17 shows an example of such a file.
+
+Listing 8-17 - Sample Database Connection Settings, in `myproject/config/databases.yml`
+
+    prod:
+      propel:
+        param:
+          host:               mydataserver
+          username:           myusername
+          password:           xxxxxxxxxx
+
+    all:
+      propel:
+        class:                sfPropelDatabase
+        param:
+          phptype:            mysql     # Database vendor
+          hostspec:           localhost
+          database:           blog
+          username:           login
+          password:           passwd
+          port:               80
+          encoding:           utf-8     # Default charset for table creation
+          persistent:         true      # Use persistent connections
+
+The connection settings are environment-dependent. You can define distinct settings for the `prod`, `dev`, and `test` environments, or any other environment in your application. This configuration can also be overridden per application, by setting different values in an application-specific file, such as in `apps/myapp/config/databases.yml`. For instance, you can use this approach to have different security policies for a front-end and a back-end application, and define several database users with different privileges in your database to handle this.
+
+For each environment, you can define many connections. Each connection refers to a schema being labeled with the same name. In the example in Listing 8-17, the propel connection refers to the `propel` schema in Listing 8-3.
+
+The permitted values of the `phptype` parameter are the ones of the database systems supported by Creole:
+
+  * `mysql`
+  * `sqlserver`
+  * `pgsql`
+  * `sqlite`
+  * `oracle`
+
+`hostspec`, `database`, `username`, and `password` are the usual database connection settings. They can also be written in a shorter way as a data source name (DSN). Listing 8-18 is equivalent to the `all:` section of Listing 8-17.
+
+Listing 8-18 - Shorthand Database Connection Settings
+
+    all:
+      propel:
+        class:          sfPropelDatabase
+        param:
+          dsn:          mysql://login:passwd@localhost/blog
+
+If you use a SQLite database, the `hostspec` parameter must be set to the path of the database file. For instance, if you keep your blog database in `data/blog.db`, the `databases.yml` file will look like Listing 8-19.
+
+Listing 8-19 - Database Connection Settings for SQLite Use a File Path As Host
+
+        all:
+          propel:
+            class:          sfPropelDatabase
+            param:
+              phptype:  sqlite
+              database: %SF_DATA_DIR%/blog.db
+
+Extending the Model
+-------------------
+
+The generated model methods are great but often not sufficient. As soon as you implement your own business logic, you need to extend it, either by adding new methods or by overriding existing ones.
+
+### Adding New Methods
+
+You can add new methods to the empty model classes generated in the `lib/model/` directory. Use `$this` to call methods of the current object, and use `self::` to call static methods of the current class. Remember that the custom classes inherit methods from the `Base` classes located in the `lib/model/om/` directory.
+
+For instance, for the `Article` object generated based on Listing 8-3, you can add a magic `__toString()` method so that echoing an object of class `Article` displays its title, as shown in Listing 8-20.
+
+Listing 8-20 - Customizing the Model, in `lib/model/Article.php`
+
+    [php]
+    <?php
+
+    class Article extends BaseArticle
+    {
+      public function __toString()
+      {
+        return $this->getTitle();  // getTitle() is inherited from BaseArticle
+      }
+    }
+
+You can also extend the peer classes--for instance, to add a method to retrieve all articles ordered by creation date, as shown in Listing 8-21.
+
+Listing 8-21 - Customizing the Model, in `lib/model/ArticlePeer.php`
+
+    [php]
+    <?php
+
+    class ArticlePeer extends BaseArticlePeer
+    {
+      public static function getAllOrderedByDate()
+      {
+        $c = new Criteria();
+        $c->addAscendingOrderByColumn(self:CREATED_AT);
+        return self::doSelect($c);
+
+      }
+    }
+
+The new methods are available in the same way as the generated ones, as shown in Listing 8-22.
+
+Listing 8-22 - Using Custom Model Methods Is Like Using the Generated Methods
+
+    [php]
+    foreach (ArticlePeer::getAllOrderedByDate() as $article)
+    {
+      echo $article;      // Will call the magic __toString() method
+    }
+
+### Overriding Existing Methods
+
+If some of the generated methods in the `Base` classes don't fit your requirements, you can still override them in the custom classes. Just make sure that you use the same method signature (that is, the same number of arguments).
+
+For instance, the `$article->getComments()` method returns an array of `Comment` objects, in no particular order. If you want to have the results ordered by creation date, with the latest comment coming first, then override the `getComments()` method, as shown in Listing 8-23. Be aware that the original `getComments()` method (found in `lib/model/om/BaseArticle.php`) expects a criteria value and a connection value as parameters, so your function must do the same.
+
+Listing 8-23 - Overriding Existing Model Methods, in `lib/model/Article.php`
+
+    [php]
+    public function getComments($criteria = null, $con = null )
+    {
+      // Objects are passed by reference in PHP5, so to avoid modifying the original,
+      // you must clone it
+      $criteria = clone $criteria;
+      $criteria->addDescendingOrderByColumn(ArticlePeer::CREATED_AT);
+
+      return parent::getComments($criteria, $con);
+    }
+
+The custom method eventually calls the one of the parent Base class, and that's good practice. However, you can completely bypass it and return the result you want.
+
+### Using Model Behaviors
+
+Some model modifications are generic and can be reused. For instance, methods to make a model object sortable and an optimistic lock to prevent conflicts between concurrent object saving are generic extensions that can be added to many classes.
+
+Symfony packages these extensions into behaviors. Behaviors are external classes that provide additional methods to model classes. The model classes already contain hooks, and symfony knows how to extend them by way of `sfMixer` (see Chapter 17 for details).
+
+To enable behaviors in your model classes, you must modify one setting in the `config/propel.ini` file:
+
+    propel.builder.AddBehaviors = true     // Default value is false
+
+There is no behavior bundled by default in symfony, but they can be installed via plug-ins. Once a behavior plug-in is installed, you can assign the behavior to a class with a single line. For instance, if you install the sfPropelParanoidBehaviorPlugin in your application, you can extend an Article class with this behavior by adding the following at the end of the Article.clas`s.php`:
+
+    [php]
+    sfPropelBehavior::add('Article', array(
+      'paranoid' => array('column' => 'deleted_at')
+    ));
+
+After rebuilding the model, deleted `Article` objects will remain in the database, invisible to the queries using the ORM, unless you temporarily disable the behavior with `sfPropelParanoidBehavior::disable()`.
+
+Check the list of symfony plug-ins in the wiki to find behaviors ([http://www.symfony-project.com/trac/wiki/SymfonyPlugins#Propelbehaviorplugins](http://www.symfony-project.com/trac/wiki/SymfonyPlugins#Propelbehaviorplugins)). Each has its own documentation and installation guide.
+
+Extended Schema Syntax
+----------------------
+
+A `schema.yml` file can be simple, as shown in Listing 8-3. But relational models are often complex. That's why the schema has an extensive syntax able to handle almost every case.
+
+### Attributes
+
+Connections and tables can have specific attributes, as shown in Listing 8-24. They are set under an `_attributes` key.
+
+Listing 8-24 - Attributes for Connections and Tables
+
+    propel:
+      _attributes:   { noXsd: false, defaultIdMethod: none, package: lib.model }
+      blog_article:
+        _attributes: { phpName: Article }
+
+You may want your schema to be validated before code generation takes place. To do that, deactivate the `noXSD` attribute for the connection. The connection also supports the `defaultIdMethod` attribute. If none is provided, then the database's native method of generating IDs will be used--for example, `autoincrement` for MySQL, or `sequences` for PostgreSQL. The other possible value is `none`.
+
+The `package` attribute is like a namespace; it determines the path where the generated classes are stored. It defaults to `lib/model/`, but you can change it to organize your model in subpackages. For instance, if you don't want to mix the core business classes and the classes defining a database-stored statistics engine in the same directory, then define two schemas with `lib.model.business` and `lib.model.stats` packages.
+
+You already saw the `phpName` table attribute, used to set the name of the generated class mapping the table.
+
+Tables that contain localized content (that is, several versions of the content, in a related table, for internationalization) also take two additional attributes (see Chapter 13 for details), as shown in Listing 8-25.
+
+Listing 8-25 - Attributes for i18n Tables
+
+    propel:
+      blog_article:
+        _attributes: { isI18N: true, i18nTable: db_group_i18n }
+
+>**SIDEBAR**
+>Dealing with multiple schemas
+>
+>You can have more than one schema per application. Symfony will take into account every file ending with `schema.yml` or `schema.xml` in the `config/` folder. If your application has many tables, or if some tables don't share the same connection, you will find this approach very useful.
+>
+>Consider these two schemas:
+>
+>
+>      // In config/business-schema.yml
+>      propel:
+>        blog_article:
+>          _attributes: { phpName: Article }
+>        id:
+>        title: varchar(50)
+>
+>      // In config/stats-schema.yml
+>      propel:
+>        stats_hit:
+>          _attributes: { phpName: Hit }
+>        id:
+>        resource: varchar(100)
+>        created_at:
+>
+>
+>Both schemas share the same connection (`propel`), and the `Article` and `Hit` classes will be generated under the same `lib/model/` directory. Everything happens as if you had written only one schema.
+>
+>You can also have different schemas use different connections (for instance, `propel` and `propel_bis`, to be defined in `databases.yml`) and organize the generated classes in subdirectories:
+>
+>
+>      // In config/business-schema.yml
+>      propel:
+>        blog_article:
+>          _attributes: { phpName: Article, package: lib.model.business }
+>        id:
+>        title: varchar(50)
+>
+>      // In config/stats-schema.yml
+>      propel_bis:
+>        stats_hit:
+>          _attributes: { phpName: Hit, package.lib.model.stat }
+>        id:
+>        resource: varchar(100)
+>        created_at:
+>
+>
+>Many applications use more than one schema. In particular, some plug-ins have their own schema and package to avoid messing with your own classes (see Chapter 17 for details).
+
+### Column Details
+
+The basic syntax gives you two choices: let symfony deduce the column characteristics from its name (by giving an empty value) or define the type with one of the type keywords. Listing 8-26 demonstrates these choices.
+
+Listing 8-26 - Basic Column Attributes
+
+    propel:
+      blog_article:
+        id:                 # Let symfony do the work
+        title: varchar(50)  # Specify the type yourself
+
+But you can define much more for a column. If you do, you will need to define column settings as an associative array, as shown in Listing 8-27.
+
+Listing 8-27 - Complex Column Attributes
+
+    propel:
+      blog_article:
+        id:       { type: integer, required: true,primaryKey: true, autoIncrement: true }
+        name:     { type: varchar(50), default: foobar, index: true }
+        group_id: { type: integer, foreignTable: db_group,foreignReference: id, onDelete: cascade }
+
+The column parameters are as follows:
+
+  * `type`: Column type. The choices are `boolean`, `tinyint`, `smallint`, `integer`, `bigint`, `double`, `float`, `real`, `decimal`, `char`, `varchar(size)`, `longvarchar`, `date`, `time`, `timestamp`, `bu_date`, `bu_timestamp`, `blob`, and `clob`.
+  * `required`: Boolean. Set it to `true` if you want the column to be required.
+  * `default`: Default value.
+  * `primaryKey`: Boolean. Set it to `true` for primary keys.
+  * `autoIncrement`: Boolean. Set it to `true` for columns of type `integer` that need to take an auto-incremented value.
+  * `sequence`: Sequence name for databases using sequences for `autoIncrement` columns (for example, PostgreSQL and Oracle).
+  * `index`: Boolean. Set it to `true` if you want a simple index or to `unique` if you want a unique index to be created on the column.
+  * `foreignTable`: A table name, used to create a foreign key to another table.
+  * `foreignReference`: The name of the related column if a foreign key is defined via `foreignTable`.
+  * `onDe`lete: Determines the action to trigger when a record in a related table is deleted. When set to `setnull`, the foreign key column is set to `null`. When set to `cascade`, the record is deleted. If the database engine doesn't support the set behavior, the ORM emulates it. This is relevant only for columns bearing a `foreignTable` and a `foreignReference`.
+  * `isCulture`: Boolean. Set it to `true` for culture columns in localized content tables (see Chapter 13).
+
+### Foreign Keys
+
+As an alternative to the `foreignTable` and `foreignReference` column attributes, you can add foreign keys under the `_foreignKeys:` key in a table. The schema in Listing 8-28 will create a foreign key on the `user_id` column, matching the `id` column in the `blog_user` table.
+
+Listing 8-28 - Foreign Key Alternative Syntax
+
+    propel:
+      blog_article:
+        id:
+        title:   varchar(50)
+        user_id: { type: integer }
+        _foreignKeys:
+          -
+            foreignTable: blog_user
+            onDelete:     cascade
+            references:
+              - { local: user_id, foreign: id }
+
+The alternative syntax is useful for multiple-reference foreign keys and to give foreign keys a name, as shown in Listing 8-29.
+
+Listing 8-29 - Foreign Key Alternative Syntax Applied to Multiple Reference Foreign Key
+
+        _foreignKeys:
+          my_foreign_key:
+            foreignTable:  db_user
+            onDelete:      cascade
+            references:
+              - { local: user_id, foreign: id }
+              - { local: post_id, foreign: id }
+
+### Indexes
+
+As an alternative to the `index` column attribute, you can add indexes under the `_indexes:` key in a table. If you want to define unique indexes, you must use the `_uniques:` header instead. Listing 8-30 shows the alternative syntax for indexes.
+
+Listing 8-30 - Indexes and Unique Indexes Alternative Syntax
+
+    propel:
+      blog_article:
+        id:
+        title:            varchar(50)
+        created_at:
+        _indexes:
+          my_index:       [title, user_id]
+        _uniques:
+          my_other_index: [created_at]
+
+The alternative syntax is useful only for indexes built on more than one column.
+
+### Empty Columns
+
+When meeting a column with no value, symfony will do some magic and add a value of its own. See Listing 8-31 for the details added to empty columns.
+
+Listing 8-31 - Column Details Deduced from the Column Name
+
+    // Empty columns named id are considered primary keys
+    id:         { type: integer, required: true, primaryKey: true, autoIncrement: true }
+
+    // Empty columns named XXX_id are considered foreign keys
+    foobar_id:  { type: integer, foreignTable: db_foobar, foreignReference: id }
+
+    // Empty columns named created_at, updated at, created_on and updated_on
+    // are considered dates and automatically take the timestamp type
+    created_at: { type: timestamp }
+    updated_at: { type: timestamp }
+
+For foreign keys, symfony will look for a table having the same `phpName` as the beginning of the column name, and if one is found, it will take this table name as the `foreignTable`.
+
+### I18n Tables
+
+Symfony supports content internationalization in related tables. This means that when you have content subject to internationalization, it is stored in two separate tables: one with the invariable columns and another with the internationalized columns.
+
+In a `schema.yml` file, all that is implied when you name a table `foobar_i18n`. For instance, the schema shown in Listing 8-32 will be automatically completed with columns and table attributes to make the internationalized content mechanism work. Internally, symfony will understand it as if it were written like Listing 8-33. Chapter 13 will tell you more about i18n.
+
+Listing 8-32 - Implied i18n Mechanism
+
+    propel:
+      db_group:
+        id:
+        created_at:
+
+      db_group_i18n:
+        name:        varchar(50)
+
+Listing 8-33 - Explicit i18n Mechanism
+
+    propel:
+      db_group:
+        _attributes: { isI18N: true, i18nTable: db_group_i18n }
+        id:
+        created_at:
+
+      db_group_i18n:
+        id:       { type: integer, required: true, primaryKey: true,foreignTable: db_group, foreignReference: id, onDelete: cascade }
+        culture:  { isCulture: true, type: varchar(7), required: true,primaryKey: true }
+        name:     varchar(50)
+
+### Beyond the schema.yml: The schema.xml
+
+As a matter of fact, the schema.yml format is internal to symfony. When you call a propel- command, symfony actually translates this file into a `generated-schema.xml` file, which is the type of file expected by Propel to actually perform tasks on the model.
+
+The `schema.xml` file contains the same information as its YAML equivalent. For example, Listing 8-3 is converted to the XML file shown in Listing 8-34.
+
+Listing 8-34 - Sample `schema.xml`, Corresponding to Listing 8-3
+
+    [xml]
+    <?xml version="1.0" encoding="UTF-8"?>
+     <database name="propel" defaultIdMethod="native" noXsd="true" package="lib.model">
+        <table name="blog_article" phpName="Article">
+          <column name="id" type="integer" required="true" primaryKey="true"autoIncrement="true" />
+          <column name="title" type="varchar" size="255" />
+          <column name="content" type="longvarchar" />
+          <column name="created_at" type="timestamp" />
+        </table>
+        <table name="blog_comment" phpName="Comment">
+          <column name="id" type="integer" required="true" primaryKey="true"autoIncrement="true" />
+          <column name="article_id" type="integer" />
+          <foreign-key foreignTable="blog_article">
+            <reference local="article_id" foreign="id"/>
+          </foreign-key>
+          <column name="author" type="varchar" size="255" />
+          <column name="content" type="longvarchar" />
+          <column name="created_at" type="timestamp" />
+        </table>
+     </database>
+
+The description of the `schema.xml` format can be found in the documentation and the "Getting Started" sections of the Propel project website ([http://propel.phpdb.org/docs/user_guide/chapters/appendices/AppendixB-SchemaReference.html](http://propel.phpdb.org/docs/user_guide/chapters/appendices/AppendixB-SchemaReference.html)).
+
+The YAML format was designed to keep the schemas simple to read and write, but the trade-off is that the most complex schemas can't be described with a `schema.yml` file. On the other hand, the XML format allows for full schema description, whatever its complexity, and includes database vendor-specific settings, table inheritance, and so on.
+
+Symfony actually understands schemas written in XML format. So if your schema is too complex for the YAML syntax, if you have an existing XML schema, or if you are already familiar with the Propel XML syntax, you don't have to switch to the symfony YAML syntax. Place your `schema.xml` in the project `config/` directory, build the model, and there you go.
+
+>**SIDEBAR**
+>Propel in symfony
+>
+>All the details given in this chapter are not specific to symfony, but rather to Propel. Propel is the preferred object/relational abstraction layer for symfony, but you can choose an alternative one. However, symfony works more seamlessly with Propel, for the following reasons:
+>
+>All the object data model classes and the `Criteria` class are autoloading classes. As soon as you use them, symfony will include the right files, and you don't need to manually add the file inclusion statements. In symfony, Propel doesn't need to be launched nor initialized. When an object uses Propel, the library initiates by itself. Some symfony helpers use Propel objects as parameters to achieve high-level tasks (such as pagination or filtering). Propel objects allow rapid prototyping and generation of a backend for your application (Chapter 14 provides more details). The schema is faster to write through the `schema.yml` file.
+>
+>And, as Propel is independent of the database used, so is symfony.
+
+Don't Create the Model Twice
+----------------------------
+
+The trade-off of using an ORM is that you must define the data structure twice: once for the database, and once for the object model. Fortunately, symfony offers command-line tools to generate one based on the other, so you can avoid duplicate work.
+
+### Building a SQL Database Structure Based on an Existing Schema
+
+If you start your application by writing the `schema.yml` file, symfony can generate a SQL query that creates the tables directly from the YAML data model. To use the query, go to your root project directory and type this:
+
+    > symfony propel-build-sql
+
+A `lib.model.schema.sql` file will be created in `myproject/data/sql/`. Note that the generated SQL code will be optimized for the database system defined in the `phptype` parameter of the `propel.ini` file.
+
+You can use the schema.sql file directly to build the tables. For instance, in MySQL, type this:
+
+    > mysqladmin -u root -p create blog
+    > mysql -u root -p blog < data/sql/lib.model.schema.sql
+
+The generated SQL is also helpful to rebuild the database in another environment, or to change to another DBMS. If the connection settings are properly defined in your `propel.ini`, you can even use the `symfony propel-insert-sql` command to do this automatically.
+
+>**TIP**
+>The command line also offers a task to populate your database with data based on a text file. See Chapter 16 for more information about the `propel-load-data` task and the YAML fixture files.
+
+### Generating a YAML Data Model from an Existing Database
+
+Symfony can use the Creole database access layer to generate a `schema.yml` file from an existing database, thanks to introspection (the capability of databases to determine the structure of the tables on which they are operating). This can be particularly useful when you do reverse-engineering, or if you prefer working on the database before working on the object model.
+
+In order to do this, you need to make sure that the project `propel.ini` file points to the correct database and contains all connection settings, and then call the `propel-build-schema` command:
+
+    > symfony propel-build-schema
+
+A brand-new `schema.yml` file built from your database structure is generated in the `config/` directory. You can build your model based on this schema.
+
+The schema-generation command is quite powerful and can add a lot of database-dependent information to your schema. As the YAML format doesn't handle this kind of vendor information, you need to generate an XML schema to take advantage of it. You can do this simply by adding an `xml` argument to the `build-schema` task:
+
+    > symfony propel-build-schema xml
+
+Instead of generating a `schema.yml` file, this will create a `schema.xml` file fully compatible with Propel, containing all the vendor information. But be aware that generated XML schemas tend to be quite verbose and difficult to read.
+
+>**SIDEBAR**
+>The propel.ini configuration
+>
+>The `propel-build-sql` and `propel-build-schema` tasks don't use the connection settings defined in the `databases.yml` file. Rather, these tasks use the connection settings in another file, called `propel.ini` and stored in the project `config/` directory:
+>
+>
+>      propel.database.createUrl = mysql://login:passwd@localhost
+>      propel.database.url       = mysql://login:passwd@localhost/blog
+>
+>
+>This file contains other settings used to configure the Propel generator to make generated model classes compatible with symfony. Most settings are internal and of no interest to the user, apart from a few:
+>
+>
+>      // Base classes are autoloaded in symfony
+>      // Set this to true to use include_once statements instead
+>      // (Small negative impact on performance)
+>      propel.builder.addIncludes = false
+>
+>      // Generated classes are not commented by default
+>      // Set this to true to add comments to Base classes
+>      // (Small negative impact on performance)
+>      propel.builder.addComments = false
+>
+>      // Behaviors are not handled by default
+>      // Set this to true to be able to handle them
+>      propel.builder.AddBehaviors = false
+>
+>
+>After you make a modification to the `propel.ini` settings, don't forget to rebuild the model so the changes will take effect.
+
+Summary
+-------
+
+Symfony uses Propel as the ORM and Creole as the database abstraction layer. It means that you must first describe the relational schema of your database in YAML before generating the object model classes. Then, at runtime, use the methods of the object and peer classes to retrieve information about a record or a set of records. You can override them and extend the model easily by adding methods to the custom classes. The connection settings are defined in a `databases.yml` file, which can support more than one connection. And the command line contains special tasks to avoid duplicate structure definition.
+
+The model layer is the most complex of the symfony framework. One reason for this complexity is that data manipulation is an intricate matter. The related security issues are crucial for a website and should not be ignored. Another reason is that symfony is more suited for middle- to large-scale applications in an enterprise context. In such applications, the automations provided by the symfony model really represent a gain of time, worth the investment in learning its internals.
+
+So don't hesitate to spend some time testing the model objects and methods to fully understand them. The solidity and scalability of your applications will be a great reward.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/09-Links-and-the-Routing-System.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/09-Links-and-the-Routing-System.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/09-Links-and-the-Routing-System.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,670 @@
+Chapter 9 - Links And The Routing System
+========================================
+
+Links and URLs deserve particular treatment in a web application framework. This is because the unique entry point of the application (the front controller) and the use of helpers in templates allow for a complete separation between the way URLs work and their appearance. This is called routing. More than a gadget, routing is a useful tool to make web applications even more user-friendly and secure. This chapter will tell you everything you need to know to handle URLs in your symfony applications:
+
+  * What the routing system is and how it works
+  * How to use link helpers in templates to enable routing of outgoing URLs
+  * How to configure the routing rules to change the appearance of URLs
+
+You will also find a few tricks for mastering routing performance and adding finishing touches.
+
+What Is Routing?
+----------------
+
+Routing is a mechanism that rewrites URLs to make them more user-friendly. But to understand why this is important, you must first take a few minutes to think about URLs.
+
+### URLs As Server Instructions
+
+URLs carry information from the browser to the server required to enact an action as desired by the user. For instance, a traditional URL contains the file path to a script and some parameters necessary to complete the request, as in this example:
+
+    http://www.example.com/web/controller/article.php?id=123456&format_code=6532
+
+This URL conveys information about the application's architecture and database. Developers usually hide the application's infrastructure in the interface (for instance, they choose page titles like "Personal profile page" rather than "QZ7.65"). Revealing vital clues to the internals of the application in the URL contradicts this effort and has serious drawbacks:
+
+  * The technical data appearing in the URL creates potential security breaches. In the preceding example, what happens if an ill-disposed user changes the value of the `id` parameter? Does this mean the application offers a direct interface to the database? Or what if the user tries other script names, like `admin.php`, just for fun? All in all, raw URLs offer an easy way to hack an application, and managing security is almost impossible with them.
+  * The unintelligibility of URLs makes them disturbing wherever they appear, and they dilute the impact of the surrounding content. And nowadays, URLs don't appear only in the address bar. They appear when a user hovers the mouse over a link, as well as in search results. When users look for information, you want to give them easily understandable clues regarding what they found, rather than a confusing URL such as the one shown in Figure 9-1.
+
+Figure 9-1 - URLs appear in many places, such as in search results
+
+![URLs appear in many places, such as in search results](/images/book/F0901.png "URLs appear in many places, such as in search results")
+
+  * If one URL has to be changed (for instance, if a script name or one of its parameters is modified), every link to this URL must be changed as well. It means that modifications in the controller structure are heavyweight and expensive, which is not ideal in agile development.
+
+And it could be much worse if symfony didn't use the front controller paradigm; that is, if the application contained many scripts accessible from the Internet, in many directories, such as these:
+
+    http://www.example.com/web/gallery/album.php?name=my%20holidays
+    http://www.example.com/web/weblog/public/post/list.php
+    http://www.example.com/web/general/content/page.php?name=about%20us
+
+In this case, developers would need to match the URL structure with the file structure, resulting in a maintenance nightmare when either structure changed.
+
+### URLs As Part of the Interface
+
+The idea behind routing is to consider the URL as part of the interface. The application can format a URL to bring information to the user, and the user can use the URL to access resources of the application.
+
+This is possible in symfony applications, because the URL presented to the end user is unrelated to the server instruction needed to perform the request. Instead, it is related to the resource requested, and it can be formatted freely. For instance, symfony can understand the following URL and have it display the same page as the first URL shown in this chapter:
+
+    http://www.example.com/articles/finance/2006/activity-breakdown.html
+
+The benefits are immense:
+
+  * URLs actually mean something, and they can help the users decide if the page behind a link contains what they expect. A link can contain additional details about the resource it returns. This is particularly useful for search engine results. Additionally, URLs sometimes appear without any mention of the page title (think about when you copy a URL in an e-mail message), and in this case, they must mean something on their own. See Figure 9-2 for an example of a user-friendly URL.
+
+Figure 9-2 - URLs can convey additional information about a page, like the publication date
+
+![URLs can convey additional information about a page, like the publication date](/images/book/F0902.png "URLs can convey additional information about a page, like the publication date")
+
+  * URLs written in paper documents are easier to type and remember. If your company website appears as `http://www.example.com/controller/web/index.jsp?id=ERD4` on your business card, it will probably not receive many visits.
+  * The URL can become a command-line tool of its own, to perform actions or retrieve information in an intuitive way. Applications offering such a possibility are faster to use for power users.
+
+        // List of results: add a new tag to narrow the list of results
+        http://del.icio.us/tag/symfony+ajax
+        // User profile page: change the name to get another user profile
+        http://www.askeet.com/user/francois
+
+  * You can change the URL formatting and the action name/parameters independently, with a single modification. It means that you can develop first, and format the URLs afterwards, without totally messing up your application.
+  * Even when you reorganize the internals of an application, the URLs can remain the same for the outside world. It makes URLs persistent, which is a must because it allows bookmarking on dynamic pages.
+  * Search engines tend to skip dynamic pages (ending with `.php`, `.asp`, and so on) when they index websites. So you can format URLs to have search engines think they are browsing static content, even when they meet a dynamic page, thus resulting in better indexing of your application pages.
+  * It is safer. Any unrecognized URL will be redirected to a page specified by the developer, and users cannot browse the web root file structure by testing URLs. The actual script name called by the request, as well as its parameters, is hidden.
+
+The correspondence between the URLs presented to the user and the actual script name and request parameters is achieved by a routing system, based on patterns that can be modified through configuration.
+
+>**NOTE**
+>How about assets? Fortunately, the URLs of assets (images, style sheets, and JavaScript) don't appear much during browsing, so there is no real need for routing for those. In symfony, all assets are located under the `web/` directory, and their URL matches their location in the file system. However, you can manage dynamic assets (handled by actions) by using a generated URL inside the asset helper. For instance, to display a dynamically generated image, use `image_tag(url_for('captcha/image?key='.$key))`.
+
+### How It Works
+
+Symfony disconnects the external URL and its internal URI. The correspondence between the two is made by the routing system. To make things easy, symfony uses a syntax for internal URIs very similar to the one of regular URLs. Listing 9-1 shows an example.
+
+Listing 9-1 - External URL and Internal URI
+
+    // Internal URI syntax
+    <module>/<action>[?param1=value1][&param2=value2][&param3=value3]...
+
+    // Example internal URI, which never appears to the end user
+    article/permalink?year=2006&subject=finance&title=activity-breakdown
+
+    // Example external URL, which appears to the end user
+    http://www.example.com/articles/finance/2006/activity-breakdown.html
+
+The routing system uses a special configuration file, called `routing.yml`, in which you can define routing rules. Consider the rule shown in Listing 9-2. It defines a pattern that looks like `articles/*/*/*` and names the pieces of content matching the wildcards.
+
+Listing 9-2 - A Sample Routing Rule
+
+    article_by_title:
+      url:    articles/:subject/:year/:title.html
+      param:  { module: article, action: permalink }
+
+Every request sent to a symfony application is first analyzed by the routing system (which is simple because every request in handled by a single front controller). The routing system looks for a match between the request URL and the patterns defined in the routing rules. If a match is found, the named wildcards become request parameters and are merged with the ones defined in the `param:` key. See how it works in Listing 9-3.
+
+Listing 9-3 - The Routing System Interprets Incoming Request URLs
+
+    // The user types (or clicks on) this external URL
+    http://www.example.com/articles/finance/2006/activity-breakdown.html
+
+    // The front controller sees that it matches the article_by_title rule
+    // The routing system creates the following request parameters
+      'module'  => 'article'
+      'action'  => 'permalink'
+      'subject' => 'finance'
+      'year'    => '2006'
+      'title'   => 'activity-breakdown'
+
+>**TIP**
+>The `.html` extension of the external URL is a simple decoration and is ignored by the routing system. Its sole interest is to makes dynamic pages look like static ones. You will see how to activate this extension in the "Routing Configuration" section later in this chapter.
+
+The request is then passed to the `permalink` action of the `article` module, which has all the required information in the request parameters to determine which article is to be shown.
+
+But the mechanism also must work the other way around. For the application to show external URLs in its links, you must provide the routing system with enough data to determine which rule to apply to it. You also must not write hyperlinks directly with `<a>` tags--this would bypass routing completely--but with a special helper, as shown in Listing 9-4.
+
+Listing 9-4 - The Routing System Formats Outgoing URLs in Templates
+
+    [php]
+    // The url_for() helper transforms an internal URI into an external URL
+    <a href="<?php echo url_for('article/permalink?subject=finance&year=2006&title=activity-breakdown') ?>">click here</a>
+
+    // The helper sees that the URI matches the article_by_title rule
+    // The routing system creates an external URL out of it
+     => <a href="http://www.example.com/articles/finance/2006/activity-breakdown.html">click here</a>
+
+    // The link_to() helper directly outputs a hyperlink
+    // and avoids mixing PHP with HTML
+    <?php echo link_to(
+      'click here',
+      'article/permalink?subject=finance&year=2006&title=activity-breakdown'
+    ) ?>
+
+    // Internally, link_to() will make a call to url_for() so the result is the same
+    => <a href="http://www.example.com/articles/finance/2006/activity-breakdown.html">click here</a>
+
+So routing is a two-way mechanism, and it works only if you use the `link_to()` helper to format all your links.
+
+URL Rewriting
+-------------
+
+Before getting deeper into the routing system, one matter needs to be clarified. In the examples given in the previous section, there is no mention of the front controller (`index.php` or `myapp_dev.php`) in the internal URIs. The front controller, not the elements of the application, decides the environment. So all the links must be environment-independent, and the front controller name can never appear in internal URIs.
+
+There is no script name in the examples of generated URLs either. This is because generated URLs don't contain any script name in the production environment by default. The `no_script_name` parameter of the `settings.yml` file precisely controls the appearance of the front controller name in generated URLs. Set it to `off`, as shown in Listing 9-5, and the URLs output by the link helpers will mention the front controller script name in every link.
+
+Listing 9-5 - Showing the Front Controller Name in URLs, in `apps/myapp/settings.yml`
+
+    prod:
+      .settings
+        no_script_name:  off
+
+Now, the generated URLs will look like this:
+
+    http://www.example.com/index.php/articles/finance/2006/activity-breakdown.html
+
+In all environments except the production one, the `no_script_name` parameter is set to `off` by default. So when you browse your application in the development environment, for instance, the front controller name always appears in the URLs.
+
+    http://www.example.com/myapp_dev.php/articles/finance/2006/activity-breakdown.html
+
+In production, the `no_script_name` is set to `on`, so the URLs show only the routing information and are more user-friendly. No technical information appears.
+
+    http://www.example.com/articles/finance/2006/activity-breakdown.html
+
+But how does the application know which front controller script to call? This is where URL rewriting comes in. The web server can be configured to call a given script when there is none in the URL.
+
+In Apache, this is possible once you have the `mod_rewrite` extension activated. Every symfony project comes with an `.htaccess` file, which adds `mod_rewrite` settings to your server configuration for the `web/` directory. The default content of this file is shown in Listing 9-6.
+
+Listing 9-6 - Default Rewriting Rules for Apache, in `myproject/web/.htaccess`
+
+    <IfModule mod_rewrite.c>
+      RewriteEngine On
+
+      # we skip all files with .something
+      RewriteCond %{REQUEST_URI} \..+$
+      RewriteCond %{REQUEST_URI} !\.html$
+      RewriteRule .* - [L]
+
+      # we check if the .html version is here (caching)
+      RewriteRule ^$ index.html [QSA]
+      RewriteRule ^([^.]+)$ $1.html [QSA]
+      RewriteCond %{REQUEST_FILENAME} !-f
+
+      # no, so we redirect to our front web controller
+      RewriteRule ^(.*)$ index.php [QSA,L]
+    </IfModule>
+
+The web server inspects the shape of the URLs it receives. If the URL does not contain a suffix and if there is no cached version of the page available (Chapter 12 covers caching), then the request is handed to `index.php`.
+
+However, the `web/` directory of a symfony project is shared among all the applications and environments of the project. It means that there is usually more than one front controller in the web directory. For instance, a project having a `frontend` and a `backend` application, and a `dev` and `prod` environment, contains four front controller scripts in the `web/` directory:
+
+    index.php         // frontend in prod
+    frontend_dev.php  // frontend in dev
+    backend.php       // backend in prod
+    backend_dev.php   // backend in dev
+
+The mod_rewrite settings can specify only one default script name. If you set no_script_name to on for all the applications and environments, all URLs will be interpreted as requests to the `frontend` application in the `prod` environment. This is why you can have only one application with one environment taking advantage of the URL rewriting for a given project.
+
+>**TIP**
+>There is a way to have more than one application with no script name. Just create subdirectories in the web root, and move the front controllers inside them. Change the `SF_ROOT_DIR` constants definition accordingly, and create the `.htaccess` URL rewriting configuration that you need for each application.
+
+Link Helpers
+------------
+
+Because of the routing system, you should use link helpers instead of regular `<a>` tags in your templates. Don't look at it as a hassle, but rather as an opportunity to keep your application clean and easy to maintain. Besides, link helpers offer a few very useful shortcuts that you don't want to miss.
+
+### Hyperlinks, Buttons, and Forms
+
+You already know about the `link_to()` helper. It outputs an XHTML-compliant hyperlink, and it expects two parameters: the element that can be clicked and the internal URI of the resource to which it points. If, instead of a hyperlink, you want a button, use the `button_to()` helper. Forms also have a helper to manage the value of the `action` attribute. You will learn more about forms in the next chapter. Listing 9-7 shows some examples of link helpers.
+
+Listing 9-7 - Link Helpers for `<a>`, `<input>`, and `<form>` Tags
+
+    [php]
+    // Hyperlink on a string
+    <?php echo link_to('my article', 'article/read?title=Finance_in_France') ?>
+     => <a href="/routed/url/to/Finance_in_France">my article</a>
+
+    // Hyperlink on an image
+    <?php echo link_to(image_tag('read.gif'), 'article/read?title=Finance_in_France') ?>
+     => <a href="/routed/url/to/Finance_in_France"><img src="/images/read.gif" /></a>
+
+    // Button tag
+    <?php echo button_to('my article', 'article/read?title=Finance_in_France') ?>
+     => <input value="my article" type="button"onclick="document.location.href='/routed/url/to/Finance_in_France';" />
+
+    // Form tag
+    <?php echo form_tag('article/read?title=Finance_in_France') ?>
+     => <form method="post" action="/routed/url/to/Finance_in_France" />
+
+Link helpers can accept internal URIs as well as absolute URLs (starting with `http://`, and skipped by the routing system) and anchors. Note that in real-world applications, internal URIs are built with dynamic parameters. Listing 9-8 shows examples of all these cases.
+
+Listing 9-8 - URLs Accepted by Link Helpers
+
+    [php]
+    // Internal URI
+    <?php echo link_to('my article', 'article/read?title=Finance_in_France') ?>
+     => <a href="/routed/url/to/Finance_in_France">my article</a>
+
+    // Internal URI with dynamic parameters
+    <?php echo link_to('my article', 'article/read?title='.$article->getTitle()) ?>
+
+    // Internal URI with anchors
+    <?php echo link_to('my article', 'article/read?title=Finance_in_France#foo') ?>
+     => <a href="/routed/url/to/Finance_in_France#foo">my article</a>
+
+    // Absolute URL
+    <?php echo link_to('my article', 'http://www.example.com/foobar.html') ?>
+     => <a href="http://www.example.com/foobar.html">my article</a>
+
+### Link Helper Options
+
+As explained in Chapter 7, helpers accept an additional options argument, which can be an associative array or a string. This is true for link helpers, too, as shown in Listing 9-9.
+
+Listing 9-9 - Link Helpers Accept Additional Options
+
+    [php]
+    // Additional options as an associative array
+    <?php echo link_to('my article', 'article/read?title=Finance_in_France', array(
+      'class'  => 'foobar',
+      'target' => '_blank'
+    )) ?>
+
+    // Additional options as a string (same result)
+    <?php echo link_to('my article', 'article/read?title=Finance_in_France','class=foobar target=_blank') ?>
+     => <a href="/routed/url/to/Finance_in_France" class="foobar" target="_blank">my article</a>
+
+You can also add one of the symfony-specific options for link helpers: `confirm` and `popup`. The first one displays a JavaScript confirmation dialog box when the link is clicked, and the second opens the link in a new window, as shown in Listing 9-10.
+
+Listing 9-10 - `'confirm'` and `'popup'` Options for Link Helpers
+
+    [php]
+    <?php echo link_to('delete item', 'item/delete?id=123', 'confirm=Are you sure?') ?>
+     => <a onclick="return confirm('Are you sure?');"
+           href="/routed/url/to/delete/123.html">add to cart</a>
+
+    <?php echo link_to('add to cart', 'shoppingCart/add?id=100', 'popup=true') ?>
+     => <a onclick="window.open(this.href);return false;"
+           href="/fo_dev.php/shoppingCart/add/id/100.html">add to cart</a>
+
+    <?php echo link_to('add to cart', 'shoppingCart/add?id=100', array(
+      'popup' => array('Window title', 'width=310,height=400,left=320,top=0')
+    )) ?>
+     => <a onclick="window.open(this.href,'Window title','width=310,height=400,left=320,top=0');return false;"
+           href="/fo_dev.php/shoppingCart/add/id/100.html">add to cart</a>
+
+These options can be combined.
+
+### Fake GET and POST Options
+
+Sometimes web developers use GET requests to actually do a POST. For instance, consider the following URL:
+
+    http://www.example.com/index.php/shopping_cart/add/id/100
+
+This request will change the data contained in the application, by adding an item to a shopping cart object, stored in the session or in a database. This URL can be bookmarked, cached, and indexed by search engines. Imagine all the nasty things that might happen to the database or to the metrics of a website using this technique. As a matter of fact, this request should be considered as a POST, because search engine robots do not do POST requests on indexing.
+
+Symfony provides a way to transform a call to a `link_to()` or `button_to()` helper into an actual POST. Just add a `post=true` option, as shown in Listing 9-11.
+
+Listing 9-11 - Making a Link Call a POST Request
+
+    [php]
+    <?php echo link_to('go to shopping cart', 'shoppingCart/add?id=100', 'post=true') ?>
+     => <a onclick="f = document.createElement('form'); document.body.appendChild(f);
+                    f.method = 'POST'; f.action = this.href; f.submit();return false;"
+           href="/shoppingCart/add/id/100.html">go to shopping cart</a>
+
+This `<a>` tag has an `href` attribute, and browsers without JavaScript support, such as search engine robots, will follow the link doing the default GET. So you must also restrict your action to respond only to the POST method, by adding something like the following at the beginning of the action:
+
+    [php]
+    $this->forward404If($request->getMethod() != sfRequest::POST);
+
+Just make sure you don't use this option on links located in forms, since it generates its own `<form>` tag.
+
+It is a good habit to tag as POST the links that actually post data.
+
+### Forcing Request Parameters As GET Variables
+
+According to your routing rules, variables passed as parameters to a `link_to()` are transformed into patterns. If no rule matches the internal URI in the `routing.yml` file, the default rule transforms `module/action?key=value` into `/module/action/key/value`, as shown in Listing 9-12.
+
+Listing 9-12 - Default Routing Rule
+
+    [php]
+    <?php echo link_to('my article', 'article/read?title=Finance_in_France') ?>
+    => <a href="/article/read/title/Finance_in_France">my article</a>
+
+If you actually need to keep the GET syntax--to have request parameters passed under the ?key=value form--you should put the variables that need to be forced outside the URL parameter, in the query_string option. All the link helpers accept this option, as demonstrated in Listing 9-13.
+
+Listing 9-13 - Forcing GET Variables with the `query_string` Option
+
+    [php]
+    <?php echo link_to('my article', 'article/read?title=Finance_in_France', array(
+      'query_string' => 'title=Finance_in_France'
+    )) ?>
+    => <a href="/article/read?title=Finance_in_France">my article</a>
+
+A URL with request parameters appearing as GET variables can be interpreted by a script on the client side, and by the `$_GET` and `$_REQUEST` variables on the server side.
+
+>**SIDEBAR**
+>Asset helpers
+>
+>Chapter 7 introduced the asset helpers `image_tag()`, `stylesheet_tag()`, and `javascript_include_ tag()`, which allow you to include an image, a style sheet, or a JavaScript file in the response. The paths to such assets are not processed by the routing system, because they link to resources that are actually located under the public web directory.
+>
+>You don't need to mention a file extension for an asset. Symfony automatically adds `.png`, `.js`, or `.css` to an image, JavaScript, or style sheet helper call. Also, symfony will automatically look for those assets in the `web/images/`, `web/js/`, and `web/css/` directories. Of course, if you want to include a specific file format or a file from a specific location, just use the full file name or the full file path as an argument. And don't bother to specify an `alt` attribute if your media file has an explicit name, since symfony will determine it for you.
+>
+>     [php]
+>     <?php echo image_tag('test') ?>
+>     <?php echo image_tag('test.gif') ?>
+>     <?php echo image_tag('/my_images/test.gif') ?>
+>      => <img href="/images/test.png" alt="Test" />
+>         <img href="/images/test.gif" alt="Test" />
+>         <img href="/my_images/test.gif" alt="Test" />
+>
+>To fix the size of an image, use the `size` attribute. It expects a width and a height in pixels, separated by an `x`.
+>
+>     [php]
+>     <?php echo image_tag('test', 'size=100x20')) ?>
+>      => <img href="/images/test.png" alt="Test" width="100" height="20"/>
+>
+>If you want the asset inclusion to be done in the `<head>` section (for JavaScript files and style sheets), you should use the `use_stylesheet()` and `use_javascript()` helpers in your templates, instead of the `_tag()` versions in the layout. They add the asset to the response, and these assets are included before the `</head>` tag is sent to the browser.
+
+### Using Absolute Paths
+
+The link and asset helpers generate relative paths by default. To force the output to absolute paths, set the `absolute` option to `true`, as shown in Listing 9-14. This technique is useful for inclusions of links in an e-mail message, RSS feed, or API response.
+
+Listing 9-14 - Getting Absolute URLs Instead of Relative URLs
+
+    [php]
+    <?php echo url_for('article/read?title=Finance_in_France') ?>
+     => '/routed/url/to/Finance_in_France'
+    <?php echo url_for('article/read?title=Finance_in_France', true) ?>
+     => 'http://www.example.com/routed/url/to/Finance_in_France'
+
+    <?php echo link_to('finance', 'article/read?title=Finance_in_France') ?>
+     => <a href="/routed/url/to/Finance_in_France">finance</a>
+    <?php echo link_to('finance', 'article/read?title=Finance_in_France','absolute=true') ?>
+     => <a href=" http://www.example.com/routed/url/to/Finance_in_France">finance</a>
+
+    // The same goes for the asset helpers
+    <?php echo image_tag('test', 'absolute=true') ?>
+    <?php echo javascript_include_tag('myscript', 'absolute=true') ?>
+
+>**SIDEBAR**
+>The Mail helper
+>
+>Nowadays, e-mail-harvesting robots prowl about the Web, and you can't display an e-mail address on a website without becoming a spam victim within days. This is why symfony provides a `mail_to()` helper.
+>
+>The `mail_to()` helper takes two parameters: the actual e-mail address and the string that should be displayed. Additional options accept an `encode` parameter to output something pretty unreadable in HTML, which is understood by browsers but not by robots.
+>
+>     [php]
+>     <?php echo mail_to('myaddress en mydomain.com', 'contact') ?>
+>      => <a href="mailto:myaddress en mydomain.com'>contact</a>
+>     <?php echo mail_to('myaddress en mydomain.com', 'contact', 'encode=true') ?>
+>      => <a href="&#109;&#x61;... &#111;&#x6d;">&#x63;&#x74;... e&#115;&#x73;</a>
+>
+>Encoded e-mail messages are composed of characters transformed by a random decimal and hexadecimal entity encoder. This trick stops most of the address-harvesting spambots for now, but be aware that the harvesting techniques evolve rapidly.
+
+Routing Configuration
+---------------------
+
+The routing system does two things:
+
+  * It interprets the external URL of incoming requests and transforms it into an internal URI, to determine the module/action and the request parameters.
+  * It formats the internal URIs used in links into external URLs (provided that you use the link helpers).
+
+The conversion is based on a set of routing rules . These rules are stored in a `routing.yml` configuration file located in the application `config/` directory. Listing 9-15 shows the default routing rules, bundled with every symfony project.
+
+Listing 9-15 - The Default Routing Rules, in `myapp/config/routing.yml`
+
+    # default rules
+    homepage:
+      url:   /
+      param: { module: default, action: index }
+
+    default_symfony:
+      url:   /symfony/:action/*
+      param: { module: default }
+
+    default_index:
+      url:   /:module
+      param: { action: index }
+
+    default:
+      url:   /:module/:action/*
+
+### Rules and Patterns
+
+Routing rules are bijective associations between an external URL and an internal URI. A typical rule is made up of the following:
+
+  * A unique label, which is there for legibility and speed, and can be used by the link helpers
+  * A pattern to be matched (`url` key)
+  * An array of request parameter values (`param` key)
+
+Patterns can contain wildcards (represented by an asterisk, *) and named wildcards (starting with a colon, :). A match to a named wildcard becomes a request parameter value. For instance, the `default` rule defined in Listing 9-15 will match any URL like `/foo/bar`, and set the `module` parameter to `foo` and the `action` parameter to `bar`. And in the `default_symfony` rule, `symfony` is a keyword and `action` is named wildcard parameter.
+
+The routing system parses the `routing.yml` file from the top to the bottom and stops at the first match. This is why you must add your own rules on top of the default ones. For instance, the URL `/foo/123` matches both of the rules defined in Listing 9-16, but symfony first tests `my_rule:`, and as that rule matches, it doesn't even test the `default:` one. The request is handled by the `mymodule/myaction` action with `bar` set to `123` (and not by the `foo/123` action).
+
+Listing 9-16 - Rules Are Parsed Top to Bottom
+
+    my_rule:
+      url:   /foo/:bar
+      param: { module: mymodule, action: myaction }
+
+    # default rules
+    default:
+      url:   /:module/:action/*
+
+>**NOTE**
+>When a new action is created, it does not imply that you must create a routing rule for it. If the default module/action pattern suits you, then forget about the `routing.yml` file. If, however, you want to customize the action's external URL, add a new rule above the default one.
+
+Listing 9-17 shows the process of changing the external URL format for an article/read action.
+
+Listing 9-17 - Changing the External URL Format for an `article/read` Action
+
+    [php]
+    <?php echo url_for('my article', 'article/read?id=123) ?>
+     => /article/read/id/123       // Default formatting
+
+    // To change it to /article/123, add a new rule at the beginning
+    // of your routing.yml
+    article_by_id:
+      url:   /article/:id
+      param: { module: article, action: read }
+
+The problem is that the `article_by_id` rule in Listing 9-17 breaks the default routing for all the other actions of the `article` module. In fact, a URL like `article/delete` will match this rule instead of the `default` one, and call the `read` action with `id` set to `delete` instead of the `delete` action. To get around this difficulty, you must add a pattern constraint so that the `article_by_id` rule matches only URLs where the `id` wildcard is an integer.
+
+### Pattern Constraints
+
+When a URL can match more than one rule, you must refine the rules by adding constraints, or requirements, to the pattern. A requirement is a set of regular expressions that must be matched by the wildcards for the rule to match.
+
+For instance, to modify the `article_by_id` rule so that it matches only URLs where the `id` parameter is an integer, add a line to the rule, as shown in Listing 9-18.
+
+Listing 9-18 - Adding a Requirement to a Routing Rule
+
+    article_by_id:
+      url:   /article/:id
+      param: { module: article, action: read }
+      requirements: { id: \d+ }
+
+Now an `article/delete` URL can't match the `article_by_id` rule anymore, because the `'delete'` string doesn't satisfy the requirements. Therefore, the routing system will keep on looking for a match in the following rules and finally find the `default` rule.
+
+>**SIDEBAR**
+>Permalinks
+>
+>A good security guideline for routing is to hide primary keys and replace them with significant strings as much as possible. What if you wanted to give access to articles from their title rather than from their ID? It would make external URLs look like this:
+>
+>     http://www.example.com/article/Finance_in_France
+>
+>To that extent, you need to create a new `permalink` action, which will use a `slug` parameter instead of an `id` one, and add a new rule for it:
+>
+>     article_by_id:
+>       url:          /article/:id
+>       param:        { module: article, action: read }
+>       requirements: { id: \d+ }
+>
+>     article_by_slug:
+>       url:          /article/:slug
+>       param:        { module: article, action: permalink }
+>
+>The `permalink` action needs to determine the requested article from its title, so your model must provide an appropriate method.
+>
+>     [php]
+>     public function executePermalink()
+>     {
+>       $article = ArticlePeer::retrieveBySlug($this->getRequestParameter('slug');
+>       $this->forward404Unless($article);  // Display 404 if no article matches slug
+>       $this->article = $article;          // Pass the object to the template
+>     }
+>
+>You also need to replace the links to the `read` action in your templates with links to the `permalink` one, to enable correct formatting of internal URIs.
+>
+>     [php]
+>     // Replace
+>     <?php echo link_to('my article', 'article/read?id='.$article->getId()) ?>
+>
+>     // With
+>     <?php echo link_to('my article', 'article/permalink?slug='.$article->getSlug()) ?>
+>
+>Thanks to the `requirements` line, an external URL like `/article/Finance_in_France` matches the `article_by_slug` rule, even though the `article_by_id` rule appears first.
+>
+>Note that as articles will be retrieved by slug, you should add an index to the `slug` column in the `Article` model description to optimize database performance.
+
+### Setting Default Values
+
+You can give named wildcards a default value to make a rule work, even if the parameter is not defined. Set default values in the `param:` array.
+
+For instance, the `article_by_id` rule doesn't match if the `id` parameter is not set. You can force it, as shown in Listing 9-19.
+
+Listing 9-19 - Setting a Default Value for a Wildcard
+
+    article_by_id:
+      url:          /article/:id
+      param:        { module: article, action: read,
+    id: 1
+     }
+
+The default parameters don't need to be wildcards found in the pattern. In Listing 9-20, the `display` parameter takes the value `true`, even if it is not present in the URL.
+
+Listing 9-20 - Setting a Default Value for a Request Parameter
+
+    article_by_id:
+      url:          /article/:id
+      param:        { module: article, action: read, id: 1, display: true }
+
+If you look carefully, you can see that `article` and `read` are also default values for `module` and `action` variables not found in the pattern.
+
+>**TIP**
+>You can define a default parameter for all the routing rules by defining the `sf_routing_default` configuration parameter. For instance, if you want all the rules to have a `theme` parameter set to `default` by default, add the line `sfConfig::set('sf_routing_defaults', array('theme' => 'default'));` to your application's `config.php`.
+
+### Speeding Up Routing by Using the Rule Name
+
+The link helpers accept a  rule label instead of a module/action pair if the rule label is preceded by an at sign (@), as shown in Listing 9-21.
+
+Listing 9-21 - Using the Rule Label Instead of the Module/Action
+
+    [php]
+    <?php echo link_to('my article', 'article/read?id='.$article->getId()) ?>
+
+    // can also be written as
+    <?php echo link_to('my article', '@article_by_id?id='.$article->getId()) ?>
+
+There are pros and cons to this trick. The advantages are as follows:
+
+  * The formatting of internal URIs is done much faster, since symfony doesn't have to browse all the rules to find the one that matches the link. In a page with a great number of routed hyperlinks, the boost will be noticeable if you use rule labels instead of module/action pairs.
+  * Using the rule label helps to abstract the logic behind an action. If you decide to change an action name but keep the URL, a simple change in the `routing.yml` file will suffice. All of the `link_to()` calls will still work without further change.
+  * The logic of the call is more apparent with a rule name. Even if your modules and actions have explicit names, it is often better to call `@display_article_by_slug` than `article/display`.
+
+On the other hand, a disadvantage is that adding new hyperlinks becomes less self-evident, since you always need to refer to the `routing.yml` file to find out which label is to be used for an action.
+
+The best choice depends on the project. In the long run, it's up to you.
+
+>**TIP**
+>During your tests (in the `dev` environment), if you want to check which rule was matched for a given request in your browser, develop the "logs and msgs" section of the web debug toolbar and look for a line specifying "matched route XXX." You will find more information about the web debug mode in Chapter 16.
+
+### Adding an .html Extension
+
+Compare these two URLs:
+
+    http://myapp.example.com/article/Finance_in_France
+    http://myapp.example.com/article/Finance_in_France.html
+
+Even if it is the same page, users and (robots) may see it differently because of the URL. The second URL evokes a deep and well-organized web directory of static pages, which is exactly the kind of websites that search engines know how to index.
+
+To add a suffix to every external URL generated by the routing system, change the `suffix` value in the application `settings.yml`, as shown in Listing 9-22.
+
+Listing 9-22 - Setting a Suffix for All URLs, in `myapp/config/settings.yml`
+
+    prod:
+      .settings
+        suffix:         .html
+
+The default suffix is set to a period (`.`), which means that the routing system doesn't add a suffix unless you specify it.
+
+It is sometimes necessary to specify a suffix for a unique routing rule. In that case, write the suffix directly in the related `url:` line of the `routing.yml` file, as shown in Listing 9-23. Then the global suffix will be ignored.
+
+Listing 9-23 - Setting a Suffix for One URL, in `myapp/config/routing.yml`
+
+    article_list:
+      url:          /latest_articles
+      param:        { module: article, action: list }
+
+    article_list_feed:
+      url:          /latest_articles.rss
+      param:        { module: article, action: list, type: feed }
+
+### Creating Rules Without routing.yml
+
+As is true of most of the configuration files, the `routing.yml` is a solution to define routing rules, but not the only one. You can define rules in PHP, either in the application `config.php` file or in the front controller script, but before the call to `dispatch()`, because this method determines the action to execute according to the present routing rules. Defining rules in PHP authorizes you to create dynamic rules, depending on configuration or other parameters.
+
+The object that handles the routing rules is the `sfRouting` singleton. It is available from every part of the code by requiring `sfRouting::getInstance()`. Its `prependRoute()` method adds a new rule on top of the existing ones defined in `routing.yml`. It expects four parameters, which are the same as the parameters needed to define a rule: a route label, a pattern, an associative array of default values, and another associative array for requirements. For instance, the routing.yml rule definition shown in Listing 9-18 is equivalent to the PHP code shown in Listing 9-24.
+
+Listing 9-24 - Defining a Rule in PHP
+
+    [php]
+    sfRouting::getInstance()->prependRoute(
+      'article_by_id',                                  // Route name
+      '/article/:id',                                   // Route pattern
+      array('module' => 'article', 'action' => 'read'), // Default values
+      array('id' => '\d+'),                             // Requirements
+    );
+
+The sfRouting singleton has other useful methods for handling routes by hand: clearRoutes(), h`asRoutes()`, `getRoutesByName()`, and so on. Refer to the API documentation ([http://www.symfony-project.com/api/symfony.html](http://www.symfony-project.com/api/symfony.html)) to learn more.
+
+>**TIP**
+>Once you start to fully understand the concepts presented in this book, you can increase your understanding of the framework by browsing the online API documentation or, even better, the symfony source. Not all the tweaks and parameters of symfony can be described in this book. The online documentation, however, is limitless.
+
+Dealing with Routes in Actions
+------------------------------
+
+If you need to retrieve information about the current route--for instance, to prepare a future "back to page xxx" link--you should use the methods of the sfRouting object. The URIs returned by the `getCurrentInternalUri()` method can be used in a call to a `link_to()` helper, as shown in Listing 9-25.
+
+Listing 9-25 - Using `sfRouting` to Get Information About the Current Route
+
+    [php]
+    // If you require a URL like
+    http://myapp.example.com/article/21
+
+    // Use the following in article/read action
+    $uri = sfRouting::getInstance()->getCurrentInternalUri();
+     => article/read?id=21
+
+    $uri = sfRouting::getInstance()->getCurrentInternalUri(true);
+     => @article_by_id?id=21
+
+    $rule = sfRouting::getInstance()->getCurrentRouteName();
+     => article_by_id
+
+    // If you just need the current module/action names,
+    // remember that they are actual request parameters
+    $module = $this->getRequestParameter('module');
+    $action = $this->getRequestParameter('action');
+
+If you need to transform an internal URI into an external URL in an action--just as `url_for()` does in a template--use the `genUrl()` method of the sfController object, as shown in Listing 9-26.
+
+Listing 9-26 - Using `sfController` to Transform an Internal URI
+
+    [php]
+    $uri = 'article/read?id=21';
+
+    $url = $this->getController()->genUrl($uri);
+     => /article/21
+
+    $url = $this->getController()->genUrl($uri, true);
+    => http://myapp.example.com/article/21
+
+Summary
+-------
+
+Routing is a two-way mechanism designed to allow formatting of external URLs so that they are more user-friendly. URL rewriting is required to allow the omission of the front controller name in the URLs of one of the applications of each project. You must use link helpers each time you need to output a URL in a template if you want the routing system to work both ways. The `routing.yml` file configures the rules of the routing system and uses an order of precedence and rule requirements. The `settings.yml` file contains additional settings concerning the presence of the front controller name and a possible suffix in external URLs.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/10-Forms.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/10-Forms.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/10-Forms.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1130 @@
+Chapter 10 - Forms
+==================
+
+When writing templates, much of a developer's time is devoted to forms. Despite this, forms are generally poorly designed. Since much attention is required to deal with default values, formatting, validation, repopulation, and form handling in general, some developers tend to skim over some important details in the process. Accordingly, symfony devotes special attention to this topic. This chapter describes the tools that automate many of these requirements while speeding up forms development:
+
+  * The form helpers provide a faster way to write form inputs in templates, especially for complex elements such as dates, drop-down lists, and rich text.
+  * When a form is devoted to editing the properties of an object, the templating can be further accelerated by using object form helpers.
+  * The YAML validation files facilitate form validation and repopulation.
+  * Validators package the code required to validate input. Symfony bundles validators for the most common needs, and it is very easy to add custom validators.
+
+Form Helpers
+------------
+
+In templates, HTML tags of form elements are very often mixed with PHP code. Form helpers in symfony aim to simplify this task and to avoid opening `<?php echo` tags repeatedly in the middle of `<input>` tags.
+
+### Main Form Tag
+
+As explained in the previous chapter, you must use the `form_tag()` helper to create a form, since it transforms the action given as a parameter into a routed URL. The second argument can support additional options--for instance, to change the default `method`, change the default `enctype`, or specify other attributes. Listing 10-1 shows examples.
+
+Listing 10-1 - The `form_tag()` Helper
+
+    [php]
+    <?php echo form_tag('test/save') ?>
+     => <form method="post" action="/path/to/save">
+
+    <?php echo form_tag('test/save', 'method=get multipart=true class=simpleForm') ?>
+     => <form method="get" enctype="multipart/form-data" class="simpleForm"action="/path/to/save">
+
+As there is no need for a closing form helper, you should use the HTML `</form>` tag, even if it doesn't look good in your source code.
+
+### Standard Form Elements
+
+With form helpers, each element in a form is given an id attribute deduced from its name attribute by default. This is not the only useful convention. See Listing 10-2 for a full list of standard form helpers and their options.
+
+Listing 10-2 - Standard Form Helpers Syntax
+
+    [php]
+    // Text field (input)
+    <?php echo input_tag('name', 'default value') ?>
+     => <input type="text" name="name" id="name" value="default value" />
+
+    // All form helpers accept an additional options parameter
+    // It allows you to add custom attributes to the generated tag
+    <?php echo input_tag('name', 'default value', 'maxlength=20') ?>
+     => <input type="text" name="name" id="name" value="default value"maxlength="20" />
+
+    // Long text field (text area)
+    <?php echo textarea_tag('name', 'default content', 'size=10x20') ?>
+     => <textarea name="name" id="name" cols="10" rows="20">
+          default content
+        </textarea>
+
+    // Check box
+    <?php echo checkbox_tag('single', 1, true) ?>
+    <?php echo checkbox_tag('driverslicense', 'B', false) ?>
+     => <input type="checkbox" name="single" id="single" value="1"checked="checked" />
+        <input type="checkbox" name="driverslicense" id="driverslicense"value="B" />
+
+    // Radio button
+    <?php echo radiobutton_tag('status[]', 'value1', true) ?>
+    <?php echo radiobutton_tag('status[]', 'value2', false) ?>
+     => <input type="radio" name="status[]" id="status_value1" value="value1"checked="checked" />
+        <input type="radio" name="status[]" id="status_value2" value="value2" />
+
+    // Dropdown list (select)
+    <?php echo select_tag('payment',
+      '<option selected="selected">Visa</option>
+       <option>Eurocard</option>
+       <option>Mastercard</option>')
+    ?>
+     => <select name="payment" id="payment">
+          <option selected="selected">Visa</option>
+          <option>Eurocard</option>
+          <option>Mastercard</option>
+        </select>
+
+    // List of options for a select tag
+    <?php echo options_for_select(array('Visa', 'Eurocard', 'Mastercard'), 0) ?>
+     => <option value="0" selected="selected">Visa</option>
+        <option value="1">Eurocard</option>
+        <option value="2">Mastercard</option>
+
+    // Dropdown helper combined with a list of options
+    <?php echo select_tag('payment', options_for_select(array(
+      'Visa',
+      'Eurocard',
+      'Mastercard'
+    ), 0)) ?>
+     => <select name="payment" id="payment">
+          <option value="0" selected="selected">Visa</option>
+          <option value="1">Eurocard</option>
+          <option value="2">Mastercard</option>
+        </select>
+
+    // To specify option names, use an associative array
+    <?php echo select_tag('name', options_for_select(array(
+      'Steve'  => 'Steve',
+      'Bob'    => 'Bob',
+      'Albert' => 'Albert',
+      'Ian'    => 'Ian',
+      'Buck'   => 'Buck'
+    ), 'Ian')) ?>
+     => <select name="name" id="name">
+          <option value="Steve">Steve</option>
+          <option value="Bob">Bob</option>
+          <option value="Albert">Albert</option>
+          <option value="Ian" selected="selected">Ian</option>
+          <option value="Buck">Buck</option>
+        </select>
+
+    // Dropdown list with multiple selection (selected values can be an array)
+    <?php echo select_tag('payment', options_for_select(
+      array('Visa' => 'Visa', 'Eurocard' => 'Eurocard', 'Mastercard' => 'Mastercard'),
+      array('Visa', 'Mastecard'),
+    ), array('multiple' => true))) ?>
+
+     => <select name="payment[]" id="payment" multiple="multiple">
+          <option value="Visa" selected="selected">Visa</option>
+          <option value="Eurocard">Eurocard</option>
+          <option value="Mastercard">Mastercard</option>
+        </select>
+    // Drop-down list with multiple selection (selected values can be an array)
+    <?php echo select_tag('payment', options_for_select(
+      array('Visa' => 'Visa', 'Eurocard' => 'Eurocard', 'Mastercard' => 'Mastercard'),
+      array('Visa', 'Mastecard')
+    ), 'multiple=multiple') ?>
+     => <select name="payment" id="payment" multiple="multiple">
+          <option value="Visa" selected="selected">	
+          <option value="Eurocard">Eurocard</option>
+          <option value="Mastercard" selected="selected">Mastercard</option>
+        </select>
+
+    // Upload file field
+    <?php echo input_file_tag('name') ?>
+     => <input type="file" name="name" id="name" value="" />
+
+    // Password field
+    <?php echo input_password_tag('name', 'value') ?>
+     => <input type="password" name="name" id="name" value="value" />
+
+    // Hidden field
+    <?php echo input_hidden_tag('name', 'value') ?>
+     => <input type="hidden" name="name" id="name" value="value" />
+
+    // Submit button (as text)
+    <?php echo submit_tag('Save') ?>
+     => <input type="submit" name="submit" value="Save" />
+
+    // Submit button (as image)
+    <?php echo submit_image_tag('submit_img') ?>
+     => <input type="image" name="submit" src="/images/submit_img.png" />
+
+The `submit_image_tag()` helper uses the same syntax and has the same advantages as the `image_tag()`.
+
+>**NOTE**
+>For radio buttons, the `id` attribute is not set by default to the value of the `name` attribute, but to a combination of the name and the value. That's because you need to have several radio button tags with the same name to obtain the automated "deselecting the previous one when selecting another" feature, and the `id=name` convention would imply having several HTML tags with the same `id` attribute in your page, which is strictly forbidden.
+
+-
+
+>**SIDEBAR**
+>Handling form submission
+>
+>How do you retrieve the data submitted by users through forms? It is available in the request parameters, so the action only needs to call `$this->getRequestParameter($elementName)` to get the value.
+>
+>A good practice is to use the same action to display and handle the form. According to the request method (GET or POST), either the form template is called or the form is handled and the request is redirected to another action.
+>
+>     [php]
+>     // In mymodule/actions/actions.class.php
+>     public function executeEditAuthor()
+>     {
+>       if ($this->getRequest()->getMethod() != sfRequest::POST)
+>       {
+>         // Display the form
+>         return sfView::SUCCESS;
+>       }
+>       else
+>       {
+>         // Handle the form submission
+>         $name = $this->getRequestParameter('name');
+>         ...
+>         $this->redirect('mymodule/anotheraction');
+>       }
+>     }
+>
+>For this to work, the form target must be the same action as the one displaying it.
+>
+>     [php]
+>     // In mymodule/templates/editAuthorSuccess.php
+>     <?php echo form_tag('mymodule/editAuthor') ?>
+>
+>     ...
+
+Symfony offers specialized form helpers to do asynchronous requests in the background. The next chapter, which focuses on Ajax, provides more details.
+
+### Date Input Widgets
+
+Forms are often used to retrieve dates. Dates in the wrong format are the main reason for form-submission failures. The `input_date_tag()` helper can assist the user in entering a date with an interactive JavaScript calendar, if you set the `rich` option to `true`, as shown in Figure 10-1.
+
+Figure 10-1 - Rich date input tag
+
+![Rich date input tag](/images/book/F1001.png "Rich date input tag")
+
+If the `rich` option is omitted, the helper echoes three `<select>` tags populated with a range of months, days, and years. You can display these drop-downs separately by calling their helpers (`select_day_tag()`, `select_month_tag()`, and `select_year_tag()`). The default values of these elements are the current day, month, and year. Listing 10-3 shows the input date helpers.
+
+Listing 10-3 - Input Date Helpers
+
+    [php]
+    <?php echo input_date_tag('dateofbirth', '2005-05-03', 'rich=true') ?>
+     => a text input tag together with a calendar widget
+
+    // The following helpers require the Date helper group
+    <?php use_helper('Date') ?>
+    <?php echo select_day_tag('day', 1, 'include_custom=Choose a day') ?>
+    => <select name="day" id="day">
+          <option value="">Choose a day</option>
+          <option value="1" selected="selected">01</option>
+          <option value="2">02</option>
+          ...
+          <option value="31">31</option>
+        </select>
+
+    <?php echo select_month_tag('month', 1, 'include_custom=Choose a month use_short_month=true') ?>
+    => <select name="month" id="month">
+          <option value="">Choose a month</option>
+          <option value="1" selected="selected">Jan</option>
+          <option value="2">Feb</option>
+          ...
+          <option value="12">Dec</option>
+        </select>
+
+    <?php echo select_year_tag('year', 2007, 'include_custom=Choose a year year_end=2010') ?>
+     => <select name="year" id="year">
+          <option value="">Choose a year</option>
+          <option value="2006">2006</option>
+          <option value="2007" selected="selected">2007</option>
+          ...
+        </select>
+
+The accepted date values for the `input_date_tag()` helper are the ones recognized by the `strtotime()` PHP function. Listing 10-4 shows which formats can be used, and Listing 10-5 shows the ones that must be avoided.
+
+Listing 10-4 - Accepted Date Formats in Date Helpers
+
+    [php]
+    // Work fine
+    <?php echo input_date_tag('test', '2006-04-01', 'rich=true') ?>
+    <?php echo input_date_tag('test', 1143884373, 'rich=true') ?>
+    <?php echo input_date_tag('test', 'now', 'rich=true') ?>
+    <?php echo input_date_tag('test', '23 October 2005', 'rich=true') ?>
+    <?php echo input_date_tag('test', 'next tuesday', 'rich=true') ?>
+    <?php echo input_date_tag('test', '1 week 2 days 4 hours 2 seconds', 'rich=true') ?>
+
+    // Return null
+    <?php echo input_date_tag('test', null, 'rich=true') ?>
+    <?php echo input_date_tag('test', '', 'rich=true') ?>
+
+Listing 10-5 - Incorrect Date Formats in Date Helpers
+
+    [php]
+    // Date zero = 01/01/1970
+    <?php echo input_date_tag('test', 0, 'rich=true') ?>
+
+    // Non-English date formats don't work
+    <?php echo input_date_tag('test', '01/04/2006', 'rich=true') ?>
+
+### Rich Text Editing
+
+Rich text editing is also possible in a `<textarea>` tag, thanks to the integration of the TinyMCE and FCKEditor widgets. They provide a word-processor-like interface with buttons to format text as bold, italic, and other styles, as shown in Figure 10-2.
+
+Figure 10-2 - Rich text editing
+
+![Rich text editing](/images/book/F1002.png "Rich text editing")
+
+Both widgets require manual installation. As the procedure is the same for the two widgets, only the TinyMCE rich text editing is described here. You need to download the editor from the project website ([http://tinymce.moxiecode.com/](http://tinymce.moxiecode.com/)) and unpack it in a temporary folder. Copy the `tinymce/jscripts/tiny_mce/` directory into your project `web/js/` directory, and define the path to the library in `settings.yml`, as shown in Listing 10-6.
+
+Listing 10-6 - Setting Up the TinyMCE Library Path
+
+    all:
+      .settings:
+        rich_text_js_dir:  js/tiny_mce
+
+Once this is done, toggle the use of rich text editing in text areas by adding the `rich=true` option. You can also specify custom options for the JavaScript editor using the `tinymce_options` option. Listing 10-7 shows examples.
+
+Listing 10-7 - Rich Text Area
+
+    [php]
+    <?php echo textarea_tag('name', 'default content', 'rich=true size=10x20')) ?>
+     => a rich text edit zone powered by TinyMCE
+    <?php echo textarea_tag('name', 'default content', 'rich=true size=10x20tinymce_options=language:"fr",theme_advanced_buttons2:"separator"')) ?>
+    => a rich text edit zone powered by TinyMCE with custom parameters
+
+### Country and Language Selection
+
+You may need to display a country selection field. But since country names are not the same in all languages, the options of a country drop-down list should vary according to the user culture (see Chapter 13 for more information about cultures). As shown in Listing 10-8, the `select_country_tag()` helper does it all for you: It internationalizes country names and uses the standard ISO country codes for values.
+
+Listing 10-8 - Select Country Tag Helper
+
+    [php]
+    <?php echo select_country_tag('country', 'AL') ?>
+     => <select name="country" id="country">
+          <option value="AF">Afghanistan</option>
+          <option value="AL" selected="selected">Albania</option>
+          <option value="DZ">Algeria</option>
+          <option value="AS">American Samoa</option>
+      ...
+
+Similar to `select_country_tag()` helper, the `select_language_tag()` helper displays a list of languages, as shown in Listing 10-9.
+
+Listing 10-9 - Select Language Tag Helper
+
+    [php]
+    <?php echo select_language_tag('language', 'en') ?>
+     => <select name="language" id="language">
+          ...
+          <option value="elx">Elamite</option>
+          <option value="en" selected="selected">English</option>
+          <option value="enm">English, Middle (1100-1500)</option>
+          <option value="ang">English, Old (ca.450-1100)</option>
+          <option value="myv">Erzya</option>
+          <option value="eo">Esperanto</option>
+          ...
+
+Form Helpers for Objects
+------------------------
+
+When form elements are used to edit the properties of an object, standard link helpers can become tedious to write. For instance, to edit the `telephone` attribute of a `Customer` object, you would write this:
+
+    [php]
+    <?php echo input_tag('telephone', $customer->getTelephone()) ?>
+    => <input type="text" name="telephone" id="telephone" value="0123456789" />
+
+To avoid repeating the attribute name, symfony provides an alternative object form helper for each form helper. An object form helper deduces the name and the default value of a form element from an object and a method name. The previous `input_tag()` is equivalent to this:
+
+    [php]
+    <?php echo object_input_tag($customer, 'getTelephone') ?>
+    => <input type="text" name="telephone" id="telephone" value="0123456789" />
+
+The economy might not look crucial for the `object_input_tag()`. However, every standard form helper has a corresponding object form helper, and they all share the same syntax. It makes generation of forms quite straightforward. That's why the object form helpers are used extensively in the scaffolding and generated administrations (see Chapter 14). Listing 10-10 lists the object form helpers.
+
+Listing 10-10 - Object Form Helpers Syntax
+
+    [php]
+    <?php echo object_input_tag($object, $method, $options) ?>
+    <?php echo object_input_date_tag($object, $method, $options) ?>
+    <?php echo object_input_hidden_tag($object, $method, $options) ?>
+    <?php echo object_textarea_tag($object, $method, $options) ?>
+    <?php echo object_checkbox_tag($object, $method, $options) ?>
+    <?php echo object_select_tag($object, $method, $options) ?>
+    <?php echo object_select_country_tag($object, $method, $options) ?>
+    <?php echo object_select_language_tag($object, $method, $options) ?>
+
+There is no `object_password_tag()` helper, since it is a bad practice to give a default value to a password tag, based on something the user has previously entered.
+
+>**CAUTION**
+>Unlike the regular form helpers, the object form helpers are available only if you declare explicitly the use of the `Object` helper group in your template with `use_helper('Object')`.
+
+The most interesting of all object form helpers are `objects_for_select()` and `object_select_tag()`, which concern drop-down lists.
+
+### Populating Drop-Down Lists with Objects
+
+The `options_for_select()` helper, described previously with the other standard helpers, transforms a PHP associative array into an options list, as shown in Listing 10-11.
+
+Listing 10-11 - Creating a List of Options Based on an Array with `options_for_select()`
+
+    [php]
+    <?php echo options_for_select(array(
+      '1' => 'Steve',
+      '2' => 'Bob',
+      '3' => 'Albert',
+      '4' => 'Ian',
+      '5' => 'Buck'
+    ), 4) ?>
+     => <option value="1">Steve</option>
+        <option value="2">Bob</option>
+        <option value="3">Albert</option>
+        <option value="4" selected="selected">Ian</option>
+        <option value="5">Buck</option>
+
+Suppose that you already have an array of objects of class `Author`, resulting from a Propel query. If you want to build a list of options based on this array, you will need to loop on it to retrieve the `id` and the `name` of each object, as shown in Listing 10-12.
+
+Listing 10-12 - Creating a List of Options Based on an Array of Objects with `options_for_select()`
+
+    [php]
+    // In the action
+    $options = array();
+    foreach ($authors as $author)
+    {
+      $options[$author->getId()] = $author->getName();
+    }
+    $this->options = $options;
+
+    // In the template
+    <?php echo options_for_select($options, 4) ?>
+
+This kind of processing happens so often that symfony has a helper to automate it: `objects_for_select()`, which creates an option list based directly on an array of objects. The helper needs two additional parameters: the method names used to retrieve the `value` and the text contents of the `<option>` tags to be generated. So Listing 10-12 is equivalent to this simpler form:
+
+    [php]
+    <?php echo objects_for_select($authors, 'getId', 'getName', 4) ?>
+
+That's smart and fast, but symfony goes even further, when you deal with foreign key columns.
+
+### Creating a Drop-Down List Based on a Foreign Key Column
+
+The values a foreign key column can take are the primary key values of the foreign table records. If, for instance, the `article` table has an `author_id` column that is a foreign key to an `author` table, the possible values for this column are the `id` of all the records of the `author` table. Basically, a drop-down list to edit the author of an article would look like Listing 10-13.
+
+Listing 10-13 - Creating a List of Options Based on a Foreign Key with `objects_for_select()`
+
+    [php]
+    <?php echo select_tag('author_id', objects_for_select(
+      AuthorPeer::doSelect(new Criteria()),
+      'getId',
+      '__toString()',
+      $article->getAuthorId()
+    )) ?>
+    => <select name="author_id" id="author_id">
+          <option value="1">Steve</option>
+          <option value="2">Bob</option>
+          <option value="3">Albert</option>
+          <option value="4" selected="selected">Ian</option>
+          <option value="5">Buck</option>
+        </select>
+
+The `object_select_tag()` does all that by itself. It displays a drop-down list populated with the name of the possible records of the foreign table. The helper can guess the foreign table and foreign column from the schema, so its syntax is very concise. Listing 10-13 is equivalent to this:
+
+    [php]
+    <?php echo object_select_tag($article, 'getAuthorId') ?>
+
+The `object_select_tag()` helper guesses the related peer class name (`AuthorPeer` in the example) based on the method name passed as a parameter. However, you can specify your own class by setting the `related_class` option in the third argument. The text content of the `<option>` tags is the record name, which is the result of the `__toString()` method of the object class (if `$author->__toString()` method is undefined, the primary key is used instead). In addition, the list of options is built from a doSelect() method with an empty criteria value; it returns all the records ordered by creation date. If you prefer to display only a subset of records with a specific ordering, create a method in the peer class returning this selection as an array of objects, and set it in the `peer_method` option. Lastly, you can add a blank option or a custom option at the top of the drop-down list by setting the include_blank and include_custom options. Listing 10-14 demonstrates these different options for the `object_select_tag()` helper.
+
+Listing 10-14 - Options of the `object_select_tag()` Helper
+
+    [php]
+    // Base syntax
+    <?php echo object_select_tag($article, 'getAuthorId') ?>
+    // Builds the list from AuthorPeer::doSelect(new Criteria())
+
+    // Change the peer class used to retrieve the possible values
+    <?php echo object_select_tag($article, 'getAuthorId', 'related_class=Foobar') ?>
+    // Builds the list from FoobarPeer::doSelect(new Criteria())
+
+    // Change the peer method used to retrieve the possible values
+    <?php echo object_select_tag($article, 'getAuthorId','peer_method=getMostFamousAuthors') ?>
+    // Builds the list from AuthorPeer::getMostFamousAuthors(new Criteria())
+
+    // Add an <option value="">&nbsp;</option> at the top of the list
+    <?php echo object_select_tag($article, 'getAuthorId', 'include_blank=true') ?>
+
+    // Add an <option value="">Choose an author</option> at the top of the list
+    <?php echo object_select_tag($article, 'getAuthorId',
+      'include_custom=Choose an author') ?>
+
+### Updating Objects
+
+A form completely dedicated to editing object properties by using object helpers is easier to handle in an action. For instance, if you have an object of class `Author` with `name`, `age`, and `address` attributes, the form can be coded as shown in Listing 10-15.
+
+Listing 10-15 - A Form with Only Object Helpers
+
+    [php]
+    <?php echo form_tag('author/update') ?>
+      <?php echo object_input_hidden_tag($author, 'getId') ?>
+      Name: <?php echo object_input_tag($author, 'getName') ?><br />
+      Age:  <?php echo object_input_tag($author, 'getAge') ?><br />
+      Address: <br />
+             <?php echo object_textarea_tag($author, 'getAddress') ?>
+    </form>
+
+The `update` action of the `author` module, called when the form is submitted, can simply update the object with the `fromArray()` modifier generated by Propel, as shown in Listing 10-16.
+
+Listing 10-16 - Handling a Form Submission Based on Object Form Helpers
+
+    [php]
+    public function executeUpdate ()
+    {
+      $author = AuthorPeer::retrieveByPk($this->getRequestParameter('id'));
+      $this->forward404Unless($author);
+
+      $author->fromArray($this->getRequest()->getParameterHolder()->getAll(),AuthorPeer::TYPE_FIELDNAME);
+      $author->save();
+
+      return $this->redirect('/author/show?id='.$author->getId());
+    }
+
+Form Validation
+---------------
+
+Chapter 6 explained how to use the `validateXXX()` methods in the action class to validate the request parameters. However, if you use this technique to validate a form submission, you will end up rewriting the same portion of code over and over. Symfony provides an alternative form-validation technique, relying on only a YAML file, instead of PHP code in the action class.
+
+To demonstrate the form-validation features, let's first consider the sample form shown in Listing 10-17. It is a classic contact form, with `name`, `email`, `age`, and `message` fields.
+
+Listing 10-17 - Sample Contact Form, in `modules/contact/templates/indexSuccess.php`
+
+    [php]
+    <?php echo form_tag('contact/send') ?>
+      Name:    <?php echo input_tag('name') ?><br />
+      Email:   <?php echo input_tag('email') ?><br />
+      Age:     <?php echo input_tag('age') ?><br />
+      Message: <?php echo textarea_tag('message') ?><br />
+      <?php echo submit_tag() ?>
+    </form>
+
+The principle of form validation is that if a user enters invalid data and submits the form, the next page should show an error message. Let's define what valid data should be for the sample form, in plain English:
+
+  * The `name` field is required. It must be a text entry between 2 and 100 characters.
+  * The `email` field is required. It must be a text entry between 2 and 100 characters, and it must be a valid e-mail address.
+  * The `age` field is required. It must be an integer between 0 and 120.
+  * The `message` field is required.
+
+You could define more complex validation rules for the contact form, but these are just fine for a demonstration of the validation possibilities.
+
+>**NOTE**
+>Form validation can occur on the server side and/or on the client side. The server-side validation is compulsory to avoid corrupting a database with wrong data. The client-side validation is optional, though it greatly enhances the user experience. The client-side validation is to be done with custom JavaScript.
+
+### Validators
+
+You can see that the `name` and `email` fields in the example share common validation rules. Some validation rules appear so often in web forms that symfony packages the PHP code that implements them into validators. A validator is simple class that provides an `execute()` method. This method expects the value of a field as parameter, and returns `true` if the value is valid and `false` otherwise.
+
+Symfony ships with several validators (described in the "Standard Symfony Validators" section later in this chapter), but let's focus on the `sfStringValidator` for now. This validator checks that an input is a string, and that its size is between two specified character amounts (defined when calling the `initialize()` method). That's exactly what is required to validate the `name` field. Listing 10-18 shows how to use this validator in a validation method.
+
+Listing 10-18 - Validating Request Parameters with Reusable Validators, in `modules/contact/action/actions.class.php`
+
+    [php]
+    public function validateSend()
+    {
+      $name = $this->getRequestParameter('name');
+
+      // The name field is required
+      if (!$name)
+      {
+        $this->getRequest()->setError('name', 'The name field cannot be left blank');
+
+        return false;
+      }
+
+      // The name field must be a text entry between 2 and 100 characters
+      $myValidator = new sfStringValidator();
+      $myValidator->initialize($this->getContext(), array(
+        'min'       => 2,
+        'min_error' => 'This name is too short (2 characters minimum)',
+        'max'       => 100,
+        'max_error' => 'This name is too long. (100 characters maximum)',
+      ));
+      if (!$myValidator->execute($name))
+      {
+        return false;
+      }
+
+      return true;
+    }
+
+If a user submits the form in Listing 10-17 with the value `a` in the `name` field, the `execute()` method of the `sfStringValidator` will return `false` (because the string length is less than the minimum of two characters). The `validateSend()` method will then fail, and the `handleErrorSend()` method will be called instead of the `executeSend()` method.
+
+>**TIP**
+>The `setError()` method of the `sfRequest` method gives information to the template so that it can display an error message (as explained in the "Displaying the Error Messages in the Form" section later in this chapter). The validators set the errors internally, so you can define different errors for the different cases of nonvalidation. That's the purpose of the `min_error` and `max_error` initialization parameters of the `sfStringValidator`.
+
+All the rules defined in the example can be translated into validators:
+
+  * `name`: `sfStringValidator` (`min=2`, `max=100`)
+  * `email`: `sfStringValidator` (`min=2`, `max=100`) and `sfEmailValidator`
+  * `age`: `sfNumberValidator` (`min=0`, `max=120`)
+
+The fact that a field is required is not handled by a validator.
+
+### Validation File
+
+You could easily implement the validation of the contact form with validators in the `validateSend()` method PHP, but that would imply repeating a lot of code. Symfony offers an alternative way to define validation rules for a form, and it involves YAML. For instance, Listing 10-19 shows the translation of the name field validation rules, and its results are equivalent to those of Listing 10-18.
+
+Listing 10-19 - Validation File, in `modules/contact/validate/send.yml`
+
+    fields:
+      name:
+        required:
+          msg:       The name field cannot be left blank
+        sfStringValidator:
+          min:       2
+          min_error: This name is too short (2 characters minimum)
+          max:       100
+          max_error: This name is too long. (100 characters maximum)
+
+In a validation file, the `fields` header lists the fields that need to be validated, if they are required, and the validators that should be tested on them when a value is present. The parameters of each validator are the same as those you would use to initialize the validator manually. A field can be validated by as many validators as necessary.
+
+>**NOTE**
+>The validation process doesn't stop when a validator fails. Symfony tests all the validators and declares the validation failed if at least one of them fails. And even if some of the rules of the validation file fail, symfony will still look for a `validateXXX()` method and execute it. So the two validation techniques are complementary. The advantage is that, in a form with multiple failures, all the error messages are shown.
+
+Validation files are located in the module `validate/` directory, and named by the action they must validate. For example, Listing 10-19 must be stored in a file called `validate/send.yml`.
+
+### Redisplaying the Form
+
+By default, symfony looks for a `handleErrorSend()` method in the action class whenever the validation process fails, or displays the `sendError.php` template if the method doesn't exist.
+
+The usual way to inform the user of a failed validation is to display the form again with an error message. To that purpose, you need to override the `handleErrorSend()` method and end it with a redirection to the action that displays the form (in the example, `module/index`), as shown in Listing 10-20.
+
+Listing 10-20 - Displaying the Form Again, in `modules/contact/actions/actions.class.php`
+
+    [php]
+    class ContactActions extends sfActions
+    {
+      public function executeIndex()
+      {
+        // Display the form
+      }
+
+      public function handleErrorSend()
+      {
+        $this->forward('contact', 'index');
+      }
+
+      public function executeSend()
+      {
+        // Handle the form submission
+      }
+    }
+
+If you choose to use the same action to display the form and handle the form submission, then the `handleErrorSend()` method can simply return `sfView::SUCCESS` to redisplay the form from `sendSuccess.php`, as shown in Listing 10-21.
+
+Listing 10-21 - A Single Action to Display and Handle the Form, in `modules/contact/actions/actions.class.php`
+
+    [php]
+    class ContactActions extends sfActions
+    {
+      public function executeSend()
+      {
+        if ($this->getRequest()->getMethod() != sfRequest::POST)
+        {
+          // Prepare data for the template
+
+          // Display the form
+          return sfView::SUCCESS;
+        }
+        else
+        {
+          // Handle the form submission
+          ...
+          $this->redirect('mymodule/anotheraction');
+        }
+      }
+      public function handleErrorSend()
+      {
+        // Prepare data for the template
+
+        // Display the form
+        return sfView::SUCCESS;
+      }
+    }
+
+The logic necessary to prepare the data can be refactored into a protected method of the action class, to avoid repeating it in the `executeSend()` and `handleErrorSend()` methods.
+
+With this new configuration, when the user types an invalid name, the form is displayed again, but the entered data is lost and no error message explains the reason of the failure. To address the last issue, you must modify the template that displays the form, to insert error messages close to the faulty field.
+
+### Displaying the Error Messages in the Form
+
+The error messages defined as validator parameters are added to the request when a field fails validation (just as you can add an error manually with the `setError()` method, as in Listing 10-18). The `sfRequest` object provides two useful methods to retrieve the error message: `hasError()` and `getError()`, which each expect a field name as parameter. In addition, you can display an alert at the top of the form to draw attention to the fact that one or many of the fields contain invalid data with the `hasErrors()` method. Listings 10-22 and 10-23 demonstrate how to use these methods.
+
+Listing 10-22 - Displaying Error Messages at the Top of the Form, in `templates/indexSuccess.php`
+
+    [php]
+    <?php if ($sf_request->hasErrors()): ?>
+      <p>The data you entered seems to be incorrect.
+      Please correct the following errors and resubmit:</p>
+      <ul>
+      <?php foreach($sf_request->getErrors() as $name => $error): ?>
+        <li><?php echo $name ?>: <?php echo $error ?></li>
+      <?php endforeach; ?>
+      </ul>
+    <?php endif; ?>
+
+Listing 10-23 - Displaying Error Messages Inside the Form, in `templates/indexSuccess.php`
+
+    [php]
+    <?php echo form_tag('contact/send') ?>
+      <?php if ($sf_request->hasError('name')): ?>
+        <?php echo $sf_request->getError('name') ?> <br />
+      <?php endif; ?>
+      Name:    <?php echo input_tag('name') ?><br />
+      ...
+      <?php echo submit_tag() ?>
+    </form>
+
+The conditional use of the `getError()` method in Listing 10-23 is a bit long to write. That's why symfony offers a `form_error()` helper to replace it, provided that you declare the use of its helper group, `Validation`. Listing 10-24 replaces Listing 10-23 by using this helper.
+
+Listing 10-24 - Displaying Error Messages Inside the Form, the Short Way
+
+    [php]
+    <?php use_helper('Validation') ?>
+    <?php echo form_tag('contact/send') ?>
+
+               <?php echo form_error('name') ?><br />
+      Name:    <?php echo input_tag('name') ?><br />
+      ...
+      <?php echo submit_tag() ?>
+    </form>
+
+The `form_error()` helper adds a special character before and after each error message to make the messages more visible. By default, the character is an arrow pointing down (corresponding to the `&darr;` entity), but you can change it in the `settings.yml` file:
+
+    all:
+      .settings:
+        validation_error_prefix:    ' &darr;&nbsp;'
+        validation_error_suffix:    ' &nbsp;&darr;'
+
+In case of failed validation, the form now displays errors correctly, but the data entered by the user is lost. You need to repopulate the form to make it really user-friendly.
+
+### Repopulating the Form
+
+As the error handling is done through the `forward()` method (shown in Listing 10-20), the original request is still accessible, and the data entered by the user is in the request parameters. So you could repopulate the form by adding default values to each field, as shown in Listing 10-25.
+
+Listing 10-25 - Setting Default Values to Repopulate the Form When Validation Fails, in `templates/indexSuccess.php`
+
+    [php]
+    <?php use_helper('Validation') ?>
+    <?php echo form_tag('contact/send') ?>
+               <?php echo form_error('name') ?><br />
+      Name:    <?php echo input_tag('name', $sf_params->get('name')) ?><br />
+               <?php echo form_error('email') ?><br />
+      Email:   <?php echo input_tag('email', $sf_params->get('email')) ?><br />
+               <?php echo form_error('age') ?><br />
+      Age:     <?php echo input_tag('age', $sf_params->get('age')) ?><br />
+               <?php echo form_error('message') ?><br />
+      Message: <?php echo textarea_tag('message', $sf_params->get('message')) ?><br />
+      <?php echo submit_tag() ?>
+    </form>
+
+But once again, this is quite tedious to write. Symfony provides an alternative way of triggering repopulation for all the fields of a form, directly in the YAML validation file, without changing the default values of the elements. Just enable the `fillin:` feature for the form, with the syntax described in Listing 10-26.
+
+Listing 10-26 - Activating `fillin` to Repopulate the Form When Validation Fails, in `validate/send.yml`
+
+    fillin:
+      enabled: true  # Enable the form repopulation
+      param:
+        name: test  # Form name, not needed if there is only one form in the page
+        skip_fields:   [email]  # Do not repopulate these fields
+        exclude_types: [hidden, password] # Do not repopulate these field types
+        check_types:   [text, checkbox, radio, password, hidden] # Do repopulate these
+
+By default, the automatic repopulation works for text inputs, check boxes, radio buttons, text areas, and select components (simple and multiple), but it does not repopulate password or hidden tags. The `fillin` feature doesn't work for file tags.
+
+>**NOTE**
+>The `fillin` feature works by parsing the response content in XML just before sending it to the user. If the response is not a valid XHTML document, `fillin` might not work.
+
+You might want to transform the values entered by the user before writing them back in a form input. Escaping, URL rewriting, transformation of special characters into entities, and all the other transformations that can be called through a function can be applied to the fields of your form if you define the transformation under the `converters:` key, as shown in Listing 10-27.
+
+Listing 10-27 - Converting Input Before `fillin`, in `validate/send.yml`
+
+    fillin:
+      enabled: true
+      param:
+        name: test
+        converters:         # Converters to apply
+          htmlentities:     [first_name, comments]
+          htmlspecialchars: [comments]
+
+### Standard Symfony Validators
+
+Symfony contains some standard validators that can be used for your forms:
+
+  * `sfStringValidator`
+  * `sfNumberValidator`
+  * `sfEmailValidator`
+  * `sfUrlValidator`
+  * `sfRegexValidator`
+  * `sfCompareValidator`
+  * `sfPropelUniqueValidator`
+  * `sfFileValidator`
+  * `sfCallbackValidator`
+
+Each has a default set of parameters and error messages, but you can easily override them through the `initialize()` validator method or in the YAML file. The following sections describe the validators and show usage examples.
+
+#### String Validator
+
+`sfStringValidator` allows you to apply string-related constraints to a parameter.
+
+    sfStringValidator:
+      values:       [foo, bar]
+      values_error: The only accepted values are foo and bar
+      insensitive:  false  # If true, comparison with values is case insensitive
+      min:          2
+      min_error:    Please enter at least 2 characters
+      max:          100
+      max_error:    Please enter less than 100 characters
+
+#### Number Validator
+
+`sfNumberValidator` verifies if a parameter is a number and allows you to apply size constraints.
+
+    sfNumberValidator:
+      nan_error:    Please enter an integer
+      min:          0
+      min_error:    The value must be more than zero
+      max:          100
+      max_error:    The value must be less than 100
+
+#### E-Mail Validator
+
+`sfEmailValidator` verifies if a parameter contains a value that qualifies as an e-mail address.
+
+    sfEmailValidator:
+      strict:       true
+      email_error:  This email address is invalid
+
+RFC822 defines the format of e-mail addresses. However, it is more permissive than the generally accepted format. For instance, `me en localhost` is a valid e-mail address according to the RFC, but you probably don't want to accept it. When the `strict` parameter is set to `true` (its default value), only e-mail addresses matching the pattern `name en domain.extension` are valid. When set to `false`, RFC822 is used as a rule.
+
+#### URL Validator
+
+`sfUrlValidator` checks if a field is a correct URL.
+
+    sfUrlValidator:
+      url_error:    This URL is invalid
+
+#### Regular Expression Validator
+
+`sfRegexValidator` allows you to match a value against a Perl-compatible regular expression pattern.
+
+    sfRegexValidator:
+      match:        No
+      match_error:  Posts containing more than one URL are considered as spam
+      pattern:      /http.*http/si
+
+The `match` parameter determines if the request parameter must match the pattern to be valid (value `Yes`) or match the pattern to be invalid (value `No`).
+
+#### Compare Validator
+
+`sfCompareValidator` checks the equality of two different request parameters. It is very useful for password checks.
+
+    fields:
+      password1:
+        required:
+          msg:      Please enter a password
+      password2:
+        required:
+          msg:      Please retype the password
+        sfCompareValidator:
+          check:    password1
+          compare_error: The two passwords do not match
+
+The `check` parameter contains the name of the field that the current field must match to be valid.
+
+#### Propel Unique Validator
+
+`sfPropelUniqueValidator` validates that the value of a request parameter doesn't already exist in your database. It is very useful for unique indexes.
+
+    fields:
+      nickname:
+        sfPropelUniqueValidator:
+          class:        User
+          column:       login
+          unique_error: This login already exists. Please choose another one.
+
+In this example, the validator will look in the database for a record of class `User` where the `login` column has the same value as the field to validate.
+
+#### File Validator
+
+`sfFileValidator` applies format (an array of mime-types) and size constraints to file upload fields.
+
+    fields:
+      image:
+        required:
+          msg:      Please upload an image file
+        file:       True
+        sfFileValidator:
+          mime_types:
+            - 'image/jpeg'
+            - 'image/png'
+            - 'image/x-png'
+            - 'image/pjpeg'
+          mime_types_error: Only PNG and JPEG images are allowed
+          max_size:         512000
+          max_size_error:   Max size is 512Kb
+
+Be aware that the `file` attribute must be set to `True` for the field, and the template must declare the form as multipart.
+
+#### Callback Validator
+
+`sfCallbackValidator` delegates the validation to a third-party callable method or function to do the validation. The callable method or function must return `true` or `false`.
+
+    fields:
+      account_number:
+        sfCallbackValidator:
+          callback:      is_integer
+          invalid_error: Please enter a number.
+      credit_card_number:
+        sfCallbackValidator:
+          callback:      [myTools, validateCreditCard]
+          invalid_error: Please enter a valid credit card number.
+
+The callback method or function receives the value to be validated as a first parameter. This is very useful when you want to reuse existing methods of functions, rather than create a full validator class.
+
+>**TIP**
+>You can also write your own validators, as described in the "Creating a Custom Validator" section later in this chapter.
+
+### Named Validators
+
+If you see that you need to repeat a validator class and its settings, you can package it under a named validator. In the example of the contact form, the email field needs the same sfStringValidator parameters as the `name` field. So you can create a `myStringValidator` named validator to avoid repeating the same settings twice. To do so, add a `myStringValidator` label under the `validators:` header, and set the `class` and `param` keys with the details of the named validator you want to package. You can then use the named validator just like a regular one in the `fields` section, as shown in Listing 10-28.
+
+Listing 10-28 - Reusing Named Validators in a Validation File, in `validate/send.yml`
+
+    validators:
+      myStringValidator:
+        class: sfStringValidator
+        param:
+          min:       2
+          min_error: This field is too short (2 characters minimum)
+          max:       100
+          max_error: This field is too long (100 characters maximum)
+
+    fields:
+      name:
+        required:
+          msg:       The name field cannot be left blank
+        myStringValidator:
+      email:
+        required:
+          msg:       The email field cannot be left blank
+        myStringValidator:
+        sfEmailValidator:
+          email_error:  This email address is invalid
+
+### Restricting the Validation to a Method
+
+By default, the validators set in a validation file are run when the action is called with the POST method. You can override this setting globally or field by field by specifying another value in the `methods` key, to allow a different validation for different methods, as shown in Listing 10-29.
+
+Listing 10-29 - Defining When to Test a Field, in `validate/send.yml`
+
+    methods:         [post]     # This is the default setting
+
+    fields:
+      name:
+        required:
+          msg:       The name field cannot be left blank
+        myStringValidator:
+      email:
+        methods:     [post, get] # Overrides the global methods settings
+        required:
+          msg:       The email field cannot be left blank
+        myStringValidator:
+        sfEmailValidator:
+          email_error:  This email address is invalid
+
+### What Does a Validation File Look Like?
+
+So far, you have seen only bits and pieces of a validation file. When you put everything together, the validation rules find a clear translation in YAML. Listing 10-30 shows the complete validation file for the sample contact form, corresponding to all the rules defined earlier in the chapter.
+
+Listing 10-30 - Sample Complete Validation File
+
+    fillin:
+      enabled:      true
+
+    validators:
+      myStringValidator:
+        class: sfStringValidator
+        param:
+          min:       2
+          min_error: This field is too short (2 characters minimum)
+          max:       100
+          max_error: This field is too long (100 characters maximum)
+
+    fields:
+      name:
+        required:
+          msg:       The name field cannot be left blank
+        myStringValidator:
+      email:
+        required:
+          msg:       The email field cannot be left blank
+        myStringValidator:
+        sfEmailValidator:
+          email_error:  This email address is invalid
+      age:
+        sfNumberValidator
+          nan_error:    Please enter an integer
+          min:          0
+          min_error:    "You're not even born. How do you want to send a message?"
+          max:          120
+          max_error:    "Hey, grandma, aren't you too old to surf on the Internet?"
+      message:
+        required:
+          msg:          The message field cannot be left blank
+
+Complex Validation
+------------------
+
+The validation file satisfies most needs, but when the validation is very complex, it might not be sufficient. In this case, you can still return to the `validateXXX()` method in the action, or find the solution to your problem in the following sections.
+
+### Creating a Custom Validator
+
+Each validator is a class that extends the `sfValidator` class. If the validator classes shipped with symfony are not suitable for your needs, you can easily create a new one, in any of the `lib/` directories where it can be autoloaded. The syntax is quite simple: The `execute()` method of the validator is called when the validator is executed. You can also define default settings in the `initialize()` method.
+
+The `execute()` method receives the value to validate as the first parameter and the error message to throw as the second parameter. Both are passed as references, so you can modify the error message from within the method.
+
+The `initialize()` method receives the context singleton and the array of parameters from the YAML file. It must first call the `initialize()` method of its parent `sfValidator` class, and then set the default values.
+
+Every validator has a parameter holder accessible by `$this->getParameterHolder()`.
+
+For instance, if you want to build an `sfSpamValidator` to check if a string is not spam, add the code shown in Listing 10-31 to an `sfSpamValidator.class.php` file. It checks if the `$value` contains more than `max_url` times the string `'http'`.
+
+Listing 10-31 - Creating a Custom Validator, in `lib/sfSpamValidator.class.php`
+
+    [php]
+    class sfSpamValidator extends sfValidator
+    {
+      public function execute (&$value, &$error)
+      {
+        // For max_url=2, the regexp is /http.*http/is
+        $re = '/'.implode('.*', array_fill(0, $this->getParameter('max_url') + 1, 'http')).'/is';
+
+        if (preg_match($re, $value))
+        {
+          $error = $this->getParameter('spam_error');
+
+          return false;
+        }
+
+        return true;
+      }
+
+      public function initialize ($context, $parameters = null)
+      {
+        // Initialize parent
+        parent::initialize($context);
+
+        // Set default parameters value
+        $this->setParameter('max_url', 2);
+        $this->setParameter('spam_error', 'This is spam');
+
+        // Set parameters
+        $this->getParameterHolder()->add($parameters);
+
+        return true;
+      }
+    }
+
+As soon as the validator is added to an autoloadable directory (and the cache cleared), you can use it in your validation files, as shown in Listing 10-32.
+
+Listing 10-32 - Using a Custom Validator, in `validate/send.yml`
+
+    fields:
+      message:
+        required:
+          msg:          The message field cannot be left blank
+        sfSpamValidator:
+          max_url:      3
+          spam_error:   Leave this site immediately, you filthy spammer!
+
+### Using Array Syntax for Form Fields
+
+PHP allows you to use an array syntax for the form fields. When writing your own forms, or when using the ones generated by the Propel administration (see Chapter 14), you may end up with HTML code that looks like Listing 10-33.
+
+Listing 10-33 - Form with Array Syntax
+
+    [php]
+    <label for="story[title]">Title:</label>
+    <input type="text" name="story[title]" id="story[title]" value="default value"
+           size="45" />
+
+Using the input name as is (with brackets) in a validation file will throw a parsed-induced error. The solution here is to replace square brackets `[]` with curly brackets `{}` in the `fields` section, as shown in Listing 10-34, and symfony will take care of the conversion of the names sent to the validators afterwards.
+
+Listing 10-34 - Validation File for a Form with Array Syntax
+
+    fields:
+      story{title}:
+        required:     Yes
+
+### Executing a Validator on an Empty Field
+
+You may need to execute a validator on a field that is not required, on an empty value. For instance, this happens with a form where the user can (but may not) want to change his password, and in this case, a confirmation password must be entered. See the example in Listing 10-35.
+
+Listing 10-35 - Sample Validation File for a Form with Two Password Fields
+
+    fields:
+      password1:
+      password2:
+        sfCompareValidator:
+          check:         password1
+          compare_error: The two passwords do not match
+
+The validation process executes as follows:
+
+  * If `password1` `== null` and `password2 == null`:
+
+    * The `required` test passes.
+    * Validators are not run.
+    * The form is valid.
+
+  * If `password2 == null` while `password1` is not `null`:
+
+    * The `required` test passes.
+    * Validators are not run.
+    * The form is valid.
+
+You may want to execute your `password2` validator if `password1` is `not null`. Fortunately, the symfony validators handle this case, thanks to the `group` parameter. When a field is in a group, its validator will execute if it is not empty and if one of the fields of the same group is not empty.
+
+So, if you change the configuration to that shown in Listing 10-36, the validation process behaves correctly.
+
+Listing 10-36 - Sample Validation File for a Form with Two Password Fields and a Group
+
+    fields:c
+      password1:
+        group:           password_group
+      password2:
+        group:           password_group
+        sfCompareValidator:
+          check:         password1
+          compare_error: The two passwords do not match
+
+The validation process now executes as follows:
+
+  * If `password1 == null` and `password2 == null`:
+
+    * The `required` test passes.
+    * Validators are not run.
+    * The form is valid.
+
+  * If `password1 == null` and `password2 == 'foo'`:
+
+    * The `required` test passes.
+    * `password2` is `not null`, so its validator is executed, and it fails.
+    * An error message is thrown for `password2`.
+
+  * If `password1 == 'foo'` and `password2 == null`:
+
+    * The `required` test passes.
+    * `password1` is `not null`, so the validator for `password2`, which is in the same group, is executed, and it fails.
+    * An error message is thrown for `password2`.
+
+  * If `password1 == 'foo'` and `password2 == 'foo'`:
+
+    * The `required` test passes.
+    * `password2` is `not null`, so its validator is executed, and it passes.
+    * The form is valid.
+
+Summary
+-------
+
+Writing forms in symfony templates is facilitated by the standard form helpers and their smart options. When you design a form to edit the properties of an object, the object form helpers simplify the task a great deal. The validation files, validation helpers, and repopulation feature reduce the work necessary to build a robust and user-friendly server control on the value of a field. And even the most complex validation needs can be handled, either by writing a custom validator or by creating a `validateXXX()` method in the action class.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/11-Ajax-Integration.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/11-Ajax-Integration.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/11-Ajax-Integration.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,792 @@
+Chapter 11 - Ajax Integration
+=============================
+
+Interactions on the client side, complex visual effects, and asynchronous communication are common in Web 2.0 applications. All those require JavaScript, but coding it by hand is often cumbersome and time-consuming to debug. Fortunately, symfony automates many of the common uses of JavaScript in the templates with a complete set of helpers. Many of the client-side behaviors can even be coded without a single line of JavaScript. Developers only need to worry about the effect they want to achieve, and symfony will deal with complex syntax and compatibility issues.
+
+This chapter describes the tools provided by symfony to facilitate client-side scripting:
+
+  * Basic JavaScript helpers output standards-compliant `<script>` tags in symfony templates, to update a Document Object Model (DOM) element or trigger a script with a link.
+  * Prototype is a JavaScript library integrated in symfony, which speeds up client-side scripting development by adding new functions and methods to the JavaScript core.
+  * Ajax helpers allow the user to update some parts of a page by clicking a link, submitting a form, or modifying a form element.
+  * The many options of these helpers provide even greater flexibility and power, notably by the use of callback functions.
+  * Script.aculo.us is another JavaScript library, also integrated in symfony, which adds dynamic visual effects to enhance the interface and the user experience.
+  * JavaScript Object Notation (JSON) is a standard used to communicate between a server and a client script.
+  * Complex client-side interactions, combining all the aforementioned elements, are possible in symfony applications. Autocompletion, drag-and-drop, sortable lists, and editable text can all be implemented with a single line of PHP--a call to a symfony helper.
+
+Basic JavaScript Helpers
+------------------------
+
+JavaScript has long been considered as having little real use in professional web applications due to the lack of cross-browser compatibility. Today, the compatibility issues are (mostly) solved, and some robust libraries allow you to program complex interactions in JavaScript without the need for countless lines of code and lost hours of debugging. The most popular advance is called Ajax, which is discussed in the "Ajax Helpers" section later in this chapter.
+
+Paradoxically, you will see very little JavaScript code in this chapter. This is because symfony has an original approach to client-side scripting: It packages and abstracts JavaScript behaviors into helpers, so your templates end up showing no JavaScript code at all. For the developer, adding a behavior to an element in the page takes one line of PHP, but this helper call does output JavaScript code, and inspecting the generated responses will reveal all the encapsulated complexity. The helpers deal with browser consistency, complex limit cases, extensibility, and so on, so the amount of JavaScript code they contain can be quite important. Therefore, this chapter will teach you how not to use JavaScript to achieve effects that you use to build with JavaScript.
+
+All of the helpers described here are available in templates, provided that you declare the use of the `Javascript` helper group.
+
+    [php]
+    <?php use_helper('Javascript') ?>
+
+As you'll soon learn, some of these helpers output HTML code, and some of them output JavaScript code.
+
+### JavaScript in Templates
+
+In XHTML, JavaScript code blocks must be enclosed within CDATA declarations. But pages requiring multiple JavaScript code blocks can soon become tedious to write. That's why symfony provides a java`script_tag()` helper, which transforms a string into an XHTML-compliant `<script>` tag. Listing 11-1 demonstrates using this helper.
+
+Listing 11-1 - Inserting JavaScript with the `javascript_tag()` Helper
+
+    [php]
+    <?php echo javascript_tag("
+      function foobar()
+      {
+      ...
+      }
+    ") ?>
+     => <script type="text/javascript">
+        //<![CDATA[
+          function foobar()
+          {
+            ...
+          }
+        //]]>
+        </script>
+
+But the most common use of JavaScript, more than code blocks, is in a hyperlink that triggers a particular script. The `link_to_function()` helper does exactly that, as shown in Listing 11-2.
+
+Listing 11-2 - Triggering JavaScript by a Link with the `link_to_function()` Helper
+
+    [php]
+    <?php echo link_to_function('Click me!', "alert('foobar')") ?>
+     => <a href="#" onClick="alert('foobar'); return none;">Click me!</a>
+
+As with the `link_to()` helper, you can add options to the `<a>` tag in the third argument.
+
+>**NOTE**
+>Just as the `link_to()` helper has a `button_to()` brother, you can trigger JavaScript from a button (`<input type="button">`) by calling the `button_to_function()` helper. And if you prefer a clickable image, just call `link_to_function(image_tag('myimage'), "alert('foobar')")`.
+
+### Updating a DOM Element
+
+One common task in dynamic interfaces is the update of an element in the page. This is something that you usually write as shown in Listing 11-3.
+
+Listing 11-3 - Updating an Element in JavaScript
+
+    [php]
+    <div id="indicator">Data processing beginning</div>
+    <?php echo javascript_tag("
+      document.getElementById("indicator").innerHTML =
+        "<strong>Data processing complete</strong>";
+    ") ?>
+
+Symfony provides a helper that produces JavaScript, not HTML, for this purpose, and it's called `update_element_function()`. Listing 11-4 shows its use.
+
+Listing 11-4 - Updating an Element in JavaScript with the `update_element_function()` Helper
+
+    [php]
+    <div id="indicator">Data processing beginning</div>
+    <?php echo javascript_tag(
+      update_element_function('indicator', array(
+        'content'  => "<strong>Data processing complete</strong>",
+      ))
+    ) ?>
+
+You might be wondering why this helper is particularly useful, since it's at least as long as the actual JavaScript code. It's really a matter of readability. For instance, you might want to insert content before or after an element, remove an element instead of just updating it, or even do nothing according to a certain condition. In such cases, the JavaScript code becomes somewhat messier, but the `update_element_function()` keeps the template very readable, as you can see in Listing 11-5.
+
+Listing 11-5 - Options of the `update_element_function()` Helper
+
+    [php]
+    // Insert content just after the 'indicator' element
+    update_element_function('indicator', array(
+      'position' => 'after',
+      'content'  => "<strong>Data processing complete</strong>",
+    ));
+
+    // Remove the element before the 'indicator', and only if $condition is true
+    update_element_function('indicator', array(
+      'action'   => $condition ? 'remove' : 'empty',
+      'position' => 'before',
+    ))
+
+The helper makes your templates easier to understand than any JavaScript code, and you have a single syntax for similar behaviors. That's also why the helper name is so long: It makes the code self-sufficient, without the need of extra comments.
+
+### Graceful Degradation
+
+The `<noscript>` tag allows you to specify some HTML code that is displayed only by browsers that do not have JavaScript support. Symfony complements this with a helper that works the other way around: It qualifies some code so that only browsers that actually support JavaScript execute it. The `if_javascript()` and `end_if_javascript()` helpers facilitate the creation of applications that degrade gracefully, as demonstrated in Listing 11-6.
+
+Listing 11-6 - Using the `if_javascript()` Helper to Allow Graceful Degradation
+
+    [php]
+    <?php if_javascript(); ?>
+      <p>You have JavaScript enabled.</p>
+    <?php end_if_javascript(); ?>
+
+    <noscript>
+      <p>You don't have JavaScript enabled.</p>
+    </noscript>
+
+>**NOTE**
+>You don't need to include `echo` when calling the `if_javascript()` and `end_if_javascript()` helpers.
+
+Prototype
+---------
+
+Prototype is a great JavaScript library that extends the possibilities of the client scripting language, adds the missing functions you've always dreamed of, and offers new mechanisms to manipulate the DOM. The project website is [http://prototypejs.org/](http://prototypejs.org/).
+
+The Prototype files are bundled with the symfony framework and accessible in every new symfony project, in `web/sf/prototype/`. This means that you can use Prototype by adding the following code to your action:
+
+    [php]
+    $prototypeDir = sfConfig::get('sf_prototype_web_dir');
+    $this->getResponse()->addJavascript($prototypeDir.'/js/prototype');
+
+or by adding it in the `view.yml` file:
+
+    all:
+      javascripts: [%SF_PROTOTYPE_WEB_DIR%/js/prototype]
+
+>**NOTE**
+>Since the symfony Ajax helpers, described in the next section, rely on Prototype, the Prototype library is already included automatically as soon as you use one of them. It means that you won't need to manually add the Prototype JavaScript to your response if your template calls a `_remote` helper.
+
+Once the Prototype library is loaded, you can take advantage of all the new functions it adds to the JavaScript core. This book's purpose is not to describe them all, but you will easily find good documentation about Prototype on the Web, including at the following websites:
+
+  * Particletree: [http://particletree.com/features/quick-guide-to-prototype/](http://particletree.com/features/quick-guide-to-prototype/)
+  * Sergio Pereira: [http://www.sergiopereira.com/articles/prototype.js.html](http://www.sergiopereira.com/articles/prototype.js.html)
+  * Script.aculo.us: [http://wiki.script.aculo.us/scriptaculous/show/Prototype](http://wiki.script.aculo.us/scriptaculous/show/Prototype)
+
+One of the functions Prototype adds to JavaScript is the dollar function, `$()`. Basically, this function is a simple shortcut to `document.getElementById()`, but a little more powerful. See Listing 11-7 for an example of its use.
+
+Listing 11-7 - Using the `$()` Function to Get an Element by ID in JavaScript
+
+    [php]
+    node = $('elementID');
+
+    // Means the same as
+    node = document.getElementById('elementID');
+
+    // It can also retrieve more than one element at a time
+    // And in this case the result is an array of DOM elements
+    nodes = $('firstDiv', 'secondDiv');
+
+Prototype also provides a function that the JavaScript core really lacks, which returns an array of all the DOM elements that have the class passed as argument:
+
+    [php]
+    nodes = document.getElementByClassName('myclass');
+
+However, you will seldom use it, because Prototype provides an even more powerful function called double dollar, `$$()`. This function returns an array of DOM elements based on a CSS selector. So the previous call can also be written as follows:
+
+    [php]
+    nodes = $$('.myclass');
+
+Thanks to the power of CSS selectors, you can parse the DOM by class, ID, and parent-child and previous-next relationships even more easily than you would with an XPath expression. You can even access elements with a complex selector combining all these:
+
+    [php]
+    nodes = $$('body div#main ul li.last img > span.legend');
+
+One last example of the syntax enhancements provided by Prototype is the each array iterator. It provides the same concision as in PHP, added to the ability to define anonymous functions and closures in JavaScript. You will probably use it a lot if you code JavaScript by hand.
+
+    [php]
+    var vegetables = ['Carrots', 'Lettuce', 'Garlic'];
+    vegetables.each(function(food) { alert('I love ' + food); });
+
+Because programming in JavaScript with Prototype is much more fun than doing it by hand, and because it is also part of symfony, you should really spend a few minutes to read the related documentation.
+
+Ajax Helpers
+------------
+
+What if you wanted to update an element in the page, not with JavaScript as in Listing 11-5, but with a PHP script executed by the server? This would give you the opportunity to change part of the page according to a server response. The `remote_function()` helper does exactly that, as demonstrated in Listing 11-8.
+
+Listing 11-8 - Using the `remote_function()` Helper
+
+    [php]
+    <div id="myzone"></div>
+    <?php echo javascript_tag(
+      remote_function(array(
+        'update'  => 'myzone',
+        'url'     => 'mymodule/myaction',
+      ))
+    ) ?>
+
+>**NOTE**
+>The `url` parameter can contain either an internal URI (`module/action?key1=value1&...`) or a routing rule name, just as in a regular `url_for()`.
+
+When called, this script will update the element of id myzone with the response or the request of the `mymodule/myaction` action. This kind of interaction is called Ajax, and it's the heart of highly interactive web applications. Here is how Wikipedia ([http://en.wikipedia.org/wiki/AJAX](http://en.wikipedia.org/wiki/AJAX)) describes it:
+
+Ajax makes web pages feel more responsive by exchanging small amounts of data with the server behind the scenes, so that the entire web page does not have to be reloaded each time the user makes a change. This is meant to increase the web page's interactivity, speed, and usability.
+
+Ajax relies on `XMLHttpRequest`, a JavaScript object that behaves like a hidden frame, which you can update from a server request and reuse to manipulate the rest of your web page. This object is quite low level, and different browsers deal with it in different ways, so handling Ajax requests manually usually means writing long portions of code. Fortunately, Prototype encapsulates all the code necessary to deal with Ajax and provides a simpler Ajax object, and symfony relies on this object. This is why the Prototype library is automatically loaded once you use an Ajax helper in a template.
+
+>**CAUTION**
+>The Ajax helpers won't work if the URL of the remote action doesn't belong to the same domain as the current page. This restriction exists for security reasons, and relies on browsers limitations that cannot be bypassed.
+
+An Ajax interaction is made up of three parts: a caller (a link, a button, a form, a clock, or any control that the user manipulates to launch the action), a server action, and a zone in the page to display the response of the action. You can build more complex interactions if the remote action returns data to be processed by a javascript function on the client side. Symfony provides multiple helpers to insert Ajax interaction in your templates, all containing the word `remote` in their name. They also share a common syntax--an associative array with all the Ajax parameters in it. Be aware that the Ajax helpers output HTML code, not JavaScript.
+
+>**SIDEBAR**
+>How about Ajax actions?
+>
+>Actions called as remote functions are regular actions. They follow routing, can determine the view to render the response with their `return`, pass variables to the templates, and alter the model just like other actions.
+>
+>However, when called through Ajax, actions return `true` to the following call:
+>
+>     [php]
+>     $isAjax = $this->isXmlHttpRequest();
+>
+>Symfony knows that an action is in an Ajax context and can adapt the response processing accordingly. Therefore, by default, Ajax actions don't include the web debug toolbar in the development environment. Also, they skip the decoration process (their template is not included in a layout by default). If you want an Ajax view to be decorated, you need to specify explicitly `has_layout: true` for this view in the module `view.yml` file.
+>
+>One more thing: Because responsiveness is crucial in Ajax interactions, if the response is not too complex, it might be a good idea to avoid creating a view and instead return the response directly from the action. So you can use the `renderText()` method in the action to skip the template and boost Ajax requests.
+
+### Ajax Link
+
+Ajax links form a large share of the Ajax interactions available in Web 2.0 applications. The `link_to_remote()` helper outputs a link that calls, not surprisingly, a remote function. The syntax is very similar to that of `link_to()` (except that the second parameter is the associative array of Ajax options), as shown in Listing 11-9.
+
+Listing 11-9 - Ajax Link with the `link_to_remote()` Helper
+
+    [php]
+    <div id="feedback"></div>
+    <?php echo link_to_remote('Delete this post', array(
+        'update' => 'feedback',
+        'url'    => 'post/delete?id='.$post->getId(),
+    )) ?>
+
+In this example, clicking the `'Delete this post'` link will issue a call to the `post/delete` action in the background. The response returned by the server will appear in the element of `id` `feedback`. This process is illustrated in Figure 11-1.
+
+Figure 11-1 - Triggering a remote update with a hyperlink
+
+![Triggering a remote update with a hyperlink](/images/book/F1101.png "Triggering a remote update with a hyperlink")
+
+You can use an image instead of a string to bear the link, use a rule name instead of an internal module/action URL, and add options to the `<a>` tag in a third argument, as shown in Listing 11-10.
+
+Listing 11-10 - Options of the `link_to_remote()` Helper
+
+    [php]
+    <div id="emails"></div>
+    <?php echo link_to_remote(image_tag('refresh'), array(
+        'update' => 'emails',
+        'url'    => '@list_emails',
+    ), array(
+        'class'  => 'ajax_link',
+    )) ?>
+
+### Ajax-Driven Forms
+
+Web forms typically call another action, but this causes the whole page to be refreshed. The correspondence of the `link_to_function()` for a form would be that the form submission only updates an element in the page with the server response. This is what the `form_remote_tag()` helper does, and its syntax is demonstrated in Listing 11-11.
+
+Listing 11-11 - Ajax Form with the `form_remote_tag()` Helper
+
+    [php]
+    <div id="item_list"></div>
+    <?php echo form_remote_tag(array(
+        'update'   => 'item_list',
+        'url'      => 'item/add',
+    )) ?>
+      <label for="item">Item:</label>
+      <?php echo input_tag('item') ?>
+      <?php echo submit_tag('Add') ?>
+    </form>
+
+A `form_remote_tag()` opens a `<form>`, just like the regular `form_tag()` helper. Submitting this form will issue a POST request to the `item/add` action in the background, with the `item` field as a request parameter. The response will replace the contents of the `item_list` element, as illustrated in Figure 11-2. Close an Ajax form with a regular `</form>` closing tag.
+
+Figure 11-2 - Triggering a remote update with a form
+
+![Triggering a remote update with a form](/images/book/F1102.png "Triggering a remote update with a form")
+
+>**CAUTION**
+>Ajax forms can't be multipart. This is a limitation of the `XMLHttpRequest` object. This means you can't handle file uploads via an Ajax form. There are workarounds though--for instance, using a hidden `iframe` instead of an `XMLHttpRequest` (see an implementation at [http://www.air4web.com/files/upload/](http://www.air4web.com/files/upload/)).
+
+If you want to allow a form to work in both page mode and Ajax mode, the best solution is to define it like a regular form, but to provide, in addition to the normal submit button, a second button (`<input type="button" />`) to submit the form in Ajax. Symfony calls this button `submit_to_remote()`. This will help you build Ajax interactions that degrade gracefully. See an example in Listing 11-12.
+
+Listing 11-12 - A Form with Regular and Ajax Submission
+
+    [php]
+    <div id="item_list"></div>
+    <?php echo form_tag('@item_add_regular') ?>
+      <label for="item">Item:</label>
+      <?php echo input_tag('item') ?>
+      <?php if_javascript(); ?>
+        <?php echo submit_to_remote('ajax_submit', 'Add in Ajax', array(
+            'update'   => 'item_list',
+            'url'      => '@item_add',
+        )) ?>
+      <?php end_if_javascript(); ?>
+      <noscript>
+        <?php echo submit_tag('Add') ?>
+      </noscript>
+    </form>
+
+Another example of combined use of remote and regular submit tags is a form that edits an article. It can offer a preview button in Ajax and a publish button that does a regular submission.
+
+>**NOTE**
+>When the user presses the Enter key, the form is submitted using the action defined in the main `<form>` tag--in this example, a regular action.
+
+Modern forms can also react not only when submitted, but also when the value of a field is being updated by a user. In symfony, you use the `observe_field()` helper for that. Listing 11-13 shows an example of using this helper to build a suggestion feature: Each character typed in an `item` field triggers an Ajax call refreshing the `item_suggestion` element in the page.
+
+Listing 11-13 - Calling a Remote Function When a Field Value Changes with `observe_field()`
+
+    [php]
+    <?php echo form_tag('@item_add_regular') ?>
+      <label for="item">Item:</label>
+      <?php echo input_tag('item') ?>
+      <div id="item_suggestion"></div>
+      <?php echo observe_field('item', array(
+          'update'   => 'item_suggestion',
+          'url'      => '@item_being_typed',
+      )) ?>
+      <?php echo submit_tag('Add') ?>
+    </form>
+
+The module/action written in the `@item_being_typed` rule will be called each time the user changes the value of the observed field (`item`), even without submitting the form. The action will be able to get the current `item` value from the `value` request parameter. If you want to pass something other than the value of the observed field, you can specify it as a JavaScript expression in the `with` parameter. For instance, if you want the action to get a `param` parameter, write the `observe_field()` helper as shown in Listing 11-14.
+
+Listing 11-14 - Passing Your Own Parameters to the Remote Action with the `with` Option
+
+    [php]
+    <?php echo observe_field('item', array(
+        'update'   => 'item_suggestion',
+        'url'      => '@item_being_typed',
+        'with'     => "'param=' + value",
+    )) ?>
+
+Note that this helper doesn't output an HTML element, but instead outputs a behavior for the element passed as a parameter. You will see more examples of JavaScript helpers assigning behaviors later in this chapter.
+
+If you want to observe all the fields of a form, you should use the `observe_form()` helper, which calls a remote function each time one of the form fields is modified.
+
+### Periodically Calling Remote Functions
+
+Last but not least, the `periodically_call_remote()` helper is an Ajax interaction triggered every few seconds. It is not attached to an HTML control, but runs transparently in the background, as a behavior of the whole page. This can be of great use to track the position of the mouse, autosave the content of a large text area, and so on. Listing 11-15 shows an example of using this helper.
+
+Listing 11-15 - Periodically Calling a Remote Function with `periodically_call_remote()`
+
+    [php]
+    <div id="notification"></div>
+    <?php echo periodically_call_remote(array(
+        'frequency' => 60,
+        'update'    => 'notification',
+        'url'       => '@watch',
+        'with'      => "'param=' + $('mycontent').value",
+    )) ?>
+
+If you don't specify the number of seconds (`frequency`) to wait between two calls to the remote function, the default value of 10 seconds is used. Note that the `with` parameter is evaluated in JavaScript, so you can use Prototype functions in it, such as the dollar function, `$()`.
+
+Remote Call Parameters
+----------------------
+
+All the Ajax helpers described in the previous sections can take other parameters, in addition to the `update` and `url` parameters. The associative array of Ajax parameters can alter and tweak the behavior of the remote calls and the processing of their response.
+
+### Updating Distinct Elements According to the Response Status
+
+If the remote action fails, the remote helpers can choose to update another element than the one updated by a successful response. To that purpose, just split the value of the `update` parameter into an associative array, and set different values for the element to update in cases of `success` and `failure`. This is of great use if, for instance, there are many Ajax interactions in a page and one error feedback zone. Listing 11-16 demonstrates handling a conditional update.
+
+Listing 11-16 - Handling a Conditional Update
+
+    [php]
+    <div id="error"></div>
+    <div id="feedback"></div>
+    <p>Hello, World!</p>
+    <?php echo link_to_remote('Delete this post', array(
+        'update'   => array('success' => 'feedback', 'failure' => 'error')
+        'url'      => 'post/delete?id='.$post->getId(),
+    )) ?>
+
+>**TIP**
+>Only HTTP error codes (500, 404, and all codes not in the 2XX range) will trigger the failure update, not the actions returning `sfView::ERROR`. So if you want to make an action return an Ajax failure, it must call `$this->getResponse()->setStatusCode(404)` or similar.
+
+### Updating an Element According to Position
+
+Just as with the `update_element_function()` helper, you can specify the element to update as relative to a specific element by adding a `position` parameter. Listing 11-17 shows an example.
+
+Listing 11-17 - Using the Position Parameter to Change the Response Location
+
+    [php]
+    <div id="feedback"></div>
+    <p>Hello, World!</p>
+    <?php echo link_to_remote('Delete this post', array(
+        'update'   => 'feedback',
+        'url'      => 'post/delete?id='.$post->getId(),
+        'position' => 'after',
+    )) ?>
+
+This will insert the response of the Ajax call after the `feedback` element; that is, between the `<div>` and the `<p>`. With this method, you can do several Ajax calls and see the responses accumulate after the `update` element.
+
+The `position` parameter can take the following values:
+
+  * `before`: Before the element
+  * `after`: After the element
+  * `top`: At the top of the content of the element
+  * `bottom`: At the bottom of the content of the element
+
+### Updating an Element According to a Condition
+
+A remote call can take an additional parameter to allow confirmation by the user before actually submitting the `XMLHttpRequest`, as shown in Listing 11-18.
+
+Listing 11-18 - Using the Confirm Parameter to Ask for a Confirmation Before Calling the Remote Function
+
+    [php]
+    <div id="feedback"></div>
+    <?php echo link_to_remote('Delete this post', array(
+        'update'   => 'feedback',
+        'url'      => 'post/delete?id='.$post->getId(),
+        'confirm'  => 'Are you sure?',
+    )) ?>
+
+A JavaScript dialog box showing "Are you sure?" will pop up when the user clicks the link, and the `post/delete` action will be called only if the user confirms his choice by clicking OK.
+
+The remote call can also be conditioned by a test performed on the browser side (in JavaScript), if you provide a `condition` parameter, as shown in Listing 11-19.
+
+Listing 11-19 - Conditionally Calling the Remote Function According to a Test on the Client Side
+
+    [php]
+    <div id="feedback"></div>
+    <?php echo link_to_remote('Delete this post', array(
+        'update'    => 'feedback',
+        'url'       => 'post/delete?id='.$post->getId(),
+        'condition' => "$('elementID') == true",
+    )) ?>
+
+### Determining the Ajax Request Method
+
+By default, Ajax requests are made with the POST method. If you want to make an Ajax call that doesn't modify data, or if you want to display a form that has built-in validation as the result of an Ajax call, you might need to change the Ajax request method to GET. The `method` option alters the Ajax request method, as shown in Listing 11-20.
+
+Listing 11-20 - Changing the Ajax Request Method
+
+    [php]
+    <div id="feedback"></div>
+    <?php echo link_to_remote('Delete this post', array(
+        'update'    => 'feedback',
+        'url'       => 'post/delete?id='.$post->getId(),
+        'method'    => 'get',
+    )) ?>
+
+### Authorizing Script Execution
+
+If the response code of the Ajax call (the code sent by the server, inserted in the `update` element) contains JavaScript, you might be surprised to see that these scripts are not executed by default. This is to reduce remote attack risks and to allow script execution only when the developer knows for sure what code is in the response.
+
+That's why you need to declare explicitly the ability to execute scripts in remote responses, with the `script` option. Listing 11-21 gives an example of an Ajax call declaring that JavaScript from the remote response can be executed.
+
+Listing 11-21 - Authorizing Script Execution in the Ajax Response
+
+    [php]
+    <div id="feedback"></div>
+    // If the response of the post/delete action contains JavaScript,
+    // allow it to be executed by the browser
+    <?php echo link_to_remote('Delete this post', array(
+        'update' => 'feedback',
+        'url'    => 'post/delete?id='.$post->getId(),
+        'script' => true,
+    )) ?>
+
+If the remote template contains Ajax helpers (such as `remote_function()`), be aware that these PHP functions generate JavaScript code, and they won't execute unless you add the `'script' => true` option.
+
+>**NOTE**
+>Even if you enable script execution for the remote response, you won't actually see the scripts in the remote code, if you use a tool to check the generated code. The scripts will execute but will not appear in the code. Although peculiar, this behavior is perfectly normal.
+
+### Creating Callbacks
+
+One important drawback of Ajax interactions is that they are invisible to the user until the zone to update is actually updated. This means that in cases of a slow network or server failure, users may believe that their action was taken into account, when it actually was not processed. This is why it is important to notify the user of the events of an Ajax interaction.
+
+By default, each remote request is an asynchronous process during which various JavaScript callbacks can be triggered (for progress indicators and the like). All callbacks have access to the `request` object, which holds the underlying `XMLHttpRequest`. The callbacks correspond to the events of any Ajax interaction:
+
+  * `before`: Before request is initiated
+  * `after`: Immediately after request is initiated and before loading
+  * `loading`: When the remote response is being loaded by the browser
+  * `loaded`: When the browser has finished loading the remote response
+  * `interactive`: When the user can interact with the remote response, even though it has not finished loading
+  * `success`: When the `XMLHttpRequest` is completed, and the HTTP status code is in the 2XX range
+  * `failure`: When the `XMLHttpRequest` is completed, and the HTTP status code is not in the 2XX range
+  * `404`: When the request returns a 404 status
+  * `complete`: When the `XMLHttpRequest` is complete (fires after `success` or `failure`, if they are present)
+
+For instance, it is very common to show a loading indicator when a remote call is initiated, and to hide it once the response is received. To achieve that, simply add `loading` and `complete` parameters to the Ajax call, as shown in Listing 11-22.
+
+Listing 11-22 - Using Ajax Callbacks to Show and Hide an Activity Indicator
+
+    [php]
+    <div id="feedback"></div>
+    <div id="indicator">Loading...</div>
+    <?php echo link_to_remote('Delete this post', array(
+        'update'   => 'feedback',
+        'url'      => 'post/delete?id='.$post->getId(),
+        'loading'  => "Element.show('indicator')",
+        'complete' => "Element.hide('indicator')",
+    )) ?>
+
+The show and hide methods, as well as the JavaScript Element object, are other useful additions of Prototype.
+
+Creating Visual Effects
+-----------------------
+
+Symfony integrates the visual effects of the script.aculo.us library, to allow you to do more than show and hide `<div>` elements in your web pages. You will find good documentation on the effects syntax in the wiki at [http://script.aculo.us/](http://script.aculo.us/). Basically, the library provides JavaScript objects and functions that manipulate the DOM in order to achieve complex visual effects. See a few examples in Listing 11-23. Since the result is a visual animation of certain areas in a web page, it is recommended that you test the effects yourself to understand what they really do. The script.aculo.us website offers a gallery where you can get an idea of the dynamic effects.
+
+Listing 11-23 - Visual Effects in JavaScript with Script.aculo.us
+
+    [php]
+    // Highlights the element 'my_field'
+    Effect.Highlight('my_field', { startcolor:'#ff99ff', endcolor:'#999999' })
+
+    // Blinds down an element
+    Effect.BlindDown('id_of_element');
+
+    // Fades away an element
+    Effect.Fade('id_of_element', { transition: Effect.Transitions.wobble })
+
+Symfony encapsulates the JavaScript `Effect` object in a helper called `visual_effect()`, still part of the `Javascript` helper group. It outputs JavaScript that can be used in a regular link, as shown in Listing 11-24.
+
+Listing 11-24 - Visual Effects in Templates with the `visual_effect()` Helper
+
+    [php]
+    <div id="secret_div" style="display:none">I was here all along!</div>
+    <?php echo link_to_function(
+      'Show the secret div',
+      visual_effect('appear', 'secret_div')
+    ) ?>
+    // Will make a call to Effect.Appear('secret_div')
+
+The `visual_effects()` helper can also be used in the Ajax callbacks, as shown in Listing 11-25, which displays an activity indicator like Listing 11-22, but is visually more satisfactory. The `indicator` element appears progressively when the Ajax call starts, and it fades progressively when the response arrives. In addition, the feedback element is highlighted after being updated by the remote call, to draw the user's attention to this part of the window.
+
+Listing 11-25 - Visual Effects in Ajax Callbacks
+
+    [php]
+    <div id="feedback"></div>
+    <div id="indicator" style="display: none">Loading...</div>
+    <?php echo link_to_remote('Delete this post', array(
+        'update'   => 'feedback',
+        'url'      => 'post/delete?id='.$post->getId(),
+        'loading'  => visual_effect('appear', 'indicator'),
+        'complete' => visual_effect('fade', 'indicator').
+                      visual_effect('highlight', 'feedback'),
+    )) ?>
+
+Notice how you can combine visual effects by concatenating them in a callback.
+
+JSON
+----
+
+JavaScript Object Notation (JSON) is a lightweight data-interchange format. Basically, it is nothing more than a JavaScript hash (see an example in Listing 11-26) used to carry object information. But JSON has two great benefits for Ajax interactions: It is easy to read in JavaScript, and it can reduce the size of a web response.
+
+Listing 11-26 - A Sample JSON Object in JavaScript
+
+    var myJsonData = {"menu": {
+      "id": "file",
+      "value": "File",
+      "popup": {
+        "menuitem": [
+          {"value": "New", "onclick": "CreateNewDoc()"},
+          {"value": "Open", "onclick": "OpenDoc()"},
+          {"value": "Close", "onclick": "CloseDoc()"}
+        ]
+      }
+    }}
+
+If an Ajax action needs to return structured data to the caller page for further JavaScript processing, JSON is a good format for the response. This is very useful if, for instance, one Ajax call is to update several elements in the caller page.
+
+For instance, imagine a caller page that looks like Listing 11-27. It has two elements that may need to be updated. One remote helper could update only one of the elements of the page (either the `title` or the `name`), but not both.
+
+Listing 11-27 - Sample Template for Multiple Ajax Updates
+
+    [php]
+    <h1 id="title">Basic letter</h1>
+    <p>Dear <span id="name">name_here</span>,</p>
+    <p>Your e-mail was received and will be answered shortly.</p>
+    <p>Sincerely,</p>
+
+To update both, imagine that the Ajax response can be a JSON header containing the following array:
+
+     [["title", "My basic letter"], ["name", "Mr Brown"]]
+
+Then the remote call can easily interpret this response and update several fields in a row, with a little help from JavaScript. The code in Listing 11-28 shows what could be added to the template of Listing 11-27 to achieve this effect.
+
+Listing 11-28 - Updating More Than One Element from a Remote Response
+
+    [php]
+    <?php echo link_to_remote('Refresh the letter', array(
+      'url'      => 'publishing/refresh',
+      'complete' => 'updateJSON(request, json)'
+    )) ?>
+
+    <?php echo javascript_tag("
+    function updateJSON(request, json)
+    {
+      var nbElementsInResponse = json.length;
+      for (var i = 0; i < nbElementsInResponse; i++)
+      {
+         Element.update(json[i][0], json[i][1]);
+      }
+    }
+    ") ?>
+
+The `complete` callback has access to the `json` header of the response and can pass it to a third-party function. This custom `updateJSON()` function iterates over the JSON header and for each member of the array, updates the element named by the first parameter with the content of the second parameter.
+
+Listing 11-29 shows how the `publishing/refresh` action can return a JSON response.
+
+Listing 11-29 - Sample Action Returning a JSON Header
+
+    [php]
+    class publishingActions extends sfActions
+    {
+      public function executeRefresh()
+      {
+        $output = '[["title", "My basic letter"], ["name", "Mr Brown"]]';
+        $this->getResponse()->setHttpHeader("X-JSON", '('.$output.')');
+
+        return sfView::HEADER_ONLY;
+      }
+
+The HTTP protocol allows JSON to be stored in a response header. As the response doesn't have any content, the action sends it immediately as a header only. This bypasses the view layer entirely and is as fast as a `->renderText()`, but with an even smaller response.
+
+>**CAUTION**
+>There is a severe limitation to the approach shown in Listing 11-29: the maximum size of HTTP headers. There is no official limitation, but large headers may not be well transferred or interpreted by a browser. This means that if your JSON array is large, the remote action should return a normal response, with the JSON as a JavaScript array.
+
+JSON has become a standard among web applications. Web services often propose responses in JSON rather than XML to allow service integration in the client (mashup), rather than on the server. So if you wonder which format to use for communication between your server and a JavaScript function, JSON is probably your best bet.
+
+>**TIP**
+>Since version 5.2, PHP offers two functions, `json_encode()` and `json_decode()`, that allow you to convert an array between the PHP syntax and the JSON syntax, and vice versa ([http://www.php.net/manual/en/ref.json.php](http://www.php.net/manual/en/ref.json.php)). These facilitate the integration of JSON arrays and Ajax in general.
+
+Performing Complex Interactions with Ajax
+-----------------------------------------
+
+Among the symfony Ajax helpers, you will also find some tools that build up complex interactions with a single call. They allow you to enhance the user experience by desktop-application-like interactions (drag-and-drop, autocompletion, and live editing) without the need for complex JavaScript. The following sections describe the helpers for complex interactions and show simple examples. Additional parameters and tweaks are described in the script.aculo.us documentation.
+
+>**CAUTION**
+>If complex interactions are possible, they need extra time for presentation tweaking to make them feel natural. Use them only when you are sure that they enhance the user experience. Avoid them when there is a risk that they will disorient users.
+
+### Autocompletion
+
+A text-input component that shows a list of words matching the user's entry while the user types is called an autocompletion. With a single helper called `input_auto_complete_tag()`, you can achieve this effect, provided that the remote action returns a response formatted as an HTML item list similar to the example shown in Listing 11-30.
+
+Listing 11-30 - Example of a Response Compatible with the Autocomplete Tag
+
+    <ul>
+      <li>suggestion1</li>
+      <li>suggestion2</li>
+      ...
+    </ul>
+
+Insert the helper in a template as you would do with a regular text input, following the example shown in Listing 11-31.
+
+Listing 11-31 - Using the Autocomplete Tag Helper in a Template
+
+    [php]
+    <?php echo form_tag('mymodule/myaction') ?>
+      Find an author by name:
+      <?php echo input_auto_complete_tag('author', 'default name',
+        'author/autocomplete',
+        array('autocomplete' => 'off'),
+        array('use_style'    => true)
+      ) ?>
+      <?php echo submit_tag('Find') ?>
+    </form>
+
+This will call the `author/autocomplete` action each time the user types a character in the `author` field. It's up to you to design the action so that it determines a list of possible matches according to the author request parameter and returns them in a format similar to Listing 11-30. The helper will then display the list under the `author` tag, and clicking one of the suggestions or selecting it with the keyboard will complete the input, as shown in Figure 11-3.
+
+Figure 11-3 - An autocompletion example
+
+![An autocompletion example](/images/book/F1103.png "An autocompletion example")
+
+The third argument of the `input_auto_complete_tag()` helper can take the following parameters:
+
+  * `use_style`: Styles the response list automatically.
+  * `frequency`: Frequency of the periodical call (defaults to 0.4s).
+  * tokens: To allow tokenized incremental autocompletion. For instance, if you set this parameter to `,` and if the user entered `jane, george`, the action would receive only the value `'george'`.
+
+>**NOTE**
+>The `input_auto_complete_tag()` helper, like the following ones, also accepts the usual remote helper options described earlier in this chapter. In particular, it is a good habit to set `loading` and `complete` visual effects for a better user experience.
+
+### Drag-and-Drop
+
+The ability to grab an element with the mouse, move it, and release it somewhere else is familiar in desktop applications but rarer in web browsers. This is because coding such behavior in plain JavaScript is very complicated. Fortunately, it requires only one line in symfony.
+
+The framework provides two helpers, `draggable_element()` and `drop_receiving_element()`, that can be seen as behavior modifiers; they add observers and abilities to the element they address. Use them to declare an element as draggable or as a receiving element for draggable elements. A draggable element can be grabbed by clicking it with the mouse. Until the mouse button is released, the element can be moved, or dragged, across the window. A receiving element calls a remote function when a draggable element is released on it. Listing 11-32 demonstrates this type of interaction with a shopping cart receiving element.
+
+Listing 11-32 - Draggable Elements and Drop-Receiving Elements in a Shopping Cart
+
+    [php]
+    <ul id="items">
+      <li id="item_1" class="food">Carrot</li>
+      <?php echo draggable_element('item_1', array('revert' => true)) ?>
+      <li id="item_2" class="food">Apple</li>
+      <?php echo draggable_element('item_2', array('revert' => true)) ?>
+      <li id="item_3" class="food">Orange</li>
+      <?php echo draggable_element('item_3', array('revert' => true)) ?>
+    </li>
+    <div id="cart">
+      <p>Your cart is empty</p>
+      <p>Drag items here to add them to your cart</p>
+    </div>
+    <?php echo drop_receiving_element('cart', array(
+      'url'        => 'cart/add',
+      'accept'     => 'food',
+      'update'     => 'cart',
+    )) ?>
+
+Each of the items of the unordered list can be grabbed by the mouse and dragged across the window. When released, they return to their original position. When released over the `cart` element, it triggers a remote call to the cart/add action. The action will be able to determine which item was dropped in the `cart` element by looking at the `id` request parameter. So Listing 11-32 simulates a real shopping session: You grab items and release them in the cart, and then proceed to checkout.
+
+>**TIP**
+>In Listing 11-32, the helpers are written just after the element they modify, but that is not a requirement. You could very well group all the `draggable_element()` and `drop_receiving_element()` helpers at the end of the template. The important thing is the first argument of the helper call, which specifies the identifier of the element to receive the behavior.
+
+The `draggable_element()` helper accepts the following parameters:
+
+  * `revert`: If set to `true`, the element will return to its original location when released. It can also be an arbitrary function reference, called when the drag ends.
+  * `ghosting`: Clones the element and drags the clone, leaving the original in place until the clone is dropped.
+  * `snap`: If set to `false`, no snapping occurs. Otherwise, the draggable can be dragged only to the intersections of a grid of interval x and y, and in this case, it takes the form `xy` or `[x,y]` or `function(x,y){ return [x,y] }`.
+
+The `drop_receiving_element()` helper accepts the following parameters:
+
+  * `accept`: A string or an array of strings describing CSS classes. The element will accept only draggable elements that have one or more of these CSS classes.
+  * `hoverclass`: CSS class added to the element when the user drags an accepted draggable element over it.
+
+### Sortable Lists
+
+Another possibility offered by draggable elements is the ability to sort a list by moving its items with the mouse. The `sortable_element()` helper adds the sortable behavior to an item, and Listing 11-33 is a good example of implementing this feature.
+
+Listing 11-33 - Sortable List Example
+
+    [php]
+    <p>What do you like most?</p>
+    <ul id="order">
+      <li id="item_1" class="sortable">Carrots</li>
+      <li id="item_2" class="sortable">Apples</li>
+      <li id="item_3" class="sortable">Oranges</li>
+      // Nobody likes Brussel sprouts anyway
+      <li id="item_4">Brussel sprouts</li>
+    </ul>
+    <div id="feedback"></div>
+    <?php echo sortable_element('order', array(
+      'url'    => 'item/sort',
+      'update' => 'feedback',
+      'only'   => 'sortable';
+    )) ?>
+
+By the magic of the `sortable_element()` helper, the `<ul>` element is made sortable, which means that its children can be reordered by drag-and-drop. Each time the user drags an item and releases it to reorder the list, an Ajax request is made with the following parameters:
+
+    POST /sf_sandbox/web/frontend_dev.php/item/sort HTTP/1.1
+      order[]=1&order[]=3&order[]=2&_=
+
+The full ordered list is passed as an array (with the format `order[$rank]=$id`, the `$order` starting at 0, and the `$id` based on what comes after the underscore (`_`) in the list element `id` property). The `id` property of the sortable element (`order` in the example) is used to name the array of parameters.
+
+The `sortable_element()` helper accepts the following parameters:
+
+  * `only`: A string or an array of strings describing CSS classes. Only the child elements of the sortable element with this class can be moved.
+  * `hoverclass`: CSS class added to the element when the mouse is hovered over it.
+  * `overlap`: Set it to `horizontal` if the items are displayed inline, and to `vertical` (the default value) when there is one item per line (as in the example).
+  * `tag`: If the list to order is not a set of `<li>` elements, you must define which child elements of the sortable element are to be made draggable (for instance, `div` or `dl`).
+
+### Edit in Place
+
+More and more web applications allow users to edit the contents of pages directly on the page, without the need to redisplay the content in a form. The principle of the interaction is simple. A block of text is highlighted when the user hovers the mouse over it. If the user clicks inside the block, the plain text is converted into a text area filled with the text of the block, and a save button appears. The user can edit the text inside the text area, and once he saves it, the text area disappears and the text is displayed in plain form. With symfony, you can add this editable behavior to an element with the `input_in_place_editor_tag()` helper. Listing 11-34 demonstrates using this helper.
+
+Listing 11-34 - Editable Text Example
+
+    [php]
+    <div id="edit_me">You can edit this text</div>
+    <?php echo input_in_place_editor_tag('edit_me', 'mymodule/myaction', array(
+      'cols'        => 40,
+      'rows'        => 10,
+    )) ?>
+
+When the user clicks the editable text, it is replaced by a text input area filled with the text, which can be edited. When the form is submitted, the `mymodule/myaction` action is called in Ajax with the edited value set as the `value` parameter. The result of the action updates the editable element. It is very fast to write and very powerful.
+
+The `input_in_place_editor_tag()` helper accepts the following parameters:
+
+  * cols and rows: The size of the text input area that appears for editing (it becomes a `<textarea>` if `rows` is more than 1).
+  * `loadTextURL`: The URI of an action that is called to display the text to edit. This is useful if the content of the editable element uses special formatting and if you want the user to edit the text without formatting.
+  * `save_text` and `cancel_text`: The text on the save link (defaults to "ok") and on the cancel link (defaults to "cancel").
+
+Summary
+-------
+
+If you are tired of writing JavaScript in your templates to get client-side behaviors, the JavaScript helpers offer a simple alternative. Not only do they automate the basic link behavior and element update, but they also provide a way to develop Ajax interactions in a snap. With the help of the powerful syntax enhancements provided by Prototype and the great visual effects provided by script.aculo.us, even complex interactions take no more than a few lines to write.
+
+And since making a highly interactive application is as easy as making static pages with symfony, you can consider that almost all desktop applications interactions are now available in web applications.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/12-Caching.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/12-Caching.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/12-Caching.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,607 @@
+Chapter 12 - Caching
+====================
+
+One of the ways to speed up an application is to store chunks of generated HTML code, or even full pages, for future requests. This technique is known as caching, and it can be managed on the server side and on the client side.
+
+Symfony offers a flexible server-caching system. It allows saving the full response, the result of an action, a partial, or a template fragment into a file, through a very intuitive setup based on YAML files. When the underlying data changes, you can easily clear selective parts of the cache with the command line or special action methods. Symfony also provides an easy way to control the client-side cache through HTTP 1.1 headers. This chapter deals with all these subjects, and gives you a few tips on monitoring the improvements that caching can bring to your applications.
+
+Caching the Response
+--------------------
+
+The principle of HTML caching is simple: Part or all of the HTML code that is sent to a user upon a request can be reused for a similar request. This HTML code is stored in a special place (the `cache/` folder in symfony), where the front controller will look for it before executing an action. If a cached version is found, it is sent without executing the action, thus greatly speeding up the process. If no cached version is found, the action is executed, and its result (the view) is stored in the cache folder for future requests.
+
+As all the pages may contain dynamic information, the HTML cache is disabled by default. It is up to the site administrator to enable it in order to improve performance.
+
+Symfony handles three different types of HTML caching:
+
+  * Cache of an action (with or without the layout)
+  * Cache of a partial, a component, or a component slot
+  * Cache of a template fragment
+
+The first two types are handled with YAML configuration files. Template fragment caching is managed by calls to helper functions in the template.
+
+### Global Cache Settings
+
+For each application of a project, the HTML cache mechanism can be enabled or disabled (the default), per environment, in the `cache` setting of the `settings.yml` file. Listing 12-1 demonstrates enabling the cache.
+
+Listing 12-1 - Activating the Cache, in `myapp/config/settings.yml`
+
+    dev:
+      .settings:
+        cache:                  on
+
+### Caching an Action
+
+Actions displaying static information (not depending on database or session-dependent data) or actions reading information from a database but without modifying it (typically, GET requests) are often ideal for caching. Figure 12-1 shows which elements of the page are cached in this case: either the action result (its template) or the action result together with the layout.
+
+Figure 12-1 - Caching an action
+
+![Caching an action](/images/book/F1201.png "Caching an action")
+
+For instance, consider a `user/list` action that returns the list of all users of a website. Unless a user is modified, added, or removed (and this matter will be discussed later in the "Removing Items from the Cache" section), this list always displays the same information, so it is a good candidate for caching.
+
+Cache activation and settings, action by action, are defined in a cache.yml file located in the module `config/` directory. See Listing 12-2 for an example.
+
+Listing 12-2 - Activating the Cache for an Action, in `myapp/modules/user/config/cache.yml`
+
+    list:
+      enabled:     on
+      with_layout: false   # Default value
+      lifetime:    86400   # Default value
+
+This configuration stipulates that the cache is on for the list action, and that the layout will not be cached with the action (which is the default behavior). It means that even if a cached version of the action exists, the layout (together with its partials and components) is still executed. If the `with_layout` setting is set to `true`, the layout is cached with the action and not executed again.
+
+To test the cache settings, call the action in the development environment from your browser.
+
+    http://myapp.example.com/myapp_dev.php/user/list
+
+You will notice a border around the action area in the page. The first time, the area has a blue header, showing that it did not come from the cache. Refresh the page, and the action area will have a yellow header, showing that it did come from the cache (with a notable boost in response time). You will learn more about the ways to test and monitor caching later in this chapter.
+
+>**NOTE**
+>Slots are part of the template, and caching an action will also store the value of the slots defined in this action's template. So the cache works natively for slots.
+
+The caching system also works for pages with arguments. The `user` module may have, for instance, a `show` action that expects an `id` argument to display the details of a user. Modify the `cache.yml` file to enable the cache for this action as well, as shown in Listing 12-3.
+
+In order to organize your `cache.yml`, you can regroup the settings for all the actions of a module under the `all:` key, also shown in Listing 12-3.
+
+Listing 12-3 - A Full `cache.yml` Example, in `myapp/modules/user/config/cache.yml`
+
+    list:
+      enabled:    on
+    show:
+      enabled:    on
+
+    all:
+      with_layout: false   # Default value
+      lifetime:    86400   # Default value
+
+Now, every call to the `user/show` action with a different `id` argument creates a new record in the cache. So the cache for this:
+
+    http://myapp.example.com/user/show/id/12
+
+will be different than the cache for this:
+
+    http://myapp.example.com/user/show/id/25
+
+>**CAUTION**
+>Actions called with a POST method or with GET parameters are not cached.
+
+The `with_layout` setting deserves a few more words. It actually determines what kind of data is stored in the cache. For the cache without layout, only the result of the template execution and the action variables are stored in the cache. For the cache with layout, the whole response object is stored. This means that the cache with layout is much faster than the cache without it.
+
+If you can functionally afford it (that is, if the layout doesn't rely on session-dependent data), you should opt for the cache with layout. Unfortunately, the layout often contains some dynamic elements (for instance, the name of the user who is connected), so action cache without layout is the most common configuration. However, RSS feeds, pop-ups, and pages that don't depend on cookies can be cached with their layout.
+
+### Caching a Partial, Component, or Component Slot
+
+Chapter 7 explained how to reuse code fragments across several templates, using the `include_partial()` helper. A partial is as easy to cache as an action, and its cache activation follows the same rules, as shown in Figure 12-2.
+
+Figure 12-2 - Caching a partial, component, or component slot
+
+![Caching a partial, component, or component slot](/images/book/F1202.png "Caching a partial, component, or component slot")
+
+For instance, Listing 12-4 shows how to edit the `cache.yml` file to enable the cache on a `_my_partial.php` partial located in the `user` module. Note that the `with_layout` setting doesn't make sense in this case.
+
+Listing 12-4 - Caching a Partial, in `myapp/modules/user/config/cache.yml`
+
+    _my_partial:
+      enabled:    on
+    list:
+      enabled:    on
+    ...
+
+Now all the templates using this partial won't actually execute the PHP code of the partial, but will use the cached version instead.
+
+    [php]
+    <?php include_partial('user/my_partial') ?>
+
+Just as for actions, partial caching is also relevant when the result of the partial depends on parameters. The cache system will store as many versions of a template as there are different values of parameters.
+
+    [php]
+    <?php include_partial('user/my_other_partial', array('foo' => 'bar')) ?>
+
+>**TIP**
+>The action cache is more powerful than the partial cache, since when an action is cached, the template is not even executed; if the template contains calls to partials, these calls are not performed. Therefore, partial caching is useful only if you don't use action caching in the calling action or for partials included in the layout.
+
+A little reminder from Chapter 7: A component is a light action put on top of a partial, and a component slot is a component for which the action varies according to the calling actions. These two inclusion types are very similar to partials, and support caching in the same way. For instance, if your global layout includes a component called `day` with `include_component('general/day')` in order to show the current date, set the `cache.yml` file of the `general` module as follows to enable the cache on this component:
+
+    _day:
+      enabled: on
+
+When caching a component or a partial, you must decide whether to store a single version for all calling templates or a version for each template. By default, a component is stored independently of the template that calls it. But contextual components, such as a component that displays a different sidebar with each action, should be stored as many times as there are templates calling it. The caching system can handle this case, provided that you set the `contextual` parameter to `true`, as follows:
+
+    _day:
+      contextual: true
+      enabled:   on
+
+>**NOTE**
+>Global components (the ones located in the application `templates/` directory) can be cached, provided that you declare their cache settings in the application `cache.yml`.
+
+### Caching a Template Fragment
+
+Action caching applies to only a subset of actions. For the other actions--those that update data or display session-dependent information in the template--there is still room for cache improvement but in a different way. Symfony provides a third cache type, which is dedicated to template fragments and enabled directly inside the template. In this mode, the action is always executed, and the template is split into executed fragments and fragments in the cache, as illustrated in Figure 12-3.
+
+Figure 12-3 - Caching a template fragment
+
+![Caching a template fragment](/images/book/F1203.png "Caching a template fragment")
+
+For instance, you may have a list of users that shows a link of the last-accessed user, and this information is dynamic. The `cache()` helper defines the parts of a template that are to be put in the cache. See Listing 12-5 for details on the syntax.
+
+Listing 12-5 - Using the `cache()` Helper, in `myapp/modules/user/templates/listSuccess.php`
+
+    [php]
+    <!-- Code executed each time -->
+    <?php echo link_to('last accessed user', 'user/show?id='.$last_accessed_user_id) ?>
+
+    <!-- Cached code -->
+    <?php if (!cache('users')): ?>
+      <?php foreach ($users as $user): ?>
+        <?php echo $user->getName() ?>
+      <?php endforeach; ?>
+      <?php cache_save() ?>
+    <?php endif; ?>
+
+Here's how it works:
+
+  * If a cached version of the fragment named 'users' is found, it is used to replace the code between the <?php if (!cache($unique_fragment_name)): ?> and the <?php endif; ?> lines.
+  * If not, the code between these lines is processed and saved in the cache, identified with the unique fragment name.
+
+The code not included between such lines is always processed and not cached.
+
+>**CAUTION**
+>The action (`list` in the example) must not have caching enabled, since this would bypass the whole template execution and ignore the fragment cache declaration.
+
+The speed boost of using the template fragment cache is not as significant as with the action cache, since the action is always executed, the template is partially processed, and the layout is always used for decoration.
+
+You can declare additional fragments in the same template; however, you need to give each of them a unique name so that the symfony cache system can find them afterwards.
+
+As with actions and components, cached fragments can take a lifetime in seconds as a second argument of the call to the `cache()` helper.
+
+    [php]
+    <?php if (!cache('users', 43200)): ?>
+
+The default cache lifetime (86400 seconds, or one day) is used if no parameter is given to the helper.
+
+>**TIP**
+>Another way to make an action cacheable is to insert the variables that make it vary into the action's routing pattern. For instance, if a home page displays the name of the connected user, it cannot be cached unless the URL contains the user nickname. Another example is for internationalized applications: If you want to enable caching on a page that has several translations, the language code must somehow be included in the URL pattern. This trick will multiply the number of pages in the cache, but it can be of great help to speed up heavily interactive applications.
+
+### Configuring the Cache Dynamically
+
+The `cache.yml` file is one way to define cache settings, but it has the inconvenience of being invariant. However, as usual in symfony, you can use plain PHP rather than YAML, and that allows you to configure the cache dynamically.
+
+Why would you want to change the cache settings dynamically? A good example is a page that is different for authenticated users and for anonymous ones, but the URL remains the same. Imagine an `article/show` page with a rating system for articles. The rating feature is disabled for anonymous users. For those users, rating links trigger the display of a login form. This version of the page can be cached. On the other hand, for authenticated users, clicking a rating link makes a POST request and creates a new rating. This time, the cache must be disabled for the page so that symfony builds it dynamically.
+
+The right place to define dynamic cache settings is in a filter executed before the `sfCacheFilter`. Indeed, the cache is a filter in symfony, just like the web debug toolbar and the security features. In order to enable the cache for the `article/show` page only if the user is not authenticated, create a `conditionalCacheFilter` in the application `lib/` directory, as shown in Listing 12-6.
+
+Listing 12-6 - Configuring the Cache in PHP, in `myapp/lib/conditionalCacheFilter.class.php`
+
+    [php]
+    class conditionalCacheFilter extends sfFilter
+    {
+      public function execute($filterChain)
+      {
+        $context = $this->getContext();
+        if (!$context->getUser()->isAuthenticated())
+        {
+          foreach ($this->getParameter('pages') as $page)
+          {
+            $context->getViewCacheManager()->addCache($page['module'], $page['action'],array('lifeTime' => 86400));
+          }
+        }
+
+        // Execute next filter
+        $filterChain->execute();
+      }
+    }
+
+You must register this filter in the `filters.yml` file before the `sfCacheFilter`, as shown in Listing 12-7.
+
+Listing 12-7 - Registering Your Custom Filter, in `myapp/config/filters.yml`
+
+    ...
+    security: ~
+
+    conditionalCache:
+      class: conditionalCacheFilter
+      param:
+        pages:
+          - { module: article, action: show }
+
+    cache: ~
+    ...
+
+Clear the cache (to autoload the new filter class), and the conditional cache is ready. It will enable the cache of the pages defined in the pages parameter only for users who are not authenticated.
+
+The `addCache()` method of the `sfViewCacheManager` object expects a module name, an action name, and an associative array with the same parameters as the ones you would define in a `cache.yml` file. For instance, if you want to define that the `article/show` action must be cached with the layout and with a lifetime of 3600 seconds, then write the following:
+
+    [php]
+    $context->getViewCacheManager()->addCache('article', 'show', array(
+      'withLayout' => true,
+      'lifeTime'   => 3600,
+    ));
+
+>**SIDEBAR**
+>Alternative Caching storage
+>
+>By default, the symfony cache system stores data in files on the web server hard disk. You may want to store cache in memory (for instance, via memcache) or in a database (notably if you want to share your cache among several servers or speed up cache removal). You can easily alter symfony's default cache storage system because the cache class used by the symfony view cache manager is defined in `factories.yml`.
+>
+>The default view cache storage factory is the `sfFileCache` class:
+>
+>     view_cache:
+>         class: sfFileCache
+>         param:
+>           automaticCleaningFactor: 0
+>           cacheDir:                %SF_TEMPLATE_CACHE_DIR%
+>
+>You can replace the `class` with your own cache storage class or with one of the symfony alternative classes (`sfSQLiteCache` for instance). The parameters defined under the `param` key are passed to the `initialize()` method of your class as an associative array. Any view cache storage class must imple- ment all methods found in the abstract `sfCache` class. Refer to the API documentation ([http://www. symfony-project.com/api/symfony.html](http://www. symfony-project.com/api/symfony.html)) for more information on this subject.
+
+### Using the Super Fast Cache
+
+Even a cached page involves some PHP code execution. For such a page, symfony still loads the configuration, builds the response, and so on. If you are really sure that a page is not going to change for a while, you can bypass symfony completely by putting the resulting HTML code directly into the `web/` folder. This works thanks to the Apache `mod_rewrite` settings, provided that your routing rule specifies a pattern ending without a suffix or with `.html`.
+
+You can do this by hand, page by page, with a simple command-line call:
+
+    > curl http://myapp.example.com/user/list.html > web/user/list.html
+
+After that, every time that the `user/list` action is requested, Apache finds the corresponding `list.html` page and bypasses symfony completely. The trade-off is that you can't control the page cache with symfony anymore (lifetime, automatic deletion, and so on), but the speed gain is very impressive.
+
+Alternatively, you can use the `sfSuperCache` symfony plug-in, which automates the process and supports lifetime and cache clearing. Refer to Chapter 17 for more information about plug-ins.
+
+>**SIDEBAR**
+>Other Speedup tactics
+>
+>In addition to the HTML cache, symfony has two other cache mechanisms, which are completely automated and transparent to the developer. In the production environment, the configuration and the template translations are cached in files stored in the myproject/cache/config/ and myproject/cache/i18n/ directories without any intervention.
+>
+>PHP accelerators (eAccelerator, APC, XCache, and so on), also called opcode caching modules, increase performance of PHP scripts by caching them in a compiled state, so that the overhead of code parsing and compiling is almost completely eliminated. This is particularly effective for the Propel classes, which contain a great amount of code. These accelerators are compatible with symfony and can easily triple the speed of an application. They are recommended in production environments for any symfony application with a large audience.
+>
+>With a PHP accelerator, you can manually store persistent data in memory, to avoid doing the same processing for each request, with the `sfProcessCache` class. And if you want to store the result of a CPU-intensive function in a file, you will probably use the `sfFunctionCache` object. Refer to Chapter 18 for more information about these mechanisms.
+
+Removing Items from the Cache
+-----------------------------
+
+If the scripts or the data of your application change, the cache will contain outdated information. To avoid incoherence and bugs, you can remove parts of the cache in many different ways, according to your needs.
+
+### Clearing the Entire Cache
+
+The `clear-cache` task of the symfony command line erases the cache (HTML, configuration, and i18n cache). You can pass it arguments to erase only a subset of the cache, as shown in Listing 12-8. Remember to call it only from the root of a symfony project.
+
+Listing 12-8 - Clearing the Cache
+
+    // Erase the whole cache
+    > symfony clear-cache
+
+    // Short syntax
+    > symfony cc
+
+    // Erase only the cache of the myapp application
+    > symfony clear-cache myapp
+
+    // Erase only the HTML cache of the myapp application
+    > symfony clear-cache myapp template
+
+    // Erase only the configuration cache of the myapp application
+    > symfony clear-cache myapp config
+
+### Clearing Selective Parts of the Cache
+
+When the database is updated, the cache of the actions related to the modified data must be cleared. You could clear the whole cache, but that would be a waste for all the existing cached actions that are unrelated to the model change. This is where the `remove()` method of the `sfViewCacheManager` object applies. It expects an internal URI as argument (the same kind of argument you would provide to a `link_to()`), and removes the related action cache.
+
+For instance, imagine that the `update` action of the `user` module modifies the columns of a `User` object. The cached versions of the `list` and `show` actions need to be cleared, or else the old versions, which contain erroneous data, are displayed. To handle this, use the `remove()` method, as shown in Listing 12-9.
+
+Listing 12-9 - Clearing the Cache for a Given Action, in `modules/user/actions/actions.class.php`
+
+    [php]
+    public function executeUpdate()
+    {
+      // Update a user
+      $user_id = $this->getRequestParameter('id');
+      $user = UserPeer::retrieveByPk($user_id);
+      $this->foward404Unless($user);
+      $user->setName($this->getRequestParameter('name'));
+      ...
+      $user->save();
+
+      // Clear the cache for actions related to this user
+      $cacheManager = $this->getContext()->getViewCacheManager();
+      $cacheManager->remove('user/list');
+      $cacheManager->remove('user/show?id='.$user_id);
+      ...
+    }
+
+Removing cached partials, components, and component slots is a little trickier. As you can pass them any type of parameter (including objects), it is almost impossible to identify their cached version after the fact. Let's focus on partials, as the explanation is the same for the other template components. Symfony identifies a cached partial with a special prefix (`sf_cache_partial`), the name of the module, and the name of the partial, plus a hash of all the parameters used to call it, as follows:
+
+    [php]
+    // A partial called by
+    <?php include_partial('user/my_partial', array('user' => $user) ?>
+
+    // Is identified in the cache as
+    /sf_cache_partial/user/_my_partial/sf_cache_key/bf41dd9c84d59f3574a5da244626dcc8
+
+In theory, you could remove a cached partial with the `remove()` method if you knew the value of the parameters hash used to identify it, but this is very impracticable. Fortunately, if you add a `sf_cache_key` parameter to the `include_partial()` helper call, you can identify the partial in the cache with something that you know. As you can see in Listing 12-10, clearing a single cached partial--for instance, to clean up the cache from the partial based on a modified `User`--becomes easy.
+
+Listing 12-10 - Clearing Partials from the Cache
+
+    [php]
+    <?php include_partial('user/my_partial', array(
+      'user'         => $user,
+      'sf_cache_key' => $user->getId()
+    ) ?>
+
+    // Is identified in the cache as
+    /sf_cache_partial/user/_my_partial/sf_cache_key/12
+
+    // Clear _my_partial for a specific user in the cache with $cacheManager->remove('@sf_cache_partial?module=user&action=_my_partial&sf_cache_key='.$user->getId());
+
+You cannot use this method to clear all occurrences of a partial in the cache. You will learn how to clear these in the "Clearing the Cache Manually" section later in this chapter.
+
+To clear template fragments, use the same `remove()` method. The key identifying the fragment in the cache is composed of the same `sf_cache_partial` prefix, the module name, the action name, and the `sf_cache_key` (the unique name of the cache fragment included by the `cache()` helper). Listing 12-11 shows an example.
+
+Listing 12-11 - Clearing Template Fragments from the Cache
+
+    [php]
+    <!-- Cached code -->
+    <?php if (!cache('users')): ?>
+      ... // Whatever
+      <?php cache_save() ?>
+    <?php endif; ?>
+
+    // Is identified in the cache as
+    /sf_cache_partial/user/list/sf_cache_key/users
+
+    // Clear it with
+    $cacheManager->remove('@sf_cache_partial?module=user&action=list&sf_cache_key=users');
+
+>**SIDEBAR**
+>Selective Cache Clearing Can damage your Brain
+>
+>The trickiest part of the cache-clearing job is to determine which actions are influenced by a data update.
+>
+>For instance, imagine that the current application has a `publication` module where publications are listed (`list` action) and described (`show` action), along with the details of their author (an instance of the `User` class). Modifying one User record will affect all the descriptions of the user's publications and the list of publications. This means that you need to add to the `update` action of the `user` module, something like this:
+>
+>     [php]
+>     $c = new Criteria();
+>     $c->add(PublicationPeer::AUTHOR_ID, $this->getRequestParameter('id'));
+>     $publications = PublicationPeer::doSelect($c);
+>
+>     $cacheManager = sfContext::getInstance()->getViewCacheManager();
+>     foreach ($publications as $publication)
+>     {
+>       $cacheManager->remove('publication/show?id='.$publication->getId());
+>     }
+>     $cacheManager->remove('publication/list');
+>
+>When you start using the HTML cache, you need to keep a clear view of the dependencies between the model and the actions, so that new errors don't appear because of a misunderstood relationship. Keep in mind that all the actions that modify the model should probably contain a bunch of calls to the `remove()` method if the HTML cache is used somewhere in the application.
+>
+>And, if you don't want to damage your brain with too difficult an analysis, you can always clear the whole cache each time you update the database . . .
+
+### Cache Directory Structure
+
+The `cache/` directory of your application has the following structure:
+
+    cache/                 # sf_root_cache_dir
+      [APP_NAME]/          # sf_base_cache_dir
+        [ENV_NAME]/        # sf_cache_dir
+          config/          # sf_config_cache_dir
+          i18n/            # sf_i18n_cache_dir
+          modules/         # sf_module_cache_dir
+          template/        # sf_template_cache_dir
+            [HOST_NAME]/
+              all/
+
+Cached templates are stored under the `[HOST_NAME]` directory (where dots are replaced by underscores for compatibility with file systems), in a directory structure corresponding to their URL. For instance, the template cache of a page called with:
+
+    http://www.myapp.com/user/show/id/12
+
+is stored in:
+
+    cache/myapp/prod/template/www_myapp_com/all/user/show/id/12.cache
+
+You should not write file paths directly in your code. Instead, you can use the file path constants. For instance, to retrieve the absolute path to the `template/` directory of the current application in the current environment, use `sfConfig::get('sf_template_cache_dir')`.
+
+Knowing this directory structure will help you deal with manual cache clearing.
+
+### Clearing the Cache Manually
+
+Clearing the cache across applications can be a problem. For instance, if an administrator modifies a record in the `user` table in a `backend` application, all the actions depending on this user in the `frontend` application need to be cleared from the cache. The `remove()` method expects an internal URI, but applications don't know other application's routing rules (applications are isolated from each other), so you cannot use the `remove()` method to clear the cache of another application.
+
+The solution is to manually remove the files from the `cache/` directory, based on a file path. For instance, if the `backend` application needs to clear the cache of the `user/show` action in the `frontend` application for the user of `id` `12`, it can use the following:
+
+    [php]
+    $sf_root_cache_dir = sfConfig::get('sf_root_cache_dir');
+    $cache_dir = $sf_root_cache_dir.'/frontend/prod/template/www_myapp_com/all';
+    unlink($cache_dir.'/user/show/id/12.cache');
+
+But this is not very satisfactory. This command will erase only the cache of the current environment, and it forces you to write the environment name and the current host name in the file path. To bypass these limitations, you can use the `sfToolkit::clearGlob()` method. It takes a file pattern as a parameter and accepts wildcards. For instance, you can clear the same cache files as in the preceding example, regardless of host and environment, with this:
+
+    [php]
+    $cache_dir = $sf_root_cache_dir.'/frontend/*/template/*/all';
+    sfToolkit::clearGlob($cache_dir.'/user/show/id/12.cache');
+
+This method is also of great use when you need to erase a cached action regardless of certain parameters. For instance, if your application handles several languages, you may have chosen to insert the language code in all URLs. So the link to a user profile page should look like this:
+
+    http://www.myapp.com/en/user/show/id/12
+
+To remove the cached profile of the user having an `id` of `12` in all languages, you can simply do this:
+
+    [php]
+    sfToolkit::clearGlob($cache_dir.'/*/user/show/id/12.cache');
+
+Testing and Monitoring Caching
+------------------------------
+
+HTML caching, if not properly handled, can create incoherence in displayed data. Each time you disable the cache for an element, you should test it thoroughly and monitor the execution boost to tweak it.
+
+### Building a Staging Environment
+
+The caching system is prone to new errors in the production environment that can't be detected in the development environment, since the HTML cache is disabled by default in development. If you enable the HTML cache for some actions, you should add a new environment, called staging in this section, with the same settings as the `prod` environment (thus, with cache enabled) but with `web_debug` set to `on`.
+
+To set it up, edit the `settings.yml` file of your application and add the lines shown in Listing 12-12 at the top.
+
+Listing 12-12 - Settings for a `staging` Environment, in `myapp/config/settings.yml`
+
+    staging:
+      .settings:
+        web_debug:  on
+        cache:      on
+
+In addition, create a new front controller by copying the production one (probably `myproject/web/index.php`) to a new `myapp_staging.php`. Edit it to change the `SF_ENVIRONMENT` and `SF_DEBUG` values, as follows:
+
+    [php]
+    define('SF_ENVIRONMENT', 'staging');
+    define('SF_DEBUG',        true);
+
+That's it--you have a new environment. Use it by adding the front controller name after the domain name:
+
+    http://myapp.example.com/myapp_staging.php/user/list
+
+>**TIP**
+>Instead of copying an existing one, you can create a new front controller with the `symfony` command line. For instance, to create a `staging` environment for the `myapp` application, called `myapp_staging.php` and where `SF_DEBUG` is `true`, just call `symfony init-controller myapp staging myapp_staging.php true`.
+
+### Monitoring Performance
+
+Chapter 16 will explore the web debug toolbar and its contents. However, as this toolbar offers valuable information about cached elements, here is a brief description of its cache features.
+
+When you browse to a page that contains cacheable elements (action, partials, fragments, and so on), the web debug toolbar (in the top-right corner of the window) shows an ignore cache button (a green, rounded arrow), as shown in Figure 12-4. This button reloads the page and forces the processing of cached elements. Be aware that it does not clear the cache.
+
+The last number on the right side of the debug toolbar is the duration of the request execution. If you enable cache on a page, this number should decrease the second time you load the page, since symfony uses the data from the cache instead of reprocessing the scripts. You can easily monitor the cache improvements with this indicator.
+
+Figure 12-4 - Web debug toolbar for pages using caching
+
+![Web debug toolbar for pages using caching](/images/book/F1204.png "Web debug toolbar for pages using caching")
+
+The debug toolbar also shows the number of database queries executed during the processing of the request, and the detail of the durations per category (click the total duration to display the detail). Monitoring this data, in conjunction with the total duration, will help you do fine measures of the performance improvements brought by the cache.
+
+### Benchmarking
+
+The debug mode greatly decreases the speed of your application, since a lot of information is logged and made available to the web debug toolbar. So the processed time displayed when you browse in the `staging` environment is not representative of what it will be in production, where the debug mode is turned `off`.
+
+To get a better view of the process time of each request, you should use benchmarking tools, like Apache Bench or JMeter. These tools allow load testing and provide two important pieces of information: the average loading time of a specific page and the maximum capacity of your server. The average loading time data is very useful for monitoring performance improvements due to cache activation.
+
+### Identifying Cache Parts
+
+When the web debug toolbar is enabled, the cached elements are identified in a page with a red frame, each having a cache information box on the top left, as shown in Figure 12-5. The box has a blue background if the element has been executed, or a yellow background if it comes from the cache. Clicking the cache information link displays the identifier of the cache element, its lifetime, and the elapsed time since its last modification. This will help you identify problems when dealing with out-of-context elements, to see when the element was created and which parts of a template you can actually cache.
+
+Figure 12-5 - Identification for cached elements in a page
+
+![Identification for cached elements in a page](/images/book/F1205.png "Identification for cached elements in a page")
+
+HTTP 1.1 and Client-Side Caching
+--------------------------------
+
+The HTTP 1.1 protocol defines a bunch of headers that can be of great use to further speed up an application by controlling the browser's cache system.
+
+The HTTP 1.1 specifications of the World Wide Web Consortium (W3C, [http://www. w3.org/Protocols/rfc2616/rfc2616-sec14.html](http://www. w3.org/Protocols/rfc2616/rfc2616-sec14.html)) describe these headers in detail. If an action has caching enabled, and it uses the `with_layout` option, it can use one or more of the mechanisms described in the following sections.
+
+Even if some of the browsers of your website's users may not support HTTP 1.1, there is no risk in using the HTTP 1.1 cache features. A browser receiving headers that it doesn't understand simply ignores them, so you are advised to set up the HTTP 1.1 cache mechanisms.
+
+In addition, HTTP 1.1 headers are also understood by proxies and caching servers. Even if a user's browser doesn't understand HTTP 1.1, there can be a proxy in the route of the request to take advantage of it.
+
+### Adding an ETag Header to Avoid Sending Unchanged Content
+
+When the ETag feature is enabled, the web server adds to the response a special header containing a signature of the response itself.
+
+    ETag: 1A2Z3E4R5T6Y7U
+
+The user's browser will store this signature, and send it again together with the request the next time it needs the same page. If the new signature shows that the page didn't change since the first request, the browser doesn't send the response back. Instead, it just sends a `304: Not modified` header. It saves CPU time (if gzipping is enabled for example) and bandwidth (page transfer) for the server, and time (page transfer) for the client. Overall, pages in a cache with an ETag are even faster to load than pages in a cache without an ETag.
+
+In symfony, you enable the ETag feature for the whole application in `settings.yml`. Here is the default ETag setting:
+
+    all:
+      .settings:
+        etag: on
+
+For actions in a cache with layout, the response is taken directly from the `cache/` directory, so the process is even faster.
+
+### Adding a Last-Modified Header to Avoid Sending Still Valid Content
+
+When the server sends the response to the browser, it can add a special header to specify when the data contained in the page was last changed:
+
+    Last-Modified: Sat, 23 Nov 2006 13:27:31 GMT
+
+Browsers can understand this header and, when requesting the page again, add an `If-Modified` header accordingly:
+
+    If-Modified-Since: Sat, 23 Nov 2006 13:27:31 GMT
+
+The server can then compare the value kept by the client and the one returned by its application. If they match, the server returns a `304: Not modified` header, saving bandwidth and CPU time, just as with ETags.
+
+In symfony, you can set the `Last-Modified` response header just as you would for another header. For instance, you can use it like this in an action:
+
+    [php]
+    $this->getResponse()->setHttpHeader('Last-Modified', $this->getResponse()->getDate($timestamp));
+
+This date can be the actual date of the last update of the data used in the page, given from your database or your file system. The `getDate()` method of the `sfResponse` object converts a timestamp to a formatted date in the format needed for the `Last-Modified` header (RFC1123).
+
+### Adding Vary Headers to Allow Several Cached Versions of a Page
+
+Another HTTP 1.1 header is `Vary`. It defines which parameters a page depends on, and is used by browsers and proxies to build cache keys. For example, if the content of a page depends on cookies, you can set its `Vary` header as follows:
+
+    Vary: Cookie
+
+Most often, it is difficult to enable caching on actions because the page may vary according to the cookie, the user language, or something else. If you don't mind expanding the size of your cache, set the `Vary` header of the response properly. This can be done for the whole application or on a per-action basis, using the `cache.yml` configuration file or the `sfResponse` related method as follows:
+
+    [php]
+    $this->getResponse()->addVaryHttpHeader('Cookie');
+    $this->getResponse()->addVaryHttpHeader('User-Agent');
+    $this->getResponse()->addVaryHttpHeader('Accept-Language');
+
+Symfony will store a different version of the page in the cache for each value of these parameters. This will increase the size of the cache, but whenever the server receives a request matching these headers, the response is taken from the cache instead of being processed. This is a great performance tool for pages that vary only according to request headers.
+
+### Adding a Cache-Control Header to Allow Client-Side Caching
+
+Up to now, even by adding headers, the browser keeps sending requests to the server even if it holds a cached version of the page. You can avoid that by adding `Cache-Control` and `Expires` headers to the response. These headers are disabled by default in PHP, but symfony can override this behavior to avoid unnecessary requests to your server.
+
+As usual, you trigger this behavior by calling a method of the `sfResponse` object. In an action, define the maximum time a page should be cached (in seconds):
+
+    [php]
+    $this->getResponse()->addCacheControlHttpHeader('max_age=60');
+
+You can also specify under which conditions a page may be cached, so that the provider's cache does not keep a copy of private data (like bank account numbers):
+
+    [php]
+    $this->getResponse()->addCacheControlHttpHeader('private=True');
+
+Using `Cache-Control` HTTP directives, you get the ability to fine-tune the various cache mechanisms between your server and the client's browser. For a detailed review of these directives, see the W3C `Cache-Control` specifications.
+
+One last header can be set through symfony: the `Expires` header:
+
+    [php]
+    $this->getResponse()->setHttpHeader('Expires', $this->getResponse()->getDate($timestamp));
+
+>**CAUTION**
+>The major consequence of turning on the `Cache-Control` mechanism is that your server logs won't show all the requests issued by the users, but only the ones actually received. If the performance gets better, the apparent popularity of the site may decrease in the statistics.
+
+Summary
+-------
+
+The cache system provides variable performance boosts according to the cache type selected. From the best gain to the least, the cache types are as follows:
+
+  * Super cache
+  * Action cache with layout
+  * Action cache without layout
+  * Fragment cache in the template
+
+In addition, partials and components can be cached as well.
+
+If changing data in the model or in the session forces you to erase the cache for the sake of coherence, you can do it with a fine granularity for optimum performance--erase only the elements that have changed, and keep the others.
+
+Remember to test all the pages where caching is enabled with extra care, as new bugs may appear if you cache the wrong elements or if you forget to clear the cache when you update the underlying data. A staging environment, dedicated to cache testing, is of great use for that purpose.
+
+Finally, make the best of the HTTP 1.1 protocol with symfony's advanced cache-tweaking features, which will involve the client in the caching task and provide even more performance gains.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/13-I18n-and-L10n.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/13-I18n-and-L10n.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/13-I18n-and-L10n.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,452 @@
+Chapter 13 - I18n And L10n
+==========================
+
+If you ever developed an international application, you know that dealing with every aspect of text translation, local standards, and localized content can be a nightmare. Fortunately, symfony natively automates all the aspects of internationalization.
+
+As it is a long word, developers often refer to internationalization as i18n (count the letters in the word to know why). Localization is referred to as l10n. They cover two different aspects of multilingual web applications.
+
+An internationalized application contains several versions of the same content in various languages or formats. For instance, a webmail interface can offer the same service in several languages; only the interface changes.
+
+A localized application contains distinct information according to the country from which it is browsed. Think about the contents of a news portal: When browsed from the United States, it displays the latest headlines about the United States, but when browsed from France, the headlines concern the French news. So an l10n application not only provides content translation, but the content can be different from one localized version to another.
+
+All in all, dealing with i18n and l10n means that the application can take care of the following:
+
+  * Text translation (interface, assets, and content)
+  * Standards and formats (dates, amounts, numbers, and so on)
+  * Localized content (many versions of a given object according to a country)
+
+This chapter covers the way symfony deals with those elements and how you can use it to develop internationalized and localized applications.
+
+User Culture
+------------
+
+All the built-in i18n features in symfony are based on a parameter of the user session called the culture. The culture is the combination of the country and the language of the user, and it determines how the text and culture-dependent information are displayed. Since it is serialized in the user session, the culture is persistent between pages.
+
+### Setting the Default Culture
+
+By default, the culture of new users is the `default_culture`. You can change this setting in the `i18n.yml` configuration file, as shown in Listing 13-1.
+
+Listing 13-1 - Setting the Default Culture, in `myapp/config/i18n.yml`
+
+    all:
+      default_culture:     fr_FR
+
+>**NOTE**
+>During development, you might be surprised that a culture change in the `i18n.yml` file doesn't change the current culture in the browser. That's because the session already has a culture from previous pages. If you want to see the application with the new default culture, you need to clear the domain cookies or restart your browser.
+
+Keeping both the language and the country in the culture is necessary because you may have a different French translation for users from France, Belgium, or Canada, and a different Spanish content for users from Spain or Mexico. The language is coded in two lowercase characters, according to the ISO 639-1 standard (for instance, `en` for English). The country is coded in two uppercase characters, according to the ISO 3166-1 standard (for instance, `GB` for Great Britain).
+
+### Changing the Culture for a User
+
+The user culture can be changed during the browsing session--for instance, when a user decides to switch from the English version to the French version of the application, or when a user logs in to the application and uses the language stored in his preferences. That's why the `sfUser` class offers getter and setter methods for the user culture. Listing 13-2 shows how to use these methods in an action.
+
+Listing 13-2 - Setting and Retrieving the Culture in an Action
+
+    [php]
+    // Culture setter
+    $this->getUser()->setCulture('en_US');
+
+    // Culture getter
+    $culture = $this->getUser()->getCulture();
+     => en_US
+
+>**SIDEBAR**
+>Culture in the URL
+>
+>When using symfony's localization and internationalization features, pages tend to have different versions for a single URL--it all depends on the user session. This prevents you from caching or indexing your pages in a search engine.
+>
+>One solution is to make the culture appear in every URL, so that translated pages can be seen as different URLs to the outside world. In order to do that, add the `:sf_culture` token in every rule of your application `routing.yml`:
+>
+>
+>     page:
+>       url: /:sf_culture/:page
+>       requirements: { sf_culture: (?:fr|en|de) }
+>       params: ...
+>
+>     article:
+>       url: /:sf_culture/:year/:month/:day/:slug
+>       requirements: { sf_culture: (?:fr|en|de) }
+>       params: ...
+>
+>
+>To avoid manually setting the sf_culture request parameter in every `link_to()`, symfony automatically adds the user culture to the default routing parameters. It also works inbound because symfony will automatically change the user culture if the `sf_culture` parameter is found in the URL.
+
+### Determining the Culture Automatically
+
+In many applications, the user culture is defined during the first request, based on the browser preferences. Users can define a list of accepted languages in their browser, and this data is sent to the server with each request, in the `Accept-Language` HTTP header. You can retrieve it in symfony through the `sfRequest` object. For instance, to get the list of preferred languages of a user in an action, type this:
+
+    [php]
+    $languages = $this->getRequest()->getLanguages();
+
+The HTTP header is a string, but symfony automatically parses it and converts it into an array. So the preferred language of the user is accessible with `$languages[0]` in the preceding example.
+
+It can be useful to automatically set the user culture to the preferred browser languages in a site home page or in a filter for all pages.
+
+>**CAUTION**
+>The `Accept-Language` HTTP header is not very reliable information, since users rarely know how to modify it in their browser. Most of the time, the preferred browser language is the language of the interface, and browsers are not available in all languages. If you decide to set the culture automatically according to the browser preferred language, make sure you provide a way for the user to choose an alternate language.
+
+Standards and Formats
+---------------------
+
+The internals of a web application don't care about cultural particularities. Databases, for instance, use international standards to store dates, amounts, and so on. But when data is sent to or retrieved from users, a conversion needs to be made. Users won't understand timestamps, and they will prefer to declare their mother language as Français instead of French. So you will need assistance to do the conversion automatically, based on the user culture.
+
+### Outputting Data in the User's Culture
+
+Once the culture is defined, the helpers depending on it will automatically have proper output. For instance, the `format_number()` helper automatically displays a number in a format familiar to the user, according to its culture, as shown in Listing 13-3.
+
+Listing 13-3 - Displaying a Number for the User's Culture
+
+    [php]
+    <?php use_helper('Number') ?>
+
+    <?php $sf_user->setCulture('en_US') ?>
+    <?php echo format_number(12000.10) ?>
+     => '12,000.10'
+
+    <?php $sf_user->setCulture('fr_FR') ?>
+    <?php echo format_number(12000.10) ?>
+     => '12 000,10'
+
+You don't need to explicitly pass the culture to the helpers. They will look for it themselves in the current session object. Listing 13-4 lists helpers that take into account the user culture for their output.
+
+Listing 13-4 - Culture-Dependent Helpers
+
+    [php]
+    <?php use_helper('Date') ?>
+
+    <?php echo format_date(time()) ?>
+     => '9/14/06'
+
+    <?php echo format_datetime(time()) ?>
+     => 'September 14, 2006 6:11:07 PM CEST'
+
+    <?php use_helper('Number') ?>
+
+    <?php echo format_number(12000.10) ?>
+     => '12,000.10'
+
+    <?php echo format_currency(1350, 'USD') ?>
+     => '$1,350.00'
+
+    <?php use_helper('I18N') ?>
+
+    <?php echo format_country('US') ?>
+     => 'United States'
+
+    <?php format_language('en') ?>
+     => 'English'
+
+    <?php use_helper('Form') ?>
+
+    <?php echo input_date_tag('birth_date', mktime(0, 0, 0, 9, 14, 2006)) ?>
+     => input type="text" name="birth_date" id="birth_date" value="9/14/06" size="11" />
+
+    <?php echo select_country_tag('country', 'US') ?>
+     => <select name="country" id="country"><option value="AF">Afghanistan</option>
+          ...
+          <option value="GB">United Kingdom</option>
+          <option value="US" selected="selected">United States</option>
+          <option value="UM">United States Minor Outlying Islands</option>
+          <option value="UY">Uruguay</option>
+          ...
+        </select>
+
+The date helpers can accept an additional format parameter to force a culture-independent display, but you shouldn't use it if your application is internationalized.
+
+### Getting Data from a Localized Input
+
+If it is necessary to show data in the user's culture, as for retrieving data, you should, as much as possible, push users of your application to input already internationalized data. This approach will save you from trying to figure out how to convert data with varying formats and uncertain locality. For instance, who might enter a monetary value with comma separators in an input box?
+
+You can frame the user input format either by hiding the actual data (as in a `select_country_tag()`) or by separating the different components of complex data into several simple inputs.
+
+For dates, however, this is often not possible. Users are used to entering dates in their cultural format, and you need to be able to convert such data to an internal (and international) format. This is where the `sfI18N` class applies. Listing 13-5 demonstrates how this class is used.
+
+Listing 13-5 - Getting a Date from a Localized Format in an Action
+
+    [php]
+    $date= $this->getRequestParameter('birth_date');
+    $user_culture = $this->getUser()->getCulture();
+
+    // Getting a timestamp
+    $timestamp = sfI18N::getTimestampForCulture($date, $user_culture);
+
+    // Getting a structured date
+    list($d, $m, $y) = sfI18N::getDateForCulture($date, $user_culture);
+
+Text Information in the Database
+--------------------------------
+
+A localized application offers different content according to the user's culture. For instance, an online shop can offer products worldwide at the same price, but with a custom description for every country. This means that the database must be able to store different versions of a given piece of data, and for that, you need to design your schema in a particular way and use culture each time you manipulate localized model objects.
+
+### Creating Localized Schema
+
+For each table that contains some localized data, you should split the table in two parts: one table that does not have any i18n column, and the other one with only the i18n columns. The two tables are to be linked by a one-to-many relationship. This setup lets you add more languages when required without changing your model. Let's consider an example using a `Product` table.
+
+First, create tables in the `schema.yml` file, as shown in Listing 13-6.
+
+Listing 13-6 - Sample Schema for i18n Data, in `config/schema.yml`
+
+    my_connection:
+      my_product:
+        _attributes: { phpName: Product, isI18N: true, i18nTable: my_product_i18n }
+        id:          { type: integer, required: true, primaryKey: true, autoincrement: true }
+        price:       { type: float }
+
+      my_product_i18n:
+        _attributes: { phpName: ProductI18n }
+        id:          { type: integer, required: true, primaryKey: true, foreignTable: my_product, foreignReference: id }
+        culture:     { isCulture: true, type: varchar, size: 7, required: true, primaryKey: true }
+        name:        { type: varchar, size: 50 }
+
+Notice the `isI18N` and `i18nTable` attributes in the first table, and the special `culture` column in the second. All these are symfony-specific Propel enhancements.
+
+The symfony automations can make this much faster to write. If the table containing internationalized data has the same name as the main table with `_i18n` as a suffix, and they are related with a column named `id` in both tables, you can omit the `id` and `culture` columns in the `_i18n` table as well as the specific i18n attributes for the main table; symfony will infer them. It means that symfony will see the schema in Listing 13-7 as the same as the one in Listing 13-6.
+
+Listing 13-7 - Sample Schema for i18n Data, Short Version, in `config/schema.yml`
+
+    my_connection:
+      my_product:
+        _attributes: { phpName: Product }
+        id:
+        price:       float
+      my_product_i18n:
+        _attributes: { phpName: ProductI18n }
+        name:        varchar(50)
+
+### Using the Generated I18n Objects
+
+Once the corresponding object model is built (don't forget to call `symfony` `propel-build-model` and clear the cache with a `symfony cc` after each modification of the `schema.yml`), you can use your `Product` class with i18n support as if there were only one table, as shown in Listing 13-8.
+
+Listing 13-8 - Dealing with i18n Objects
+
+    [php]
+    $product = ProductPeer::retrieveByPk(1);
+    $product->setCulture('fr');
+    $product->setName('Nom du produit');
+    $product->save();
+
+    $product->setCulture('en');
+    $product->setName('Product name');
+    $product->save();
+
+    echo $product->getName();
+     => 'Product name'
+
+    $product->setCulture('fr');
+    echo $product->getName();
+     => 'Nom du produit'
+
+If you'd rather not have to remember to change the culture each time you use an i18n object, you can also change the `hydrate()` method in the object class. See an example in Listing 13-9.
+
+Listing 13-9 - Overriding the `hydrate()` Method to Set the Culture, in `myproject/lib/model/Product.php`
+
+    [php]
+    public function hydrate(ResultSet $rs, $startcol = 1)
+    {
+      parent::hydrate($rs, $startcol);
+      $this->setCulture(sfContext::getInstance()->getUser()->getCulture());
+    }
+
+As for queries with the peer objects, you can restrict the results to objects having a translation for the current culture by using the `doSelectWithI18n` method, instead of the usual `doSelect`, as shown in Listing 13-10. In addition, it will create the related i18n objects at the same time as the regular ones, resulting in a reduced number of queries to get the full content (refer to Chapter 18 for more information about this method's positive impacts on performance).
+
+Listing 13-10 - Retrieving Objects with an i18n `Criteria`
+
+    [php]
+    $c = new Criteria();
+    $c->add(ProductPeer::PRICE, 100, Criteria::LESS_THAN);
+    $products = ProductPeer::doSelectWithI18n($c, $culture);
+    // The $culture argument is optional
+    // The current user culture is used if no culture is given
+
+So basically, you should never have to deal with the i18n objects directly, but instead pass the culture to the model (or let it guess it) each time you do a query with the regular objects.
+
+Interface Translation
+---------------------
+
+The user interface needs to be adapted for i18n applications. Templates must be able to display labels, messages, and navigation in several languages but with the same presentation. Symfony recommends that you build your templates with the default language, and that you provide a translation for the phrases used in your templates in a dictionary file. That way, you don't need to change your templates each time you modify, add, or remove a translation.
+
+### Configuring Translation
+
+The templates are not translated by default, which means that you need to activate the template translation feature in the `settings.yml` file prior to everything else, as shown in Listing 13-11.
+
+Listing 13-11 - Activating Interface Translation, in `myapp/config/settings.yml`
+
+    all:
+      .settings:
+        i18n: on
+
+### Using the Translation Helper
+
+Let's say that you want to create a website in English and French, with English being the default language. Before even thinking about having the site translated, you probably wrote the templates something like the example shown in Listing 13-12.
+
+Listing 13-12 - A Single-Language Template
+
+    [php]
+    Welcome to our website. Today's date is <?php echo format_date(date()) ?>
+
+For symfony to translate the phrases of a template, they must be identified as text to be translated. This is the purpose of the `__()` helper (two underscores), a member of the I18N helper group. So all your templates need to enclose the phrases to translate in such function calls. Listing 13-12, for example, can be modified to look like Listing 13-13 (as you will see in the "Handling Complex Translation Needs" section later in this chapter, there is an even better way to call the translation helper in this example).
+
+Listing 13-13 - A Multiple-Language-Ready Template
+
+    [php]
+    <?php use_helper('I18N') ?>
+
+    <?php echo __('Welcome to our website.') ?>
+    <?php echo __("Today's date is ") ?>
+    <?php echo format_date(date()) ?>
+
+>**TIP**
+>If your application uses the I18N helper group for every page, it is probably a good idea to include it in the `standard_helpers` setting in the `settings.yml` file, so that you avoid repeating `use_helper('I18N')` for each template.
+
+### Using Dictionary Files
+
+Each time the `__()` function is called, symfony looks for a translation of its argument in the dictionary of the current user's culture. If it finds a corresponding phrase, the translation is sent back and displayed in the response. So the user interface translation relies on a dictionary file.
+
+The dictionary files are written in the XML Localization Interchange File Format (XLIFF), named according to the pattern `messages.[language code].xml`, and stored in the application `i18n/` directory.
+
+XLIFF is a standard format based on XML. As it is well known, you can use third-party translation tools to reference all text in your website and translate it. Translation firms know how to handle such files and to translate an entire site just by adding a new XLIFF translation.
+
+>**TIP**
+>In addition to the XLIFF standard, symfony also supports several other translation back-ends for dictionaries: gettext, MySQL, SQLite, and Creole. Refer to the API documentation for more information about configuring these back-ends.
+
+Listing 13-14 shows an example of the XLIFF syntax with the messages.fr.xml file necessary to translate Listing 13-13 into French.
+
+Listing 13-14 - An XLIFF Dictionary, in `myapp/i18n/messages.fr.xml`
+
+    [xml]
+    <?xml version="1.0" ?>
+    <xliff version="1.0">
+      <file orginal="global" source-language="en_US" datatype="plaintext">
+        <body>
+          <trans-unit id="1">
+            <source>Welcome to our website.</source>
+            <target>Bienvenue sur notre site web.</target>
+          </trans-unit>
+          <trans-unit id="2">
+            <source>Today's date is </source>
+            <target>La date d'aujourd'hui est </target>
+          </trans-unit>
+        </body>
+      </file>
+    </xliff>
+
+The `source-language` attribute must always contain the full ISO code of your default culture. Each translation is written in a `trans-unit` tag with a unique `id` attribute.
+
+With the default user culture (set to en_US), the phrases are not translated and the raw arguments of the `__()` calls are displayed. The result of Listing 13-13 is then similar to Listing 13-12. However, if the culture is changed to `fr_FR` or `fr_BE`, the translations from the `messages.fr.xml` file are displayed instead, and the result looks like Listing 13-15.
+
+Listing 13-15 - A Translated Template
+
+    [php]
+    Bienvenue sur notre site web. La date d'aujourd'hui est
+    <?php echo format_date(date()) ?>
+
+If additional translations need to be done, simply add a new `messages.``XX``.xml` translation file in the same directory.
+
+### Managing Dictionaries
+
+If your `messages.XX.xml` file becomes too long to be readable, you can always split the translations into several dictionary files, named by theme. For instance, you can split the `messages.fr.xml` file into these three files in the application `i18n/` directory:
+
+  * `navigation.fr.xml`
+  * `terms_of_service.fr.xml`
+  * `search.fr.xml`
+
+Note that as soon as a translation is not to be found in the default `messages.XX.xml` file, you must declare which dictionary is to be used each time you call the `__()` helper, using its third argument. For instance, to output a string that is translated in the `navigation.fr.xml` dictionary, write this:
+
+    [php]
+    <?php echo __('Welcome to our website', null, 'navigation') ?>
+
+Another way to organize translation dictionaries is to split them by module. Instead of writing a single `messages.XX.xml` file for the whole application, you can write one in each `modules/[module_name]/i18n/` directory. It makes modules more independent from the application, which is necessary if you want to reuse them, such as in plug-ins (see Chapter 17).
+
+### Handling Other Elements Requiring Translation
+
+The following are other elements that may require translation:
+
+  * Images, text documents, or any other type of assets can also vary according to the user culture. The best example is a piece of text with a special typography that is actually an image. For these, you can create subdirectories named after the user `culture`:
+
+    [php]
+    <?php echo image_tag($sf_user->getCulture().'/myText.gif') ?>
+
+  * Error messages from validation files are automatically output by a `__()`, so you just need to add their translation to a dictionary to have them translated.
+  * The default symfony pages (page not found, internal server error, restricted access, and so on) are in English and must be rewritten in an i18n application. You should probably create your own `default` module in your application and use `__()` in its templates. Refer to Chapter 19 to see how to customize these pages.
+
+### Handling Complex Translation Needs
+
+Translation only makes sense if the `__()` argument is a full sentence. However, as you sometimes have formatting or variables mixed with words, you could be tempted to cut sentences into several chunks, thus calling the helper on senseless phrases. Fortunately, the `__()` helper offers a replacement feature based on tokens, which will help you to have a meaningful dictionary that is easier to handle by translators. As with HTML formatting, you can leave it in the helper call as well. Listing 13-16 shows an example.
+
+Listing 13-16 - Translating Sentences That Contain Code
+
+    [php]
+    // Base example
+    Welcome to all the <b>new</b> users.<br />
+    There are <?php echo count_logged() ?> persons logged.
+
+    // Bad way to enable text translation
+    <?php echo __('Welcome to all the') ?>
+    <b><?php echo __('new') ?></b>
+    <?php echo __('users') ?>.<br />
+    <?php echo __('There are') ?>
+    <?php echo count_logged() ?>
+    <?php echo __('persons logged') ?>
+
+    // Good way to enable text translation
+    <?php echo __('Welcome to all the <b>new</b> users') ?> <br />
+    <?php echo __('There are %1% persons logged', array('%1%' => count_logged())) ?>
+
+In this example, the token is `%1%`, but it can be anything, since the replacement function used by the translation helper is `strtr()`.
+
+One of the common problems with translation is the use of the plural form. According to the number of results, the text changes but not in the same way according to the language. For instance, the last sentence in Listing 13-16 is not correct if `count_logged()` returns 0 or 1. You could do a test on the return value of this function and choose which sentence to use accordingly, but that would represent a lot of code. Additionally, different languages have different grammar rules, and the declension rules of plural can be quite complex. As this problem is very common, symfony provides a helper to deal with it, called `format_number_choice()`. Listing 13-17 demonstrates how to use this helper.
+
+Listing 13-17 - Translating Sentences Depending on the Value of Parameters
+
+    [php]
+    <?php echo format_number_choice(
+      '[0]Nobody is logged|[1]There is 1 person logged|(1,+Inf]There are%1% persons logged', array('%1%' => count_logged()), count_logged()) ?>
+
+The first argument is the multiple possibilities of text. The second argument is the replacement pattern (as with the `__()` helper) and is optional. The third argument is the number on which the test is made to determine which text is taken.
+
+The message/string choices are separated by the pipe (`|`) character followed by an array of acceptable values, using the following syntax:
+
+  * `[1,2]`: Accepts values between 1 and 2, inclusive
+  * `(1,2)`: Accepts values between 1 and 2, excluding 1 and 2
+  * `{1,2,3,4}`: Only values defined in the set are accepted
+  * `[-Inf,0)`: Accepts values greater or equal to negative infinity and strictly less than 0
+
+Any nonempty combinations of the delimiters of square brackets and parentheses are acceptable.
+
+The message will need to appear explicitly in the XLIFF file for the translation to work properly. Listing 13-18 shows an example.
+
+Listing 13-18 - XLIFF Dictionary for a `format_number_choice()` Argument
+
+    ...
+    <trans-unit id="3">
+      <source>[0]Nobody is logged|[1]There is 1 person logged|(1,+Inf]There are%1% persons logged</source>
+      <target>[0]Personne n'est connecté|[1]Une personne est connectée|(1,+Inf]Ily a %1% personnes en ligne</target>
+    </trans-unit>
+    ...
+
+>**SIDEBAR**
+>A few words about charsets
+>
+>Dealing with internationalized content in templates often leads to problems with charsets. If you use a localized charset, you will need to change it each time the user changes culture. In addition, the templates written in a given charset will not display the characters of another charset properly.
+>
+>This is why, as soon as you deal with more than one culture, all your templates must be saved in UTF-8, and the layout must declare the content with this charset. You won't have any unpleasant surprises if you always work with UTF-8, and you will save yourself from a big headache.
+>
+>Symfony applications rely on one central setting for the charset, in the `settings.yml` file. Changing this parameter will change the `content-type` header of all responses.
+>
+>     all:
+>       .settings:
+>         charset: utf-8
+
+### Calling the Translation Helper Outside a Template
+
+Not all the text that is displayed in a page comes from templates. That's why you often need to call the `__()` helper in other parts of your application: actions, filters, model classes, and so on. Listing 13-19 shows how to call the helper in an action by retrieving the current instance of the `I18N` object through the context singleton.
+
+Listing 13-19 - Calling `__()` in an Action
+
+    [php]
+    $this->getContext()->getI18N()->__($text, $args, 'messages');
+
+Summary
+-------
+
+Handling internationalization and localization in web applications is painless if you know how to deal with the user culture. The helpers automatically take it into account to output correctly formatted data, and the localized content from the database is seen as if it were part of a simple table. As for the interface translation, the `__()` helper and XLIFF dictionary ensure that you will have maximum versatility with minimum work.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/14-Generators.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/14-Generators.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/14-Generators.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1101 @@
+Chapter 14 - Generators
+=======================
+
+Many applications are based on data stored in a database and offer an interface to access it. Symfony automates the repetitive task of creating a module providing data manipulation capabilities based on a Propel object. If your object model is properly defined, symfony can even generate an entire site administration automatically. This chapter will tell you of the two generators bundled in symfony: scaffolding and administration generator. The latter relies on a special configuration file with a complete syntax, so most of this chapter describes the various possibilities of the administration generator.
+
+Code Generation Based on the Model
+----------------------------------
+
+In a web application, data access operations can be categorized as one of the following:
+
+  * Creation of a record
+  * Retrieval of records
+  * Update of a record (and modification of its columns)
+  * Deletion of a record
+
+These operations are so common that they have a dedicated acronym: CRUD. Many pages can be reduced to one of them. For instance, in a forum application, the list of latest posts is a retrieve operation, and the reply to a post corresponds to a create operation.
+
+The basic actions and templates that implement the CRUD operations for a given table are repeatedly created in web applications. In symfony, the model layer contains enough information to allow generating the CRUD operations code, so as to speed up the early part of the development or the back-end interfaces.
+
+All the code generation tasks based on the model create an entire module, and result from a single call to the symfony command line in the shape of the following:
+
+    > symfony <TASK_NAME> <APP_NAME> <MODULE_NAME> <CLASS_NAME>
+
+The code generation tasks are `propel-init-crud`, `propel-generate-crud`, and `propel-init-admin`.
+
+### Scaffolding and Administration
+
+During application development, code generation can be used for two distinct purposes:
+
+  * A scaffolding is the basic structure (actions and templates) required to operate CRUD on a given table. The code is minimal, since it is meant to serve as a guideline for further development. It is a starting base that must be adapted to match your logic and presentation requirements. Scaffoldings are mostly used during the development phase, to provide a web access to a database, to build a prototype, or to bootstrap a module primarily based on a table.
+  * An administration is a sophisticated interface for data manipulation, dedicated to back-end administration. Administrations differ from scaffoldings because their code is not meant to be modified manually. They can be customized, extended, or assembled through configuration or inheritance. Their presentation is important, and they take advantage of additional features such as sorting, pagination, and filtering. An administration can be created and handed over to the client as a finished part of the software product.
+
+The symfony command line uses the word crud to designate a scaffolding, and admin for an administration.
+
+### Initiating or Generating Code
+
+Symfony offers two ways to generate code: either by inheritance (`init`) or by code generation (`generate`).
+
+You can initiate a module, that is, create empty classes that inherit from the framework. This masks the PHP code of the actions and the templates to avoid them from being modified. This is useful if your data structure is not final, or if you just need a quick interface to a database to manipulate records. The code executed at runtime is not located in your application, but in the cache. The command-line tasks for this kind of generation start with `propel-init-`.
+
+Initiated action code is empty. For instance, an initiated `article` module has actions looking like this:
+
+    [php]
+    class articleActions extends autoarticleActions
+    {
+    }
+
+On the other hand, you can also generate the code of the actions and the templates so that it can be modified. The resulting module is therefore independent from the classes of the framework, and cannot be altered using configuration files. The command-line tasks for this kind of generation start with `propel-generate-`.
+
+As the scaffoldings are built to serve as a base for further developments, it is often best to generate a scaffolding. On the other hand, an administration should be easy to update through a change in the configuration, and it should remain usable even if the data model changes. That's why administrations are initiated only.
+
+### Example Data Model
+
+Throughout this chapter, the listings will demonstrate the capabilities of the symfony generators based on a simple example, which will remind you of Chapter 8. This is the well-known example of the weblog application, containing two `Article` and `Comment` classes. Listing 14-1 shows its schema, illustrated in Figure 14-1.
+
+Listing 14-1 - `schema.yml` of the Example Weblog Application
+
+    propel:
+      blog_article:
+        _attributes: { phpName: Article }
+        id:
+        title:       varchar(255)
+        content:     longvarchar
+        created_at:
+      blog_comment:
+        _attributes: { phpName: Comment }
+        id:
+        article_id:
+        author:      varchar(255)
+        content:     longvarchar
+        created_at:
+
+Figure 14-1 - Example data model
+
+![Example data model](/images/book/F1401.png "Example data model")
+
+There is no particular rule to follow during the schema creation to allow code generation. Symfony will use the schema as is and interpret its attributes to generate a scaffolding or an administration.
+
+>**TIP**
+>To get the most out of this chapter, you need to actually do the examples. You will get a better understanding of what symfony generates and what can be done with the generated code if you have a view of every step described in the listings. So you are invited to create a data structure such as the one described previously, to create a database with a `blog_article` and a `blog_comment` table, and to populate this database with sample data.
+
+Scaffolding
+-----------
+
+Scaffolding is of great use in the early days of application development. With a single command, symfony creates an entire module based on the description of a given table.
+
+### Generating a Scaffolding
+
+To generate the scaffolding for an `article` module based on the `Article` model class, type the following:
+
+    > symfony propel-generate-crud myapp article Article
+
+Symfony reads the definition of the `Article` class in the `schema.yml` and creates a set of templates and actions based on it, in the `myapp/modules/article/` directory.
+
+The generated module contains three views. The `list` view, which is the default view, displays the rows of the `blog_article` table when browsing to `http://localhost/myapp_dev.php/article` as reproduced in Figure 14-2.
+
+Figure 14-2 - `list` view of the `article` module
+
+![list view of the article module](/images/book/F1402.png "list view of the article module")
+
+Clicking an article identifier displays the `show` view. The details of one row appear in a single page, as in Figure 14-3.
+
+Figure 14-3 - `show` view of the `article` module
+
+![show view of the article module](/images/book/F1403.png "show view of the article module")
+
+Editing an article by clicking the edit link, or creating a new article by clicking the create link in the `list` view, displays the `edit` view, reproduced in Figure 14-4.
+
+Using this module, you can create new articles, and modify or delete existing ones. The generated code is a good base for further developments. Listing 14-2 lists the generated actions and templates of the new module.
+
+Figure 14-4 - `edit` view of the `article` module
+
+![edit view of the article module](/images/book/F1404.png "edit view of the article module")
+
+Listing 14-2 - Generated CRUD Elements, in `myapp/modules/article/`
+
+    // In actions/actions.class.php
+    index           // Forwards to the list action below
+    list            // Displays the list of all the records of the table
+    show            // Displays the lists of all columns of a record
+    edit            // Displays a form to modify the columns of a record
+    update 	         // Action called by the edit action form
+    delete 	         // Deletes a record
+    create 	         // Creates a new record
+
+    // In templates/
+    editSuccess.php  // Record edition form (edit view)
+    listSuccess.php  // List of all records (list view)
+    showSuccess.php  // Detail of one record (show view)
+
+The logic of these actions and templates is quite simple and explicit, and so rather than reproduce and explain it all, Listing 14-3 gives just a sneak peek on the generated action class.
+
+Listing 14-3 - Generated Action Class, in `myapp/modules/article/actions/actions.class.php`
+
+    [php]
+    class articleActions extends sfActions
+    {
+      public function executeIndex()
+      {
+        return $this->forward('article', 'list');
+      }
+
+      public function executeList()
+      {
+        $this->articles = ArticlePeer::doSelect(new Criteria());
+      }
+
+      public function executeShow()
+      {
+        $this->article = ArticlePeer::retrieveByPk($this->getRequestParameter('id'));
+        $this->forward404Unless($this->article);
+      }
+      ...
+
+Modify the generated code to fit your requirements, repeat the CRUD generation for all the tables that you want to interact with, and you have a basic working application. Generating a scaffolding really bootstraps development; let symfony do the dirty job for you and focus on the interface and specifics.
+
+### Initiating a Scaffolding
+
+Initiating a scaffolding is mostly useful when you need to check that you can access the data in the database. It is fast to build and also fast to delete once you're sure that everything works fine.
+
+To initiate a Propel scaffolding that will create an `article` module to deal with the records of the `Article` model class name, type the following:
+
+    > symfony propel-init-crud myapp article Article
+
+You can then access the `list` view using the default action:
+
+    http://localhost/myapp_dev.php/article
+
+The resulting pages are exactly the same as for a generated scaffolding. You can use them as a simple web interface to the database.
+
+If you check the newly created `actions.class.php` in the `article` module, you will see that it is empty: Everything is inherited from an auto-generated class. The same goes for the templates: There is no template file in the `templates/` directory. The code behind the initiated actions and templates is the same as for a generated scaffolding, but lies only in the application cache (`myproject/cache/myapp/prod/module/autoArticle/`).
+
+During application development, developers initiate scaffoldings to interact with the data, regardless of interface. The code is not meant to be customized; an initiated scaffolding can be seen as a simple alternative to PHPmyadmin to manage data.
+
+Administration
+--------------
+
+Symfony can generate more advanced modules, still based on model class definitions from the `schema.yml` file, for the back-end of your applications. You can create an entire site administration with only generated administration modules. The examples of this section will describe administration modules added to a `backend` application. If your project doesn't have a `backend` application, create its skeleton now by calling the `init-app` task:
+
+    > symfony init-app backend
+
+Administration modules interpret the model by way of a special configuration file called `generator.yml`, which can be altered to extend all the generated components and the module look and feel. Such modules benefit from the usual module mechanisms described in previous chapters (layout, validation, routing, custom configuration, autoloading, and so on). You can also override the generated action or templates, in order to integrate your own features into the generated administration, but `generator.yml` should take care of the most common requirements and restrict the use of PHP code only to the very specific.
+
+### Initiating an Administration Module
+
+With symfony, you build an administration on a per-module basis. A module is generated based on a Propel object using the `propel-init-admin` task, which uses syntax similar to that used to initiate a scaffolding:
+
+    > symfony propel-init-admin backend article Article
+
+This call is enough to create an `article` module in the `backend` application based on the `Article` class definition, and is accessible by the following:
+
+    http://localhost/backend.php/article
+
+The look and feel of a generated module, illustrated in Figures 14-5 and 14-6, is sophisticated enough to make it usable out of the box for a commercial application.
+
+Figure 14-5 - `list` view of the `article` module in the `backend` application
+
+![list view of the article module in the backend application](/images/book/F1405.png "list view of the article module in the backend application")
+
+Figure 14-6 - `edit` view of the `article` module in the `backend` application
+
+![edit view of the article module in the backend application](/images/book/F1406.png "edit view of the article module in the backend application")
+
+The difference between the interface of the scaffolding and the one of the administration may not look significant now, but the configurability of the administration will allow you to enhance the basic layout with many additional features without a line of PHP.
+
+>**NOTE**
+>Administration modules can only be initiated (not generated).
+
+### A Look at the Generated Code
+
+The code of the Article administration module, in the `apps/backend/modules/article/` directory, is empty because it is only initiated. The best way to review the generated code of this module is to interact with it using the browser, and then check the contents of the `cache/` folder. Listing 14-4 lists the generated actions and the templates found in the cache.
+
+Listing 14-4 - Generated Administration Elements, in `cache/backend/ENV/modules/article/`
+
+    // In actions/actions.class.php
+    create           // Forwards to edit
+    delete 	          // Deletes a record
+    edit             // Displays a form to modify the fields of a record
+                     // And handles the form submission
+    index            // Forwards to list
+    list             // Displays the list of all the records of the table
+    save             // Forwards to edit
+
+    // In templates/
+    _edit_actions.php
+    _edit_footer.php
+    _edit_form.php
+    _edit_header.php
+    _edit_messages.php
+    _filters.php
+    _list.php
+    _list_actions.php
+    _list_footer.php
+    _list_header.php
+    _list_messages.php
+    _list_td_actions.php
+    _list_td_stacked.php
+    _list_td_tabular.php
+    _list_th_stacked.php
+    _list_th_tabular.php
+    editSuccess.php
+    listSuccess.php
+
+This shows that a generated administration module is composed mainly of two views, `edit` and `list`. If you have a look at the code, you will find it to be very modular, readable, and extensible.
+
+### Introducing the generator.yml Configuration File
+
+The main difference between scaffoldings and administrations (apart from the fact that administration-generated modules don't have a `show` action) is that an administration relies on parameters found in the `generator.yml` YAML configuration file. To see the default configuration of a newly created administration module, open the `generator.yml` file, located in the `backend/modules/article/config/generator.yml` directory and reproduced in Listing 14-5.
+
+Listing 14-5 - Default Generator Configuration, in `backend/modules/article/config/generator.yml`
+
+    generator:
+      class:              sfPropelAdminGenerator
+      param:
+        model_class:      Article
+        theme:            default
+
+This configuration is enough to generate the basic administration. Any customization is added under the `param` key, after the `theme` line (which means that all lines added at the bottom of the `generator.yml` file must at least start with four blank spaces to be properly indented). Listing 14-6 shows a typical customized `generator.yml`.
+
+Listing 14-6 - Typical Complete Generator Configuration
+
+    generator:
+      class:              sfPropelAdminGenerator
+      param:
+        model_class:      Article
+        theme:            default
+
+        fields:
+          author_id:      { name: Article author }
+
+        list:
+          title:          List of all articles
+          display:        [title, author_id, category_id]
+          fields:
+            published_on: { params: date_format='dd/MM/yy' }
+          layout:         stacked
+          params:         |
+            %%is_published%%<strong>%%=title%%</strong><br /><em>by %%author%%
+            in %%category%% (%%published_on%%)</em><p>%%content_summary%%</p>
+          filters:        [title, category_id, author_id, is_published]
+          max_per_page:   2
+
+        edit:
+          title:          Editing article "%%title%%"
+          display:
+            "Post":       [title, category_id, content]
+            "Workflow":   [author_id, is_published, created_on]
+          fields:
+            category_id:  { params: disabled=true }
+            is_published: { type: plain}
+            created_on:   { type: plain, params: date_format='dd/MM/yy' }
+            author_id:    { params: size=5 include_custom=>> Choose an author << }
+            published_on: { credentials:  }
+            content:      { params: rich=true tinymce_options=height:150 }
+
+The following sections explain in detail all the parameters that can be used in this configuration file.
+
+Generator Configuration
+-----------------------
+
+The generator configuration file is very powerful, allowing you to alter the generated administration in many ways. But such capabilities come with a price: The overall syntax description is long to read and learn, making this chapter one of the longest in this book. The symfony website proposes an additional resource that will help you learn this syntax: the administration generator cheat sheet, reproduced in Figure 14-7. Download it from [http://www.symfony-project.com/uploads/assets/sfAdminGeneratorRefCard.pdf](http://www.symfony-project.com/uploads/assets/sfAdminGeneratorRefCard.pdf), and keep it close to you when you read the following examples of this chapter.
+
+The examples of this section will tweak the `article` administration module, as well as the `comment` administration module, based on the `Comment` class definition. Create the latter with the `propel-init-admin` task:
+
+    > symfony propel-init-admin backend comment Comment
+
+Figure 14-7 - The administration generator cheat sheet
+
+![The administration generator cheat sheet](/images/book/F1407.png "The administration generator cheat sheet")
+
+### Fields
+
+By default, the columns of the `list` view and the fields of the `edit` view are the columns defined in `schema.yml`. With `generator.yml`, you can choose which fields are displayed, which ones are hidden, and add fields of your own--even if they don't have a direct correspondence in the object model.
+
+#### Field Settings
+
+The administration generator creates a `field` for each column in the `schema.yml` file. Under the `fields` key, you can modify the way each field is displayed, formatted, etc. For instance, the field settings shown in Listing 14-7 define a custom label class and input type for the `title` field, and a label and a tooltip for the `content` field. The following sections will describe in detail how each parameter works.
+
+Listing 14-7 - Setting a Custom Label for a Column
+
+    generator:
+      class:              sfPropelAdminGenerator
+      param:
+        model_class:      Article
+        theme:            default
+
+        fields:
+          title:          { name: Article Title, type: textarea_tag, params: class=foo }
+          content:        { name: Body, help: Fill in the article body }
+
+In addition to this default definition for all the views, you can override the field settings for a given view (`list` and `edit`), as demonstrated in Listing 14-8.
+
+Listing 14-8 - Overriding Global Settings View per View
+
+    generator:
+      class:              sfPropelAdminGenerator
+      param:
+        model_class:      Article
+        theme:            default
+
+        fields:
+          title:          { name: Article Title }
+          content:        { name: Body }
+
+        list:
+          fields:
+            title:        { name: Title }
+
+        edit:
+          fields:
+            content:      { name: Body of the article }
+
+This is a general principle: Any settings that are set for the whole module under the `fields` key can be overridden by view-specific (`list` and `edit`) areas that follow.
+
+#### Adding Fields to the Display
+
+The fields that you define in the `fields` section can be displayed, hidden, ordered, and grouped in various ways for each view. The `display` key is used for that purpose. For instance, to arrange the fields of the `comment` module, use the code of Listing 14-9.
+
+Listing 14-9 - Choosing the Fields to Display, in `modules/comment/config/generator.yml`
+
+    generator:
+      class:              sfPropelAdminGenerator
+      param:
+        model_class:      Comment
+        theme:            default
+
+        fields:
+          article_id:     { name: Article }
+          created_at:     { name: Published on }
+          content:        { name: Body }
+
+        list:
+          display:        [id, article_id, content]
+
+        edit:
+          display:
+            NONE:         [article_id]
+            Editable:     [author, content, created_at]
+
+The `list` will then display three columns, as in Figure 14-8, and the `edit` form will display four fields, assembled in two groups, as in Figure 14-9.
+
+Figure 14-8 - Custom column setting in the `list` view of the `comment` module
+
+![Custom column setting in the list view of the comment module](/images/book/F1408.png "Custom column setting in the list view of the comment module")
+
+Figure 14-9 - Grouping fields in the `edit` view of the `comment` module
+
+![Grouping fields in the edit view of the comment module](/images/book/F1409.png "Grouping fields in the edit view of the comment module")
+
+So you can use the `display` setting in two ways:
+
+  * To select the columns to display and the order in which they appear, put the fields in a simple array--as in the previous `list` view.
+  * To group fields, use an associative array with the group name as a key, or `NONE` for a group with no name. The value is still an array of ordered column names.
+
+>**TIP**
+>By default, the primary key columns never appear in either view.
+
+#### Custom Fields
+
+As a matter of fact, the fields configured in `generator.yml` don't even need to correspond to actual columns defined in the schema. If the related class offers a custom getter, it can be used as a field for the `list` view; if there is a getter and/or a setter, it can also be used in the `edit` view. For instance, you can extend the `Article` model with a `getNbComments()` method similar to the one in Listing 14-10.
+
+Listing 14-10 - Adding a Custom Getter in the Model, in `lib/model/Article.class.php`
+
+    [php]
+    public function getNbComments()
+    {
+      return $this->countComments();
+    }
+
+Then `nb_comments` is available as a field in the generated module (notice that the getter uses a camelCase version of the field name), as in Listing 14-11.
+
+Listing 14-11 - Custom Getters Provide Additional Columns for Administration Modules, in `backend/modules/article/config/generator.yml`
+
+    generator:
+      class:              sfPropelAdminGenerator
+      param:
+        model_class:      Article
+        theme:            default
+
+        list:
+          display:        [id, title, nb_comments, created_at]
+
+The resulting `list` view of the `article` module is shown in Figure 14-10.
+
+Figure 14-10 - Custom field in the `list` view of the `article` module
+
+![Custom field in the list view of the article module](/images/book/F1410.png "Custom field in the list view of the article module")
+
+Custom fields can even return HTML code to display more than raw data. For instance, you can extend the `Comment` class with a `getArticleLink()` method as in Listing 14-12.
+
+Listing 14-12 - Adding a Custom Getter Returning HTML, in `lib/model/Comment.class.php`
+
+    [php]
+    public function getArticleLink()
+    {
+      return link_to($this->getArticle()->getTitle(), 'article/edit?id='.$this->getArticleId());
+    }
+
+You can use this new getter as a custom field in the `comment/list` view with the same syntax as in Listing 14-11. See the example in Listing 14-13, and the result in Figure 14-11, where the HTML code output by the getter (a hyperlink to the article) appears in the second column instead of the article primary key.
+
+Listing 14-13 - Custom Getters Returning HTML Can Also Be Used As Additional Columns, in `modules/comment/config/generator.yml`
+
+    generator:
+      class:              sfPropelAdminGenerator
+      param:
+        model_class:      Comment
+        theme:            default
+
+        list:
+          display:        [id, article_link, content]
+
+Figure 14-11 - Custom field in the `list` view of the `comment` module
+
+![Custom field in the list view of the comment module](/images/book/F1411.png "Custom field in the list view of the comment module")
+
+#### Partial Fields
+
+The code located in the model must be independent from the presentation. The example of the `getArticleLink()` method earlier doesn't respect this principle of layer separation, because some view code appears in the model layer. To achieve the same goal in a correct way, you'd better put the code that outputs HTML for a custom field in a partial. Fortunately, the administration generator allows it if you declare a field name prefixed by an underscore. In that case, the `generator.yml` file of Listing 14-13 is to be modified as in Listing 14-14.
+
+Listing 14-14 - Partials Can Be Used As Additional Columns--Use the `_` Prefix
+
+        list:
+          display:        [id, _article_link, created_at]
+
+For this to work, an `_article_link.php` partial must be created in the `modules/comment/templates/` directory, as in Listing 14-15.
+
+Listing 14-15 - Example Partial for the `list` View, in `modules/comment/templates/_article_link.php`
+
+    <?php echo link_to($comment->getArticle()->getTitle(), 'article/edit?id='.$comment->getArticleId()) ?>
+
+Notice that the partial template of a partial field has access to the current object through a variable named by the class (`$comment` in this example). For instance, for a module built for a class called `UserGroup`, the partial will have access to the current object through the `$user_group` variable.
+
+The result is the same as in Figure 14-11, except that the layer separation is respected. If you get used to respecting the layer separation, you will end up with more maintainable applications.
+
+If you need to customize the parameters of a partial field, do the same as for a normal field, under the `field` key. Just don't include the leading underscore (`_`) in the key--see an example in Listing 14-16.
+
+Listing 14-16 - Partial Field Properties Can Be Customized Under the `fields` Key
+
+          fields:
+            article_link:   { name: Article }
+
+If your partial becomes crowded with logic, you'll probably want to replace it with a component. Change the `_` prefix to `~` and you can define a component field, as you can see in Listing 14-17.
+
+Listing 14-17 - Components Can Be Used As Additional Columns--Use the `~` Prefix
+
+        ...
+        list:
+          display:        [id, ~article_link, created_at]
+
+In the generated template, this will result by a call to the `articleLink` component of the current module.
+
+>**NOTE**
+>Custom and partial fields can be used in the `list` view, the `edit` view, and for filters. If you use the same partial for several views, the context (`'list'`, `'edit'`, or `'filter'`) is stored in the `$type` variable.
+
+### View Customization
+
+To change the `edit` and `list` views' appearance, you could be tempted to alter the templates. But because they are automatically generated, doing so isn't a very good idea. Instead, you should use the `generator.yml` configuration file, because it can do almost everything that you need without sacrificing modularity.
+
+#### Changing the View Title
+
+In addition to a custom set of fields, the `list` and `edit` pages can have a custom page title. For instance, if you want to customize the title of the `article` views, do as in Listing 14-18. The resulting `edit` view is illustrated in Figure 14-12.
+
+Listing 14-18 - Setting a Custom Title for Each View, in `backend/modules/article/config/generator.yml`
+
+        list:
+          title:          List of Articles
+          ...
+
+        edit:
+          title:          Body of article %%title%%
+          display:        [content]
+
+Figure 14-12 - Custom title in the `edit` view of the `article` module
+
+![Custom title in the edit view of the article module](/images/book/F1412.png "Custom title in the edit view of the article module")
+
+As the default titles use the class name, they are often good enough--provided that your model uses explicit class names.
+
+>**TIP**
+>In the string values of `generator.yml`, the value of a field can be accessed via the name of the field surrounded by `%%`.
+
+#### Adding Tooltips
+
+In the `list` and `edit` views, you can add tooltips to help describe the fields that are displayed. For instance, to add a tooltip to the `article_id` field of the `edit` view of the `comment` module, add a `help` property in the `fields` definition as in Listing 14-19. The result is shown in Figure 14-13.
+
+Listing 14-19 - Setting a Tooltip in the `edit` View, in `modules/comment/config/generator.yml`
+
+        edit:
+          fields:
+            ...
+            article_id:   { help: The current comment relates to this article }
+
+Figure 14-13 - Tooltip in the `edit` view of the `comment` module
+
+![Tooltip in the edit view of the comment module](/images/book/F1413.png "Tooltip in the edit view of the comment module")
+
+In the `list` view, tooltips are displayed in the column header; in the `edit` view, they appear under the input.
+
+#### Modifying the Date Format
+
+Dates can be displayed using a custom format as soon as you use the `date_format` param, as demonstrated in Listing 14-20.
+
+Listing 14-20 - Formatting a Date in the `list` View
+
+        list:
+          fields:
+            created_at:         { name: Published, params: date_format='dd/MM' }
+
+It takes the same format parameter as the `format_date()` helper described in the previous chapter.
+
+>**SIDEBAR**
+>Administration templates are i18N ready
+>
+>All of the text found in the generated templates is automatically internationalized (i.e., enclosed in a call to the `__()` helper). This means that you can easily translate a generated administration by adding the translations of the phrases in an XLIFF file, in your `apps/myapp/i18n/` directory, as explained in the previous chapter.
+
+### List View-Specific Customization
+
+The `list` view can display the details of a record in a tabular way, or with all the details stacked in one line. It also contains filters, pagination, and sorting features. These features can be altered by configuration, as described in the next sections.
+
+#### Changing the Layout
+
+By default, the hyperlink between the `list` view and the `edit` view is borne by the primary key column. If you refer back to Figure 14-11, you will see that the `id` column in the comment list not only shows the primary key of each comment, but also provides a hyperlink allowing users to access the `edit` view.
+
+If you prefer the hyperlink to the detail of the record to appear on another column, prefix the column name by an equal sign (`=`) in the `display` key. Listing 14-21 shows how to remove the `id` from the displayed fields of the comment `list` and to put the hyperlink on the `content` field instead. Check Figure 14-14 for a screenshot.
+
+Listing 14-21 - Moving the Hyperlink for the `edit` View in the `list` View, in `modules/comment/config/generator.yml`
+
+        list:
+          display:    [article_link, =content]
+
+Figure 14-14 - Moving the link to the `edit` view on another column, in the `list` view of the `comment` module
+
+![Moving the link to the edit view on another column, in the list view of the comment module](/images/book/F1414.png "Moving the link to the edit view on another column, in the list view of the comment module")
+
+By default, the `list` view uses the `tabular` layout, where the fields appear as columns, as shown previously. But you can also use the `stacked` layout and concatenate the fields into a single string that expands on the full length of the table. If you choose the `stacked` layout, you must set in the `params` key the pattern defining the value of each line of the list. For instance, Listing 14-22 defines a stacked layout for the list view of the comment module. The result appears in Figure 14-15.
+
+Listing 14-22 - Using a `stacked` Layout in the `list` View, in `modules/comment/config/generator.yml`
+
+        list:
+          layout:  stacked
+          params:  |
+            %%=content%% <br />
+            (sent by %%author%% on %%created_at%% about %%article_link%%)
+          display:  [created_at, author, content]
+
+Figure 14-15 - Stacked layout in the `list` view of the `comment` module
+
+![Stacked layout in the list view of the comment module](/images/book/F1415.png "Stacked layout in the list view of the comment module")
+
+Notice that a `tabular` layout expects an array of fields under the `display` key, but a `stacked` layout uses the `params` key for the HTML code generated for each record. However, the `display` array is still used in a `stacked` layout to determine which column headers are available for the interactive sorting.
+
+#### Filtering the Results
+
+In a `list` view, you can add a set of filter interactions. With these filters, users can both display fewer results and get to the ones they want faster. Configure the filters under the `filters` key, with an array of field names. For instance, add a filter on the `article_id`, `author`, and `created_at` fields to the comment `list` view, as in Listing 14-23, to display a filter box similar to the one in Figure 14-16. You will need to add a `__toString()` method to the `Article` class (returning, for instance, the article `title`) for this to work.
+
+Listing 14-23 - Setting the Filters in the `list` View, in `modules/comment/config/generator.yml`
+
+        list:
+          filters: [article_id, author, created_at]
+          layout:  stacked
+          params:  |
+            %%=content%% <br />
+            (sent by %%author%% on %%created_at%% about %%article_link%%)
+          display:  [created_at, author, content]
+
+Figure 14-16 - Filters in the `list` view of the `comment` module
+
+![Filters in the list view of the comment module](/images/book/F1416.png "Filters in the list view of the comment module")
+
+The filters displayed by symfony depend on the column type:
+
+  * For text columns (like the `author` field in the `comment` module), the filter is a text input allowing text-based search with wildcards (`*`).
+  * For foreign keys (like the `article_id` field in the `comment` module), the filter is a drop-down list of the records of the related table. As for the regular `object_select_tag()`, the options of the drop-down list are the ones returned by the `__toString()` method of the related class.
+  * For date columns (like the `created_at` field in the `comment` module), the filter is a pair of rich date tags (text fields filled by calendar widgets), allowing the selection of a time interval.
+  * For Boolean columns, the filter is a drop-down list having `true`, `false`, and `true or false` options--the last value reinitializes the filter.
+
+Just like you use partial fields in lists, you can also use partial filters to create a filter that symfony doesn't handle on its own. For instance, imagine a `state` field that may contain only two values (`open` and `closed`), but for some reason you store those values directly in the field instead of using a table relation. A simple filter on this field (of type `string`) would be a text-based search, but what you want is probably a drop-down list of values. That's easy to achieve with a partial filter. See Listing 14-24 for an example implementation.
+
+Listing 14-24 - Using a Partial Filter
+
+    [php]
+    // Define the partial, in templates/_state.php
+    <?php echo select_tag('filters[state]', options_for_select(array(
+      '' => '',
+      'open' => 'open',
+      'closed' => 'closed',
+    ), isset($filters['state']) ? $filters['state'] : '')) ?>
+
+    // Add the partial filter in the filter list, in config/generator.yml
+        list:
+          filters:        [date, _state]
+
+Notice that the partial has access to a `$filters` variable, which is useful to get the current value of the filter.
+
+There is one last option that can be very useful for looking for empty values. Imagine that you want to filter the list of comments to display only the ones that have no author. The problem is that if you leave the author filter empty, it will be ignored. The solution is to set the `filter_is_empty` field setting to true, as in Listing 14-25, and the filter will display an additional check box, which will allow you to look for empty values, as illustrated in Figure 14-17.
+
+Listing 14-25 - Adding Filtering of Empty Values on the `author` Field in the `list` View
+
+        list:
+          fields:
+            author:   { filter_is_empty: true }
+          filters:    [article_id, author, created_at]
+
+Figure 14-17 - Allowing the filtering of empty `author` values
+
+![Allowing the filtering of empty author values](/images/book/F1417.png "Allowing the filtering of empty author values")
+
+#### Sorting the List
+
+In a `list` view, the table headers are hyperlinks that can be used to reorder the list, as shown in Figure 14-18. These headers are displayed both in the `tabular` and `stacked` layouts. Clicking these links reloads the page with a `sort` parameter that rearranges the list order accordingly.
+
+Figure 14-18 - Table headers of the `list` view are sort controls
+
+![Table headers of the list view are sort controls](/images/book/F1418.png "Table headers of the list view are sort controls")
+
+You can reuse the syntax to point to a list directly sorted according to a column:
+
+    [php]
+    <?php echo link_to('Comment list by date', 'comment/list?sort=created_at&type=desc' ) ?>
+
+You can also define a default `sort` order for the `list` view directly in the `generator.yml` file. The syntax follows the example given in Listing 14-26.
+
+Listing 14-26 - Setting a Default Sort Field in the `list` View
+
+        list:
+          sort:   created_at
+          # Alternative syntax, to specify a sort order
+          sort:   [created_at, desc]
+
+>**NOTE**
+>Only the fields that correspond to an actual column are transformed into sort controls--not the custom or partial fields.
+
+#### Customizing the Pagination
+
+The generated administration effectively deals with even large tables, because the `list` view uses pagination by default. When the actual number of rows in a table exceeds the number of maximum rows per page, pagination controls appear at the bottom of the list. For instance, Figure 14-19 shows the list of comments with six test comments in the table but a limit of five comments displayed per page. Pagination ensures a good performance, because only the displayed rows are effectively retrieved from the database, and a good usability, because even tables with millions of rows can be managed by an administration module.
+
+Figure 14-19 - Pagination controls appear on long lists
+
+![Pagination controls appear on long lists](/images/book/F1419.png "Pagination controls appear on long lists")
+
+You can customize the number of records to be displayed in each page with the `max_per_page` parameter:
+
+        list:
+          max_per_page:   5
+
+#### Using a Join to Speed Up Page Delivery
+
+By default, the administration generator uses a simple `doSelect()` to retrieve a list of records. But, if you use related objects in the list, the number of database queries required to display the list may rapidly increase. For instance, if you want to display the name of the article in a list of comments, an additional query is required for each post in the list to retrieve the related `Article` object. So you may want to force the pager to use a `doSelectJoinXXX()` method to optimize the number of queries. This can be specified with the `peer_method` parameter.
+
+        list:
+          peer_method:   doSelectJoinArticle
+
+Chapter 18 explains the concept of Join more extensively.
+
+### Edit View-Specific Customization
+
+In an `edit` view, the user can modify the value of each column for a given record. Symfony determines the type of input to display according to the data type of the column. It then generates an `object_*_tag()` helper, and passes that helper the object and the property to edit. For instance, if the article `edit` view configuration stipulates that the user can edit the `title` field:
+
+        edit:
+          display: [title, ...]
+
+then the `edit` page will display a regular text input tag to edit the `title` because this column is defined as a `varchar` type in the schema.
+
+    [php]
+    <?php echo object_input_tag($article, 'getTitle') ?>
+
+#### Changing the Input Type
+
+The default type-to-field conversion rules are as follows:
+
+  * A column defined as `integer`, `float`, `char`, `varchar(size)` appears in the `edit` view as an `object_input_tag()`.
+  * A column defined as `longvarchar` appears as an `object_textarea_tag()`.
+  * A foreign key column appears as an `object_select_tag()`.
+  * A column defined as `boolean` appears as an `object_checkbox_tag()`.
+  * A column defined as a `timestamp` or `date` appears as an `object_input_date_tag()`.
+
+You may want to override these rules to specify a custom input type for a given field. To that extent, set the `type` parameter in the `fields` definition to a specific form helper name. As for the options of the generated `object_*_tag()`, you can change them with the params parameter. See an example in Listing 14-27.
+
+Listing 14-27 - Setting a Custom Input Type and Params for the `edit` View
+
+    generator:
+      class:              sfPropelAdminGenerator
+      param:
+        model_class:      Comment
+        theme:            default
+
+        edit:
+          fields:
+                          ## Drop the input, just display plain text
+            id:           { type: plain }
+                          ## The input is not editable
+            author:       { params: disabled=true }
+                          ## The input is a textarea (object_textarea_tag)
+            content:      { type: textarea_tag, params: rich=true css=user.css tinymce_options=width:330 }
+                          ## The input is a select (object_select_tag)
+            article_id:   { params: include_custom=Choose an article }
+             ...
+
+The params parameters are passed as options to the generated `object_*_tag()`. For instance, the `params` definition for the preceding `article_id` will produce in the template the following:
+
+    <?php echo object_select_tag($comment, 'getArticleId', 'related_class=Article', 'include_custom=Choose an article') ?>
+
+This means that all the options usually available in the form helpers can be customized in an `edit` view.
+
+#### Handling Partial Fields
+
+Partial fields can be used in `edit` views just like in `list` views. The difference is that you have to handle by hand, in the action, the update of the column according to the value of the request parameter sent by the partial field. Symfony knows how to handle the normal fields (corresponding to actual columns), but can't guess how to handle the inputs you may include in partial fields.
+
+For instance, imagine an administration module for a `User` class where the available fields are `id`, `nickname`, and `password`. The site administrator must be able to change the password of a user upon request, but the `edit` view must not display the value of the password field for security reasons. Instead, the form should display an empty password input that the site administrator can fill to change the value. The generator settings for such an `edit` view are then similar to Listing 14-28.
+
+Listing 14-28 - Including a Partial Field in the `edit` View
+
+        edit:
+          display:        [id, nickname, _newpassword]
+          fields:
+            newpassword:  { name: Password, help: Enter a password to change it, leave the field blank to keep the current one }
+
+The `templates/_newpassword.php` partial contains something like this:
+
+    [php]
+    <?php echo input_password_tag('newpassword', '') ?>
+
+Notice that this partial uses a simple form helper, not an object form helper, since it is not desirable to retrieve the password value from the current `User` object to populate the form input--which could disclose the user password.
+
+Now, in order to use the value from this control to update the object in the action, you need to extend the `updateUserFromRequest()` method in the action. To do that, create a method with the same name in the action class file with the custom behavior for the input of the partial field, as in Listing 14-29.
+
+Listing 14-29 - Handling a Partial Field in the Action, in `modules/user/actions/actions.class.php`
+
+    [php]
+    class userActions extends sfActions
+    {
+      protected function updateUserFromRequest()
+      {
+        // Handle the input of the partial field
+        $password = $this->getRequestParameter('newpassword');
+
+        if ($password)
+        {
+          $this->user->setPassword($password);
+        }
+
+        // Let symfony handle the other fields
+        parent::updateUserFromRequest();
+      }
+    }
+
+>**NOTE**
+>In the real world, a `user/edit` view usually contains two password fields, the second having to match the first one to avoid typing mistakes. In practice, as you saw in Chapter 10, this is done via a validator. The administration-generated modules benefit from this mechanism just like regular modules.
+
+### Dealing with Foreign Keys
+
+If your schema defines table relationships, the generated administration modules take advantage of it and offer even more automated controls, thus greatly simplifying the relationship management.
+
+#### One-to-Many Relationships
+
+The 1-n table relationships are taken care of by the administration generator. As is depicted by Figure 14-1 earlier, the `blog_comment` table is related to the `blog_article` table through the `article_id` field. If you initiate the module of the `Comment` class with the administration generator, the `comment/edit` action will automatically display the `article_id` as a drop-down list showing the IDs of the available records of the `blog_article` table (check again Figure 14-9 for an illustration).
+
+In addition, if you define a `__toString()` method in the `Article` object, the text of the drop-down options use it instead of the primary keys.
+
+If you need to display the list of comments related to an article in the `article` module (n-1 relationship), you will need to customize the module a little by way of a partial field.
+
+#### Many-to-Many Relationships
+
+Symfony also takes care of n-n table relationships, but since you can't define them in the schema, you need to add a few parameters to the `generator.yml` file.
+
+The implementation of many-to-many relationships requires an intermediate table. For instance, if there is an n-n relation between a `blog_article` and a `blog_author` table (an article can be written by more than one author and, obviously, an author can write more than one article), your database will always end up with a table called `blog_article_author` or similar, as in Figure 14-20.
+
+Figure 14-20 - Using a "through class" to implement many-to-many relationships
+
+![Using a "through class" to implement many-to-many relationships](/images/book/F1420.png "Using a through class to implement many-to-many relationships")
+
+The model then has a class called `ArticleAuthor`, and this is the only thing that the administration generator needs--but you have to pass it as a `through_class` parameter of the field.
+
+For instance, in a generated module based on the `Article` class, you can add a field to create new n-n associations with the `Author` class if you write `generator.yml` as in Listing 14-30.
+
+Listing 14-30 - Handling Many-to-Many Relationships with a `through_class` Parameter
+
+        edit:
+          fields:
+            article_author: { type: admin_double_list, params: through_class=ArticleAuthor }
+
+Such a field handles links between existing objects, so a regular drop-down list is not enough. You must use a special type of input for that. Symfony offers three widgets to help relate members of two lists (illustrated in Figure 14-21):
+
+  * An `admin_double_list` is a set of two expanded select controls, together with buttons to switch elements from the first list (available elements) to the second (selected elements).
+  * An `admin_select_list` is an expanded select control in which you can select many elements.
+  * An `admin_check_list` is a list of check box tags.
+
+Figure 14-21 - Available controls for many-to-many relationships
+
+![Available controls for many-to-many relationships](/images/book/F1421.png "Available controls for many-to-many relationships")
+
+### Adding Interactions
+
+Administration modules allow users to perform the usual CRUD operations, but you can also add your own interactions or restrict the possible interactions for a view. For instance, the interaction definition shown in Listing 14-31 gives access to all the default CRUD actions on the `article` module.
+
+Listing 14-31 - Defining Interactions for Each View, in `backend/modules/article/config/generator.yml`
+
+        list:
+          title:          List of Articles
+          object_actions:
+            _edit:         ~
+            _delete:       ~
+          actions:
+            _create:       ~
+
+        edit:
+          title:          Body of article %%title%%
+          actions:
+            _list:         ~
+            _save:         ~
+            _save_and_add: ~
+            _delete:       ~
+
+In a `list` view, there are two action settings: the list of actions available for every object, and the list of actions available for the whole page. The list interactions defined in Listing 14-31 render like in Figure 14-22. Each line shows one button to edit the record and one to delete it. At the bottom of the list, a button allows the creation of a new record.
+
+Figure 14-22 - Interactions in the `list` view
+
+![Interactions in the list view](/images/book/F1422.png "Interactions in the list view")
+
+In an `edit` view, as there is only one record edited at a time, there is only one set of actions to define. The `edit` interactions defined in Listing 14-31 render like in Figure 14-23. Both the `save` and the `save_and_add` actions save the current edits in the records, the difference being that the `save` action displays the `edit` view on the current record after saving, while the `save_and_add` action displays an empty `edit` view to add another record. The `save_and_add` action is a shortcut that you will find very useful when adding many records in rapid succession. As for the position of the `delete` action, it is separated from the other buttons so that users don't click it by mistake.
+
+The interaction names starting with an underscore (`_`) tell symfony to use the default icon and action corresponding to these interactions. The administration generator understands `_edit`, `_delete`, `_create`, `_list`, `_save`, `_save_and_add`, and `_create`.
+
+Figure 14-23 - Interactions in the `edit` view
+
+![Interactions in the edit view](/images/book/F1423.png "Interactions in the edit view")
+
+But you can also add a custom interaction, in which case you must specify a name starting with no underscore, as in Listing 14-32.
+
+Listing 14-32 - Defining a Custom Interaction
+
+        list:
+          title:          List of Articles
+          object_actions:
+            _edit:        -
+            _delete:      -
+            addcomment:   { name: Add a comment, action: addComment, icon: backend/addcomment.png }
+
+Each article in the list will now show the `addcomment.png` button, as shown in Figure 14-24. Clicking it triggers a call to the `addComment` action in the current module. The primary key of the current object is automatically added to the request parameters.
+
+Figure 14-24 - Custom interaction in the `list` view
+
+![Custom interaction in the list view](/images/book/F1424.png "Custom interaction in the list view")
+
+The `addComment` action can be implemented as in Listing 14-33.
+
+Listing 14-33 - Implementing the Custom Interaction Action, in `actions/actions.class.php`
+
+    [php]
+    public function executeAddComment()
+    {
+      $comment = new Comment();
+      $comment->setArticleId($this->getRequestParameter('id'));
+      $comment->save();
+
+      $this->redirect('comment/edit?id='.$comment->getId());
+    }
+
+One last word about actions: If you want to suppress completely the actions for one category, use an empty list, as in Listing 14-34.
+
+Listing 14-34 - Removing All Actions in the `list` View
+
+        list:
+          title:          List of Articles
+          actions:        {}
+
+### Form Validation
+
+If you take a look at the generated `_edit_form.php` template in your project `cache/` directory, you will see that the form fields use a special naming convention. In a generated `edit` view, the input names result from the concatenation of the module name and the field name between angle brackets.
+
+For instance, if the `edit` view for the `article` module has a `title` field, the template will look like Listing 14-35 and the field will be identified as `article[title]`.
+
+Listing 14-35 - Syntax of the Generated Input Names
+
+    // generator.yml
+    generator:
+      class:              sfPropelAdminGenerator
+      param:
+        model_class:      Article
+        theme:            default
+        edit:
+          display: [title]
+
+    // Resulting _edit_form.php template
+    <?php echo object_input_tag($article, 'getTitle', array('control_name' => 'article[title]')) ?>
+
+    // Resulting HTML
+    <input type="text" name="article[title]" id="article[title]" value="My Title" />
+
+This has plenty of advantages during the internal form-handling process. However, as explained in Chapter 10, it makes the form validation configuration a bit trickier, so you have to change square brackets, `[` `]`, to curly braces, `{` `}`, in the `fields` definition. Also, when using a field name as a parameter for a validator, you should use the name as it appears in the generated HTML code (that is, with the square brackets, but between quotes). Refer to Listing 14-36 for a detail of the special validator syntax for generated forms.
+
+Listing 14-36 - Validator File Syntax for Administration-Generated Forms
+
+    ## Replace square brackets by curly brackets in the fields list
+    fields:
+      article{title}:
+        required:
+          msg: You must provide a title
+        ## For validator parameters, use the original field name between quotes
+        sfCompareValidator:
+          check:        "user[newpassword]"
+          compare_error: The password confirmation does not match the password.
+
+### Restricting User Actions Using Credentials
+
+For a given administration module, the available fields and interactions can vary according to the credentials of the logged user (refer to Chapter 6 for a description of symfony's security features).
+
+The fields in the generator can take a `credentials` parameter into account so as to appear only to users who have the proper credential. This works for the `list` view and the `edit` view. Additionally, the generator can also hide interactions according to credentials. Listing 14-37 demonstrates these features.
+
+Listing 14-37 - Using Credentials in `generator.yml`
+
+    ## The id column is displayed only for users with the admin credential
+        list:
+          title:          List of Articles
+          layout:         tabular
+          display:        [id, =title, content, nb_comments]
+          fields:
+            id:           { credentials: [admin] }
+
+    ## The addcomment interaction is restricted to the users with the admin credential
+        list:
+          title:          List of Articles
+          object_actions:
+            _edit:        -
+            _delete:      -
+            addcomment:   { credentials: [admin], name: Add a comment, action: addComment, icon: backend/addcomment.png }
+
+Modifying the Presentation of Generated Modules
+-----------------------------------------------
+
+You can modify the presentation of the generated modules so that it matches any existing graphical charter, not only by applying your own style sheet, but also by overriding the default templates.
+
+### Using a Custom Style Sheet
+
+Since the generated HTML is structured content, you can do pretty much anything you like with the presentation.
+
+You can define an alternative CSS to be used for an administration module instead of a default one by adding a `css` parameter to the generator configuration, as in Listing 14-38.
+
+Listing 14-38 - Using a Custom Style Sheet Instead of the Default One
+
+    generator:
+      class:              sfPropelAdminGenerator
+      param:
+        model_class:      Comment
+        theme:            default
+        css:              mystylesheet
+
+Alternatively, you can also use the mechanisms provided by the module `view.yml` to override the styles on a per-view basis.
+
+### Creating a Custom Header and Footer
+
+The `list` and `edit` views systematically include a header and footer partial. There is no such partial by default in the `templates/` directory of an administration module, but you just need to add one with one of the following names to have it included automatically:
+
+    _list_header.php
+    _list_footer.php
+    _edit_header.php
+    _edit_footer.php
+
+For instance, if you want to add a custom header to the `article/edit` view, create a file called `_edit_header.php` as in Listing 14-39. It will work with no further configuration.
+
+Listing 14-39 - Example `edit` Header Partial, in `modules/articles/template/_edit_header.php`
+
+    [php]
+    <?php if ($article->getNbComments() > 0): ?>
+      <h2>This article has <?php echo $article->getNbComments() ?> comments.</h2>
+    <?php endif; ?>
+
+Notice that an edit partial always has access to the current object through a variable having the same name as the module, and that a `list` partial always has access to the current pager through the `$pager` variable.
+
+>**SIDEBAR**
+>Calling the Administration Actions with Custom Parameters
+>
+>The administration module actions can receive custom parameters using the `query_string` argument in a `link_to()` helper. For example, to extend the previous `_edit_header` partial with a link to the comments for the article, write this:
+>
+>     [php]
+>     <?php if ($article->getNbComments() > 0): ?>
+>       <h2>This article has <?php echo link_to($article->getNbComments().' comments', 'comment/list', array('query_string' => 'filter=filter&filters%5Barticle_id%5D='.$article->getId())) ?></h2>
+>     <?php endif; ?>
+>
+>This query string parameter is an encoded version of the more legible
+>
+>     'filter=filter&filters[article_id]='.$article->getId()
+>
+>It filters the comments to display only the ones related to `$article`. Using the query_string argument, you can specify a sorting order and/or a filter to display a custom list view. This can also be useful for custom interactions.
+
+### Customizing the Theme
+
+There are other partials inherited from the framework that can be overridden in the module `templates/` folder to match your custom requirements.
+
+The generator templates are cut into small parts that can be overridden independently, and the actions can also be changed one by one.
+
+However, if you want to override those for several modules in the same way, you should probably create a reusable theme. A theme is a complete set of templates and actions that can be used by an administration module if specified in the theme value at the beginning of `generator.yml`. With the default theme, symfony uses the files defined in `$sf_symfony_data_dir/generator/sfPropelAdmin/default/`.
+
+The theme files must be located in a project tree structure, in a `data/generator/sfPropelAdmin/[theme_name]/template/` directory, and you can bootstrap a new theme by copying the files from the default theme (located in `$sf_symfony_data_dir/generator/sfPropelAdmin/default/template/` directory). This way, you are sure that all the files required for a theme will be present in your custom theme:
+
+    // Partials, in [theme_name]/template/templates/
+    _edit_actions.php
+    _edit_footer.php
+    _edit_form.php
+    _edit_header.php
+    _edit_messages.php
+    _filters.php
+    _list.php
+    _list_actions.php
+    _list_footer.php
+    _list_header.php
+    _list_messages.php
+    _list_td_actions.php
+    _list_td_stacked.php
+    _list_td_tabular.php
+    _list_th_stacked.php
+    _list_th_tabular.php
+
+    // Actions, in [theme_name]/template/actions/actions.class.php
+    processFilters()     // Process the request filters
+    addFiltersCriteria() // Adds a filter to the Criteria object
+    processSort()
+    addSortCriteria()
+
+Be aware that the template files are actually templates of templates, that is, PHP files that will be parsed by a special utility to generate templates based on generator settings (this is called the compilation phase). The generated templates must still contain PHP code to be executed during actual browsing, so the templates of templates use an alternative syntax to keep PHP code unexecuted for the first pass. Listing 14-40 shows an extract of a default template of template.
+
+Listing 14-40 - Syntax of Templates of Templates
+
+    [php]
+    <?php foreach ($this->getPrimaryKey() as $pk): ?>
+    [?php echo object_input_hidden_tag($<?php echo $this->getSingularName() ?>,'get<?php echo $pk->getPhpName() ?>') ?]
+    <?php endforeach; ?>
+
+In this listing, the PHP code introduced by `<?` is executed immediately (at compilation), the one introduced by `[?` is only executed at execution, but the templating engine finally transforms the `[?` tags into `<?` tags so that the resulting template looks like this:
+
+    [php]
+    <?php echo object_input_hidden_tag($article, 'getId') ?>
+
+Dealing with templates of templates is tricky, so the best advice if you want to create your own theme is to start from the `default` theme, modify it step by step, and test it extensively.
+
+>**TIP**
+>You can also package a generator theme in a plug-in, which makes it even more reusable and easy to deploy across multiple applications. Refer to Chapter 17 for more information.
+
+-
+
+>**SIDEBAR**
+>Building Your Own Generator
+>
+>The scaffolding and administration generators both use a set of symfony internal components that automate the creation of generated actions and templates in the cache, the use of themes, and the parsing of templates of templates.
+>
+>This means that symfony provides all the tools to build your own generator, which can look like the existing ones or be completely different. The generation of a module is managed by the `generate()` method of the `sfGeneratorManager` class. For instance, to generate an administration, symfony calls the following internally:
+>
+>     [php]
+>     $generator_manager = new sfGeneratorManager();
+>     $data = $generator_manager->generate('sfPropelAdminGenerator', $parameters);
+>
+>If you want to build your own generator, you should look at the API documentation of the `sfGeneratorManager` and the `sfGenerator` classes, and take as examples the `sfAdminGenerator` and `sfCRUDGenerator` classes.
+
+Summary
+-------
+
+To bootstrap your modules or automatically generate your back-end applications, the basis is a well-defined schema and object model. You can modify the PHP code of scaffoldings, but administration-generated modules are to be modified mostly through configuration.
+
+The `generator.yml` file is the heart of the programming of generated back-ends. It allows for the complete customization of content, features, and the look and feel of the `list` and `edit` views. You can manage field labels, tooltips, filters, sort order, page size, input type, foreign relationships, custom interactions, and credentials directly in YAML, without a single line of PHP code.
+
+If the administration generator doesn't natively support the feature you need, the partial fields and the ability to override actions provide complete extensibility. Plus, you can reuse your adaptations to the administration generator mechanisms thanks to the theme mechanisms.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/15-Unit-and-Functional-Testing.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/15-Unit-and-Functional-Testing.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/15-Unit-and-Functional-Testing.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,998 @@
+Chapter 15 - Unit And Functional Testing
+========================================
+
+Automated tests are one of the greatest advances in programming since object orientation. Particularly conducive to developing web applications, they can guarantee the quality of an application even if releases are numerous. Symfony provides a variety of tools for facilitating automated testing, and these are introduced in this chapter.
+
+Automated Tests
+---------------
+
+Any developer with experience developing web applications is well aware of the time it takes to do testing well. Writing test cases, running them, and analyzing the results is a tedious job. In addition, the requirements of web applications tend to change constantly, which leads to an ongoing stream of releases and a continuing need for code refactoring. In this context, new errors are likely to regularly crop up.
+
+That's why automated tests are a suggested, if not required, part of a successful development environment. A set of test cases can guarantee that an application actually does what it is supposed to do. Even if the internals are often reworked, the automated tests prevent accidental regressions. Additionally, they compel developers to write tests in a standardized, rigid format capable of being understood by a testing framework.
+
+Automated tests can sometimes replace developer documentation since they can clearly illustrate what an application is supposed to do. A good test suite shows what output should be expected for a set of test inputs, and that is a good way to explain the purpose of a method.
+
+The symfony framework applies this principle to itself. The internals of the framework are validated by automated tests. These unit and functional tests are not bundled with the standard symfony distribution, but you can check them out from the SVN repository or browse them online at [http://www.symfony-project.com/trac/browser/trunk/test](http://www.symfony-project.com/trac/browser/trunk/test).
+
+### Unit and Functional Tests
+
+Unit tests confirm that a unitary code component provides the correct output for a given input. They validate how functions and methods work in every particular case. Unit tests deal with one case at a time, so for instance a single method may need several unit tests if it works differently in certain situations.
+
+Functional tests validate not a simple input-to-output conversion, but a complete feature. For instance, a cache system can only be validated by a functional test, because it involves more than one step: The first time a page is requested, it is rendered; the second time, it is taken from the cache. So functional tests validate a process and require a scenario. In symfony, you should write functional tests for all your actions.
+
+For the most complex interactions, these two types may fall short. Ajax interactions, for instance, require a web browser to execute JavaScript, so automatically testing them requires a special third-party tool. Furthermore, visual effects can only be validated by a human.
+
+If you have an extensive approach to automated testing, you will probably need to use a combination of all these methods. As a guideline, remember to keep tests simple and readable.
+
+>**NOTE**
+>Automated tests work by comparing a result with an expected output. In other words, they evaluate assertions (expressions like `$a == 2`). The value of an assertion is either `true` or `false`, and it determines whether a test passes or fails. The word "assertion" is commonly used when dealing with automated testing techniques.
+
+### Test-Driven Development
+
+In the test-driven development (TDD) methodology, the tests are written before the code. Writing tests first helps you to focus on the tasks a function should accomplish before actually developing it. It's a good practice that other methodologies, like Extreme Programming (XP), recommend as well. Plus it takes into account the undeniable fact that if you don't write unit tests first, you never write them.
+
+For instance, imagine that you must develop a text-stripping function. The function removes white spaces at the beginning and at the end of the string, replaces nonalphabetical characters by underscores, and transforms all uppercase characters to lowercase ones. In test-driven development, you would first think about all the possible cases and provide an example "nput and expected output for each, as shown in Table 15-1.
+
+Table 15-1 - A List of Test Cases for a Text-Stripping Function
+
+Input                 | Expected Output
+--------------------- | ---------------------
+`" foo "`             | `"foo"`
+`"foo bar"`           | `"foo_bar"`
+`"-)foo:..=bar?"`     | `"__foo____bar_"`
+`"FooBar"`            | `"foobar`"
+`"Don't foo-bar me!"` | `"don_t_foo_bar_me_"`
+
+You would write the unit tests, run them, and see that they fail. You would then add the necessary code to handle the first test case, run the tests again, see that the first one passes, and go on like that. Eventually, when all the test cases pass, the function is correct.
+
+An application built with a test-driven methodology ends up with roughly as much test code as actual code. As you don't want to spend time debugging your tests cases, keep them simple.
+
+>**NOTE**
+>Refactoring a method can create new bugs that didn't use to appear before. That's why it is also a good practice to run all automated tests before deploying a new release of an application in production--this is called regression testing.
+
+### The Lime Testing Framework
+
+There are many unit test frameworks in the PHP world, with the most well known being PhpUnit and SimpleTest. Symfony has its own, called lime. It is based on the `Test::More` Perl library, and is TAP compliant, which means that the result of tests is displayed as specified in the Test Anything Protocol, designed for better readability of test output.
+
+Lime provides support for unit testing. It is more lightweight than other PHP testing frameworks and has several advantages:
+
+  * It launches test files in a sandbox to avoid strange side effects between each test run. Not all testing frameworks guarantee a clean environment for each test.
+  * Lime tests are very readable, and so is the test output. On compatible systems, lime uses color output in a smart way to distinguish important information.
+  * Symfony itself uses lime tests for regression testing, so many examples of unit and functional tests can be found in the symfony source code.
+  * The lime core is validated by unit tests.
+  * It is written in PHP, and it is fast and well coded. It is contained in a single file, `lime.php`, without any dependence.
+
+The various tests described next use the lime syntax. They work out of the box with any symfony installation.
+
+>**NOTE**
+>Unit and functional tests are not supposed to be launched in production. They are developer tools, and as such, they should be run in the developer's computer, not in the host server.
+
+Unit Tests
+----------
+
+Symfony unit tests are simple PHP files ending in `Test.php` and located in the `test/unit/` directory of your application. They follow a simple and readable syntax.
+
+### What Do Unit Tests Look Like?
+
+Listing 15-1 shows a typical set of unit tests for the `strtolower()` function. It starts by an instantiation of the `lime_test` object (you don't need to worry about the parameters for now). Each unit test is a call to a method of the `lime_test` instance. The last parameter of these methods is always an optional string that serves as the output.
+
+Listing 15-1 - Example Unit Test File, in `test/unit/strtolowerTest.php`
+
+    [php]
+    <?php
+
+    include(dirname(__FILE__).'/../bootstrap/unit.php');
+    require_once(dirname(__FILE__).'/../../lib/strtolower.php');
+
+    $t = new lime_test(7, new lime_output_color());
+
+    // strtolower()
+    $t->diag('strtolower()');
+    $t->isa_ok(strtolower('Foo'), 'string',
+        'strtolower() returns a string');
+    $t->is(strtolower('FOO'), 'foo',
+        'strtolower() transforms the input to lowercase');
+    $t->is(strtolower('foo'), 'foo',
+        'strtolower() leaves lowercase characters unchanged');
+    $t->is(strtolower('12#?@~'), '12#?@~',
+        'strtolower() leaves non alphabetical characters unchanged');
+    $t->is(strtolower('FOO BAR'), 'foo bar',
+        'strtolower() leaves blanks alone');
+    $t->is(strtolower('FoO bAr'), 'foo bar',
+        'strtolower() deals with mixed case input');
+    $t->is(strtolower(''), 'foo',
+        'strtolower() transforms empty strings into foo');
+
+Launch the test set from the command line with the `test-unit` task. The command-line output is very explicit, and it helps you localize which tests failed and which passed. See the output of the example test in Listing 15-2.
+
+Listing 15-2 - Launching a Single Unit Test from the Command Line
+
+    > symfony test-unit strtolower
+
+    1..7
+    # strtolower()
+    ok 1 - strtolower() returns a string
+    ok 2 - strtolower() transforms the input to lowercase
+    ok 3 - strtolower() leaves lowercase characters unchanged
+    ok 4 - strtolower() leaves non alphabetical characters unchanged
+    ok 5 - strtolower() leaves blanks alone
+    ok 6 - strtolower() deals with mixed case input
+    not ok 7 - strtolower() transforms empty strings into foo
+    #     Failed test (.\batch\test.php at line 21)
+    #            got: ''
+    #       expected: 'foo'
+    # Looks like you failed 1 tests of 7.
+
+>**TIP**
+>The `include` statement at the beginning of Listing 15-1 is optional, but it makes the test file an independent PHP script that you can execute without the symfony command line, by calling `php test/unit/strtolowerTest.php`.
+
+### Unit Testing Methods
+
+The `lime_test` object comes with a large number of testing methods, as listed in Table 15-2.
+
+Table 15-2 - Methods of the `lime_test` Object for Unit Testing
+
+Method                                      | Description
+------------------------------------------- | -------------------------------------------------------------
+`diag($msg)`                                | Outputs a comment but runs no test
+`ok($test, $msg)`                           | Tests a condition and passes if it is true
+`is($value1, $value2, $msg)`                | Compares two values and passes if they are equal (`==`)
+`isnt($value1, $value2, $msg)`              | Compares two values and passes if they are not equal
+`like($string, $regexp, $msg)`              | Tests a string against a regular expression
+`unlike($string, $regexp, $msg)`            | Checks that a string doesn't match a regular expression
+`cmp_ok($value1, $operator, $value2, $msg)` | Compares two arguments with an operator
+`isa_ok($variable, $type, $msg)`            | Checks the type of an argument
+`isa_ok($object, $class, $msg)`             | Checks the class of an object
+`can_ok($object, $method, $msg)`            | Checks the availability of a method for an object or a class
+`is_deeply($array1, $array2, $msg)`         | Checks that two arrays have the same values
+`include_ok($file, $msg)`                   | Validates that a file exists and that it is properly included
+`fail()`                                    | Always fails--useful for testing exceptions
+`pass()`                                    | Always passes--useful for testing exceptions
+`skip($msg, $nb_tests)`                     | Counts as `$nb_tests` tests--useful for conditional tests
+`todo()`                                    | Counts as a test--useful for tests yet to be written
+
+The syntax is quite straightforward; notice that most methods take a message as their last parameter. This message is displayed in the output when the test passes. Actually, the best way to learn these methods is to test them, so have a look at Listing 15-3, which uses them all.
+
+Listing 15-3 - Testing Methods of the `lime_test` Object, in `test/unit/exampleTest.php`
+
+    [php]
+    <?php
+
+    include(dirname(__FILE__).'/../bootstrap/unit.php');
+
+    // Stub objects and functions for test purposes
+    class myObject
+    {
+      public function myMethod()
+      {
+      }
+    }
+
+    function throw_an_exception()
+    {
+      throw new Exception('exception thrown');
+    }
+
+    // Initialize the test object
+    $t = new lime_test(16, new lime_output_color());
+
+    $t->diag('hello world');
+    $t->ok(1 == '1', 'the equal operator ignores type');
+    $t->is(1, '1', 'a string is converted to a number for comparison');
+    $t->isnt(0, 1, 'zero and one are not equal');
+    $t->like('test01', '/test\d+/', 'test01 follows the test numbering pattern');
+    $t->unlike('tests01', '/test\d+/', 'tests01 does not follow the pattern');
+    $t->cmp_ok(1, '<', 2, 'one is inferior to two');
+    $t->cmp_ok(1, '!==', true, 'one and true are not identical');
+    $t->isa_ok('foobar', 'string', '\'foobar\' is a string');
+    $t->isa_ok(new myObject(), 'myObject', 'new creates object of the right class');
+    $t->can_ok(new myObject(), 'myMethod', 'objects of class myObject do have amyMethod method');
+    $array1 = array(1, 2, array(1 => 'foo', 'a' => '4'));
+    $t->is_deeply($array1, array(1, 2, array(1 => 'foo', 'a' => '4')),
+        'the first and the second array are the same');
+    $t->include_ok('./fooBar.php', 'the fooBar.php file was properly included');
+
+    try
+    {
+      throw_an_exception();
+      $t->fail('no code should be executed after throwing an exception');
+    }
+    catch (Exception $e)
+    {
+      $t->pass('exception catched successfully');
+    }
+
+    if (!isset($foobar))
+    {
+      $t->skip('skipping one test to keep the test count exact in the condition', 1);
+    }
+    else
+    {
+      $t->ok($foobar, 'foobar');
+    }
+
+    $t->todo('one test left to do');
+
+You will find a lot of other examples of the usage of these methods in the symfony unit tests.
+
+>**TIP**
+>You may wonder why you would use `is()` as opposed to `ok()` here. The error message output by `is()` is much more explicit; it shows both members of the test, while `ok()` just says that the condition failed.
+
+### Testing Parameters
+
+The initialization of the `lime_test` object takes as its first parameter the number of tests that should be executed. If the number of tests finally executed differs from this number, the lime output warns you about it. For instance, the test set of Listing 15-3 outputs as Listing 15-4. The initialization stipulated that 16 tests were to run, but only 15 actually took place, so the output indicates this.
+
+Listing 15-4 - The Count of Test Run Helps You to Plan Tests
+
+    > symfony test-unit example
+
+    1..16
+    # hello world
+    ok 1 - the equal operator ignores type
+    ok 2 - a string is converted to a number for comparison
+    ok 3 - zero and one are not equal
+    ok 4 - test01 follows the test numbering pattern
+    ok 5 - tests01 does not follow the pattern
+    ok 6 - one is inferior to two
+    ok 7 - one and true are not identical
+    ok 8 - 'foobar' is a string
+    ok 9 - new creates object of the right class
+    ok 10 - objects of class myObject do have a myMethod method
+    ok 11 - the first and the second array are the same
+    not ok 12 - the fooBar.php file was properly included
+    #     Failed test (.\test\unit\testTest.php at line 27)
+    #       Tried to include './fooBar.php'
+    ok 13 - exception catched successfully
+    ok 14 # SKIP skipping one test to keep the test count exact in the condition
+    ok 15 # TODO one test left to do
+    # Looks like you planned 16 tests but only ran 15.
+    # Looks like you failed 1 tests of 16.
+
+The `diag()` method doesn't count as a test. Use it to show comments, so that your test output stays organized and legible. On the other hand, the `todo()` and `skip()` methods count as actual tests. A `pass()`/`fail()` combination inside a `try`/`catch` block counts as a single test.
+
+A well-planned test strategy must contain an expected number of tests. You will find it very useful to validate your own test files--especially in complex cases where tests are run inside conditions or exceptions. And if the test fails at some point, you will see it quickly because the final number of run tests won't match the number given during initialization.
+
+The second parameter of the constructor is an output object extending the `lime_output` class. Most of the time, as tests are meant to be run through a CLI, the output is a lime_output_color object, taking advantage of bash coloring when available.
+
+### The test-unit Task
+
+The `test-unit` task, which launches unit tests from the command line, expects either a list of test names or a file pattern. See Listing 15-5 for details.
+
+Listing 15-5 - Launching Unit Tests
+
+    // Test directory structure
+    test/
+      unit/
+        myFunctionTest.php
+        mySecondFunctionTest.php
+        foo/
+          barTest.php
+
+    > symfony test-unit myFunction                   ## Run myFunctionTest.php
+    > symfony test-unit myFunction mySecondFunction  ## Run both tests
+    > symfony test-unit 'foo/*'                      ## Run barTest.php
+    > symfony test-unit '*'                          ## Run all tests (recursive)
+
+### Stubs, Fixtures, and Autoloading
+
+In a unit test, the autoloading feature is not active by default. Each class that you use in a test must be either defined in the test file or required as an external dependency. That's why many test files start with a group of `include` lines, as Listing 15-6 demonstrates.
+
+Listing 15-6 - Including Classes in Unit Tests
+
+    [php]
+    <?php
+
+    include(dirname(__FILE__).'/../bootstrap/unit.php');
+    include(dirname(__FILE__).'/../../config/config.php');
+    require_once($sf_symfony_lib_dir.'/util/sfToolkit.class.php');
+
+    $t = new lime_test(7, new lime_output_color());
+
+    // isPathAbsolute()
+    $t->diag('isPathAbsolute()');
+    $t->is(sfToolkit::isPathAbsolute('/test'), true,
+        'isPathAbsolute() returns true if path is absolute');
+    $t->is(sfToolkit::isPathAbsolute('\\test'), true,
+        'isPathAbsolute() returns true if path is absolute');
+    $t->is(sfToolkit::isPathAbsolute('C:\\test'), true,
+        'isPathAbsolute() returns true if path is absolute');
+    $t->is(sfToolkit::isPathAbsolute('d:/test'), true,
+        'isPathAbsolute() returns true if path is absolute');
+    $t->is(sfToolkit::isPathAbsolute('test'), false,
+        'isPathAbsolute() returns false if path is relative');
+    $t->is(sfToolkit::isPathAbsolute('../test'), false,
+        'isPathAbsolute() returns false if path is relative');
+    $t->is(sfToolkit::isPathAbsolute('..\\test'), false,
+        'isPathAbsolute() returns false if path is relative');
+
+In unit tests, you need to instantiate not only the object you're testing, but also the object it depends upon. Since unit tests must remain unitary, depending on other classes may make more than one test fail if one class is broken. In addition, setting up real objects can be expensive, both in terms of lines of code and execution time. Keep in mind that speed is crucial in unit testing because developers quickly tire of a slow process.
+
+Whenever you start including many scripts for a unit test, you may need a simple autoloading system. For this purpose, the `sfCore` class (which must be manually included) provides an `initSimpleAutoload()` method, which expects an absolute path as parameter. All the classes located under this path will be autoloaded. For instance, if you want to have all the classes located under `$sf_symfony_lib_dir/util/` autoloaded, start your unit test script as follows:
+
+    [php]
+    require_once($sf_symfony_lib_dir.'/util/sfCore.class.php');
+    sfCore::initSimpleAutoload($sf_symfony_lib_dir.'/util');
+
+>**TIP**
+>The generated Propel objects rely on a long cascade of classes, so as soon as you want to test a Propel object, autoloading is necessary. Note that for Propel to work, you also need to include the files under the vendor/prop`el/` directory (so the call to `sfCore` becomes `sfCore::initSimpleAutoload(array(SF_ROOT_ DIR.'/lib/model', $sf_symfony_lib_dir.'/vendor/propel'));`) and to add the Propel core to the include path (by calling `set_include_path($sf_symfony_lib_dir.'/vendor'.PATH_SEPARATOR.SF_ROOT_DIR.PATH_SEPARATOR.get_include_path()`.
+
+Another good workaround for the autoloading issues is the use of stubs. A stub is an alternative implementation of a class where the real methods are replaced with simple canned data. It mimics the behavior of the real class, but without its cost. A good example of stubs is a database connection or a web service interface. In Listing 15-7, the unit tests for a mapping API rely on a `WebService` class. Instead of calling the real `fetch()` method of the actual web service class, the test uses a stub that returns test data.
+
+Listing 15-7 - Using Stubs in Unit Tests
+
+    [php]
+    require_once(dirname(__FILE__).'/../../lib/WebService.class.php');
+    require_once(dirname(__FILE__).'/../../lib/MapAPI.class.php');
+
+    class testWebService extends WebService
+    {
+      public static function fetch()
+      {
+        return file_get_contents(dirname(__FILE__).'/fixtures/data/fake_web_service.xml');
+      }
+    }
+
+    $myMap = new MapAPI();
+
+    $t = new lime_test(1, new lime_output_color());
+
+    $t->is($myMap->getMapSize(testWebService::fetch(), 100));
+
+The test data can be more complex than a string or a call to a method. Complex test data is often referred to as fixtures. For coding clarity, it is often better to keep fixtures in separate files, especially if they are used by more than one unit test file. Also, don't forget that symfony can easily transform a YAML file into an array with the `sfYAML::load()` method. This means that instead of writing long PHP arrays, you can write your test data in a YAML file, as in Listing 15-8.
+
+Listing 15-8 - Using Fixture Files in Unit Tests
+
+    [php]
+    // In fixtures.yml:
+    -
+      input:   '/test'
+      output:  true
+      comment: isPathAbsolute() returns true if path is absolute
+    -
+      input:   '\\test'
+      output:  true
+      comment: isPathAbsolute() returns true if path is absolute
+    -
+      input:   'C:\\test'
+      output:  true
+      comment: isPathAbsolute() returns true if path is absolute
+    -
+      input:   'd:/test'
+      output:  true
+      comment: isPathAbsolute() returns true if path is absolute
+    -
+      input:   'test'
+      output:  false
+      comment: isPathAbsolute() returns false if path is relative
+    -
+      input:   '../test'
+      output:  false
+      comment: isPathAbsolute() returns false if path is relative
+    -
+      input:   '..\\test'
+      output:  false
+      comment: isPathAbsolute() returns false if path is relative
+
+    // In testTest.php
+    <?php
+
+    include(dirname(__FILE__).'/../bootstrap/unit.php');
+    include(dirname(__FILE__).'/../../config/config.php');
+    require_once($sf_symfony_lib_dir.'/util/sfToolkit.class.php');
+    require_once($sf_symfony_lib_dir.'/util/sfYaml.class.php');
+
+    $testCases = sfYaml::load(dirname(__FILE__).'/fixtures.yml');
+
+    $t = new lime_test(count($testCases), new lime_output_color());
+
+    // isPathAbsolute()
+    $t->diag('isPathAbsolute()');
+    foreach ($testCases as $case)
+    {
+      $t->is(sfToolkit::isPathAbsolute($case['input']), $case['output'],$case['comment']);
+    }
+
+Functional Tests
+----------------
+
+Functional tests validate parts of your applications. They simulate a browsing session, make requests, and check elements in the response, just like you would do manually to validate that an action does what it's supposed to do. In functional tests, you run a scenario corresponding to a use case.
+
+### What Do Functional Tests Look Like?
+
+You could run your functional tests with a text browser and a lot of regular expression assertions, but that would be a great waste of time. Symfony provides a special object, called `sfBrowser`, which acts like a browser connected to a symfony application without actually needing a server--and without the slowdown of the HTTP transport. It gives access to the core objects of each request (the request, session, context, and response objects). Symfony also provides an extension of this class called `sfTestBrowser`, designed especially for functional tests, which has all the abilities of the `sfBrowser` object plus some smart assert methods.
+
+A functional test traditionally starts with an initialization of a test browser object. This object makes a request to an action and verifies that some elements are present in the response.
+
+For example, every time you generate a module skeleton with the `init-module` or the `propel-init-crud` tasks, symfony creates a simple functional test for this module. The test makes a request to the default action of the module and checks the response status code, the module and action calculated by the routing system, and the presence of a certain sentence in the response content. For a `foobar` module, the generated `foobarActionsTest.php` file looks like Listing 15-9.
+
+Listing 15-9 - Default Functional Test for a New Module, in `tests/functional/frontend/foobarActionsTest.php`
+
+    [php]
+    <?php
+
+    include(dirname(__FILE__).'/../../bootstrap/functional.php');
+
+    // Create a new test browser
+    $browser = new sfTestBrowser();
+    $browser->initialize();
+
+    $browser->
+      get('/foobar/index')->
+      isStatusCode(200)->
+      isRequestParameter('module', 'foobar')->
+      isRequestParameter('action', 'index')->
+      checkResponseElement('body', '!/This is a temporary page/')
+    ;
+
+>**TIP**
+>The browser methods return an `sfTestBrowser` object, so you can chain the method calls for more readability of your test files. This is called a fluid interface to the object, because nothing stops the flow of method calls.
+
+A functional test can contain several requests and more complex assertions; you will soon discover all the possibilities in the upcoming sections.
+
+To launch a functional test, use the `test-functional` task with the symfony command line, as shown in Listing 15-10. This task expects an application name and a test name (omit the `Test.php` suffix).
+
+Listing 15-10 - Launching a Single Functional Test from the Command Line
+
+    > symfony test-functional frontend foobarActions
+
+    # get /comment/index
+    ok 1 - status code is 200
+    ok 2 - request parameter module is foobar
+    ok 3 - request parameter action is index
+    not ok 4 - response selector body does not match regex /This is a temporary page/
+    # Looks like you failed 1 tests of 4.
+    1..4
+
+The generated functional tests for a new module don't pass by default. This is because in a newly created module, the `index` action forwards to a congratulations page (included in the symfony `default` module), which contains the sentence "This is a temporary page." As long as you don't modify the `index` action, the tests for this module will fail, and this guarantees that you cannot pass all tests with an unfinished module.
+
+>**NOTE**
+>In functional tests, the autoloading is activated, so you don't have to include the files by hand.
+
+### Browsing with the sfTestBrowser Object
+
+The test browser is capable of making GET and POST requests. In both cases, use a real URI as parameter. Listing 15-11 shows how to write calls to the `sfTestBrowser` object to simulate requests.
+
+Listing 15-11 - Simulating Requests with the `sfTestBrowser` Object
+
+    [php]
+    include(dirname(__FILE__).'/../../bootstrap/functional.php');
+
+    // Create a new test browser
+    $b = new sfTestBrowser();
+    $b->initialize();
+
+    $b->get('/foobar/show/id/1');                   // GET request
+    $b->post('/foobar/show', array('id' => 1));     // POST request
+
+    // The get() and post() methods are shortcuts to the call() method
+    $b->call('/foobar/show/id/1', 'get');
+    $b->call('/foobar/show', 'post', array('id' => 1));
+
+    // The call() method can simulate requests with any method
+    $b->call('/foobar/show/id/1', 'head');
+    $b->call('/foobar/add/id/1', 'put');
+    $b->call('/foobar/delete/id/1', 'delete');
+
+A typical browsing session contains not only requests to specific actions, but also clicks on links and on browser buttons. As shown in Listing 15-12, the `sfTestBrowser` object is also capable of simulating those.
+
+Listing 15-12 - Simulating Navigation with the `sfTestBrowser` Object
+
+    [php]
+    $b->get('/');                  // Request to the home page
+    $b->get('/foobar/show/id/1');
+    $b->back();                    // Back to one page in history
+    $b->forward();                 // Forward one page in history
+    $b->reload();                  // Reload current page
+    $b->click('go');               // Look for a 'go' link or button and click it
+
+The test browser handles a stack of calls, so the `back()` and `forward()` methods work as they do on a real browser.
+
+>**TIP**
+>The test browser has its own mechanisms to manage sessions (`sfTestStorage`) and cookies.
+
+Among the interactions that most need to be tested, those associated with forms probably rank first. To simulate form input and submission, you have three choices. You can either make a POST request with the parameters you wish to send, call `click()` with the form parameters as an array, or fill in the fields one by one and click the submit button. They all result in the same POST request anyhow. Listing 15-13 shows an example.
+
+Listing 15-13 - Simulating Form Input with the `sfTe stBrowser` Object
+
+    [php]
+    // Example template in modules/foobar/templates/editSuccess.php
+    <?php echo form_tag('foobar/update') ?>
+      <?php echo input_hidden_tag('id', $sf_params->get('id')) ?>
+      <?php echo input_tag('name', 'foo') ?>
+      <?php echo submit_tag('go') ?>
+      <?php echo textarea('text1', 'foo') ?>
+      <?php echo textarea('text2', 'bar') ?>
+    </form>
+
+    // Example functional test for this form
+    $b = new sfTestBrowser();
+    $b->initialize();
+    $b->get('/foobar/edit/id/1');
+
+    // Option 1: POST request
+    $b->post('/foobar/update', array('id' => 1, 'name' => 'dummy', 'commit' => 'go'));
+
+    // Option 2: Click the submit button with parameters
+    $b->click('go', array('name' => 'dummy'));
+
+    // Option 3: Enter the form values field by field name then click the submit button
+    $b->setField('name', 'dummy')->
+        click('go');
+
+>**NOTE**
+>With the second and third options, the default form values are automatically included in the form submission, and the form target doesn't need to be specified.
+
+When an action finishes by a `redirect()`, the test browser doesn't automatically follow the redirection; you must follow it manually with `followRedirect()`, as demonstrated in Listing 15-14.
+
+Listing 15-14 - The Test Browser Doesn't Automatically Follow Redirects
+
+    [php]
+    // Example action in modules/foobar/actions/actions.class.php
+    public function executeUpdate()
+    {
+      ...
+      $this->redirect('foobar/show?id='.$this->getRequestParameter('id'));
+    }
+
+    // Example functional test for this action
+    $b = new sfTestBrowser();	
+    $b->initialize();
+    $b->get('/foobar/edit?id=1')->
+        click('go', array('name' => 'dummy'))->
+        isRedirected()->   // Check that request is redirected
+        followRedirect();    // Manually follow the redirection
+
+There is one last method you should know about that is useful for browsing: `restart()` reinitializes the browsing history, session, and cookies--as if you restarted your browser.
+
+Once it has made a first request, the `sfTestBrowser` object can give access to the request, context, and response objects. It means that you can check a lot of things, ranging from the text content to the response headers, the request parameters, and configuration:
+
+    [php]
+    $request  = $b->getRequest();
+    $context  = $b->getContext();
+    $response = $b->getResponse();
+
+>**SIDEBAR**
+>The sfBrowser object
+>
+>All the browsing methods described in Listings 15-10 to 15-13 are also available out of the testing scope, throughout the `sfBrowser` object. You can call it as follows:
+>
+>     [php]
+>     // Create a new browser
+>     $b = new sfBrowser();
+>     $b->initialize();
+>     $b->get('/foobar/show/id/1')->
+>         setField('name', 'dummy')->
+>         click('go');
+>     $content = $b()->getResponse()->getContent();
+>     ...
+>
+>The `sfBrowser` object is a very useful tool for batch scripts, for instance, if you want to browse a list of pages to generate a cached version for each (refer to Chapter 18 for a detailed example).
+
+### Using Assertions
+
+Due to the `sfTestBrowser` object having access to the response and other components of the request, you can do tests on these components. You could create a new `lime_test` object for that purpose, but fortunately `sfTestBrowser` proposes a `test()` method that returns a `lime_test` object where you can call the unit assertion methods described previously. Check Listing 15-15 to see how to do assertions via `sfTestBrowser`.
+
+Listing 15-15 - The Test Browser Provides Testing Abilities with the `test()` Method
+
+    [php]
+    $b = new sfTestBrowser();
+    $b->initialize();
+    $b->get('/foobar/edit/id/1');
+    $request  = $b->getRequest();
+    $context  = $b->getContext();
+    $response = $b->getResponse();
+
+    // Get access to the lime_test methods via the test() method
+    $b->test()->is($request->getParameter('id'), 1);
+    $b->test()->is($response->getStatuscode(), 200);
+    $b->test()->is($response->getHttpHeader('content-type'), 'text/html;charset=utf-8');
+    $b->test()->like($response->getContent(), '/edit/');
+
+>**NOTE**
+>The `getResponse()`, `getContext()`, `getRequest()`, and `test()` methods don't return an `sfTestBrowser` object, therefore you can't chain other `sfTestBrowser` method calls after them.
+
+You can check incoming and outgoing cookies easily via the request and response objects, as shown in Listing 15-16.
+
+Listing 15-16 - Testing Cookies with `sfTestBrowser`
+
+    [php]
+    $b->test()->is($request->getCookie('foo'), 'bar');     // Incoming cookie
+    $cookies = $response->getCookies();
+    $b->test()->is($cookies['foo'], 'foo=bar');            // Outgoing cookie
+
+Using the `test()` method to test the request elements ends up in long lines. Fortunately, `sfTestbrowser` contains a bunch of proxy methods that help you keep your functional tests readable and short--in addition to returning an `sfTestBrowser` object themselves. For instance, you can rewrite Listing 15-15 in a faster way, as shown in Listing 15-17.
+
+Listing 15-17 - Testing Directly with `sfTestBrowser`
+
+    [php]
+    $b = new sfTestBrowser();
+    $b->initialize();
+    $b->get('/foobar/edit/id/1')->
+        isRequestParameter('id', 1)->
+        isStatutsCode()->
+        isResponseHeader('content-type', 'text/html; charset=utf-8')->
+        responseContains('edit');
+
+The status 200 is the default value of the parameter expected by `isStatusCode()`, so you can call it without any argument to test a successful response.
+
+One more advantage of proxy methods is that you don't need to specify an output text as you would with a `lime_test` method. The messages are generated automatically by the proxy methods, and the test output is clear and readable.
+
+    # get /foobar/edit/id/1
+    ok 1 - request parameter "id" is "1"
+    ok 2 - status code is "200"
+    ok 3 - response header "content-type" is "text/html"
+    ok 4 - response contains "edit"
+    1..4
+
+In practice, the proxy methods of Listing 15-17 cover most of the usual tests, so you will seldom use the `test()` method on an `sfTestBrowser` object.
+
+Listing 15-14 showed that `sfTestBrowser` doesn't automatically follow redirections. This has one advantage: You can test a redirection. For instance, Listing 15-18 shows how to test the response of Listing 15-14.
+
+Listing 15-18 - Testing Redirections with `sfTestBrowser`
+
+    [php]
+    $b = new sfTestBrowser();
+    $b->initialize();
+    $b->
+        get('/foobar/edit/id/1')->
+        click('go', array('name' => 'dummy'))->
+        isStatusCode(200)->
+        isRequestParameter('module', 'foobar')->
+        isRequestParameter('action', 'update')->
+
+        isRedirected()->      // Check that the response is a redirect
+        followRedirect()->    // Manually follow the redirection
+
+        isStatusCode(200)->
+        isRequestParameter('module', 'foobar')->
+        isRequestParameter('action', 'show');
+
+### Using CSS Selectors
+
+Many of the functional tests validate that a page is correct by checking for the presence of text in the content. With the help of regular expressions in the `responseContains()` method, you can check displayed text, a tag's attributes, or values. But as soon as you want to check something deeply buried in the response DOM, regular expressions are not ideal.
+
+That's why the `sfTestBrowser` object supports a `getResponseDom()` method. It returns a libXML2 DOM object, much easier to parse and test than a flat text. Refer to Listing 15-19 for an example of using this method.
+
+Listing 15-19 - The Test Browser Gives Access to the Response Content As a DOM Object
+
+    [php]
+    $b = new sfTestBrowser();
+    $b->initialize();
+    $b->get('/foobar/edit/id/1');
+    $dom = $b->getResponseDom();
+    $b->test()->is($dom->getElementsByTagName('input')->item(1)->getAttribute('type'),'text');
+
+But parsing an HTML document with the PHP DOM methods is still not fast and easy enough. If you are familiar with the CSS selectors, you know that they are an ever more powerful way to retrieve elements from an HTML document. Symfony provides a tool class called `sfDomCssSelector` that expects a DOM document as construction parameter. It has a getTexts() method that returns an array of strings according to a CSS selector, and a getElements() method that returns an array of DOM elements. See an example in Listing 15-20.
+
+Listing 15-20 - The Test Browser Gives Access to the Response Content As an `sfDomCssSelector` Object
+
+    [php]
+    $b = new sfTestBrowser();
+    $b->initialize();
+    $b->get('/foobar/edit/id/1');
+    $c = new sfDomCssSelector($b->getResponseDom())
+    $b->test()->is($c->getTexts('form input[type="hidden"][value="1"]'), array('');
+    $b->test()->is($c->getTexts('form textarea[name="text1"]'), array('foo'));
+    $b->test()->is($c->getTexts('form input[type="submit"]'), array(''));
+
+In its constant pursuit for brevity and clarity, symfony provides a shortcut for this: the `checkResponseElement()` proxy method. This method makes Listing 15-20 look like Listing 15-21.
+
+Listing 15-21 - The Test Browser Gives Access to the Elements of the Response by CSS Selectors
+
+    [php]
+    $b = new sfTestBrowser();
+    $b->initialize();
+    $b->get('/foobar/edit/id/1')->
+        checkResponseElement('form input[type="hidden"][value="1"]', true->
+        checkResponseElement('form textarea[name="text1"]', 'foo')->
+        checkResponseElement('form input[type="submit"]', 1);
+
+The behavior of the `checkResponseElement()` method depends on the type of the second argument that it receives:
+
+  * If it is a Boolean, it checks that an element matching the CSS selector exists.
+  * If it is an integer, it checks that the CSS selector returns this number of results.
+  * If it is a regular expression, it checks that the first element found by the CSS selector matches it.
+  * If it is a regular expression preceded by `!`, it checks that the first element doesn't match the pattern.
+  * For other cases, it compares the first element found by the CSS selector with the second argument as a string.
+
+The method accepts a third optional parameter, in the shape of an associative array. It allows you to have the test performed not on the first element returned by the selector (if it returns several), but on another element at a certain position, as shown in Listing 15-22.
+
+Listing 15-22 - Using the Position Option to Match an Element at a Certain Position
+
+    [php]
+    $b = new sfTestBrowser();
+    $b->initialize();
+    $b->get('/foobar/edit?id=1')->
+        checkResponseElement('form textarea', 'foo')->
+        checkResponseElement('form textarea', 'bar', array('position' => 1));
+
+The options array can also be used to perform two tests at the same time. You can test that there is an element matching a selector and how many there are, as demonstrated in Listing 15-23.
+
+Listing 15-23 - Using the Count Option to Count the Number of Matches
+
+    [php]
+    $b = new sfTestBrowser();
+    $b->initialize();
+    $b->get('/foobar/edit?id=1')->
+        checkResponseElement('form input', true, array('count' => 3));
+
+The selector tool is very powerful. It accepts most of the CSS 2.1 selectors, and you can use it for complex queries such as those of Listing 15-24.
+
+Listing 15-24 - Example of Complex CSS Selectors Accepted by `checkResponseElement()`
+
+    [php]
+    $b->checkResponseElement('ul#list li a[href]', 'click me');
+    $b->checkResponseElement('ul > li', 'click me');
+    $b->checkResponseElement('ul + li', 'click me');
+    $b->checkResponseElement('h1, h2', 'click me');
+    $b->checkResponseElement('a[class$="foo"][href*="bar.html"]', 'my link');
+
+### Working in the Test Environment
+
+The `sfTestBrowser` object uses a special front controller, set to the `test` environment. The default configuration for this environment appears in Listing 15-25.
+
+Listing 15-25 - Default Test Environment Configuration, in `myapp/config/settings.php`
+
+    test:
+      .settings:
+        # E_ALL | E_STRICT & ~E_NOTICE = 2047
+        error_reporting:        2047
+        cache:                  off
+        web_debug:              off
+        no_script_name:         off
+        etag:                   off
+
+The cache and the web debug toolbar are set to `off` in this environment. However, the code execution still leaves traces in a log file, distinct from the `dev` and `prod` log files, so that you can check it independently (`myproject/log/myapp_test.log`). In this environment, the exceptions don't stop the execution of the scripts--so that you can run an entire set of tests even if one fails. You can have specific database connection settings, for instance, to use another database with test data in it.
+
+Before using the `sfTestBrowser` object, you have to initialize it. If you need to, you can specify a hostname for the application and an IP address for the client--that is, if your application makes controls over these two parameters. Listing 15-26 demonstrates how to do this.
+
+Listing 15-26 - Setting Up the Test Browser with Hostname and IP
+
+    [php]
+    $b = new sfTestBrowser();
+    $b->initialize('myapp.example.com', '123.456.789.123');
+
+### The test-functional Task
+
+The `test-functional` task can run one or more functional tests, depending on the number of arguments received. The rules look much like the ones of the `test-unit` task, except that the functional test task always expects an application as first argument, as shown in Listing 15-27.
+
+Listing 15-27 - Functional Test Task Syntax
+
+    // Test directory structure
+    test/
+      functional/
+        frontend/
+          myModuleActionsTest.php
+          myScenarioTest.php
+        backend/
+          myOtherScenarioTest.php
+
+    ## Run all functional tests for one application, recursively
+    > symfony test-functional frontend
+
+    ## Run one given functional test
+    > symfony test-functional frontend myScenario
+
+    ## Run several tests based on a pattern
+    > symfony test-functional frontend my*
+
+Test Naming Practices
+---------------------
+
+This section lists a few good practices to keep your tests organized and easy to maintain. The tips concern file organization, unit tests, and functional tests.
+
+As for the file structure, you should name the unit test files using the class they are supposed to test, and name the functional test files using the module or the scenario they are supposed to test. See Listing 15-28 for an example. Your `test/` directory will soon contain a lot of files, and finding a test might prove difficult in the long run if you don't follow these guidelines.
+
+Listing 15-28 - Example File Naming Practice
+
+    test/
+      unit/
+        myFunctionTest.php
+        mySecondFunctionTest.php
+        foo/
+          barTest.php
+      functional/
+        frontend/
+          myModuleActionsTest.php
+          myScenarioTest.php
+        backend/
+          myOtherScenarioTest.php
+
+For unit tests, a good practice is to group the tests by function or method, and start each test group with a `diag()` call. The messages of each unit test should contain the name of the function or method tested, followed by a verb and a property, so that the test output looks like a sentence describing a property of the object. Listing 15-29 shows an example.
+
+Listing 15-29 - Example Unit Test Naming Practice
+
+    [php]
+    // srttolower()
+    $t->diag('strtolower()');
+    $t->isa_ok(strtolower('Foo'), 'string', 'strtolower() returns a string');
+    $t->is(strtolower('FOO'), 'foo', 'strtolower() transforms the input to lowercase');
+
+    # strtolower()
+    ok 1 - strtolower() returns a string
+    ok 2 - strtolower() transforms the input to lowercase
+
+Functional tests should be grouped by page and start by a request. Listing 15-30 illustrates this practice.
+
+Listing 15-30 - Example Functional Test Naming Practice
+
+    [php]
+    $browser->
+      get('/foobar/index')->
+      isStatusCode(200)->
+      isRequestParameter('module', 'foobar')->
+      isRequestParameter('action', 'index')->
+      checkResponseElement('body', '/foobar/')
+    ;
+
+    # get /comment/index
+    ok 1 - status code is 200
+    ok 2 - request parameter module is foobar
+    ok 3 - request parameter action is index
+    ok 4 - response selector body matches regex /foobar/
+
+If you follow this convention, the output of your test will be clean enough to use as a developer documentation of your project--enough so in some cases to make actual documentation useless.
+
+Special Testing Needs
+---------------------
+
+The unit and functional test tools provided by symfony should suffice in most cases. A few additional techniques are listed here to resolve common problems in automated testing: launching tests in an isolated environment, accessing a database within tests, testing the cache, and testing interactions on the client side.
+
+### Executing Tests in a Test Harness
+
+The `test-unit` and `test-functional` tasks can launch a single test or a set of tests. But if you call these tasks without any parameter, they launch all the unit and functional tests written in the `test/` directory. A particular mechanism is involved to isolate each test file in an independent sandbox, to avoid contamination risks between tests. Furthermore, as it wouldn't make sense to keep the same output as with single test files in that case (the output would be thousands of lines long), the tests results are compacted into a synthetic view. That's why the execution of a large number of test files uses a test harness, that is, an automated test framework with special abilities. A test harness relies on a component of the lime framework called `lime_harness`. It shows a test status file by file, and an overview at the end of the number of tests passed over the total, as you see in Listing 15-31.
+
+Listing 15-31 - Launching All Tests in a Test Harness
+
+    > symfony test-unit
+
+    unit/myFunctionTest.php................ok
+    unit/mySecondFunctionTest.php..........ok
+    unit/foo/barTest.php...................not ok
+
+    Failed Test                     Stat  Total   Fail  List of Failed
+    ------------------------------------------------------------------
+    unit/foo/barTest.php               0      2      2  62 63
+    Failed 1/3 test scripts, 66.66% okay. 2/53 subtests failed, 96.22% okay.
+
+The tests are executed the same way as when you call them one by one, only the output is made shorter to be really useful. In particular, the final chart focuses on the failed tests and helps you locate them.
+
+You can launch all the tests with one call using the `test-all` task, which also uses a test harness, as shown in Listing 15-32. This is something that you should do before every transfer to production, to ensure that no regression has appeared since the latest release.
+
+Listing 15-32 - Launching All the Tests of a Project
+
+    > symfony test-all
+
+### Accessing a Database
+
+Unit tests often need to access a database. A database connection is automatically initialized when you call `sfTestBrowser::get()` for the first time. However, if you want to access the database even before using `sfTestBrowser`, you have to initialize a `sfDabataseManager` object manually, as in Listing 15-33. 
+
+Listing 15-33 - Initializing a Database in a Test
+
+    [php]
+    $databaseManager = new sfDatabaseManager();
+    $databaseManager->initialize();
+    
+    // Optionally, you can retrieve the current database connection
+    $con = Propel::getConnection();
+
+You should populate the database with fixtures before starting the tests. This can be done via the `sfPropelData` object. This object can load data from a file, just like the `propel-load-data` task, or from an array, as shown in Listing 15-34.
+
+Listing 15-34 - Populating a Database from a Test File
+
+    [php]
+    $data = new sfPropelData();
+
+    // Loading data from file
+    $data->loadData(sfConfig::get('sf_data_dir').'/fixtures/test_data.yml');
+
+    // Loading data from array
+    $fixtures = array(
+      'Article' => array(
+        'article_1' => array(
+          'title'      => 'foo title',
+          'body'       => 'bar body',
+          'created_at' => time(),
+        ),
+        'article_2'    => array(
+          'title'      => 'foo foo title',
+          'body'       => 'bar bar body',
+          'created_at' => time(),
+        ),
+      ),
+    );
+    $data->loadDataFromArray($fixtures);
+
+Then, use the Propel objects as you would in a normal application, according to your testing needs. Remember to include their files in unit tests (you can use the sfCore:: sfSimpleAutoloading() method to automate it, as explained in a tip in the "Stubs, Fixtures, and Autoloading" section previously in this chapter). Propel objects are autoloaded in functional tests.
+
+### Testing the Cache
+
+When you enable caching for an application, the functional tests should verify that the cached actions do work as expected.
+
+The first thing to do is enable cache for the test environment (in the `settings.yml` file). Then, if you want to test whether a page comes from the cache or whether it is generated, you should use the `isCached()` test method provided by the `sfTestBrowser` object. Listing 15-35 demonstrates this method.
+
+Listing 15-35 - Testing the Cache with the `isCached()` Method
+
+    [php]
+    <?php
+
+    include(dirname(__FILE__).'/../../bootstrap/functional.php');
+
+    // Create a new test browser
+    $b = new sfTestBrowser();
+    $b->initialize();
+
+    $b->get('/mymodule');
+    $b->isCached(true);       // Checks that the response comes from the cache
+    $b->isCached(true, true); // Checks that the cached response comes with layout
+    $b->isCached(false);      // Checks that the response doesn't come from the cache
+
+>**NOTE**
+>You don't need to clear the cache at the beginning of a functional test; the bootstrap script does it for you.
+
+### Testing Interactions on the Client
+
+The main drawback of the techniques described previously is that they cannot simulate JavaScript. For very complex interactions, like with Ajax interactions for instance, you need to be able to reproduce exactly the mouse and keyboard input that a user would do and execute scripts on the client side. Usually, these tests are reproduced by hand, but they are very time consuming and prone to error.
+
+The solution is called Selenium ([http://www.openqa.org/selenium/](http://www.openqa.org/selenium/)), which is a test framework written entirely in JavaScript. It executes a set of actions on a page just like a regular user would, using the current browser window. The advantage over the `sfBrowser` object is that Selenium is capable of executing JavaScript in a page, so you can test even Ajax interactions with it.
+
+Selenium is not bundled with symfony by default. To install it, you need to create a new `selenium/` directory in your `web/` directory, and in it unpack the content of the Selenium archive ([http://www.openqa.org/selenium-core/download.action](http://www.openqa.org/selenium-core/download.action)). This is because Selenium relies on JavaScript, and the security settings standard in most browsers wouldn't allow it to run unless it is available on the same host and port as your application.
+
+>**CAUTION**
+>Be careful not to transfer the `selenium/` directory to your production server, since it would be accessible by anyone having access to your web document root via the browser.
+
+Selenium tests are written in HTML and stored in the `web/selenium/tests/` directory. For instance, Listing 15-36 shows a functional test where the home page is loaded, the link click me is clicked, and the text "Hello, World" is looked for in the response. Remember that in order to access the application in the `test` environment, you have to specify the `myapp_test.php` front controller.
+
+Listing 15-36 - A Sample Selenium Test, in `web/selenium/test/testIndex.html`
+
+    [php]
+    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+    <html>
+    <head>
+      <meta content="text/html; charset=UTF-8" http-equiv="content-type">
+      <title>Index tests</title>
+    </head>
+    <body>
+    <table cellspacing="0">
+    <tbody>
+      <tr><td colspan="3">First step</td></tr>
+      <tr><td>open</td>              <td>/myapp_test.php/</td> <td>&nbsp;</td></tr>
+      <tr><td>clickAndWait</td>      <td>link=click me</td>    <td>&nbsp;</td></tr>
+      <tr><td>assertTextPresent</td> <td>Hello, World!</td>    <td>&nbsp;</td></tr>
+    </tbody>
+    </table>
+    </body>
+    </html>
+
+A test case is represented by an HTML document containing a table with three columns: command, target, and value. Not all commands take a value, however. In this case, either leave the column blank or use `&nbsp;` to make the table look better. Refer to the Selenium website for a complete list of commands.
+
+You also need to add this test to the global test suite by inserting a new line in the table of the `TestSuite.html` file, located in the same directory. Listing 15-37 shows how.
+
+Listing 15-37 - Adding a Test File to the Test Suite, in `web/selenium/test/TestSuite.html`
+
+    ...
+    <tr><td><a href='./testIndex.html'>My First Test</a></td></tr>
+    ...
+
+To run the test, simply browse to
+
+    http://myapp.example.com/selenium/index.html
+
+Select Main Test Suite, click the button to run all tests, and watch your browser as it reproduces the steps that you have told it to do.
+
+>**NOTE**
+>As Selenium tests run in a real browser, they also allow you to test browser inconsistencies. Build your test with one browser, and test them on all the others on which your site is supposed to work with a single request.
+
+The fact that Selenium tests are written in HTML could make the writing of Selenium tests a hassle. But thanks to the Firefox Selenium extension ([http://seleniumrecorder.mozdev.org/](http://seleniumrecorder.mozdev.org/)), all it takes to create a test is to execute the test once in a recorded session. While navigating in a recording session, you can add assert-type tests by right-clicking in the browser window and selecting the appropriate check under Append Selenium Command in the pop-up menu.
+
+You can save the test to an HTML file to build a test suite for your application. The Firefox extension even allows you to run the Selenium tests that you have recorded with it.
+
+>**NOTE**
+>Don't forget to reinitialize the test data before launching the Selenium test.
+
+Summary
+-------
+
+Automated tests include unit tests to validate methods or functions and functional tests to validate features. Symfony relies on the lime testing framework for unit tests and provides an `sfTestBrowser` class especially for functional tests. They both provide many assertion methods, from basic to the most advanced, like CSS selectors. Use the symfony command line to launch tests, either one by one (with the `test-unit` and `test-functional` tasks) or in a test harness (with the `test-all` task). When dealing with data, automated tests use fixtures and stubs, and this is easily achieved within symfony unit tests.
+
+If you make sure to write enough unit tests to cover a large part of your applications (maybe using the TDD methodology), you will feel safer when refactoring internals or adding new features, and you may even gain some time on the documentation task.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/16-Application-Management-Tools.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/16-Application-Management-Tools.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/16-Application-Management-Tools.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,581 @@
+Chapter 16 - Application Management Tools
+=========================================
+
+During both the development and deployment phases, developers require a consistent stream of diagnostic information in order to determine whether the application is working as intended. This information is generally aggregated through logging and debugging utilities. Because of the central role frameworks, such as symfony, play in driving applications, it's crucial that such capabilities are tightly integrated to ensure efficient developmental and operational activities.
+
+During the life of an application on the production server, the application administrator repeats a large number of tasks, from log rotation to upgrades. A framework must also provide tools to automate these tasks as much as possible.
+
+This chapter explains how symfony application management tools can answer all these needs.
+
+Logging
+-------
+
+The only way to understand what went wrong during the execution of a request is to review a trace of the execution process. Fortunately, as you'll learn in this section, both PHP and symfony tend to log large amounts of this sort of data.
+
+### PHP Logs
+
+PHP has an `error_reporting` parameter, defined in `php.ini`, that specifies which PHP events are logged. Symfony allows you to override this value, per application and environment, in the `settings.yml` file, as shown in Listing 16-1.
+
+Listing 16-1 - Setting the Error Reporting Level, in `myapp/config/settings.yml`
+
+    prod:
+     .settings:
+        error_reporting:  257
+
+    dev:
+      .settings:
+        error_reporting:  4095
+
+The numbers are a short way of writing error levels (refer to the PHP documentation on error reporting for more details). Basically, `4095` is a shortcut for `E_ALL | E_STRICT`, and `257` stands for `E_ERROR | E_USER_ERROR` (the default value for every new environment).
+
+In order to avoid performance issues in the production environment, the server logs only the critical PHP errors. However, in the development environment, all types of events are logged, so that the developer can have all the information necessary to trace errors.
+
+The location of the PHP log files depends on your `php.ini` configuration. If you never bothered about defining this location, PHP probably uses the logging facilities provided by your web server (such as the Apache error logs). In this case, you will find the PHP logs under the web server log directory.
+
+### Symfony Logs
+
+In addition to the standard PHP logs, symfony can log a lot of custom events. You can find all the symfony logs under the `myproject/log/` directory. There is one file per application and per environment. For instance, the development environment log file of the `myapp` application is named `myapp_dev.log`, the production one is named `myapp_prod.log`, and so on.
+
+If you have a symfony application running, take a look at its log files. The syntax is very simple. For every event, one line is added to the log file of the application. Each line includes the exact time of the event, the nature of the event, the object being processed, and any additional relevant details. Listing 16-2 shows an example of symfony log file content.
+
+Listing 16-2 - Sample Symfony Log File Content, in `log/myapp_dev.php`
+
+    Nov 15 16:30:25 symfony [info ] {sfAction} call "barActions->executemessages()"
+    Nov 15 16:30:25 symfony [debug] SELECT bd_message.ID, bd_message.SENDER_ID, bd_...
+    Nov 15 16:30:25 symfony [info ] {sfCreole} executeQuery(): SELECT bd_message.ID...
+    Nov 15 16:30:25 symfony [info ] {sfView} set slot "leftbar" (bar/index)
+    Nov 15 16:30:25 symfony [info ] {sfView} set slot "messageblock" (bar/mes...
+    Nov 15 16:30:25 symfony [info ] {sfView} execute view for template "messa...
+    Nov 15 16:30:25 symfony [info ] {sfView} render "/home/production/myproject/...
+    Nov 15 16:30:25 symfony [info ] {sfView} render to client
+
+You can find many details in these files, including the actual SQL queries sent to the database, the templates called, the chain of calls between objects, and so on.
+
+#### Symfony Log Level Configuration
+
+There are eight levels of symfony log messages: `emerg`, `alert`, `crit`, `err`, `warning`, `notice`, `info`, and `debug`, which are the same as the `PEAR::Log` package ([http://pear.php.net/package/Log/](http://pear.php.net/package/Log/)) levels. You can configure the maximum level to be logged in each environment in the `logging.yml` configuration file of each application, as demonstrated in Listing 16-3.
+
+Listing 16-3 - Default Logging Configuration, in `myapp/config/logging.yml`
+
+    prod:
+      enabled: off
+      level:   err
+      rotate:  on
+      purge:   off
+
+    dev:
+
+    test:
+
+    #all:
+    #  enabled:  on
+    #  level:    debug
+    #  rotate:   off
+    #  period:   7
+    #  history:  10
+    #  purge:    on
+
+By default, in all environments except the production environment, all the messages are logged (up to the least important level, the `debug` level). In the production environment, logging is disabled by default; if you change `enabled` to `on`, only the most important messages (from `crit` to `emerg`) appear in the logs.
+
+You can change the logging level in the `logging.yml` file for each environment to limit the type of logged messages. The `rotate`, `period`, `history`, and `purge` settings are described in the upcoming "Purging and Rotating Log Files" section.
+
+>**TIP**
+>The values of the logging parameters are accessible during execution through the `sfConfig` object with the `sf_logging_` prefix. For instance, to see if logging is enabled, call `sfConfig::get('sf_ logging_enabled')`.
+
+#### Adding a Log Message
+
+You can manually add a message in the symfony log file from your code by using one of the techniques described in Listing 16-4.
+
+Listing 16-4 - Adding a Custom Log Message
+
+    [php]
+    // From an action
+    $this->logMessage($message, $level);
+
+    // From a template
+    <?php use_helper('Debug') ?>
+    <?php log_message($message, $level) ?>
+
+`$level` can have the same values as in the log messages.
+
+Alternatively, to write a message in the log from anywhere in your application, use the `sfLogger` methods directly, as shown in Listing 16-5. The available methods bear the same names as the log levels.
+
+Listing 16-5 - Adding a Custom Log Message from Anywhere
+
+    [php]
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      sfContext::getInstance()->getLogger()->info($message);
+    }
+
+>**SIDEBAR**
+>Customizing the logging
+>
+>Symfony's logging system is very simple, yet it is also easy to customize. You can specify your own logging object by calling `sfLogger::getInstance()->registerLogger()`. For instance, if you want to use `PEAR::Log`, just add the following to your application's `config.php`:
+>
+>     [php]
+>     require_once('Log.php');
+>     $log = Log::singleton('error_log', PEAR_LOG_TYPE_SYSTEM, 'symfony');
+>     sfLogger::getInstance()->registerLogger($log);
+>
+>If you want to register your own logger class, the only prerequisite is that it must define a `log()` method. Symfony calls this method with two parameters: `$message` (the message to be logged) and `$priority` (the level).
+
+#### Purging and Rotating Log Files
+
+Don't forget to periodically purge the `log/` directory of your applications, because these files have the strange habit of growing by several megabytes in a few days, depending, of course, on your traffic. Symfony provides a special `log-purge` task for this purpose, which you can launch regularly by hand or put in a cron table. For example, the following command erases the symfony log files in applications and environments where the logging.yml file specifies purge: on (which is the default value):
+
+    > symfony log-purge
+
+For both better performance and security, you probably want to store symfony logs in several small files instead of one single large file. The ideal storage strategy for log files is to back up and empty the main log file regularly, but to keep only a limited number of backups. You can enable such a log rotation and specify the parameters in `logging.yml`. For instance, with a `period` of `7` days and a `history` (number of backups) of `10`, as shown in Listing 16-6, you would work with one active log file plus ten backup files containing seven days' worth of history each. Whenever the next period of seven days ends, the current active log file goes into backup, and the oldest backup is erased.
+
+Listing 16-6 - Configuring Log Rotation, in `myapp/config/logging.yml`
+
+    prod:
+      rotate:  on
+      period:  7       ## Log files are rotated every 7 days by default
+      history: 10      ## A maximum history of 10 log files is kept
+
+To execute the log rotation, periodically execute the `log-rotate` task. This task only purges files for which `rotate` is `on`. You can specify a single application and environment when calling the task:
+
+    > symfony log-rotate myapp prod
+
+The backup log files are stored in the `logs/history/` directory and suffixed with the date they were saved.
+
+Debugging
+---------
+
+No matter how proficient a coder you are, you will eventually make mistakes, even if you use symfony. Detecting and understanding errors is one of the keys of fast application development. Fortunately, symfony provides several debug tools for the developer.
+
+### Symfony Debug Mode
+
+Symfony has a debug mode that facilitates application development and debugging. When it is on, the following happens:
+
+  * The configuration is checked at each request, so a change in any of the configuration files has an immediate effect, without any need to clear the configuration cache.
+  * The error messages display the full stack trace in a clear and useful way, so that you can more efficiently find the faulty element.
+  * More debug tools are available (such as the detail of database queries).
+  * The Propel debug mode is also activated, so any error in a call to a Propel object will display a detailed chain of calls through the Propel architecture.
+
+On the other hand, when the debug mode is off, processing is handled as follows:
+
+  * The YAML configuration files are parsed only once, then transformed into PHP files stored in the `cache/config/` folder. Every request after the first one ignores the YAML files and uses the cached configuration instead. As a consequence, the processing of requests is much faster.
+  * To allow a reprocessing of the configuration, you must manually clear the configuration cache.
+  * An error during the processing of the request returns a response with code 500 (Internal Server Error), without any explanation of the internal cause of the problem.
+
+The debug mode is activated per application in the front controller. It is controlled by the value of the `SF_DEBUG` constant, as shown in Listing 16-7.
+
+Listing 16-7 - Sample Front Controller with Debug Mode On, in `web/myapp_dev.php`
+
+    [php]
+    <?php
+
+    define('SF_ROOT_DIR',    realpath(dirname(__FILE__).'/..'));
+    define('SF_APP',         'myapp');
+    define('SF_ENVIRONMENT', 'dev');
+    define('SF_DEBUG',       true);
+
+    require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
+
+    sfContext::getInstance()->getController()->dispatch();
+
+>**CAUTION**
+>In your production server, you should not activate the debug mode nor leave any front controller with debug mode on available. Not only will the debug mode slow down the page delivery, but it may also reveal the internals of your application. Even though the debug tools never reveal database connection information, the stack trace of exceptions is full of dangerous information for any ill-intentioned visitor.
+
+### Symfony Exceptions
+
+When an exception occurs in the debug mode, symfony displays a useful exception notice that contains everything you need to find the cause of the problem.
+
+The exception messages are clearly written and refer to the most probable cause of the problem. They often provide possible solutions to fix the problem, and for most common problems, the exception pages even contain a link to a symfony website page with more details about the exception. The exception page shows where the error occurred in the PHP code (with syntax highlighting), together with the full stack of method calls, as shown in Figure 16-1. You can follow the trace to the first call that caused the problem. The arguments that were passed to the methods are also shown.
+
+>**NOTE**
+>Symfony really relies on PHP exceptions for error reporting, which is much better than the way PHP 4 applications work. For instance, the 404 error can be triggered by an `sfError404Exception`.
+
+Figure 16-1 - Sample exception message for a symfony application
+
+![Sample exception message for a symfony application](/images/book/F1601.png "Sample exception message for a symfony application")
+
+During the development phase, the symfony exceptions will be of great use as you debug your application.
+
+### Xdebug Extension
+
+The Xdebug PHP extension ([http://xdebug.org/](http://xdebug.org/)) allows you to extend the amount of information that is logged by the web server. Symfony integrates the Xdebug messages in its own debug feedback, so it is a good idea to activate this extension when you debug the application. The extension installation depends very much on your platform; refer to the Xdebug website for detailed installation guidelines. Once Xdebug is installed, you need to activate it manually in your `php.ini` file after installation. For *nix platforms, this is done by adding the following line:
+
+    zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20041030/xdebug.so"
+
+For Windows platforms, the Xdebug activation is triggered by this line:
+
+    extension=php_xdebug.dll
+
+Listing 16-8 gives an example of Xdebug configuration, which must also be added to the `php.ini` file.
+
+Listing 16-8 - Sample Xdebug Configuration
+
+    ;xdebug.profiler_enable=1
+    ;xdebug.profiler_output_dir="/tmp/xdebug"
+    xdebug.auto_trace=1             ; enable tracing
+    xdebug.trace_format=0
+    ;xdebug.show_mem_delta=0        ; memory difference
+    ;xdebug.show_local_vars=1
+    ;xdebug.max_nesting_level=100
+
+You must restart your web server for the Xdebug mode to be activated.
+
+>**CAUTION**
+>Don't forget to deactivate Xdebug mode in your production platform. Not doing so will slow down the execution of every page a lot.
+
+### Web Debug Toolbar
+
+The log files contain interesting information, but they are not very easy to read. The most basic task, which is to find the lines logged for a particular request, can be quite tricky if you have several users simultaneously using an application and a long history of events. That's when you start to need a web debug toolbar.
+
+This toolbar appears as a semitransparent box superimposed over the normal content in the browser, in the top-right corner of the window, as shown in Figure 16-2. It gives access to the symfony log events, the current configuration, the properties of the request and response objects, the details of the database queries issued by the request, and a chart of processing times related to the request.
+
+Figure 16-2 - The web debug toolbar appears in the top-right corner of the window
+
+![The web debug toolbar appears in the top-right corner of the window](/images/book/F1602.jpg "The web debug toolbar appears in the top-right corner of the window")
+
+The color of the debug toolbar background depends on the highest level of log message issued during the request. If no message passes the `debug` level, the toolbar has a gray background. If a single message reaches the `err` level, the toolbar has a red background.
+
+>**NOTE**
+>Don't confuse the debug mode with the web debug toolbar. The debug toolbar can be displayed even when the debug mode if off, although, in that case, it displays much less information.
+
+To activate the web debug toolbar for an application, open the `settings.yml` file and look for the `web_debug` key. In the `prod` and `test` environments, the default value for `web_debug` is `off`, so you need to activate it manually if you want it. In the `dev` environment, the default configuration has it set to `on`, as shown in Listing 16-9.
+
+Listing 16-9 - Web Debug Toolbar Activation, in `myapp/config/settings.yml`
+
+    dev:
+      .settings:
+        web_debug:              on
+
+When displayed, the web debug toolbar offers a lot of information/interaction:
+
+  * Click the symfony logo to toggle the visibility of the toolbar. When reduced, the toolbar doesn't hide the elements located at the top of the page.
+  * Click the vars & config section to show the details of the request, response, settings, globals, and PHP properties, as shown in Figure 16-3. The top line sums up the important configuration settings, such as the debug mode, the cache, and the presence of a PHP accelerator (they appear in red if they are deactivated and in green if they are activated).
+
+Figure 16-3 - The vars & config section shows all the variables and constants of the request
+
+![The vars & config section shows all the variables and constants of the request](/images/book/F1603.png "The vars & config section shows all the variables and constants of the request")
+
+  * When the cache is enabled, a green arrow appears in the toolbar. Click this arrow to reprocess the page, regardless of what is stored in the cache (but the cache is not cleared).
+  * Click the logs & msgs section to reveal the log messages for the current request, as shown in Figure 16-4. According to the importance of the events, they are displayed in gray, yellow, or red lines. You can filter the events that are displayed by category using the links displayed at the top of the list.
+
+Figure 16-4 - The logs & msgs section shows the log messages for the current request
+
+![The logs & msgs section shows the log messages for the current request](/images/book/F1604.png "The logs & msgs section shows the log messages for the current request")
+
+>**NOTE**
+>When the current action results from a redirect, only the logs of the latest request are present in the logs & msgs pane, so the log files are still indispensable for good debugging.
+
+  * For requests executing SQL queries, a database icon appears in the toolbar. Click it to see the detail of the queries, as shown in Figure 16-5.
+  * To the right of a clock icon is the total time necessary to process the request. Be aware that the web debug toolbar and the debug mode slow down the request execution, so try to refrain from considering the timings per se, and pay attention to only the differences between the execution time of two pages. Click the clock icon to see details of the processing time category by category, as shown in Figure 16-6. Symfony displays the time spent on specific parts of the request processing. Only the times related to the current request make sense for an optimization, so the time spent in the symfony core is not displayed. That's why these times don't sum up to the total time.
+  * Click the red x at the right end of the toolbar to hide the toolbar.
+
+Figure 16-5 - The database queries section shows queries executed for the current request
+
+![The database queries section shows queries executed for the current request](/images/book/F1605.png "The database queries section shows queries executed for the current request")
+
+Figure 16-6 - The clock icon shows execution time by category
+
+![The clock icon shows execution time by category](/images/book/F1606.png "The clock icon shows execution time by category")
+
+>**SIDEBAR**
+>Adding your own timer
+>
+>Symfony uses the `sfTimer` class to calculate the time spent on the configuration, the model, the action, and the view. Using the same object, you can time a custom process and display the result with the other timers in the web debug toolbar. This can be very useful when you work on performance optimizations.
+>
+>To initialize timing on a specific fragment of code, call the `getTimer()` method. It will return an sfTimer object and start the timing. Call the `addTime()` method on this object to stop the timing. The elapsed time is available through the `getElapsedTime()` method, and displayed in the web debug toolbar with the others.
+>
+>     [php]
+>     // Initialize the timer and start timing
+>     $timer = sfTimerManager::getTimer('myTimer');
+>
+>     // Do things
+>     ...
+>
+>     // Stop the timer and add the elapsed time
+>     $timer->addTime();
+>
+>     // Get the result (and stop the timer if not already stopped)
+>     $elapsedTime = $timer->getElapsedTime();
+>
+>The benefit of giving a name to each timer is that you can call it several times to accumulate timings. For instance, if the `myTimer` timer is used in a utility method that is called twice per request, the second call to the `getTimer('myTimer')` method will restart the timing from the point calculated when `addTime()` was last called, so the timing will add up to the previous one. Calling `getCalls()` on the timer object will give you the number of times the timer was launched, and this data is also displayed in the web debug toolbar.
+>
+>     [php]
+>     // Get the number of calls to the timer
+>     $nbCalls = $timer->getCalls();
+>
+>In Xdebug mode, the log messages are much richer. All the PHP script files and the functions that are called are logged, and symfony knows how to link this information with its internal log. Each line of the log messages table has a double-arrow button, which you can click to see further details about the related request. If something goes wrong, the Xdebug mode gives you the maximum amount of detail to find out why.
+
+>**NOTE**
+>The web debug toolbar is not included by default in Ajax responses and documents that have a non-HTML content-type. For the other pages, you can disable the web debug toolbar manually from within an action by simply calling `sfConfig::set('sf_web_debug', false)`.
+
+### Manual Debugging
+
+Getting access to the framework debug messages is nice, but being able to log your own messages is better. Symfony provides shortcuts, accessible from both actions and templates, to help you trace events and/or values during request execution.
+
+Your custom log messages appear in the symfony log file as well as in the web debug toolbar, just like regular events. (Listing 16-4 gave an example of the custom log message syntax.) A custom message is a good way to check the value of a variable from a template, for instance. Listing 16-10 shows how to use the web debug toolbar for developer's feedback from a template (you can also use `$this->logMessage()` from an action).
+
+Listing 16-10 - Inserting a Message in the Log for Debugging Purposes
+
+    [php]
+    <?php use_helper('Debug') ?>
+    ...
+    <?php if ($problem): ?>
+      <?php log_message('{sfAction} been there', 'err') ?>
+      ...
+    <?php endif ?>
+
+The use of the `err` level guarantees that the event will be clearly visible in the list of messages, as shown in Figure 16-7.
+
+Figure 16-7 - A custom log message appears in the logs & msgs section of the web debug toolbar
+
+![A custom log message appears in the logs & msgs section of the web debug toolbar](/images/book/F1607.png "A custom log message appears in the logs & msgs section of the web debug toolbar")
+
+If you don't want to add a line to the log, but just trace a short message or a value, you should use `debug_message` instead of `log_message`. This action method (a helper with the same name also exists) displays a message in the web debug toolbar, on top of the logs & msgs section. Check Listing 16-11 for an example of using the debug message writer.
+
+Listing 16-11 - Inserting a Message in the Debug Toolbar
+
+    [php]
+    // From an action
+    $this->debugMessage($message);
+
+    // From a template
+    <?php use_helper('Debug') ?>
+    <?php debug_message($message) ?>
+
+Populating a Database
+---------------------
+
+In the process of application development, developers are often faced with the problem of database population. A few specific solutions exist for some database systems, but none can be used on top of the object-relational mapping. Thanks to YAML and the `sfPropelData` object, symfony can automatically transfer data from a text source to a database. Although writing a text file source for data may seem like more work than entering the records by hand using a CRUD interface, it will save you time in the long run. You will find this feature very useful for automatically storing and populating the test data for your application.
+
+### Fixture File Syntax
+
+Symfony can read data files that follow a very simple YAML syntax, provided that they are located under the `data/fixtures/` directory. Fixture files are organized by class, each class section being introduced by the class name as a header. For each class, records labeled with a unique string are defined by a set of `fieldname: value` pairs. Listing 16-12 shows an example of a data file for database population.
+
+Listing 16-12 - Sample Fixture File, in `data/fixtures/import_data.yml`
+
+    Article:                             ## Insert records in the blog_article table
+      first_post:                        ## First record label
+        title:       My first memories
+        content: |
+          For a long time I used to go to bed early. Sometimes, when I had put
+          out my candle, my eyes would close so quickly that I had not even time
+          to say "I'm going to sleep."
+
+      second_post:                       ## Second record label
+        title:       Things got worse
+        content: |
+          Sometimes he hoped that she would die, painlessly, in some accident,
+          she who was out of doors in the streets, crossing busy thoroughfares,
+          from morning to night.
+
+Symfony translates the column keys into setter methods by using a camelCase converter (`setTitle()`, `setContent()`). This means that you can define a `password` key even if the actual table doesn't have a `password` field--just define a `setPassword()` method in the `User` object, and you can populate other columns based on the password (for instance, a hashed version of the password).
+
+The primary key column doesn't need to be defined. Since it is an auto-increment field, the database layer knows how to determine it.
+
+The `created_at` columns don't need to be set either, because symfony knows that fields named that way must be set to the current system time when created.
+
+### Launching the Import
+
+The `propel-load-data` task imports data from a YAML file to a database. The connection settings come from the `databases.yml` file, and therefore need an application name to run. Optionally, you can specify an environment name (`dev` by default).
+
+    > symfony propel-load-data frontend
+
+This command reads all the YAML fixture files from the `data/fixtures/` directory and inserts the records into the database. By default, it replaces the existing database content, but if the last argument call is `append`, the command will not erase the current data.
+
+    > symfony propel-load-data frontend append
+
+You can specify another fixture file or directory in the call. In this case, add a path relative to the project `data/` directory.
+
+    > symfony propel-load-data frontend myfixtures/myfile.yml
+
+### Using Linked Tables
+
+You now know how to add records to a single table, but how do you add records with foreign keys to another table? Since the primary key is not included in the fixtures data, you need an alternative way to relate records to one another.
+
+Let's return to the example in Chapter 8, where a blog_article table is linked to a `blog_comment` table, as shown in Figure 16-8.
+
+Figure 16-8 - A sample database relational model
+
+![A sample database relational model](/images/book/F1608.png "A sample database relational model")
+
+This is where the labels given to the records become really useful. To add a `Comment` field to the `first_post` article, you simply need to append the lines shown in Listing 16-13 to the `import_data.yml` data file.
+
+Listing 16-13 - Adding a Record to a Related Table, in `data/fixtures/import_data.yml`
+
+    Comment:
+      first_comment:
+        article_id:   first_post
+        author:       Anonymous
+        content:      Your prose is too verbose. Write shorter sentences.
+
+The `propel-load-data` task will recognize the label that you gave to an article previously in `import_data.yml`, and grab the primary key of the corresponding `Article` record to set the `article_id` field. You don't even see the IDs of the records; you just link them by their labels--it couldn't be simpler.
+
+The only constraint for linked records is that the objects called in a foreign key must be defined earlier in the file; that is, as you would do if you defined them one by one. The data files are parsed from the top to the bottom, and the order in which the records are written is important.
+
+One data file can contain declarations of several classes. But if you need to insert a lot of data for many different tables, your fixture file might get too long to be easily manipulated.
+
+The `propel-load-data` task parses all the files it finds in the `fixtures/` directory, so nothing prevents you from splitting a YAML fixture file into smaller pieces. The important thing to keep in mind is that foreign keys impose a processing order for the tables. To make sure that they are parsed in the correct order, prefix the files with an ordinal number.
+
+    100_article_import_data.yml
+    200_comment_import_data.yml
+    300_rating_import_data.yml
+
+Deploying Applications
+----------------------
+
+Symfony offers shorthand commands to synchronize two versions of a website. These commands are mostly used to deploy a website from a development server to a final host, connected to the Internet.
+
+### Freezing a Project for FTP Transfer
+
+The most common way to deploy a project to production is to transfer all its files by FTP (or SFTP). However, symfony projects use the symfony libraries, and unless you develop in a sandbox (which is not recommended), or if the symfony `lib/` and `data/` directories are linked by `svn:externals`, these libraries are not in the project directory. Whether you use a PEAR installation or symbolic links, reproducing the same file structure in production can be time-consuming and tricky.
+
+That's why symfony provides a utility to "freeze" a project--to copy all the necessary symfony libraries into the project `data/`, `lib/`, and `web/` directories. The project then becomes a kind of sandbox, an independent, stand-alone application.
+
+    > symfony freeze
+
+Once a project is frozen, you can transfer the project directory into production, and it will work without any need for PEAR, symbolic links, or whatever else.
+
+>**TIP**
+>Various frozen projects can work on the same server with different versions of symfony without any problems.
+
+To revert a project to its initial state, use the `unfreeze` task. It erases the `data/symfony/`, `lib/symfony/`, and `web/sf/` directories.
+
+    > symfony unfreeze
+
+Note that if you had symbolic links to a symfony installation prior to the freeze, symfony will remember them and re-create the symbolic links in the original location.
+
+### Using rsync for Incremental File Transfer
+
+Sending the root project directory by FTP is fine for the first transfer, but when you need to upload an update of your application, where only a few files have changed, FTP is not ideal. You need to either transfer the whole project again, which is a waste of time and bandwidth, or browse to the directories where you know that some files changed, and transfer only the ones with different modification dates. That's a time-consuming job, and it is prone to error. In addition, the website can be unavailable or buggy during the time of the transfer.
+
+The solution that is supported by symfony is rsync synchronization through an SSH layer. Rsync ([http://samba.anu.edu.au/rsync/](http://samba.anu.edu.au/rsync/)) is a command-line utility that provides fast incremental file transfer, and it's open source. With incremental transfer, only the modified data will be sent. If a file didn't change, it won't be sent to the host. If a file changed only partially, just the differential will be sent. The major advantage is that rsync synchronizations transfer only a small amount of data and are very fast.
+
+Symfony adds SSH on top of rsync to secure the data transfer. More and more commercial hosts support an SSH tunnel to secure file uploads on their servers, and that's a good practice to avoid security breaches.
+
+The SSH client called by symfony uses connection settings from the `config/properties.ini` file. Listing 16-14 gives an example of connection settings for a production server. Write the settings of your own production server in this file before any synchronization. You can also define a single parameters setting to provide your own rsync command line parameters.
+
+Listing 16-14 - Sample Connection Settings for a Server Synchronization, in `myproject/config/properties.ini`
+
+    [symfony]
+      name=myproject
+
+    [production]
+      host=myapp.example.com
+      port=22
+      user=myuser
+      dir=/home/myaccount/myproject/
+
+>**NOTE**
+>Don't confuse the production server (the host server, as defined in the `properties.ini` file of the project) with the production environment (the front controller and configuration used in production, as referred to in the configuration files of an application).
+
+Doing an rsync over SSH requires several commands, and synchronization can occur a lot of times in the life of an application. Fortunately, symfony automates this process with just one command:
+
+    > symfony sync production
+
+This command launches the rsync command in dry mode; that is, it shows which files must be synchronized but doesn't actually synchronize them. If you want the synchronization to be done, you need to request it explicitly by adding `go`.
+
+    > symfony sync production go
+
+Don't forget to clear the cache in the production server after synchronization.
+
+>**TIP**
+>Sometimes bugs appear in production that didn't exist in development. In 90% of the cases, this is due to differences in versions (of PHP, web server, or database) or in configurations. To avoid unpleasant surprises, you should define the target PHP configuration in the `php.yml` file of your application, so that it checks that the development environment applies the same settings. Refer to Chapter 19 for more information about this configuration file.
+
+-
+
+>**SIDEBAR**
+>Is your application finished?
+>
+>Before sending your application to production, you should make sure that it is ready for a public use. Check that the following items are done before actually deciding to deploy the application:
+>
+>The error pages should be customized to the look and feel of your application. Refer to Chapter 19 to see how to customize the error 500, error 404, and security pages, and to the "Managing a Production Application" section in this chapter to see how to customize the pages displayed when your site is not available.
+>
+>The `default` module should be removed from the `enabled_modules` array in the `settings.yml`, so that no symfony page appear by mistake.
+>
+>The session-handling mechanism uses a cookie on the client side, and this cookie is called `symfony` by default. Before deploying your application, you should probably rename it to avoid disclosing the fact that your application uses symfony. Refer to Chapter 6 to see how to customize the cookie name in the `factories.yml` file.
+>
+>The `robots.txt` file, located in the project's `web/` directory, is empty by default. You should customize it to inform web spiders and other web robots about which parts of a website they can browse and which they should avoid. Most of the time, this file is used to exclude certain URL spaces from being indexed--for instance, resource-intensive pages, pages that don't need indexing (such as bug archives), or infinite URL spaces in which robots could get trapped.
+>
+>Modern browsers request a `favicon.ico` file when a user first browses to your application, to represent the application with an icon in the address bar and bookmarks folder. Providing such a file will not only make your application's look and feel complete, but it will also prevent a lot of 404 errors from appearing in your server logs.
+
+### Ignoring Irrelevant Files
+
+If you synchronize your symfony project with a production host, a few files and directories should not be transferred:
+
+  * All the version control directories (`.svn/`, `CVS/`, and so on) and their content are necessary only for development and integration.
+  * The front controller for the development environment must not be available to the final users. The debugging and logging tools available when using the application through this front controller slow down the application and give information about the core variables of your actions. It is something to keep away from the public.
+  * The `cache/` and `log/` directories of a project must not be erased in the host server each time you do a synchronization. These directories must be ignored as well. If you have a `stats/` directory, it should probably be treated the same way.
+  * The files uploaded by users should not be transferred. One of the good practices of symfony projects is to store the uploaded files in the `web/uploads/` directory. This allows you to exclude all these files from the synchronization by pointing to only one directory.
+
+To exclude files from rsync synchronizations, open and edit the `rsync_exclude.txt` file under the `myproject/config/` directory. Each line can contain a file, a directory, or a pattern. The symfony file structure is organized logically, and designed to minimize the number of files or directories to exclude manually from the synchronization. See Listing 16-15 for an example.
+
+Listing 16-15 - Sample rsync Exclusion Settings, in `myproject/config/rsync_exclude.txt`
+
+    .svn
+    /cache/*
+    /log/*
+    /stats/*
+    /web/uploads/*
+    /web/myapp_dev.php
+
+>**NOTE**
+>The `cache/` and `log/` directories must not be synchronized with the development server, but they must at least exist in the production server. Create them by hand if the `myproject/` project tree structure doesn't contain them.
+
+### Managing a Production Application
+
+The command that is used most often in production servers is `clear-cache`. You must run it every time you upgrade symfony or your project (for instance, after calling the `sync` task), and every time you change the configuration in production.
+
+    > symfony clear-cache
+
+>**TIP**
+>If the command-line interface is not available in your production server, you can still clear the cache manually by erasing the contents of the `cache/` folder.
+
+You can temporarily disable your application--for instance, when you need to upgrade a library or a large amount of data.
+
+    > symfony disable APPLICATION_NAME ENVIRONMENT_NAME
+
+By default, a disabled application displays the `default/unavailable` action (stored in the framework), but you can customize the module and action to be used in this case in the `settings.yml` file. Listing 16-16 shows an example.
+
+Listing 16-16 - Setting the Action to Execute for an Unavailable Application, in `myapp/config/settings.yml`
+
+    all:
+      .settings:
+        unavailable_module:     mymodule
+        unavailable_action:     maintenance
+
+The `enable` task reenables the application and clears the cache.
+
+    > symfony enable APPLICATION_NAME ENVIRONMENT_NAME
+
+>**SIDEBAR**
+>Displaying an unavailable page when clearing the cache
+>
+>If you set the `check_lock` parameter to `on` in the `settings.yml` file, symfony will lock the application when the cache is being cleared, and all the requests arriving before the cache is finally cleared are then redirected to a page saying that the application is temporarily unavailable. If the cache is large, the delay to clear it may be longer than a few milliseconds, and if your site's traffic is high, this is a recommended setting.
+>
+>This unavailable page is not the same as the one displayed when you call symfony disable (because while the cache is being cleared, symfony cannot work normally). It is located in the `$sf_symfony_data_dir/web/errors/` directory, but if you create your own `unavailable.php` file in your project's `web/errors/` directory, symfony will use it instead. The `check_lock` parameter is deactivated by default because it has a very slight negative impact on performance.
+>
+>The `clear-controllers` task clears the `web/` directory of all controllers other than the ones running in a production environment. If you do not include the development front controllers in the `rsync_exclude.txt` file, this command guarantees that a backdoor will not reveal the internals of your application.
+>
+>     > symfony clear-controllers
+>
+>The permissions of the project files and directories can be broken if you use a checkout from an SVN repository. The `fix-perms` task fixes directory permissions, to change the `log/` and `cache/` permissions to 0777, for example (these directories need to be writable for the framework to work correctly).
+>
+>     > symfony fix-perms
+
+>**SIDEBAR**
+>Access to the symfony commands in production
+>
+>If your production server has a PEAR installation of symfony, then the symfony command line is available from every directory and will work just as it does in development. For frozen projects, however, you need to add `php` before the `symfony` command to be able to launch tasks:
+>
+>
+>     // With symfony installed via PEAR
+>     > symfony [options] <TASK> [parameters]
+>
+>     // With symfony frozen in the project or symlinked
+>     > php symfony [options] <TASK> [parameters]
+
+Summary
+-------
+
+By combining PHP logs and symfony logs, you can monitor and debug your application easily. During development, the debug mode, the exceptions, and the web debug toolbar help you locate problems. You can even insert custom messages in the log files or in the toolbar for easier debugging.
+
+The command-line interface provides a large number of tools that facilitate the management of your applications, during development and production phases. Among others, the data population, freeze, and synchronization tasks are great time-savers.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/17-Extending-Symfony.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/17-Extending-Symfony.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/17-Extending-Symfony.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,974 @@
+Chapter 17 - Extending Symfony
+==============================
+
+Eventually, you will need to alter symfony's behavior. Whether you need to modify the way a certain class behaves or add your own custom features, the moment will inevitably happen--all clients have specific requirements that no framework can forecast. As a matter of fact, this situation is so common that symfony provides a mechanism to extend existing classes, called a mixin. You can even replace the core symfony classes on your own, using the factories settings. Once you have built an extension, you can easily package it as a plug-in, so that it can be reused in other applications--or by other symfony users.
+
+Mixins
+------
+
+Among the current limitations of PHP, one of the most annoying is you can't have a class extend more than one class. Another limitation is you can't add new methods to an existing class or override existing methods. To palliate these two limitations and to make the framework truly extendable, symfony introduces a class called `sfMixer`. It is in no way related to cooking devices, but to the concept of mixins found in object-oriented programming. A mixin is a group of methods or functions that can be mixed into a class to extend it.
+
+### Understanding Multiple Inheritance
+
+Multiple inheritance is the ability for a class to extend more than one class and inherit these class properties and methods. Let's consider an example. Imagine a `Story` and a `Book` class, each with its own properties and methods--just like in Listing 17-1.
+
+Listing 17-1 - Two Example Classes
+
+    [php]
+    class Story
+    {
+      protected $title = '';
+      protected $topic = '';
+      protected $characters = array();
+
+      public function __construct($title = '', $topic = '', $characters = array())
+      {
+        $this->title = $title;
+        $this->topic = $topic;
+        $this->characters = $characters;
+      }
+
+      public function getSummary()
+      {
+        return $this->title.', a story about '.$this->topic;
+      }
+    }
+
+    class Book
+    {
+      protected $isbn = 0;
+
+      function setISBN($isbn = 0)
+      {
+        $this->isbn = $isbn;
+      }
+
+      public function getISBN()
+      {
+        return $this->isbn;
+      }
+    }
+
+A `ShortStory` class extends `Story`, a `ComputerBook` class extends `Book`, and logically, a `Novel` should extend both `Story` and `Book` and take advantage of all their methods. Unfortunately, this is not possible in PHP. You cannot write the `Novel` declaration as in Listing 17-2.
+
+Listing 17-2 - Multiple Inheritance Is Not Possible in PHP
+
+    [php]
+    class Novel extends Story, Book
+    {
+    }
+
+    $myNovel = new Novel();
+    $myNovel->getISBN();
+
+One possibility would be to have Novel implements two interfaces instead of having it extend two classes, but this would prevent you from having the methods actually written in the parent classes.
+
+### Mixing Classes
+
+The `sfMixer` class takes another approach to the problem, taking an existing class and extending it a posteriori, provided that the class contains the proper hooks. The process involves two steps:
+
+  * Declaring a class as extendable
+  * Registering extensions (or mixins), after the class declaration
+
+Listing 17-3 shows how you would implement the `Novel` class with `sfMixer`.
+
+Listing 17-3 - Multiple Inheritance Is Possible via `sfMixer`
+
+    [php]
+    class Novel extends Story
+    {
+      public function __call($method, $arguments)
+      {
+        return sfMixer::callMixins();
+      }
+    }
+
+    sfMixer::register('Novel', array('Book', 'getISBN'));
+    $myNovel = new Novel();
+    $myNovel->getISBN();
+
+One of the classes (`Story`) is chosen as the main parent, in line with PHP's ability to only inherit from one class. The `Novel` class is declared as extendable by the code located in the `__call()` method. The method of the other class (`Book`) is added afterwards to the `Novel` class by a call to `sfMixer::register()`. The next sections will explicitly explain this process.
+
+When the `getISBN()` method of the `Novel` class is called, everything happens as if the class had been defined as in Listing 17-2--except it's the magic of the `__call()` method and of the `sfMixer` static methods that simulate it. The `getISBN()` method is mixed in the `Novel` class.
+
+>**SIDEBAR**
+>When to use mixins
+>
+>The symfony mixin mechanism is useful in many cases. Simulating multiple inheritance, as described previously, is just one of them.
+>
+>You can use mixins to alter a method after its declaration. For example, when building a graphic library, you will probably implement a `Line` object--representing a line. It will have four attributes (the coordinates for both ends) and a `draw()` method to render itself. A `ColoredLine` should have the same properties and methods, but with an additional attribute, `color`, to specify its color. Furthermore, the `draw()` method of a `ColoredLine` is a little different from the one of a simple `Line`, to use the object's color. You could package the abilities of a graphical element to deal with color into a `ColoredElement` class. This would allow you to reuse the color methods for other graphical elements (`Dot`, `Polygon`, and so on). In this case, the ideal implementation of the `ColoredLine` class would be an extension of the `Line` class, with methods from the `ColoredElement` class mixed in. The final `draw()` method would be a mix between the original one from `Line` and the one from `ColoredElement`.
+>
+>Mixins can also be seen as a way to add new methods to an existing class. For instance, the symfony action class, called `sfActions`, is defined in the framework. One of the constraints of PHP is that you cannot change the sfActions definition after its initial declaration. You may want to add a custom method to sfActions in one of your applications only--for instance, to forward a request to a special web service. For that purpose, PHP alone falls short, but the mixin mechanism provides a perfect solution.
+
+### Declaring a Class As Extendable
+
+To declare a class as extendable, you must insert one or several "hooks" into the code, which the `sfMixer` class can later identify. These hooks are calls to the `sfMixer::callMixins()` method. Many of the symfony classes already contain such hooks, including `sfRequest`, `sfResponse`, `sfController`, `sfUser`, `sfAction`, and others.
+
+The hook can be placed in different parts of the class, according to the desired degree of extensibility:
+
+  * To be able to add new methods to a class, you must insert the hook in the `__call()` method and return its result, as demonstrated in Listing 17-4.
+
+Listing 17-4 - Giving a Class the Ability to Get New Methods
+
+    [php]
+    class SomeClass
+    {
+      public function __call($method, $arguments)
+      {
+        return sfMixer::callMixins();
+      }
+    }
+
+  * To be able to alter the way an existing method works, you must insert the hook inside the method, as demonstrated in Listing 17-5. The code added by the mixin class will be executed where the hook is placed.
+
+Listing 17-5 - Giving a Method the Ability to Be Altered
+
+    [php]
+    class SomeOtherClass
+    {
+      public function doThings()
+      {
+        echo "I'm working...";
+        sfMixer::callMixins();
+      }
+    }
+
+You may want to place more than one hook in a method. In this case, you must name the hooks, so that you can define which hook is to be extended afterwards, as demonstrated in Listing 17-6. A named hook is a call to `callMixins()` with a hook name as a parameter. This name will be used afterwards, when registering a mixin, to tell where in the method the mixin code must be executed.
+
+Listing 17-6 - A Method Can Contain More Than One Hook, In Which Case They Must Be Named
+
+    [php]
+    class AgainAnotherClass
+    {
+      public function doMoreThings()
+      {
+        echo "I'm ready.";
+        sfMixer::callMixins('beginning');
+        echo "I'm working...";
+        sfMixer::callMixins('end');
+        echo "I'm done.";
+      }
+    }
+
+Of course, you can combine these techniques to create classes with the ability to be assigned new and extendable methods, as Listing 17-7 demonstrates.
+
+Listing 17-7 - A Class Can Be Extendable in Various Ways
+
+    [php]
+    class BicycleRider
+    {
+      protected $name = 'John';
+
+      public function getName()
+      {
+        return $this->name;
+      }
+
+      public function sprint($distance)
+      {
+        echo $this->name." sprints ".$distance." meters\n";
+        sfMixer::callMixins(); // The sprint() method is extendable
+      }
+
+      public function climb()
+      {
+        echo $this->name.' climbs';
+        sfMixer::callMixins('slope'); // The climb() method is extendable here
+        echo $this->name.' gets to the top';
+        sfMixer::callMixins('top'); // And also here
+      }
+
+      public function __call($method, $arguments)
+      {
+        return sfMixer::callMixins(); // The BicyleRider class is extendable
+      }
+    }
+
+>**CAUTION**
+>Only the classes that are declared as extendable can be extended by `sfMixer`. This means that you cannot use this mechanism to extend a class that didn't "subscribe" to this service.
+
+### Registering Extensions
+
+To register an extension to an existing hook, use the `sfMixer::register()` method. Its first argument is the element to extend, and the second argument is a PHP callable and represents the mixin.
+
+The format of the first argument depends on what you try to extend:
+
+  * If you extend a class, use the class name.
+  * If you extend a method with an anonymous hook, use the `class:method` pattern.
+  * If you extend a method with a named hook, use the `class:method:hook` pattern.
+
+Listing 17-8 illustrates this principle by extending the class defined in Listing 17-7. The extended object is automatically passed as first parameter to the mixin methods (except, of course, if the extended method is static). The mixin method also gets access to the parameters of the original method call.
+
+Listing 17-8 - Registering Extensions
+
+    [php]
+    class Steroids
+    {
+      protected $brand = 'foobar';
+
+      public function partyAllNight($bicycleRider)
+      {
+        echo $bicycleRider->getName()." spends the night dancing.\n";
+        echo "Thanks ".$brand."!\n";
+      }
+
+      public function breakRecord($bicycleRider, $distance)
+      {
+        echo "Nobody ever made ".$distance." meters that fast before!\n";
+      }
+
+      static function pass()
+      {
+        echo " and passes half the peloton.\n";
+      }
+    }
+
+    sfMixer::register('BicycleRider', array('Steroids', 'partyAllNight'));
+    sfMixer::register('BicycleRider:sprint', array('Steroids', 'breakRecord'));
+    sfMixer::register('BicycleRider:climb:slope', array('Steroids', 'pass'));
+    sfMixer::register('BicycleRider:climb:top', array('Steroids', 'pass'));
+
+    $superRider = new BicycleRider();
+    $superRider->climb();
+    => John climbs and passes half the peloton
+    => John gets to the top and passes half the peloton
+    $superRider->sprint(2000);
+    => John sprints 2000 meters
+    => Nobody ever made 2000 meters that fast before!
+    $superRider->partyAllNight();
+    => John spends the night dancing.
+    => Thanks foobar!
+
+The extension mechanism is not only about adding methods. The partyAllNight() method uses an attribute of the `Steroids` class. This means that when you extend the `BicycleRider` class with a method of the `Steroids` class, you actually create a new `Steroids` instance inside the `BicycleRider` object.
+
+>**CAUTION**
+>You cannot add two methods with the same name to an existing class. This is because the `callMixins()` call in the `__call()` methods uses the mixin method name as a key. Also, you cannot add a method to a class that already has a method with the same name, because the mixin mechanism relies on the magic `__call()` method and, in that particular case, it would never be called.
+
+The second argument of the `register()` call is a PHP callable, so it can be a `class::method` array, or an `object->method` array, or even a function name. See examples in Listing 17-9.
+
+Listing 17-9 - Any Callable Can Be Registered As a Mixer Extension
+
+    [php]
+    // Use a class method as a callable
+    sfMixer::register('BicycleRider', array('Steroids', 'partyAllNight'));
+
+    // Use an object method as a callable
+    $mySteroids = new Steroids();
+    sfMixer::register('BicycleRider', array($mySteroids, 'partyAllNight'));
+
+    // Use a function as a callable
+    sfMixer::register('BicycleRider', 'die');
+
+The extension mechanism is dynamic, which means that even if you already instantiated an object, it can take advantage of further extensions in its class. See an example in Listing 17-10.
+
+Listing 17-10 - The Extension Mechanism Is Dynamic and Can Occur Even After Instantiation
+
+    [php]
+    $simpleRider = new BicycleRider();
+    $simpleRider->sprint(500);
+    => John sprints 500 meters
+    sfMixer::register('BicycleRider:sprint', array('Steroids', 'breakRecord'));
+    $simpleRider->sprint(500);
+    => John sprints 500 meters
+    => Nobody ever made 500 meters that fast before!
+
+### Extending with More Precision
+
+The `sfMixer::callMixins()` instruction is actually a shortcut to something a little bit more elaborate. It automatically loops over the list of registered mixins and calls them one by one, passing to it the current object and the current method parameters. In short, an `sfMixer::callMixins()` call behaves more or less like Listing 17-11.
+
+Listing 17-11 - `callMixin()` Loops Over the Registered Mixins and Executes Them
+
+    [php]
+    foreach (sfMixer::getCallables($class.':'.$method.':'.$hookName) as $callable)
+    {
+      call_user_func_array($callable, $parameters);
+    }
+
+If you want to pass other parameters or to do something special with the return value, you can write the foreach loop explicitly instead of using the shortcut method. Look at Listing 17-12 for an example of a mixin more integrated into a class.
+
+Listing 17-12 - Replacing `callMixin()` by a Custom Loop
+
+    [php]
+    class Income
+    {
+      protected $amout = 0;
+
+      public function calculateTaxes($rate = 0)
+      {
+        $taxes = $this->amount * $rate;
+        foreach (sfMixer::getCallables('Income:calculateTaxes') as $callable)
+        {
+          $taxes += call_user_func($callable, $this->amount, $rate);
+        }
+
+        return $taxes;
+      }
+    }
+
+    class FixedTax
+    {
+      protected $minIncome = 10000;
+      protected $taxAmount = 500;
+
+      public function calculateTaxes($amount)
+      {
+        return ($amount > $this->minIncome) ? $this->taxAmount : 0;
+      }
+    }
+
+    sfMixer::register('Income:calculateTaxes', array('FixedTax', 'calculateTaxes'));
+
+>**SIDEBAR**
+>Propel Behaviors
+>
+>Propel behaviors, discussed previously in Chapter 8, are a special kind of mixin: They extend Propel-generated objects. Let's look at an example.
+>
+>The Propel objects corresponding to the tables of the database all have a delete() method, which deletes the related record from the database. But for an `Invoice` class, for which you can't delete a record, you may want to alter the `delete()` method to be able to keep the record in the database and change the value of an is_deleted attribute to true instead. Usual object retrieval methods (`doSelect()`, `retrieveByPk()`) would only consider the records for which `is_deleted` is false. You would also need to add another method called `forceDelete()`, which would allow you to really delete the record. In fact, all these modifications can be packaged into a new class, called `ParanoidBehavior`. The final `Invoice` class extends the Propel `BaseInvoice` class and has methods of the `ParanoidBehavior` mixed in.
+>
+>So a behavior is a mixin on a Propel object. Actually, the term "behavior" in symfony covers one more thing: the fact that the mixin is packaged as a plug-in. The `ParanoidBehavior` class just mentioned corresponds to a real symfony plug-in called `sfPropelParanoidBehaviorPlugin`. Refer to the symfony wiki ([http://www.symfony-project.com/trac/wiki/sfPropelParanoidBehaviorPlugin](http://www.symfony-project.com/trac/wiki/sfPropelParanoidBehaviorPlugin)) for details on installation and use of this plug-in.
+>
+>One last word about behaviors: To be able to support them, the generated Propel objects must contain quite a number of hooks. These may slow down execution a little and penalize performance if you don't use behaviors. That's why the hooks are not enabled by default. In order to add them and enable behavior support, you must first set the `propel.builder.addBehaviors` property to `true` in the `propel.ini` file and rebuild the model.
+
+Factories
+---------
+
+A factory is the definition of a class for a certain task. Symfony relies on factories for its core features such as the controller and session capabilities. For instance, when the framework needs to create a new request object, it searches in the factory definition for the name of the class to use for that purpose. The default factory definition for requests is `sfWebRequest`, so symfony creates an object of this class in order to deal with requests. The great advantage of using a factory definition is that it is very easy to alter the core features of the framework: Just change the factory definition, and symfony will use your custom request class instead of its own.
+
+The factory definitions are stored in the `factories.yml` configuration file. Listing 17-13 shows the default factory definition file. Each definition is made of the name of an autoloaded class and (optionally) a set of parameters. For instance, the session storage factory (set under the `storage:` key) uses a `session_name` parameter to name the cookie created on the client computer to allow persistent sessions.
+
+Listing 17-13 - Default Factories File, in `myapp/config/factories.yml`
+
+    cli:
+      controller:
+        class: sfConsoleController
+      request:
+        class: sfConsoleRequest
+
+    test:
+      storage:
+        class: sfSessionTestStorage
+
+    #all:
+    #  controller:
+    #    class: sfFrontWebController
+    #
+    #  request:
+    #    class: sfWebRequest
+    #
+    #  response:
+    #    class: sfWebResponse
+    #
+    #  user:
+    #    class: myUser
+    #
+    #  storage:
+    #    class: sfSessionStorage
+    #    param:
+    #      session_name: symfony
+    #
+    #  view_cache:
+    #    class: sfFileCache
+    #    param:
+    #      automaticCleaningFactor: 0
+    #      cacheDir:                %SF_TEMPLATE_CACHE_DIR%
+
+The best way to change a factory is to create a new class inheriting from the default factory and to add new methods to it. For instance, the user session factory is set to the `myUser` class (located in `myapp/lib/`) and inherits from `sfUser`. Use the same mechanism to take advantage of the existing factories. Listing 17-14 shows an example of a new factory for the request object.
+
+Listing 17-14 - Overriding Factories
+
+    [php]
+    // Create a myRequest.class.php in an autoloaded directory,
+    // For instance in myapp/lib/
+    <?php
+
+    class myRequest extends sfRequest
+    {
+      // Your code here
+    }
+
+    // Declare this class as the request factory in factories.yml
+    all:
+      request:
+        class: myRequest
+
+Bridges to Other Framework Components
+-------------------------------------
+
+If you need capabilities provided by a third-party class, and if you don't want to copy this class in one of the symfony `lib/` dirs, you will probably install it outside of the usual places where symfony looks for files. In that case, using this class will imply a manual `require` in your code, unless you use the symfony bridge to take advantage of the autoloading.
+
+Symfony doesn't (yet) provide tools for everything. If you need a PDF generator, an API to Google Maps, or a PHP implementation of the Lucene search engine, you will probably need a few libraries from the Zend Framework. If you want to manipulate images directly in PHP, connect to a POP3 account to read e-mails, or design a console interface, you might choose the libraries from eZcomponents. Fortunately, if you define the right settings, the components from both these libraries will work out of the box in symfony.
+
+The first thing that you need to declare (unless you installed the third-party libraries via PEAR) is the path to the root directory of the libraries. This is to be done in the application `settings.yml`:
+
+    .settings:
+      zend_lib_dir:   /usr/local/zend/library/
+      ez_lib_dir:     /usr/local/ezcomponents/
+
+Then, extend the autoload routine by specifying which library to consider when the autoloading fails with symfony:
+
+    .settings:
+      autoloading_functions:
+        - [sfZendFrameworkBridge, autoload]
+        - [sfEzComponentsBridge,  autoload]
+
+Note that this setting is distinct from the rules defined in `autoload.yml` (see Chapter 19 for more information about this file). The `autoloading_functions` setting specifies bridge classes, and `autoload.yml` specifies paths and rules for searching. The following describes what will happen when you create a new object of an unloaded class:
+
+  1. The symfony autoloading function (`sfCore::splAutoload()`) first looks for a class in the paths declared in the `autoload.yml` file.
+  2. If none is found, the callback methods declared in the `sf_autoloading_functions` setting will be called one after the other, until one of them returns `true`:
+  3. `sfZendFrameworkBridge::autoload()`
+  4. `sfEzComponentsBridge::autoload()`
+  5. If these also return false, if you use PHP 5.0.X, symfony will throw an exception saying that the class doesn't exist. Starting with PHP 5.1, the error will be generated by PHP itself.
+
+This means that the other framework components benefit from the autoload mechanism, and you can use them even more easily than within their own environment. For instance, if you want to use the `Zend_Search` component in the Zend Framework to implement an equivalent of the Lucene search engine in PHP, you have to write this:
+
+    [php]
+    require_once 'Zend/Search/Lucene.php';
+    $doc = new Zend_Search_Lucene_Document();
+    $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
+    ...
+
+With symfony and the Zend Framework bridge, it is simpler. Just write this:
+
+    [php]
+    $doc = new Zend_Search_Lucene_Document(); // The class is autoloaded
+    $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
+    ...
+
+The available bridges are stored in the `$sf_symfony_lib_dir/addon/bridge/` directory.
+
+Plug-Ins
+--------
+
+You will probably need to reuse a piece of code that you developed for one of your symfony applications. If you can package this piece of code into a single class, no problem: Drop the class in one of the `lib/` folders of another application and the autoloader will take care of the rest. But if the code is spread across more than one file, such as a complete new theme for the administration generator or a combination of JavaScript files and helpers to automate your favorite visual effect, just copying the files is not the best solution.
+
+Plug-ins offer a way to package code disseminated in several files and to reuse this code across several projects. Into a plug-in, you can package classes, filters, mixins, helpers, configuration, tasks, modules, schemas and model extensions, fixtures, web assets, etc. Plug-ins are easy to install, upgrade, and uninstall. They can be distributed as a .tgz archive, a PEAR package, or a simple checkout of a code repository. The PEAR packaged plug-ins have the advantage of managing dependencies, being easier to upgrade and automatically discovered. The symfony loading mechanisms take plug-ins into account, and the features offered by a plug-in are available in the project as if the plug-in code was part of the framework.
+
+So, basically, a plug-in is a packaged extension for a symfony project. With plug-ins, not only can you reuse your own code across applications, but you can also reuse developments made by other contributors and add third-party extensions to the symfony core.
+
+### Finding Symfony Plug-Ins
+
+The symfony project website contains a page dedicated to symfony plug-ins. It is in the symfony wiki and accessible with the following URL:
+
+    http://www.symfony-project.com/trac/wiki/SymfonyPlugins
+
+Each plug-in listed there has its own page, with detailed installation instructions and documentation.
+
+Some of these plug-ins are contributions from the community, and some come from the core symfony developers. Among the latter, you will find the following:
+
+  * `sfFeedPlugin`: Automates the manipulation of RSS and Atom feeds
+  * `sfThumbnailPlugin`: Creates thumbnails--for instance, for uploaded images
+  * `sfMediaLibraryPlugin`: Allows media upload and management, including an extension for rich text editors to allow authoring of images inside rich text
+  * `sfShoppingCartPlugin`: Allows shopping cart management
+  * `sfPagerNavigationPlugin`: Provides classical and Ajax pager controls, based on an `sfPager` object
+  * `sfGuardPlugin`: Provides authentication, authorization, and other user management features above the standard security feature of symfony
+  * `sfPrototypePlugin`: Provides prototype and script.aculo.us JavaScript files as a standalone library
+  * `sfSuperCachePlugin`: Writes pages in cache directory under the web root to allow the web server to serve them as fast as possible
+  * `sfOptimizerPlugin`: Optimizes your application's code to make it execute faster in the production environment (see the next chapter for details)
+  * `sfErrorLoggerPlugin`: Logs every 404 and 500 error in a database and provides an administration module to browse these errors
+  * `sfSslRequirementPlugin`: Provides SSL encryption support for actions
+
+The wiki also proposes plug-ins designed to extend your Propel objects, also called behaviors. Among them, you will find the following:
+
+  * `sfPropelParanoidBehaviorPlugin`: Disables object deletion and replaces it with the updating of a `deleted_at` column
+  * `sfPropelOptimisticLockBehaviorPlugin`: Implements optimistic locking for Propel objects
+
+You should regularly check out the symfony wiki, because new plug-ins are added all the time, and they bring very useful shortcuts to many aspects of web application programming.
+
+Apart from the symfony wiki, the other ways to distribute plug-ins are to propose a plug-ins archive for download, to host them in a PEAR channel, or to store them in a public version control repository.
+
+### Installing a Plug-In
+
+The plug-in installation process differs according to the way it's packaged. Always refer to the included README file and/or installation instructions on the plug-in download page. Also, always clear the symfony cache after installing a plug-in.
+
+Plug-ins are installed applications on a per-project basis. All the methods described in the following sections result in putting all the files of a plug-in into a `myproject/plugins/pluginName/` directory.
+
+#### PEAR Plug-Ins
+
+Plug-ins listed on the symfony wiki are bundled as PEAR packages attached to a wiki page. To install such a plug-in, use the `plugin-install` task with a full URL, as shown in Listing 17-15.
+
+Listing 17-15 - Installing a Plug-In from the Symfony Wiki
+
+    > cd myproject
+    > php symfony plugin-install http://plugins.symfony-project.com/pluginName
+    > php symfony cc
+
+Alternatively, you can download the plug-in and install it from the disk. In this case, replace the channel name with the absolute path to the package archive, as shown in Listing 17-16.
+
+Listing 17-16 - Installing a Plug-In from a Downloaded PEAR Package
+
+    > cd myproject
+    > php symfony plugin-install /home/path/to/downloads/pluginName.tgz
+    > php symfony cc
+
+Some plug-ins are hosted on PEAR channels. Install them with the `plugin-install` task, and don't forget to mention the channel name, as shown in Listing 17-17.
+
+Listing 17-17 - Installing a Plug-In from a PEAR Channel
+
+    > cd myproject
+    > php symfony plugin-install channelName/pluginName
+    > php symfony cc
+
+These three types of installation all use a PEAR package, so the term "PEAR plug-in" will be used indiscriminately to talk about plug-ins installed from the symfony wiki, a PEAR channel, or a downloaded PEAR package.
+
+#### Archive Plug-Ins
+
+Some plug-ins come as a simple archive of files. To install those, just unpack the archive into your project's `plugins/` directory. If the plug-in contains a `web/` subdirectory, make a copy or a symlink of this directory into the project's `web/` directory, as demonstrated in Listing 17-18. Finally, don't forget to clear the cache.
+
+Listing 17-18 - Installing a Plug-In from an Archive
+
+    > cd plugins
+    > tar -zxpf myPlugin.tgz
+    > cd ..
+    > ln -sf plugins/myPlugin/web web/myPlugin
+    > php symfony cc
+
+#### Installing Plug-Ins from a Version Control Repository
+
+Plug-ins sometimes have their own source code repository for version control. You can install them by doing a simple checkout in the `plugins/` directory, but this can be problematic if your project itself is under version control.
+
+Alternatively, you can declare the plug-in as an external dependency so that every update of your project source code also updates the plug-in source code. For instance, Subversion stores external dependencies in the `svn:externals` property. So you can add a plug-in by editing this property and updating your source code afterwards, as Listing 17-19 demonstrates.
+
+Listing 17-19 - Installing a Plug-In from a Source Version Repository
+
+    > cd myproject
+    > svn propedit svn:externals plugins
+      pluginName   http://svn.example.com/pluginName/trunk
+    > svn up
+    > php symfony cc
+
+>**NOTE**
+>If the plug-in contains a `web/` directory, you must create a symlink to it the same way as for an archive plug-in.
+
+#### Activating a Plug-In Module
+
+Some plug-ins contain whole modules. The only difference between module plug-ins and classical modules is that module plug-ins don't appear in the `myproject/apps/myapp/modules/` directory (to keep them easily upgradeable). They also need to be activated in the `settings.yml` file, as shown in Listing 17-20.
+
+Listing 17-20 - Activating a Plug-In Module, in `myapp/config/settings.yml`
+
+    all:
+      .settings:
+        enabled_modules:  [default, sfMyPluginModule]
+
+This is to avoid a situation where the plug-in module is mistakenly made available for an application that doesn't require it, which could open a security breach. Think about a plug-in that provides `frontend` and `backend` modules. You will need to enable the `frontend` modules only in your `frontend` application, and the `backend` ones only in the `backend` application. This is why plug-in modules are not activated by default.
+
+>**TIP**
+>The default module is the only enabled module by default. That's not really a plug-in module, because it resides in the framework, in `$sf_symfony_data_dir/modules/default/`. This is the module that provides the congratulations pages, and the default error pages for 404 and credentials required errors. If you don't want to use the symfony default pages, just remove this module from the `enabled_modules` setting.
+
+#### Listing the Installed Plug-Ins
+
+If a glance at your project's `plugins/` directory can tell you which plug-ins are installed, the `plugin-list` task tells you even more: the version number and the channel name of each installed plug-in (see Listing 17-21).
+
+Listing 17-21 - Listing Installed Plug-Ins
+
+    > cd myproject
+    > php symfony plugin-list
+
+    Installed plugins:
+    sfPrototypePlugin               1.0.0-stable # pear.symfony-project.com (symfony)
+    sfSuperCachePlugin              1.0.0-stable # pear.symfony-project.com (symfony)
+    sfThumbnail                     1.1.0-stable # pear.symfony-project.com (symfony)
+
+#### Upgrading and Uninstalling Plug-Ins
+
+To uninstall a PEAR plug-in, call the `plugin-uninstall` task from the root project directory, as shown in Listing 17-22. You must prefix the plug-in name with its installation channel (use the `plugin-list` task to determine this channel).
+
+Listing 17-22 - Uninstalling a Plug-In
+
+    > cd myproject
+    > php symfony plugin-uninstall pear.symfony-project.com/sfPrototypePlugin
+    > php symfony cc
+
+>**TIP**
+>Some channels have an alias. For instance, the `pear.symfony-project.com` channel can also be seen as `symfony`, which means that you can uninstall the `sfPrototypePlugin` as in Listing 17-22 by calling simply `php symfony plugin-uninstall symfony/sfPrototypePlugin`.
+
+To uninstall an archive plug-in or an SVN plug-in, remove manually the plug-in files from the project `plugins/` and `web/` directories, and clear the cache.
+
+To upgrade a plug-in, either use the `plugin-upgrade` task (for a PEAR plug-in) or do an `svn update` (if you grabbed the plug-in from a version control repository). Archive plug-ins can't be upgraded easily.
+
+### Anatomy of a Plug-In
+
+Plug-ins are written using the PHP language. If you can understand how an application is organized, you can understand the structure of the plug-ins.
+
+#### Plug-In File Structure
+
+A plug-in directory is organized more or less like a project directory. The plug-in files have to be in the right directories in order to be loaded automatically by symfony when needed. Have a look at the plug-in file structure description in Listing 17-23.
+
+Listing 17-23 - File Structure of a Plug-In
+
+    pluginName/
+      config/
+        *schema.yml        // Data schema
+        *schema.xml
+        config.php         // Specific plug-in configuration
+      data/
+        generator/
+          sfPropelAdmin
+            */             // Administration generator themes
+              templates/
+              skeleton/
+        fixtures/
+          *.yml            // Fixtures files
+        tasks/
+          *.php            // Pake tasks
+      lib/
+        *.php              // Classes
+        helper/
+          *.php            // Helpers
+        model/
+          *.php            // Model classes
+      modules/
+        */                 // Modules
+          actions/
+            actions.class.php
+          config/
+            module.yml
+            view.yml
+            security.yml
+          templates/
+            *.php
+          validate/
+            *.yml
+      web/
+        *                  // Assets
+
+#### Plug-In Abilities
+
+Plug-ins can contain a lot of things. Their content is automatically taken into account by your application at runtime and when calling tasks with the command line. But for plug-ins to work properly, you must respect a few conventions:
+
+  * Database schemas are detected by the `propel-` tasks. When you call `propel-build-model` in your project, you rebuild the project model and all the plug-in models with it. Note that a plug-in schema must always have a package attribute under the shape `plugins.pluginName`. `lib.model`, as shown in Listing 17-24.
+
+Listing 17-24 - Example Schema Declaration in a Plug-In, in `myPlugin/config/schema.yml`
+
+    propel:
+      _attributes:    { package: plugins.myPlugin.lib.model }
+      my_plugin_foobar:
+        _attributes:    { phpName: myPluginFoobar }
+          id:
+          name:           { type: varchar, size: 255, index: unique }
+          ...
+
+  * The plug-in configuration is to be included in the plug-in bootstrap script (`config.php`). This file is executed after the application and project configuration, so symfony is already bootstrapped at that time. You can use this file, for instance, to add directories to the PHP include path or to extend existing classes with mixins.
+  * Fixtures files located in the plug-in `data/fixtures/` directory are processed by the `propel-load-data` task.
+  * Tasks are immediately available to the symfony command line as soon as the plug-in is installed. It is a best practice to prefix the task by something meaningful--for instance, the plug-in name. Type `symfony` to see the list of available tasks, including the ones added by plug-ins.
+  * Custom classes are autoloaded just like the ones you put in your project `lib/` folders.
+  * Helpers are automatically found when you call `use_helper()` in templates. They must be in a` helper/` subdirectory of one of the plug-in's `lib/` directory.
+  * Model classes in `myplugin/lib/model/` specialize the model classes generated by the Propel builder (in `myplugin/lib/model/om/` and `myplugin/lib/model/map/`). They are, of course, autoloaded. Be aware that you cannot override the generated model classes of a plug-in in your own project directories.
+  * Modules provide new actions accessible from the outside, provided that you declare them in the `enabled_modules` setting in your application.
+  * Web assets (images, scripts, style sheets, etc.) are made available to the server. When you install a plug-in via the command line, symfony creates a symlink to the project `web/` directory if the system allows it, or copies the content of the module `web/` directory into the project one. If the plug-in is installed from an archive or a version control repository, you have to copy the plug-in `web/` directory by hand (as the `README` bundled with the plug-in should mention).
+
+#### Manual Plug-In Setup
+
+There are some elements that the `plugin-install` task cannot handle on its own, and which require manual setup during installation:
+
+  * Custom application configuration can be used in the plug-in code (for instance, by using `sfConfig::get('app_myplugin_foo')`), but you can't put the default values in an `app.yml` file located in the plug-in `config/` directory. To handle default values, use the second argument of the `sfConfig::get()` method. The settings can still be overridden at the application level (see Listing 17-25 for an example).
+  * Custom routing rules have to be added manually to the application `routing.yml`.
+  * Custom filters have to be added manually to the application `filters.yml`.
+  * Custom factories have to be added manually to the application `factories.yml`.
+
+Generally speaking, all the configuration that should end up in one of the application configuration files has to be added manually. Plug-ins with such manual setup should embed a `README` file describing installation in detail.
+
+#### Customizing a Plug-In for an Application
+
+Whenever you want to customize a plug-in, never alter the code found in the `plugins/` directory. If you do so, you will lose all your modifications when you upgrade the plug-in. For customization needs, plug-ins provide custom settings, and they support overriding.
+
+Well-designed plug-ins use settings that can be changed in the application `app.yml`, as Listing 17-25 demonstrates.
+
+Listing 17-25 - Customizing a Plug-In That Uses the Application Configuration
+
+    [php]
+    // example plug-in code
+    $foo = sfConfig::get('app_my_plugin_foo', 'bar');
+
+    // Change the 'foo' default value ('bar') in the application app.yml
+    all:
+      my_plugin:
+        foo:       barbar
+
+The module settings and their default values are often described in the plug-in's `README` file.
+
+You can replace the default contents of a plug-in module by creating a module of the same name in your own application. It is not really overriding, since the elements in your application are used instead of the ones of the plug-in. It works fine if you create templates and configuration files of the same name as the ones of the plug-ins.
+
+On the other hand, if a plug-in wants to offer a module with the ability to override its actions, the `actions.class.php` in the plug-in module must be empty and inherit from an autoloading class, so that the method of this class can be inherited as well by the `actions.class.php` of the application module. See Listing 17-26 for an example.
+
+Listing 17-26 - Customizing a Plug-In Action
+
+    [php]
+    // In myPlugin/modules/mymodule/lib/myPluginmymoduleActions.class.php
+    class myPluginmymoduleActions extends sfActions
+    {
+      public function executeIndex()
+      {
+        // Some code there
+      }
+    }
+
+    // In myPlugin/modules/mymodule/actions/actions.class.php
+    class mymoduleActions extends myPluginmymoduleActions
+    {
+      // Nothing
+    }
+
+    // In myapp/modules/mymodule/actions/actions.class.php
+    class mymoduleActions extends myPluginmymoduleActions
+    {
+      public function executeIndex()
+      {
+        // Override the plug-in code there
+      }
+    }
+
+### How to Write a Plug-In
+
+Only plug-ins packaged as PEAR packages can be installed with the `plugin-install` task. Remember that such plug-ins can be distributed via the symfony wiki, a PEAR channel, or a simple file download. So if you want to author a plug-in, it is better to publish it as a PEAR package than as a simple archive. In addition, PEAR packaged plug-ins are easier to upgrade, can declare dependencies, and automatically deploy assets in the `web/` directory.
+
+#### File Organization
+
+Suppose you have developed a new feature and want to package it as a plug-in. The first step is to organize the files logically so that the symfony loading mechanisms can find them when needed. For that purpose, you have to follow the structure given in Listing 17-23. Listing 17-27 shows an example of file structure for an `sfSamplePlugin` plug-in.
+
+Listing 17-27 - Example List of Files to Package As a Plug-In
+
+    sfSamplePlugin/
+      README
+      LICENSE
+      config/
+        schema.yml
+      data/
+        fixtures/
+          fixtures.yml
+        tasks/
+          sfSampleTask.php
+      lib/
+        model/
+          sfSampleFooBar.php
+          sfSampleFooBarPeer.php
+        validator/
+          sfSampleValidator.class.php
+      modules/
+        sfSampleModule/
+          actions/
+            actions.class.php
+          config/
+            security.yml
+          lib/
+            BasesfSampleModuleActions.class.php
+          templates/
+            indexSuccess.php
+      web/
+        css/
+          sfSampleStyle.css
+        images/
+          sfSampleImage.png
+
+For authoring, the location of the plug-in directory (`sfSamplePlugin/` in Listing 17-27) is not important. It can be anywhere on the disk.
+
+>**TIP**
+>Take examples of the existing plug-ins and, for your first attempts at creating a plug-in, try to reproduce their naming conventions and file structure.
+
+#### Creating the package.xml File
+
+The next step of plug-in authoring is to add a package.xml file at the root of the plug-in directory. The `package.xml` follows the PEAR syntax. Have a look at a typical symfony plug-in `package.xml` in Listing 17-28.
+
+Listing 17-28 - Example `package.xml` for a Symfony Plug-In
+
+    [xml]
+    <?xml version="1.0" encoding="UTF-8"?>
+    <package packagerversion="1.4.6" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
+     <name>sfSamplePlugin</name>
+     <channel>pear.symfony-project.com</channel>
+     <summary>symfony sample plugin</summary>
+     <description>Just a sample plugin to illustrate PEAR packaging</description>
+     <lead>
+      <name>Fabien POTENCIER</name>
+      <user>fabpot</user>
+      <email>fabien.potencier en symfony-project.com</email>
+      <active>yes</active>
+     </lead>
+     <date>2006-01-18</date>
+     <time>15:54:35</time>
+     <version>
+      <release>1.0.0</release>
+      <api>1.0.0</api>
+     </version>
+     <stability>
+      <release>stable</release>
+      <api>stable</api>
+     </stability>
+     <license uri="http://www.symfony-project.com/license">MIT license</license>
+     <notes>-</notes>
+     <contents>
+      <dir name="/">
+       <file role="data" name="README" />
+       <file role="data" name="LICENSE" />
+       <dir name="config">
+        <!-- model -->
+        <file role="data" name="schema.yml" />
+       </dir>
+       <dir name="data">
+        <dir name="fixtures">
+         <!-- fixtures -->
+         <file role="data" name="fixtures.yml" />
+        </dir>
+        <dir name="tasks">
+         <!-- tasks -->
+         <file role="data" name="sfSampleTask.php" />
+        </dir>
+       </dir>
+       <dir name="lib">
+        <dir name="model">
+         <!-- model classes -->
+         <file role="data" name="sfSampleFooBar.php" />
+         <file role="data" name="sfSampleFooBarPeer.php" />
+        </dir>
+        <dir name="validator">
+         <!-- validators ->>
+         <file role="data" name="sfSampleValidator.class.php" />
+        </dir>
+       </dir>
+       <dir name="modules">
+        <dir name="sfSampleModule">
+         <file role="data" name="actions/actions.class.php" />
+         <file role="data" name="config/security.yml" />
+         <file role="data" name="lib/BasesfSampleModuleActions.class.php" />
+         <file role="data" name="templates/indexSuccess.php" />
+        </dir>
+       </dir>
+       <dir name="web">
+        <dir name="css">
+         <!-- stylesheets -->
+         <file role="data" name="sfSampleStyle.css" />
+        </dir>
+        <dir name="images">
+         <!-- images -->
+         <file role="data" name="sfSampleImage.png" />
+        </dir>
+       </dir>
+      </dir>
+     </contents>
+     <dependencies>
+      <required>
+       <php>
+        <min>5.0.0</min>
+       </php>
+       <pearinstaller>
+        <min>1.4.1</min>
+       </pearinstaller>
+       <package>
+        <name>symfony</name>
+        <channel>pear.symfony-project.com</channel>
+        <min>1.0.0</min>
+        <max>1.1.0</max>
+        <exclude>1.1.0</exclude>
+       </package>
+      </required>
+     </dependencies>
+     <phprelease />
+     <changelog />
+    </package>
+
+The interesting parts here are the `<contents>` and the `<dependencies>` tags, described next. For the rest of the tags, there is nothing specific to symfony, so you can refer to the PEAR online manual ([http://pear.php.net/manual/en/](http://pear.php.net/manual/en/)) for more details about the `package.xml` format.
+
+#### Contents
+
+The `<contents>` tag is the place where you must describe the plug-in file structure. This will tell PEAR which files to copy and where. Describe the file structure with `<dir>` and `<file>` tags. All `<file>` tags must have a `role="data"` attribute. The `<contents>` part of Listing 17-28 describes the exact directory structure of Listing 17-27.
+
+>**NOTE**
+>The use of `<dir>` tags is not compulsory, since you can use relative paths as `name` values in the `<file>` tags. However, it is recommended so that the `package.xml` file remains readable.
+
+#### Plug-In Dependencies
+
+Plug-ins are designed to work with a given set of versions of PHP, PEAR, symfony, PEAR packages, or other plug-ins. Declaring these dependencies in the `<dependencies>` tag tells PEAR to check that the required packages are already installed, and to raise an exception if not.
+
+You should always declare dependencies on PHP, PEAR, and symfony, at least the ones corresponding to your own installation, as a minimum requirement. If you don't know what to put, add a requirement for PHP 5.0, PEAR 1.4, and symfony 1.0.
+
+It is also recommended to add a maximum version number of symfony for each plug-in. This will cause an error message when trying to use a plug-in with a more advanced version of the framework, and this will oblige the plug-in author to make sure that the plug-in works correctly with this version before releasing it again. It is better to have an alert and to download an upgrade rather than have a plug-in fail silently.
+
+#### Building the Plug-In
+
+The PEAR component has a command (`pear package`) that creates the `.tgz` archive of the package, provided you call the command shown in Listing 17-29 from a directory containing a `package.xml`.
+
+Listing 17-29 - Packaging a Plug-In As a PEAR Package
+
+    > cd sfSamplePlugin
+    > pear package
+
+    Package sfSamplePlugin-1.0.0.tgz done
+
+Once your plug-in is built, check that it works by installing it yourself, as shown in Listing 17-30.
+
+Listing 17-30 - Installing the Plug-In
+
+    > cp sfSamplePlugin-1.0.0.tgz /home/production/myproject/
+    > cd /home/production/myproject/
+    > php symfony plugin-install sfSamplePlugin-1.0.0.tgz
+
+According to their description in the `<contents>` tag, the packaged files will end up in different directories of your project. Listing 17-31 shows where the files of the `sfSamplePlugin` should end up after installation.
+
+Listing 17-31 - The Plug-In Files Are Installed on the `plugins/` and `web/` Directories
+
+    plugins/
+      sfSamplePlugin/
+        README
+        LICENSE
+        config/
+          schema.yml
+        data/
+          fixtures/
+            fixtures.yml
+          tasks/
+            sfSampleTask.php
+        lib/
+          model/
+            sfSampleFooBar.php
+            sfSampleFooBarPeer.php
+          validator/
+            sfSampleValidator.class.php
+        modules/
+          sfSampleModule/
+            actions/
+              actions.class.php
+            config/
+              security.yml
+            lib/
+              BasesfSampleModuleActions.class.php
+            templates/
+              indexSuccess.php
+    web/
+      sfSamplePlugin/               ## Copy or symlink, depending on system
+        css/
+          sfSampleStyle.css
+        images/
+          sfSampleImage.png
+
+Test the way the plug-in behaves in your application. If it works well, you are ready to distribute it across projects--or to contribute it to the symfony community.
+
+#### Hosting Your Plug-In in the Symfony Project Website
+
+A symfony plug-in gets the broadest audience when distributed by the `symfony-project.com` website. Even your own plug-ins can be distributed this way, provided that you follow these steps:
+
+  1. Make sure the `README` file describes the way to install and use your plug-in, and that the `LICENSE` file gives the license details. Format your `README` with the Wiki Formatting syntax ([http://www.symfony-project.com/trac/wiki/WikiFormatting](http://www.symfony-project.com/trac/wiki/WikiFormatting)).
+  2. Create a PEAR package for your plug-in by calling the `pear package` command, and test it. The PEAR package must be named `sfSamplePlugin-1.0.0.tgz` (1.0.0 is the plug-in version).
+  3. Create a new page on the symfony wiki named `sfSamplePlugin` (`Plugin` is a mandatory suffix). In this page, describe the plug-in usage, the license, the dependencies, and the installation procedure. You can reuse the contents of the plug-in `README` file. Check the existing plug-ins' wiki pages and use them as an example.
+  4. Attach your PEAR package to the wiki page (`sfSamplePlugin-1.0.0.tgz`).
+  5. Add the new plug-in wiki page (`[wiki:sfSamplePlugin]`) to the list of available plug-ins, which is also a wiki page ([http://www.symfony-project.com/trac/wiki/SymfonyPlugins](http://www.symfony-project.com/trac/wiki/SymfonyPlugins)).
+
+If you follow this procedure, users will be able to install your plug-in by simply typing the following command in a project directory:
+
+    > php symfony plugin-install http://plugins.symfony-project.com/sfSamplePlugin
+
+#### Naming Conventions
+
+To keep the `plugins/` directory clean, ensure all the plug-in names are in camelCase and end with `Plugin` (for example, `shoppingCartPlugin`, `feedPlugin`, and so on). Before naming your plug-in, check that there is no existing plug-in with the same name.
+
+>**NOTE**
+>Plug-ins relying on Propel should contain `Propel` in the name. For instance, an authentication plug-in using the Propel data access objects should be called `sfPropelAuth`.
+
+Plug-ins should always include a `LICENSE` file describing the conditions of use and the chosen license. You are also advised to add a `README` file to explain the version changes, purpose of the plug-in, its effect, installation and configuration instructions, etc.
+
+Summary
+-------
+
+The symfony classes contain `sfMixer` hooks that give them the ability to be modified at the application level. The mixins mechanism allows multiple inheritance and class overriding at runtime even if the PHP limitations forbid it. So you can easily extend the symfony features, even if you have to modify the core classes for that--the factories configuration is here for that.
+
+Many such extensions already exist; they are packaged as plug-ins, to be easily installed, upgraded, and uninstalled through the symfony command line. Creating a plug-in is as easy as creating a PEAR package, and provides reusability across applications.
+
+The symfony wiki contains many plug-ins, and you can even add your own. So now that you know how to do it, we hope that you will enhance the symfony core with a lot of useful extensions!

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/18-Performance.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/18-Performance.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/18-Performance.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,633 @@
+Chapter 18 - Performance
+========================
+
+If you expect your website will attract a crowd, performance and optimization issues should be a major factor during the development phase. Rest assured, performance has always been a chief concern among the core symfony developers.
+
+While the advantages gained by accelerating the development process result in some overhead, the core symfony developers have always been cognizant of performance requirements. Accordingly, every class and every method have been closely inspected and optimized to be as fast as possible. The basic overhead, which you can measure by comparing the time to display a "hello, world" message with and without symfony, is minimal. As a result, the framework is scalable and reacts well to stress tests. And as the ultimate proof, some websites with extremely high traffic (that is, websites with millions of active subscribers and a lot of server-pressuring Ajax interactions) use symfony and are very satisfied with its performance. Check the list of websites developed with symfony in the wiki ([http://www.symfony-project.com/trac/wiki/ApplicationsDevelopedWithSymfony](http://www.symfony-project.com/trac/wiki/ApplicationsDevelopedWithSymfony)) for names.
+
+But, of course, high-traffic websites often have the means to expand the server farm and upgrade hardware as they see fit. If you don't have the resources to do this, or if you want to be sure the full power of the framework is always at your disposal, there are a few tweaks that you can use to further speed up your symfony application. This chapter lists some of the recommended performance optimizations at all levels of the framework and they are mostly for advanced users. Some of them were already mentioned throughout the previous chapters, but you will find it useful to have them all in one place.
+
+Tweaking the Server
+-------------------
+
+A well-optimized application should rely on a well-optimized server. You should know the basics of server performance to make sure there is no bottleneck outside symfony. Here are a few things to check to make sure that your server isn't unnecessarily slow.
+
+Having `magic_quotes_gpc` turned `on` in the `php.ini` slows down an application, because it tells PHP to escape all quotes in request parameters, but symfony will systematically unescape them afterwards, and the only consequence will be a loss of time--and quotes-escaping problems on some platforms. Therefore, turn this setting off if you have access to the PHP configuration.
+
+The more recent PHP release you use, the better. PHP 5.2 is faster than PHP 5.1, and PHP 5.1 is a lot faster than PHP 5.0. So make sure you upgrade your PHP version to benefit from the latest performance improvements.
+
+The use of a PHP accelerator (such as APC, XCache, or eAccelerator) is almost compulsory for a production server, because it can make PHP run an average 50% faster, with no tradeoff. Make sure you install one of the accelerator extensions to feel the real speed of PHP.
+
+On the other hand, make sure you deactivate any debug utility, such as the Xdebug or APD extension, in your production server.
+
+>**NOTE**
+>You might be wondering about the overhead caused by the `mod_rewrite` extension: it is negligible. Of course, loading an image with rewriting rules is slower than loading an image without, but the slowdown is orders of magnitude below the execution of any PHP statement.
+
+Some symfony developers like to use `syck`, which is a YAML parser packaged as a PHP extension, as an alternative to the symfony internal parser. It is faster, but symfony's caching system already minimizes the overhead of YAML parsing, so the benefit is nonexistent in a production environment. You should also be aware that `syck` isn't completely mature yet, and that it may cause errors when you use it. However, if you are interested, install the extension ([http://whytheluckystiff.net/syck/](http://whytheluckystiff.net/syck/)), and symfony will use it automatically.
+
+>**TIP**
+>When one server is not enough, you can still add another and use load balancing. As long as the `uploads/` directory is shared and you use database storage for sessions, a symfony project will react seamlessly in a load-balanced architecture.
+
+Tweaking the Model
+------------------
+
+In symfony, the model layer has the reputation of being the slowest part. If benchmarks show that you have to optimize this layer, here are a few possible improvements.
+
+### Optimizing Propel Integration
+
+Initializing the model layer (the core Propel classes) takes some time, because of the need to load a few classes and construct various objects. However, because of the way symfony integrates Propel, these initialization tasks occur only when an action actually needs the model--and as late as possible. The Propel classes will be initialized only when an object of your generated model is autoloaded. This means pages that don't use the model are not penalized by the model layer.
+
+If your entire application doesn't require the use of the model layer, you can also save the initialization of the `sfDatabaseManager` by switching the whole layer off in your `settings.yml`:
+
+    all:
+      .settings:
+        use_database: off
+
+The generated model classes (in `lib/model/om/`) are already optimized--they don't contain comments, and they benefit from the autoloading system. Relying on autoloading instead of manually including files means that classes are loaded only if it is really necessary. So in case one model class is not needed, having classes autoloaded will save execution time, while the alternative method of using `include` statements won't. As for the comments, they document the use of the generated methods but lengthen the model files--resulting in a minor overhead on slow disks. As the generated method names are pretty explicit, the comments are turned off by default.
+
+These two enhancements are symfony-specific, but you can revert to the Propel defaults by changing two settings in your `propel.ini` file, as follows:
+
+    propel.builder.addIncludes = true   # Add include statements in generated classes
+                                        # Instead of relying on the autoloading system
+    propel.builder.addComments = true   # Add comments to generated classes
+
+### Limiting the Number of Objects to Hydrate
+
+When you use a method of a peer class to retrieve objects, your query goes through the hydrating process (creating and populating objects based on the rows of the result of the query). For instance, to retrieve all the rows of the `article` table with Propel, you usually do the following:
+
+    [php]
+    $articles = ArticlePeer::doSelect(new Criteria());
+
+The resulting `$articles` variable is an array of objects of class `Article`. Each object has to be created and initialized, which takes time. This has one major consequence: Contrary to direct database queries, the speed of a Propel query is directly proportional to the number of results it returns. This means your model methods should be optimized to return only a given number of results. When you don't need all the results returned by a `Criteria`, you should limit it with the `setLimit()` and `setOffset()` methods. For instance, if you need only the rows 10 to 20 of a particular query, refine the `Criteria` as in Listing 18-1.
+
+Listing 18-1 - Limiting the Number of Results Returned by a Criteria
+
+    [php]
+    $c = new Criteria();
+    $c->setOffset(10);  // Offset of the first record returned
+    $c->setLimit(10);   // Number of records returned
+    $articles = ArticlePeer::doSelect($c);
+
+This can be automated by the use of a pager. The `sfPropelPager` object automatically handles the offset and the limit of a Propel query to hydrate only the objects required for a given page. Refer to the API documentation for more information on this class.
+
+### Minimizing the Number of Queries with Joins
+
+During application development, you should keep an eye on the number of database queries issued by each request. The web debug toolbar shows the number of queries for each page, and clicking the little database icon reveals the SQL code of these queries. If you see the number of queries rising abnormally, it is time to consider using a Join.
+
+Before explaining the Join methods, let's review what happens when you loop over an array of objects and use a Propel getter to retrieve details about a related class, as in Listing 18-2. This example supposes that your schema describes an `article` table with a foreign key to an `author` table.
+
+Listing 18-2 - Retrieving Details About a Related Class in a Loop
+
+    [php]
+    // In the action
+    $this->articles = ArticlePeer::doSelect(new Criteria());
+
+    // Database query issued by doSelect()
+    SELECT article.id, article.title, article.author_id, ...
+    FROM   article
+
+    // In the template
+    <ul>
+    <?php foreach ($articles as $article): ?>
+      <li><?php echo $article->getTitle() ?>,
+        written by <?php echo $article->getAuthor()->getName() ?></li>
+    <?php endforeach; ?>
+    </ul>
+
+If the `$articles` array contains ten objects, the `getAuthor()` method will be called ten times, which in turn executes one database query each time it is called to hydrate one object of class `Author`, as in Listing 18-3.
+
+Listing 18-3 - Foreign Key Getters Issue One Database Query
+
+    [php]
+    // In the template
+    $article->getAuthor()
+
+    // Database query issued by getAuthor()
+    SELECT author.id, author.name, ...
+    FROM   author
+    WHERE  author.id = ?                // ? is article.author_id
+
+So the page of Listing 18-2 will require a total of 11 queries: the one necessary to build the array of `Article` objects, plus the 10 queries to build one `Author` object at a time. This is a lot of queries to display only a list of articles and their author.
+
+If you were using plain SQL, you would know how to reduce the number of queries to only one by retrieving the columns of the `article` table and those of the `author` table in the same query. That's exactly what the `doSelectJoinAuthor()` method of the `ArticlePeer` class does. It issues a slightly more complex query than a simple `doSelect()` call, but the additional columns in the result set allow Propel to hydrate both `Article` objects and the related `Author` objects. The code of Listing 18-4 displays exactly the same result as Listing 18-2, but it requires only one database query to do so rather than 11 and therefore is faster.
+
+Listing 18-4 - Retrieving Details About Articles and Their Author in the Same Query
+
+    [php]
+    // In the action
+    $this->articles = ArticlePeer::doSelectJoinAuthor(new Criteria());
+
+    // Database query issued by doSelectJoinAuthor()
+    SELECT article.id, article.title, article.author_id, ...
+           author.id, author.name, ...
+    FROM   article, author
+    WHERE  article.author_id = author.id
+
+    // In the template (unchanged)
+    <ul>
+    <?php foreach ($articles as $article): ?>
+      <li><?php echo $article->getTitle() ?>,
+        written by <?php echo $article->getAuthor()->getName() ?></li>
+    <?php endforeach; ?>
+    </ul>
+
+There is no difference in the result returned by a `doSelect()` call and a `doSelectJoinXXX()` method; they both return the same array of objects (of class Article in the example). The difference appears when a foreign key getter is used on these objects afterwards. In the case of `doSelect()`, it issues a query, and one object is hydrated with the result; in the case of `doSelectJoinXXX()`, the foreign object already exists and no query is required, and the process is much faster. So if you know that you will need related objects, call a `doSelectJoinXXX()` method to reduce the number of database queries--and improve the page performance.
+
+The `doSelectJoinAuthor()` method is automatically generated when you call a `propel-build-model` because of the relationship between the `article` and `author` tables. If there were other foreign keys in the article table structure--for instance, to a category table--the generated `BaseArticlePeer` class would have other Join methods, as shown in Listing 18-5.
+
+Listing 18-5 - Example of Available `doSelect` Methods for an `ArticlePeer` Class
+
+    [php]
+    // Retrieve Article objects
+    doSelect()
+
+    // Retrieve Article objects and hydrate related Author objects
+    doSelectJoinAuthor()
+
+    // Retrieve Article objects and hydrate related Category objects
+    doSelectJoinCategory()
+
+    // Retrieve Article objects and hydrate related Author and Category objects
+    doSelectJoinAuthorAndCategory()
+
+    // Synonym of
+    doSelectJoinAll()
+
+The peer classes also contain Join methods for `doCount()`. The classes with an i18n counterpart (see Chapter 13) provide a `doSelectWithI18n()` method, which behaves the same as Join methods but for i18n objects. To discover the available Join methods in your model classes, you should inspect the generated peer classes in `lib/model/om/`. If you don't find the Join method needed for your query (for instance, there is no automatically generated Join method for many-to-many relationships), you can build it yourself and extend your model.
+
+>**TIP**
+>Of course, a `doSelectJoinXXX()` call is a bit slower than a call to `doSelect()`, so it only improves the overall performance if you use the hydrated objects afterwards.
+
+### Avoid Using Temporary Arrays
+
+When using Propel, objects are already hydrated, so there is no need to prepare a temporary array for the template. Developers not used to ORMs usually fall into this trap. They want to prepare an array of strings or integers, whereas the template can rely directly on an existing array of objects. For instance, imagine that a template displays the list of all the titles of the articles present in the database. A developer who doesn't use OOP would probably write code similar to what is shown in Listing 18-6.
+
+Listing 18-6 - Preparing an Array in the Action Is Useless If You Already Have One
+
+    [php]
+    // In the action
+    $articles = ArticlePeer::doSelect(new Criteria());
+    $titles = array();
+    foreach ($articles as $article)
+    {
+      $titles[] = $article->getTitle();
+    }
+    $this->titles = $titles;
+
+    // In the template
+    <ul>
+    <?php foreach ($titles as $title): ?>
+      <li><?php echo $title ?></li>
+    <?php endforeach; ?>
+    </ul>
+
+The problem with this code is that the hydrating is already done by the `doSelect()` call (which takes time), making the `$titles` array superfluous, since you can write the same code as in Listing 18-7. So the time spent to build the `$titles` array could be gained to improve the application performance.
+
+Listing 18-7 - Using an Array of Objects Exempts You from Creating a Temporary Array
+
+    [php]
+    // In the action
+    $this->articles = ArticlePeer::doSelect(new Criteria());
+
+    // In the template
+    <ul>
+    <?php foreach ($articles as $article): ?>
+      <li><?php echo $article->getTitle() ?></li>
+    <?php endforeach; ?>
+    </ul>
+
+If you feel that you really need to prepare a temporary array because some processing is necessary on objects, the right way to do so is to create a new method in your model class that directly returns this array. For instance, if you need an array of article titles and the number of comments for each article, the action and the template should look like Listing 18-8.
+
+Listing 18-8 - Using a Custom Method to Prepare a Temporary Array
+
+    [php]
+    // In the action
+    $this->articles = ArticlePeer::getArticleTitlesWithNbComments();
+
+    // In the template
+    <ul>
+    <?php foreach ($articles as $article): ?>
+      <li><?php echo $article[0] ?> (<?php echo $article[1] ?> comments)</li>
+    <?php endforeach; ?>
+    </ul>
+
+It's up to you to build a fast-processing `getArticleTitlesWithNbComments()` method in the model--for instance, by bypassing the whole object-relational mapping and database abstraction layers.
+
+### Bypassing the ORM
+
+When you don't really need objects but only a few columns from various tables, as in the previous example, you can create specific methods in your model that bypass completely the ORM layer. You can directly call the database with Creole, for instance, and return a custom-built array. Listing 18-9 illustrates this idea.
+
+Listing 18-9 - Using Direct Creole Access for Optimized Model Methods, in `lib/model/ArticlePeer.php`
+
+    [php]
+    class ArticlePeer extends BaseArticlePeer
+    {
+      public static function getArticleTitlesWithNbComments()
+      {
+        $connection = Propel::getConnection();
+        $query = 'SELECT %s as title, COUNT(%s) AS nb FROM %s LEFT JOIN %s ON %s = %sGROUP BY %s';
+        $query = sprintf($query,
+          ArticlePeer::TITLE, CommentPeer::ID,
+          ArticlePeer::TABLE_NAME, CommentPeer::TABLE_NAME,
+          ArticlePeer::ID, CommentPeer::ARTICLE_ID,
+          ArticlePeer::ID
+        );
+        $statement = $connection->prepareStatement($query);
+        $resultset = $statement->executeQuery();
+        $results = array();
+        while ($resultset->next())
+        {
+          $results[] = array($resultset->getString('title'), $resultset->getInt('nb'));
+        }
+
+        return $results;
+      }
+    }
+
+When you start building these sorts of methods, you may end up writing one custom method for each action, and lose the benefit of the layer separation--not to mention the fact that you lose database-independence.
+
+>**TIP**
+>If Propel doesn't suit you as a model layer, consider using other ORMs before writing your queries by hand. For instance, check the `sfDoctrine` plug-in for an interface with the PhpDoctrine ORM. In addition, you can use another database abstraction layer than Creole to access your database directly. As of PHP 5.1, PDO is bundled with PHP and provides a faster alternative to Creole.
+
+### Speeding Up the Database
+
+There are many database-specific optimization techniques that can be applied regardless of whether you're using symfony. This section briefly outlines the most common database optimization strategies, but a good knowledge of database engines and administration is required to get the most out of your model layer.
+
+>**TIP**
+>Remember that the web debug toolbar displays the time taken by each query in a page, and that every tweak should be monitored to determine whether it really improves performance.
+
+Table queries are often based on non-primary key columns. To improve the speed of such queries, you should define indexes in your database schema. To add a single column index, add the `index: true` property to the column definition, as in Listing 18-10.
+
+Listing 18-10 - Adding a Single Column Index, in `config/schema.yml`
+
+    propel:
+      article:
+        id:
+        author_id:
+        title: { type: varchar(100), index: true }
+
+You can use the alternative `index: unique` syntax to define a unique index instead of a classic one. You can also define multiple column indices in `schema.yml` (refer to Chapter 8 for more details about the indexing syntax). You should strongly consider doing this, because it is often a good way to speed up a complex query.
+
+After adding an index to a schema, you should do the same in the database itself, either by issuing an `ADD INDEX` query directly in the database or by calling the `propel-build-all` command (which will not only rebuild the table structure, but also erase all the existing data).
+
+>**TIP**
+>Indexing tends to make `SELECT` queries faster, but `INSERT`, `UPDATE`, and `DELETE` queries are slower. Also, database engines use only one index per query, and they infer the index to be used for each query based on internal heuristics. Adding an index can sometimes be disappointing in terms of performance boost, so make sure you measure the improvements.
+
+Unless specified otherwise, each request uses a single database connection in symfony, and the connection is closed at the end of the request. You can enable persistent database connections to use a pool of database connections that remain open between queries, by setting `persistent: true` in the `databases.yml` file, as shown in Listing 18-11.
+
+Listing 18-11 - Enabling Persistent Database Connection Support, in `config/databases.yml`
+
+    prod:
+      propel:
+        class:          sfPropelDatabase
+        param:
+          persistent:   true
+          dsn:          mysql://login:passwd@localhost/blog
+
+This may or may not improve the overall database performance, depending on numerous factors. The documentation on the subject is abundant on the Internet. Make sure you benchmark your application performance before and after changing this setting to validate its interest.
+
+>**SIDEBAR**
+>MySQL-specific tips
+>
+>Many settings of the MySQL configuration, found in the my.cnf file, may alter database performance. Make sure you read the online documentation ([http://dev.mysql.com/doc/refman/5.0/en/option-files.html](http://dev.mysql.com/doc/refman/5.0/en/option-files.html)) on this subject.
+>
+>One of the tools provided by MySQL is the slow queries log. All SQL statements that take more than `long_query_time` seconds to execute (this is a setting that can be changed in the `my.cnf`) are logged in a file that is quite difficult to construe by hand, but that the `mysqldumpslow` command summarizes usefully. This is a great tool to detect the queries that require optimizations.
+
+Tweaking the View
+-----------------
+
+According to how you design and implement the view layer, you may notice small slowdowns or speedups. This section describes the alternatives and their tradeoffs.
+
+### Using the Fastest Code Fragment
+
+If you don't use the caching system, you have to be aware that an `include_component()` is slightly slower than an `include_partial()`, which itself is slightly slower than a simple PHP `include`. This is because symfony instantiates a view to include a partial and an object of class `sfComponent` to include a component, which collectively add some minor overhead beyond what's required to include the file.
+
+However, this overhead is insignificant, unless you include a lot of partials or components in a template. This may happen in lists or tables, and every time you call an `include_partial()` helper inside a `foreach` statement. When you notice that a large number of partial or component inclusions have a significant impact on your performance, you may consider caching (see Chapter 12), and if caching is not an option, then switch to simple `include` statements.
+
+As for slots and component slots, the difference in performance is perceptible. The process time necessary to set and include a slot is negligible--it is equivalent to a variable instantiation. But component slots rely on a view configuration, and they require a few objects to be initiated to work. However, component slots can be cached independently from the calling templates, while slots are always cached within the template that includes them.
+
+### Speeding Up the Routing Process
+
+As explained in Chapter 9, every call to a link helper in a template asks the routing system to process an internal URI into an external URL. This is done by finding a match between the URI and the patterns of the `routing.yml` file. Symfony does it quite simply: It tries to match the first rule with the given URI, and if it doesn't work, it tries with the following, and so on. As every test involves regular expressions, this is quite time consuming.
+
+There is a simple workaround: Use the rule name instead of the module/action couple. This will tell symfony which rule to use, and the routing system won't lose time trying to match all previous rules.
+
+In concrete terms, consider the following routing rule, defined in your `routing.yml` file:
+
+    article_by_id:
+      url:          /article/:id
+      param:        { module: article, action: read }
+
+Then instead of outputting a hyperlink this way:
+
+    [php]
+    <?php echo link_to('my article', 'article/read?id='.$article->getId()) ?>
+
+you should use the fastest version:
+
+    [php]
+    <?php echo link_to('my article', '@article_by_id?id='.$article->getId()) ?>
+
+The difference starts being noticeable when a page includes a few dozen routed hyperlinks.
+
+### Skipping the Template
+
+Usually, a response is composed of a set of headers and content. But some responses don't need content. For instance, some Ajax interactions need only a few pieces of data from the server in order to feed a JavaScript program that will update different parts of the page. For this kind of short response, a set of headers alone is faster to transmit. As discussed in Chapter 11, an action can return only a JSON header. Listing 18-12 reproduces an example from Chapter 11.
+
+Listing 18-12 - Example Action Returning a JSON Header
+
+    [php]
+    public function executeRefresh()
+    {
+      $output = '<"title", "My basic letter"], ["name", "Mr Brown">';
+      $this->getResponse()->setHttpHeader("X-JSON", '('.$output.')');
+
+      return sfView::HEADER_ONLY;
+    }
+
+This skips the template and the layout, and the response can be sent at once. As it contains only headers, it is more lightweight and will take less time to transmit to the user.
+
+Chapter 6 explained another way to skip the template by returning content text directly from the action. This breaks the MVC separation, but it can increase the responsiveness of an action greatly. Check Listing 18-13 for an example.
+
+Listing 18-13 - Example Action Returning Content Text Directly
+
+    [php]
+    public function executeFastAction()
+    {
+      return $this->renderText("<html><body>Hello, World!</body></html>");
+    }
+
+### Restricting the Default Helpers
+
+The standard helper groups (`Partial`, `Cache`, and `Form`) are loaded for every request. If you are sure that you won't use some of them, removing a helper group from the list of standard ones will save you the parsing of the helper file. In particular, the Form helper group, although included by default, is quite heavy and slows down pages with no forms just because of its size. So it might be a good idea to edit the `standard_helpers` setting in the `settings.yml` file to remove it:
+
+    all:
+      .settings:
+        standard_helpers: [Partial, Cache]    # Form is removed
+
+The tradeoff is that you must declare the `Form` helper group on each template using it with `use_helper('Form')`.
+
+### Compressing the Response
+
+Symfony compresses the response before sending it to the user. This feature is based on the PHP zlib module. You can save a little CPU time for each request by deactivating it in the `settings.yml` file:
+
+    all:
+      .settings:
+        compressed: off
+
+Be aware that the CPU gain will be balanced by the bandwidth loss, so the performance won't increase in all configurations with this change.
+
+>**TIP**
+>If you deactivate zip compression in PHP, you can enable it at the server level. Apache has a compression extension of its own.
+
+Tweaking the Cache
+------------------
+
+Chapter 12 already described how to cache parts of a response or all of it. The response cache results in a major performance improvement, and it should be one of your first optimization considerations. If you want to make the most out of the cache system, read further, for this section unveils a few tricks you might not have thought of.
+
+### Clearing Selective Parts of the Cache
+
+During application development, you have to clear the cache in various situations:
+
+  * When you create a new class: Adding a class to an autoloading directory (one of the project's `lib/` folders) is not enough to have symfony find it automatically. You must clear the autoloading configuration cache so that symfony browses again all the directories of the `autoload.yml` file and references the location of autoloadable classes--including the new ones.
+  * When you change the configuration in production: The configuration is parsed only during the first request in production. Further requests use the cached version instead. So a change in the configuration in the production environment (or any environment where `SF_DEBUG` is turned off) doesn't take effect until you clear the cached version of the file.
+  * When you modify a template in an environment where the template cache is enabled: The valid cached templates are always used instead of existing templates in production, so a template change is ignored until the template cache is cleared or outdated.
+  * When you update an application with the `sync` command: This case usually covers the three previous modifications.
+
+The problem with clearing the whole cache is that the next request will take quite long to process, because the configuration cache needs to be regenerated. Besides, the templates that were not modified will be cleared from the cache as well, losing the benefit of previous requests.
+
+That means it's a good idea to clear only the cache files that really need to be regenerated. Use the options of the `clear-cache` task to define a subset of cache files to clear, as demonstrated in Listing 18-14.
+
+Listing 18-14 - Clearing Only Selective Parts of the Cache
+
+    // Clear only the cache of the myapp application
+    > symfony clear-cache myapp
+
+    // Clear only the HTML cache of the myapp application
+    > symfony clear-cache myapp template
+
+    // Clear only the configuration cache of the myapp application
+    > symfony clear-cache myapp config
+
+You can also remove files by hand in the `cache/` directory, or clear template cache files selectively from the action with the `$cacheManager->remove()` method, as described in Chapter 12.
+
+All these techniques will minimize the negative performance impact of any of the changes listed previously.
+
+>**TIP**
+>When you upgrade symfony, the cache is automatically cleared, without manual intervention (if you set the `check_symfony_version` parameter to `true` in `settings.yml`).
+
+### Generating Cached Pages
+
+When you deploy a new application to production, the template cache is empty. You must wait for users to visit a page once for this page to be put in the cache. In critical deployments, the overhead of page processing is not acceptable, and the benefits of caching must be available as soon as the first request is issued.
+
+The solution is to automatically browse the pages of your application in the staging environment (where the configuration is similar to the one in production) to have the template cache generated, then to transfer the application with the cache to production.
+
+To browse the pages automatically, one option is to create a shell script that looks through a list of external URLs with a browser (curl for instance). But there is a better and faster solution: a symfony batch using the `sfBrowser` object, already discussed in Chapter 15. That's an internal browser written in PHP (and used by `sfTestBrowser` for functional tests). It takes an external URL and returns a response, but the interesting thing is that it triggers the template cache just like a regular browser. As it only initializes symfony once and doesn't pass by the HTTP transport layer, this method is a lot faster.
+
+Listing 18-15 shows an example batch script used to generate template cache files in a staging environment. Launch it by calling `php batch/generate_cache.php`.
+
+Listing 18-15 - Generating the Template Cache, in `batch/generate_cache.php`
+
+    [php]
+    <?php
+
+    define('SF_ROOT_DIR',    realpath(dirname(__FILE__).'/..'));
+    define('SF_APP',         'myapp');
+    define('SF_ENVIRONMENT', 'staging');
+    define('SF_DEBUG',       false);
+
+    require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
+
+    // Array of URLs to browse
+    $uris = array(
+      '/foo/index',
+      '/foo/bar/id/1',
+      '/foo/bar/id/2',
+      ...
+    );
+
+    $b = new sfBrowser();
+    foreach ($uris as $uri)
+    {
+      $b->get($uri);
+    }
+
+### Using a Database Storage System for Caching
+
+The default storage system for the template cache in symfony is the file system: Fragments of HTML or serialized response objects are stored under the `cache/` directory of a project. Symfony proposes an alternative way to store cache: a SQLite database. Such a database is a simple file that PHP natively knows how to query very efficiently.
+
+To tell symfony to use SQLite storage instead of file system storage for the template cache, open the `factories.yml` file and edit the `view_cache` entry as follows:
+
+    view_cache:
+      class: sfSQLiteCache
+      param:
+        database: %SF_TEMPLATE_CACHE_DIR%/cache.db
+
+The benefits of using SQLite storage for the template cache are faster read and write operations when the number of cache elements is important. If your application makes heavy use of caching, the template cache files end up scattered in a deep file structure; in this case, switching to SQLite storage will increase performance. In addition, clearing the cache on file system storage may require a lot of files to be removed from the disk; this operation may last a few seconds, during which your application is unavailable. With a SQLite storage system, the cache clearing process results in a single file operation: the deletion of the SQLite database file. Whatever the number of cache elements currently stored, the operation is instantaneous.
+
+### Bypassing Symfony
+
+Perhaps the best way to speed symfony up is to bypass it completely . . . this is said only partly in jest. Some pages don't change and don't need to be reprocessed by the framework at each request. The template cache is already here to speed up the delivery of such pages, but it still relies on symfony.
+
+A couple of tricks described in Chapter 12 allow you to bypass symfony completely for some pages. The first one involves the use of HTTP 1.1 headers for asking the proxies and client browsers to cache the page themselves, so that they don't request it again the next time the page is needed. The second one is the super fast cache (automated by the `sfSuperCachePlugin` plug-in), which consists of storing a copy of the response in the `web/` directory and modifying the rewriting rules so that Apache first looks for a cached version before handing a request to symfony.
+
+Both these methods are very effective, and even if they only apply to static pages, they will take the burden of handling these pages off from symfony, and the server will then be fully available to deal with complex requests.
+
+### Caching the Result of a Function Call
+
+If a function doesn't rely on context-sensitive values nor on randomness, calling it twice with the same parameters should return the same result. That means the second call could very well be avoided if the result had been stored the first time. That's exactly what the `sfFunctionCache` class does. This class has a `call()` method, which expects a callable and a set of parameters. When called, this method creates an md5 hash with all its arguments and looks in the cache directory for a file named by this hash. If such a file is found, the function returns the result stored in the file. If not, the sfFunctionCache executes the function, stores the result in the cache, and returns it. So the second execution of Listing 18-16 will be faster than the first one.
+
+Listing 18-16 - Caching the Result of a Function
+
+    [php]
+    $function_cache_dir = sfConfig::get('sf_cache_dir').'/function';
+    $fc = new sfFunctionCache($function_cache_dir);
+    $result1 = $fc->call('cos', M_PI);
+    $result2 = $fc->call('preg_replace', '/\s\s+/', ' ', $input);
+
+The `sfFunctionCache` constructor expects an absolute directory path as argument (the directory must exist prior to the object instantiation). The first argument of the `call()` method must be a callable, so it can be a function name, an array of a class name and static method name, or an array of an object name and public method name. As for the other arguments of the `call()` method, you can include as many as you need--they are all handed to the callable.
+
+This object is especially useful for CPU-intensive functions, because the file I/O overhead exceeds the time required to process a simple function. It relies on the `sfFileCache` class, which is the component also used by the symfony template cache engine. Refer to the API documentation for more details.
+
+>**CAUTION**
+>The `clear-cache` task erases only the contents of the `cache/` file. If you store the function cache somewhere else, it will not be cleared automatically when you clear the cache through the command line.
+
+### Caching Data in the Server
+
+PHP accelerators provide special functions to store data in memory so that you can reuse it across requests. The problem is that they all have a different syntax, and each has its own specific way of performing this task. Symfony provides a class called `sfProcessCache`, which abstracts all these differences and works with whatever accelerator you are using. See its syntax in Listing 18-17.
+
+Listing 18-17 - Syntax of the `sfProcessCache` Methods
+
+    [php]
+    // Storing data in the process cache
+    sfProcessCache::set($name, $value, $lifetime);
+
+    // Retrieving data
+    $value = sfProcessCache::get($name);
+
+    // Checking if a piece of data exists in the process cache
+    $value_exists = sfProcessCache::has($name);
+
+    // Clear the process cache
+    sfProcessCache::clear();
+
+The `set()` method returns `false` if the caching didn't work. The cached value can be anything (a string, an array, an object); the `sfProcessCache` class will deal with the serialization. The `get()` method returns `null` if the required variable doesn't exist in the cache.
+
+The methods of the `sfProcessCache` class work even if no accelerator is installed. Therefore, there is no risk in trying to retrieve data from the process cache, as long as you provide a fallback value. For instance, Listing 18-18 shows how to retrieve a configuration setting in the process cache.
+
+Listing 18-18 - Using the Process Cache Safely
+
+    [php]
+    if (sfProcessCache::has('myapp_parameters'))
+    {
+      $params = sfProcessCache::get('myapp_parameters');
+    }
+    else
+    {
+      $params = retrieve_parameters();
+    }
+
+>**TIP**
+>If you want to go further into memory caching, make sure you take a look at the memcache extension for PHP. It can help decrease the database load on load-balanced applications, and PHP 5 provides an OO interface to it ([http://www.php.net/memcache/](http://www.php.net/memcache/)).
+
+Deactivating the Unused Features
+--------------------------------
+
+The default symfony configuration activates the most common features of a web application. However, if you happen to not need all of them, you should deactivate them to save the time their initialization takes on each request.
+
+For instance, if your application doesn't use the session mechanism, or if you want to start the session handling by hand, you should turn the `auto_start` setting to `false` in the `storage` key of the `factories.yml` file, as in Listing 18-19.
+
+Listing 18-19 - Turning Sessions Off, in `myapp/config/factories.yml`
+
+    all:
+      storage:
+        class: sfSessionStorage
+        param:
+          auto_start: false
+
+The same applies for the database (as explained in the "Tweaking the Model" section earlier in this chapter) and output escaping feature (see Chapter 7). If your application makes no use of them, deactivate them for a small performance gain, this time in the `settings.yml` file (see Listing 18-20).
+
+Listing 18-20 - Turning Features Off, in `myapp/config/settings.yml`
+
+    all:
+      .settings:
+        use_database:      off    # Database and model features
+        escaping_strategy: off    # Output escaping feature
+
+As for the security and the flash attribute features (see Chapter 6), you can deactivate them in the `filters.yml` file, as shown in Listing 18-21.
+
+Listing 18-21 - Turning Features Off, in `myapp/config/filters.yml`
+
+    rendering: ~
+    web_debug: ~
+    security:
+      enabled: off
+
+    # generally, you will want to insert your own filters here
+
+    cache:     ~
+    common:    ~
+    flash:
+      enabled: off
+
+    execution: ~
+
+Some features are useful only in development, so you should not activate them in production. This is already the case by default, since the production environment in symfony is really optimized for performance. Among the performance-impacting development features, the `SF_DEBUG` mode is the most severe. As for the symfony logs, the feature is also turned off in production by default.
+
+You may wonder how to get information about failed requests in production if logging is disabled, and argue that problems arise not only in development. Fortunately, symfony can use the `sfErrorLoggerPlugin` plug-in, which runs in the background in production and logs the details of 404 and 500 errors in a database. It is much faster than the file logging feature, because the plug-in methods are called only when a request fails, while the logging mechanism, once turned on, adds a nonnegligible overhead whatever the level. Check the installation instructions and manual at [http://www.symfony-project.com/trac/wiki/sfErrorLoggerPlugin](http://www.symfony-project.com/trac/wiki/sfErrorLoggerPlugin).
+
+>**TIP**
+>Make sure you regularly check the server error logs--they also contain very valuable information about 404 and 500 errors.
+
+Optimizing Your Code
+--------------------
+
+It's also possible to speed up your application by optimizing the code itself. This section offers some insight regarding how to do that.
+
+### Core Compilation
+
+Loading ten files requires more I/O operations than loading one long file, especially on slow disks. Loading a very long file requires more resources than loading a smaller file--especially if a large share of the file content is of no use for the PHP parser, which is the case for comments.
+
+So merging a large number of files and stripping out the comments they contain is an operation that improves performance. Symfony already does that optimization; it's called the core compilation. At the beginning of the first request (or after the cache is cleared), a symfony application concatenates all the core framework classes (`sfActions`, `sfRequest`, `sfView`, and so on) into one file, optimizes the file size by removing comments and double blanks, and saves it in the cache, in a file called `config_core_compile.yml.php`. Each subsequent request only loads this single optimized file instead of the 30 files that compose it.
+
+If your application has classes that must always be loaded, and especially if they are big classes with lots of comments, it may be beneficial to add them to the core compile file. To do so, just add a `core_compile.yml` file in your application `config/` directory, and list in it the classes that you want to add, as in Listing 18-22.
+
+Listing 18-22 - Adding Your Classes to the Core Compile File, in `myapp/config/core_compile.yml`
+
+    - %SF_ROOT_DIR%/lib/myClass.class.php
+    - %SF_ROOT_DIR%/apps/myapp/lib/myToolkit.class.php
+    - %SF_ROOT_DIR%/plugins/myPlugin/lib/myPluginCore.class.php
+    ...
+
+### The sfOptimizer Plug-In
+
+Symfony also offers another optimization tool, called `sfOptimizer`. It applies various optimization strategies to the symfony and application code, which may further speed up the execution.
+
+The symfony code counts many tests that rely on configuration parameters--and your application may also do so. For instance, if you take a look at the symfony classes, you will often see a test on the value of the `sf_logging_enabled` parameter before a call to the `sfLogger` object:
+
+    [php]
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+       $this->getContext()->getLogger()->info('Been there');
+    }
+
+Even if the `sfConfig` registry is very well optimized, the number of calls to its `get()` method during the processing of each request is important--and it counts in the final performance. One of the `sfOptimizer` optimization strategies is to replace configuration constants by their value--as long as these constants are not subject to change at runtime. That's the case, for instance, with the `sf_logging_enabled` parameter; when it is defined as `false`, the `sfOptimizer` transforms the previous code into the following:
+
+    [php]
+    if (0)
+    {
+       $this->getContext()->getLogger()->info('Been there');
+    }
+
+And that's not all, because an evident test like the preceding one also gets optimized to an empty string.
+
+To apply the optimizations, you must first install the plug-in from [http://www.symfony-project.com/trac/wiki/sfOptimizerPlugin](http://www.symfony-project.com/trac/wiki/sfOptimizerPlugin) and then call the `optimize` task, specifying an application and an environment:
+
+    > symfony optimize myapp prod
+
+If you want to apply other optimization strategies to your code, the `sfOptimizer` plug-in might be a good starting place.
+
+Summary
+-------
+
+Symfony is already a very optimized framework and is able to handle high-traffic websites without a problem. But if you really need to optimize your application's performance, tweaking the configuration (whether the server configuration, the PHP configuration, or the application settings) will gain you a small boost. You should also follow good practices to write efficient model methods; and since the database is often a bottleneck in web applications, this point should require all your attention. Templates can also benefit from a few tricks, but the best boost will always come from caching. Finally, don't hesitate to look at existing plug-ins, since some of them provide innovative techniques to further speed up the delivery of web pages (`sfSuperCache`, `sfOptimizer`).

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/19-Mastering-Symfony-s-Configuration-Files.txt
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/19-Mastering-Symfony-s-Configuration-Files.txt	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/19-Mastering-Symfony-s-Configuration-Files.txt	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,576 @@
+Chapter 19 - Mastering Symfony's Configuration Files
+====================================================
+
+Now that you know symfony very well, you are already able to dig into its code to understand its core design and discover new hidden abilities. But before extending the symfony classes to match your own requirements, you should take a closer look at some of the configuration files. Many features are already built into symfony and can be activated by just changing configuration settings. This means that you can tweak the symfony core behavior without overriding its classes. This chapter takes you deep into the configuration files and their powerful capabilities.
+
+Symfony Settings
+----------------
+
+The `myapp/config/settings.yml` file contains the main symfony configuration for the `myapp` application. You have already seen the function of many settings from this file in the previous chapters, but let's revisit them.
+
+As explained in Chapter 5, this file is environment-dependent, which means that each setting can take a different value for each environment. Remember that each parameter defined in this file is accessible from inside the PHP code via the `sfConfig` class. The parameter name is the setting name prefixed with sf_. For instance, if you want to get the value of the cache parameter, you just need to call `sfConfig::get('sf_cache')`.
+
+### Default Modules and Actions
+
+When a routing rule doesn't define the `module` or the `action` parameter, values from the `settings.yml` file are used instead:
+
+  * `default_module`: Default `module` request parameter. Defaults to the `default` module.
+  * `default_action`: Default `action` request parameter. Defaults to the `index` action.
+
+Symfony provides default pages for special situations. In the case of a routing error, symfony executes an action of the `default` module, which is stored in the `$sf_symfony_data_dir/modules/default/` directory. The `settings.yml` file defines which action is executed depending on the error:
+
+  * `error_404_module` and `error_404_action`: Action called when the URL entered by the user doesn't match any route or when an `sfError404Exception` occurs. The default value is `default/error404`.
+  * `login_module` and `login_action`: Action called when a nonauthenticated user tries to access a page defined as `secure` in `security.yml` (see Chapter 6 for details). The default value is `default/login`.
+  * `secure_module` and `secure_action`: Action called when a user doesn't have the credentials required for an action. The default value is `default/secure`.
+  * `module_disabled_module` and `module_disabled_action`: Action called when a user requests a module declared as disabled in `module.yml`. The default value is `default/disabled`.
+  * `unavailable_module` and `unavailable_action`: Action called when a user requests a page from a disabled application. The default value is `default/unavailable`. To disable an application, set the `available` parameter to `off` in `settings.yml`.
+
+Before deploying an application to production, you should customize these actions, because the `default` module templates include the symfony logo on the page. See Figure 19-1 for a screenshot of one of these pages, the error 404 page.
+
+Figure 19-1 - Default 404 error page
+
+![Default 404 error page](/images/book/F1901.jpg "Default 404 error page")
+
+You can override the default pages in two ways:
+
+  * You can create your own default module in the application's `modules/` directory, override all the actions defined in the `settings.yml` file (`index`, `error404`, `login`, `secure`, `disabled`, and `unavailable`) and all the related templates (`indexSuccess.php`, `error404Success.php`, `loginSuccess.php`, `secureSuccess.php`, `disabledSuccess.php`, and `unavailableSuccess.php`).
+  * You can change the default module and action settings of the `settings.yml` file to use pages of your application.
+
+Two other pages bear a symfony look and feel, and they also need to be customized before deployment to production. These pages are not in the `default` module, because they are called when symfony cannot run properly. Instead, you will find these default pages in the `$sf_symfony_data_dir/web/errors/` directory:
+
+  * `error500.php`: Page called when an internal server error occurs in the production environment. In other environments (where `SF_DEBUG` is set to `true`), when an error occurs, symfony displays the full execution stack and an explicit error message (see Chapter 16 for details).
+  * `unavailable.php`: Page called when a user requests a page while the cache is being cleared (that is, between a call to the `symfony clear-cache` task and the end of this task execution). On systems with a very large cache, the cache-clearing process can take several seconds. Symfony cannot execute a request with a partially cleared cache, so requests received before the end of the process are redirected to this page. The `unavailable.php` page is also used when an application is disabled via the `symfony disable` command (see Chapter 16 for details).
+
+To customize these pages, simply create `error500.php` and `unavailable.php` pages in your application's `web/errors/` directory. Symfony will use these instead of its own.
+
+>**NOTE**
+>To have requests redirected to the `unavailable.php` page when needed, you need to set the `check_lock` setting to `on` in the application `settings.yml`. The check is deactivated by default, because it adds a very slight overhead for every request.
+
+### Optional Feature Activation
+
+Some parameters of the `settings.yml` file control optional framework features that can be enabled or disabled. Deactivating unused features boosts performances a bit, so make sure to review the settings listed in Table 19-1 before deploying your application.
+
+Table 19-1 - Optional Features Set Through `settings.yml`
+
+Parameter               | Description | Default Value
+----------------------- | ----------- | -------------
+`use_database`          | Enables the database manager. Set it to `off` if you don't use a database. | `on`
+`use_security`          | Enables security features (secure actions and credentials; see Chapter 6). The default security filter (`sfBasicSecurityFilter`) is enabled only if it is `on`. | `on`
+`use_flash`             | Enables the flash parameter feature (see Chapter 6). Set it to `off` if you never use the `set_flash()` method in your actions. The flash filter (`sfFlashFilter`) is enabled only if it is on. | `on`
+`i18n`                  | Enables interface translation (see Chapter 13). Set it to `on` for multilingual applications. | `off`
+`logging_enabled`       | Enables logging of symfony events. Set it to off when you want to ignore the logging.yml settings and turn symfony logging off completely. | `on`
+`escaping_strategy`     | Enables and defines the policy of the output escaping feature (see Chapter 7). Set it to `off` if you don't use the `$sf_data` container in your templates. | `bc`
+`cache`                 | Enables template caching (see Chapter 12). Set it to `on` if one of your modules includes `cache.yml` file. The cache filter (`sfCacheFilter`) is enabled only if it is on. | `off` in development, `on` in production
+`web_debug`             | Enables the web debug toolbar for easy debugging (see Chapter 16). Set it to `on` to display the toolbar on every page. The web debug filter (`sfWebDebugFilter`) is enabled ony if it is on. | `on` in development, `off` in production
+`check_symfony_version` | Enables the check of the symfony version for every request. Set it to on for automatic cache clearing after a framework upgrade. Leave it set to off if you always clear the cache after an upgrade. | `off`
+`check_lock`            | Enables the application lock system, triggered by the `clear-cache` and `disable` tasks (see the previous section). Set it to `on` to have all requests to disabled applications redirected to the `$sf_symfony_data_dir/web/errors/unavailable.php` page. | `off`
+`compressed`            | Enables PHP response compression. Set it to `on` to compress the outgoing HTML via the PHP compression handler. | `off`
+`use_process_cache`     | Enables symfony optimizations based on PHP accelerators. When such an accelerator (for instance, APC, XCache, or eAccelerator) is installed, symfony takes advantage of its features to keep objects and configuration in memory between requests. Set the parameter to `off` in development or when you don't want PHP accelerator optimizations. Note that even if you don't have any accelerator installed, leaving it set to `on` will not harm performance. | `on`
+
+### Feature Configuration
+
+Symfony uses some parameters of `settings.yml` to alter the behavior of built-in features such as form validation, cache, and third-party modules.
+
+#### Output Escaping Settings
+
+Output escaping settings control the way the variables are accessible in the template (see Chapter 7). The `settings.yml` file includes two settings for this feature:
+
+  * The `escaping_strategy` setting can take the value `bc`, `both`, `on`, or `off`.
+  * The escaping_method setting can be set to `ESC_RAW`, `ESC_ENTITIES`, `ESC_JS`, or `ESC_JS_NO_ENTITIES`.
+
+#### Routing Settings
+
+Two routing settings (see Chapter 9) are stored in `settings.yml`:
+
+  * The `suffix` parameter sets the default suffix for generated URLs. The default value is a period (`.`), and it corresponds to no suffix. Set it to `.html`, for instance, to have all generated URLs look like static pages.
+  * The `no_script_name` parameter enables the front controller name in generated URLs. The `no_script_name` setting can be on only for a single application in a project, unless you store the front controllers in various directories and alter the default URL rewriting rules. It is usually on for the production environment of your main application and off for the others.
+
+#### Form Validation Settings
+
+Form validation settings control the way error messages output by the `Validation` helpers look (see Chapter 10). These errors are included in `<div>` tags, and they use the `validation_error_ class` setting as a `class` attribute and the `validation_error_id_prefix` setting to build up the `id` attribute. The default values are `form_error` and `error_for_`, so the attributes output by a call to the `form_error()` helper for an input named `foobar` will be `class="form_error" id="error_for_foobar"`.
+
+Two settings determine which characters precede and follow each error message: `validation_error_prefix` and `validation_error_suffix`. You can change them to customize all error messages at once.
+
+#### Cache Settings
+
+Cache settings are defined in `cache.yml` for the most part, except for two in `settings.yml`: `cache` enables the template cache mechanism, and `etag` enables ETag handling on the server side (see Chapter 15).
+
+#### Logging Settings
+
+Two logging settings (see Chapter 16) are stored in `settings.yml`:
+
+  * `error_reporting` specifies which events are logged in the PHP logs. By default, it is set to 341 for the production environment (so the logged events are `E_PARSE`, `E_COMPILE_ERROR`, `E_ERROR`, `E_CORE_ERROR`, and `E_USER_ERROR`) and to 4095 for the development environment (`E_ALL` and `E_STRICT`).
+  * The `web_debug` setting activates the web debug toolbar. Set it to `on` only in the development and test environments.
+
+#### Paths to Assets
+
+The `settings.yml` file also stores paths to assets. If you want to use another version of the asset than the one bundled with symfony, you can change these path settings:
+
+  * Rich text editor JavaScript files stored in `rich_text_js_dir` (by default, `js/tiny_mce`)
+  * Prototype libraries stored in `prototype_web_dir` (by default, `/sf/prototype`)
+  * Files needed by the administration generator stored in `admin_web_dir`
+  * Files needed by the web debug toolbar stored in `web_debug_web_dir`
+  * Files needed by the javascript calendar stored in `calendar_web_dir`
+
+#### Default Helpers
+
+Default helpers, loaded for every template, are declared in the `standard_helpers` setting (see Chapter 7). By default, these are the `Partial`, `Cache`, and `Form` helper groups. If you use a helper group in all templates of an application, adding its name to the `standard_helpers` setting saves you the hassle of declaring it with `use_helper()` on each template.
+
+#### Activated Modules
+
+Activated modules from plug-ins or from the symfony core are declared in the `enabled_modules` parameter. Even if a plug-in bundles a module, users can't request this module unless it is declared in `enabled_modules`. The `default` module, which provides the default symfony pages (congratulations, page not found, and so on), is the only enabled module by default.
+
+#### Character Set
+
+The character set of the responses is a general setting of the application, because it is used by many components of the framework (templates, output escaper, helpers, and so on). Defined in the `charset` setting, its default (and advised) value is `utf-8`.
+
+#### Miscellaneous Configuration
+
+The `settings.yml` file contains a few more parameters, used internally by symfony for core behaviors. Listing 19-1 lists them as they appear in the configuration file.
+
+Listing 19-1 - Miscellaneous Configuration Settings, in `myapp/config/settings.yml`
+
+    # Remove comments in core framework classes as defined in the core_compile.yml
+    strip_comments:         on
+    # Functions called when a class is requested and not already loaded
+    # Expects an array of callables. Used by the framework bridges.
+    autoloading_functions:  ~
+    # Session timeout, in seconds
+    timeout:                1800
+    # Maximum number of forwards followed by the action before raising an exception
+    max_forwards:           5
+    # Global constants
+    path_info_array:        SERVER
+    path_info_key:          PATH_INFO
+    url_format:             PATH
+
+>**SIDEBAR**
+>Adding Your application settings
+>
+>The `settings.yml` file defines symfony settings for an application. As discussed in Chapter 5, when you want to add new parameters, the best place to do so is in the `myapp/config/app.yml` file. This file is also environment-dependent, and the settings it defines are available through the sfConfig class with the `app_` prefix.
+>
+>
+>     all:
+>       creditcards:
+>         fake:             off    # app_creditcards_fake
+>         visa:             on     # app_creditcards_visa
+>         americanexpress:  on     # app_creditcards_americanexpress
+>
+>
+>You can also write an `app.yml` file in the project configuration directory, and this provides a way to define custom project settings. The configuration cascade also applies to this file, so the settings defined in the application `app.yml` file override the ones defined at the project level.
+
+Extending the Autoloading Feature
+---------------------------------
+
+The autoloading feature, briefly explained in Chapter 2, exempts you from requiring classes in your code if they are located in specific directories. This means that you can just let the framework do the job for you, allowing it to load only the necessary classes at the appropriate time, and only when needed.
+
+The `autoload.yml` file lists the paths in which autoloaded classes are stored. The first time this configuration file is processed, symfony parses all the directories referenced in the file. Each time a file ending with `.php` is found in one of these directories, the file path and the class names found in this file are added to an internal list of autoloading classes. This list is saved in the cache, in a file called `config/config_autoload.yml.php`. Then, at runtime, when a class is used, symfony looks in this list for the class path and includes the `.php` file automatically.
+
+Autoloading works for all `.php` files containing classes and/or interfaces.
+
+By default, classes stored in the following directories in your projects benefit from the autoloading automatically:
+
+  * `myproject/lib/`
+  * `myproject/lib/model`
+  * `myproject/apps/myapp/lib/`
+  * `myproject/apps/myapp/modules/mymodule/lib`
+
+There is no `autoload.yml` file in the default application configuration directory. If you want to modify the framework settings--for instance, to autoload classes stored somewhere else in your file structure--create an empty autoload.yml file and override the settings of `$sf_symfony_data_dir/config/autoload.yml` or add your own.
+
+The autoload.yml file must start with an autoload: key and list the locations where symfony should look for classes. Each location requires a label; this gives you the ability to override symfony's entries. For each location, provide a `name` (it will appear as a comment in `config_autoload.yml.php`) and an absolute `path`. Then define if the search must be `recursive`, which directs symfony to look in all the subdirectories for `.php` files, and `exclude` the subdirectories you want. Listing 19-2 shows the locations used by default and the file syntax.
+
+Listing 19-2 - Default Autoloading Configuration, in `$sf_symfony_data_dir/config/autoload.yml`
+
+    autoload:
+
+      # symfony core
+      symfony:
+        name:           symfony
+        path:           %SF_SYMFONY_LIB_DIR%
+        recursive:      on
+        exclude:        [vendor]
+
+      propel:
+        name:           propel
+        path:           %SF_SYMFONY_LIB_DIR%/vendor/propel
+        recursive:      on
+
+      creole:
+        name:           creole
+        path:           %SF_SYMFONY_LIB_DIR%/vendor/creole
+        recursive:      on
+
+      propel_addon:
+        name:           propel addon
+        files:
+          Propel:       %SF_SYMFONY_LIB_DIR%/addon/propel/sfPropelAutoload.php
+
+      # plugins
+      plugins_lib:
+        name:           plugins lib
+        path:           %SF_PLUGINS_DIR%/*/lib
+        recursive:      on
+
+      plugins_module_lib:
+        name:           plugins module lib
+        path:           %SF_PLUGINS_DIR%/*/modules/*/lib
+        prefix:         2
+        recursive:      on
+
+      # project
+      project:
+        name:           project
+        path:           %SF_LIB_DIR%
+        recursive:      on
+        exclude:        [model, symfony]
+
+      project_model:
+        name:           project model
+        path:           %SF_MODEL_LIB_DIR%
+        recursive:      on
+
+      # application
+      application:
+        name:           application
+        path:           %SF_APP_LIB_DIR%
+        recursive:      on
+
+      modules:
+        name:           module
+        path:           %SF_APP_DIR%/modules/*/lib
+        prefix:         1
+        recursive:      on
+
+A rule path can contain wildcards and use the file path parameters from the `constants.php` file (see the next section). If you use these parameters in the configuration file, they must appear in uppercase and begin and end with `%`.
+
+Editing your own `autoload.yml` will add new locations to symfony's autoloading, but you may want to extend this mechanism and add your own autoloading handler to symfony's handler. This is possible through the `autoloading_functions` parameter in the `settings.yml` file. It expects an array of callables as a value, as follows:
+
+    .settings:
+      autoloading_functions:
+        - [myToolkit, autoload]
+
+When symfony encounters a new class, it will first try its own autoloading system (and use the locations defined in `autoload.yml`). If it doesn't find a class definition, it will then try the other autoloading functions from `settings.yml`, until the class is found. So you can add as many autoloading mechanisms as you want--for instance, to provide a bridge to other framework components (see Chapter 17).
+
+Custom File Structure
+---------------------
+
+Each time the framework uses a path to look for something (from core classes to templates, plug-ins, configurations, and so on), it uses a path variable instead of an actual path. By changing these variables, you can completely alter the directory structure of a symfony project, and adapt to the file organization requirements of any client.
+
+>**CAUTION**
+>Customizing the directory structure of a symfony project is possible but not necessarily a good idea. One of the strengths of a framework like symfony is that any web developer can look at a project built with it and feel at home, because of the respect for conventions. Make sure you consider this issue before deciding to use your own directory structure.
+
+### The Basic File Structure
+
+The path variables are defined in the `$sf_symfony_data_dir/config/constants.php` file, included when the application bootstraps. These variables are stored in the `sfConfig` object, and so they are easy to override. Listing 19-3 shows a listing of the path variables and the directory they reference.
+
+Listing 19-3 - Default File Structure Variables, from `$sf_symfony_data_dir/config/constants.php`
+
+    sf_root_dir           # myproject/
+                          #   apps/
+    sf_app_dir            #     myapp/
+    sf_app_config_dir     #       config/
+    sf_app_i18n_dir       #       i18n/
+    sf_app_lib_dir        #       lib/
+    sf_app_module_dir     #       modules/
+    sf_app_template_dir   #       templates/
+    sf_bin_dir            #   batch/
+                          #   cache/
+    sf_base_cache_dir     #     myapp/
+    sf_cache_dir          #       prod/
+    sf_template_cache_dir #         templates/
+    sf_i18n_cache_dir     #         i18n/
+    sf_config_cache_dir   #         config/
+    sf_test_cache_dir     #         test/
+    sf_module_cache_dir   #         modules/
+    sf_config_dir         #   config/
+    sf_data_dir           #   data/
+    sf_doc_dir            #   doc/
+    sf_lib_dir            #   lib/
+    sf_model_lib_dir      #     model/
+    sf_log_dir            #   log/
+    sf_test_dir           #   test/
+    sf_plugins_dir        #   plugins/
+    sf_web_dir            #   web/
+    sf_upload_dir         #     uploads/
+
+Every path to a key directory is determined by a parameter ending with `_dir`. Always use the path variables instead of real (relative or absolute) file paths, so that you will be able to change them later, if necessary. For instance, when you want to move a file to the `uploads/` directory in an application, you should use `sfConfig::get('sf_upload_dir')` for the path instead of `SF_ROOT_DIR.'/web/uploads/'`.
+
+The module directory structure is defined at runtime, when the routing system determines the module name (`$module_name`). It is automatically built according to the path names defined in the `constants.php` file, as shown in Listing 19-4.
+
+Listing 19-4 - Default Module File Structure Variables
+
+    sf_app_module_dir                 # modules/
+    module_name                       #  mymodule/
+    sf_app_module_action_dir_name     #    actions/
+    sf_app_module_template_dir_name   #    templates/
+    sf_app_module_lib_dir_name        #    lib/
+    sf_app_module_view_dir_name       #    views/
+    sf_app_module_validate_dir_name   #    validate/
+    sf_app_module_config_dir_name     #    config/
+    sf_app_module_i18n_dir_name       #    i18n/
+
+So, for instance, the path to the `validate/` directory of the current module is built dynamically at runtime:
+
+    [php]
+    sfConfig::get('sf_app_module_dir').'/'.$module_name.'/'.sfConfig::get('sf_app_module_validate_dir_name')
+
+### Customizing the File Structure
+
+You will probably need to modify the default project file structure if you develop an application for a client who already has a defined directory structure and who is not willing to change it to comply with the symfony logic. By overriding the `sf_XXX_dir` and `sf_XXX_dir_name` variables with `sfConfig`, you can make symfony work for a totally different directory structure than the default structure. The best place to do this is in the application `config.php` file.
+
+>**CAUTION**
+>Use the application `config.php` and not the project one to override the `sf_XXX_dir` and `sf_XXX_dir_name` variables with `sfConfig`. The project `config/config.php` file is loaded very early in the life of a request, at a time when the `sfConfig` class doesn't exist yet, and when the `constants.php` file is not yet loaded.
+
+For instance, if you want all applications to share a common directory for the template layouts, add this line to the `myapp/config/config.php` file to override the `sf_app_template_dir` settings:
+
+    [php]
+    sfConfig::set('sf_app_template_dir', sfConfig::get('sf_root_dir').DIRECTORY_SEPARATOR.'templates');
+
+Note that the application config.php file is not empty, so if you need to include file structure definitions there, do it at the end of the file.
+
+### Modifying the Project Web Root
+
+All the paths built in `constants.php` rely on the project root directory, which is a constant defined in the front controller (`SF_ROOT_DIR`). Usually, the root directory is one level above the `we`b/ directory, but you can use a different structure. Suppose that your main directory structure is made of two directories, one public and one private, as shown in Listing 19-5. This typically happens when hosting a project on a shared host.
+
+Listing 19-5 - Example of Custom Directory Structure for a Shared Host
+
+    symfony/    # Private area
+      apps/
+      batch/
+      cache/
+      ...
+    www/        # Public area
+      images/
+      css/
+      js/
+      index.php
+
+In this case, the root directory is the `symfony/` directory. So the `index.php` front controller simply needs to define the `SF_ROOT_DIR` as follows for the application to work:
+
+    [php]
+    define('SF_ROOT_DIR', dirname(__FILE__).'/../symfony');
+
+In addition, since the public area is `www/` instead of the usual `web/`, you must override two file paths in the application `config.php` file, as follows:
+
+    [php]
+    sfConfig::add(array(
+      'sf_web_dir'      => SF_ROOT_DIR.DIRECTORY_SEPARATOR.'www',
+      'sf_upload_dir'   => SF_ROOT_DIR.DIRECTORY_SEPARATOR.'www'.DIRECTORY_SEPARATOR.sfConfig::get('sf_upload_dir_name'),
+    ));
+
+### Linking to Symfony Libraries
+
+The paths to the framework files are defined in the project `config.php` file, as you can see in Listing 19-6.
+
+Listing 19-6 - The Paths to the Framework Files, in `myproject/config/config.php`
+
+    [php]
+    <?php
+
+    // symfony directories
+    $sf_symfony_lib_dir  = '/path/to/symfony/lib';
+    $sf_symfony_data_dir = '/path/to/symfony/data';
+
+These paths are initialized when you call a `symfony init-project` from the command line, and refer to the symfony installation used to build the project. They are used both by the command line and by the MVC architecture.
+
+This means that you can switch to another installation of symfony by changing the paths to the framework files.
+
+These paths should be absolute, but by using `dirname(__FILE__)`, you can refer to files inside the project structure and preserve independence of the chosen directory for the project installation. For instance, many projects choose to have the symfony `lib/` directory appear as a symbolic link in the project `lib/symfony/` directory, and do the same for the symfony `data/` directory, as follows:
+
+    myproject/
+      lib/
+        symfony/ => /path/to/symfony/lib
+      data/
+        symfony/ => /path/to/symfony/data
+
+In this case, the project config.php file just needs to define the symfony directories as follows:
+
+    [php]
+    $sf_symfony_lib_dir  = dirname(__FILE__).'/../lib/symfony';
+    $sf_symfony_data_dir = dirname(__FILE__).'/../data/symfony';
+
+The same principle also applies if you choose to include the symfony files as a `svn:externals` in the project `lib/vendor/` directory:
+
+    myproject/
+      lib/
+        vendor/
+          svn:externals symfony http://svn.symfony-project.com/trunk/
+
+In this case, the `config.php` file should look like this:
+
+    [php]
+    $sf_symfony_lib_dir  = dirname(__FILE__).'/../lib/vendor/symfony/lib';
+    $sf_symfony_data_dir = dirname(__FILE__).'/../lib/vendor/symfony/data';
+
+>**TIP**
+>Sometimes, the different servers running an application don't have the same path to the symfony libraries. One way to enable that is to exclude the project `config.php` file from the synchronization (by adding it to `rsync_exclude.txt`). Another method is to keep the same paths in the development and production versions of `config.php`, but to have these paths point to symbolic links that can vary according to the server.
+
+Understanding Configuration Handlers
+------------------------------------
+
+Each configuration file has a handler. The job of configuration handlers is to manage the configuration cascade, and to do the translation between the configuration files and the optimized PHP code executable at runtime.
+
+### Default Configuration Handlers
+
+The default handler configuration is stored in `$sf_symfony_data_dir/config/config_handlers.yml`. This file links the handlers to the configuration files according to a file path. Listing 19-7 shows an extract of this file.
+
+Listing 19-7 - Extract of `$sf_symfony_data_dir/config/config_handlers.yml`
+
+    config/settings.yml:
+      class:    sfDefineEnvironmentConfigHandler
+      param:
+        prefix: sf_
+
+    config/app.yml:
+      class:    sfDefineEnvironmentConfigHandler
+      param:
+        prefix: app_
+
+    config/filters.yml:
+      class:    sfFilterConfigHandler
+
+    modules/*/config/module.yml:
+      class:    sfDefineEnvironmentConfigHandler
+      param:
+        prefix: mod_
+        module: yes
+
+For each configuration file (`config_handlers.yml` identifies each file by a file path with wildcards), the handler class is specified under the `class` key.
+
+The settings of configuration files handled by `sfDefineEnvironmentConfigHandler` can be made available directly in the code via the `sfConfig` class, and the param key contains a prefix value.
+
+You can add or modify the handlers used to process each configuration file--for instance, to use INI or XML files instead of YAML files.
+
+>**NOTE**
+>The configuration handler for the `config_handlers.yml` file is `sfRootConfigHandler` and, obviously, it cannot be changed.
+
+If you ever need to modify the way the configuration is parsed, create an empty `config_handlers.yml` file in your application's `config/` folder and override the `class` lines with the classes you wrote.
+
+### Adding Your Own Handler
+
+Using a handler to deal with a configuration file provides two important benefits:
+
+  * The configuration file is transformed into executable PHP code, and this code is stored in the cache. This means that the configuration is parsed only once in production, and the performance is optimal.
+  * The configuration file can be defined at different levels (project and application) and the final parameter values will result from a cascade. So you can define parameters at a project level and override them on a per-application basis.
+
+If you feel like writing your own configuration handler, follow the example of the structure used by the framework in the `$sf_symfony_lib_dir/config/` directory.
+
+Let's suppose that your application contains a `myMapAPI` class, which provides an interface to a third-party web service delivering maps. This class needs to be initialized with a URL and a user name, as shown in Listing 19-8.
+
+Listing 19-8 - Example of Initialization of the `myMapAPI` Class
+
+    [php]
+    $mapApi = new myMapAPI();
+    $mapApi->setUrl($url);
+    $mapApi->setUser($user);
+
+You may want to store these two parameters in a custom configuration file called `map.yml`, located in the application config/ directory. This configuration file might contain the following:
+
+    api:
+      url:  map.api.example.com
+      user: foobar
+
+In order to transform these settings into code equivalent to Listing 19-8, you must build a configuration handler. Each configuration handler must extend `sfConfigHandler` and provide an `execute()` method, which expects an array of file paths to configuration files as a parameter, and must return data to be written in a cache file. Handlers for YAML files should extend the `sfYamlConfigHandler` class, which provides additional facilities for YAML parsing. For the `map.yml` file, a typical configuration handler could be written as shown in Listing 19-9.
+
+Listing 19-9 - A Custom Configuration Handler, in `myapp/lib/myMapConfigHandler.class.php`
+
+    [php]
+    <?php
+
+    class myMapConfigHandler extends sfYamlConfigHandler
+    {
+      public function execute($configFiles)
+      {
+        $this->initialize();
+
+        // Parse the yaml
+        $config = $this->parseYamls($configFiles);
+
+        $data  = "<?php\n";
+        $data. = "\$mapApi = new myMapAPI();\n";
+
+        if (isset($config['api']['url'])
+        {
+          $data. = sprintf("\$mapApi->setUrl('%s');\n", $config['api']['url']);
+        }
+
+        if (isset($config['api']['user'])
+        {
+          $data. = sprintf("\$mapApi->setUser('%s');\n", $config['api']['user']);
+        }
+
+        return $data;
+      }
+    }
+
+The `$configFiles` array that symfony passes to the `execute()` method will contain a path to all the `map.yml` files found in the `config/` folders. The `parseYamls()` method will handle the configuration cascade.
+
+In order to associate this new handler with the `map.yml` file, you must create a `config_handlers.yml` configuration file with the following content:
+
+    config/map.yml:
+      class: myMapConfigHandler
+
+>**NOTE**
+>The `class` must either be autoloaded (that's the case here) or defined in the file whose path is written in a `file` parameter under the `param` key.
+
+When you need the code based on the `map.yml` file and generated by the `myMapConfigHandler` handler in your application, call the following line:
+
+    [php]
+    include(sfConfigCache::getInstance()->checkConfig(sfConfig::get('sf_app_config_dir_name').'/map.yml'));
+
+When calling the `checkConfig()` method, symfony looks for existing `map.yml` files in the configuration directories and processes them with the handler specified in the `config_handlers.yml` file, if a `map.yml.php` does not already exist in the cache or if the `map.yml` file is more recent than the cache.
+
+>**TIP**
+>If you want to handle environments in a YAML configuration file, the handler can extend the `sfDefineEnvironmentConfigHandler` class instead of `sfYamlConfigHandler`. After calling the `parseYaml()` method to retrieve configuration, you should call the `mergeEnvironment()` method. You can do it all in one line by calling `$config = $this->mergeEnvironment($this->parseYamls ($configFiles));`.
+
+-
+
+>**SIDEBAR**
+>Using Existing configuration handlers
+>
+>If you just need to allow users to retrieve values from the code via `sfConfig`, you can use the `sfDefineEnvironmentConfigHandler` configuration handler class. For instance, to have the `url` and `user` parameters available as `sfConfig::get('map_url')` and `sfConfig::get('map_user')`, define your handler as follows:
+>
+>     config/map.yml:
+>       class: sfDefineEnvironmentConfigHandler
+>       param:
+>         prefix: map_
+>
+>Be careful not to choose a prefix already used by another handler. Existing prefixes are sf_, app_, and mod_.
+
+Controlling PHP Settings
+------------------------
+
+In order to have a PHP environment compatible with the rules and best practices of agile development, symfony checks and overrides a few settings of the `php.ini` configuration. This is the purpose of the `php.yml` file. Listing 19-10 shows the default `php.yml` file.
+
+Listing 19-10 - Default PHP Settings for Symfony, in `$sf_symfony_data_dir/config/php.yml`
+
+    set:
+      magic_quotes_runtime:        off
+      log_errors:                  on
+      arg_separator.output:        |
+        &amp;
+
+    check:
+      zend.ze1_compatibility_mode: off
+
+    warn:
+      magic_quotes_gpc:            off
+      register_globals:            off
+      session.auto_start:          off
+
+The main purpose of this file is to check that the PHP configuration is compatible with your application. It is also very useful to check that your development server configuration is as similar as possible to the production server. That's why you should inspect the production server configuration at the beginning of a project, and report its PHP settings in a `php.yml` file in your project. You can then develop and test with confidence that you will not encounter any compatibility errors once you deploy your project to the production platform.
+
+The variables defined under the `set` header are modified (despite how they were defined in the server `php.ini` file). The variables defined under the `warn` category cannot be modified on the fly, but symfony can run even if they are not properly set. It is just considered bad practice to have these settings set to on, and symfony will log a warning in this case. The variables defined under the `check` category cannot be modified on the fly either, but they must have a certain value for symfony to run. So, in this case, an exception is raised if the `php.ini` file is not correct.
+
+The default php.yml file sets log_errors to on so that you can trace errors in symfony projects. It also recommends that the `register_globals` be set to `off` to prevent security breaches.
+
+If you don't want symfony to apply these settings, or if you want to run a project with `magic_quotes_gpc` and `register_globals` set to `on` without warning, then create a `php.yml` file in your application `config/` directory, and override the settings you want to change.
+
+Additionally, if your project requires an extension, you can specify it under the `extensions` category. It expects an array of extension names, as follows:
+
+    extensions: [gd, mysql, mbstring]
+
+Summary
+-------
+
+The configuration files can heavily modify the way the framework works. Because symfony relies on configuration even for its core features and file loading, it can adapt to many more environments than just the standard dedicated host. This great configurability is one of the main strengths of symfony. Even if it sometimes frightens newcomers, who see in configuration files a lot of conventions to learn, it allows symfony applications to be compatible with a very large number of platforms and environments. Once you become a master of symfony's configuration, no server will ever refuse to run your applications!

Added: prosistem/alba/trunk/dist/symfony-1.0.0/doc/LICENSE
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/doc/LICENSE	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/doc/LICENSE	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,119 @@
+GNU Free Documentation License
+
+  * Version 1.2, November 2002
+  * Copyright © 2000, 2001, 2002 Free Software Foundation, Inc.
+  * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 
+
+## 0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. 
+
+This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. 
+
+We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 
+
+## 1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a worldwide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. 
+
+A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. 
+
+A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. 
+
+The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. 
+
+The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. 
+
+A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". 
+
+Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. 
+
+The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. 
+
+A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. 
+
+The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 
+
+## 2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. 
+
+You may also lend copies, under the same conditions stated above, and you may publicly display copies. 
+
+## 3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. 
+
+Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. 
+
+If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. 
+
+If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. 
+
+It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 
+
+## 4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: 
+
+* Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.
+* List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.
+* State on the Title page the name of the publisher of the Modified Version, as the publisher.
+* Preserve all the copyright notices of the Document.
+* Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
+* Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.
+* Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice.
+* Include an unaltered copy of this License.
+* Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.
+* Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.
+* For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.
+* Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.
+* Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version.
+* Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section.
+* Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. 
+
+You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. 
+
+You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. 
+
+The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 
+
+## 5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. 
+
+The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. 
+
+In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". 
+
+## 6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. 
+
+You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 
+
+## 7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. 
+
+If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 
+
+## 8. TRANSLATION
+
+Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. 
+
+If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 
+
+## 9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 
+
+## 10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See `http://www.gnu. org/copyleft/`. 
+
+Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. 

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/VERSION
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/VERSION	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/VERSION	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+1.0.0
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfAction.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfAction.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfAction.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,453 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfAction executes all the logic for the current request.
+ *
+ * @package    symfony
+ * @subpackage action
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfAction.class.php 3209 2007-01-10 08:37:24Z fabien $
+ */
+abstract class sfAction extends sfComponent
+{
+  protected
+    $security = array();
+
+  /**
+   * Initializes this action.
+   *
+   * @param sfContext The current application context.
+   *
+   * @return bool true, if initialization completes successfully, otherwise false
+   */
+  public function initialize($context)
+  {
+    parent::initialize($context);
+
+    // include security configuration
+    require(sfConfigCache::getInstance()->checkConfig(sfConfig::get('sf_app_module_dir_name').'/'.$this->getModuleName().'/'.sfConfig::get('sf_app_module_config_dir_name').'/security.yml', true));
+
+    return true;
+  }
+
+  /**
+   * Executes an application defined process prior to execution of this sfAction object.
+   *
+   * By default, this method is empty.
+   */
+  public function preExecute()
+  {
+  }
+
+  /**
+   * Execute an application defined process immediately after execution of this sfAction object.
+   *
+   * By default, this method is empty.
+   */
+  public function postExecute()
+  {
+  }
+
+  /**
+   * Forwards current action to the default 404 error action.
+   *
+   * @param  string Message of the generated exception
+   *
+   * @throws sfError404Exception
+   *
+   */
+  public function forward404($message = '')
+  {
+    throw new sfError404Exception($message);
+  }
+
+  /**
+   * Forwards current action to the default 404 error action unless the specified condition is true.
+   *
+   * @param bool A condition that evaluates to true or false
+   * @param  string Message of the generated exception
+   *
+   * @throws sfError404Exception
+   */
+  public function forward404Unless($condition, $message = '')
+  {
+    if (!$condition)
+    {
+      throw new sfError404Exception($message);
+    }
+  }
+
+  /**
+   * Forwards current action to the default 404 error action if the specified condition is true.
+   *
+   * @param bool A condition that evaluates to true or false
+   * @param  string Message of the generated exception
+   *
+   * @throws sfError404Exception
+   */
+  public function forward404If($condition, $message = '')
+  {
+    if ($condition)
+    {
+      throw new sfError404Exception($message);
+    }
+  }
+
+  /**
+   * Redirects current action to the default 404 error action (with browser redirection).
+   *
+   * This method stops the current code flow.
+   *
+   */
+  public function redirect404()
+  {
+    return $this->redirect('/'.sfConfig::get('sf_error_404_module').'/'.sfConfig::get('sf_error_404_action'));
+  }
+
+  /**
+   * Forwards current action to a new one (without browser redirection).
+   *
+   * This method stops the action. So, no code is executed after a call to this method.
+   *
+   * @param  string A module name
+   * @param  string An action name
+   *
+   * @throws sfStopException
+   */
+  public function forward($module, $action)
+  {
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfAction} forward to action "'.$module.'/'.$action.'"');
+    }
+
+    $this->getController()->forward($module, $action);
+
+    throw new sfStopException();
+  }
+
+  /**
+   * If the condition is true, forwards current action to a new one (without browser redirection).
+   *
+   * This method stops the action. So, no code is executed after a call to this method.
+   *
+   * @param  bool   A condition that evaluates to true or false
+   * @param  string A module name
+   * @param  string An action name
+   *
+   * @throws sfStopException
+   */
+  public function forwardIf($condition, $module, $action)
+  {
+    if ($condition)
+    {
+      $this->forward($module, $action);
+    }
+  }
+
+  /**
+   * Unless the condition is true, forwards current action to a new one (without browser redirection).
+   *
+   * This method stops the action. So, no code is executed after a call to this method.
+   *
+   * @param  bool   A condition that evaluates to true or false
+   * @param  string A module name
+   * @param  string An action name
+   *
+   * @throws sfStopException
+   */
+  public function forwardUnless($condition, $module, $action)
+  {
+    if (!$condition)
+    {
+      $this->forward($module, $action);
+    }
+  }
+
+  /**
+   * Redirects current request to a new URL.
+   *
+   * 2 URL formats are accepted :
+   *  - a full URL: http://www.google.com/
+   *  - an internal URL (url_for() format): module/action
+   *
+   * This method stops the action. So, no code is executed after a call to this method.
+   *
+   * @param  string Url
+   * @param  string Status code (default to 302)
+   *
+   * @throws sfStopException
+   */
+  public function redirect($url, $statusCode = 302)
+  {
+    $url = $this->getController()->genUrl($url, true);
+
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfAction} redirect to "'.$url.'"');
+    }
+
+    $this->getController()->redirect($url, 0, $statusCode);
+
+    throw new sfStopException();
+  }
+
+  /**
+   * Redirects current request to a new URL, only if specified condition is true.
+   *
+   * This method stops the action. So, no code is executed after a call to this method.
+   *
+   * @param  bool   A condition that evaluates to true or false
+   * @param  string url
+   *
+   * @throws sfStopException
+   *
+   * @see redirect
+   */
+  public function redirectIf($condition, $url)
+  {
+    if ($condition)
+    {
+      $this->redirect($url);
+    }
+  }
+
+  /**
+   * Redirects current request to a new URL, unless specified condition is true.
+   *
+   * This method stops the action. So, no code is executed after a call to this method.
+   *
+   * @param  bool   A condition that evaluates to true or false
+   * @param  string Url
+   *
+   * @throws sfStopException
+   *
+   * @see redirect
+   */
+  public function redirectUnless($condition, $url)
+  {
+    if (!$condition)
+    {
+      $this->redirect($url);
+    }
+  }
+
+  /**
+   * Appends the given text to the response content and bypasses the built-in view system.
+   *
+   * This method must be called as with a return:
+   *
+   * <code>return $this->renderText('some text')</code>
+   *
+   * @param  string Text to append to the response
+   *
+   * @return sfView::NONE
+   */
+  public function renderText($text)
+  {
+    $this->getResponse()->setContent($this->getResponse()->getContent().$text);
+
+    return sfView::NONE;
+  }
+
+  /**
+   * Retrieves the default view to be executed when a given request is not served by this action.
+   *
+   * @return string A string containing the view name associated with this action
+   */
+  public function getDefaultView()
+  {
+    return sfView::INPUT;
+  }
+
+  /**
+   * Retrieves the request methods on which this action will process validation and execution.
+   *
+   * @return int One of the following values:
+   *
+   * - sfRequest::GET
+   * - sfRequest::POST
+   * - sfRequest::PUT
+   * - sfRequest::DELETE
+   * - sfRequest::HEAD
+   * - sfRequest::NONE
+   *
+   * @see sfRequest
+   */
+  public function getRequestMethods()
+  {
+    return sfRequest::GET
+           | sfRequest::POST
+           | sfRequest::PUT
+           | sfRequest::DELETE
+           | sfRequest::HEAD 
+           | sfRequest::NONE;
+  }
+
+  /**
+   * Executes any post-validation error application logic.
+   *
+   * @return string A string containing the view name associated with this action
+   */
+  public function handleError()
+  {
+    return sfView::ERROR;
+  }
+
+  /**
+   * Validates manually files and parameters.
+   *
+   * @return bool true, if validation completes successfully, otherwise false.
+   */
+  public function validate()
+  {
+    return true;
+  }
+
+  /**
+   * Returns the security configuration for this module.
+   *
+   * @return string Current security configuration as an array
+   */
+  public function getSecurityConfiguration()
+  {
+    return $this->security;
+  }
+
+  /**
+   * Overrides the current security configuration for this module.
+   *
+   * @param array The new security configuration
+   */
+  public function setSecurityConfiguration($security)
+  {
+    $this->security = $security;
+  }
+
+  /**
+   * Indicates that this action requires security.
+   *
+   * @return bool true, if this action requires security, otherwise false.
+   */
+  public function isSecure()
+  {
+    if (isset($this->security[$this->getActionName()]['is_secure']))
+    {
+      return $this->security[$this->getActionName()]['is_secure'];
+    }
+
+    if (isset($this->security['all']['is_secure']))
+    {
+      return $this->security['all']['is_secure'];
+    }
+
+    return false;
+  }
+
+  /**
+   * Gets credentials the user must have to access this action.
+   *
+   * @return mixed An array or a string describing the credentials the user must have to access this action
+   */
+  public function getCredential()
+  {
+    if (isset($this->security[$this->getActionName()]['credentials']))
+    {
+      $credentials = $this->security[$this->getActionName()]['credentials'];
+    }
+    else if (isset($this->security['all']['credentials']))
+    {
+      $credentials = $this->security['all']['credentials'];
+    }
+    else
+    {
+      $credentials = null;
+    }
+
+    return $credentials;
+  }
+
+  /**
+   * Sets an alternate template for this sfAction.
+   *
+   * See 'Naming Conventions' in the 'Symfony View' documentation.
+   *
+   * @param string Template name
+   */
+  public function setTemplate($name)
+  {
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfAction} change template to "'.$name.'"');
+    }
+
+    $this->getResponse()->setParameter($this->getModuleName().'_'.$this->getActionName().'_template', $name, 'symfony/action/view');
+  }
+
+  /**
+   * Gets the name of the alternate template for this sfAction.
+   *
+   * WARNING: It only returns the template you set with the setTemplate() method,
+   *          and does not return the template that you configured in your view.yml.
+   *
+   * See 'Naming Conventions' in the 'Symfony View' documentation.
+   *
+   * @return string Template name. Returns null if no template has been set within the action
+   */
+  public function getTemplate()
+  {
+    return $this->getResponse()->getParameter($this->getModuleName().'_'.$this->getActionName().'_template', null, 'symfony/action/view');
+  }
+
+  /**
+   * Sets an alternate layout for this sfAction.
+   *
+   * To de-activate the layout, set the layout name to false.
+   *
+   * To revert the layout to the one configured in the view.yml, set the template name to null.
+   *
+   * @param mixed Layout name or false to de-activate the layout
+   */
+  public function setLayout($name)
+  {
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfAction} change layout to "'.$name.'"');
+    }
+
+    $this->getResponse()->setParameter($this->getModuleName().'_'.$this->getActionName().'_layout', $name, 'symfony/action/view');
+  }
+
+  /**
+   * Gets the name of the alternate layout for this sfAction.
+   *
+   * WARNING: It only returns the layout you set with the setLayout() method,
+   *          and does not return the layout that you configured in your view.yml.
+   *
+   * @return mixed Layout name. Returns null if no layout has been set within the action
+   */
+  public function getLayout()
+  {
+    return $this->getResponse()->getParameter($this->getModuleName().'_'.$this->getActionName().'_layout', null, 'symfony/action/view');
+  }
+
+  /**
+   * Changes the default view class used for rendering the template associated with the current action.
+   *
+   * @param string View class name
+   */
+  public function setViewClass($class)
+  {
+    sfConfig::set('mod_'.strtolower($this->getModuleName()).'_view_class', $class);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfAction.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfActionStack.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfActionStack.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfActionStack.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,121 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfActionStack keeps a list of all requested actions and provides accessor
+ * methods for retrieving individual entries.
+ *
+ * @package    symfony
+ * @subpackage action
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfActionStack.class.php 3198 2007-01-08 20:36:20Z fabien $
+ */
+class sfActionStack
+{
+  protected
+    $stack = array();
+
+  /**
+   * Adds an entry to the action stack.
+   *
+   * @param string   A module name
+   * @param string   An action name
+   * @param sfAction An sfAction implementation instance
+   *
+   * @return sfActionStackEntry sfActionStackEntry instance
+   */
+  public function addEntry($moduleName, $actionName, $actionInstance)
+  {
+    // create our action stack entry and add it to our stack
+    $actionEntry = new sfActionStackEntry($moduleName, $actionName, $actionInstance);
+
+    $this->stack[] = $actionEntry;
+
+    return $actionEntry;
+  }
+
+  /**
+   * Retrieves the entry at a specific index.
+   *
+   * @param int An entry index
+   *
+   * @return sfActionStackEntry An action stack entry implementation.
+   */
+  public function getEntry($index)
+  {
+    $retval = null;
+
+    if ($index > -1 && $index < count($this->stack))
+    {
+      $retval = $this->stack[$index];
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Removes the entry at a specific index.
+   *
+   * @param int An entry index
+   *
+   * @return sfActionStackEntry An action stack entry implementation.
+   */
+  public function popEntry()
+  {
+    return array_pop($this->stack);
+  }
+
+  /**
+   * Retrieves the first entry.
+   *
+   * @return mixed An action stack entry implementation or null if there is no sfAction instance in the stack
+   */
+  public function getFirstEntry()
+  {
+    $retval = null;
+
+    if (isset($this->stack[0]))
+    {
+      $retval = $this->stack[0];
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Retrieves the last entry.
+   *
+   * @return mixed An action stack entry implementation or null if there is no sfAction instance in the stack
+   */
+  public function getLastEntry()
+  {
+    $count  = count($this->stack);
+    $retval = null;
+
+    if (isset($this->stack[0]))
+    {
+      $retval = $this->stack[$count - 1];
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Retrieves the size of this stack.
+   *
+   * @return int The size of this stack.
+   */
+  public function getSize()
+  {
+    return count($this->stack);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfActionStack.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfActionStackEntry.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfActionStackEntry.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfActionStackEntry.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,115 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfActionStackEntry represents information relating to a single sfAction request during a single HTTP request.
+ *
+ * @package    symfony
+ * @subpackage action
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfActionStackEntry.class.php 3198 2007-01-08 20:36:20Z fabien $
+ */
+class sfActionStackEntry
+{
+  protected
+    $actionInstance = null,
+    $actionName     = null,
+    $moduleName     = null,
+    $presentation   = null,
+    $viewInstance   = null;
+
+  /**
+   * Class constructor.
+   *
+   * @param string A module name
+   * @param string An action name
+   * @param sfAction An sfAction implementation instance
+   */
+  public function __construct($moduleName, $actionName, $actionInstance)
+  {
+    $this->actionName     = $actionName;
+    $this->actionInstance = $actionInstance;
+    $this->moduleName     = $moduleName;
+  }
+
+  /**
+   * Retrieves this entry's action name.
+   *
+   * @return string An action name
+   */
+  public function getActionName()
+  {
+    return $this->actionName;
+  }
+
+  /**
+   * Retrieves this entry's action instance.
+   *
+   * @return sfAction An sfAction implementation instance
+   */
+  public function getActionInstance()
+  {
+    return $this->actionInstance;
+  }
+
+  /**
+   * Retrieves this entry's view instance.
+   *
+   * @return sfView A sfView implementation instance.
+   */
+  public function getViewInstance()
+  {
+    return $this->viewInstance;
+  }
+
+  /**
+   * Sets this entry's view instance.
+   *
+   * @param sfView A sfView implementation instance.
+   */
+  public function setViewInstance($viewInstance)
+  {
+    $this->viewInstance = $viewInstance;
+  }
+
+  /**
+   * Retrieves this entry's module name.
+   *
+   * @return string A module name
+   */
+  public function getModuleName()
+  {
+    return $this->moduleName;
+  }
+
+  /**
+   * Retrieves this entry's rendered view presentation.
+   *
+   * This will only exist if the view has processed and the render mode is set to sfView::RENDER_VAR.
+   *
+   * @return string Rendered view presentation
+   */
+  public function & getPresentation()
+  {
+    return $this->presentation;
+  }
+
+  /**
+   * Sets the rendered presentation for this action.
+   *
+   * @param string A rendered presentation.
+   */
+  public function setPresentation(&$presentation)
+  {
+    $this->presentation =& $presentation;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfActionStackEntry.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfActions.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfActions.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfActions.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfActions executes all the logic for the current request.
+ *
+ * @package    symfony
+ * @subpackage action
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfActions.class.php 3198 2007-01-08 20:36:20Z fabien $
+ */
+abstract class sfActions extends sfAction
+{
+  /**
+   * Dispatches to the action defined by the 'action' parameter of the sfRequest object.
+   *
+   * This method try to execute the executeXXX() method of the current object where XXX is the
+   * defined action name.
+   *
+   * @return string A string containing the view name associated with this action
+   *
+   * @throws sfInitializationException
+   *
+   * @see sfAction
+   */
+  public function execute()
+  {
+    // dispatch action
+    $actionToRun = 'execute'.ucfirst($this->getActionName());
+    if (!is_callable(array($this, $actionToRun)))
+    {
+      // action not found
+      $error = 'sfAction initialization failed for module "%s", action "%s". You must create a "%s" method.';
+      $error = sprintf($error, $this->getModuleName(), $this->getActionName(), $actionToRun);
+      throw new sfInitializationException($error);
+    }
+
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfAction} call "'.get_class($this).'->'.$actionToRun.'()'.'"');
+    }
+
+    // run action
+    $ret = $this->$actionToRun();
+
+    return $ret;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfActions.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfComponent.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfComponent.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfComponent.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,427 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfComponent.
+ *
+ * @package    symfony
+ * @subpackage action
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfComponent.class.php 3379 2007-02-01 06:49:58Z fabien $
+ */
+abstract class sfComponent
+{
+  protected
+    $context                = null,
+    $request                = null,
+    $response               = null,
+    $varHolder              = null,
+    $requestParameterHolder = null;
+
+  /**
+   * Execute any application/business logic for this component.
+   *
+   * In a typical database-driven application, execute() handles application
+   * logic itself and then proceeds to create a model instance. Once the model
+   * instance is initialized it handles all business logic for the action.
+   *
+   * A model should represent an entity in your application. This could be a
+   * user account, a shopping cart, or even a something as simple as a
+   * single product.
+   *
+   * @return mixed A string containing the view name associated with this action
+   */
+  abstract function execute();
+
+  /**
+   * Gets the module name associated with this component.
+   *
+   * @return string A module name
+   */
+  public function getModuleName()
+  {
+    return $this->getContext()->getModuleName();
+  }
+
+  /**
+   * Gets the action name associated with this component.
+   *
+   * @return string An action name
+   */
+  public function getActionName()
+  {
+    return $this->getContext()->getActionName();
+  }
+
+  /**
+   * Initializes this component.
+   *
+   * @param sfContext The current application context
+   *
+   * @return boolean true, if initialization completes successfully, otherwise false
+   */
+  public function initialize($context)
+  {
+    $this->context                = $context;
+    $this->varHolder              = new sfParameterHolder();
+    $this->request                = $context->getRequest();
+    $this->response               = $context->getResponse();
+    $this->requestParameterHolder = $this->request->getParameterHolder();
+
+    return true;
+  }
+
+  /**
+   * Retrieves the current application context.
+   *
+   * @return sfContext The current sfContext instance
+   */
+  public final function getContext()
+  {
+    return $this->context;
+  }
+
+  /**
+   * Retrieves the current logger instance.
+   *
+   * @return sfLogger The current sfLogger instance
+   */
+  public final function getLogger()
+  {
+    return $this->context->getLogger();
+  }
+
+  /**
+   * Logs a message using the sfLogger object.
+   *
+   * @param mixed  String or object containing the message to log
+   * @param string The priority of the message
+   *               (available priorities: emerg, alert, crit, err, warning, notice, info, debug)
+   *
+   * @see sfLogger
+   */
+  public function logMessage($message, $priority = 'info')
+  {
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->context->getLogger()->log($message, constant('SF_LOG_'.strtoupper($priority)));
+    }
+  }
+
+  /**
+   * Displays a message as a short message in the sfWebDebug toolbar.
+   *
+   * @param string The message text
+   *
+   * @see sfWebDebug
+   */
+  public function debugMessage($message)
+  {
+    if (sfConfig::get('sf_web_debug'))
+    {
+      sfWebDebug::getInstance()->logShortMessage($message);
+    }
+  }
+
+  /**
+   * Returns the value of a request parameter.
+   *
+   * This is a proxy method equivalent to:
+   *
+   * <code>$this->getRequest()->getParameterHolder()->get($name)</code>
+   *
+   * @param  string The parameter name
+   *
+   * @return string The request parameter value
+   */
+  public function getRequestParameter($name, $default = null)
+  {
+    return $this->requestParameterHolder->get($name, $default);
+  }
+
+  /**
+   * Returns true if a request parameter exists.
+   *
+   * This is a proxy method equivalent to:
+   *
+   * <code>$this->getRequest()->getParameterHolder()->has($name)</code>
+   *
+   * @param  string  The parameter name
+   * @return boolean true if the request parameter exists, false otherwise
+   */
+  public function hasRequestParameter($name)
+  {
+    return $this->requestParameterHolder->has($name);
+  }
+
+  /**
+   * Retrieves the current sfRequest object.
+   *
+   * This is a proxy method equivalent to:
+   *
+   * <code>$this->getContext()->getRequest()</code>
+   *
+   * @return sfRequest The current sfRequest implementation instance
+   */
+  public function getRequest()
+  {
+    return $this->request;
+  }
+
+  /**
+   * Retrieves the current sfResponse object.
+   *
+   * This is a proxy method equivalent to:
+   *
+   * <code>$this->getContext()->getResponse()</code>
+   *
+   * @return sfResponse The current sfResponse implementation instance
+   */
+  public function getResponse()
+  {
+    return $this->response;
+  }
+
+  /**
+   * Retrieves the current sfController object.
+   *
+   * This is a proxy method equivalent to:
+   *
+   * <code>$this->getContext()->getController()</code>
+   *
+   * @return sfController The current sfController implementation instance
+   */
+  public function getController()
+  {
+    return $this->getContext()->getController();
+  }
+
+  /**
+   * Retrieves the current sfUser object.
+   *
+   * This is a proxy method equivalent to:
+   *
+   * <code>$this->getContext()->getController()</code>
+   *
+   * @return sfUser The current sfUser implementation instance
+   */
+  public function getUser()
+  {
+    return $this->getContext()->getUser();
+  }
+
+  /**
+   * Sets a variable for the template.
+   *
+   * @param  string The variable name
+   * @param  mixed  The variable value
+   */
+  public function setVar($name, $value)
+  {
+    $this->varHolder->set($name, $value);
+  }
+
+  /**
+   * Gets a variable set for the template.
+   *
+   * @param  string The variable name
+   * @return mixed  The variable value
+   */
+  public function getVar($name)
+  {
+    return $this->varHolder->get($name);
+  }
+
+  /**
+   * Gets the sfParameterHolder object that stores the template variables.
+   *
+   * @return sfParameterHolder The variable holder.
+   */
+  public function getVarHolder()
+  {
+    return $this->varHolder;
+  }
+
+  /**
+   * Sets a variable for the template.
+   *
+   * This is a shortcut for:
+   *
+   * <code>$this->setVar('name', 'value')</code>
+   *
+   * @param  string The variable name
+   * @param  string The variable value
+   *
+   * @return boolean always true
+   *
+   * @see setVar()
+   */
+  public function __set($key, $value)
+  {
+    return $this->varHolder->setByRef($key, $value);
+  }
+
+  /**
+   * Gets a variable for the template.
+   *
+   * This is a shortcut for:
+   *
+   * <code>$this->getVar('name')</code>
+   *
+   * @param  string The variable name
+   *
+   * @return mixed The variable value
+   *
+   * @see getVar()
+   */
+  public function & __get($key)
+  {
+    return $this->varHolder->get($key);
+  }
+
+  /**
+   * Returns true if a variable for the template is set.
+   *
+   * This is a shortcut for:
+   *
+   * <code>$this->getVarHolder()->has('name')</code>
+   *
+   * @param  string The variable name
+   *
+   * @return boolean true if the variable is set
+   */
+  public function __isset($name)
+  {
+    return $this->varHolder->has($name);
+  }
+
+  /**
+   * Removes a variable for the template.
+   *
+   * This is just really a shortcut for:
+   *
+   * <code>$this->getVarHolder()->remove('name')</code>
+   *
+   * @param  string The variable Name
+   */
+  public function __unset($name)
+  {
+    $this->varHolder->remove($name);
+  }
+
+  /**
+   * Sets a flash variable that will be passed to the very next action.
+   *
+   * @param  string  The name of the flash variable
+   * @param  string  The value of the flash variable
+   * @param  boolean true if the flash have to persist for the following request (true by default)
+   */
+  public function setFlash($name, $value, $persist = true)
+  {
+    $this->getUser()->setAttribute($name, $value, 'symfony/flash');
+
+    if ($persist)
+    {
+      // clear removal flag
+      $this->getUser()->getAttributeHolder()->remove($name, 'symfony/flash/remove');
+    }
+    else
+    {
+      $this->getUser()->setAttribute($name, true, 'symfony/flash/remove');
+    }
+  }
+
+  /**
+   * Gets a flash variable.
+   *
+   * @param  string The name of the flash variable
+   *
+   * @return mixed The value of the flash variable
+   */
+  public function getFlash($name)
+  {
+    return $this->getUser()->getAttribute($name, null, 'symfony/flash');
+  }
+
+  /**
+   * Returns true if a flash variable of the specified name exists.
+   * 
+   * @param  string The name of the flash variable
+   *
+   * @return boolean   true if the variable exists, false otherwise
+   */
+  public function hasFlash($name)
+  {
+    return $this->getUser()->hasAttribute($name, 'symfony/flash');
+  }
+
+  /**
+   * Sends and email from the current action.
+   *
+   * This methods calls a module/action with the sfMailView class.
+   *
+   * This is a shortcut for
+   *
+   * <code>$this->getController()->sendEmail($module, $action)</code>
+   *
+   * @param  string A module name
+   * @param  string An action name
+   *
+   * @return string The generated mail content
+   *
+   * @see sfMailView, getPresentationFor(), sfController
+   */
+  public function sendEmail($module, $action)
+  {
+    return $this->getController()->getPresentationFor($module, $action, 'sfMail');
+  }
+
+  /**
+   * Returns the rendered view presentation of a given module/action.
+   *
+   * This is a shortcut for
+   *
+   * <code>$this->getController()->getPresentationFor($module, $action, $viewName)</code>
+   *
+   * @param  string A module name
+   * @param  string An action name
+   * @param  string A View class name
+   *
+   * @return string The generated content
+   *
+   * @see sfController
+   */
+  public function getPresentationFor($module, $action, $viewName = null)
+  {
+    return $this->getController()->getPresentationFor($module, $action, $viewName);
+  }
+
+  /**
+   * Calls methods defined via the sfMixer class.
+   *
+   * @param string The method name
+   * @param array  The method arguments
+   *
+   * @return mixed The returned value of the called method
+   *
+   * @see sfMixer
+   */
+  public function __call($method, $arguments)
+  {
+    if (!$callable = sfMixer::getCallable('sfComponent:'.$method))
+    {
+      throw new sfException(sprintf('Call to undefined method sfComponent::%s', $method));
+    }
+
+    array_unshift($arguments, $this);
+
+    return call_user_func_array($callable, $arguments);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfComponent.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfComponents.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfComponents.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfComponents.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfComponents.
+ *
+ * @package    symfony
+ * @subpackage action
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfComponents.class.php 1415 2006-06-11 08:33:51Z fabien $
+ */
+abstract class sfComponents extends sfComponent
+{
+  public function execute()
+  {
+    throw new sfInitializationException('sfComponents initialization failed');
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/action/sfComponents.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/bridge/sfEzComponentsBridge.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/bridge/sfEzComponentsBridge.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/bridge/sfEzComponentsBridge.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+require_once((sfConfig::get('sf_ez_lib_dir') ? sfConfig::get('sf_ez_lib_dir').'/' : '').'Base/src/base.php');
+
+/**
+ * This class makes easy to use ez components classes within symfony
+ *
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfEzComponentsBridge.class.php 1415 2006-06-11 08:33:51Z fabien $
+ */
+class sfEzComponentsBridge
+{
+  public static function autoload($class)
+  {
+    return ezcBase::autoload($class);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/bridge/sfEzComponentsBridge.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/bridge/sfZendFrameworkBridge.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/bridge/sfZendFrameworkBridge.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/bridge/sfZendFrameworkBridge.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+if (sfConfig::get('sf_zend_lib_dir'))
+{
+  set_include_path(sfConfig::get('sf_zend_lib_dir').PATH_SEPARATOR.get_include_path());
+  require_once(sfConfig::get('sf_zend_lib_dir').'/Zend.php');
+}
+else
+{
+  require_once('Zend.php');
+}
+
+/**
+ * This class makes easy to use Zend Framework classes within symfony
+ *
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfZendFrameworkBridge.class.php 1415 2006-06-11 08:33:51Z fabien $
+ */
+class sfZendFrameworkBridge
+{
+  public static function autoload($class)
+  {
+    try
+    {
+      Zend::loadClass($class);
+    }
+    catch (Zend_Exception $e)
+    {
+      return false;
+    }
+
+    return true;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/bridge/sfZendFrameworkBridge.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/database/sfCreoleDatabase.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/database/sfCreoleDatabase.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/database/sfCreoleDatabase.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,212 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfCreoleDatabase provides connectivity for the Creole database abstraction
+ * layer.
+ *
+ * <b>Optional parameters:</b>
+ *
+ * # <b>classpath</b>      - [none]   - An absolute filesystem path to the main
+ *                                      Creole class file.
+ * # <b>database</b>       - [none]   - The database name.
+ * # <b>dsn</b>            - [none]   - The DSN formatted connection string.
+ * # <b>host</b>           - [none]   - The database host specifications.
+ * # <b>port</b>           - [none]   - The database port.
+ * # <b>encoding</b>       - [none]   - The database encoding.
+ * # <b>method</b>         - [normal] - How to read connection parameters.
+ *                                      Possible values are dsn, normal,
+ *                                      server, and env. The dsn method reads
+ *                                      them from the dsn parameter. The
+ *                                      normal method reads them from the
+ *                                      specified values. server reads them
+ *                                      from $_SERVER where the keys to
+ *                                      retrieve the values are what you
+ *                                      specify the value as in the settings.
+ *                                      env reads them from $_ENV and works
+ *                                      like $_SERVER.
+ * # <b>no_assoc_lower</b> - [Off]    - Turn off portabilty of resultset
+ *                                      field names.
+ * # <b>password</b>       - [none]   - The database password.
+ * # <b>persistent</b>     - [No]     - Indicates that the connection should
+ *                                      persistent.
+ * # <b>phptype</b>        - [none]   - The type of database (mysql, pgsql,
+ *                                      etc).
+ * # <b>username</b>       - [none]   - The database username.
+ *
+ * @package    symfony
+ * @subpackage database
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfCreoleDatabase.class.php 3329 2007-01-23 08:29:34Z fabien $
+ */
+class sfCreoleDatabase extends sfDatabase
+{
+  /**
+   * Connect to the database.
+   *
+   * @throws <b>sfDatabaseException</b> If a connection could not be created.
+   */
+  public function connect()
+  {
+    try
+    {
+      // determine how to get our settings
+      $method = $this->getParameter('method', 'normal');
+
+      switch ($method)
+      {
+        case 'normal':
+          // get parameters normally, and all are required
+          $database = $this->getParameter('database', null);
+          $hostspec = $this->getParameter('hostspec') ? $this->getParameter('hostspec') : ($this->getParameter('host') ? $this->getParameter('hostspec') : null);
+          $password = $this->getParameter('password', null);
+          $phptype  = $this->getParameter('phptype',  null);
+          $username = $this->getParameter('username', null);
+          $port     = $this->getParameter('port',     null);
+          $encoding = $this->getParameter('encoding', null);
+
+          $dsn = array('database' => $database,
+                       'hostspec' => $hostspec,
+                       'password' => $password,
+                       'phptype'  => $phptype,
+                       'username' => $username,
+                       'port'     => $port,
+                       'encoding' => $encoding);
+          break;
+
+        case 'dsn':
+          $dsn = $this->getParameter('dsn');
+
+          if ($dsn == null)
+          {
+            // missing required dsn parameter
+            $error = 'Database configuration specifies method "dsn", but is missing dsn parameter';
+
+            throw new sfDatabaseException($error);
+          }
+
+          break;
+
+        case 'server':
+          // construct a DSN connection string from existing $_SERVER values
+          $dsn =& $this->loadDSN($_SERVER);
+
+          break;
+
+        case 'env':
+          // construct a DSN connection string from existing $_ENV values
+          $dsn =& $this->loadDSN($_ENV);
+
+          break;
+
+        default:
+          // who knows what the user wants...
+          $error = 'Invalid CreoleDatabase parameter retrieval method "%s"';
+          $error = sprintf($error, $method);
+
+          throw new sfDatabaseException($error);
+      }
+
+      // get creole class path
+      $classPath = $this->getParameter('classpath');
+
+      // include the creole file
+      if ($classPath == null)
+      {
+        require_once('creole/Creole.php');
+      }
+      else
+      {
+        require_once($classPath);
+      }
+
+      // set our flags
+      $noAssocLower = $this->getParameter('no_assoc_lower', false);
+      $persistent   = $this->getParameter('persistent', false);
+      $compatAssocLower  = $this->getParameter('compat_assoc_lower', false);
+      $compatRtrimString = $this->getParameter('compat_rtrim_string', false);
+
+      $flags  = 0;
+      $flags |= ($noAssocLower)      ? Creole::NO_ASSOC_LOWER : 0;
+      $flags |= ($persistent)        ? Creole::PERSISTENT : 0;
+      $flags |= ($compatAssocLower)  ? Creole::COMPAT_ASSOC_LOWER : 0;
+      $flags |= ($compatRtrimString) ? Creole::COMPAT_RTRIM_STRING : 0;
+
+      // do the duuuurtay work, right thurr
+      if ($flags > 0)
+      {
+        $this->connection = Creole::getConnection($dsn, $flags);
+      }
+      else
+      {
+        $this->connection = Creole::getConnection($dsn);
+      }
+
+      // get our resource
+      $this->resource = $this->connection->getResource();
+    }
+    catch (SQLException $e)
+    {
+      // the connection's foobar'd
+      throw new sfDatabaseException($e->toString());
+    }
+  }
+
+  /**
+   * Load a DSN connection string from an existing array.
+   *
+   * @return array An associative array of connection parameters.
+   */
+  protected function & loadDSN(&$array)
+  {
+    // determine if a dsn is set, otherwise use separate parameters
+    $dsn = $this->getParameter('dsn');
+
+    if ($dsn == null)
+    {
+      // list of available parameters
+      $available = array('database', 'hostspec', 'password', 'phptype', 'username', 'port');
+
+      $dsn = array();
+
+      // yes, i know variable variables are ugly, but let's avoid using
+      // an array for array's sake in this single spot in the source
+      foreach ($available as $parameter)
+      {
+        $$parameter = $this->getParameter($parameter);
+
+        $dsn[$parameter] = ($$parameter != null) ? $array[$$parameter] : null;
+      }
+    }
+    else
+    {
+      $dsn = $array[$dsn];
+    }
+
+    return $dsn;
+  }
+
+  /**
+   * Execute the shutdown procedure.
+   *
+   * @return void
+   *
+   * @throws <b>sfDatabaseException</b> If an error occurs while shutting down this database.
+   */
+  public function shutdown()
+  {
+    if ($this->connection !== null)
+    {
+      @$this->connection->close();
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/database/sfCreoleDatabase.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/drivers/sfDebugConnection.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/drivers/sfDebugConnection.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/drivers/sfDebugConnection.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,294 @@
+<?php
+
+/**
+ * Debug implementation of Connection.
+ *
+ * This is a Connection that implements the decorator pattern, wrapping around
+ * the true Connection object (stored in $childConnection). This Connection
+ * tracks information about queries executed and makes that information available
+ * for debugging purposes. The information tracked is the last query executed
+ * on the connection (getLastExecutedQuery()) and the total number of
+ * queries executed on the connection thus far (getNumQueriesExecuted()).
+ *
+ * To use this debug connection, you need to register it as a new Creole
+ * driver that handles all connection types. To do this, call the following
+ * before calling Creole::getConnection():
+ *
+ * <code>
+ * Creole::registerDriver('*', 'creole.drivers.debug.DebugConnection');
+ * </code>
+ *
+ * The next call to Creole::getConnection() will return an instance of
+ * DebugConnection.
+ *
+ * @author Michael Sims
+ * @package creole.drivers.debug
+ */
+class sfDebugConnection implements Connection
+{
+  /** @var Connection */
+  private $childConnection = null;
+
+  /** @var int */
+  private $numQueriesExecuted = 0;
+
+  /** @var string */
+  private $lastExecutedQuery = '';
+
+  /**
+   * Optional PEAR Log class; if set queries will be logged at PEAR_LOG_INFO level.
+   * @var Log
+   */
+  private static $logger;
+
+  /**
+   * Sets a Logger class (e.g. PEAR Log) to use for logging.
+   * The logger class must have a log() method.  All messages are logged at default log level.
+   * @param object $logger
+   */
+  public static function setLogger($logger)
+  {
+    self::$logger = $logger;
+  }
+
+  /**
+   * Returns the number of queries executed on this connection so far
+   *
+   * @return int
+   */
+  public function getNumQueriesExecuted()
+  {
+    return $this->numQueriesExecuted;
+  }
+
+  /**
+   * Returns the last query executed on this connection
+   *
+   * @return string
+   */
+  public function getLastExecutedQuery()
+  {
+    return $this->lastExecutedQuery;
+  }
+
+  /**
+   * connect()
+   */
+  public function connect($dsninfo, $flags = 0)
+  {
+    if (!($driver = Creole::getDriver($dsninfo['phptype'])))
+    {
+      throw new SQLException("No driver has been registered to handle connection type: $type");
+    }
+    $connectionClass = Creole::import($driver);
+    $this->childConnection = new $connectionClass();
+    $this->log("{sfCreole} connect(): DSN: ". var_export($dsninfo, true) . ", FLAGS: " . var_export($flags, true));
+    return $this->childConnection->connect($dsninfo, $flags);
+  }
+
+  /**
+   * @see Connection::getDatabaseInfo()
+   */
+  public function getDatabaseInfo()
+  {
+    return $this->childConnection->getDatabaseInfo();
+  }
+
+  /**
+   * @see Connection::getIdGenerator()
+   */
+  public function getIdGenerator()
+  {
+    return $this->childConnection->getIdGenerator();
+  }
+
+  /**
+   * @see Connection::isConnected()
+   */
+  public function isConnected()
+  {
+    return $this->childConnection->isConnected();
+  }
+
+  /**
+   * @see Connection::prepareStatement()
+   */
+  public function prepareStatement($sql)
+  {
+    $this->log("{sfCreole} prepareStatement(): $sql");
+    $obj = $this->childConnection->prepareStatement($sql);
+    $objClass = get_class($obj);
+    return new $objClass($this, $sql);
+  }
+
+  /**
+   * @see Connection::createStatement()
+   */
+  public function createStatement()
+  {
+    $obj = $this->childConnection->createStatement();
+    $objClass = get_class($obj);
+    return new $objClass($this);
+  }
+
+  /**
+   * @see Connection::applyLimit()
+   */
+  public function applyLimit(&$sql, $offset, $limit)
+  {
+    $this->log("{sfCreole} applyLimit(): $sql, offset: $offset, limit: $limit");
+    return $this->childConnection->applyLimit($sql, $offset, $limit);
+  }
+
+  /**
+   * @see Connection::close()
+   */
+  public function close()
+  {
+    $this->log("{sfCreole} close(): Closing connection.");
+    return $this->childConnection->close();
+  }
+
+  /**
+   * @see Connection::executeQuery()
+   */
+  public function executeQuery($sql, $fetchmode = null)
+  {
+    $this->lastExecutedQuery = $sql;
+    $this->numQueriesExecuted++;
+
+    $elapsedTime = 0;
+    if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+    {
+      $sqlTimer = sfTimerManager::getTimer('Database');
+      $timer = new sfTimer();
+    }
+
+    $retval = $this->childConnection->executeQuery($sql, $fetchmode);
+
+    if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+    {
+      $sqlTimer->addTime();
+      $elapsedTime = $timer->getElapsedTime();
+    }
+
+    $this->log(sprintf("{sfCreole} executeQuery(): [%.2f ms] %s", $elapsedTime * 1000, $sql));
+
+    return $retval;
+  }
+
+  /**
+  * @see Connection::executeUpdate()
+  **/
+  public function executeUpdate($sql)
+  {
+    $this->log("{sfCreole} executeUpdate(): $sql");
+    $this->lastExecutedQuery = $sql;
+    $this->numQueriesExecuted++;
+    return $this->childConnection->executeUpdate($sql);
+  }
+
+  /**
+   * @see Connection::getUpdateCount()
+   */
+  public function getUpdateCount()
+  {
+    return $this->childConnection->getUpdateCount();
+  }
+
+  /**
+   * @see Connection::prepareCall()
+   **/
+  public function prepareCall($sql)
+  {
+    $this->log("{sfCreole} prepareCall(): $sql");
+    return $this->childConnection->prepareCall($sql);
+  }
+
+  /**
+   * @see Connection::getResource()
+   */
+  public function getResource()
+  {
+    return $this->childConnection->getResource();
+  }
+
+  /**
+   * @see Connection::connect()
+   */
+  public function getDSN()
+  {
+    return $this->childConnection->getDSN();
+  }
+
+  /**
+   * @see Connection::getFlags()
+   */
+  public function getFlags()
+  {
+    return $this->childConnection->getFlags();
+  }
+
+  /**
+   * @see Connection::begin()
+   */
+  public function begin()
+  {
+    $this->log("{sfCreole} beginning transaction.");
+    return $this->childConnection->begin();
+  }
+
+  /**
+   * @see Connection::commit()
+   */
+  public function commit()
+  {
+    $this->log("{sfCreole} committing transaction.");
+    return $this->childConnection->commit();
+  }
+
+  /**
+   * @see Connection::rollback()
+   */
+  public function rollback()
+  {
+    $this->log("{sfCreole} rolling back transaction.");
+    return $this->childConnection->rollback();
+  }
+
+  /**
+   * @see Connection::setAutoCommit()
+   */
+  public function setAutoCommit($bit)
+  {
+    $this->log("{sfCreole} setting autocommit to: ".var_export($bit, true));
+    return $this->childConnection->setAutoCommit($bit);
+  }
+
+  /**
+   * @see Connection::getAutoCommit()
+   */
+  public function getAutoCommit()
+  {
+    return $this->childConnection->getAutoCommit();
+  }
+
+  /**
+   * Private function that logs message using specified logger (if provided).
+   * @param string $msg Message to log.
+   */
+  private function log($msg)
+  {
+    if (self::$logger)
+    {
+      // message on one line
+      $msg = preg_replace("/\r?\n/", ' ', $msg);
+      self::$logger->log($msg);
+    }
+  }
+
+  public function __call($method, $arguments)
+  {
+    return $this->childConnection->$method($arguments);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/drivers/sfDebugConnection.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/i18n/sfMessageSource_Creole.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/i18n/sfMessageSource_Creole.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/i18n/sfMessageSource_Creole.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,445 @@
+<?php
+
+/**
+ * sfMessageSource_Creole class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: sfMessageSource_Creole.class.php 3245 2007-01-12 15:01:53Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+
+/*
+CREATE TABLE `catalogue` (
+  `cat_id` int(11) NOT NULL auto_increment,
+  `name` varchar(100) NOT NULL default '',
+  `source_lang` varchar(100) NOT NULL default '',
+  `target_lang` varchar(100) NOT NULL default '',
+  `date_created` int(11) NOT NULL default '0',
+  `date_modified` int(11) NOT NULL default '0',
+  `author` varchar(255) NOT NULL default '',
+  PRIMARY KEY  (`cat_id`)
+);
+
+CREATE TABLE `trans_unit` (
+  `msg_id` int(11) NOT NULL auto_increment,
+  `cat_id` int(11) NOT NULL default '1',
+  `source` text NOT NULL,
+  `target` text NOT NULL,
+  `comments` text NOT NULL,
+  `date_added` int(11) NOT NULL default '0',
+  `date_modified` int(11) NOT NULL default '0',
+  `author` varchar(255) NOT NULL default '',
+  `translated` tinyint(1) NOT NULL default '0',
+  PRIMARY KEY  (`msg_id`)
+);
+
+*/
+
+/**
+ * sfMessageSource_Creole class.
+ *
+ * Retrieve the message translation from a Creole supported database.
+ *
+ * See the MessageSource::factory() method to instantiate this class.
+ *
+ * @author RoVeRT <symfony[at]rovert[dot]net>
+ */
+class sfMessageSource_Creole extends sfMessageSource
+{
+  /**
+   * A resource link to the database
+   * @var db
+   */
+  protected $db;
+
+  /**
+   * Constructor.
+   * Create a new message source using Creole.
+   * @param string Creole datasource.
+   * @see MessageSource::factory();
+   */
+  public function __construct($source)
+  {
+    $this->db = sfContext::getInstance()->getDatabaseConnection($source);
+    if ($this->db == null || !$this->db instanceof Connection)
+    {
+      $error = 'Creole dabatase connection doesn\'t exist. Unable to open session.';
+      throw new sfDatabaseException($error);
+    }
+  }
+
+  /**
+   * Destructor, close the database connection.
+   */
+  public function __destruct()
+  {
+  }
+
+  /**
+   * Get the database connection.
+   * @return db database connection.
+   */
+  public function connection()
+  {
+    return $this->db;
+  }
+
+  /**
+   * Get an array of messages for a particular catalogue and cultural
+   * variant.
+   * @param string the catalogue name + variant
+   * @return array translation messages.
+   */
+  protected function &loadData($variant)
+  {
+    $sql = 'SELECT t.source, t.target, t.comments '.
+           'FROM trans_unit t, catalogue c '.
+           'WHERE c.cat_id =  t.cat_id AND c.name = ? '.
+           'ORDER BY msg_id ASC';
+
+    $stmt = $this->db->prepareStatement($sql);
+
+    $rs = $stmt->executeQuery(array($variant), ResultSet::FETCHMODE_NUM);
+
+    $result = array();
+
+    $count = 0;
+    while ($rs->next())
+    {
+      $source = $rs->getString(1);
+      $result[$source][] = $rs->getString(2); //target
+      $result[$source][] = $count++;          //id
+      $result[$source][] = $rs->getString(3); //comments
+    }
+
+    return $result;
+  }
+
+  /**
+   * Get the last modified unix-time for this particular catalogue+variant.
+   * We need to query the database to get the date_modified.
+   *
+   * @param string catalogue+variant
+   * @return int last modified in unix-time format.
+   */
+  protected function getLastModified($source)
+  {
+    $sql = 'SELECT date_modified FROM catalogue WHERE name = ?';
+
+    $stmt = $this->db->prepareStatement($sql);
+
+    $rs = $stmt->executeQuery(array($source), ResultSet::FETCHMODE_NUM);
+
+    $result = $rs->next() ? $rs->getInt(1) : 0;
+
+    return $result;
+  }
+
+  /**
+   * Check if a particular catalogue+variant exists in the database.
+   *
+   * @param string catalogue+variant
+   * @return boolean true if the catalogue+variant is in the database, false otherwise.
+   */
+  protected function isValidSource($variant)
+  {
+    $sql = 'SELECT COUNT(*) FROM catalogue WHERE name = ?';
+
+    $stmt = $this->db->prepareStatement($sql);
+
+    $rs = $stmt->executeQuery(array($variant), ResultSet::FETCHMODE_NUM);
+
+    $result = $rs->next() ? $rs->getInt(1) == 1 : false;
+
+    return $result;
+  }
+
+  /**
+   * Get all the variants of a particular catalogue.
+   *
+   * @param string catalogue name
+   * @return array list of all variants for this catalogue.
+   */
+  protected function getCatalogueList($catalogue)
+  {
+    $variants = explode('_', $this->culture);
+
+    $catalogues = array($catalogue);
+
+    $variant = null;
+
+    for ($i = 0, $max = count($variants); $i < $max; $i++)
+    {
+      if (strlen($variants[$i]) > 0)
+      {
+        $variant .= ($variant) ? '_'.$variants[$i] : $variants[$i];
+        $catalogues[] = $catalogue.'.'.$variant;
+      }
+    }
+
+    return array_reverse($catalogues);
+  }
+
+  /**
+   * Retrieve catalogue details, array($cat_id, $variant, $count).
+   *
+   * @param string catalogue
+   * @return array catalogue details, array($cat_id, $variant, $count).
+   */
+  protected function getCatalogueDetails($catalogue = 'messages')
+  {
+    if (empty($catalogue))
+    {
+      $catalogue = 'messages';
+    }
+
+    $variant = $catalogue.'.'.$this->culture;
+
+    $name = $this->getSource($variant);
+
+    $sql = 'SELECT cat_id FROM catalogue WHERE name = ?';
+
+    $stmt = $this->db->prepareStatement($sql);
+
+    $rs = $stmt->executeQuery(array($name), ResultSet::FETCHMODE_NUM);
+
+    if ($rs->getRecordCount() != 1)
+    {
+      return false;
+    }
+
+    $rs->next();
+
+    $cat_id = $rs->getInt(1);
+
+    //first get the catalogue ID
+    $sql = 'SELECT count(msg_id) FROM trans_unit WHERE cat_id = ?';
+
+    $stmt = $this->db->prepareStatement($sql);
+
+    $rs = $stmt->executeQuery(array($cat_id), ResultSet::FETCHMODE_NUM);
+
+    $rs->next();
+    $count = $rs->getInt(1);
+
+    return array($cat_id, $variant, $count);
+  }
+
+  /**
+   * Update the catalogue last modified time.
+   *
+   * @return boolean true if updated, false otherwise.
+   */
+  protected function updateCatalogueTime($cat_id, $variant)
+  {
+    $time = time();
+
+    $sql = 'UPDATE catalogue SET date_modified = ? WHERE cat_id = ?';
+
+    $stmt = $this->db->prepareStatement($sql);
+
+    $result = $stmt->executeUpdate(array($time, $cat_id));
+
+    if (!empty($this->cache))
+    {
+      $this->cache->clean($variant, $this->culture);
+    }
+
+    return true;
+  }
+
+  /**
+   * Save the list of untranslated blocks to the translation source.
+   * If the translation was not found, you should add those
+   * strings to the translation source via the <b>append()</b> method.
+   *
+   * @param string the catalogue to add to
+   * @return boolean true if saved successfuly, false otherwise.
+   */
+  function save($catalogue='messages')
+  {
+    $messages = $this->untranslated;
+
+    if (count($messages) <= 0)
+    {
+      return false;
+    }
+
+    $details = $this->getCatalogueDetails($catalogue);
+
+    if ($details)
+    {
+      list($cat_id, $variant, $count) = $details;
+    }
+    else
+    {
+      return false;
+    }
+
+    if ($cat_id <= 0)
+    {
+      return false;
+    }
+    $inserted = 0;
+
+    $time = time();
+
+    try
+    {
+      $sql = 'SELECT msg_id FROM trans_unit WHERE source = ?';
+
+      $stmt = $this->db->prepareStatement($sql);
+
+      foreach($messages as $key => $message)
+      {
+        $rs = $stmt->executeQuery(array($message), ResultSet::FETCHMODE_NUM);
+        if ($rs->next())
+        {
+           unset($messages[$key]);
+        }
+      }
+    }
+    catch (Exception $e)
+    {
+    }
+
+    try
+    {
+      $this->db->begin();
+
+      $sql = 'INSERT INTO trans_unit (cat_id, source, target, comments, date_added, date_modified) VALUES (?, ?, ?, ?, ?, ?)';
+
+      $stmt = $this->db->prepareStatement($sql);
+
+      foreach ($messages as $message)
+      {
+        $stmt->executeUpdate(array($cat_id, $message, '', '', $time, $time));
+        ++$inserted;
+      }
+
+      $this->db->commit();
+    }
+    catch (Exception $e)
+    {
+      $this->db->rollback();
+    }
+
+    if ($inserted > 0)
+    {
+      $this->updateCatalogueTime($cat_id, $variant);
+    }
+
+    return $inserted > 0;
+  }
+
+  /**
+   * Delete a particular message from the specified catalogue.
+   *
+   * @param string the source message to delete.
+   * @param string the catalogue to delete from.
+   * @return boolean true if deleted, false otherwise.
+   */
+  function delete($message, $catalogue='messages')
+  {
+    $details = $this->getCatalogueDetails($catalogue);
+
+    if ($details)
+    {
+      list($cat_id, $variant, $count) = $details;
+    }
+    else
+    {
+      return false;
+    }
+
+    $deleted = false;
+
+    $sql = 'DELETE FROM trans_unit WHERE cat_id = ? AND source = ?';
+
+    $stmt = $this->db->prepareStatement($sql);
+
+    $rows = $stmt->executeUpdate(array($cat_id, $message));
+
+    if ($rows == 1)
+    {
+      $deleted = $this->updateCatalogueTime($cat_id, $variant);
+    }
+
+    return $deleted;
+  }
+
+  /**
+   * Update the translation.
+   *
+   * @param string the source string.
+   * @param string the new translation string.
+   * @param string comments
+   * @param string the catalogue of the translation.
+   * @return boolean true if translation was updated, false otherwise.
+   */
+  function update($text, $target, $comments, $catalogue='messages')
+  {
+    $details = $this->getCatalogueDetails($catalogue);
+    if ($details)
+    {
+      list($cat_id, $variant, $count) = $details;
+    }
+    else
+    {
+      return false;
+    }
+
+    $time = time();
+
+    $sql = 'UPDATE trans_unit SET target = ?, comments = ?, date_modified = ? WHERE cat_id = ? AND source = ?';
+
+    $updated = false;
+
+    $stmt = $this->db->prepareStatement($sql);
+
+    $rows = $stmt->executeUpdate(array($target, $comments, $time, $cat_id, $text));
+
+    if ($rows == 1)
+    {
+      $updated = $this->updateCatalogueTime($cat_id, $variant);
+    }
+
+    return $updated;
+  }
+
+  /**
+   * Returns a list of catalogue as key and all it variants as value.
+   *
+   * @return array list of catalogues
+   */
+  function catalogues()
+  {
+    $sql = 'SELECT name FROM catalogue ORDER BY name';
+
+    $rs = $this->db->executeQuery($sql, ResultSet::FETCHMODE_NUM);
+
+    $result = array();
+    while ($rs->next())
+    {
+      $details = explode('.', $rs->getString(1));
+      if (!isset($details[1]))
+      {
+        $details[1] = null;
+      }
+
+      $result[] = $details;
+    }
+
+    return $result;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/i18n/sfMessageSource_Creole.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/storage/sfCreoleSessionStorage.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/storage/sfCreoleSessionStorage.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/storage/sfCreoleSessionStorage.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,307 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004, 2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004, 2005 Sean Kerr.
+ *
+ * The original version the file is based on is licensed under the LGPL, but a special license was granted.
+ * Please see the licenses/LICENSE.Agavi file
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Provides support for session storage using a CreoleDb database abstraction layer.
+ *
+ * <b>Required parameters:</b>
+ *
+ * # <b>db_table</b> - [none] - The database table in which session data will be
+ *                              stored.
+ *
+ * <b>Optional parameters:</b>
+ *
+ * # <b>database</b>     - [default]   - The database connection to use
+ *                                       (see databases.ini).
+ * # <b>db_id_col</b>    - [sess_id]   - The database column in which the
+ *                                       session id will be stored.
+ * # <b>db_data_col</b>  - [sess_data] - The database column in which the
+ *                                       session data will be stored.
+ * # <b>db_time_col</b>  - [sess_time] - The database column in which the
+ *                                       session timestamp will be stored.
+ * # <b>session_name</b> - [Agavi]    - The name of the session.
+ *
+ * @package    symfony
+ * @subpackage storage
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @author     Veikko Mäkinen <mail en veikkomakinen.com>
+ * @version    SVN: $Id: sfCreoleSessionStorage.class.php 2995 2006-12-09 18:01:32Z fabien $
+ */
+class sfCreoleSessionStorage extends sfSessionStorage
+{
+  /**
+   * Creole Database Connection
+   * @var Connection
+   */
+  protected $db;
+
+  /**
+   * Initialize this Storage.
+   *
+   * @param Context A Context instance.
+   * @param array   An associative array of initialization parameters.
+   *
+   * @return bool true, if initialization completes successfully, otherwise
+   *              false.
+   *
+   * @throws <b>InitializationException</b> If an error occurs while
+   *                                        initializing this Storage.
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // disable auto_start
+    $parameters['auto_start'] = false;
+
+    // initialize the parent
+    parent::initialize($context, $parameters);
+
+    if (!$this->getParameterHolder()->has('db_table'))
+    {
+      // missing required 'db_table' parameter
+      $error = 'Factory configuration file is missing required "db_table" parameter for the Storage category';
+
+      throw new sfInitializationException($error);
+    }
+
+    // use this object as the session handler
+    session_set_save_handler(array($this, 'sessionOpen'),
+                             array($this, 'sessionClose'),
+                             array($this, 'sessionRead'),
+                             array($this, 'sessionWrite'),
+                             array($this, 'sessionDestroy'),
+                             array($this, 'sessionGC'));
+
+    // start our session
+    session_start();
+  }
+
+  /**
+  * Close a session.
+  *
+  * @return bool true, if the session was closed, otherwise false.
+  */
+  public function sessionClose()
+  {
+    // do nothing
+    return true;
+  }
+
+  /**
+   * Destroy a session.
+   *
+   * @param string A session ID.
+   *
+   * @return bool true, if the session was destroyed, otherwise an exception
+   *              is thrown.
+   *
+   * @throws <b>DatabaseException</b> If the session cannot be destroyed.
+   */
+  public function sessionDestroy($id)
+  {
+    // get table/column
+    $db_table  = $this->getParameterHolder()->get('db_table');
+    $db_id_col = $this->getParameterHolder()->get('db_id_col', 'sess_id');
+
+    // delete the record associated with this id
+    $sql = 'DELETE FROM ' . $db_table . ' WHERE ' . $db_id_col . '=?';
+
+    try
+    {
+      $stmt = $this->db->prepareStatement($sql);
+      $stmt->setString(1, $id);
+      $stmt->executeUpdate();
+    }
+    catch (SQLException $e) {
+      $error = 'Creole SQLException was thrown when trying to manipulate session data. ';
+      $error .= 'Message: ' . $e->getMessage();
+      throw new sfDatabaseException($error);
+    }
+  }
+
+  /**
+   * Cleanup old sessions.
+   *
+   * @param int The lifetime of a session.
+   *
+   * @return bool true, if old sessions have been cleaned, otherwise an
+   *              exception is thrown.
+   *
+   * @throws <b>DatabaseException</b> If any old sessions cannot be cleaned.
+   */
+  public function sessionGC($lifetime)
+  {
+    // determine deletable session time
+    $time = time() - $lifetime;
+
+    // get table/column
+    $db_table    = $this->getParameterHolder()->get('db_table');
+    $db_time_col = $this->getParameterHolder()->get('db_time_col', 'sess_time');
+
+    // delete the record associated with this id
+    $sql = 'DELETE FROM ' . $db_table . ' ' .
+      'WHERE ' . $db_time_col . ' < ' . $time;
+
+    try
+    {
+      $this->db->executeQuery($sql);
+      return true;
+    }
+    catch (SQLException $e)
+    {
+      $error = 'Creole SQLException was thrown when trying to manipulate session data. ';
+      $error .= 'Message: ' . $e->getMessage();
+      throw new sfDatabaseException($error);
+    }
+  }
+
+  /**
+   * Open a session.
+   *
+   * @param string
+   * @param string
+   *
+   * @return bool true, if the session was opened, otherwise an exception is
+   *              thrown.
+   *
+   * @throws <b>DatabaseException</b> If a connection with the database does
+   *                                  not exist or cannot be created.
+   */
+  public function sessionOpen($path, $name)
+  {
+    // what database are we using?
+    $database = $this->getParameterHolder()->get('database', 'default');
+
+    // autoload propel propely if we're reusing the propel connection for session storage
+    if ($this->getContext()->getDatabaseManager()->getDatabase($database) instanceof sfPropelDatabase && !Propel::isInit())
+    {
+      $error = 'Creole dabatase connection is the same as the propel database connection, but could not be initialized.';
+      throw new sfDatabaseException($error);
+    }
+
+    $this->db = $this->getContext()->getDatabaseConnection($database);
+    if ($this->db == null || !$this->db instanceof Connection)
+    {
+      $error = 'Creole dabatase connection doesn\'t exist. Unable to open session.';
+      throw new sfDatabaseException($error);
+    }
+
+    return true;
+  }
+
+  /**
+   * Read a session.
+   *
+   * @param string A session ID.
+   *
+   * @return bool true, if the session was read, otherwise an exception is
+   *              thrown.
+   *
+   * @throws <b>DatabaseException</b> If the session cannot be read.
+   */
+  public function sessionRead($id)
+  {
+    // get table/columns
+    $db_table    = $this->getParameterHolder()->get('db_table');
+    $db_data_col = $this->getParameterHolder()->get('db_data_col', 'sess_data');
+    $db_id_col   = $this->getParameterHolder()->get('db_id_col', 'sess_id');
+    $db_time_col = $this->getParameterHolder()->get('db_time_col', 'sess_time');
+
+    try
+    {
+      $sql = 'SELECT ' . $db_data_col . ' FROM ' . $db_table . ' WHERE ' . $db_id_col . '=?';
+
+      $stmt = $this->db->prepareStatement($sql);
+      $stmt->setString(1, $id);
+
+      $dbRes = $stmt->executeQuery(ResultSet::FETCHMODE_NUM);
+
+      if ($dbRes->next())
+      {
+        $data = $dbRes->getString(1);
+        return $data;
+      }
+      else
+      {
+        // session does not exist, create it
+        $sql = 'INSERT INTO ' . $db_table . '('.$db_id_col.','.$db_data_col.','.$db_time_col;
+        $sql .= ') VALUES (?,?,?)';
+
+        $stmt = $this->db->prepareStatement($sql);
+        $stmt->setString(1, $id);
+        $stmt->setString(2, '');
+        $stmt->setInt(3, time());
+        $stmt->executeUpdate();
+        return '';
+      }
+    }
+    catch (SQLException $e)
+    {
+      $error = 'Creole SQLException was thrown when trying to manipulate session data. ';
+      $error .= 'Message: ' . $e->getMessage();
+      throw new sfDatabaseException($error);
+    }
+  }
+
+  /**
+   * Write session data.
+   *
+   * @param string A session ID.
+   * @param string A serialized chunk of session data.
+   *
+   * @return bool true, if the session was written, otherwise an exception is
+   *              thrown.
+   *
+   * @throws <b>DatabaseException</b> If the session data cannot be written.
+   */
+  public function sessionWrite($id, $data)
+  {
+    // get table/column
+    $db_table    = $this->getParameterHolder()->get('db_table');
+    $db_data_col = $this->getParameterHolder()->get('db_data_col', 'sess_data');
+    $db_id_col   = $this->getParameterHolder()->get('db_id_col', 'sess_id');
+    $db_time_col = $this->getParameterHolder()->get('db_time_col', 'sess_time');
+
+    $sql = 'UPDATE ' . $db_table . ' SET ' . $db_data_col . '=?, ' . $db_time_col . ' = ' . time() .
+      ' WHERE ' . $db_id_col . '=?';
+
+    try
+    {
+      $stmt = $this->db->prepareStatement($sql);
+      $stmt->setString(1, $data);
+      $stmt->setString(2, $id);
+      $stmt->executeUpdate();
+      return true;
+    }
+
+    catch (SQLException $e)
+    {
+      $error = 'Creole SQLException was thrown when trying to manipulate session data. ';
+      $error .= 'Message: ' . $e->getMessage();
+      throw new sfDatabaseException($error);
+    }
+
+    return false;
+  }
+
+  /**
+   * Execute the shutdown procedure.
+   *
+   * @return void
+   */
+  public function shutdown()
+  {
+  }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/creole/storage/sfCreoleSessionStorage.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfExtensionObjectBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfExtensionObjectBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfExtensionObjectBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,61 @@
+<?php
+
+require_once 'propel/engine/builder/om/php5/PHP5ExtensionObjectBuilder.php';
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: SfExtensionObjectBuilder.php 2624 2006-11-07 09:34:59Z fabien $
+ */
+class SfExtensionObjectBuilder extends PHP5ExtensionObjectBuilder
+{
+  protected function addIncludes(&$script)
+  {
+    if (!DataModelBuilder::getBuildProperty('builderAddIncludes'))
+    {
+      return;
+    }
+
+    parent::addIncludes($script);
+  }
+
+  protected function addClassOpen(&$script)
+  {
+    $table = $this->getTable();
+    $tableName = $table->getName();
+    $tableDesc = $table->getDescription();
+
+    $baseClassname = $this->getObjectBuilder()->getClassname();
+
+    $script .= "
+/**
+ * Subclass for representing a row from the '$tableName' table.
+ *
+ * $tableDesc
+ *
+ * @package ".$this->getPackage()."
+ */ 
+class ".$this->getClassname()." extends $baseClassname
+{";
+  }
+
+  /**
+   * Closes class.
+   * @param string &$script The script will be modified in this method.
+   */ 
+  protected function addClassClose(&$script)
+  {
+    $script .= "
+}
+";
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfExtensionObjectBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfExtensionPeerBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfExtensionPeerBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfExtensionPeerBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,65 @@
+<?php
+
+require_once 'propel/engine/builder/om/php5/PHP5ExtensionPeerBuilder.php';
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: SfExtensionPeerBuilder.php 2624 2006-11-07 09:34:59Z fabien $
+ */
+class SfExtensionPeerBuilder extends PHP5ExtensionPeerBuilder
+{
+  protected function addIncludes(&$script)
+  {
+    if (!DataModelBuilder::getBuildProperty('builderAddIncludes'))
+    {
+      return;
+    }
+
+    parent::addIncludes($script);
+  }
+
+  /**
+   * Adds class phpdoc comment and openning of class.
+   * @param string &$script The script will be modified in this method.
+   */
+  protected function addClassOpen(&$script)
+  {
+    $table = $this->getTable();
+    $tableName = $table->getName();
+    $tableDesc = $table->getDescription();
+
+    $baseClassname = $this->getPeerBuilder()->getClassname();
+
+    $script .= "
+/**
+ * Subclass for performing query and update operations on the '$tableName' table.
+ *
+ * $tableDesc
+ *
+ * @package ".$this->getPackage()."
+ */ 
+class ".$this->getClassname()." extends $baseClassname
+{";
+  }
+
+  /**
+   * Closes class.
+   * @param string &$script The script will be modified in this method.
+   */ 
+  protected function addClassClose(&$script)
+  {
+    $script .= "
+}
+";
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfExtensionPeerBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfMapBuilderBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfMapBuilderBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfMapBuilderBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,53 @@
+<?php
+
+require_once 'propel/engine/builder/om/php5/PHP5MapBuilderBuilder.php';
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: SfMapBuilderBuilder.php 3058 2006-12-16 17:17:26Z fabien $
+ */
+class SfMapBuilderBuilder extends PHP5MapBuilderBuilder
+{
+  public function build()
+  {
+    if (!DataModelBuilder::getBuildProperty('builderAddComments'))
+    {
+      return sfToolkit::stripComments(parent::build());
+    }
+    
+    return parent::build();
+  }
+
+  protected function addIncludes(&$script)
+  {
+    if (!DataModelBuilder::getBuildProperty('builderAddIncludes'))
+    {
+      return;
+    }
+
+    parent::addIncludes($script);
+  }
+
+  protected function addDoBuild(&$script)
+  {
+    parent::addDoBuild($script);
+
+    // fix http://propel.phpdb.org/trac/ticket/235: Column sizes not being inserted into [table]MapBuilder->DoBuild() by PHP5MapBuilderBuilder
+    $sizes = array();
+    foreach ($this->getTable()->getColumns() as $col)
+    {
+      $sizes[$col->getPhpName()] = !$col->getSize() ? 'null' : $col->getSize();
+    }
+    $script = preg_replace("/\\\$tMap\->addColumn\('([^']+)', '([^']+)', '([^']+)', CreoleTypes\:\:VARCHAR, (false|true)\)/e", '"\\\$tMap->addColumn(\'$1\', \'$2\', \'$3\', CreoleTypes::VARCHAR, $4, {$sizes[\'$2\']})"', $script);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfMapBuilderBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfMultiExtendObjectBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfMultiExtendObjectBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfMultiExtendObjectBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,30 @@
+<?php
+
+require_once 'propel/engine/builder/om/php5/PHP5MultiExtendObjectBuilder.php';
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: SfMultiExtendObjectBuilder.php 1919 2006-09-01 14:41:22Z fabien $
+ */
+class SfMultiExtendObjectBuilder extends PHP5MultiExtendObjectBuilder
+{
+  protected function addIncludes(&$script)
+  {
+    if (!DataModelBuilder::getBuildProperty('builderAddIncludes'))
+    {
+      return;
+    }
+
+    parent::addIncludes($script);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfMultiExtendObjectBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfObjectBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfObjectBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfObjectBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,341 @@
+<?php
+
+require_once 'propel/engine/builder/om/php5/PHP5ComplexObjectBuilder.php';
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: SfObjectBuilder.php 3493 2007-02-18 09:23:10Z fabien $
+ */
+class SfObjectBuilder extends PHP5ComplexObjectBuilder
+{
+  public function build()
+  {
+    if (!DataModelBuilder::getBuildProperty('builderAddComments'))
+    {
+      return sfToolkit::stripComments(parent::build());
+    }
+    
+    return parent::build();
+  }
+
+  protected function addIncludes(&$script)
+  {
+    if (!DataModelBuilder::getBuildProperty('builderAddIncludes'))
+    {
+      return;
+    }
+
+    parent::addIncludes($script);
+
+    // include the i18n classes if needed
+    if ($this->getTable()->getAttribute('isI18N'))
+    {
+      $relatedTable   = $this->getDatabase()->getTable($this->getTable()->getAttribute('i18nTable'));
+
+      $script .= '
+require_once \''.$this->getFilePath($this->getStubObjectBuilder()->getPackage().'.'.$relatedTable->getPhpName().'Peer').'\';
+require_once \''.$this->getFilePath($this->getStubObjectBuilder()->getPackage().'.'.$relatedTable->getPhpName()).'\';
+';
+    }
+  }
+
+  protected function addClassBody(&$script)
+  {
+    parent::addClassBody($script);
+
+    if ($this->getTable()->getAttribute('isI18N'))
+    {
+      if (count($this->getTable()->getPrimaryKey()) > 1)
+      {
+        throw new Exception('i18n support only works with a single primary key');
+      }
+
+      $this->addCultureAccessorMethod($script);
+      $this->addCultureMutatorMethod($script);
+
+      $this->addI18nMethods($script);
+    }
+
+    if (DataModelBuilder::getBuildProperty('builderAddBehaviors'))
+    {
+      $this->addCall($script);
+    }
+  }
+
+  protected function addCall(&$script)
+  {
+    $script .= "
+
+  public function __call(\$method, \$arguments)
+  {
+    if (!\$callable = sfMixer::getCallable('{$this->getClassname()}:'.\$method))
+    {
+      throw new sfException(sprintf('Call to undefined method {$this->getClassname()}::%s', \$method));
+    }
+
+    array_unshift(\$arguments, \$this);
+
+    return call_user_func_array(\$callable, \$arguments);
+  }
+
+";
+  }
+
+  protected function addAttributes(&$script)
+  {
+    parent::addAttributes($script);
+
+    if ($this->getTable()->getAttribute('isI18N'))
+    {
+      $script .= '
+  /**
+   * The value for the culture field.
+   * @var string
+   */
+  protected $culture;
+';
+    }
+  }
+
+  protected function addCultureAccessorMethod(&$script)
+  {
+    $script .= '
+  public function getCulture()
+  {
+    return $this->culture;
+  }
+';
+  }
+
+  protected function addCultureMutatorMethod(&$script)
+  {
+    $script .= '
+  public function setCulture($culture)
+  {
+    $this->culture = $culture;
+  }
+';
+  }
+
+  protected function addI18nMethods(&$script)
+  {
+    $table = $this->getTable();
+    $pks = $table->getPrimaryKey();
+    $pk = $pks[0]->getPhpName();
+
+    foreach ($table->getReferrers() as $fk)
+    {
+      $tblFK = $fk->getTable();
+      if ($tblFK->getName() == $table->getAttribute('i18nTable'))
+      {
+        $className = $tblFK->getPhpName();
+        $culture = '';
+        $culture_peername = '';
+        foreach ($tblFK->getColumns() as $col)
+        {
+          if (("true" === strtolower($col->getAttribute('isCulture'))))
+          {
+            $culture = $col->getPhpName();
+            $culture_peername = PeerBuilder::getColumnName($col, $className);
+          }
+        }
+
+        foreach ($tblFK->getColumns() as $col)
+        {
+          if ($col->isPrimaryKey()) continue;
+
+          $script .= '
+  public function get'.$col->getPhpName().'()
+  {
+    $obj = $this->getCurrent'.$className.'();
+
+    return ($obj ? $obj->get'.$col->getPhpName().'() : null);
+  }
+
+  public function set'.$col->getPhpName().'($value)
+  {
+    $this->getCurrent'.$className.'()->set'.$col->getPhpName().'($value);
+  }
+';
+        }
+
+$script .= '
+  protected $current_i18n = array();
+
+  public function getCurrent'.$className.'()
+  {
+    if (!isset($this->current_i18n[$this->culture]))
+    {
+      $obj = '.$className.'Peer::retrieveByPK($this->get'.$pk.'(), $this->culture);
+      if ($obj)
+      {
+        $this->set'.$className.'ForCulture($obj, $this->culture);
+      }
+      else
+      {
+        $this->set'.$className.'ForCulture(new '.$className.'(), $this->culture);
+        $this->current_i18n[$this->culture]->set'.$culture.'($this->culture);
+      }
+    }
+
+    return $this->current_i18n[$this->culture];
+  }
+
+  public function set'.$className.'ForCulture($object, $culture)
+  {
+    $this->current_i18n[$culture] = $object;
+    $this->add'.$className.'($object);
+  }
+';
+      }
+    }
+  }
+
+  protected function addDoSave(&$script)
+  {
+    $tmp = '';
+    parent::addDoSave($tmp);
+    // add autosave to i18n object even if the base object is not changed
+    $tmp = preg_replace_callback('#(\$this\->(.+?)\->isModified\(\))#', array($this, 'i18nDoSaveCallback'), $tmp);
+
+    $script .= $tmp;
+  }
+
+  private function i18nDoSaveCallback($matches)
+  {
+    $value = $matches[1];
+
+    // get the related class to see if it is a i18n one
+    $table = $this->getTable();
+    $column = null;
+    foreach ($table->getForeignKeys() as $fk)
+    {
+      if ($matches[2] == $this->getFKVarName($fk))
+      {
+        $column = $fk;
+        break;
+      }
+    }
+    $foreign_table = $this->getDatabase()->getTable($fk->getForeignTableName());
+    if ($foreign_table->getAttribute('isI18N'))
+    {
+      $foreign_tables_i18n_table = $this->getDatabase()->getTable($foreign_table->getAttribute('i18nTable'));
+      $value .= ' || $this->'.$matches[2].'->getCurrent'.$foreign_tables_i18n_table->getPhpName().'()->isModified()';
+    }
+
+    return $value;
+  }
+
+  protected function addDelete(&$script)
+  {
+    $tmp = '';
+    parent::addDelete($tmp);
+
+    if (DataModelBuilder::getBuildProperty('builderAddBehaviors'))
+    {
+      // add sfMixer call
+      $pre_mixer_script = "
+
+    foreach (sfMixer::getCallables('{$this->getClassname()}:delete:pre') as \$callable)
+    {
+      \$ret = call_user_func(\$callable, \$this, \$con);
+      if (\$ret)
+      {
+        return;
+      }
+    }
+
+";
+      $post_mixer_script = "
+
+    foreach (sfMixer::getCallables('{$this->getClassname()}:delete:post') as \$callable)
+    {
+      call_user_func(\$callable, \$this, \$con);
+    }
+
+";
+      $tmp = preg_replace('/{/', '{'.$pre_mixer_script, $tmp, 1);
+      $tmp = preg_replace('/}\s*$/', $post_mixer_script.'  }', $tmp);
+    }
+
+    // update current script
+    $script .= $tmp;
+  }
+
+  protected function addSave(&$script)
+  {
+    $tmp = '';
+    parent::addSave($tmp);
+
+    // add support for created_(at|on) and updated_(at|on) columns
+    $date_script = '';
+    $updated = false;
+    $created = false;
+    foreach ($this->getTable()->getColumns() as $col)
+    {
+      $clo = strtolower($col->getName());
+
+      if (!$updated && in_array($clo, array('updated_at', 'updated_on')))
+      {
+        $updated = true;
+        $date_script .= "
+    if (\$this->isModified() && !\$this->isColumnModified(".$this->getColumnConstant($col)."))
+    {
+      \$this->set".$col->getPhpName()."(time());
+    }
+";
+      }
+      else if (!$created && in_array($clo, array('created_at', 'created_on')))
+      {
+        $created = true;
+        $date_script .= "
+    if (\$this->isNew() && !\$this->isColumnModified(".$this->getColumnConstant($col)."))
+    {
+      \$this->set".$col->getPhpName()."(time());
+    }
+";
+      }
+    }
+    $tmp = preg_replace('/{/', '{'.$date_script, $tmp, 1);
+
+    if (DataModelBuilder::getBuildProperty('builderAddBehaviors'))
+    {
+      // add sfMixer call
+      $pre_mixer_script = "
+
+    foreach (sfMixer::getCallables('{$this->getClassname()}:save:pre') as \$callable)
+    {
+      \$affectedRows = call_user_func(\$callable, \$this, \$con);
+      if (is_int(\$affectedRows))
+      {
+        return \$affectedRows;
+      }
+    }
+
+";
+      $post_mixer_script = <<<EOF
+
+    foreach (sfMixer::getCallables('{$this->getClassname()}:save:post') as \$callable)
+    {
+      call_user_func(\$callable, \$this, \$con, \$affectedRows);
+    }
+
+EOF;
+      $tmp = preg_replace('/{/', '{'.$pre_mixer_script, $tmp, 1);
+      $tmp = preg_replace('/(\$con\->commit\(\);)/', '$1'.$post_mixer_script, $tmp);
+    }
+
+    // update current script
+    $script .= $tmp;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfObjectBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfPeerBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfPeerBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfPeerBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,274 @@
+<?php
+
+require_once 'propel/engine/builder/om/php5/PHP5ComplexPeerBuilder.php';
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: SfPeerBuilder.php 2534 2006-10-26 17:13:50Z fabien $
+ */
+class SfPeerBuilder extends PHP5ComplexPeerBuilder
+{
+  public function build()
+  {
+    if (!DataModelBuilder::getBuildProperty('builderAddComments'))
+    {
+      return sfToolkit::stripComments(parent::build());
+    }
+
+    return parent::build();
+  }
+
+  protected function addIncludes(&$script)
+  {
+    if (!DataModelBuilder::getBuildProperty('builderAddIncludes'))
+    {
+      return;
+    }
+
+    parent::addIncludes($script);
+  }
+
+  protected function addSelectMethods(&$script)
+  {
+    parent::addSelectMethods($script);
+
+    if ($this->getTable()->getAttribute('isI18N'))
+    {
+      $this->addDoSelectWithI18n($script);
+    }
+  }
+
+  protected function addDoSelectWithI18n(&$script)
+  {
+    $table = $this->getTable();
+    $thisTableObjectBuilder = OMBuilder::getNewObjectBuilder($table);
+    $className = $table->getPhpName();
+    $pks = $table->getPrimaryKey();
+    $pk = PeerBuilder::getColumnName($pks[0], $className);
+
+    // get i18n table name and culture column name
+    foreach ($table->getReferrers() as $fk)
+    {
+      $tblFK = $fk->getTable();
+      if ($tblFK->getName() == $table->getAttribute('i18nTable'))
+      {
+        $i18nClassName = $tblFK->getPhpName();
+        // FIXME
+        $i18nPeerClassName = $i18nClassName.'Peer';
+
+        $i18nTable = $table->getDatabase()->getTable($tblFK->getName());
+        $i18nTableObjectBuilder = OMBuilder::getNewObjectBuilder($i18nTable);
+        $i18nTablePeerBuilder = OMBuilder::getNewPeerBuilder($i18nTable);
+        $i18nPks = $i18nTable->getPrimaryKey();
+        $i18nPk = PeerBuilder::getColumnName($i18nPks[0], $i18nClassName);
+
+        $culturePhpName = '';
+        $cultureColumnName = '';
+        foreach ($tblFK->getColumns() as $col)
+        {
+          if (("true" === strtolower($col->getAttribute('isCulture'))))
+          {
+            $culturePhpName = $col->getPhpName();
+            $cultureColumnName = PeerBuilder::getColumnName($col, $i18nClassName);
+          }
+        }
+      }
+    }
+
+    $script .= "
+
+  /**
+   * Selects a collection of $className objects pre-filled with their i18n objects.
+   *
+   * @return array Array of $className objects.
+   * @throws PropelException Any exceptions caught during processing will be
+   *     rethrown wrapped into a PropelException.
+   */
+  public static function doSelectWithI18n(Criteria \$c, \$culture = null, \$con = null)
+  {
+    if (\$culture === null)
+    {
+      \$culture = sfContext::getInstance()->getUser()->getCulture();
+    }
+
+    // Set the correct dbName if it has not been overridden
+    if (\$c->getDbName() == Propel::getDefaultDB())
+    {
+      \$c->setDbName(self::DATABASE_NAME);
+    }
+
+    ".$this->getPeerClassname()."::addSelectColumns(\$c);
+    \$startcol = (".$this->getPeerClassname()."::NUM_COLUMNS - ".$this->getPeerClassname()."::NUM_LAZY_LOAD_COLUMNS) + 1;
+
+    ".$i18nPeerClassName."::addSelectColumns(\$c);
+
+    \$c->addJoin(".$pk.", ".$i18nPk.");
+    \$c->add(".$cultureColumnName.", \$culture);
+
+    \$rs = ".$this->basePeerClassname."::doSelect(\$c, \$con);
+    \$results = array();
+
+    while(\$rs->next()) {
+";
+            if ($table->getChildrenColumn()) {
+              $script .= "
+      \$omClass = ".$this->getPeerClassname()."::getOMClass(\$rs, 1);
+";
+            } else {
+              $script .= "
+      \$omClass = ".$this->getPeerClassname()."::getOMClass();
+";
+            }
+            $script .= "
+      \$cls = Propel::import(\$omClass);
+      \$obj1 = new \$cls();
+      \$obj1->hydrate(\$rs);
+      \$obj1->setCulture(\$culture);
+";
+//            if ($i18nTable->getChildrenColumn()) {
+              $script .= "
+      \$omClass = ".$i18nTablePeerBuilder->getPeerClassname()."::getOMClass(\$rs, \$startcol);
+";
+//            } else {
+//              $script .= "
+//      \$omClass = ".$i18nTablePeerBuilder->getPeerClassname()."::getOMClass();
+//";
+//            }
+
+            $script .= "
+      \$cls = Propel::import(\$omClass);
+      \$obj2 = new \$cls();
+      \$obj2->hydrate(\$rs, \$startcol);
+
+      \$obj1->set".$i18nClassName."ForCulture(\$obj2, \$culture);
+      \$obj2->set".$className."(\$obj1);
+
+      \$results[] = \$obj1;
+    }
+    return \$results;
+  }
+";
+  }
+
+  protected function addDoValidate(&$script)
+  {
+      $tmp = '';
+      parent::addDoValidate($tmp);
+
+      $script .= str_replace("return {$this->basePeerClassname}::doValidate(".$this->getPeerClassname()."::DATABASE_NAME, ".$this->getPeerClassname()."::TABLE_NAME, \$columns);\n",
+        "\$res =  {$this->basePeerClassname}::doValidate(".$this->getPeerClassname()."::DATABASE_NAME, ".$this->getPeerClassname()."::TABLE_NAME, \$columns);\n".
+        "    if (\$res !== true) {\n".
+        "        \$request = sfContext::getInstance()->getRequest();\n".
+        "        foreach (\$res as \$failed) {\n".
+        "            \$col = ".$this->getPeerClassname()."::translateFieldname(\$failed->getColumn(), BasePeer::TYPE_COLNAME, BasePeer::TYPE_PHPNAME);\n".
+        "            \$request->setError(\$col, \$failed->getMessage());\n".
+        "        }\n".
+        "    }\n\n".
+        "    return \$res;\n", $tmp);
+  }
+
+  protected function addDoSelectRS(&$script)
+  {
+    $tmp = '';
+    parent::addDoSelectRS($tmp);
+
+    if (DataModelBuilder::getBuildProperty('builderAddBehaviors'))
+    {
+      $mixer_script = "
+
+    foreach (sfMixer::getCallables('{$this->getClassname()}:addDoSelectRS:addDoSelectRS') as \$callable)
+    {
+      call_user_func(\$callable, '{$this->getClassname()}', \$criteria, \$con);
+    }
+
+";
+      $tmp = preg_replace('/{/', '{'.$mixer_script, $tmp, 1);
+    }
+
+    $script .= $tmp;
+  }
+
+  protected function addDoUpdate(&$script)
+  {
+    $tmp = '';
+    parent::addDoUpdate($tmp);
+
+    if (DataModelBuilder::getBuildProperty('builderAddBehaviors'))
+    {
+      // add sfMixer call
+      $pre_mixer_script = "
+
+    foreach (sfMixer::getCallables('{$this->getClassname()}:doUpdate:pre') as \$callable)
+    {
+      \$ret = call_user_func(\$callable, '{$this->getClassname()}', \$values, \$con);
+      if (false !== \$ret)
+      {
+        return \$ret;
+      }
+    }
+
+";
+
+      $post_mixer_script = "
+
+    foreach (sfMixer::getCallables('{$this->getClassname()}:doUpdate:post') as \$callable)
+    {
+      call_user_func(\$callable, '{$this->getClassname()}', \$values, \$con, \$ret);
+    }
+
+    return \$ret;
+";
+
+      $tmp = preg_replace('/{/', '{'.$pre_mixer_script, $tmp, 1);
+      $tmp = preg_replace("/\t\treturn ([^}]+)/", "\t\t\$ret = $1".$post_mixer_script.'  ', $tmp, 1);
+    }
+
+    $script .= $tmp;
+  }
+
+  protected function addDoInsert(&$script)
+  {
+    $tmp = '';
+    parent::addDoInsert($tmp);
+
+    if (DataModelBuilder::getBuildProperty('builderAddBehaviors'))
+    {
+      // add sfMixer call
+      $pre_mixer_script = "
+
+    foreach (sfMixer::getCallables('{$this->getClassname()}:doInsert:pre') as \$callable)
+    {
+      \$ret = call_user_func(\$callable, '{$this->getClassname()}', \$values, \$con);
+      if (false !== \$ret)
+      {
+        return \$ret;
+      }
+    }
+
+";
+
+      $post_mixer_script = "
+    foreach (sfMixer::getCallables('{$this->getClassname()}:doInsert:post') as \$callable)
+    {
+      call_user_func(\$callable, '{$this->getClassname()}', \$values, \$con, \$pk);
+    }
+
+    return";
+
+      $tmp = preg_replace('/{/', '{'.$pre_mixer_script, $tmp, 1);
+      $tmp = preg_replace("/\t\treturn/", "\t\t".$post_mixer_script, $tmp, 1);
+    }
+
+    $script .= $tmp;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/builder/SfPeerBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/database/sfPropelDataRetriever.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/database/sfPropelDataRetriever.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/database/sfPropelDataRetriever.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfGenerator is the abstract base class for all generators.
+ *
+ * @package    symfony
+ * @subpackage database
+ * @author     Olivier Verdier <Olivier.Verdier en gmail.com>
+ * @version    SVN: $Id $
+ */
+class sfPropelDataRetriever
+{
+  static public function retrieveObjects($class, $peerMethod = null)
+  {
+    if (!$classPath = sfCore::getClassPath($class.'Peer'))
+    {
+      throw new sfException(sprintf('Unable to find path for class "%s".', $class.'Peer'));
+    }
+
+    require_once($classPath);
+
+    if (!$peerMethod)
+    {
+      $peerMethod = 'doSelect';
+    }
+
+    $classPeer = $class.'Peer';
+
+    if (!is_callable(array($classPeer, $peerMethod)))
+    {
+      throw new sfException(sprintf('Peer method "%s" not found for class "%s"', $peerMethod, $classPeer));
+    }
+
+    $objects = call_user_func(array($classPeer, $peerMethod), new Criteria());
+
+    return $objects;
+  }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/database/sfPropelDataRetriever.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/database/sfPropelDatabase.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/database/sfPropelDatabase.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/database/sfPropelDatabase.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,114 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * A symfony database driver for Propel, derived from the native Creole driver.
+ *
+ * <b>Optional parameters:</b>
+ *
+ * # <b>datasource</b>     - [symfony] - datasource to use for the connection
+ * # <b>is_default</b>     - [false]   - use as default if multiple connections
+ *                                       are specified. The parameters
+ *                                       that has been flagged using this param
+ *                                       is be used when Propel is initialized
+ *                                       via sfPropelAutoload.
+ *
+ * @package    symfony
+ * @subpackage database
+ *
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPropelDatabase.class.php 3493 2007-02-18 09:23:10Z fabien $
+ */
+class sfPropelDatabase extends sfCreoleDatabase
+{
+  static protected
+    $config = array();
+
+  public function initialize($parameters = null, $name = 'propel')
+  {
+    parent::initialize($parameters);
+
+    if (!$this->hasParameter('datasource'))
+    {
+      $this->setParameter('datasource', $name);
+    }
+
+    $this->addConfig();
+
+    $is_default = $this->getParameter('is_default', false);
+
+    // first defined if none listed as default
+    if ($is_default || count(self::$config['propel']['datasources']) == 1)
+    {
+      $this->setDefaultConfig();
+    }
+  }
+
+  public function setDefaultConfig()
+  {
+    self::$config['propel']['datasources']['default'] = $this->getParameter('datasource');
+  }
+
+  public function addConfig()
+  {
+    if ($this->hasParameter('host'))
+    {
+      $this->setParameter('hostspec', $this->getParameter('host'));
+    }
+
+    if ($dsn = $this->getParameter('dsn'))
+    {
+      require_once('creole/Creole.php');
+      $params = Creole::parseDSN($dsn);
+
+      $options = array('phptype', 'hostspec', 'database', 'username', 'password', 'port', 'protocol', 'encoding', 'persistent');
+      foreach ($options as $option)
+      {
+        if (!$this->getParameter($option) && isset($params[$option]))
+        {
+          $this->setParameter($option, $params[$option]);
+        }
+      }
+    }
+
+    self::$config['propel']['datasources'][$this->getParameter('datasource')] =
+      array(
+        'adapter'      => $this->getParameter('phptype'),
+        'connection'   =>
+        array(
+          'phptype'    => $this->getParameter('phptype'),
+          'hostspec'   => $this->getParameter('hostspec'),
+          'database'   => $this->getParameter('database'),
+          'username'   => $this->getParameter('username'),
+          'password'   => $this->getParameter('password'),
+          'port'       => $this->getParameter('port'),
+          'encoding'   => $this->getParameter('encoding'),
+          'persistent' => $this->getParameter('persistent'),
+          'protocol'   => $this->getParameter('protocol'),
+        ),
+      );
+  }
+
+  public static function getConfiguration()
+  {
+    return self::$config;
+  }
+
+  public function setConnectionParameter($key, $value)
+  {
+    if ($key == 'host')
+    {
+      $key = 'hostspec';
+    }
+
+    self::$config['propel']['datasources'][$this->getParameter('datasource')]['connection'][$key] = $value;
+    $this->setParameter($key, $value);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/database/sfPropelDatabase.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/generator/sfPropelAdminGenerator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/generator/sfPropelAdminGenerator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/generator/sfPropelAdminGenerator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Propel Admin generator.
+ *
+ * This class generates an admin module with propel.
+ *
+ * @package    symfony
+ * @subpackage generator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPropelAdminGenerator.class.php 3302 2007-01-18 13:42:46Z fabien $
+ */
+
+class sfPropelAdminGenerator extends sfPropelCrudGenerator
+{
+  /**
+   * Initializes the current sfGenerator instance.
+   *
+   * @param sfGeneratorManager A sfGeneratorManager instance
+   */
+  public function initialize($generatorManager)
+  {
+    parent::initialize($generatorManager);
+
+    $this->setGeneratorClass('sfPropelAdmin');
+  }
+
+  public function getAllColumns()
+  {
+    $phpNames = array();
+    foreach ($this->getTableMap()->getColumns() as $column)
+    {
+      $phpNames[] = new sfAdminColumn($column->getPhpName(), $column);
+    }
+
+    return $phpNames;
+  }
+
+  public function getAdminColumnForField($field, $flag = null)
+  {
+    $phpName = sfInflector::camelize($field);
+
+    return new sfAdminColumn($phpName, $this->getColumnForPhpName($phpName), $flag);
+  }
+
+  // returns a column phpName or null if none was found
+  public function getColumnForPhpName($phpName)
+  {
+    // search the matching column for this column name
+
+    foreach ($this->getTableMap()->getColumns() as $column)
+    {
+      if ($column->getPhpName() == $phpName)
+      {
+        $found = true;
+
+        return $column;
+      }
+    }
+
+    // not a "real" column, so we will simulate one
+    return null;
+  }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/generator/sfPropelAdminGenerator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/generator/sfPropelCrudGenerator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/generator/sfPropelCrudGenerator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/generator/sfPropelCrudGenerator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,144 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Propel CRUD generator.
+ *
+ * This class generates a basic CRUD module with propel.
+ *
+ * @package    symfony
+ * @subpackage generator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPropelCrudGenerator.class.php 3302 2007-01-18 13:42:46Z fabien $
+ */
+
+class sfPropelCrudGenerator extends sfAdminGenerator
+{
+  /**
+   * Initializes the current sfGenerator instance.
+   *
+   * @param sfGeneratorManager A sfGeneratorManager instance
+   */
+  public function initialize($generatorManager)
+  {
+    parent::initialize($generatorManager);
+
+    $this->setGeneratorClass('sfPropelCrud');
+  }
+
+  /**
+   * Loads primary keys.
+   *
+   * This method is ORM dependant.
+   *
+   * @throws sfException
+   */
+  protected function loadPrimaryKeys()
+  {
+    foreach ($this->tableMap->getColumns() as $column)
+    {
+      if ($column->isPrimaryKey())
+      {
+        $this->primaryKey[] = $column;
+      }
+    }
+
+    if (!count($this->primaryKey))
+    {
+      throw new sfException(sprintf('Cannot generate a module for a model without a primary key (%s)', $this->className));
+    }
+  }
+
+  /**
+   * Loads map builder classes.
+   *
+   * This method is ORM dependant.
+   *
+   * @throws sfException
+   */
+  protected function loadMapBuilderClasses()
+  {
+    // we must load all map builder classes to be able to deal with foreign keys (cf. editSuccess.php template)
+    $classes = sfFinder::type('file')->name('*MapBuilder.php')->in(sfLoader::getModelDirs());
+    foreach ($classes as $class)
+    {
+      $class_map_builder = basename($class, '.php');
+      $maps[$class_map_builder] = new $class_map_builder();
+      if (!$maps[$class_map_builder]->isBuilt())
+      {
+        $maps[$class_map_builder]->doBuild();
+      }
+
+      if ($this->className == str_replace('MapBuilder', '', $class_map_builder))
+      {
+        $this->map = $maps[$class_map_builder];
+      }
+    }
+    if (!$this->map)
+    {
+      throw new sfException('The model class "'.$this->className.'" does not exist.');
+    }
+
+    $this->tableMap = $this->map->getDatabaseMap()->getTable(constant($this->className.'Peer::TABLE_NAME'));
+  }
+
+  /**
+   * Generates a PHP call to an object helper.
+   *
+   * @param string The helper name
+   * @param string The column name
+   * @param array  An array of parameters
+   * @param array  An array of local parameters
+   *
+   * @return string PHP code
+   */
+  function getPHPObjectHelper($helperName, $column, $params, $localParams = array())
+  {
+    $params = $this->getObjectTagParams($params, $localParams);
+
+    return sprintf('object_%s($%s, \'%s\', %s)', $helperName, $this->getSingularName(), $this->getColumnGetter($column, false), $params);
+  }
+
+  /**
+   * Returns the getter either non-developped: 'getFoo' or developped: '$class->getFoo()'.
+   *
+   * @param string  The column name
+   * @param boolean true if you want developped method names, false otherwise
+   * @param string The prefix value
+   *
+   * @return string PHP code
+   */
+  function getColumnGetter($column, $developed = false, $prefix = '')
+  {
+    $getter = 'get'.$column->getPhpName();
+    if ($developed)
+    {
+      $getter = sprintf('$%s%s->%s()', $prefix, $this->getSingularName(), $getter);
+    }
+
+    return $getter;
+  }
+
+  /*
+   * Gets the PHP name of the related class name.
+   *
+   * Used for foreign keys only; this method should be removed when we use sfAdminColumn instead.
+   *
+   * @param string The column name
+   *
+   * @return string The PHP name of the related class name
+   */
+  function getRelatedClassName($column)
+  {
+    $relatedTable = $this->getMap()->getDatabaseMap()->getTable($column->getRelatedTableName());
+
+    return $relatedTable->getPhpName();
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/generator/sfPropelCrudGenerator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelAutoload.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelAutoload.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelAutoload.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPropelAutoload.php 2808 2006-11-25 07:22:49Z fabien $
+ */
+require_once 'propel/Propel.php';
+
+if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+{
+  // register debug driver
+  require_once 'creole/Creole.php';
+  Creole::registerDriver('*', 'symfony.addon.creole.drivers.sfDebugConnection');
+
+  // register our logger
+  require_once(sfConfig::get('sf_symfony_lib_dir').'/addon/creole/drivers/sfDebugConnection.php');
+  sfDebugConnection::setLogger(sfLogger::getInstance());
+}
+
+// propel initialization
+Propel::setConfiguration(sfPropelDatabase::getConfiguration());
+Propel::initialize();


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelAutoload.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelBehavior.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelBehavior.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelBehavior.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,89 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPropelBehavior.class.php 2453 2006-10-20 05:58:48Z fabien $
+ */
+class sfPropelBehavior
+{
+  static protected $behaviors = array();
+
+  static public function registerMethods($name, $callables)
+  {
+    if (!isset(self::$behaviors[$name]))
+    {
+      self::$behaviors[$name] = array('methods' => array(), 'hooks' => array());
+    }
+    foreach ($callables as $callable)
+    {
+      self::$behaviors[$name]['methods'][] = $callable;
+    }
+  }
+
+  static public function registerHooks($name, $hooks)
+  {
+    if (!isset(self::$behaviors[$name]))
+    {
+      self::$behaviors[$name] = array('methods' => array(), 'hooks' => array());
+    }
+    foreach ($hooks as $hook => $callable)
+    {
+      if (!isset(self::$behaviors[$name]['hooks']))
+      {
+        self::$behaviors[$name]['hooks'][$hook] = array();
+      }
+
+      self::$behaviors[$name]['hooks'][$hook][] = $callable;
+    }
+  }
+
+  static public function add($class, $behaviors)
+  {
+    foreach ($behaviors as $name => $parameters)
+    {
+      if (is_int($name))
+      {
+        // no parameters
+        $name = $parameters;
+      }
+      else
+      {
+        // register parameters
+        foreach ($parameters as $key => $value)
+        {
+          sfConfig::set('propel_behavior_'.$name.'_'.$class.'_'.$key, $value);
+        }
+      }
+
+      if (!isset(self::$behaviors[$name]))
+      {
+        throw new sfConfigurationException(sprintf('Propel behavior "%s" is not registered', $name));
+      }
+
+      // register hooks
+      foreach (self::$behaviors[$name]['hooks'] as $hook => $callables)
+      {
+        foreach ($callables as $callable)
+        {
+          sfMixer::register('Base'.$class.$hook, $callable);
+        }
+      }
+
+      // register new methods
+      foreach (self::$behaviors[$name]['methods'] as $callable)
+      {
+        sfMixer::register('Base'.$class, $callable);
+      }
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelBehavior.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelData.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelData.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelData.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,343 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * This class is the Propel implementation of sfData.  It interacts with the data source
+ * and loads data.
+ *
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPropelData.class.php 3386 2007-02-01 09:53:58Z fabien $
+ */
+class sfPropelData extends sfData
+{
+  protected
+    $maps = array();
+
+  // symfony load-data (file|dir)
+  /**
+   * Loads data from a file or directory into a Propel data source
+   *
+   * @param mixed A file or directory path
+   * @param string The Propel connection name, default 'propel'
+   *
+   * @throws Exception If the database throws an error, rollback transaction and rethrows exception
+   */
+  public function loadData($directory_or_file = null, $connectionName = 'propel')
+  {
+    $fixture_files = $this->getFiles($directory_or_file);
+
+    // wrap all database operations in a single transaction
+    $con = Propel::getConnection($connectionName);
+    try
+    {
+      $con->begin();
+
+      $this->doDeleteCurrentData($fixture_files);
+
+      $this->doLoadData($fixture_files);
+
+      $con->commit();
+    }
+    catch (Exception $e)
+    {
+      $con->rollback();
+      throw $e;
+    }
+  }
+
+  /**
+   * Implements the abstract loadDataFromArray method and loads the data using the generated data model.
+   *
+   * @param array The data to be loaded into the data source
+   *
+   * @throws Exception If data is unnamed.
+   * @throws sfException If an object defined in the model does not exist in the data
+   * @throws sfException If a column that does not exist is referenced
+   */
+  public function loadDataFromArray($data)
+  {
+    if ($data === null)
+    {
+      // no data
+      return;
+    }
+
+    foreach ($data as $class => $datas)
+    {
+      $class = trim($class);
+
+      $peer_class = $class.'Peer';
+
+      // load map class
+      $this->loadMapBuilder($class);
+
+      $tableMap = $this->maps[$class]->getDatabaseMap()->getTable(constant($peer_class.'::TABLE_NAME'));
+
+      $column_names = call_user_func_array(array($peer_class, 'getFieldNames'), array(BasePeer::TYPE_FIELDNAME));
+
+      // iterate through datas for this class
+      // might have been empty just for force a table to be emptied on import
+      if (!is_array($datas))
+      {
+        return;
+      }
+
+      foreach ($datas as $key => $data)
+      {
+        // create a new entry in the database
+        $obj = new $class();
+
+        if (!is_array($data))
+        {
+          throw new Exception('You must give a name for each fixture data entry');
+        }
+
+        foreach ($data as $name => $value)
+        {
+          // foreign key?
+          try
+          {
+            $column = $tableMap->getColumn($name);
+            if ($column->isForeignKey() && !is_null($value))
+            {
+              $relatedTable = $this->maps[$class]->getDatabaseMap()->getTable($column->getRelatedTableName());
+              if (!isset($this->object_references[$relatedTable->getPhpName().'_'.$value]))
+              {
+                $error = 'The object "%s" from class "%s" is not defined in your data file.';
+                $error = sprintf($error, $value, $relatedTable->getPhpName());
+                throw new sfException($error);
+              }
+              $value = $this->object_references[$relatedTable->getPhpName().'_'.$value];
+            }
+          }
+          catch (PropelException $e)
+          {
+          }
+
+          $pos = array_search($name, $column_names);
+          $method = 'set'.sfInflector::camelize($name);
+          if ($pos)
+          {
+            $obj->setByPosition($pos, $value);
+          }
+          else if (is_callable(array($obj, $method)))
+          {
+            $obj->$method($value);
+          }
+          else
+          {
+            $error = 'Column "%s" does not exist for class "%s"';
+            $error = sprintf($error, $name, $class);
+            throw new sfException($error);
+          }
+        }
+        $obj->save();
+
+        // save the id for future reference
+        if (method_exists($obj, 'getPrimaryKey'))
+        {
+          $this->object_references[$class.'_'.$key] = $obj->getPrimaryKey();
+        }
+      }
+    }
+  }
+
+  /**
+   * Clears existing data from the data source by reading the fixture files
+   * and deleting the existing data for only those classes that are mentioned
+   * in the fixtures.
+   *
+   * @param array The list of YAML files.
+   *
+   * @throws sfException If a class mentioned in a fixture can not be found
+   */
+  protected function doDeleteCurrentData($fixture_files)
+  {
+    // delete all current datas in database
+    if (!$this->deleteCurrentData)
+    {
+      return;
+    }
+
+    rsort($fixture_files);
+    foreach ($fixture_files as $fixture_file)
+    {
+      $data = sfYaml::load($fixture_file);
+
+      if ($data === null)
+      {
+        // no data
+        continue;
+      }
+
+      $classes = array_keys($data);
+      krsort($classes);
+      foreach ($classes as $class)
+      {
+        $peer_class = trim($class.'Peer');
+
+        if (!$classPath = sfCore::getClassPath($peer_class))
+        {
+          throw new sfException(sprintf('Unable to find path for class "%s".', $peer_class));
+        }
+
+        require_once($classPath);
+
+        call_user_func(array($peer_class, 'doDeleteAll'));
+      }
+    }
+  }
+
+  /**
+   * Loads the mappings for the classes
+   *
+   * @param string The name of a data object
+   *
+   * @throws sfException If the class cannot be found
+   */
+  protected function loadMapBuilder($class)
+  {
+    $class_map_builder = $class.'MapBuilder';
+    if (!isset($this->maps[$class]))
+    {
+      if (!$classPath = sfCore::getClassPath($class_map_builder))
+      {
+        throw new sfException(sprintf('Unable to find path for class "%s".', $class_map_builder));
+      }
+
+      require_once($classPath);
+      $this->maps[$class] = new $class_map_builder();
+      $this->maps[$class]->doBuild();
+    }
+  }
+
+  /**
+   * Dumps data to fixture from 1 or more tables.
+   *
+   * @param string directory or file to dump to
+   * @param mixed name or names of tables to dump
+   * @param string connection name
+   */
+  public function dumpData($directory_or_file = null, $tables = 'all', $connectionName = 'propel')
+  {
+    $sameFile = true;
+    if (is_dir($directory_or_file))
+    {
+      // multi files
+      $sameFile = false;
+    }
+    else
+    {
+      // same file
+      // delete file
+    }
+
+    $con = Propel::getConnection($connectionName);
+
+    // get tables
+    if ('all' === $tables || null === $tables)
+    {
+      $tables = sfFinder::type('file')->name('/(?<!Peer)\.php$/')->maxdepth(0)->in(sfConfig::get('sf_model_lib_dir'));
+      foreach ($tables as &$table)
+      {
+        $table = basename($table, '.php');
+      }
+    }
+    else if (!is_array($tables))
+    {
+      $tables = array($tables);
+    }
+
+    $dumpData = array();
+
+    // load map classes
+    array_walk($tables, array($this, 'loadMapBuilder'));
+
+    // reordering tables to take foreign keys into account
+    $move = true;
+    while ($move)
+    {
+      foreach ($tables as $i => $tableName)
+      {
+        $tableMap = $this->maps[$tableName]->getDatabaseMap()->getTable(constant($tableName.'Peer::TABLE_NAME'));
+
+        foreach ($tableMap->getColumns() as $column)
+        {
+          if ($column->isForeignKey())
+          {
+            $relatedTable = $this->maps[$tableName]->getDatabaseMap()->getTable($column->getRelatedTableName());
+            if (array_search($relatedTable->getPhpName(), $tables) > $i)
+            {
+              unset($tables[$i]);
+              $tables[] = $tableName;
+              $move = true;
+              continue 2;
+            }
+          }
+        }
+
+        $move = false;
+      }
+    }
+
+    foreach ($tables as $tableName)
+    {
+      $tableMap = $this->maps[$tableName]->getDatabaseMap()->getTable(constant($tableName.'Peer::TABLE_NAME'));
+
+      // get db info
+      $rs = $con->executeQuery('SELECT * FROM '.constant($tableName.'Peer::TABLE_NAME'));
+
+      $dumpData[$tableName] = array();
+
+      while ($rs->next())
+      {
+        $pk = $tableName;
+        $values = array();
+        foreach ($tableMap->getColumns() as $column)
+        {
+          $col = strtolower($column->getColumnName());
+          if ($column->isPrimaryKey())
+          {
+            $pk .= '_'.$rs->get($col);
+          }
+          else if ($column->isForeignKey())
+          {
+            $relatedTable = $this->maps[$tableName]->getDatabaseMap()->getTable($column->getRelatedTableName());
+
+            $values[$col] = $relatedTable->getPhpName().'_'.$rs->get($col);
+          }
+          else
+          {
+            $values[$col] = $rs->get($col);
+          }
+        }
+
+        $dumpData[$tableName][$pk] = $values;
+      }
+    }
+
+    // save to file(s)
+    if ($sameFile)
+    {
+      $yaml = Spyc::YAMLDump($dumpData);
+      file_put_contents($directory_or_file, $yaml);
+    }
+    else
+    {
+      foreach ($dumpData as $table => $data)
+      {
+        $yaml = Spyc::YAMLDump($data);
+        file_put_contents($directory_or_file."/$table.yml", $yaml);
+      }
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelData.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelDatabaseSchema.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelDatabaseSchema.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelDatabaseSchema.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,719 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     François Zaninotto <francois.zaninotto en symfony-project.com>
+ * @version    SVN: $Id$
+ */
+class sfPropelDatabaseSchema
+{
+  protected $connection_name = '';
+  protected $database        = array();
+
+  public function asArray()
+  {
+    return array($this->connection_name => $this->database);
+  }
+
+  public function loadYAML($file)
+  {
+    $schema = sfYaml::load($file);
+
+    if (count($schema) > 1)
+    {
+      throw new sfException('A schema.yml must only contain 1 database entry.');
+    }
+
+    $tmp = array_keys($schema);
+    $this->connection_name = array_shift($tmp);
+    if ($this->connection_name)
+    {
+      $this->database = $schema[$this->connection_name];
+
+      $this->fixYAMLDatabase();
+      $this->fixYAMLI18n();
+      $this->fixYAMLColumns();
+    }
+  }
+
+  public function asXML()
+  {
+    $xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+
+    $xml .= "<database name=\"$this->connection_name\"".$this->getAttributesFor($this->database).">\n";
+
+    // tables
+    foreach ($this->getChildren($this->database) as $tb_name => $table)
+    {
+      $xml .= "\n  <table name=\"$tb_name\"".$this->getAttributesFor($table).">\n";
+
+      // columns
+      foreach ($this->getChildren($table) as $col_name => $column)
+      {
+        $xml .= "    <column name=\"$col_name\"".$this->getAttributesForColumn($tb_name, $col_name, $column);
+      }
+
+      // indexes
+      if (isset($table['_indexes']))
+      {
+        foreach ($table['_indexes'] as $index_name => $index)
+        {
+          $xml .= "    <index name=\"$index_name\">\n";
+          foreach ($index as $index_column)
+          {
+            $xml .= "      <index-column name=\"$index_column\" />\n";
+          }
+          $xml .= "    </index>\n";
+        }
+      }
+
+      // uniques
+      if (isset($table['_uniques']))
+      {
+        foreach ($table['_uniques'] as $unique_name => $index)
+        {
+          $xml .= "    <unique name=\"$unique_name\">\n";
+          foreach ($index as $unique_column)
+          {
+            $xml .= "      <unique-column name=\"$unique_column\" />\n";
+          }
+          $xml .= "    </unique>\n";
+        }
+      }
+
+      // foreign-keys
+      if (isset($table['_foreignKeys']))
+      {
+        foreach ($table['_foreignKeys'] as $fkey_name => $fkey)
+        {
+          $xml .= "    <foreign-key foreignTable=\"$fkey[foreignTable]\"";
+
+          // foreign key name
+          if (!is_numeric($fkey_name))
+          {
+            $xml .= " name=\"$fkey_name\"";
+          }
+
+          // onDelete
+          if (isset($fkey['onDelete']))
+          {
+            $xml .= " onDelete=\"$fkey[onDelete]\"";
+          }
+
+          // onUpdate
+          if (isset($fkey['onUpdate']))
+          {
+            $xml .= " onUpdate=\"$fkey[onUpdate]\"";
+          }
+          $xml .= ">\n";
+
+          // references
+          if (isset($fkey['references']))
+          {
+            foreach ($fkey['references'] as $reference)
+            {
+              $xml .= "      <reference local=\"$reference[local]\" foreign=\"$reference[foreign]\" />\n";
+            }
+          }
+          $xml .= "    </foreign-key>\n";
+        }
+      }
+
+      $xml .= "  </table>\n";
+    }
+    $xml .= "\n</database>\n";
+
+    return $xml;
+  }
+
+  protected function fixYAMLDatabase()
+  {
+    if (!isset($this->database['_attributes']))
+    {
+      $this->database['_attributes'] = array();
+    }
+
+    // conventions for database attributes
+    $this->setIfNotSet($this->database['_attributes'], 'defaultIdMethod', 'native');
+    $this->setIfNotSet($this->database['_attributes'], 'noXsd', true);
+    $this->setIfNotSet($this->database['_attributes'], 'package', 'lib.model');
+  }
+
+  protected function fixYAMLI18n()
+  {
+    foreach ($this->getTables() as $i18n_table => $columns)
+    {
+      $pos = strpos($i18n_table, '_i18n');
+
+      $has_primary_key = false;
+      foreach ($columns as $column => $attributes)
+      {
+        if (is_array($attributes) && array_key_exists('primaryKey', $attributes))
+        {
+           $has_primary_key = true;
+        }
+      }
+
+      if ($pos > 0 && $pos == strlen($i18n_table) - 5 && !$has_primary_key)
+      {
+        // i18n table without primary key
+        $main_table = $this->findTable(substr($i18n_table, 0, $pos));
+
+        if ($main_table)
+        {
+          // set i18n attributes for main table
+          $this->setIfNotSet($this->database[$main_table]['_attributes'], 'isI18N', 1);
+          $this->setIfNotSet($this->database[$main_table]['_attributes'], 'i18nTable', $i18n_table);
+
+          // set id and culture columns for i18n table
+          $this->setIfNotSet($this->database[$i18n_table], 'id', array(
+            'type'             => 'integer',
+            'required'         => true, 
+            'primaryKey'       => true,
+            'foreignTable'     => $main_table,
+            'foreignReference' => 'id',
+            'onDelete'         => 'cascade'
+          ));
+          $this->setIfNotSet($this->database[$i18n_table], 'culture', array(
+            'isCulture'  => true,
+            'type'       => 'varchar',
+            'size'       => '7',
+            'required'   => true,
+            'primaryKey' => true
+          ));
+        }
+        else
+        {
+          throw new sfException(sprintf('Missing main table for internationalized table "%s".', $i18n_table));
+        }
+      }
+    }
+  }
+
+  protected function fixYAMLColumns()
+  {
+    foreach ($this->getTables() as $table => $columns)
+    {
+      $has_primary_key = false;
+      
+      foreach ($columns as $column => $attributes)
+      {
+        if ($attributes == null)
+        {
+          // conventions for null attributes
+          if ($column == 'created_at' || $column == 'updated_at')
+          {
+            // timestamp convention
+            $this->database[$table][$column]['type']= 'timestamp';
+          }
+
+          if ($column == 'id')
+          {
+            // primary key convention
+            $this->database[$table]['id'] = array(
+              'type'          => 'integer',
+              'required'      => true,
+              'primaryKey'    => true,
+              'autoincrement' => true
+            );
+            $has_primary_key = true;
+          }
+          
+          $pos = strpos($column, '_id');
+          if ($pos > 0 && $pos == strlen($column) - 3)
+          {
+            // foreign key convention
+            $foreign_table = $this->findTable(substr($column, 0, $pos));
+            if ($foreign_table)
+            {
+              $this->database[$table][$column] = array(
+                'type'             => 'integer',
+                'foreignTable'     => $foreign_table,
+                'foreignReference' => 'id'
+              );
+            }
+            else
+            {
+              throw new sfException(sprintf('Unable to resolve foreign table for column "%s"', $column));
+            }
+          }
+          
+        }
+        else
+        {
+          if (!is_array($attributes))
+          {
+            // compact type given as single attribute
+            $this->database[$table][$column] = $this->getAttributesFromCompactType($attributes);
+          }
+          else
+          {
+            if (isset($attributes['type']))
+            {
+              // compact type given as value of the type attribute
+              $this->database[$table][$column] = array_merge($this->database[$table][$column], $this->getAttributesFromCompactType($attributes['type']));
+            }
+            if (isset($attributes['primaryKey']))
+            {
+              $has_primary_key = true;
+            }
+          }
+        }
+      }
+
+      if (!$has_primary_key)
+      {
+        // convention for tables without primary key
+        $this->database[$table]['id'] = array(
+          'type'          => 'integer',
+          'required'      => true,
+          'primaryKey'    => true,
+          'autoincrement' => true
+        );
+      }
+    }
+  }
+
+  protected function getAttributesFromCompactType($type)
+  {
+    preg_match('/varchar\(([\d]+)\)/', $type, $matches);
+    if (isset($matches[1]))
+    {
+      return array('type' => 'varchar', 'size' => $matches[1]);
+    }
+    else
+    {
+      return array('type' => $type);
+    }
+  }
+
+  protected function setIfNotSet(&$entry, $key, $value)
+  {
+    if (!isset($entry[$key]))
+    {
+      $entry[$key] = $value;
+    }
+  }
+
+  protected function findTable($table_name)
+  {
+    // find a table from a phpName or a name
+    $table_match = false;
+    foreach ($this->getTables() as $tb_name => $table)
+    {
+      if ((isset($table['_attributes']['phpName']) && $table['_attributes']['phpName'] == sfInflector::camelize($table_name)) || ($tb_name == $table_name))
+      {
+        $table_match = $tb_name;
+      }
+    }
+
+    return $table_match;
+  }
+
+  protected function getAttributesForColumn($tb_name, $col_name, $column)
+  {
+    $attributes_string = '';
+    if (is_array($column))
+    {
+      foreach ($column as $key => $value)
+      {
+        if (!in_array($key, array('foreignTable', 'foreignReference', 'onDelete', 'onUpdate', 'index', 'unique')))
+        {
+          $attributes_string .= " $key=\"".htmlspecialchars($this->getCorrectValueFor($key, $value))."\"";
+        }
+      }
+      $attributes_string .= " />\n";
+    }
+    else
+    {
+      throw new sfException('Incorrect settings for column '.$col_name);
+    }
+
+    // conventions for foreign key attributes
+    if (is_array($column) && isset($column['foreignTable']))
+    {
+      $attributes_string .= "    <foreign-key foreignTable=\"$column[foreignTable]\"";
+      if (isset($column['onDelete']))
+      {
+        $attributes_string .= " onDelete=\"$column[onDelete]\"";
+      }
+      if (isset($column['onUpdate']))
+      {
+        $attributes_string .= " onUpdate=\"$column[onUpdate]\"";
+      }
+      $attributes_string .= ">\n";
+      $attributes_string .= "      <reference local=\"$col_name\" foreign=\"$column[foreignReference]\" />\n";
+      $attributes_string .= "    </foreign-key>\n";
+    }
+
+    // conventions for index and unique index attributes
+    if (is_array($column) && isset($column['index']))
+    {
+      if ($column['index'] === 'unique')
+      {
+        $attributes_string .= "    <unique name=\"${tb_name}_${col_name}_unique\">\n";
+        $attributes_string .= "      <unique-column name=\"$col_name\" />\n";
+        $attributes_string .= "    </unique>\n";
+      }
+      else
+      {
+        $attributes_string .= "    <index name=\"${tb_name}_${col_name}_index\">\n";
+        $attributes_string .= "      <index-column name=\"$col_name\" />\n";
+        $attributes_string .= "    </index>\n";
+      }
+    }
+
+    // conventions for sequence name attributes
+    // required for databases using sequences for auto-increment columns (e.g. PostgreSQL or Oracle)
+    if (is_array($column) && isset($column['sequence'])) 
+    {
+      $attributes_string .= "    <id-method-parameter value=\"$column[sequence]\" />\n";
+    }
+
+    return $attributes_string;
+  }
+
+  protected function getAttributesFor($tag)
+  {
+    if (!isset($tag['_attributes']))
+    {
+      return '';
+    }
+    $attributes = $tag['_attributes'];
+    $attributes_string = '';
+    foreach ($attributes as $key => $value)
+    {
+      $attributes_string .= ' '.$key.'="'.htmlspecialchars($this->getCorrectValueFor($key, $value)).'"';
+    }
+
+    return $attributes_string;
+  }
+
+  protected function getCorrectValueFor($key, $value)
+  {
+    $booleans = array('required', 'primaryKey', 'autoincrement', 'autoIncrement', 'noXsd', 'isI18N', 'isCulture');
+    if (in_array($key, $booleans))
+    {
+      return $value == 1 ? 'true' : 'false';
+    }
+    else
+    {
+      return is_null($value) ? 'null' : $value;
+    }
+  }
+
+  public function getTables()
+  {
+    return $this->getChildren($this->database);
+  }
+
+  public function getChildren($hash)
+  {
+    foreach ($hash as $key => $value)
+    {
+      // ignore special children (starting with _)
+      if ($key[0] == '_')
+      {
+        unset($hash[$key]);
+      }
+    }
+
+    return $hash;
+  }
+
+  public function loadXML($file)
+  {
+    $schema = simplexml_load_file($file);
+    $database = array();
+
+    // database
+    list($database_name, $database_attributes) = $this->getNameAndAttributes($schema->attributes());
+    if ($database_name)
+    {
+      $this->connection_name = $database_name;
+    }
+    else
+    {
+      throw new sfException('The database tag misses a name attribute');
+    }
+    if ($database_attributes)
+    {
+      $database['_attributes'] = $database_attributes;
+    }
+
+    // tables
+    foreach ($schema as $table)
+    {
+      list($table_name, $table_attributes) = $this->getNameAndAttributes($table->attributes());
+      if ($table_name)
+      {
+        $database[$table_name] = array();
+      }
+      else
+      {
+        throw new sfException('A table tag misses the name attribute');
+      }
+      if ($table_attributes)
+      {
+        $database[$table_name]['_attributes'] = $table_attributes;
+      }
+
+      // columns
+      foreach ($table->xpath('column') as $column)
+      {
+        list($column_name, $column_attributes) = $this->getNameAndAttributes($column->attributes());
+        if ($column_name)
+        {
+          $database[$table_name][$column_name] = $column_attributes;
+        }
+        else
+        {
+          throw new sfException('A column tag misses the name attribute');
+        }
+      }
+
+      // foreign-keys
+      $database[$table_name]['_foreign_keys'] = array();
+      foreach ($table->xpath('foreign-key') as $foreign_key)
+      {
+        $foreign_key_table = array();
+
+        // foreign key attributes
+        if (isset($foreign_key['foreignTable']))
+        {
+          $foreign_key_table['foreign_table'] = (string) $foreign_key['foreignTable'];
+        }
+        else
+        {
+          throw new sfException('A foreign key misses the foreignTable attribute');
+        } 
+        if (isset($foreign_key['onDelete']))
+        {
+          $foreign_key_table['on_delete'] = (string) $foreign_key['onDelete'];
+        }
+        if (isset($foreign_key['onUpdate']))
+        {
+          $foreign_key_table['on_update'] = (string) $foreign_key['onUpdate'];
+        }
+
+        // foreign key references
+        $foreign_key_table['references'] = array();
+        foreach ($foreign_key->xpath('reference') as $reference)
+        {
+          $reference_attributes = array();
+          foreach ($reference->attributes() as $reference_attribute_name => $reference_attribute_value)
+          {
+            $reference_attributes[$reference_attribute_name] = strval($reference_attribute_value);
+          }
+          $foreign_key_table['references'][] = $reference_attributes;
+        }
+
+        if (isset($foreign_key['name']))
+        {
+          $database[$table_name]['_foreign_keys'][(string)$foreign_key['name']] = $foreign_key_table;
+        }
+        else
+        {
+          $database[$table_name]['_foreign_keys'][] = $foreign_key_table;
+        }
+
+      }
+      $this->removeEmptyKey($database[$table_name], '_foreign_keys');
+
+      // indexes
+      $database[$table_name]['_indexes'] = array();
+      foreach ($table->xpath('index') as $index)
+      {
+        $index_keys = array();
+        foreach ($index->xpath('index-column') as $index_key)
+        {
+          $index_keys[] = strval($index_key['name']);
+        }
+        $database[$table_name]['_indexes'][strval($index['name'])] = $index_keys;
+      }
+      $this->removeEmptyKey($database[$table_name], '_indexes');
+
+      // unique indexes
+      $database[$table_name]['_uniques'] = array();
+      foreach ($table->xpath('unique') as $index)
+      {
+        $unique_keys = array();
+        foreach ($index->xpath('unique-column') as $unique_key)
+        {
+          $unique_keys[] = strval($unique_key['name']);
+        }
+        $database[$table_name]['_uniques'][strval($index['name'])] = $unique_keys;
+      }
+      $this->removeEmptyKey($database[$table_name], '_uniques');
+    }
+    $this->database = $database;
+    
+    $this->fixXML();
+  }
+
+  public function fixXML()
+  {
+    $this->fixXMLForeignKeys();
+    $this->fixXMLIndexes();
+    // $this->fixXMLColumns();
+  }
+
+  protected function fixXMLForeignKeys()
+  {
+    foreach ($this->getTables() as $table => $columns)
+    {
+      if (isset($this->database[$table]['_foreign_keys']))
+      {
+        $foreign_keys = $this->database[$table]['_foreign_keys'];
+        foreach ($foreign_keys as $foreign_key_name => $foreign_key_attributes)
+        {
+          // Only single foreign keys can be simplified
+          if (count($foreign_key_attributes['references']) == 1)
+          {
+            $reference = $foreign_key_attributes['references'][0];
+
+            // set simple foreign key
+            $this->database[$table][$reference['local']]['foreignTable'] = $foreign_key_attributes['foreign_table'];
+            $this->database[$table][$reference['local']]['foreignReference'] = $reference['foreign'];
+            if (isset($foreign_key_attributes['on_delete']))
+            {
+              $this->database[$table][$reference['local']]['onDelete'] = $foreign_key_attributes['on_delete'];
+            }
+            if (isset($foreign_key_attributes['on_update']))
+            {
+              $this->database[$table][$reference['local']]['onUpdate'] = $foreign_key_attributes['on_update'];
+            }
+
+            // remove complex foreign key
+            unset($this->database[$table]['_foreign_keys'][$foreign_key_name]);
+          }
+
+          $this->removeEmptyKey($this->database[$table], '_foreign_keys');
+        }
+      }
+    }
+  }
+
+  protected function fixXMLIndexes()
+  {
+    foreach ($this->getTables() as $table => $columns)
+    {
+      if (isset($this->database[$table]['_indexes']))
+      {
+        $indexes = $this->database[$table]['_indexes'];
+        foreach ($indexes as $index => $references)
+        {
+          // Only single indexes can be simplified
+          if (count($references) == 1 && array_key_exists(substr($index, 0, strlen($index) - 6), $columns))
+          {
+            $reference = $references[0];
+
+            // set simple index
+            $this->database[$table][$reference]['index'] = 'true';
+
+            // remove complex index
+            unset($this->database[$table]['_indexes'][$index]);
+          }
+          
+          $this->removeEmptyKey($this->database[$table], '_indexes');
+        }
+      }
+      if (isset($this->database[$table]['_uniques']))
+      {
+        $uniques = $this->database[$table]['_uniques'];
+        foreach ($uniques as $index => $references)
+        {
+          // Only single unique indexes can be simplified
+          if (count($references) == 1 && array_key_exists(substr($index, 0, strlen($index) - 7), $columns))
+          {
+            $reference = $references[0];
+
+            // set simple index
+            $this->database[$table][$reference]['index'] = 'unique';
+
+            // remove complex unique index
+            unset($this->database[$table]['_uniques'][$index]);
+          }
+
+          $this->removeEmptyKey($this->database[$table], '_uniques');
+        }
+      }
+    }
+  }
+
+  protected function fixXMLColumns()
+  {
+    foreach ($this->getTables() as $table => $columns)
+    {
+      foreach ($columns as $column => $attributes)
+      {
+        if ($column == 'id' && !array_diff($attributes, array('type' => 'integer', 'required' => 'true', 'primaryKey' => 'true', 'autoincrement' => 'true')))
+        {
+          // simplify primary keys
+          $this->database[$table]['id'] = null;
+        }
+
+        if (($column == 'created_at') || ($column == 'updated_at') && !array_diff($attributes, array('type' => 'timestamp')))
+        {
+          // simplify timestamps
+          $this->database[$table][$column] = null;
+        }
+
+        $pos                 = strpos($column, '_id');
+        $has_fk_name         = $pos > 0 && $pos == strlen($column) - 3;
+        $is_foreign_key      = isset($attributes['type']) && $attributes['type'] == 'integer' && isset($attributes['foreignReference']) && $attributes['foreignReference'] == 'id';
+        $has_foreign_table   = isset($attributes['foreignTable']) && array_key_exists($attributes['foreignTable'], $this->getTables());
+        $has_other_attribute = isset($attributes['onDelete']);
+        if ($has_fk_name && $has_foreign_table && $is_foreign_key && !$has_other_attribute)
+        {
+          // simplify foreign key
+          $this->database[$table][$column] = null;
+        }
+      }
+    }
+  }
+
+  public function asYAML()
+  {
+    return sfYaml::dump(array($this->connection_name => $this->database));
+  }
+
+  protected function getNameAndAttributes($hash, $name_attribute = 'name')
+  {
+    // tag name
+    $name = '';
+    if (isset($hash[$name_attribute]))
+    {
+      $name = strval($hash[$name_attribute]);
+      unset($hash[$name_attribute]);
+    }
+
+    // tag attributes
+    $attributes = array();
+    foreach ($hash as $attribute => $value)
+    {
+      $attributes[$attribute] = strval($value);
+    }
+
+    return array($name, $attributes);
+  }
+
+  protected function removeEmptyKey(&$hash, $key)
+  {
+    if (isset($hash[$key]) && !$hash[$key])
+    {
+      unset($hash[$key]);
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelDatabaseSchema.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelManyToMany.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelManyToMany.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelManyToMany.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,106 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Nick Lane <nick.lane en internode.on.net>
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPropelManyToMany.class.php 1931 2006-09-02 17:56:18Z fabien $
+ */
+class sfPropelManyToMany
+{
+  public static function getColumn($class, $middleClass)
+  {
+    // find the related class
+    $tableMap = call_user_func(array($middleClass.'Peer', 'getTableMap'));
+    $object_table_name = constant($class.'Peer::TABLE_NAME');
+    foreach ($tableMap->getColumns() as $column)
+    {
+      if ($column->isForeignKey() && $object_table_name == $column->getRelatedTableName())
+      {
+        return $column;
+      }
+    }
+  }
+
+  public static function getRelatedColumn($class, $middleClass)
+  {
+    // find the related class
+    $tableMap = call_user_func(array($middleClass.'Peer', 'getTableMap'));
+    $object_table_name = constant($class.'Peer::TABLE_NAME');
+    foreach ($tableMap->getColumns() as $column)
+    {
+      if ($column->isForeignKey() && $object_table_name != $column->getRelatedTableName())
+      {
+        return $column;
+      }
+    }
+  }
+
+  public static function getRelatedClass($class, $middleClass)
+  {
+    $column = self::getRelatedColumn($class, $middleClass);
+
+    // we must load all map builder classes
+    $classes = sfFinder::type('file')->name('*MapBuilder.php')->in(sfLoader::getModelDirs());
+    foreach ($classes as $class)
+    {
+      $class_map_builder = basename($class, '.php');
+      $map = new $class_map_builder();
+      $map->doBuild();
+    }
+
+    $tableMap = call_user_func(array($middleClass.'Peer', 'getTableMap'));
+
+    return $tableMap->getDatabaseMap()->getTable($column->getRelatedTableName())->getPhpName();
+  }
+
+  public static function getAllObjects($object, $middleClass, $criteria = null)
+  {
+    if (null === $criteria)
+    {
+      $criteria = new Criteria();
+    }
+
+    $relatedClass = self::getRelatedClass(get_class($object), $middleClass);
+
+    return call_user_func(array($relatedClass.'Peer', 'doSelect'), $criteria);
+  }
+
+  /**
+   * Gets objects related by a many-to-many relationship, with a middle table.
+   *
+   * @param  $object        The object to get related objects for.
+   * @param  $middleClass   The middle class used for the many-to-many relationship.
+   * @param  $criteria      Criteria to apply to the selection.
+   */
+  public static function getRelatedObjects($object, $middleClass, $criteria = null)
+  {
+    if (null === $criteria)
+    {
+      $criteria = new Criteria();
+    }
+
+    $relatedClass = self::getRelatedClass(get_class($object), $middleClass);
+
+    $relatedObjects = array();
+    $objectMethod = 'get'.$middleClass.'sJoin'.$relatedClass;
+    $relatedMethod = 'get'.$relatedClass;
+    $rels = $object->$objectMethod($criteria);
+    foreach ($rels as $rel)
+    {
+      $relatedObjects[] = $rel->$relatedMethod();
+    }
+
+    return $relatedObjects;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelManyToMany.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelPager.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelPager.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelPager.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,138 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPropelPager.class.php 2728 2006-11-17 09:46:01Z chtito $
+ */
+
+/**
+ *
+ * sfPropelPager class.
+ *
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPropelPager.class.php 2728 2006-11-17 09:46:01Z chtito $
+ */
+class sfPropelPager extends sfPager
+{
+  protected
+    $criteria               = null,
+    $peer_method_name       = 'doSelect',
+    $peer_count_method_name = 'doCount';
+
+  public function __construct($class, $maxPerPage = 10)
+  {
+    parent::__construct($class, $maxPerPage);
+
+    $this->setCriteria(new Criteria());
+    $this->tableName = constant($class.'Peer::TABLE_NAME');
+  }
+  
+  public function init()
+  {
+    $hasMaxRecordLimit = ($this->getMaxRecordLimit() !== false);
+    $maxRecordLimit = $this->getMaxRecordLimit();
+
+    $cForCount = clone $this->getCriteria();
+    $cForCount->setOffset(0);
+    $cForCount->setLimit(0);
+    $cForCount->clearGroupByColumns();
+
+    // require the model class (because autoloading can crash under some conditions)
+    if (!$classPath = sfCore::getClassPath($this->getClassPeer()))
+    {
+      throw new sfException(sprintf('Unable to find path for class "%s".', $this->getClassPeer()));
+    }
+    require_once($classPath);
+    $count = call_user_func(array($this->getClassPeer(), $this->getPeerCountMethod()), $cForCount);
+
+    $this->setNbResults($hasMaxRecordLimit ? min($count, $maxRecordLimit) : $count);
+
+    $c = $this->getCriteria();
+    $c->setOffset(0);
+    $c->setLimit(0);
+
+    if (($this->getPage() == 0 || $this->getMaxPerPage() == 0))
+    {
+      $this->setLastPage(0);
+    }
+    else
+    {
+      $this->setLastPage(ceil($this->getNbResults() / $this->getMaxPerPage()));
+
+      $offset = ($this->getPage() - 1) * $this->getMaxPerPage();
+      $c->setOffset($offset);
+
+      if ($hasMaxRecordLimit)
+      {
+        $maxRecordLimit = $maxRecordLimit - $offset;
+        if ($maxRecordLimit > $this->getMaxPerPage())
+        {
+          $c->setLimit($this->getMaxPerPage());
+        }
+        else
+        {
+          $c->setLimit($maxRecordLimit);
+        }
+      }
+      else
+      {
+        $c->setLimit($this->getMaxPerPage());
+      }
+    }
+  }
+
+  protected function retrieveObject($offset)
+  {
+    $cForRetrieve = clone $this->getCriteria();
+    $cForRetrieve->setOffset($offset - 1);
+    $cForRetrieve->setLimit(1);
+
+    $results = call_user_func(array($this->getClassPeer(), $this->getPeerMethod()), $cForRetrieve);
+
+    return $results[0];
+  }
+
+  public function getResults()
+  {
+    $c = $this->getCriteria();
+
+    return call_user_func(array($this->getClassPeer(), $this->getPeerMethod()), $c);
+  }
+
+  public function getPeerMethod()
+  {
+    return $this->peer_method_name;
+  }
+
+  public function setPeerMethod($peer_method_name)
+  {
+    $this->peer_method_name = $peer_method_name;
+  }
+
+  public function getPeerCountMethod()
+  {
+    return $this->peer_count_method_name;
+  }
+
+  public function setPeerCountMethod($peer_count_method_name)
+  {
+    $this->peer_count_method_name = $peer_count_method_name;
+  }
+  
+  public function getClassPeer()
+  {
+    return $this->class.'Peer';
+  }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/sfPropelPager.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/validator/sfPropelUniqueValidator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/validator/sfPropelUniqueValidator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/validator/sfPropelUniqueValidator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,98 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfPropelUniqueValidator validates that the uniqueness of a column.
+ * This validator only works for single column primary key.
+ *
+ * <b>Required parameters:</b>
+ *
+ * # <b>class</b>        - [none]               - Propel class name.
+ * # <b>column</b>       - [none]               - Propel column name.
+ *
+ * <b>Optional parameters:</b>
+ *
+ * # <b>unique_error</b> - [Uniqueness error]   - An error message to use when
+ *                                                the value for this column already
+ *                                                exists in the database.
+ *
+ * @package    symfony
+ * @subpackage validator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Fédéric Coelho <frederic.coelho en symfony-project.com>
+ * @version    SVN: $Id: sfPropelUniqueValidator.class.php 2995 2006-12-09 18:01:32Z fabien $
+ */
+class sfPropelUniqueValidator extends sfValidator
+{
+  public function execute(&$value, &$error)
+  {
+    $className  = $this->getParameter('class').'Peer';
+    $columnName = call_user_func(array($className, 'translateFieldName'), $this->getParameter('column'), BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME);
+
+    $c = new Criteria();
+    $c->add($columnName, $value);
+    $object = call_user_func(array($className, 'doSelectOne'), $c);
+
+    if ($object)
+    {
+      $tableMap = call_user_func(array($className, 'getTableMap'));
+      foreach ($tableMap->getColumns() as $column)
+      {
+        if (!$column->isPrimaryKey())
+        {
+          continue;
+        }
+
+        $method = 'get'.$column->getPhpName();
+        $primaryKey = call_user_func(array($className, 'translateFieldName'), $column->getPhpName(), BasePeer::TYPE_PHPNAME, BasePeer::TYPE_FIELDNAME);
+        if ($object->$method() != $this->getContext()->getRequest()->getParameter($primaryKey))
+        {
+          $error = $this->getParameter('unique_error');
+
+          return false;
+        }
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * Initialize this validator.
+   *
+   * @param sfContext The current application context.
+   * @param array   An associative array of initialization parameters.
+   *
+   * @return bool true, if initialization completes successfully, otherwise false.
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // initialize parent
+    parent::initialize($context);
+
+    // set defaults
+    $this->setParameter('unique_error', 'Uniqueness error');
+
+    $this->getParameterHolder()->add($parameters);
+
+    // check parameters
+    if (!$this->getParameter('class'))
+    {
+      throw new sfValidatorException('The "class" parameter is mandatory for the sfPropelUniqueValidator validator.');
+    }
+
+    if (!$this->getParameter('column'))
+    {
+      throw new sfValidatorException('The "column" parameter is mandatory for the sfPropelUniqueValidator validator.');
+    }
+
+    return true;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/propel/validator/sfPropelUniqueValidator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/sfData.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/sfData.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/sfData.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,120 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * This class defines the interface for interacting with data, as well
+ * as default implementations.
+ *
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfData.class.php 3382 2007-02-01 07:34:56Z fabien $
+ */
+
+abstract class sfData
+{
+  protected
+    $deleteCurrentData = true,
+    $object_references = array();
+
+  /**
+   * Sets a flag to indicate if the current data in the database
+   * should be deleted before new data is loaded.
+   *
+   * @param boolean The flag value
+   */
+  public function setDeleteCurrentData($boolean)
+  {
+    $this->deleteCurrentData = $boolean;
+  }
+
+  /**
+   * Gets the current value of the flag that indicates whether
+   * current data is to be deleted or not.
+   *
+   * @returns boolean
+   */
+  public function getDeleteCurrentData()
+  {
+    return $this->deleteCurrentData;
+  }
+
+  /**
+   * Loads data for the database from a YAML file
+   *
+   * @param string The path to the YAML file.
+   */
+  protected function doLoadDataFromFile($fixture_file)
+  {
+    // import new datas
+    $data = sfYaml::load($fixture_file);
+
+    $this->loadDataFromArray($data);
+  }
+
+  /**
+   * Manages the insertion of data into the data source
+   *
+   * @param array The data to be inserted into the data source
+   */
+  abstract public function loadDataFromArray($data);
+
+  /**
+   * Manages reading all of the fixture data files and
+   * loading them into the data source
+   *
+   * @param array The path names of the YAML data files
+   */
+  protected function doLoadData($fixture_files)
+  {
+    $this->object_references = array();
+    $this->maps = array();
+
+    sort($fixture_files);
+    foreach ($fixture_files as $fixture_file)
+    {
+      $this->doLoadDataFromFile($fixture_file);
+    }
+  }
+
+  /**
+   * Gets a list of one or more *.yml files and returns the list in an array
+   *
+   * @param string A directory or file name; if null, then defaults to 'sf_data_dir'/fixtures
+   *
+   * @returns array A list of *.yml files.
+   *
+   * @throws sfInitializationException If the directory or file does not exist.
+   */
+  protected function getFiles($directory_or_file = null)
+  {
+    // directory or file?
+    $fixture_files = array();
+    if (!$directory_or_file)
+    {
+      $directory_or_file = sfConfig::get('sf_data_dir').'/fixtures';
+    }
+
+    if (is_file($directory_or_file))
+    {
+      $fixture_files[] = $directory_or_file;
+    }
+    else if (is_dir($directory_or_file))
+    {
+      $fixture_files = sfFinder::type('file')->name('*.yml')->in($directory_or_file);
+    }
+    else
+    {
+      throw new sfInitializationException('You must give a directory or a file.');
+    }
+
+    return $fixture_files;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/sfData.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/sfMail.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/sfMail.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/sfMail.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,406 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * sfMail class.
+ *
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfMail.class.php 3172 2007-01-05 16:03:15Z fabien $
+ */
+class sfMail
+{
+  protected $mailer;
+
+  public function __construct()
+  {
+    require_once(sfConfig::get('sf_symfony_lib_dir').'/vendor/phpmailer/class.phpmailer.php');
+    require_once(sfConfig::get('sf_symfony_lib_dir').'/vendor/phpmailer/class.smtp.php');
+
+    $this->mailer = new PHPMailer();
+  }
+
+  public function initialize()
+  {
+  }
+
+  public function setCharset($charset)
+  {
+    $this->mailer->CharSet = $charset;
+  }
+
+  public function getCharset()
+  {
+    return $this->mailer->CharSet;
+  }
+
+  public function setContentType($content_type)
+  {
+    $this->mailer->ContentType = $content_type;
+  }
+
+  public function getContentType()
+  {
+    return $this->mailer->ContentType;
+  }
+
+  public function setPriority($priority)
+  {
+    $this->mailer->Priority = $priority;
+  }
+
+  public function getPriority()
+  {
+    return $this->mailer->Priority;
+  }
+
+  public function setEncoding($encoding)
+  {
+    $this->mailer->Encoding = $encoding;
+  }
+
+  public function getEncoding()
+  {
+    return $this->mailer->Encoding;
+  }
+
+  public function setSubject($subject)
+  {
+    $this->mailer->Subject = $subject;
+  }
+
+  public function getSubject()
+  {
+    return $this->mailer->Subject;
+  }
+
+  public function setBody($body)
+  {
+    $this->mailer->Body = $body;
+  }
+
+  public function getBody()
+  {
+    return $this->mailer->Body;
+  }
+
+  public function setMailer($type = 'mail', $options = array())
+  {
+    switch ($type)
+    {
+      case 'smtp':
+        $this->mailer->IsSMTP();
+        if (isset($options['keep_alive'])) $this->mailer->SMTPKeepAlive = true;
+        break;
+      case 'sendmail':
+        $this->mailer->IsSendmail();
+        break;
+      default:
+        $this->mailer->IsMail();
+        break;
+    }
+  }
+  
+  public function getMailer()
+  {
+    return $this->mailer->Mailer;
+  }
+
+  public function setSender($address, $name = null)
+  {
+    if (!$address)
+    {
+      return;
+    }
+
+    if ($name == null)
+    {
+      list($address, $name) = $this->splitAddress($address);
+    }
+    $this->mailer->Sender = $address;
+  }
+
+  public function getSender()
+  {
+    return $this->mailer->Sender;
+  }
+
+  public function setFrom($address, $name = null)
+  {
+    if (!$address)
+    {
+      return;
+    }
+
+    if ($name == null)
+    {
+      list($address, $name) = $this->splitAddress($address);
+    }
+    $this->mailer->From     = $address;
+    $this->mailer->FromName = $name;
+  }
+
+  public function getFrom()
+  {
+    return $this->mailer->From;
+  }
+
+  /*
+   * $recipents:
+   * test en example.com
+   * Example email <test en example.com>
+   * array('test en example.com', 'test1 en example.com')
+   * array('Example email <test en example.com>', 'test1 en example.com')
+   */
+  public function addAddresses($addresses)
+  {
+    if (!$addresses)
+    {
+      return;
+    }
+
+    if (is_array($addresses))
+    {
+      foreach ($addresses as $address)
+      {
+        list($address, $name) = $this->splitAddress($address);
+        $this->mailer->AddAddress($address, $name);
+      }
+    }
+    else
+    {
+      list($address, $name) = $this->splitAddress($addresses);
+      $this->mailer->AddAddress($address, $name);
+    }
+  }
+
+  private function splitAddress($address)
+  {
+    if (preg_match('/^(.+)\s<(.+?)>$/', $address, $matches))
+    {
+      return array($matches[2], $matches[1]);
+    }
+    else
+    {
+      return array($address, '');
+    }
+  }
+
+  public function addAddress($address, $name = null)
+  {
+    if ($name == null)
+    {
+      list($address, $name) = $this->splitAddress($address);
+    }
+    $this->mailer->AddAddress($address, $name);
+  }
+
+  public function addCc($address, $name = null)
+  {
+    if ($name == null)
+    {
+      list($address, $name) = $this->splitAddress($address);
+    }
+    $this->mailer->AddCc($address, $name);
+  }
+
+  public function addBcc($address, $name = null)
+  {
+    if ($name == null)
+    {
+      list($address, $name) = $this->splitAddress($address);
+    }
+    $this->mailer->AddBcc($address, $name);
+  }
+
+  public function addReplyTo($address, $name = null)
+  {
+    if (!$address)
+    {
+      return;
+    }
+
+    if ($name == null)
+    {
+      list($address, $name) = $this->splitAddress($address);
+    }
+    $this->mailer->AddReplyTo($address, $name);
+  }
+
+  public function clearAddresses()
+  {
+    $this->mailer->ClearAddresses();
+  }
+
+  public function clearCcs()
+  {
+    $this->mailer->ClearCcs();
+  }
+
+  public function clearBccs()
+  {
+    $this->mailer->ClearBccs();
+  }
+
+  public function clearReplyTos()
+  {
+    $this->mailer->ClearReplyTos();
+  }
+
+  public function clearAllRecipients()
+  {
+    $this->mailer->ClearAllRecipients();
+  }
+
+  public function addAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream')
+  {
+    $this->mailer->AddAttachment($path, $name, $encoding, $type);
+  }
+
+  public function addStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream')
+  {
+    $this->mailer->AddStringAttachment($string, $filename, $encoding, $type);
+  }
+
+  public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream')
+  {
+    $this->mailer->AddEmbeddedImage($path, $cid, $name, $encoding, $type);
+  }
+
+  public function setAttachments($attachments)
+  {
+    if ($attachments instanceof sfMailAttachments)
+    {
+      $this->mailer->setAttachments($attachments->getAttachments());
+    }
+  }
+
+  public function clearAttachments()
+  {
+    $this->mailer->ClearAttachments();
+  }
+
+  function addCustomHeader($name, $value)
+  {
+    $this->mailer->AddCustomHeader("$name: $value");
+  }
+
+  function clearCustomHeaders()
+  {
+    $this->mailer->ClearCustomHeaders();
+  }
+
+  public function prepare()
+  {
+    // Set whether the message is multipart/alternative
+    if (!empty($this->mailer->AltBody))
+    {
+      $this->mailer->ContentType = "multipart/alternative";
+    }
+
+    $this->mailer->SetMessageType();
+  }
+
+  public function send()
+  {
+    if (!$this->mailer->Send())
+    {
+      throw new sfException($this->mailer->ErrorInfo);
+    }
+  }
+
+  public function smtpClose()
+  {
+    $this->mailer->SmtpClose();
+  }
+  
+  public function getRawHeader()
+  {
+    return $this->mailer->CreateHeader();
+  }
+
+  public function getRawBody()
+  {
+    return $this->mailer->CreateBody();
+  }
+
+  public function setDomain($hostname)
+  {
+    $this->mailer->Hostname = $hostname;
+  }
+
+  public function getDomain()
+  {
+    return $this->mailer->Hostname;
+  }
+
+  public function setHostname($hostname)
+  {
+    $this->mailer->Host = $hostname;
+  }
+
+  public function getHostname()
+  {
+    return $this->mailer->Host;
+  }
+
+  public function setPort($port)
+  {
+    $this->mailer->Port = $port;
+  }
+
+  public function getPort()
+  {
+    return $this->mailer->Port;
+  }
+
+  public function setUsername($username)
+  {
+    $this->mailer->Username = $username;
+    $this->mailer->SMTPAuth = $username ? true : false;
+  }
+
+  public function getUsername()
+  {
+    return $this->mailer->Username;
+  }
+
+  public function setPassword($password)
+  {
+    $this->mailer->Password = $password;
+  }
+
+  public function getPassword()
+  {
+    return $this->mailer->Password;
+  }
+
+  public function setWordWrap($wordWrap)
+  {
+    $this->mailer->WordWrap = $wordWrap;
+  }
+
+  public function getWordWrap()
+  {
+    return $this->mailer->WordWrap;
+  }
+
+  public function setAltBody($text)
+  {
+    $this->mailer->AltBody = $text;
+  }
+
+  public function getAltBody()
+  {
+    return $this->mailer->AltBody;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/sfMail.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/sfPager.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/sfPager.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/sfPager.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,307 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPager.class.php 3099 2006-12-20 08:16:15Z fabien $
+ */
+
+/**
+ *
+ * sfPager class.
+ *
+ * @package    symfony
+ * @subpackage addon
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPager.class.php 3099 2006-12-20 08:16:15Z fabien $
+ */
+abstract class sfPager
+{
+  protected
+    $page            = 1,
+    $maxPerPage      = 0,
+    $lastPage        = 1,
+    $nbResults       = 0,
+    $class           = '',
+    $tableName       = '',
+    $objects         = null,
+    $cursor          = 1,
+    $parameters      = array(),
+    $currentMaxLink  = 1,
+    $parameterHolder = null,
+    $maxRecordLimit = false;
+
+  public function __construct($class, $maxPerPage = 10)
+  {
+    $this->setClass($class);
+    $this->setMaxPerPage($maxPerPage);
+    $this->setPage(1);
+    $this->parameterHolder = new sfParameterHolder();
+  }
+
+  // function to be called after parameters have been set
+  abstract public function init();
+
+  // main method: returns an array of result on the given page
+  abstract public function getResults();
+
+  // used internally by getCurrent()
+  abstract protected function retrieveObject($offset);
+
+  public function getCurrentMaxLink()
+  {
+    return $this->currentMaxLink;
+  }
+
+  public function getMaxRecordLimit()
+  {
+    return $this->maxRecordLimit;
+  }
+
+  public function setMaxRecordLimit($limit)
+  {
+    $this->maxRecordLimit = $limit;
+  }
+
+  public function getLinks($nb_links = 5)
+  {
+    $links = array();
+    $tmp   = $this->page - floor($nb_links / 2);
+    $check = $this->lastPage - $nb_links + 1;
+    $limit = ($check > 0) ? $check : 1;
+    $begin = ($tmp > 0) ? (($tmp > $limit) ? $limit : $tmp) : 1;
+
+    $i = $begin;
+    while (($i < $begin + $nb_links) && ($i <= $this->lastPage))
+    {
+      $links[] = $i++;
+    }
+
+    $this->currentMaxLink = $links[count($links) - 1];
+
+    return $links;
+  }
+
+  public function haveToPaginate()
+  {
+    return (($this->getPage() != 0) && ($this->getNbResults() > $this->getMaxPerPage()));
+  }
+
+  public function getCursor()
+  {
+    return $this->cursor;
+  }
+
+  public function setCursor($pos)
+  {
+    if ($pos < 1)
+    {
+      $this->cursor = 1;
+    }
+    else if ($pos > $this->nbResults)
+    {
+      $this->cursor = $this->nbResults;
+    }
+    else
+    {
+      $this->cursor = $pos;
+    }
+  }
+
+  public function getObjectByCursor($pos)
+  {
+    $this->setCursor($pos);
+
+    return $this->getCurrent();
+  }
+
+  public function getCurrent()
+  {
+    return $this->retrieveObject($this->cursor);
+  }
+
+  public function getNext()
+  {
+    if (($this->cursor + 1) > $this->nbResults)
+    {
+      return null;
+    }
+    else
+    {
+      return $this->retrieveObject($this->cursor + 1);
+    }
+  }
+
+  public function getPrevious()
+  {
+    if (($this->cursor - 1) < 1)
+    {
+      return null;
+    }
+    else
+    {
+      return $this->retrieveObject($this->cursor - 1);
+    }
+  }
+
+  public function getFirstIndice()
+  {
+    if ($this->page == 0)
+    {
+      return 1;
+    }
+    else
+    {
+      return ($this->page - 1) * $this->maxPerPage + 1;
+    }
+  }
+
+  public function getLastIndice()
+  {
+    if ($this->page == 0)
+    {
+      return $this->nbResults;
+    }
+    else
+    {
+      if (($this->page * $this->maxPerPage) >= $this->nbResults)
+      {
+        return $this->nbResults;
+      }
+      else
+      {
+        return ($this->page * $this->maxPerPage);
+      }
+    }
+  }
+
+  public function getCriteria()
+  {
+    return $this->criteria;
+  }
+
+  public function setCriteria($c)
+  {
+    $this->criteria = $c;
+  }
+
+  public function getClass()
+  {
+    return $this->class;
+  }
+
+  public function setClass($class)
+  {
+    $this->class = $class;
+  }
+
+  public function getNbResults()
+  {
+    return $this->nbResults;
+  }
+
+  protected function setNbResults($nb)
+  {
+    $this->nbResults = $nb;
+  }
+
+  public function getFirstPage()
+  {
+    return 1;
+  }
+
+  public function getLastPage()
+  {
+    return $this->lastPage;
+  }
+
+  protected function setLastPage($page)
+  {
+    $this->lastPage = $page;
+    if ($this->getPage() > $page)
+    {
+      $this->setPage($page);
+    }
+  }
+
+  public function getPage()
+  {
+    return $this->page;
+  }
+
+  public function getNextPage()
+  {
+    return min($this->getPage() + 1, $this->getLastPage());
+  }
+
+  public function getPreviousPage()
+  {
+    return max($this->getPage() - 1, $this->getFirstPage());
+  }
+
+  public function setPage($page)
+  {
+    $page = intval($page);
+
+    $this->page = ($page <= 0) ? 1 : $page;
+  }
+
+  public function getMaxPerPage()
+  {
+    return $this->maxPerPage;
+  }
+
+  public function setMaxPerPage($max)
+  {
+    if ($max > 0)
+    {
+      $this->maxPerPage = $max;
+      if ($this->page == 0)
+      {
+        $this->page = 1;
+      }
+    }
+    else if ($max == 0)
+    {
+      $this->maxPerPage = 0;
+      $this->page = 0;
+    }
+    else
+    {
+      $this->maxPerPage = 1;
+      if ($this->page == 0)
+      {
+        $this->page = 1;
+      }
+    }
+  }
+
+  public function getParameterHolder()
+  {
+    return $this->parameterHolder;
+  }
+
+  public function getParameter($name, $default = null, $ns = null)
+  {
+    return $this->parameterHolder->get($name, $default, $ns);
+  }
+
+  public function hasParameter($name, $ns = null)
+  {
+    return $this->parameterHolder->has($name, $ns);
+  }
+
+  public function setParameter($name, $value, $ns = null)
+  {
+    return $this->parameterHolder->set($name, $value, $ns);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/addon/sfPager.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfCache.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfCache.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfCache.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,118 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfCache is an abstract class for all cache classes in symfony.
+ *
+ * @package    symfony
+ * @subpackage cache
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Fabien Marty <fab en php.net>
+ * @version    SVN: $Id: sfCache.class.php 3198 2007-01-08 20:36:20Z fabien $
+ */
+abstract class sfCache
+{
+ /**
+  * Cache lifetime (in seconds)
+  *
+  * @var int $lifeTime
+  */
+  protected $lifeTime = 86400;
+
+ /**
+  * Timestamp of the last valid cache
+  *
+  * @var int $refreshTime
+  */
+  protected $refreshTime;
+
+ /**
+  * Gets the cache content for a given id and namespace.
+  *
+  * @param  string  The cache id
+  * @param  string  The name of the cache namespace
+  * @param  boolean If set to true, the cache validity won't be tested
+  *
+  * @return string  The data of the cache (or null if no cache available)
+  */
+  abstract public function get($id, $namespace = self::DEFAULT_NAMESPACE, $doNotTestCacheValidity = false);
+
+  /**
+   * Returns true if there is a cache for the given id and namespace.
+   *
+   * @param  string  The cache id
+   * @param  string  The name of the cache namespace
+   * @param  boolean If set to true, the cache validity won't be tested
+   *
+   * @return boolean true if the cache exists, false otherwise
+   */
+  abstract public function has($id, $namespace = self::DEFAULT_NAMESPACE, $doNotTestCacheValidity = false);
+
+ /**
+  * Saves some data in the cache.
+  *
+  * @param string The cache id
+  * @param string The name of the cache namespace
+  * @param string The data to put in cache
+  *
+  * @return boolean true if no problem
+  */
+  abstract public function set($id, $namespace = self::DEFAULT_NAMESPACE, $data);
+
+ /**
+  * Removes a content from the cache.
+  *
+  * @param string The cache id
+  * @param string The name of the cache namespace
+  *
+  * @return boolean true if no problem
+  */
+  abstract public function remove($id, $namespace = self::DEFAULT_NAMESPACE);
+
+ /**
+  * Cleans the cache.
+  *
+  * If no namespace is specified all cache content will be destroyed
+  * else only cache contents of the specified namespace will be destroyed.
+  *
+  * @param string The name of the cache namespace
+  *
+  * @return boolean true if no problem
+  */
+  abstract public function clean($namespace = null, $mode = 'all');
+
+ /**
+  * Sets a new life time.
+  *
+  * @param int The new life time (in seconds)
+  */
+  public function setLifeTime($newLifeTime)
+  {
+    $this->lifeTime = $newLifeTime;
+    $this->refreshTime = time() - $newLifeTime;
+  }
+
+  /**
+   * Returns the current life time.
+   *
+   * @return int The current life time (in seconds)
+   */
+  public function getLifeTime()
+  {
+    return $this->lifeTime;
+  }
+
+ /**
+  * Returns the cache last modification time.
+  *
+  * @return int The last modification time
+  */
+  abstract public function lastModified($id, $namespace = self::DEFAULT_NAMESPACE);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfCache.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfFileCache.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfFileCache.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfFileCache.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,595 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Cache class that stores content in files.
+ *
+ * This class is based on the PEAR_Cache_Lite class.
+ * All cache files are stored in files in the [sf_root_dir].'/cache/'.[sf_app].'/template' directory.
+ * To disable all caching, you can set to false [sf_cache] setting.
+ *
+ * @package    symfony
+ * @subpackage cache
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Fabien Marty <fab en php.net>
+ * @version    SVN: $Id: sfFileCache.class.php 3198 2007-01-08 20:36:20Z fabien $
+ */
+class sfFileCache extends sfCache
+{
+  const DEFAULT_NAMESPACE = '';
+
+ /**
+  * Directory where to put the cache files
+  */
+  protected $cacheDir = '';
+
+ /**
+  * Enable / disable fileLocking (can avoid cache corruption under bad circumstances)
+  * @var boolean $fileLocking
+  */
+  protected $fileLocking = true;
+
+ /**
+  * Enable / disable write control (the cache is read just after writing to detect corrupt entries)
+  *
+  * Enable write control will lightly slow the cache writing but not the cache reading
+  * Write control can detect some corrupt cache files but maybe it's not a perfect control
+  */
+  protected $writeControl = false;
+
+ /**
+  * Enable / disable read control
+  *
+  * If enabled, a control key is embeded in cache file and this key is compared with the one calculated after the reading.
+  */
+  protected $readControl = false;
+
+ /**
+  * File Name protection
+  *
+  * if set to true, you can use any cache id or namespace name
+  * if set to false, it can be faster but cache ids and namespace names
+  * will be used directly in cache file names so be carefull with
+  * special characters...
+  */
+  protected $fileNameProtection = false;
+
+ /**
+  * Disable / Tune the automatic cleaning process
+  *
+  * The automatic cleaning process destroy too old (for the given life time)
+  * cache files when a new cache file is written.
+  * 0               => no automatic cache cleaning
+  * 1               => systematic cache cleaning
+  * x (integer) > 1 => automatic cleaning randomly 1 times on x cache write
+  */
+  protected $automaticCleaningFactor = 500;
+  
+ /**
+  * Nested directory level
+  */
+  protected $hashedDirectoryLevel = 0;
+
+ /**
+  * Cache suffix
+  */
+  protected
+    $suffix = '.cache';
+
+ /**
+  * Constructor.
+  *
+  * @param string The cache root directory
+  */
+  public function __construct($cacheDir = null)
+  {
+    $this->setCacheDir($cacheDir);
+  }
+
+  /**
+   * Initializes the cache.
+   *
+   * @param array An array of options
+   * Available options:
+   *  - cacheDir:                cache root directory
+   *  - fileLocking:             enable / disable file locking (boolean)
+   *  - writeControl:            enable / disable write control (boolean)
+   *  - readControl:             enable / disable read control (boolean)
+   *  - fileNameProtection:      enable / disable automatic file name protection (boolean)
+   *  - automaticCleaningFactor: disable / tune automatic cleaning process (int)
+   *  - hashedDirectoryLevel:    level of the hashed directory system (int)
+   *  - lifeTime:                default life time
+   *
+   */
+  public function initialize($options = array())
+  {
+    if (isset($options['cacheDir']))
+    {
+      $this->setCacheDir($options['cacheDir']);
+      unset($options['cacheDir']);
+    }
+
+    $availableOptions = array('fileLocking', 'writeControl', 'readControl', 'fileNameProtection', 'automaticCleaningFactor', 'hashedDirectoryLevel', 'lifeTime');
+    foreach ($options as $key => $value)
+    {
+      if (!in_array($key, $availableOptions))
+      {
+        sfLogger::getInstance()->error(sprintf('sfFileCache cannot take "%s" as an option', $key));
+      }
+
+      $this->$key = $value;
+    }
+  }
+
+  /**
+   * Sets the suffix for cache files.
+   *
+   * @param string The suffix name (with the leading .)
+   */
+  public function setSuffix($suffix)
+  {
+    $this->suffix = $suffix;
+  }
+
+ /**
+  * Enables / disables write control.
+  *
+  * @param boolean
+  */
+  public function setWriteControl($boolean)
+  {
+    $this->writeControl = $boolean;
+  }
+
+  /**
+   * Gets the value of the writeControl option.
+   *
+   * @return boolean
+   */
+  public function getWriteControl()
+  {
+    return $this->writeControl;
+  }
+
+ /**
+  * Enables / disables file locking.
+  *
+  * @param boolean
+  */
+  public function setFileLocking($boolean)
+  {
+    $this->fileLocking = $boolean;
+  }
+
+  /**
+   * Gets the value of the fileLocking option.
+   *
+   * @return boolean
+   */
+  public function getFileLocking()
+  {
+    return $this->fileLocking;
+  }
+
+  /**
+   * Sets the cache root directory.
+   *
+   * @param string The directory where to put the cache files
+   */
+  public function setCacheDir($cacheDir)
+  {
+    // remove last DIRECTORY_SEPARATOR
+    if (DIRECTORY_SEPARATOR == substr($cacheDir, -1))
+    {
+      $cacheDir = substr($cacheDir, 0, -1);
+    }
+
+    // create cache dir if needed
+    if (!is_dir($cacheDir))
+    {
+      $current_umask = umask(0000);
+      @mkdir($cacheDir, 0777, true);
+      umask($current_umask);
+    }
+
+     $this->cacheDir = $cacheDir;
+   }
+
+    public function getCacheDir()
+    {
+      return $this->cacheDir;
+    }
+
+ /**
+  * Tests if a cache is available and (if yes) returns it.
+  *
+  * @param  string  The cache id
+  * @param  string  The name of the cache namespace
+  * @param  boolean If set to true, the cache validity won't be tested
+  *
+  * @return string  Data of the cache (or null if no cache available)
+  *
+  * @see sfCache
+  */
+  public function get($id, $namespace = self::DEFAULT_NAMESPACE, $doNotTestCacheValidity = false)
+  {
+    $data = null;
+
+    list($path, $file) = $this->getFileName($id, $namespace);
+
+    if ($doNotTestCacheValidity)
+    {
+      if (file_exists($path.$file))
+      {
+        $data = $this->read($path, $file);
+      }
+    }
+    else
+    {
+      if ((file_exists($path.$file)) && (@filemtime($path.$file) > $this->refreshTime))
+      {
+        $data = $this->read($path, $file);
+      }
+    }
+
+    return $data ? $data : null;
+  }
+
+  /**
+   * Returns true if there is a cache for the given id and namespace.
+   *
+   * @param  string  The cache id
+   * @param  string  The name of the cache namespace
+   * @param  boolean If set to true, the cache validity won't be tested
+   *
+   * @return boolean true if the cache exists, false otherwise
+   *
+   * @see sfCache
+   */
+  public function has($id, $namespace = self::DEFAULT_NAMESPACE, $doNotTestCacheValidity = false)
+  {
+    list($path, $file) = $this->getFileName($id, $namespace);
+
+    if ($doNotTestCacheValidity)
+    {
+      if (file_exists($path.$file))
+      {
+        return true;
+      }
+    }
+    else
+    {
+      if ((file_exists($path.$file)) && (@filemtime($path.$file) > $this->refreshTime))
+      {
+        return true;
+      }
+    }
+
+    return false;
+  }
+  
+ /**
+  * Saves some data in a cache file.
+  *
+  * @param string The cache id
+  * @param string The name of the cache namespace
+  * @param string The data to put in cache
+  *
+  * @return boolean true if no problem
+  *
+  * @see sfCache
+  */
+  public function set($id, $namespace = self::DEFAULT_NAMESPACE, $data)
+  {
+    list($path, $file) = $this->getFileName($id, $namespace);
+
+    if ($this->automaticCleaningFactor > 0)
+    {
+      $rand = rand(1, $this->automaticCleaningFactor);
+      if ($rand == 1)
+      {
+        $this->clean(false, 'old');
+      }
+    }
+
+    if ($this->writeControl)
+    {
+      return $this->writeAndControl($path, $file, $data);
+    }
+    else
+    {
+      return $this->write($path, $file, $data);
+    }
+  }
+
+ /**
+  * Removes a cache file.
+  *
+  * @param string The cache id
+  * @param string The name of the cache namespace
+  *
+  * @return boolean true if no problem
+  */
+  public function remove($id, $namespace = self::DEFAULT_NAMESPACE)
+  {
+    list($path, $file) = $this->getFileName($id, $namespace);
+
+    return $this->unlink($path.$file);
+  }
+
+ /**
+  * Cleans the cache.
+  *
+  * If no namespace is specified all cache files will be destroyed
+  * else only cache files of the specified namespace will be destroyed.
+  *
+  * @param string The name of the cache namespace
+  *
+  * @return boolean true if no problem
+  */
+  public function clean($namespace = null, $mode = 'all')
+  {
+    $namespace = str_replace('/', DIRECTORY_SEPARATOR, $namespace);
+
+    return $this->cleanDir($this->cacheDir.DIRECTORY_SEPARATOR.$namespace, $mode);
+  }
+
+  /**
+   * Returns the cache last modification time.
+   *
+   * @return int The last modification time
+   */
+  public function lastModified($id, $namespace = self::DEFAULT_NAMESPACE)
+  {
+    list($path, $file) = $this->getFileName($id, $namespace);
+
+    return (file_exists($path.$file) ? filemtime($path.$file) : 0);
+  }
+
+ /**
+  * Makes a file name (with path).
+  *
+  * @param string The cache id
+  * @param string The name of the namespace
+  *
+  * @return array An array containing the path and the file name
+  */
+  protected function getFileName($id, $namespace)
+  {
+    $file = ($this->fileNameProtection) ? md5($id).$this->suffix : $id.$this->suffix;
+
+    if ($namespace)
+    {
+      $namespace = str_replace('/', DIRECTORY_SEPARATOR, $namespace);
+      $path = $this->cacheDir.DIRECTORY_SEPARATOR.$namespace.DIRECTORY_SEPARATOR;
+    }
+    else
+    {
+      $path = $this->cacheDir.DIRECTORY_SEPARATOR;
+    }
+    if ($this->hashedDirectoryLevel > 0)
+    {
+      $hash = md5($file);
+      for ($i = 0; $i < $this->hashedDirectoryLevel; $i++)
+      {
+        $path = $path.substr($hash, 0, $i + 1).DIRECTORY_SEPARATOR;
+      }
+    }
+
+    return array($path, $file);
+  }
+
+ /**
+  * Removes a file.
+  *
+  * @param string The complete file path and name
+  *
+  * @return boolean true if no problem
+  */
+  protected function unlink($file)
+  {
+    return @unlink($file) ? true : false;
+  }
+
+ /**
+  * Recursive function for cleaning cache file in the given directory.
+  *
+  * @param  string  The directory complete path
+  * @param  string  The name of the cache namespace
+  * @param  string  The flush cache mode : 'old', 'all'
+  *
+  * @return boolean true if no problem
+  *
+  * @throws sfCacheException
+  */
+  protected function cleanDir($dir, $mode)
+  {
+    if (!($dh = opendir($dir)))
+    {
+      throw new sfCacheException('Unable to open cache directory "'.$dir.'"');
+    }
+
+    $result = true;
+    while ($file = readdir($dh))
+    {
+      if (($file != '.') && ($file != '..'))
+      {
+        $file2 = $dir.DIRECTORY_SEPARATOR.$file;
+        if (is_file($file2))
+        {
+          $unlink = 1;
+          if ($mode == 'old')
+          {
+            // files older than lifeTime get deleted from cache
+            if ((time() - filemtime($file2)) < $this->lifeTime)
+            {
+              $unlink = 0;
+            }
+          }
+
+          if ($unlink)
+          {
+            $result = ($result and ($this->unlink($file2)));
+          }
+        }
+        else if (is_dir($file2))
+        {
+          $result = ($result and ($this->cleanDir($file2.DIRECTORY_SEPARATOR, $mode)));
+        }
+      }
+    }
+
+    return $result;
+  }
+
+ /**
+  * Reads the cache file and returns the content.
+  *
+  * @param string The file path
+  * @param string The file name
+  *
+  * @return string The content of the cache file.
+  *
+  * @throws sfCacheException
+  */
+  protected function read($path, $file)
+  {
+    $fp = @fopen($path.$file, "rb");
+    if ($this->fileLocking)
+    {
+      @flock($fp, LOCK_SH);
+    }
+
+    if ($fp)
+    {
+      clearstatcache(); // because the filesize can be cached by PHP itself...
+      $length = @filesize($path.$file);
+      $mqr = get_magic_quotes_runtime();
+      set_magic_quotes_runtime(0);
+      if ($this->readControl)
+      {
+        $hashControl = @fread($fp, 32);
+        $length = $length - 32;
+      } 
+      $data = ($length) ? @fread($fp, $length) : '';
+      set_magic_quotes_runtime($mqr);
+      if ($this->fileLocking)
+      {
+        @flock($fp, LOCK_UN);
+      }
+      @fclose($fp);
+      if ($this->readControl)
+      {
+        $hashData = $this->hash($data);
+        if ($hashData != $hashControl)
+        {
+          @touch($path.$file, time() - 2 * abs($this->lifeTime));
+          return false;
+        }
+      }
+
+      return $data;
+    }
+
+    throw new sfCacheException('Unable to read cache file "'.$path.$file.'"');
+  }
+
+ /**
+  * Writes the given data in the cache file.
+  *
+  * @param string The file path
+  * @param string The file name
+  * @param string The data to put in cache
+  *
+  * @return boolean true if ok
+  *
+  * @throws sfCacheException
+  */
+  protected function write($path, $file, $data)
+  {
+    $try = 1;
+    while ($try <= 2)
+    {
+      $fp = @fopen($path.$file, 'wb');
+      if ($fp)
+      {
+        if ($this->fileLocking)
+        {
+          @flock($fp, LOCK_EX);
+        }
+        if ($this->readControl)
+        {
+          @fwrite($fp, $this->hash($data), 32);
+        }
+        @fwrite($fp, $data);
+        if ($this->fileLocking)
+        {
+          @flock($fp, LOCK_UN);
+        }
+        @fclose($fp);
+
+        // change file mode
+        $current_umask = umask();
+        umask(0000);
+        chmod($path.$file, 0666);
+        umask($current_umask);
+
+        return true;
+      }
+      else
+      {
+        if ($try == 1 && !is_dir($path))
+        {
+          // create directory structure if needed
+          $current_umask = umask(0000);
+          mkdir($path, 0777, true);
+          umask($current_umask);
+
+          $try = 2;
+        }
+        else
+        {
+          $try = 999;
+        }
+      }
+    }
+
+    throw new sfCacheException('Unable to write cache file "'.$path.$file.'"');
+  }
+  
+ /**
+  * Writes the given data in the cache file and controls it just after to avoid corrupted cache entries.
+  *
+  * @param string The file path
+  * @param string The file name
+  * @param string The data to put in cache
+  *
+  * @return boolean true if the test is ok
+  */
+  protected function writeAndControl($path, $file, $data)
+  {
+    $this->write($path, $file, $data);
+    $dataRead = $this->read($path, $file);
+
+    return ($dataRead == $data);
+  }
+  
+ /**
+  * Makes a control key with the string containing datas.
+  *
+  * @param string $data data
+  *
+  * @return string control key
+  */
+  protected function hash($data)
+  {
+    return sprintf('% 32d', crc32($data));
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfFileCache.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfFunctionCache.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfFunctionCache.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfFunctionCache.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,102 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * This class can be used to cache the result and output of functions/methods.
+ *
+ * This class is based on the PEAR_Cache_Lite class.
+ * All cache files are stored in files in the [sf_root_dir].'/cache/'.[sf_app].'/function' directory.
+ * To disable all caching, you can set to false [sf_cache] constant.
+ *
+ * @package    symfony
+ * @subpackage cache
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Fabien Marty <fab en php.net>
+ * @version    SVN: $Id: sfFunctionCache.class.php 3452 2007-02-14 15:03:08Z francois $
+ */
+class sfFunctionCache extends sfFileCache
+{
+  /**
+   * Calls a cacheable function or method (or not if there is already a cache for it).
+   *
+   * Arguments of this method are read with func_get_args. So it doesn't appear in the function definition. Synopsis : 
+   * call('functionName', $arg1, $arg2, ...)
+   * (arg1, arg2... are arguments of 'functionName')
+   *
+   * @return mixed The result of the function/method
+   */
+  public function call()
+  {
+    $arguments = func_get_args();
+
+    // Generate a cache id
+    $id = md5(serialize($arguments));
+
+    $data = $this->get($id);
+    if ($data !== null)
+    {
+      $array = unserialize($data);
+      $output = $array['output'];
+      $result = $array['result'];
+    }
+    else
+    {
+      $target = array_shift($arguments);
+      ob_start();
+      ob_implicit_flush(false);
+      if (is_string($target) && strstr($target, '::'))
+      {
+        // classname::staticMethod
+        list($class, $method) = explode('::', $target);
+        try
+        {
+          $result = call_user_func_array(array($class, $method), $arguments);
+        }
+        catch (Exception $e)
+        {
+          ob_end_clean();
+          throw $e;
+        }
+      }
+      else if (is_string($target) && strstr($target, '->'))
+      {
+        // object->method
+        // use a stupid name ($objet_123456789 because) of problems when the object
+        // name is the same as this var name
+        list($object_123456789, $method) = explode('->', $target);
+        global $$object_123456789;
+        try
+        {
+          $result = call_user_func_array(array($$object_123456789, $method), $arguments);
+        }
+        catch (Exception $e)
+        {
+          ob_end_clean();
+          throw $e;
+        }
+      }
+      else
+      {
+        // function
+        $result = call_user_func_array($target, $arguments);
+      }
+      $output = ob_get_contents();
+      ob_end_clean();
+
+      $array['output'] = $output;
+      $array['result'] = $result;
+
+      $this->set($id, '', serialize($array));
+    }
+
+    echo($output);
+    return $result;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfFunctionCache.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfProcessCache.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfProcessCache.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfProcessCache.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,171 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfProcessCache stores content in memory if you run a PHP accelerator.
+ *
+ * Current PHP accelerator supported: APC, XCache and Eaccelerator.
+ *
+ * @package    symfony
+ * @subpackage cache
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id$
+ */
+class sfProcessCache
+{
+  /**
+   * Gets the cache engine name or false if no PHP accelerator is enabled.
+   *
+   * @return string The cache engine name
+   */
+  public static function cacher()
+  {
+    static $cacher = null;
+
+    if (null === $cacher)
+    {
+      if (!sfConfig::get('sf_use_process_cache'))
+      {
+        $cacher = false;
+      }
+      elseif (function_exists('apc_store'))
+      {
+        $cacher = 'apc';
+      }
+      elseif (function_exists('xcache_set'))
+      {
+        $cacher = 'xcache';
+      }
+      elseif (function_exists('ecacher_put'))
+      {
+        $cacher = 'eaccelerator';
+      }
+      else
+      {
+        $cacher = false;
+      }
+    }
+
+    return $cacher;
+  }
+
+  /**
+   * Gets the prefix to use for all key name.
+   *
+   * @return string The prefix string
+   */
+  public static function getPrefix()
+  {
+    static $prefix = null;
+
+    if (!$prefix)
+    {
+      $prefix = md5(sfConfig::get('sf_app_dir')).'_';
+    }
+
+    return $prefix;
+  }
+
+  /**
+   * Sets a value in the cache for the specified key.
+   *
+   * @param string The key name
+   * @param string The content to put in cache
+   * @param int The life time to keep the content in the cache
+   *
+   * @return boolean true if ok
+   */
+  public static function set($key, $value, $lifeTime = 0)
+  {
+    switch (self::cacher())
+    {
+      case 'apc':
+        return apc_store(self::getPrefix().$key, $value, $lifeTime);
+      case 'xcache':
+        return xcache_set(self::getPrefix().$key, $value, $lifeTime);
+      case 'eaccelerator':
+        return eaccelerator_put(self::getPrefix().$key, serialize($value), $lifeTime);
+    }
+
+    return false;
+  }
+
+  /**
+   * Gets a value in the cache for the specified key.
+   *
+   * @param string The key name
+   *
+   * @return mixed The content associated with the key or null if the key does not exist
+   */
+  public static function get($key)
+  {
+    switch (self::cacher())
+    {
+      case 'apc':
+        $value = apc_fetch(self::getPrefix().$key);
+        return false === $value ? null : $value;
+      case 'xcache':
+        return xcache_isset(self::getPrefix().$key) ? xcache_get(self::getPrefix().$key) : null;
+      case 'eaccelerator':
+        return unserialize(eaccelerator_get(self::getPrefix().$key));
+    }
+
+    return null;
+  }
+
+  /**
+   * Returns true if a given key exists in the cache, false otherwise.
+   *
+   * @param string The key name
+   *
+   * @return boolean true if the key exists, false otherwise
+   */
+  public static function has($key)
+  {
+    switch (self::cacher())
+    {
+      case 'apc':
+        return false === apc_fetch(self::getPrefix().$key) ? false : true;
+      case 'xcache':
+        return xcache_isset(self::getPrefix().$key);
+      case 'eaccelerator':
+        return null === eaccelerator_get(self::getPrefix().$key) ? false : true;
+    }
+
+    return false;
+  }
+
+  /**
+   * Clears the cache.
+   *
+   * @return boolean true if ok, false otherwise
+   */
+  public static function clear()
+  {
+    switch (self::cacher())
+    {
+      case 'apc':
+        return apc_clear_cache('user');
+      case 'xcache':
+        for ($i = 0, $max = xcache_count(XC_TYPE_VAR); $i < $max; $i++)
+        {
+          if (!xcache_clear_cache(XC_TYPE_VAR, $i))
+          {
+            return false;
+          }
+        }
+        return true;
+      case 'eaccelerator':
+        eaccelerator_clean();
+    }
+
+    return false;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfProcessCache.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfSQLiteCache.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfSQLiteCache.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfSQLiteCache.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,317 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Cache class that stores content in a sqlite database.
+ *
+ * @package    symfony
+ * @subpackage cache
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfSQLiteCache.class.php 3198 2007-01-08 20:36:20Z fabien $
+ */
+class sfSQLiteCache extends sfCache
+{
+  const DEFAULT_NAMESPACE = '';
+
+  protected $conn = null;
+
+ /**
+  * File where to put the cache database (or :memory: to store cache in memory)
+  */
+  protected $database = '';
+
+ /**
+  * Disable / Tune the automatic cleaning process
+  *
+  * The automatic cleaning process destroy too old (for the given life time)
+  * cache files when a new cache file is written.
+  * 0               => no automatic cache cleaning
+  * 1               => systematic cache cleaning
+  * x (integer) > 1 => automatic cleaning randomly 1 times on x cache write
+  */
+  protected $automaticCleaningFactor = 500;
+
+ /**
+  * Constructor.
+  *
+  * @param string The database name
+  */
+  public function __construct($database = null)
+  {
+    if (!extension_loaded('sqlite'))
+    {
+      throw new sfConfigurationException('sfSQLiteCache class needs "sqlite" extension');
+    }
+
+    $this->setDatabase($database);
+  }
+
+ /**
+   * Initializes the cache.
+   *
+   * @param array An array of options
+   * Available options:
+   *  - database:                database name
+   *  - automaticCleaningFactor: disable / tune automatic cleaning process (int)
+   *
+   */
+  public function initialize($options = array())
+  {
+    if (isset($options['database']))
+    {
+      $this->setDatabase($options['database']);
+      unset($options['database']);
+    }
+
+    $availableOptions = array('automaticCleaningFactor');
+    foreach ($options as $key => $value)
+    {
+      if (!in_array($key, $availableOptions))
+      {
+        sfLogger::getInstance()->error(sprintf('sfSQLiteCache cannot take "%s" as an option', $key));
+      }
+
+      $this->$key = $value;
+    }
+  }
+
+ /**
+   * Sets the database name.
+   *
+   * @param string The database name where to store the cache
+   */
+  public function setDatabase($database)
+  {
+    if (!$database)
+    {
+      return;
+    }
+
+    $this->database = $database;
+
+    $new = false;
+    if (':memory:' == $database)
+    {
+      $new = true;
+    }
+    elseif (!is_file($database))
+    {
+      $new = true;
+
+      // create cache dir if needed
+      $dir = dirname($database);
+      $current_umask = umask(0000);
+      if (!is_dir($dir))
+      {
+        @mkdir($dir, 0777, true);
+      }
+
+      touch($database);
+      umask($current_umask);
+    }
+
+    if (!($this->conn = @sqlite_open($this->database, 0644, $errmsg)))
+    {
+      throw new sfException(sprintf("Unable to connect to SQLite database: %s", $errmsg));
+    }
+
+    if ($new)
+    {
+      $this->createSchema();
+    }
+  }
+
+ /**
+   * Creates the database schema.
+   *
+   * @throws sfException
+   */
+  protected function createSchema()
+  {
+    $statements = array(
+      "CREATE TABLE [cache] (
+        [id] VARCHAR(255),
+        [namespace] VARCHAR(255),
+        [data] LONGVARCHAR,
+        [created_at] TIMESTAMP
+      )",
+      "CREATE INDEX [cache_unique] ON [cache] ([namespace], [id])",
+    );
+
+    foreach ($statements as $statement)
+    {
+      if (!sqlite_query($statement, $this->conn))
+      {
+        throw new sfException(sqlite_error_string(sqlite_last_error($this->database)));
+      }
+    }
+  }
+
+ /**
+   * Destructor.
+   */
+  public function __destruct()
+  {
+    sqlite_close($this->conn);
+  }
+
+ /**
+   * Gets the database name.
+   *
+   * @return string The database name
+   */
+  public function getDatabase()
+  {
+    return $this->database;
+  }
+
+ /**
+  * Tests if a cache is available and (if yes) returns it.
+  *
+  * @param  string  The cache id
+  * @param  string  The name of the cache namespace
+  * @param  boolean If set to true, the cache validity won't be tested
+  *
+  * @return string  The data in the cache (or null if no cache available)
+  *
+  * @see sfCache
+  */
+  public function get($id, $namespace = self::DEFAULT_NAMESPACE, $doNotTestCacheValidity = false)
+  {
+    $statement = sprintf("SELECT data FROM cache WHERE id = '%s' AND namespace = '%s'", sqlite_escape_string($id), sqlite_escape_string($namespace));
+    if (!$doNotTestCacheValidity)
+    {
+      $statement .= sprintf(" AND created_at > '%s'", sqlite_escape_string($this->refreshTime));
+    }
+
+    $rs = sqlite_query($statement, $this->conn);
+
+    return sqlite_num_rows($rs) ? sqlite_fetch_single($rs) : null;
+  }
+
+  /**
+   * Returns true if there is a cache for the given id and namespace.
+   *
+   * @param  string  The cache id
+   * @param  string  The name of the cache namespace
+   * @param  boolean If set to true, the cache validity won't be tested
+   *
+   * @return boolean true if the cache exists, false otherwise
+   *
+   * @see sfCache
+   */
+  public function has($id, $namespace = self::DEFAULT_NAMESPACE, $doNotTestCacheValidity = false)
+  {
+    $statement = sprintf("SELECT id FROM cache WHERE id = '%s' AND namespace = '%s'", sqlite_escape_string($id), sqlite_escape_string($namespace));
+    if (!$doNotTestCacheValidity)
+    {
+      $statement .= sprintf(" AND created_at > '%s'", sqlite_escape_string($this->refreshTime));
+    }
+
+    return sqlite_num_rows(sqlite_query($statement, $this->conn)) ? true : false;
+  }
+  
+ /**
+  * Saves some data in the cache.
+  *
+  * @param string The cache id
+  * @param string The name of the cache namespace
+  * @param string The data to put in cache
+  *
+  * @return boolean true if no problem
+  *
+  * @see sfCache
+  */
+  public function set($id, $namespace = self::DEFAULT_NAMESPACE, $data)
+  {
+    if ($this->automaticCleaningFactor > 0)
+    {
+      $rand = rand(1, $this->automaticCleaningFactor);
+      if ($rand == 1)
+      {
+        $this->clean(false, 'old');
+      }
+    }
+
+    if (!$this->has($id, $namespace))
+    {
+      $statement = sprintf("INSERT INTO cache (id, namespace, data, created_at) VALUES ('%s', '%s', '%s', %d)", sqlite_escape_string($id), sqlite_escape_string($namespace), sqlite_escape_string($data), time());
+    }
+    else
+    {
+      $statement = sprintf("UPDATE cache SET data = '%s', created_at = %s WHERE id = '%s' AND namespace = '%s'", sqlite_escape_string($data), time(), sqlite_escape_string($id), sqlite_escape_string($namespace));
+    }
+
+    if (sqlite_query($statement, $this->conn))
+    {
+      return true;
+    }
+
+    return false;
+  }
+
+ /**
+  * Removes an element from the cache.
+  *
+  * @param string The cache id
+  * @param string The name of the cache namespace
+  *
+  * @return boolean true if no problem
+  *
+  * @see sfCache
+  */
+  public function remove($id, $namespace = self::DEFAULT_NAMESPACE)
+  {
+    $statement = sprintf("DELETE FROM cache WHERE id = '%s' AND namespace = '%s'", sqlite_escape_string($id), sqlite_escape_string($namespace));
+    if (sqlite_query($statement, $this->conn))
+    {
+      return true;
+    }
+
+    return false;
+  }
+
+ /**
+  * Cleans the cache.
+  *
+  * If no namespace is specified all cache files will be destroyed
+  * else only cache files of the specified namespace will be destroyed.
+  *
+  * @param string The name of the cache namespace
+  *
+  * @return boolean true if no problem
+  */
+  public function clean($namespace = null, $mode = 'all')
+  {
+    if (!$namespace)
+    {
+      $statement = "DELETE FROM cache";
+    }
+    else
+    {
+      $statement = sprintf("DELETE FROM cache WHERE namespace LIKE '%s%%'", $namespace);
+    }
+
+    if ('old' == $mode)
+    {
+      $statement .= sprintf(" %s created_at < '%s'", $namespace ? 'AND' : 'WHERE', sqlite_escape_string($this->refreshTime));
+    }
+
+    return sqlite_num_rows(sqlite_query($statement, $this->conn)) ? true : false;
+  }
+
+  public function lastModified($id, $namespace = self::DEFAULT_NAMESPACE)
+  {
+    $statement = sprintf("SELECT created_at FROM cache WHERE id = '%s' AND namespace = '%s'", sqlite_escape_string($id), sqlite_escape_string($namespace));
+    $rs = sqlite_query($statement, $this->conn);
+
+    return sqlite_num_rows($rs) ? intval(sqlite_fetch_single($rs)) : 0;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/cache/sfSQLiteCache.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfAutoloadConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfAutoloadConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfAutoloadConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,130 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfAutoloadConfigHandler.class.php 3256 2007-01-13 08:39:10Z fabien $
+ */
+class sfAutoloadConfigHandler extends sfYamlConfigHandler
+{
+  /**
+   * Executes this configuration handler.
+   *
+   * @param array An array of absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   *
+   * @throws sfConfigurationException If a requested configuration file does not exist or is not readable
+   * @throws sfParseException If a requested configuration file is improperly formatted
+   */
+  public function execute($configFiles)
+  {
+    // set our required categories list and initialize our handler
+    $categories = array('required_categories' => array('autoload'));
+
+    $this->initialize($categories);
+
+    // parse the yaml
+    $myConfig = $this->parseYamls($configFiles);
+
+    // init our data array
+    $data = array();
+
+    // let's do our fancy work
+    foreach ($myConfig['autoload'] as $name => $entry)
+    {
+      if (isset($entry['name']))
+      {
+        $data[] = sprintf("\n// %s", $entry['name']);
+      }
+
+      // file mapping or directory mapping?
+      if (isset($entry['files']))
+      {
+        // file mapping
+        foreach ($entry['files'] as $class => $path)
+        {
+          $path   = $this->replaceConstants($path);
+
+          $data[] = sprintf("'%s' => '%s',", $class, $path);
+        }
+      }
+      else
+      {
+        // directory mapping
+        $ext  = isset($entry['ext']) ? $entry['ext'] : '.php';
+        $path = $entry['path'];
+
+        $path = $this->replaceConstants($path);
+        $path = $this->replacePath($path);
+
+        // we automatically add our php classes
+        require_once(sfConfig::get('sf_symfony_lib_dir').'/util/sfFinder.class.php');
+        $finder = sfFinder::type('file')->ignore_version_control()->name('*'.$ext);
+
+        // recursive mapping?
+        $recursive = ((isset($entry['recursive'])) ? $entry['recursive'] : false);
+        if (!$recursive)
+        {
+          $finder->maxdepth(1);
+        }
+
+        // exclude files or directories?
+        if (isset($entry['exclude']) && is_array($entry['exclude']))
+        {
+          $finder->prune($entry['exclude'])->discard($entry['exclude']);
+        }
+
+        if ($matches = glob($path))
+        {
+          $files = $finder->in($matches);
+        }
+        else
+        {
+          $files = array();
+        }
+
+        $regex = '~^\s*(?:abstract\s+|final\s+)?(?:class|interface)\s+(\w+)~mi';
+        foreach ($files as $file)
+        {
+          preg_match_all($regex, file_get_contents($file), $classes);
+          foreach ($classes[1] as $class)
+          {
+            $prefix = '';
+            if (isset($entry['prefix']))
+            {
+              // FIXME: does not work for plugins installed with a symlink
+              preg_match('~^'.str_replace('\*', '(.+?)', preg_quote(str_replace('/', DIRECTORY_SEPARATOR, $path), '~')).'~', $file, $match);
+              if (isset($match[$entry['prefix']]))
+              {
+                $prefix = $match[$entry['prefix']].'/';
+              }
+            }
+
+            $data[] = sprintf("'%s%s' => '%s',", $prefix, $class, $file);
+          }
+        }
+      }
+    }
+
+    // compile data
+    $retval = sprintf("<?php\n".
+                      "// auto-generated by sfAutoloadConfigHandler\n".
+                      "// date: %s\nreturn array(\n%s\n);\n",
+                      date('Y/m/d H:i:s'), implode("\n", $data));
+
+    return $retval;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfAutoloadConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfCacheConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfCacheConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfCacheConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,119 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfCacheConfigHandler allows you to configure cache.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfCacheConfigHandler.class.php 3203 2007-01-09 18:32:54Z fabien $
+ */
+class sfCacheConfigHandler extends sfYamlConfigHandler
+{
+  protected
+    $cacheConfig = array();
+
+  /**
+   * Executes this configuration handler.
+   *
+   * @param array An array of absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   *
+   * @throws <b>sfConfigurationException</b> If a requested configuration file does not exist or is not readable
+   * @throws <b>sfParseException</b> If a requested configuration file is improperly formatted
+   * @throws <b>sfInitializationException</b> If a cache.yml key check fails
+   */
+  public function execute($configFiles)
+  {
+    // set our required categories list and initialize our handler
+    $categories = array('required_categories' => array());
+    $this->initialize($categories);
+
+    // parse the yaml
+    $myConfig = $this->parseYamls($configFiles);
+
+    $myConfig['all'] = sfToolkit::arrayDeepMerge(
+      isset($myConfig['default']) && is_array($myConfig['default']) ? $myConfig['default'] : array(),
+      isset($myConfig['all']) && is_array($myConfig['all']) ? $myConfig['all'] : array()
+    );
+
+    unset($myConfig['default']);
+
+    $this->yamlConfig = $myConfig;
+
+    // iterate through all action names
+    $data  = array();
+    $first = true;
+    foreach ($this->yamlConfig as $actionName => $values)
+    {
+      if ($actionName == 'all')
+      {
+        continue;
+      }
+
+      $data[] = $this->addCache($actionName);
+
+      $first = false;
+    }
+
+    // general cache configuration
+    $data[] = $this->addCache('DEFAULT');
+
+    // compile data
+    $retval = sprintf("<?php\n".
+                      "// auto-generated by sfCacheConfigHandler\n".
+                      "// date: %s\n%s\n",
+                      date('Y/m/d H:i:s'), implode('', $data));
+
+    return $retval;
+  }
+
+  /**
+   * Returns a single addCache statement.
+   *
+   * @param string The action name
+   *
+   * @return string PHP code for the addCache statement
+   */
+  protected function addCache($actionName = '')
+  {
+    $data = array();
+
+    // enabled?
+    $enabled = $this->getConfigValue('enabled', $actionName);
+
+    // cache with or without loayout
+    $withLayout = $this->getConfigValue('with_layout', $actionName) ? 'true' : 'false';
+
+    // lifetime
+    $lifeTime = !$enabled ? '0' : $this->getConfigValue('lifetime', $actionName, '0');
+
+    // client_lifetime
+    $clientLifetime = !$enabled ? '0' : $this->getConfigValue('client_lifetime', $actionName, $lifeTime, '0');
+
+    // contextual
+    $contextual = $this->getConfigValue('contextual', $actionName) ? 'true' : 'false';
+
+    // vary
+    $vary = $this->getConfigValue('vary', $actionName, array());
+    if (!is_array($vary))
+    {
+      $vary = array($vary);
+    }
+
+    // add cache information to cache manager
+    $data[] = sprintf("\$this->addCache(\$moduleName, '%s', array('withLayout' => %s, 'lifeTime' => %s, 'clientLifeTime' => %s, 'contextual' => %s, 'vary' => %s));\n",
+                      $actionName, $withLayout, $lifeTime, $clientLifetime, $contextual, str_replace("\n", '', var_export($vary, true)));
+
+    return implode("\n", $data);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfCacheConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfCompileConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfCompileConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfCompileConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,113 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfCompileConfigHandler gathers multiple files and puts them into a single file.
+ * Upon creation of the new file, all comments and blank lines are removed.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfCompileConfigHandler.class.php 3203 2007-01-09 18:32:54Z fabien $
+ */
+class sfCompileConfigHandler extends sfYamlConfigHandler
+{
+  /**
+   * Executes this configuration handler.
+   *
+   * @param array An array of absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   *
+   * @throws sfConfigurationException If a requested configuration file does not exist or is not readable
+   * @throws sfParseException If a requested configuration file is improperly formatted
+   */
+  public function execute($configFiles)
+  {
+    // parse the yaml
+    $config = array();
+    foreach ($configFiles as $configFile)
+    {
+      $config = array_merge($config, $this->parseYaml($configFile));
+    }
+
+    // init our data
+    $data = '';
+
+    // let's do our fancy work
+    foreach ($config as $file)
+    {
+      $file = $this->replaceConstants($file);
+      $file = $this->replacePath($file);
+
+      if (!is_readable($file))
+      {
+        // file doesn't exist
+        $error = sprintf('Configuration file "%s" specifies nonexistent or unreadable file "%s"', $configFiles[0], $file);
+        throw new sfParseException($error);
+      }
+
+      $contents = file_get_contents($file);
+
+      // append file data
+      $data .= "\n".$contents;
+    }
+
+    // insert configuration files
+    $data = preg_replace_callback(array('#(require|include)(_once)?\((sfConfigCache::getInstance\(\)|\$configCache)->checkConfig\([^_]+sf_app_config_dir_name[^\.]*\.\'/([^\']+)\'\)\);#m',
+                                        '#()()(sfConfigCache::getInstance\(\)|\$configCache)->import\(.sf_app_config_dir_name\.\'/([^\']+)\'(, false)?\);#m'),
+                                  array($this, 'insertConfigFileCallback'), $data);
+
+    // strip comments (not in debug mode)
+    if (!sfConfig::get('sf_debug'))
+    {
+      $data = sfToolkit::stripComments($data);
+    }
+
+    // strip php tags
+    $data = sfToolkit::pregtr($data, array('/^\s*<\?(php)?/m' => '',
+                                           '/^\s*\?>/m'       => ''));
+
+    // replace windows and mac format with unix format
+    $data = str_replace("\r",  "\n", $data);
+
+    // replace multiple new lines with a single newline
+    $data = preg_replace(array('/\s+$/Sm', '/\n+/S'), "\n", $data);
+
+    // compile data
+    $retval = sprintf("<?php\n".
+                      "// auto-generated by sfCompileConfigHandler\n".
+                      "// date: %s\n%s\n",
+                      date('Y/m/d H:i:s'), $data);
+
+    // save current symfony release
+    file_put_contents(sfConfig::get('sf_config_cache_dir').'/VERSION', file_get_contents(sfConfig::get('sf_symfony_lib_dir').'/VERSION'));
+
+    return $retval;
+  }
+
+  /**
+   * Callback for configuration file insertion in the cache.
+   *
+   */
+  protected function insertConfigFileCallback($matches)
+  {
+    $configFile = sfConfig::get('sf_app_config_dir_name').'/'.$matches[4];
+
+    sfConfigCache::getInstance()->checkConfig($configFile);
+
+    $config = "// '$configFile' config file\n".
+              file_get_contents(sfConfigCache::getInstance()->getCacheName($configFile));
+
+    return $config;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfCompileConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfConfig.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfConfig.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfConfig.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,93 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfConfig stores all configuration information for a symfony application.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfConfig.class.php 3203 2007-01-09 18:32:54Z fabien $
+ */
+class sfConfig
+{
+  protected static
+    $config = array();
+
+  /**
+   * Retrieves a config parameter.
+   *
+   * @param string A config parameter name
+   * @param mixed  A default config parameter value
+   *
+   * @return mixed A config parameter value, if the config parameter exists, otherwise null
+   */
+  public static function get($name, $default = null)
+  {
+    return isset(self::$config[$name]) ? self::$config[$name] : $default;
+  }
+
+  /**
+   * Indicates whether or not a config parameter exists.
+   *
+   * @param string A config parameter name
+   *
+   * @return bool true, if the config parameter exists, otherwise false
+   */
+  public static function has($name)
+  {
+    return array_key_exists($name, self::$config);
+  }
+
+  /**
+   * Sets a config parameter.
+   *
+   * If a config parameter with the name already exists the value will be overridden.
+   *
+   * @param string A config parameter name
+   * @param mixed  A config parameter value
+   */
+  public static function set($name, $value)
+  {
+    self::$config[$name] = $value;
+  }
+
+  /**
+   * Sets an array of config parameters.
+   *
+   * If an existing config parameter name matches any of the keys in the supplied
+   * array, the associated value will be overridden.
+   *
+   * @param array An associative array of config parameters and their associated values
+   */
+  public static function add($parameters = array())
+  {
+    self::$config = array_merge(self::$config, $parameters);
+  }
+
+  /**
+   * Retrieves all configuration parameters.
+   *
+   * @return array An associative array of configuration parameters.
+   */
+  public static function getAll()
+  {
+    return self::$config;
+  }
+
+  /**
+   * Clears all current config parameters.
+   */
+  public static function clear()
+  {
+    self::$config = null;
+    self::$config = array();
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfConfig.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfConfigCache.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfConfigCache.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfConfigCache.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,342 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfConfigCache allows you to customize the format of a configuration file to
+ * make it easy-to-use, yet still provide a PHP formatted result for direct
+ * inclusion into your modules.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfConfigCache.class.php 3503 2007-02-18 19:08:26Z fabien $
+ */
+class sfConfigCache
+{
+  protected
+    $handlers = array();
+
+  protected static
+    $instance = null;
+
+  /**
+   * Retrieves the singleton instance of this class.
+   *
+   * @return sfConfigCache A sfConfigCache instance
+   */
+  public static function getInstance()
+  {
+    if (!self::$instance)
+    {
+      self::$instance = new sfConfigCache();
+    }
+
+    return self::$instance;
+  }
+
+  /**
+   * Loads a configuration handler.
+   *
+   * @param string The handler to use when parsing a configuration file
+   * @param array  An array of absolute filesystem paths to configuration files
+   * @param string An absolute filesystem path to the cache file that will be written
+   *
+   * @throws <b>sfConfigurationException</b> If a requested configuration file does not have an associated configuration handler
+   */
+  protected function callHandler($handler, $configs, $cache)
+  {
+    if (count($this->handlers) == 0)
+    {
+      // we need to load the handlers first
+      $this->loadConfigHandlers();
+    }
+
+    // handler to call for this configuration file
+    $handlerToCall = null;
+
+    $handler = str_replace(DIRECTORY_SEPARATOR, '/', $handler);
+
+    // grab the base name of the handler
+    $basename = basename($handler);
+    if (isset($this->handlers[$handler]))
+    {
+      // we have a handler associated with the full configuration path
+      $handlerToCall = $this->handlers[$handler];
+    }
+    else if (isset($this->handlers[$basename]))
+    {
+      // we have a handler associated with the configuration base name
+      $handlerToCall = $this->handlers[$basename];
+    }
+    else
+    {
+      // let's see if we have any wildcard handlers registered that match
+      // this basename
+      foreach ($this->handlers as $key => $handlerInstance)
+      {
+        // replace wildcard chars in the configuration
+        $pattern = strtr($key, array('.' => '\.', '*' => '.*?'));
+
+        // create pattern from config
+        if (preg_match('#'.$pattern.'#', $handler))
+        {
+          // we found a match!
+          $handlerToCall = $this->handlers[$key];
+
+          break;
+        }
+      }
+    }
+
+    if ($handlerToCall)
+    {
+      // call the handler and retrieve the cache data
+      $data = $handlerToCall->execute($configs);
+
+      $this->writeCacheFile($handler, $cache, $data);
+    }
+    else
+    {
+      // we do not have a registered handler for this file
+      $error = sprintf('Configuration file "%s" does not have a registered handler', implode(', ', $configs));
+
+      throw new sfConfigurationException($error);
+    }
+  }
+
+  /**
+   * Checks to see if a configuration file has been modified and if so
+   * recompile the cache file associated with it.
+   *
+   * The recompilation only occurs in a non debug environment.
+   *
+   * If the configuration file path is relative, symfony will look in directories 
+   * defined in the sfLoader::getConfigPaths() method.
+   *
+   * @param string A filesystem path to a configuration file
+   *
+   * @return string An absolute filesystem path to the cache filename associated with this specified configuration file
+   *
+   * @throws <b>sfConfigurationException</b> If a requested configuration file does not exist
+   *
+   * @see sfLoader::getConfigPaths()
+   */
+  public function checkConfig($configPath, $optional = false)
+  {
+    static $process_cache_cleared = false;
+
+    if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+    {
+      $timer = sfTimerManager::getTimer('Configuration');
+    }
+
+    // the cache filename we'll be using
+    $cache = $this->getCacheName($configPath);
+
+    if (sfConfig::get('sf_in_bootstrap') && is_readable($cache))
+    {
+      if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+      {
+        $timer->addTime();
+      }
+
+      return $cache;
+    }
+
+    if (!sfToolkit::isPathAbsolute($configPath))
+    {
+      $files = sfLoader::getConfigPaths($configPath);
+    }
+    else
+    {
+      $files = is_readable($configPath) ? array($configPath) : array();
+    }
+
+    if (!isset($files[0]))
+    {
+      if ($optional)
+      {
+        return null;
+      }
+
+      // configuration does not exist
+      $error = sprintf('Configuration "%s" does not exist or is unreadable', $configPath);
+
+      throw new sfConfigurationException($error);
+    }
+
+    // find the more recent configuration file last modification time
+    $mtime = 0;
+    foreach ($files as $file)
+    {
+      if (filemtime($file) > $mtime)
+      {
+        $mtime = filemtime($file);
+      }
+    }
+
+    if (!is_readable($cache) || $mtime > filemtime($cache))
+    {
+      // configuration has changed so we need to reparse it
+      $this->callHandler($configPath, $files, $cache);
+
+      // clear process cache
+      if ('config/config_handlers.yml' != $configPath && sfConfig::has('sf_use_process_cache') && !$process_cache_cleared)
+      {
+        sfProcessCache::clear();
+        $process_cache_cleared = true;
+      }
+    }
+
+    if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+    {
+      $timer->addTime();
+    }
+
+    return $cache;
+  }
+
+  /**
+   * Clears all configuration cache files.
+   */
+  public function clear()
+  {
+    sfToolkit::clearDirectory(sfConfig::get('sf_config_cache_dir'));
+  }
+
+  /**
+   * Converts a normal filename into a cache filename.
+   *
+   * @param string A normal filename
+   *
+   * @return string An absolute filesystem path to a cache filename
+   */
+  public function getCacheName($config)
+  {
+    if (strlen($config) > 3 && ctype_alpha($config[0]) && $config[1] == ':' && ($config[2] == '\\' || $config[2] == '/'))
+    {
+      // file is a windows absolute path, strip off the drive letter
+      $config = substr($config, 3);
+    }
+
+    // replace unfriendly filename characters with an underscore
+    $config  = str_replace(array('\\', '/', ' '), '_', $config);
+    $config .= '.php';
+
+    return sfConfig::get('sf_config_cache_dir').'/'.$config;
+  }
+
+  /**
+   * Imports a configuration file.
+   *
+   * @param string A filesystem path to a configuration file
+   * @param bool   Only allow this configuration file to be included once per request?
+   *
+   * @see checkConfig()
+   */
+  public function import($config, $once = true, $optional = false)
+  {
+    $cache = $this->checkConfig($config, $optional);
+
+    if ($optional && !$cache)
+    {
+      return;
+    }
+
+    // include cache file
+    if ($once)
+    {
+      include_once($cache);
+    }
+    else
+    {
+      include($cache);
+    }
+  }
+
+  /**
+   * Loads all configuration application and module level handlers.
+   *
+   * @throws <b>sfConfigurationException</b> If a configuration related error occurs.
+   */
+  protected function loadConfigHandlers()
+  {
+    // manually create our config_handlers.yml handler
+    $this->handlers['config_handlers.yml'] = new sfRootConfigHandler();
+    $this->handlers['config_handlers.yml']->initialize();
+
+    // application configuration handlers
+
+    require_once($this->checkConfig(sfConfig::get('sf_app_config_dir_name').'/config_handlers.yml'));
+
+    // module level configuration handlers
+
+    // make sure our modules directory exists
+    if (is_readable($sf_app_module_dir = sfConfig::get('sf_app_module_dir')))
+    {
+      // ignore names
+      $ignore = array('.', '..', 'CVS', '.svn');
+
+      // create a file pointer to the module dir
+      $fp = opendir($sf_app_module_dir);
+
+      // loop through the directory and grab the modules
+      while (($directory = readdir($fp)) !== false)
+      {
+        if (!in_array($directory, $ignore))
+        {
+          $configPath = $sf_app_module_dir.'/'.$directory.'/'.sfConfig::get('sf_app_module_config_dir_name').'/config_handlers.yml';
+
+          if (is_readable($configPath))
+          {
+            // initialize the root configuration handler with this module name
+            $params = array('module_level' => true, 'module_name' => $directory);
+
+            $this->handlers['config_handlers.yml']->initialize($params);
+
+            // replace module dir path with a special keyword that
+            // checkConfig knows how to use
+            $configPath = sfConfig::get('sf_app_module_dir_name').'/'.$directory.'/'.sfConfig::get('sf_app_module_config_dir_name').'/config_handlers.yml';
+
+            require_once($this->checkConfig($configPath));
+          }
+        }
+      }
+
+      // close file pointer
+      fclose($fp);
+    }
+    else
+    {
+      // module directory doesn't exist or isn't readable
+      $error = sprintf('Module directory "%s" does not exist or is not readable',
+                       sfConfig::get('sf_app_module_dir'));
+      throw new sfConfigurationException($error);
+    }
+  }
+
+  /**
+   * Writes a cache file.
+   *
+   * @param string An absolute filesystem path to a configuration file
+   * @param string An absolute filesystem path to the cache file that will be written
+   * @param string Data to be written to the cache file
+   *
+   * @throws sfCacheException If the cache file cannot be written
+   */
+  protected function writeCacheFile($config, $cache, &$data)
+  {
+    $fileCache = new sfFileCache(dirname($cache));
+    $fileCache->setSuffix('');
+    $fileCache->set(basename($cache), '', $data);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfConfigCache.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,105 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfConfigHandler allows a developer to create a custom formatted configuration
+ * file pertaining to any information they like and still have it auto-generate
+ * PHP code.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfConfigHandler.class.php 3203 2007-01-09 18:32:54Z fabien $
+ */
+abstract class sfConfigHandler
+{
+  protected
+    $parameterHolder = null;
+
+  /**
+   * Executes this configuration handler
+   *
+   * @param array An array of filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   *
+   * @throws <b>sfConfigurationException</b> If a requested configuration file does not exist or is not readable
+   * @throws <b>sfParseException</b> If a requested configuration file is improperly formatted
+   */
+  abstract public function execute($configFiles);
+
+  /**
+   * Initializes this configuration handler.
+   *
+   * @param array An associative array of initialization parameters
+   *
+   * @return bool true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this ConfigHandler
+   */
+  public function initialize($parameters = null)
+  {
+    $this->parameterHolder = new sfParameterHolder();
+    $this->parameterHolder->add($parameters);
+  }
+
+  /**
+   * Replaces constant identifiers in a value.
+   *
+   * If the value is an array replacements are made recursively.
+   *
+   * @param mixed The value on which to run the replacement procedure
+   *
+   * @return string The new value
+   */
+  public static function replaceConstants($value)
+  {
+    if (is_array($value))
+    {
+      array_walk_recursive($value, create_function('&$value', '$value = sfToolkit::replaceConstants($value);'));
+    }
+    else
+    {
+      $value = sfToolkit::replaceConstants($value);
+    }
+
+    return $value;
+  }
+
+  /**
+   * Replaces a relative filesystem path with an absolute one.
+   *
+   * @param string A relative filesystem path
+   *
+   * @return string The new path
+   */
+  public static function replacePath($path)
+  {
+    if (!sfToolkit::isPathAbsolute($path))
+    {
+      // not an absolute path so we'll prepend to it
+      $path = sfConfig::get('sf_app_dir').'/'.$path;
+    }
+
+    return $path;
+  }
+
+  /**
+   * Gets the parameter holder for this configuration handler.
+   *
+   * @return sfParameterHolder A sfParameterHolder instance
+   */
+  public function getParameterHolder()
+  {
+    return $this->parameterHolder;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfDatabaseConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfDatabaseConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfDatabaseConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,120 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfDatabaseConfigHandler allows you to setup database connections in a
+ * configuration file that will be created for you automatically upon first
+ * request.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfDatabaseConfigHandler.class.php 3254 2007-01-13 07:52:26Z fabien $
+ */
+class sfDatabaseConfigHandler extends sfYamlConfigHandler
+{
+  /**
+   * Executes this configuration handler.
+   *
+   * @param array An array of absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   *
+   * @throws sfConfigurationException If a requested configuration file does not exist or is not readable
+   * @throws sfParseException If a requested configuration file is improperly formatted
+   */
+  public function execute($configFiles)
+  {
+    // parse the yaml
+    $myConfig = $this->parseYamls($configFiles);
+
+    $myConfig = sfToolkit::arrayDeepMerge(
+      isset($myConfig['default']) && is_array($myConfig['default']) ? $myConfig['default'] : array(),
+      isset($myConfig['all']) && is_array($myConfig['all']) ? $myConfig['all'] : array(),
+      isset($myConfig[sfConfig::get('sf_environment')]) && is_array($myConfig[sfConfig::get('sf_environment')]) ? $myConfig[sfConfig::get('sf_environment')] : array()
+    );
+
+    // init our data and includes arrays
+    $data      = array();
+    $databases = array();
+    $includes  = array();
+
+    // get a list of database connections
+    foreach ($myConfig as $key => $dbConfig)
+    {
+      // is this category already registered?
+      if (in_array($key, $databases))
+      {
+        // this category is already registered
+        $error = sprintf('Configuration file "%s" specifies previously registered category "%s"', $configFiles[0], $key);
+        throw new sfParseException($error);
+      }
+
+      // add this database
+      $databases[] = $key;
+
+      // let's do our fancy work
+      if (!isset($dbConfig['class']))
+      {
+        // missing class key
+        $error = sprintf('Configuration file "%s" specifies category "%s" with missing class key', $configFiles[0], $key);
+        throw new sfParseException($error);
+      }
+
+      if (isset($dbConfig['file']))
+      {
+        // we have a file to include
+        $file = $this->replaceConstants($dbConfig['file']);
+        $file = $this->replacePath($file);
+
+        if (!is_readable($file))
+        {
+          // database file doesn't exist
+          $error = sprintf('Configuration file "%s" specifies class "%s" with nonexistent or unreadable file "%s"', $configFiles[0], $dbConfig['class'], $file);
+          throw new sfParseException($error);
+        }
+
+        // append our data
+        $includes[] = sprintf("require_once('%s');", $file);
+      }
+
+      // parse parameters
+      if (isset($dbConfig['param']))
+      {
+        foreach ($dbConfig['param'] as &$value)
+        {
+          $value = $this->replaceConstants($value);
+        }
+
+        $parameters = var_export($dbConfig['param'], true);
+      }
+      else
+      {
+        $parameters = 'null';
+      }
+
+      // append new data
+      $data[] = sprintf("\n\$database = new %s();\n".
+                        "\$database->initialize(%s, '%s');\n".
+                        "\$this->databases['%s'] = \$database;",
+                        $dbConfig['class'], $parameters, $key, $key);
+    }
+
+    // compile data
+    $retval = sprintf("<?php\n".
+                      "// auto-generated by sfDatabaseConfigHandler\n".
+                      "// date: %s%s\n%s\n",
+                      date('Y/m/d H:i:s'), implode("\n", $includes), implode("\n", $data));
+
+    return $retval;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfDatabaseConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfDefineEnvironmentConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfDefineEnvironmentConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfDefineEnvironmentConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,159 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfDefineEnvironmentConfigHandler.class.php 3254 2007-01-13 07:52:26Z fabien $
+ */
+class sfDefineEnvironmentConfigHandler extends sfYamlConfigHandler
+{
+  /**
+   * Executes this configuration handler.
+   *
+   * @param  string An absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   *
+   * @throws sfConfigurationException If a requested configuration file does not exist or is not readable
+   * @throws sfParseException If a requested configuration file is improperly formatted
+   */
+  public function execute($configFiles)
+  {
+    // get our prefix
+    $prefix = strtolower($this->getParameterHolder()->get('prefix', ''));
+
+    // add dynamic prefix if needed
+    if ($this->getParameterHolder()->get('module', false))
+    {
+      $prefix .= "'.strtolower(\$moduleName).'_";
+    }
+
+    // parse the yaml
+    $myConfig = $this->mergeEnvironment($this->parseYamls($configFiles));
+
+    $values = array();
+    foreach ($myConfig as $category => $keys)
+    {
+      $values = array_merge($values, $this->getValues($prefix, $category, $keys));
+    }
+
+    $data = '';
+    foreach ($values as $key => $value)
+    {
+      $data .= sprintf("  '%s' => %s,\n", $key, var_export($value, true));
+    }
+
+    // compile data
+    $retval = '';
+    if ($values)
+    {
+      $retval = "<?php\n".
+                "// auto-generated by sfDefineEnvironmentConfigHandler\n".
+                "// date: %s\nsfConfig::add(array(\n%s));\n";
+      $retval = sprintf($retval, date('Y/m/d H:i:s'), $data);
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Gets values from the configuration array.
+   *
+   * @param string The prefix name
+   * @param string The category name
+   * @param mixed  The key/value array
+   *
+   * @param array The new key/value array
+   */
+  protected function getValues($prefix, $category, $keys)
+  {
+    if (!is_array($keys))
+    {
+      list($key, $value) = $this->fixCategoryValue($prefix.strtolower($category), '', $keys);
+
+      return array($key => $value);
+    }
+
+    $values = array();
+
+    $category = $this->fixCategoryName($category, $prefix);
+
+    // loop through all key/value pairs
+    foreach ($keys as $key => $value)
+    {
+      list($key, $value) = $this->fixCategoryValue($category, $key, $value);
+      $values[$key] = $value;
+    }
+
+    return $values;
+  }
+
+  /**
+   * Fixes the category name and replaces constants in the value.
+   *
+   * @param string The category name
+   * @param string The key name
+   * @param string The value
+   *
+   * @param string Return the new key and value
+   */
+  protected function fixCategoryValue($category, $key, $value)
+  {
+    // prefix the key
+    $key = $category.$key;
+
+    // replace constant values
+    $value = $this->replaceConstants($value);
+
+    return array($key, $value);
+  }
+
+  /**
+   * Fixes the category name.
+   *
+   * @param string The category name
+   * @param string The prefix
+   *
+   * @return string The fixed category name
+   */
+  protected function fixCategoryName($category, $prefix)
+  {
+    // categories starting without a period will be prepended to the key
+    if ($category[0] != '.')
+    {
+      $category = $prefix.$category.'_';
+    }
+    else
+    {
+      $category = $prefix;
+    }
+
+    return $category;
+  }
+
+  /**
+   * Merges default, all and current environment configurations.
+   *
+   * @param array The main configuratino array
+   *
+   * @param array The merged configuration
+   */
+  protected function mergeEnvironment($config)
+  {
+    return sfToolkit::arrayDeepMerge(
+      isset($config['default']) && is_array($config['default']) ? $config['default'] : array(),
+      isset($config['all']) && is_array($config['all']) ? $config['all'] : array(),
+      isset($config[sfConfig::get('sf_environment')]) && is_array($config[sfConfig::get('sf_environment')]) ? $config[sfConfig::get('sf_environment')] : array()
+    );
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfDefineEnvironmentConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfFactoryConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfFactoryConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfFactoryConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,162 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfFactoryConfigHandler allows you to specify which factory implementation the
+ * system will use.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfFactoryConfigHandler.class.php 3203 2007-01-09 18:32:54Z fabien $
+ */
+class sfFactoryConfigHandler extends sfYamlConfigHandler
+{
+  /**
+   * Executes this configuration handler.
+   *
+   * @param array An array of absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   *
+   * @throws <b>sfConfigurationException</b> If a requested configuration file does not exist or is not readable
+   * @throws <b>sfParseException</b> If a requested configuration file is improperly formatted
+   */
+  public function execute($configFiles)
+  {
+    // parse the yaml
+    $myConfig = $this->parseYamls($configFiles);
+
+    $myConfig = sfToolkit::arrayDeepMerge(
+      isset($myConfig['default']) && is_array($myConfig['default']) ? $myConfig['default'] : array(),
+      isset($myConfig['all']) && is_array($myConfig['all']) ? $myConfig['all'] : array(),
+      isset($myConfig[sfConfig::get('sf_environment')]) && is_array($myConfig[sfConfig::get('sf_environment')]) ? $myConfig[sfConfig::get('sf_environment')] : array()
+    );
+
+    // init our data and includes arrays
+    $includes  = array();
+    $inits     = array();
+    $instances = array();
+
+    // available list of factories
+    $factories = array('controller', 'request', 'response', 'storage', 'user', 'view_cache');
+
+    // let's do our fancy work
+    foreach ($factories as $factory)
+    {
+      // see if the factory exists for this controller
+      $keys = $myConfig[$factory];
+
+      if (!isset($keys['class']))
+      {
+        // missing class key
+        $error = sprintf('Configuration file "%s" specifies category "%s" with missing class key', $configFiles[0], $factory);
+        throw new sfParseException($error);
+      }
+
+      $class = $keys['class'];
+
+      if (isset($keys['file']))
+      {
+        // we have a file to include
+        $file = $this->replaceConstants($keys['file']);
+        $file = $this->replacePath($file);
+
+        if (!is_readable($file))
+        {
+            // factory file doesn't exist
+            $error = sprintf('Configuration file "%s" specifies class "%s" with nonexistent or unreadable file "%s"', $configFiles[0], $class, $file);
+            throw new sfParseException($error);
+        }
+
+        // append our data
+        $includes[] = sprintf("require_once('%s');", $file);
+      }
+
+      // parse parameters
+      if (isset($keys['param']))
+      {
+        $parameters = array();
+        foreach ($keys['param'] as $key => $value)
+        {
+          $parameters[$key] = $this->replaceConstants($value);
+        }
+      }
+      else
+      {
+        $parameters = null;
+      }
+      $parameters = var_export($parameters, true);
+
+      // append new data
+      switch ($factory)
+      {
+        case 'controller':
+          // append instance creation
+          $instances[] = sprintf("  \$this->controller = sfController::newInstance(sfConfig::get('sf_factory_controller', '%s'));", $class);
+
+          // append instance initialization
+          $inits[] = "  \$this->controller->initialize(\$this);";
+          break;
+
+        case 'request':
+          // append instance creation
+          $instances[] = sprintf("  \$this->request = sfRequest::newInstance(sfConfig::get('sf_factory_request', '%s'));", $class);
+
+          // append instance initialization
+          $inits[] = sprintf("  \$this->request->initialize(\$this, sfConfig::get('sf_factory_request_parameters', %s), sfConfig::get('sf_factory_request_attributes', array()));", $parameters);
+          break;
+
+        case 'response':
+          // append instance creation
+          $instances[] = sprintf("  \$this->response = sfResponse::newInstance(sfConfig::get('sf_factory_response', '%s'));", $class);
+
+          // append instance initialization
+          $inits[] = sprintf("  \$this->response->initialize(\$this, sfConfig::get('sf_factory_response_parameters', %s));", $parameters);
+          break;
+
+        case 'storage':
+          // append instance creation
+          $instances[] = sprintf("  \$this->storage = sfStorage::newInstance(sfConfig::get('sf_factory_storage', '%s'));", $class);
+
+          // append instance initialization
+          $inits[] = sprintf("  \$this->storage->initialize(\$this, sfConfig::get('sf_factory_storage_parameters', %s));", $parameters);
+          break;
+
+        case 'user':
+          // append instance creation
+          $instances[] = sprintf("  \$this->user = sfUser::newInstance(sfConfig::get('sf_factory_user', '%s'));", $class);
+
+          // append instance initialization
+          $inits[] = sprintf("  \$this->user->initialize(\$this, sfConfig::get('sf_factory_user_parameters', %s));", $parameters);
+          break;
+        case 'view_cache':
+          // append view cache class name
+          $inits[] = sprintf("\n  if (sfConfig::get('sf_cache'))\n  {\n".
+                             "    \$this->viewCacheManager = new sfViewCacheManager();\n".
+                             "    \$this->viewCacheManager->initialize(\$this, sfConfig::get('sf_factory_view_cache', '%s'), sfConfig::get('sf_factory_view_cache_parameters', %s));\n".
+                             " }\n",
+                             $class, $parameters);
+          break;
+      }
+    }
+
+    // compile data
+    $retval = sprintf("<?php\n".
+                      "// auto-generated by sfFactoryConfigHandler\n".
+                      "// date: %s\n%s\n%s\n%s\n",
+                      date('Y/m/d H:i:s'), implode("\n", $includes),
+                      implode("\n", $instances), implode("\n", $inits));
+
+    return $retval;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfFactoryConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfFilterConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfFilterConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfFilterConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,206 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfFilterConfigHandler allows you to register filters with the system.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfFilterConfigHandler.class.php 3258 2007-01-13 12:12:22Z fabien $
+ */
+class sfFilterConfigHandler extends sfYamlConfigHandler
+{
+  /**
+   * Executes this configuration handler
+   *
+   * @param array An array of absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   *
+   * @throws sfConfigurationException If a requested configuration file does not exist or is not readable
+   * @throws sfParseException If a requested configuration file is improperly formatted
+   */
+  public function execute($configFiles)
+  {
+    // parse the yaml
+    $config = $this->parseYaml($configFiles[0]);
+    foreach (array_slice($configFiles, 1) as $i => $configFile)
+    {
+      // we get the order of the new file and merge with the previous configurations
+      $previous = $config;
+
+      $config = array();
+      foreach ($this->parseYaml($configFile) as $key => $value)
+      {
+        $value = (array) $value;
+        $config[$key] = isset($previous[$key]) ? sfToolkit::arrayDeepMerge($previous[$key], $value) : $value;
+      }
+
+      // check that every key in previous array is still present (to avoid problem when upgrading)
+      foreach (array_keys($previous) as $key)
+      {
+        if (!isset($config[$key]))
+        {
+          throw new sfConfigurationException(sprintf('The filter name "%s" is defined in "%s" but not present in "%s" file. To disable a filter, add a "enabled" key with a false value', $key, $configFiles[$i], $configFile));
+        }
+      }
+    }
+
+    // init our data and includes arrays
+    $data     = array();
+    $includes = array();
+
+    $execution = false;
+    $rendering = false;
+
+    // let's do our fancy work
+    foreach ($config as $category => $keys)
+    {
+      if (isset($keys['enabled']) && !$keys['enabled'])
+      {
+        continue;
+      }
+
+      if (!isset($keys['class']))
+      {
+        // missing class key
+        $error = 'Configuration file "%s" specifies category "%s" with missing class key';
+        $error = sprintf($error, $configFiles[0], $category);
+
+        throw new sfParseException($error);
+      }
+
+      $class = $keys['class'];
+
+      if (isset($keys['file']))
+      {
+        // we have a file to include
+        $file = $this->replaceConstants($keys['file']);
+        $file = $this->replacePath($file);
+
+        if (!is_readable($file))
+        {
+          // filter file doesn't exist
+          $error = sprintf('Configuration file "%s" specifies class "%s" with nonexistent or unreadable file "%s"', $configFiles[0], $class, $file);
+
+          throw new sfParseException($error);
+        }
+
+        // append our data
+        $includes[] = sprintf("require_once('%s');\n", $file);
+      }
+
+      $condition = true;
+      if (isset($keys['param']['condition']))
+      {
+        $condition = $this->replaceConstants($keys['param']['condition']);
+        unset($keys['param']['condition']);
+      }
+
+      $type = isset($keys['param']['type']) ? $keys['param']['type'] : null;
+      unset($keys['param']['type']);
+
+      if ($condition)
+      {
+        // parse parameters
+        $parameters = isset($keys['param']) ? var_export($keys['param'], true) : 'null';
+
+        // append new data
+        if ('security' == $type)
+        {
+          $data[] = $this->addSecurityFilter($category, $class, $parameters);
+        }
+        else
+        {
+          $data[] = $this->addFilter($category, $class, $parameters);
+        }
+
+        if ('rendering' == $type)
+        {
+          $rendering = true;
+        }
+
+        if ('execution' == $type)
+        {
+          $execution = true;
+        }
+      }
+    }
+
+    if (!$rendering)
+    {
+      $error = sprintf('Configuration file "%s" must register a filter of type "rendering"', $configFiles[0]);
+
+      throw new sfParseException($error);
+    }
+
+    if (!$execution)
+    {
+      $error = sprintf('Configuration file "%s" must register a filter of type "execution"', $configFiles[0]);
+
+      throw new sfParseException($error);
+    }
+
+    // compile data
+    $retval = sprintf("<?php\n".
+                      "// auto-generated by sfFilterConfigHandler\n".
+                      "// date: %s%s\n%s\n\n", date('Y/m/d H:i:s'),
+                      implode("\n", $includes), implode("\n", $data));
+
+    return $retval;
+  }
+
+  /**
+   * Adds a filter statement to the data.
+   *
+   * @param string The category name
+   * @param string The filter class name
+   * @param array  Filter default parameters
+   *
+   * @return string The PHP statement
+   */
+  protected function addFilter($category, $class, $parameters)
+  {
+    return sprintf("\nlist(\$class, \$parameters) = (array) sfConfig::get('sf_%s_filter', array('%s', %s));\n".
+                      "\$filter = new \$class();\n".
+                      "\$filter->initialize(\$this->context, \$parameters);\n".
+                      "\$filterChain->register(\$filter);",
+                      $category, $class, $parameters);
+  }
+
+  /**
+   * Adds a security filter statement to the data.
+   *
+   * @param string The category name
+   * @param string The filter class name
+   * @param array  Filter default parameters
+   *
+   * @return string The PHP statement
+   */
+  protected function addSecurityFilter($category, $class, $parameters)
+  {
+    return <<<EOF
+
+// does this action require security?
+if (\$actionInstance->isSecure())
+{
+  if (!in_array('sfSecurityUser', class_implements(\$this->context->getUser())))
+  {
+    \$error = 'Security is enabled, but your sfUser implementation does not implement sfSecurityUser interface';
+    throw new sfSecurityException(\$error);
+  }
+  {$this->addFilter($category, $class, $parameters)}
+}
+EOF;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfFilterConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfGeneratorConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfGeneratorConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfGeneratorConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfGeneratorConfigHandler.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfGeneratorConfigHandler.class.php 3203 2007-01-09 18:32:54Z fabien $
+ */
+class sfGeneratorConfigHandler extends sfYamlConfigHandler
+{
+  /**
+   * Executes this configuration handler.
+   *
+   * @param array An array of absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   *
+   * @throws sfConfigurationException If a requested configuration file does not exist or is not readable
+   * @throws sfParseException If a requested configuration file is improperly formatted
+   * @throws sfInitializationException If a generator.yml key check fails
+   */
+  public function execute($configFiles)
+  {
+    // parse the yaml
+    $config = $this->parseYamls($configFiles);
+    if (!$config)
+    {
+      return '';
+    }
+
+    if (!isset($config['generator']))
+    {
+      throw new sfParseException(sprintf('Configuration file "%s" must specify a generator section', $configFiles[1] ? $configFiles[1] : $configFiles[0]));
+    }
+
+    $config = $config['generator'];
+
+    if (!isset($config['class']))
+    {
+      throw new sfParseException(sprintf('Configuration file "%s" must specify a generator class section under the generator section', $configFiles[1] ? $configFiles[1] : $configFiles[0]));
+    }
+
+    foreach (array('fields', 'list', 'edit') as $section)
+    {
+      if (isset($config[$section]))
+      {
+        throw new sfParseException(sprintf('Configuration file "%s" can specify a "%s" section but only under the param section', $configFiles[1] ? $configFiles[1] : $configFiles[0], $section));
+      }
+    }
+
+    // generate class and add a reference to it
+    $generatorManager = new sfGeneratorManager();
+    $generatorManager->initialize();
+
+    // generator parameters
+    $generatorParam = (isset($config['param']) ? $config['param'] : array());
+
+    // hack to find the module name
+    preg_match('#'.sfConfig::get('sf_app_module_dir_name').'/([^/]+)/#', $configFiles[1], $match);
+    $generatorParam['moduleName'] = $match[1];
+
+    $data = $generatorManager->generate($config['class'], $generatorParam);
+
+    // compile data
+    $retval = "<?php\n".
+              "// auto-generated by sfGeneratorConfigHandler\n".
+              "// date: %s\n%s\n";
+    $retval = sprintf($retval, date('Y/m/d H:i:s'), $data);
+
+    return $retval;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfGeneratorConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfLoader.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfLoader.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfLoader.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,375 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfLoader is a class which contains the logic to look for files/classes in symfony.
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfLoader.class.php 3313 2007-01-20 07:00:37Z fabien $
+ */
+class sfLoader
+{
+  /**
+   * Gets directories where model classes are stored.
+   *
+   * @return array An array of directories
+   */
+  static public function getModelDirs()
+  {
+    $dirs = array(sfConfig::get('sf_lib_dir').'/model' ? sfConfig::get('sf_lib_dir').'/model' : 'lib/model'); // project
+    if ($pluginDirs = glob(sfConfig::get('sf_plugins_dir').'/*/lib/model'))
+    {
+      $dirs = array_merge($dirs, $pluginDirs);                                                                // plugins
+    }
+
+    return $dirs;
+  }
+
+  /**
+   * Gets directories where controller classes are stored for a given module.
+   *
+   * @param string The module name
+   *
+   * @return array An array of directories
+   */
+  static public function getControllerDirs($moduleName)
+  {
+    $suffix = $moduleName.'/'.sfConfig::get('sf_app_module_action_dir_name');
+
+    $dirs = array();
+    foreach (sfConfig::get('sf_module_dirs', array()) as $key => $value)
+    {
+      $dirs[$key.'/'.$suffix] = $value;
+    }
+
+    $dirs[sfConfig::get('sf_app_module_dir').'/'.$suffix] = false;                                     // application
+
+    if ($pluginDirs = glob(sfConfig::get('sf_plugins_dir').'/*/modules/'.$suffix))
+    {
+      $dirs = array_merge($dirs, array_combine($pluginDirs, array_fill(0, count($pluginDirs), true))); // plugins
+    }
+
+    $dirs[sfConfig::get('sf_symfony_data_dir').'/modules/'.$suffix] = true;                            // core modules
+
+    return $dirs;
+  }
+
+  /**
+   * Gets directories where template files are stored for a given module.
+   *
+   * @param string The module name
+   *
+   * @return array An array of directories
+   */
+  static public function getTemplateDirs($moduleName)
+  {
+    $suffix = $moduleName.'/'.sfConfig::get('sf_app_module_template_dir_name');
+
+    $dirs = array();
+    foreach (sfConfig::get('sf_module_dirs', array()) as $key => $value)
+    {
+      $dirs[] = $key.'/'.$suffix;
+    }
+
+    $dirs[] = sfConfig::get('sf_app_module_dir').'/'.$suffix;                        // application
+
+    if ($pluginDirs = glob(sfConfig::get('sf_plugins_dir').'/*/modules/'.$suffix))
+    {
+      $dirs = array_merge($dirs, $pluginDirs);                                       // plugins
+    }
+
+    $dirs[] = sfConfig::get('sf_symfony_data_dir').'/modules/'.$suffix;              // core modules
+    $dirs[] = sfConfig::get('sf_module_cache_dir').'/auto'.ucfirst($suffix);         // generated templates in cache
+
+    return $dirs;
+  }
+
+  /**
+   * Gets the template directory to use for a given module and template file.
+   *
+   * @param string The module name
+   * @param string The template file
+   *
+   * @return string A template directory
+   */
+  static public function getTemplateDir($moduleName, $templateFile)
+  {
+    $dirs = self::getTemplateDirs($moduleName);
+    foreach ($dirs as $dir)
+    {
+      if (is_readable($dir.'/'.$templateFile))
+      {
+        return $dir;
+      }
+    }
+
+    return null;
+  }
+
+  /**
+   * Gets the template to use for a given module and template file.
+   *
+   * @param string The module name
+   * @param string The template file
+   *
+   * @return string A template path
+   */
+  static public function getTemplatePath($moduleName, $templateFile)
+  {
+    $dir = self::getTemplateDir($moduleName, $templateFile);
+
+    return $dir ? $dir.'/'.$templateFile : null;
+  }
+
+  /**
+   * Gets the i18n directory to use for a given module.
+   *
+   * @param string The module name
+   *
+   * @return string An i18n directory
+   */
+  static public function getI18NDir($moduleName)
+  {
+    $suffix = $moduleName.'/'.sfConfig::get('sf_app_module_i18n_dir_name');
+
+    // application
+    $dir = sfConfig::get('sf_app_module_dir').'/'.$suffix;
+    if (is_dir($dir))
+    {
+      return $dir;
+    }
+
+    // plugins
+    $dirs = glob(sfConfig::get('sf_plugins_dir').'/*/modules/'.$suffix);
+    if (isset($dirs[0]))
+    {
+      return $dirs[0];
+    }
+  }
+
+  /**
+   * Gets directories where template files are stored for a generator class and a specific theme.
+   *
+   * @param string The generator class name
+   * @param string The theme name
+   *
+   * @return array An array of directories
+   */
+  static public function getGeneratorTemplateDirs($class, $theme)
+  {
+    $dirs = array();
+
+    if ($pluginDirs = glob(sfConfig::get('sf_plugins_dir').'/*/data/generator/'.$class.'/'.$theme.'/template'))
+    {
+      $dirs = array_merge($dirs, $pluginDirs);                                                                // plugin
+    }
+
+    $dirs[] = sfConfig::get('sf_data_dir').'/generator/'.$class.'/'.$theme.'/template';                       // project
+    $dirs[] = sfConfig::get('sf_symfony_data_dir').'/generator/'.$class.'/default/template';                  // default theme
+
+    return $dirs;
+  }
+
+  /**
+   * Gets directories where the skeleton is stored for a generator class and a specific theme.
+   *
+   * @param string The generator class name
+   * @param string The theme name
+   *
+   * @return array An array of directories
+   */
+  static public function getGeneratorSkeletonDirs($class, $theme)
+  {
+    $dirs = array();
+
+    if ($pluginDirs = glob(sfConfig::get('sf_plugins_dir').'/*/data/generator/'.$class.'/'.$theme.'/skeleton'))
+    {
+      $dirs = array_merge($dirs, $pluginDirs);                                                                // plugin
+    }
+
+    $dirs[] = sfConfig::get('sf_data_dir').'/generator/'.$class.'/'.$theme.'/skeleton';                       // project
+    $dirs[] = sfConfig::get('sf_symfony_data_dir').'/generator/'.$class.'/default/skeleton';                  // default theme
+
+    return $dirs;
+  }
+
+  /**
+   * Gets the template to use for a generator class.
+   *
+   * @param string The generator class name
+   * @param string The theme name
+   * @param string The template path
+   *
+   * @return string A template path
+   *
+   * @throws sfException
+   */
+  static public function getGeneratorTemplate($class, $theme, $path)
+  {
+    $dirs = self::getGeneratorTemplateDirs($class, $theme);
+    foreach ($dirs as $dir)
+    {
+      if (is_readable($dir.'/'.$path))
+      {
+        return $dir.'/'.$path;
+      }
+    }
+
+    throw new sfException(sprintf('Unable to load "%s" generator template in: %s', $path, implode(', ', $dirs)));
+  }
+
+  /**
+   * Gets the configuration file paths for a given relative configuration path.
+   *
+   * @param string The configuration path
+   *
+   * @return array An array of paths
+   */
+  static public function getConfigPaths($configPath)
+  {
+    $globalConfigPath = basename(dirname($configPath)).'/'.basename($configPath);
+
+    $files = array(
+      sfConfig::get('sf_symfony_data_dir').'/'.$globalConfigPath,                    // symfony
+      sfConfig::get('sf_symfony_data_dir').'/'.$configPath,                          // core modules
+    );
+
+    if ($pluginDirs = glob(sfConfig::get('sf_plugins_dir').'/*/'.$globalConfigPath))
+    {
+      $files = array_merge($files, $pluginDirs);                                     // plugins
+    }
+
+    $files = array_merge($files, array(
+      sfConfig::get('sf_root_dir').'/'.$globalConfigPath,                            // project
+      sfConfig::get('sf_root_dir').'/'.$configPath,                                  // project
+      sfConfig::get('sf_app_dir').'/'.$globalConfigPath,                             // application
+      sfConfig::get('sf_cache_dir').'/'.$configPath,                                 // generated modules
+    ));
+
+    if ($pluginDirs = glob(sfConfig::get('sf_plugins_dir').'/*/'.$configPath))
+    {
+      $files = array_merge($files, $pluginDirs);                                     // plugins
+    }
+
+    $files[] = sfConfig::get('sf_app_dir').'/'.$configPath;                          // module
+
+    $configs = array();
+    foreach (array_unique($files) as $file)
+    {
+      if (is_readable($file))
+      {
+        $configs[] = $file;
+      }
+    }
+
+    return $configs;
+  }
+
+  /**
+   * Gets the helper directories for a given module name.
+   *
+   * @param string The module name
+   *
+   * @return array An array of directories
+   */
+  static public function getHelperDirs($moduleName = '')
+  {
+    $dirs = array();
+
+    if ($moduleName)
+    {
+      $dirs[] = sfConfig::get('sf_app_module_dir').'/'.$moduleName.'/'.sfConfig::get('sf_app_module_lib_dir_name').'/helper'; // module
+
+      if ($pluginDirs = glob(sfConfig::get('sf_plugins_dir').'/*/modules/'.$moduleName.'/lib/helper'))
+      {
+        $dirs = array_merge($dirs, $pluginDirs);                                                                              // module plugins
+      }
+    }
+
+    $dirs[] = sfConfig::get('sf_app_lib_dir').'/helper';                                                                      // application
+
+    $dirs[] = sfConfig::get('sf_lib_dir').'/helper';                                                                          // project
+
+    if ($pluginDirs = glob(sfConfig::get('sf_plugins_dir').'/*/lib/helper'))
+    {
+      $dirs = array_merge($dirs, $pluginDirs);                                                                                // plugins
+    }
+
+    $dirs[] = sfConfig::get('sf_symfony_lib_dir').'/helper';                                                                  // global
+
+    return $dirs;
+  }
+
+  /**
+   * Loads helpers.
+   *
+   * @param array  An array of helpers to load
+   * @param string A module name (optional)
+   *
+   * @throws sfViewException
+   */
+  static public function loadHelpers($helpers, $moduleName = '')
+  {
+    static $loaded = array();
+
+    $dirs = self::getHelperDirs($moduleName);
+    foreach ((array) $helpers as $helperName)
+    {
+      if (isset($loaded[$helperName]))
+      {
+        continue;
+      }
+
+      $fileName = $helperName.'Helper.php';
+      foreach ($dirs as $dir)
+      {
+        $included = false;
+        if (is_readable($dir.'/'.$fileName))
+        {
+          include($dir.'/'.$fileName);
+          $included = true;
+          break;
+        }
+      }
+
+      if (!$included)
+      {
+        // search in the include path
+        if ((@include('helper/'.$fileName)) != 1)
+        {
+          $dirs = array_merge($dirs, explode(PATH_SEPARATOR, get_include_path()));
+
+          // remove sf_root_dir from dirs
+          foreach ($dirs as &$dir)
+          {
+            $dir = str_replace('%SF_ROOT_DIR%', sfConfig::get('sf_root_dir'), $dir);
+          }
+
+          throw new sfViewException(sprintf('Unable to load "%sHelper.php" helper in: %s', $helperName, implode(', ', $dirs)));
+        }
+      }
+
+      $loaded[$helperName] = true;
+    }
+  }
+
+  static public function loadPluginConfig()
+  {
+    if ($pluginConfigs = glob(sfConfig::get('sf_plugins_dir').'/*/config/config.php'))
+    {
+      foreach ($pluginConfigs as $config)
+      {
+        include($config);
+      }
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfLoader.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfLoggingConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfLoggingConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfLoggingConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,93 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfLoggingConfigHandler allows you to configure logging and register loggers with the system.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfLoggingConfigHandler.class.php 3258 2007-01-13 12:12:22Z fabien $
+ */
+class sfLoggingConfigHandler extends sfDefineEnvironmentConfigHandler
+{
+  protected
+    $enabled = true,
+    $loggers = array();
+
+  /**
+   * Executes this configuration handler.
+   *
+   * @param array An array of absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   */
+  public function execute($configFiles)
+  {
+    $data = parent::execute($configFiles);
+
+    if ($this->enabled)
+    {
+      $data .= "\n\$logger = sfLogger::getInstance();\n";
+
+      // log level
+      $data .= "\$logger->setLogLevel(constant('SF_LOG_'.strtoupper(sfConfig::get('sf_logging_level'))));\n";
+
+      // register loggers defined in the logging.yml configuration file
+      foreach ($this->loggers as $name => $keys)
+      {
+        if (isset($keys['enabled']) && !$keys['enabled'])
+        {
+          continue;
+        }
+
+        if (!isset($keys['class']))
+        {
+          // missing class key
+          throw new sfParseException(sprintf('Configuration file "%s" specifies filter "%s" with missing class key', $configFiles[0], $name));
+        }
+
+        $condition = true;
+        if (isset($keys['param']['condition']))
+        {
+          $condition = $this->replaceConstants($keys['param']['condition']);
+          unset($keys['param']['condition']);
+        }
+
+        if ($condition)
+        {
+          // parse parameters
+          $parameters = isset($keys['param']) ? var_export($keys['param'], true) : '';
+
+          // create logger instance
+          $data .= sprintf("\n\$log = new %s();\n\$log->initialize(%s);\n\$logger->registerLogger(\$log);\n", $keys['class'], $parameters);
+        }
+      }
+    }
+
+    return $data;
+  }
+
+  protected function getValues($prefix, $category, $keys)
+  {
+    if ('enabled' == $category)
+    {
+      $this->enabled = $this->replaceConstants($keys);
+    }
+    else if ('loggers' == $category)
+    {
+      $this->loggers = $this->replaceConstants($keys);
+
+      return array();
+    }
+
+    return parent::getValues($prefix, $category, $keys);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfLoggingConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfPhpConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfPhpConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfPhpConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,154 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfPhpConfigHandler allows you to override php.ini configuration at runtime.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPhpConfigHandler.class.php 3203 2007-01-09 18:32:54Z fabien $
+ */
+class sfPhpConfigHandler extends sfYamlConfigHandler
+{
+  /**
+   * Executes this configuration handler
+   *
+   * @param array An array of absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   *
+   * @throws <b>sfConfigurationException</b> If a requested configuration file does not exist or is not readable
+   * @throws <b>sfParseException</b> If a requested configuration file is improperly formatted
+   * @throws <b>sfInitializationException</b> If a php.yml key check fails
+   */
+  public function execute($configFiles)
+  {
+    $this->initialize();
+
+    // parse the yaml
+    $config = $this->parseYamls($configFiles);
+
+    // init our data array
+    $data = array();
+
+    // get all php.ini configuration
+    $configs = ini_get_all();
+
+    // set some php.ini keys
+    if (isset($config['set']))
+    {
+      foreach ($config['set'] as $key => $value)
+      {
+        $key = strtolower($key);
+
+        // key exists?
+        if (!array_key_exists($key, $configs))
+        {
+          $error = sprintf('Configuration file "%s" specifies key "%s" which is not a php.ini directive', $configFiles[0], $key);
+          throw new sfParseException($error);
+        }
+
+        // key is overridable?
+        if ($configs[$key]['access'] != 7)
+        {
+          $error = sprintf('Configuration file "%s" specifies key "%s" which cannot be overrided', $configFiles[0], $key);
+          throw new sfParseException($error);
+        }
+
+        // escape value
+        $value = str_replace("'", "\\'", $value);
+
+        $data[] = sprintf("ini_set('%s', '%s');", $key, $value);
+      }
+    }
+
+    // check some php.ini settings
+    if (isset($config['check']))
+    {
+      foreach ($config['check'] as $key => $value)
+      {
+        $key = strtolower($key);
+
+        // key exists?
+        if (!array_key_exists($key, $configs))
+        {
+          $error = sprintf('Configuration file "%s" specifies key "%s" which is not a php.ini directive [err0002]', $configFiles[0], $key);
+          throw new sfParseException($error);
+        }
+
+        if (ini_get($key) != $value)
+        {
+          $error = sprintf('Configuration file "%s" specifies that php.ini "%s" key must be set to "%s". The current value is "%s" (%s). [err0001]', $configFiles[0], $key, var_export($value, true), var_export(ini_get($key), true), $this->get_ini_path());
+          throw new sfInitializationException($error);
+        }
+      }
+    }
+
+    // warn about some php.ini settings
+    if (isset($config['warn']))
+    {
+      foreach ($config['warn'] as $key => $value)
+      {
+        $key = strtolower($key);
+
+        // key exists?
+        if (!array_key_exists($key, $configs))
+        {
+          $error = sprintf('Configuration file "%s" specifies key "%s" which is not a php.ini directive [err0002]', $configFiles[0], $key);
+          throw new sfParseException($error);
+        }
+
+        $warning = sprintf('{sfPhpConfigHandler} php.ini "%s" key is better set to "%s" (current value is "%s" - %s)', $key, var_export($value, true), var_export(ini_get($key), true), $this->get_ini_path());
+        $data[] = sprintf("if (ini_get('%s') != %s)\n{\n  sfLogger::getInstance()->warning('%s');\n}\n", $key, var_export($value, true), str_replace("'", "\\'", $warning));
+      }
+    }
+
+    // check for some extensions
+    if (isset($config['extensions']))
+    {
+      foreach ($config['extensions'] as $extension_name)
+      {
+        if (!extension_loaded($extension_name))
+        {
+          $error = sprintf('Configuration file "%s" specifies that the PHP extension "%s" should be loaded. (%s)', $configFiles[0], $extension_name, $this->get_ini_path());
+          throw new sfInitializationException($error);
+        }
+      }
+    }
+
+    // compile data
+    $retval = sprintf("<?php\n".
+                      "// auto-generated by sfPhpConfigHandler\n".
+                      "// date: %s\n%s\n", date('Y/m/d H:i:s'), implode("\n", $data));
+
+    return $retval;
+  }
+
+  /**
+   * Gets the php.ini path used by PHP.
+   *
+   * @return string the php.ini path
+   */
+  protected function get_ini_path()
+  {
+    $cfg_path = get_cfg_var('cfg_file_path');
+    if ($cfg_path == '')
+    {
+      $ini_path = 'WARNING: system is not using a php.ini file';
+    }
+    else
+    {
+      $ini_path = sprintf('php.ini location: "%s"', $cfg_path);
+    }
+
+    return $ini_path;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfPhpConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfRootConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfRootConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfRootConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,104 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfRootConfigHandler allows you to specify configuration handlers for the
+ * application or on a module level.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfRootConfigHandler.class.php 3203 2007-01-09 18:32:54Z fabien $
+ */
+class sfRootConfigHandler extends sfYamlConfigHandler
+{
+  /**
+   * Executes this configuration handler
+   *
+   * @param array An array of absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   *
+   * @throws sfConfigurationException If a requested configuration file does not exist or is not readable
+   * @throws sfParseException If a requested configuration file is improperly formatted
+   */
+  public function execute($configFiles)
+  {
+    // parse the yaml
+    $config = $this->parseYamls($configFiles);
+
+    // determine if we're loading the system config_handlers.yml or a module config_handlers.yml
+    $moduleLevel = ($this->getParameterHolder()->get('module_level') === true) ? true : false;
+
+    if ($moduleLevel)
+    {
+      // get the current module name
+      $moduleName = $this->getParameterHolder()->get('module_name');
+    }
+
+    // init our data and includes arrays
+    $data     = array();
+    $includes = array();
+
+    // let's do our fancy work
+    foreach ($config as $category => $keys)
+    {
+      if ($moduleLevel)
+      {
+        // module-level registration, so we must prepend the module
+        // root to the category
+        $category = 'modules/'.$moduleName.'/'.$category;
+      }
+
+      if (!isset($keys['class']))
+      {
+        // missing class key
+        $error = sprintf('Configuration file "%s" specifies category "%s" with missing class key', $configFiles[0], $category);
+        throw new sfParseException($error);
+      }
+
+      $class = $keys['class'];
+
+      if (isset($keys['file']))
+      {
+        // we have a file to include
+        $file = $this->replaceConstants($keys['file']);
+        $file = $this->replacePath($file);
+
+        if (!is_readable($file))
+        {
+          // handler file doesn't exist
+          $error = sprintf('Configuration file "%s" specifies class "%s" with nonexistent or unreadable file "%s"', $configFiles[0], $class, $file);
+          throw new sfParseException($error);
+        }
+
+        // append our data
+        $includes[] = sprintf("require_once('%s');", $file);
+      }
+
+      // parse parameters
+      $parameters = (isset($keys['param']) ? var_export($keys['param'], true) : null);
+
+      // append new data
+      $data[] = sprintf("\$this->handlers['%s'] = new %s();", $category, $class);
+
+      // initialize the handler with parameters
+      $data[] = sprintf("\$this->handlers['%s']->initialize(%s);", $category, $parameters);
+    }
+
+    // compile data
+    $retval = sprintf("<?php\n" .
+                      "// auto-generated by sfRootConfigHandler\n".
+                      "// date: %s\n%s\n%s\n",
+                      date('Y/m/d H:i:s'), implode("\n", $includes), implode("\n", $data));
+
+    return $retval;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfRootConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfRoutingConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfRoutingConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfRoutingConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfRoutingConfigHandler.class.php 3203 2007-01-09 18:32:54Z fabien $
+ */
+class sfRoutingConfigHandler extends sfYamlConfigHandler
+{
+  /**
+   * Executes this configuration handler.
+   *
+   * @param array An array of absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   *
+   * @throws sfConfigurationException If a requested configuration file does not exist or is not readable
+   * @throws sfParseException If a requested configuration file is improperly formatted
+   */
+  public function execute($configFiles)
+  {
+    // parse the yaml
+    $config = $this->parseYamls($configFiles);
+
+    // connect routes
+    $routes = sfRouting::getInstance();
+    foreach ($config as $name => $params)
+    {
+      $routes->connect(
+        $name,
+        ($params['url'] ? $params['url'] : '/'),
+        (isset($params['param']) ? $params['param'] : array()),
+        (isset($params['requirements']) ? $params['requirements'] : array())
+      );
+    }
+
+    // compile data
+    $retval = sprintf("<?php\n".
+                      "// auto-generated by sfRoutingConfigHandler\n".
+                      "// date: %s\n\$routes = sfRouting::getInstance();\n\$routes->setRoutes(\n%s\n);\n",
+                      date('Y/m/d H:i:s'), var_export($routes->getRoutes(), 1));
+
+    return $retval;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfRoutingConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfSecurityConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfSecurityConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfSecurityConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,52 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfSecurityConfigHandler allows you to configure action security.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfSecurityConfigHandler.class.php 3203 2007-01-09 18:32:54Z fabien $
+ */
+class sfSecurityConfigHandler extends sfYamlConfigHandler
+{
+  /**
+   * Executes this configuration handler.
+   *
+   * @param array An array of absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   *
+   * @throws <b>sfConfigurationException</b> If a requested configuration file does not exist or is not readable
+   * @throws <b>sfParseException</b> If a requested configuration file is improperly formatted
+   * @throws <b>sfInitializationException</b> If a view.yml key check fails
+   */
+  public function execute($configFiles)
+  {
+    // parse the yaml
+    $myConfig = $this->parseYamls($configFiles);
+
+    $myConfig['all'] = sfToolkit::arrayDeepMerge(
+      isset($myConfig['default']) && is_array($myConfig['default']) ? $myConfig['default'] : array(),
+      isset($myConfig['all']) && is_array($myConfig['all']) ? $myConfig['all'] : array()
+    );
+
+    unset($myConfig['default']);
+
+    // compile data
+    $retval = sprintf("<?php\n".
+                      "// auto-generated by sfSecurityConfigHandler\n".
+                      "// date: %s\n\$this->security = %s;\n",
+                      date('Y/m/d H:i:s'), var_export($myConfig, true));
+
+    return $retval;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfSecurityConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfSimpleYamlConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfSimpleYamlConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfSimpleYamlConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfSimpleYamlConfigHandler allows you to load simple configuration files formatted as YAML.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfSimpleYamlConfigHandler.class.php 3203 2007-01-09 18:32:54Z fabien $
+ */
+class sfSimpleYamlConfigHandler extends sfYamlConfigHandler
+{
+  /**
+   * Executes this configuration handler.
+   *
+   * @param array An array of absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   */
+  public function execute($configFiles)
+  {
+    $config = $this->parseYamls($configFiles);
+
+    // compile data
+    $retval = "<?php\n".
+              "// auto-generated by %s\n".
+              "// date: %s\nreturn %s;\n";
+    $retval = sprintf($retval, __CLASS__, date('Y/m/d H:i:s'), var_export($config, true));
+
+    return $retval;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfSimpleYamlConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfValidatorConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfValidatorConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfValidatorConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,555 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfValidatorConfigHandler allows you to register validators with the system.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfValidatorConfigHandler.class.php 3410 2007-02-06 08:11:38Z fabien $
+ */
+class sfValidatorConfigHandler extends sfYamlConfigHandler
+{
+  /**
+   * Executes this configuration handler.
+   *
+   * @param array An array of absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   *
+   * @throws sfConfigurationException If a requested configuration file does not exist or is not readable
+   * @throws sfParseException If a requested configuration file is improperly formatted
+   */
+  public function execute($configFiles)
+  {
+    // parse the yaml
+    $config = $this->parseYamls($configFiles);
+
+    // alternate format?
+    if (isset($config['fields']))
+    {
+      $this->convertAlternate2Standard($config);
+    }
+
+    foreach (array('methods', 'names') as $category)
+    {
+      if (!isset($config[$category]))
+      {
+        throw new sfParseException(sprintf('Configuration file "%s" is missing "%s" category', $configFiles[0], $category));
+      }
+    }
+
+    // init our data, includes, methods, names and validators arrays
+    $data       = array();
+    $includes   = array();
+    $methods    = array();
+    $names      = array();
+    $validators = array();
+
+    // get a list of methods and their registered files/parameters
+    foreach ($config['methods'] as $method => $list)
+    {
+      $method = strtoupper($method);
+
+      if (!isset($methods[$method]))
+      {
+        // make sure that this method is GET or POST
+        if ($method != 'GET' && $method != 'POST')
+        {
+          // unsupported request method
+          $error = sprintf('Configuration file "%s" specifies unsupported request method "%s"', $configFiles[0], $method);
+
+          throw new sfParseException($error);
+        }
+
+        // create our method
+        $methods[$method] = array();
+      }
+
+      if (!count($list))
+      {
+        // we have an empty list of names
+        continue;
+      }
+
+      // load name list
+      $this->loadNames($configFiles, $method, $methods, $names, $config, $list);
+    }
+
+    // load attribute list
+    $this->loadAttributes($configFiles, $methods, $names, $validators, $config, $list);
+
+    // fill-in filter configuration
+    $fillin = var_export(isset($config['fillin']) ? $config['fillin'] : array(), true);
+
+    // generate GET file/parameter data
+
+    $data[] = "if (\$_SERVER['REQUEST_METHOD'] == 'GET')";
+    $data[] = "{";
+
+    $ret = $this->generateRegistration('GET', $data, $methods, $names, $validators);
+
+    if ($ret)
+    {
+      $data[] = sprintf("  \$context->getRequest()->setAttribute('fillin', %s, 'symfony/filter');", $fillin);
+    }
+
+    // generate POST file/parameter data
+
+    $data[] = "}";
+    $data[] = "else if (\$_SERVER['REQUEST_METHOD'] == 'POST')";
+    $data[] = "{";
+
+    $ret = $this->generateRegistration('POST', $data, $methods, $names, $validators);
+
+    if ($ret)
+    {
+      $data[] = sprintf("  \$context->getRequest()->setAttribute('fillin', %s, 'symfony/filter');", $fillin);
+    }
+
+    $data[] = "}";
+
+    // compile data
+    $retval = sprintf("<?php\n".
+                      "// auto-generated by sfValidatorConfigHandler\n".
+                      "// date: %s\n%s\n%s\n", date('Y/m/d H:i:s'),
+                      implode("\n", $includes), implode("\n", $data));
+
+    return $retval;
+  }
+
+  /**
+   * Generates raw cache data.
+   *
+   * @param string A request method
+   * @param array  The data array where our cache code will be appended
+   * @param array  An associative array of request method data
+   * @param array  An associative array of file/parameter data
+   * @param array  A validators array
+   *
+   * @return boolean Returns true if there is some validators for this file/parameter
+   */
+  protected function generateRegistration($method, &$data, &$methods, &$names, &$validators)
+  {
+    // setup validator array
+    $data[] = "  \$validators = array();";
+
+    if (!isset($methods[$method]))
+    {
+      $methods[$method] = array();
+    }
+
+    // determine which validators we need to create for this request method
+    foreach ($methods[$method] as $name)
+    {
+      if (preg_match('/^([a-z0-9_-]+)\{([a-z0-9\s_-]+)\}$/i', $name, $match))
+      {
+        // this file/parameter has a parent
+        $subname = $match[2];
+        $parent  = $match[1];
+
+        $valList = $names[$parent][$subname]['validators'];
+      }
+      else
+      {
+        // no parent
+        $valList = $names[$name]['validators'];
+      }
+
+      if ($valList == null)
+      {
+        // no validator list for this file/parameter
+        continue;
+      }
+
+      foreach ($valList as $valName)
+      {
+        if (isset($validators[$valName]) && !isset($validators[$valName][$method]))
+        {
+          // retrieve this validator's info
+          $validator =& $validators[$valName];
+
+          $data[] = sprintf("  \$validators['%s'] = new %s();\n".
+                            "  \$validators['%s']->initialize(%s, %s);",
+                            $valName, $validator['class'], $valName, '$context', $validator['parameters']);
+
+          // mark this validator as created for this request method
+          $validators[$valName][$method] = true;
+        }
+      }
+    }
+
+    foreach ($methods[$method] as $name)
+    {
+      if (preg_match('/^([a-z0-9_-]+)\{([a-z0-9\s_-]+)\}$/i', $name, $match))
+      {
+        // this file/parameter has a parent
+        $subname = $match[2];
+        $parent  = $match[1];
+        $name    = $match[2];
+
+        $attributes = $names[$parent][$subname];
+      }
+      else
+      {
+        // no parent
+        $attributes = $names[$name];
+      }
+
+      // register file/parameter
+      $data[] = sprintf("  \$validatorManager->registerName('%s', %s, %s, %s, %s, %s);",
+                        $name, $attributes['required'] ? 1 : 0,
+                        isset($attributes['required_msg']) ? $attributes['required_msg'] : "''",
+                        $attributes['parent'], $attributes['group'],
+                        $attributes['file']);
+
+      // register validators for this file/parameter
+      foreach ($attributes['validators'] as &$validator)
+      {
+        $data[] = sprintf("  \$validatorManager->registerValidator('%s', %s, %s);", $name,
+                          "\$validators['$validator']",
+                          $attributes['parent']);
+      }
+    }
+
+    return count($methods[$method]) ? true : false;
+  }
+
+  /**
+   * Loads the linear list of attributes from the [names] category.
+   *
+   * @param string The configuration file name (for exception usage)
+   * @param array  An associative array of request method data
+   * @param array  An associative array of file/parameter names in which to store loaded information
+   * @param array  An associative array of validator data
+   * @param array  The loaded ini configuration that we'll use for verification purposes
+   * @param string A comma delimited list of file/parameter names
+   */
+  protected function loadAttributes(&$configFiles, &$methods, &$names, &$validators, &$config, &$list)
+  {
+    foreach ($config['names'] as $name => $attributes)
+    {
+      // get a reference to the name entry
+      if (preg_match('/^([a-z0-9_-]+)\{([a-z0-9\s_-]+)\}$/i', $name, $match))
+      {
+        // this name entry has a parent
+        $subname = $match[2];
+        $parent  = $match[1];
+
+        if (!isset($names[$parent][$subname]))
+        {
+          // unknown parent or subname
+          $error = sprintf('Configuration file "%s" specifies unregistered parent "%s" or subname "%s"', $configFiles[0], $parent, $subname);
+          throw new sfParseException($error);
+        }
+
+        $entry =& $names[$parent][$subname];
+      }
+      else
+      {
+        // no parent
+        if (!isset($names[$name]))
+        {
+          // unknown name
+          $error = sprintf('Configuration file "%s" specifies unregistered name "%s"', $configFiles[0], $name);
+          throw new sfParseException($error);
+        }
+
+        $entry =& $names[$name];
+      }
+
+      foreach ($attributes as $attribute => $value)
+      {
+        if ($attribute == 'validators')
+        {
+          // load validators for this file/parameter name
+          $this->loadValidators($configFiles, $validators, $config, $value, $entry);
+        }
+        else if ($attribute == 'type')
+        {
+          // name type
+          $lvalue = strtolower($value);
+          $entry['file'] = ($lvalue == 'file' ? 'true' : 'false');
+        }
+        else
+        {
+          // just a normal attribute
+          $entry[$attribute] = sfToolkit::literalize($value, true);
+        }
+      }
+    }
+  }
+
+  /**
+   * Loads all request methods and the file/parameter names that will be
+   * validated from the [methods] category.
+   *
+   * @param string The configuration file name (for exception usage)
+   * @param string A request method
+   * @param array  An associative array of request method data
+   * @param array  An associative array of file/parameter names in which to store loaded information
+   * @param array  The loaded ini configuration that we'll use for verification purposes
+   * @param string A comma delimited list of file/parameter names
+   */
+  protected function loadNames(&$configFiles, &$method, &$methods, &$names, &$config, &$list)
+  {
+    // explode the list of names
+    $array = $list;
+
+    // loop through the names
+    foreach ($array as $name)
+    {
+      // make sure we have the required status of this file or parameter
+      if (!isset($config['names'][$name]['required']))
+      {
+        // missing 'required' attribute
+        $error = sprintf('Configuration file "%s" specifies file or parameter "%s", but it is missing the "required" attribute', $configFiles[0], $name);
+        throw new sfParseException($error);
+      }
+
+      // determine parent status
+      if (preg_match('/^([a-z0-9_-]+)\{([a-z0-9\s_-]+)\}$/i', $name, $match))
+      {
+        // this name has a parent
+        $subname = $match[2];
+        $parent  = $match[1];
+
+        if (!isset($names[$parent]) || !isset($names[$parent][$name]))
+        {
+          if (!isset($names[$parent]))
+          {
+            // create our parent
+            $names[$parent] = array('_is_parent' => true);
+          }
+
+          // create our new name entry
+          $entry                 = array();
+          $entry['file']         = 'false';
+          $entry['group']        = 'null';
+          $entry['parent']       = "'$parent'";
+          $entry['required']     = 'true';
+          $entry['required_msg'] = "'Required'";
+          $entry['validators']   = array();
+
+          // add our name entry
+          $names[$parent][$subname] = $entry;
+        }
+      }
+      else if (strpos($name, '{') !== false || strpos($name, '}') !== false)
+      {
+        // name contains an invalid character
+        // this is most likely a typo where the user forgot to add a brace
+        $error = sprintf('Configuration file "%s" specifies method "%s" with invalid file/parameter name "%s"', $configFiles[0], $method, $name);
+        throw new sfParseException($error);
+      }
+      else
+      {
+        // no parent
+        if (!isset($names[$name]))
+        {
+          // create our new name entry
+          $entry                 = array();
+          $entry['file']         = 'false';
+          $entry['group']        = 'null';
+          $entry['parent']       = 'null';
+          $entry['required']     = 'true';
+          $entry['required_msg'] = "'Required'";
+          $entry['type']         = 'parameter';
+          $entry['validators']   = array();
+
+          // add our name entry
+          $names[$name] = $entry;
+        }
+      }
+
+      // add this name to the current request method
+      $methods[$method][] = $name;
+    }
+  }
+
+  /**
+   * Loads a list of validators.
+   *
+   * @param string The configuration file name (for exception usage)
+   * @param array  An associative array of validator data
+   * @param array  The loaded ini configuration that we'll use for verification purposes
+   * @param string A comma delimited list of validator names
+   * @param array  A file/parameter name entry
+   */
+  protected function loadValidators(&$configFiles, &$validators, &$config, &$list, &$entry)
+  {
+    // create our empty entry validator array
+    $entry['validators'] = array();
+
+    if (!$list || (!is_array($list) && trim($list) == ''))
+    {
+      // skip the empty list
+      return;
+    }
+
+    // get our validator array
+    $array = is_array($list) ? $list : explode(',', $list);
+
+    foreach ($array as $validator)
+    {
+      $validator = trim($validator);
+
+      // add this validator name to our entry
+      $entry['validators'][] = $validator;
+
+      // make sure the specified validator exists
+      if (!isset($config[$validator]))
+      {
+        // validator hasn't been registered
+        $error = sprintf('Configuration file "%s" specifies unregistered validator "%s"', $configFiles[0], $validator);
+        throw new sfParseException($error);
+      }
+
+      // has it already been registered?
+      if (isset($validators[$validator]))
+      {
+        continue;
+      }
+
+      if (!isset($config[$validator]['class']))
+      {
+        // missing class key
+        $error = sprintf('Configuration file "%s" specifies category "%s" with missing class key', $configFiles[0], $validator);
+        throw new sfParseException($error);
+      }
+
+      // create our validator
+      $validators[$validator]               = array();
+      $validators[$validator]['class']      = $config[$validator]['class'];
+      $validators[$validator]['file']       = null;
+      $validators[$validator]['parameters'] = null;
+
+      if (isset($config[$validator]['file']))
+      {
+        // we have a file for this validator
+        $file = $config[$validator]['file'];
+
+        // keyword replacement
+        $file = $this->replaceConstants($file);
+        $file = $this->replacePath($file);
+
+        if (!is_readable($file))
+        {
+          // file doesn't exist
+          $error = sprintf('Configuration file "%s" specifies category "%s" with nonexistent or unreadable file "%s"', $configFiles[0], $validator, $file);
+          throw new sfParseException($error);
+        }
+
+        $validators[$validator]['file'] = $file;
+      }
+
+      // parse parameters
+      $parameters = (isset($config[$validator]['param']) ? var_export($config[$validator]['param'], true) : 'null');
+
+      $validators[$validator]['parameters'] = $parameters;
+    }
+  }
+
+  /**
+   * Converts alternate format to standard format.
+   *
+   * @param array  Configuration data
+   */
+  protected function convertAlternate2Standard(&$config)
+  {
+    $defaultMethods = isset($config['methods']) ? $config['methods'] : array('post');
+    $config['methods'] = array();
+
+    // validators
+    if (isset($config['validators']))
+    {
+      foreach ((array) $config['validators'] as $validator => $params)
+      {
+        $config[$validator] = $params;
+      }
+
+      unset($config['validators']);
+    }
+
+    // names
+    $config['names'] = $config['fields'];
+    unset($config['fields']);
+
+    foreach ($config['names'] as $name => $values)
+    {
+      // validators
+      $validators = array();
+      foreach ($values as $validator => $params)
+      {
+        if (in_array($validator, array('required', 'group', 'group_msg', 'parent', 'file', 'methods')))
+        {
+          continue;
+        }
+
+        // class or validator
+        if (!isset($config[$validator]))
+        {
+          $config[$validator] = array('class' => $validator);
+        }
+
+        $validatorName = $validator;
+        if ($params)
+        {
+          // create a new validator
+          $validatorName = $validator.'_'.$name;
+          $config[$validatorName] = $config[$validator];
+          $config[$validatorName]['param'] = array_merge(isset($config[$validator]['param']) ? (array) $config[$validator]['param'] : array(), $params);
+        }
+
+        $validators[] = $validatorName;
+
+        unset($values[$validator]);
+      }
+      $values['validators'] = $validators;
+
+      // group
+      if (isset($values['group']) && isset($values['group_msg']))
+      {
+        $values['required_msg'] = $values['group_msg'];
+      }
+
+      // required
+      if (isset($values['required']))
+      {
+        $values['required_msg'] = $values['required']['msg'];
+        $values['required'] = true;
+      }
+      else
+      {
+        $values['required'] = false;
+      }
+
+      // methods
+      if (isset($values['methods']))
+      {
+        $methods = (array) $values['methods'];
+        unset($values['methods']);
+      }
+      else
+      {
+        $methods = $defaultMethods;
+      }
+      foreach ($methods as $method)
+      {
+        $config['methods'][$method][] = $name;
+      }
+
+      $config['names'][$name] = $values;
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfValidatorConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfViewConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfViewConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfViewConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,343 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfViewConfigHandler allows you to configure views.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfViewConfigHandler.class.php 3289 2007-01-15 21:28:51Z fabien $
+ */
+class sfViewConfigHandler extends sfYamlConfigHandler
+{
+  /**
+   * Executes this configuration handler.
+   *
+   * @param array An array of absolute filesystem path to a configuration file
+   *
+   * @return string Data to be written to a cache file
+   *
+   * @throws <b>sfConfigurationException</b> If a requested configuration file does not exist or is not readable
+   * @throws <b>sfParseException</b> If a requested configuration file is improperly formatted
+   * @throws <b>sfInitializationException</b> If a view.yml key check fails
+   */
+  public function execute($configFiles)
+  {
+    // set our required categories list and initialize our handler
+    $categories = array('required_categories' => array());
+    $this->initialize($categories);
+
+    // parse the yaml
+    $this->mergeConfig($this->parseYamls($configFiles));
+
+    // init our data array
+    $data = array();
+
+    $data[] = "\$context  = \$this->getContext();\n";
+    $data[] = "\$response = \$context->getResponse();\n\n";
+
+    // first pass: iterate through all view names to determine the real view name
+    $first = true;
+    foreach ($this->yamlConfig as $viewName => $values)
+    {
+      if ($viewName == 'all')
+      {
+        continue;
+      }
+
+      $data[] = ($first ? '' : 'else ')."if (\$this->actionName.\$this->viewName == '$viewName')\n".
+                "{\n";
+      $data[] = $this->addTemplate($viewName);
+      $data[] = "}\n";
+
+      $first = false;
+    }
+
+    // general view configuration
+    $data[] = ($first ? '' : "else\n{")."\n";
+    $data[] = $this->addTemplate($viewName);
+    $data[] = ($first ? '' : "}")."\n\n";
+
+    // second pass: iterate through all real view names
+    $first = true;
+    foreach ($this->yamlConfig as $viewName => $values)
+    {
+      if ($viewName == 'all')
+      {
+        continue;
+      }
+
+      $data[] = ($first ? '' : 'else ')."if (\$templateName.\$this->viewName == '$viewName')\n".
+                "{\n";
+
+      $data[] = $this->addLayout($viewName);
+      $data[] = $this->addComponentSlots($viewName);
+      $data[] = $this->addHtmlHead($viewName);
+      $data[] = $this->addEscaping($viewName);
+
+      $data[] = $this->addHtmlAsset($viewName);
+
+      $data[] = "}\n";
+
+      $first = false;
+    }
+
+    // general view configuration
+    $data[] = ($first ? '' : "else\n{")."\n";
+
+    $data[] = $this->addLayout();
+    $data[] = $this->addComponentSlots();
+    $data[] = $this->addHtmlHead();
+    $data[] = $this->addEscaping();
+
+    $data[] = $this->addHtmlAsset();
+    $data[] = ($first ? '' : "}")."\n";
+
+    // compile data
+    $retval = sprintf("<?php\n".
+                      "// auto-generated by sfViewConfigHandler\n".
+                      "// date: %s\n%s\n",
+                      date('Y/m/d H:i:s'), implode('', $data));
+
+    return $retval;
+  }
+
+  /**
+   * Merges assets and environement configuration.
+   *
+   * @param array A configuration array
+   */
+  protected function mergeConfig($myConfig)
+  {
+    // merge javascripts and stylesheets
+    $myConfig['all']['stylesheets'] = array_merge(isset($myConfig['default']['stylesheets']) && is_array($myConfig['default']['stylesheets']) ? $myConfig['default']['stylesheets'] : array(), isset($myConfig['all']['stylesheets']) && is_array($myConfig['all']['stylesheets']) ? $myConfig['all']['stylesheets'] : array());
+    unset($myConfig['default']['stylesheets']);
+
+    $myConfig['all']['javascripts'] = array_merge(isset($myConfig['default']['javascripts']) && is_array($myConfig['default']['javascripts']) ? $myConfig['default']['javascripts'] : array(), isset($myConfig['all']['javascripts']) && is_array($myConfig['all']['javascripts']) ? $myConfig['all']['javascripts'] : array());
+    unset($myConfig['default']['javascripts']);
+
+    // merge default and all
+    $myConfig['all'] = sfToolkit::arrayDeepMerge(
+      isset($myConfig['default']) && is_array($myConfig['default']) ? $myConfig['default'] : array(),
+      isset($myConfig['all']) && is_array($myConfig['all']) ? $myConfig['all'] : array()
+    );
+
+    unset($myConfig['default']);
+
+    $this->yamlConfig = $myConfig;
+  }
+
+  /**
+   * Adds a component slot statement to the data.
+   *
+   * @param string The view name
+   *
+   * @return string The PHP statement
+   */
+  protected function addComponentSlots($viewName = '')
+  {
+    $data = '';
+
+    $components = $this->mergeConfigValue('components', $viewName);
+    foreach ($components as $name => $component)
+    {
+      if (!is_array($component) || count($component) < 1)
+      {
+        $component = array(null, null);
+      }
+
+      $data .= "  \$this->setComponentSlot('$name', '{$component[0]}', '{$component[1]}');\n";
+      $data .= "  if (sfConfig::get('sf_logging_enabled')) \$context->getLogger()->info('{sfViewConfig} set component \"$name\" ({$component[0]}/{$component[1]})');\n";
+    }
+
+    return $data;
+  }
+
+  /**
+   * Adds a template setting statement to the data.
+   *
+   * @param string The view name
+   *
+   * @return string The PHP statement
+   */
+  protected function addTemplate($viewName = '')
+  {
+    $data = '';
+
+    $templateName = $this->getConfigValue('template', $viewName);
+    $defaultTemplateName = $templateName ? "'$templateName'" : '$this->actionName';
+
+    $data .= "  \$templateName = \$response->getParameter(\$this->moduleName.'_'.\$this->actionName.'_template', $defaultTemplateName, 'symfony/action/view');\n";
+    $data .= "  \$this->setTemplate(\$templateName.\$this->viewName.\$this->getExtension());\n";
+
+    return $data;
+  }
+
+  /**
+   * Adds a layour statement statement to the data.
+   *
+   * @param string The view name
+   *
+   * @return string The PHP statement
+   */
+  protected function addLayout($viewName = '')
+  {
+    $data = '';
+
+    if ($this->getConfigValue('has_layout', $viewName) && false !== $layout = $this->getConfigValue('layout', $viewName))
+    {
+      $data = "  \$this->setDecoratorTemplate('$layout'.\$this->getExtension());\n";
+    }
+
+    // For XMLHttpRequest, we want no layout by default
+    // So, we check if the user requested has_layout: true or if he gave a layout: name for this particular action
+    $localLayout = isset($this->yamlConfig[$viewName]['layout']) || isset($this->yamlConfig[$viewName]['has_layout']);
+    if (!$localLayout && $data)
+    {
+      $data = "  if (!\$context->getRequest()->isXmlHttpRequest())\n  {\n  $data  }\n";
+    }
+
+    return $data;
+  }
+
+  /**
+   * Adds http metas and metas statements to the data.
+   *
+   * @param string The view name
+   *
+   * @return string The PHP statement
+   */
+  protected function addHtmlHead($viewName = '')
+  {
+    $data = array();
+
+    foreach ($this->mergeConfigValue('http_metas', $viewName) as $httpequiv => $content)
+    {
+      $data[] = sprintf("  \$response->addHttpMeta('%s', '%s', false);", $httpequiv, str_replace('\'', '\\\'', $content));
+    }
+
+    foreach ($this->mergeConfigValue('metas', $viewName) as $name => $content)
+    {
+      $data[] = sprintf("  \$response->addMeta('%s', '%s', false, false);", $name, str_replace('\'', '\\\'', preg_replace('/&amp;(?=\w+;)/', '&', htmlentities($content, ENT_QUOTES, sfConfig::get('sf_charset')))));
+    }
+
+    return implode("\n", $data)."\n";
+  }
+
+  /**
+   * Adds stylesheets and javascripts statements to the data.
+   *
+   * @param string The view name
+   *
+   * @return string The PHP statement
+   */
+  protected function addHtmlAsset($viewName = '')
+  {
+    $data = array();
+    $omit = array();
+    $delete = array();
+    $delete_all = false;
+
+    // Merge the current view's stylesheets with the app's default stylesheets
+    $stylesheets = $this->mergeConfigValue('stylesheets', $viewName);
+    $tmp = array();
+    foreach ((array) $stylesheets as $css)
+    {
+      $position = '';
+      if (is_array($css))
+      {
+        $key = key($css);
+        $options = $css[$key];
+        if (isset($options['position']))
+        {
+          $position = $options['position'];
+          unset($options['position']);
+        }
+      }
+      else
+      {
+        $key = $css;
+        $options = array();
+      }
+
+      $key = $this->replaceConstants($key);
+
+      if ('-*' == $key)
+      {
+        $tmp = array();
+      }
+      else if ('-' == $key[0])
+      {
+        unset($tmp[substr($key, 1)]);
+      }
+      else
+      {
+        $tmp[$key] = sprintf("  \$response->addStylesheet('%s', '%s', %s);", $key, $position, str_replace("\n", '', var_export($options, true)));
+      }
+    }
+
+    $data = array_merge($data, array_values($tmp));
+
+    $omit = array();
+    $delete_all = false;
+
+    // Populate $javascripts with the values from ONLY the current view
+    $javascripts = $this->mergeConfigValue('javascripts', $viewName);
+    $tmp = array();
+    foreach ((array) $javascripts as $js)
+    {
+      $js = $this->replaceConstants($js);
+
+      if ('-*' == $js)
+      {
+        $tmp = array();
+      }
+      else if ('-' == $js[0])
+      {
+        unset($tmp[substr($js, 1)]);
+      }
+      else
+      {
+        $tmp[$js] = sprintf("  \$response->addJavascript('%s');", $js);
+      }
+    }
+
+    $data = array_merge($data, array_values($tmp));
+
+    return implode("\n", $data)."\n";
+  }
+
+  /**
+   * Adds an escaping statement to the data.
+   *
+   * @param string The view name
+   *
+   * @return string The PHP statement
+   */
+  protected function addEscaping($viewName = '')
+  {
+    $data = array();
+
+    $escaping = $this->getConfigValue('escaping', $viewName);
+
+    if (isset($escaping['strategy']))
+    {
+      $data[] = sprintf("  \$this->setEscaping(%s);", var_export($escaping['strategy'], true));
+    }
+
+    if (isset($escaping['method']))
+    {
+      $data[] = sprintf("  \$this->setEscapingMethod(%s);", var_export($escaping['method'], true));
+    }
+
+    return implode("\n", $data)."\n";
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfViewConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfYamlConfigHandler.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfYamlConfigHandler.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfYamlConfigHandler.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,134 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfYamlConfigHandler is a base class for YAML (.yml) configuration handlers. This class
+ * provides a central location for parsing YAML files and detecting required categories.
+ *
+ * @package    symfony
+ * @subpackage config
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfYamlConfigHandler.class.php 3203 2007-01-09 18:32:54Z fabien $
+ */
+abstract class sfYamlConfigHandler extends sfConfigHandler
+{
+  protected
+    $yamlConfig = null;
+
+  /**
+   * Parses an array of YAMLs files and merges them in one configuration array.
+   *
+   * @param array An array of configuration file paths
+   *
+   * @param array A merged configuration array
+   */
+  protected function parseYamls($configFiles)
+  {
+    $config = array();
+    foreach ($configFiles as $configFile)
+    {
+      $config = sfToolkit::arrayDeepMerge($config, $this->parseYaml($configFile));
+    }
+
+    return $config;
+  }
+
+  /**
+   * Parses a YAML (.yml) configuration file.
+   *
+   * @param string An absolute filesystem path to a configuration file
+   *
+   * @return string A parsed .yml configuration
+   *
+   * @throws sfConfigurationException If a requested configuration file does not exist or is not readable
+   * @throws sfParseException If a requested configuration file is improperly formatted
+   */
+  protected function parseYaml($configFile)
+  {
+    if (!is_readable($configFile))
+    {
+      // can't read the configuration
+      $error = sprintf('Configuration file "%s" does not exist or is not readable', $configFile);
+
+      throw new sfConfigurationException($error);
+    }
+
+    // parse our config
+    $config = sfYaml::load($configFile);
+
+    if ($config === false || $config === null)
+    {
+      // configuration couldn't be parsed
+      $error = sprintf('Configuration file "%s" could not be parsed', $configFile);
+      throw new sfParseException($error);
+    }
+
+    // get a list of the required categories
+    $categories = $this->getParameterHolder()->get('required_categories', array());
+    foreach ($categories as $category)
+    {
+      if (!isset($config[$category]))
+      {
+        $error = sprintf('Configuration file "%s" is missing "%s" category', $configFile, $category);
+        throw new sfParseException($error);
+      }
+    }
+
+    return $config;
+  }
+
+  /**
+   * Merges configuration values for a given key and category.
+   *
+   * @param string The key name
+   * @param string The category name
+   *
+   * @return string The value associated with this key name and category
+   */
+  protected function mergeConfigValue($keyName, $category)
+  {
+    $values = array();
+
+    if (isset($this->yamlConfig['all'][$keyName]) && is_array($this->yamlConfig['all'][$keyName]))
+    {
+      $values = $this->yamlConfig['all'][$keyName];
+    }
+
+    if ($category && isset($this->yamlConfig[$category][$keyName]) && is_array($this->yamlConfig[$category][$keyName]))
+    {
+      $values = array_merge($values, $this->yamlConfig[$category][$keyName]);
+    }
+
+    return $values;
+  }
+
+  /**
+   * Gets a configuration value for a given key and category.
+   *
+   * @param string The key name
+   * @param string The category name
+   * @param string The default value
+   *
+   * @return string The value associated with this key name and category
+   */
+  protected function getConfigValue($keyName, $category, $defaultValue = null)
+  {
+    if (isset($this->yamlConfig[$category][$keyName]))
+    {
+      return $this->yamlConfig[$category][$keyName];
+    }
+    else if (isset($this->yamlConfig['all'][$keyName]))
+    {
+      return $this->yamlConfig['all'][$keyName];
+    }
+
+    return $defaultValue;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/config/sfYamlConfigHandler.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfConsoleController.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfConsoleController.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfConsoleController.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * @package    symfony
+ * @subpackage controller
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfConsoleController.class.php 3204 2007-01-09 18:50:08Z fabien $
+ */
+class sfConsoleController extends sfController
+{
+  /**
+   * Dispatches a request.
+   *
+   * @param string A module name
+   * @param string An action name
+   * @param array  An associative array of parameters to be set
+   */
+  public function dispatch($moduleName, $actionName, $parameters = array())
+  {
+    try
+    {
+      // set parameters
+      $this->getContext()->getRequest()->getParameterHolder()->add($parameters);
+
+      // make the first request
+      $this->forward($moduleName, $actionName);
+    }
+    catch (sfException $e)
+    {
+      $e->printStackTrace();
+    }
+    catch (Exception $e)
+    {
+      // wrap non symfony exceptions
+      $sfException = new sfException();
+      $sfException->printStackTrace($e);
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfConsoleController.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfController.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfController.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfController.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,644 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfController directs application flow.
+ *
+ * @package    symfony
+ * @subpackage controller
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfController.class.php 3221 2007-01-11 07:33:23Z fabien $
+ */
+abstract class sfController
+{
+  protected
+    $context                  = null,
+    $controllerClasses        = array(),
+    $maxForwards              = 5,
+    $renderMode               = sfView::RENDER_CLIENT,
+    $viewCacheClassName       = null;
+
+  /**
+   * Indicates whether or not a module has a specific component.
+   *
+   * @param string A module name
+   * @param string An component name
+   *
+   * @return bool true, if the component exists, otherwise false
+   */
+  public function componentExists($moduleName, $componentName)
+  {
+    return $this->controllerExists($moduleName, $componentName, 'component', false);
+  }
+
+  /**
+   * Indicates whether or not a module has a specific action.
+   *
+   * @param string A module name
+   * @param string An action name
+   *
+   * @return bool true, if the action exists, otherwise false
+   */
+  public function actionExists($moduleName, $actionName)
+  {
+    return $this->controllerExists($moduleName, $actionName, 'action', false);
+  }
+
+  /**
+   * Looks for a controller and optionally throw exceptions if existence is required (i.e.
+   * in the case of {@link getController()}).
+   *
+   * @param string  The name of the module
+   * @param string  The name of the controller within the module
+   * @param string  Either 'action' or 'component' depending on the type of controller to look for
+   * @param boolean Whether to throw exceptions if the controller doesn't exist
+   *
+   * @throws sfConfigurationException thrown if the module is not enabled
+   * @throws sfControllerException thrown if the controller doesn't exist and the $throwExceptions parameter is set to true
+   *
+   * @return boolean true if the controller exists, false otherwise
+   */
+  protected function controllerExists($moduleName, $controllerName, $extension, $throwExceptions)
+  {
+    $dirs = sfLoader::getControllerDirs($moduleName);
+    foreach ($dirs as $dir => $checkEnabled)
+    {
+      // plugin module enabled?
+      if ($checkEnabled && !in_array($moduleName, sfConfig::get('sf_enabled_modules')) && is_readable($dir))
+      {
+        $error = 'The module "%s" is not enabled.';
+        $error = sprintf($error, $moduleName);
+
+        throw new sfConfigurationException($error);
+      }
+
+      // one action per file or one file for all actions
+      $classFile   = strtolower($extension);
+      $classSuffix = ucfirst(strtolower($extension));
+      $file        = $dir.'/'.$controllerName.$classSuffix.'.class.php';
+      if (is_readable($file))
+      {
+        // action class exists
+        require_once($file);
+
+        $this->controllerClasses[$moduleName.'_'.$controllerName.'_'.$classSuffix] = $controllerName.$classSuffix;
+
+        return true;
+      }
+
+      $module_file = $dir.'/'.$classFile.'s.class.php';
+      if (is_readable($module_file))
+      {
+        // module class exists
+        require_once($module_file);
+
+        if (!class_exists($moduleName.$classSuffix.'s', false))
+        {
+          if ($throwExceptions)
+          {
+            throw new sfControllerException(sprintf('There is no "%s" class in your action file "%s".', $moduleName.$classSuffix.'s', $module_file));
+          }
+
+          return false;
+        }
+
+        // action is defined in this class?
+        if (!in_array('execute'.ucfirst($controllerName), get_class_methods($moduleName.$classSuffix.'s')))
+        {
+          if ($throwExceptions)
+          {
+            throw new sfControllerException(sprintf('There is no "%s" method in your action class "%s"', 'execute'.ucfirst($controllerName), $moduleName.$classSuffix.'s'));
+          }
+
+          return false;
+        }
+
+        $this->controllerClasses[$moduleName.'_'.$controllerName.'_'.$classSuffix] = $moduleName.$classSuffix.'s';
+        return true;
+      }
+    }
+
+    // send an exception if debug
+    if ($throwExceptions && sfConfig::get('sf_debug'))
+    {
+      $dirs = array_keys($dirs);
+
+      // remove sf_root_dir from dirs
+      foreach ($dirs as &$dir)
+      {
+        $dir = str_replace(sfConfig::get('sf_root_dir'), '%SF_ROOT_DIR%', $dir);
+      }
+
+      throw new sfControllerException(sprintf('{sfController} controller "%s/%s" does not exist in: %s', $moduleName, $controllerName, implode(', ', $dirs)));
+    }
+
+    return false;
+  }
+
+  /**
+   * Forwards the request to another action.
+   *
+   * @param string  A module name
+   * @param string  An action name
+   *
+   * @throws <b>sfConfigurationException</b> If an invalid configuration setting has been found
+   * @throws <b>sfForwardException</b> If an error occurs while forwarding the request
+   * @throws <b>sfInitializationException</b> If the action could not be initialized
+   * @throws <b>sfSecurityException</b> If the action requires security but the user implementation is not of type sfSecurityUser
+   */
+  public function forward($moduleName, $actionName)
+  {
+    // replace unwanted characters
+    $moduleName = preg_replace('/[^a-z0-9\-_]+/i', '', $moduleName);
+    $actionName = preg_replace('/[^a-z0-9\-_]+/i', '', $actionName);
+
+    if ($this->getActionStack()->getSize() >= $this->maxForwards)
+    {
+      // let's kill this party before it turns into cpu cycle hell
+      $error = 'Too many forwards have been detected for this request (> %d)';
+      $error = sprintf($error, $this->maxForwards);
+
+      throw new sfForwardException($error);
+    }
+
+    $rootDir = sfConfig::get('sf_root_dir');
+    $app     = sfConfig::get('sf_app');
+    $env     = sfConfig::get('sf_environment');
+
+    if (!sfConfig::get('sf_available') || sfToolkit::hasLockFile($rootDir.'/'.$app.'_'.$env.'.clilock'))
+    {
+      // application is unavailable
+      $moduleName = sfConfig::get('sf_unavailable_module');
+      $actionName = sfConfig::get('sf_unavailable_action');
+
+      if (!$this->actionExists($moduleName, $actionName))
+      {
+        // cannot find unavailable module/action
+        $error = 'Invalid configuration settings: [sf_unavailable_module] "%s", [sf_unavailable_action] "%s"';
+        $error = sprintf($error, $moduleName, $actionName);
+
+        throw new sfConfigurationException($error);
+      }
+    }
+
+    // check for a module generator config file
+    sfConfigCache::getInstance()->import(sfConfig::get('sf_app_module_dir_name').'/'.$moduleName.'/'.sfConfig::get('sf_app_module_config_dir_name').'/generator.yml', true, true);
+
+    if (!$this->actionExists($moduleName, $actionName))
+    {
+      // the requested action doesn't exist
+      if (sfConfig::get('sf_logging_enabled'))
+      {
+        $this->getContext()->getLogger()->info('{sfController} action does not exist');
+      }
+
+      // track the requested module so we have access to the data in the error 404 page
+      $this->context->getRequest()->setAttribute('requested_action', $actionName);
+      $this->context->getRequest()->setAttribute('requested_module', $moduleName);
+
+      // switch to error 404 action
+      $moduleName = sfConfig::get('sf_error_404_module');
+      $actionName = sfConfig::get('sf_error_404_action');
+
+      if (!$this->actionExists($moduleName, $actionName))
+      {
+        // cannot find unavailable module/action
+        $error = 'Invalid configuration settings: [sf_error_404_module] "%s", [sf_error_404_action] "%s"';
+        $error = sprintf($error, $moduleName, $actionName);
+
+        throw new sfConfigurationException($error);
+      }
+    }
+
+    // create an instance of the action
+    $actionInstance = $this->getAction($moduleName, $actionName);
+
+    // add a new action stack entry
+    $this->getActionStack()->addEntry($moduleName, $actionName, $actionInstance);
+
+    // include module configuration
+    require(sfConfigCache::getInstance()->checkConfig(sfConfig::get('sf_app_module_dir_name').'/'.$moduleName.'/'.sfConfig::get('sf_app_module_config_dir_name').'/module.yml'));
+
+    // check if this module is internal
+    if ($this->getActionStack()->getSize() == 1 && sfConfig::get('mod_'.strtolower($moduleName).'_is_internal') && !sfConfig::get('sf_test'))
+    {
+      $error = 'Action "%s" from module "%s" cannot be called directly';
+      $error = sprintf($error, $actionName, $moduleName);
+
+      throw new sfConfigurationException($error);
+    }
+
+    if (sfConfig::get('mod_'.strtolower($moduleName).'_enabled'))
+    {
+      // module is enabled
+
+      // check for a module config.php
+      $moduleConfig = sfConfig::get('sf_app_module_dir').'/'.$moduleName.'/'.sfConfig::get('sf_app_module_config_dir_name').'/config.php';
+      if (is_readable($moduleConfig))
+      {
+        require_once($moduleConfig);
+      }
+
+      // initialize the action
+      if ($actionInstance->initialize($this->context))
+      {
+        // create a new filter chain
+        $filterChain = new sfFilterChain();
+        $this->loadFilters($filterChain, $actionInstance);
+
+        if ($moduleName == sfConfig::get('sf_error_404_module') && $actionName == sfConfig::get('sf_error_404_action'))
+        {
+          $this->getContext()->getResponse()->setStatusCode(404);
+          $this->getContext()->getResponse()->setHttpHeader('Status', '404 Not Found');
+
+          foreach (sfMixer::getCallables('sfController:forward:error404') as $callable)
+          {
+            call_user_func($callable, $this, $moduleName, $actionName);
+          }
+        }
+
+        // change i18n message source directory to our module
+        if (sfConfig::get('sf_i18n'))
+        {
+          $this->context->getI18N()->setMessageSourceDir(sfLoader::getI18NDir($moduleName), $this->context->getUser()->getCulture());
+        }
+
+        // process the filter chain
+        $filterChain->execute();
+      }
+      else
+      {
+        // action failed to initialize
+        $error = 'Action initialization failed for module "%s", action "%s"';
+        $error = sprintf($error, $moduleName, $actionName);
+
+        throw new sfInitializationException($error);
+      }
+    }
+    else
+    {
+      // module is disabled
+      $moduleName = sfConfig::get('sf_module_disabled_module');
+      $actionName = sfConfig::get('sf_module_disabled_action');
+
+      if (!$this->actionExists($moduleName, $actionName))
+      {
+        // cannot find mod disabled module/action
+        $error = 'Invalid configuration settings: [sf_module_disabled_module] "%s", [sf_module_disabled_action] "%s"';
+        $error = sprintf($error, $moduleName, $actionName);
+
+        throw new sfConfigurationException($error);
+      }
+
+      $this->forward($moduleName, $actionName);
+    }
+  }
+
+  /**
+   * Retrieves an sfAction implementation instance.
+   *
+   * @param  string A module name
+   * @param  string An action name
+   *
+   * @return sfAction An sfAction implementation instance, if the action exists, otherwise null
+   */
+  public function getAction($moduleName, $actionName)
+  {
+    return $this->getController($moduleName, $actionName, 'action');
+  }
+
+  /**
+   * Retrieves a sfComponent implementation instance.
+   *
+   * @param  string A module name
+   * @param  string A component name
+   *
+   * @return sfComponent A sfComponent implementation instance, if the component exists, otherwise null
+   */
+  public function getComponent($moduleName, $componentName)
+  {
+    return $this->getController($moduleName, $componentName, 'component');
+  }
+
+  /**
+   * Retrieves a controller implementation instance.
+   *
+   * @param  string A module name
+   * @param  string A component name
+   * @param  string  Either 'action' or 'component' depending on the type of controller to look for
+   *
+   * @return object A controller implementation instance, if the controller exists, otherwise null
+   *
+   * @see getComponent(), getAction()
+   */
+  protected function getController($moduleName, $controllerName, $extension)
+  {
+    $classSuffix = ucfirst(strtolower($extension));
+    if (!isset($this->controllerClasses[$moduleName.'_'.$controllerName.'_'.$classSuffix]))
+    {
+      $this->controllerExists($moduleName, $controllerName, $extension, true);
+    }
+
+    $class = $this->controllerClasses[$moduleName.'_'.$controllerName.'_'.$classSuffix];
+
+    // fix for same name classes
+    $moduleClass = $moduleName.'_'.$class;
+
+    if (class_exists($moduleClass, false))
+    {
+      $class = $moduleClass;
+    }
+
+    return new $class();
+  }
+
+  /**
+   * Retrieves the action stack.
+   *
+   * @return sfActionStack An sfActionStack instance, if the action stack is enabled, otherwise null
+   */
+  public function getActionStack()
+  {
+    return $this->context->getActionStack();
+  }
+
+  /**
+   * Retrieves the current application context.
+   *
+   * @return sfContext A sfContext instance
+   */
+  public function getContext()
+  {
+    return $this->context;
+  }
+
+  /**
+   * Retrieves the presentation rendering mode.
+   *
+   * @return int One of the following:
+   *             - sfView::RENDER_CLIENT
+   *             - sfView::RENDER_VAR
+   */
+  public function getRenderMode()
+  {
+    return $this->renderMode;
+  }
+
+  /**
+   * Retrieves a sfView implementation instance.
+   *
+   * @param string A module name
+   * @param string An action name
+   * @param string A view name
+   *
+   * @return sfView A sfView implementation instance, if the view exists, otherwise null
+   */
+  public function getView($moduleName, $actionName, $viewName)
+  {
+    // user view exists?
+    $file = sfConfig::get('sf_app_module_dir').'/'.$moduleName.'/'.sfConfig::get('sf_app_module_view_dir_name').'/'.$actionName.$viewName.'View.class.php';
+
+    if (is_readable($file))
+    {
+      require_once($file);
+
+      $class = $actionName.$viewName.'View';
+
+      // fix for same name classes
+      $moduleClass = $moduleName.'_'.$class;
+
+      if (class_exists($moduleClass, false))
+      {
+        $class = $moduleClass;
+      }
+    }
+    else
+    {
+      // view class (as configured in module.yml or defined in action)
+      $viewName = $this->getContext()->getRequest()->getAttribute($moduleName.'_'.$actionName.'_view_name', sfConfig::get('mod_'.strtolower($moduleName).'_view_class'), 'symfony/action/view');
+      $class    = sfCore::getClassPath($viewName.'View') ? $viewName.'View' : 'sfPHPView';
+    }
+
+    return new $class();
+  }
+
+  /**
+   * Initializes this controller.
+   *
+   * @param sfContext A sfContext implementation instance
+   */
+  public function initialize($context)
+  {
+    $this->context = $context;
+
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->context->getLogger()->info('{sfController} initialization');
+    }
+
+    // set max forwards
+    $this->maxForwards = sfConfig::get('sf_max_forwards');
+  }
+
+  /**
+   * Retrieves a new sfController implementation instance.
+   *
+   * @param string A sfController class name
+   *
+   * @return sfController A sfController implementation instance
+   *
+   * @throws sfFactoryException If a new controller implementation instance cannot be created
+   */
+  public static function newInstance($class)
+  {
+    try
+    {
+      // the class exists
+      $object = new $class();
+
+      if (!($object instanceof sfController))
+      {
+          // the class name is of the wrong type
+          $error = 'Class "%s" is not of the type sfController';
+          $error = sprintf($error, $class);
+
+          throw new sfFactoryException($error);
+      }
+
+      return $object;
+    }
+    catch (sfException $e)
+    {
+      $e->printStackTrace();
+    }
+  }
+
+  /**
+   * Sends and email from the current action.
+   *
+   * This methods calls a module/action with the sfMailView class.
+   *
+   * @param  string A module name
+   * @param  string An action name
+   *
+   * @return string The generated mail content
+   *
+   * @see sfMailView, getPresentationFor(), sfController
+   */
+  public function sendEmail($module, $action)
+  {
+    return $this->getPresentationFor($module, $action, 'sfMail');
+  }
+
+  /**
+   * Returns the rendered view presentation of a given module/action.
+   *
+   * @param  string A module name
+   * @param  string An action name
+   * @param  string A View class name
+   *
+   * @return string The generated content
+   */
+  public function getPresentationFor($module, $action, $viewName = null)
+  {
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfController} get presentation for action "'.$module.'/'.$action.'" (view class: "'.$viewName.'")');
+    }
+
+    // get original render mode
+    $renderMode = $this->getRenderMode();
+
+    // set render mode to var
+    $this->setRenderMode(sfView::RENDER_VAR);
+
+    // grab the action stack
+    $actionStack = $this->getActionStack();
+
+    // grab this next forward's action stack index
+    $index = $actionStack->getSize();
+
+    // set viewName if needed
+    if ($viewName)
+    {
+      $this->getContext()->getRequest()->setAttribute($module.'_'.$action.'_view_name', $viewName, 'symfony/action/view');
+    }
+
+    // forward to the mail action
+    $this->forward($module, $action);
+
+    // grab the action entry from this forward
+    $actionEntry = $actionStack->getEntry($index);
+
+    // get raw email content
+    $presentation =& $actionEntry->getPresentation();
+
+    // put render mode back
+    $this->setRenderMode($renderMode);
+
+    // remove the action entry
+    $nb = $actionStack->getSize() - $index;
+    while ($nb-- > 0)
+    {
+      $actionEntry = $actionStack->popEntry();
+
+      if ($actionEntry->getModuleName() == sfConfig::get('sf_login_module') && $actionEntry->getActionName() == sfConfig::get('sf_login_action'))
+      {
+        $error = 'Your mail action is secured but the user is not authenticated.';
+
+        throw new sfException($error);
+      }
+      else if ($actionEntry->getModuleName() == sfConfig::get('sf_secure_module') && $actionEntry->getActionName() == sfConfig::get('sf_secure_action'))
+      {
+        $error = 'Your mail action is secured but the user does not have access.';
+
+        throw new sfException($error);
+      }
+    }
+
+    // remove viewName
+    if ($viewName)
+    {
+      $this->getContext()->getRequest()->getAttributeHolder()->remove($module.'_'.$action.'_view_name', 'symfony/action/view');
+    }
+
+    return $presentation;
+  }
+
+  /**
+   * Sets the presentation rendering mode.
+   *
+   * @param int A rendering mode
+   *
+   * @throws sfRenderException If an invalid render mode has been set
+   */
+  public function setRenderMode($mode)
+  {
+    if ($mode == sfView::RENDER_CLIENT || $mode == sfView::RENDER_VAR || $mode == sfView::RENDER_NONE)
+    {
+      $this->renderMode = $mode;
+
+      return;
+    }
+
+    // invalid rendering mode type
+    $error = 'Invalid rendering mode: %s';
+    $error = sprintf($error, $mode);
+
+    throw new sfRenderException($error);
+  }
+
+  /**
+   * Indicates whether or not we were called using the CLI version of PHP.
+   *
+   * @return bool true, if using cli, otherwise false.
+   */
+  public function inCLI()
+  {
+    return 0 == strncasecmp(PHP_SAPI, 'cli', 3);
+  }
+
+  /**
+   * Loads application nad module filters.
+   *
+   * @param sfFilterChain A sfFilterChain instance
+   * @param sfAction      A sfAction instance
+   */
+  public function loadFilters($filterChain, $actionInstance)
+  {
+    $moduleName = $this->context->getModuleName();
+
+    require(sfConfigCache::getInstance()->checkConfig(sfConfig::get('sf_app_module_dir_name').'/'.$moduleName.'/'.sfConfig::get('sf_app_module_config_dir_name').'/filters.yml'));
+  }
+
+  /**
+   * Calls methods defined via the sfMixer class.
+   *
+   * @param string The method name
+   * @param array  The method arguments
+   *
+   * @return mixed The returned value of the called method
+   *
+   * @see sfMixer
+   */
+  public function __call($method, $arguments)
+  {
+    if (!$callable = sfMixer::getCallable('sfController:'.$method))
+    {
+      throw new sfException(sprintf('Call to undefined method sfController::%s', $method));
+    }
+
+    array_unshift($arguments, $this);
+
+    return call_user_func_array($callable, $arguments);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfController.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfFrontWebController.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfFrontWebController.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfFrontWebController.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,78 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfFrontWebController allows you to centralize your entry point in your web
+ * application, but at the same time allow for any module and action combination
+ * to be requested.
+ *
+ * @package    symfony
+ * @subpackage controller
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfFrontWebController.class.php 3502 2007-02-18 18:28:28Z fabien $
+ */
+class sfFrontWebController extends sfWebController
+{
+  /**
+   * Dispatches a request.
+   *
+   * This will determine which module and action to use by request parameters specified by the user.
+   */
+  public function dispatch()
+  {
+    try
+    {
+      if (sfConfig::get('sf_logging_enabled'))
+      {
+        $this->getContext()->getLogger()->info('{sfController} dispatch request');
+      }
+
+      // reinitialize filters (needed for unit and functional tests)
+      sfFilter::$filterCalled = array();
+
+      // determine our module and action
+      $request    = $this->getContext()->getRequest();
+      $moduleName = $request->getParameter('module');
+      $actionName = $request->getParameter('action');
+
+      // make the first request
+      $this->forward($moduleName, $actionName);
+    }
+    catch (sfException $e)
+    {
+      if (sfConfig::get('sf_test'))
+      {
+        throw $e;
+      }
+
+      $e->printStackTrace();
+    }
+    catch (Exception $e)
+    {
+      if (sfConfig::get('sf_test'))
+      {
+        throw $e;
+      }
+
+      try
+      {
+        // wrap non symfony exceptions
+        $sfException = new sfException();
+        $sfException->printStackTrace($e);
+      }
+      catch (Exception $e)
+      {
+        header('HTTP/1.0 500 Internal Server Error');
+      }
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfFrontWebController.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfRouting.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfRouting.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfRouting.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,633 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfRouting class controls the creation of URLs and parses URLs. It maps an array of parameters to URLs definition.
+ * Each map is called a route.
+ * It implements the Singleton pattern.
+ *
+ * Routing can be disabled when [sf_routing] is set to false.
+ *
+ * This class is based on the Routes class of Cake framework.
+ *
+ * @package    symfony
+ * @subpackage controller
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfRouting.class.php 3234 2007-01-11 21:09:21Z fabien $
+ */
+class sfRouting
+{
+  protected static
+    $instance           = null;
+
+  protected
+    $current_route_name = '',
+    $routes             = array();
+
+  /**
+  * Retrieve the singleton instance of this class.
+   *
+   * @return  sfRouting The sfRouting implementation instance
+   */
+  public static function getInstance()
+  {
+    if (!isset(self::$instance))
+    {
+      self::$instance = new sfRouting();
+    }
+
+    return self::$instance;
+  }
+
+  /**
+   * Sets the current route name.
+   *
+   * @param string The route name
+   */
+  protected function setCurrentRouteName($name)
+  {
+    $this->current_route_name = $name;
+  }
+
+  /**
+   * Gets the current route name.
+   *
+   * @return string The route name
+   */
+  public function getCurrentRouteName()
+  {
+    return $this->current_route_name;
+  }
+
+  /**
+   * Gets the internal URI for the current request.
+   *
+   * @param boolean Whether to give an internal URI with the route name (@route)
+   *                or with the module/action pair
+   *
+   * @return string The current internal URI
+   */
+  public function getCurrentInternalUri($with_route_name = false)
+  {
+    if ($this->current_route_name)
+    {
+      list($url, $regexp, $names, $names_hash, $defaults, $requirements, $suffix) = $this->routes[$this->current_route_name];
+
+      $request = sfContext::getInstance()->getRequest();
+
+      if ($with_route_name)
+      {
+        $internal_uri = '@'.$this->current_route_name;
+      }
+      else
+      {
+        $internal_uri = $request->getParameter('module', isset($defaults['module']) ? $defaults['module'] : '').'/'.$request->getParameter('action', isset($defaults['action']) ? $defaults['action'] : '');
+      }
+
+      $params = array();
+
+      // add parameters
+      foreach ($names as $name)
+      {
+        if ($name == 'module' || $name == 'action') continue;
+
+        $params[] = $name.'='.$request->getParameter($name, isset($defaults[$name]) ? $defaults[$name] : '');
+      }
+
+      // add * parameters if needed
+      if (strpos($url, '*'))
+      {
+        foreach ($request->getParameterHolder()->getAll() as $key => $value)
+        {
+          if ($key == 'module' || $key == 'action' || in_array($key, $names))
+          {
+            continue;
+          }
+
+          $params[] = $key.'='.$value;
+        }
+      }
+
+      // sort to guaranty unicity
+      sort($params);
+
+      return $internal_uri.($params ? '?'.implode('&', $params) : '');
+    }
+  }
+
+  /**
+   * Gets the current compiled route array.
+   *
+   * @return array The route array
+   */
+  public function getRoutes()
+  {
+    return $this->routes;
+  }
+
+  /**
+   * Sets the compiled route array.
+   *
+   * @param array The route array
+   *
+   * @return array The route array
+   */
+  public function setRoutes($routes)
+  {
+    return $this->routes = $routes;
+  }
+
+  /**
+   * Returns true if this instance has some routes.
+   *
+   * @return  boolean
+   */
+  public function hasRoutes()
+  {
+    return count($this->routes) ? true : false;
+  }
+
+  /**
+   * Returns true if the route name given is defined.
+   *
+   * @param string The route name
+   *
+   * @return  boolean
+   */
+  public function hasRouteName($name)
+  {
+    return isset($this->routes[$name]) ? true : false;
+  }
+
+  /**
+   * Gets a route by its name.
+   *
+   * @param string The route name
+   *
+   * @return  array A route array
+   */
+  public function getRouteByName($name)
+  {
+    if ($name[0] == '@')
+    {
+      $name = substr($name, 1);
+    }
+
+    if (!isset($this->routes[$name]))
+    {
+      $error = 'The route "%s" does not exist';
+      $error = sprintf($error, $name);
+
+      throw new sfConfigurationException($error);
+    }
+
+    return $this->routes[$name];
+  }
+
+  /**
+   * Clears all current routes.
+   */
+  public function clearRoutes()
+  {
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      sfLogger::getInstance()->info('{sfRouting} clear all current routes');
+    }
+
+    $this->routes = array();
+  }
+
+  /**
+   * Adds a new route at the beginning of the current list of routes.
+   *
+   * @see connect
+   */
+  public function prependRoute($name, $route, $default = array(), $requirements = array())
+  {
+    $routes = $this->routes;
+    $this->routes = array();
+    $newroutes = $this->connect($name, $route, $default, $requirements);
+    $this->routes = array_merge($newroutes, $routes);
+
+    return $this->routes;
+  }
+
+  /**
+   * Adds a new route.
+   *
+   * Alias for the connect method.
+   *
+   * @see connect
+   */
+  public function appendRoute($name, $route, $default = array(), $requirements = array())
+  {
+    return $this->connect($name, $route, $default, $requirements);
+  }
+
+ /**
+  * Adds a new route at the end of the current list of routes.
+  *
+  * A route string is a string with 2 special constructions:
+  * - :string: :string denotes a named paramater (available later as $request->getParameter('string'))
+  * - *: * match an indefinite number of parameters in a route
+  *
+  * Here is a very common rule in a symfony project:
+  *
+  * <code>
+  * $r->connect('/:module/:action/*');
+  * </code>
+  *
+  * @param  string The route name
+  * @param  string The route string
+  * @param  array  The default parameter values
+  * @param  array  The regexps parameters must match
+  *
+  * @return array  current routes
+  */
+  public function connect($name, $route, $default = array(), $requirements = array())
+  {
+    // route already exists?
+    if (isset($this->routes[$name]))
+    {
+      $error = 'This named route already exists ("%s").';
+      $error = sprintf($error, $name);
+
+      throw new sfConfigurationException($error);
+    }
+
+    $parsed = array();
+    $names  = array();
+    $suffix = (($sf_suffix = sfConfig::get('sf_suffix')) == '.') ? '' : $sf_suffix;
+
+    // used for performance reasons
+    $names_hash = array();
+
+    $r = null;
+    if (($route == '') || ($route == '/'))
+    {
+      $regexp = '/^[\/]*$/';
+      $this->routes[$name] = array($route, $regexp, array(), array(), $default, $requirements, $suffix);
+    }
+    else
+    {
+      $elements = array();
+      foreach (explode('/', $route) as $element)
+      {
+        if (trim($element))
+        {
+          $elements[] = $element;
+        }
+      }
+
+      if (!isset($elements[0]))
+      {
+        return false;
+      }
+
+      // specific suffix for this route?
+      // or /$ directory
+      if (preg_match('/^(.+)(\.\w*)$/i', $elements[count($elements) - 1], $matches))
+      {
+        $suffix = ($matches[2] == '.') ? '' : $matches[2];
+        $elements[count($elements) - 1] = $matches[1];
+        $route = '/'.implode('/', $elements);
+      }
+      else if ($route{strlen($route) - 1} == '/')
+      {
+        $suffix = '/';
+      }
+
+      $regexp_suffix = preg_quote($suffix);
+
+      foreach ($elements as $element)
+      {
+        if (preg_match('/^:(.+)$/', $element, $r))
+        {
+          $element = $r[1];
+
+          // regex is [^\/]+ or the requirement regex
+          if (isset($requirements[$element]))
+          {
+            $regex = $requirements[$element];
+            if (0 === strpos($regex, '^'))
+            {
+              $regex = substr($regex, 1);
+            }
+            if (strlen($regex) - 1 === strpos($regex, '$'))
+            {
+              $regex = substr($regex, 0, -1);
+            }
+          }
+          else
+          {
+            $regex = '[^\/]+';
+          }
+
+          $parsed[] = '(?:\/('.$regex.'))?';
+          $names[] = $element;
+          $names_hash[$element] = 1;
+        }
+        elseif (preg_match('/^\*$/', $element, $r))
+        {
+          $parsed[] = '(?:\/(.*))?';
+        }
+        else
+        {
+          $parsed[] = '/'.$element;
+        }
+      }
+      $regexp = '#^'.join('', $parsed).$regexp_suffix.'$#';
+
+      $this->routes[$name] = array($route, $regexp, $names, $names_hash, $default, $requirements, $suffix);
+    }
+
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      sfLogger::getInstance()->info('{sfRouting} connect "'.$route.'"'.($suffix ? ' ("'.$suffix.'" suffix)' : ''));
+    }
+
+    return $this->routes;
+  }
+
+ /**
+  * Generates a valid URLs for parameters.
+  *
+  * @param  array  The parameter values
+  * @param  string The divider between key/value pairs
+  * @param  string The equal sign to use between key and value
+  *
+  * @return string The generated URL
+  */
+  public function generate($name, $params, $querydiv = '/', $divider = '/', $equals = '/')
+  {
+    $global_defaults = sfConfig::get('sf_routing_defaults', null);
+
+    // named route?
+    if ($name)
+    {
+      if (!isset($this->routes[$name]))
+      {
+        $error = 'The route "%s" does not exist.';
+        $error = sprintf($error, $name);
+
+        throw new sfConfigurationException($error);
+      }
+
+      list($url, $regexp, $names, $names_hash, $defaults, $requirements, $suffix) = $this->routes[$name];
+      if ($global_defaults !== null)
+      {
+        $defaults = array_merge($defaults, $global_defaults);
+      }
+
+      // all params must be given
+      foreach ($names as $tmp)
+      {
+        if (!isset($params[$tmp]) && !isset($defaults[$tmp]))
+        {
+          throw new sfException(sprintf('Route named "%s" have a mandatory "%s" parameter', $name, $tmp));
+        }
+      }
+    }
+    else
+    {
+      // find a matching route
+      $found = false;
+      foreach ($this->routes as $name => $route)
+      {
+        list($url, $regexp, $names, $names_hash, $defaults, $requirements, $suffix) = $route;
+        if ($global_defaults !== null)
+        {
+          $defaults = array_merge($defaults, $global_defaults);
+        }
+
+        $tparams = array_merge($defaults, $params);
+
+        // we must match all names (all $names keys must be in $params array)
+        foreach ($names as $key)
+        {
+          if (!isset($tparams[$key])) continue 2;
+        }
+
+        // we must match all defaults with value except if present in names
+        foreach ($defaults as $key => $value)
+        {
+          if (isset($names_hash[$key])) continue;
+
+          if (!isset($tparams[$key]) || $tparams[$key] != $value) continue 2;
+        }
+
+        // we must match all requirements for rule
+        foreach ($requirements as $req_param => $req_regexp)
+        {
+          if (!preg_match('/'.str_replace('/', '\\/', $req_regexp).'/', $tparams[$req_param]))
+          {
+            continue 2;
+          }
+        }
+
+        // we must have consumed all $params keys if there is no * in route
+        if (!strpos($url, '*'))
+        {
+          if (count(array_diff(array_keys($tparams), $names, array_keys($defaults))))
+          {
+            continue;
+          }
+        }
+
+        // match found
+        $found = true;
+        break;
+      }
+
+      if (!$found)
+      {
+        $error = 'Unable to find a matching routing rule to generate url for params "%s".';
+        $error = sprintf($error, var_export($params));
+
+        throw new sfConfigurationException($error);
+      }
+    }
+
+    $params = array_merge($defaults, $params);
+
+    $real_url = preg_replace('/\:([^\/]+)/e', 'urlencode($params["\\1"])', $url);
+
+    // we add all other params if *
+    if (strpos($real_url, '*'))
+    {
+      $tmp = '';
+
+      foreach ($params as $key => $value)
+      {
+        if (isset($names_hash[$key]) || isset($defaults[$key])) continue;
+
+        if (is_array($value))
+        {
+          foreach ($value as $v)
+          {
+            $tmp .= $key.$equals.urlencode($v).$divider;
+          }
+        }
+        else
+        {
+          $tmp .= urlencode($key).$equals.urlencode($value).$divider;
+        }
+      }
+      if (strlen($tmp) > 0)
+      {
+        $tmp = $querydiv.$tmp;
+      }
+      $real_url = preg_replace('/\/\*(\/|$)/', $tmp, $real_url);
+    }
+
+    // strip off last divider character
+    if (strlen($real_url) > 1)
+    {
+      $real_url = rtrim($real_url, $divider);
+    }
+
+    if ($real_url != '/')
+    {
+      $real_url .= $suffix;
+    }
+
+    return $real_url;
+  }
+
+ /**
+  * Parses a URL to find a matching route.
+  *
+  * Returns null if no route match the URL.
+  *
+  * @param  string URL to be parsed
+  *
+  * @return array  An array of parameters
+  */
+  public function parse($url)
+  {
+    // an URL should start with a '/', mod_rewrite doesn't respect that, but no-mod_rewrite version does.
+    if ($url && ('/' != $url[0]))
+    {
+      $url = '/'.$url;
+    }
+
+    // we remove the query string
+    if ($pos = strpos($url, '?'))
+    {
+      $url = substr($url, 0, $pos);
+    }
+
+    // we remove multiple /
+    $url = preg_replace('#/+#', '/', $url);
+    foreach ($this->routes as $route_name => $route)
+    {
+      $out = array();
+      $r = null;
+
+      list($route, $regexp, $names, $names_hash, $defaults, $requirements, $suffix) = $route;
+
+      $break = false;
+
+      if (preg_match($regexp, $url, $r))
+      {
+        $break = true;
+
+        // remove the first element, which is the url
+        array_shift($r);
+
+        // hack, pre-fill the default route names
+        foreach ($names as $name)
+        {
+          $out[$name] = null;
+        }
+
+        // defaults
+        foreach ($defaults as $name => $value)
+        {
+          if (preg_match('#[a-z_\-]#i', $name))
+          {
+            $out[$name] = urldecode($value);
+          }
+          else
+          {
+            $out[$value] = true;
+          }
+        }
+
+        $pos = 0;
+        foreach ($r as $found)
+        {
+          // if $found is a named url element (i.e. ':action')
+          if (isset($names[$pos]))
+          {
+            $out[$names[$pos]] = urldecode($found);
+          }
+          // unnamed elements go in as 'pass'
+          else
+          {
+            $pass = explode('/', $found);
+            $found = '';
+            for ($i = 0, $max = count($pass); $i < $max; $i += 2)
+            {
+              if (!isset($pass[$i + 1])) continue;
+
+              $found .= $pass[$i].'='.$pass[$i + 1].'&';
+            }
+            parse_str($found, $pass);
+            foreach ($pass as $key => $value)
+            {
+              // we add this parameters if not in conflict with named url element (i.e. ':action')
+              if (!isset($names_hash[$key]))
+              {
+                $out[$key] = $value;
+              }
+            }
+          }
+          $pos++;
+        }
+
+        // we must have found all :var stuffs in url? except if default values exists
+        foreach ($names as $name)
+        {
+          if ($out[$name] == null)
+          {
+            $break = false;
+          }
+        }
+
+        if ($break)
+        {
+          // we store route name
+          $this->setCurrentRouteName($route_name);
+
+          if (sfConfig::get('sf_logging_enabled'))
+          {
+            sfLogger::getInstance()->info('{sfRouting} match route ['.$route_name.'] "'.$route.'"');
+          }
+
+          break;
+        }
+      }
+    }
+
+    // no route found
+    if (!$break)
+    {
+      if (sfConfig::get('sf_logging_enabled'))
+      {
+        sfLogger::getInstance()->info('{sfRouting} no matching route found');
+      }
+
+      return null;
+    }
+
+    return $out;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfRouting.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfWebController.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfWebController.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfWebController.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,227 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfWebController provides web specific methods to sfController such as, url redirection.
+ *
+ * @package    symfony
+ * @subpackage controller
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfWebController.class.php 3204 2007-01-09 18:50:08Z fabien $
+ */
+abstract class sfWebController extends sfController
+{
+  /**
+   * Generates an URL from an array of parameters.
+   *
+   * @param mixed   An associative array of URL parameters or an internal URI as a string.
+   * @param boolean Whether to generate an absolute URL
+   *
+   * @return string A URL to a symfony resource
+   */
+  public function genUrl($parameters = array(), $absolute = false)
+  {
+    // absolute URL or symfony URL?
+    if (!is_array($parameters) && preg_match('#^[a-z]+\://#', $parameters))
+    {
+      return $parameters;
+    }
+
+    if (!is_array($parameters) && $parameters == '#')
+    {
+      return $parameters;
+    }
+
+    $url = '';
+    if (!($sf_no_script_name = sfConfig::get('sf_no_script_name')))
+    {
+      $url = $this->getContext()->getRequest()->getScriptName();
+    }
+    else if (($sf_relative_url_root = $this->getContext()->getRequest()->getRelativeUrlRoot()) && $sf_no_script_name)
+    {
+      $url = $sf_relative_url_root;
+    }
+
+    $route_name = '';
+    $fragment = '';
+
+    if (!is_array($parameters))
+    {
+      // strip fragment
+      if (false !== ($pos = strpos($parameters, '#')))
+      {
+        $fragment = substr($parameters, $pos + 1);
+        $parameters = substr($parameters, 0, $pos);
+      }
+
+      list($route_name, $parameters) = $this->convertUrlStringToParameters($parameters);
+    }
+
+    if (sfConfig::get('sf_url_format') == 'PATH')
+    {
+      // use PATH format
+      $divider = '/';
+      $equals  = '/';
+      $querydiv = '/';
+    }
+    else
+    {
+      // use GET format
+      $divider = ini_get('arg_separator.output');
+      $equals  = '=';
+      $querydiv = '?';
+    }
+
+    // default module
+    if (!isset($parameters['module']))
+    {
+      $parameters['module'] = sfConfig::get('sf_default_module');
+    }
+
+    // default action
+    if (!isset($parameters['action']))
+    {
+      $parameters['action'] = sfConfig::get('sf_default_action');
+    }
+
+    $r = sfRouting::getInstance();
+    if ($r->hasRoutes() && $generated_url = $r->generate($route_name, $parameters, $querydiv, $divider, $equals))
+    {
+      $url .= $generated_url;
+    }
+    else
+    {
+      $query = http_build_query($parameters);
+
+      if (sfConfig::get('sf_url_format') == 'PATH')
+      {
+        $query = strtr($query, ini_get('arg_separator.output').'=', '/');
+      }
+
+      $url .= $query;
+    }
+
+    if ($absolute)
+    {
+      $request = $this->getContext()->getRequest();
+      $url = 'http'.($request->isSecure() ? 's' : '').'://'.$request->getHost().$url;
+    }
+
+    if ($fragment)
+    {
+      $url .= '#'.$fragment;
+    }
+
+    return $url;
+  }
+
+  /**
+   * Converts an internal URI string to an array of parameters.
+   *
+   * @param string An internal URI
+   *
+   * @return array An array of parameters
+   */
+  public function convertUrlStringToParameters($url)
+  {
+    $params       = array();
+    $query_string = '';
+    $route_name   = '';
+
+    // empty url?
+    if (!$url)
+    {
+      $url = '/';
+    }
+
+    // we get the query string out of the url
+    if ($pos = strpos($url, '?'))
+    {
+      $query_string = substr($url, $pos + 1);
+      $url = substr($url, 0, $pos);
+    }
+
+    // 2 url forms
+    // @route_name?key1=value1&key2=value2...
+    // module/action?key1=value1&key2=value2...
+
+    // first slash optional
+    if ($url[0] == '/')
+    {
+      $url = substr($url, 1);
+    }
+
+
+    // route_name?
+    if ($url[0] == '@')
+    {
+      $route_name = substr($url, 1);
+    }
+    else
+    {
+      $tmp = explode('/', $url);
+
+      $params['module'] = $tmp[0];
+      $params['action'] = isset($tmp[1]) ? $tmp[1] : sfConfig::get('sf_default_action');
+    }
+
+    // split the query string
+    if ($query_string)
+    {
+      $matched = preg_match_all('/
+        ([^&=]+)            # key
+        =                   # =
+        (.*?)               # value
+        (?:
+          (?=&[^&=]+=) | $   # followed by another key= or the end of the string
+        )
+      /x', $query_string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
+      foreach ($matches as $match)
+      {
+        $params[$match[1][0]] = $match[2][0];
+      }
+
+      // check that all string is matched
+      if (!$matched)
+      {
+        throw new sfParseException(sprintf('Unable to parse query string "%s".', $query_string));
+      }
+    }
+
+    return array($route_name, $params);
+  }
+
+  /**
+   * Redirects the request to another URL.
+   *
+   * @param string An existing URL
+   * @param int    A delay in seconds before redirecting. This is only needed on
+   *               browsers that do not support HTTP headers
+   * @param int    The status code
+   */
+  public function redirect($url, $delay = 0, $statusCode = 302)
+  {
+    $response = $this->getContext()->getResponse();
+
+    // redirect
+    $response->clearHttpHeaders();
+    $response->setStatusCode($statusCode);
+    $response->setHttpHeader('Location', $url);
+    $response->setContent(sprintf('<html><head><meta http-equiv="refresh" content="%d;url=%s"/></head></html>', $delay, htmlentities($url, ENT_QUOTES, sfConfig::get('sf_charset'))));
+
+    if (!sfConfig::get('sf_test'))
+    {
+      $response->sendHttpHeaders();
+    }
+    $response->sendContent();
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/controller/sfWebController.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfDatabase.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfDatabase.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfDatabase.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,163 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfDatabase is a base abstraction class that allows you to setup any type of
+ * database connection via a configuration file.
+ *
+ * @package    symfony
+ * @subpackage database
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfDatabase.class.php 3210 2007-01-10 20:28:16Z fabien $
+ */
+abstract class sfDatabase
+{
+  protected
+    $connection      = null,
+    $parameterHolder = null,
+    $resource        = null;
+
+  /**
+   * Connects to the database.
+   *
+   * @throws <b>sfDatabaseException</b> If a connection could not be created
+   */
+  abstract function connect();
+
+  /**
+   * Retrieves the database connection associated with this sfDatabase implementation.
+   *
+   * When this is executed on a Database implementation that isn't an
+   * abstraction layer, a copy of the resource will be returned.
+   *
+   * @return mixed A database connection
+   *
+   * @throws <b>sfDatabaseException</b> If a connection could not be retrieved
+   */
+  public function getConnection()
+  {
+    if ($this->connection == null)
+    {
+      $this->connect();
+    }
+
+    return $this->connection;
+  }
+
+  /**
+   * Retrieves a raw database resource associated with this sfDatabase implementation.
+   *
+   * @return mixed A database resource
+   *
+   * @throws <b>sfDatabaseException</b> If a resource could not be retrieved
+   */
+  public function getResource()
+  {
+    if ($this->resource == null)
+    {
+      $this->connect();
+    }
+
+    return $this->resource;
+  }
+
+  /**
+   * Initializes this sfDatabase object.
+   *
+   * @param array An associative array of initialization parameters
+   *
+   * @return bool true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this sfDatabase object
+   */
+  public function initialize($parameters = array())
+  {
+    $this->parameterHolder = new sfParameterHolder();
+    $this->parameterHolder->add($parameters);
+  }
+
+  /**
+   * Gets the parameter holder for this object.
+   *
+   * @return sfParameterHolder A sfParameterHolder instance
+   */
+  public function getParameterHolder()
+  {
+    return $this->parameterHolder;
+  }
+
+  /**
+   * Gets the parameter associated with the given key.
+   *
+   * This is a shortcut for:
+   *
+   * <code>$this->getParameterHolder()->get()</code>
+   *
+   * @param string The key name
+   * @param string The default value
+   * @param string The namespace to use
+   *
+   * @return string The value associated with the key
+   *
+   * @see sfParameterHolder
+   */
+  public function getParameter($name, $default = null, $ns = null)
+  {
+    return $this->parameterHolder->get($name, $default, $ns);
+  }
+
+  /**
+   * Returns true if the given key exists in the parameter holder.
+   *
+   * This is a shortcut for:
+   *
+   * <code>$this->getParameterHolder()->has()</code>
+   *
+   * @param string The key name
+   * @param string The namespace to use
+   *
+   * @return boolean true if the given key exists, false otherwise
+   *
+   * @see sfParameterHolder
+   */
+  public function hasParameter($name, $ns = null)
+  {
+    return $this->parameterHolder->has($name, $ns);
+  }
+
+  /**
+   * Sets the value for the given key.
+   *
+   * This is a shortcut for:
+   *
+   * <code>$this->getParameterHolder()->set()</code>
+   *
+   * @param string The key name
+   * @param string The value
+   * @param string The namespace to use
+   *
+   * @see sfParameterHolder
+   */
+  public function setParameter($name, $value, $ns = null)
+  {
+    $this->parameterHolder->set($name, $value, $ns);
+  }
+
+  /**
+   * Executes the shutdown procedure.
+   *
+   * @return void
+   *
+   * @throws <b>sfDatabaseException</b> If an error occurs while shutting down this database
+   */
+  abstract function shutdown();
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfDatabase.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfDatabaseManager.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfDatabaseManager.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfDatabaseManager.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfDatabaseManager allows you to setup your database connectivity before the
+ * request is handled. This eliminates the need for a filter to manage database
+ * connections.
+ *
+ * @package    symfony
+ * @subpackage database
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfDatabaseManager.class.php 3210 2007-01-10 20:28:16Z fabien $
+ */
+class sfDatabaseManager
+{
+  protected
+    $databases = array();
+
+  /**
+   * Retrieves the database connection associated with this sfDatabase implementation.
+   *
+   * @param string A database name
+   *
+   * @return mixed A Database instance
+   *
+   * @throws <b>sfDatabaseException</b> If the requested database name does not exist
+   */
+  public function getDatabase($name = 'default')
+  {
+    if (isset($this->databases[$name]))
+    {
+      return $this->databases[$name];
+    }
+
+    // nonexistent database name
+    $error = 'Database "%s" does not exist';
+    $error = sprintf($error, $name);
+
+    throw new sfDatabaseException($error);
+  }
+
+  /**
+   * Initializes this sfDatabaseManager object
+   *
+   * @return bool true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this sfDatabaseManager object
+   */
+  public function initialize()
+  {
+    // load database configuration
+    require(sfConfigCache::getInstance()->checkConfig(sfConfig::get('sf_app_config_dir_name').'/databases.yml'));
+  }
+
+  /**
+   * Executes the shutdown procedure
+   *
+   * @return void
+   *
+   * @throws <b>sfDatabaseException</b> If an error occurs while shutting down this DatabaseManager
+   */
+  public function shutdown()
+  {
+    // loop through databases and shutdown connections
+    foreach ($this->databases as $database)
+    {
+      $database->shutdown();
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfDatabaseManager.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfMySQLDatabase.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfMySQLDatabase.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfMySQLDatabase.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,166 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfMySQLDatabase provides connectivity for the MySQL brand database.
+ *
+ * <b>Optional parameters:</b>
+ *
+ * # <b>database</b>   - [none]      - The database name.
+ * # <b>host</b>       - [localhost] - The database host.
+ * # <b>method</b>     - [normal]    - How to read connection parameters.
+ *                                     Possible values are normal, server, and
+ *                                     env. The normal method reads them from
+ *                                     the specified values. server reads them
+ *                                     from $_SERVER where the keys to retrieve
+ *                                     the values are what you specify the value
+ *                                     as in the settings. env reads them from
+ *                                     $_ENV and works like $_SERVER.
+ * # <b>password</b>   - [none]      - The database password.
+ * # <b>persistent</b> - [No]        - Indicates that the connection should be
+ *                                     persistent.
+ * # <b>username</b>       - [none]  - The database username.
+ *
+ * @package    symfony
+ * @subpackage database
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfMySQLDatabase.class.php 3329 2007-01-23 08:29:34Z fabien $
+ */
+class sfMySQLDatabase extends sfDatabase
+{
+  /**
+   * Connects to the database.
+   *
+   * @throws <b>sfDatabaseException</b> If a connection could not be created
+   */
+  public function connect()
+  {
+
+    // determine how to get our
+    $method = $this->getParameter('method', 'normal');
+
+    switch ($method)
+    {
+      case 'normal':
+        // get parameters normally
+        $database = $this->getParameter('database');
+        $host     = $this->getParameter('host', 'localhost');
+        $password = $this->getParameter('password');
+        $username = $this->getParameter('username');
+
+        break;
+
+      case 'server':
+        // construct a connection string from existing $_SERVER values
+        // and extract them to local scope
+        $parameters =& $this->loadParameters($_SERVER);
+        extract($parameters);
+
+        break;
+
+      case 'env':
+        // construct a connection string from existing $_ENV values
+        // and extract them to local scope
+        $string =& $this->loadParameters($_ENV);
+        extract($parameters);
+
+        break;
+
+      default:
+        // who knows what the user wants...
+        $error = 'Invalid MySQLDatabase parameter retrieval method "%s"';
+        $error = sprintf($error, $method);
+
+        throw new sfDatabaseException($error);
+    }
+
+    // let's see if we need a persistent connection
+    $persistent = $this->getParameter('persistent', false);
+    $connect    = ($persistent) ? 'mysql_pconnect' : 'mysql_connect';
+
+    if ($password == null)
+    {
+      if ($username == null)
+      {
+        $this->connection = @$connect($host);
+      }
+      else
+      {
+        $this->connection = @$connect($host, $username);
+      }
+    }
+    else
+    {
+      $this->connection = @$connect($host, $username, $password);
+    }
+
+    // make sure the connection went through
+    if ($this->connection === false)
+    {
+      // the connection's foobar'd
+      $error = 'Failed to create a MySQLDatabase connection';
+
+      throw new sfDatabaseException($error);
+    }
+
+    // select our database
+    if ($database != null && !@mysql_select_db($database, $this->connection))
+    {
+      // can't select the database
+      $error = 'Failed to select MySQLDatabase "%s"';
+      $error = sprintf($error, $database);
+
+      throw new sfDatabaseException($error);
+    }
+
+    // since we're not an abstraction layer, we copy the connection
+    // to the resource
+    $this->resource = $this->connection;
+  }
+
+  /**
+   * Loads connection parameters from an existing array.
+   *
+   * @return array An associative array of connection parameters
+   */
+  protected function & loadParameters(&$array)
+  {
+    // list of available parameters
+    $available = array('database', 'host', 'password', 'user');
+
+    $parameters = array();
+
+    foreach ($available as $parameter)
+    {
+      $$parameter = $this->getParameter($parameter);
+
+      $parameters[$parameter] = ($$parameter != null) ? $array[$$parameter] : null;
+    }
+
+    return $parameters;
+  }
+
+  /**
+   * Execute the shutdown procedure
+   *
+   * @return void
+   *
+   * @throws <b>sfDatabaseException</b> If an error occurs while shutting down this database
+   */
+  public function shutdown()
+  {
+    if ($this->connection != null)
+    {
+      @mysql_close($this->connection);
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfMySQLDatabase.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfPDODatabase.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfPDODatabase.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfPDODatabase.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,88 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfPDODatabase provides connectivity for the PDO database abstraction layer.
+ *
+ * @package    symfony
+ * @subpackage database
+ * @author     Daniel Swarbrick (daniel en pressure.net.nz)
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfPDODatabase.class.php 3210 2007-01-10 20:28:16Z fabien $
+ */
+class sfPDODatabase extends sfDatabase
+{
+  /**
+   * Connects to the database.
+   *
+   * @throws <b>sfDatabaseException</b> If a connection could not be created
+   */
+  public function connect()
+  {
+    // determine how to get our parameters
+    $method = $this->getParameter('method', 'dsn');
+
+    // get parameters
+    switch ($method)
+    {
+      case 'dsn':
+        $dsn = $this->getParameter('dsn');
+
+        if ($dsn == null)
+        {
+          // missing required dsn parameter
+          $error = 'Database configuration specifies method "dsn", but is missing dsn parameter';
+
+          throw new sfDatabaseException($error);
+        }
+
+        break;
+    }
+
+    try
+    {
+      $pdo_username = $this->getParameter('username');
+      $pdo_password = $this->getParameter('password');
+
+      $this->connection = new PDO($dsn, $pdo_username, $pdo_password);
+    }
+    catch (PDOException $e)
+    {
+      throw new sfDatabaseException($e->getMessage());
+    }
+
+    // lets generate exceptions instead of silent failures
+    if (defined('PDO::ATTR_ERRMODE'))
+    {
+      $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+    }
+    else
+    {
+      $this->connection->setAttribute(PDO_ATTR_ERRMODE, PDO_ERRMODE_EXCEPTION);
+    }
+  }
+
+  /**
+   * Executes the shutdown procedure.
+   *
+   * @return void
+   *
+   * @throws <b>sfDatabaseException</b> If an error occurs while shutting down this database
+   */
+  public function shutdown()
+  {
+    if ($this->connection !== null)
+    {
+      $this->connection = null;
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfPDODatabase.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfPostgreSQLDatabase.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfPostgreSQLDatabase.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfPostgreSQLDatabase.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,147 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfPostgreSQLDatabase provides connectivity for the PostgreSQL brand database.
+ *
+ * <b>Optional parameters:</b>
+ *
+ * # <b>database</b>   - [none]      - The database name.
+ * # <b>host</b>       - [localhost] - The database host.
+ * # <b>method</b>     - [normal]    - How to read connection parameters.
+ *                                     Possible values are normal, server, and
+ *                                     env. The normal method reads them from
+ *                                     the specified values. server reads them
+ *                                     from $_SERVER where the keys to retrieve
+ *                                     the values are what you specify the value
+ *                                     as in the settings. env reads them from
+ *                                     $_ENV and works like $_SERVER.
+ * # <b>password</b>   - [none]      - The database password.
+ * # <b>persistent</b> - [No]        - Indicates that the connection should be
+ *                                     persistent.
+ * # <b>port</b>       - [none]      - TCP/IP port on which PostgreSQL is
+ *                                     listening.
+ * # <b>username</b>       - [none]  - The database username.
+ *
+ * @package    symfony
+ * @subpackage database
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfPostgreSQLDatabase.class.php 3210 2007-01-10 20:28:16Z fabien $
+ */
+class sfPostgreSQLDatabase extends sfDatabase
+{
+  /**
+   * Connects to the database.
+   *
+   * @throws <b>sfDatabaseException</b> If a connection could not be created
+   */
+  public function connect()
+  {
+    // determine how to get our parameters
+    $method = $this->getParameter('method', 'normal');
+
+    // get parameters
+    switch ($method)
+    {
+      case 'normal':
+        // get parameters normally
+        $database = $this->getParameter('database');
+        $host     = $this->getParameter('host');
+        $password = $this->getParameter('password');
+        $port     = $this->getParameter('port');
+        $username = $this->getParameter('username');
+
+        // construct connection string
+        $string = ($database != null ? (' dbname='   .$database) : '').
+                  ($host != null     ? (' host='     .$host)     : '').
+                  ($password != null ? (' password=' .$password) : '').
+                  ($port != null     ? (' port='     .$port)     : '').
+                  ($username != null ? (' user='     .$username) : '');
+
+        break;
+
+      case 'server':
+        // construct a connection string from existing $_SERVER values
+        $string = $this->loadParameters($_SERVER);
+
+        break;
+
+      case 'env':
+        // construct a connection string from existing $_ENV values
+        $string = $this->loadParameters($_ENV);
+
+        break;
+
+      default:
+        // who knows what the user wants...
+        $error = 'Invalid PostgreSQLDatabase parameter retrieval method "%s"';
+        $error = sprintf($error, $method);
+
+        throw new sfDatabaseException($error);
+    }
+
+    // let's see if we need a persistent connection
+    $persistent = $this->getParameter('persistent', false);
+    $connect    = $persistent ? 'pg_pconnect' : 'pg_connect';
+
+    $this->connection = @$connect($string);
+
+    // make sure the connection went through
+    if ($this->connection === false)
+    {
+      // the connection's foobar'd
+      $error = 'Failed to create a PostgreSQLDatabase connection';
+
+      throw new sfDatabaseException($error);
+    }
+
+    // since we're not an abstraction layer, we copy the connection
+    // to the resource
+    $this->resource = $this->connection;
+  }
+
+  /**
+   * Loads connection parameters from an existing array.
+   *
+   * @return string A connection string
+   */
+  protected function loadParameters(&$array)
+  {
+    $database = $this->getParameter('database');
+    $host     = $this->getParameter('host');
+    $password = $this->getParameter('password');
+    $port     = $this->getParameter('port');
+    $username = $this->getParameter('username');
+
+    // construct connection string
+    $string = ($database != null ? (' dbname='  .$array[$database]) : '').
+              ($host != null     ? (' host='    .$array[$host])     : '').
+              ($password != null ? (' password='.$array[$password]) : '').
+              ($port != null     ? (' port='    .$array[$port])     : '').
+              ($username != null ? (' user='    .$array[$username]) : '');
+
+    return $string;
+  }
+
+  /**
+   * Executes the shutdown procedure.
+   *
+   * @throws <b>sfDatabaseException</b> If an error occurs while shutting down this database
+   */
+  public function shutdown()
+  {
+    if ($this->connection != null)
+    {
+      @pg_close($this->connection);
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/database/sfPostgreSQLDatabase.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfDebug.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfDebug.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfDebug.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,165 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfDebug provides some method to help debugging a symfony application.
+ *
+ * @package    symfony
+ * @subpackage debug
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfDebug.class.php 3492 2007-02-18 09:10:54Z fabien $
+ */
+class sfDebug
+{
+  /**
+   * Returns PHP information as an array.
+   *
+   * @return array An array of php information
+   */
+  public static function phpInfoAsArray()
+  {
+    $values = array(
+      'php'        => phpversion(),
+      'os'         => php_uname(),
+      'extensions' => get_loaded_extensions(),
+    );
+
+    return $values;
+  }
+
+  /**
+   * Returns PHP globals variables as a sorted array.
+   *
+   * @return array PHP globals
+   */
+  public static function globalsAsArray()
+  {
+    $values = array();
+    foreach (array('cookie', 'server', 'get', 'post', 'files', 'env', 'session') as $name)
+    {
+      if (!isset($GLOBALS['_'.strtoupper($name)]))
+      {
+        continue;
+      }
+
+      $values[$name] = array();
+      foreach ($GLOBALS['_'.strtoupper($name)] as $key => $value)
+      {
+        $values[$name][$key] = $value;
+      }
+      ksort($values[$name]);
+    }
+
+    ksort($values);
+
+    return $values;
+  }
+
+  /**
+   * Returns sfConfig variables as a sorted array.
+   *
+   * @return array sfConfig variables
+   */
+  public static function settingsAsArray()
+  {
+    $config = sfConfig::getAll();
+
+    ksort($config);
+
+    return $config;
+  }
+
+  /**
+   * Returns request parameter holders as an array.
+   *
+   * @param sfRequest A sfRequest instance
+   *
+   * @return array The request parameter holders
+   */
+  public static function requestAsArray($request)
+  {
+    if ($request)
+    {
+      $values = array(
+        'parameterHolder' => self::flattenParameterHolder($request->getParameterHolder()),
+        'attributeHolder' => self::flattenParameterHolder($request->getAttributeHolder()),
+      );
+    }
+    else
+    {
+      $values = array('parameterHolder' => array(), 'attributeHolder' => array());
+    }
+
+    return $values;
+  }
+
+  /**
+   * Returns response parameters as an array.
+   *
+   * @param sfResponse A sfResponse instance
+   *
+   * @return array The response parameters
+   */
+  public static function responseAsArray($response)
+  {
+    if ($response)
+    {
+      $values = array(
+        'cookies'         => array(),
+        'httpHeaders'     => array(),
+        'parameterHolder' => self::flattenParameterHolder($response->getParameterHolder()),
+      );
+      if (method_exists($response, 'getHttpHeaders'))
+      {
+        foreach ($response->getHttpHeaders() as $key => $value)
+        {
+          $values['httpHeaders'][$key] = $value;
+        }
+      }
+
+      $cookies = array();
+      foreach ($response->getCookies() as $key => $value)
+      {
+        $values['cookies'][$key] = $value;
+      }
+    }
+    else
+    {
+      $values = array('cookies' => array(), 'httpHeaders' => array(), 'parameterHolder' => array());
+    }
+
+    return $values;
+  }
+
+  /**
+   * Returns a parameter holder as an array.
+   *
+   * @param sfParameterHolder A sfParameterHolder instance
+   *
+   * @return array The parameter holder as an array
+   */
+  public static function flattenParameterHolder($parameterHolder)
+  {
+    $values = array();
+    foreach ($parameterHolder->getNamespaces() as $ns)
+    {
+      $values[$ns] = array();
+      foreach ($parameterHolder->getAll($ns) as $key => $value)
+      {
+        $values[$ns][$key] = $value;
+      }
+      ksort($values[$ns]);
+    }
+
+    ksort($values);
+
+    return $values;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfDebug.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfTimer.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfTimer.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfTimer.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfTimer class allows to time some PHP code.
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfTimer.class.php 3411 2007-02-06 08:17:38Z fabien $
+ */
+class sfTimer
+{
+  protected
+    $startTime = null,
+    $totalTime = null,
+    $name = '',
+    $calls = 0;
+
+  /**
+   * Creates a new sfTimer instance.
+   *
+   * @param string The name of the timer
+   */
+  public function __construct($name = '')
+  {
+    $this->name = $name;
+    $this->startTimer();
+  }
+
+  /**
+   * Starts the timer.
+   */
+  public function startTimer()
+  {
+    $this->startTime = microtime(true);
+  }
+
+  /**
+   * Stops the timer and add the amount of time since the start to the total time.
+   *
+   * @return integer Time spend for the last call
+   */
+  public function addTime()
+  {
+    $spend = microtime(true) - $this->startTime;
+    $this->totalTime += $spend;
+    ++$this->calls;
+
+    return $spend;
+  }
+
+  /**
+   * Gets the number of calls this timer has been called to time code.
+   *
+   * @return integer Number of calls
+   */
+  public function getCalls()
+  {
+    return $this->calls;
+  }
+
+  /**
+   * Gets the total time elapsed for all calls of this timer.
+   *
+   * @return integer Time in milliseconds
+   */
+  public function getElapsedTime()
+  {
+    if (null === $this->totalTime)
+    {
+      $this->addTime();
+    }
+
+    return $this->totalTime;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfTimer.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfTimerManager.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfTimerManager.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfTimerManager.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfTimerManager is a container for sfTimer objects.
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfTimerManager.class.php 3211 2007-01-10 20:51:39Z fabien $
+ */
+class sfTimerManager
+{
+  static public $timers = array();
+
+  /**
+   * Gets a sfTimer instance.
+   *
+   * It returns the timer named $name or create a new one if it does not exist.
+   *
+   * @param string The name of the timer
+   *
+   * @return sfTimer The timer instance
+   */
+  public static function getTimer($name)
+  {
+    if (!isset(self::$timers[$name]))
+    {
+      self::$timers[$name] = new sfTimer($name);
+    }
+
+    self::$timers[$name]->startTimer();
+
+    return self::$timers[$name];
+  }
+
+  /**
+   * Gets all sfTimer instances stored in sfTimerManager.
+   *
+   * @return array An array of all sfTimer instances
+   */
+  public static function getTimers()
+  {
+    return self::$timers;
+  }
+
+  /**
+   * Clears all sfTimer instances stored in sfTimerManager.
+   */
+  public static function clearTimers()
+  {
+    self::$timers = array();
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfTimerManager.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfWebDebug.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfWebDebug.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfWebDebug.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,471 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfWebDebug creates debug information for easy debugging in the browser.
+ *
+ * @package    symfony
+ * @subpackage debug
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfWebDebug.class.php 3211 2007-01-10 20:51:39Z fabien $
+ */
+class sfWebDebug
+{
+  protected
+    $log             = array(),
+    $short_log       = array(),
+    $max_priority    = 1000,
+    $types           = array(),
+    $last_time_log   = -1;
+
+  protected static
+    $instance        = null;
+
+  public function initialize()
+  {
+  }
+
+  /**
+   * Retrieves the singleton instance of this class.
+   *
+   * @return sfWebDebug A sfWebDebug implementation instance
+   */
+  public static function getInstance()
+  {
+    if (!isset(self::$instance))
+    {
+      $class = __CLASS__;
+      self::$instance = new $class();
+      self::$instance->initialize();
+    }
+
+    return self::$instance;
+  }
+
+  /**
+   * Registers javascripts and stylesheets needed for the web debug toolbar.
+   */
+  public function registerAssets()
+  {
+    $response = sfContext::getInstance()->getResponse();
+
+    // register our css and js
+    $response->addJavascript(sfConfig::get('sf_web_debug_web_dir').'/js/main');
+    $response->addStylesheet(sfConfig::get('sf_web_debug_web_dir').'/css/main');
+  }
+
+  /**
+   * Logs a short message to be displayed in the web debug toolbar.
+   *
+   * @param string The message string
+   */
+  public function logShortMessage($message)
+  {
+    $this->short_log[] = $message;
+  }
+
+  /**
+   * Logs a message to the web debug toolbar.
+   *
+   * @param array An array of parameter
+   *
+   * @see sfWebDebugLogger
+   */
+  public function log($logEntry)
+  {
+    // elapsed time
+    if ($this->last_time_log == -1)
+    {
+      $this->last_time_log = sfConfig::get('sf_timer_start');
+    }
+
+    $this->last_time_log = microtime(true);
+
+    // update max priority
+    if ($logEntry['priority'] < $this->max_priority)
+    {
+      $this->max_priority = $logEntry['priority'];
+    }
+
+    // update types
+    if (!isset($this->types[$logEntry['type']]))
+    {
+      $this->types[$logEntry['type']] = 1;
+    }
+    else
+    {
+      ++$this->types[$logEntry['type']];
+    }
+
+    $this->log[] = $logEntry;
+  }
+
+  /**
+   * Loads helpers needed for the web debug toolbar.
+   */
+  protected function loadHelpers()
+  {
+    sfLoader::loadHelpers(array('Helper', 'Url', 'Asset', 'Tag', 'Javascript'));
+  }
+
+  /**
+   * Formats a log line.
+   *
+   * @param string The log line to format
+   *
+   * @return string The formatted log lin
+   */
+  protected function formatLogLine($log_line)
+  {
+    static $constants;
+
+    if (!$constants)
+    {
+      foreach (array('sf_app_dir', 'sf_root_dir', 'sf_symfony_lib_dir', 'sf_symfony_data_dir') as $constant)
+      {
+        $constants[realpath(sfConfig::get($constant)).DIRECTORY_SEPARATOR] = $constant.DIRECTORY_SEPARATOR;
+      }
+    }
+
+    // escape HTML
+    $log_line = htmlentities($log_line, ENT_QUOTES, sfConfig::get('sf_charset'));
+
+    // replace constants value with constant name
+    $log_line = str_replace(array_keys($constants), array_values($constants), $log_line);
+
+    $log_line = sfToolkit::pregtr($log_line, array('/&quot;(.+?)&quot;/s' => '"<span class="sfWebDebugLogInfo">\\1</span>"',
+                                                   '/^(.+?)\(\)\:/S'      => '<span class="sfWebDebugLogInfo">\\1()</span>:',
+                                                   '/line (\d+)$/'        => 'line <span class="sfWebDebugLogInfo">\\1</span>'));
+
+    // special formatting for SQL lines
+    $log_line = preg_replace('/\b(SELECT|FROM|AS|LIMIT|ASC|COUNT|DESC|WHERE|LEFT JOIN|INNER JOIN|RIGHT JOIN|ORDER BY|GROUP BY|IN|LIKE|DISTINCT|DELETE|INSERT|INTO|VALUES)\b/', '<span class="sfWebDebugLogInfo">\\1</span>', $log_line);
+
+    // remove username/password from DSN
+    if (strpos($log_line, 'DSN') !== false)
+    {
+      $log_line = preg_replace("/=&gt;\s+'?[^'\s,]+'?/", "=&gt; '****'", $log_line);
+    }
+
+    return $log_line;
+  }
+
+  /**
+   * Returns the web debug toolbar as HTML.
+   *
+   * @return string The web debug toolbar HTML
+   */
+  public function getResults()
+  {
+    if (!sfConfig::get('sf_web_debug'))
+    {
+      return '';
+    }
+
+    $this->loadHelpers();
+
+    $result = '';
+
+    // max priority
+    $max_priority = '';
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $max_priority = $this->getPriority($this->max_priority);
+    }
+
+    $logs = '';
+    $sql_logs = array();
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $logs = '<table class="sfWebDebugLogs">
+        <tr>
+          <th>#</th>
+          <th>type</th>
+          <th>message</th>
+        </tr>'."\n";
+      $line_nb = 0;
+      foreach ($this->log as $logEntry)
+      {
+        $log = $logEntry['message'];
+
+        $priority = $this->getPriority($logEntry['priority']);
+
+        if (strpos($type = $logEntry['type'], 'sf') === 0)
+        {
+          $type = substr($type, 2);
+        }
+
+        // xdebug information
+        $debug_info = '';
+        if ($logEntry['debugStack'])
+        {
+          $debug_info .= '&nbsp;<a href="#" onclick="sfWebDebugToggle(\'debug_'.$line_nb.'\'); return false;">'.image_tag(sfConfig::get('sf_web_debug_web_dir').'/images/toggle.gif').'</a><div class="sfWebDebugDebugInfo" id="debug_'.$line_nb.'" style="display:none">';
+          foreach ($logEntry['debugStack'] as $i => $log_line)
+          {
+            $debug_info .= '#'.$i.' &raquo; '.$this->formatLogLine($log_line).'<br/>';
+          }
+          $debug_info .= "</div>\n";
+        }
+
+        // format log
+        $log = $this->formatLogLine($log);
+
+        // sql queries log
+        if (preg_match('/execute(?:Query|Update).+?\:\s+(.+)$/', $log, $match))
+        {
+          $sql_logs[] .= $match[1];
+        }
+
+        ++$line_nb;
+        $logs .= sprintf("<tr class='sfWebDebugLogLine sfWebDebug%s %s'><td class=\"sfWebDebugLogNumber\">%s</td><td class=\"sfWebDebugLogType\">%s&nbsp;%s</td><td>%s%s</td></tr>\n", 
+          ucfirst($priority),
+          $logEntry['type'],
+          $line_nb,
+          image_tag(sfConfig::get('sf_web_debug_web_dir').'/images/'.$priority.'.png'),
+          $type,
+          $log,
+          $debug_info
+        );
+      }
+      $logs .= '</table>';
+
+      ksort($this->types);
+      $types = array();
+      foreach ($this->types as $type => $nb)
+      {
+        $types[] = '<a href="#" onclick="sfWebDebugToggleMessages(\''.$type.'\'); return false;">'.$type.'</a>';
+      }
+    }
+
+    // ignore cache link
+    $cacheLink = '';
+    if (sfConfig::get('sf_debug') && sfConfig::get('sf_cache'))
+    {
+      $self_url = $_SERVER['PHP_SELF'].((strpos($_SERVER['PHP_SELF'], '_sf_ignore_cache') === false) ? '?_sf_ignore_cache=1' : '');
+      $cacheLink = '<li><a href="'.$self_url.'" title="reload and ignore cache">'.image_tag(sfConfig::get('sf_web_debug_web_dir').'/images/reload.png').'</a></li>';
+    }
+
+    // logging information
+    $logLink = '';
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $logLink = '<li><a href="#" onclick="sfWebDebugShowDetailsFor(\'sfWebDebugLog\'); return false;">'.image_tag(sfConfig::get('sf_web_debug_web_dir').'/images/comment.png').' logs &amp; msgs</a></li>';
+    }
+
+    // database information
+    $dbInfo = '';
+    $dbInfoDetails = '';
+    if ($sql_logs)
+    {
+      $dbInfo = '<li><a href="#" onclick="sfWebDebugShowDetailsFor(\'sfWebDebugDatabaseDetails\'); return false;">'.image_tag(sfConfig::get('sf_web_debug_web_dir').'/images/database.png').' '.count($sql_logs).'</a></li>';
+
+      $dbInfoDetails = '
+        <div id="sfWebDebugDatabaseLogs">
+        <ol><li>'.implode("</li>\n<li>", $sql_logs).'</li></ol>
+        </div>
+      ';
+    }
+
+    // memory used
+    $memoryInfo = '';
+    if (sfConfig::get('sf_debug') && function_exists('memory_get_usage'))
+    {
+      $total_memory = sprintf('%.1f', (memory_get_usage() / 1024));
+      $memoryInfo = '<li>'.image_tag(sfConfig::get('sf_web_debug_web_dir').'/images/memory.png').' '.$total_memory.' KB</li>';
+    }
+
+    // total time elapsed
+    $timeInfo = '';
+    if (sfConfig::get('sf_debug'))
+    {
+      $total_time = (microtime(true) - sfConfig::get('sf_timer_start')) * 1000;
+      $total_time = sprintf(($total_time <= 1) ? '%.2f' : '%.0f', $total_time);
+      $timeInfo = '<li class="last"><a href="#" onclick="sfWebDebugShowDetailsFor(\'sfWebDebugTimeDetails\'); return false;">'.image_tag(sfConfig::get('sf_web_debug_web_dir').'/images/time.png').' '.$total_time.' ms</a></li>';
+    }
+
+    // timers
+    $timeInfoDetails = '<table class="sfWebDebugLogs" style="width: 300px"><tr><th>type</th><th>calls</th><th>time (ms)</th></tr>';
+    foreach (sfTimerManager::getTimers() as $name => $timer)
+    {
+      $timeInfoDetails .= sprintf('<tr><td class="sfWebDebugLogType">%s</td><td class="sfWebDebugLogNumber" style="text-align: right">%d</td><td style="text-align: right">%.2f</td></tr>', $name, $timer->getCalls(), $timer->getElapsedTime() * 1000);
+    }
+    $timeInfoDetails .= '</table>';
+
+    // short log messages
+    $short_messages = '';
+    if ($this->short_log)
+    {
+      $short_messages = '<ul id="sfWebDebugShortMessages"><li>&raquo;&nbsp;'.implode('</li><li>&raquo&nbsp;', $this->short_log).'</li></ul>';
+    }
+
+    // logs
+    $logInfo = '';
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $logInfo .= $short_messages.'
+        <ul id="sfWebDebugLogMenu">
+          <li><a href="#" onclick="sfWebDebugToggleAllLogLines(true, \'sfWebDebugLogLine\'); return false;">[all]</a></li>
+          <li><a href="#" onclick="sfWebDebugToggleAllLogLines(false, \'sfWebDebugLogLine\'); return false;">[none]</a></li>
+          <li><a href="#" onclick="sfWebDebugShowOnlyLogLines(\'info\'); return false;">'.image_tag(sfConfig::get('sf_web_debug_web_dir').'/images/info.png').'</a></li>
+          <li><a href="#" onclick="sfWebDebugShowOnlyLogLines(\'warning\'); return false;">'.image_tag(sfConfig::get('sf_web_debug_web_dir').'/images/warning.png').'</a></li>
+          <li><a href="#" onclick="sfWebDebugShowOnlyLogLines(\'error\'); return false;">'.image_tag(sfConfig::get('sf_web_debug_web_dir').'/images/error.png').'</a></li>
+          <li>'.implode("</li>\n<li>", $types).'</li>
+        </ul>
+        <div id="sfWebDebugLogLines">'.$logs.'</div>
+      ';
+    }
+
+    $result .= '
+    <div id="sfWebDebug">
+      <div id="sfWebDebugBar" class="sfWebDebug'.ucfirst($max_priority).'">
+        <a href="#" onclick="sfWebDebugToggleMenu(); return false;">'.image_tag(sfConfig::get('sf_web_debug_web_dir').'/images/sf.png').'</a>
+        <ul id="sfWebDebugDetails" class="menu">
+          <li>'.file_get_contents(sfConfig::get('sf_symfony_lib_dir').'/VERSION').'</li>
+          <li><a href="#" onclick="sfWebDebugShowDetailsFor(\'sfWebDebugConfig\'); return false;">'.image_tag(sfConfig::get('sf_web_debug_web_dir').'/images/config.png').' vars &amp; config</a></li>
+          '.$cacheLink.'
+          '.$logLink.'
+          '.$dbInfo.'
+          '.$memoryInfo.'
+          '.$timeInfo.'
+        </ul>
+        <a href="#" onclick="document.getElementById(\'sfWebDebug\').style.display=\'none\'; return false;">'.image_tag(sfConfig::get('sf_web_debug_web_dir').'/images/close.png').'</a>
+      </div>
+
+      <div id="sfWebDebugLog" class="top" style="display: none"><h1>Log and debug messages</h1>'.$logInfo.'</div>
+      <div id="sfWebDebugConfig" class="top" style="display: none"><h1>Configuration and request variables</h1>'.$this->getCurrentConfigAsHtml().'</div>
+      <div id="sfWebDebugDatabaseDetails" class="top" style="display: none"><h1>SQL queries</h1>'.$dbInfoDetails.'</div>
+      <div id="sfWebDebugTimeDetails" class="top" style="display: none"><h1>Timers</h1>'.$timeInfoDetails.'</div>
+
+      </div>
+    ';
+
+    return $result;
+  }
+
+  /**
+   * Returns the current configuration as HTML.
+   *
+   * @return string The current configuration as HTML
+   */
+  protected function getCurrentConfigAsHtml()
+  {
+    $config = array(
+      'debug'        => sfConfig::get('sf_debug')             ? 'on' : 'off',
+      'xdebug'       => (extension_loaded('xdebug'))          ? 'on' : 'off',
+      'logging'      => sfConfig::get('sf_logging_enabled')   ? 'on' : 'off',
+      'cache'        => sfConfig::get('sf_cache')             ? 'on' : 'off',
+      'eaccelerator' => (extension_loaded('eaccelerator') && ini_get('eaccelerator.enable')) ? 'on' : 'off',
+      'apc'          => (extension_loaded('apc') && ini_get('apc.enabled')) ? 'on' : 'off',
+      'xcache'       => (extension_loaded('xcache') && ini_get('xcache.cacher')) ? 'on' : 'off',
+      'compression'  => sfConfig::get('sf_compressed')        ? 'on' : 'off',
+      'syck'         => (extension_loaded('syck'))            ? 'on' : 'off',
+    );
+
+    $result = '<ul id="sfWebDebugConfigSummary">';
+    foreach ($config as $key => $value)
+    {
+      $result .= '<li class="is'.$value.''.($key == 'syck' ? ' last' : '').'">'.$key.'</li>';
+    }
+    $result .= '</ul>';
+
+    $context = sfContext::getInstance();
+    $result .= $this->formatArrayAsHtml('request',  sfDebug::requestAsArray($context->getRequest()));
+    $result .= $this->formatArrayAsHtml('response', sfDebug::responseAsArray($context->getResponse()));
+    $result .= $this->formatArrayAsHtml('settings', sfDebug::settingsAsArray());
+    $result .= $this->formatArrayAsHtml('globals',  sfDebug::globalsAsArray());
+    $result .= $this->formatArrayAsHtml('php',      sfDebug::phpInfoAsArray());
+
+    return $result;
+  }
+
+  /**
+   * Converts an array to HTML.
+   *
+   * @param string The identifier to use
+   * @param array  The array of values
+   *
+   * @return string An HTML string
+   */
+  protected function formatArrayAsHtml($id, $values)
+  {
+    $id = ucfirst(strtolower($id));
+    $content = '
+    <h2>'.$id.' <a href="#" onclick="sfWebDebugToggle(\'sfWebDebug'.$id.'\'); return false;">'.image_tag(sfConfig::get('sf_web_debug_web_dir').'/images/toggle.gif').'</a></h2>
+    <div id="sfWebDebug'.$id.'" style="display: none"><pre>'.htmlentities(@sfYaml::Dump($values), ENT_QUOTES, sfConfig::get('sf_charset')).'</pre></div>
+    ';
+
+    return $content;
+  }
+
+  /**
+   * Decorates a chunk of HTML with cache information.
+   *
+   * @param string  The internalUri representing the content
+   * @param string  The HTML content
+   * @param boolean true if the content is new in the cache, false otherwise
+   *
+   * @return string The decorated HTML string
+   */
+  public function decorateContentWithDebug($internalUri, $content, $new = false)
+  {
+    $context = sfContext::getInstance();
+
+    // don't decorate if not html or if content is null
+    if (!sfConfig::get('sf_web_debug') || !$content || false === strpos($context->getResponse()->getContentType(), 'html'))
+    {
+      return $content;
+    }
+
+    $cache = $context->getViewCacheManager();
+    $this->loadHelpers();
+
+    $bg_color      = $new ? '#9ff' : '#ff9';
+    $last_modified = $cache->lastModified($internalUri);
+    $id            = md5($internalUri);
+    $content = '
+      <div id="main_'.$id.'" class="sfWebDebugActionCache" style="border: 1px solid #f00">
+      <div id="sub_main_'.$id.'" class="sfWebDebugCache" style="background-color: '.$bg_color.'; border-right: 1px solid #f00; border-bottom: 1px solid #f00;">
+      <div style="height: 16px; padding: 2px"><a href="#" onclick="sfWebDebugToggle(\''.$id.'\'); return false;"><strong>cache information</strong></a>&nbsp;<a href="#" onclick="sfWebDebugToggle(\'sub_main_'.$id.'\'); document.getElementById(\'main_'.$id.'\').style.border = \'none\'; return false;">'.image_tag(sfConfig::get('sf_web_debug_web_dir').'/images/close.png').'</a>&nbsp;</div>
+        <div style="padding: 2px; display: none" id="'.$id.'">
+        [uri]&nbsp;'.$internalUri.'<br />
+        [life&nbsp;time]&nbsp;'.$cache->getLifeTime($internalUri).'&nbsp;seconds<br />
+        [last&nbsp;modified]&nbsp;'.(time() - $last_modified).'&nbsp;seconds<br />
+        &nbsp;<br />&nbsp;
+        </div>
+      </div><div>
+      '.$content.'
+      </div></div>
+    ';
+
+    return $content;
+  }
+
+  /**
+   * Converts a proprity value to a string.
+   *
+   * @param integer The priority value
+   *
+   * @return string The priority as a string
+   */
+  protected function getPriority($value)
+  {
+    if ($value >= 6)
+    {
+      return 'info';
+    }
+    else if ($value >= 4)
+    {
+      return 'warning';
+    }
+    else
+    {
+      return 'error';
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/debug/sfWebDebug.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfActionException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfActionException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfActionException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfActionException is thrown when an error occurs in an action.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfActionException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfActionException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfActionException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfActionException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfAutoloadException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfAutoloadException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfAutoloadException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfAutoloadException is thrown when a class that has been required cannot be loaded.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfAutoloadException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfAutoloadException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfAutoloadException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfAutoloadException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfCacheException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfCacheException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfCacheException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfCacheException is thrown when ConfigCache fails to execute properly.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfCacheException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfCacheException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfCacheException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfCacheException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfConfigurationException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfConfigurationException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfConfigurationException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfConfigurationException is thrown when the framework finds an error in a
+ * configuration setting.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfConfigurationException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfConfigurationException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfConfigurationException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfConfigurationException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfContextException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfContextException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfContextException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfContextException is thrown when an instance of the context has not been created.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfContextException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfContextException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    parent::__construct($message, $code);
+    $this->setName('sfContextException');
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfContextException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfControllerException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfControllerException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfControllerException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfControllerException is thrown when a requested Controller implementation
+ * doesn't exist.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfControllerException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfControllerException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfControllerException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfControllerException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfDatabaseException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfDatabaseException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfDatabaseException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfDatabaseException is thrown when a database related error occurs.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfDatabaseException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfDatabaseException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfDatabaseException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfDatabaseException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfError404Exception.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfError404Exception.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfError404Exception.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,42 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfError404Exception is thrown when a 404 error occurs in an action.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfError404Exception.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfError404Exception extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfError404Exception');
+    parent::__construct($message, $code);
+  }
+
+  /**
+   * Forwards to the 404 action.
+   *
+   * @param Exception An Exception implementation instance
+   */
+  public function printStackTrace($exception = null)
+  {
+    sfContext::getInstance()->getController()->forward(sfConfig::get('sf_error_404_module'), sfConfig::get('sf_error_404_action'));
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfError404Exception.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,295 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfException is the base class for all symfony related exceptions and
+ * provides an additional method for printing up a detailed view of an
+ * exception.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfException extends Exception
+{
+  protected
+    $name = null;
+
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    if ($this->getName() === null)
+    {
+      $this->setName('sfException');
+    }
+
+    parent::__construct($message, $code);
+
+    if (sfConfig::get('sf_logging_enabled') && $this->getName() != 'sfStopException')
+    {
+      sfLogger::getInstance()->err('{'.$this->getName().'} '.$message);
+    }
+  }
+
+  /**
+   * Retrieves the name of this exception.
+   *
+   * @return string This exception's name
+   */
+  public function getName()
+  {
+    return $this->name;
+  }
+
+  /**
+   * Prints the stack trace for this exception.
+   *
+   * @param Exception An Exception implementation instance
+   */
+  public function printStackTrace($exception = null)
+  {
+    if (!$exception)
+    {
+      $exception = $this;
+    }
+
+    // don't print message if it is an sfStopException exception
+    if (method_exists($exception, 'getName') && $exception->getName() == 'sfStopException')
+    {
+      if (!sfConfig::get('sf_test'))
+      {
+        exit(1);
+      }
+
+      return;
+    }
+
+    if (class_exists('sfMixer', false))
+    {
+      foreach (sfMixer::getCallables('sfException:printStackTrace:printStackTrace') as $callable)
+      {
+        $ret = call_user_func($callable, $this, $exception);
+        if ($ret)
+        {
+          if (!sfConfig::get('sf_test'))
+          {
+            exit(1);
+          }
+
+          return;
+        }
+      }
+    }
+
+    if (!sfConfig::get('sf_test'))
+    {
+      header('HTTP/1.0 500 Internal Server Error');
+
+      // clean current output buffer
+      while (@ob_end_clean());
+
+      ob_start(sfConfig::get('sf_compressed') ? 'ob_gzhandler' : '');
+    }
+
+    // send an error 500 if not in debug mode
+    if (!sfConfig::get('sf_debug'))
+    {
+      error_log($exception->getMessage());
+
+      $file = sfConfig::get('sf_web_dir').'/errors/error500.php';
+      include(is_readable($file) ? $file : sfConfig::get('sf_symfony_data_dir').'/web/errors/error500.php');
+
+      if (!sfConfig::get('sf_test'))
+      {
+        exit(1);
+      }
+
+      return;
+    }
+
+    $message = null !== $exception->getMessage() ? $exception->getMessage() : 'n/a';
+    $name    = get_class($exception);
+    $format  = 0 == strncasecmp(PHP_SAPI, 'cli', 3) ? 'plain' : 'html';
+    $traces  = $this->getTraces($exception, $format);
+
+    // extract error reference from message
+    $error_reference = '';
+    if (preg_match('/\[(err\d+)\]/', $message, $matches))
+    {
+      $error_reference = $matches[1];
+    }
+
+    // dump main objects values
+    $sf_settings = '';
+    $settingsTable = $requestTable = $responseTable = $globalsTable = '';
+    if (class_exists('sfContext', false) && sfContext::hasInstance())
+    {
+      $context = sfContext::getInstance();
+      $settingsTable = $this->formatArrayAsHtml(sfDebug::settingsAsArray());
+      $requestTable  = $this->formatArrayAsHtml(sfDebug::requestAsArray($context->getRequest()));
+      $responseTable = $this->formatArrayAsHtml(sfDebug::responseAsArray($context->getResponse()));
+      $globalsTable  = $this->formatArrayAsHtml(sfDebug::globalsAsArray());
+    }
+
+    include(sfConfig::get('sf_symfony_data_dir').'/data/exception.'.($format == 'html' ? 'php' : 'txt'));
+
+    // if test, do not exit
+    if (!sfConfig::get('sf_test'))
+    {
+      exit(1);
+    }
+  }
+
+  /**
+   * Returns an array of exception traces.
+   *
+   * @param Exception An Exception implementation instance
+   * @param string The trace format (plain or html)
+   *
+   * @return array An array of traces
+   */
+  public function getTraces($exception, $format = 'plain')
+  {
+    $traceData = $exception->getTrace();
+    array_unshift($traceData, array(
+      'function' => '',
+      'file'     => $exception->getFile() != null ? $exception->getFile() : 'n/a',
+      'line'     => $exception->getLine() != null ? $exception->getLine() : 'n/a',
+      'args'     => array(),
+    ));
+
+    $traces = array();
+    if ($format == 'html')
+    {
+      $lineFormat = 'at <strong>%s%s%s</strong>(%s)<br />in <em>%s</em> line %s <a href="#" onclick="toggle(\'%s\'); return false;">...</a><br /><ul id="%s" style="display: %s">%s</ul>';
+    }
+    else
+    {
+      $lineFormat = 'at %s%s%s(%s) in %s line %s';
+    }
+    for ($i = 0, $count = count($traceData); $i < $count; $i++)
+    {
+      $line = isset($traceData[$i]['line']) ? $traceData[$i]['line'] : 'n/a';
+      $file = isset($traceData[$i]['file']) ? $traceData[$i]['file'] : 'n/a';
+      $shortFile = preg_replace(array('#^'.preg_quote(sfConfig::get('sf_root_dir')).'#', '#^'.preg_quote(realpath(sfConfig::get('sf_symfony_lib_dir'))).'#'), array('SF_ROOT_DIR', 'SF_SYMFONY_LIB_DIR'), $file);
+      $args = isset($traceData[$i]['args']) ? $traceData[$i]['args'] : array();
+      $traces[] = sprintf($lineFormat,
+        (isset($traceData[$i]['class']) ? $traceData[$i]['class'] : ''),
+        (isset($traceData[$i]['type']) ? $traceData[$i]['type'] : ''),
+        $traceData[$i]['function'],
+        $this->formatArgs($args, false, $format),
+        $shortFile,
+        $line,
+        'trace_'.$i,
+        'trace_'.$i,
+        $i == 0 ? 'block' : 'none',
+        $this->fileExcerpt($file, $line)
+      );
+    }
+
+    return $traces;
+  }
+
+  /**
+   * Returns an HTML version of an array as YAML.
+   *
+   * @param array The values array
+   *
+   * @return string An HTML string
+   */
+  protected function formatArrayAsHtml($values)
+  {
+    return '<pre>'. en sfYaml::Dump($values).'</pre>';
+  }
+
+  /**
+   * Returns an excerpt of a code file around the given line number.
+   *
+   * @param string A file path
+   * @param int The selected line number
+   *
+   * @return string An HTML string
+   */
+  protected function fileExcerpt($file, $line)
+  {
+    if (is_readable($file))
+    {
+      $content = preg_split('#<br />#', highlight_file($file, true));
+
+      $lines = array();
+      for ($i = max($line - 3, 1), $max = min($line + 3, count($content)); $i <= $max; $i++)
+      {
+        $lines[] = '<li'.($i == $line ? ' class="selected"' : '').'>'.$content[$i - 1].'</li>';
+      }
+
+      return '<ol start="'.max($line - 3, 1).'">'.implode("\n", $lines).'</ol>';
+    }
+  }
+
+  /**
+   * Formats an array as a string.
+   *
+   * @param array The argument array
+   * @param boolean 
+   * @param string The format string (html or plain)
+   *
+   * @return string
+   */
+  protected function formatArgs($args, $single = false, $format = 'html')
+  {
+    $result = array();
+
+    $single and $args = array($args);
+
+    foreach ($args as $key => $value)
+    {
+      if (is_object($value))
+      {
+        $result[] = ($format == 'html' ? '<em>object</em>' : 'object').'(\''.get_class($value).'\')';
+      }
+      else if (is_array($value))
+      {
+        $result[] = ($format == 'html' ? '<em>array</em>' : 'array').'('.self::formatArgs($value).')';
+      }
+      else if ($value === null)
+      {
+        $result[] = '<em>null</em>';
+      }
+      else if (!is_int($key))
+      {
+        $result[] = "'$key' =&gt; '$value'";
+      }
+      else
+      {
+        $result[] = "'".$value."'";
+      }
+    }
+
+    return implode(', ', $result);
+  }
+
+  /**
+   * Sets the name of this exception.
+   *
+   * @param string An exception name
+   */
+  protected function setName($name)
+  {
+    $this->name = $name;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfFactoryException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfFactoryException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfFactoryException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfFactoryException is thrown when an error occurs while attempting to create
+ * a new factory implementation instance.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfFactoryException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfFactoryException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfFactoryException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfFactoryException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfFileException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfFileException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfFileException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfFileException is thrown when an error occurs while moving an uploaded file.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfFileException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfFileException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfFileException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfFileException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfFilterException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfFilterException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfFilterException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfFilterException is thrown when an error occurs while attempting to initialize
+ * or execute a filter.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfFilterException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfFilterException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfFilterException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfFilterException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfForwardException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfForwardException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfForwardException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfForwardException is thrown when an error occurs while attempting to forward
+ * the request.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfForwardException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfForwardException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfForwardException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfForwardException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfInitializationException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfInitializationException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfInitializationException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfInitializationException is thrown when an initialization procedure fails.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfInitializationException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfInitializationException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfInitializationException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfInitializationException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfParseException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfParseException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfParseException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfParseException is thrown when a parsing procedure fails to complete
+ * successfully.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfParseException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfParseException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfParseException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfParseException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfRenderException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfRenderException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfRenderException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfRenderException is thrown when a view's pre-render check fails.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfRenderException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfRenderException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfRenderException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfRenderException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfSecurityException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfSecurityException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfSecurityException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfSecurityException is thrown when a security related error occurs.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfSecurityException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfSecurityException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfSecurityException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfSecurityException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfStopException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfStopException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfStopException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfStopException is thrown when you want to stop action flow.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfStopException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfStopException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfStopException');
+
+    // disable xdebug to avoid backtrace in error log
+    if (function_exists('xdebug_disable'))
+    {
+      xdebug_disable();
+    }
+
+    parent::__construct($message, $code);
+  }
+
+  /**
+   * Stops the current action.
+   */
+  public function printStackTrace($exception = null)
+  {
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfStopException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfStorageException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfStorageException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfStorageException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfStorageException is thrown when a requested sfStorage implementation doesn't
+ * exist or data cannot be read from or written to the storage.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfStorageException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfStorageException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfStorageException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfStorageException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfValidatorException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfValidatorException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfValidatorException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfValidatorException is thrown when an error occurs in a validator.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfValidatorException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfValidatorException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfValidatorException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfValidatorException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfViewException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfViewException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfViewException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfViewException is thrown when an error occurs in a view.
+ *
+ * @package    symfony
+ * @subpackage exception
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfViewException.class.php 3243 2007-01-12 14:22:50Z fabien $
+ */
+class sfViewException extends sfException
+{
+  /**
+   * Class constructor.
+   *
+   * @param string The error message
+   * @param int    The error code
+   */
+  public function __construct($message = null, $code = 0)
+  {
+    $this->setName('sfViewException');
+    parent::__construct($message, $code);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/exception/sfViewException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfBasicSecurityFilter.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfBasicSecurityFilter.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfBasicSecurityFilter.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,83 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfBasicSecurityFilter checks security by calling the getCredential() method
+ * of the action. Once the credential has been acquired, sfBasicSecurityFilter
+ * verifies the user has the same credential by calling the hasCredential()
+ * method of SecurityUser.
+ *
+ * @package    symfony
+ * @subpackage filter
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfBasicSecurityFilter.class.php 3244 2007-01-12 14:46:11Z fabien $
+ */
+class sfBasicSecurityFilter extends sfSecurityFilter
+{
+  /**
+   * Executes this filter.
+   *
+   * @param sfFilterChain A sfFilterChain instance
+   */
+  public function execute($filterChain)
+  {
+    // get the cool stuff
+    $context    = $this->getContext();
+    $controller = $context->getController();
+    $user       = $context->getUser();
+
+    // get the current action instance
+    $actionEntry    = $controller->getActionStack()->getLastEntry();
+    $actionInstance = $actionEntry->getActionInstance();
+
+    // disable security on [sf_login_module] / [sf_login_action]
+    if ((sfConfig::get('sf_login_module') == $context->getModuleName()) && (sfConfig::get('sf_login_action') == $context->getActionName()))
+    {
+      $filterChain->execute();
+
+      return;
+    }
+
+    // get the credential required for this action
+    $credential = $actionInstance->getCredential();
+
+    // for this filter, the credentials are a simple privilege array
+    // where the first index is the privilege name and the second index
+    // is the privilege namespace
+    //
+    // NOTE: the nice thing about the Action class is that getCredential()
+    //       is vague enough to describe any level of security and can be
+    //       used to retrieve such data and should never have to be altered
+    if ($user->isAuthenticated())
+    {
+      // the user is authenticated
+      if ($credential === null || $user->hasCredential($credential))
+      {
+        // the user has access, continue
+        $filterChain->execute();
+      }
+      else
+      {
+        // the user doesn't have access, exit stage left
+        $controller->forward(sfConfig::get('sf_secure_module'), sfConfig::get('sf_secure_action'));
+
+        throw new sfStopException();
+      }
+    }
+    else
+    {
+      // the user is not authenticated
+      $controller->forward(sfConfig::get('sf_login_module'), sfConfig::get('sf_login_action'));
+
+      throw new sfStopException();
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfBasicSecurityFilter.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfCacheFilter.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfCacheFilter.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfCacheFilter.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,288 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfCacheFilter deals with page caching and action caching.
+ *
+ * @package    symfony
+ * @subpackage filter
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfCacheFilter.class.php 3502 2007-02-18 18:28:28Z fabien $
+ */
+class sfCacheFilter extends sfFilter
+{
+  protected
+    $cacheManager = null,
+    $request      = null,
+    $response     = null,
+    $cache        = array();
+
+  /**
+   * Initializes this Filter.
+   *
+   * @param sfContext The current application context
+   * @param array   An associative array of initialization parameters
+   *
+   * @return bool true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this Filter
+   */
+  public function initialize($context, $parameters = array())
+  {
+    parent::initialize($context, $parameters);
+
+    $this->cacheManager = $context->getViewCacheManager();
+    $this->request      = $context->getRequest();
+    $this->response     = $context->getResponse();
+  }
+
+  /**
+   * Executes this filter.
+   *
+   * @param sfFilterChain A sfFilterChain instance
+   */
+  public function execute($filterChain)
+  {
+    // execute this filter only once, if cache is set and no GET or POST parameters
+    if (!sfConfig::get('sf_cache') || count($_GET) || count($_POST))
+    {
+      $filterChain->execute();
+
+      return;
+    }
+
+    if ($this->executeBeforeExecution())
+    {
+      $filterChain->execute();
+    }
+
+    $this->executeBeforeRendering();
+  }
+
+  public function executeBeforeExecution()
+  {
+    // register our cache configuration
+    $this->cacheManager->registerConfiguration($this->getContext()->getModuleName());
+
+    $uri = sfRouting::getInstance()->getCurrentInternalUri();
+
+    // page cache
+    $this->cache[$uri] = array('page' => false, 'action' => false);
+    $cacheable = $this->cacheManager->isCacheable($uri);
+    if ($cacheable)
+    {
+      if ($this->cacheManager->withLayout($uri))
+      {
+        $inCache = $this->getPageCache($uri);
+        $this->cache[$uri]['page'] = !$inCache;
+
+        if ($inCache)
+        {
+          // page is in cache, so no need to run execution filter
+          return false;
+        }
+      }
+      else
+      {
+        $inCache = $this->getActionCache($uri);
+        $this->cache[$uri]['action'] = !$inCache;
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * Executes this filter.
+   *
+   * @param sfFilterChain A sfFilterChain instance.
+   */
+  public function executeBeforeRendering()
+  {
+    // cache only 200 HTTP status
+    if ($this->response->getStatusCode() == 200)
+    {
+      $uri = sfRouting::getInstance()->getCurrentInternalUri();
+
+      // save page in cache
+      if ($this->cache[$uri]['page'])
+      {
+        // set some headers that deals with cache
+        $lifetime = $this->cacheManager->getClientLifeTime($uri, 'page');
+        $this->response->setHttpHeader('Last-Modified', $this->response->getDate(time()), false);
+        $this->response->setHttpHeader('Expires', $this->response->getDate(time() + $lifetime), false);
+        $this->response->addCacheControlHttpHeader('max-age', $lifetime);
+
+        // set Vary headers
+        foreach ($this->cacheManager->getVary($uri, 'page') as $vary)
+        {
+          $this->response->addVaryHttpHeader($vary);
+        }
+
+        $this->setPageCache($uri);
+      }
+      else if ($this->cache[$uri]['action'])
+      {
+        // save action in cache
+        $this->setActionCache($uri);
+      }
+    }
+
+    // remove PHP automatic Cache-Control and Expires headers if not overwritten by application or cache
+    if ($this->response->hasHttpHeader('Last-Modified') || sfConfig::get('sf_etag'))
+    {
+      // FIXME: these headers are set by PHP sessions (see session_cache_limiter())
+      $this->response->setHttpHeader('Cache-Control', null, false);
+      $this->response->setHttpHeader('Expires', null, false);
+      $this->response->setHttpHeader('Pragma', null, false);
+    }
+
+    // Etag support
+    if (sfConfig::get('sf_etag'))
+    {
+      $etag = md5($this->response->getContent());
+      $this->response->setHttpHeader('ETag', $etag);
+
+      if ($this->request->getHttpHeader('IF_NONE_MATCH') == $etag)
+      {
+        $this->response->setStatusCode(304);
+        $this->response->setHeaderOnly(true);
+
+        if (sfConfig::get('sf_logging_enabled'))
+        {
+          $this->getContext()->getLogger()->info('{sfFilter} ETag matches If-None-Match (send 304)');
+        }
+      }
+    }
+
+    // conditional GET support
+    // never in debug mode
+    if ($this->response->hasHttpHeader('Last-Modified') && !sfConfig::get('sf_debug'))
+    {
+      $last_modified = $this->response->getHttpHeader('Last-Modified');
+      $last_modified = $last_modified[0];
+      if ($this->request->getHttpHeader('IF_MODIFIED_SINCE') == $last_modified)
+      {
+        $this->response->setStatusCode(304);
+        $this->response->setHeaderOnly(true);
+
+        if (sfConfig::get('sf_logging_enabled'))
+        {
+          $this->getContext()->getLogger()->info('{sfFilter} Last-Modified matches If-Modified-Since (send 304)');
+        }
+      }
+    }
+  }
+
+  /**
+   * Sets a page template in the cache.
+   *
+   * @param string The internal URI
+   */
+  protected function setPageCache($uri)
+  {
+    if ($this->getContext()->getController()->getRenderMode() != sfView::RENDER_CLIENT)
+    {
+      return;
+    }
+
+    // save content in cache
+    $this->cacheManager->set(serialize($this->response), $uri);
+
+    if (sfConfig::get('sf_web_debug'))
+    {
+      $content = sfWebDebug::getInstance()->decorateContentWithDebug($uri, $this->response->getContent(), true);
+      $this->response->setContent($content);
+    }
+  }
+
+  /**
+   * Gets a page template from the cache.
+   *
+   * @param string The internal URI
+   */
+  protected function getPageCache($uri)
+  {
+    $context = $this->getContext();
+
+    // get the current action information
+    $moduleName = $context->getModuleName();
+    $actionName = $context->getActionName();
+
+    $retval = $this->cacheManager->get($uri);
+
+    if ($retval === null)
+    {
+      return false;
+    }
+
+    $cachedResponse = unserialize($retval);
+    $cachedResponse->setContext($context);
+
+    $controller = $context->getController();
+    if ($controller->getRenderMode() == sfView::RENDER_VAR)
+    {
+      $controller->getActionStack()->getLastEntry()->setPresentation($cachedResponse->getContent());
+      $this->response->setContent('');
+    }
+    else
+    {
+      $context->setResponse($cachedResponse);
+      $this->response = $this->getContext()->getResponse();
+
+      if (sfConfig::get('sf_web_debug'))
+      {
+        $content = sfWebDebug::getInstance()->decorateContentWithDebug($uri, $this->response->getContent(), false);
+        $this->response->setContent($content);
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * Sets an action template in the cache.
+   *
+   * @param string The internal URI
+   */
+  protected function setActionCache($uri)
+  {
+    $content = $this->response->getParameter($uri.'_action', null, 'symfony/cache');
+
+    if ($content !== null)
+    {
+      $this->cacheManager->set($content, $uri);
+    }
+  }
+
+  /**
+   * Gets an action template from the cache.
+   *
+   * @param string The internal URI
+   */
+  protected function getActionCache($uri)
+  {
+    // retrieve content from cache
+    $retval = $this->cacheManager->get($uri);
+
+    if ($retval && sfConfig::get('sf_web_debug'))
+    {
+      $cache = unserialize($retval);
+      $this->response->mergeProperties($cache['response']);
+      $cache['content'] = sfWebDebug::getInstance()->decorateContentWithDebug($uri, $cache['content'], false);
+      $retval = serialize($cache);
+    }
+
+    $this->response->setParameter('current_key', $uri.'_action', 'symfony/cache/current');
+    $this->response->setParameter($uri.'_action', $retval, 'symfony/cache');
+
+    return $retval ? true : false;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfCacheFilter.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfCommonFilter.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfCommonFilter.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfCommonFilter.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfCommonFilter automatically adds javascripts and stylesheets information in the sfResponse content.
+ *
+ * @package    symfony
+ * @subpackage filter
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfCommonFilter.class.php 3244 2007-01-12 14:46:11Z fabien $
+ */
+class sfCommonFilter extends sfFilter
+{
+  /**
+   * Executes this filter.
+   *
+   * @param sfFilterChain A sfFilterChain instance
+   */
+  public function execute($filterChain)
+  {
+    // execute next filter
+    $filterChain->execute();
+
+    // execute this filter only once
+    $response = $this->getContext()->getResponse();
+
+    // include javascripts and stylesheets
+    $content = $response->getContent();
+    if (false !== ($pos = strpos($content, '</head>')))
+    {
+      sfLoader::loadHelpers(array('Tag', 'Asset'));
+      $html = '';
+      if (!$response->getParameter('javascripts_included', false, 'symfony/view/asset'))
+      {
+        $html .= get_javascripts($response);
+      }
+      if (!$response->getParameter('stylesheets_included', false, 'symfony/view/asset'))
+      {
+        $html .= get_stylesheets($response);
+      }
+
+      if ($html)
+      {
+        $response->setContent(substr($content, 0, $pos).$html.substr($content, $pos));
+      }
+    }
+
+    $response->setParameter('javascripts_included', false, 'symfony/view/asset');
+    $response->setParameter('stylesheets_included', false, 'symfony/view/asset');
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfCommonFilter.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfExecutionFilter.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfExecutionFilter.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfExecutionFilter.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,204 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfExecutionFilter is the last filter registered for each filter chain. This
+ * filter does all action and view execution.
+ *
+ * @package    symfony
+ * @subpackage filter
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfExecutionFilter.class.php 3244 2007-01-12 14:46:11Z fabien $
+ */
+class sfExecutionFilter extends sfFilter
+{
+  /**
+   * Executes this filter.
+   *
+   * @param sfFilterChain The filter chain
+   *
+   * @throws <b>sfInitializeException</b> If an error occurs during view initialization.
+   * @throws <b>sfViewException</b>       If an error occurs while executing the view.
+   */
+  public function execute($filterChain)
+  {
+    // get the context and controller
+    $context    = $this->getContext();
+    $controller = $context->getController();
+
+    // get the current action instance
+    $actionEntry    = $controller->getActionStack()->getLastEntry();
+    $actionInstance = $actionEntry->getActionInstance();
+
+    // get the current action information
+    $moduleName = $context->getModuleName();
+    $actionName = $context->getActionName();
+
+    // get the request method
+    $method = $context->getRequest()->getMethod();
+
+    $viewName = null;
+
+    if (sfConfig::get('sf_cache'))
+    {
+      $uri = sfRouting::getInstance()->getCurrentInternalUri();
+      if (null !== $context->getResponse()->getParameter($uri.'_action', null, 'symfony/cache'))
+      {
+        // action in cache, so go to the view
+        $viewName = sfView::SUCCESS;
+      }
+    }
+
+    if (!$viewName)
+    {
+      if (($actionInstance->getRequestMethods() & $method) != $method)
+      {
+        // this action will skip validation/execution for this method
+        // get the default view
+        $viewName = $actionInstance->getDefaultView();
+      }
+      else
+      {
+        // set default validated status
+        $validated = true;
+
+        // get the current action validation configuration
+        $validationConfig = $moduleName.'/'.sfConfig::get('sf_app_module_validate_dir_name').'/'.$actionName.'.yml';
+
+        // load validation configuration
+        // do NOT use require_once
+        if (null !== $validateFile = sfConfigCache::getInstance()->checkConfig(sfConfig::get('sf_app_module_dir_name').'/'.$validationConfig, true))
+        {
+          // create validator manager
+          $validatorManager = new sfValidatorManager();
+          $validatorManager->initialize($context);
+
+          require($validateFile);
+
+          // process validators
+          $validated = $validatorManager->execute();
+        }
+
+        // process manual validation
+        $validateToRun = 'validate'.ucfirst($actionName);
+        $manualValidated = method_exists($actionInstance, $validateToRun) ? $actionInstance->$validateToRun() : $actionInstance->validate();
+
+        // action is validated if:
+        // - all validation methods (manual and automatic) return true
+        // - or automatic validation returns false but errors have been 'removed' by manual validation
+        $validated = ($manualValidated && $validated) || ($manualValidated && !$validated && !$context->getRequest()->hasErrors());
+
+        // register fill-in filter
+        if (null !== ($parameters = $context->getRequest()->getAttribute('fillin', null, 'symfony/filter')))
+        {
+          $this->registerFillInFilter($filterChain, $parameters);
+        }
+
+        if ($validated)
+        {
+          if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+          {
+            $timer = sfTimerManager::getTimer(sprintf('Action "%s/%s"', $moduleName, $actionName));
+          }
+
+          // execute the action
+          $actionInstance->preExecute();
+          $viewName = $actionInstance->execute();
+          if ($viewName == '')
+          {
+            $viewName = sfView::SUCCESS;
+          }
+          $actionInstance->postExecute();
+
+          if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+          {
+            $timer->addTime();
+          }
+        }
+        else
+        {
+          if (sfConfig::get('sf_logging_enabled'))
+          {
+            $this->context->getLogger()->info('{sfFilter} action validation failed');
+          }
+
+          // validation failed
+          $handleErrorToRun = 'handleError'.ucfirst($actionName);
+          $viewName = method_exists($actionInstance, $handleErrorToRun) ? $actionInstance->$handleErrorToRun() : $actionInstance->handleError();
+          if ($viewName == '')
+          {
+            $viewName = sfView::ERROR;
+          }
+        }
+      }
+    }
+
+    if ($viewName == sfView::HEADER_ONLY)
+    {
+      $context->getResponse()->setHeaderOnly(true);
+
+      // execute next filter
+      $filterChain->execute();
+    }
+    else if ($viewName != sfView::NONE)
+    {
+      if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+      {
+        $timer = sfTimerManager::getTimer(sprintf('View "%s" for "%s/%s"', $viewName, $moduleName, $actionName));
+      }
+
+      // get the view instance
+      $viewInstance = $controller->getView($moduleName, $actionName, $viewName);
+
+      $viewInstance->initialize($context, $moduleName, $actionName, $viewName);
+
+      $viewInstance->execute();
+
+      // render the view and if data is returned, stick it in the
+      // action entry which was retrieved from the execution chain
+      $viewData = $viewInstance->render();
+
+      if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+      {
+        $timer->addTime();
+      }
+
+      if ($controller->getRenderMode() == sfView::RENDER_VAR)
+      {
+        $actionEntry->setPresentation($viewData);
+      }
+      else
+      {
+        // execute next filter
+        $filterChain->execute();
+      }
+    }
+  }
+
+  /**
+   * Registers the fill in filter in the filter chain.
+   *
+   * @param sfFilterChain A sfFilterChain implementation instance
+   * @param array An array of parameters to pass to the fill in filter.
+   */
+  protected function registerFillInFilter($filterChain, $parameters)
+  {
+    // automatically register the fill in filter if it is not already loaded in the chain
+    if (isset($parameters['enabled']) && $parameters['enabled'] && !$filterChain->hasFilter('sfFillInFormFilter'))
+    {
+      // register the fill in form filter
+      $fillInFormFilter = new sfFillInFormFilter();
+      $fillInFormFilter->initialize($this->context, isset($parameters['param']) ? $parameters['param'] : array());
+      $filterChain->register($fillInFormFilter);
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfExecutionFilter.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFillInFormFilter.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFillInFormFilter.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFillInFormFilter.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfFillInFormFilter fills in forms.
+ *
+ * @package    symfony
+ * @subpackage filter
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfFillInFormFilter.class.php 3244 2007-01-12 14:46:11Z fabien $
+ */
+class sfFillInFormFilter extends sfFilter
+{
+  /**
+   * Executes this filter.
+   *
+   * @param sfFilterChain A sfFilterChain instance
+   */
+  public function execute($filterChain)
+  {
+    // execute next filter
+    $filterChain->execute();
+
+    $context  = $this->getContext();
+    $response = $context->getResponse();
+    $request  = $context->getRequest();
+
+    $fillInForm = new sfFillInForm();
+
+    // converters
+    foreach ($this->getParameter('converters', array()) as $functionName => $fields)
+    {
+      $fillInForm->addConverter($functionName, $fields);
+    }
+
+    // skip fields
+    $fillInForm->setSkipFields((array) $this->getParameter('skip_fields', array()));
+
+    // types
+    $excludeTypes = (array) $this->getParameter('exclude_types', array('hidden', 'password'));
+    $checkTypes   = (array) $this->getParameter('check_types',   array('text', 'checkbox', 'radio', 'password', 'hidden'));
+    $fillInForm->setTypes(array_diff($checkTypes, $excludeTypes));
+
+    // fill in
+    $method  = 'fillIn'.ucfirst(strtolower($this->getParameter('content_type', 'Html')));
+
+    try
+    {
+      $content = $fillInForm->$method($response->getContent(), $this->getParameter('name'), $this->getParameter('id'), $request->getParameterHolder()->getAll());
+      $response->setContent($content);
+    }
+    catch (sfException $e)
+    {
+      if (sfConfig::get('sf_logging_enabled'))
+      {
+        $this->getContext()->getLogger()->err(sprintf('{sfFilter} %s', $e->getMessage()));
+      }
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFillInFormFilter.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFilter.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFilter.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFilter.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,146 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfFilter provides a way for you to intercept incoming requests or outgoing responses.
+ *
+ * @package    symfony
+ * @subpackage filter
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfFilter.class.php 3502 2007-02-18 18:28:28Z fabien $
+ */
+abstract class sfFilter
+{
+  protected
+    $parameterHolder = null,
+    $context         = null;
+
+  public static
+    $filterCalled    = array();
+
+  /**
+   * Returns true if this is the first call to the sfFilter instance.
+   *
+   * @return boolean true if this is the first call to the sfFilter instance, false otherwise
+   */
+  protected function isFirstCall()
+  {
+    $class = get_class($this);
+    if (isset(self::$filterCalled[$class]))
+    {
+      return false;
+    }
+    else
+    {
+      self::$filterCalled[$class] = true;
+
+      return true;
+    }
+  }
+
+  /**
+   * Retrieves the current application context.
+   *
+   * @return sfContext The current sfContext instance
+   */
+  public final function getContext()
+  {
+    return $this->context;
+  }
+
+  /**
+   * Initializes this Filter.
+   *
+   * @param sfContext The current application context
+   * @param array   An associative array of initialization parameters
+   *
+   * @return boolean true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this Filter
+   */
+  public function initialize($context, $parameters = array())
+  {
+    $this->context = $context;
+
+    $this->parameterHolder = new sfParameterHolder();
+    $this->parameterHolder->add($parameters);
+
+    return true;
+  }
+
+  /**
+   * Gets the parameter holder for this object.
+   *
+   * @return sfParameterHolder A sfParameterHolder instance
+   */
+  public function getParameterHolder()
+  {
+    return $this->parameterHolder;
+  }
+
+  /**
+   * Gets the parameter associated with the given key.
+   *
+   * This is a shortcut for:
+   *
+   * <code>$this->getParameterHolder()->get()</code>
+   *
+   * @param string The key name
+   * @param string The default value
+   * @param string The namespace to use
+   *
+   * @return string The value associated with the key
+   *
+   * @see sfParameterHolder
+   */
+  public function getParameter($name, $default = null, $ns = null)
+  {
+    return $this->parameterHolder->get($name, $default, $ns);
+  }
+
+  /**
+   * Returns true if the given key exists in the parameter holder.
+   *
+   * This is a shortcut for:
+   *
+   * <code>$this->getParameterHolder()->has()</code>
+   *
+   * @param string The key name
+   * @param string The namespace to use
+   *
+   * @return boolean true if the given key exists, false otherwise
+   *
+   * @see sfParameterHolder
+   */
+  public function hasParameter($name, $ns = null)
+  {
+    return $this->parameterHolder->has($name, $ns);
+  }
+
+  /**
+   * Sets the value for the given key.
+   *
+   * This is a shortcut for:
+   *
+   * <code>$this->getParameterHolder()->set()</code>
+   *
+   * @param string The key name
+   * @param string The value
+   * @param string The namespace to use
+   *
+   * @see sfParameterHolder
+   */
+  public function setParameter($name, $value, $ns = null)
+  {
+    return $this->parameterHolder->set($name, $value, $ns);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFilter.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFilterChain.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFilterChain.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFilterChain.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfFilterChain manages registered filters for a specific context.
+ *
+ * @package    symfony
+ * @subpackage filter
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfFilterChain.class.php 3244 2007-01-12 14:46:11Z fabien $
+ */
+class sfFilterChain
+{
+  protected
+    $chain = array(),
+    $index = -1;
+
+  /**
+   * Executes the next filter in this chain.
+   */
+  public function execute()
+  {
+    // skip to the next filter
+    ++$this->index;
+
+    if ($this->index < count($this->chain))
+    {
+      if (sfConfig::get('sf_logging_enabled'))
+      {
+        sfContext::getInstance()->getLogger()->info(sprintf('{sfFilter} executing filter "%s"', get_class($this->chain[$this->index])));
+      }
+
+      // execute the next filter
+      $this->chain[$this->index]->execute($this);
+    }
+  }
+
+  /**
+   * Returns true if the filter chain contains a filter of a given class.
+   *
+   * @param string The class name of the filter
+   *
+   * @return boolean true if the filter exists, false otherwise
+   */
+  public function hasFilter($class)
+  {
+    foreach ($this->chain as $filter)
+    {
+      if ($filter instanceof $class)
+      {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  /**
+   * Registers a filter with this chain.
+   *
+   * @param sfFilter A sfFilter implementation instance.
+   */
+  public function register($filter)
+  {
+    $this->chain[] = $filter;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFilterChain.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFlashFilter.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFlashFilter.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFlashFilter.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfFlashFilter removes flash attributes from the session.
+ *
+ * @package    symfony
+ * @subpackage filter
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfFlashFilter.class.php 3244 2007-01-12 14:46:11Z fabien $
+ */
+class sfFlashFilter extends sfFilter
+{
+  /**
+   * Executes this filter.
+   *
+   * @param sfFilterChain A sfFilterChain instance.
+   */
+  public function execute($filterChain)
+  {
+    $context = $this->getContext();
+    $userAttributeHolder = $context->getUser()->getAttributeHolder();
+
+    // execute this filter only once
+    if ($this->isFirstCall())
+    {
+      // flag current flash to be removed after the execution filter
+      $names = $userAttributeHolder->getNames('symfony/flash');
+      if ($names)
+      {
+        if (sfConfig::get('sf_logging_enabled'))
+        {
+          $context->getLogger()->info('{sfFilter} flag old flash messages ("'.implode('", "', $names).'")');
+        }
+        foreach ($names as $name)
+        {
+          $userAttributeHolder->set($name, true, 'symfony/flash/remove');
+        }
+      }
+    }
+
+    // execute next filter
+    $filterChain->execute();
+
+    // remove flash that are tagged to be removed
+    $names = $userAttributeHolder->getNames('symfony/flash/remove');
+    if ($names)
+    {
+      if (sfConfig::get('sf_logging_enabled'))
+      {
+        $context->getLogger()->info('{sfFilter} remove old flash messages ("'.implode('", "', $names).'")');
+      }
+      foreach ($names as $name)
+      {
+        $userAttributeHolder->remove($name, 'symfony/flash');
+        $userAttributeHolder->remove($name, 'symfony/flash/remove');
+      }
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfFlashFilter.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfRenderingFilter.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfRenderingFilter.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfRenderingFilter.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfRenderingFilter is the last filter registered for each filter chain. This
+ * filter does the rendering.
+ *
+ * @package    symfony
+ * @subpackage filter
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfRenderingFilter.class.php 3244 2007-01-12 14:46:11Z fabien $
+ */
+class sfRenderingFilter extends sfFilter
+{
+  /**
+   * Executes this filter.
+   *
+   * @param sfFilterChain The filter chain.
+   *
+   * @throws <b>sfInitializeException</b> If an error occurs during view initialization
+   * @throws <b>sfViewException</b>       If an error occurs while executing the view
+   */
+  public function execute($filterChain)
+  {
+    // execute next filter
+    $filterChain->execute();
+
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfFilter} render to client');
+    }
+
+    // get response object
+    $response = $this->getContext()->getResponse();
+
+    // send headers
+    $response->sendHttpHeaders();
+
+    // send content
+    $response->sendContent();
+
+    // log timers information
+    if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+    {
+      $logger = $this->getContext()->getLogger();
+      foreach (sfTimerManager::getTimers() as $name => $timer)
+      {
+        $logger->info(sprintf('{sfTimerManager} %s %.2f ms (%d)', $name, $timer->getElapsedTime() * 1000, $timer->getCalls()));
+      }
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfRenderingFilter.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfSecurityFilter.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfSecurityFilter.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfSecurityFilter.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfSecurityFilter provides a base class that classifies a filter as one that handles security.
+ *
+ * @package    symfony
+ * @subpackage filter
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfSecurityFilter.class.php 3244 2007-01-12 14:46:11Z fabien $
+ */
+abstract class sfSecurityFilter extends sfFilter
+{
+  /**
+   * Returns a new instance of a sfSecurityFilter.
+   *
+   * @param string The security class name
+   *
+   * @return sfSecurityFilter A sfSecurityFilter implementation instance
+   */
+  public static function newInstance($class)
+  {
+    // the class exists
+    $object = new $class();
+
+    if (!($object instanceof sfSecurityFilter))
+    {
+      // the class name is of the wrong type
+      $error = 'Class "%s" is not of the type sfSecurityFilter';
+      $error = sprintf($error, $class);
+
+      throw new sfFactoryException($error);
+    }
+
+    return $object;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfSecurityFilter.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfWebDebugFilter.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfWebDebugFilter.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfWebDebugFilter.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,69 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage filter
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfWebDebugFilter.class.php 3244 2007-01-12 14:46:11Z fabien $
+ */
+class sfWebDebugFilter extends sfFilter
+{
+  /**
+   * Executes this filter.
+   *
+   * @param sfFilterChain A sfFilterChain instance
+   */
+  public function execute($filterChain)
+  {
+    // execute this filter only once
+    if ($this->isFirstCall())
+    {
+      // register sfWebDebug assets
+      sfWebDebug::getInstance()->registerAssets();
+    }
+
+    // execute next filter
+    $filterChain->execute();
+
+    $context    = $this->getContext();
+    $response   = $context->getResponse();
+    $controller = $context->getController();
+
+    // don't add debug toolbar:
+    // * for XHR requests
+    // * if 304
+    // * if not rendering to the client
+    // * if HTTP headers only
+    if (
+      $this->getContext()->getRequest()->isXmlHttpRequest() ||
+      strpos($response->getContentType(), 'html') === false ||
+      $response->getStatusCode() == 304 ||
+      $controller->getRenderMode() != sfView::RENDER_CLIENT ||
+      $response->isHeaderOnly()
+    )
+    {
+      return;
+    }
+
+    $content  = $response->getContent();
+    $webDebug = sfWebDebug::getInstance()->getResults();
+
+    // add web debug information to response content
+    $newContent = str_ireplace('</body>', $webDebug.'</body>', $content);
+    if ($content == $newContent)
+    {
+      $newContent .= $webDebug;
+    }
+
+    $response->setContent($newContent);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/filter/sfWebDebugFilter.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfAdminGenerator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfAdminGenerator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfAdminGenerator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,788 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Admin generator.
+ *
+ * This class generates an admin module.
+ *
+ * This class calls two ORM specific methods:
+ *   getAllColumns()
+ * and
+ *   getAdminColumnForField($field, $flag = null)
+ *
+ * @package    symfony
+ * @subpackage generator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPropelAdminGenerator.class.php 2625 2006-11-07 10:36:14Z fabien $
+ */
+abstract class sfAdminGenerator extends sfCrudGenerator
+{
+  protected
+    $fields = array();
+
+  /**
+   * Returns HTML code for a help icon.
+   *
+   * @param string The column name
+   * @param string The field type (list, edit)
+   *
+   * @return string HTML code
+   */
+  public function getHelpAsIcon($column, $type = '')
+  {
+    $help = $this->getParameterValue($type.'.fields.'.$column->getName().'.help');
+    if ($help)
+    {
+      return "[?php echo image_tag(sfConfig::get('sf_admin_web_dir').'/images/help.png', array('align' => 'absmiddle', 'alt' => __('".$this->escapeString($help)."'), 'title' => __('".$this->escapeString($help)."'))) ?]";
+    }
+
+    return '';
+  }
+
+  /**
+   * Returns HTML code for a help text.
+   *
+   * @param string The column name
+   * @param string The field type (list, edit)
+   *
+   * @return string HTML code
+   */
+  public function getHelp($column, $type = '')
+  {
+    $help = $this->getParameterValue($type.'.fields.'.$column->getName().'.help');
+    if ($help)
+    {
+      return "<div class=\"sf_admin_edit_help\">[?php echo __('".$this->escapeString($help)."') ?]</div>";
+    }
+
+    return '';
+  }
+
+  /**
+   * Returns HTML code for an action button.
+   *
+   * @param string  The action name
+   * @param array   The parameters
+   * @param boolean Whether to add a primary key link or not
+   *
+   * @return string HTML code
+   */
+  public function getButtonToAction($actionName, $params, $pk_link = false)
+  {
+    $params   = (array) $params;
+    $options  = isset($params['params']) ? sfToolkit::stringToArray($params['params']) : array();
+    $method   = 'button_to';
+    $li_class = '';
+    $only_for = isset($params['only_for']) ? $params['only_for'] : null;
+
+    // default values
+    if ($actionName[0] == '_')
+    {
+      $actionName     = substr($actionName, 1);
+      $default_name   = strtr($actionName, '_', ' ');
+      $default_icon   = sfConfig::get('sf_admin_web_dir').'/images/'.$actionName.'_icon.png';
+      $default_action = $actionName;
+      $default_class  = 'sf_admin_action_'.$actionName;
+
+      if ($actionName == 'save' || $actionName == 'save_and_add' || $actionName == 'save_and_list')
+      {
+        $method = 'submit_tag';
+        $options['name'] = $actionName;
+      }
+
+      if ($actionName == 'delete')
+      {
+        $options['post'] = true;
+        if (!isset($options['confirm']))
+        {
+          $options['confirm'] = 'Are you sure?';
+        }
+
+        $li_class = 'float-left';
+
+        $only_for = 'edit';
+      }
+    }
+    else
+    {
+      $default_name   = strtr($actionName, '_', ' ');
+      $default_icon   = sfConfig::get('sf_admin_web_dir').'/images/default_icon.png';
+      $default_action = 'List'.sfInflector::camelize($actionName);
+      $default_class  = '';
+    }
+
+    $name   = isset($params['name']) ? $params['name'] : $default_name;
+    $icon   = isset($params['icon']) ? sfToolkit::replaceConstants($params['icon']) : $default_icon;
+    $action = isset($params['action']) ? $params['action'] : $default_action;
+    $url_params = $pk_link ? '?'.$this->getPrimaryKeyUrlParams() : '\'';
+
+    if (!isset($options['class']))
+    {
+      if ($default_class)
+      {
+        $options['class'] = $default_class;
+      }
+      else
+      {
+        $options['style'] = 'background: #ffc url('.$icon.') no-repeat 3px 2px';
+      }
+    }
+
+    $li_class = $li_class ? ' class="'.$li_class.'"' : '';
+
+    $html = '<li'.$li_class.'>';
+
+    if ($only_for == 'edit')
+    {
+      $html .= '[?php if ('.$this->getPrimaryKeyIsSet().'): ?]'."\n";
+    }
+    else if ($only_for == 'create')
+    {
+      $html .= '[?php if (!'.$this->getPrimaryKeyIsSet().'): ?]'."\n";
+    }
+    else if ($only_for !== null)
+    {
+      throw new sfConfigurationException(sprintf('The "only_for" parameter can only takes "create" or "edit" as argument ("%s")', $only_for));
+    }
+
+    if ($method == 'submit_tag')
+    {
+      $html .= '[?php echo submit_tag(__(\''.$name.'\'), '.var_export($options, true).') ?]';
+    }
+    else
+    {
+      $phpOptions = var_export($options, true);
+
+      // little hack
+      $phpOptions = preg_replace("/'confirm' => '(.+?)(?<!\\\)'/", '\'confirm\' => __(\'$1\')', $phpOptions);
+
+      $html .= '[?php echo button_to(__(\''.$name.'\'), \''.$this->getModuleName().'/'.$action.$url_params.', '.$phpOptions.') ?]';
+    }
+
+    if ($only_for !== null)
+    {
+      $html .= '[?php endif; ?]'."\n";
+    }
+
+    $html .= '</li>'."\n";
+
+    return $html;
+  }
+
+  /**
+   * Returns HTML code for an action link.
+   *
+   * @param string  The action name
+   * @param array   The parameters
+   * @param boolean Whether to add a primary key link or not
+   *
+   * @return string HTML code
+   */
+  public function getLinkToAction($actionName, $params, $pk_link = false)
+  {
+    $options = isset($params['params']) ? sfToolkit::stringToArray($params['params']) : array();
+
+    // default values
+    if ($actionName[0] == '_')
+    {
+      $actionName = substr($actionName, 1);
+      $name       = $actionName;
+      $icon       = sfConfig::get('sf_admin_web_dir').'/images/'.$actionName.'_icon.png';
+      $action     = $actionName;
+
+      if ($actionName == 'delete')
+      {
+        $options['post'] = true;
+        if (!isset($options['confirm']))
+        {
+          $options['confirm'] = 'Are you sure?';
+        }
+      }
+    }
+    else
+    {
+      $name   = isset($params['name']) ? $params['name'] : $actionName;
+      $icon   = isset($params['icon']) ? sfToolkit::replaceConstants($params['icon']) : sfConfig::get('sf_admin_web_dir').'/images/default_icon.png';
+      $action = isset($params['action']) ? $params['action'] : 'List'.sfInflector::camelize($actionName);
+    }
+
+    $url_params = $pk_link ? '?'.$this->getPrimaryKeyUrlParams() : '\'';
+
+    $phpOptions = var_export($options, true);
+
+    // little hack
+    $phpOptions = preg_replace("/'confirm' => '(.+?)(?<!\\\)'/", '\'confirm\' => __(\'$1\')', $phpOptions);
+
+    return '<li>[?php echo link_to(image_tag(\''.$icon.'\', array(\'alt\' => __(\''.$name.'\'), \'title\' => __(\''.$name.'\'))), \''.$this->getModuleName().'/'.$action.$url_params.($options ? ', '.$phpOptions : '').') ?]</li>'."\n";
+  }
+
+  /**
+   * Returns HTML code for a column in edit mode.
+   *
+   * @param string  The column name
+   * @param array   The parameters
+   *
+   * @return string HTML code
+   */
+  public function getColumnEditTag($column, $params = array())
+  {
+    // user defined parameters
+    $user_params = $this->getParameterValue('edit.fields.'.$column->getName().'.params');
+    $user_params = is_array($user_params) ? $user_params : sfToolkit::stringToArray($user_params);
+    $params      = $user_params ? array_merge($params, $user_params) : $params;
+
+    if ($column->isComponent())
+    {
+      return "get_component('".$this->getModuleName()."', '".$column->getName()."', array('type' => 'edit', '{$this->getSingularName()}' => \${$this->getSingularName()}))";
+    }
+    else if ($column->isPartial())
+    {
+      return "get_partial('".$column->getName()."', array('type' => 'edit', '{$this->getSingularName()}' => \${$this->getSingularName()}))";
+    }
+
+    // default control name
+    $params = array_merge(array('control_name' => $this->getSingularName().'['.$column->getName().']'), $params);
+
+    // default parameter values
+    $type = $column->getCreoleType();
+    if ($type == CreoleTypes::DATE)
+    {
+      $params = array_merge(array('rich' => true, 'calendar_button_img' => sfConfig::get('sf_admin_web_dir').'/images/date.png'), $params);
+    }
+    else if ($type == CreoleTypes::TIMESTAMP)
+    {
+      $params = array_merge(array('rich' => true, 'withtime' => true, 'calendar_button_img' => sfConfig::get('sf_admin_web_dir').'/images/date.png'), $params);
+    }
+
+    // user sets a specific tag to use
+    if ($inputType = $this->getParameterValue('edit.fields.'.$column->getName().'.type'))
+    {
+      if ($inputType == 'plain')
+      {
+        return $this->getColumnListTag($column, $params);
+      }
+      else
+      {
+        return $this->getPHPObjectHelper($inputType, $column, $params);
+      }
+    }
+
+    // guess the best tag to use with column type
+    return parent::getCrudColumnEditTag($column, $params);
+  }
+
+  /**
+   * Returns all column categories.
+   *
+   * @param string  The parameter name
+   *
+   * @return array The column categories
+   */
+  public function getColumnCategories($paramName)
+  {
+    if (is_array($this->getParameterValue($paramName)))
+    {
+      $fields = $this->getParameterValue($paramName);
+
+      // do we have categories?
+      if (!isset($fields[0]))
+      {
+        return array_keys($fields);
+      }
+
+    }
+
+    return array('NONE');
+  }
+
+  /**
+   * Wraps content with a credential condition.
+   *
+   * @param string  The content
+   * @param array   The parameters
+   *
+   * @return string HTML code
+   */
+  public function addCredentialCondition($content, $params = array())
+  {
+    if (isset($params['credentials']))
+    {
+      $credentials = str_replace("\n", ' ', var_export($params['credentials'], true));
+
+      return <<<EOF
+[?php if (\$sf_user->hasCredential($credentials)): ?]
+$content
+[?php endif; ?]
+EOF;
+    }
+    else
+    {
+      return $content;
+    }
+  }
+
+  /**
+   * Gets sfAdminColumn objects for a given category.
+   *
+   * @param string The parameter name
+   *
+   * @return array sfAdminColumn array
+   */
+  public function getColumns($paramName, $category = 'NONE')
+  {
+    $phpNames = array();
+
+    // user has set a personnalized list of fields?
+    $fields = $this->getParameterValue($paramName);
+    if (is_array($fields))
+    {
+      // categories?
+      if (isset($fields[0]))
+      {
+        // simulate a default one
+        $fields = array('NONE' => $fields);
+      }
+
+      if (!$fields)
+      {
+        return array();
+      }
+
+      foreach ($fields[$category] as $field)
+      {
+        list($field, $flags) = $this->splitFlag($field);
+
+        $phpNames[] = $this->getAdminColumnForField($field, $flags);
+      }
+    }
+    else
+    {
+      // no, just return the full list of columns in table
+      return $this->getAllColumns();
+    }
+
+    return $phpNames;
+  }
+
+  /**
+   * Gets modifier flags from a column name.
+   *
+   * @param string The column name
+   *
+   * @return array An array of detected flags
+   */
+  public function splitFlag($text)
+  {
+    $flags = array();
+    while (in_array($text[0], array('=', '-', '+', '_', '~')))
+    {
+      $flags[] = $text[0];
+      $text = substr($text, 1);
+    }
+
+    return array($text, $flags);
+  }
+
+  /**
+   * Gets a parameter value.
+   *
+   * @param string The key name
+   * @param mixed  The default value
+   *
+   * @return mixed The parameter value
+   */
+  public function getParameterValue($key, $default = null)
+  {
+    if (preg_match('/^([^\.]+)\.fields\.(.+)$/', $key, $matches))
+    {
+      return $this->getFieldParameterValue($matches[2], $matches[1], $default);
+    }
+    else
+    {
+      return $this->getValueFromKey($key, $default);
+    }
+  }
+
+  /**
+   * Gets a field parameter value.
+   *
+   * @param string The key name
+   * @param string The type (list, edit)
+   * @param mixed  The default value
+   *
+   * @return mixed The parameter value
+   */
+  protected function getFieldParameterValue($key, $type = '', $default = null)
+  {
+    $retval = $this->getValueFromKey($type.'.fields.'.$key, $default);
+    if ($retval !== null)
+    {
+      return $retval;
+    }
+
+    $retval = $this->getValueFromKey('fields.'.$key, $default);
+    if ($retval !== null)
+    {
+      return $retval;
+    }
+
+    if (preg_match('/\.name$/', $key))
+    {
+      // default field.name
+      return sfInflector::humanize(($pos = strpos($key, '.')) ? substr($key, 0, $pos) : $key);
+    }
+    else
+    {
+      return null;
+    }
+  }
+
+  /**
+   * Gets the value for a given key.
+   *
+   * @param string The key name
+   * @param mixed  The default value
+   *
+   * @return mixed The key value
+   */
+  protected function getValueFromKey($key, $default = null)
+  {
+    $ref   =& $this->params;
+    $parts =  explode('.', $key);
+    $count =  count($parts);
+    for ($i = 0; $i < $count; $i++)
+    {
+      $partKey = $parts[$i];
+      if (!isset($ref[$partKey]))
+      {
+        return $default;
+      }
+
+      if ($count == $i + 1)
+      {
+        return $ref[$partKey];
+      }
+      else
+      {
+        $ref =& $ref[$partKey];
+      }
+    }
+
+    return $default;
+  }
+
+  /**
+   * Wraps a content for I18N.
+   *
+   * @param string The key name
+   * @param string The defaul value
+   *
+   * @return string HTML code
+   */
+  public function getI18NString($key, $default = null, $withEcho = true)
+  {
+    $value = $this->escapeString($this->getParameterValue($key, $default));
+
+    // find %%xx%% strings
+    preg_match_all('/%%([^%]+)%%/', $value, $matches, PREG_PATTERN_ORDER);
+    $this->params['tmp']['display'] = array();
+    foreach ($matches[1] as $name)
+    {
+      $this->params['tmp']['display'][] = $name;
+    }
+
+    $vars = array();
+    foreach ($this->getColumns('tmp.display') as $column)
+    {
+      if ($column->isLink())
+      {
+        $vars[] = '\'%%'.$column->getName().'%%\' => link_to('.$this->getColumnListTag($column).', \''.$this->getModuleName().'/edit?'.$this->getPrimaryKeyUrlParams().')';
+      }
+      elseif ($column->isPartial())
+      {
+        $vars[] = '\'%%_'.$column->getName().'%%\' => '.$this->getColumnListTag($column);
+      }
+      else if ($column->isComponent())
+      {
+        $vars[] = '\'%%_'.$column->getName().'%%\' => '.$this->getColumnListTag($column);
+      }
+      else
+      {
+        $vars[] = '\'%%'.$column->getName().'%%\' => '.$this->getColumnListTag($column);
+      }
+    }
+
+    // strip all = signs
+    $value = preg_replace('/%%=([^%]+)%%/', '%%$1%%', $value);
+
+    $i18n = '__(\''.$value.'\', '."\n".'array('.implode(",\n", $vars).'))';
+
+    return $withEcho ? '[?php echo '.$i18n.' ?]' : $i18n;
+  }
+
+  /**
+   * Replaces constants in a string.
+   *
+   * @param string
+   *
+   * @return string
+   */
+  public function replaceConstants($value)
+  {
+    // find %%xx%% strings
+    preg_match_all('/%%([^%]+)%%/', $value, $matches, PREG_PATTERN_ORDER);
+    $this->params['tmp']['display'] = array();
+    foreach ($matches[1] as $name)
+    {
+      $this->params['tmp']['display'][] = $name;
+    }
+
+    foreach ($this->getColumns('tmp.display') as $column)
+    {
+      $value = str_replace('%%'.$column->getName().'%%', '{'.$this->getColumnGetter($column, true, 'this->').'}', $value);
+    }
+
+    return $value;
+  }
+
+  /**
+   * Returns HTML code for a column in list mode.
+   *
+   * @param string  The column name
+   * @param array   The parameters
+   *
+   * @return string HTML code
+   */
+  public function getColumnListTag($column, $params = array())
+  {
+    $user_params = $this->getParameterValue('list.fields.'.$column->getName().'.params');
+    $user_params = is_array($user_params) ? $user_params : sfToolkit::stringToArray($user_params);
+    $params      = $user_params ? array_merge($params, $user_params) : $params;
+
+    $type = $column->getCreoleType();
+    
+    $columnGetter = $this->getColumnGetter($column, true);
+
+    if ($column->isComponent())
+    {
+      return "get_component('".$this->getModuleName()."', '".$column->getName()."', array('type' => 'list', '{$this->getSingularName()}' => \${$this->getSingularName()}))";
+    }
+    else if ($column->isPartial())
+    {
+      return "get_partial('".$column->getName()."', array('type' => 'list', '{$this->getSingularName()}' => \${$this->getSingularName()}))";
+    }
+    else if ($type == CreoleTypes::DATE || $type == CreoleTypes::TIMESTAMP)
+    {
+      $format = isset($params['date_format']) ? $params['date_format'] : ($type == CreoleTypes::DATE ? 'D' : 'f');
+      return "($columnGetter !== null && $columnGetter !== '') ? format_date($columnGetter, \"$format\") : ''";
+    }
+    elseif ($type == CreoleTypes::BOOLEAN)
+    {
+      return "$columnGetter ? image_tag(sfConfig::get('sf_admin_web_dir').'/images/tick.png') : '&nbsp;'";
+    }
+    else
+    {
+      return "$columnGetter";
+    }
+  }
+
+  /**
+   * Returns HTML code for a column in filter mode.
+   *
+   * @param string  The column name
+   * @param array   The parameters
+   *
+   * @return string HTML code
+   */
+  public function getColumnFilterTag($column, $params = array())
+  {
+    $user_params = $this->getParameterValue('list.fields.'.$column->getName().'.params');
+    $user_params = is_array($user_params) ? $user_params : sfToolkit::stringToArray($user_params);
+    $params      = $user_params ? array_merge($params, $user_params) : $params;
+
+    if ($column->isComponent())
+    {
+      return "get_component('".$this->getModuleName()."', '".$column->getName()."', array('type' => 'list'))";
+    }
+    else if ($column->isPartial())
+    {
+      return "get_partial('".$column->getName()."', array('type' => 'filter', 'filters' => \$filters))";
+    }
+
+    $type = $column->getCreoleType();
+
+    $default_value = "isset(\$filters['".$column->getName()."']) ? \$filters['".$column->getName()."'] : null";
+    $unquotedName = 'filters['.$column->getName().']';
+    $name = "'$unquotedName'";
+
+    if ($column->isForeignKey())
+    {
+      $params = $this->getObjectTagParams($params, array('include_blank' => true, 'related_class'=>$this->getRelatedClassName($column), 'text_method'=>'__toString', 'control_name'=>$unquotedName));
+      return "object_select_tag($default_value, null, $params)";
+
+    }
+    else if ($type == CreoleTypes::DATE)
+    {
+      // rich=false not yet implemented
+      $params = $this->getObjectTagParams($params, array('rich' => true, 'calendar_button_img' => sfConfig::get('sf_admin_web_dir').'/images/date.png'));
+      return "input_date_range_tag($name, $default_value, $params)";
+    }
+    else if ($type == CreoleTypes::TIMESTAMP)
+    {
+      // rich=false not yet implemented
+      $params = $this->getObjectTagParams($params, array('rich' => true, 'withtime' => true, 'calendar_button_img' => sfConfig::get('sf_admin_web_dir').'/images/date.png'));
+      return "input_date_range_tag($name, $default_value, $params)";
+    }
+    else if ($type == CreoleTypes::BOOLEAN)
+    {
+      $defaultIncludeCustom = '__("yes or no")';
+
+      $option_params = $this->getObjectTagParams($params, array('include_custom' => $defaultIncludeCustom));
+      $params = $this->getObjectTagParams($params);
+
+      // little hack
+      $option_params = preg_replace("/'".preg_quote($defaultIncludeCustom)."'/", $defaultIncludeCustom, $option_params);
+
+      $options = "options_for_select(array(1 => __('yes'), 0 => __('no')), $default_value, $option_params)";
+
+      return "select_tag($name, $options, $params)";
+    }
+    else if ($type == CreoleTypes::CHAR || $type == CreoleTypes::VARCHAR || $type == CreoleTypes::TEXT || $type == CreoleTypes::LONGVARCHAR)
+    {
+      $size = ($column->getSize() < 15 ? $column->getSize() : 15);
+      $params = $this->getObjectTagParams($params, array('size' => $size));
+      return "input_tag($name, $default_value, $params)";
+    }
+    else if ($type == CreoleTypes::INTEGER || $type == CreoleTypes::TINYINT || $type == CreoleTypes::SMALLINT || $type == CreoleTypes::BIGINT)
+    {
+      $params = $this->getObjectTagParams($params, array('size' => 7));
+      return "input_tag($name, $default_value, $params)";
+    }
+    else if ($type == CreoleTypes::FLOAT || $type == CreoleTypes::DOUBLE || $type == CreoleTypes::DECIMAL || $type == CreoleTypes::NUMERIC || $type == CreoleTypes::REAL)
+    {
+      $params = $this->getObjectTagParams($params, array('size' => 7));
+      return "input_tag($name, $default_value, $params)";
+    }
+    else
+    {
+      $params = $this->getObjectTagParams($params, array('disabled' => true));
+      return "input_tag($name, $default_value, $params)";
+    }
+  }
+
+  /**
+   * Escapes a string.
+   *
+   * @param string
+   *
+   * @param string
+   */
+  protected function escapeString($string)
+  {
+    return preg_replace('/\'/', '\\\'', $string);
+  }
+}
+
+/**
+ * Propel admin generator column.
+ *
+ * @package    symfony
+ * @subpackage generator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPropelAdminGenerator.class.php 2625 2006-11-07 10:36:14Z fabien $
+ */
+class sfAdminColumn
+{
+  protected
+    $phpName    = '',
+    $column     = null,
+    $flags      = array();
+
+  /**
+   * Constructor.
+   *
+   * @param string The column php name
+   * @param string The column name
+   * @param array  The column flags
+   */
+  public function __construct($phpName, $column = null, $flags = array())
+  {
+    $this->phpName = $phpName;
+    $this->column  = $column;
+    $this->flags   = (array) $flags;
+  }
+
+  /**
+   * Returns true if the column maps a database column.
+   *
+   * @return boolean true if the column maps a database column, false otherwise
+   */
+  public function isReal()
+  {
+    return $this->column ? true : false;
+  }
+
+  /**
+   * Gets the name of the column.
+   *
+   * @return string The column name
+   */
+  public function getName()
+  {
+    return sfInflector::underscore($this->phpName);
+  }
+
+  /**
+   * Returns true if the column is a partial.
+   *
+   * @return boolean true if the column is a partial, false otherwise
+   */
+  public function isPartial()
+  {
+    return in_array('_', $this->flags) ? true : false;
+  }
+
+  /**
+   * Returns true if the column is a component.
+   *
+   * @return boolean true if the column is a component, false otherwise
+   */
+  public function isComponent()
+  {
+    return in_array('~', $this->flags) ? true : false;
+  }
+
+  /**
+   * Returns true if the column has a link.
+   *
+   * @return boolean true if the column has a link, false otherwise
+   */
+  public function isLink()
+  {
+    return (in_array('=', $this->flags) || $this->isPrimaryKey()) ? true : false;
+  }
+
+  /**
+   * Gets the php name of the column.
+   *
+   * @return string The php name
+   */
+  public function getPhpName()
+  {
+    return $this->phpName;
+  }
+
+  // FIXME: those methods are only used in the propel admin generator
+  public function __call($name, $arguments)
+  {
+    return $this->column ? $this->column->$name() : null;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfAdminGenerator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfCrudGenerator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfCrudGenerator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfCrudGenerator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,447 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * CRUD generator.
+ *
+ * This class generates a basic CRUD module.
+ *
+ * @package    symfony
+ * @subpackage generator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPropelCrudGenerator.class.php 2342 2006-10-06 07:19:22Z chtito $
+ */
+abstract class sfCrudGenerator extends sfGenerator
+{
+  protected
+    $singularName  = '',
+    $pluralName    = '',
+    $peerClassName = '',
+    $map           = null,
+    $tableMap      = null,
+    $primaryKey    = array(),
+    $className     = '',
+    $params        = array();
+
+  /**
+   * Generates classes and templates in cache.
+   *
+   * @param array The parameters
+   *
+   * @return string The data to put in configuration cache
+   */
+  public function generate($params = array())
+  {
+    $this->params = $params;
+
+    $required_parameters = array('model_class', 'moduleName');
+    foreach ($required_parameters as $entry)
+    {
+      if (!isset($this->params[$entry]))
+      {
+        $error = 'You must specify a "%s"';
+        $error = sprintf($error, $entry);
+
+        throw new sfParseException($error);
+      }
+    }
+
+    $modelClass = $this->params['model_class'];
+
+    if (!class_exists($modelClass))
+    {
+      $error = 'Unable to scaffold unexistant model "%s"';
+      $error = sprintf($error, $modelClass);
+
+      throw new sfInitializationException($error);
+    }
+
+    $this->setScaffoldingClassName($modelClass);
+
+    // generated module name
+    $this->setGeneratedModuleName('auto'.ucfirst($this->params['moduleName']));
+    $this->setModuleName($this->params['moduleName']);
+
+    // get some model metadata
+    $this->loadMapBuilderClasses();
+
+    // load all primary keys
+    $this->loadPrimaryKeys();
+
+    // theme exists?
+    $theme = isset($this->params['theme']) ? $this->params['theme'] : 'default';
+    $themeDir = sfLoader::getGeneratorTemplate($this->getGeneratorClass(), $theme, '');
+    if (!is_dir($themeDir))
+    {
+      $error = 'The theme "%s" does not exist.';
+      $error = sprintf($error, $theme);
+      throw new sfConfigurationException($error);
+    }
+
+    $this->setTheme($theme);
+    $templateFiles = sfFinder::type('file')->name('*.php')->relative()->in($themeDir.'/templates');
+    $configFiles = sfFinder::type('file')->name('*.yml')->relative()->in($themeDir.'/config');
+
+    $this->generatePhpFiles($this->generatedModuleName, $templateFiles, $configFiles);
+
+    // require generated action class
+    $data = "require_once(sfConfig::get('sf_module_cache_dir').'/".$this->generatedModuleName."/actions/actions.class.php');\n";
+
+    return $data;
+  }
+
+  /**
+   * Returns PHP code for primary keys parameters.
+   *
+   * @param integer The indentation value
+   *
+   * @return string The PHP code
+   */
+  public function getRetrieveByPkParamsForAction($indent)
+  {
+    $params = array();
+    foreach ($this->getPrimaryKey() as $pk)
+    {
+      $params[] = "\$this->getRequestParameter('".sfInflector::underscore($pk->getPhpName())."')";
+    }
+
+    return implode(",\n".str_repeat(' ', max(0, $indent - strlen($this->singularName.$this->className))), $params);
+  }
+
+  /**
+   * Returns PHP code for getOrCreate() parameters.
+   *
+   * @return string The PHP code
+   */
+  public function getMethodParamsForGetOrCreate()
+  {
+    $method_params = array();
+    foreach ($this->getPrimaryKey() as $pk)
+    {
+      $fieldName       = sfInflector::underscore($pk->getPhpName());
+      $method_params[] = "\$$fieldName = '$fieldName'";
+    }
+
+    return implode(', ', $method_params);
+  }
+
+  /**
+   * Returns PHP code for getOrCreate() promary keys condition.
+   *
+   * @param boolean true if we pass the field name as an argument, false otherwise
+   *
+   * @return string The PHP code
+   */
+  public function getTestPksForGetOrCreate($fieldNameAsArgument = true)
+  {
+    $test_pks = array();
+    foreach ($this->getPrimaryKey() as $pk)
+    {
+      $fieldName  = sfInflector::underscore($pk->getPhpName());
+      $test_pks[] = sprintf("!\$this->getRequestParameter(%s)", $fieldNameAsArgument ? "\$$fieldName" : "'".$fieldName."'");
+    }
+
+    return implode("\n     || ", $test_pks);
+  }
+
+  /**
+   * Returns PHP code for primary keys parameters used in getOrCreate() method.
+   *
+   * @return string The PHP code
+   */
+  public function getRetrieveByPkParamsForGetOrCreate()
+  {
+    $retrieve_params = array();
+    foreach ($this->getPrimaryKey() as $pk)
+    {
+      $fieldName         = sfInflector::underscore($pk->getPhpName());
+      $retrieve_params[] = "\$this->getRequestParameter(\$$fieldName)";
+    }
+
+    return implode(",\n".str_repeat(' ', max(0, 45 - strlen($this->singularName.$this->className))), $retrieve_params);
+  }
+
+  /**
+   * Gets the table map for the current model class.
+   *
+   * @return TableMap A TableMap instance
+   */
+  public function getTableMap()
+  {
+    return $this->tableMap;
+  }
+
+  /**
+   * Sets the class name to use for scaffolding
+   *
+   * @param  string class name
+   */
+  protected function setScaffoldingClassName($className)
+  {
+    $this->singularName  = sfInflector::underscore($className);
+    $this->pluralName    = $this->singularName.'s';
+    $this->className     = $className;
+    $this->peerClassName = $className.'Peer';
+  }
+
+  /**
+   * Gets the singular name for current scaffolding class.
+   *
+   * @return string
+   */
+  public function getSingularName()
+  {
+    return $this->singularName;
+  }
+
+  /**
+   * Gets the plural name for current scaffolding class.
+   *
+   * @return string
+   */
+  public function getPluralName()
+  {
+    return $this->pluralName;
+  }
+
+  /**
+   * Gets the class name for current scaffolding class.
+   *
+   * @return string
+   */
+  public function getClassName()
+  {
+    return $this->className;
+  }
+
+  /**
+   * Gets the Peer class name.
+   *
+   * @return string
+   */
+  public function getPeerClassName()
+  {
+    return $this->peerClassName;
+  }
+
+  /**
+   * Gets the primary key name.
+   *
+   * @return string
+   */
+  public function getPrimaryKey()
+  {
+    return $this->primaryKey;
+  }
+
+  /**
+   * Gets the Map object.
+   *
+   * @return object
+   */
+  public function getMap()
+  {
+    return $this->map;
+  }
+
+  /**
+   * Returns PHP code to add to a URL for primary keys.
+   *
+   * @param string The prefix value
+   *
+   * @return string PHP code
+   */
+  public function getPrimaryKeyUrlParams($prefix = '')
+  {
+    $params = array();
+    foreach ($this->getPrimaryKey() as $pk)
+    {
+      $phpName   = $pk->getPhpName();
+      $fieldName = sfInflector::underscore($phpName);
+      $params[]  = "$fieldName='.".$this->getColumnGetter($pk, true, $prefix);
+    }
+
+    return implode(".'&", $params);
+  }
+
+  /**
+   * Gets PHP code for primary key condition.
+   *
+   * @param string The prefix value
+   *
+   * @return string PHP code
+   */
+  public function getPrimaryKeyIsSet($prefix = '')
+  {
+    $params = array();
+    foreach ($this->getPrimaryKey() as $pk)
+    {
+      $params[] = $this->getColumnGetter($pk, true, $prefix);
+    }
+
+    return implode(' && ', $params);
+  }
+
+  /**
+   * Gets object tag parameters.
+   *
+   * @param array An array of parameters
+   * @param array An array of default parameters
+   *
+   * @return string PHP code
+   */
+  protected function getObjectTagParams($params, $default_params = array())
+  {
+    return var_export(array_merge($default_params, $params), true);
+  }
+
+  /**
+   * Returns HTML code for a column in list mode.
+   *
+   * @param string  The column name
+   * @param array   The parameters
+   *
+   * @return string HTML code
+   */
+  public function getColumnListTag($column, $params = array())
+  {
+    $type = $column->getCreoleType();
+    
+    $columnGetter = $this->getColumnGetter($column, true);
+
+    if ($type == CreoleTypes::TIMESTAMP)
+    {
+      return "format_date($columnGetter, 'f')";
+    }
+    elseif ($type == CreoleTypes::DATE)
+    {
+      return "format_date($columnGetter, 'D')";
+    }
+    else
+    {
+      return "$columnGetter";
+    }
+  }
+
+  /**
+   * Returns HTML code for a column in edit mode.
+   *
+   * @param string  The column name
+   * @param array   The parameters
+   *
+   * @return string HTML code
+   */
+  public function getCrudColumnEditTag($column, $params = array())
+  {
+    $type = $column->getCreoleType();
+
+    if ($column->isForeignKey())
+    {
+      if (!$column->isNotNull())
+      {
+        $params['include_blank'] = true;
+      }
+      return $this->getPHPObjectHelper('select_tag', $column, $params, array('related_class' => $this->getRelatedClassName($column)));
+    }
+    else if ($type == CreoleTypes::DATE)
+    {
+      // rich=false not yet implemented
+      return $this->getPHPObjectHelper('input_date_tag', $column, $params, array('rich' => true));
+    }
+    else if ($type == CreoleTypes::TIMESTAMP)
+    {
+      // rich=false not yet implemented
+      return $this->getPHPObjectHelper('input_date_tag', $column, $params, array('rich' => true, 'withtime' => true));
+    }
+    else if ($type == CreoleTypes::BOOLEAN)
+    {
+      return $this->getPHPObjectHelper('checkbox_tag', $column, $params);
+    }
+    else if ($type == CreoleTypes::CHAR || $type == CreoleTypes::VARCHAR)
+    {
+      $size = ($column->getSize() > 20 ? ($column->getSize() < 80 ? $column->getSize() : 80) : 20);
+      return $this->getPHPObjectHelper('input_tag', $column, $params, array('size' => $size));
+    }
+    else if ($type == CreoleTypes::INTEGER || $type == CreoleTypes::TINYINT || $type == CreoleTypes::SMALLINT || $type == CreoleTypes::BIGINT)
+    {
+      return $this->getPHPObjectHelper('input_tag', $column, $params, array('size' => 7));
+    }
+    else if ($type == CreoleTypes::FLOAT || $type == CreoleTypes::DOUBLE || $type == CreoleTypes::DECIMAL || $type == CreoleTypes::NUMERIC || $type == CreoleTypes::REAL)
+    {
+      return $this->getPHPObjectHelper('input_tag', $column, $params, array('size' => 7));
+    }
+    else if ($type == CreoleTypes::TEXT || $type == CreoleTypes::LONGVARCHAR)
+    {
+      return $this->getPHPObjectHelper('textarea_tag', $column, $params, array('size' => '30x3'));
+    }
+    else
+    {
+      return $this->getPHPObjectHelper('input_tag', $column, $params, array('disabled' => true));
+    }
+  }
+
+  /**
+   * Loads primary keys.
+   *
+   * This method is ORM dependant.
+   *
+   * @throws sfException
+   */
+  abstract protected function loadPrimaryKeys();
+
+  /**
+   * Loads map builder classes.
+   *
+   * This method is ORM dependant.
+   *
+   * @throws sfException
+   */
+  abstract protected function loadMapBuilderClasses();
+
+  /**
+   * Generates a PHP call to an object helper.
+   *
+   * This method is ORM dependant.
+   *
+   * @param string The helper name
+   * @param string The column name
+   * @param array  An array of parameters
+   * @param array  An array of local parameters
+   *
+   * @return string PHP code
+   */
+  abstract function getPHPObjectHelper($helperName, $column, $params, $localParams = array());
+
+  /**
+   * Returns the getter either non-developped: 'getFoo' or developped: '$class->getFoo()'.
+   *
+   * This method is ORM dependant.
+   *
+   * @param string  The column name
+   * @param boolean true if you want developped method names, false otherwise
+   * @param string The prefix value
+   *
+   * @return string PHP code
+   */
+  abstract function getColumnGetter($column, $developed = false , $prefix = '');
+
+  /*
+   * Gets the PHP name of the related class name.
+   *
+   * Used for foreign keys only; this method should be removed when we use sfAdminColumn instead.
+   *
+   * This method is ORM dependant.
+   *
+   * @param string The column name
+   *
+   * @return string The PHP name of the related class name
+   */
+  abstract function getRelatedClassName($column);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfCrudGenerator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfGenerator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfGenerator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfGenerator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,234 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfGenerator is the abstract base class for all generators.
+ *
+ * @package    symfony
+ * @subpackage generator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfGenerator.class.php 3513 2007-02-19 13:42:16Z fabien $
+ */
+abstract class sfGenerator
+{
+  protected
+    $generatorClass      = '',
+    $generatorManager    = null,
+    $generatedModuleName = '',
+    $theme               = 'default',
+    $moduleName          = '';
+
+  /**
+   * Initializes the current sfGenerator instance.
+   *
+   * @param sfGeneratorManager A sfGeneratorManager instance
+   */
+  public function initialize($generatorManager)
+  {
+    $this->generatorManager = $generatorManager;
+  }
+
+  /**
+   * Generates classes and templates.
+   *
+   * @param array An array of parameters
+   *
+   * @return string The cache for the configuration file
+   */
+  abstract public function generate($params = array());
+
+  /**
+   * Generates PHP files for a given module name.
+   *
+   * @param string The name of module name to generate
+   * @param array  A list of template files to generate
+   * @param array  A list of configuration files to generate
+   */
+  protected function generatePhpFiles($generatedModuleName, $templateFiles = array(), $configFiles = array())
+  {
+    // eval actions file
+    $retval = $this->evalTemplate('actions/actions.class.php');
+
+    // save actions class
+    $this->getGeneratorManager()->getCache()->set('actions.class.php', $generatedModuleName.DIRECTORY_SEPARATOR.'actions', $retval);
+
+    // generate template files
+    foreach ($templateFiles as $template)
+    {
+      // eval template file
+      $retval = $this->evalTemplate('templates/'.$template);
+
+      // save template file
+      $this->getGeneratorManager()->getCache()->set($template, $generatedModuleName.DIRECTORY_SEPARATOR.'templates', $retval);
+    }
+
+    // generate config files
+    foreach ($configFiles as $config)
+    {
+      // eval config file
+      $retval = $this->evalTemplate('config/'.$config);
+
+      // save config file
+      $this->getGeneratorManager()->getCache()->set($config, $generatedModuleName.DIRECTORY_SEPARATOR.'config', $retval);
+    }
+  }
+
+  /**
+   * Evaluates a template file.
+   *
+   * @param string The template file path
+   *
+   * @return string The evaluated template
+   */
+  protected function evalTemplate($templateFile)
+  {
+    $templateFile = sfLoader::getGeneratorTemplate($this->getGeneratorClass(), $this->getTheme(), $templateFile);
+
+    // eval template file
+    ob_start();
+    require($templateFile);
+    $content = ob_get_clean();
+
+    // replace [?php and ?]
+    $content = $this->replacePhpMarks($content);
+
+    $retval = "<?php\n".
+              "// auto-generated by ".$this->getGeneratorClass()."\n".
+              "// date: %s\n?>\n%s";
+    $retval = sprintf($retval, date('Y/m/d H:i:s'), $content);
+
+    return $retval;
+  }
+
+  /**
+   * Replaces PHP marks by <?php ?>.
+   *
+   * @param string The PHP code
+   *
+   * @return string The converted PHP code
+   */
+  protected function replacePhpMarks($text)
+  {
+    // replace [?php and ?]
+    return str_replace(array('[?php', '[?=', '?]'), array('<?php', '<?php echo', '?>'), $text);
+  }
+
+  /**
+   * Gets the generator class.
+   *
+   * @return string The generator class
+   */
+  public function getGeneratorClass()
+  {
+    return $this->generatorClass;
+  }
+
+  /**
+   * Sets the generator class.
+   *
+   * @param string The generator class
+   */
+  public function setGeneratorClass($generator_class)
+  {
+    $this->generatorClass = $generator_class;
+  }
+
+  /**
+   * Gets the sfGeneratorManager instance.
+   *
+   * @return string The sfGeneratorManager instance
+   */
+  protected function getGeneratorManager()
+  {
+    return $this->generatorManager;
+  }
+
+  /**
+   * Gets the module name of the generated module.
+   *
+   * @return string The module name
+   */
+  public function getGeneratedModuleName()
+  {
+    return $this->generatedModuleName;
+  }
+
+  /**
+   * Sets the module name of the generated module.
+   *
+   * @param string The module name
+   */
+  public function setGeneratedModuleName($module_name)
+  {
+    $this->generatedModuleName = $module_name;
+  }
+
+  /**
+   * Gets the module name.
+   *
+   * @return string The module name
+   */
+  public function getModuleName()
+  {
+    return $this->moduleName;
+  }
+
+  /**
+   * Sets the module name.
+   *
+   * @param string The module name
+   */
+  public function setModuleName($module_name)
+  {
+    $this->moduleName = $module_name;
+  }
+
+  /**
+   * Gets the theme name.
+   *
+   * @return string The theme name
+   */
+  public function getTheme()
+  {
+    return $this->theme;
+  }
+
+  /**
+   * Sets the theme name.
+   *
+   * @param string The theme name
+   */
+  public function setTheme($theme)
+  {
+    $this->theme = $theme;
+  }
+
+  /**
+   * Calls methods defined via the sfMixer class.
+   *
+   * @param string The method name
+   * @param array  The method arguments
+   *
+   * @return mixed The returned value of the called method
+   *
+   * @see sfMixer
+   */
+  public function __call($method, $arguments)
+  {
+    if (!$callable = sfMixer::getCallable('sfGenerator:'.$method))
+    {
+      throw new sfException(sprintf('Call to undefined method sfGenerator::%s', $method));
+    }
+
+    array_unshift($arguments, $this);
+
+    return call_user_func_array($callable, $arguments);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfGenerator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfGeneratorManager.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfGeneratorManager.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfGeneratorManager.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfGeneratorManager helps generate classes, views and templates for scaffolding, admin interface, ...
+ *
+ * @package    symfony
+ * @subpackage generator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfGeneratorManager.class.php 3302 2007-01-18 13:42:46Z fabien $
+ */
+class sfGeneratorManager
+{
+  protected $cache = null;
+
+  /**
+   * Initializes the sfGeneratorManager instance.
+   */
+  public function initialize()
+  {
+    // create cache instance
+    $this->cache = new sfFileCache(sfConfig::get('sf_module_cache_dir'));
+    $this->cache->setSuffix('');
+  }
+
+  /**
+   * Returns the current sfCache implementation instance.
+   *
+   * @return sfCache A sfCache implementation instance
+   */
+  public function getCache()
+  {
+    return $this->cache;
+  }
+
+  /**
+   * Generates classes and templates for a given generator class.
+   *
+   * @param string The generator class name
+   * @param array  An array of parameters
+   *
+   * @return string The cache for the configuration file
+   */
+  public function generate($generator_class, $param)
+  {
+    $generator = new $generator_class();
+    $generator->initialize($this);
+    $data = $generator->generate($param);
+
+    return $data;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/generator/sfGeneratorManager.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/AssetHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/AssetHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/AssetHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,486 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004 David Heinemeier Hansson
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * AssetHelper.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     David Heinemeier Hansson
+ * @version    SVN: $Id: AssetHelper.php 3313 2007-01-20 07:00:37Z fabien $
+ */
+
+/**
+ * Returns a <link> tag that browsers and news readers
+ * can use to auto-detect a RSS or ATOM feed for the current page,
+ * to be included in the <head> section of a HTML document.
+ *
+ * <b>Options:</b>
+ * - rel - defaults to 'alternate'
+ * - type - defaults to 'application/rss+xml'
+ * - title - defaults to the feed type in upper case
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo auto_discovery_link_tag('rss', 'module/feed');
+ *    => <link rel="alternate" type="application/rss+xml" title="RSS" href="http://www.curenthost.com/module/feed" />
+ *  echo auto_discovery_link_tag('rss', 'module/feed', array('title' => 'My RSS'));
+ *    => <link rel="alternate" type="application/rss+xml" title="My RSS" href="http://www.curenthost.com/module/feed" />
+ * </code>
+ *
+ * @param  string feed type ('rss', 'atom')
+ * @param  string 'module/action' or '@rule' of the feed
+ * @param  array additional HTML compliant <link> tag parameters
+ * @return string XHTML compliant <link> tag
+ */
+function auto_discovery_link_tag($type = 'rss', $url_options = array(), $tag_options = array())
+{
+  return tag('link', array(
+    'rel'   => isset($tag_options['rel']) ? $tag_options['rel'] : 'alternate',
+    'type'  => isset($tag_options['type']) ? $tag_options['type'] : 'application/'.$type.'+xml',
+    'title' => isset($tag_options['title']) ? $tag_options['title'] : ucfirst($type),
+    'href'  => url_for($url_options, true)
+  ));
+}
+
+/**
+ * Returns the path to a JavaScript asset.
+ *
+ * <b>Example:</b>
+ * <code>
+ *  echo javascript_path('myscript');
+ *    => /js/myscript.js
+ * </code>
+ *
+ * <b>Note:</b> The asset name can be supplied as a...
+ * - full path, like "/my_js/myscript.css"
+ * - file name, like "myscript.js", that gets expanded to "/js/myscript.js"
+ * - file name without extension, like "myscript", that gets expanded to "/js/myscript.js"
+ *
+ * @param  string asset name
+ * @param  bool return absolute path ?
+ * @return string file path to the JavaScript file
+ * @see    javascript_include_tag
+ */
+function javascript_path($source, $absolute = false)
+{
+  return _compute_public_path($source, 'js', 'js', $absolute);
+}
+
+/**
+ * Returns a <script> include tag per source given as argument.
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo javascript_include_tag('xmlhr');
+ *    => <script language="JavaScript" type="text/javascript" src="/js/xmlhr.js"></script>
+ *  echo javascript_include_tag('common.javascript', '/elsewhere/cools');
+ *    => <script language="JavaScript" type="text/javascript" src="/js/common.javascript"></script>
+ *       <script language="JavaScript" type="text/javascript" src="/elsewhere/cools.js"></script>
+ * </code>
+ *
+ * @param  string asset names
+ * @return string XHTML compliant <script> tag(s)
+ * @see    javascript_path 
+ */
+function javascript_include_tag()
+{
+  $html = '';
+  foreach (func_get_args() as $source)
+  {
+    $source = javascript_path($source);
+    $html .= content_tag('script', '', array('type' => 'text/javascript', 'src' => $source))."\n";
+  }
+
+  return $html;
+}
+
+/**
+ * Returns the path to a stylesheet asset.
+ *
+ * <b>Example:</b>
+ * <code>
+ *  echo stylesheet_path('style');
+ *    => /css/style.css
+ * </code>
+ *
+ * <b>Note:</b> The asset name can be supplied as a...
+ * - full path, like "/my_css/style.css"
+ * - file name, like "style.css", that gets expanded to "/css/style.css"
+ * - file name without extension, like "style", that gets expanded to "/css/style.css"
+ *
+ * @param  string asset name
+ * @param  bool return absolute path ?
+ * @return string file path to the stylesheet file
+ * @see    stylesheet_tag  
+ */
+function stylesheet_path($source, $absolute = false)
+{
+  return _compute_public_path($source, 'css', 'css', $absolute);
+}
+
+/**
+ * Returns a css <link> tag per source given as argument,
+ * to be included in the <head> section of a HTML document.
+ *
+ * <b>Options:</b>
+ * - rel - defaults to 'stylesheet'
+ * - type - defaults to 'text/css'
+ * - media - defaults to 'screen'
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo stylesheet_tag('style');
+ *    => <link href="/stylesheets/style.css" media="screen" rel="stylesheet" type="text/css" />
+ *  echo stylesheet_tag('style', array('media' => 'all'));
+ *    => <link href="/stylesheets/style.css" media="all" rel="stylesheet" type="text/css" />
+ *  echo stylesheet_tag('random.styles', '/css/stylish');
+ *    => <link href="/stylesheets/random.styles" media="screen" rel="stylesheet" type="text/css" />
+ *       <link href="/css/stylish.css" media="screen" rel="stylesheet" type="text/css" />
+ * </code>
+ *
+ * @param  string asset names
+ * @param  array additional HTML compliant <link> tag parameters
+ * @return string XHTML compliant <link> tag(s)
+ * @see    stylesheet_path 
+ */
+function stylesheet_tag()
+{
+  $sources = func_get_args();
+  $sourceOptions = (func_num_args() > 1 && is_array($sources[func_num_args() - 1])) ? array_pop($sources) : array();
+
+  $html = '';
+  foreach ($sources as $source)
+  {
+    $source  = stylesheet_path($source);
+    $options = array_merge(array('rel' => 'stylesheet', 'type' => 'text/css', 'media' => 'screen', 'href' => $source), $sourceOptions);
+    $html   .= tag('link', $options)."\n";
+  }
+
+  return $html;
+}
+
+/**
+ * Adds a stylesheet to the response object.
+ *
+ * @see sfResponse->addStylesheet()
+ */
+function use_stylesheet($css, $position = '', $options = array())
+{
+  sfContext::getInstance()->getResponse()->addStylesheet($css, $position, $options);
+}
+
+/**
+ * Adds a javascript to the response object.
+ *
+ * @see sfResponse->addJavascript()
+ */
+function use_javascript($js, $position = '')
+{
+  sfContext::getInstance()->getResponse()->addJavascript($js, $position);
+}
+
+/**
+ * Decorates the current template with a given layout.
+ *
+ * @param mixed The layout name or path or false to disable the layout
+ */
+function decorate_with($layout)
+{
+  $view = sfContext::getInstance()->getActionStack()->getLastEntry()->getViewInstance();
+  if (false === $layout)
+  {
+    $view->setDecorator(false);
+  }
+  else
+  {
+    $view->setDecoratorTemplate($layout);
+  }
+}
+
+/**
+ * Returns the path to an image asset.
+ *
+ * <b>Example:</b>
+ * <code>
+ *  echo image_path('foobar');
+ *    => /images/foobar.png
+ * </code>
+ *
+ * <b>Note:</b> The asset name can be supplied as a...
+ * - full path, like "/my_images/image.gif"
+ * - file name, like "rss.gif", that gets expanded to "/images/rss.gif"
+ * - file name without extension, like "logo", that gets expanded to "/images/logo.png"
+ * 
+ * @param  string asset name
+ * @param  bool return absolute path ?
+ * @return string file path to the image file
+ * @see    image_tag  
+ */
+function image_path($source, $absolute = false)
+{
+  return _compute_public_path($source, 'images', 'png', $absolute);
+}
+
+/**
+ * Returns an <img> image tag for the asset given as argument.
+ *
+ * <b>Options:</b>
+ * - 'absolute' - to output absolute file paths, useful for embedded images in emails
+ * - 'alt'  - defaults to the file name part of the asset (capitalized and without the extension)
+ * - 'size' - Supplied as "XxY", so "30x45" becomes width="30" and height="45"
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo image_tag('foobar');
+ *    => <img src="images/foobar.png" alt="Foobar" />
+ *  echo image_tag('/my_images/image.gif', array('alt' => 'Alternative text', 'size' => '100x200'));
+ *    => <img src="/my_images/image.gif" alt="Alternative text" width="100" height="200" />
+ * </code>
+ *
+ * @param  string image asset name
+ * @param  array additional HTML compliant <img> tag parameters
+ * @return string XHTML compliant <img> tag
+ * @see    image_path 
+ */
+function image_tag($source, $options = array())
+{
+  if (!$source)
+  {
+    return '';
+  }
+
+  $options = _parse_attributes($options);
+
+  $absolute = false;
+  if (isset($options['absolute']))
+  {
+    unset($options['absolute']);
+    $absolute = true;
+  }
+
+  $options['src'] = image_path($source, $absolute);
+
+  if (!isset($options['alt']))
+  {
+    $path_pos = strrpos($source, '/');
+    $dot_pos = strrpos($source, '.');
+    $begin = $path_pos ? $path_pos + 1 : 0;
+    $nb_str = ($dot_pos ? $dot_pos : strlen($source)) - $begin;
+    $options['alt'] = ucfirst(substr($source, $begin, $nb_str));
+  }
+
+  if (isset($options['size']))
+  {
+    list($options['width'], $options['height']) = split('x', $options['size'], 2);
+    unset($options['size']);
+  }
+
+  return tag('img', $options);
+}
+
+function _compute_public_path($source, $dir, $ext, $absolute = false)
+{
+  if (strpos($source, '://'))
+  {
+    return $source;
+  }
+
+  $request = sfContext::getInstance()->getRequest();
+  $sf_relative_url_root = $request->getRelativeUrlRoot();
+  if (strpos($source, '/') !== 0)
+  {
+    $source = $sf_relative_url_root.'/'.$dir.'/'.$source;
+  }
+  if (strpos(basename($source), '.') === false)
+  {
+    $source .= '.'.$ext;
+  }
+  if ($sf_relative_url_root && strpos($source, $sf_relative_url_root) !== 0)
+  {
+    $source = $sf_relative_url_root.$source;
+  }
+
+  if ($absolute)
+  {
+    $source = 'http'.($request->isSecure() ? 's' : '').'://'.$request->getHost().$source;
+  }
+
+  return $source;
+}
+
+/**
+ * Prints a set of <meta> tags according to the response attributes,
+ * to be included in the <head> section of a HTML document.
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  include_metas();
+ *    => <meta name="title" content="symfony - open-source PHP5 web framework" />
+ *       <meta name="robots" content="index, follow" />
+ *       <meta name="description" content="symfony - open-source PHP5 web framework" />
+ *       <meta name="keywords" content="symfony, project, framework, php, php5, open-source, mit, symphony" />
+ *       <meta name="language" content="en" /><link href="/stylesheets/style.css" media="screen" rel="stylesheet" type="text/css" />
+ * </code>
+ *
+ * <b>Note:</b> Modify the sfResponse object or the view.yml to change, add or remove metas.
+ *
+ * @return string XHTML compliant <meta> tag(s)
+ * @see    include_http_metas 
+ */
+function include_metas()
+{
+  foreach (sfContext::getInstance()->getResponse()->getMetas() as $name => $content)
+  {
+    echo tag('meta', array('name' => $name, 'content' => $content))."\n";
+  }
+}
+
+/**
+ * Returns a set of <meta http-equiv> tags according to the response attributes,
+ * to be included in the <head> section of a HTML document.
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  include_http_metas();
+ *    => <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ * </code>
+ *
+ * <b>Note:</b> Modify the sfResponse object or the view.yml to change, add or remove metas.
+ *
+ * @return string XHTML compliant <meta> tag(s)
+ * @see    include_metas 
+ */
+function include_http_metas()
+{
+  foreach (sfContext::getInstance()->getResponse()->getHttpMetas() as $httpequiv => $value)
+  {
+    echo tag('meta', array('http-equiv' => $httpequiv, 'content' => $value))."\n";
+  }
+}
+
+/**
+ * Returns the title of the current page according to the response attributes,
+ * to be included in the <title> section of a HTML document.
+ *
+ * <b>Note:</b> Modify the sfResponse object or the view.yml to modify the title of a page.
+ *
+ * @return string page title
+ */
+function include_title()
+{
+  $title = sfContext::getInstance()->getResponse()->getTitle();
+
+  echo content_tag('title', $title)."\n";
+}
+
+/**
+ * Returns <script> tags for all javascripts configured in view.yml or added to the response object.
+ *
+ * You can use this helper to decide the location of javascripts in pages.
+ * By default, if you don't call this helper, symfony will automatically include javascripts before </head>.
+ * Calling this helper disables this behavior.
+ *
+ * @return string <script> tags
+ */
+function get_javascripts()
+{
+  $response = sfContext::getInstance()->getResponse();
+  $response->setParameter('javascripts_included', true, 'symfony/view/asset');
+
+  $already_seen = array();
+  $html = '';
+
+  foreach (array('first', '', 'last') as $position)
+  {
+    foreach ($response->getJavascripts($position) as $files)
+    {
+      if (!is_array($files))
+      {
+        $files = array($files);
+      }
+
+      foreach ($files as $file)
+      {
+        $file = javascript_path($file);
+
+        if (isset($already_seen[$file])) continue;
+
+        $already_seen[$file] = 1;
+        $html .= javascript_include_tag($file);
+      }
+    }
+  }
+
+  return $html;
+}
+
+/**
+ * Prints <script> tags for all javascripts configured in view.yml or added to the response object.
+ *
+ * @see get_javascripts()
+ */
+function include_javascripts()
+{
+  echo get_javascripts();
+}
+
+/**
+ * Returns <link> tags for all stylesheets configured in view.yml or added to the response object.
+ *
+ * You can use this helper to decide the location of stylesheets in pages.
+ * By default, if you don't call this helper, symfony will automatically include stylesheets before </head>.
+ * Calling this helper disables this behavior.
+ *
+ * @return string <link> tags
+ */
+function get_stylesheets()
+{
+  $response = sfContext::getInstance()->getResponse();
+  $response->setParameter('stylesheets_included', true, 'symfony/view/asset');
+
+  $already_seen = array();
+  $html = '';
+
+  foreach (array('first', '', 'last') as $position)
+  {
+    foreach ($response->getStylesheets($position) as $files => $options)
+    {
+      if (!is_array($files))
+      {
+        $files = array($files);
+      }
+
+      foreach ($files as $file)
+      {
+        $file = stylesheet_path($file);
+
+        if (isset($already_seen[$file])) continue;
+
+        $already_seen[$file] = 1;
+        $html .= stylesheet_tag($file, $options);
+      }
+    }
+  }
+
+  return $html;
+}
+
+/**
+ * Prints <link> tags for all stylesheets configured in view.yml or added to the response object.
+ *
+ * @see get_stylesheets()
+ */
+function include_stylesheets()
+{
+  echo get_stylesheets();
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/AssetHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/CacheHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/CacheHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/CacheHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,88 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * CacheHelper.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: CacheHelper.php 2459 2006-10-20 08:15:03Z fabien $
+ */
+
+/* Usage
+
+<?php if (!cache('name')): ?>
+
+... HTML ...
+
+  <?php cache_save() ?>
+<?php endif; ?>
+
+*/
+function cache($name, $lifeTime = 86400)
+{
+  $context = sfContext::getInstance();
+
+  if (!sfConfig::get('sf_cache'))
+  {
+    return null;
+  }
+
+  $request = $context->getRequest();
+  $cache   = $context->getViewCacheManager();
+
+  if ($request->getAttribute('cache_started') !== null)
+  {
+    throw new sfCacheException('Cache already started');
+  }
+
+  $data = $cache->start($name, $lifeTime);
+
+  if ($data === null)
+  {
+    $request->setAttribute('started', 1, 'symfony/action/sfAction/cache');
+    $request->setAttribute('current_name', $name, 'symfony/action/sfAction/cache');
+
+    return 0;
+  }
+  else
+  {
+    echo $data;
+
+    return 1;
+  }
+}
+
+function cache_save()
+{
+  $context = sfContext::getInstance();
+
+  if (!sfConfig::get('sf_cache'))
+  {
+    return null;
+  }
+
+  $request = $context->getRequest();
+
+  if ($request->getAttribute('started', null, 'symfony/action/sfAction/cache') === null)
+  {
+    throw new sfCacheException('Cache not started');
+  }
+
+  $name = $request->getAttribute('current_name', '', 'symfony/action/sfAction/cache');
+
+  $data = $context->getViewCacheManager()->stop($name);
+
+  $request->setAttribute('started', null, 'symfony/action/sfAction/cache');
+  $request->setAttribute('current_name', null, 'symfony/action/sfAction/cache');
+
+  echo $data;
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/CacheHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/DateFormHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/DateFormHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/DateFormHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,955 @@
+<?php
+
+use_helper('Form');
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * DateFormHelper.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: DateFormHelper.php 3294 2007-01-16 06:53:15Z fabien $
+ */
+
+/**
+ * Returns a <select> tag populated with all the days of the month (1 - 31).
+ *
+ * By default, the <i>$value</i> parameter is set to today's day. To override this, simply pass an integer
+ * (1 - 31) to the <i>$value</i> parameter. You can also set the <i>$value</i> parameter to null which will disable
+ * the <i>$value</i>, however this will only be useful if you pass 'include_blank' or 'include_custom' to the <i>$options</i>
+ * parameter. For convenience, symfony also offers the select_date_tag helper function which combines the
+ * select_year_tag, select_month_tag, and select_day_tag functions into a single helper.
+ *
+ * <b>Options:</b>
+ * - include_blank  - Includes a blank <option> tag at the beginning of the string with an empty value.
+ * - include_custom - Includes an <option> tag with a custom display title at the beginning of the string with an empty value.
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo submit_day_tag('day', 14);
+ * </code>
+ *
+ * @param  string field name
+ * @param  integer selected value (1 - 31)
+ * @param  array  additional HTML compliant <select> tag parameters
+ * @return string <select> tag populated with all the days of the month (1 - 31).
+ * @see    select_date_tag, select datetime_tag
+ */
+function select_day_tag($name, $value = null, $options = array(), $html_options = array())
+{
+  if ($value === null)
+  {
+    $value = date('j');
+  }
+
+  $options = _parse_attributes($options);
+
+  $select_options = array();
+  _convert_include_custom_for_select($options, $select_options);
+
+  for ($x = 1; $x < 32; $x++)
+  {
+    $select_options[$x] = str_pad($x, 2, '0', STR_PAD_LEFT);
+  }
+
+  return select_tag($name, options_for_select($select_options, $value), $html_options);
+}
+
+/**
+ * Returns a <select> tag populated with all the months of the year (1 - 12).
+ *
+ * By default, the <i>$value</i> parameter is set to today's month. To override this, simply pass an integer 
+ * (1 - 12) to the <i>$value</i> parameter. You can also set the <i>$value</i> parameter to null which will disable
+ * the <i>$value</i>, however this will only be useful if you pass 'include_blank' or 'include_custom' to the <i>$options</i>
+ * parameter. Also, the each month's display title is set to return its respective full month name, which can be easily 
+ * overridden by passing the 'use_short_names' or 'use_month_numbers' options to the <i>$options</i> parameter.
+ * For convenience, Symfony also offers the select_date_tag helper function which combines the 
+ * select_year_tag, select_month_tag, and select_day_tag functions into a single helper.
+ *
+ * <b>Options:</b>
+ * - include_blank     - Includes a blank <option> tag at the beginning of the string with an empty value
+ * - include_custom    - Includes an <option> tag with a custom display title at the beginning of the string with an empty value
+ * - use_month_numbers - If set to true, will show the month's numerical value (1 - 12) instead of the months full name.
+ * - use_short_month   - If set to true, will show the month's short name (i.e. Jan, Feb, Mar) instead of its full name.
+ *  
+ * <b>Examples:</b>
+ * <code>
+ *  echo submit_month_tag('month', 5, array('use_short_month' => true));
+ * </code>
+ *
+ * <code>
+ *  echo submit_month_tag('month', null, array('use_month_numbers' => true, 'include_blank' => true));
+ * </code>
+ *
+ * @param  string field name
+ * @param  integer selected value (1 - 12)
+ * @param  array  additional HTML compliant <select> tag parameters
+ * @return string <select> tag populated with all the months of the year (1 - 12).
+ * @see select_date_tag, select datetime_tag
+ */
+function select_month_tag($name, $value = null, $options = array(), $html_options = array())
+{
+  if ($value === null)
+  {
+    $value = date('n');
+  }
+
+  $options = _parse_attributes($options);
+
+  $select_options = array();
+  _convert_include_custom_for_select($options, $select_options);
+
+  if (_get_option($options, 'use_month_numbers'))
+  {
+    for ($k = 1; $k < 13; $k++) 
+    {
+      $select_options[$k] = str_pad($k, 2, '0', STR_PAD_LEFT);
+    }
+  }
+  else
+  {
+    $culture = _get_option($options, 'culture', sfContext::getInstance()->getUser()->getCulture());
+    $I18n_arr = _get_I18n_date_locales($culture);
+
+    if (_get_option($options, 'use_short_month'))
+    {
+      $month_names = $I18n_arr['dateFormatInfo']->getAbbreviatedMonthNames();
+    }
+    else
+    {
+      $month_names = $I18n_arr['dateFormatInfo']->getMonthNames();
+    }
+
+    $add_month_numbers = _get_option($options, 'add_month_numbers');
+    foreach ($month_names as $k => $v) 
+    {
+      $select_options[$k + 1] = $add_month_numbers ? ($k + 1).' - '.$v : $v;
+    }
+  }
+
+  return select_tag($name, options_for_select($select_options, $value), $html_options);
+}
+
+/**
+ * Returns a <select> tag populated with a range of years.
+ *
+ * By default, the <i>$value</i> parameter is set to today's year. To override this, simply pass a four-digit integer (YYYY)
+ * to the <i>$value</i> parameter. You can also set the <i>$value</i> parameter to null which will disable
+ * the <i>$value</i>, however this will only be useful if you pass 'include_blank' or 'include_custom' to the <i>$options</i>
+ * parameter. Also, the default selectable range of years is set to show five years back and five years forward from today's year.
+ * For instance, if today's year is 2006, the default 'year_start' option will be set to 2001 and the 'year_end' option will be set
+ * to 2011.  These start and end dates can easily be overwritten by setting the 'year_start' and 'year_end' options in the <i>$options</i>
+ * parameter. For convenience, Symfony also offers the select_date_tag helper function which combines the 
+ * select_year_tag, select_month_tag, and select_day_tag functions into a single helper.
+ *
+ * <b>Options:</b>
+ * - include_blank  - Includes a blank <option> tag at the beginning of the string with an empty value
+ * - include_custom - Includes an <option> tag with a custom display title at the beginning of the string with an empty value
+ * - year_start     - If set, the range of years will begin at this four-digit date (i.e. 1979)
+ * - year_end       - If set, the range of years will end at this four-digit date (i.e. 2025)
+ *  
+ * <b>Examples:</b>
+ * <code>
+ *  echo submit_year_tag('year');
+ * </code>
+ *
+ * <code>
+ *  $year_start = date('Y', strtotime('-10 years'));
+ *  $year_end = date('Y', strtotime('+10 years'));
+ *  echo submit_year_tag('year', null, array('year_start' => $year_start, 'year_end' => $year_end));
+ * </code>
+ *
+ * @param  string field name
+ * @param  integer selected value within the range of years.
+ * @param  array  additional HTML compliant <select> tag parameters
+ * @return string <select> tag populated with a range of years.
+ * @see select_date_tag, select datetime_tag
+ */
+function select_year_tag($name, $value = null, $options = array(), $html_options = array())
+{
+  if ($value === null)
+  {
+    $value = date('Y');
+  }
+    
+  $options = _parse_attributes($options);
+
+  $select_options = array();
+  _convert_include_custom_for_select($options, $select_options);
+
+  if (strlen($value) > 0 && is_numeric($value))
+  {
+    $year_origin = $value;
+  }
+  else
+  {
+    $year_origin = date('Y');
+  }
+
+  $year_start = _get_option($options, 'year_start', $year_origin - 5);
+  $year_end   = _get_option($options, 'year_end', $year_origin + 5);
+
+  $ascending  = ($year_start < $year_end);
+  $until_year = ($ascending) ? $year_end + 1 : $year_end - 1;
+
+  for ($x = $year_start; $x != $until_year; ($ascending) ? $x++ : $x--)
+  {
+    $select_options[$x] = $x;
+  }
+
+  return select_tag($name, options_for_select($select_options, $value), $html_options);
+}
+
+/**
+ * Returns three <select> tags populated with a range of months, days, and years.
+ *
+ * By default, the <i>$value</i> parameter is set to today's month, day and year. To override this, simply pass a valid date
+ * or a correctly formatted date array (see example) to the <i>$value</i> parameter. You can also set the <i>$value</i> 
+ * parameter to null which will disable the <i>$value</i>, however this will only be useful if you pass 'include_blank' or 
+ * 'include_custom' to the <i>$options</i> parameter. Also, the default selectable range of years is set to show five years 
+ * back and five years forward from today's year. For instance, if today's year is 2006, the default 'year_start' option will 
+ * be set to 2001 and the 'year_end' option will be set to 2011.  These start and end dates can easily be overwritten by 
+ * setting the 'year_start' and 'year_end' options in the <i>$options</i> parameter. 
+ *
+ * <b>Note:</b> The <i>$name</i> parameter will automatically converted to array names. For example, a <i>$name</i> of "date" becomes:
+ * <samp>
+ *  <select name="date[month]">...</select>
+ *  <select name="date[day]">...</select>
+ *  <select name="date[year]">...</select>
+ * </samp>
+ *  
+ * <b>Options:</b>
+ * - include_blank     - Includes a blank <option> tag at the beginning of the string with an empty value.
+ * - include_custom    - Includes an <option> tag with a custom display title at the beginning of the string with an empty value.
+ * - discard_month     - If set to true, will only return select tags for day and year.
+ * - discard_day       - If set to true, will only return select tags for month and year.
+ * - discard_year      - If set to true, will only return select tags for month and day.
+ * - use_month_numbers - If set to true, will show the month's numerical value (1 - 12) instead of the months full name.
+ * - use_short_month   - If set to true, will show the month's short name (i.e. Jan, Feb, Mar) instead of its full name.
+ * - year_start        - If set, the range of years will begin at this four-digit date (i.e. 1979)
+ * - year_end          - If set, the range of years will end at this four-digit date (i.e. 2025)
+ * - date_seperator    - Includes a string of defined text between each generated select tag
+ *  
+ * <b>Examples:</b>
+ * <code>
+ *  echo submit_date_tag('date');
+ * </code>
+ *
+ * <code>
+ *  echo select_date_tag('date', '2006-10-30');
+ * </code>
+ *
+ * <code>
+ *  $date = array('year' => '1979', 'month' => 10, 'day' => 30);
+ *  echo select_date_tag('date', $date, array('year_start' => $date['year'] - 10, 'year_end' => $date['year'] + 10));
+ * </code>
+ *
+ * @param  string field name (automatically becomes an array of parts: name[year], name[month], year[day])
+ * @param  mixed  accepts a valid date string or properly formatted date array
+ * @param  array  additional HTML compliant <select> tag parameters
+ * @return string three <select> tags populated with a months, days and years
+ * @see select datetime_tag, select_month_tag, select_date_tag, select_year_tag
+ */
+function select_date_tag($name, $value = null, $options = array(), $html_options = array())
+{
+  $options = _parse_attributes($options);
+
+  $culture = _get_option($options, 'culture', sfContext::getInstance()->getUser()->getCulture());
+
+  // set it back for month tag
+  $options['culture'] = $culture;
+
+  $I18n_arr = _get_I18n_date_locales($culture);
+
+  $date_seperator = _get_option($options, 'date_seperator', $I18n_arr['date_seperator']);
+  $discard_month  = _get_option($options, 'discard_month');
+  $discard_day    = _get_option($options, 'discard_day');
+  $discard_year   = _get_option($options, 'discard_year');
+
+  // discarding month automatically discards day
+  if ($discard_month)
+  {
+    $discard_day = true;
+  }
+
+  $order = _get_option($options, 'order');
+  $tags = array();
+  if (is_array($order) && count($order) == 3)
+  {
+    foreach ($order as $v)
+    {
+      $tags[] = $v[0];
+    }
+  }
+  else
+  {
+    $tags = $I18n_arr['date_order'];
+  }
+
+  if ($include_custom = _get_option($options, 'include_custom'))
+  {
+    $include_custom_month = is_array($include_custom)
+        ? (isset($include_custom['month']) ? array('include_custom' => $include_custom['month']) : array())
+        : array('include_custom' => $include_custom);
+
+    $include_custom_day = is_array($include_custom)
+        ? (isset($include_custom['day']) ? array('include_custom' => $include_custom['day']) : array())
+        : array('include_custom' => $include_custom);
+
+    $include_custom_year = is_array($include_custom)
+        ? (isset($include_custom['year']) ? array('include_custom' => $include_custom['year']) : array())
+        : array('include_custom' => $include_custom);
+  }
+  else
+  {
+    $include_custom_month = array();
+    $include_custom_day   = array();
+    $include_custom_year  = array();
+  }
+
+  $month_name = $name.'[month]';
+  $m = !$discard_month ? select_month_tag($month_name, _parse_value_for_date($value, 'month', 'm'), $options + $include_custom_month, $html_options) : '';
+
+  $day_name = $name.'[day]';
+  $d = !$discard_day ? select_day_tag($day_name, _parse_value_for_date($value, 'day', 'd'), $options + $include_custom_day, $html_options) : '';
+
+  $year_name = $name.'[year]';
+  $y = !$discard_year ? select_year_tag($year_name, _parse_value_for_date($value, 'year', 'Y'), $options + $include_custom_year, $html_options) : '';
+
+  // we have $tags = array ('m','d','y')
+  foreach ($tags as $k => $v)
+  {
+    // $tags['m|d|y'] = $m|$d|$y
+    $tags[$k] = $$v;
+  }
+
+  return implode($date_seperator, $tags);
+}
+
+/**
+ * Returns a <select> tag populated with 60 seconds (0 - 59).
+ *
+ * By default, the <i>$value</i> parameter is set to the current second (right now). To override this, simply pass an integer 
+ * (0 - 59) to the <i>$value</i> parameter. You can also set the <i>$value</i> parameter to null which will disable
+ * the <i>$value</i>, however this will only be useful if you pass 'include_blank' or 'include_custom' to the <i>$options</i>
+ * parameter. In many cases, you have no need for all 60 seconds in a minute.  the 'second_step' option in the 
+ * <i>$options</i> parameter gives you the ability to define intervals to display.  So for instance you could define 15 as your 
+ * 'minute_step' interval and the select tag would return the values 0, 15, 30, and 45. For convenience, Symfony also offers the 
+ * select_time_tag select_datetime_tag helper functions which combine other date and time helpers to easily build date and time select boxes.
+ *
+ * <b>Options:</b>
+ * - include_blank  - Includes a blank <option> tag at the beginning of the string with an empty value.
+ * - include_custom - Includes an <option> tag with a custom display title at the beginning of the string with an empty value.
+ * - second_step    - If set, the seconds will be incremented in blocks of X, where X = 'second_step'
+ * 
+ * <b>Examples:</b>
+ * <code>
+ *  echo submit_second_tag('second');
+ * </code>
+ *
+ * <code>
+ *  echo submit_second_tag('second', 15, array('second_step' => 15));
+ * </code>
+ *
+ * @param  string field name
+ * @param  integer selected value (0 - 59)
+ * @param  array  additional HTML compliant <select> tag parameters
+ * @return string <select> tag populated with 60 seconds (0 - 59).
+ * @see select_time_tag, select datetime_tag
+ */
+function select_second_tag($name, $value = null, $options = array(), $html_options = array())
+{
+  if ($value === null)
+  {
+    $value = date('s');
+  }
+
+  $options = _parse_attributes($options);
+  $select_options = array();
+  _convert_include_custom_for_select($options, $select_options);
+
+  $second_step = _get_option($options, 'second_step', 1);
+  for ($x = 0; $x < 60; $x += $second_step)
+  {
+    $select_options[$x] = str_pad($x, 2, '0', STR_PAD_LEFT);
+  }
+
+  return select_tag($name, options_for_select($select_options, $value), $html_options);
+}
+
+/**
+ * Returns a <select> tag populated with 60 minutes (0 - 59).
+ *
+ * By default, the <i>$value</i> parameter is set to the current minute. To override this, simply pass an integer 
+ * (0 - 59) to the <i>$value</i> parameter. You can also set the <i>$value</i> parameter to null which will disable
+ * the <i>$value</i>, however this will only be useful if you pass 'include_blank' or 'include_custom' to the <i>$options</i>
+ * parameter. In many cases, you have no need for all 60 minutes in an hour.  the 'minute_step' option in the 
+ * <i>$options</i> parameter gives you the ability to define intervals to display.  So for instance you could define 15 as your 
+ * 'minute_step' interval and the select tag would return the values 0, 15, 30, and 45. For convenience, Symfony also offers the 
+ * select_time_tag select_datetime_tag helper functions which combine other date and time helpers to easily build date and time select boxes.
+ *
+ * <b>Options:</b>
+ * - include_blank  - Includes a blank <option> tag at the beginning of the string with an empty value.
+ * - include_custom - Includes an <option> tag with a custom display title at the beginning of the string with an empty value.
+ * - minute_step    - If set, the minutes will be incremented in blocks of X, where X = 'minute_step'
+ * 
+ * <b>Examples:</b>
+ * <code>
+ *  echo submit_minute_tag('minute');
+ * </code>
+ *
+ * <code>
+ *  echo submit_minute_tag('minute', 15, array('minute_step' => 15));
+ * </code>
+ *
+ * @param  string field name
+ * @param  integer selected value (0 - 59)
+ * @param  array  additional HTML compliant <select> tag parameters
+ * @return string <select> tag populated with 60 minutes (0 - 59).
+ * @see select_time_tag, select datetime_tag
+ */
+function select_minute_tag($name, $value = null, $options = array(), $html_options = array())
+{
+  if ($value === null)
+  {
+    $value = date('i');
+  }
+
+  $options = _parse_attributes($options);
+  $select_options = array();
+  _convert_include_custom_for_select($options, $select_options);
+
+  $minute_step = _get_option($options, 'minute_step', 1);
+  for ($x = 0; $x < 60; $x += $minute_step)
+  {
+    $select_options[$x] = str_pad($x, 2, '0', STR_PAD_LEFT);
+  }
+
+  return select_tag($name, options_for_select($select_options, $value), $html_options);
+}
+
+/**
+ * Returns a <select> tag populated with 24 hours (0 - 23), or optionally 12 hours (1 - 12).
+ *
+ * By default, the <i>$value</i> parameter is set to the current hour. To override this, simply pass an integer 
+ * (0 - 23 or 1 - 12 if '12hour_time' = true) to the <i>$value</i> parameter. You can also set the <i>$value</i> parameter to null which will disable
+ * the <i>$value</i>, however this will only be useful if you pass 'include_blank' or 'include_custom' to the <i>$options</i>
+ * parameter. For convenience, Symfony also offers the select_time_tag select_datetime_tag helper functions
+ * which combine other date and time helpers to easily build date and time select boxes.
+ *
+ * <b>Options:</b>
+ * - include_blank  - Includes a blank <option> tag at the beginning of the string with an empty value.
+ * - include_custom - Includes an <option> tag with a custom display title at the beginning of the string with an empty value.
+ * - 12hour_time    - If set to true, will return integers 1 through 12 instead of the default 0 through 23 as well as an AM/PM select box.
+ * 
+ * <b>Examples:</b>
+ * <code>
+ *  echo submit_hour_tag('hour');
+ * </code>
+ *
+ * <code>
+ *  echo submit_hour_tag('hour', 6, array('12hour_time' => true));
+ * </code>
+ *
+ * @param  string field name
+ * @param  integer selected value (0 - 23 or 1 - 12 if '12hour_time' = true)
+ * @param  array  additional HTML compliant <select> tag parameters
+ * @return string <select> tag populated with 24 hours (0 - 23), or optionally 12 hours (1 - 12).
+ * @see select_time_tag, select datetime_tag
+ */
+function select_hour_tag($name, $value = null, $options = array(), $html_options = array())
+{
+  $options = _parse_attributes($options);
+  $select_options = array();
+  _convert_include_custom_for_select($options, $select_options);
+
+  $_12hour_time = _get_option($options, '12hour_time');
+
+  if ($value === null)
+  {
+    $value = date($_12hour_time ? 'h' : 'H');
+  }
+
+  $start_hour = $_12hour_time ? 1  : 0;
+  $end_hour   = $_12hour_time ? 12 : 23;
+
+  for ($x = $start_hour; $x <= $end_hour; $x++)
+  {
+    $select_options[$x] = str_pad($x, 2, '0', STR_PAD_LEFT);
+  }
+
+  return select_tag($name, options_for_select($select_options, $value), $html_options);
+}
+
+/**
+ * Returns a <select> tag populated with AM and PM options for use with 12-Hour time.
+ *
+ * By default, the <i>$value</i> parameter is set to the correct AM/PM setting based on the current time. 
+ * To override this, simply pass either AM or PM to the <i>$value</i> parameter. You can also set the 
+ * <i>$value</i> parameter to null which will disable the <i>$value</i>, however this will only be 
+ * useful if you pass 'include_blank' or 'include_custom' to the <i>$options</i> parameter. For 
+ * convenience, Symfony also offers the select_time_tag select_datetime_tag helper functions
+ * which combine other date and time helpers to easily build date and time select boxes.
+ *
+ * <b>Options:</b>
+ * - include_blank  - Includes a blank <option> tag at the beginning of the string with an empty value.
+ * - include_custom - Includes an <option> tag with a custom display title at the beginning of the string with an empty value.
+ * 
+ * <b>Examples:</b>
+ * <code>
+ *  echo submit_ampm_tag('ampm');
+ * </code>
+ *
+ * <code>
+ *  echo submit_ampm_tag('ampm', 'PM', array('include_blank' => true));
+ * </code>
+ *
+ * @param  string field name
+ * @param  integer selected value (AM or PM)
+ * @param  array  additional HTML compliant <select> tag parameters
+ * @return string <select> tag populated with AM and PM options for use with 12-Hour time.
+ * @see select_time_tag, select datetime_tag
+ */
+function select_ampm_tag($name, $value = null, $options = array(), $html_options = array())
+{
+  if ($value === null)
+  {
+    $value = date('A');
+  }
+
+  $options = _parse_attributes($options);
+  $select_options = array();
+  _convert_include_custom_for_select($options, $select_options);
+
+  $select_options['AM'] = 'AM';
+  $select_options['PM'] = 'PM';
+
+  return select_tag($name, options_for_select($select_options, $value), $html_options);
+}
+
+/**
+ * Returns three <select> tags populated with hours, minutes, and optionally seconds.
+ *
+ * By default, the <i>$value</i> parameter is set to the current hour and minute. To override this, simply pass a valid time
+ * or a correctly formatted time array (see example) to the <i>$value</i> parameter. You can also set the <i>$value</i> 
+ * parameter to null which will disable the <i>$value</i>, however this will only be useful if you pass 'include_blank' or 
+ * 'include_custom' to the <i>$options</i> parameter. To include seconds to the result, use set the 'include_second' option in the 
+ * <i>$options</i> parameter to true. <b>Note:</b> The <i>$name</i> parameter will automatically converted to array names. 
+ * For example, a <i>$name</i> of "time" becomes:
+ * <samp>
+ *  <select name="time[hour]">...</select>
+ *  <select name="time[minute]">...</select>
+ *  <select name="time[second]">...</select>
+ * </samp>
+ *  
+ * <b>Options:</b>
+ * - include_blank  - Includes a blank <option> tag at the beginning of the string with an empty value.
+ * - include_custom - Includes an <option> tag with a custom display title at the beginning of the string with an empty value.
+ * - include_second - If set to true, includes the "seconds" select tag as part of the result.
+ * - second_step    - If set, the seconds will be incremented in blocks of X, where X = 'second_step'
+ * - minute_step    - If set, the minutes will be incremented in blocks of X, where X = 'minute_step'
+ * - 12hour_time    - If set to true, will return integers 1 through 12 instead of the default 0 through 23 as well as an AM/PM select box.
+ * - time_seperator - Includes a string of defined text between each generated select tag
+ * - ampm_seperator - Includes a string of defined text between the minute/second select box and the AM/PM select box 
+ *  
+ * <b>Examples:</b>
+ * <code>
+ *  echo submit_time_tag('time');
+ * </code>
+ *
+ * <code>
+ *  echo select_time_tag('date', '09:31');
+ * </code>
+ *
+ * <code>
+ *  $time = array('hour' => '15', 'minute' => 46, 'second' => 01);
+ *  echo select_time_tag('time', $time, array('include_second' => true, '12hour_time' => true));
+ * </code>
+ *
+ * @param  string field name (automatically becomes an array of parts: name[hour], name[minute], year[second])
+ * @param  mixed  accepts a valid time string or properly formatted time array
+ * @param  array  additional HTML compliant <select> tag parameters
+ * @return string three <select> tags populated with a hours, minutes and optionally seconds.
+ * @see select datetime_tag, select_hour_tag, select_minute_tag, select_second_tag
+ */
+function select_time_tag($name, $value = null, $options = array(), $html_options = array())
+{
+  $options = _parse_attributes($options);
+
+  $time_seperator = _get_option($options, 'time_seperator', ':');
+  $ampm_seperator = _get_option($options, 'ampm_seperator', '');
+  $include_second = _get_option($options, 'include_second');
+  $_12hour_time   = _get_option($options, '12hour_time');
+
+  $options['12hour_time'] = $_12hour_time; // set it back. hour tag needs it.
+
+  if ($include_custom = _get_option($options, 'include_custom'))
+  {
+    $include_custom_hour = (is_array($include_custom))
+        ? ((isset($include_custom['hour'])) ? array('include_custom'=>$include_custom['hour']) : array()) 
+        : array('include_custom'=>$include_custom);
+
+    $include_custom_minute = (is_array($include_custom))
+        ? ((isset($include_custom['minute'])) ? array('include_custom'=>$include_custom['minute']) : array()) 
+        : array('include_custom'=>$include_custom);
+
+    $include_custom_second = (is_array($include_custom))
+        ? ((isset($include_custom['second'])) ? array('include_custom'=>$include_custom['second']) : array()) 
+        : array('include_custom'=>$include_custom);
+
+    $include_custom_ampm = (is_array($include_custom))
+        ? ((isset($include_custom['ampm'])) ? array('include_custom'=>$include_custom['ampm']) : array()) 
+        : array('include_custom'=>$include_custom);
+  }
+  else
+  {
+    $include_custom_hour = array();
+    $include_custom_minute = array();
+    $include_custom_second = array();
+    $include_custom_ampm = array();
+  }
+
+  $tags = array();
+
+  $hour_name = $name.'[hour]';
+  $tags[] = select_hour_tag($hour_name, _parse_value_for_date($value, 'hour', $_12hour_time ? 'h' : 'H'), $options + $include_custom_hour, $html_options);
+
+  $minute_name = $name.'[minute]';
+  $tags[] = select_minute_tag($minute_name, _parse_value_for_date($value, 'minute', 'i'), $options + $include_custom_minute, $html_options);
+
+  if ($include_second)
+  {
+    $second_name = $name.'[second]';
+    $tags[] = select_second_tag($second_name, _parse_value_for_date($value, 'second', 's'), $options + $include_custom_second, $html_options);
+  }
+
+  $time = implode($time_seperator, $tags);
+
+  if ($_12hour_time)
+  {
+    $ampm_name = $name.'[ampm]';
+    $time .=  $ampm_seperator.select_ampm_tag($ampm_name, _parse_value_for_date($value, 'ampm', 'A'), $options + $include_custom_ampm, $html_options);
+  }
+
+  return $time;
+}
+
+/**
+ * Returns a variable number of <select> tags populated with date and time related select boxes.
+ *
+ * The select_datetime_tag is the culmination of both the select_date_tag and the select_time_tag.
+ * By default, the <i>$value</i> parameter is set to the current date and time. To override this, simply pass a valid 
+ * date, time, datetime string or correctly formatted array (see example) to the <i>$value</i> parameter. 
+ * You can also set the <i>$value</i> parameter to null which will disable the <i>$value</i>, however this 
+ * will only be useful if you pass 'include_blank' or 'include_custom' to the <i>$options</i> parameter. 
+ * To include seconds to the result, use set the 'include_second' option in the <i>$options</i> parameter to true. 
+ * <b>Note:</b> The <i>$name</i> parameter will automatically converted to array names. 
+ * For example, a <i>$name</i> of "datetime" becomes:
+ * <samp>
+ *  <select name="datetime[month]">...</select>
+ *  <select name="datetime[day]">...</select>
+ *  <select name="datetime[year]">...</select>
+ *  <select name="datetime[hour]">...</select>
+ *  <select name="datetime[minute]">...</select>
+ *  <select name="datetime[second]">...</select>
+ * </samp>
+ *  
+ * <b>Options:</b>
+ * - include_blank     - Includes a blank <option> tag at the beginning of the string with an empty value.
+ * - include_custom    - Includes an <option> tag with a custom display title at the beginning of the string with an empty value.
+ * - include_second    - If set to true, includes the "seconds" select tag as part of the result.
+ * - discard_month     - If set to true, will only return select tags for day and year.
+ * - discard_day       - If set to true, will only return select tags for month and year.
+ * - discard_year      - If set to true, will only return select tags for month and day.
+ * - use_month_numbers - If set to true, will show the month's numerical value (1 - 12) instead of the months full name.
+ * - use_short_month   - If set to true, will show the month's short name (i.e. Jan, Feb, Mar) instead of its full name. 
+ * - year_start        - If set, the range of years will begin at this four-digit date (i.e. 1979)
+ * - year_end          - If set, the range of years will end at this four-digit date (i.e. 2025)
+ * - second_step       - If set, the seconds will be incremented in blocks of X, where X = 'second_step'
+ * - minute_step       - If set, the minutes will be incremented in blocks of X, where X = 'minute_step'
+ * - 12hour_time       - If set to true, will return integers 1 through 12 instead of the default 0 through 23.
+ * - date_seperator    - Includes a string of defined text between each generated select tag
+ * - time_seperator    - Includes a string of defined text between each generated select tag
+ * - ampm_seperator    - Includes a string of defined text between the minute/second select box and the AM/PM select box 
+ *  
+ * <b>Examples:</b>
+ * <code>
+ *  echo submit_datetime_tag('datetime');
+ * </code>
+ *
+ * <code>
+ *  echo select_datetime_tag('datetime', '1979-10-30');
+ * </code>
+ *
+ * <code>
+ *  $datetime = array('year' => '1979', 'month' => 10, 'day' => 30, 'hour' => '15', 'minute' => 46);
+ *  echo select_datetime_tag('time', $datetime, array('use_short_month' => true, '12hour_time' => true));
+ * </code>
+ *
+ * @param  string field name (automatically becomes an array of date and time parts)
+ * @param  mixed  accepts a valid time string or properly formatted time array
+ * @param  array  additional HTML compliant <select> tag parameters
+ * @return string a variable number of <select> tags populated with date and time related select boxes
+ * @see select date_tag, select_time_tag
+ */
+function select_datetime_tag($name, $value = null, $options = array(), $html_options = array())
+{
+  $options = _parse_attributes($options);
+  $datetime_seperator = _get_option($options, 'datetime_seperator', '');
+
+  $date = select_date_tag($name, $value, $options, $html_options);
+  $time = select_time_tag($name, $value, $options, $html_options);
+
+  return $date.$datetime_seperator.$time;
+}
+
+/**
+ * Returns a <select> tag, populated with a range of numbers
+ *
+ * By default, the select_number_tag generates a list of numbers from 1 - 10, with an incremental value of 1.  These values
+ * can be easily changed by passing one or several <i>$options</i>.  Numbers can be either positive or negative, integers or decimals,
+ * and can be incremented by any number, decimal or integer.  If you require the range of numbers to be listed in descending order, pass
+ * the 'reverse' option to easily display the list of numbers in the opposite direction.
+ * 
+ * <b>Options:</b>
+ * - include_blank  - Includes a blank <option> tag at the beginning of the string with an empty value.
+ * - include_custom - Includes an <option> tag with a custom display title at the beginning of the string with an empty value.
+ * - multiple       - If set to true, the select tag will allow multiple numbers to be selected at once.
+ * - start          - The first number in the list. If not specified, the default value is 1.
+ * - end            - The last number in the list. If not specified, the default value is 10.
+ * - increment      - The number by which to increase each number in the list by until the number is greater than or equal to the 'end' option. 
+ *                    If not specified, the default value is 1.
+ * - reverse        - Reverses the order of numbers so they are display in descending order
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo select_number_tag('rating', '', array('reverse' => true));
+ * </code>
+ *
+ * <code>
+ *  echo echo select_number_tag('tax_rate', '0.07', array('start' => '0.05', 'end' => '0.09', 'increment' => '0.01'));
+ * </code>
+ *
+ * <code>
+ *  echo select_number_tag('limit', 5, array('start' => 5, 'end' => 120, 'increment' => 15));
+ * </code>
+ *
+ * @param  string field name 
+ * @param  string the selected option
+ * @param  array  <i>$options</i> to manipulate the output of the tag.
+ * @param  array  additional HTML compliant <select> tag parameters
+ * @return string <select> tag populated with a range of numbers.
+ * @see options_for_select, content_tag
+ */
+function select_number_tag($name, $value, $options = array(), $html_options = array())
+{
+  $increment = _get_option($options, 'increment', 1);
+
+  $range = array();
+  $max = _get_option($options, 'end', 10) + $increment;
+  for ($x = _get_option($options, 'start', 1); $x < $max; $x += $increment)
+  {
+    $range[(string) $x] = $x;
+  }
+
+  if (_get_option($options, 'reverse'))
+  {
+    $range = array_reverse($range, true);
+  }
+
+  return select_tag($name, options_for_select($range, $value, $options), $html_options);
+}
+
+/**
+ * Returns a <select> tag populated with all the timezones in the world.
+ *
+ * The select_timezone_tag builds off the traditional select_tag function, and is conveniently populated with 
+ * all the timezones in the world (sorted alphabetically). Each option in the list has a unique timezone identifier 
+ * for its value and the timezone's locale as its display title.  The timezone data is retrieved via the sfCultureInfo
+ * class, which stores a wide variety of i18n and i10n settings for various countries and cultures throughout the world.
+ * Here's an example of an <option> tag generated by the select_timezone_tag:
+ *
+ * <b>Options:</b>
+ * - display - 
+ *     identifer         - Display the PHP timezone identifier (e.g. America/Denver)
+ *     timezone          - Display the full timezone name (e.g. Mountain Standard Time)
+ *     timezone_abbr     - Display the timezone abbreviation (e.g. MST)
+ *     timzone_dst       - Display the full timezone name with daylight savings time (e.g. Mountain Daylight Time)
+ *     timezone_dst_abbr - Display the timezone abbreviation with daylight savings time (e.g. MDT)
+ *     city              - Display the city/region that relates to the timezone (e.g. Denver)
+ * 
+ * <samp>
+ *  <option value="America/Denver">America/Denver</option>
+ * </samp>
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo select_timezone_tag('timezone', 'America/Denver');
+ * </code>
+ *
+ * @param  string field name 
+ * @param  string selected field value (timezone identifier)
+ * @param  array  additional HTML compliant <select> tag parameters
+ * @return string <select> tag populated with all the timezones in the world.
+ * @see select_tag, options_for_select, sfCultureInfo
+ */
+function select_timezone_tag($name, $selected = null, $options = array())
+{
+  if (!isset($options['display'])) $options['display'] = 'identifier';
+  
+  $c = new sfCultureInfo(sfContext::getInstance()->getUser()->getCulture());
+  $timezone_groups = $c->getTimeZones();
+  
+  $display_key = 0;
+  
+  switch ($options['display'])
+  {
+    case "identifier":
+      $display_key = 0;
+      break;
+      
+    case "timezone":
+      $display_key = 1;
+      break;
+     
+    case "timezone_abbr":
+      $display_key = 2;
+      break;
+            
+    case "timezone_dst":
+      $display_key = 3;
+      break;
+      
+    case "timezone_dst_abbr":
+      $display_key = 3;
+      break;
+      
+    case "city":
+      $display_key = 4;
+      break;
+      
+    default:
+      $display_key = 0;
+      break;
+  }
+  
+  unset($options['display']);
+  
+  $timezones = array();
+  foreach ($timezone_groups as $tz_group_key => $tz_group)
+  {
+    $array_key = null;
+    
+    foreach ($tz_group as $tz_key => $tz)
+    {
+      if ($tz_key == 0) $array_key = $tz;
+      if ($tz_key == $display_key AND !empty($tz)) $timezones[$array_key] = $tz;
+    }
+  }
+  
+  // Remove duplicate values
+  $timezones = array_unique($timezones);
+  
+  if ($timezone_option = _get_option($options, 'timezones'))
+  {
+    $diff = array_diff_key($timezones, array_flip((array) $timezone_option));
+    foreach ($diff as $key => $v)
+    {
+      unset($timezones[$key]);
+    }
+  }
+  
+  asort($timezones);
+
+  $option_tags = options_for_select($timezones, $selected);
+
+  return select_tag($name, $option_tags, $options);
+}
+
+/**
+ * Converts date values (<i>$value</i>) into its correct date format (<i>$format_char</i>)
+ *
+ * This function is primarily used in select_date_tag, select_time_tag and select_datetime_tag.
+ *
+ * <b>Note:</b> If <i>$value</i> is empty, it will be populated with the current date and time.
+ *
+ * @param  string date or date part
+ * @param  string custom key for array values
+ * @return string properly formatted date part value.
+ * @see select_date_tag, select_time_tag, select_datetime_tag
+ */
+function _parse_value_for_date($value, $key, $format_char)
+{
+  if (is_array($value))
+  {
+    return (isset($value[$key])) ? $value[$key] : '';
+  }
+  else if (is_numeric($value))
+  {
+    return date($format_char, $value);
+  }
+  else if ($value == '' || ($key == 'ampm' && ($value == 'AM' || $value == 'PM')))
+  {
+    return $value;
+  }
+  else if (empty($value))
+  {
+    $value = date('Y-m-d H:i:s');
+  }
+
+  // english text presentation
+  return date($format_char, strtotime($value));
+}
+
+/**
+ * Retrieves the proper date format based on the specified <i>$culture</i> setting
+ *
+ * <b>Note:</b> If no <i>$culture</i> is defined, the user's culture setting will be used in its place.
+ *
+ * @param  string two or three character culture setting variable
+ * @return string formatted date/time format based on the specified date/time setting
+ * @see sfUser
+ */
+function _get_I18n_date_locales($culture = null)
+{
+  if (!$culture)
+  {
+    $culture = sfContext::getInstance()->getUser()->getCulture();
+  }
+
+  $retval = array('culture'=>$culture);
+
+  $dateFormatInfo = sfDateTimeFormatInfo::getInstance($culture);
+  $date_format = strtolower($dateFormatInfo->getShortDatePattern());
+
+  $retval['dateFormatInfo'] = $dateFormatInfo;
+
+  $match_pattern = "/([dmy]+)(.*?)([dmy]+)(.*?)([dmy]+)/";
+  if (!preg_match($match_pattern, $date_format, $match_arr))
+  {
+    // if matching fails use en shortdate
+    preg_match($match_pattern, 'm/d/yy', $match_arr);
+  }
+
+  $retval['date_seperator'] = $match_arr[2];
+
+  // unset all but [dmy]+
+  unset($match_arr[0], $match_arr[2], $match_arr[4]);
+
+  $retval['date_order'] = array();
+  foreach ($match_arr as $v)
+  {
+    // 'm/d/yy' => $retval[date_order] = array ('m', 'd', 'y');
+    $retval['date_order'][] = $v[0];
+  }
+
+  return $retval;
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/DateFormHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/DateHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/DateHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/DateHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,170 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * DateHelper.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: DateHelper.php 3495 2007-02-18 09:30:24Z fabien $
+ */
+
+function format_daterange($start_date, $end_date, $format = 'd', $full_text, $start_text, $end_text, $culture = null, $charset = null)
+{
+  if ($start_date != '' && $end_date != '')
+  {
+    return sprintf($full_text, format_date($start_date, $format, $culture, $charset), format_date($end_date, $format, $culture, $charset));
+  }
+  else if ($start_date != '')
+  {
+    return sprintf($start_text, format_date($start_date, $format, $culture, $charset));
+  }
+  else if ($end_date != '')
+  {
+    return sprintf($end_text, format_date($end_date, $format, $culture, $charset));
+  }
+}
+
+function format_date($date, $format = 'd', $culture = null, $charset = null)
+{
+  static $dateFormats = array();
+
+  if (is_null($date))
+  {
+    return null;
+  }
+
+  if (!$culture)
+  {
+    $culture = sfContext::getInstance()->getUser()->getCulture();
+  }
+
+  if (!$charset)
+  {
+    $charset = sfConfig::get('sf_charset');
+  }
+
+  if (!isset($dateFormats[$culture]))
+  {
+    $dateFormats[$culture] = new sfDateFormat($culture);
+  }
+
+  return $dateFormats[$culture]->format($date, $format, null, $charset);
+}
+
+function format_datetime($date, $format = 'F', $culture = null, $charset = null)
+{
+  return format_date($date, $format, $culture, $charset);
+}
+
+function distance_of_time_in_words($from_time, $to_time = null, $include_seconds = false)
+{
+  $to_time = $to_time? $to_time: time();
+
+  $distance_in_minutes = floor(abs($to_time - $from_time) / 60);
+  $distance_in_seconds = floor(abs($to_time - $from_time));
+
+  $string = '';
+  $parameters = array();
+
+  if ($distance_in_minutes <= 1)
+  {
+    if (!$include_seconds)
+    {
+      $string = $distance_in_minutes == 0 ? 'less than a minute' : '1 minute';
+    }
+    else
+    {
+      if ($distance_in_seconds <= 5)
+      {
+        $string = 'less than 5 seconds';
+      }
+      else if ($distance_in_seconds >= 6 && $distance_in_seconds <= 10)
+      {
+        $string = 'less than 10 seconds';
+      }
+      else if ($distance_in_seconds >= 11 && $distance_in_seconds <= 20)
+      {
+        $string = 'less than 20 seconds';
+      }
+      else if ($distance_in_seconds >= 21 && $distance_in_seconds <= 40)
+      {
+        $string = 'half a minute';
+      }
+      else if ($distance_in_seconds >= 41 && $distance_in_seconds <= 59)
+      {
+        $string = 'less than a minute';
+      }
+      else
+      {
+        $string = '1 minute';
+      }
+    }
+  }
+  else if ($distance_in_minutes >= 2 && $distance_in_minutes <= 45)
+  {
+    $string = '%minutes% minutes';
+    $parameters['%minutes%'] = $distance_in_minutes;
+  }
+  else if ($distance_in_minutes >= 46 && $distance_in_minutes <= 90)
+  {
+    $string = 'about 1 hour';
+  }
+  else if ($distance_in_minutes >= 90 && $distance_in_minutes <= 1440)
+  {
+    $string = 'about %hours% hours';
+    $parameters['%hours%'] = round($distance_in_minutes / 60);
+  }
+  else if ($distance_in_minutes >= 1441 && $distance_in_minutes <= 2880)
+  {
+    $string = '1 day';
+  }
+  else if ($distance_in_minutes >= 2880 && $distance_in_minutes <= 43199)
+  {
+    $string = '%days% days';
+    $parameters['%days%'] = round($distance_in_minutes / 1440);
+  }
+  else if ($distance_in_minutes >= 43200 && $distance_in_minutes <= 86399)
+  {
+    $string = 'about 1 month';
+  }
+  else if ($distance_in_minutes >= 86400 && $distance_in_minutes <= 525959)
+  {
+    $string = '%months% months';
+    $parameters['%months%'] = round($distance_in_minutes / 43200);
+  }
+  else if ($distance_in_minutes >= 525960 && $distance_in_minutes <= 1051919)
+  {
+    $string = 'about 1 year';
+  }
+  else
+  {
+    $string = 'over %years% years';
+    $parameters['%years%'] = round($distance_in_minutes / 525960);
+  }
+
+  if (sfConfig::get('sf_i18n'))
+  {
+    use_helper('I18N');
+
+    return __($string, $parameters);
+  }
+  else
+  {
+    return strtr($string, $parameters);
+  }
+}
+
+// Like distance_of_time_in_words, but where to_time is fixed to time()
+function time_ago_in_words($from_time, $include_seconds = false)
+{
+  return distance_of_time_in_words($from_time, time(), $include_seconds);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/DateHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/DebugHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/DebugHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/DebugHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,17 @@
+<?php
+
+function debug_message($message)
+{
+  if (sfConfig::get('sf_web_debug'))
+  {
+    sfWebDebug::getInstance()->logShortMessage($message);
+  }
+}
+
+function log_message($message, $priority = 'info')
+{
+  if (sfConfig::get('sf_logging_enabled'))
+  {
+    sfContext::getInstance()->getLogger()->log($message, constant('SF_LOG_'.strtoupper($priority)));
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/DebugHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/EscapingHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/EscapingHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/EscapingHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,94 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * The functions are primarily used by the output escaping component.
+ *
+ * Each function specifies a way for applying a transformation to a string
+ * passed to it. The purpose is for the string to be "escaped" so it is
+ * suitable for the format it is being displayed in.
+ *
+ * For example, the string: "It's required that you enter a username & password.\n"
+ * If this were to be displayed as HTML it would be sensible to turn the
+ * ampersand into '&amp;' and the apostrophe into '&aps;'. However if it were
+ * going to be used as a string in JavaScript to be displayed in an alert box
+ * it would be right to leave the string as-is, but c-escape the apostrophe and
+ * the new line.
+ *
+ * For each function there is a define to avoid problems with strings being
+ * incorrectly specified.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Mike Squire <mike en somosis.co.uk>
+ * @version    SVN: $Id: EscapingHelper.php 2669 2006-11-13 17:06:36Z fabien $
+ */
+
+/**
+ * Runs the PHP function htmlentities on the value passed.
+ *
+ * @param string $value the value to escape
+ * @return string the escaped value
+ */
+function esc_entities($value)
+{
+  // Numbers and boolean values get turned into strings which can cause problems
+  // with type comparisons (e.g. === or is_int() etc).
+  return is_string($value) ? htmlentities($value, ENT_QUOTES, sfConfig::get('sf_charset')) : $value;
+}
+
+define('ESC_ENTITIES', 'esc_entities');
+
+/**
+ * An identity function that merely returns that which it is given, the purpose
+ * being to be able to specify that the value is not to be escaped in any way.
+ *
+ * @param string $value the value to escape
+ * @return string the escaped value
+ */
+function esc_raw($value)
+{
+  return $value;
+}
+
+define('ESC_RAW', 'esc_raw');
+
+/**
+ * A function that c-escapes a string after applying {@link esc_entities()}. The
+ * assumption is that the value will be used to generate dynamic HTML in some
+ * way and the safest way to prevent mishap is to assume the value should have
+ * HTML entities set properly.
+ *
+ * The {@link esc_js_no_entities()} method should be used to escape a string
+ * that is ultimately not going to end up as text in an HTML document.
+ *
+ * @param string $value the value to escape
+ * @return string the escaped value
+ */
+function esc_js($value)
+{
+  return esc_js_no_entities(esc_entities($value));
+}
+
+define('ESC_JS', 'esc_js');
+
+/**
+ * A function the c-escapes a string, making it suitable to be placed in a
+ * JavaScript string.
+ *
+ * @param string $value the value to escape
+ * @return string the escaped value
+ */
+function esc_js_no_entities($value)
+{
+  return addcslashes($value, "\0..\37\\'\"\177..\377\/");
+}
+
+define('ESC_JS_NO_ENTITIES', 'esc_js_no_entities');


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/EscapingHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/FormHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/FormHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/FormHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,926 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004 David Heinemeier Hansson
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * FormHelper.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     David Heinemeier Hansson
+ * @version    SVN: $Id: FormHelper.php 3491 2007-02-18 09:07:59Z fabien $
+ */
+
+/**
+ * Returns a formatted set of <option> tags based on optional <i>$options</i> array variable.
+ *
+ * The options_for_select helper is usually called in conjunction with the select_tag helper, as it is relatively
+ * useless on its own. By passing an array of <i>$options</i>, the helper will automatically generate <option> tags
+ * using the array key as the value and the array value as the display title. Additionally the options_for_select tag is
+ * smart enough to detect nested arrays as <optgroup> tags.  If the helper detects that the array value is an array itself,
+ * it creates an <optgroup> tag with the name of the group being the key and the contents of the <optgroup> being the array.
+ *
+ * <b>Options:</b>
+ * - include_blank  - Includes a blank <option> tag at the beginning of the string with an empty value
+ * - include_custom - Includes an <option> tag with a custom display title at the beginning of the string with an empty value
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo select_tag('person', options_for_select(array(1 => 'Larry', 2 => 'Moe', 3 => 'Curly')));
+ * </code>
+ *
+ * <code>
+ *  $card_list = array('VISA' => 'Visa', 'MAST' => 'MasterCard', 'AMEX' => 'American Express', 'DISC' => 'Discover');
+ *  echo select_tag('cc_type', options_for_select($card_list, 'AMEX', array('include_custom' => '-- Select Credit Card Type --')));
+ * </code>
+ *
+ * <code>
+ *  $optgroup_array = array(1 => 'Joe', 2 => 'Sue', 'Group A' => array(3 => 'Mary', 4 => 'Tom'), 'Group B' => array(5 => 'Bill', 6 =>'Andy'));
+ *  echo select_tag('employee', options_for_select($optgroup_array, null, array('include_blank' => true)), array('class' => 'mystyle'));
+ * </code>
+ *
+ * @param  array dataset to create <option> tags and <optgroup> tags from
+ * @param  string selected option value
+ * @param  array  additional HTML compliant <option> tag parameters
+ * @return string populated with <option> tags derived from the <i>$options</i> array variable
+ * @see select_tag
+ */
+function options_for_select($options = array(), $selected = '', $html_options = array())
+{
+  $html_options = _parse_attributes($html_options);
+
+  if (is_array($selected))
+  {
+    $selected = array_map('strval', array_values($selected));
+  }
+
+  $html = '';
+
+  if ($value = _get_option($html_options, 'include_custom'))
+  {
+    $html .= content_tag('option', $value, array('value' => ''))."\n";
+  }
+  else if (_get_option($html_options, 'include_blank'))
+  {
+    $html .= content_tag('option', '', array('value' => ''))."\n";
+  }
+
+  foreach ($options as $key => $value)
+  {
+    if (is_array($value))
+    {
+      $html .= content_tag('optgroup', options_for_select($value, $selected, $html_options), array('label' => $key))."\n";
+    }
+    else
+    {
+      $option_options = array('value' => $key);
+
+      if (
+          (is_array($selected) && in_array(strval($key), $selected, true))
+          ||
+          (strval($key) == strval($selected))
+         )
+      {
+        $option_options['selected'] = 'selected';
+      }
+
+      $html .= content_tag('option', $value, $option_options)."\n";
+    }
+  }
+
+  return $html;
+}
+
+/**
+ * Returns an HTML <form> tag that points to a valid action, route or URL as defined by <i>$url_for_options</i>.
+ *
+ * By default, the form tag is generated in POST format, but can easily be configured along with any additional
+ * HTML parameters via the optional <i>$options</i> parameter. If you are using file uploads, be sure to set the 
+ * <i>multipart</i> option to true.
+ *
+ * <b>Options:</b>
+ * - multipart - When set to true, enctype is set to "multipart/form-data".
+ *
+ * <b>Examples:</b>
+ *   <code><?php echo form_tag('@myroute'); ?></code>
+ *   <code><?php echo form_tag('/module/action', array('name' => 'myformname', 'multipart' => true)); ?></code>
+ *
+ * @param  string valid action, route or URL
+ * @param  array optional HTML parameters for the <form> tag
+ * @return string opening HTML <form> tag with options
+ */
+function form_tag($url_for_options = '', $options = array())
+{
+  $options = _parse_attributes($options);
+
+  $html_options = $options;
+  if (!isset($html_options['method']))
+  {
+    $html_options['method'] = 'post';
+  }
+
+  if (_get_option($html_options, 'multipart'))
+  {
+    $html_options['enctype'] = 'multipart/form-data';
+  }
+
+  $html_options['action'] = url_for($url_for_options);
+
+  return tag('form', $html_options, true);
+}
+
+/**
+ * Returns a <select> tag, optionally comprised of <option> tags.
+ *
+ * The select tag does not generate <option> tags by default.  
+ * To do so, you must populate the <i>$option_tags</i> parameter with a string of valid HTML compliant <option> tags.
+ * Fortunately, Symfony provides a handy helper function to convert an array of data into option tags (see options_for_select). 
+ * If you need to create a "multiple" select tag (ability to select multiple options), set the <i>multiple</i> option to true.  
+ * Doing so will automatically convert the name field to an array type variable (i.e. name="name" becomes name="name[]").
+ * 
+ * <b>Options:</b>
+ * - multiple - If set to true, the select tag will allow multiple options to be selected at once.
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  $person_list = array(1 => 'Larry', 2 => 'Moe', 3 => 'Curly');
+ *  echo select_tag('person', options_for_select($person_list, $sf_params->get('person')), array('class' => 'full'));
+ * </code>
+ *
+ * <code>
+ *  echo select_tag('department', options_for_select($department_list), array('multiple' => true));
+ * </code>
+ *
+ * <code>
+ *  echo select_tag('url', options_for_select($url_list), array('onChange' => 'Javascript:this.form.submit();'));
+ * </code>
+ *
+ * @param  string field name 
+ * @param  mixed contains a string of valid <option></option> tags, or an array of options that will be passed to options_for_select
+ * @param  array  additional HTML compliant <select> tag parameters
+ * @return string <select> tag optionally comprised of <option> tags.
+ * @see options_for_select, content_tag
+ */
+function select_tag($name, $option_tags = null, $options = array())
+{
+  $options = _convert_options($options);
+  $id = $name;
+  if (isset($options['multiple']) && $options['multiple'] && substr($name, -2) !== '[]')
+  {
+    $name .= '[]';
+  }
+  if (is_array($option_tags))
+  {
+    $option_tags = options_for_select($option_tags);
+  }
+
+  return content_tag('select', $option_tags, array_merge(array('name' => $name, 'id' => get_id_from_name($id)), $options));
+}
+
+/**
+ * Returns a <select> tag populated with all the countries in the world.
+ *
+ * The select_country_tag builds off the traditional select_tag function, and is conveniently populated with 
+ * all the countries in the world (sorted alphabetically). Each option in the list has a two-character country 
+ * code for its value and the country's name as its display title.  The country data is retrieved via the sfCultureInfo
+ * class, which stores a wide variety of i18n and i10n settings for various countries and cultures throughout the world.
+ * Here's an example of an <option> tag generated by the select_country_tag:
+ *
+ * <samp>
+ *  <option value="US">United States</option>
+ * </samp>
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo select_country_tag('country', 'FR');
+ * </code>
+ *
+ * @param  string field name 
+ * @param  string selected field value (two-character country code)
+ * @param  array  additional HTML compliant <select> tag parameters
+ * @return string <select> tag populated with all the countries in the world.
+ * @see select_tag, options_for_select, sfCultureInfo
+ */
+function select_country_tag($name, $selected = null, $options = array())
+{
+  $c = new sfCultureInfo(sfContext::getInstance()->getUser()->getCulture());
+  $countries = $c->getCountries();
+
+  if ($country_option = _get_option($options, 'countries'))
+  {
+    foreach ($countries as $key => $value)
+    {
+      if (!in_array($key, $country_option))
+      {
+        unset($countries[$key]);
+      }
+    }
+  }
+
+  asort($countries);
+
+  $option_tags = options_for_select($countries, $selected, $options);
+
+  return select_tag($name, $option_tags, $options);
+}
+
+/**
+ * Returns a <select> tag populated with all the languages in the world (or almost).
+ *
+ * The select_language_tag builds off the traditional select_tag function, and is conveniently populated with 
+ * all the languages in the world (sorted alphabetically). Each option in the list has a two or three character 
+ * language/culture code for its value and the language's name as its display title.  The country data is 
+ * retrieved via the sfCultureInfo class, which stores a wide variety of i18n and i10n settings for various 
+ * countries and cultures throughout the world. Here's an example of an <option> tag generated by the select_country_tag:
+ *
+ * <samp>
+ *  <option value="en">English</option>
+ * </samp>
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo select_language_tag('language', 'de');
+ * </code>
+ *
+ * @param  string field name 
+ * @param  string selected field value (two or threecharacter language/culture code)
+ * @param  array  additional HTML compliant <select> tag parameters
+ * @return string <select> tag populated with all the languages in the world.
+ * @see select_tag, options_for_select, sfCultureInfo
+ */
+function select_language_tag($name, $selected = null, $options = array())
+{
+  $c = new sfCultureInfo(sfContext::getInstance()->getUser()->getCulture());
+  $languages = $c->getLanguages();
+
+  if ($language_option = _get_option($options, 'languages'))
+  {
+    foreach ($languages as $key => $value)
+    {
+      if (!in_array($key, $language_option))
+      {
+        unset($languages[$key]);
+      }
+    }
+  }
+
+  asort($languages);
+
+  $option_tags = options_for_select($languages, $selected, $options);
+
+  return select_tag($name, $option_tags, $options);
+}
+
+/**
+ * Returns an XHTML compliant <input> tag with type="text".
+ *
+ * The input_tag helper generates your basic XHTML <input> tag and can utilize any standard <input> tag parameters 
+ * passed in the optional <i>$options</i> parameter.
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo input_tag('name');
+ * </code>
+ *
+ * <code>
+ *  echo input_tag('amount', $sf_params->get('amount'), array('size' => 8, 'maxlength' => 8));
+ * </code>
+ *
+ * @param  string field name 
+ * @param  string selected field value
+ * @param  array  additional HTML compliant <input> tag parameters
+ * @return string XHTML compliant <input> tag with type="text"
+ */
+function input_tag($name, $value = null, $options = array())
+{
+  return tag('input', array_merge(array('type' => 'text', 'name' => $name, 'id' => get_id_from_name($name, $value), 'value' => $value), _convert_options($options)));
+}
+
+/**
+ * Returns an XHTML compliant <input> tag with type="hidden".
+ *
+ * Similar to the input_tag helper, the input_hidden_tag helper generates an XHTML <input> tag and can utilize 
+ * any standard <input> tag parameters passed in the optional <i>$options</i> parameter.  The only difference is 
+ * that it creates the tag with type="hidden", meaning that is not visible on the page.
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo input_hidden_tag('id', $id);
+ * </code>
+ *
+ * @param  string field name 
+ * @param  string populated field value
+ * @param  array  additional HTML compliant <input> tag parameters
+ * @return string XHTML compliant <input> tag with type="hidden"
+ */
+function input_hidden_tag($name, $value = null, $options = array())
+{
+  $options = _parse_attributes($options);
+
+  $options['type'] = 'hidden';
+  return input_tag($name, $value, $options);
+}
+
+/**
+ * Returns an XHTML compliant <input> tag with type="file".
+ *
+ * Similar to the input_tag helper, the input_hidden_tag helper generates your basic XHTML <input> tag and can utilize
+ * any standard <input> tag parameters passed in the optional <i>$options</i> parameter.  The only difference is that it 
+ * creates the tag with type="file", meaning that next to the field will be a "browse" (or similar) button. 
+ * This gives the user the ability to choose a file from there computer to upload to the web server.  Remember, if you 
+ * plan to upload files to your website, be sure to set the <i>multipart</i> option form_tag helper function to true 
+ * or your files will not be properly uploaded to the web server.
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo input_file_tag('filename', array('size' => 30));
+ * </code>
+ *
+ * @param  string field name 
+ * @param  array  additional HTML compliant <input> tag parameters
+ * @return string XHTML compliant <input> tag with type="file"
+ * @see input_tag, form_tag
+ */
+function input_file_tag($name, $options = array())
+{
+  $options = _parse_attributes($options);
+
+  $options['type'] = 'file';
+  return input_tag($name, null, $options);
+}
+
+/**
+ * Returns an XHTML compliant <input> tag with type="password".
+ *
+ * Similar to the input_tag helper, the input_hidden_tag helper generates your basic XHTML <input> tag and can utilize
+ * any standard <input> tag parameters passed in the optional <i>$options</i> parameter.  The only difference is that it 
+ * creates the tag with type="password", meaning that the text entered into this field will not be visible to the end user.
+ * In most cases it is replaced by  * * * * * * * *.  Even though this text is not readable, it is recommended that you do not 
+ * populate the optional <i>$value</i> option with a plain-text password or any other sensitive information, as this is a 
+ * potential security risk.
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo input_password_tag('password');
+ *  echo input_password_tag('password_confirm');
+ * </code>
+ *
+ * @param  string field name
+ * @param  string populated field value
+ * @param  array  additional HTML compliant <input> tag parameters
+ * @return string XHTML compliant <input> tag with type="password"
+ * @see input_tag
+ */
+function input_password_tag($name = 'password', $value = null, $options = array())
+{
+  $options = _parse_attributes($options);
+
+  $options['type'] = 'password';
+  return input_tag($name, $value, $options);
+}
+
+/**
+ * Returns a <textarea> tag, optionally wrapped with an inline rich-text JavaScript editor.
+ *
+ * The texarea_tag helper generates a standard HTML <textarea> tag and can be manipulated with
+ * any number of standard HTML parameters via the <i>$options</i> array variable.  However, the 
+ * textarea tag also has the unique capability of being transformed into a WYSIWYG rich-text editor
+ * such as TinyMCE (http://tinymce.moxiecode.com) very easily with the use of some specific options:
+ *
+ * <b>Options:</b>
+ *  - rich: A rich text editor class (for example sfRichTextEditorTinyMCE for TinyMCE).
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo textarea_tag('notes');
+ * </code>
+ *
+ * <code>
+ *  echo textarea_tag('description', 'This is a description', array('rows' => 10, 'cols' => 50));
+ * </code> 
+ *
+ * @param  string field name
+ * @param  string populated field value
+ * @param  array  additional HTML compliant <textarea> tag parameters
+ *
+ * @return string <textarea> tag optionally wrapped with a rich-text WYSIWYG editor
+ */
+function textarea_tag($name, $content = null, $options = array())
+{
+  $options = _parse_attributes($options);
+
+  if ($size = _get_option($options, 'size'))
+  {
+    list($options['cols'], $options['rows']) = split('x', $size, 2);
+  }
+
+  // rich control?
+  if ($rich = _get_option($options, 'rich', false))
+  {
+    if (true === $rich)
+    {
+      $rich = sfConfig::get('sf_rich_text_editor_class', 'TinyMCE');
+    }
+
+    // switch for backward compatibility
+    switch ($rich)
+    {
+      case 'tinymce':
+        $rich = 'TinyMCE';
+        break;
+      case 'fck':
+        $rich = 'FCK';
+        break;
+    }
+
+    $editorClass = 'sfRichTextEditor'.$rich;
+
+    if (!class_exists($editorClass))
+    {
+      throw new sfConfigurationException(sprintf('The rich text editor "%s" does not exist.', $editorClass));
+    }
+
+    $sfEditor = new $editorClass();
+    if (!in_array('sfRichTextEditor', class_parents($sfEditor)))
+    {
+      throw new sfConfigurationException(sprintf('The editor "%s" must extend sfRichTextEditor.', $editorClass));
+    }
+    $sfEditor->initialize($name, $content, $options);
+
+    return $sfEditor->toHTML();
+  }
+
+  return content_tag('textarea', escape_once((is_object($content)) ? $content->__toString() : $content), array_merge(array('name' => $name, 'id' => get_id_from_name(_get_option($options, 'id', $name), null)), _convert_options($options)));
+}
+
+/**
+ * Returns an XHTML compliant <input> tag with type="checkbox".
+ *
+ * When creating multiple checkboxes with the same name, be sure to use an array for the
+ * <i>$name</i> parameter (i.e. 'name[]').  The checkbox_tag is smart enough to create unique ID's
+ * based on the <i>$value</i> parameter like so:
+ *
+ * <samp>
+ *  <input type="checkbox" name="status[]" id="status_3" value="3" />
+ *  <input type="checkbox" name="status[]" id="status_4" value="4" />
+ * </samp>
+ * 
+ * <b>Examples:</b>
+ * <code>
+ *  echo checkbox_tag('newsletter', 1, $sf_params->get('newsletter'));
+ * </code>
+ *
+ * <code>
+ *  echo checkbox_tag('option_a', 'yes', true, array('class' => 'style_a'));
+ * </code>
+ *
+ * <code>
+ *  // one request variable with an array of checkbox values
+ *  echo checkbox_tag('choice[]', 1);
+ *  echo checkbox_tag('choice[]', 2);
+ *  echo checkbox_tag('choice[]', 3);
+ *  echo checkbox_tag('choice[]', 4); 
+ * </code>
+ *
+ * <code>
+ *  // assuming you have Prototype.js enabled, you could do this
+ *  echo checkbox_tag('show_tos', 1, false, array('onclick' => "Element.toggle('tos'); return false;"));
+ * </code>
+ *
+ * @param  string field name 
+ * @param  string checkbox value (if checked)
+ * @param  bool   is the checkbox checked? (1 or 0)
+ * @param  array  additional HTML compliant <input> tag parameters
+ * @return string XHTML compliant <input> tag with type="checkbox"
+ */
+function checkbox_tag($name, $value = '1', $checked = false, $options = array())
+{
+  $html_options = array_merge(array('type' => 'checkbox', 'name' => $name, 'id' => get_id_from_name($name, $value), 'value' => $value), _convert_options($options));
+
+  if ($checked)
+  {
+    $html_options['checked'] = 'checked';
+  }
+
+  return tag('input', $html_options);
+}
+
+/**
+ * Returns an XHTML compliant <input> tag with type="radio".
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo ' Yes '.radiobutton_tag('newsletter', 1);
+ *  echo ' No '.radiobutton_tag('newsletter', 0); 
+ * </code>
+ *
+ * @param  string field name 
+ * @param  string radio button value (if selected)
+ * @param  bool   is the radio button selected? (1 or 0)
+ * @param  array  additional HTML compliant <input> tag parameters
+ * @return string XHTML compliant <input> tag with type="radio"
+ */
+function radiobutton_tag($name, $value, $checked = false, $options = array())
+{
+  $html_options = array_merge(array('type' => 'radio', 'name' => $name, 'id' => get_id_from_name($name, $value), 'value' => $value), _convert_options($options));
+
+  if ($checked)
+  {
+    $html_options['checked'] = 'checked';
+  }
+
+  return tag('input', $html_options);
+}
+
+/**
+ * Returns two XHTML compliant <input> tags to be used as a free-text date fields for a date range.
+ * 
+ * Built on the input_date_tag, the input_date_range_tag combines two input tags that allow the user
+ * to specify a from and to date.  
+ * You can easily implement a JavaScript calendar by enabling the 'rich' option in the 
+ * <i>$options</i> parameter.  This includes a button next to the field that when clicked, 
+ * will open an inline JavaScript calendar.  When a date is selected, it will automatically
+ * populate the <input> tag with the proper date, formatted to the user's culture setting.
+ *
+ * <b>Note:</b> The <i>$name</i> parameter will automatically converted to array names. 
+ * For example, a <i>$name</i> of "date" becomes date[from] and date[to]
+ * 
+ * <b>Options:</b>
+ * - rich - If set to true, includes an inline JavaScript calendar can auto-populate the date field with the chosen date
+ * - before - string to be displayed before the input_date_range_tag
+ * - middle - string to be displayed between the from and to tags
+ * - after - string to be displayed after the input_date_range_tag
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  $date = array('from' => '2006-05-15', 'to' => '2006-06-15');
+ *  echo input_date_range_tag('date', $date, array('rich' => true));
+ * </code>
+ *
+ * <code>
+ *  echo input_date_range_tag('date', null, array('middle' => ' through ', 'rich' => true));
+ * </code>
+ *
+ * @param  string field name 
+ * @param  array  dates: $value['from'] and $value['to']
+ * @param  array  additional HTML compliant <input> tag parameters
+ * @return string XHTML compliant <input> tag with optional JS calendar integration
+ * @see input_date_tag
+ */
+function input_date_range_tag($name, $value, $options = array())
+{
+  $options = _parse_attributes($options);
+
+  return _get_option($options, 'before', '').
+         input_date_tag($name.'[from]', $value['from'], $options).
+         _get_option($options, 'middle', '').
+         input_date_tag($name.'[to]', $value['to'], $options).
+         _get_option($options, 'after', '');
+}
+
+/**
+ * Returns an XHTML compliant <input> tag to be used as a free-text date field.
+ * 
+ * You can easily implement a JavaScript calendar by enabling the 'rich' option in the 
+ * <i>$options</i> parameter.  This includes a button next to the field that when clicked, 
+ * will open an inline JavaScript calendar.  When a date is selected, it will automatically
+ * populate the <input> tag with the proper date, formatted to the user's culture setting. 
+ * Symfony also conveniently offers the input_date_range_tag, that allows you to specify a to
+ * and from date.
+ *
+ * <b>Options:</b>
+ * - rich - If set to true, includes an inline JavaScript calendar can auto-populate the date field with the chosen date
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo input_date_tag('date', null, array('rich' => true));
+ * </code>
+ *
+ * @param  string field name 
+ * @param  string date
+ * @param  array  additional HTML compliant <input> tag parameters
+ * @return string XHTML compliant <input> tag with optional JS calendar integration
+ * @see input_date_range_tag
+ */
+function input_date_tag($name, $value = null, $options = array())
+{
+  $options = _parse_attributes($options);
+
+  $context = sfContext::getInstance();
+
+  $culture = _get_option($options, 'culture', $context->getUser()->getCulture());
+
+  $withTime = _get_option($options, 'withtime', false);
+
+  // rich control?
+  if (!_get_option($options, 'rich', false))
+  {
+    use_helper('DateForm');
+
+    // set culture for month tag
+    $options['culture'] = $culture;
+
+    if ($withTime)
+    {
+      return select_datetime_tag($name, $value, $options, isset($options['html']) ? $options['html'] : array());
+    }
+    else
+    {
+      return select_date_tag($name, $value, $options, isset($options['html']) ? $options['html'] : array());
+    }
+  }
+
+  $pattern = _get_option($options, 'format', $withTime ? 'g' : 'd');
+
+  $dateFormat = new sfDateFormat($culture);
+
+  $pattern = $dateFormat->getInputPattern($pattern);
+
+  // parse date
+  if ($value === null || $value === '')
+  {
+    $value = '';
+  }
+  else
+  {
+    $value = $dateFormat->format($value, $pattern);
+  }
+
+  // register our javascripts and stylesheets
+  $langFile = sfConfig::get('sf_calendar_web_dir').'/lang/calendar-'.strtolower(substr($culture, 0, 2));
+  $jss = array(
+    sfConfig::get('sf_calendar_web_dir').'/calendar',
+    is_readable(sfConfig::get('sf_symfony_data_dir').'/web/'.$langFile.'.js') || is_readable(sfConfig::get('sf_web_dir').'/'.$langFile.'.js') ? $langFile : sfConfig::get('sf_calendar_web_dir').'/lang/calendar-en',
+    sfConfig::get('sf_calendar_web_dir').'/calendar-setup',
+  );
+  foreach ($jss as $js)
+  {
+    $context->getResponse()->addJavascript($js);
+  }
+
+  // css
+  if ($calendar_style = _get_option($options, 'css', 'skins/aqua/theme'))
+  {
+    $context->getResponse()->addStylesheet(sfConfig::get('sf_calendar_web_dir').'/'.$calendar_style);
+  }
+
+  // date format
+  $date_format = $dateFormat->getPattern($pattern);
+
+  // calendar date format
+  $calendar_date_format = $date_format;
+  $calendar_date_format = strtr($date_format, array('yyyy' => 'Y', 'yy'=>'y', 'MM' => 'm', 'M'=>'m', 'dd'=>'d', 'd'=>'e', 'HH'=>'H', 'H'=>'k', 'hh'=>'I', 'h'=>'l', 'mm'=>'M', 'ss'=>'S', 'a'=>'p'));
+
+  $calendar_date_format = preg_replace('/([mdyhklspe])+/i', '%\\1', $calendar_date_format);
+
+  $id_inputField = (isset($options['id']))? $options['id'] : get_id_from_name($name);
+  $id_calendarButton = 'trigger_'.get_id_from_name($name);
+  $js = '
+    document.getElementById("'.$id_calendarButton.'").disabled = false;
+    Calendar.setup({
+      inputField : "'.$id_inputField.'",
+      ifFormat : "'.$calendar_date_format.'",
+      daFormat : "'.$calendar_date_format.'",
+      button : "'.$id_calendarButton.'"';
+  
+  if ($withTime)
+  {
+    $js .= ",\n showsTime : true";
+  }
+
+  // calendar options
+  if ($calendar_options = _get_option($options, 'calendar_options'))
+  {
+    $js .= ",\n".$calendar_options;
+  }
+
+  $js .= '
+    });
+  ';
+
+  // calendar button
+  $calendar_button = '...';
+  $calendar_button_type = 'txt';
+  if ($calendar_button_img = _get_option($options, 'calendar_button_img'))
+  {
+    $calendar_button = $calendar_button_img;
+    $calendar_button_type = 'img';
+  }
+  else if ($calendar_button_txt = _get_option($options, 'calendar_button_txt'))
+  {
+    $calendar_button = $calendar_button_txt;
+    $calendar_button_type = 'txt';
+  }
+
+  // construct html
+  if (!isset($options['size']))
+  {
+    // educated guess about the size
+    $options['size'] = strlen($date_format)+2;
+  }
+  $html = input_tag($name, $value, $options);
+
+  if ($calendar_button_type == 'img')
+  {
+    $html .= image_tag($calendar_button, array('id' => $id_calendarButton, 'style' => 'cursor: pointer; vertical-align: middle'));
+  }
+  else
+  {
+    $html .= content_tag('button', $calendar_button, array('type' => 'button', 'disabled' => 'disabled', 'onclick' => 'return false', 'id' => $id_calendarButton));
+  }
+
+  if (_get_option($options, 'with_format'))
+  {
+    $html .= '('.$date_format.')';
+  }
+
+  // add javascript
+  $html .= content_tag('script', $js, array('type' => 'text/javascript'));
+
+  return $html;
+}
+
+/**
+ * Returns an XHTML compliant <input> tag with type="submit".
+ * 
+ * By default, this helper creates a submit tag with a name of <em>commit</em> to avoid
+ * conflicts with other parts of the framework.  It is recommended that you do not use the name
+ * "submit" for submit tags unless absolutely necessary. Also, the default <i>$value</i> parameter
+ * (title of the button) is set to "Save changes", which can be easily overwritten by passing a 
+ * <i>$value</i> parameter.
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo submit_tag();
+ * </code>
+ *
+ * <code>
+ *  echo submit_tag('Update Record');
+ * </code>
+ *
+ * @param  string field value (title of submit button)
+ * @param  array  additional HTML compliant <input> tag parameters
+ * @return string XHTML compliant <input> tag with type="submit"
+ */
+function submit_tag($value = 'Save changes', $options = array())
+{
+  return tag('input', array_merge(array('type' => 'submit', 'name' => 'commit', 'value' => $value), _convert_options_to_javascript(_convert_options($options))));
+}
+
+/**
+ * Returns an XHTML compliant <input> tag with type="reset".
+ *
+ * By default, this helper creates a submit tag with a name of <em>reset</em>.  Also, the default 
+ * <i>$value</i> parameter (title of the button) is set to "Reset" which can be easily overwritten 
+ * by passing a <i>$value</i> parameter.
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo reset_tag();
+ * </code>
+ *
+ * <code>
+ *  echo reset_tag('Start Over');
+ * </code>
+ *
+ * @param  string field value (title of reset button)
+ * @param  array  additional HTML compliant <input> tag parameters
+ * @return string XHTML compliant <input> tag with type="reset"
+ */
+function reset_tag($value = 'Reset', $options = array())
+{
+  return tag('input', array_merge(array('type' => 'reset', 'name' => 'reset', 'value' => $value), _convert_options($options)));
+}
+
+/**
+ * Returns an XHTML compliant <input> tag with type="image".
+ *
+ * The submit_image_tag is very similar to the submit_tag, the only difference being that it uses an image
+ * for the submit button instead of the browser-generated default button. The image is defined by the 
+ * <i>$source</i> parameter and must be a valid image, either local or remote (URL). By default, this 
+ * helper creates a submit tag with a name of <em>commit</em> to avoid conflicts with other parts of the 
+ * framework.  It is recommended that you do not use the name "submit" for submit tags unless absolutely necessary.
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  // Assuming your image is in the /web/images/ directory
+ *  echo submit_image_tag('my_submit_button.gif');
+ * </code>
+ *
+ * <code>
+ *  echo submit_image_tag('http://mydomain.com/my_submit_button.gif');
+ * </code>
+ *
+ * @param  string path to image file
+ * @param  array  additional HTML compliant <input> tag parameters
+ * @return string XHTML compliant <input> tag with type="image"
+ */
+function submit_image_tag($source, $options = array())
+{
+  if (!isset($options['alt']))
+  {
+    $path_pos = strrpos($source, '/');
+    $dot_pos = strrpos($source, '.');
+    $begin = $path_pos ? $path_pos + 1 : 0;
+    $nb_str = ($dot_pos ? $dot_pos : strlen($source)) - $begin;
+    $options['alt'] = ucfirst(substr($source, $begin, $nb_str));
+  }
+
+  return tag('input', array_merge(array('type' => 'image', 'name' => 'commit', 'src' => image_path($source)), _convert_options_to_javascript(_convert_options($options))));
+}
+
+/**
+ * Returns a <label> tag with <i>$label</i> for the specified <i>$id</i> parameter.
+ *
+ * @param  string id
+ * @param  string label or title
+ * @param  array  additional HTML compliant <label> tag parameters
+ * @return string <label> tag with <i>$label</i> for the specified <i>$id</i> parameter.
+ */
+function label_for($id, $label, $options = array())
+{
+  $options = _parse_attributes($options);
+
+  return content_tag('label', $label, array_merge(array('for' => get_id_from_name($id, null)), $options));
+}
+
+/**
+ * Returns a formatted ID based on the <i>$name</i> parameter and optionally the <i>$value</i> parameter.
+ *
+ * This function determines the proper form field ID name based on the parameters. If a form field has an
+ * array value as a name we need to convert them to proper and unique IDs like so:
+ * <samp>
+ *  name[] => name (if value == null)
+ *  name[] => name_value (if value != null)
+ *  name[bob] => name_bob
+ *  name[item][total] => name_item_total
+ * </samp>
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo get_id_from_name('status[]', '1');
+ * </code>
+ *
+ * @param  string field name 
+ * @param  string field value
+ * @return string <select> tag populated with all the languages in the world.
+ */
+function get_id_from_name($name, $value = null)
+{
+  // check to see if we have an array variable for a field name
+  if (strstr($name, '['))
+  {
+    $name = str_replace(array('[]', '][', '[', ']'), array((($value != null) ? '_'.$value : ''), '_', '_', ''), $name);
+  }
+
+  return $name;
+}
+
+
+/**
+ * Converts specific <i>$options</i> to their correct HTML format
+ *
+ * @param  array options
+ * @return array returns properly formatted options 
+ */
+function _convert_options($options)
+{
+  $options = _parse_attributes($options);
+
+  foreach (array('disabled', 'readonly', 'multiple') as $attribute)
+  {
+    if (array_key_exists($attribute, $options))
+    {
+      if ($options[$attribute])
+      {
+        $options[$attribute] = $attribute;
+      }
+      else
+      {
+        unset($options[$attribute]);
+      }
+    }
+  }
+
+  return $options;
+}
+
+function _convert_include_custom_for_select($options, &$select_options)
+{
+  if (_get_option($options, 'include_blank'))
+  {
+    $select_options[''] = '';
+  }
+  else if ($include_custom = _get_option($options, 'include_custom'))
+  {
+    $select_options[''] = $include_custom;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/FormHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/HelperHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/HelperHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/HelperHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,23 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * HelperHelper.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: HelperHelper.php 2165 2006-09-25 14:22:15Z fabien $
+ */
+
+function use_helper()
+{
+  sfLoader::loadHelpers(func_get_args(), sfContext::getInstance()->getModuleName());
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/HelperHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/I18NHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/I18NHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/I18NHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * I18NHelper.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: I18NHelper.php 3056 2006-12-16 16:08:24Z fabien $
+ */
+
+function __($text, $args = array(), $catalogue = 'messages')
+{
+  static $i18n;
+
+  if (sfConfig::get('sf_i18n'))
+  {
+    if (!isset($i18n))
+    {
+      $i18n = sfContext::getInstance()->getI18N();
+    }
+
+    return $i18n->__($text, $args, $catalogue);
+  }
+  else
+  {
+    // replace object with strings
+    foreach ($args as $key => $value)
+    {
+      if (is_object($value) && method_exists($value, '__toString'))
+      {
+        $args[$key] = $value->__toString();
+      }
+    }
+
+    return strtr($text, $args);
+  }
+}
+
+function format_number_choice($text, $args = array(), $number, $catalogue = 'messages')
+{
+  $translated = __($text, $args, $catalogue);
+
+  $choice = new sfChoiceFormat();
+
+  $retval = $choice->format($translated, $number);
+
+  if ($retval === false)
+  {
+    $error = sprintf('Unable to parse your choice "%s"', $translated);
+    throw new sfException($error);
+  }
+
+  return $retval;
+}
+
+function format_country($country_iso, $culture = null)
+{
+  $c = new sfCultureInfo($culture === null ? sfContext::getInstance()->getUser()->getCulture() : $culture);
+  $countries = $c->getCountries();
+
+  return isset($countries[$country_iso]) ? $countries[$country_iso] : '';
+}
+
+function format_language($language_iso, $culture = null)
+{
+  $c = new sfCultureInfo($culture === null ? sfContext::getInstance()->getUser()->getCulture() : $culture);
+  $languages = $c->getLanguages();
+
+  return isset($languages[$language_iso]) ? $languages[$language_iso] : '';
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/I18NHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/JavascriptHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/JavascriptHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/JavascriptHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1027 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004 David Heinemeier Hansson
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * JavascriptHelper.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     John Christopher <john.christopher en symfony-project.com>
+ * @author     David Heinemeier Hansson
+ * @version    SVN: $Id: JavascriptHelper.php 3500 2007-02-18 10:25:13Z fabien $
+ */
+
+/*
+ * Provides a set of helpers for calling JavaScript functions and, most importantly,
+ * to call remote methods using what has been labelled AJAX[http://www.adaptivepath.com/publications/essays/archives/000385.php].
+ * This means that you can call actions in your controllers without reloading the page,
+ * but still update certain parts of it using injections into the DOM.
+ * The common use case is having a form that adds a new element to a list without reloading the page.
+ *
+ * To be able to use the JavaScript helpers, you must include the Prototype JavaScript Framework
+ * and for some functions script.aculo.us (which both come with symfony) on your pages.
+ * Choose one of these options:
+ *
+ * * Use <tt><?php echo javascript_include_tag :defaults ?></tt> in the HEAD section of your page (recommended):
+ *   The function will return references to the JavaScript files created by the +rails+ command in your
+ *   <tt>public/javascripts</tt> directory. Using it is recommended as the browser can then cache the libraries
+ *   instead of fetching all the functions anew on every request.
+ * * Use <tt><?php echo javascript_include_tag 'prototype' ?></tt>: As above, but will only include the Prototype core library,
+ *   which means you are able to use all basic AJAX functionality. For the script.aculo.us-based JavaScript helpers,
+ *   like visual effects, autocompletion, drag and drop and so on, you should use the method described above.
+ * * Use <tt><?php echo define_javascript_functions ?></tt>: this will copy all the JavaScript support functions within a single
+ *   script block.
+ *
+ * For documentation on +javascript_include_tag+ see ActionView::Helpers::AssetTagHelper.
+ *
+ * If you're the visual type, there's an AJAX movie[http://www.rubyonrails.com/media/video/rails-ajax.mov] demonstrating
+ * the use of form_remote_tag.
+ */
+
+  function get_callbacks()
+  {
+    static $callbacks;
+    if (!$callbacks)
+    {
+      $callbacks = array_merge(array(
+        'uninitialized', 'loading', 'loaded', 'interactive', 'complete', 'failure', 'success'
+        ), range(100, 599));
+    }
+
+    return $callbacks;
+  }
+
+  function get_ajax_options()
+  {
+    static $ajax_options;
+    if (!$ajax_options)
+    {
+      $ajax_options = array_merge(array(
+        'before', 'after', 'condition', 'url', 'asynchronous', 'method',
+        'insertion', 'position', 'form', 'with', 'update', 'script'
+        ), get_callbacks());
+    }
+
+    return $ajax_options;
+  }
+
+  /**
+   * Returns a link that'll trigger a javascript function using the
+   * onclick handler and return false after the fact.
+   *
+   * Examples:
+   *   <?php echo link_to_function('Greeting', "alert('Hello world!')") ?>
+   *   <?php echo link_to_function(image_tag('delete'), "if confirm('Really?'){ do_delete(); }") ?>
+   */
+  function link_to_function($name, $function, $html_options = array())
+  {
+    $html_options = _parse_attributes($html_options);
+
+    $html_options['href'] = isset($html_options['href']) ? $html_options['href'] : '#';
+    $html_options['onclick'] = $function.'; return false;';
+
+    return content_tag('a', $name, $html_options);
+  }
+
+  /**
+   * Returns a button that'll trigger a javascript function using the
+   * onclick handler and return false after the fact.
+   *
+   * Examples:
+   *   <?php echo button_to_function('Greeting', "alert('Hello world!')") ?>
+   */
+  function button_to_function($name, $function, $html_options = array())
+  {
+    $html_options = _parse_attributes($html_options);
+
+    $html_options['onclick'] = $function.'; return false;';
+    $html_options['type']    = 'button';
+    $html_options['value']   = $name;
+
+    return tag('input', $html_options);
+  }
+  
+  /**
+   * Returns an html button to a remote action defined by 'url' (using the
+   * 'url_for()' format) that's called in the background using XMLHttpRequest.
+   *
+   * See link_to_remote() for details.
+   *
+   */
+  function button_to_remote($name, $options = array(), $html_options = array())
+  {
+    return button_to_function($name, remote_function($options), $html_options);
+  }
+
+  /**
+   * Returns a link to a remote action defined by 'url'
+   * (using the 'url_for()' format) that's called in the background using
+   * XMLHttpRequest. The result of that request can then be inserted into a
+   * DOM object whose id can be specified with 'update'.
+   * Usually, the result would be a partial prepared by the controller with
+   * either 'render_partial()'.
+   *
+   * Examples:
+   *  <?php echo link_to_remote('Delete this post'), array(
+   *    'update' => 'posts',
+   *    'url'    => 'destroy?id='.$post.id,
+   *  )) ?>
+   *  <?php echo link_to_remote(image_tag('refresh'), array(
+   *    'update' => 'emails',
+   *    'url'    => '@list_emails',
+   *  )) ?>
+   *
+   * You can also specify a hash for 'update' to allow for
+   * easy redirection of output to an other DOM element if a server-side error occurs:
+   *
+   * Example:
+   *  <?php echo link_to_remote('Delete this post', array(
+   *      'update' => array('success' => 'posts', 'failure' => 'error'),
+   *      'url'    => 'destroy?id='.$post.id,
+   *  )) ?>
+   *
+   * Optionally, you can use the 'position' parameter to influence
+   * how the target DOM element is updated. It must be one of
+   * 'before', 'top', 'bottom', or 'after'.
+   *
+   * By default, these remote requests are processed asynchronous during
+   * which various JavaScript callbacks can be triggered (for progress indicators and
+   * the likes). All callbacks get access to the 'request' object,
+   * which holds the underlying XMLHttpRequest.
+   *
+   * To access the server response, use 'request.responseText', to
+   * find out the HTTP status, use 'request.status'.
+   *
+   * Example:
+   *  <?php echo link_to_remote($word, array(
+   *    'url'      => '@undo?n='.$word_counter,
+   *    'complete' => 'undoRequestCompleted(request)'
+   *  )) ?>
+   *
+   * The callbacks that may be specified are (in order):
+   *
+   * 'loading'                 Called when the remote document is being
+   *                           loaded with data by the browser.
+   * 'loaded'                  Called when the browser has finished loading
+   *                           the remote document.
+   * 'interactive'             Called when the user can interact with the
+   *                           remote document, even though it has not
+   *                           finished loading.
+   * 'success'                 Called when the XMLHttpRequest is completed,
+   *                           and the HTTP status code is in the 2XX range.
+   * 'failure'                 Called when the XMLHttpRequest is completed,
+   *                           and the HTTP status code is not in the 2XX
+   *                           range.
+   * 'complete'                Called when the XMLHttpRequest is complete
+   *                           (fires after success/failure if they are present).,
+   *
+   * You can further refine 'success' and 'failure' by adding additional
+   * callbacks for specific status codes:
+   *
+   * Example:
+   *  <?php echo link_to_remote($word, array(
+   *       'url'     => '@rule',
+   *       '404'     => "alert('Not found...? Wrong URL...?')",
+   *       'failure' => "alert('HTTP Error ' + request.status + '!')",
+   *  )) ?>
+   *
+   * A status code callback overrides the success/failure handlers if present.
+   *
+   * If you for some reason or another need synchronous processing (that'll
+   * block the browser while the request is happening), you can specify
+   * 'type' => 'synchronous'.
+   *
+   * You can customize further browser side call logic by passing
+   * in JavaScript code snippets via some optional parameters. In
+   * their order of use these are:
+   *
+   * 'confirm'             Adds confirmation dialog.
+   * 'condition'           Perform remote request conditionally
+   *                       by this expression. Use this to
+   *                       describe browser-side conditions when
+   *                       request should not be initiated.
+   * 'before'              Called before request is initiated.
+   * 'after'               Called immediately after request was
+   *                       initiated and before 'loading'.
+   * 'submit'              Specifies the DOM element ID that's used
+   *                       as the parent of the form elements. By
+   *                       default this is the current form, but
+   *                       it could just as well be the ID of a
+   *                       table row or any other DOM element.
+   */
+  function link_to_remote($name, $options = array(), $html_options = array())
+  {
+    return link_to_function($name, remote_function($options), $html_options);
+  }
+
+  /**
+   * Periodically calls the specified url ('url') every 'frequency' seconds (default is 10).
+   * Usually used to update a specified div ('update') with the results of the remote call.
+   * The options for specifying the target with 'url' and defining callbacks is the same as 'link_to_remote()'.
+   */
+  function periodically_call_remote($options = array())
+  {
+    $frequency = isset($options['frequency']) ? $options['frequency'] : 10; // every ten seconds by default
+    $code = 'new PeriodicalExecuter(function() {'.remote_function($options).'}, '.$frequency.')';
+
+    return javascript_tag($code);
+  }
+
+  /**
+   * Returns a form tag that will submit using XMLHttpRequest in the background instead of the regular
+   * reloading POST arrangement. Even though it's using JavaScript to serialize the form elements, the form submission
+   * will work just like a regular submission as viewed by the receiving side (all elements available in 'params').
+   * The options for specifying the target with 'url' and defining callbacks are the same as 'link_to_remote()'.
+   *
+   * A "fall-through" target for browsers that don't do JavaScript can be specified
+   * with the 'action'/'method' options on '$options_html'
+   *
+   * Example:
+   *  <?php echo form_remote_tag(array(
+   *    'url'      => '@tag_add',
+   *    'update'   => 'question_tags',
+   *    'loading'  => "Element.show('indicator'); \$('tag').value = ''",
+   *    'complete' => "Element.hide('indicator');".visual_effect('highlight', 'question_tags'),
+   *  )) ?>
+   *
+   * The hash passed as a second argument is equivalent to the options (2nd) argument in the form_tag() helper.
+   *
+   * By default the fall-through action is the same as the one specified in the 'url'
+   * (and the default method is 'post').
+   */
+  function form_remote_tag($options = array(), $options_html = array())
+  {
+    $options = _parse_attributes($options);
+    $options_html = _parse_attributes($options_html);
+
+    $options['form'] = true;
+
+    $options_html['onsubmit'] = remote_function($options).'; return false;';
+    $options_html['action'] = isset($options_html['action']) ? $options_html['action'] : url_for($options['url']);
+    $options_html['method'] = isset($options_html['method']) ? $options_html['method'] : 'post';
+
+    return tag('form', $options_html, true);
+  }
+
+  /**
+   *  Returns a button input tag that will submit form using XMLHttpRequest in the background instead of regular
+   *  reloading POST arrangement. The '$options' argument is the same as in 'form_remote_tag()'.
+   */
+  function submit_to_remote($name, $value, $options = array(), $options_html = array())
+  {
+    $options = _parse_attributes($options);
+    $options_html = _parse_attributes($options_html);
+
+    if (!isset($options['with']))
+    {
+      $options['with'] = 'Form.serialize(this.form)';
+    }
+
+    $options_html['type'] = 'button';
+    $options_html['onclick'] = remote_function($options).'; return false;';
+    $options_html['name'] = $name;
+    $options_html['value'] = $value;
+
+    return tag('input', $options_html, false);
+  }
+
+  /**
+   * Returns a Javascript function (or expression) that will update a DOM element '$element_id'
+   * according to the '$options' passed.
+   *
+   * Possible '$options' are:
+   * 'content'            The content to use for updating. Can be left out if using block, see example.
+   * 'action'             Valid options are 'update' (assumed by default), 'empty', 'remove'
+   * 'position'           If the 'action' is 'update', you can optionally specify one of the following positions:
+   *                      'before', 'top', 'bottom', 'after'.
+   *
+   * Example:
+   *   <?php echo javascript_tag(
+   *      update_element_function('products', array(
+   *            'position' => 'bottom',
+   *            'content'  => "<p>New product!</p>",
+   *      ))
+   *   ) ?>
+   *
+   *
+   * This method can also be used in combination with remote method call
+   * where the result is evaluated afterwards to cause multiple updates on a page.
+   *
+   * Example:
+   *
+   *  # Calling view
+   *  <?php echo form_remote_tag(array(
+   *      'url'      => '@buy',
+   *      'complete' => evaluate_remote_response()
+   *  )) ?>
+   *  all the inputs here...
+   *
+   *  # Target action
+   *  public function executeBuy()
+   *  {
+   *     $this->product = ProductPeer::retrieveByPk(1);
+   *  }
+   *
+   *  # Returning view
+   *  <php echo update_element_function('cart', array(
+   *      'action'   => 'update',
+   *      'position' => 'bottom',
+   *      'content'  => '<p>New Product: '.$product->getName().'</p>',
+   *  )) ?>
+   */
+  function update_element_function($element_id, $options = array())
+  {
+    sfContext::getInstance()->getResponse()->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/prototype');
+
+    $content = escape_javascript(isset($options['content']) ? $options['content'] : '');
+
+    $value = isset($options['action']) ? $options['action'] : 'update';
+    switch ($value)
+    {
+      case 'update':
+        if (isset($options['position']) && $options['position'])
+        {
+          $javascript_function = "new Insertion.".sfInflector::camelize($options['position'])."('$element_id','$content')";
+        }
+        else
+        {
+          $javascript_function = "\$('$element_id').innerHTML = '$content'";
+        }
+        break;
+
+      case 'empty':
+        $javascript_function = "\$('$element_id').innerHTML = ''";
+        break;
+
+      case 'remove':
+        $javascript_function = "Element.remove('$element_id')";
+        break;
+
+      default:
+        throw new sfException('Invalid action, choose one of update, remove, empty');
+    }
+
+    $javascript_function .= ";\n";
+
+    return (isset($options['binding']) ? $javascript_function.$options['binding'] : $javascript_function);
+  }
+
+  /**
+   * Returns 'eval(request.responseText)', which is the Javascript function that
+   * 'form_remote_tag()' can call in 'complete' to evaluate a multiple update return document
+   * using 'update_element_function()' calls.
+   */
+  function evaluate_remote_response()
+  {
+    return 'eval(request.responseText)';
+  }
+
+  /**
+   * Returns the javascript needed for a remote function.
+   * Takes the same arguments as 'link_to_remote()'.
+   *
+   * Example:
+   *   <select id="options" onchange="<?php echo remote_function(array('update' => 'options', 'url' => '@update_options')) ?>">
+   *     <option value="0">Hello</option>
+   *     <option value="1">World</option>
+   *   </select>
+   */
+  function remote_function($options)
+  {
+    sfContext::getInstance()->getResponse()->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/prototype');
+
+    $javascript_options = _options_for_ajax($options);
+
+    $update = '';
+    if (isset($options['update']) && is_array($options['update']))
+    {
+      $update = array();
+      if (isset($options['update']['success']))
+      {
+        $update[] = "success:'".$options['update']['success']."'";
+      }
+      if (isset($options['update']['failure']))
+      {
+        $update[] = "failure:'".$options['update']['failure']."'";
+      }
+      $update = '{'.join(',', $update).'}';
+    }
+    else if (isset($options['update']))
+    {
+      $update .= "'".$options['update']."'";
+    }
+
+    $function = !$update ?  "new Ajax.Request(" : "new Ajax.Updater($update, ";
+
+    $function .= '\''.url_for($options['url']).'\'';
+    $function .= ', '.$javascript_options.')';
+
+    if (isset($options['before']))
+    {
+      $function = $options['before'].'; '.$function;
+    }
+    if (isset($options['after']))
+    {
+      $function = $function.'; '.$options['after'];
+    }
+    if (isset($options['condition']))
+    {
+      $function = 'if ('.$options['condition'].') { '.$function.'; }';
+    }
+    if (isset($options['confirm']))
+    {
+      $function = "if (confirm('".escape_javascript($options['confirm'])."')) { $function; }";
+      if (isset($options['cancel']))
+      {
+        $function = $function.' else { '.$options['cancel'].' }';
+      }
+    }
+
+    return $function;
+  }
+
+  /**
+   * Observes the field with the DOM ID specified by '$field_id' and makes
+   * an AJAX call when its contents have changed.
+   *
+   * Required '$options' are:
+   * 'url'                 'url_for()'-style options for the action to call
+   *                       when the field has changed.
+   *
+   * Additional options are:
+   * 'frequency'           The frequency (in seconds) at which changes to
+   *                       this field will be detected. Not setting this
+   *                       option at all or to a value equal to or less than
+   *                       zero will use event based observation instead of
+   *                       time based observation.
+   * 'update'              Specifies the DOM ID of the element whose
+   *                       innerHTML should be updated with the
+   *                       XMLHttpRequest response text.
+   * 'with'                A JavaScript expression specifying the
+   *                       parameters for the XMLHttpRequest. This defaults
+   *                       to 'value', which in the evaluated context
+   *                       refers to the new field value.
+   *
+   * Additionally, you may specify any of the options documented in
+   * link_to_remote().
+   */
+  function observe_field($field_id, $options = array())
+  {
+    sfContext::getInstance()->getResponse()->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/prototype');
+
+    if (isset($options['frequency']) && $options['frequency'] > 0)
+    {
+      return _build_observer('Form.Element.Observer', $field_id, $options);
+    }
+    else
+    {
+      return _build_observer('Form.Element.EventObserver', $field_id, $options);
+    }
+  }
+
+  /**
+   * Like 'observe_field()', but operates on an entire form identified by the
+   * DOM ID '$form_id'. '$options' are the same as 'observe_field()', except
+   * the default value of the 'with' option evaluates to the
+   * serialized (request string) value of the form.
+   */
+  function observe_form($form_id, $options = array())
+  {
+    sfContext::getInstance()->getResponse()->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/prototype');
+
+    if (isset($options['frequency']) && $options['frequency'] > 0)
+    {
+      return _build_observer('Form.Observer', $form_id, $options);
+    }
+    else
+    {
+      return _build_observer('Form.EventObserver', $form_id, $options);
+    }
+  }
+
+  /**
+   * Returns a JavaScript snippet to be used on the AJAX callbacks for starting
+   * visual effects.
+   *
+   * Example:
+   *  <?php echo link_to_remote('Reload', array(
+   *        'update'  => 'posts',
+   *        'url'     => '@reload',
+   *        'complete => visual_effect('highlight', 'posts', array('duration' => 0.5 )),
+   *  )) ?>
+   *
+   * If no '$element_id' is given, it assumes "element" which should be a local
+   * variable in the generated JavaScript execution context. This can be used
+   * for example with drop_receiving_element():
+   *
+   *  <?php echo drop_receving_element( ..., array(
+   *        ...
+   *        'loading' => visual_effect('fade'),
+   *  )) ?>
+   *
+   * This would fade the element that was dropped on the drop receiving element.
+   *
+   * You can change the behaviour with various options, see
+   * http://script.aculo.us for more documentation.
+   */
+  function visual_effect($name, $element_id = false, $js_options = array())
+  {
+    $response = sfContext::getInstance()->getResponse();
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/prototype');
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/builder');
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/effects');
+
+    $element = $element_id ? "'$element_id'" : 'element';
+
+    if (in_array($name, array('toggle_appear', 'toggle_blind', 'toggle_slide')))
+    {
+      return "new Effect.toggle($element, '".substr($name, 7)."', "._options_for_javascript($js_options).");";
+    }
+    else
+    {
+      return "new Effect.".sfInflector::camelize($name)."($element, "._options_for_javascript($js_options).");";
+    }
+  }
+
+  /**
+   * Makes the elements with the DOM ID specified by '$element_id' sortable
+   * by drag-and-drop and make an AJAX call whenever the sort order has
+   * changed. By default, the action called gets the serialized sortable
+   * element as parameters.
+   *
+   * Example:
+   *   <php echo sortable_element($my_list, array(
+   *      'url' => '@order',
+   *   )) ?>
+   *
+   * In the example, the action gets a '$my_list' array parameter
+   * containing the values of the ids of elements the sortable consists
+   * of, in the current order.
+   *
+   * You can change the behaviour with various options, see
+   * http://script.aculo.us for more documentation.
+   */
+  function sortable_element($element_id, $options = array())
+  {
+    $response = sfContext::getInstance()->getResponse();
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/prototype');
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/builder');
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/effects');
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/dragdrop');
+
+    if (!isset($options['with']))
+    {
+      $options['with'] = "Sortable.serialize('$element_id')";
+    }
+
+    if (!isset($options['onUpdate']))
+    {
+      $options['onUpdate'] = "function(){".remote_function($options)."}";
+    }
+
+    foreach (get_ajax_options() as $key)
+    {
+      unset($options[$key]);
+    }
+
+    foreach (array('tag', 'overlap', 'constraint', 'handle') as $option)
+    {
+      if (isset($options[$option]))
+      {
+        $options[$option] = "'{$options[$option]}'";
+      }
+    }
+
+    if (isset($options['containment']))
+    {
+      $options['containment'] = _array_or_string_for_javascript($options['containment']);
+    }
+
+    if (isset($options['hoverclass']))
+    {
+      $options['hoverclass'] = "'{$options['hoverclass']}'";
+    }
+
+    if (isset($options['only']))
+    {
+      $options['only'] = _array_or_string_for_javascript($options['only']);
+    }
+
+    return javascript_tag("Sortable.create('$element_id', "._options_for_javascript($options).")");
+  }
+
+  /**
+   * Makes the element with the DOM ID specified by '$element_id' draggable.
+   *
+   * Example:
+   *   <?php echo draggable_element('my_image', array(
+   *      'revert' => true,
+   *   )) ?>
+   *
+   * You can change the behaviour with various options, see
+   * http://script.aculo.us for more documentation.
+   */
+  function draggable_element($element_id, $options = array())
+  {
+    $response = sfContext::getInstance()->getResponse();
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/prototype');
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/builder');
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/effects');
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/dragdrop');
+
+    return javascript_tag("new Draggable('$element_id', "._options_for_javascript($options).")");
+  }
+
+  /**
+   * Makes the element with the DOM ID specified by '$element_id' receive
+   * dropped draggable elements (created by 'draggable_element()') and make an AJAX call.
+   * By default, the action called gets the DOM ID of the element as parameter.
+   *
+   * Example:
+   *   <?php drop_receiving_element('my_cart', array(
+   *      'url' => 'cart/add',
+   *   )) ?>
+   *
+   * You can change the behaviour with various options, see
+   * http://script.aculo.us for more documentation.
+   */
+  function drop_receiving_element($element_id, $options = array())
+  {
+    $response = sfContext::getInstance()->getResponse();
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/prototype');
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/builder');
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/effects');
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/dragdrop');
+
+    if (!isset($options['with']))
+    {
+      $options['with'] = "'id=' + encodeURIComponent(element.id)";
+    }
+    if (!isset($options['onDrop']))
+    {
+      $options['onDrop'] = "function(element){".remote_function($options)."}";
+    }
+
+    foreach (get_ajax_options() as $key)
+    {
+      unset($options[$key]);
+    }
+
+    if (isset($options['accept']))
+    {
+      $options['accept'] = _array_or_string_for_javascript($options['accept']);
+    }
+
+    if (isset($options['hoverclass']))
+    {
+      $options['hoverclass'] = "'{$options['hoverclass']}'";
+    }
+
+    return javascript_tag("Droppables.add('$element_id', "._options_for_javascript($options).")");
+  }
+
+  /**
+   * Returns a JavaScript tag with the '$content' inside.
+   * Example:
+   *   <?php echo javascript_tag("alert('All is good')") ?>
+   *   => <script type="text/javascript">alert('All is good')</script>
+   */
+  function javascript_tag($content)
+  {
+    return content_tag('script', javascript_cdata_section($content), array('type' => 'text/javascript'));
+  }
+
+  function javascript_cdata_section($content)
+  {
+    return "\n//".cdata_section("\n$content\n//")."\n";
+  }
+
+  /**
+   * wrapper for script.aculo.us/prototype Ajax.Autocompleter.
+   * @param string name value of input field
+   * @param string default value for input field
+   * @param array input tag options. (size, autocomplete, etc...)
+   * @param array completion options. (use_style, etc...)
+   *
+   * @return string input field tag, div for completion results, and
+   *                 auto complete javascript tags
+   */
+  function input_auto_complete_tag($name, $value, $url, $tag_options = array(), $completion_options = array())
+  {
+    $context = sfContext::getInstance();
+
+    $tag_options = _convert_options($tag_options);
+
+    $response = $context->getResponse();
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/prototype');
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/effects');
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/controls');
+
+    $comp_options = _convert_options($completion_options);
+    if (isset($comp_options['use_style']) && $comp_options['use_style'] == true)
+    {
+      $response->addStylesheet(sfConfig::get('sf_prototype_web_dir').'/css/input_auto_complete_tag');
+    }
+
+    $tag_options['id'] = get_id_from_name(isset($tag_options['id']) ? $tag_options['id'] : $name);
+
+    $javascript  = input_tag($name, $value, $tag_options);
+    $javascript .= content_tag('div', '' , array('id' => $tag_options['id'].'_auto_complete', 'class' => 'auto_complete'));
+    $javascript .= _auto_complete_field($tag_options['id'], $url, $comp_options);
+
+    return $javascript;
+  }
+
+  /**
+   * wrapper for script.aculo.us/prototype Ajax.InPlaceEditor.
+   * @param string name id of field that can be edited
+   * @param string url of module/action to be called when ok is clicked
+   * @param array editor tag options. (rows, cols, highlightcolor, highlightendcolor, etc...)
+   *
+   * @return string javascript to manipulate the id field to allow click and edit functionality
+   */
+  function input_in_place_editor_tag($name, $url, $editor_options = array())
+  {
+    $response = sfContext::getInstance()->getResponse();
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/prototype');
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/effects');
+    $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/controls');
+
+    $editor_options = _convert_options($editor_options);
+    $default_options = array('tag' => 'span', 'id' => '\''.$name.'_in_place_editor', 'class' => 'in_place_editor_field');
+
+    return _in_place_editor($name, $url, array_merge($default_options, $editor_options));
+  }
+
+  /**
+   * Mark the start of a block that should only be shown in the browser if JavaScript
+   * is switched on.
+   */
+  function if_javascript()
+  {
+    ob_start();
+  }
+
+  /**
+   * Mark the end of a block that should only be shown in the browser if JavaScript
+   * is switched on.
+   */
+  function end_if_javascript()
+  {
+    $content = ob_get_clean();
+
+    echo javascript_tag("document.write('" . esc_js_no_entities($content) . "');");
+  }
+
+  /*
+   * Makes an HTML element specified by the DOM ID '$field_id' become an in-place
+   * editor of a property.
+   *
+   * A form is automatically created and displayed when the user clicks the element,
+   * something like this:
+   * <form id="myElement-in-place-edit-form" target="specified url">
+   *   <input name="value" text="The content of myElement"/>
+   *   <input type="submit" value="ok"/>
+   *   <a onclick="javascript to cancel the editing">cancel</a>
+   * </form>
+   *
+   * The form is serialized and sent to the server using an AJAX call, the action on
+   * the server should process the value and return the updated value in the body of
+   * the reponse. The element will automatically be updated with the changed value
+   * (as returned from the server).
+   *
+   * Required '$options' are:
+   * 'url'                 Specifies the url where the updated value should
+   *                       be sent after the user presses "ok".
+   *
+   * Addtional '$options' are:
+   * 'rows'                Number of rows (more than 1 will use a TEXTAREA)
+   * 'cancel_text'         The text on the cancel link. (default: "cancel")
+   * 'save_text'           The text on the save link. (default: "ok")
+   * 'external_control'    The id of an external control used to enter edit mode.
+   * 'options'             Pass through options to the AJAX call (see prototype's Ajax.Updater)
+   * 'with'                JavaScript snippet that should return what is to be sent
+   *                       in the AJAX call, 'form' is an implicit parameter
+   */
+    function _in_place_editor($field_id, $url, $options = array())
+    {
+      $javascript = "new Ajax.InPlaceEditor(";
+
+      $javascript .= "'$field_id', ";
+      $javascript .= "'" . url_for($url) . "'";
+
+      $js_options = array();
+
+      if (isset($options['tokens'])) $js_options['tokens'] = _array_or_string_for_javascript($options['tokens']);
+
+      if (isset($options['cancel_text']))
+      {
+        $js_options['cancelText'] = "'".$options['cancel_text']."'";
+      }
+      if (isset($options['save_text']))
+      {
+        $js_options['okText'] = "'".$options['save_text']."'";
+      }
+      if (isset($options['cols']))
+      {
+        $js_options['cols'] = $options['cols'];
+      }
+      if (isset($options['rows']))
+      {
+        $js_options['rows'] = $options['rows'];
+      }
+      if (isset($options['external_control']))
+      {
+        $js_options['externalControl'] = "'".$options['external_control']."'";
+      }
+      if (isset($options['options']))
+      {
+        $js_options['ajaxOptions'] = $options['options'];
+      }
+      if (isset($options['with']))
+      {
+        $js_options['callback'] = "function(form, value) { return ".$options['with']." }";
+      }
+      if (isset($options['highlightcolor']))
+      {
+        $js_options['highlightcolor'] = "'".$options['highlightcolor']."'";
+      }
+      if (isset($options['highlightendcolor']))
+      {
+        $js_options['highlightendcolor'] = "'".$options['highlightendcolor']."'";
+      }
+      if (isset($options['loadTextURL']))
+      {
+        $js_options['loadTextURL'] =  "'".$options['loadTextURL']."'";
+      }
+
+      $javascript .= ', '._options_for_javascript($js_options);
+      $javascript .= ');';
+
+      return javascript_tag($javascript);
+    }
+
+  /**
+   * wrapper for script.aculo.us/prototype Ajax.Autocompleter.
+   * @param string id value of input field
+   * @param string url of module/action to execute for autocompletion
+   * @param array completion options
+   * @return string javascript tag for Ajax.Autocompleter
+   */
+  function _auto_complete_field($field_id, $url, $options = array())
+  {
+    $javascript = "new Ajax.Autocompleter(";
+
+    $javascript .= "'".get_id_from_name($field_id)."', ";
+    if (isset($options['update']))
+    {
+      $javascript .= "'".$options['update']."', ";
+    }
+    else
+    {
+      $javascript .= "'".get_id_from_name($field_id)."_auto_complete', ";
+    }
+
+    $javascript .= "'".url_for($url)."'";
+
+    $js_options = array();
+    if (isset($options['tokens']))
+    {
+      $js_options['tokens'] = _array_or_string_for_javascript($options['tokens']);
+    }
+    if (isset ($options['with']))
+    {
+      $js_options['callback'] = "function(element, value) { return".$options['with']."}";
+    }
+    if (isset($options['indicator']))
+    {
+      $js_options['indicator']  = "'".$options['indicator']."'";
+    }
+    if (isset($options['on_show']))
+    {
+      $js_options['onShow'] = $options['on_show'];
+    }
+    if (isset($options['on_hide']))
+    {
+      $js_options['onHide'] = $options['on_hide'];
+    }
+    if (isset($options['min_chars']))
+    {
+      $js_options['minChars'] = $options['min_chars'];
+    }
+    if (isset($options['frequency']))
+    {
+      $js_options['frequency'] = $options['frequency'];
+    }
+    if (isset($options['update_element']))
+    {
+      $js_options['updateElement'] = $options['update_element'];
+    }
+    if (isset($options['after_update_element']))
+    {
+      $js_options['afterUpdateElement'] = $options['after_update_element'];
+    }
+
+    $javascript .= ', '._options_for_javascript($js_options).');';
+
+    return javascript_tag($javascript);
+  }
+
+  function _options_for_javascript($options)
+  {
+    $opts = array();
+    foreach ($options as $key => $value)
+    {
+      $opts[] = "$key:$value";
+    }
+    sort($opts);
+
+    return '{'.join(', ', $opts).'}';
+  }
+
+  function _array_or_string_for_javascript($option)
+  {
+    if (is_array($option))
+    {
+      return "['".join('\',\'', $option)."']";
+    }
+    else if ($option)
+    {
+      return "'$option'";
+    }
+  }
+
+  function _options_for_ajax($options)
+  {
+    $js_options = _build_callbacks($options);
+
+    $js_options['asynchronous'] = (isset($options['type']) && ($options['type'] == 'synchronous')) ? 'false' : 'true';
+    if (isset($options['method'])) $js_options['method'] = _method_option_to_s($options['method']);
+    if (isset($options['position'])) $js_options['insertion'] = "Insertion.".sfInflector::camelize($options['position']);
+    $js_options['evalScripts'] = (!isset($options['script']) || $options['script'] == '0' || $options['script'] == false) ? 'false' : 'true';
+
+    if (isset($options['form']))
+    {
+      $js_options['parameters'] = 'Form.serialize(this)';
+    }
+    else if (isset($options['submit']))
+    {
+      $js_options['parameters'] = "Form.serialize(document.getElementById('{$options['submit']}'))";
+    }
+    else if (isset($options['with']))
+    {
+      $js_options['parameters'] = $options['with'];
+    }
+
+    return _options_for_javascript($js_options);
+  }
+
+  function _method_option_to_s($method)
+  {
+    return (is_string($method) && $method[0] != "'") ? "'$method'" : $method;
+  }
+
+  function _build_observer($klass, $name, $options = array())
+  {
+    if (!isset($options['with']) && $options['update'])
+    {
+      $options['with'] = 'value';
+    }
+
+    $callback = remote_function($options);
+
+    $javascript  = 'new '.$klass.'("'.$name.'", ';
+    if (isset($options['frequency']) && $options['frequency'] > 0)
+    {
+      $javascript .= $options['frequency'].", ";
+    }
+    $javascript .= "function(element, value) {";
+    $javascript .= $callback.'});';
+
+    return javascript_tag($javascript);
+  }
+
+  function _build_callbacks($options)
+  {
+    $callbacks = array();
+    foreach (get_callbacks() as $callback)
+    {
+      if (isset($options[$callback]))
+      {
+        $name = 'on'.ucfirst($callback);
+        $code = $options[$callback];
+        $callbacks[$name] = 'function(request, json){'.$code.'}';
+      }
+    }
+
+    return $callbacks;
+  }
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/JavascriptHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/NumberHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/NumberHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/NumberHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * NumberHelper.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: NumberHelper.php 3495 2007-02-18 09:30:24Z fabien $
+ */
+
+function format_number($number, $culture = null)
+{
+  if (is_null($number))
+  {
+    return null;
+  }
+
+  $numberFormat = new sfNumberFormat(_current_language($culture));
+
+  return $numberFormat->format($number);
+}
+
+function format_currency($amount, $currency = null, $culture = null)
+{
+  if (is_null($amount))
+  {
+    return null;
+  }
+
+  $numberFormat = new sfNumberFormat(_current_language($culture));
+
+  return $numberFormat->format($amount, 'c', $currency);
+}
+
+function _current_language($culture)
+{
+  return $culture ? $culture : sfContext::getInstance()->getUser()->getCulture();
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/NumberHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/ObjectAdminHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/ObjectAdminHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/ObjectAdminHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,206 @@
+<?php
+
+use_helper('Form', 'Javascript', 'Helper');
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * ObjectHelper for admin generator.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: ObjectAdminHelper.php 3311 2007-01-20 06:24:41Z fabien $
+ */
+
+function object_admin_input_file_tag($object, $method, $options = array())
+{
+  $options = _parse_attributes($options);
+  $name    = _convert_method_to_name($method, $options);
+
+  $html = '';
+
+  $value = _get_object_value($object, $method);
+
+  if ($value)
+  {
+    if ($include_link = _get_option($options, 'include_link'))
+    {
+      $image_path = image_path('/'.sfConfig::get('sf_upload_dir_name').'/'.$include_link.'/'.$value);
+      $image_text = ($include_text = _get_option($options, 'include_text')) ? __($include_text) : __('[show file]');
+
+      $html .= sprintf('<a onclick="window.open(this.href);return false;" href="%s">%s</a>', $image_path, $image_text)."\n";
+    }
+
+    if ($include_remove = _get_option($options, 'include_remove'))
+    {
+      $html .= checkbox_tag(strpos($name, ']') !== false ? substr($name, 0, -1).'_remove]' : $name).' '.($include_remove != true ? __($include_remove) : __('remove file'))."\n";
+    }
+  }
+
+  return input_file_tag($name, $options)."\n<br />".$html;
+}
+
+function object_admin_double_list($object, $method, $options = array(), $callback = null)
+{
+  $options = _parse_attributes($options);
+
+  $options['multiple'] = true;
+  $options['class'] = 'sf_admin_multiple';
+  if (!isset($options['size']))
+  {
+    $options['size'] = 10;
+  }
+  $label_all   = __(isset($options['unassociated_label']) ? $options['unassociated_label'] : 'Unassociated');
+  $label_assoc = __(isset($options['associated_label'])   ? $options['associated_label']   : 'Associated');
+
+  // get the lists of objects
+  list($all_objects, $objects_associated, $associated_ids) = _get_object_list($object, $method, $options, $callback);
+  
+  $objects_unassociated = array();
+  foreach ($all_objects as $object)
+  {
+    if (!in_array($object->getPrimaryKey(), $associated_ids))
+    {
+      $objects_unassociated[] = $object;
+    }
+  }
+
+  // override field name
+  unset($options['control_name']);
+  $name  = _convert_method_to_name($method, $options);
+  $name1 = 'unassociated_'.$name;
+  $name2 = 'associated_'.$name;
+  $select1 = select_tag($name1, options_for_select(_get_options_from_objects($objects_unassociated), '', $options), $options);
+  $options['class'] = 'sf_admin_multiple-selected';
+  $select2 = select_tag($name2, options_for_select(_get_options_from_objects($objects_associated), '', $options), $options);
+
+  $html =
+'<div>
+  <div style="float: left">
+    <div style="font-weight: bold; padding-bottom: 0.5em">%s</div>
+    %s
+  </div>
+  <div style="float: left">
+    %s<br />
+    %s
+  </div>
+  <div style="float: left">
+    <div style="font-weight: bold; padding-bottom: 0.5em">%s</div>
+    %s
+  </div>
+  <br style="clear: both" />
+</div>
+';
+
+  $response = sfContext::getInstance()->getResponse();
+  $response->addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/prototype');
+  $response->addJavascript(sfConfig::get('sf_admin_web_dir').'/js/double_list');
+
+  return sprintf($html,
+    $label_all,
+    $select1,
+    submit_image_tag(sfConfig::get('sf_admin_web_dir').'/images/next.png', "style=\"border: 0\" onclick=\"double_list_move(\$('{$name1}'), \$('{$name2}')); return false;\""),
+    submit_image_tag(sfConfig::get('sf_admin_web_dir').'/images/previous.png', "style=\"border: 0\" onclick=\"double_list_move(\$('{$name2}'), \$('{$name1}')); return false;\""),
+    $label_assoc,
+    $select2
+  );
+}
+
+function object_admin_select_list($object, $method, $options = array(), $callback = null)
+{
+  $options = _parse_attributes($options);
+
+  $options['multiple'] = true;
+  $options['class'] = 'sf_admin_multiple';
+  if (!isset($options['size']))
+  {
+    $options['size'] = 10;
+  }
+
+  // get the lists of objects
+  list($objects, $objects_associated, $ids) = _get_object_list($object, $method, $options, $callback);
+  // override field name
+  unset($options['control_name']);
+  $name = 'associated_'._convert_method_to_name($method, $options);
+
+  return select_tag($name, options_for_select(_get_options_from_objects($objects), $ids, $options), $options);
+}
+
+function object_admin_check_list($object, $method, $options = array(), $callback = null)
+{
+  $options = _parse_attributes($options);
+
+  // get the lists of objects
+  list($objects, $objects_associated, $assoc_ids) = _get_object_list($object, $method, $options, $callback);
+
+  // override field name
+  unset($options['control_name']);
+  $name = 'associated_'._convert_method_to_name($method, $options).'[]';
+  $html = '';
+
+  if (!empty($objects))
+  {
+    // which method to call?
+    $methodToCall = '__toString';
+    foreach (array('__toString', 'toString', 'getPrimaryKey') as $method)
+    {
+      if (method_exists($objects[0], $method))
+      {
+        $methodToCall = $method;
+        break;
+      }
+    }
+
+    $html .= "<ul class=\"sf_admin_checklist\">\n";
+    foreach ($objects as $related_object)
+    {
+      $relatedPrimaryKey = $related_object->getPrimaryKey();
+
+      // multi primary key handling
+      if (is_array($relatedPrimaryKey))
+      {
+        $relatedPrimaryKeyHtmlId = implode('/', $relatedPrimaryKey);
+      }
+      else
+      {
+        $relatedPrimaryKeyHtmlId = $relatedPrimaryKey;
+      }
+
+      $html .= '<li>'.checkbox_tag($name, $relatedPrimaryKeyHtmlId, in_array($relatedPrimaryKey, $assoc_ids)).' <label for="'.get_id_from_name($name, $relatedPrimaryKeyHtmlId).'">'.$related_object->$methodToCall()."</label></li>\n";
+    }
+    $html .= "</ul>\n";
+  }
+
+  return $html;
+}
+
+function _get_propel_object_list($object, $method, $options)
+{
+  // get the lists of objects
+  $through_class = _get_option($options, 'through_class');
+
+  $objects = sfPropelManyToMany::getAllObjects($object, $through_class);
+  $objects_associated = sfPropelManyToMany::getRelatedObjects($object, $through_class);
+  $ids = array_map(create_function('$o', 'return $o->getPrimaryKey();'), $objects_associated);
+
+  return array($objects, $objects_associated, $ids);
+}
+
+function _get_object_list($object, $method, $options, $callback)
+{
+  $object = get_class($object) == 'sfOutputEscaperObjectDecorator' ? $object->getRawValue() : $object;
+  // the default callback is the propel one
+  if (!$callback)
+  {
+    $callback = '_get_propel_object_list';
+  }
+
+  return call_user_func($callback, $object, $method, $options);
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/ObjectAdminHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/ObjectHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/ObjectHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/ObjectHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,324 @@
+<?php
+
+use_helper('Form');
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * ObjectHelper.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: ObjectHelper.php 3294 2007-01-16 06:53:15Z fabien $
+ */
+
+/**
+ * Returns a html date control.
+ *
+ * @param object An object.
+ * @param string An object column.
+ * @param array Date options.
+ * @param bool Date default value.
+ *
+ * @return string An html string which represents a date control.
+ *
+ */
+function object_input_date_tag($object, $method, $options = array(), $default_value = null)
+{
+  $options = _parse_attributes($options);
+
+  $value = _get_object_value($object, $method, $default_value, $param = 'Y-m-d G:i');
+
+  return input_date_tag(_convert_method_to_name($method, $options), $value, $options);
+}
+
+/**
+ * Returns a textarea html tag.
+ *
+ * @param object An object.
+ * @param string An object column.
+ * @param array Textarea options.
+ * @param bool Textarea default value.
+ *
+ * @return string An html string which represents a textarea tag.
+ *
+ */
+function object_textarea_tag($object, $method, $options = array(), $default_value = null)
+{
+  $options = _parse_attributes($options);
+
+  $value = _get_object_value($object, $method, $default_value);
+
+  return textarea_tag(_convert_method_to_name($method, $options), $value, $options);
+}
+
+/**
+ * Accepts a container of objects, the method name to use for the value,
+ * and the method name to use for the display.
+ * It returns a string of option tags.
+ *
+ * NOTE: Only the option tags are returned, you have to wrap this call in a regular HTML select tag.
+ */
+function objects_for_select($options = array(), $value_method, $text_method = null, $selected = null, $html_options = array())
+{
+  $select_options = array();
+  foreach ($options as $option)
+  {
+    // text method exists?
+    if ($text_method && !is_callable(array($option, $text_method)))
+    {
+      $error = sprintf('Method "%s" doesn\'t exist for object of class "%s"', $text_method, _get_class_decorated($option));
+      throw new sfViewException($error);
+    }
+
+    // value method exists?
+    if (!is_callable(array($option, $value_method)))
+    {
+      $error = sprintf('Method "%s" doesn\'t exist for object of class "%s"', $value_method, _get_class_decorated($option));
+      throw new sfViewException($error);
+    }
+
+    $value = $option->$value_method();
+    $key = ($text_method != null) ? $option->$text_method() : $value;
+
+    $select_options[$value] = $key;
+  }
+
+  return options_for_select($select_options, $selected, $html_options);
+}
+
+/**
+ * Returns a list html tag.
+ *
+ * @param object An object or the selected value
+ * @param string An object column.
+ * @param array Input options (related_class option is mandatory).
+ * @param bool Input default value.
+ *
+ * @return string A list string which represents an input tag.
+ *
+ */
+function object_select_tag($object, $method, $options = array(), $default_value = null)
+{
+  $options = _parse_attributes($options);
+
+  $related_class = _get_option($options, 'related_class', false);
+  if (false === $related_class && preg_match('/^get(.+?)Id$/', $method, $match))
+  {
+    $related_class = $match[1];
+  }
+
+  $peer_method = _get_option($options, 'peer_method');
+
+  $text_method = _get_option($options, 'text_method');
+
+  $select_options = _get_options_from_objects(sfContext::getInstance()->retrieveObjects($related_class, $peer_method), $text_method);
+
+  if ($value = _get_option($options, 'include_custom'))
+  {
+    $select_options = array('' => $value) + $select_options;
+  }
+  else if (_get_option($options, 'include_title'))
+  {
+    $select_options = array('' => '-- '._convert_method_to_name($method, $options).' --') + $select_options;
+  }
+  else if (_get_option($options, 'include_blank'))
+  {
+    $select_options = array('' => '') + $select_options;
+  }
+
+  if (is_object($object))
+  {
+    $value = _get_object_value($object, $method, $default_value);
+  }
+  else
+  {
+    $value = $object;
+  }
+
+  $option_tags = options_for_select($select_options, $value, $options);
+
+  return select_tag(_convert_method_to_name($method, $options), $option_tags, $options);
+}
+
+function _get_options_from_objects($objects, $text_method = null)
+{
+  $select_options = array();
+
+  if ($objects)
+  {
+    // multi primary keys handling
+    $multi_primary_keys = is_array($objects[0]->getPrimaryKey()) ? true : false;
+
+    // which method to call?
+    $methodToCall = '';
+    foreach (array($text_method, '__toString', 'toString', 'getPrimaryKey') as $method)
+    {
+      if (is_callable(array($objects[0], $method)))
+      {
+        $methodToCall = $method;
+        break;
+      }
+    }
+
+    // construct select option list
+    foreach ($objects as $tmp_object)
+    {
+      $key   = $multi_primary_keys ? implode('/', $tmp_object->getPrimaryKey()) : $tmp_object->getPrimaryKey();
+      $value = $tmp_object->$methodToCall();
+
+      $select_options[$key] = $value;
+    }
+  }
+
+  return $select_options;
+}
+
+function object_select_country_tag($object, $method, $options = array(), $default_value = null)
+{
+  $options = _parse_attributes($options);
+
+  $value = _get_object_value($object, $method, $default_value);
+
+  return select_country_tag(_convert_method_to_name($method, $options), $value, $options);
+}
+
+function object_select_language_tag($object, $method, $options = array(), $default_value = null)
+{
+  $options = _parse_attributes($options);
+
+  $value = _get_object_value($object, $method, $default_value);
+
+  return select_language_tag(_convert_method_to_name($method, $options), $value, $options);
+}
+
+/**
+ * Returns a hidden input html tag.
+ *
+ * @param object An object.
+ * @param string An object column.
+ * @param array Input options.
+ * @param bool Input default value.
+ *
+ * @return string An html string which represents a hidden input tag.
+ *
+ */
+function object_input_hidden_tag($object, $method, $options = array(), $default_value = null)
+{
+  $options = _parse_attributes($options);
+
+  $value = _get_object_value($object, $method, $default_value);
+
+  return input_hidden_tag(_convert_method_to_name($method, $options), $value, $options);
+}
+
+/**
+ * Returns a input html tag.
+ *
+ * @param object An object.
+ * @param string An object column.
+ * @param array Input options.
+ * @param bool Input default value.
+ *
+ * @return string An html string which represents an input tag.
+ *
+ */
+function object_input_tag($object, $method, $options = array(), $default_value = null)
+{
+  $options = _parse_attributes($options);
+
+  $value = _get_object_value($object, $method, $default_value);
+
+  return input_tag(_convert_method_to_name($method, $options), $value, $options);
+}
+
+/**
+ * Returns a checkbox html tag.
+ *
+ * @param object An object.
+ * @param string An object column.
+ * @param array Checkbox options.
+ * @param bool Checkbox value.
+ *
+ * @return string An html string which represents a checkbox tag.
+ *
+ */
+function object_checkbox_tag($object, $method, $options = array(), $default_value = null)
+{
+  $options = _parse_attributes($options);
+
+  $checked = (boolean) _get_object_value($object, $method, $default_value);
+
+  return checkbox_tag(_convert_method_to_name($method, $options), isset($options['value']) ? $options['value'] : 1, $checked, $options);
+}
+
+function _convert_method_to_name($method, &$options)
+{
+  $name = _get_option($options, 'control_name');
+
+  if (!$name)
+  {
+    if (is_array($method))
+    {
+      $name = implode('-',$method[1]);
+    }
+    else
+    {
+      $name = sfInflector::underscore($method);
+      $name = preg_replace('/^get_?/', '', $name);
+    }
+  }
+
+  return $name;
+}
+
+// returns default_value if object value is null
+// method is either a string or: array('method',array('param1','param2'))
+function _get_object_value($object, $method, $default_value = null, $param = null)
+{
+  // compatibility with the array syntax
+  if (is_string($method))
+  {
+    $param = ($param == null ? array() : array($param));
+    $method = array($method, $param);
+  }
+  
+  // method exists?
+  if (!is_callable(array($object, $method[0])))
+  {
+    $error = 'Method "%s" doesn\'t exist for object of class "%s"';
+    $error = sprintf($error, $method[0], _get_class_decorated($object));
+
+    throw new sfViewException($error);
+  }
+
+  $object_value = call_user_func_array(array($object, $method[0]), $method[1]);
+
+  return ($default_value !== null && $object_value === null) ? $default_value : $object_value;
+}
+
+/**
+ * Returns the name of the class of an decorated object
+ *
+ * @param object An object that might be wrapped in an sfOutputEscaperObjectDecorator(-derivative)
+ *
+ * @return string The name of the class of the object being decorated for escaping, or the class of the object if it isn't decorated
+ */
+function _get_class_decorated($object)
+{
+  if ($object instanceof sfOutputEscaperObjectDecorator)
+  {
+    return sprintf('%s (decorated with %s)', get_class($object->getRawValue()), get_class($object));
+  }
+  else
+  {
+    return get_class($object);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/ObjectHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/PartialHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/PartialHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/PartialHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,439 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * PartialHelper.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: PartialHelper.php 3265 2007-01-13 17:06:40Z fabien $
+ */
+
+/**
+ * Evaluates and echoes a component slot.
+ * The component name is deduced from the definition of the view.yml
+ * For a variable to be accessible to the component and its partial, 
+ * it has to be passed in the second argument.
+ *
+ * <b>Example:</b>
+ * <code>
+ *  include_component_slot('sidebar', array('myvar' => 12345));
+ * </code>
+ *
+ * @param  string slot name
+ * @param  array variables to be made accessible to the component
+ * @return void
+ * @see    get_component_slot, include_partial, include_component
+ */
+function include_component_slot($name, $vars = array())
+{
+  echo get_component_slot($name, $vars);
+}
+
+/**
+ * Evaluates and returns a component slot.
+ * The syntax is similar to the one of include_component_slot.
+ *
+ * <b>Example:</b>
+ * <code>
+ *  echo get_component_slot('sidebar', array('myvar' => 12345));
+ * </code>
+ *
+ * @param  string slot name
+ * @param  array variables to be made accessible to the component
+ * @return string result of the component execution
+ * @see    get_component_slot, include_partial, include_component
+ */
+function get_component_slot($name, $vars = array())
+{
+  $context = sfContext::getInstance();
+
+  $actionStackEntry = $context->getController()->getActionStack()->getLastEntry();
+  $viewInstance     = $actionStackEntry->getViewInstance();
+
+  if (!$viewInstance->hasComponentSlot($name))
+  {
+    // cannot find component slot
+    $error = 'The component slot "%s" is not set';
+    $error = sprintf($error, $name);
+
+    throw new sfConfigurationException($error);
+  }
+
+  if ($componentSlot = $viewInstance->getComponentSlot($name))
+  {
+    return get_component($componentSlot[0], $componentSlot[1], $vars);
+  }
+}
+
+/**
+ * Evaluates and echoes a component.
+ * For a variable to be accessible to the component and its partial, 
+ * it has to be passed in the third argument.
+ *
+ * <b>Example:</b>
+ * <code>
+ *  include_component('mymodule', 'mypartial', array('myvar' => 12345));
+ * </code>
+ *
+ * @param  string module name
+ * @param  string component name
+ * @param  array variables to be made accessible to the component
+ * @return void
+ * @see    get_component, include_partial, include_component_slot
+ */
+function include_component($moduleName, $componentName, $vars = array())
+{
+  echo get_component($moduleName, $componentName, $vars);
+}
+
+/**
+ * Evaluates and returns a component.
+ * The syntax is similar to the one of include_component.
+ *
+ * <b>Example:</b>
+ * <code>
+ *  echo get_component('mymodule', 'mypartial', array('myvar' => 12345));
+ * </code>
+ *
+ * @param  string module name
+ * @param  string component name
+ * @param  array variables to be made accessible to the component
+ * @return string result of the component execution
+ * @see    include_component
+ */
+function get_component($moduleName, $componentName, $vars = array())
+{
+  $context = sfContext::getInstance();
+  $actionName = '_'.$componentName;
+
+  // check cache
+  if ($cacheManager = $context->getViewCacheManager())
+  {
+    $cacheManager->registerConfiguration($moduleName);
+    $uri = '@sf_cache_partial?module='.$moduleName.'&action='.$actionName.'&sf_cache_key='.(isset($vars['sf_cache_key']) ? $vars['sf_cache_key'] : md5(serialize($vars)));
+    if ($retval = _get_cache($cacheManager, $uri))
+    {
+      return $retval;
+    }
+  }
+
+  $controller = $context->getController();
+
+  if (!$controller->componentExists($moduleName, $componentName))
+  {
+    // cannot find component
+    $error = 'The component does not exist: "%s", "%s"';
+    $error = sprintf($error, $moduleName, $componentName);
+
+    throw new sfConfigurationException($error);
+  }
+
+  // create an instance of the action
+  $componentInstance = $controller->getComponent($moduleName, $componentName);
+
+  // initialize the action
+  if (!$componentInstance->initialize($context))
+  {
+    // component failed to initialize
+    $error = 'Component initialization failed for module "%s", component "%s"';
+    $error = sprintf($error, $moduleName, $componentName);
+
+    throw new sfInitializationException($error);
+  }
+
+  // load component's module config file
+  require(sfConfigCache::getInstance()->checkConfig(sfConfig::get('sf_app_module_dir_name').'/'.$moduleName.'/'.sfConfig::get('sf_app_module_config_dir_name').'/module.yml'));
+
+  $componentInstance->getVarHolder()->add($vars);
+
+  // dispatch component
+  $componentToRun = 'execute'.ucfirst($componentName);
+  if (!method_exists($componentInstance, $componentToRun))
+  {
+    if (!method_exists($componentInstance, 'execute'))
+    {
+      // component not found
+      $error = 'sfComponent initialization failed for module "%s", component "%s"';
+      $error = sprintf($error, $moduleName, $componentName);
+      throw new sfInitializationException($error);
+    }
+
+    $componentToRun = 'execute';
+  }
+
+  if (sfConfig::get('sf_logging_enabled'))
+  {
+    $context->getLogger()->info('{PartialHelper} call "'.$moduleName.'->'.$componentToRun.'()'.'"');
+  }
+
+  // run component
+  if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+  {
+    $timer = sfTimerManager::getTimer(sprintf('Component "%s/%s"', $moduleName, $componentName));
+  }
+
+  $retval = $componentInstance->$componentToRun();
+
+  if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+  {
+    $timer->addTime();
+  }
+
+  if ($retval != sfView::NONE)
+  {
+    // render
+    $view = new sfPartialView();
+    $view->initialize($context, $moduleName, $actionName, '');
+
+    $retval = $view->render($componentInstance->getVarHolder()->getAll());
+
+    if ($cacheManager)
+    {
+      $retval = _set_cache($cacheManager, $uri, $retval);
+    }
+
+    return $retval;
+  }
+}
+
+/**
+ * Evaluates and echoes a partial.
+ * The partial name is composed as follows: 'mymodule/mypartial'.
+ * The partial file name is _mypartial.php and is looked for in modules/mymodule/templates/.
+ * If the partial name doesn't include a module name,
+ * then the partial file is searched for in the caller's template/ directory.
+ * If the module name is 'global', then the partial file is looked for in myapp/templates/.
+ * For a variable to be accessible to the partial, it has to be passed in the second argument.
+ *
+ * <b>Example:</b>
+ * <code>
+ *  include_partial('mypartial', array('myvar' => 12345));
+ * </code>
+ *
+ * @param  string partial name
+ * @param  array variables to be made accessible to the partial
+ * @return void
+ * @see    get_partial, include_component
+ */
+function include_partial($templateName, $vars = array())
+{
+  echo get_partial($templateName, $vars);
+}
+
+/**
+ * Evaluates and returns a partial.
+ * The syntax is similar to the one of include_partial
+ *
+ * <b>Example:</b>
+ * <code>
+ *  echo get_partial('mypartial', array('myvar' => 12345));
+ * </code>
+ *
+ * @param  string partial name
+ * @param  array variables to be made accessible to the partial
+ * @return string result of the partial execution
+ * @see    include_partial
+ */
+function get_partial($templateName, $vars = array())
+{
+  $context = sfContext::getInstance();
+
+  // partial is in another module?
+  if (false !== $sep = strpos($templateName, '/'))
+  {
+    $moduleName   = substr($templateName, 0, $sep);
+    $templateName = substr($templateName, $sep + 1);
+  }
+  else
+  {
+    $moduleName = $context->getActionStack()->getLastEntry()->getModuleName();
+  }
+  $actionName = '_'.$templateName;
+
+  if ($cacheManager = $context->getViewCacheManager())
+  {
+    $cacheManager->registerConfiguration($moduleName);
+    $uri = '@sf_cache_partial?module='.$moduleName.'&action='.$actionName.'&sf_cache_key='.(isset($vars['sf_cache_key']) ? $vars['sf_cache_key'] : md5(serialize($vars)));
+    if ($retval = _get_cache($cacheManager, $uri))
+    {
+      return $retval;
+    }
+  }
+
+  $view = new sfPartialView();
+  $view->initialize($context, $moduleName, $actionName, '');
+  $retval = $view->render($vars);
+
+  if ($cacheManager)
+  {
+    $retval = _set_cache($cacheManager, $uri, $retval);
+  }
+
+  return $retval;
+}
+
+function _get_cache($cacheManager, $uri)
+{
+  $retval = $cacheManager->get($uri);
+
+  if (sfConfig::get('sf_web_debug'))
+  {
+    $retval = sfWebDebug::getInstance()->decorateContentWithDebug($uri, $retval, false);
+  }
+
+  return $retval;
+}
+
+function _set_cache($cacheManager, $uri, $retval)
+{
+  $saved = $cacheManager->set($retval, $uri);
+
+  if ($saved && sfConfig::get('sf_web_debug'))
+  {
+    $retval = sfWebDebug::getInstance()->decorateContentWithDebug($uri, $retval, true);
+  }
+
+  return $retval;
+}
+
+/**
+ * Begins the capturing of the slot.
+ *
+ * @param  string slot name
+ * @return void
+ * @see    end_slot
+ */
+function slot($name)
+{
+  $context = sfContext::getInstance();
+  $response = $context->getResponse();
+
+  $slots = $response->getParameter('slots', array(), 'symfony/view/sfView/slot');
+  $slot_names = $response->getParameter('slot_names', array(), 'symfony/view/sfView/slot');
+  if (in_array($name, $slot_names))
+  {
+    throw new sfCacheException(sprintf('A slot named "%s" is already started.', $name));
+  }
+
+  $slot_names[] = $name;
+  $slots[$name] = '';
+
+  $response->setParameter('slots', $slots, 'symfony/view/sfView/slot');
+  $response->setParameter('slot_names', $slot_names, 'symfony/view/sfView/slot');
+
+  if (sfConfig::get('sf_logging_enabled'))
+  {
+    $context->getLogger()->info(sprintf('{PartialHelper} set slot "%s"', $name));
+  }
+
+  ob_start();
+  ob_implicit_flush(0);
+}
+
+/**
+ * Stops the content capture and save the content in the slot.
+ *
+ * @return void
+ * @see    slot
+ */
+function end_slot()
+{
+  $content = ob_get_clean();
+
+  $response = sfContext::getInstance()->getResponse();
+  $slots = $response->getParameter('slots', array(), 'symfony/view/sfView/slot');
+  $slot_names = $response->getParameter('slot_names', array(), 'symfony/view/sfView/slot');
+  if (!$slot_names)
+  {
+    throw new sfCacheException('No slot started.');
+  }
+
+  $name = array_pop($slot_names);
+  $slots[$name] = $content;
+
+  $response->setParameter('slots', $slots, 'symfony/view/sfView/slot');
+  $response->setParameter('slot_names', $slot_names, 'symfony/view/sfView/slot');
+}
+
+/**
+ * Returns true if the slot exists.
+ *
+ * @param  string slot name
+ * @return boolean true, if the slot exists
+ * @see    get_slot, include_slot
+ */
+function has_slot($name)
+{
+  $response = sfContext::getInstance()->getResponse();
+  $slots = $response->getParameter('slots', array(), 'symfony/view/sfView/slot');
+
+  return array_key_exists($name, $slots);
+}
+
+/**
+ * Evaluates and echoes a slot.
+ *
+ * <b>Example:</b>
+ * <code>
+ *  include_slot('navigation');
+ * </code>
+ *
+ * @param  string slot name
+ * @return void
+ * @see    has_slot, get_slot
+ */
+function include_slot($name)
+{
+  $context = sfContext::getInstance();
+  $slots = $context->getResponse()->getParameter('slots', array(), 'symfony/view/sfView/slot');
+
+  if (sfConfig::get('sf_logging_enabled'))
+  {
+    $context->getLogger()->info(sprintf('{PartialHelper} get slot "%s"', $name));
+  }
+
+  if (isset($slots[$name]))
+  {
+    echo $slots[$name];
+
+    return true;
+  }
+  else
+  {
+    return false;
+  }
+}
+
+/**
+ * Evaluates and returns a slot.
+ *
+ * <b>Example:</b>
+ * <code>
+ *  echo get_slot('navigation');
+ * </code>
+ *
+ * @param  string slot name
+ * @return string content of the slot
+ * @see    has_slot, include_slot
+ */
+function get_slot($name)
+{
+  $context = sfContext::getInstance();
+  $slots = $context->getResponse()->getParameter('slots', array(), 'symfony/view/sfView/slot');
+
+  if (sfConfig::get('sf_logging_enabled'))
+  {
+    $context->getLogger()->info(sprintf('{PartialHelper} get slot "%s"', $name));
+  }
+
+  return isset($slots[$name]) ? $slots[$name] : '';
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/PartialHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/TagHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/TagHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/TagHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,119 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004 David Heinemeier Hansson
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * TagHelper defines some base helpers to construct html tags.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     David Heinemeier Hansson
+ * @version    SVN: $Id: TagHelper.php 3336 2007-01-23 21:05:10Z fabien $
+ */
+
+/**
+ * Constructs an html tag.
+ *
+ * @param  $name    string  tag name
+ * @param  $options array   tag options
+ * @param  $open    boolean true to leave tag open
+ * @return string
+ */
+function tag($name, $options = array(), $open = false)
+{
+  if (!$name)
+  {
+    return '';
+  }
+
+  return '<'.$name._tag_options($options).(($open) ? '>' : ' />');
+}
+
+function content_tag($name, $content = '', $options = array())
+{
+  if (!$name)
+  {
+    return '';
+  }
+
+  return '<'.$name._tag_options($options).'>'.$content.'</'.$name.'>';
+}
+
+function cdata_section($content)
+{
+  return "<![CDATA[$content]]>";
+}
+
+/**
+ * Escape carrier returns and single and double quotes for Javascript segments.
+ */
+function escape_javascript($javascript = '')
+{
+  $javascript = preg_replace('/\r\n|\n|\r/', "\\n", $javascript);
+  $javascript = preg_replace('/(["\'])/', '\\\\\1', $javascript);
+
+  return $javascript;
+}
+
+/**
+ * Escapes an HTML string.
+ *
+ * @param  string HTML string to escape
+ * @return string escaped string
+ */
+function escape_once($html)
+{
+  return fix_double_escape(htmlspecialchars($html));
+}
+
+/**
+ * Fixes double escaped strings.
+ *
+ * @param  string HTML string to fix
+ * @return string escaped string
+ */
+function fix_double_escape($escaped)
+{
+  return preg_replace('/&amp;([a-z]+|(#\d+)|(#x[\da-f]+));/i', '&$1;', $escaped);
+}
+
+function _tag_options($options = array())
+{
+  $options = _parse_attributes($options);
+
+  $html = '';
+  foreach ($options as $key => $value)
+  {
+    $html .= ' '.$key.'="'.escape_once($value).'"';
+  }
+
+  return $html;
+}
+
+function _parse_attributes($string)
+{
+  return is_array($string) ? $string : sfToolkit::stringToArray($string);
+}
+
+function _get_option(&$options, $name, $default = null)
+{
+  if (array_key_exists($name, $options))
+  {
+    $value = $options[$name];
+    unset($options[$name]);
+  }
+  else
+  {
+    $value = $default;
+  }
+
+  return $value;
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/TagHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/TextHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/TextHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/TextHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,207 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004 David Heinemeier Hansson
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * TextHelper.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     David Heinemeier Hansson
+ * @version    SVN: $Id: TextHelper.php 3408 2007-02-06 08:05:36Z fabien $
+ */
+
+/**
+ * Truncates +text+ to the length of +length+ and replaces the last three characters with the +truncate_string+
+ * if the +text+ is longer than +length+.
+ */
+function truncate_text($text, $length = 30, $truncate_string = '...', $truncate_lastspace = false)
+{
+  if ($text == '')
+  {
+    return '';
+  }
+
+  if (strlen($text) > $length)
+  {
+    $truncate_text = substr($text, 0, $length - strlen($truncate_string));
+    if ($truncate_lastspace)
+    {
+      $truncate_text = preg_replace('/\s+?(\S+)?$/', '', $truncate_text);
+    }
+
+    return $truncate_text.$truncate_string;
+  }
+  else
+  {
+    return $text;
+  }
+}
+
+/**
+ * Highlights the +phrase+ where it is found in the +text+ by surrounding it like
+ * <strong class="highlight">I'm a highlight phrase</strong>. The highlighter can be specialized by
+ * passing +highlighter+ as single-quoted string with \1 where the phrase is supposed to be inserted.
+ * N.B.: The +phrase+ is sanitized to include only letters, digits, and spaces before use.
+ */
+function highlight_text($text, $phrase, $highlighter = '<strong class="highlight">\\1</strong>')
+{
+  if ($text == '')
+  {
+    return '';
+  }
+
+  if ($phrase == '')
+  {
+    return $text;
+  }
+
+  return preg_replace('/('.preg_quote($phrase).')/i', $highlighter, $text);
+}
+
+/**
+ * Extracts an excerpt from the +text+ surrounding the +phrase+ with a number of characters on each side determined
+ * by +radius+. If the phrase isn't found, nil is returned. Ex:
+ *   excerpt("hello my world", "my", 3) => "...lo my wo..."
+ */
+function excerpt_text($text, $phrase, $radius = 100, $excerpt_string = '...')
+{
+  if ($text == '' || $phrase == '')
+  {
+    return '';
+  }
+
+  $phrase = preg_quote($phrase);
+
+  $found_pos = strpos(strtolower($text), strtolower($phrase));
+  if ($found_pos !== false)
+  {
+    $start_pos = max($found_pos - $radius, 0);
+    $end_pos = min($found_pos + strlen($phrase) + $radius, strlen($text));
+
+    $prefix = ($start_pos > 0) ? $excerpt_string : '';
+    $postfix = $end_pos < strlen($text) ? $excerpt_string : '';
+
+    return $prefix.substr($text, $start_pos, $end_pos - $start_pos).$postfix;
+  }
+}
+
+/**
+ * Word wrap long lines to line_width.
+ */
+function wrap_text($text, $line_width = 80)
+{
+  return preg_replace('/(.{1,'.$line_width.'})(\s+|$)/s', "\\1\n", preg_replace("/\n/", "\n\n", $text));
+}
+
+/*
+    # Returns +text+ transformed into html using very simple formatting rules
+    # Surrounds paragraphs with <tt>&lt;p&gt;</tt> tags, and converts line breaks into <tt>&lt;br /&gt;</tt>
+    # Two consecutive newlines(<tt>\n\n</tt>) are considered as a paragraph, one newline (<tt>\n</tt>) is
+    # considered a linebreak, three or more consecutive newlines are turned into two newlines
+*/
+function simple_format_text($text, $options = array())
+{
+  $css = (isset($options['class'])) ? ' class="'.$options['class'].'"' : '';
+
+  $text = sfToolkit::pregtr($text, array("/(\r\n|\r)/"        => "\n",               // lets make them newlines crossplatform
+                                         "/\n{3,}/"           => "\n\n",             // zap dupes
+                                         "/\n\n/"             => "</p>\\0<p$css>",   // turn two newlines into paragraph
+                                         "/([^\n])\n([^\n])/" => "\\1\n<br />\\2")); // turn single newline into <br/>
+
+  return '<p'.$css.'>'.$text.'</p>'; // wrap the first and last line in paragraphs before we're done
+}
+
+/**
+ * Turns all urls and email addresses into clickable links. The +link+ parameter can limit what should be linked.
+ * Options are :all (default), :email_addresses, and :urls.
+ *
+ * Example:
+ *   auto_link("Go to http://www.symfony-project.com and say hello to fabien.potencier en example.com") =>
+ *     Go to <a href="http://www.symfony-project.com">http://www.symfony-project.com</a> and
+ *     say hello to <a href="mailto:fabien.potencier en example.com">fabien.potencier en example.com</a>
+ */
+function auto_link_text($text, $link = 'all', $href_options = array())
+{
+  if ($link == 'all')
+  {
+    return _auto_link_urls(_auto_link_email_addresses($text), $href_options);
+  }
+  else if ($link == 'email_addresses')
+  {
+    return _auto_link_email_addresses($text);
+  }
+  else if ($link == 'urls')
+  {
+    return _auto_link_urls($text, $href_options);
+  }
+}
+
+/*
+ * Turns all links into words, like "<a href="something">else</a>" to "else".
+ */
+function strip_links_text($text)
+{
+  return preg_replace('/<a.*>(.*)<\/a>/m', '\\1', $text);
+}
+
+if (!defined('SF_AUTO_LINK_RE'))
+{
+  define('SF_AUTO_LINK_RE', '~
+    (                       # leading text
+      <\w+.*?>|             #   leading HTML tag, or
+      [^=!:\'"/]|           #   leading punctuation, or
+      ^                     #   beginning of line
+    )
+    (
+      (?:https?://)|        # protocol spec, or
+      (?:www\.)             # www.*
+    )
+    (
+      [-\w]+                   # subdomain or domain
+      (?:\.[-\w]+)*            # remaining subdomains or domain
+      (?::\d+)?                # port
+      (?:/(?:(?:[\~\w\+%-]|(?:[,.;:][^\s$]))+)?)* # path
+      (?:\?[\w\+%&=.;-]+)?     # query string
+      (?:\#[\w\-]*)?           # trailing anchor
+    )
+    ([[:punct:]]|\s|<|$)    # trailing text
+   ~x');
+}
+
+/**
+ * Turns all urls into clickable links.
+ */
+function _auto_link_urls($text, $href_options = array())
+{
+  $href_options = _tag_options($href_options);
+  return preg_replace_callback(
+    SF_AUTO_LINK_RE,
+    create_function('$matches', '
+      if (preg_match("/<a\s/i", $matches[1]))
+      {
+        return $matches[0];
+      }
+      else
+      {
+        return $matches[1].\'<a href="\'.($matches[2] == "www." ? "http://www." : $matches[2]).$matches[3].\'"'.$href_options.'>\'.$matches[2].$matches[3].\'</a>\'.$matches[4];
+      }
+    ')
+  , $text);
+}
+
+/**
+ * Turns all email addresses into clickable links.
+ */
+function _auto_link_email_addresses($text)
+{
+  return preg_replace('/([\w\.!#\$%\-+.]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/', '<a href="mailto:\\1">\\1</a>', $text);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/TextHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/UrlHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/UrlHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/UrlHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,438 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * UrlHelper.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: UrlHelper.php 3380 2007-02-01 06:57:47Z fabien $
+ */
+
+
+/**
+ * Returns a routed URL based on the module/action passed as argument
+ * and the routing configuration.
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo url_for('my_module/my_action');
+ *    => /path/to/my/action
+ *  echo url_for('@my_rule');
+ *    => /path/to/my/action 
+ *  echo url_for('@my_rule', true);
+ *    => http://myapp.example.com/path/to/my/action
+ * </code>
+ *
+ * @param  string 'module/action' or '@rule' of the action
+ * @param  bool return absolute path?
+ * @return string routed URL
+ */
+function url_for($internal_uri, $absolute = false)
+{
+  static $controller;
+
+  if (!isset($controller))
+  {
+    $controller = sfContext::getInstance()->getController();
+  }
+
+  return $controller->genUrl($internal_uri, $absolute);
+}
+
+/**
+ * Creates a <a> link tag of the given name using a routed URL
+ * based on the module/action passed as argument and the routing configuration.
+ * It's also possible to pass a string instead of a module/action pair to
+ * get a link tag that just points without consideration. 
+ * If null is passed as a name, the link itself will become the name.
+ * If an object is passed as a name, the object string representation is used.
+ * One of the options serves for for creating javascript confirm alerts where 
+ * if you pass 'confirm' => 'Are you sure?', the link will be guarded 
+ * with a JS popup asking that question. If the user accepts, the link is processed,
+ * otherwise not.
+ *
+ * <b>Options:</b>
+ * - 'absolute' - if set to true, the helper outputs an absolute URL
+ * - 'query_string' - to append a query string (starting by ?) to the routed url
+ * - 'confirm' - displays a javascript confirmation alert when the link is clicked
+ * - 'popup' - if set to true, the link opens a new browser window 
+ * - 'post' - if set to true, the link submits a POST request instead of GET (caution: do not use inside a form)
+ *
+ * <b>Note:</b> The 'popup' and 'post' options are not compatible with each other.
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo link_to('Delete this page', 'my_module/my_action');
+ *    => <a href="/path/to/my/action">Delete this page</a>
+ *  echo link_to('Visit Hoogle', 'http://www.hoogle.com');
+ *    => <a href="http://www.hoogle.com">Visit Hoogle</a>
+ *  echo link_to('Delete this page', 'my_module/my_action', array('id' => 'myid', 'confirm' => 'Are you sure?', 'absolute' => true));
+ *    => <a href="http://myapp.example.com/path/to/my/action" id="myid" onclick="return confirm('Are you sure?');">Delete this page</a>
+ * </code>
+ *
+ * @param  string name of the link, i.e. string to appear between the <a> tags
+ * @param  string 'module/action' or '@rule' of the action
+ * @param  array additional HTML compliant <a> tag parameters
+ * @return string XHTML compliant <a href> tag
+ * @see    url_for
+ */
+function link_to($name = '', $internal_uri = '', $options = array())
+{
+  $html_options = _parse_attributes($options);
+
+  $html_options = _convert_options_to_javascript($html_options);
+
+  $absolute = false;
+  if (isset($html_options['absolute_url']))
+  {
+    $html_options['absolute'] = $html_options['absolute_url'];
+    unset($html_options['absolute_url']);
+  }
+  if (isset($html_options['absolute']))
+  {
+    $absolute = (boolean) $html_options['absolute'];
+    unset($html_options['absolute']);
+  }
+
+  $html_options['href'] = url_for($internal_uri, $absolute);
+
+  if (isset($html_options['query_string']))
+  {
+    $html_options['href'] .= '?'.$html_options['query_string'];
+    unset($html_options['query_string']);
+  }
+
+  if (is_object($name))
+  {
+    if (method_exists($name, '__toString'))
+    {
+      $name = $name->__toString();
+    }
+    else
+    {
+      throw new sfException(sprintf('Object of class "%s" cannot be converted to string (Please create a __toString() method)', get_class($name)));
+    }
+  }
+
+  if (!strlen($name))
+  {
+    $name = $html_options['href'];
+  }
+
+  return content_tag('a', $name, $html_options);
+}
+
+/**
+ * If the condition passed as first argument is true,
+ * creates a <a> link tag of the given name using a routed URL
+ * based on the module/action passed as argument and the routing configuration.
+ * If the condition is false, the given name is returned between <span> tags
+ *
+ * <b>Options:</b>
+ * - 'tag' - the HTML tag that must enclose the name if the condition is false, defaults to <span>
+ * - 'absolute' - if set to true, the helper outputs an absolute URL
+ * - 'query_string' - to append a query string (starting by ?) to the routed url
+ * - 'confirm' - displays a javascript confirmation alert when the link is clicked
+ * - 'popup' - if set to true, the link opens a new browser window 
+ * - 'post' - if set to true, the link submits a POST request instead of GET (caution: do not use inside a form)
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo link_to_if($user->isAdministrator(), 'Delete this page', 'my_module/my_action');
+ *    => <a href="/path/to/my/action">Delete this page</a>
+ *  echo link_to_if(!$user->isAdministrator(), 'Delete this page', 'my_module/my_action'); 
+ *    => <span>Delete this page</span>
+ * </code>
+ *
+ * @param  bool condition
+ * @param  string name of the link, i.e. string to appear between the <a> tags
+ * @param  string 'module/action' or '@rule' of the action
+ * @param  array additional HTML compliant <a> tag parameters
+ * @return string XHTML compliant <a href> tag or name
+ * @see    link_to
+ */
+function link_to_if($condition, $name = '', $internal_uri = '', $options = array())
+{
+  if ($condition)
+  {
+    return link_to($name, $internal_uri, $options);
+  }
+  else
+  {
+    $html_options = _parse_attributes($options);
+    $tag = _get_option($html_options, 'tag', 'span');
+
+    return content_tag($tag, $name, $html_options);
+  }
+}
+
+/**
+ * If the condition passed as first argument is false,
+ * creates a <a> link tag of the given name using a routed URL
+ * based on the module/action passed as argument and the routing configuration.
+ * If the condition is true, the given name is returned between <span> tags
+ *
+ * <b>Options:</b>
+ * - 'tag' - the HTML tag that must enclose the name if the condition is true, defaults to <span>
+ * - 'absolute' - if set to true, the helper outputs an absolute URL
+ * - 'query_string' - to append a query string (starting by ?) to the routed url
+ * - 'confirm' - displays a javascript confirmation alert when the link is clicked
+ * - 'popup' - if set to true, the link opens a new browser window 
+ * - 'post' - if set to true, the link submits a POST request instead of GET (caution: do not use inside a form)
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo link_to_unless($user->isAdministrator(), 'Delete this page', 'my_module/my_action');
+ *    => <span>Delete this page</span>
+ *  echo link_to_unless(!$user->isAdministrator(), 'Delete this page', 'my_module/my_action'); 
+ *    => <a href="/path/to/my/action">Delete this page</a>
+ * </code>
+ *
+ * @param  bool condition
+ * @param  string name of the link, i.e. string to appear between the <a> tags
+ * @param  string 'module/action' or '@rule' of the action
+ * @param  array additional HTML compliant <a> tag parameters
+ * @return string XHTML compliant <a href> tag or name
+ * @see    link_to
+ */
+function link_to_unless($condition, $name = '', $url = '', $options = array())
+{
+  return link_to_if(!$condition, $name, $url, $options);
+}
+
+/**
+ * Creates an <input> button tag of the given name pointing to a routed URL
+ * based on the module/action passed as argument and the routing configuration.
+ * The syntax is similar to the one of link_to.
+ *
+ * <b>Options:</b>
+ * - 'absolute' - if set to true, the helper outputs an absolute URL
+ * - 'query_string' - to append a query string (starting by ?) to the routed url
+ * - 'confirm' - displays a javascript confirmation alert when the button is clicked
+ * - 'popup' - if set to true, the button opens a new browser window 
+ * - 'post' - if set to true, the button submits a POST request instead of GET (caution: do not use inside a form)
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo button_to('Delete this page', 'my_module/my_action');
+ *    => <input value="Delete this page" type="button" onclick="document.location.href='/path/to/my/action';" />
+ * </code>
+ *
+ * @param  string name of the button
+ * @param  string 'module/action' or '@rule' of the action
+ * @param  array additional HTML compliant <input> tag parameters
+ * @return string XHTML compliant <input> tag
+ * @see    url_for, link_to
+ */
+function button_to($name, $internal_uri, $options = array())
+{
+  $html_options = _convert_options($options);
+  $html_options['value'] = $name;
+
+  if (isset($html_options['post']) && $html_options['post'])
+  {
+    if (isset($html_options['popup']))
+    {
+      throw new sfConfigurationException('You can\'t use "popup" and "post" together');
+    }
+    $html_options['type'] = 'submit';
+    unset($html_options['post']);
+    $html_options = _convert_options_to_javascript($html_options);
+
+    return form_tag($internal_uri, array('method' => 'post', 'class' => 'button_to')).tag('input', $html_options).'</form>';
+  }
+  else if (isset($html_options['popup']))
+  {
+    $html_options['type'] = 'button';
+    $html_options = _convert_options_to_javascript($html_options, $internal_uri);
+
+    return tag('input', $html_options);
+  }
+  else
+  {
+    $html_options['type']    = 'button';
+    $html_options['onclick'] = "document.location.href='".url_for($internal_uri)."';";
+    $html_options = _convert_options_to_javascript($html_options);
+
+    return tag('input', $html_options);
+  }
+}
+
+/**
+ * Creates a <a> link tag to the given email (with href="mailto:...").
+ * If null is passed as a name, the email itself will become the name.
+ *
+ * <b>Options:</b>
+ * - 'encode' - if set to true, the email address appears with various random encoding for each letter.
+ * The mail link still works when encoded, but the address doesn't appear in clear
+ * in the source. Use it to prevent spam (efficiency not guaranteed).
+ *
+ * <b>Examples:</b>
+ * <code>
+ *  echo mail_to('webmaster en example.com');
+ *    => <a href="mailto:webmaster en example.com">webmaster en example.com</a>
+ *  echo mail_to('webmaster en example.com', 'send us an email');
+ *    => <a href="mailto:webmaster en example.com">send us an email</a>
+ *  echo mail_to('webmaster en example.com', 'send us an email', array('encode' => true));
+ *    => <a href="&#x6d;a&#x69;&#x6c;&#x74;&#111;&#58;&#x77;&#x65;b&#x6d;as&#116;&#x65;&#114;&#64;&#101;&#x78;&#x61;&#x6d;&#x70;&#108;&#x65;&#46;&#99;&#x6f;&#109;">send us an email</a>
+ * </code>
+ *
+ * @param  string target email
+ * @param  string name of the link, i.e. string to appear between the <a> tags
+ * @param  array additional HTML compliant <a> tag parameters
+ * @return string XHTML compliant <a href> tag
+ * @see    link_to
+ */
+function mail_to($email, $name = '', $options = array(), $default_value = array())
+{
+  $html_options = _parse_attributes($options);
+
+  $html_options = _convert_options_to_javascript($html_options);
+
+  $default_tmp = _parse_attributes($default_value);
+  $default = array();
+  foreach ($default_tmp as $key => $value)
+  {
+    $default[] = urlencode($key).'='.urlencode($value);
+  }
+  $options = count($default) ? '?'.implode('&', $default) : '';
+
+  if (isset($html_options['encode']) && $html_options['encode'])
+  {
+    unset($html_options['encode']);
+    $html_options['href'] = _encodeText('mailto:'.$email.$options);
+    if (!$name)
+    {
+      $name = _encodeText($email);
+    }
+  }
+  else
+  {
+    $html_options['href'] = 'mailto:'.$email.$options;
+    if (!$name)
+    {
+      $name = $email;
+    }
+  }
+
+  return content_tag('a', $name, $html_options);
+}
+
+function _convert_options_to_javascript($html_options, $internal_uri = '')
+{
+  // confirm
+  $confirm = isset($html_options['confirm']) ? $html_options['confirm'] : '';
+  unset($html_options['confirm']);
+
+  // popup
+  $popup = isset($html_options['popup']) ? $html_options['popup'] : '';
+  unset($html_options['popup']);
+
+  // post
+  $post = isset($html_options['post']) ? $html_options['post'] : '';
+  unset($html_options['post']);
+
+  $onclick = isset($html_options['onclick']) ? $html_options['onclick'] : '';
+
+  if ($popup && $post)
+  {
+    throw new sfConfigurationException('You can\'t use "popup" and "post" in the same link');
+  }
+  else if ($confirm && $popup)
+  {
+    $html_options['onclick'] = $onclick.'if ('._confirm_javascript_function($confirm).') { '._popup_javascript_function($popup, $internal_uri).' };return false;';
+  }
+  else if ($confirm && $post)
+  {
+    $html_options['onclick'] = $onclick.'if ('._confirm_javascript_function($confirm).') { '._post_javascript_function().' };return false;';
+  }
+  else if ($confirm)
+  {
+    if ($onclick)
+    {
+      $html_options['onclick'] = 'if ('._confirm_javascript_function($confirm).') {'.$onclick.'}';
+    }
+    else
+    {
+      $html_options['onclick'] = 'return '._confirm_javascript_function($confirm).';';
+    }
+  }
+  else if ($post)
+  {
+    $html_options['onclick'] = $onclick._post_javascript_function().'return false;';
+  }
+  else if ($popup)
+  {
+    $html_options['onclick'] = $onclick._popup_javascript_function($popup, $internal_uri).'return false;';
+  }
+
+  return $html_options;
+}
+
+function _confirm_javascript_function($confirm)
+{
+  return "confirm('".escape_javascript($confirm)."')";
+}
+
+function _popup_javascript_function($popup, $internal_uri = '')
+{
+  $url = $internal_uri == '' ? 'this.href' : "'".url_for($internal_uri)."'";
+
+  if (is_array($popup))
+  {
+    if (isset($popup[1]))
+    {
+      return "var w=window.open(".$url.",'".$popup[0]."','".$popup[1]."');w.focus();";
+    }
+    else
+    {
+      return "var w=window.open(".$url.",'".$popup[0]."');w.focus();";
+    }
+  }
+  else
+  {
+    return "var w=window.open(".$url.");w.focus();";
+  }
+}
+
+function _post_javascript_function()
+{
+  return "f = document.createElement('form'); document.body.appendChild(f); f.method = 'POST'; f.action = this.href; f.submit();";
+}
+
+function _encodeText($text)
+{
+  $encoded_text = '';
+
+  for ($i = 0; $i < strlen($text); $i++)
+  {
+    $char = $text{$i};
+    $r = rand(0, 100);
+
+    # roughly 10% raw, 45% hex, 45% dec
+    # '@' *must* be encoded. I insist.
+    if ($r > 90 && $char != '@')
+    {
+      $encoded_text .= $char;
+    }
+    else if ($r < 45)
+    {
+      $encoded_text .= '&#x'.dechex(ord($char)).';';
+    }
+    else
+    {
+      $encoded_text .= '&#'.ord($char).';';
+    }
+  }
+
+  return $encoded_text;
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/UrlHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/ValidationHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/ValidationHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/ValidationHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * ValidationHelper.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: ValidationHelper.php 1553 2006-06-29 19:26:04Z fabien $
+ */
+
+function form_has_error($param)
+{
+  return sfContext::getInstance()->getRequest()->hasError($param);
+}
+
+function form_error($param, $options = array(), $catalogue = 'messages')
+{
+  $param_for_sf = str_replace(array('[', ']'), array('{', '}'), $param);
+  $param = str_replace(array('{', '}'), array('[', ']'), $param);
+
+  $options = _parse_attributes($options);
+
+  $request = sfContext::getInstance()->getRequest();
+
+  $style = $request->hasError($param_for_sf) ? '' : 'display:none;';
+  $options['style'] = $style.(isset($options['style']) ? $options['style']:'');
+
+  if (!isset($options['class']))
+  {
+    $options['class'] = sfConfig::get('sf_validation_error_class', 'form_error');
+  }
+  if (!isset($options['id']))
+  {
+    $options['id'] = sfConfig::get('sf_validation_error_id_prefix', 'error_for_').get_id_from_name($param);
+  }
+
+  $prefix = sfConfig::get('sf_validation_error_prefix', '');
+  if (isset($options['prefix']))
+  {
+    $prefix = $options['prefix'];
+    unset($options['prefix']);
+  }
+
+  $suffix = sfConfig::get('sf_validation_error_suffix', '');
+  if (isset($options['suffix']))
+  {
+    $suffix = $options['suffix'];
+    unset($options['suffix']);
+  }
+
+  $error = $request->getError($param_for_sf, $catalogue);
+
+  return content_tag('div', $prefix.$error.$suffix, $options)."\n";
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/ValidationHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/sfRichTextEditor.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/sfRichTextEditor.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/sfRichTextEditor.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfRichTextEditor is an abstract class for rich text editor classes.
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfRichTextEditor.class.php 3284 2007-01-15 19:05:48Z fabien $
+ */
+abstract class sfRichTextEditor
+{
+  protected
+    $name = '',
+    $content = '',
+    $options = array();
+
+  /**
+   * Initializes this rich text editor.
+   *
+   * @param string The tag name
+   * @param string The rich text editor content
+   * @param array  An array of options
+   */
+  public function initialize($name, $content, $options = array())
+  {
+    $this->name = $name;
+    $this->content = $content;
+    $this->options = $options;
+  }
+
+  /**
+   * Returns the rich text editor as HTML.
+   *
+   * @return string Rich text editor HTML representation
+   */
+  abstract public function toHTML();
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/sfRichTextEditor.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/sfRichTextEditorFCK.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/sfRichTextEditorFCK.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/sfRichTextEditorFCK.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,91 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfRichTextEditorFCK implements the FCK rich text editor.
+ *
+ * <b>Options:</b>
+ *  - tool   - Sets the FCKEditor toolbar style
+ *  - config - Sets custom path to the FCKEditor configuration file
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfRichTextEditorFCK.class.php 3284 2007-01-15 19:05:48Z fabien $
+ */
+class sfRichTextEditorFCK extends sfRichTextEditor
+{
+  /**
+   * Returns the rich text editor as HTML.
+   *
+   * @return string Rich text editor HTML representation
+   */
+  public function toHTML()
+  {
+    $options = $this->options;
+
+    // we need to know the id for things the rich text editor
+    // in advance of building the tag
+    $id = _get_option($options, 'id', $this->name);
+
+    $php_file = sfConfig::get('sf_rich_text_fck_js_dir').DIRECTORY_SEPARATOR.'fckeditor.php';
+
+    if (!is_readable(sfConfig::get('sf_web_dir').DIRECTORY_SEPARATOR.$php_file))
+    {
+      throw new sfConfigurationException('You must install FCKEditor to use this helper (see rich_text_fck_js_dir settings).');
+    }
+
+    // FCKEditor.php class is written with backward compatibility of PHP4.
+    // This reportings are to turn off errors with public properties and already declared constructor
+    $error_reporting = ini_get('error_reporting');
+    error_reporting(E_ALL);
+
+    require_once(sfConfig::get('sf_web_dir').DIRECTORY_SEPARATOR.$php_file);
+
+    // turn error reporting back to your settings
+    error_reporting($error_reporting);
+
+    $fckeditor           = new FCKeditor($this->name);
+    $fckeditor->BasePath = sfContext::getInstance()->getRequest()->getRelativeUrlRoot().'/'.sfConfig::get('sf_rich_text_fck_js_dir').'/';
+    $fckeditor->Value    = $this->content;
+
+    if (isset($options['width']))
+    {
+      $fckeditor->Width = $options['width'];
+    }
+    elseif (isset($options['cols']))
+    {
+      $fckeditor->Width = (string)((int) $options['cols'] * 10).'px';
+    }
+
+    if (isset($options['height']))
+    {
+      $fckeditor->Height = $options['height'];
+    }
+    elseif (isset($options['rows']))
+    {
+      $fckeditor->Height = (string)((int) $options['rows'] * 10).'px';
+    }
+
+    if (isset($options['tool']))
+    {
+      $fckeditor->ToolbarSet = $options['tool'];
+    }
+
+    if (isset($options['config']))
+    {
+      $fckeditor->Config['CustomConfigurationsPath'] = javascript_path($options['config']);
+    }
+
+    $content = $fckeditor->CreateHtml();
+
+    return $content;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/sfRichTextEditorFCK.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/sfRichTextEditorTinyMCE.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/sfRichTextEditorTinyMCE.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/sfRichTextEditorTinyMCE.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,114 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfRichTextEditorTinyMCE implements the TinyMCE rich text editor.
+ *
+ * <b>Options:</b>
+ *  - css - Path to the TinyMCE editor stylesheet
+ *
+ *    <b>Css example:</b>
+ *    <code>
+ *    / * user: foo * / => without spaces. 'foo' is the name in the select box
+ *    .foobar
+ *    {
+ *      color: #f00;
+ *    }
+ *    </code>
+ *
+ * @package    symfony
+ * @subpackage helper
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfRichTextEditorTinyMCE.class.php 3284 2007-01-15 19:05:48Z fabien $
+ */
+class sfRichTextEditorTinyMCE extends sfRichTextEditor
+{
+  /**
+   * Returns the rich text editor as HTML.
+   *
+   * @return string Rich text editor HTML representation
+   */
+  public function toHTML()
+  {
+    $options = $this->options;
+
+    // we need to know the id for things the rich text editor
+    // in advance of building the tag
+    $id = _get_option($options, 'id', $this->name);
+
+    // use tinymce's gzipped js?
+    $tinymce_file = _get_option($options, 'tinymce_gzip') ? '/tiny_mce_gzip.php' : '/tiny_mce.js';
+
+    // tinymce installed?
+    $js_path = sfConfig::get('sf_rich_text_js_dir') ? '/'.sfConfig::get('sf_rich_text_js_dir').$tinymce_file : '/sf/tinymce/js'.$tinymce_file;
+    if (!is_readable(sfConfig::get('sf_web_dir').$js_path))
+    {
+      throw new sfConfigurationException('You must install TinyMCE to use this helper (see rich_text_js_dir settings).');
+    }
+
+    sfContext::getInstance()->getResponse()->addJavascript($js_path);
+
+    use_helper('Javascript');
+
+    $tinymce_options = '';
+    $style_selector  = '';
+
+    // custom CSS file?
+    if ($css_file = _get_option($options, 'css'))
+    {
+      $css_path = stylesheet_path($css_file);
+
+      sfContext::getInstance()->getResponse()->addStylesheet($css_path);
+
+      $css    = file_get_contents(sfConfig::get('sf_web_dir').DIRECTORY_SEPARATOR.$css_path);
+      $styles = array();
+      preg_match_all('#^/\*\s*user:\s*(.+?)\s*\*/\s*\015?\012\s*\.([^\s]+)#Smi', $css, $matches, PREG_SET_ORDER);
+      foreach ($matches as $match)
+      {
+        $styles[] = $match[1].'='.$match[2];
+      }
+
+      $tinymce_options .= '  content_css: "'.$css_path.'",'."\n";
+      $tinymce_options .= '  theme_advanced_styles: "'.implode(';', $styles).'"'."\n";
+      $style_selector   = 'styleselect,separator,';
+    }
+
+    $culture = sfContext::getInstance()->getUser()->getCulture();
+
+    $tinymce_js = '
+tinyMCE.init({
+  mode: "exact",
+  language: "'.strtolower(substr($culture, 0, 2)).'",
+  elements: "'.$id.'",
+  plugins: "table,advimage,advlink,flash",
+  theme: "advanced",
+  theme_advanced_toolbar_location: "top",
+  theme_advanced_toolbar_align: "left",
+  theme_advanced_path_location: "bottom",
+  theme_advanced_buttons1: "'.$style_selector.'justifyleft,justifycenter,justifyright,justifyfull,separator,bold,italic,strikethrough,separator,sub,sup,separator,charmap",
+  theme_advanced_buttons2: "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,image,flash,separator,cleanup,removeformat,separator,code",
+  theme_advanced_buttons3: "tablecontrols",
+  extended_valid_elements: "img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name]",
+  relative_urls: false,
+  debug: false
+  '.($tinymce_options ? ','.$tinymce_options : '').'
+  '.(isset($options['tinymce_options']) ? ','.$options['tinymce_options'] : '').'
+});';
+
+    if (isset($options['tinymce_options']))
+    {
+      unset($options['tinymce_options']);
+    }
+
+    return
+      content_tag('script', javascript_cdata_section($tinymce_js), array('type' => 'text/javascript')).
+      content_tag('textarea', $this->content, array_merge(array('name' => $this->name, 'id' => get_id_from_name($id, null)), _convert_options($options)));
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/helper/sfRichTextEditorTinyMCE.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/MO.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/MO.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/MO.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,354 @@
+<?php
+/**
+ * TGettext_MO class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version $Revision: 1415 $  $Date$
+ * @package System.I18N.core
+ */
+
+ 
+// +----------------------------------------------------------------------+
+// | PEAR :: File :: Gettext :: MO                                        |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 3.0 of the PHP license,       |
+// | that is available at http://www.php.net/license/3_0.txt              |
+// | If you did not receive a copy of the PHP license and are unable      |
+// | to obtain it through the world-wide-web, please send a note to       |
+// | license en php.net so we can mail you a copy immediately.               |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 2004 Michael Wallner <mike en iworks.at>                  |
+// +----------------------------------------------------------------------+
+//
+// $Id: MO.php 1415 2006-06-11 08:33:51Z fabien $
+
+/**
+ * File::Gettext::MO
+ * 
+ * @author      Michael Wallner <mike en php.net>
+ * @license     PHP License
+ */
+
+require_once dirname(__FILE__).'/TGettext.class.php';
+
+/** 
+ * File_Gettext_MO
+ * 
+ * GNU MO file reader and writer.
+ *
+ * @author      Michael Wallner <mike en php.net>
+ * @version     $Revision: 1415 $
+ * @access      public
+ * @package System.I18N.core 
+ */
+class TGettext_MO extends TGettext
+{
+    /**
+     * file handle
+     * 
+     * @access  private
+     * @var     resource
+     */
+    protected $_handle = null;
+    
+    /**
+     * big endianess
+     * 
+     * Whether to write with big endian byte order.
+     * 
+     * @access  public
+     * @var     bool
+     */
+    protected $writeBigEndian = false;
+    
+    /**
+     * Constructor
+     *
+     * @access  public
+     * @return  object      File_Gettext_MO
+     * @param   string      $file   path to GNU MO file
+     */
+    function TGettext_MO($file = '')
+    {
+        $this->file = $file;
+    }
+
+    /**
+     * _read
+     *
+     * @access  private
+     * @return  mixed
+     * @param   int     $bytes
+     */
+    function _read($bytes = 1)
+    {
+        if (0 < $bytes = abs($bytes)) {
+            return fread($this->_handle, $bytes);
+        }
+        return null;
+    }
+    
+    /**
+     * _readInt
+     *
+     * @access  private
+     * @return  int
+     * @param   bool    $bigendian
+     */
+    function _readInt($bigendian = false)
+    {
+		//unpack returns a reference????
+		$unpacked = unpack($bigendian ? 'N' : 'V', $this->_read(4));
+        return array_shift($unpacked);
+    }
+    
+    /**
+     * _writeInt
+     *
+     * @access  private
+     * @return  int
+     * @param   int     $int
+     */
+    function _writeInt($int)
+    {
+        return $this->_write(pack($this->writeBigEndian ? 'N' : 'V', (int) $int));
+    }
+    
+    /**
+     * _write
+     *
+     * @access  private
+     * @return  int
+     * @param   string  $data
+     */
+    function _write($data)
+    {
+        return fwrite($this->_handle, $data);
+    }
+    
+    /**
+     * _writeStr
+     *
+     * @access  private
+     * @return  int
+     * @param   string  $string
+     */
+    function _writeStr($string)
+    {
+        return $this->_write($string . "\0");
+    }
+    
+    /**
+     * _readStr
+     *
+     * @access  private
+     * @return  string
+     * @param   array   $params     associative array with offset and length 
+     *                              of the string
+     */
+    function _readStr($params)
+    {
+        fseek($this->_handle, $params['offset']);
+        return $this->_read($params['length']);
+    }
+    
+    /**
+     * Load MO file
+     *
+     * @access   public
+     * @return   mixed   Returns true on success or PEAR_Error on failure.
+     * @param    string  $file
+     */
+    function load($file = null)
+    {
+        if (!isset($file)) {
+            $file = $this->file;
+        }
+        
+        // open MO file
+        if (!is_resource($this->_handle = @fopen($file, 'rb'))) {
+            return false;
+        }
+        // lock MO file shared
+        if (!@flock($this->_handle, LOCK_SH)) {
+            @fclose($this->_handle);
+            return false;
+        }
+        
+        // read (part of) magic number from MO file header and define endianess
+
+		//unpack returns a reference????
+		$unpacked = unpack('c', $this->_read(4));
+        switch ($magic = array_shift($unpacked))
+        {
+            case -34:
+                $be = false;
+            break;
+            
+            case -107:
+                $be = true;
+            break;
+            
+            default:
+                return false;
+        }
+
+        // check file format revision - we currently only support 0
+        if (0 !== ($_rev = $this->_readInt($be))) {
+            return false;
+        }
+       
+        // count of strings in this file
+        $count = $this->_readInt($be);
+        
+        // offset of hashing table of the msgids
+        $offset_original = $this->_readInt($be);
+        // offset of hashing table of the msgstrs
+        $offset_translat = $this->_readInt($be);
+        
+        // move to msgid hash table
+        fseek($this->_handle, $offset_original);
+        // read lengths and offsets of msgids
+        $original = array();
+        for ($i = 0; $i < $count; $i++) {
+            $original[$i] = array(
+                'length' => $this->_readInt($be),
+                'offset' => $this->_readInt($be)
+            );
+        }
+        
+        // move to msgstr hash table
+        fseek($this->_handle, $offset_translat);
+        // read lengths and offsets of msgstrs
+        $translat = array();
+        for ($i = 0; $i < $count; $i++) {
+            $translat[$i] = array(
+                'length' => $this->_readInt($be),
+                'offset' => $this->_readInt($be)
+            );
+        }
+        
+        // read all
+        for ($i = 0; $i < $count; $i++) {
+            $this->strings[$this->_readStr($original[$i])] = 
+                $this->_readStr($translat[$i]);
+        }
+        
+        // done
+        @flock($this->_handle, LOCK_UN);
+        @fclose($this->_handle);
+        $this->_handle = null;
+        
+        // check for meta info
+        if (isset($this->strings[''])) {
+            $this->meta = parent::meta2array($this->strings['']);
+            unset($this->strings['']);
+        }
+        
+        return true;
+    }
+    
+    /**
+     * Save MO file
+     *
+     * @access  public
+     * @return  mixed   Returns true on success or PEAR_Error on failure.
+     * @param   string  $file
+     */
+    function save($file = null)
+    {
+        if (!isset($file)) {
+            $file = $this->file;
+        }
+        
+        // open MO file
+        if (!is_resource($this->_handle = @fopen($file, 'wb'))) {
+            return false;
+        }
+        // lock MO file exclusively
+        if (!@flock($this->_handle, LOCK_EX)) {
+            @fclose($this->_handle);
+            return false;
+        }
+        
+        // write magic number
+        if ($this->writeBigEndian) {
+            $this->_write(pack('c*', 0x95, 0x04, 0x12, 0xde));
+        } else {
+            $this->_write(pack('c*', 0xde, 0x12, 0x04, 0x95));
+        }
+        
+        // write file format revision
+        $this->_writeInt(0);
+        
+        $count = count($this->strings) + ($meta = (count($this->meta) ? 1 : 0));
+        // write count of strings
+        $this->_writeInt($count);
+        
+        $offset = 28;
+        // write offset of orig. strings hash table
+        $this->_writeInt($offset);
+        
+        $offset += ($count * 8);
+        // write offset transl. strings hash table
+        $this->_writeInt($offset);
+        
+        // write size of hash table (we currently ommit the hash table)
+        $this->_writeInt(0);
+        
+        $offset += ($count * 8);
+        // write offset of hash table
+        $this->_writeInt($offset);
+        
+        // unshift meta info
+        if ($meta) {
+            $meta = '';
+            foreach ($this->meta as $key => $val) {
+                $meta .= $key . ': ' . $val . "\n";
+            }
+            $strings = array('' => $meta) + $this->strings;
+        } else {
+            $strings = $this->strings;
+        }
+        
+        // write offsets for original strings
+        foreach (array_keys($strings) as $o) {
+            $len = strlen($o);
+            $this->_writeInt($len);
+            $this->_writeInt($offset);
+            $offset += $len + 1;
+        }
+        
+        // write offsets for translated strings
+        foreach ($strings as $t) {
+            $len = strlen($t);
+            $this->_writeInt($len);
+            $this->_writeInt($offset);
+            $offset += $len + 1;
+        }
+
+        // write original strings
+        foreach (array_keys($strings) as $o) {
+            $this->_writeStr($o);
+        }
+
+        // write translated strings
+        foreach ($strings as $t) {
+            $this->_writeStr($t);
+        }
+        
+        // done
+        @flock($this->_handle, LOCK_UN);
+        @fclose($this->_handle);
+        return true;
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/MO.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/PO.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/PO.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/PO.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,159 @@
+<?php
+/**
+ * TGettext_PO class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version $Revision: 1415 $  $Date$
+ * @package System.I18N.core
+ */
+
+// +----------------------------------------------------------------------+
+// | PEAR :: File :: Gettext :: PO                                        |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 3.0 of the PHP license,       |
+// | that is available at http://www.php.net/license/3_0.txt              |
+// | If you did not receive a copy of the PHP license and are unable      |
+// | to obtain it through the world-wide-web, please send a note to       |
+// | license en php.net so we can mail you a copy immediately.               |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 2004 Michael Wallner <mike en iworks.at>                  |
+// +----------------------------------------------------------------------+
+//
+// $Id: PO.php 1415 2006-06-11 08:33:51Z fabien $
+
+/**
+ * File::Gettext::PO
+ * 
+ * @author      Michael Wallner <mike en php.net>
+ * @license     PHP License
+ */
+ 
+require_once dirname(__FILE__).'/TGettext.class.php';
+
+/** 
+ * File_Gettext_PO
+ *
+ * GNU PO file reader and writer.
+ * 
+ * @author      Michael Wallner <mike en php.net>
+ * @version     $Revision: 1415 $
+ * @access      public
+ * @package System.I18N.core 
+ */
+class TGettext_PO extends TGettext
+{
+    /**
+     * Constructor
+     *
+     * @access  public
+     * @return  object      File_Gettext_PO
+     * @param   string      path to GNU PO file
+     */
+    function TGettext_PO($file = '')
+    {
+        $this->file = $file;
+    }
+
+    /**
+     * Load PO file
+     *
+     * @access  public
+     * @return  mixed   Returns true on success or PEAR_Error on failure.
+     * @param   string  $file
+     */
+    function load($file = null)
+    {
+        if (!isset($file)) {
+            $file = $this->file;
+        }
+        
+        // load file
+        if (!$contents = @file($file)) {
+            return false;
+        }
+        $contents = implode('', $contents);
+        
+        // match all msgid/msgstr entries
+        $matched = preg_match_all(
+            '/(msgid\s+("([^"]|\\\\")*?"\s*)+)\s+' .
+            '(msgstr\s+("([^"]|\\\\")*?"\s*)+)/',
+            $contents, $matches
+        );
+        unset($contents);
+        
+        if (!$matched) {
+            return false;
+        }
+        
+        // get all msgids and msgtrs
+        for ($i = 0; $i < $matched; $i++) {
+            $msgid = preg_replace(
+                '/\s*msgid\s*"(.*)"\s*/s', '\\1', $matches[1][$i]);
+            $msgstr= preg_replace(
+                '/\s*msgstr\s*"(.*)"\s*/s', '\\1', $matches[4][$i]);
+            $this->strings[parent::prepare($msgid)] = parent::prepare($msgstr);
+        }
+        
+        // check for meta info
+        if (isset($this->strings[''])) {
+            $this->meta = parent::meta2array($this->strings['']);
+            unset($this->strings['']);
+        }
+        
+        return true;
+    }
+    
+    /**
+     * Save PO file
+     *
+     * @access  public
+     * @return  mixed   Returns true on success or PEAR_Error on failure.
+     * @param   string  $file
+     */
+    function save($file = null)
+    {
+        if (!isset($file)) {
+            $file = $this->file;
+        }
+
+        // open PO file
+        if (!is_resource($fh = @fopen($file, 'w'))) {
+            return false;
+        }
+
+        // lock PO file exclusively
+        if (!flock($fh, LOCK_EX)) {
+            fclose($fh);
+            return false;
+        }
+        // write meta info
+        if (count($this->meta)) {
+            $meta = 'msgid ""' . "\nmsgstr " . '""' . "\n";
+            foreach ($this->meta as $k => $v) {
+                $meta .= '"' . $k . ': ' . $v . '\n"' . "\n";
+            }
+            fwrite($fh, $meta . "\n");
+        }
+        // write strings
+        foreach ($this->strings as $o => $t) {
+            fwrite($fh,
+                'msgid "'  . parent::prepare($o, true) . '"' . "\n" .
+                'msgstr "' . parent::prepare($t, true) . '"' . "\n\n"
+            );
+        }
+        
+        //done
+        @flock($fh, LOCK_UN);
+        @fclose($fh);
+        return true;
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/PO.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/TGettext.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/TGettext.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/TGettext.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,286 @@
+<?php
+/**
+ * TGettext class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version $Revision: 3152 $  $Date$
+ * @package System.I18N.core
+ */
+
+// +----------------------------------------------------------------------+
+// | PEAR :: File :: Gettext                                              |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 3.0 of the PHP license,       |
+// | that is available at http://www.php.net/license/3_0.txt              |
+// | If you did not receive a copy of the PHP license and are unable      |
+// | to obtain it through the world-wide-web, please send a note to       |
+// | license en php.net so we can mail you a copy immediately.               |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 2004 Michael Wallner <mike en iworks.at>                  |
+// +----------------------------------------------------------------------+
+//
+// $Id: TGettext.class.php 3152 2007-01-05 06:16:57Z fabien $
+
+/**
+ * File::Gettext
+ * 
+ * @author      Michael Wallner <mike en php.net>
+ * @license     PHP License
+ */
+
+/**
+ * Use PHPs builtin error messages
+ */
+//ini_set('track_errors', true);
+
+/** 
+ * File_Gettext
+ * 
+ * GNU gettext file reader and writer.
+ * 
+ * #################################################################
+ * # All protected members of this class are public in its childs. #
+ * #################################################################
+ *
+ * @author      Michael Wallner <mike en php.net>
+ * @version     $Revision: 3152 $
+ * @access      public
+ * @package System.I18N.core 
+ */
+class TGettext
+{
+    /**
+     * strings
+     * 
+     * associative array with all [msgid => msgstr] entries
+     * 
+     * @access  protected
+     * @var     array
+    */
+    protected $strings = array();
+
+    /**
+     * meta
+     * 
+     * associative array containing meta 
+     * information like project name or content type
+     * 
+     * @access  protected
+     * @var     array
+     */
+    protected $meta = array();
+    
+    /**
+     * file path
+     * 
+     * @access  protected
+     * @var     string
+     */
+    protected $file = '';
+    
+    /**
+     * Factory
+     *
+     * @static
+     * @access  public
+     * @return  object  Returns File_Gettext_PO or File_Gettext_MO on success 
+     *                  or PEAR_Error on failure.
+     * @param   string  $format MO or PO
+     * @param   string  $file   path to GNU gettext file
+     */
+    static function factory($format, $file = '')
+    {
+        $format = strToUpper($format);
+        $filename = dirname(__FILE__).'/'.$format.'.php';
+        if (is_file($filename) == false)
+        	throw new Exception ("Class file $file not found");
+        	
+        include_once $filename;
+        $class = 'TGettext_' . $format;
+
+        return new $class($file);
+    }
+
+    /**
+     * poFile2moFile
+     *
+     * That's a simple fake of the 'msgfmt' console command.  It reads the
+     * contents of a GNU PO file and saves them to a GNU MO file.
+     * 
+     * @static
+     * @access  public
+     * @return  mixed   Returns true on success or PEAR_Error on failure.
+     * @param   string  $pofile path to GNU PO file
+     * @param   string  $mofile path to GNU MO file
+     */
+    function poFile2moFile($pofile, $mofile)
+    {
+        if (!is_file($pofile)) {
+            throw new Exception("File $pofile doesn't exist.");
+        }
+        
+        include_once dirname(__FILE__).'/PO.php';
+        
+        $PO = new TGettext_PO($pofile);
+        if (true !== ($e = $PO->load())) {
+            return $e;
+        }
+        
+        $MO = $PO->toMO();
+        if (true !== ($e = $MO->save($mofile))) {
+            return $e;
+        }
+        unset($PO, $MO);
+        
+        return true;
+    }
+    
+    /**
+     * prepare
+     *
+     * @static
+     * @access  protected
+     * @return  string
+     * @param   string  $string
+     * @param   bool    $reverse
+     */
+    function prepare($string, $reverse = false)
+    {
+        if ($reverse) {
+            $smap = array('"', "\n", "\t", "\r");
+            $rmap = array('\"', '\\n"' . "\n" . '"', '\\t', '\\r');
+            return (string) str_replace($smap, $rmap, $string);
+        } else {
+        	$string = preg_replace('/"\s+"/', '', $string);
+            $smap = array('\\n', '\\r', '\\t', '\"');
+            $rmap = array("\n", "\r", "\t", '"');
+            return (string) str_replace($smap, $rmap, $string);
+        }
+    }
+    
+    /**
+     * meta2array
+     *
+     * @static
+     * @access  public
+     * @return  array
+     * @param   string  $meta
+     */
+    function meta2array($meta)
+    {
+        $array = array();
+        foreach (explode("\n", $meta) as $info) {
+            if ($info = trim($info)) {
+                list($key, $value) = explode(':', $info, 2);
+                $array[trim($key)] = trim($value);
+            }
+        }
+        return $array;
+    }
+
+    /**
+     * toArray
+     * 
+     * Returns meta info and strings as an array of a structure like that:
+     * <code>
+     *   array(
+     *       'meta' => array(
+     *           'Content-Type'      => 'text/plain; charset=iso-8859-1',
+     *           'Last-Translator'   => 'Michael Wallner <mike en iworks.at>',
+     *           'PO-Revision-Date'  => '2004-07-21 17:03+0200',
+     *           'Language-Team'     => 'German <mail en example.com>',
+     *       ),
+     *       'strings' => array(
+     *           'All rights reserved'   => 'Alle Rechte vorbehalten',
+     *           'Welcome'               => 'Willkommen',
+     *           // ...
+     *       )
+     *   )
+     * </code>
+     * 
+     * @see     fromArray()
+     * @access  protected
+     * @return  array
+     */
+    function toArray()
+    {
+    	return array('meta' => $this->meta, 'strings' => $this->strings);
+    }
+    
+    /**
+     * fromArray
+     * 
+     * Assigns meta info and strings from an array of a structure like that:
+     * <code>
+     *   array(
+     *       'meta' => array(
+     *           'Content-Type'      => 'text/plain; charset=iso-8859-1',
+     *           'Last-Translator'   => 'Michael Wallner <mike en iworks.at>',
+     *           'PO-Revision-Date'  => date('Y-m-d H:iO'),
+     *           'Language-Team'     => 'German <mail en example.com>',
+     *       ),
+     *       'strings' => array(
+     *           'All rights reserved'   => 'Alle Rechte vorbehalten',
+     *           'Welcome'               => 'Willkommen',
+     *           // ...
+     *       )
+     *   )
+     * </code>
+     * 
+     * @see     toArray()
+     * @access  protected
+     * @return  bool
+     * @param   array       $array
+     */
+    function fromArray($array)
+    {
+    	if (!array_key_exists('strings', $array)) {
+    	    if (count($array) != 2) {
+                return false;
+    	    } else {
+    	        list($this->meta, $this->strings) = $array;
+            }
+    	} else {
+            $this->meta = @$array['meta'];
+            $this->strings = @$array['strings'];
+        }
+        return true;
+    }
+    
+    /**
+     * toMO
+     *
+     * @access  protected
+     * @return  object  File_Gettext_MO
+     */
+    function toMO()
+    {
+        include_once dirname(__FILE__).'/MO.php';
+        $MO = new TGettext_MO;
+        $MO->fromArray($this->toArray());
+        return $MO;
+    }
+    
+    /**
+     * toPO
+     *
+     * @access  protected
+     * @return  object      File_Gettext_PO
+     */
+    function toPO()
+    {
+        include_once dirname(__FILE__).'/PO.php';
+        $PO = new TGettext_PO;
+        $PO->fromArray($this->toArray());
+        return $PO;
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/Gettext/TGettext.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfChoiceFormat.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfChoiceFormat.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfChoiceFormat.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,217 @@
+<?php
+
+/**
+ * sfChoiceFormat class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: sfChoiceFormat.class.php 3148 2007-01-04 19:34:28Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+
+
+/**
+ * sfChoiceFormat class.
+ * 
+ * sfChoiceFormat converts between ranges of numeric values and string 
+ * names for those ranges.
+ *
+ * A sfChoiceFormat splits the real number line -Inf to +Inf into two or 
+ * more contiguous ranges. Each range is mapped to a string. 
+ * sfChoiceFormat is generally used in a MessageFormat for displaying 
+ * grammatically correct plurals such as "There are 2 files."
+ *
+ * <code>
+ *  $string = '[0] are no files |[1] is one file |(1,Inf] are {number} files';
+ *  
+ *  $formatter = new sfMessageFormat(...); //init for a source
+ *  $translated = $formatter->format($string);
+ *
+ *  $choice = new sfChoiceFormat();
+ *  echo $choice->format($translated, 0); //shows "are no files"
+ * </code>
+ *
+ * The message/string choices are separated by the pipe "|" followed
+ * by a set notation of the form
+ *  # <t>[1,2]</t> -- accepts values between 1 and 2, inclusive.
+ *  # <t>(1,2)</t> -- accepts values between 1 and 2, excluding 1 and 2.
+ *  # <t>{1,2,3,4}</t> -- only values defined in the set are accepted.
+ *  # <t>[-Inf,0)</t> -- accepts value greater or equal to negative infinity 
+ *                       and strictly less than 0
+ * Any non-empty combinations of the delimiters of square and round brackets
+ * are acceptable.
+ *
+ * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version v1.0, last update on Fri Dec 24 20:46:16 EST 2004
+ * @package System.I18N.core
+ */
+class sfChoiceFormat
+{
+  /**
+   * The pattern to validate a set notation
+   *
+   * @var string
+   */
+  protected $validate = '/[\(\[\{]|[-Inf\d]+|,|[\+Inf\d]+|[\)\]\}]/ms';
+
+  /**
+   * The pattern to parse the formatting string.
+   *
+   * @var string 
+   */
+  protected $parse = '/\s?\|?([\(\[\{]([-Inf\d]+,?[\+Inf\d]*)+[\)\]\}])\s?/';
+
+  /**
+   * The value for positive infinity.
+   *
+   * @var float 
+   */
+  protected $inf;
+
+  /**
+   * Constructor.
+   */
+  public function __construct()
+  {
+    $this->inf = -log(0);
+  }
+
+  /**
+   * Determine if the given number belongs to a given set
+   *
+   * @param  float the number to test.
+   * @param  string the set, in set notation.
+   * @return boolean true if number is in the set, false otherwise.
+   */
+  public function isValid($number, $set)
+  {
+    $n = preg_match_all($this->validate, $set, $matches, PREG_SET_ORDER);
+
+    if ($n < 3)
+    {
+      $error = 'Invalid set "%s"';
+      $error = sprintf($error, $set);
+      throw new sfException($error);
+    }
+
+    $leftBracket = $matches[0][0];
+    $rightBracket = $matches[$n - 1][0];
+
+    $i = 0;
+    $elements = array();
+
+    foreach ($matches as $match)
+    {
+      $string = $match[0];
+      if ($i != 0 && $i != $n - 1 && $string !== ',')
+      {
+        if ($string == '-Inf')
+        {
+          $elements[] = -1 * $this->inf;
+        }
+        else if ($string == '+Inf' || $string == 'Inf')
+        {
+          $elements[] = $this->inf;
+        }
+        else
+        {
+          $elements[] = floatval($string);
+        }
+      }
+      $i++;
+    }
+    $total = count($elements);
+    $number = floatval($number);
+
+    if ($leftBracket == '{' && $rightBracket == '}')
+    {
+      return in_array($number, $elements);
+    }
+
+    $left = false;
+    if ($leftBracket == '[')
+    {
+      $left = $number >= $elements[0];
+    }
+    else if ($leftBracket == '(')
+    {
+      $left = $number > $elements[0];
+    }
+
+    $right = false;
+    if ($rightBracket==']')
+    {
+      $right = $number <= $elements[$total - 1];
+    }
+    else if ($rightBracket == ')')
+    {
+      $right = $number < $elements[$total - 1];
+    }
+
+    if ($left && $right)
+    {
+      return true;
+    }
+
+    return false;
+  }
+
+  /**
+   * Parse a choice string and get a list of sets and a list of strings corresponding to the sets.
+   *
+   * @param  string the string containing the choices
+   * @return array array($sets, $strings)
+   */
+  public function parse($string)
+  {
+    $n = preg_match_all($this->parse, $string, $matches, PREG_OFFSET_CAPTURE);
+    $sets = array();
+    foreach ($matches[1] as $match)
+    {
+      $sets[] = $match[0];
+    }
+
+    $offset = $matches[0];
+    $strings = array();
+    for ($i = 0; $i < $n; $i++)
+    {
+      $len = strlen($offset[$i][0]);
+      $begin = $i == 0 ? $len : $offset[$i][1] + $len;
+      $end = $i == $n - 1 ? strlen($string) : $offset[$i + 1][1];
+      $strings[] = substr($string, $begin, $end - $begin);
+    }
+
+    return array($sets, $strings);
+  }
+
+  /**
+   * For the choice string, and a number, find and return the string that satisfied the set within the choices.
+   *
+   * @param  string the choices string.
+   * @param  float the number to test.
+   * @return string the choosen string.
+   */
+  public function format($string, $number)
+  {
+    list($sets, $strings) = $this->parse($string);
+    $total = count($sets);
+    for ($i = 0; $i < $total; $i++)
+    {
+      if ($this->isValid($number, $sets[$i]))
+      {
+        return $strings[$i];
+      }
+    }
+
+    return false;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfChoiceFormat.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfCultureInfo.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfCultureInfo.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfCultureInfo.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,688 @@
+<?php
+
+/**
+ * sfCultureInfo class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: sfCultureInfo.class.php 3037 2006-12-15 08:05:13Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+
+/**
+ * sfCultureInfo class.
+ *
+ * Represents information about a specific culture including the
+ * names of the culture, the calendar used, as well as access to
+ * culture-specific objects that provide methods for common operations,
+ * such as formatting dates, numbers, and currency.
+ *
+ * The sfCultureInfo class holds culture-specific information, such as the
+ * associated language, sublanguage, country/region, calendar, and cultural
+ * conventions. This class also provides access to culture-specific
+ * instances of sfDateTimeFormatInfo and sfNumberFormatInfo. These objects
+ * contain the information required for culture-specific operations,
+ * such as formatting dates, numbers and currency.
+ *
+ * The culture names follow the format "<languagecode>_<country/regioncode>",
+ * where <languagecode> is a lowercase two-letter code derived from ISO 639
+ * codes. You can find a full list of the ISO-639 codes at
+ * http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt
+ *
+ * The <country/regioncode2> is an uppercase two-letter code derived from
+ * ISO 3166. A copy of ISO-3166 can be found at
+ * http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html
+ *
+ * For example, Australian English is "en_AU".
+ *
+ * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version v1.0, last update on Sat Dec 04 13:41:46 EST 2004
+ * @package System.I18N.core
+ */
+class sfCultureInfo
+{
+  /**
+   * ICU data filename extension.
+   * @var string
+   */
+  protected $dataFileExt = '.dat';
+
+  /**
+   * The ICU data array.
+   * @var array
+   */
+  protected $data = array();
+
+  /**
+   * The current culture.
+   * @var string
+   */
+  protected $culture;
+
+  /**
+   * Directory where the ICU data is stored.
+   * @var string
+   */
+  protected $dataDir;
+
+  /**
+   * A list of ICU date files loaded.
+   * @var array
+   */
+  protected $dataFiles = array();
+
+  /**
+   * The current date time format info.
+   * @var sfDateTimeFormatInfo
+   */
+  protected $dateTimeFormat;
+
+  /**
+   * The current number format info.
+   * @var sfNumberFormatInfo
+   */
+  protected $numberFormat;
+  
+  /**
+   * A list of properties that are accessable/writable.
+   * @var array
+   */ 
+  protected $properties = array();
+
+  /**
+   * Culture type, all.
+   * @see getCultures()
+   * @var int
+   */
+  const ALL = 0;
+
+  /**
+   * Culture type, neutral.
+   * @see getCultures()
+   * @var int
+   */ 
+  const NEUTRAL = 1;
+
+  /**
+   * Culture type, specific.
+   *
+   * @see getCultures()
+   * @var int
+   */ 
+  const SPECIFIC = 2;
+
+  /**
+   * Display the culture name.
+   *
+   * @return string the culture name.
+   * @see getName()
+   */
+  public function __toString()
+  {
+    return $this->getName();
+  }
+
+  /**
+   * Allow functions that begins with 'set' to be called directly
+   * as an attribute/property to retrieve the value.
+   *
+   * @return mixed
+   */
+  public function __get($name)
+  {
+    $getProperty = 'get'.$name;
+    if (in_array($getProperty, $this->properties))
+    {
+      return $this->$getProperty();
+    }
+    else
+    {
+      throw new sfException('Property '.$name.' does not exists.');
+    }
+  }
+
+  /**
+   * Allow functions that begins with 'set' to be called directly
+   * as an attribute/property to set the value.
+   */
+  public function __set($name, $value)
+  {
+    $setProperty = 'set'.$name;
+    if (in_array($setProperty, $this->properties))
+    {
+      $this->$setProperty($value);
+    }
+    else
+    {
+      throw new sfException('Property '.$name.' can not be set.');
+    }
+  }
+
+  /**
+   * Initializes a new instance of the sfCultureInfo class based on the 
+   * culture specified by name. E.g. <code>new sfCultureInfo('en_AU');</code>
+   * The culture indentifier must be of the form 
+   * "<language>_(country/region/variant)".
+   *
+   * @param string a culture name, e.g. "en_AU".
+   * @return return new sfCultureInfo.
+   */
+  public function __construct($culture = 'en')
+  {
+    $this->properties = get_class_methods($this);
+
+    if (empty($culture))
+    {
+      $culture = 'en';
+    }
+
+    $this->dataDir = $this->dataDir();
+    $this->dataFileExt = $this->fileExt();
+
+    $this->setCulture($culture);
+
+    $this->loadCultureData('root');
+    $this->loadCultureData($culture);
+  }
+
+  /**
+   * Get the default directory for the ICU data.
+   * The default is the "data" directory for this class.
+   *
+   * @return string directory containing the ICU data.
+   */
+  protected static function dataDir()
+  {
+    return sfConfig::get('sf_symfony_data_dir').'/i18n/';
+  }
+
+  /**
+   * Get the filename extension for ICU data. Default is ".dat".
+   *
+   * @return string filename extension for ICU data.
+   */
+  protected static function fileExt()
+  {
+    return '.dat';
+  }
+
+  /**
+   * Determine if a given culture is valid. Simply checks that the
+   * culture data exists.
+   *
+   * @param string a culture
+   * @return boolean true if valid, false otherwise.
+   */
+  public function validCulture($culture)
+  {
+    if (preg_match('/^[a-z]{2}(_[A-Z]{2,5}){0,2}$/', $culture))
+    {
+      return is_file(self::dataDir().$culture.self::fileExt());
+    }
+
+    return false;
+  }
+
+  /**
+   * Set the culture for the current instance. The culture indentifier
+   * must be of the form "<language>_(country/region)".
+   *
+   * @param string culture identifier, e.g. "fr_FR_EURO".
+   */
+  protected function setCulture($culture)
+  {
+    if (!empty($culture))
+    {
+      if (!preg_match('/^[a-z]{2}(_[A-Z]{2,5}){0,2}$/', $culture))
+      {
+        throw new sfException('Invalid culture supplied: '.$culture);
+      }
+    }
+
+    $this->culture = $culture;
+  }
+
+  /**
+   * Load the ICU culture data for the specific culture identifier.
+   *
+   * @param string the culture identifier.
+   */
+  protected function loadCultureData($culture)
+  {
+    $file_parts = explode('_',$culture);
+    $current_part = $file_parts[0];
+
+    $files = array($current_part);
+
+    for ($i = 1, $max = count($file_parts); $i < $max; $i++)
+    {
+      $current_part .= '_'.$file_parts[$i];
+      $files[] = $current_part;
+    }
+
+    foreach ($files as $file)
+    {
+      $filename = $this->dataDir.$file.$this->dataFileExt;
+
+      if (is_file($filename) == false)
+      {
+        throw new sfException('Data file for "'.$file.'" was not found.');
+      }
+
+      if (in_array($filename, $this->dataFiles) == false)
+      {
+        array_unshift($this->dataFiles, $file);
+
+        $data = &$this->getData($filename);
+        $this->data[$file] = &$data;
+
+        if (isset($data['__ALIAS']))
+        {
+          $this->loadCultureData($data['__ALIAS'][0]);
+        }
+        unset($data);
+      }
+    }
+  }
+
+  /**
+   * Get the data by unserializing the ICU data from disk.
+   * The data files are cached in a static variable inside
+   * this function.
+   *
+   * @param string the ICU data filename
+   * @return array ICU data 
+   */
+  protected function &getData($filename)
+  {
+    static $data  = array();
+    static $files = array();
+
+    if (!isset($files[$filename]))
+    {
+      $data[$filename]  = unserialize(file_get_contents($filename));
+      $files[$filename] = true;
+    }
+
+    return $data[$filename];
+  }
+
+  /**
+   * Find the specific ICU data information from the data.
+   * The path to the specific ICU data is separated with a slash "/".
+   * E.g. To find the default calendar used by the culture, the path
+   * "calendar/default" will return the corresponding default calendar.
+   * Use merge=true to return the ICU including the parent culture.
+   * E.g. The currency data for a variant, say "en_AU" contains one
+   * entry, the currency for AUD, the other currency data are stored
+   * in the "en" data file. Thus to retrieve all the data regarding 
+   * currency for "en_AU", you need to use findInfo("Currencies,true);.
+   *
+   * @param string the data you want to find.
+   * @param boolean merge the data from its parents.
+   * @return mixed the specific ICU data.
+   */
+  protected function findInfo($path = '/', $merge = false)
+  {
+    $result = array();
+    foreach ($this->dataFiles as $section)
+    {
+      $info = $this->searchArray($this->data[$section], $path);
+
+      if ($info)
+      {
+        if ($merge)
+        {
+          $result = array_merge($info, $result);
+        }
+        else
+        {
+          return $info;
+        }
+      }
+    }
+
+    return $result;
+  }
+
+  /**
+   * Search the array for a specific value using a path separated using
+   * slash "/" separated path. e.g to find $info['hello']['world'],
+   * the path "hello/world" will return the corresponding value.
+   *
+   * @param array the array for search
+   * @param string slash "/" separated array path.
+   * @return mixed the value array using the path
+   */
+  protected function searchArray($info, $path = '/')
+  {
+    $index = explode('/', $path);
+
+    $array = $info;
+
+    for ($i = 0, $max = count($index); $i < $max; $i++)
+    {
+      $k = $index[$i];
+      if ($i < $max - 1 && isset($array[$k]))
+      {
+        $array = $array[$k];
+      }
+      else if ($i == $max - 1 && isset($array[$k]))
+      {
+        return $array[$k];
+      }
+    }
+  }
+  
+  /**
+   * Gets the culture name in the format 
+   * "<languagecode2>_(country/regioncode2)".
+   *
+   * @return string culture name.
+   */
+  public function getName()
+  {
+    return $this->culture;
+  }
+
+  /**
+   * Gets the sfDateTimeFormatInfo that defines the culturally appropriate
+   * format of displaying dates and times.
+   *
+   * @return sfDateTimeFormatInfo date time format information for the culture.
+   */
+  public function getDateTimeFormat()
+  {
+    if (is_null($this->dateTimeFormat))
+    {
+      $calendar = $this->getCalendar();
+      $info = $this->findInfo("calendar/{$calendar}", true);
+      $this->setDateTimeFormat(new sfDateTimeFormatInfo($info));
+    }
+
+    return $this->dateTimeFormat;
+  }
+
+  /**
+   * Set the date time format information.
+   *
+   * @param sfDateTimeFormatInfo the new date time format info.
+   */
+  public function setDateTimeFormat($dateTimeFormat)
+  {
+    $this->dateTimeFormat = $dateTimeFormat;
+  }
+
+  /**
+   * Gets the default calendar used by the culture, e.g. "gregorian".
+   *
+   * @return string the default calendar.
+   */
+  public function getCalendar()
+  {
+    $info = $this->findInfo('calendar/default');
+
+    return $info[0];
+  }
+
+  /**
+   * Gets the culture name in the language that the culture is set
+   * to display. Returns <code>array('Language','Country');</code>
+   * 'Country' is omitted if the culture is neutral.
+   *
+   * @return array array with language and country as elements, localized.
+   */
+  public function getNativeName()
+  {
+    $lang = substr($this->culture, 0, 2);
+    $reg = substr($this->culture, 3, 2);
+    $language = $this->findInfo("Languages/{$lang}");
+    $region = $this->findInfo("Countries/{$reg}");
+    if ($region)
+    {
+      return $language[0].' ('.$region[0].')';
+    }
+    else
+    {
+      return $language[0];
+    }
+  }
+
+  /**
+   * Gets the culture name in English.
+   * Returns <code>array('Language','Country');</code>
+   * 'Country' is omitted if the culture is neutral.
+   *
+   * @return array array with language and country as elements.
+   */
+  public function getEnglishName()
+  {
+    $lang = substr($this->culture, 0, 2);
+    $reg = substr($this->culture, 3, 2);
+    $culture = $this->getInvariantCulture();
+
+    $language = $culture->findInfo("Languages/{$lang}");
+    $region = $culture->findInfo("Countries/{$reg}");
+    if ($region)
+    {
+      return $language[0].' ('.$region[0].')';
+    }
+    else
+    {
+      return $language[0];
+    }
+  }
+
+  /**
+   * Gets the sfCultureInfo that is culture-independent (invariant).
+   * Any changes to the invariant culture affects all other
+   * instances of the invariant culture.
+   * The invariant culture is assumed to be "en";
+   *
+   * @return sfCultureInfo invariant culture info is "en".
+   */
+  static function getInvariantCulture()
+  {
+    static $invariant;
+
+    if (is_null($invariant))
+    {
+      $invariant = new sfCultureInfo();
+    }
+
+    return $invariant;
+  }
+
+  /**
+   * Gets a value indicating whether the current sfCultureInfo 
+   * represents a neutral culture. Returns true if the culture
+   * only contains two characters.
+   *
+   * @return boolean true if culture is neutral, false otherwise.
+   */
+  public function getIsNeutralCulture()
+  {
+    return strlen($this->culture) == 2;
+  }
+
+  /**
+   * Gets the sfNumberFormatInfo that defines the culturally appropriate
+   * format of displaying numbers, currency, and percentage.
+   *
+   * @return sfNumberFormatInfo the number format info for current culture.
+   */
+  public function getNumberFormat()
+  {
+    if (is_null($this->numberFormat))
+    {
+      $elements = $this->findInfo('NumberElements');
+      $patterns = $this->findInfo('NumberPatterns');
+      $currencies = $this->getCurrencies();
+      $data = array('NumberElements' => $elements, 'NumberPatterns' => $patterns, 'Currencies' => $currencies);
+
+      $this->setNumberFormat(new sfNumberFormatInfo($data));
+    }
+
+    return $this->numberFormat;
+  }
+
+  /**
+   * Set the number format information.
+   *
+   * @param sfNumberFormatInfo the new number format info.
+   */
+  public function setNumberFormat($numberFormat)
+  {
+    $this->numberFormat = $numberFormat;
+  }
+
+  /**
+   * Gets the sfCultureInfo that represents the parent culture of the 
+   * current sfCultureInfo
+   *
+   * @return sfCultureInfo parent culture information.
+   */
+  public function getParent()
+  {
+    if (strlen($this->culture) == 2)
+    {
+      return $this->getInvariantCulture();
+    }
+
+    return new sfCultureInfo(substr($this->culture, 0, 2));
+  }
+
+  /**
+   * Gets the list of supported cultures filtered by the specified 
+   * culture type. This is an EXPENSIVE function, it needs to traverse
+   * a list of ICU files in the data directory.
+   * This function can be called statically.
+   *
+   * @param int culture type, sfCultureInfo::ALL, sfCultureInfo::NEUTRAL
+   * or sfCultureInfo::SPECIFIC.
+   * @return array list of culture information available. 
+   */
+  static function getCultures($type = sfCultureInfo::ALL)
+  {
+    $dataDir = sfCultureInfo::dataDir();
+    $dataExt = sfCultureInfo::fileExt();
+    $dir = dir($dataDir);
+
+    $neutral = array();
+    $specific = array();
+
+    while (false !== ($entry = $dir->read()))
+    {
+      if (is_file($dataDir.$entry) && substr($entry, -4) == $dataExt && $entry != 'root'.$dataExt)
+      {
+        $culture = substr($entry, 0, -4);
+        if (strlen($culture) == 2)
+        {
+          $neutral[] = $culture;
+        }
+        else
+        {
+          $specific[] = $culture;
+        }
+      }
+    }
+    $dir->close();
+
+    switch ($type)
+    {
+      case sfCultureInfo::ALL:
+        $all =  array_merge($neutral, $specific);
+        sort($all);
+        return $all;
+        break;
+      case sfCultureInfo::NEUTRAL:
+        return $neutral;
+        break;
+      case sfCultureInfo::SPECIFIC:
+        return $specific;
+        break;
+    }
+  }
+
+  /**
+   * Simplify a single element array into its own value.
+   * E.g. <code>array(0 => array('hello'), 1 => 'world');</code>
+   * becomes <code>array(0 => 'hello', 1 => 'world');</code>
+   *
+   * @param array with single elements arrays
+   * @return array simplified array.
+   */
+  protected function simplify($array)
+  {
+    for ($i = 0, $max = count($array); $i < $max; $i++)
+    {
+      $key = key($array);
+      if (is_array($array[$key]) && count($array[$key]) == 1)
+      {
+        $array[$key] = $array[$key][0];
+      }
+      next($array);
+    }
+
+    return $array;
+  }
+
+  /**
+   * Get a list of countries in the language of the localized version.
+   *
+   * @return array a list of localized country names. 
+   */
+  public function getCountries()
+  {
+    return $this->simplify($this->findInfo('Countries', true));
+  }
+
+  /**
+   * Get a list of currencies in the language of the localized version.
+   *
+   * @return array a list of localized currencies.
+   */
+  public function getCurrencies()
+  {
+    return $this->findInfo('Currencies', true);
+  }
+
+  /**
+   * Get a list of languages in the language of the localized version.
+   *
+   * @return array list of localized language names.
+   */
+  public function getLanguages()
+  {
+    return $this->simplify($this->findInfo('Languages', true));
+  }
+
+  /**
+   * Get a list of scripts in the language of the localized version.
+   *
+   * @return array list of localized script names.
+   */
+  public function getScripts()
+  {
+    return $this->simplify($this->findInfo('Scripts', true));
+  }
+
+  /**
+   * Get a list of timezones in the language of the localized version.
+   *
+   * @return array list of localized timezones.
+   */
+  public function getTimeZones()
+  {
+    return $this->simplify($this->findInfo('zoneStrings', true));
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfCultureInfo.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfDateFormat.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfDateFormat.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfDateFormat.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,798 @@
+<?php
+/**
+ * sfDateFormat class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: sfDateFormat.class.php 3409 2007-02-06 08:08:40Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+
+/**
+ * Get the encoding utilities
+ */
+require_once(dirname(__FILE__).'/util.php');
+
+/**
+ * sfDateFormat class.
+ * 
+ * The sfDateFormat class allows you to format dates and times with 
+ * predefined styles in a locale-sensitive manner. Formatting times 
+ * with the sfDateFormat class is similar to formatting dates.
+ *
+ * Formatting dates with the sfDateFormat class is a two-step process. 
+ * First, you create a formatter with the getDateInstance method. 
+ * Second, you invoke the format method, which returns a string containing 
+ * the formatted date. 
+ *
+ * DateTime values are formatted using standard or custom patterns stored 
+ * in the properties of a DateTimeFormatInfo.
+ *
+ * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version v1.0, last update on Sat Dec 04 14:10:49 EST 2004
+ * @package System.I18N.core
+ */
+class sfDateFormat
+{
+  /**
+   * A list of tokens and their function call.
+   * @var array 
+   */
+  protected $tokens = array(
+    'G'=>'Era',
+    'y'=>'year',
+    'M'=>'mon',
+    'd'=>'mday',
+    'h'=>'Hour12',
+    'H'=>'hours',
+    'm'=>'minutes',
+    's'=>'seconds',
+    'E'=>'wday',
+    'D'=>'yday',
+    'F'=>'DayInMonth',
+    'w'=>'WeekInYear',
+    'W'=>'WeekInMonth',
+    'a'=>'AMPM',
+    'k'=>'HourInDay',
+    'K'=>'HourInAMPM',
+    'z'=>'TimeZone'
+  );
+
+  /**
+   * A list of methods, to be used by the token function calls.
+   * @var array 
+   */
+  protected $methods = array();
+
+  /**
+   * The sfDateTimeFormatInfo, containing culture specific patterns and names.
+   * @var sfDateTimeFormatInfo   
+   */
+  protected $formatInfo;
+
+  /**
+   * Initialize a new sfDateFormat.
+   *
+   * @param mixed either, null, a sfCultureInfo instance, a DateTimeFormatInfo instance, or a locale.
+   * @return sfDateFormat instance
+   */
+  function __construct($formatInfo = null)
+  {
+    if (is_null($formatInfo))
+    {
+      $this->formatInfo = sfDateTimeFormatInfo::getInvariantInfo();
+    }
+    else if ($formatInfo instanceof sfCultureInfo)
+    {
+      $this->formatInfo = $formatInfo->DateTimeFormat;
+    }
+    else if ($formatInfo instanceof sfDateTimeFormatInfo)
+    {
+      $this->formatInfo = $formatInfo;
+    }
+    else
+    {
+      $this->formatInfo = sfDateTimeFormatInfo::getInstance($formatInfo);
+    }
+
+    $this->methods = get_class_methods($this);
+  }
+
+  /**
+   * Guesses a date without calling strtotime.
+   *
+   * @author Olivier Verdier <Olivier.Verdier en gmail.com>
+   * @param mixed the time as integer or string in strtotime format.
+   * @param string the input pattern; default is sql date or timestamp
+   * @return array same array as the getdate function
+   */
+  public function getDate($time, $pattern = null)
+  {
+    if (is_null($time))
+    {
+      return null;
+    }
+
+    // if the type is not a php timestamp
+    $isString = (string) $time !== (string) (int) $time;
+
+    if ($isString)
+    {
+      if (!$pattern)
+      {
+        if (strlen($time) == 10)
+        {
+          $pattern = 'i';
+        }
+        else   // otherwise, default:
+        {
+          $pattern = 'I';
+        }
+      }
+
+      $pattern = $this->getPattern($pattern);
+      $tokens = $this->getTokens($pattern);
+      $pregPattern = '';
+      $matchNames = array();
+      foreach ($tokens as $token)
+      {
+        if ($matchName = $this->getFunctionName($token))
+        {
+          $pregPattern .= '(\d+)';
+          $matchNames[] = $matchName;
+        }
+        else
+        {
+          $pregPattern .= '[^\d]+';
+        }
+      }
+      preg_match('@'.$pregPattern.'@', $time, $matches);
+
+      array_shift($matches);
+
+      if (count($matchNames) == count($matches))
+      {
+        $date = array_combine($matchNames, $matches);
+        // guess the date if input with two digits
+        if (strlen($date['year']) == 2)
+        {
+          $date['year'] = date('Y', mktime(0, 0, 0, 1, 1, $date['year']));
+        }
+        $date = array_map('intval', $date);
+      }
+    }
+
+    // the last attempt has failed we fall back on the default method
+    if (!isset($date))
+    {
+      if ($isString)
+      {
+        $numericalTime = @strtotime($time);
+        if ($numericalTime === false)
+        {
+          throw new sfException(sprintf('Impossible to parse date "%s" with format "%s"', $time, $pattern));
+        }
+      }
+      else
+      {
+        $numericalTime = $time;
+      }
+      $date = @getdate($numericalTime);
+    }
+
+    // we set default values for the time
+    foreach (array('hours', 'minutes', 'seconds') as $timeDiv)
+    {
+      if (!isset($date[$timeDiv]))
+      {
+        $date[$timeDiv] = 0;
+      }
+    }
+
+    return $date;
+  }
+
+  /**
+   * Format a date according to the pattern.
+   *
+   * @param mixed the time as integer or string in strtotime format.
+   * @return string formatted date time. 
+   */
+  public function format($time, $pattern = 'F', $inputPattern = null, $charset = 'UTF-8')
+  {
+    $date = $this->getDate($time, $inputPattern);
+
+    if (is_null($pattern))
+    {
+      $pattern = 'F';
+    }
+
+    $pattern = $this->getPattern($pattern);
+    $tokens = $this->getTokens($pattern);
+
+    for ($i = 0, $max = count($tokens); $i < $max; $i++)
+    {
+      $pattern = $tokens[$i];
+      if ($pattern{0} == "'" && $pattern{strlen($pattern) - 1} == "'")
+      {
+        $tokens[$i] = str_replace('``````', '\'', preg_replace('/(^\')|(\'$)/', '', $pattern));
+      }
+      else if ($pattern == '``````')
+      {
+        $tokens[$i] = '\'';
+      }
+      else
+      {
+        $function = ucfirst($this->getFunctionName($pattern));
+        if ($function != null)
+        {
+          $fName = 'get'.$function;
+          if (in_array($fName, $this->methods))
+          {
+            $tokens[$i] = $this->$fName($date, $pattern);
+          }
+          else
+          {
+            throw new sfException('function '.$function.' not found.');
+          }
+        }
+      }
+    }
+
+    return I18N_toEncoding(implode('', $tokens), $charset);
+  }
+
+  /**
+   * For a particular token, get the corresponding function to call.
+   *
+   * @param string token
+   * @return mixed the function if good token, null otherwise.
+   */
+  protected function getFunctionName($token)
+  {
+    if (isset($this->tokens[$token{0}]))
+    {
+      return $this->tokens[$token{0}];
+    }
+  }
+
+  /**
+   * Get the pattern from DateTimeFormatInfo or some predefined patterns.
+   * If the $pattern parameter is an array of 2 element, it will assume
+   * that the first element is the date, and second the time
+   * and try to find an appropriate pattern and apply 
+   * DateTimeFormatInfo::formatDateTime
+   * See the tutorial documentation for futher details on the patterns.
+   *
+   * @param mixed a pattern.
+   * @return string a pattern.
+   * @see DateTimeFormatInfo::formatDateTime()
+   */
+  public function getPattern($pattern)
+  {
+    if (is_array($pattern) && count($pattern) == 2)
+    {
+      return $this->formatInfo->formatDateTime($this->getPattern($pattern[0]), $this->getPattern($pattern[1]));
+    }
+
+    switch ($pattern)
+    {
+      case 'd':
+        return $this->formatInfo->ShortDatePattern;
+        break;
+      case 'D':
+        return $this->formatInfo->LongDatePattern;
+        break;
+      case 'p':
+        return $this->formatInfo->MediumDatePattern;
+        break;
+      case 'P':
+        return $this->formatInfo->FullDatePattern;
+        break;        
+      case 't':
+        return $this->formatInfo->ShortTimePattern;
+        break;
+      case 'T':
+        return $this->formatInfo->LongTimePattern;
+        break;
+      case 'q':
+        return $this->formatInfo->MediumTimePattern;
+        break;
+      case 'Q':
+        return $this->formatInfo->FullTimePattern;
+        break;
+      case 'f':
+        return $this->formatInfo->formatDateTime($this->formatInfo->LongDatePattern, $this->formatInfo->ShortTimePattern);
+        break;
+      case 'F':
+        return $this->formatInfo->formatDateTime($this->formatInfo->LongDatePattern, $this->formatInfo->LongTimePattern);
+        break;
+      case 'g':
+        return $this->formatInfo->formatDateTime($this->formatInfo->ShortDatePattern, $this->formatInfo->ShortTimePattern);
+        break;
+      case 'G':
+        return $this->formatInfo->formatDateTime($this->formatInfo->ShortDatePattern, $this->formatInfo->LongTimePattern);
+        break;
+      case 'i':
+        return 'yyyy-MM-dd';
+        break;
+      case 'I':
+        return 'yyyy-MM-dd HH:mm:ss';
+        break;
+      case 'M':
+      case 'm':
+        return 'MMMM dd';
+        break;
+      case 'R':
+      case 'r':
+        return 'EEE, dd MMM yyyy HH:mm:ss';
+        break;
+      case 's':
+        return 'yyyy-MM-ddTHH:mm:ss';
+        break;
+      case 'u':
+        return 'yyyy-MM-dd HH:mm:ss z';
+        break;
+      case 'U':
+        return 'EEEE dd MMMM yyyy HH:mm:ss';
+        break;
+      case 'Y':
+      case 'y':
+        return 'yyyy MMMM';
+        break;
+      default :
+        return $pattern;
+    }
+  }
+
+  /**
+   * Returns an easy to parse input pattern
+   * yy is replaced by yyyy and h by H
+   *
+   * @param string pattern.
+   * @return string input pattern
+   */
+  public function getInputPattern($pattern)
+  {
+    $pattern = $this->getPattern($pattern);
+    
+    $pattern = strtr($pattern, array('yyyy' => 'Y', 'h'=>'H', 'z'=>'', 'a'=>''));
+    $pattern = strtr($pattern, array('yy'=>'yyyy', 'Y'=>'yyyy'));
+    
+    return trim($pattern);
+  }
+
+  /**
+   * Tokenize the pattern. The tokens are delimited by group of
+   * similar characters, e.g. 'aabb' will form 2 tokens of 'aa' and 'bb'.
+   * Any substrings, starting and ending with a single quote (') 
+   * will be treated as a single token.
+   *
+   * @param string pattern.
+   * @return array string tokens in an array.
+   */
+  protected function getTokens($pattern)
+  {
+    $char = null;
+    $tokens = array();
+    $token = null;
+
+    $text = false;
+
+    for ($i = 0, $max = strlen($pattern); $i < $max; $i++)
+    {
+      if ($char == null || $pattern{$i} == $char || $text)
+      {
+        $token .= $pattern{$i};
+      }
+      else
+      {
+        $tokens[] = str_replace("''", "'", $token);
+        $token = $pattern{$i};
+      }
+
+      if ($pattern{$i} == "'" && $text == false)
+      {
+        $text = true;
+      }
+      else if ($text && $pattern{$i} == "'" && $char == "'")
+      {
+        $text = true;
+      }
+      else if ($text && $char != "'" && $pattern{$i} == "'")
+      {
+        $text = false;
+      }
+
+      $char = $pattern{$i};
+
+    }
+    $tokens[] = $token;
+
+    return $tokens;
+  }
+  
+  // makes a unix date from our incomplete $date array
+  protected function getUnixDate($date)
+  {
+    return getdate(mktime($date['hours'], $date['minutes'], $date['seconds'], $date['mon'], $date['mday'], $date['year']));
+  }
+
+  /**
+   * Get the year.
+   * "yy" will return the last two digits of year.
+   * "yyyy" will return the full integer year.
+   *
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return string year
+   */
+  protected function getYear($date, $pattern = 'yyyy')
+  {
+    $year = $date['year'];
+    switch ($pattern)
+    {
+      case 'yy':
+        return substr($year, 2);
+      case 'yyyy':
+        return $year;
+      default: 
+        throw new sfException('The pattern for year is either "yy" or "yyyy".');
+    }
+  }
+
+  /**
+   * Get the month.
+   * "M" will return integer 1 through 12
+   * "MM" will return the narrow month name, e.g. "J"
+   * "MMM" will return the abrreviated month name, e.g. "Jan"
+   * "MMMM" will return the month name, e.g. "January"
+   *
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return string month name
+   */
+  protected function getMon($date, $pattern = 'M')
+  {
+    $month = $date['mon'];
+
+    switch ($pattern)
+    {
+      case 'M':
+        return $month;
+      case 'MM':
+        return str_pad($month, 2, '0', STR_PAD_LEFT);
+      case 'MMM':
+        return $this->formatInfo->AbbreviatedMonthNames[$month - 1];
+        break;
+      case 'MMMM':
+        return $this->formatInfo->MonthNames[$month - 1];
+      default:
+        throw new sfException('The pattern for month is "M", "MM", "MMM", or "MMMM".');
+    }
+  }
+
+  /**
+   * Get the day of the week.
+   * "E" will return integer 0 (for Sunday) through 6 (for Saturday).
+   * "EE" will return the narrow day of the week, e.g. "M"
+   * "EEE" will return the abrreviated day of the week, e.g. "Mon"
+   * "EEEE" will return the day of the week, e.g. "Monday"
+   *
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return string day of the week.
+   */
+  protected function getWday($date, $pattern = 'EEEE')
+  {
+    // if the $date comes from our home-made get date
+    if (!isset($date['wday']))
+    {
+      $date = $this->getUnixDate($date);
+    }
+    $day = $date['wday'];
+
+    switch ($pattern)
+    {
+      case 'E':
+        return $day;
+        break;
+      case 'EE':
+        return $this->formatInfo->NarrowDayNames[$day];
+      case 'EEE':
+        return $this->formatInfo->AbbreviatedDayNames[$day];
+        break;
+      case 'EEEE':
+        return $this->formatInfo->DayNames[$day];
+        break;
+      default:
+        throw new sfException('The pattern for day of the week is "E", "EE", "EEE", or "EEEE".');
+    }
+  }
+
+  /**
+   * Get the day of the month.
+   * "d" for non-padding, "dd" will always return 2 characters.
+   *
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return string day of the month
+   */
+  protected function getMday($date, $pattern = 'd')
+  {
+    $day = $date['mday'];
+
+    switch ($pattern)
+    {
+      case 'd':
+        return $day;
+      case 'dd':
+        return str_pad($day, 2, '0', STR_PAD_LEFT);
+      case 'dddd':
+        return $this->getWday($date);
+      default:
+        throw new sfException('The pattern for day of the month is "d", "dd" or "dddd".');
+    }
+  }
+
+  /**
+   * Get the era. i.e. in gregorian, year > 0 is AD, else BC.
+   *
+   * @todo How to support multiple Eras?, e.g. Japanese.
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return string era
+   */
+  protected function getEra($date, $pattern = 'G')
+  {
+    if ($pattern != 'G')
+    {
+      throw new sfException('The pattern for era is "G".');
+    }
+
+    return $this->formatInfo->getEra($date['year'] > 0 ? 1 : 0);
+  }
+
+  /**
+   * Get the hours in 24 hour format, i.e. [0-23]. 
+   * "H" for non-padding, "HH" will always return 2 characters.
+   *
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return string hours in 24 hour format.
+   */
+  protected function getHours($date, $pattern = 'H')
+  {
+    $hour = $date['hours'];
+
+    switch ($pattern)
+    {
+      case 'H':
+        return $hour;
+      case 'HH':
+        return str_pad($hour, 2, '0', STR_PAD_LEFT);
+      default:
+        throw new sfException('The pattern for 24 hour format is "H" or "HH".');
+    }
+  }
+
+  /**
+   * Get the AM/PM designator, 12 noon is PM, 12 midnight is AM.
+   *
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return string AM or PM designator
+   */
+  protected function getAMPM($date, $pattern = 'a')
+  {
+    if ($pattern != 'a')
+    {
+      throw new sfException('The pattern for AM/PM marker is "a".');
+    }
+
+    return $this->formatInfo->AMPMMarkers[intval($date['hours'] / 12)];
+  }
+
+  /**
+   * Get the hours in 12 hour format. 
+   * "h" for non-padding, "hh" will always return 2 characters.
+   *
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return string hours in 12 hour format.
+   */
+  protected function getHour12($date, $pattern = 'h')
+  {
+    $hour = $date['hours'];
+    $hour = ($hour == 12 | $hour == 0) ? 12 : ($hour) % 12;
+
+    switch ($pattern)
+    {
+      case 'h':
+        return $hour;
+      case 'hh':
+        return str_pad($hour, 2, '0', STR_PAD_LEFT);
+      default:
+        throw new sfException('The pattern for 24 hour format is "H" or "HH".');
+    }
+  }
+
+  /**
+   * Get the minutes.
+   * "m" for non-padding, "mm" will always return 2 characters.
+   *
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return string minutes.
+   */
+  protected function getMinutes($date, $pattern = 'm')
+  {
+    $minutes = $date['minutes'];
+
+    switch ($pattern)
+    {
+      case 'm':
+        return $minutes;
+      case 'mm':
+        return str_pad($minutes, 2, '0', STR_PAD_LEFT);
+      default:
+        throw new sfException('The pattern for minutes is "m" or "mm".');
+    }
+  }
+
+  /**
+   * Get the seconds.
+   * "s" for non-padding, "ss" will always return 2 characters.
+   *
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return string seconds
+   */
+  protected function getSeconds($date, $pattern = 's')
+  {
+    $seconds = $date['seconds'];
+
+    switch ($pattern)
+    {
+      case 's':
+        return $seconds;
+      case 'ss':
+        return str_pad($seconds, 2, '0', STR_PAD_LEFT);
+      default:
+        throw new sfException('The pattern for seconds is "s" or "ss".');
+    }
+  }
+
+  /**
+   * Get the timezone from the server machine.
+   *
+   * @todo How to get the timezone for a different region?
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return string time zone 
+   */
+  protected function getTimeZone($date, $pattern = 'z')
+  {
+    if ($pattern != 'z')
+    {
+      throw new sfException('The pattern for time zone is "z".');
+    }
+
+    return @date('T', @mktime($date['hours'], $date['minutes'], $date['seconds'], $date['mon'], $date['mday'], $date['year']));
+  }
+
+  /**
+   * Get the day in the year, e.g. [1-366]
+   *
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return int hours in AM/PM format.
+   */
+  protected function getYday($date, $pattern = 'D')
+  {
+    if ($pattern != 'D')
+    {
+      throw new sfException('The pattern for day in year is "D".');
+    }
+
+    return $date['yday'];
+  }
+
+  /**
+   * Get day in the month.
+   *
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return int day in month
+   */
+  protected function getDayInMonth($date, $pattern = 'FF')
+  {
+    switch ($pattern)
+    {
+      case 'F':
+        return @date('j', @mktime(0, 0, 0, $date['mon'], $date['mday'], $date['year']));
+        break;
+      case 'FF':
+        return @date('d', @mktime(0, 0, 0, $date['mon'], $date['mday'], $date['year']));
+        break;
+      default:
+        throw new sfException('The pattern for day in month is "F" or "FF".');
+    }
+  }
+
+  /**
+   * Get the week in the year.
+   *
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return int week in year
+   */
+  protected function getWeekInYear($date, $pattern = 'w')
+  {
+    if ($pattern != 'w')
+    {
+      throw new sfException('The pattern for week in year is "w".');
+    }
+
+    return @date('W', @mktime(0, 0, 0, $date['mon'], $date['mday'], $date['year']));
+  }
+
+  /**
+   * Get week in the month.
+   *
+   * @param array getdate format.
+   * @return int week in month
+   */
+  protected function getWeekInMonth($date, $pattern = 'W')
+  {
+    if ($pattern != 'W')
+    {
+      throw new sfException('The pattern for week in month is "W".');
+    }
+
+    return @date('W', @mktime(0, 0, 0, $date['mon'], $date['mday'], $date['year'])) - date('W', mktime(0, 0, 0, $date['mon'], 1, $date['year']));
+  }
+
+  /**
+   * Get the hours [1-24].
+   *
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return int hours [1-24]
+   */
+  protected function getHourInDay($date, $pattern = 'k')
+  {
+    if ($pattern != 'k')
+    {
+      throw new sfException('The pattern for hour in day is "k".');
+    }
+
+    return $date['hours'] + 1;
+  }
+
+  /**
+   * Get the hours in AM/PM format, e.g [1-12]
+   *
+   * @param array getdate format.
+   * @param string a pattern.
+   * @return int hours in AM/PM format.
+   */
+  protected function getHourInAMPM($date, $pattern = 'K')
+  {
+    if ($pattern != 'K')
+    {
+      throw new sfException('The pattern for hour in AM/PM is "K".');
+    }
+
+    return ($date['hours'] + 1) % 12;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfDateFormat.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfDateTimeFormatInfo.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfDateTimeFormatInfo.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfDateTimeFormatInfo.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,548 @@
+<?php
+
+/**
+ * sfDateTimeFormatInfo class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: sfDateTimeFormatInfo.class.php 2834 2006-11-27 14:09:05Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+
+/**
+ * Defines how DateTime values are formatted and displayed, depending 
+ * on the culture.
+ * 
+ * This class contains information, such as date patterns, time patterns, 
+ * and AM/PM designators. 
+ *
+ * To create a sfDateTimeFormatInfo for a specific culture, create a 
+ * sfCultureInfo for that culture and retrieve the sfCultureInfo.sfDateTimeFormat 
+ * property. For example:
+ * <code>
+ * $culture = new sfCultureInfo('en_AU');
+ * $dtfi = $culture->DateTimeFormat;
+ * </code>
+ * 
+ * To create a sfDateTimeFormatInfo for the invariant culture, use 
+ * <code>
+ * sfDateTimeFormatInfo::getInstance($culture=null);
+ * </code>
+ * you may pass a sfCultureInfo parameter $culture to get the sfDateTimeFormatInfo
+ * for a specific culture.
+ *
+ * sfDateTime values are formatted using standard or custom patterns stored in 
+ * the properties of a sfDateTimeFormatInfo.
+ * 
+ * The standard patterns can be replaced with custom patterns by setting the 
+ * associated properties of sfDateTimeFormatInfo.
+ *
+ * The following table lists the standard format characters for each standard 
+ * pattern and the associated sfDateTimeFormatInfo property that can be set to 
+ * modify the standard pattern. The format characters are case-sensitive;
+ * for example, 'g' and 'G' represent slightly different patterns.
+ *
+ * <code>
+ *  Format Character    Associated Property     Example Format Pattern (en-US)
+ *  --------------------------------------------------------------------------
+ *  d                   ShortDatePattern        MM/dd/yyyy 
+ *  D                   LongDatePattern         dddd, dd MMMM yyyy 
+ *  F                   FullDateTimePattern     dddd, dd MMMM yyyy HH:mm:ss
+ *  m, M                MonthDayPattern         MMMM dd 
+ *  r, R                RFC1123Pattern          ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
+ *  s                   SortableDateTimePattern yyyy'-'MM'-'dd'T'HH':'mm':'ss 
+ *  t                   ShortTimePattern        HH:mm 
+ *  T                   LongTimePattern         HH:mm:ss 
+ *  Y                   YearMonthPattern        yyyy MMMM 
+ *  --------------------------------------------------------------------------
+ * </code>
+ *
+ * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version v1.0, last update on Fri Dec 03 22:30:31 EST 2004
+ * @package System.I18N.core
+ */
+class sfDateTimeFormatInfo
+{
+  /**
+   * ICU date time formatting data.
+   * @var array 
+   */
+  protected $data = array();
+
+  /**
+   * A list of properties that are accessable/writable.
+   * @var array 
+   */
+  protected $properties = array();
+
+  /**
+   * Allow functions that begins with 'set' to be called directly
+   * as an attribute/property to retrieve the value.
+   *
+   * @return mixed
+   */
+  function __get($name)
+  {
+    $getProperty = 'get'.$name;
+    if (in_array($getProperty, $this->properties))
+    {
+      return $this->$getProperty();
+    }
+    else
+    {
+      throw new sfException('Property '.$name.' does not exists.');
+    }
+  }
+
+  /**
+   * Allow functions that begins with 'set' to be called directly
+   * as an attribute/property to set the value.
+   */
+  function __set($name, $value)
+  {
+    $setProperty = 'set'.$name;
+    if (in_array($setProperty, $this->properties))
+    {
+      $this->$setProperty($value);
+    }
+    else
+    {
+      throw new sfException('Property '.$name.' can not be set.');
+    }
+  }
+
+  /**
+   * Initializes a new writable instance of the sfDateTimeFormatInfo class 
+   * that is dependent on the ICU data for date time formatting 
+   * information. <b>N.B.</b>You should not initialize this class directly
+   * unless you know what you are doing. Please use use 
+   * sfDateTimeFormatInfo::getInstance() to create an instance.
+   *
+   * @param array ICU data for date time formatting.
+   * @see getInstance()
+   */
+  function __construct($data=array())
+  {
+    $this->properties = get_class_methods($this);
+
+    if (empty($data))
+    {
+      throw new sfException('Please provide the ICU data to initialize.');
+    }
+
+    $this->data = $data;
+  }
+
+  /**
+   * Get the internal ICU data for date time formatting.
+   *
+   * @return array ICU date time formatting data.
+   */
+  protected function getData()
+  {
+    return $this->data;
+  }
+
+  /**
+   * Gets the default sfDateTimeFormatInfo that is culture-independent (invariant).
+   *
+   * @return sfDateTimeFormatInfo default sfDateTimeFormatInfo. 
+   */
+  static function getInvariantInfo()
+  {
+    static $invariant;
+    if (is_null($invariant))
+    {
+      $culture = sfCultureInfo::getInvariantCulture();
+      $invariant = $culture->DateTimeFormat;
+    }
+
+    return $invariant;
+  }
+
+  /**
+   * Returns the sfDateTimeFormatInfo associated with the specified culture.
+   *
+   * @param sfCultureInfo the culture that gets the sfDateTimeFormat property.
+   * @return sfDateTimeFormatInfo sfDateTimeFormatInfo for the specified
+   * culture.
+   */
+  static function getInstance($culture = null)
+  {
+    if ($culture instanceof sfCultureInfo)
+    {
+      return $culture->DateTimeFormat;
+    }
+    else if (is_string($culture))
+    {
+      $cultureInfo = new sfCultureInfo($culture);
+
+      return $cultureInfo->DateTimeFormat;
+    }
+    else
+    {
+      $cultureInfo = sfCultureInfo::getInvariantCulture();
+
+      return $cultureInfo->DateTimeFormat;
+    }
+  }
+
+  /**
+   * A one-dimensional array of type String containing
+   * the culture-specific abbreviated names of the days
+   * of the week. The array for InvariantInfo contains
+   * "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", and "Sat".
+   *
+   * @return array abbreviated day names
+   */
+  function getAbbreviatedDayNames()
+  {
+    return $this->data['dayNames']['format']['abbreviated'];
+  }
+
+  /**
+   * Set the abbreviated day names. The value should be
+   * an array of string starting with Sunday and ends in Saturady.
+   * For example,
+   * <code>array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");</code>
+   *
+   * @param array abbreviated day names.
+   */
+  function setAbbreviatedDayNames($value)
+  {
+    $this->data['dayNames']['format']['abbreviated'] = $value;
+  }
+
+  /**
+   * A one-dimensional array of type String containing
+   * the culture-specific narrow names of the days
+   * of the week. The array for InvariantInfo contains
+   * "S", "M", "T", "W", "T", "F", and "S".
+   *
+   * @return array narrow day names
+   */
+  function getNarrowDayNames()
+  {
+    return $this->data['dayNames']['format']['narrow'];
+  }
+
+  /**
+   * Set the narrow day names. The value should be
+   * an array of string starting with Sunday and ends in Saturady.
+   * For example,
+   * <code>array("S", "M", "T", "W", "T", "F", "S");</code>
+   *
+   * @param array narrow day names.
+   */
+  function setNarrowDayNames($value)
+  {
+    $this->data['dayNames']['format']['narrow'] = $value;
+  }
+
+  /**
+   * A one-dimensional array of type String containing the
+   * culture-specific full names of the days of the week.
+   * The array for InvariantInfo contains "Sunday", "Monday",
+   * "Tuesday", "Wednesday", "Thursday", "Friday", and "Saturday".
+   *
+   * @return array day names
+   */
+  function getDayNames()
+  {
+    return $this->data['dayNames']['format']['wide'];
+  }
+
+  /**
+   * Set the day names. The value should be
+   * an array of string starting with Sunday and ends in Saturady.
+   * For example,
+   * <code>array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
+   * "Friday", "Saturday".);</code>
+   *
+   * @param array day names.
+   */
+  function setDayNames($value)
+  {
+    $this->data['dayNames']['format']['wide'] = $value;
+  }
+
+  /**
+   * A one-dimensional array of type String containing the
+   * culture-specific narrow names of the months. The array
+   * for InvariantInfo contains "J", "F", "M", "A", "M", "J",
+   * "J", "A", "S", "O", "N", and "D".
+   *
+   * @return array narrow month names.
+   */
+  function getNarrowMonthNames()
+  {
+    return $this->data['monthNames']['format']['narrow'];
+  }
+
+  /**
+   * Set the narrow month names. The value should be
+   * an array of string starting with J and ends in D.
+   * For example,
+   * <code>array("J","F","M","A","M","J","J","A","S","O","N","D");</code>
+   *
+   * @param array month names.
+   */
+  function setNarrowMonthNames($value)
+  {
+    $this->data['monthNames']['format']['narrow'] = $value;
+  }
+
+  /**
+   * A one-dimensional array of type String containing the 
+   * culture-specific abbreviated names of the months. The array 
+   * for InvariantInfo contains "Jan", "Feb", "Mar", "Apr", "May", 
+   * "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", and "Dec".
+   *
+   * @return array abbreviated month names.
+   */
+  function getAbbreviatedMonthNames()
+  {
+    return $this->data['monthNames']['format']['abbreviated'];
+  }
+
+  /**
+   * Set the abbreviated month names. The value should be
+   * an array of string starting with Jan and ends in Dec.
+   * For example,
+   * <code>array("Jan", "Feb", "Mar", "Apr", "May", "Jun",
+   * "Jul", "Aug", "Sep","Oct","Nov","Dec");</code>
+   *
+   * @param array month names.
+   */
+  function setAbbreviatedMonthNames($value)
+  {
+    $this->data['monthNames']['format']['abbreviated'] = $value;
+  }
+
+  /**
+   * A one-dimensional array of type String containing the 
+   * culture-specific full names of the months. The array for 
+   * InvariantInfo contains "January", "February", "March", "April",
+   * "May", "June", "July", "August", "September", "October", "November",
+   * and "December"
+   *
+   * @return array month names.
+   */
+  function getMonthNames()
+  {
+    return $this->data['monthNames']['format']['wide'];
+  }
+
+  /**
+   * Set the month names. The value should be
+   * an array of string starting with Janurary and ends in December.
+   * For example,
+   * <code>array("January", "February", "March", "April", "May", "June",
+   * "July", "August", "September","October","November","December");</code>
+   *
+   * @param array month names.
+   */
+  function setMonthNames($value)
+  {
+    $this->data['monthNames']['format']['wide'] = $value;
+  }
+
+  /**
+   * A string containing the name of the era.
+   *
+   * @param int era The integer representing the era. 
+   * @return string the era name.
+   */
+  function getEra($era)
+  {
+    return $this->data['eras']['abbreviated'][$era];
+  }
+
+  /**
+   * The string designator for hours that are "ante meridiem" (before noon).
+   * The default for InvariantInfo is "AM".
+   *
+   * @return string AM designator.
+   */
+  function getAMDesignator()
+  {
+    $result = $this->getAMPMMarkers();
+
+    return $result[0];
+  }
+
+  /**
+   * Set the AM Designator. For example, 'AM'.
+   *
+   * @param string AM designator.
+   */
+  function setAMDesignator($value)
+  {
+    $markers = $this->getAMPMMarkers();
+    $markers[0] = $value;
+    $this->setAMPMMarkers($markers);
+  }
+
+  /**
+   * The string designator for hours that are "post meridiem" (after noon).
+   * The default for InvariantInfo is "PM".
+   *
+   * @return string PM designator.
+   */
+  function getPMDesignator()
+  {
+    $result = $this->getAMPMMarkers();
+
+    return $result[1];
+  }
+
+  /**
+   * Set the PM Designator. For example, 'PM'.
+   *
+   * @param string PM designator.
+   */
+  function setPMDesignator($value)
+  {
+    $markers = $this->getAMPMMarkers();
+    $markers[1] = $value;
+    $this->setAMPMMarkers($markers);
+  }
+
+  /**
+   * Get the AM and PM markers array.
+   * Default InvariantInfo for AM and PM is <code>array('AM','PM');</code>
+   *
+   * @return array AM and PM markers
+   */
+  function getAMPMMarkers()
+  {
+    return $this->data['AmPmMarkers'];
+  }
+
+  /**
+   * Set the AM and PM markers array.
+   * For example <code>array('AM','PM');</code>
+   *
+   * @param array AM and PM markers
+   */
+  function setAMPMMarkers($value)
+  {
+    $this->data['AmPmMarkers'] = $value;
+  }
+
+  /**
+   * Returns the full time pattern "HH:mm:ss z" (default).
+   * This is culture sensitive.
+   *
+   * @return string pattern "HH:mm:ss z".
+   */
+  function getFullTimePattern()
+  {
+    return $this->data['DateTimePatterns'][0];
+  }
+
+  /**
+   * Returns the long time pattern "HH:mm:ss z" (default).
+   * This is culture sensitive.
+   *
+   * @return string pattern "HH:mm:ss z".
+   */
+  function getLongTimePattern()
+  {
+    return $this->data['DateTimePatterns'][1];
+  }
+
+  /**
+   * Returns the medium time pattern "HH:mm:ss" (default).
+   * This is culture sensitive.
+   *
+   * @return string pattern "HH:mm:ss".
+   */
+  function getMediumTimePattern()
+  {
+    return $this->data['DateTimePatterns'][2];
+  }
+
+  /**
+   * Returns the short time pattern "HH:mm" (default).
+   * This is culture sensitive.
+   *
+   * @return string pattern "HH:mm".
+   */
+  function getShortTimePattern()
+  {
+    return $this->data['DateTimePatterns'][3];
+  }
+
+  /**
+   * Returns the full date pattern "EEEE, yyyy MMMM dd" (default).
+   * This is culture sensitive.
+   * @return string pattern "EEEE, yyyy MMMM dd".
+   */
+  function getFullDatePattern()
+  {
+    return $this->data['DateTimePatterns'][4];
+  }
+
+  /**
+   * Returns the long date pattern "yyyy MMMM d" (default).
+   * This is culture sensitive.
+   * @return string pattern "yyyy MMMM d".
+   */
+  function getLongDatePattern()
+  {
+    return $this->data['DateTimePatterns'][5];
+  }
+
+  /**
+   * Returns the medium date pattern "yyyy MMMM d" (default).
+   * This is culture sensitive.
+   * @return string pattern "yyyy MMM d".
+   */
+  function getMediumDatePattern()
+  {
+    return $this->data['DateTimePatterns'][6];
+  }
+
+  /**
+   * Returns the short date pattern "yy/MM/dd" (default).
+   * This is culture sensitive.
+   *
+   * @return string pattern "yy/MM/dd".
+   */
+  function getShortDatePattern()
+  {
+    return $this->data['DateTimePatterns'][7];
+  }
+
+  /**
+   * Returns the date time order pattern, "{1} {0}" (default).
+   * This is culture sensitive.
+   *
+   * @return string pattern "{1} {0}".
+   */
+  function getDateTimeOrderPattern()
+  {
+    return $this->data['DateTimePatterns'][8];
+  }
+
+  /**
+   * Formats the date and time in a culture sensitive paterrn.
+   * The default is "Date Time".
+   *
+   * @return string date and time formated
+   */
+  function formatDateTime($date, $time)
+  {
+    return str_replace(array('{0}','{1}'), array($time, $date), $this->getDateTimeOrderPattern());
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfDateTimeFormatInfo.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfI18N.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfI18N.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfI18N.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,195 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage i18n
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfI18N.class.php 2769 2006-11-20 14:47:55Z fabien $
+ */
+class sfI18N
+{
+  protected
+    $context             = null,
+    $globalMessageSource = null,
+    $messageSource       = null,
+    $messageFormat       = null;
+
+  static protected
+    $instance            = null;
+
+  static public function getInstance()
+  {
+    if (!isset(self::$instance))
+    {
+      $class = __CLASS__;
+      self::$instance = new $class();
+    }
+
+    return self::$instance;
+  }
+
+  public function initialize($context)
+  {
+    $this->context = $context;
+
+    $this->globalMessageSource = $this->createMessageSource(sfConfig::get('sf_app_i18n_dir'));
+
+    $this->globalMessageFormat = $this->createMessageFormat($this->globalMessageSource);
+  }
+
+  public function setMessageSourceDir($dir, $culture)
+  {
+    $this->messageSource = $this->createMessageSource($dir);
+    $this->messageSource->setCulture($culture);
+
+    $this->messageFormat = $this->createMessageFormat($this->messageSource);
+  }
+
+  public function createMessageSource($dir)
+  {
+    if (in_array(sfConfig::get('sf_i18n_source'), array('Creole', 'MySQL', 'SQLite')))
+    {
+      $messageSource = sfMessageSource::factory(sfConfig::get('sf_i18n_source'), sfConfig::get('sf_i18n_database', 'default'));
+    }
+    else
+    {
+      $messageSource = sfMessageSource::factory(sfConfig::get('sf_i18n_source'), $dir);
+    }
+
+    if (sfConfig::get('sf_i18n_cache'))
+    {
+      $subdir   = str_replace(str_replace('/', DIRECTORY_SEPARATOR, sfConfig::get('sf_root_dir')), '', $dir);
+      $cacheDir = str_replace('/', DIRECTORY_SEPARATOR, sfConfig::get('sf_i18n_cache_dir').$subdir);
+
+      $cache = new sfMessageCache();
+      $cache->initialize(array(
+        'cacheDir' => $cacheDir,
+        'lifeTime' => 86400,
+      ));
+
+      $messageSource->setCache($cache);
+    }
+
+    return $messageSource;
+  }
+
+  public function createMessageFormat($source)
+  {
+    $messageFormat = new sfMessageFormat($source, sfConfig::get('sf_charset'));
+
+    if (sfConfig::get('sf_debug') && sfConfig::get('sf_i18n_debug'))
+    {
+      $messageFormat->setUntranslatedPS(array(sfConfig::get('sf_i18n_untranslated_prefix'), sfConfig::get('sf_i18n_untranslated_suffix')));
+    }
+
+    return $messageFormat;
+  }
+
+  public function setCulture($culture)
+  {
+    if ($this->messageSource)
+    {
+      $this->messageSource->setCulture($culture);
+    }
+
+    $this->globalMessageSource->setCulture($culture);
+  }
+
+  public function getMessageSource()
+  {
+    return $this->messageSource;
+  }
+
+  public function getGlobalMessageSource()
+  {
+    return $this->globalMessageSource;
+  }
+
+  public function getMessageFormat()
+  {
+    return $this->messageFormat;
+  }
+
+  public function getGlobalMessageFormat()
+  {
+    return $this->globalMessageFormat;
+  }
+
+  public function __($string, $args = array(), $catalogue = 'messages')
+  {
+    $retval = $this->messageFormat->formatExists($string, $args, $catalogue);
+
+    if (!$retval)
+    {
+      $retval = $this->globalMessageFormat->format($string, $args, $catalogue);
+    }
+
+    return $retval;
+  }
+
+  public static function getCountry($iso, $culture)
+  {
+    $c = new sfCultureInfo($culture);
+    $countries = $c->getCountries();
+
+    return (array_key_exists($iso, $countries)) ? $countries[$iso] : '';
+  }
+
+  public static function getNativeName($culture)
+  {
+    $cult = new sfCultureInfo($culture);
+    return $cult->getNativeName();
+  }
+
+  // Return timestamp from a date formatted with a given culture
+  public static function getTimestampForCulture($date, $culture)
+  {
+    list($d, $m, $y) = self::getDateForCulture($date, $culture);
+    return mktime(0, 0, 0, $m, $d, $y);
+  }
+
+  // Return a d, m and y from a date formatted with a given culture
+  public static function getDateForCulture($date, $culture)
+  {
+    if (!$date) return 0;
+
+    $dateFormatInfo = @sfDateTimeFormatInfo::getInstance($culture);
+    $dateFormat = $dateFormatInfo->getShortDatePattern();
+
+    // We construct the regexp based on date format
+    $dateRegexp = preg_replace('/[dmy]+/i', '(\d+)', $dateFormat);
+
+    // We parse date format to see where things are (m, d, y)
+    $a = array(
+      'd' => strpos($dateFormat, 'd'),
+      'm' => strpos($dateFormat, 'M'),
+      'y' => strpos($dateFormat, 'y'),
+    );
+    $tmp = array_flip($a);
+    ksort($tmp);
+    $i = 0;
+    $c = array();
+    foreach ($tmp as $value) $c[++$i] = $value;
+    $datePositions = array_flip($c);
+
+    // We find all elements
+    if (preg_match("~$dateRegexp~", $date, $matches))
+    {
+      // We get matching timestamp
+      return array($matches[$datePositions['d']], $matches[$datePositions['m']], $matches[$datePositions['y']]);
+    }
+    else
+    {
+      return null;
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfI18N.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfIMessageSource.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfIMessageSource.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfIMessageSource.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,128 @@
+<?php
+
+/**
+ * sfIMessageSource interface file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: sfIMessageSource.class.php 2834 2006-11-27 14:09:05Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+ 
+/**
+ * sfIMessageSource interface.
+ * 
+ * All messages source used by MessageFormat must be of sfIMessageSource.
+ * It defines a set of operations to add and retrieve messages from the
+ * message source. In addition, message source can load a particular 
+ * catalogue.
+ *
+ * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version v1.0, last update on Fri Dec 24 17:40:19 EST 2004
+ * @package System.I18N.core
+ */
+interface sfIMessageSource
+{
+  /**
+   * Load the translation table for this particular catalogue.
+   * The translation should be loaded in the following order.
+   *  # [1] call getCatalogeList($catalogue) to get a list of 
+   *    variants for for the specified $catalogue.
+   *  # [2] for each of the variants, call getSource($variant)
+   *    to get the resource, could be a file or catalogue ID.
+   *  # [3] verify that this resource is valid by calling isValidSource($source)
+   *  # [4] try to get the messages from the cache
+   *  # [5] if a cache miss, call load($source) to load the message array
+   *  # [6] store the messages to cache.
+   *  # [7] continue with the foreach loop, e.g. goto [2].
+   *
+   * @param string a catalogue to load
+   * @return boolean true if loaded, false otherwise.
+   */
+  function load($catalogue = 'messages');
+
+  /**
+   * Get the translation table. This includes all the loaded sections.
+   * It must return a 2 level array of translation strings.
+   * # "catalogue+variant" the catalogue and its variants.
+   * # "source string" translation keys, and its translations.
+   * <code>
+   *   array('catalogue+variant' => 
+   *       array('source string' => 'target string', ...)
+   *             ...),
+   *        ...);
+   * </code>
+   *
+   * @return array 2 level array translation table.
+   */
+  function read();
+
+  /**
+   * Save the list of untranslated blocks to the translation source. 
+   * If the translation was not found, you should add those
+   * strings to the translation source via the <b>append()</b> method.
+   *
+   * @param string the catalogue to add to
+   * @return boolean true if saved successfuly, false otherwise.
+   */
+  function save($catalogue = 'messages');
+
+  /**
+   * Add a untranslated message to the source. Need to call save()
+   * to save the messages to source.
+   *
+   * @param string message to add
+   * @return void
+   */
+  function append($message);
+
+  /**
+   * Delete a particular message from the specified catalogue.
+   *
+   * @param string the source message to delete.
+   * @param string the catalogue to delete from.
+   * @return boolean true if deleted, false otherwise. 
+   */
+  function delete($message, $catalogue = 'messages');
+
+  /**
+   * Update the translation.
+   *
+   * @param string the source string.
+   * @param string the new translation string.
+   * @param string comments
+   * @param string the catalogue of the translation.
+   * @return boolean true if translation was updated, false otherwise. 
+   */
+  function update($text, $target, $comments, $catalogue = 'messages');
+
+  /**
+   * Returns a list of catalogue as key and all it variants as value.
+   *
+   * @return array list of catalogues 
+   */
+  function catalogues();
+
+  /**
+   * Set the culture for this particular message source.
+   *
+   * @param string the Culture name.
+   */
+  function setCulture($culture);
+
+  /**
+   * Get the culture identifier for the source.
+   *
+   * @return string culture identifier. 
+   */
+  function getCulture();
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfIMessageSource.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageCache.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageCache.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageCache.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,141 @@
+<?php
+/**
+ * Translation table cache.
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: sfMessageCache.class.php 2834 2006-11-27 14:09:05Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+
+/**
+ * Cache the translation table into the file system.
+ * It can cache each cataloug+variant or just the whole section.
+ *
+ * @package System.I18N.core
+ * @author $Author$
+ * @version $Id: sfMessageCache.class.php 2834 2006-11-27 14:09:05Z fabien $
+ */
+class sfMessageCache
+{
+  /**
+   * Cache Lite instance.
+   *
+   * @var TCache_Lite
+   */
+  protected $cache;
+
+  /**
+   * Cache life time, default is 1 year.
+   */
+  protected $lifetime = 3153600;
+
+  /**
+   * Create a new Translation cache.
+   *
+   * @param string $cacheDir Directory to store the cache files.
+   */
+  public function initialize($options = array())
+  {
+    $this->cache = new sfFileCache();
+    $this->cache->initialize($options);
+  }
+
+  /**
+   * Get the cache life time.
+   *
+   * @return int Cache life time.
+   */
+  public function getLifeTime()
+  {
+    return $this->lifetime;
+  }
+
+  /**
+   * Set the cache life time.
+   *
+   * @param int $time Cache life time.
+   */
+  public function setLifeTime($time)
+  {
+    $this->lifetime = intval($time);
+  }
+
+  /**
+   * Get the cache file ID based section and locale.
+   *
+   * @param string $catalogue The translation section.
+   * @param string $culture The translation locale, e.g. "en_AU".
+   */
+  protected function getID($catalogue, $culture)
+  {
+    return $culture;
+  }
+
+  /**
+   * Get the cache file GROUP based section and locale.
+   *
+   * @param string $catalogue The translation section.
+   * @param string $culture The translation locale, e.g. "en_AU".
+   */
+  protected function getGroup($catalogue, $culture)
+  {
+    return $catalogue;
+  }
+
+  /**
+   * Get the data from the cache.
+   *
+   * @param string $catalogue The translation section.
+   * @param string $culture The translation locale, e.g. "en_AU".
+   * @param string $filename If the source is a file, this file's modified time is newer than the cache's modified time, no cache hit.
+   * @return mixed Boolean FALSE if no cache hit. Otherwise, translation
+   * table data for the specified section and locale.
+   */
+  public function get($catalogue, $culture, $lastmodified = 0)
+  {
+    $ID = $this->getID($catalogue, $culture);
+    $group = $this->getGroup($catalogue, $culture);
+
+    if ($lastmodified <= 0 || $lastmodified > $this->cache->lastModified($ID, $group))
+    {
+      return false;
+    }
+
+    return unserialize($this->cache->get($ID, $group));
+  }
+
+  /**
+   * Save the data to cache for the specified section and locale.
+   *
+   * @param array $data The data to save.
+   * @param string $catalogue The translation section.
+   * @param string $culture The translation locale, e.g. "en_AU".
+   */
+  public function save($data, $catalogue, $culture)
+  {
+    $ID = $this->getID($catalogue, $culture);
+    $group = $this->getGroup($catalogue, $culture);
+
+    return $this->cache->set($ID, $group, serialize($data));
+  }
+
+  /**
+   * Clean up the cache for the specified section and locale.
+   *
+   * @param string $catalogue The translation section.
+   * @param string $culture The translation locale, e.g. "en_AU".
+   */
+  public function clean($catalogue, $culture)
+  {
+    $group = $this->getGroup($catalogue, $culture);
+    $this->cache->clean($group);
+  }
+
+  /**
+   * Flush the cache. Deletes all the cache files.
+   */
+  public function clear()
+  {
+    $this->cache->clean();
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageCache.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageFormat.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageFormat.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageFormat.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,301 @@
+<?php
+
+/**
+ * sfMessageFormat class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: sfMessageFormat.class.php 2834 2006-11-27 14:09:05Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+
+/**
+ * Get the encoding utilities
+ */
+require_once(dirname(__FILE__).'/util.php');
+
+/**
+ * sfMessageFormat class.
+ * 
+ * Format a message, that is, for a particular message find the 
+ * translated message. The following is an example using 
+ * a SQLite database to store the translation message. 
+ * Create a new message format instance and echo "Hello"
+ * in simplified Chinese. This assumes that the world "Hello"
+ * is translated in the database.
+ *
+ * <code>
+ *  $source = sfMessageSource::factory('SQLite', 'sqlite://messages.db');
+ *  $source->setCulture('zh_CN');
+ *  $source->setCache(new sfMessageCache('./tmp'));
+ *
+ *  $formatter = new sfMessageFormat($source); 
+ *  
+ *  echo $formatter->format('Hello');
+ * </code>
+ *
+ * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version v1.0, last update on Fri Dec 24 20:46:16 EST 2004
+ * @package System.I18N.core
+ */
+class sfMessageFormat
+{
+  /**
+   * The message source.
+   * @var sfMessageSource
+   */
+  protected $source;
+
+  /**
+   * A list of loaded message catalogues.
+   * @var array
+   */
+  protected $catagloues = array();
+
+  /**
+   * The translation messages.
+   * @var array
+   */
+  protected $messages = array();
+
+  /**
+   * A list of untranslated messages.
+   * @var array
+   */
+  protected $untranslated = array();
+
+  /**
+   * The prefix and suffix to append to untranslated messages.
+   * @var array
+   */
+  protected $postscript = array('', '');
+
+  /**
+   * Set the default catalogue.
+   * @var string 
+   */
+  public $Catalogue;
+
+  /**
+   * Output encoding charset
+   * @var string
+   */
+  protected $charset = 'UTF-8';
+
+  /**
+   * Constructor.
+   * Create a new instance of sfMessageFormat using the messages
+   * from the supplied message source.
+   *
+   * @param MessageSource the source of translation messages.
+   * @param string charset for the message output.
+   */
+  function __construct(sfIMessageSource $source, $charset = 'UTF-8')
+  {
+    $this->source = $source;
+    $this->setCharset($charset);
+  }
+
+  /** 
+   * Sets the charset for message output.
+   *
+   * @param string charset, default is UTF-8
+   */
+  public function setCharset($charset)
+  {
+    $this->charset = $charset;
+  }
+
+  /**
+   * Gets the charset for message output. Default is UTF-8.
+   *
+   * @return string charset, default UTF-8
+   */
+  public function getCharset()
+  {
+    return $this->charset;
+  }
+  
+  /**
+   * Load the message from a particular catalogue. A listed
+   * loaded catalogues is kept to prevent reload of the same
+   * catalogue. The load catalogue messages are stored
+   * in the $this->message array.
+   *
+   * @param string message catalogue to load.
+   */
+  protected function loadCatalogue($catalogue)
+  {
+    if (in_array($catalogue,$this->catagloues))
+    {
+      return;
+    }
+
+    if ($this->source->load($catalogue))
+    {
+      $this->messages[$catalogue] = $this->source->read();
+      $this->catagloues[] = $catalogue;
+    }
+  }
+
+  /**
+   * Format the string. That is, for a particular string find
+   * the corresponding translation. Variable subsitution is performed
+   * for the $args parameter. A different catalogue can be specified
+   * using the $catalogue parameter.
+   * The output charset is determined by $this->getCharset();
+   *
+   * @param string the string to translate.
+   * @param array a list of string to substitute.
+   * @param string get the translation from a particular message
+   * @param string charset, the input AND output charset catalogue.
+   * @return string translated string.
+   */
+  public function format($string, $args = array(), $catalogue = null, $charset = null)
+  {
+    if (empty($charset))
+    {
+      $charset = $this->getCharset();
+    }
+
+    $s = $this->formatString(I18N_toUTF8($string, $charset), $args, $catalogue);
+
+    return I18N_toEncoding($s, $charset);
+  }
+
+  public function formatExists($string, $args = array(), $catalogue = null, $charset = null)
+  {
+    if (empty($charset))
+    {
+      $charset = $this->getCharset();
+    }
+
+    $s = $this->getFormattedString(I18N_toUTF8($string, $charset), $args, $catalogue);
+
+    return I18N_toEncoding($s, $charset);
+  }
+
+  /**
+   * Do string translation.
+   *
+   * @param string the string to translate.
+   * @param array a list of string to substitute.
+   * @param string get the translation from a particular message catalogue.
+   * @return string translated string.
+   */
+  protected function formatString($string, $args = array(), $catalogue = null)
+  {
+    if (empty($args))
+    {
+      $args = array();
+    }
+
+    $target = $this->getFormattedString($string, $args, $catalogue);
+
+    // well we did not find the translation string.
+    if (!$target)
+    {
+      $this->source->append($string);
+      $target = $this->postscript[0].$this->replaceArgs($string, $args).$this->postscript[1];
+    }
+
+    return $target;
+  }
+
+  protected function getFormattedString($string, $args = array(), $catalogue = null)
+  {
+    if (empty($catalogue))
+    {
+      $catalogue = empty($this->Catalogue) ? 'messages' : $this->Catalogue;
+    }
+
+    if (empty($args))
+    {
+      $args = array();
+    }
+
+    $this->loadCatalogue($catalogue);
+
+    foreach ($this->messages[$catalogue] as $variant)
+    {
+      // foreach of the translation units
+      foreach ($variant as $source => $result)
+      {
+        // we found it, so return the target translation
+        if ($source == $string)
+        {
+          // check if it contains only strings.
+          if (is_string($result))
+          {
+            $target = $result;
+          }
+          else
+          {
+            $target = $result[0];
+          }
+
+          // found, but untranslated
+          if (empty($target))
+          {
+            return $this->postscript[0].$this->replaceArgs($string, $args).$this->postscript[1];
+          }
+          else
+          {
+            return $this->replaceArgs($target, $args);
+          }
+        }
+      }
+    }
+
+    return null;
+  }
+
+  protected function replaceArgs($string, $args)
+  {
+    // replace object with strings
+    foreach ($args as $key => $value)
+    {
+      if (is_object($value) && method_exists($value, '__toString'))
+      {
+        $args[$key] = $value->__toString();
+      }
+    }
+
+    return strtr($string, $args);
+  }
+
+  /**
+   * Get the message source.
+   *
+   * @return MessageSource 
+   */
+  function getSource()
+  {
+    return $this->source;
+  }
+  
+  /**
+   * Set the prefix and suffix to append to untranslated messages.
+   * e.g. $postscript=array('[T]','[/T]'); will output 
+   * "[T]Hello[/T]" if the translation for "Hello" can not be determined.
+   *
+   * @param array first element is the prefix, second element the suffix.
+   */
+  function setUntranslatedPS($postscript)
+  {
+    if (is_array($postscript) && count($postscript) >= 2)
+    {
+      $this->postscript[0] = $postscript[0];
+      $this->postscript[1] = $postscript[1];
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageFormat.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,325 @@
+<?php
+
+/**
+ * sfMessageSource class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: sfMessageSource.class.php 2834 2006-11-27 14:09:05Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+
+/**
+ * Abstract sfMessageSource class.
+ *
+ * The base class for all sfMessageSources. Message sources must be instantiated
+ * using the factory method. The default valid sources are
+ *
+ *  # XLIFF -- using XML XLIFF format to store the translation messages.
+ *  # SQLite -- Store the translation messages in a SQLite database.
+ *  # MySQL -- Using a MySQL database to store the messages.
+ *  # gettext -- Translated messages are stored in the gettext format.
+ *
+ * A custom message source can be instantiated by specifying the filename
+ * parameter to point to the custom class file. E.g.
+ * <code>
+ *   $resource = '...'; //custom message source resource
+ *   $classfile = '../sfMessageSource_MySource.php'; //custom message source
+ *   $source = sfMessageSource::factory('MySource', $resource, $classfile);
+ * </code>
+ *
+ * If you are writting your own message sources, pay attention to the
+ * loadCatalogue method. It details how the resources are loaded and cached.
+ * See also the existing message source types as examples.
+ *
+ * The following example instantiates a MySQL message source, set the culture,
+ * set the cache handler, and use the source in a message formatter.
+ * The messages are store in a database named "messages". The source parameter
+ * for the actory method is a PEAR DB style DSN.
+ * <code>
+ *   $dsn = 'mysql://username:password@localhost/messages';
+ *   $source = sfMessageSource::factory('MySQL', $dsn);
+ *
+ *   //set the culture and cache, store the cache in the /tmp directory.
+ *   $source->setCulture('en_AU')l
+ *   $source->setCache(new sfMessageCache('/tmp'));
+ *
+ *   $formatter = new sfMessageFormat($source);
+ * </code>
+ *
+ * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version v1.0, last update on Fri Dec 24 19:55:49 EST 2004
+ * @package System.I18N.core
+ */
+abstract class sfMessageSource implements sfIMessageSource
+{
+  /**
+   * The culture name for this message source.
+   * @var string
+   */
+  protected $culture;
+
+  /**
+   * Array of translation messages.
+   * @var array
+   */
+  protected $messages = array();
+
+  /**
+   * The source of message translations.
+   * @var string
+   */
+  protected $source;
+
+  /**
+   * The translation cache.
+   * @var sfMessageCache
+   */
+  protected $cache;
+
+  protected $untranslated = array();
+
+  /**
+   * Private constructor. sfMessageSource must be initialized using
+   * the factory method.
+   */
+  private function __construct()
+  {
+    //throw new sfException('Please use the factory method to instantiate.');
+  }
+
+  /**
+   * Factory method to instantiate a new sfMessageSource depending on the
+   * source type. The built-in source types are 'XLIFF', 'SQLite',
+   * 'MySQL', 'gettext' and Creole. The source parameter is dependent on the
+   * source type. For 'gettext' and 'XLIFF', it should point to the directory
+   * where the messages are stored. For database types, e.g. 'SQLite' and
+   * 'MySQL', it should be a PEAR DB style DSN string.
+   *
+   * Custom message source are possible by supplying the a filename parameter
+   * in the factory method.
+   *
+   * @param string the message source type.
+   * @param string the location of the resource.
+   * @param string the filename of the custom message source.
+   * @return sfMessageSource a new message source of the specified type.
+   * @throws sfException
+   */
+  static function factory($type, $source = '.', $filename = '')
+  {
+    if ($filename)
+    {
+      if (!is_file($filename))
+      {
+        throw new sfException("File $filename not found");
+      }
+
+      include_once($filename);
+    }
+
+    $class = 'sfMessageSource_'.$type;
+    if (!class_exists($class))
+    {
+      throw new sfException(sprintf('Unable to find type "%s"', $type));
+    }
+
+    return new $class($source);
+  }
+
+  /**
+   * Load a particular message catalogue. Use read() to
+   * to get the array of messages. The catalogue loading sequence
+   * is as follows
+   *
+   *  # [1] call getCatalogeList($catalogue) to get a list of
+   *    variants for for the specified $catalogue.
+   *  # [2] for each of the variants, call getSource($variant)
+   *    to get the resource, could be a file or catalogue ID.
+   *  # [3] verify that this resource is valid by calling isValidSource($source)
+   *  # [4] try to get the messages from the cache
+   *  # [5] if a cache miss, call load($source) to load the message array
+   *  # [6] store the messages to cache.
+   *  # [7] continue with the foreach loop, e.g. goto [2].
+   *
+   * @param string a catalogue to load
+   * @return boolean true if loaded, false otherwise.
+   * @see read()
+   */
+  function load($catalogue='messages')
+  {
+    $variants = $this->getCatalogueList($catalogue);
+
+    $this->messages = array();
+
+    foreach ($variants as $variant)
+    {
+      $source = $this->getSource($variant);
+
+      if ($this->isValidSource($source) == false)
+      {
+        continue;
+      }
+
+      $loadData = true;
+
+      if ($this->cache)
+      {
+        $data = $this->cache->get($variant, $this->culture, $this->getLastModified($source));
+
+        if (is_array($data))
+        {
+          $this->messages[$variant] = $data;
+          $loadData = false;
+        }
+        unset($data);
+      }
+
+      if ($loadData)
+      {
+        $data = &$this->loadData($source);
+        if (is_array($data))
+        {
+          $this->messages[$variant] = $data;
+          if ($this->cache)
+          {
+            $this->cache->save($data, $variant, $this->culture);
+          }
+        }
+        unset($data);
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * Get the array of messages.
+   *
+   * @param parameter
+   * @return array translation messages.
+   */
+  public function read()
+  {
+    return $this->messages;
+  }
+
+  /**
+   * Get the cache handler for this source.
+   *
+   * @return sfMessageCache cache handler
+   */
+  public function getCache()
+  {
+    return $this->cache;
+  }
+
+  /**
+   * Set the cache handler for caching the messages.
+   *
+   * @param sfMessageCache the cache handler.
+   */
+  public function setCache(sfMessageCache $cache)
+  {
+    $this->cache = $cache;
+  }
+
+  /**
+   * Add a untranslated message to the source. Need to call save()
+   * to save the messages to source.
+   *
+   * @param string message to add
+   */
+  public function append($message)
+  {
+    if (!in_array($message, $this->untranslated))
+    {
+      $this->untranslated[] = $message;
+    }
+  }
+
+  /**
+   * Set the culture for this message source.
+   *
+   * @param string culture name
+   */
+  public function setCulture($culture)
+  {
+    $this->culture = $culture;
+  }
+
+  /**
+   * Get the culture identifier for the source.
+   *
+   * @return string culture identifier.
+   */
+  public function getCulture()
+  {
+    return $this->culture;
+  }
+
+  /**
+   * Get the last modified unix-time for this particular catalogue+variant.
+   *
+   * @param string catalogue+variant
+   * @return int last modified in unix-time format.
+   */
+  protected function getLastModified($source)
+  {
+    return 0;
+  }
+
+  /**
+   * Load the message for a particular catalogue+variant.
+   * This methods needs to implemented by subclasses.
+   *
+   * @param string catalogue+variant.
+   * @return array of translation messages.
+   */
+  protected function &loadData($variant)
+  {
+    return array();
+  }
+
+  /**
+   * Get the source, this could be a filename or database ID.
+   *
+   * @param string catalogue+variant
+   * @return string the resource key
+   */
+  protected function getSource($variant)
+  {
+    return $variant;
+  }
+
+  /**
+   * Determine if the source is valid.
+   *
+   * @param string catalogue+variant
+   * @return boolean true if valid, false otherwise.
+   */
+  protected function isValidSource($source)
+  {
+    return false;
+  }
+
+  /**
+   * Get all the variants of a particular catalogue.
+   * This method must be implemented by subclasses.
+   *
+   * @param string catalogue name
+   * @return array list of all variants for this catalogue.
+   */
+  protected function getCatalogueList($catalogue)
+  {
+    return array();
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_MySQL.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_MySQL.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_MySQL.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,453 @@
+<?php
+
+/**
+ * sfMessageSource_MySQL class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: sfMessageSource_MySQL.class.php 3148 2007-01-04 19:34:28Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+
+/**
+ * Get the I18N utility file, contains the DSN parser.
+ */
+require_once(dirname(__FILE__).'/util.php');
+
+/**
+ * sfMessageSource_MySQL class.
+ * 
+ * Retrieve the message translation from a MySQL database.
+ *
+ * See the MessageSource::factory() method to instantiate this class.
+ *
+ * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version v1.0, last update on Fri Dec 24 16:58:58 EST 2004
+ * @package System.I18N.core
+ */
+class sfMessageSource_MySQL extends sfMessageSource
+{
+  /**
+   * The datasource string, full DSN to the database.
+   * @var string 
+   */
+  protected $source;
+
+  /**
+   * The DSN array property, parsed by PEAR's DB DSN parser.
+   * @var array 
+   */
+  protected $dns;
+
+  /**
+   * A resource link to the database
+   * @var db 
+   */
+  protected $db;
+
+  /**
+   * Constructor.
+   * Create a new message source using MySQL.
+   *
+   * @param string MySQL datasource, in PEAR's DB DSN format.
+   * @see MessageSource::factory();
+   */
+  function __construct($source)
+  {
+    $this->source = (string)$source;
+    $this->dns = parseDSN($this->source);
+    $this->db = $this->connect();
+  }
+
+  /**
+   * Destructor, close the database connection.
+   */
+  function __destruct()
+  {
+    @mysql_close($this->db);
+  }
+
+  /**
+   * Connect to the MySQL datasource
+   *
+   * @return resource MySQL connection.
+   * @throws sfException, connection and database errors.
+   */
+  protected function connect()
+  {
+    $dsninfo = $this->dns;
+
+    if (isset($dsninfo['protocol']) && $dsninfo['protocol'] == 'unix')
+    {
+      $dbhost = ':'.$dsninfo['socket'];
+    }
+    else
+    {
+      $dbhost = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'localhost';
+      if (!empty($dsninfo['port']))
+      {
+        $dbhost = ':' . $dsninfo['socket'];
+      }
+    }
+    $user = $dsninfo['username'];
+    $pw = $dsninfo['password'];
+
+    $connect_function = 'mysql_connect';
+
+    if ($dbhost && $user && $pw)
+    {
+      $conn = @$connect_function($dbhost, $user, $pw);
+    }
+    elseif ($dbhost && $user)
+    {
+      $conn = @$connect_function($dbhost, $user);
+    }
+    elseif ($dbhost)
+    {
+      $conn = @$connect_function($dbhost);
+    }
+    else
+    {
+      $conn = false;
+    }
+
+    if (empty($conn))
+    {
+      throw new sfException('Error in connecting to '.$dsninfo);
+    }
+
+    if ($dsninfo['database'])
+    {
+      if (!@mysql_select_db($dsninfo['database'], $conn))
+      {
+        throw new sfException('Error in connecting database, dns:'.$dsninfo);
+      }
+    }
+    else
+    {
+      throw new sfException('Please provide a database for message translation.');
+    }
+
+    return $conn;
+  }
+
+  /**
+   * Get the database connection.
+   *
+   * @return db database connection. 
+   */
+  public function connection()
+  {
+    return $this->db;
+  }
+
+  /**
+   * Get an array of messages for a particular catalogue and cultural 
+   * variant.
+   *
+   * @param string the catalogue name + variant
+   * @return array translation messages.
+   */
+  protected function &loadData($variant)
+  {
+    $variant = mysql_escape_string($variant);
+
+    $statement = 
+      "SELECT t.id, t.source, t.target, t.comments
+        FROM trans_unit t, catalogue c
+        WHERE c.cat_id =  t.cat_id
+          AND c.name = '{$variant}' 
+        ORDER BY id ASC";
+
+    $rs = mysql_query($statement,$this->db);
+
+    $result = array();
+
+    while ($row = mysql_fetch_array($rs, MYSQL_NUM))
+    {
+      $source = $row[1];
+      $result[$source][] = $row[2]; //target
+      $result[$source][] = $row[0]; //id
+      $result[$source][] = $row[3]; //comments
+    }
+
+    return $result;
+  }
+
+  /**
+   * Get the last modified unix-time for this particular catalogue+variant.
+   * We need to query the database to get the date_modified.
+   *
+   * @param string catalogue+variant
+   * @return int last modified in unix-time format.
+   */
+  protected function getLastModified($source)
+  {
+    $source = mysql_escape_string($source);
+
+    $rs = mysql_query("SELECT date_modified FROM catalogue WHERE name = '{$source}'", $this->db);
+
+    $result = $rs ? intval(mysql_result($rs, 0)) : 0;
+
+    return $result;
+  }
+
+  /**
+   * Check if a particular catalogue+variant exists in the database.
+   *
+   * @param string catalogue+variant
+   * @return boolean true if the catalogue+variant is in the database, false otherwise.
+   */ 
+  protected function isValidSource($variant)
+  {
+    $variant = mysql_escape_string ($variant);
+
+    $rs = mysql_query("SELECT COUNT(*) FROM catalogue WHERE name = '{$variant}'", $this->db);
+
+    $row = mysql_fetch_array($rs,MYSQL_NUM);
+
+    $result = $row && $row[0] == '1';
+
+    return $result;
+  }
+
+  /**
+   * Get all the variants of a particular catalogue.
+   *
+   * @param string catalogue name
+   * @return array list of all variants for this catalogue. 
+   */
+  protected function getCatalogueList($catalogue)
+  {
+    $variants = explode('_', $this->culture);
+
+    $catalogues = array($catalogue);
+
+    $variant = null;
+
+    for ($i = 0, $max = count($variants); $i < $max; $i++)
+    {
+      if (strlen($variants[$i]) > 0)
+      {
+        $variant .= $variant ? '_'.$variants[$i] : $variants[$i];
+        $catalogues[] = $catalogue.'.'.$variant;
+      }
+    }
+
+    return array_reverse($catalogues);
+  }
+
+  /**
+   * Retrieve catalogue details, array($cat_id, $variant, $count).
+   *
+   * @param string catalogue
+   * @return array catalogue details, array($cat_id, $variant, $count). 
+   */
+  protected function getCatalogueDetails($catalogue = 'messages')
+  {
+    if (empty($catalogue))
+    {
+      $catalogue = 'messages';
+    }
+
+    $variant = $catalogue.'.'.$this->culture;
+
+    $name = mysql_escape_string($this->getSource($variant));
+
+    $rs = mysql_query("SELECT cat_id FROM catalogue WHERE name = '{$name}'", $this->db);
+
+    if (mysql_num_rows($rs) != 1)
+    {
+      return false;
+    }
+
+    $cat_id = intval(mysql_result($rs, 0));
+
+    // first get the catalogue ID
+    $rs = mysql_query("SELECT count(msg_id) FROM trans_unit WHERE cat_id = {$cat_id}", $this->db);
+
+    $count = intval(mysql_result($rs, 0));
+
+    return array($cat_id, $variant, $count);
+  }
+
+  /**
+   * Update the catalogue last modified time.
+   *
+   * @return boolean true if updated, false otherwise. 
+   */
+  protected function updateCatalogueTime($cat_id, $variant)
+  {
+    $time = time();
+
+    $result = mysql_query("UPDATE catalogue SET date_modified = {$time} WHERE cat_id = {$cat_id}", $this->db);
+
+    if (!empty($this->cache))
+    {
+      $this->cache->clean($variant, $this->culture);
+    }
+
+    return $result;
+  }
+
+  /**
+   * Save the list of untranslated blocks to the translation source. 
+   * If the translation was not found, you should add those
+   * strings to the translation source via the <b>append()</b> method.
+   *
+   * @param string the catalogue to add to
+   * @return boolean true if saved successfuly, false otherwise.
+   */
+  function save($catalogue = 'messages')
+  {
+    $messages = $this->untranslated;
+
+    if (count($messages) <= 0)
+    {
+      return false;
+    }
+
+    $details = $this->getCatalogueDetails($catalogue);
+
+    if ($details)
+    {
+      list($cat_id, $variant, $count) = $details;
+    }
+    else
+    {
+      return false;
+    }
+
+    if ($cat_id <= 0)
+    {
+      return false;
+    }
+    $inserted = 0;
+
+    $time = time();
+
+    foreach ($messages as $message)
+    {
+      $count++;
+      $inserted++;
+      $message = mysql_escape_string($message);
+      $statement = "INSERT INTO trans_unit
+        (cat_id,id,source,date_added) VALUES
+        ({$cat_id}, {$count},'{$message}',$time)";
+      mysql_query($statement, $this->db);
+    }
+    if ($inserted > 0)
+    {
+      $this->updateCatalogueTime($cat_id, $variant);
+    }
+
+    return $inserted > 0;
+  }
+
+  /**
+   * Delete a particular message from the specified catalogue.
+   *
+   * @param string the source message to delete.
+   * @param string the catalogue to delete from.
+   * @return boolean true if deleted, false otherwise. 
+   */
+  function delete($message, $catalogue = 'messages')
+  {
+    $details = $this->getCatalogueDetails($catalogue);
+    if ($details)
+    {
+      list($cat_id, $variant, $count) = $details;
+    }
+    else
+    {
+      return false;
+    }
+
+    $text = mysql_escape_string($message);
+
+    $statement = "DELETE FROM trans_unit WHERE cat_id = {$cat_id} AND source = '{$message}'";
+    $deleted = false;
+
+    mysql_query($statement, $this->db);
+
+    if (mysql_affected_rows($this->db) == 1)
+    {
+      $deleted = $this->updateCatalogueTime($cat_id, $variant);
+    }
+
+    return $deleted;
+  }
+
+  /**
+   * Update the translation.
+   *
+   * @param string the source string.
+   * @param string the new translation string.
+   * @param string comments
+   * @param string the catalogue of the translation.
+   * @return boolean true if translation was updated, false otherwise. 
+   */
+  function update($text, $target, $comments, $catalogue = 'messages')
+  {
+    $details = $this->getCatalogueDetails($catalogue);
+    if ($details)
+    {
+      list($cat_id, $variant, $count) = $details;
+    }
+    else
+    {
+      return false;
+    }
+
+    $comments = mysql_escape_string($comments);
+    $target = mysql_escape_string($target);
+    $text = mysql_escape_string($text);
+
+    $time = time();
+
+    $statement = "UPDATE trans_unit SET target = '{$target}', comments = '{$comments}', date_modified = '{$time}' WHERE cat_id = {$cat_id} AND source = '{$text}'";
+
+    $updated = false;
+
+    mysql_query($statement, $this->db);
+    if (mysql_affected_rows($this->db) == 1)
+    {
+      $updated = $this->updateCatalogueTime($cat_id, $variant);
+    }
+
+    return $updated;
+  }
+
+  /**
+   * Returns a list of catalogue as key and all it variants as value.
+   *
+   * @return array list of catalogues 
+   */
+  function catalogues()
+  {
+    $statement = 'SELECT name FROM catalogue ORDER BY name';
+    $rs = mysql_query($statement, $this->db);
+    $result = array();
+    while($row = mysql_fetch_array($rs, MYSQL_NUM))
+    {
+      $details = explode('.', $row[0]);
+      if (!isset($details[1]))
+      {
+        $details[1] = null;
+      }
+
+      $result[] = $details;
+    }
+
+    return $result;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_MySQL.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_SQLite.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_SQLite.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_SQLite.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,374 @@
+<?php
+
+/**
+ * sfMessageSource_SQLite class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: sfMessageSource_SQLite.class.php 3148 2007-01-04 19:34:28Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+
+/**
+ * Get the I18N utility file, contains the DSN parser.
+ */
+require_once(dirname(__FILE__).'/util.php');
+
+/**
+ * sfMessageSource_SQLite class.
+ * 
+ * Retrieve the message translation from a SQLite database.
+ *
+ * See the MessageSource::factory() method to instantiate this class.
+ *
+ * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version v1.0, last update on Fri Dec 24 16:58:58 EST 2004
+ * @package System.I18N.core
+ */
+class sfMessageSource_SQLite extends sfMessageSource
+{
+  /**
+   * The SQLite datasource, the filename of the database.
+   * @var string 
+   */
+  protected $source;
+
+  /**
+   * Constructor.
+   * Create a new message source using SQLite.
+   * @see MessageSource::factory();
+   * @param string SQLite datasource, in PEAR's DB DSN format.
+   */
+  function __construct($source)
+  {
+    $dsn = parseDSN((string)$source);
+    $this->source = $dsn['database'];
+  }
+
+  /**
+   * Get an array of messages for a particular catalogue and cultural variant.
+   *
+   * @param string the catalogue name + variant
+   * @return array translation messages.
+   */
+  protected function &loadData($variant)
+  {
+    $variant = sqlite_escape_string($variant);
+
+    $statement = 
+      "SELECT t.id, t.source, t.target, t.comments
+        FROM trans_unit t, catalogue c
+        WHERE c.cat_id =  t.cat_id
+          AND c.name = '{$variant}' 
+        ORDER BY id ASC";
+
+    $db = sqlite_open($this->source);
+    $rs = sqlite_query($statement, $db);
+
+    $result = array();
+
+    while($row = sqlite_fetch_array($rs, SQLITE_NUM))
+    {
+      $source = $row[1];
+      $result[$source][] = $row[2]; //target
+      $result[$source][] = $row[0]; //id
+      $result[$source][] = $row[3]; //comments
+    }
+
+    sqlite_close($db);
+
+    return $result;
+  }
+
+  /**
+   * Get the last modified unix-time for this particular catalogue+variant.
+   * We need to query the database to get the date_modified.
+   *
+   * @param string catalogue+variant
+   * @return int last modified in unix-time format.
+   */
+  protected function getLastModified($source)
+  {
+    $source = sqlite_escape_string($source);
+
+    $db = sqlite_open($this->source);
+
+    $rs = sqlite_query("SELECT date_modified FROM catalogue WHERE name = '{$source}'", $db);
+
+    $result = $rs ? intval(sqlite_fetch_single($rs)) : 0;
+
+    sqlite_close($db);
+
+    return $result;
+  }
+
+  /**
+   * Check if a particular catalogue+variant exists in the database.
+   *
+   * @param string catalogue+variant
+   * @return boolean true if the catalogue+variant is in the database, false otherwise.
+   */
+  protected function isValidSource($variant)
+  {
+    $variant = sqlite_escape_string($variant);
+    $db = sqlite_open($this->source);
+    $rs = sqlite_query("SELECT COUNT(*) FROM catalogue WHERE name = '{$variant}'", $db);
+    $result = $rs && intval(sqlite_fetch_single($rs));
+    sqlite_close($db);
+
+    return $result;
+  }
+
+  /**
+   * Get all the variants of a particular catalogue.
+   *
+   * @param string catalogue name
+   * @return array list of all variants for this catalogue.
+   */
+  protected function getCatalogueList($catalogue)
+  {
+    $variants = explode('_', $this->culture);
+
+    $catalogues = array($catalogue);
+
+    $variant = null;
+
+    for ($i = 0, $max = count($variants); $i < $max; $i++)
+    {
+      if (strlen($variants[$i]) > 0)
+      {
+        $variant .= ($variant) ? '_'.$variants[$i] : $variants[$i];
+        $catalogues[] = $catalogue.'.'.$variant;
+      }
+    }
+
+    return array_reverse($catalogues);
+  }
+
+  /**
+   * Retrieve catalogue details, array($cat_id, $variant, $count).
+   *
+   * @param string catalogue
+   * @return array catalogue details, array($cat_id, $variant, $count).
+   */
+  protected function getCatalogueDetails($catalogue = 'messages')
+  {
+    if (empty($catalogue))
+    {
+      $catalogue = 'messages';
+    }
+
+    $variant = $catalogue.'.'.$this->culture;
+
+    $name = sqlite_escape_string($this->getSource($variant));
+
+    $db = sqlite_open($this->source);
+
+    $rs = sqlite_query("SELECT cat_id FROM catalogue WHERE name = '{$name}'", $db);
+
+    if (sqlite_num_rows($rs) != 1)
+    {
+      return false;
+    }
+
+    $cat_id = intval(sqlite_fetch_single($rs));
+
+    //first get the catalogue ID
+    $rs = sqlite_query("SELECT count(msg_id) FROM trans_unit WHERE cat_id = {$cat_id}", $db);
+
+    $count = intval(sqlite_fetch_single($rs));
+
+    sqlite_close($db);
+
+    return array($cat_id, $variant, $count);
+  }
+
+  /**
+   * Update the catalogue last modified time.
+   *
+   * @return boolean true if updated, false otherwise. 
+   */
+  protected function updateCatalogueTime($cat_id, $variant, $db)
+  {
+    $time = time();
+
+    $result = sqlite_query("UPDATE catalogue SET date_modified = {$time} WHERE cat_id = {$cat_id}", $db);
+
+    if (!empty($this->cache))
+    {
+      $this->cache->clean($variant, $this->culture);
+    }
+
+    return $result;
+  }
+
+  /**
+   * Save the list of untranslated blocks to the translation source. 
+   * If the translation was not found, you should add those
+   * strings to the translation source via the <b>append()</b> method.
+   *
+   * @param string the catalogue to add to
+   * @return boolean true if saved successfuly, false otherwise.
+   */
+  function save($catalogue='messages')
+  {
+    $messages = $this->untranslated;
+
+    if (count($messages) <= 0)
+    {
+      return false;
+    }
+
+    $details = $this->getCatalogueDetails($catalogue);
+
+    if ($details)
+    {
+      list($cat_id, $variant, $count) = $details;
+    }
+    else
+    {
+      return false;
+    }
+
+    if ($cat_id <= 0)
+    {
+      return false;
+    }
+    $inserted = 0;
+
+    $db = sqlite_open($this->source);
+    $time = time();
+
+    foreach ($messages as $message)
+    {
+      $message = sqlite_escape_string($message);
+      $statement = "INSERT INTO trans_unit (cat_id,id,source,date_added) VALUES ({$cat_id}, {$count},'{$message}',$time)";
+      if (sqlite_query($statement, $db))
+      {
+        $count++;
+        $inserted++;
+      }
+    }
+    if ($inserted > 0)
+    {
+      $this->updateCatalogueTime($cat_id, $variant, $db);
+    }
+
+    sqlite_close($db);
+
+    return $inserted > 0;
+  }
+
+  /**
+   * Update the translation.
+   *
+   * @param string the source string.
+   * @param string the new translation string.
+   * @param string comments
+   * @param string the catalogue of the translation.
+   * @return boolean true if translation was updated, false otherwise. 
+   */
+  function update($text, $target, $comments, $catalogue = 'messages')
+  {
+    $details = $this->getCatalogueDetails($catalogue);
+    if ($details)
+    {
+      list($cat_id, $variant, $count) = $details;
+    }
+    else
+    {
+      return false;
+    }
+
+    $comments = sqlite_escape_string($comments);
+    $target = sqlite_escape_string($target);
+    $text = sqlite_escape_string($text);
+
+    $time = time();
+
+    $db = sqlite_open($this->source);
+
+    $statement = "UPDATE trans_unit SET target = '{$target}', comments = '{$comments}', date_modified = '{$time}' WHERE cat_id = {$cat_id} AND source = '{$text}'";
+
+    $updated = false;
+
+    if (sqlite_query($statement, $db))
+    {
+      $updated = $this->updateCatalogueTime($cat_id, $variant, $db);
+    }
+
+    sqlite_close($db);
+
+    return $updated;
+  }
+
+  /**
+   * Delete a particular message from the specified catalogue.
+   *
+   * @param string the source message to delete.
+   * @param string the catalogue to delete from.
+   * @return boolean true if deleted, false otherwise. 
+   */
+  function delete($message, $catalogue = 'messages')
+  {
+    $details = $this->getCatalogueDetails($catalogue);
+    if ($details)
+    {
+      list($cat_id, $variant, $count) = $details;
+    }
+    else
+    {
+      return false;
+    }
+
+    $db = sqlite_open($this->source);
+    $text = sqlite_escape_string($message);
+
+    $statement = "DELETE FROM trans_unit WHERE cat_id = {$cat_id} AND source = '{$message}'";
+    $deleted = false;
+
+    if (sqlite_query($statement, $db))
+    {
+      $deleted = $this->updateCatalogueTime($cat_id, $variant, $db);
+    }
+
+    sqlite_close($db);
+
+    return $deleted;
+  }
+
+  /**
+   * Returns a list of catalogue as key and all it variants as value.
+   *
+   * @return array list of catalogues 
+   */
+  function catalogues()
+  {
+    $db = sqlite_open($this->source);
+    $statement = 'SELECT name FROM catalogue ORDER BY name';
+    $rs = sqlite_query($statement, $db);
+    $result = array();
+    while ($row = sqlite_fetch_array($rs, SQLITE_NUM))
+    {
+      $details = explode('.',$row[0]);
+      if (!isset($details[1]))
+      {
+        $details[1] = null;
+      }
+
+      $result[] = $details;
+    }
+    sqlite_close($db);
+
+    return $result;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_SQLite.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_XLIFF.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_XLIFF.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_XLIFF.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,518 @@
+<?php
+
+/**
+ * sfMessageSource_XLIFF class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: sfMessageSource_XLIFF.class.php 2834 2006-11-27 14:09:05Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+
+/**
+ * sfMessageSource_XLIFF class.
+ * 
+ * Using XML XLIFF format as the message source for translation.
+ * Details and example of XLIFF can be found in the following URLs.
+ *
+ * # http://www.opentag.com/xliff.htm
+ * # http://www-106.ibm.com/developerworks/xml/library/x-localis2/
+ * 
+ * See the MessageSource::factory() method to instantiate this class.
+ * 
+ * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version v1.0, last update on Fri Dec 24 16:18:44 EST 2004
+ * @package System.I18N.core
+ */
+class sfMessageSource_XLIFF extends sfMessageSource
+{
+  /**
+   * Message data filename extension.
+   * @var string 
+   */
+  protected $dataExt = '.xml';
+
+  /**
+   * Separator between culture name and source.
+   * @var string 
+   */
+  protected $dataSeparator = '.';
+
+  /**
+   * Constructor.
+   *
+   * @param string the directory where the messages are stored.
+   * @see MessageSource::factory();
+   */
+  function __construct($source)
+  {
+    $this->source = (string)$source;
+  }
+
+  /**
+   * Load the messages from a XLIFF file.
+   *
+   * @param string XLIFF file.
+   * @return array of messages.
+   */
+  protected function &loadData($filename)
+  {
+    //load it.
+
+    $XML = simplexml_load_file($filename);
+
+    if (!$XML)
+    {
+      return false;
+    }
+
+    $translationUnit = $XML->xpath('//trans-unit');
+
+    $translations = array();
+
+    foreach ($translationUnit as $unit)
+    {
+      $source = (string)$unit->source;
+      $translations[$source][] = (string)$unit->target;
+      $translations[$source][]= (string)$unit['id'];
+      $translations[$source][]= (string)$unit->note;
+    }
+
+    return $translations;
+  }
+
+  /**
+   * Get the last modified unix-time for this particular catalogue+variant.
+   * Just use the file modified time.
+   *
+   * @param string catalogue+variant
+   * @return int last modified in unix-time format.
+   */
+  protected function getLastModified($source)
+  {
+    if (is_file($source))
+    {
+      return filemtime($source);
+    }
+    else
+    {
+      return 0;
+    }
+  }
+
+  /**
+   * Get the XLIFF file for a specific message catalogue and cultural variant.
+   *
+   * @param string message catalogue
+   * @return string full path to the XLIFF file.
+   */
+  protected function getSource($variant)
+  {
+    return $this->source.'/'.$variant;
+  }
+
+  /**
+   * Determin if the XLIFF file source is valid.
+   *
+   * @param string XLIFF file
+   * @return boolean true if valid, false otherwise.
+   */
+  protected function isValidSource($source)
+  {
+    return is_file($source);
+  }
+
+  /**
+   * Get all the variants of a particular catalogue.
+   *
+   * @param string catalogue name
+   * @return array list of all variants for this catalogue. 
+   */
+  protected function getCatalogueList($catalogue)
+  {
+    $variants = explode('_', $this->culture);
+    $source = $catalogue.$this->dataExt;
+
+    $catalogues = array($source);
+
+    $variant = null;
+
+    for ($i = 0, $max = count($variants); $i < $max; $i++)
+    {
+      if (strlen($variants[$i]) > 0)
+      {
+        $variant .= ($variant) ? '_'.$variants[$i] : $variants[$i];
+        $catalogues[] = $catalogue.$this->dataSeparator.$variant.$this->dataExt;
+      }
+    }
+
+    $byDir = $this->getCatalogueByDir($catalogue);
+    $catalogues = array_merge($byDir, array_reverse($catalogues));
+
+    return $catalogues;
+  }
+
+  /**
+   * Traverse through the directory structure to find the catalogues.
+   * This should only be called by getCatalogueList()
+   *
+   * @param string a particular catalogue.
+   * @return array a list of catalogues. 
+   * @see getCatalogueList()
+   */
+  protected function getCatalogueByDir($catalogue)
+  {
+    $variants = explode('_', $this->culture);
+    $catalogues = array();
+
+    $variant = null;
+
+    for ($i = 0, $max = count($variants); $i < $max; $i++)
+    {
+      if (strlen($variants[$i]) > 0)
+      {
+        $variant .= ($variant) ? '_'.$variants[$i] : $variants[$i];
+        $catalogues[] = $variant.'/'.$catalogue.$this->dataExt;
+      }
+    }
+
+    return array_reverse($catalogues);
+  }
+
+  /**
+   * Returns a list of catalogue and its culture ID.
+   * E.g. array('messages','en_AU')
+   *
+   * @return array list of catalogues 
+   * @see getCatalogues()
+   */
+  public function catalogues()
+  {
+    return $this->getCatalogues();
+  }
+
+  /**
+   * Returns a list of catalogue and its culture ID. This takes care
+   * of directory structures.
+   * E.g. array('messages','en_AU')
+   *
+   * @return array list of catalogues 
+   */
+  protected function getCatalogues($dir = null, $variant = null)
+  {
+    $dir = $dir ? $dir : $this->source;
+    $files = scandir($dir);
+
+    $catalogue = array();
+
+    foreach ($files as $file)
+    {
+      if (is_dir($dir.'/'.$file) && preg_match('/^[a-z]{2}(_[A-Z]{2,3})?$/', $file))
+      {
+        $catalogue = array_merge($catalogue, $this->getCatalogues($dir.'/'.$file, $file));
+      }
+
+      $pos = strpos($file,$this->dataExt);
+      if ($pos > 0 && substr($file, -1 * strlen($this->dataExt)) == $this->dataExt)
+      {
+        $name = substr($file, 0, $pos);
+        $dot = strrpos($name, $this->dataSeparator);
+        $culture = $variant;
+        $cat = $name;
+        if (is_int($dot))
+        {
+          $culture = substr($name, $dot + 1,strlen($name));
+          $cat = substr($name, 0, $dot);
+        }
+        $details[0] = $cat;
+        $details[1] = $culture;
+
+        $catalogue[] = $details;
+      }
+    }
+    sort($catalogue);
+
+    return $catalogue;
+  }
+
+  /**
+   * Get the variant for a catalogue depending on the current culture.
+   *
+   * @param string catalogue
+   * @return string the variant. 
+   * @see save()
+   * @see update()
+   * @see delete()
+   */
+  protected function getVariants($catalogue = 'messages')
+  {
+    if (is_null($catalogue))
+    {
+      $catalogue = 'messages';
+    }
+
+    foreach ($this->getCatalogueList($catalogue) as $variant)
+    {
+      $file = $this->getSource($variant);
+      if (is_file($file))
+      {
+        return array($variant, $file);
+      }
+    }
+
+    return false;
+  }
+
+  /**
+   * Save the list of untranslated blocks to the translation source. 
+   * If the translation was not found, you should add those
+   * strings to the translation source via the <b>append()</b> method.
+   *
+   * @param string the catalogue to add to
+   * @return boolean true if saved successfuly, false otherwise.
+   */
+  public function save($catalogue = 'messages')
+  {
+    $messages = $this->untranslated;
+    if (count($messages) <= 0)
+    {
+      return false;
+    }
+
+    $variants = $this->getVariants($catalogue);
+    if ($variants)
+    {
+      list($variant, $filename) = $variants;
+    }
+    else
+    {
+      return false;
+    }
+
+    if (is_writable($filename) == false)
+    {
+      throw new sfException("Unable to save to file {$filename}, file must be writable.");
+    }
+
+    // create a new dom, import the existing xml
+    $dom = DOMDocument::load($filename);
+
+    // find the body element
+    $xpath = new DomXPath($dom);
+    $body = $xpath->query('//body')->item(0);
+
+    $count = $xpath->query('//trans-unit')->length;
+
+    // for each message add it to the XML file using DOM
+    foreach ($messages as $message)
+    {
+      $unit = $dom->createElement('trans-unit');
+      $unit->setAttribute('id', ++$count);
+
+      $source = $dom->createElement('source', $message);
+      $target = $dom->createElement('target', '');
+
+      $unit->appendChild($dom->createTextNode("\n"));
+      $unit->appendChild($source);
+      $unit->appendChild($dom->createTextNode("\n"));
+      $unit->appendChild($target);
+      $unit->appendChild($dom->createTextNode("\n"));
+
+      $body->appendChild($dom->createTextNode("\n"));
+      $body->appendChild($unit);
+      $body->appendChild($dom->createTextNode("\n"));
+    }
+
+    $fileNode = $xpath->query('//file')->item(0);
+    $fileNode->setAttribute('date', @date('Y-m-d\TH:i:s\Z'));
+
+    // save it and clear the cache for this variant
+    $dom->save($filename);
+    if (!empty($this->cache))
+    {
+      $this->cache->clean($variant, $this->culture);
+    }
+
+    return true;
+  }
+
+  /**
+   * Update the translation.
+   *
+   * @param string the source string.
+   * @param string the new translation string.
+   * @param string comments
+   * @param string the catalogue to save to.
+   * @return boolean true if translation was updated, false otherwise.
+   */
+  public function update($text, $target, $comments, $catalogue = 'messages')
+  {
+    $variants = $this->getVariants($catalogue);
+    if ($variants)
+    {
+      list($variant, $filename) = $variants;
+    }
+    else
+    {
+      return false;
+    }
+
+    if (is_writable($filename) == false)
+    {
+      throw new sfException("Unable to update file {$filename}, file must be writable.");
+    }
+
+    // create a new dom, import the existing xml
+    $dom = DOMDocument::load($filename);
+
+    // find the body element
+    $xpath = new DomXPath($dom);
+    $units = $xpath->query('//trans-unit');
+
+    // for each of the existin units
+    foreach ($units as $unit)
+    {
+      $found = false;
+      $targetted = false;
+      $commented = false;
+
+      //in each unit, need to find the source, target and comment nodes
+      //it will assume that the source is before the target.
+      foreach ($unit->childNodes as $node)
+      {
+        // source node
+        if ($node->nodeName == 'source' && $node->firstChild->wholeText == $text)
+        {
+          $found = true;
+        }
+
+        // found source, get the target and notes
+        if ($found)
+        {
+          // set the new translated string
+          if ($node->nodeName == 'target')
+          {
+            $node->nodeValue = $target;
+            $targetted = true;
+          }
+
+          // set the notes
+          if (!empty($comments) && $node->nodeName == 'note')
+          {
+            $node->nodeValue = $comments;
+            $commented = true;
+          }
+        }
+      }
+
+      // append a target
+      if ($found && !$targetted)
+      {
+        $unit->appendChild($dom->createElement('target',$target));
+      }
+
+      // append a note
+      if ($found && !$commented && !empty($comments))
+      {
+        $unit->appendChild($dom->createElement('note',$comments));
+      }
+
+      // finished searching
+      if ($found)
+      {
+        break;
+      }
+    }
+
+    $fileNode = $xpath->query('//file')->item(0);
+    $fileNode->setAttribute('date', @date('Y-m-d\TH:i:s\Z'));
+
+    if ($dom->save($filename) > 0)
+    {
+      if (!empty($this->cache))
+      {
+        $this->cache->clean($variant, $this->culture);
+      }
+
+      return true;
+    }
+
+    return false;
+  }
+
+  /**
+   * Delete a particular message from the specified catalogue.
+   *
+   * @param string the source message to delete.
+   * @param string the catalogue to delete from.
+   * @return boolean true if deleted, false otherwise. 
+   */
+  public function delete($message, $catalogue='messages')
+  {
+    $variants = $this->getVariants($catalogue);
+    if ($variants)
+    {
+      list($variant, $filename) = $variants;
+    }
+    else
+    {
+      return false;
+    }
+
+    if (is_writable($filename) == false)
+    {
+      throw new sfException("Unable to modify file {$filename}, file must be writable.");
+    }
+
+    // create a new dom, import the existing xml
+    $dom = DOMDocument::load($filename);
+
+    // find the body element
+    $xpath = new DomXPath($dom);
+    $units = $xpath->query('//trans-unit');
+
+    // for each of the existin units
+    foreach ($units as $unit)
+    {
+      //in each unit, need to find the source, target and comment nodes
+      //it will assume that the source is before the target.
+      foreach ($unit->childNodes as $node)
+      {
+        // source node
+        if ($node->nodeName == 'source' && $node->firstChild->wholeText == $message)
+        {
+          // we found it, remove and save the xml file.
+          $unit->parentNode->removeChild($unit);
+
+          $fileNode = $xpath->query('//file')->item(0);
+          $fileNode->setAttribute('date', @date('Y-m-d\TH:i:s\Z'));
+
+          if ($dom->save($filename) > 0)
+          {
+            if (!empty($this->cache))
+            {
+              $this->cache->clean($variant, $this->culture);
+            }
+
+            return true;
+          }
+          else
+          {
+            return false;
+          }
+        }
+      }
+    }
+
+    return false;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_XLIFF.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_gettext.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_gettext.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_gettext.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,466 @@
+<?php
+
+/**
+ * sfMessageSource_gettext class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: sfMessageSource_gettext.class.php 3148 2007-01-04 19:34:28Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+
+/**
+ * sfMessageSource_gettext class.
+ * 
+ * Using Gettext MO format as the message source for translation.
+ * The gettext classes are based on PEAR's gettext MO and PO classes.
+ * 
+ * See the MessageSource::factory() method to instantiate this class.
+ * 
+ * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version v1.0, last update on Fri Dec 24 16:18:44 EST 2004
+ * @package System.I18N.core
+ */
+class sfMessageSource_gettext extends sfMessageSource
+{ 
+  /**
+   * Message data filename extension.
+   * @var string 
+   */
+  protected $dataExt = '.mo';
+
+  /**
+   * PO data filename extension
+   * @var string 
+   */
+  protected $poExt = '.po';
+
+  /**
+   * Separator between culture name and source.
+   * @var string 
+   */
+  protected $dataSeparator = '.';
+
+  function __construct($source)
+  {
+    $this->source = (string)$source;
+  }
+
+  /**
+   * Load the messages from a MO file.
+   *
+   * @param string MO file.
+   * @return array of messages.
+   */
+  protected function &loadData($filename)
+  {
+    $mo = TGettext::factory('MO',$filename);
+    $mo->load();
+    $result = $mo->toArray();
+
+    $results = array();
+    $count = 0;
+    foreach ($result['strings'] as $source => $target)
+    {
+      $results[$source][] = $target;  //target
+      $results[$source][] = $count++; //id
+      $results[$source][] = '';       //comments
+    }
+
+    return $results;
+  }
+
+  /**
+   * Determin if the MO file source is valid.
+   *
+   * @param string MO file
+   * @return boolean true if valid, false otherwise. 
+   */
+  protected function isValidSource($filename)
+  {
+    return is_file($filename);
+  }
+
+  /**
+   * Get the MO file for a specific message catalogue and cultural variant.
+   *
+   * @param string message catalogue
+   * @return string full path to the MO file. 
+   */
+  protected function getSource($variant)
+  {
+    return $this->source.'/'.$variant;
+  }
+
+  /**
+   * Get the last modified unix-time for this particular catalogue+variant.
+   * Just use the file modified time.
+   *
+   * @param string catalogue+variant
+   * @return int last modified in unix-time format.
+   */
+  protected function getLastModified($source)
+  {
+    return is_file($source) ? filemtime($source) : 0;
+  }
+
+  /**
+   * Get all the variants of a particular catalogue.
+   *
+   * @param string catalogue name
+   * @return array list of all variants for this catalogue.
+   */
+  protected function getCatalogueList($catalogue)
+  {
+    $variants = explode('_', $this->culture);
+    $source = $catalogue.$this->dataExt;
+
+    $catalogues = array($source);
+
+    $variant = null;
+
+    for ($i = 0, $max = count($variants); $i < $max; $i++)
+    {
+      if (strlen($variants[$i]) > 0)
+      {
+        $variant .= $variant ? '_'.$variants[$i] : $variants[$i];
+        $catalogues[] = $catalogue.$this->dataSeparator.$variant.$this->dataExt;
+      }
+    }
+    $byDir = $this->getCatalogueByDir($catalogue);
+    $catalogues = array_merge($byDir,array_reverse($catalogues));
+
+    return $catalogues;
+  }
+
+  /**
+   * Traverse through the directory structure to find the catalogues.
+   * This should only be called by getCatalogueList()
+   *
+   * @param string a particular catalogue.
+   * @return array a list of catalogues. 
+   * @see getCatalogueList()
+   */
+  protected function getCatalogueByDir($catalogue)
+  {
+    $variants = explode('_', $this->culture);
+    $catalogues = array();
+
+    $variant = null;
+
+    for($i = 0, $max = count($variants); $i < $max; $i++)
+    {
+      if (strlen($variants[$i]) > 0)
+      {
+        $variant .= $variant ? '_'.$variants[$i] : $variants[$i];
+        $catalogues[] = $variant.'/'.$catalogue.$this->dataExt;
+      }
+    }
+
+    return array_reverse($catalogues);
+  }
+
+  /**
+   * Get the variant for a catalogue depending on the current culture.
+   *
+   * @param string catalogue
+   * @return string the variant. 
+   * @see save()
+   * @see update()
+   * @see delete()
+   */
+  protected function getVariants($catalogue = 'messages')
+  {
+    if (empty($catalogue))
+    {
+      $catalogue = 'messages';
+    }
+
+    foreach ($this->getCatalogueList($catalogue) as $variant)
+    {
+      $file = $this->getSource($variant);
+      $po = $this->getPOFile($file);
+      if (is_file($file) || is_file($po))
+      {
+        return array($variant, $file, $po);
+      }
+    }
+
+    return false;
+  }
+
+  protected function getPOFile($MOFile)
+  {
+    return substr($MOFile, 0, strlen($MOFile) - strlen($this->dataExt)).$this->poExt;
+  }
+
+  /**
+   * Save the list of untranslated blocks to the translation source. 
+   * If the translation was not found, you should add those
+   * strings to the translation source via the <b>append()</b> method.
+   *
+   * @param string the catalogue to add to
+   * @return boolean true if saved successfuly, false otherwise.   
+   */
+  function save($catalogue='messages')
+  {
+    $messages = $this->untranslated;
+
+    if (count($messages) <= 0)
+    {
+      return false;
+    }
+
+    $variants = $this->getVariants($catalogue);
+
+    if ($variants)
+    {
+      list($variant, $MOFile, $POFile) = $variants;
+    }
+    else
+    {
+      return false;
+    }
+
+    if (is_writable($MOFile) == false)
+    {
+      throw new sfException("Unable to save to file {$MOFile}, file must be writable.");
+    }
+    if (is_writable($POFile) == false)
+    {
+      throw new sfException("Unable to save to file {$POFile}, file must be writable.");
+    }
+
+    // set the strings as untranslated.
+    $strings = array();
+    foreach ($messages as $message)
+    {
+      $strings[$message] = ''; 
+    }
+
+    // load the PO
+    $po = TGettext::factory('PO',$POFile);
+    $po->load();
+    $result = $po->toArray();
+
+    $existing = count($result['strings']);
+
+    // add to strings to the existing message list
+    $result['strings'] = array_merge($result['strings'],$strings);
+
+    $new = count($result['strings']);
+
+    if ($new > $existing)
+    {
+      // change the date 2004-12-25 12:26
+      $result['meta']['PO-Revision-Date'] = @date('Y-m-d H:i:s');
+
+      $po->fromArray($result);
+      $mo = $po->toMO();
+      if ($po->save() && $mo->save($MOFile))
+      {
+        if (!empty($this->cache))
+        {
+          $this->cache->clean($variant, $this->culture);
+        }
+
+        return true;
+      }
+      else
+      {
+        return false;
+      }
+    }
+
+    return false;
+  }
+
+  /**
+   * Delete a particular message from the specified catalogue.
+   *
+   * @param string the source message to delete.
+   * @param string the catalogue to delete from.
+   * @return boolean true if deleted, false otherwise. 
+   */
+  function delete($message, $catalogue = 'messages')
+  {
+    $variants = $this->getVariants($catalogue);
+    if ($variants)
+    {
+      list($variant, $MOFile, $POFile) = $variants;
+    }
+    else
+    {
+      return false;
+    }
+
+    if (is_writable($MOFile) == false)
+    {
+      throw new sfException("Unable to modify file {$MOFile}, file must be writable.");
+    }
+
+    if (is_writable($POFile) == false)
+    {
+      throw new sfException("Unable to modify file {$POFile}, file must be writable.");
+    }
+
+    $po = TGettext::factory('PO', $POFile);
+    $po->load();
+    $result = $po->toArray(); 
+
+    foreach ($result['strings'] as $string => $value)
+    {
+      if ($string == $message)
+      {
+        $result['meta']['PO-Revision-Date'] = @date('Y-m-d H:i:s');
+        unset($result['strings'][$string]);
+
+        $po->fromArray($result);
+        $mo = $po->toMO();
+        if ($po->save() && $mo->save($MOFile))
+        {
+          if (!empty($this->cache))
+          {
+            $this->cache->clean($variant, $this->culture);
+          }
+
+          return true;
+        }
+        else
+        {
+          return false;
+        }
+      }
+    }
+
+    return false;
+  }
+
+  /**
+   * Update the translation.
+   *
+   * @param string the source string.
+   * @param string the new translation string.
+   * @param string comments
+   * @param string the catalogue of the translation.
+   * @return boolean true if translation was updated, false otherwise.
+   */
+  function update($text, $target, $comments, $catalogue = 'messages')
+  {
+    $variants = $this->getVariants($catalogue);
+    if ($variants)
+    {
+      list($variant, $MOFile, $POFile) = $variants;
+    }
+    else
+    {
+      return false;
+    }
+
+    if (is_writable($MOFile) == false)
+    {
+      throw new sfException("Unable to update file {$MOFile}, file must be writable.");
+    }
+
+    if (is_writable($POFile) == false)
+    {
+      throw new sfException("Unable to update file {$POFile}, file must be writable.");
+    }
+
+    $po = TGettext::factory('PO',$POFile);
+    $po->load();
+    $result = $po->toArray();
+
+    foreach ($result['strings'] as $string => $value)
+    {
+      if ($string == $text)
+      {
+        $result['strings'][$string] = $target;
+        $result['meta']['PO-Revision-Date'] = @date('Y-m-d H:i:s');
+
+        $po->fromArray($result);
+        $mo = $po->toMO();
+
+        if ($po->save() && $mo->save($MOFile))
+        {
+          if (!empty($this->cache))
+          {
+            $this->cache->clean($variant, $this->culture);
+          }
+
+          return true;
+        }
+        else
+        {
+          return false;
+        }
+      }
+    }
+
+    return false;
+  }
+
+  /**
+   * Returns a list of catalogue as key and all it variants as value.
+   *
+   * @return array list of catalogues 
+   */
+  function catalogues()
+  {
+    return $this->getCatalogues();
+  }
+
+  /**
+   * Returns a list of catalogue and its culture ID. This takes care
+   * of directory structures.
+   * E.g. array('messages','en_AU')
+   *
+   * @return array list of catalogues 
+   */
+  protected function getCatalogues($dir=null,$variant=null)
+  {
+    $dir = $dir?$dir:$this->source;
+    $files = scandir($dir);
+
+    $catalogue = array();
+
+    foreach ($files as $file)
+    {
+      if (is_dir($dir.'/'.$file) && preg_match('/^[a-z]{2}(_[A-Z]{2,3})?$/',$file))
+      {
+        $catalogue = array_merge($catalogue, $this->getCatalogues($dir.'/'.$file, $file));
+      }
+
+      $pos = strpos($file,$this->dataExt);
+
+      if ($pos > 0 && substr($file, -1 * strlen($this->dataExt)) == $this->dataExt)
+      {
+        $name = substr($file,0,$pos);
+        $dot = strrpos($name,$this->dataSeparator);
+        $culture = $variant;
+        $cat = $name;
+        if (is_int($dot))
+        {
+          $culture = substr($name, $dot+1,strlen($name));
+          $cat = substr($name,0,$dot);
+        }
+        $details[0] = $cat;
+        $details[1] = $culture;
+
+        $catalogue[] = $details;
+      }
+    }
+    sort($catalogue);
+
+    return $catalogue;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfMessageSource_gettext.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfNumberFormat.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfNumberFormat.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfNumberFormat.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,316 @@
+<?php
+
+/**
+ * sfNumberFormat class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: sfNumberFormat.class.php 2834 2006-11-27 14:09:05Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+
+/**
+ * Get the encoding utilities
+ */
+require_once(dirname(__FILE__).'/util.php');
+
+/**
+ * sfNumberFormat class.
+ * 
+ * sfNumberFormat formats decimal numbers in any locale. The decimal
+ * number is formatted according to a particular pattern. These
+ * patterns can arise from the sfNumberFormatInfo object which is
+ * culturally sensitive. The sfNumberFormat class can be instantiated in
+ * many ways. E.g.
+ *
+ * <code>
+ *  //create a invariant number formatter.
+ *  $formatter = new sfNumberFormat();
+ * 
+ *  //create a number format for the french language locale.
+ *  $fr = new sfNumberFormat('fr');
+ *
+ *  //create a number format base on a sfNumberFormatInfo instance $numberInfo.
+ *  $format = new sfNumberFormat($numberInfo);
+ * </code>
+ *
+ * A normal decimal number can also be displayed as a currency 
+ * or as a percentage. For example
+ * <code>
+ * $format->format(1234.5); //Decimal number "1234.5"
+ * $format->format(1234.5,'c'); //Default currency "$1234.50"
+ * $format->format(0.25, 'p') //Percent "25%"
+ * </code>
+ *
+ * Currency is formated using the localized currency pattern. For example
+ * to format the number as Japanese Yen:
+ * <code>
+ *  $ja = new sfNumberFormat('ja_JP');
+ * 
+ *  //Japanese currency pattern, and using Japanese Yen symbol
+ *  $ja->format(123.14,'c','JPY'); //ï¿?123 (Yen 123)
+ * </code>
+ * For each culture, the symbol for each currency may be different.
+ * 
+ * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version v1.0, last update on Fri Dec 10 18:10:20 EST 2004
+ * @package System.I18N.core
+ */
+class sfNumberFormat
+{
+  /**
+   * The DateTimeFormatInfo, containing culture specific patterns and names.
+   * @var DateTimeFormatInfo   
+   */
+  protected $formatInfo;
+
+  /**
+   * Create a new number format instance. The constructor can be instantiated
+   * with a string that represent a culture/locale. Similarly, passing
+   * a sfCultureInfo or sfNumberFormatInfo instance will instantiated a instance
+   * for that particular culture. 
+   *
+   * @param mixed either null, a sfCultureInfo, a sfNumberFormatInfo, or string
+   * @return sfNumberFormat 
+   */
+  function __construct($formatInfo = null)
+  {
+    if (is_null($formatInfo))
+    {
+      $this->formatInfo = sfNumberFormatInfo::getInvariantInfo();
+    }
+    else if ($formatInfo instanceof sfCultureInfo)
+    {
+      $this->formatInfo = $formatInfo->sfNumberFormat;
+    }
+    else if ($formatInfo instanceof sfNumberFormatInfo)
+    {
+      $this->formatInfo = $formatInfo;
+    }
+    else
+    {
+      $this->formatInfo = sfNumberFormatInfo::getInstance($formatInfo);
+    }
+  }
+
+  /**
+   * For the number for a certain pattern. The valid patterns are
+   * 'c', 'd', 'e', 'p' or a custom pattern, such as "#.000" for
+   * 3 decimal places.
+   *
+   * @param mixed the number to format.
+   * @param string the format pattern, either, 'c', 'd', 'e', 'p'
+   * or a custom pattern. E.g. "#.000" will format the number to 
+   * 3 decimal places.
+   * @param string 3-letter ISO 4217 code. For example, the code 
+   * "USD" represents the US Dollar and "EUR" represents the Euro currency.
+   * @return string formatted number string 
+   */
+  function format($number, $pattern = 'd', $currency = 'USD', $charset = 'UTF-8')
+  {
+    $this->setPattern($pattern);
+
+    if (strtolower($pattern) == 'p')
+    {
+      $number = $number * 100;
+    }
+
+    $string = (string) $number;
+
+    list($number, $decimal) = $this->formatDecimal($string);
+    $integer = $this->formatInteger(abs($number));
+
+    $result = (strlen($decimal) > 0) ? $integer.$decimal : $integer;
+
+    // get the suffix
+    if ($number >= 0)
+    {
+      $suffix = $this->formatInfo->PositivePattern;
+    }
+    else if ($number < 0)
+    {
+      $suffix = $this->formatInfo->NegativePattern;
+    }
+    else
+    {
+      $suffix = array('', '');
+    }
+
+    // append and prepend suffix
+    $result = $suffix[0].$result.$suffix[1];
+
+    // replace currency sign
+    $symbol = @$this->formatInfo->getCurrencySymbol($currency);
+    if (is_null($symbol))
+    {
+      $symbol = $currency;
+    }
+
+    $result = str_replace('¤', $symbol, $result);
+
+    return I18N_toEncoding($result, $charset);
+  }
+
+  /**
+   * For the integer, perform groupings and string padding.
+   *
+   * @param string the decimal number in string form.
+   * @return string  formatted integer string with grouping
+   */
+  protected function formatInteger($string)
+  {
+    $string = (string) $string;
+    $dp = strpos($string, '.');
+
+    if (is_int($dp))
+    {
+      $string = substr($string, 0, $dp);
+    }
+
+    $integer = '';
+
+    $len = strlen($string);
+
+    $groupSeparator = $this->formatInfo->GroupSeparator;
+    $groupSize = $this->formatInfo->GroupSizes;
+
+    $firstGroup = true;
+    $multiGroup = is_int($groupSize[1]);
+    $count = 0;
+
+    if (is_int($groupSize[0]))
+    {
+      // now for the integer groupings
+      for ($i = 0; $i < $len; $i++)
+      {
+        $char = $string{$len - $i - 1};
+
+        if ($multiGroup && $count == 0)
+        {
+          if ($i != 0 && $i % $groupSize[0] == 0)
+          {
+            $integer = $groupSeparator.$integer;
+            $count++;
+          }
+        }
+        else if ($multiGroup && $count >= 1)
+        {
+          if ($i != 0 && ($i-$groupSize[0])%$groupSize[1] == 0)
+          {
+            $integer = $groupSeparator.$integer;
+            $count++;
+          }
+        }
+        else
+        {
+          if ($i != 0 && $i % $groupSize[0] == 0)
+          {
+            $integer = $groupSeparator.$integer;
+            $count++;
+          }
+        }
+
+        $integer = $char.$integer;
+      }
+    }
+    else
+    {
+      $integer = $string;
+    }
+
+    return $integer;
+  }
+
+  /**
+   * Format the decimal places.
+   *
+   * @param string the decimal number in string form.
+   * @return string formatted decimal places.
+   */
+  protected function formatDecimal($string)
+  {
+    $dp = strpos($string, '.');
+    $decimal = '';
+
+    $decimalDigits = $this->formatInfo->DecimalDigits;
+    $decimalSeparator = $this->formatInfo->DecimalSeparator;
+
+    if (is_int($dp))
+    {
+      if ($decimalDigits == -1)
+      {
+        $decimal = substr($string, $dp + 1);
+      }
+      else if (is_int($decimalDigits))
+      {
+        $string = $float = round((float)$string, $decimalDigits);
+        if (strpos((string)$float, '.') === false)
+        {
+          $decimal = str_pad($decimal, $decimalDigits, '0');
+        }
+        else
+        {
+          $decimal = substr($float, strpos($float,'.') + 1);
+          if (strlen($decimal)<$decimalDigits)
+          {
+            $decimal = str_pad($decimal, $decimalDigits, '0');
+          }
+        }
+      }
+      else
+      {
+        return array($string, $decimal);
+      }
+
+      return array($string, $decimalSeparator.$decimal);
+    }
+    else if ($decimalDigits > 0)
+    {
+      return array($string, $decimalSeparator.str_pad($decimal, $decimalDigits, '0'));
+    }
+
+    return array($string, $decimal);
+  }
+
+  /**
+   * Set the pattern to format against. The default patterns
+   * are retrieved from the sfNumberFormatInfo instance.
+   *
+   * @param string the requested patterns.
+   * @return string a number format pattern.
+   */
+  protected function setPattern($pattern)
+  {
+    switch ($pattern)
+    {
+      case 'c':
+      case 'C':
+        $this->formatInfo->setPattern(sfNumberFormatInfo::CURRENCY);
+        break;
+      case 'd':
+      case 'D':
+        $this->formatInfo->setPattern(sfNumberFormatInfo::DECIMAL);
+        break;
+      case 'e':
+      case 'E':
+        $this->formatInfo->setPattern(sfNumberFormatInfo::SCIENTIFIC);
+        break;
+      case 'p':
+      case 'P':
+        $this->formatInfo->setPattern(sfNumberFormatInfo::PERCENTAGE);
+        break;
+      default:
+        $this->formatInfo->setPattern($pattern);
+        break;
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfNumberFormat.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfNumberFormatInfo.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfNumberFormatInfo.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfNumberFormatInfo.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,681 @@
+<?php
+
+/**
+ * sfNumberFormatInfo class file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Qiang Xue. All rights reserved.
+ *
+ * To contact the author write to {@link mailto:qiang.xue en gmail.com Qiang Xue}
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: sfNumberFormatInfo.class.php 2834 2006-11-27 14:09:05Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+ 
+/**
+ * sfNumberFormatInfo class
+ * 
+ * Defines how numeric values are formatted and displayed,
+ * depending on the culture. Numeric values are formatted using
+ * standard or custom patterns stored in the properties of a 
+ * sfNumberFormatInfo. 
+ *
+ * This class contains information, such as currency, decimal 
+ * separators, and other numeric symbols.
+ *
+ * To create a sfNumberFormatInfo for a specific culture, 
+ * create a sfCultureInfo for that culture and retrieve the
+ * sfCultureInfo->NumberFormat property. Or use 
+ * sfNumberFormatInfo::getInstance($culture).
+ * To create a sfNumberFormatInfo for the invariant culture, use the 
+ * InvariantInfo::getInvariantInfo(). 
+ *
+ *
+ * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version v1.0, last update on Sun Dec 05 14:48:26 EST 2004
+ * @package System.I18N.core
+ */
+class sfNumberFormatInfo
+{
+  /**
+   * ICU number formatting data.
+   * @var array
+   */
+  protected $data = array();
+
+  /**
+   * A list of properties that are accessable/writable.
+   * @var array
+   */
+  protected $properties = array();
+
+  /**
+   * The number pattern.
+   * @var array
+   */
+  protected $pattern = array();
+
+  const DECIMAL = 0;
+  const CURRENCY = 1;
+  const PERCENTAGE = 2;
+  const SCIENTIFIC = 3;
+
+  /**
+   * Allow functions that begins with 'set' to be called directly
+   * as an attribute/property to retrieve the value.
+   *
+   * @return mixed
+   */
+  function __get($name)
+  {
+    $getProperty = 'get'.$name;
+    if (in_array($getProperty, $this->properties))
+    {
+      return $this->$getProperty();
+    }
+    else
+    {
+      throw new sfException('Property '.$name.' does not exists.');
+    }
+  }
+
+  /**
+   * Allow functions that begins with 'set' to be called directly
+   * as an attribute/property to set the value.
+   */
+  function __set($name, $value) 
+  {
+    $setProperty = 'set'.$name;
+    if (in_array($setProperty, $this->properties))
+    {
+      $this->$setProperty($value);
+    }
+    else
+    {
+      throw new sfException('Property '.$name.' can not be set.');
+    }
+  }
+
+  /**
+   * Initializes a new writable instance of the sfNumberFormatInfo class 
+   * that is dependent on the ICU data for number, decimal, and currency
+   * formatting information. <b>N.B.</b>You should not initialize this 
+   * class directly unless you know what you are doing. Please use use 
+   * sfNumberFormatInfo::getInstance() to create an instance.
+   *
+   * @param array ICU data for date time formatting.
+   * @see getInstance()
+   */
+  function __construct($data = array(), $type = sfNumberFormatInfo::DECIMAL)
+  {
+    $this->properties = get_class_methods($this);
+
+    if (empty($data))
+    {
+      throw new sfException('Please provide the ICU data to initialize.');
+    }
+
+    $this->data = $data;
+
+    $this->setPattern($type);
+  }
+
+  /**
+   * Set the pattern for a specific number pattern. The validate patterns
+   * sfNumberFormatInfo::DECIMAL, sfNumberFormatInfo::CURRENCY,
+   * sfNumberFormatInfo::PERCENTAGE, or sfNumberFormatInfo::SCIENTIFIC
+   *
+   * @param int pattern type.
+   */
+  function setPattern($type = sfNumberFormatInfo::DECIMAL)
+  {
+    if (is_int($type))
+    {
+      $this->pattern = $this->parsePattern($this->data['NumberPatterns'][$type]);
+    }
+    else
+    {
+      $this->pattern = $this->parsePattern($type);
+    }
+
+    $this->pattern['negInfty'] = $this->data['NumberElements'][6].$this->data['NumberElements'][9];
+
+    $this->pattern['posInfty'] = $this->data['NumberElements'][11].$this->data['NumberElements'][9];
+  }
+
+  function getPattern()
+  {
+    return $this->pattern;
+  }
+
+  /**
+   * Gets the default sfNumberFormatInfo that is culture-independent (invariant).
+   *
+   * @return sfNumberFormatInfo default sfNumberFormatInfo. 
+   */
+  public function getInvariantInfo($type = sfNumberFormatInfo::DECIMAL)
+  {
+    static $invariant;
+    if (is_null($invariant))
+    {
+      $culture = sfCultureInfo::getInvariantCulture();
+      $invariant = $culture->NumberFormat;
+      $invariant->setPattern($type);
+    }
+
+    return $invariant;
+  }
+
+  /**
+   * Returns the sfNumberFormatInfo associated with the specified culture.
+   *
+   * @param sfCultureInfo the culture that gets the sfNumberFormat property.
+   * @param int the number formatting type, it should be 
+   * sfNumberFormatInfo::DECIMAL, sfNumberFormatInfo::CURRENCY,
+   * sfNumberFormatInfo::PERCENTAGE, or sfNumberFormatInfo::SCIENTIFIC
+   * @return sfNumberFormatInfo sfNumberFormatInfo for the specified culture.
+   * @see getCurrencyInstance();
+   * @see getPercentageInstance();
+   * @see getScientificInstance();
+   */
+  public static function getInstance($culture = null, $type = sfNumberFormatInfo::DECIMAL)
+  {
+    if ($culture instanceof sfCultureInfo)
+    {
+      $formatInfo = $culture->getNumberFormat();
+      $formatInfo->setPattern($type);
+
+      return $formatInfo;
+    }
+    else if (is_string($culture))
+    {
+      $sfCultureInfo = new sfCultureInfo($culture);
+      $formatInfo = $sfCultureInfo->getNumberFormat();
+      $formatInfo->setPattern($type);
+
+      return $formatInfo;
+    }
+    else
+    {
+      $sfCultureInfo = new sfCultureInfo();
+      $formatInfo = $sfCultureInfo->getNumberFormat();
+      $formatInfo->setPattern($type);
+
+      return $formatInfo;
+    }
+  }
+
+  /**
+   * Returns the currency format info associated with the specified culture.
+   *
+   * @param sfCultureInfo the culture that gets the NumberFormat property.
+   * @return sfNumberFormatInfo sfNumberFormatInfo for the specified culture.
+   */
+  public static function getCurrencyInstance($culture = null)
+  {
+    return self::getInstance($culture, self::CURRENCY);
+  }
+
+  /**
+   * Returns the percentage format info associated with the specified culture.
+   *
+   * @param sfCultureInfo the culture that gets the NumberFormat property.
+   * @return sfNumberFormatInfo sfNumberFormatInfo for the specified culture. 
+   */
+  public static function getPercentageInstance($culture = null)
+  {
+    return self::getInstance($culture, self::PERCENTAGE);
+  }
+
+  /**
+   * Returns the scientific format info associated with the specified culture.
+   *
+   * @param sfCultureInfo the culture that gets the NumberFormat property.
+   * @return sfNumberFormatInfo sfNumberFormatInfo for the specified culture. 
+   */
+  public static function getScientificInstance($culture = null)
+  {
+    return self::getInstance($culture, self::SCIENTIFIC);
+  }
+
+  /**
+   * Parse the given pattern and return a list of known properties.
+   *
+   * @param string a number pattern.
+   * @return array list of pattern properties.
+   */
+  protected function parsePattern($pattern)
+  {
+    $pattern = explode(';', $pattern);
+
+    $negative = null;
+    if (count($pattern) > 1)
+    {
+      $negative = $pattern[1];
+    }
+    $pattern = $pattern[0];
+
+    $comma = ',';
+    $dot = '.';
+    $digit = '0';
+    $hash = '#';
+
+    // find the first group point, and decimal point
+    $groupPos1 = strrpos($pattern, $comma);
+    $decimalPos = strrpos($pattern, $dot);
+
+    $groupPos2 = false;
+    $groupSize1 = false;
+    $groupSize2 = false;
+    $decimalPoints = is_int($decimalPos) ? -1 : false;
+
+    $info['negPref'] = $this->data['NumberElements'][6];
+    $info['negPost'] = '';
+
+    $info['negative'] = $negative;
+    $info['positive'] = $pattern;
+
+    // find the negative prefix and postfix
+    if ($negative)
+    {
+      $prefixPostfix = $this->getPrePostfix($negative);
+      $info['negPref'] = $prefixPostfix[0];
+      $info['negPost'] = $prefixPostfix[1];
+    }
+
+    $posfix = $this->getPrePostfix($pattern);
+    $info['posPref'] = $posfix[0];
+    $info['posPost'] = $posfix[1];
+
+    if (is_int($groupPos1))
+    {
+      // get the second group
+      $groupPos2 = strrpos(substr($pattern, 0, $groupPos1), $comma);
+
+      // get the number of decimal digits
+      if (is_int($decimalPos))
+      {
+        $groupSize1 = $decimalPos - $groupPos1 - 1;
+      }
+      else
+      {
+        // no decimal point, so traverse from the back
+        // to find the groupsize 1.
+        for ($i = strlen($pattern) - 1; $i >= 0; $i--)
+        {
+          if ($pattern{$i} == $digit || $pattern{$i} == $hash)
+          {
+            $groupSize1 = $i - $groupPos1;
+            break;
+          }
+        }
+      }
+
+      // get the second group size
+      if (is_int($groupPos2))
+      {
+        $groupSize2 = $groupPos1 - $groupPos2 - 1;
+      }
+    }
+
+    if (is_int($decimalPos))
+    {
+      for ($i = strlen($pattern) - 1; $i >= 0; $i--)
+      {
+        if ($pattern{$i} == $dot)
+        {
+          break;
+        }
+        if ($pattern{$i} == $digit)
+        {
+          $decimalPoints = $i - $decimalPos;
+          break;
+        }
+      }
+    }
+
+    $info['groupPos1']     = $groupPos1;
+    $info['groupSize1']    = $groupSize1;
+    $info['groupPos2']     = $groupPos2;
+    $info['groupSize2']    = $groupSize2;
+    $info['decimalPos']    = $decimalPos;
+    $info['decimalPoints'] = $decimalPoints;
+
+    return $info;
+  }
+
+  /**
+   * Get the prefix and postfix of a pattern.
+   *
+   * @param string pattern
+   * @return array of prefix and postfix, array(prefix,postfix). 
+   */
+  protected function getPrePostfix($pattern)
+  {
+    $regexp = '/[#,\.0]+/';
+    $result = preg_split($regexp, $pattern);
+
+    return array($result[0], $result[1]);
+  }
+
+  /**
+   * Indicates the number of decimal places.
+   *
+   * @return int number of decimal places.
+   */
+  function getDecimalDigits()
+  {
+    return $this->pattern['decimalPoints'];
+  }
+
+  /**
+   * Set the number of decimal places.
+   *
+   * @param int number of decimal places.
+   */
+  function setDecimalDigits($value)
+  {
+    return $this->pattern['decimalPoints'] = $value;
+  }
+
+  /**
+   * Gets the string to use as the decimal separator.
+   *
+   * @return string decimal separator.
+   */
+  function getDecimalSeparator()
+  {
+    return $this->data['NumberElements'][0];
+  }
+
+  /**
+   * Set the string to use as the decimal separator.
+   *
+   * @param string the decimal point
+   */
+  function setDecimalSeparator($value)
+  {
+    return $this->data['NumberElements'][0] = $value;
+  }
+
+  /**
+   * Gets the string that separates groups of digits to the left 
+   * of the decimal in currency values.
+   *
+   * @param parameter
+   * @return string currency group separator. 
+   */
+  function getGroupSeparator()
+  {
+    return $this->data['NumberElements'][1];
+  }
+
+  /**
+   * Set the string to use as the group separator.
+   *
+   * @param string the group separator.
+   */
+  function setGroupSeparator($value)
+  {
+    return $this->data['NumberElements'][1] = $value;
+  }
+
+  /**
+   * Gets the number of digits in each group to the left of the decimal
+   * There can be two grouping sizes, this fucntion
+   * returns <b>array(group1, group2)</b>, if there is only 1 grouping size,
+   * group2 will be false.
+   *
+   * @return array grouping size(s). 
+   */
+  function getGroupSizes()
+  {
+    $group1 = $this->pattern['groupSize1'];
+    $group2 = $this->pattern['groupSize2'];
+
+    return array($group1, $group2);
+  }
+
+  /**
+   * Set the number of digits in each group to the left of the decimal.
+   * There can be two grouping sizes, the value should
+   * be an <b>array(group1, group2)</b>, if there is only 1 grouping size,
+   * group2 should be false.
+   *
+   * @param array grouping size(s).
+   */
+  function setGroupSizes($groupSize)
+  {
+    $this->pattern['groupSize1'] = $groupSize[0];
+    $this->pattern['groupSize2'] = $groupSize[1];
+  }
+
+  /**
+   * Gets the format pattern for negative values.
+   * The negative pattern is composed of a prefix, and postfix.
+   * This function returns <b>array(prefix, postfix)</b>.
+   *
+   * @return arary negative pattern. 
+   */
+  function getNegativePattern()
+  {
+    $prefix = $this->pattern['negPref'];
+    $postfix = $this->pattern['negPost'];
+
+    return array($prefix, $postfix);
+  }
+
+  /**
+   * Set the format pattern for negative values.
+   * The negative pattern is composed of a prefix, and postfix in the form
+   * <b>array(prefix, postfix)</b>.
+   *
+   * @param arary negative pattern. 
+   */
+  function setNegativePattern($pattern)
+  {
+    $this->pattern['negPref'] = $pattern[0];
+    $this->pattern['negPost'] = $pattern[1];
+  }
+
+  /**
+   * Gets the format pattern for positive values.
+   * The positive pattern is composed of a prefix, and postfix.
+   * This function returns <b>array(prefix, postfix)</b>.
+   *
+   * @return arary positive pattern. 
+   */
+  function getPositivePattern()
+  {
+    $prefix = $this->pattern['posPref'];
+    $postfix = $this->pattern['posPost'];
+
+    return array($prefix, $postfix);
+  }
+
+  /**
+   * Set the format pattern for positive values.
+   * The positive pattern is composed of a prefix, and postfix in the form
+   * <b>array(prefix, postfix)</b>.
+   *
+   * @param arary positive pattern. 
+   */
+  function setPositivePattern($pattern)
+  {
+    $this->pattern['posPref'] = $pattern[0];
+    $this->pattern['posPost'] = $pattern[1];
+  }
+
+  /**
+   * Gets the string to use as the currency symbol.
+   *
+   * @return string currency symbol. 
+   */
+  function getCurrencySymbol($currency = 'USD')
+  {
+    if (isset($this->pattern['symbol']))
+    {
+      return $this->pattern['symbol'];
+    }
+    else
+    {
+      return $this->data['Currencies'][$currency][0];
+    }
+  }
+
+  /**
+   * Set the string to use as the currency symbol.
+   *
+   * @param string currency symbol.
+   */
+  function setCurrencySymbol($symbol)
+  {
+    $this->pattern['symbol'] = $symbol;
+  }
+
+  /**
+   * Gets the string that represents negative infinity.
+   *
+   * @return string negative infinity.
+   */
+  function getNegativeInfinitySymbol()
+  {
+    return $this->pattern['negInfty'];
+  }
+
+  /**
+   * Set the string that represents negative infinity.
+   *
+   * @param string negative infinity. 
+   */
+  function setNegativeInfinitySymbol($value)
+  {
+    $this->pattern['negInfty'] = $value;
+  }
+
+  /**
+   * Gets the string that represents positive infinity.
+   *
+   * @return string positive infinity. 
+   */
+  function getPositiveInfinitySymbol()
+  {
+    return $this->pattern['posInfty'];
+  }
+
+  /**
+   * Set the string that represents positive infinity.
+   *
+   * @param string positive infinity. 
+   */
+  function setPositiveInfinitySymbol($value)
+  {
+    $this->pattern['posInfty'] = $value;
+  }
+
+  /**
+   * Gets the string that denotes that the associated number is negative.
+   *
+   * @return string negative sign. 
+   */
+  function getNegativeSign()
+  {
+    return $this->data['NumberElements'][6];
+  }
+
+  /**
+   * Set the string that denotes that the associated number is negative.
+   *
+   * @param string negative sign. 
+   */
+  function setNegativeSign($value)
+  {
+    $this->data['NumberElements'][6] = $value;
+  }
+
+  /**
+   * Gets the string that denotes that the associated number is positive.
+   *
+   * @return string positive sign. 
+   */
+  function getPositiveSign()
+  {
+    return $this->data['NumberElements'][11];
+  }
+
+  /**
+   * Set the string that denotes that the associated number is positive.
+   *
+   * @param string positive sign. 
+   */
+  function setPositiveSign($value)
+  {
+    $this->data['NumberElements'][11] = $value;
+  }
+
+  /**
+   * Gets the string that represents the IEEE NaN (not a number) value.
+   *
+   * @return string NaN symbol.
+   */
+  function getNaNSymbol()
+  {
+    return $this->data['NumberElements'][10];
+  }
+
+  /**
+   * Set the string that represents the IEEE NaN (not a number) value.
+   *
+   * @param string NaN symbol.
+   */
+  function setNaNSymbol($value)
+  {
+    $this->data['NumberElements'][10] = $value;
+  }
+
+  /**
+   * Gets the string to use as the percent symbol.
+   *
+   * @return string percent symbol.
+   */
+  function getPercentSymbol()
+  {
+    return $this->data['NumberElements'][3];
+  }
+
+  /**
+   * Set the string to use as the percent symbol.
+   *
+   * @param string percent symbol.
+   */
+  function setPercentSymbol($value)
+  {
+    $this->data['NumberElements'][3] = $value;
+  }
+
+  /**
+   * Gets the string to use as the per mille symbol.
+   *
+   * @return string percent symbol.
+   */
+  function getPerMilleSymbol()
+  {
+    return $this->data['NumberElements'][8];
+  }
+
+  /**
+   * Set the string to use as the per mille symbol.
+   *
+   * @param string percent symbol.
+   */
+  function setPerMilleSymbol($value)
+  {
+    $this->data['NumberElements'][8] = $value;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/sfNumberFormatInfo.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/util.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/util.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/util.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,177 @@
+<?php
+
+/**
+ * I18N Utility file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the BSD License.
+ *
+ * Copyright(c) 2004 by Wei Zhuo. All rights reserved.
+ *
+ * To contact the author write to <weizhuo[at]gmail[dot]com>
+ * The latest version of PRADO can be obtained from:
+ * {@link http://prado.sourceforge.net/}
+ *
+ * @author     Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version    $Id: util.php 2757 2006-11-18 10:11:00Z fabien $
+ * @package    symfony
+ * @subpackage i18n
+ */
+
+
+  /**
+   * For a given DSN (database connection string), return some information
+   * about the DSN. This function comes from PEAR's DB package.
+   * @param string DSN format, similar to PEAR's DB
+   * @return array DSN information. 
+   */
+    function parseDSN($dsn)
+    {
+        if (is_array($dsn)) {
+            return $dsn;
+        }
+
+        $parsed = array(
+            'phptype'  => false,
+            'dbsyntax' => false,
+            'username' => false,
+            'password' => false,
+            'protocol' => false,
+            'hostspec' => false,
+            'port'     => false,
+            'socket'   => false,
+            'database' => false
+        );
+
+        // Find phptype and dbsyntax
+        if (($pos = strpos($dsn, '://')) !== false) {
+            $str = substr($dsn, 0, $pos);
+            $dsn = substr($dsn, $pos + 3);
+        } else {
+            $str = $dsn;
+            $dsn = NULL;
+        }
+
+        // Get phptype and dbsyntax
+        // $str => phptype(dbsyntax)
+        if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) {
+            $parsed['phptype']  = $arr[1];
+            $parsed['dbsyntax'] = (empty($arr[2])) ? $arr[1] : $arr[2];
+        } else {
+            $parsed['phptype']  = $str;
+            $parsed['dbsyntax'] = $str;
+        }
+
+        if (empty($dsn)) {
+            return $parsed;
+        }
+
+        // Get (if found): username and password
+        // $dsn => username:password en protocol+hostspec/database
+        if (($at = strrpos($dsn,'@')) !== false) {
+            $str = substr($dsn, 0, $at);
+            $dsn = substr($dsn, $at + 1);
+            if (($pos = strpos($str, ':')) !== false) {
+                $parsed['username'] = rawurldecode(substr($str, 0, $pos));
+                $parsed['password'] = rawurldecode(substr($str, $pos + 1));
+            } else {
+                $parsed['username'] = rawurldecode($str);
+            }
+        }
+
+        // Find protocol and hostspec
+
+        // $dsn => proto(proto_opts)/database
+        if (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)) {
+            $proto       = $match[1];
+            $proto_opts  = (!empty($match[2])) ? $match[2] : false;
+            $dsn         = $match[3];
+
+        // $dsn => protocol+hostspec/database (old format)
+        } else {
+            if (strpos($dsn, '+') !== false) {
+                list($proto, $dsn) = explode('+', $dsn, 2);
+            }
+            if (strpos($dsn, '/') !== false) {
+                list($proto_opts, $dsn) = explode('/', $dsn, 2);
+            } else {
+                $proto_opts = $dsn;
+                $dsn = null;
+            }
+        }
+
+        // process the different protocol options
+        $parsed['protocol'] = (!empty($proto)) ? $proto : 'tcp';
+        $proto_opts = rawurldecode($proto_opts);
+        if ($parsed['protocol'] == 'tcp') {
+            if (strpos($proto_opts, ':') !== false) {
+                list($parsed['hostspec'], $parsed['port']) = explode(':', $proto_opts);
+            } else {
+                $parsed['hostspec'] = $proto_opts;
+            }
+        } elseif ($parsed['protocol'] == 'unix') {
+            $parsed['socket'] = $proto_opts;
+        }
+
+        // Get dabase if any
+        // $dsn => database
+        if (!empty($dsn)) {
+            // /database
+            if (($pos = strpos($dsn, '?')) === false) {
+                $parsed['database'] = $dsn;
+            // /database?param1=value1&param2=value2
+            } else {
+                $parsed['database'] = substr($dsn, 0, $pos);
+                $dsn = substr($dsn, $pos + 1);
+                if (strpos($dsn, '&') !== false) {
+                    $opts = explode('&', $dsn);
+                } else { // database?param1=value1
+                    $opts = array($dsn);
+                }
+                foreach ($opts as $opt) {
+                    list($key, $value) = explode('=', $opt);
+                    if (!isset($parsed[$key])) { // don't allow params overwrite
+                        $parsed[$key] = rawurldecode($value);
+                    }
+                }
+            }
+        }
+
+        return $parsed;
+    }
+
+  /**
+   * Convert strings to UTF-8 via iconv. NB, the result may not by UTF-8 
+   * if the conversion failed.
+   * @param string string to convert to UTF-8
+   * @return string UTF-8 encoded string, original string if iconv failed.
+   */
+  function I18N_toUTF8($string, $from)
+  {
+    $from = strtoupper($from);
+    if ($from != 'UTF-8')
+    {
+      $s = iconv($from,'UTF-8',$string); //to UTF-8
+      return $s !== false ? $s : $string; //it could return false
+    }
+
+    return $string;
+  }
+
+  /** 
+   * Convert UTF-8 strings to a different encoding. NB. The result
+   * may not have been encoded if iconv fails.
+   * @param string the UTF-8 string for conversion
+   * @return string encoded string.
+   */
+  function I18N_toEncoding($string, $to)
+  {
+    $to = strtoupper($to);
+    if ($to != 'UTF-8')
+    {
+      $s = iconv('UTF-8', $to, $string);
+      return $s !== false ? $s : $string;
+    }
+
+    return $string;
+  }


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/i18n/util.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogManager.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogManager.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogManager.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,113 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Log manager
+ *
+ * @package    symfony
+ * @subpackage log
+ * @author     Joe Simms
+ * @version    SVN: $Id: sfLogManager.class.php 3329 2007-01-23 08:29:34Z fabien $
+ **/
+class sfLogManager
+{
+  /** the default period to rotate logs in days */
+  const DEF_PERIOD    = 7;
+
+  /** the default number of log historys to store, one history is created for every period */
+  const DEF_HISTORY   = 10;
+
+  /**
+   * Rotates log file.
+   *
+   * @param string Application name
+   * @param string Enviroment name
+   * @param string Period 
+   * @param string History
+   * @param boolean Override
+   *
+   * @author Joe Simms
+   **/
+  public static function rotate($app, $env, $period = null, $history = null, $override = false)
+  {
+    $logfile = $app.'_'.$env;
+    $logdir = sfConfig::get('sf_log_dir');
+
+    // set history and period values if not passed to default values
+    $period = isset($period) ? $period : self::DEF_PERIOD;
+    $history = isset($history) ? $history : self::DEF_HISTORY;
+
+    // get todays date
+    $today = date('Ymd');
+
+    // check history folder exists
+    if (!is_dir($logdir.'/history'))
+    {
+      mkdir($logdir.'/history', 0777);
+    }
+
+    // determine date of last rotation
+    $logs = sfFinder::type('file')->ignore_version_control()->maxdepth(1)->name($logfile.'_*.log')->in($logdir.'/history/');
+    $recentlog = is_array($logs) ? array_pop($logs) : null;
+
+    if ($recentlog)
+    {
+      // calculate date to rotate logs on
+      $last_rotated_on = filemtime($recentlog);
+      $rotate_on = date('Ymd', strtotime('+ '.$period.' days', $last_rotated_on));
+    }
+    else
+    {
+      // no rotation has occured yet
+      $rotate_on = null;
+    }
+
+    $src_log = $logdir.'/'.$logfile.'.log';
+    $dest_log = $logdir.'/history/'.$logfile.'_'.$today.'.log';
+
+    // if rotate log on date doesn't exist, or that date is today, then rotate the log
+    if (!$rotate_on || ($rotate_on == $today) || $override)
+    {
+      // create a lock file
+      $lock_name = $app.'_'.$env.'.lck';
+      touch(sfConfig::get('sf_root_dir').'/'.$lock_name);
+
+      // if log file exists rotate it
+      if (file_exists($src_log))
+      {
+        // check if the log file has already been rotated today
+        if (file_exists($dest_log))
+        {
+          // append log to existing rotated log
+          $handle = fopen($dest_log, 'a');
+          $append = file_get_contents($src_log);
+          fwrite($handle, $append);
+        }
+        else
+        {
+          // copy log
+          copy($src_log, $dest_log);
+        }
+
+        // remove the log file
+        unlink($src_log);
+
+        // get all log history files for this application and environment
+        $new_logs = sfFinder::type('file')->ignore_version_control()->maxdepth(1)->name($logfile.'_*.log')->in($logdir.'/history/');
+
+        // if the number of logs in history exceeds history then remove the oldest log
+        if (count($new_logs) > $history)
+        {
+          unlink($new_logs[0]);
+        }
+      }
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogManager.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger/sfFileLogger.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger/sfFileLogger.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger/sfFileLogger.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage log
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfFileLogger.class.php 3329 2007-01-23 08:29:34Z fabien $
+ */
+class sfFileLogger
+{
+  protected
+    $fp = null;
+
+  /**
+   * Initializes the file logger.
+   *
+   * @param array Options for the logger
+   */
+  public function initialize($options = array())
+  {
+    if (!isset($options['file']))
+    {
+      throw new sfConfigurationException('File option is mandatory for a file logger');
+    }
+
+    $dir = dirname($options['file']);
+
+    if (!is_dir($dir))
+    {
+      mkdir($dir, 0777, 1);
+    }
+
+    if (!is_writable($dir) || (file_exists($options['file']) && !is_writable($options['file'])))
+    {
+      throw new sfFileException(sprintf('Unable to open the log file "%s" for writing', $options['file']));
+    }
+
+    $this->fp = fopen($options['file'], 'a');
+  }
+
+  /**
+   * Logs a message.
+   *
+   * @param string Message
+   * @param string Message priority
+   * @param string Message priority name
+   */
+  public function log($message, $priority, $priorityName)
+  {
+    $line = sprintf("%s %s [%s] %s%s", strftime('%b %d %H:%M:%S'), 'symfony', $priorityName, $message, DIRECTORY_SEPARATOR == '\\' ? "\r\n" : "\n");
+
+    flock($this->fp, LOCK_EX);
+    fwrite($this->fp, $line);
+    flock($this->fp, LOCK_UN);
+  }
+
+  /**
+   * Executes the shutdown method.
+   */
+  public function shutdown()
+  {
+    if ($this->fp)
+    {
+      fclose($this->fp);
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger/sfFileLogger.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger/sfWebDebugLogger.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger/sfWebDebugLogger.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger/sfWebDebugLogger.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage log
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfWebDebugLogger.class.php 3329 2007-01-23 08:29:34Z fabien $
+ */
+class sfWebDebugLogger
+{
+  protected
+    $webDebug = null;
+
+  /**
+   * Initializes the web debug logger.
+   *
+   * @param array Logger options
+   */
+  public function initialize($options = array())
+  {
+    if (!sfConfig::get('sf_web_debug'))
+    {
+      return;
+    }
+
+    $this->webDebug = sfWebDebug::getInstance();
+  }
+
+  /**
+   * Logs a message.
+   *
+   * @param string Message
+   * @param string Message priority
+   * @param string Message priority name
+   */
+  public function log($message, $priority, $priorityName)
+  {
+    if (!sfConfig::get('sf_web_debug'))
+    {
+      return;
+    }
+
+    // if we have xdebug, add some stack information
+    $debug_stack = array();
+    if (function_exists('xdebug_get_function_stack'))
+    {
+      foreach (xdebug_get_function_stack() as $i => $stack)
+      {
+        if (
+          (isset($stack['function']) && !in_array($stack['function'], array('emerg', 'alert', 'crit', 'err', 'warning', 'notice', 'info', 'debug', 'log')))
+          || !isset($stack['function'])
+        )
+        {
+          $tmp = '';
+          if (isset($stack['function']))
+          {
+            $tmp .= 'in "'.$stack['function'].'" ';
+          }
+          $tmp .= 'from "'.$stack['file'].'" line '.$stack['line'];
+          $debug_stack[] = $tmp;
+        }
+      }
+    }
+
+    // get log type in {}
+    $type = 'sfOther';
+    if (preg_match('/^\s*{([^}]+)}\s*(.+?)$/', $message, $matches))
+    {
+      $type    = $matches[1];
+      $message = $matches[2];
+    }
+
+    // build the object containing the complete log information.
+    $logEntry = array(
+      'priority'       => $priority,
+      'priorityString' => $priorityName,
+      'time'           => time(),
+      'message'        => $message,
+      'type'           => $type,
+      'debugStack'     => $debug_stack,
+    );
+
+    // send the log object.
+    $this->webDebug->log($logEntry);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger/sfWebDebugLogger.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,242 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+define('SF_LOG_EMERG',   0); // System is unusable
+define('SF_LOG_ALERT',   1); // Immediate action required
+define('SF_LOG_CRIT',    2); // Critical conditions
+define('SF_LOG_ERR',     3); // Error conditions
+define('SF_LOG_WARNING', 4); // Warning conditions
+define('SF_LOG_NOTICE',  5); // Normal but significant
+define('SF_LOG_INFO',    6); // Informational
+define('SF_LOG_DEBUG',   7); // Debug-level messages
+
+/**
+ * sfLogger manages all logging in symfony projects.
+ *
+ * sfLogger can be configuration via the logging.yml configuration file.
+ * Loggers can also be registered directly in the logging.yml configuration file.
+ *
+ * This level list is ordered by highest priority (SF_LOG_EMERG) to lowest priority (SF_LOG_DEBUG):
+ * - EMERG:   System is unusable
+ * - ALERT:   Immediate action required
+ * - CRIT:    Critical conditions
+ * - ERR:     Error conditions
+ * - WARNING: Warning conditions
+ * - NOTICE:  Normal but significant
+ * - INFO:    Informational
+ * - DEBUG:   Debug-level messages
+ *
+ * @package    symfony
+ * @subpackage log
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfLogger.class.php 3329 2007-01-23 08:29:34Z fabien $
+ */
+class sfLogger
+{
+  protected
+    $loggers = array(),
+    $level   = SF_LOG_EMERG,
+    $levels  = array(
+      SF_LOG_EMERG   => 'emerg',
+      SF_LOG_ALERT   => 'alert',
+      SF_LOG_CRIT    => 'crit',
+      SF_LOG_ERR     => 'err',
+      SF_LOG_WARNING => 'warning',
+      SF_LOG_NOTICE  => 'notice',
+      SF_LOG_INFO    => 'info',
+      SF_LOG_DEBUG   => 'debug',
+    );
+
+  protected static
+    $logger = null;
+
+  /**
+   * Returns the sfLogger instance.
+   *
+   * @return  object the sfLogger instance
+   */
+  public static function getInstance()
+  {
+    if (!sfLogger::$logger)
+    {
+      // the class exists
+      $class = __CLASS__;
+      sfLogger::$logger = new $class();
+      sfLogger::$logger->initialize();
+    }
+
+    return sfLogger::$logger;
+  }
+
+  /**
+   * Initializes the logger.
+   */
+  public function initialize()
+  {
+    $this->loggers = array();
+  }
+
+  /**
+   * Retrieves the log level for the current logger instance.
+   *
+   * @return string Log level
+   */
+  public function getLogLevel()
+  {
+    return $this->level;
+  }
+
+  /**
+   * Sets a log level for the current logger instance.
+   *
+   * @param string Log level
+   */
+  public function setLogLevel($level)
+  {
+    $this->level = $level;
+  }
+  
+  /**
+   * Retrieves current loggers.
+   *
+   * @return array List of loggers
+   */
+  public function getLoggers()
+  {
+    return $this->loggers;
+  }
+  
+  /**
+   * Registers a logger.
+   *
+   * @param string Logger name
+   */
+  public function registerLogger($logger)
+  {
+    $this->loggers[] = $logger;
+  }
+
+  /**
+   * Logs a message.
+   *
+   * @param string Message
+   * @param string Message priority
+   */
+  public function log($message, $priority = SF_LOG_INFO)
+  {
+    if ($this->level < $priority)
+    {
+      return;
+    }
+
+    foreach ($this->loggers as $logger)
+    {
+      $logger->log((string) $message, $priority, $this->levels[$priority]);
+    }
+  }
+
+  /**
+   * Sets an emerg message.
+   *
+   * @param string Message
+   */
+  public function emerg($message)
+  {
+    $this->log($message, SF_LOG_EMERG);
+  }
+
+  /**
+   * Sets an alert message.
+   *
+   * @param string Message
+   */
+  public function alert($message)
+  {
+    $this->log($message, SF_LOG_ALERT);
+  }
+
+  /**
+   * Sets a critical message.
+   *
+   * @param string Message
+   */
+  public function crit($message)
+  {
+    $this->log($message, SF_LOG_CRIT);
+  }
+
+  /**
+   * Sets an error message.
+   *
+   * @param string Message
+   */
+  public function err($message)
+  {
+    $this->log($message, SF_LOG_ERR);
+  }
+
+  /**
+   * Sets a warning message.
+   *
+   * @param string Message
+   */
+  public function warning($message)
+  {
+    $this->log($message, SF_LOG_WARNING);
+  }
+
+  /**
+   * Sets a notice message.
+   *
+   * @param string Message
+   */
+  public function notice($message)
+  {
+    $this->log($message, SF_LOG_NOTICE);
+  }
+
+  /**
+   * Sets an info message.
+   *
+   * @param string Message
+   */
+  public function info($message)
+  {
+    $this->log($message, SF_LOG_INFO);
+  }
+
+  /**
+   * Sets a debug message.
+   *
+   * @param string Message
+   */
+  public function debug($message)
+  {
+    $this->log($message, SF_LOG_DEBUG);
+  }
+
+  /**
+   * Executes the shutdown procedure.
+   *
+   * Cleans up the current logger instance.
+   */
+  public function shutdown()
+  {
+    foreach ($this->loggers as $logger)
+    {
+      if (method_exists($logger, 'shutdown'))
+      {
+        $logger->shutdown();
+      }
+    }
+
+    $this->loggers = array();
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/log/sfLogger.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/sfConsoleRequest.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/sfConsoleRequest.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/sfConsoleRequest.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage request
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfConsoleRequest.class.php 3250 2007-01-12 20:09:11Z fabien $
+ */
+class sfConsoleRequest extends sfRequest
+{
+  /**
+   * Initializes this sfRequest.
+   *
+   * @param sfContext A sfContext instance
+   * @param array   An associative array of initialization parameters
+   *
+   * @return boolean true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this Request
+   */
+  public function initialize($context, $parameters = null)
+  {
+    parent::initialize ($context, $parameters);
+
+    $this->getParameterHolder()->add($_SERVER['argv']);
+  }
+
+  /**
+   * Executes the shutdown procedure.
+   *
+   */
+  public function shutdown()
+  {
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/sfConsoleRequest.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/sfRequest.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/sfRequest.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/sfRequest.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,442 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfRequest provides methods for manipulating client request information such
+ * as attributes, errors and parameters. It is also possible to manipulate the
+ * request method originally sent by the user.
+ *
+ * @package    symfony
+ * @subpackage request
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfRequest.class.php 3329 2007-01-23 08:29:34Z fabien $
+ */
+abstract class sfRequest
+{
+  /**
+   * Process validation and execution for only GET requests.
+   *
+   */
+  const GET = 2;
+
+  /**
+   * Skip validation and execution for any request method.
+   *
+   */
+  const NONE = 1;
+
+  /**
+   * Process validation and execution for only POST requests.
+   *
+   */
+  const POST = 4;
+
+  /**
+   * Process validation and execution for only PUT requests.
+   *
+   */
+  const PUT = 5;
+
+  /**
+   * Process validation and execution for only DELETE requests.
+   *
+   */
+  const DELETE = 6;
+
+  /**
+   * Process validation and execution for only HEAD requests.
+   *
+   */
+  const HEAD = 7;
+
+  protected
+    $errors          = array(),
+    $context         = null,
+    $method          = null,
+    $parameterHolder = null,
+    $config          = null,
+    $attributeHolder = null;
+
+  /**
+   * Extracts parameter values from the request.
+   *
+   * @param array An indexed array of parameter names to extract
+   *
+   * @return array An associative array of parameters and their values. If
+   *               a specified parameter doesn't exist an empty string will
+   *               be returned for its value
+   */
+  public function & extractParameters($names)
+  {
+    $array = array();
+
+    $parameters =& $this->parameterHolder->getAll();
+    foreach ($parameters as $key => &$value)
+    {
+      if (in_array($key, $names))
+      {
+        $array[$key] =& $value;
+      }
+    }
+
+    return $array;
+  }
+
+  /**
+   * Retrieves an error message.
+   *
+   * @param string An error name
+   *
+   * @return string An error message, if the error exists, otherwise null
+   */
+  public function getError($name, $catalogue = 'messages')
+  {
+    $retval = null;
+
+    if (isset($this->errors[$name]))
+    {
+      $retval = $this->errors[$name];
+    }
+
+    // translate error message if needed
+    if (sfConfig::get('sf_i18n'))
+    {
+      $retval = $this->context->getI18N()->__($retval, null, $catalogue);
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Retrieves an array of error names.
+   *
+   * @return array An indexed array of error names
+   */
+  public function getErrorNames()
+  {
+    return array_keys($this->errors);
+  }
+
+  /**
+   * Retrieves an array of errors.
+   *
+   * @return array An associative array of errors
+   */
+  public function getErrors()
+  {
+    return $this->errors;
+  }
+
+  /**
+   * Retrieves this request's method.
+   *
+   * @return int One of the following constants:
+   *             - sfRequest::GET
+   *             - sfRequest::POST
+   */
+  public function getMethod()
+  {
+    return $this->method;
+  }
+
+  /**
+   * Indicates whether or not an error exists.
+   *
+   * @param string An error name
+   *
+   * @return boolean true, if the error exists, otherwise false
+   */
+  public function hasError($name)
+  {
+    return isset($this->errors[$name]);
+  }
+
+  /**
+   * Indicates whether or not any errors exist.
+   *
+   * @return boolean true, if any error exist, otherwise false
+   */
+  public function hasErrors()
+  {
+    return (count($this->errors) > 0);
+  }
+
+  /**
+   * Initializes this sfRequest.
+   *
+   * @param sfContext A sfContext instance
+   * @param array   An associative array of initialization parameters
+   * @param array   An associative array of initialization attributes
+   *
+   * @return boolean true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this Request
+   */
+  public function initialize($context, $parameters = array(), $attributes = array())
+  {
+    $this->context = $context;
+
+    // initialize parameter and attribute holders
+    $this->parameterHolder = new sfParameterHolder();
+    $this->attributeHolder = new sfParameterHolder();
+
+    $this->parameterHolder->add($parameters);
+    $this->attributeHolder->add($attributes);
+  }
+
+  /**
+   * Retrieves the current application context.
+   *
+   * @return sfContext Current application context
+   */
+  public function getContext()
+  {
+    return $this->context;
+  }
+
+  /**
+   * Retrieves a new sfRequest implementation instance.
+   *
+   * @param string A sfRequest implementation name
+   *
+   * @return sfRequest A sfRequest implementation instance
+   *
+   * @throws <b>sfFactoryException</b> If a request implementation instance cannot be created
+   */
+  public static function newInstance($class)
+  {
+    // the class exists
+    $object = new $class();
+
+    if (!($object instanceof sfRequest))
+    {
+      // the class name is of the wrong type
+      $error = 'Class "%s" is not of the type sfRequest';
+      $error = sprintf($error, $class);
+
+      throw new sfFactoryException($error);
+    }
+
+    return $object;
+  }
+
+  /**
+   * Removes an error.
+   *
+   * @param string An error name
+   *
+   * @return string An error message, if the error was removed, otherwise null
+   */
+  public function & removeError($name)
+  {
+    $retval = null;
+
+    if (isset($this->errors[$name]))
+    {
+      $retval =& $this->errors[$name];
+
+      unset($this->errors[$name]);
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Sets an error.
+   *
+   * @param string An error name
+   * @param string An error message
+   *
+   */
+  public function setError($name, $message)
+  {
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfRequest} error in form for parameter "'.$name.'" (with message "'.$message.'")');
+    }
+
+    $this->errors[$name] = $message;
+  }
+
+  /**
+   * Sets an array of errors
+   *
+   * If an existing error name matches any of the keys in the supplied
+   * array, the associated message will be overridden.
+   *
+   * @param array An associative array of errors and their associated messages
+   *
+   */
+  public function setErrors($errors)
+  {
+    $this->errors = array_merge($this->errors, $errors);
+  }
+
+  /**
+   * Sets the request method.
+   *
+   * @param int One of the following constants:
+   *
+   * - sfRequest::GET
+   * - sfRequest::POST
+   * - sfRequest::PUT
+   * - sfRequest::DELETE
+   * - sfRequest::HEAD
+   *
+   * @return void
+   *
+   * @throws <b>sfException</b> - If the specified request method is invalid
+   */
+  public function setMethod($methodCode)
+  {
+    $available_methods = array(self::GET, self::POST, self::PUT, self::DELETE, self::HEAD, self::NONE);
+    if (in_array($methodCode, $available_methods))
+    {
+      $this->method = $methodCode;
+
+      return;
+    }
+
+    // invalid method type
+    $error = 'Invalid request method: %s';
+    $error = sprintf($error, $methodCode);
+
+    throw new sfException($error);
+  }
+
+  /**
+   * Retrieves the parameters for the current request.
+   *
+   * @return sfParameterHolder The parameter holder
+   */
+  public function getParameterHolder()
+  {
+    return $this->parameterHolder;
+  }
+
+  /**
+   * Retrieves the attributes holder.
+   *
+   * @return sfParameterHolder The attribute holder
+   */
+  public function getAttributeHolder()
+  {
+    return $this->attributeHolder;
+  }
+
+  /**
+   * Retrieves an attribute from the current request.
+   *
+   * @param string Attribute name
+   * @param string Default attribute value
+   * @param string Namespace for the current request
+   *
+   * @return mixed An attribute value
+   */
+  public function getAttribute($name, $default = null, $ns = null)
+  {
+    return $this->attributeHolder->get($name, $default, $ns);
+  }
+
+  /**
+   * Indicates whether or not an attribute exist for the current request.
+   *
+   * @param string Attribute name
+   * @param string Namespace for the current request
+   *
+   * @return boolean true, if the attribute exists otherwise false
+   */
+  public function hasAttribute($name, $ns = null)
+  {
+    return $this->attributeHolder->has($name, $ns);
+  }
+
+  /**
+   * Sets an attribute for the request.
+   *
+   * @param string Attribute name
+   * @param string Value for the attribute
+   * @param string Namespace for the current request
+   *
+   */
+  public function setAttribute($name, $value, $ns = null)
+  {
+    $this->attributeHolder->set($name, $value, $ns);
+  }
+
+  /**
+   * Retrieves a paramater for the current request.
+   *
+   * @param string Parameter name
+   * @param string Parameter default value
+   * @param string Namespace for the current request
+   *
+   */
+  public function getParameter($name, $default = null, $ns = null)
+  {
+    return $this->parameterHolder->get($name, $default, $ns);
+  }
+
+  /**
+   * Indicates whether or not a parameter exist for the current request.
+   *
+   * @param string Parameter name
+   * @param string Namespace for the current request
+   *
+   * @return boolean true, if the paramater exists otherwise false
+   */
+  public function hasParameter($name, $ns = null)
+  {
+    return $this->parameterHolder->has($name, $ns);
+  }
+
+  /**
+   * Sets a parameter for the current request.
+   *
+   * @param string Parameter name
+   * @param string Parameter value
+   * @param string Namespace for the current request
+   *
+   */
+  public function setParameter($name, $value, $ns = null)
+  {
+    $this->parameterHolder->set($name, $value, $ns);
+  }
+
+  /**
+   * Executes the shutdown procedure.
+   *
+   */
+  abstract function shutdown();
+
+  /**
+   * Overloads a given method.
+   *
+   * @param string Method name
+   * @param string Method arguments
+   *
+   * @return mixed User function callback
+   *
+   * @throws <b>sfException</b> if call fails
+   */
+  public function __call($method, $arguments)
+  {
+    if (!$callable = sfMixer::getCallable('sfRequest:'.$method))
+    {
+      throw new sfException(sprintf('Call to undefined method sfRequest::%s', $method));
+    }
+
+    array_unshift($arguments, $this);
+
+    return call_user_func_array($callable, $arguments);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/sfRequest.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/sfWebRequest.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/sfWebRequest.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/sfWebRequest.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,865 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfWebRequest class.
+ *
+ * This class manages web requests. It parses input from the request and store them as parameters.
+ * sfWebRequest is able to parse request with routing support enabled.
+ *
+ * @package    symfony
+ * @subpackage request
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfWebRequest.class.php 3250 2007-01-12 20:09:11Z fabien $
+ */
+class sfWebRequest extends sfRequest
+{
+  /**
+   * A list of languages accepted by the browser.
+   * @var array
+   */
+  protected $languages = null;
+
+  /**
+   * A list of charsets accepted by the browser
+   * @var array
+   */
+  protected $charsets = null;
+
+  /**
+   * @var array  List of content types accepted by the client.
+   */
+  protected $acceptableContentTypes = null;
+
+  protected $pathInfoArray = null;
+
+  protected $relativeUrlRoot = null;
+
+  /**
+   * Retrieves an array of file information.
+   *
+   * @param string A file name
+   *
+   * @return array An associative array of file information, if the file exists, otherwise null
+   */
+  public function getFile($name)
+  {
+    return ($this->hasFile($name) ? $this->getFileValues($name) : null);
+  }
+
+  /**
+   * Retrieves a file error.
+   *
+   * @param string A file name
+   *
+   * @return int One of the following error codes:
+   *
+   *             - <b>UPLOAD_ERR_OK</b>        (no error)
+   *             - <b>UPLOAD_ERR_INI_SIZE</b>  (the uploaded file exceeds the
+   *                                           upload_max_filesize directive
+   *                                           in php.ini)
+   *             - <b>UPLOAD_ERR_FORM_SIZE</b> (the uploaded file exceeds the
+   *                                           MAX_FILE_SIZE directive that
+   *                                           was specified in the HTML form)
+   *             - <b>UPLOAD_ERR_PARTIAL</b>   (the uploaded file was only
+   *                                           partially uploaded)
+   *             - <b>UPLOAD_ERR_NO_FILE</b>   (no file was uploaded)
+   */
+  public function getFileError($name)
+  {
+    return ($this->hasFile($name) ? $this->getFileValue($name, 'error') : UPLOAD_ERR_NO_FILE);
+  }
+
+  /**
+   * Retrieves a file name.
+   *
+   * @param string A file nam.
+   *
+   * @return string A file name, if the file exists, otherwise null
+   */
+  public function getFileName($name)
+  {
+    return ($this->hasFile($name) ? $this->getFileValue($name, 'name') : null);
+  }
+
+  /**
+   * Retrieves an array of file names.
+   *
+   * @return array An indexed array of file names
+   */
+  public function getFileNames()
+  {
+    return array_keys($_FILES);
+  }
+
+  /**
+   * Retrieves an array of files.
+   *
+   * @return array An associative array of files
+   */
+  public function getFiles()
+  {
+    return $_FILES;
+  }
+
+  /**
+   * Retrieves a file path.
+   *
+   * @param string A file name
+   *
+   * @return string A file path, if the file exists, otherwise null
+   */
+  public function getFilePath($name)
+  {
+    return ($this->hasFile($name) ? $this->getFileValue($name, 'tmp_name') : null);
+  }
+
+  /**
+   * Retrieve a file size.
+   *
+   * @param string A file name
+   *
+   * @return int A file size, if the file exists, otherwise null
+   */
+  public function getFileSize($name)
+  {
+    return ($this->hasFile($name) ? $this->getFileValue($name, 'size') : null);
+  }
+
+  /**
+   * Retrieves a file type.
+   *
+   * This may not be accurate. This is the mime-type sent by the browser
+   * during the upload.
+   *
+   * @param string A file name
+   *
+   * @return string A file type, if the file exists, otherwise null
+   */
+  public function getFileType($name)
+  {
+    return ($this->hasFile($name) ? $this->getFileValue($name, 'type') : null);
+  }
+
+  /**
+   * Indicates whether or not a file exists.
+   *
+   * @param string A file name
+   *
+   * @return boolean true, if the file exists, otherwise false
+   */
+  public function hasFile($name)
+  {
+    if (preg_match('/^(.+?)\[(.+?)\]$/', $name, $match))
+    {
+      return isset($_FILES[$match[1]]['name'][$match[2]]);
+    }
+    else
+    {
+      return isset($_FILES[$name]);
+    }
+  }
+
+  /**
+   * Indicates whether or not a file error exists.
+   *
+   * @param string A file name
+   *
+   * @return boolean true, if the file error exists, otherwise false
+   */
+  public function hasFileError($name)
+  {
+    return ($this->hasFile($name) ? ($this->getFileValue($name, 'error') != UPLOAD_ERR_OK) : false);
+  }
+
+  /**
+   * Indicates whether or not any file errors occured.
+   *
+   * @return boolean true, if any file errors occured, otherwise false
+   */
+  public function hasFileErrors()
+  {
+    foreach ($this->getFileNames() as $name)
+    {
+      if ($this->hasFileError($name) === true)
+      {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  /**
+   * Indicates whether or not any files exist.
+   *
+   * @return boolean true, if any files exist, otherwise false
+   */
+  public function hasFiles()
+  {
+    return (count($_FILES) > 0);
+  }
+
+  /**
+   * Retrieves a file value.
+   *
+   * @param string A file name
+   * @param string Value to search in the file
+   * 
+   * @return string File value
+   */
+  public function getFileValue($name, $key)
+  {
+    if (preg_match('/^(.+?)\[(.+?)\]$/', $name, $match))
+    {
+      return $_FILES[$match[1]][$key][$match[2]];
+    }
+    else
+    {
+      return $_FILES[$name][$key];
+    }
+  }
+
+  /**
+   * Retrieves all the values from a file.
+   *
+   * @param string A file name
+   *
+   * @return array Associative list of the file values
+   */
+  public function getFileValues($name)
+  {
+    if (preg_match('/^(.+?)\[(.+?)\]$/', $name, $match))
+    {
+      return array(
+        'name'     => $_FILES[$match[1]]['name'][$match[2]],
+        'type'     => $_FILES[$match[1]]['type'][$match[2]],
+        'tmp_name' => $_FILES[$match[1]]['tmp_name'][$match[2]],
+        'error'    => $_FILES[$match[1]]['error'][$match[2]],
+        'size'     => $_FILES[$match[1]]['size'][$match[2]],
+      );
+    }
+    else
+    {
+      return $_FILES[$name];
+    }
+  }
+
+  /**
+   * Retrieves an extension for a given file.
+   *
+   * @param string A file name
+   *
+   * @return string Extension for the file
+   */
+  public function getFileExtension($name)
+  {
+    $fileType = $this->getFileType($name);
+
+    if (!$fileType)
+    {
+      return '.bin';
+    }
+
+    $mimeTypes = unserialize(file_get_contents(sfConfig::get('sf_symfony_data_dir').'/data/mime_types.dat'));
+
+    return isset($mimeTypes[$fileType]) ? '.'.$mimeTypes[$fileType] : '.bin';
+  }
+
+  /**
+   * Initializes this sfRequest.
+   *
+   * @param sfContext A sfContext instance
+   * @param array   An associative array of initialization parameters
+   * @param array   An associative array of initialization attributes
+   *
+   * @return boolean true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this Request
+   */
+  public function initialize($context, $parameters = array(), $attributes = array())
+  {
+    parent::initialize($context, $parameters, $attributes);
+
+    if (isset($_SERVER['REQUEST_METHOD']))
+    {
+      switch ($_SERVER['REQUEST_METHOD'])
+      {
+        case 'GET':
+          $this->setMethod(self::GET);
+          break;
+
+        case 'POST':
+          $this->setMethod(self::POST);
+          break;
+
+        case 'PUT':
+          $this->setMethod(self::PUT);
+          break;
+
+        case 'DELETE':
+          $this->setMethod(self::DELETE);
+          break;
+
+        case 'HEAD':
+          $this->setMethod(self::HEAD);
+          break;
+
+        default:
+          $this->setMethod(self::GET);
+      }
+    }
+    else
+    {
+      // set the default method
+      $this->setMethod(self::GET);
+    }
+
+    // load parameters from GET/PATH_INFO/POST
+    $this->loadParameters();
+  }
+
+  /**
+   * Returns the array that contains all request information ($_SERVER or $_ENV).
+   *
+   * This information is stored in the [sf_path_info_array] constant.
+   *
+   * @return  array Path information
+   */
+  protected function getPathInfoArray()
+  {
+    if (!$this->pathInfoArray)
+    {
+      // parse PATH_INFO
+      switch (sfConfig::get('sf_path_info_array'))
+      {
+        case 'SERVER':
+          $this->pathInfoArray =& $_SERVER;
+          break;
+
+        case 'ENV':
+        default:
+          $this->pathInfoArray =& $_ENV;
+      }
+    }
+
+    return $this->pathInfoArray;
+  }
+
+  /**
+   * Retrieves the uniform resource identifier for the current web request.
+   *
+   * @return string Unified resource identifier
+   */
+  public function getUri()
+  {
+    $pathArray = $this->getPathInfoArray();
+
+    if ($this->isAbsUri())
+    {
+      return $pathArray['REQUEST_URI'];
+    }
+
+    return $this->getUriPrefix().$pathArray['REQUEST_URI'];
+  }
+
+  /**
+   * See if the client is using absolute uri
+   *
+   * @return boolean true, if is absolute uri otherwise false
+   */
+  public function isAbsUri()
+  {
+    $pathArray = $this->getPathInfoArray();
+
+    return preg_match('/^http/', $pathArray['REQUEST_URI']);
+  }
+
+  /**
+   * Returns Uri prefix, including protocol, hostname and server port.
+   *
+   * @return string Uniform resource identifier prefix
+   */
+  public function getUriPrefix()
+  {
+    $pathArray = $this->getPathInfoArray();
+    if ($this->isSecure())
+    {
+      $standardPort = '443';
+      $proto = 'https';
+    }
+    else
+    {
+      $standardPort = '80';
+      $proto = 'http';
+    }
+
+    $port = $pathArray['SERVER_PORT'] == $standardPort || !$pathArray['SERVER_PORT'] ? '' : ':'.$pathArray['SERVER_PORT'];
+
+    return $proto.'://'.$pathArray['SERVER_NAME'].$port;
+  }
+
+  /**
+   * Retrieves the path info for the current web request.
+   *
+   * @return string Path info
+   */
+  public function getPathInfo()
+  {
+    $pathInfo = '';
+
+    $pathArray = $this->getPathInfoArray();
+
+    // simulate PATH_INFO if needed
+    $sf_path_info_key = sfConfig::get('sf_path_info_key');
+    if (!isset($pathArray[$sf_path_info_key]) || !$pathArray[$sf_path_info_key])
+    {
+      if (isset($pathArray['REQUEST_URI']))
+      {
+        $script_name = $this->getScriptName();
+        $uri_prefix = $this->isAbsUri() ? $this->getUriPrefix() : '';
+        $pathInfo = preg_replace('/^'.preg_quote($uri_prefix, '/').'/','',$pathArray['REQUEST_URI']);
+        $pathInfo = preg_replace('/^'.preg_quote($script_name, '/').'/', '', $pathInfo);
+        $prefix_name = preg_replace('#/[^/]+$#', '', $script_name);
+        $pathInfo = preg_replace('/^'.preg_quote($prefix_name, '/').'/', '', $pathInfo);
+        $pathInfo = preg_replace('/'.preg_quote($pathArray['QUERY_STRING'], '/').'$/', '', $pathInfo);
+      }
+    }
+    else
+    {
+      $pathInfo = $pathArray[$sf_path_info_key];
+      if ($sf_relative_url_root = $this->getRelativeUrlRoot())
+      {
+        $pathInfo = preg_replace('/^'.str_replace('/', '\\/', $sf_relative_url_root).'\//', '', $pathInfo);
+      }
+    }
+
+    // for IIS
+    if (isset($_SERVER['SERVER_SOFTWARE']) && false !== stripos($_SERVER['SERVER_SOFTWARE'], 'iis') && $pos = stripos($pathInfo, '.php'))
+    {
+      $pathInfo = substr($pathInfo, $pos + 4);
+    }
+
+    if (!$pathInfo)
+    {
+      $pathInfo = '/';
+    }
+
+    return $pathInfo;
+  }
+
+  /**
+   * Loads GET, PATH_INFO and POST data into the parameter list.
+   *
+   */
+  protected function loadParameters()
+  {
+    // merge GET parameters
+    if (get_magic_quotes_gpc())
+    {
+      $_GET = sfToolkit::stripslashesDeep($_GET);
+    }
+    $this->getParameterHolder()->addByRef($_GET);
+
+    $pathInfo = $this->getPathInfo();
+    if ($pathInfo)
+    {
+      // routing map defined?
+      $r = sfRouting::getInstance();
+      if ($r->hasRoutes())
+      {
+        $results = $r->parse($pathInfo);
+        if ($results !== null)
+        {
+          $this->getParameterHolder()->addByRef($results);
+        }
+        else
+        {
+          $this->setParameter('module', sfConfig::get('sf_error_404_module'));
+          $this->setParameter('action', sfConfig::get('sf_error_404_action'));
+        }
+      }
+      else
+      {
+        $array = explode('/', trim($pathInfo, '/'));
+        $count = count($array);
+
+        for ($i = 0; $i < $count; $i++)
+        {
+          // see if there's a value associated with this parameter,
+          // if not we're done with path data
+          if ($count > ($i + 1))
+          {
+            $this->getParameterHolder()->setByRef($array[$i], $array[++$i]);
+          }
+        }
+      }
+    }
+
+    // merge POST parameters
+    if (get_magic_quotes_gpc())
+    {
+      $_POST = sfToolkit::stripslashesDeep((array) $_POST);
+    }
+    $this->getParameterHolder()->addByRef($_POST);
+
+    // move symfony parameters in a protected namespace (parameters prefixed with _sf_)
+    foreach ($this->getParameterHolder()->getAll() as $key => $value)
+    {
+      if (0 === stripos($key, '_sf_'))
+      {
+        $this->getParameterHolder()->remove($key);
+        $this->setParameter($key, $value, 'symfony/request/sfWebRequest');
+        unset($_GET[$key]);
+      }
+    }
+
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info(sprintf('{sfRequest} request parameters %s', str_replace("\n", '', var_export($this->getParameterHolder()->getAll(), true))));
+    }
+  }
+
+  /**
+   * Moves an uploaded file.
+   *
+   * @param string A file name
+   * @param string An absolute filesystem path to where you would like the
+   *               file moved. This includes the new filename as well, since
+   *               uploaded files are stored with random names
+   * @param int    The octal mode to use for the new file
+   * @param boolean   Indicates that we should make the directory before moving the file
+   * @param int    The octal mode to use when creating the directory
+   *
+   * @return boolean true, if the file was moved, otherwise false
+   *
+   * @throws <b>sfFileException</b> If a major error occurs while attempting to move the file
+   */
+  public function moveFile($name, $file, $fileMode = 0666, $create = true, $dirMode = 0777)
+  {
+    if ($this->hasFile($name) && $this->getFileValue($name, 'error') == UPLOAD_ERR_OK && $this->getFileValue($name, 'size') > 0)
+    {
+      // get our directory path from the destination filename
+      $directory = dirname($file);
+
+      if (!is_readable($directory))
+      {
+        $fmode = 0777;
+
+        if ($create && !@mkdir($directory, $dirMode, true))
+        {
+          // failed to create the directory
+          $error = 'Failed to create file upload directory "%s"';
+          $error = sprintf($error, $directory);
+
+          throw new sfFileException($error);
+        }
+
+        // chmod the directory since it doesn't seem to work on
+        // recursive paths
+        @chmod($directory, $dirMode);
+      }
+      else if (!is_dir($directory))
+      {
+        // the directory path exists but it's not a directory
+        $error = 'File upload path "%s" exists, but is not a directory';
+        $error = sprintf($error, $directory);
+
+        throw new sfFileException($error);
+      }
+      else if (!is_writable($directory))
+      {
+        // the directory isn't writable
+        $error = 'File upload path "%s" is not writable';
+        $error = sprintf($error, $directory);
+
+        throw new sfFileException($error);
+      }
+
+      if (@move_uploaded_file($this->getFileValue($name, 'tmp_name'), $file))
+      {
+        // chmod our file
+        @chmod($file, $fileMode);
+
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  /**
+   * Returns referer.
+   *
+   * @return  string
+   */
+  public function getReferer()
+  {
+    $pathArray = $this->getPathInfoArray();
+
+    return isset($pathArray['HTTP_REFERER']) ? $pathArray['HTTP_REFERER'] : '';
+  }
+
+  /**
+   * Returns current host name.
+   *
+   * @return  string
+   */
+  public function getHost()
+  {
+    $pathArray = $this->getPathInfoArray();
+
+    return isset($pathArray['HTTP_X_FORWARDED_HOST']) ? $pathArray['HTTP_X_FORWARDED_HOST'] : (isset($pathArray['HTTP_HOST']) ? $pathArray['HTTP_HOST'] : '');
+  }
+
+  /**
+   * Returns current script name.
+   *
+   * @return  string
+   */
+  public function getScriptName()
+  {
+    $pathArray = $this->getPathInfoArray();
+
+    return isset($pathArray['SCRIPT_NAME']) ? $pathArray['SCRIPT_NAME'] : (isset($pathArray['ORIG_SCRIPT_NAME']) ? $pathArray['ORIG_SCRIPT_NAME'] : '');
+  }
+
+  /**
+   * Returns request method.
+   *
+   * @return  string
+   */
+  public function getMethodName()
+  {
+    $pathArray = $this->getPathInfoArray();
+
+    return isset($pathArray['REQUEST_METHOD']) ? $pathArray['REQUEST_METHOD'] : 'GET';
+  }
+
+  /**
+   * Gets a list of languages acceptable by the client browser
+   *
+   * @return array Languages ordered in the user browser preferences
+   */
+  public function getLanguages()
+  {
+    if ($this->languages)
+    {
+      return $this->languages;
+    }
+
+    if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
+    {
+      return array();
+    }
+
+    $languages = $this->splitHttpAcceptHeader($_SERVER['HTTP_ACCEPT_LANGUAGE']);
+    foreach ($languages as $lang)
+    {
+      if (strstr($lang, '-'))
+      {
+        $codes = explode('-', $lang);
+        if ($codes[0] == 'i')
+        {
+          // Language not listed in ISO 639 that are not variants
+          // of any listed language, which can be registerd with the
+          // i-prefix, such as i-cherokee
+          if (count($codes) > 1)
+          {
+            $lang = $codes[1];
+          }
+        }
+        else
+        {
+          for ($i = 0, $max = count($codes); $i < $max; $i++)
+          {
+            if ($i == 0)
+            {
+              $lang = strtolower($codes[0]);
+            }
+            else
+            {
+              $lang .= '_'.strtoupper($codes[$i]);
+            }
+          }
+        }
+      }
+
+      $this->languages[] = $lang;
+    }
+
+    return $this->languages;
+  }
+
+  /**
+   * Gets a list of charsets acceptable by the client browser.
+   *
+   * @return array List of charsets in preferable order
+   */
+  public function getCharsets()
+  {
+    if ($this->charsets)
+    {
+      return $this->charsets;
+    }
+
+    if (!isset($_SERVER['HTTP_ACCEPT_CHARSET']))
+    {
+      return array();
+    }
+
+    $this->charsets = $this->splitHttpAcceptHeader($_SERVER['HTTP_ACCEPT_CHARSET']);
+
+    return $this->charsets;
+  }
+
+  /**
+   * Gets a list of content types acceptable by the client browser
+   *
+   * @return array Languages ordered in the user browser preferences
+   */
+  public function getAcceptableContentTypes()
+  {
+    if ($this->acceptableContentTypes)
+    {
+      return $this->acceptableContentTypes;
+    }
+
+    if (!isset($_SERVER['HTTP_ACCEPT']))
+    {
+      return array();
+    }
+
+    $this->acceptableContentTypes = $this->splitHttpAcceptHeader($_SERVER['HTTP_ACCEPT']);
+
+    return $this->acceptableContentTypes;
+  }
+
+  /**
+   * Returns true id the request is a XMLHttpRequest (via prototype 'HTTP_X_REQUESTED_WITH' header).
+   *
+   * @return boolean
+   */
+  public function isXmlHttpRequest()
+  {
+    return ($this->getHttpHeader('X_REQUESTED_WITH') == 'XMLHttpRequest');
+  }
+
+  public function getHttpHeader($name, $prefix = 'http')
+  {
+    if ($prefix)
+    {
+      $prefix = strtoupper($prefix).'_';
+    }
+
+    $name = $prefix.strtoupper(strtr($name, '-', '_'));
+
+    $pathArray = $this->getPathInfoArray();
+
+    return isset($pathArray[$name]) ? stripslashes($pathArray[$name]) : null;
+  }
+
+  /**
+   * Gets a cookie value.
+   *
+   * @return mixed
+   */
+  public function getCookie($name, $defaultValue = null)
+  {
+    $retval = $defaultValue;
+
+    if (isset($_COOKIE[$name]))
+    {
+      $retval = get_magic_quotes_gpc() ? stripslashes($_COOKIE[$name]) : $_COOKIE[$name];
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Returns true if the current request is secure (HTTPS protocol).
+   *
+   * @return boolean
+   */
+  public function isSecure()
+  {
+    $pathArray = $this->getPathInfoArray();
+
+    return (
+      (isset($pathArray['HTTPS']) && strtolower($pathArray['HTTPS']) == 'on')
+      ||
+      (isset($pathArray['HTTP_X_FORWARDED_PROTO']) && strtolower($pathArray['HTTP_X_FORWARDED_PROTO']) == 'https')
+    );
+  }
+
+  /**
+   * Retrieves relative root url.
+   *
+   * @return string URL
+   */
+  public function getRelativeUrlRoot()
+  {
+    if ($this->relativeUrlRoot === null)
+    {
+      $this->relativeUrlRoot = sfConfig::get('sf_relative_url_root', preg_replace('#/[^/]+\.php5?$#', '', $this->getScriptName()));
+    }
+
+    return $this->relativeUrlRoot;
+  }
+
+  /**
+   * Sets the relative root url for the current web request.
+   *
+   * @param string Value for the url
+   */
+  public function setRelativeUrlRoot($value)
+  {
+    $this->relativeUrlRoot = $value;
+  }
+
+  /**
+   * Executes the shutdown procedure.
+   *
+   */
+  public function shutdown()
+  {
+  }
+
+  /**
+   * Splits an HTTP header for the current web request.
+   *
+   * @param string Header to split
+   */
+  public function splitHttpAcceptHeader($header)
+  {
+    $values = array();
+    foreach (array_filter(explode(',', $header)) as $value)
+    {
+      // Cut off any q-value that might come after a semi-colon
+      if ($pos = strpos($value, ';'))
+      {
+        $q     = (float) trim(substr($value, $pos + 3));
+        $value = trim(substr($value, 0, $pos));
+      }
+      else
+      {
+        $q = 1;
+      }
+
+      $values[$value] = $q;
+    }
+
+    arsort($values);
+
+    return array_keys($values);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/request/sfWebRequest.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/sfConsoleResponse.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/sfConsoleResponse.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/sfConsoleResponse.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfConsoleResponse provides methods for manipulating client response in cli environment.
+ *
+ * @package    symfony
+ * @subpackage response
+ * @author     Tristan Rivoallan <trivoallan en clever-age.com>
+ * @version    SVN: $Id: sfConsoleResponse.class.php 3250 2007-01-12 20:09:11Z fabien $
+ */
+class sfConsoleResponse extends sfResponse
+{
+  /**
+   * Executes the shutdown procedure.
+   *
+   */
+  public function shutdown()
+  {
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/sfConsoleResponse.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/sfResponse.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/sfResponse.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/sfResponse.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,199 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfResponse provides methods for manipulating client response information such
+ * as headers, cookies and content.
+ *
+ * @package    symfony
+ * @subpackage response
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfResponse.class.php 3250 2007-01-12 20:09:11Z fabien $
+ */
+abstract class sfResponse
+{
+  protected
+    $parameterHolder = null,
+    $context         = null,
+    $content         = '';
+
+  /**
+   * Initializes this sfResponse.
+   *
+   * @param sfContext A sfContext instance
+   *
+   * @return boolean true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this Response
+   */
+  public function initialize($context, $parameters = array())
+  {
+    $this->context = $context;
+
+    $this->parameterHolder = new sfParameterHolder();
+    $this->parameterHolder->add($parameters);
+  }
+
+  /**
+   * Sets the context for the current response.
+   *
+   * @param sfContext  A sfContext instance
+   */
+  public function setContext($context)
+  {
+    $this->context = $context;
+  }
+
+  /**
+   * Retrieves the current application context.
+   *
+   * @return sfContext The application context
+   */
+  public function getContext()
+  {
+    return $this->context;
+  }
+
+  /**
+   * Retrieves a new sfResponse implementation instance.
+   *
+   * @param string A sfResponse implementation name
+   *
+   * @return sfResponse A sfResponse implementation instance
+   *
+   * @throws <b>sfFactoryException</b> If a request implementation instance cannot be created
+   */
+  public static function newInstance($class)
+  {
+    // the class exists
+    $object = new $class();
+
+    if (!($object instanceof sfResponse))
+    {
+      // the class name is of the wrong type
+      $error = 'Class "%s" is not of the type sfResponse';
+      $error = sprintf($error, $class);
+
+      throw new sfFactoryException($error);
+    }
+
+    return $object;
+  }
+
+  /**
+   * Sets the response content
+   *
+   * @param string Content
+   */
+  public function setContent($content)
+  {
+    $this->content = $content;
+  }
+
+  /**
+   * Gets the current response content
+   *
+   * @return string Content
+   */
+  public function getContent()
+  {
+    return $this->content;
+  }
+
+  /**
+   * Outputs the response content
+   */
+  public function sendContent()
+  {
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfResponse} send content ('.strlen($this->content).' o)');
+    }
+
+    echo $this->content;
+  }
+
+  /**
+   * Retrieves the parameters from the current response.
+   *
+   * @return sfParameterHolder List of parameters
+   */
+  public function getParameterHolder()
+  {
+    return $this->parameterHolder;
+  }
+
+  /**
+   * Retrieves a parameter from the current response.
+   *
+   * @param string A parameter name
+   * @param string A default paramter value
+   * @param string Namespace for the current response
+   *
+   * @return mixed A parameter value
+   */
+  public function getParameter($name, $default = null, $ns = null)
+  {
+    return $this->parameterHolder->get($name, $default, $ns);
+  }
+
+  /**
+   * Indicates whether or not a parameter exist for the current response.
+   *
+   * @param string A parameter name
+   * @param string Namespace for the current response
+   *
+   * @return boolean true, if the parameter exists otherwise false
+   */
+  public function hasParameter($name, $ns = null)
+  {
+    return $this->parameterHolder->has($name, $ns);
+  }
+
+  /**
+   * Sets a parameter for the current response.
+   *
+   * @param string A parameter name
+   * @param string The parameter value to be set
+   * @param string Namespace for the current response
+   */
+  public function setParameter($name, $value, $ns = null)
+  {
+    $this->parameterHolder->set($name, $value, $ns);
+  }
+
+  /**
+   * Executes the shutdown procedure.
+   *
+   */
+  abstract function shutdown();
+
+  /**
+   * Overloads a given method.
+   *
+   * @param string Method name
+   * @param string Method arguments
+   *
+   * @return mixed User function callback
+   *
+   * @throws <b>sfException</b> If the calls fails
+   */
+  public function __call($method, $arguments)
+  {
+    if (!$callable = sfMixer::getCallable('sfResponse:'.$method))
+    {
+      throw new sfException(sprintf('Call to undefined method sfResponse::%s', $method));
+    }
+
+    array_unshift($arguments, $this);
+
+    return call_user_func_array($callable, $arguments);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/sfResponse.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/sfWebResponse.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/sfWebResponse.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/sfWebResponse.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,619 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfWebResponse class.
+ *
+ * This class manages web reponses. It supports cookies and headers management.
+ * 
+ * @package    symfony
+ * @subpackage response
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfWebResponse.class.php 3250 2007-01-12 20:09:11Z fabien $
+ */
+class sfWebResponse extends sfResponse
+{
+  protected
+    $cookies     = array(),
+    $statusCode  = 200,
+    $statusText  = 'OK',
+    $statusTexts = array(),
+    $headerOnly  = false;
+
+  /**
+   * Initializes this sfWebResponse.
+   *
+   * @param sfContext A sfContext instance
+   *
+   * @return boolean true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this Response
+   */
+  public function initialize($context, $parameters = array())
+  {
+    parent::initialize($context, $parameters);
+
+    if ('HEAD' == $context->getRequest()->getMethodName())
+    {
+      $this->setHeaderOnly(true);
+    }
+
+    $this->statusTexts = array(
+      '100' => 'Continue',
+      '101' => 'Switching Protocols',
+      '200' => 'OK',
+      '201' => 'Created',
+      '202' => 'Accepted',
+      '203' => 'Non-Authoritative Information',
+      '204' => 'No Content',
+      '205' => 'Reset Content',
+      '206' => 'Partial Content',
+      '300' => 'Multiple Choices',
+      '301' => 'Moved Permanently',
+      '302' => 'Found',
+      '303' => 'See Other',
+      '304' => 'Not Modified',
+      '305' => 'Use Proxy',
+      '306' => '(Unused)',
+      '307' => 'Temporary Redirect',
+      '400' => 'Bad Request',
+      '401' => 'Unauthorized',
+      '402' => 'Payment Required',
+      '403' => 'Forbidden',
+      '404' => 'Not Found',
+      '405' => 'Method Not Allowed',
+      '406' => 'Not Acceptable',
+      '407' => 'Proxy Authentication Required',
+      '408' => 'Request Timeout',
+      '409' => 'Conflict',
+      '410' => 'Gone',
+      '411' => 'Length Required',
+      '412' => 'Precondition Failed',
+      '413' => 'Request Entity Too Large',
+      '414' => 'Request-URI Too Long',
+      '415' => 'Unsupported Media Type',
+      '416' => 'Requested Range Not Satisfiable',
+      '417' => 'Expectation Failed',
+      '500' => 'Internal Server Error',
+      '501' => 'Not Implemented',
+      '502' => 'Bad Gateway',
+      '503' => 'Service Unavailable',
+      '504' => 'Gateway Timeout',
+      '505' => 'HTTP Version Not Supported',
+    );
+  }
+
+  /**
+   * Sets if the response consist of just HTTP headers.
+   *
+   * @param boolean
+   */
+  public function setHeaderOnly($value = true)
+  {
+    $this->headerOnly = (boolean) $value;
+  }
+
+  /**
+   * Returns if the response must only consist of HTTP headers.
+   *
+   * @return boolean returns true if, false otherwise
+   */
+  public function isHeaderOnly()
+  {
+    return $this->headerOnly;
+  }
+
+  /**
+   * Sets a cookie.
+   *
+   * @param string HTTP header name
+   * @param string Value for the cookie
+   * @param string Cookie expiration period
+   * @param string Path
+   * @param string Domain name
+   * @param boolean If secure
+   * @param boolean If uses only HTTP
+   *
+   * @throws <b>sfException</b> If fails to set the cookie
+   */
+  public function setCookie($name, $value, $expire = null, $path = '/', $domain = '', $secure = false, $httpOnly = false)
+  {
+    if ($expire !== null)
+    {
+      if (is_numeric($expire))
+      {
+        $expire = (int) $expire;
+      }
+      else
+      {
+        $expire = strtotime($expire);
+        if ($expire === false || $expire == -1)
+        {
+          throw new sfException('Your expire parameter is not valid.');
+        }
+      }
+    }
+
+    $this->cookies[] = array(
+      'name'     => $name,
+      'value'    => $value,
+      'expire'   => $expire,
+      'path'     => $path,
+      'domain'   => $domain,
+      'secure'   => $secure ? true : false,
+      'httpOnly' => $httpOnly,
+    );
+  }
+
+  /**
+   * Sets response status code.
+   *
+   * @param string HTTP status code
+   * @param string HTTP status text
+   *
+   */
+  public function setStatusCode($code, $name = null)
+  {
+    $this->statusCode = $code;
+    $this->statusText = null !== $name ? $name : $this->statusTexts[$code];
+  }
+
+  /**
+   * Retrieves status code for the current web response.
+   *
+   * @return string Status code
+   */
+  public function getStatusCode()
+  {
+    return $this->statusCode;
+  }
+
+  /**
+   * Sets a HTTP header.
+   *
+   * @param string HTTP header name
+   * @param string Value
+   * @param boolean Replace for the value
+   *
+   */
+  public function setHttpHeader($name, $value, $replace = true)
+  {
+    $name = $this->normalizeHeaderName($name);
+
+    if ('Content-Type' == $name)
+    {
+      if ($replace || !$this->getHttpHeader('Content-Type', null))
+      {
+        $this->setContentType($value);
+      }
+
+      return;
+    }
+
+    if (!$replace)
+    {
+      $current = $this->getParameter($name, '', 'symfony/response/http/headers');
+      $value = ($current ? $current.', ' : '').$value;
+    }
+
+    $this->setParameter($name, $value, 'symfony/response/http/headers');
+  }
+
+  /**
+   * Gets HTTP header current value.
+   *
+   * @return array
+   */
+  public function getHttpHeader($name, $default = null)
+  {
+    return $this->getParameter($this->normalizeHeaderName($name), $default, 'symfony/response/http/headers');
+  }
+
+  /**
+   * Has a HTTP header.
+   *
+   * @return boolean
+   */
+  public function hasHttpHeader($name)
+  {
+    return $this->hasParameter($this->normalizeHeaderName($name), 'symfony/response/http/headers');
+  }
+
+  /**
+   * Sets response content type.
+   *
+   * @param string Content type
+   *
+   */
+  public function setContentType($value)
+  {
+    // add charset if needed
+    if (false === stripos($value, 'charset'))
+    {
+      $value .= '; charset='.sfConfig::get('sf_charset');
+    }
+
+    $this->setParameter('Content-Type', $value, 'symfony/response/http/headers');
+  }
+
+  /**
+   * Gets response content type.
+   *
+   * @return array
+   */
+  public function getContentType()
+  {
+    return $this->getHttpHeader('Content-Type', 'text/html; charset='.sfConfig::get('sf_charset'));
+  }
+
+  /**
+   * Send HTTP headers and cookies.
+   *
+   */
+  public function sendHttpHeaders()
+  {
+    // status
+    $status = 'HTTP/1.0 '.$this->statusCode.' '.$this->statusText;
+    header($status);
+
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfResponse} send status "'.$status.'"');
+    }
+
+    // headers
+    foreach ($this->getParameterHolder()->getAll('symfony/response/http/headers') as $name => $value)
+    {
+      header($name.': '.$value);
+
+      if (sfConfig::get('sf_logging_enabled') && $value != '')
+      {
+        $this->getContext()->getLogger()->info('{sfResponse} send header "'.$name.'": "'.$value.'"');
+      }
+    }
+
+    // cookies
+    foreach ($this->cookies as $cookie)
+    {
+      if (version_compare(phpversion(), '5.2', '>='))
+      {
+        setrawcookie($cookie['name'], $cookie['value'], $cookie['expire'], $cookie['path'], $cookie['domain'], $cookie['secure'], $cookie['httpOnly']);
+      }
+      else
+      {
+        setrawcookie($cookie['name'], $cookie['value'], $cookie['expire'], $cookie['path'], $cookie['domain'], $cookie['secure']);
+      }
+
+      if (sfConfig::get('sf_logging_enabled'))
+      {
+        $this->getContext()->getLogger()->info('{sfResponse} send cookie "'.$cookie['name'].'": "'.$cookie['value'].'"');
+      }
+    }
+  }
+
+  /**
+   * Send content for the current web response.
+   *
+   */
+  public function sendContent()
+  {
+    if (!$this->headerOnly)
+    {
+      parent::sendContent();
+    }
+  }
+
+  /**
+   * Retrieves a normalized Header.
+   *
+   * @param string Header name
+   *
+   * @return string Normalized header
+   */
+  protected function normalizeHeaderName($name)
+  {
+    return preg_replace('/\-(.)/e', "'-'.strtoupper('\\1')", strtr(ucfirst(strtolower($name)), '_', '-'));
+  }
+
+  /**
+   * Retrieves a formated date.
+   *
+   * @param string Timestamp
+   * @param string Format type
+   *
+   * @return string Formated date
+   */
+  public function getDate($timestamp, $type = 'rfc1123')
+  {
+    $type = strtolower($type);
+
+    if ($type == 'rfc1123')
+    {
+      return substr(gmdate('r', $timestamp), 0, -5).'GMT';
+    }
+    else if ($type == 'rfc1036')
+    {
+      return gmdate('l, d-M-y H:i:s ', $timestamp).'GMT';
+    }
+    else if ($type == 'asctime')
+    {
+      return gmdate('D M j H:i:s', $timestamp);
+    }
+    else
+    {
+      $error = 'The second getDate() method parameter must be one of: rfc1123, rfc1036 or asctime';
+
+      throw new sfParameterException($error);
+    }
+  }
+
+  /**
+   * Adds vary to a http header.
+   *
+   * @param string HTTP header
+   */
+  public function addVaryHttpHeader($header)
+  {
+    $vary = $this->getHttpHeader('Vary');
+    $currentHeaders = array();
+    if ($vary)
+    {
+      $currentHeaders = split('/\s*,\s*/', $vary);
+    }
+    $header = $this->normalizeHeaderName($header);
+
+    if (!in_array($header, $currentHeaders))
+    {
+      $currentHeaders[] = $header;
+      $this->setHttpHeader('Vary', implode(', ', $currentHeaders));
+    }
+  }
+
+  /**
+   * Adds an control cache http header.
+   *
+   * @param string HTTP header
+   * @param string Value for the http header
+   */
+  public function addCacheControlHttpHeader($name, $value = null)
+  {
+    $cacheControl = $this->getHttpHeader('Cache-Control');
+    $currentHeaders = array();
+    if ($cacheControl)
+    {
+      foreach (split('/\s*,\s*/', $cacheControl) as $tmp)
+      {
+        $tmp = explode('=', $tmp);
+        $currentHeaders[$tmp[0]] = isset($tmp[1]) ? $tmp[1] : null;
+      }
+    }
+    $currentHeaders[strtr(strtolower($name), '_', '-')] = $value;
+
+    $headers = array();
+    foreach ($currentHeaders as $key => $value)
+    {
+      $headers[] = $key.(null !== $value ? '='.$value : '');
+    }
+
+    $this->setHttpHeader('Cache-Control', implode(', ', $headers));
+  }
+
+  /**
+   * Retrieves meta headers for the current web response.
+   *
+   * @return string Meta headers
+   */
+  public function getHttpMetas()
+  {
+    return $this->getParameterHolder()->getAll('helper/asset/auto/httpmeta');
+  }
+
+  /**
+   * Adds meta headers to the current web response.
+   *
+   * @param string Key to replace
+   * @param string Value for the replacement
+   * @param boolean Replace or not
+   */
+  public function addHttpMeta($key, $value, $replace = true)
+  {
+    $key = $this->normalizeHeaderName($key);
+
+    // set HTTP header
+    $this->setHttpHeader($key, $value, $replace);
+
+    if ('Content-Type' == $key)
+    {
+      $value = $this->getContentType();
+    }
+
+    if (!$replace)
+    {
+      $current = $this->getParameter($key, '', 'helper/asset/auto/httpmeta');
+      $value = ($current ? $current.', ' : '').$value;
+    }
+
+    $this->setParameter($key, $value, 'helper/asset/auto/httpmeta');
+  }
+
+  /**
+   * Retrieves all meta headers for the current web response.
+   *
+   * @return array List of meta headers
+   */
+  public function getMetas()
+  {
+    return $this->getParameterHolder()->getAll('helper/asset/auto/meta');
+  }
+
+  /**
+   * Adds a meta header to the current web response.
+   *
+   * @param string Name of the header
+   * @param string Meta header to be set
+   * @param boolean true if it's replaceable
+   * @param boolean true for escaping the header
+   */
+  public function addMeta($key, $value, $replace = true, $escape = true)
+  {
+    $key = strtolower($key);
+
+    if (sfConfig::get('sf_i18n'))
+    {
+      $value = $this->getContext()->getI18N()->__($value);
+    }
+
+    if ($escape)
+    {
+      $value = htmlentities($value, ENT_QUOTES, sfConfig::get('sf_charset'));
+    }
+
+    if ($replace || !$this->getParameter($key, null, 'helper/asset/auto/meta'))
+    {
+      $this->setParameter($key, $value, 'helper/asset/auto/meta');
+    }
+  }
+
+  /**
+   * Retrieves title for the current web response.
+   *
+   * @return string Title
+   */
+  public function getTitle()
+  {
+    return $this->getParameter('title', '', 'helper/asset/auto/meta');
+  }
+
+  /**
+   * Sets title for the current web response.
+   *
+   * @param string Title name
+   * @param boolean true, for escaping the title
+   */
+  public function setTitle($title, $escape = true)
+  {
+    $this->addMeta('title', $title, true, $escape);
+  }
+
+  /**
+   * Retrieves stylesheets for the current web response.
+   *
+   * @param string Direcotry delimiter
+   *
+   * @return string Stylesheets
+   */
+  public function getStylesheets($position = '')
+  {
+    return $this->getParameterHolder()->getAll('helper/asset/auto/stylesheet'.($position ? '/'.$position : ''));
+  }
+
+  /**
+   * Adds an stylesheet to the current web response.
+   *
+   * @param string Stylesheet
+   * @param string Direcotry delimiter
+   * @param string Stylesheet options
+   */
+  public function addStylesheet($css, $position = '', $options = array())
+  {
+    $this->setParameter($css, $options, 'helper/asset/auto/stylesheet'.($position ? '/'.$position : ''));
+  }
+
+  /**
+   * Retrieves javascript code from the current web response.
+   *
+   * @param string Directory delimiter
+   *
+   * @return string Javascript code
+   */
+  public function getJavascripts($position = '')
+  {
+    return $this->getParameterHolder()->getAll('helper/asset/auto/javascript'.($position ? '/'.$position : ''));
+  }
+
+  /**
+   * Adds javascript code to the current web response.
+   *
+   * @param string Javascript code
+   * @param string Directory delimiter
+   */
+  public function addJavascript($js, $position = '')
+  {
+    $this->setParameter($js, $js, 'helper/asset/auto/javascript'.($position ? '/'.$position : ''));
+  }
+
+  /**
+   * Retrieves cookies from the current web response.
+   *
+   * @return array Cookies
+   */
+  public function getCookies()
+  {
+    $cookies = array();
+    foreach ($this->cookies as $cookie)
+    {
+      $cookies[$cookie['name']] = $cookie;
+    }
+
+    return $cookies;
+  }
+
+  /**
+   * Retrieves HTTP headers from the current web response.
+   *
+   * @return string HTTP headers
+   */
+  public function getHttpHeaders()
+  {
+    return $this->getParameterHolder()->getAll('symfony/response/http/headers');
+  }
+
+  /**
+   * Cleans HTTP headers from the current web response.
+   */
+  public function clearHttpHeaders()
+  {
+    $this->getParameterHolder()->removeNamespace('symfony/response/http/headers');
+  }
+
+  /**
+   * Copies a propertie to a new one.
+   *
+   * @param sfResponse Response instance
+   */
+  public function mergeProperties($response)
+  {
+    $this->parameterHolder = clone $response->getParameterHolder();
+  }
+
+  /**
+   * Retrieves all objects handlers for the current web response.
+   *
+   * @return array Objects instance
+   */
+  public function __sleep()
+  {
+    return array('content', 'statusCode', 'statusText', 'parameterHolder');
+  }
+
+  /**
+   * Reconstructs any result that web response instance needs.
+   */
+  public function __wakeup()
+  {
+  }
+
+  /**
+   * Executes the shutdown procedure.
+   */
+  public function shutdown()
+  {
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/response/sfWebResponse.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfMySQLSessionStorage.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfMySQLSessionStorage.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfMySQLSessionStorage.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,281 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Provides support for session storage using a MySQL brand database.
+ *
+ * <b>Required parameters:</b>
+ *
+ * # <b>db_table</b> - [none] - The database table in which session data will be
+ *                              stored.
+ *
+ * <b>Optional parameters:</b>
+ *
+ * # <b>db_id_col</b>    - [sess_id]   - The database column in which the
+ *                                       session id will be stored.
+ * # <b>db_data_col</b>  - [sess_data] - The database column in which the
+ *                                       session data will be stored.
+ * # <b>db_time_col</b>  - [sess_time] - The database column in which the
+ *                                       session timestamp will be stored.
+ * # <b>session_name</b> - [symfony]   - The name of the session.
+ *
+ * @package    symfony
+ * @subpackage storage
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfMySQLSessionStorage.class.php 3329 2007-01-23 08:29:34Z fabien $
+ */
+class sfMySQLSessionStorage extends sfSessionStorage
+{
+  protected
+    $resource = null;
+
+  /**
+   * Initializes this Storage instance.
+   *
+   * @param sfContext A sfContext instance
+   * @param array   An associative array of initialization parameters
+   *
+   * @return boolean true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this Storage
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // disable auto_start
+    $parameters['auto_start'] = false;
+
+    // initialize the parent
+    parent::initialize($context, $parameters);
+
+    if (!$this->getParameterHolder()->has('db_table'))
+    {
+        // missing required 'db_table' parameter
+        $error = 'Factory configuration file is missing required "db_table" parameter for the Storage category';
+
+        throw new sfInitializationException($error);
+    }
+
+    // use this object as the session handler
+    session_set_save_handler(array($this, 'sessionOpen'),
+                             array($this, 'sessionClose'),
+                             array($this, 'sessionRead'),
+                             array($this, 'sessionWrite'),
+                             array($this, 'sessionDestroy'),
+                             array($this, 'sessionGC'));
+
+    // start our session
+    session_start();
+  }
+
+  /**
+   * Closes a session.
+   *
+   * @return boolean true, if the session was closed, otherwise false
+   */
+  public function sessionClose()
+  {
+    // do nothing
+    return true;
+  }
+
+  /**
+   * Destroys a session.
+   *
+   * @param string A session ID
+   *
+   * @return boolean true, if the session was destroyed, otherwise an exception is thrown
+   *
+   * @throws <b>sfDatabaseException</b> If the session cannot be destroyed.
+   */
+  public function sessionDestroy($id)
+  {
+    // get table/column
+    $db_table  = $this->getParameterHolder()->get('db_table');
+    $db_id_col = $this->getParameterHolder()->get('db_id_col', 'sess_id');
+
+    // cleanup the session id, just in case
+    $id = mysql_escape_string($id);
+
+    // delete the record associated with this id
+    $sql = 'DELETE FROM '.$db_table.' WHERE '.$db_id_col.' = \''.$id.'\'';
+
+    if (@mysql_query($sql, $this->resource))
+    {
+      return true;
+    }
+
+    // failed to destroy session
+    $error = 'MySQLSessionStorage cannot destroy session id "%s"';
+    $error = sprintf($error, $id);
+
+    throw new sfDatabaseException($error);
+  }
+
+  /**
+   * Cleans up old sessions.
+   *
+   * @param int The lifetime of a session
+   *
+   * @return boolean true, if old sessions have been cleaned, otherwise an exception is thrown
+   *
+   * @throws <b>sfDatabaseException</b> If any old sessions cannot be cleaned
+   */
+  public function sessionGC($lifetime)
+  {
+    // determine deletable session time
+    $time = time() - $lifetime;
+
+    // get table/column
+    $db_table    = $this->getParameterHolder()->get('db_table');
+    $db_time_col = $this->getParameterHolder()->get('db_time_col', 'sess_time');
+
+    // delete the record associated with this id
+    $sql = 'DELETE FROM '.$db_table.' '.
+           'WHERE '.$db_time_col.' < '.$time;
+
+    if (@mysql_query($sql, $this->resource))
+    {
+      return true;
+    }
+
+    // failed to cleanup old sessions
+    $error = 'MySQLSessionStorage cannot delete old sessions';
+
+    throw new sfDatabaseException($error);
+  }
+
+  /**
+   * Opens a session.
+   *
+   * @param string
+   * @param string
+   *
+   * @return boolean true, if the session was opened, otherwise an exception is thrown
+   *
+   * @throws <b>sfDatabaseException</b> If a connection with the database does not exist or cannot be created
+   */
+  public function sessionOpen($path, $name)
+  {
+    // what database are we using?
+    $database = $this->getParameterHolder()->get('database', 'default');
+
+    // get the database resource
+    $this->resource = $this->getContext()
+                           ->getDatabaseManager()
+                           ->getDatabase($database)
+                           ->getResource();
+
+    return true;
+  }
+
+  /**
+   * Reads a session.
+   *
+   * @param string A session ID
+   *
+   * @return boolean true, if the session was read, otherwise an exception is thrown
+   *
+   * @throws <b>sfDatabaseException</b> If the session cannot be read
+   */
+  public function sessionRead($id)
+  {
+    // get table/column
+    $db_table    = $this->getParameterHolder()->get('db_table');
+    $db_data_col = $this->getParameterHolder()->get('db_data_col', 'sess_data');
+    $db_id_col   = $this->getParameterHolder()->get('db_id_col', 'sess_id');
+    $db_time_col = $this->getParameterHolder()->get('db_time_col', 'sess_time');
+
+    // cleanup the session id, just in case
+    $id = mysql_escape_string($id);
+
+    // delete the record associated with this id
+    $sql = 'SELECT '.$db_data_col.' ' .
+           'FROM '.$db_table.' ' .
+           'WHERE '.$db_id_col.' = \''.$id.'\'';
+
+    $result = @mysql_query($sql, $this->resource);
+
+    if ($result != false && @mysql_num_rows($result) == 1)
+    {
+      // found the session
+      $data = mysql_fetch_row($result);
+
+      return $data[0];
+    }
+    else
+    {
+      // session does not exist, create it
+      $sql = 'INSERT INTO '.$db_table.' ('.$db_id_col.', ' .
+             $db_data_col.', '.$db_time_col.') VALUES (' .
+             '\''.$id.'\', \'\', '.time().')';
+
+      if (@mysql_query($sql, $this->resource))
+      {
+        return '';
+      }
+
+      // can't create record
+      $error = 'MySQLSessionStorage cannot create new record for id "%s"';
+      $error = sprintf($error, $id);
+
+      throw new sfDatabaseException($error);
+    }
+  }
+
+  /**
+   * Writes session data.
+   *
+   * @param string A session ID
+   * @param string A serialized chunk of session data
+   *
+   * @return boolean true, if the session was written, otherwise an exception is thrown
+   *
+   * @throws <b>sfDatabaseException</b> If the session data cannot be written
+   */
+  public function sessionWrite($id, &$data)
+  {
+    // get table/column
+    $db_table    = $this->getParameterHolder()->get('db_table');
+    $db_data_col = $this->getParameterHolder()->get('db_data_col', 'sess_data');
+    $db_id_col   = $this->getParameterHolder()->get('db_id_col', 'sess_id');
+    $db_time_col = $this->getParameterHolder()->get('db_time_col', 'sess_time');
+
+    // cleanup the session id and data, just in case
+    $id   = mysql_escape_string($id);
+    $data = mysql_escape_string($data);
+
+    // delete the record associated with this id
+    $sql = 'UPDATE '.$db_table.' ' .
+           'SET '.$db_data_col.' = \''.$data.'\', ' .
+           $db_time_col.' = '.time().' ' .
+           'WHERE '.$db_id_col.' = \''.$id.'\'';
+
+    if (@mysql_query($sql, $this->resource))
+    {
+      return true;
+    }
+
+    // failed to write session data
+    $error = 'MySQLSessionStorage cannot write session data for id "%s"';
+    $error = sprintf($error, $id);
+
+    throw new sfDatabaseException($error);
+  }
+
+  /**
+   * Executes the shutdown procedure.
+   *
+   */
+  public function shutdown()
+  {
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfMySQLSessionStorage.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfPDOSessionStorage.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfPDOSessionStorage.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfPDOSessionStorage.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,280 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004, 2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004, 2005 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Provides support for session storage using a PDO database abstraction layer.
+ *
+ * <b>Required parameters:</b>
+ *
+ * # <b>db_table</b> - [none] - The database table in which session data will be stored.
+ *
+ * <b>Optional parameters:</b>
+ *
+ * # <b>database</b>     - [default]   - The database connection to use (see databases.yml).
+ * # <b>db_id_col</b>    - [sess_id]   - The database column in which the session id will be stored.
+ * # <b>db_data_col</b>  - [sess_data] - The database column in which the session data will be stored.
+ * # <b>db_time_col</b>  - [sess_time] - The database column in which the session timestamp will be stored.
+ * # <b>session_name</b> - [symfony]   - The name of the session.
+ *
+ * @package    symfony
+ * @subpackage storage
+ * @author     Mathew Toth <developer en poetryleague.com>
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfPDOSessionStorage.class.php 3329 2007-01-23 08:29:34Z fabien $
+ */
+class sfPDOSessionStorage extends sfSessionStorage
+{
+  /**
+   * PDO connection
+   * @var Connection
+   */
+  protected $db;
+
+  /**
+   * Initializes this Storage instance.
+   *
+   * @param sfContext A sfContext instance
+   * @param array     An associative array of initialization parameters
+   *
+   * @return boolean true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>InitializationException</b> If an error occurs while initializing this Storage
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // disable auto_start
+    $parameters['auto_start'] = false;
+
+    // initialize the parent
+    parent::initialize($context, $parameters);
+
+    if (!$this->getParameterHolder()->has('db_table'))
+    {
+      // missing required 'db_table' parameter
+      $error = 'Factory configuration file is missing required "db_table" parameter for the Storage category';
+
+      throw new sfInitializationException($error);
+    }
+
+    // use this object as the session handler
+    session_set_save_handler(array($this, 'sessionOpen'),
+                             array($this, 'sessionClose'),
+                             array($this, 'sessionRead'),
+                             array($this, 'sessionWrite'),
+                             array($this, 'sessionDestroy'),
+                             array($this, 'sessionGC'));
+
+    // start our session
+    session_start();
+  }
+
+  /**
+  * Closes a session.
+  *
+  * @return boolean true, if the session was closed, otherwise false
+  */
+  public function sessionClose()
+  {
+    // do nothing
+    return true;
+  }
+
+  /**
+   * Destroys a session.
+   *
+   * @param string A session ID
+   *
+   * @return boolean true, if the session was destroyed, otherwise an exception is thrown
+   *
+   * @throws <b>DatabaseException</b> If the session cannot be destroyed
+   */
+  public function sessionDestroy($id)
+  {
+    // get table/column
+    $db_table  = $this->getParameterHolder()->get('db_table');
+    $db_id_col = $this->getParameterHolder()->get('db_id_col', 'sess_id');
+
+    // delete the record associated with this id
+    $sql = 'DELETE FROM '.$db_table.' WHERE '.$db_id_col.'= ?';
+
+    try
+    {
+      $stmt = $this->db->prepare($sql);
+      $stmt->bindParam(1, $id, PDO::PARAM_STR); // setString(1, $id);
+      $stmt->execute();
+    }
+    catch (PDOException $e)
+    {
+      $error = sprintf('PDOException was thrown when trying to manipulate session data. Message: %s', $e->getMessage());
+
+      throw new sfDatabaseException($error);
+    }
+  }
+
+  /**
+   * Cleans up old sessions.
+   *
+   * @param int The lifetime of a session
+   *
+   * @return boolean true, if old sessions have been cleaned, otherwise an exception is thrown
+   *
+   * @throws <b>DatabaseException</b> If any old sessions cannot be cleaned
+   */
+  public function sessionGC($lifetime)
+  {
+    // determine deletable session time
+    $time = time() - $lifetime;
+
+    // get table/column
+    $db_table    = $this->getParameterHolder()->get('db_table');
+    $db_time_col = $this->getParameterHolder()->get('db_time_col', 'sess_time');
+
+    // delete the record associated with this id
+    $sql = 'DELETE FROM '.$db_table.' WHERE '.$db_time_col.' < '.$time;
+
+    try
+    {
+      $this->db->query($sql);
+      return true;
+    }
+    catch (PDOException $e)
+    {
+      $error = sprintf('PDOException was thrown when trying to manipulate session data. Message: %s', $e->getMessage());
+
+      throw new sfDatabaseException($error);
+    }
+  }
+
+  /**
+   * Opens a session.
+   *
+   * @param string
+   * @param string
+   *
+   * @return boolean true, if the session was opened, otherwise an exception is thrown
+   *
+   * @throws <b>DatabaseException</b> If a connection with the database does not exist or cannot be created
+   */
+  public function sessionOpen($path, $name)
+  {
+    // what database are we using?
+    $database = $this->getParameterHolder()->get('database', 'default');
+
+    $this->db = $this->getContext()->getDatabaseConnection($database);
+    if ($this->db == null || !$this->db instanceof PDO)
+    {
+      $error = 'PDO dabatase connection doesn\'t exist. Unable to open session.';
+
+      throw new sfDatabaseException($error);
+    }
+
+    return true;
+  }
+
+  /**
+   * Reads a session.
+   *
+   * @param string A session ID
+   *
+   * @return boolean true, if the session was read, otherwise an exception is thrown
+   *
+   * @throws <b>DatabaseException</b> If the session cannot be read
+   */
+  public function sessionRead($id)
+  {
+    // get table/columns
+    $db_table    = $this->getParameterHolder()->get('db_table');
+    $db_data_col = $this->getParameterHolder()->get('db_data_col', 'sess_data');
+    $db_id_col   = $this->getParameterHolder()->get('db_id_col', 'sess_id');
+    $db_time_col = $this->getParameterHolder()->get('db_time_col', 'sess_time');
+
+    try
+    {
+      $sql = 'SELECT '.$db_data_col.' FROM '.$db_table.' WHERE '.$db_id_col.'=?';
+
+      $stmt = $this->db->prepare($sql);
+      $stmt->bindParam(1, $id, PDO::PARAM_STR, 255);
+
+      $stmt->execute();
+      if ($data = $stmt->fetchColumn())
+      {
+        return $data;
+      }
+      else
+      {
+        // session does not exist, create it
+        $sql = 'INSERT INTO '.$db_table.'('.$db_id_col.', '.$db_data_col.', '.$db_time_col.') VALUES (?, ?, ?)';
+
+        $stmt = $this->db->prepare($sql);
+        $stmt->bindParam(1, $id, PDO::PARAM_STR); // setString(1, $id);
+        $stmt->bindValue(2, '', PDO::PARAM_STR); // setString(2, '');
+        $stmt->bindValue(3, time(), PDO::PARAM_INT); // setInt(3, time());
+        $stmt->execute();
+
+        return '';
+      }
+    }
+    catch (PDOException $e)
+    {
+      $error = sprintf('PDOException was thrown when trying to manipulate session data. Message: %s', $e->getMessage());
+
+      throw new sfDatabaseException($error);
+    }
+  }
+
+  /**
+   * Writes session data.
+   *
+   * @param string A session ID
+   * @param string A serialized chunk of session data
+   *
+   * @return boolean true, if the session was written, otherwise an exception is thrown
+   *
+   * @throws <b>DatabaseException</b> If the session data cannot be written
+   */
+  public function sessionWrite($id, $data)
+  {
+    // get table/column
+    $db_table    = $this->getParameterHolder()->get('db_table');
+    $db_data_col = $this->getParameterHolder()->get('db_data_col', 'sess_data');
+    $db_id_col   = $this->getParameterHolder()->get('db_id_col', 'sess_id');
+    $db_time_col = $this->getParameterHolder()->get('db_time_col', 'sess_time');
+
+    $sql = 'UPDATE '.$db_table.' SET '.$db_data_col.' = ?, '.$db_time_col.' = '.time().' WHERE '.$db_id_col.'= ?';
+
+    try
+    {
+      $stmt = $this->db->prepare($sql);
+      $stmt->bindParam(1, $data, PDO::PARAM_STR); // setString(1, $data);
+      $stmt->bindParam(2, $id, PDO::PARAM_STR); // setString(2, $id);
+      $stmt->execute();
+      return true;
+    }
+
+    catch (PDOException $e)
+    {
+      $error = sprintf('PDOException was thrown when trying to manipulate session data. Message: %s', $e->getMessage());
+
+      throw new sfDatabaseException($error);
+    }
+
+    return false;
+  }
+
+  /**
+   * Executes the shutdown procedure.
+   *
+   */
+  public function shutdown()
+  {
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfPDOSessionStorage.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfPostgreSQLSessionStorage.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfPostgreSQLSessionStorage.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfPostgreSQLSessionStorage.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,280 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Provides support for session storage using a PostgreSQL brand database.
+ *
+ * <b>Required parameters:</b>
+ *
+ * # <b>db_table</b> - [none] - The database table in which session data will be stored.
+ *
+ * <b>Optional parameters:</b>
+ *
+ * # <b>db_id_col</b>    - [sess_id]   - The database column in which the
+ *                                       session id will be stored.
+ * # <b>db_data_col</b>  - [sess_data] - The database column in which the
+ *                                       session data will be stored.
+ * # <b>db_time_col</b>  - [sess_time] - The database column in which the
+ *                                       session timestamp will be stored.
+ * # <b>session_name</b> - [symfony]   - The name of the session.
+ *
+ * @package    symfony
+ * @subpackage storage
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfPostgreSQLSessionStorage.class.php 3329 2007-01-23 08:29:34Z fabien $
+ */
+class sfPostgreSQLSessionStorage extends sfSessionStorage
+{
+  protected
+    $resource = null;
+
+  /**
+   * Initializes this Storage instance.
+   *
+   * @param sfContext A sfContext instance
+   * @param array   An associative array of initialization parameters
+   *
+   * @return boolean true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this Storage
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // disable auto_start
+    $parameters['auto_start'] = false;
+
+    // initialize the parent
+    parent::initialize($context, $parameters);
+
+    if (!$this->getParameterHolder()->has('db_table'))
+    {
+      // missing required 'db_table' parameter
+      $error = 'Factory configuration file is missing required "db_table" parameter for the Storage category';
+
+      throw new sfInitializationException($error);
+    }
+
+    // use this object as the session handler
+    session_set_save_handler(array($this, 'sessionOpen'),
+                             array($this, 'sessionClose'),
+                             array($this, 'sessionRead'),
+                             array($this, 'sessionWrite'),
+                             array($this, 'sessionDestroy'),
+                             array($this, 'sessionGC'));
+
+    // start our session
+    session_start();
+  }
+
+  /**
+   * Closes a session.
+   *
+   * @return boolean true, if the session was closed, otherwise false
+   */
+  public function sessionClose()
+  {
+    // do nothing
+    return true;
+  }
+
+  /**
+   * Destroys a session.
+   *
+   * @param string A session ID
+   *
+   * @return boolean true, if the session was destroyed, otherwise an exception is thrown
+   *
+   * @throws <b>sfDatabaseException</b> If the session cannot be destroyed
+   */
+  public function sessionDestroy($id)
+  {
+    // get table/column
+    $db_table  = $this->getParameterHolder()->get('db_table');
+    $db_id_col = $this->getParameterHolder()->get('db_id_col', 'sess_id');
+
+    // cleanup the session id, just in case
+    $id = addslashes($id);
+
+    // delete the record associated with this id
+    $sql = 'DELETE FROM '.$db_table.' WHERE '.$db_id_col.' = \''.$id.'\'';
+
+    if (@pg_query($this->resource, $sql))
+    {
+      return true;
+    }
+
+    // failed to destroy session
+    $error = 'PostgreSQLSessionStorage cannot destroy session id "%s"';
+    $error = sprintf($error, $id);
+
+    throw new sfDatabaseException($error);
+  }
+
+  /**
+   * Cleans up old sessions.
+   *
+   * @param int The lifetime of a session
+   *
+   * @return boolean true, if old sessions have been cleaned, otherwise an exception is thrown
+   *
+   * @throws <b>sfDatabaseException</b> If any old sessions cannot be cleaned
+   */
+  public function sessionGC($lifetime)
+  {
+    // determine deletable session time
+    $time = time() - $lifetime;
+
+    // get table/column
+    $db_table    = $this->getParameterHolder()->get('db_table');
+    $db_time_col = $this->getParameterHolder()->get('db_time_col', 'sess_time');
+
+    // delete the record associated with this id
+    $sql = 'DELETE FROM '.$db_table.' WHERE '.$db_time_col.' < '.$lifetime;
+
+    if (@pg_query($this->resource, $sql))
+    {
+      return true;
+    }
+
+    // failed to cleanup old sessions
+    $error = 'PostgreSQLSessionStorage cannot delete old sessions';
+
+    throw new sfDatabaseException($error);
+  }
+
+  /**
+   * Opens a session.
+   *
+   * @param string
+   * @param string
+   *
+   * @return boolean true, if the session was opened, otherwise an exception is thrown
+   *
+   * @throws <b>sfDatabaseException</b> If a connection with the database does
+   *                                  not exist or cannot be created
+   */
+  public function sessionOpen($path, $name)
+  {
+    // what database are we using?
+    $database = $this->getParameterHolder()->get('database', 'default');
+
+    // get the database resource
+    $this->resource = $this->getContext()
+                           ->getDatabaseManager()
+                           ->getDatabase($database)
+                           ->getResource();
+
+    return true;
+  }
+
+  /**
+   * Reads a session.
+   *
+   * @param string A session ID
+   *
+   * @return boolean true, if the session was read, otherwise an exception is thrown
+   *
+   * @throws <b>sfDatabaseException</b> If the session cannot be read
+   */
+  public function sessionRead($id)
+  {
+    // get table/column
+    $db_table    = $this->getParameterHolder()->get('db_table');
+    $db_data_col = $this->getParameterHolder()->get('db_data_col', 'sess_data');
+    $db_id_col   = $this->getParameterHolder()->get('db_id_col', 'sess_id');
+    $db_time_col = $this->getParameterHolder()->get('db_time_col', 'sess_time');
+
+    // cleanup the session id, just in case
+    $id = addslashes($id);
+
+    // delete the record associated with this id
+    $sql = 'SELECT '.$db_data_col.' ' .
+           'FROM '.$db_table.' ' .
+           'WHERE '.$db_id_col.' = \''.$id.'\'';
+
+    $result = @pg_query($this->resource, $sql);
+
+    if ($result != false && @pg_num_rows($result) == 1)
+    {
+      // found the session
+      $data = pg_fetch_row($result);
+
+      return $data[0];
+    }
+    else
+    {
+      // session does not exist, create it
+      $sql = 'INSERT INTO '.$db_table.' ('.$db_id_col.', ' .
+             $db_data_col.', '.$db_time_col.') VALUES (' .
+             '\''.$id.'\', \'\', '.time().')';
+
+      if (@pg_query($this->resource, $sql))
+      {
+        return '';
+      }
+
+      // can't create record
+      $error = 'PostgreSQLSessionStorage cannot create new record for id "%s"';
+      $error = sprintf($error, $id);
+
+      throw new sfDatabaseException($error);
+    }
+  }
+
+  /**
+   * Writes session data.
+   *
+   * @param string A session ID
+   * @param string A serialized chunk of session data
+   *
+   * @return boolean true, if the session was written, otherwise an exception is thrown
+   *
+   * @throws <b>sfDatabaseException</b> If the session data cannot be written
+   */
+  public function sessionWrite($id, &$data)
+  {
+    // get table/column
+    $db_table    = $this->getParameterHolder()->get('db_table');
+    $db_data_col = $this->getParameterHolder()->get('db_data_col', 'sess_data');
+    $db_id_col   = $this->getParameterHolder()->get('db_id_col', 'sess_id');
+    $db_time_col = $this->getParameterHolder()->get('db_time_col', 'sess_time');
+
+    // cleanup the session id and data, just in case
+    $id   = addslashes($id);
+    $data = addslashes($data);
+
+    // delete the record associated with this id
+    $sql = 'UPDATE '.$db_table.' '.
+           'SET '.$db_data_col.' = \''.$data.'\', '.
+           $db_time_col.' = '.time().' '.
+           'WHERE '.$db_id_col.' = \''.$id.'\'';
+
+    if (@pg_query($this->resource, $sql))
+    {
+      return true;
+    }
+
+    // failed to write session data
+    $error = 'PostgreSQLSessionStorage cannot write session data for id "%s"';
+    $error = sprintf($error, $id);
+
+    throw new sfDatabaseException($error);
+  }
+
+  /**
+   * Executes the shutdown procedure.
+   *
+   */
+  public function shutdown()
+  {
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfPostgreSQLSessionStorage.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfSessionStorage.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfSessionStorage.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfSessionStorage.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,146 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfSessionStorage allows you to store persistent symfony data in the user session.
+ *
+ * <b>Optional parameters:</b>
+ *
+ * # <b>auto_start</b>   - [Yes]     - Should session_start() automatically be called?
+ * # <b>session_name</b> - [symfony] - The name of the session.
+ *
+ * @package    symfony
+ * @subpackage storage
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfSessionStorage.class.php 3329 2007-01-23 08:29:34Z fabien $
+ */
+class sfSessionStorage extends sfStorage
+{
+  /**
+   * Initializes this Storage instance.
+   *
+   * @param sfContext A sfContext instance
+   * @param array   An associative array of initialization parameters
+   *
+   * @return boolean true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this Storage
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // initialize parent
+    parent::initialize($context, $parameters);
+
+    // set session name
+    $sessionName = $this->getParameterHolder()->get('session_name', 'symfony');
+
+    session_name($sessionName);
+
+    $use_cookies = (boolean) ini_get('session.use_cookies');
+    if (!$use_cookies)
+    {
+      $sessionId = $context->getRequest()->getParameter($sessionName, '');
+
+      if ($sessionId != '')
+      {
+        session_id($sessionId);
+      }
+    }
+
+    $cookieDefaults = session_get_cookie_params();
+    $lifetime = $this->getParameter('session_cookie_lifetime', $cookieDefaults['lifetime']);
+    $path     = $this->getParameter('session_cookie_path',     $cookieDefaults['path']);
+    $domain   = $this->getParameter('session_cookie_domain',   $cookieDefaults['domain']);
+    $secure   = $this->getParameter('session_cookie_secure',   $cookieDefaults['secure']);
+    $httpOnly = $this->getParameter('session_cookie_httponly', isset($cookieDefaults['httponly']) ? $cookieDefaults['httponly'] : false);
+    if (version_compare(phpversion(), '5.2', '>='))
+    {
+      session_set_cookie_params($lifetime, $path, $domain, $secure, $httpOnly);
+    }
+    else
+    {
+      session_set_cookie_params($lifetime, $path, $domain, $secure);
+    }
+
+    if ($this->getParameter('auto_start', true))
+    {
+      // start our session
+      session_start();
+    }
+  }
+
+  /**
+   * Reads data from this storage.
+   *
+   * The preferred format for a key is directory style so naming conflicts can be avoided.
+   *
+   * @param string A unique key identifying your data
+   *
+   * @return mixed Data associated with the key
+   */
+  public function & read($key)
+  {
+    $retval = null;
+
+    if (isset($_SESSION[$key]))
+    {
+      $retval =& $_SESSION[$key];
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Removes data from this storage.
+   *
+   * The preferred format for a key is directory style so naming conflicts can be avoided.
+   *
+   * @param string A unique key identifying your data
+   *
+   * @return mixed Data associated with the key
+   */
+  public function & remove($key)
+  {
+    $retval = null;
+
+    if (isset($_SESSION[$key]))
+    {
+      $retval =& $_SESSION[$key];
+      unset($_SESSION[$key]);
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Writes data to this storage.
+   *
+   * The preferred format for a key is directory style so naming conflicts can be avoided.
+   *
+   * @param string A unique key identifying your data
+   * @param mixed  Data associated with your key
+   *
+   */
+  public function write($key, &$data)
+  {
+    $_SESSION[$key] =& $data;
+  }
+
+  /**
+   * Executes the shutdown procedure.
+   *
+   */
+  public function shutdown()
+  {
+    // don't need a shutdown procedure because read/write do it in real-time
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfSessionStorage.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfSessionTestStorage.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfSessionTestStorage.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfSessionTestStorage.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,152 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfSessionTestStorage is a fake sfSessionStorage implementation to allow easy testing.
+ *
+ * @package    symfony
+ * @subpackage storage
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfSessionTestStorage.class.php 3329 2007-01-23 08:29:34Z fabien $
+ */
+class sfSessionTestStorage extends sfStorage
+{
+  protected
+    $sessionId   = null,
+    $sessionData = array(),
+    $sessionPath = null;
+
+  /**
+   * Initializes this Storage instance.
+   *
+   * @param sfContext A sfContext instance
+   * @param array   An associative array of initialization parameters
+   *
+   * @return boolean true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this Storage
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // initialize parent
+    parent::initialize($context, $parameters);
+
+    $this->sessionPath = sfConfig::get('sf_test_cache_dir').DIRECTORY_SEPARATOR.'sessions';
+
+    if (array_key_exists('session_id', $_SERVER))
+    {
+      $this->sessionId = $_SERVER['session_id'];
+
+      // we read session data from temp file
+      $file = $this->sessionPath.DIRECTORY_SEPARATOR.$this->sessionId.'.session';
+      $this->sessionData = file_exists($file) ? unserialize(file_get_contents($file)) : array();
+    }
+    else
+    {
+      $this->sessionId   = md5(uniqid(rand(), true));
+      $this->sessionData = array();
+    }
+  }
+
+  /**
+   * Gets session id for the current session storage instance.
+   *
+   * @return string Session id
+   */
+  public function getSessionId()
+  {
+    return $this->sessionId;
+  }
+
+  /**
+   * Reads data from this storage.
+   *
+   * The preferred format for a key is directory style so naming conflicts can be avoided.
+   *
+   * @param string A unique key identifying your data
+   *
+   * @return mixed Data associated with the key
+   */
+  public function & read($key)
+  {
+    $retval = null;
+
+    if (isset($this->sessionData[$key]))
+    {
+      $retval =& $this->sessionData[$key];
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Removes data from this storage.
+   *
+   * The preferred format for a key is directory style so naming conflicts can be avoided.
+   *
+   * @param string A unique key identifying your data
+   *
+   * @return mixed Data associated with the key
+   */
+  public function & remove($key)
+  {
+    $retval = null;
+
+    if (isset($this->sessionData[$key]))
+    {
+      $retval =& $this->sessionData[$key];
+      unset($this->sessionData[$key]);
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Writes data to this storage.
+   *
+   * The preferred format for a key is directory style so naming conflicts can be avoided
+   *
+   * @param string A unique key identifying your data
+   * @param mixed  Data associated with your key
+   *
+   */
+  public function write($key, &$data)
+  {
+    $this->sessionData[$key] =& $data;
+  }
+
+  /**
+   * Clears all test sessions.
+   */
+  public function clear()
+  {
+    sfToolkit::clearDirectory($this->sessionPath);
+  }
+
+  /**
+   * Executes the shutdown procedure.
+   *
+   */
+  public function shutdown()
+  {
+    if ($this->sessionId)
+    {
+      $current_umask = umask(0000);
+      if (!is_dir($this->sessionPath))
+      {
+        mkdir($this->sessionPath, 0777, true);
+      }
+      umask($current_umask);
+      file_put_contents($this->sessionPath.DIRECTORY_SEPARATOR.$this->sessionId.'.session', serialize($this->sessionData));
+      $this->sessionId   = '';
+      $this->sessionData = array();
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfSessionTestStorage.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfStorage.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfStorage.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfStorage.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,174 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfStorage allows you to customize the way symfony stores its persistent data.
+ *
+ * @package    symfony
+ * @subpackage storage
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfStorage.class.php 3329 2007-01-23 08:29:34Z fabien $
+ */
+abstract class sfStorage
+{
+  protected
+    $parameterHolder = null,
+    $context         = null;
+
+  /**
+   * Retrieves the current application context.
+   *
+   * @return sfContext A sfContext instance
+   */
+  public function getContext()
+  {
+    return $this->context;
+  }
+
+  /**
+   * Initializes this Storage instance.
+   *
+   * @param sfContext A sfContext instance
+   * @param array   An associative array of initialization parameters
+   *
+   * @return boolean true, if initialization completes successfully, otherwise false
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this sfStorage
+   */
+  public function initialize($context, $parameters = array())
+  {
+    $this->context = $context;
+
+    $this->parameterHolder = new sfParameterHolder();
+    $this->getParameterHolder()->add($parameters);
+  }
+
+  /**
+   * Retrieves a new Storage implementation instance.
+   *
+   * @param string A Storage implementation name
+   *
+   * @return Storage A Storage implementation instance
+   *
+   * @throws <b>sfFactoryException</b> If a storage implementation instance cannot be created
+   */
+  public static function newInstance($class)
+  {
+    // the class exists
+    $object = new $class();
+
+    if (!($object instanceof sfStorage))
+    {
+      // the class name is of the wrong type
+      $error = 'Class "%s" is not of the type sfStorage';
+      $error = sprintf($error, $class);
+
+      throw new sfFactoryException($error);
+    }
+
+    return $object;
+  }
+
+  /**
+   * Reads data from this storage.
+   *
+   * The preferred format for a key is directory style so naming conflicts can be avoided.
+   *
+   * @param string A unique key identifying your data
+   *
+   * @return mixed Data associated with the key
+   *
+   * @throws <b>sfStorageException</b> If an error occurs while reading data from this storage
+   */
+  abstract function & read($key);
+
+  /**
+   * Removes data from this storage.
+   *
+   * The preferred format for a key is directory style so naming conflicts can be avoided.
+   *
+   * @param string A unique key identifying your data
+   *
+   * @return mixed Data associated with the key
+   *
+   * @throws <b>sfStorageException</b> If an error occurs while removing data from this storage
+   */
+  abstract function & remove($key);
+
+  /**
+   * Executes the shutdown procedure.
+   *
+   * @throws <b>sfStorageException</b> If an error occurs while shutting down this storage
+   */
+  abstract function shutdown();
+
+  /**
+   * Writes data to this storage.
+   *
+   * The preferred format for a key is directory style so naming conflicts can be avoided.
+   *
+   * @param string A unique key identifying your data
+   * @param mixed  Data associated with your key
+   *
+   * @throws <b>sfStorageException</b> If an error occurs while writing to this storage
+   */
+  abstract function write($key, &$data);
+
+  /**
+   * Retrieves the parameters from the storage.
+   *
+   * @return sfParameterHolder List of parameters
+   */
+  public function getParameterHolder()
+  {
+    return $this->parameterHolder;
+  }
+
+  /**
+   * Retrieves a parameter from the validator.
+   *
+   * @param string Parameter name
+   * @param mixed A default parameter
+   * @param string Namespace for the current storage
+   *
+   * @return mixed A parameter value
+   */
+  public function getParameter($name, $default = null, $ns = null)
+  {
+    return $this->parameterHolder->get($name, $default, $ns);
+  }
+
+  /**
+   * Indicates whether or not a parameter exist for the storage instance.
+   *
+   * @param string A parameter name
+   * @param string A parameter namespace
+   *
+   * @return boolean true, if parameter exists, otherwise false
+   */
+  public function hasParameter($name, $ns = null)
+  {
+    return $this->parameterHolder->has($name, $ns);
+  }
+
+  /**
+   * Sets a parameter for the current storage instance.
+   *
+   * @param string A parameter name
+   * @param mixed A parameter value
+   * @param string Namespace for the current storage
+   */
+  public function setParameter($name, $value, $ns = null)
+  {
+    return $this->parameterHolder->set($name, $value, $ns);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/storage/sfStorage.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/symfony.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/symfony.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/symfony.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,155 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Pre-initialization script.
+ *
+ * @package    symfony
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: symfony.php 3285 2007-01-15 20:01:09Z fabien $
+ */
+
+$sf_symfony_lib_dir = sfConfig::get('sf_symfony_lib_dir');
+if (!sfConfig::get('sf_in_bootstrap'))
+{
+  // YAML support
+  require_once($sf_symfony_lib_dir.'/util/sfYaml.class.php');
+
+  // cache support
+  require_once($sf_symfony_lib_dir.'/cache/sfCache.class.php');
+  require_once($sf_symfony_lib_dir.'/cache/sfFileCache.class.php');
+
+  // config support
+  require_once($sf_symfony_lib_dir.'/config/sfConfigCache.class.php');
+  require_once($sf_symfony_lib_dir.'/config/sfConfigHandler.class.php');
+  require_once($sf_symfony_lib_dir.'/config/sfYamlConfigHandler.class.php');
+  require_once($sf_symfony_lib_dir.'/config/sfAutoloadConfigHandler.class.php');
+  require_once($sf_symfony_lib_dir.'/config/sfRootConfigHandler.class.php');
+  require_once($sf_symfony_lib_dir.'/config/sfLoader.class.php');
+
+  // basic exception classes
+  require_once($sf_symfony_lib_dir.'/exception/sfException.class.php');
+  require_once($sf_symfony_lib_dir.'/exception/sfAutoloadException.class.php');
+  require_once($sf_symfony_lib_dir.'/exception/sfCacheException.class.php');
+  require_once($sf_symfony_lib_dir.'/exception/sfConfigurationException.class.php');
+  require_once($sf_symfony_lib_dir.'/exception/sfParseException.class.php');
+
+  // utils
+  require_once($sf_symfony_lib_dir.'/util/sfParameterHolder.class.php');
+}
+else
+{
+  require_once($sf_symfony_lib_dir.'/config/sfConfigCache.class.php');
+}
+
+// autoloading
+sfCore::initAutoload();
+
+try
+{
+  $configCache = sfConfigCache::getInstance();
+
+  // force setting default timezone if not set
+  if (function_exists('date_default_timezone_get'))
+  {
+    if ($default_timezone = sfConfig::get('sf_default_timezone'))
+    {
+      date_default_timezone_set($default_timezone);
+    }
+    else if (sfConfig::get('sf_force_default_timezone', true))
+    {
+      date_default_timezone_set(@date_default_timezone_get());
+    }
+  }
+
+  // get config instance
+  $sf_app_config_dir_name = sfConfig::get('sf_app_config_dir_name');
+
+  $sf_debug = sfConfig::get('sf_debug');
+
+  // load timer classes if in debug mode
+  if ($sf_debug)
+  {
+    require_once($sf_symfony_lib_dir.'/debug/sfTimerManager.class.php');
+    require_once($sf_symfony_lib_dir.'/debug/sfTimer.class.php');
+  }
+
+  // load base settings
+  include($configCache->checkConfig($sf_app_config_dir_name.'/settings.yml'));
+  if (sfConfig::get('sf_logging_enabled', true))
+  {
+    include($configCache->checkConfig($sf_app_config_dir_name.'/logging.yml'));
+  }
+  if ($file = $configCache->checkConfig($sf_app_config_dir_name.'/app.yml', true))
+  {
+    include($file);
+  }
+  if (sfConfig::get('sf_i18n'))
+  {
+    include($configCache->checkConfig($sf_app_config_dir_name.'/i18n.yml'));
+  }
+
+  // add autoloading callables
+  foreach ((array) sfConfig::get('sf_autoloading_functions', array()) as $callable)
+  {
+    sfCore::addAutoloadCallable($callable);
+  }
+
+  // error settings
+  ini_set('display_errors', $sf_debug ? 'on' : 'off');
+  error_reporting(sfConfig::get('sf_error_reporting'));
+
+  // create bootstrap file for next time
+  if (!sfConfig::get('sf_in_bootstrap') && !$sf_debug && !sfConfig::get('sf_test'))
+  {
+    $configCache->checkConfig($sf_app_config_dir_name.'/bootstrap_compile.yml');
+  }
+
+  // required core classes for the framework
+  // create a temp var to avoid substitution during compilation
+  if (!$sf_debug && !sfConfig::get('sf_test'))
+  {
+    $core_classes = $sf_app_config_dir_name.'/core_compile.yml';
+    $configCache->import($core_classes, false);
+  }
+
+  $configCache->import($sf_app_config_dir_name.'/php.yml', false);
+  $configCache->import($sf_app_config_dir_name.'/routing.yml', false);
+
+  // include all config.php from plugins
+  sfLoader::loadPluginConfig();
+
+  // compress output
+  ob_start(sfConfig::get('sf_compressed') ? 'ob_gzhandler' : '');
+}
+catch (sfException $e)
+{
+  $e->printStackTrace();
+}
+catch (Exception $e)
+{
+  if (sfConfig::get('sf_test'))
+  {
+    throw $e;
+  }
+
+  try
+  {
+    // wrap non symfony exceptions
+    $sfException = new sfException();
+    $sfException->printStackTrace($e);
+  }
+  catch (Exception $e)
+  {
+    header('HTTP/1.0 500 Internal Server Error');
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/symfony.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/test/sfTestBrowser.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/test/sfTestBrowser.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/test/sfTestBrowser.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,470 @@
+<?php
+
+require_once(dirname(__FILE__).'/../vendor/lime/lime.php');
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfTestBrowser simulates a fake browser which can test a symfony application.
+ *
+ * @package    symfony
+ * @subpackage test
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfTestBrowser.class.php 3329 2007-01-23 08:29:34Z fabien $
+ */
+class sfTestBrowser extends sfBrowser
+{
+  protected
+    $test = null;
+
+  /**
+   * Initializes the browser tester instance.
+   *
+   * @param string Hostname
+   * @param string Remote IP address
+   * @param array  Options
+   */
+  public function initialize($hostname = null, $remote = null, $options = array())
+  {
+    parent::initialize($hostname, $remote, $options);
+
+    $output = isset($options['output']) ? $options['output'] : new lime_output_color();
+
+    $this->test = new lime_test(null, $output);
+  }
+
+  /**
+   * Retrieves the lime_test instance.
+   *
+   * @return sfTestBrowser The lime_test instance
+   */
+  public function test()
+  {
+    return $this->test;
+  }
+
+  /**
+   * Retrieves and checks an action.
+   *
+   * @param string Module name
+   * @param string Action name
+   * @param string Url
+   * @param string The expected return status code
+   *
+   * @return sfBrowser The current sfBrowser instance
+   */
+  public function getAndCheck($module, $action, $url = null, $code = 200)
+  {
+    return $this->
+      get(null !== null ? $url : sprintf('/%s/%s', $module, $action))->
+      isStatusCode($code)->
+      isRequestParameter('module', $module)->
+      isRequestParameter('action', $action)
+    ;
+  }
+
+  /**
+   * Calls a request.
+   *
+   * @return sfBrowser The current sfBrowser instance
+   */
+  public function call($uri, $method = 'get', $parameters = array(), $changeStack = true)
+  {
+    $uri = $this->fixUri($uri);
+
+    $this->test->comment(sprintf('%s %s', strtolower($method), $uri));
+
+    return parent::call($uri, $method, $parameters, $changeStack);
+  }
+
+  /**
+   * Simulates the browser back button.
+   *
+   * @return sfBrowser The current sfBrowser instance
+   */
+  public function back()
+  {
+    $this->test->comment('back');
+
+    return parent::back();
+  }
+
+  /**
+   * Simulates the browser forward button.
+   *
+   * @return sfBrowser The current sfBrowser instance
+   */
+  public function forward()
+  {
+    $this->test->comment('forward');
+
+    return parent::forward();
+  }
+
+  /**
+   * Tests if the current request has been redirected.
+   *
+   * @param boolean Flag for redirection mode
+   *
+   * @return sfBrowser The current sfBrowser instance
+   */
+  public function isRedirected($boolean = true)
+  {
+    if ($location = $this->getContext()->getResponse()->getHttpHeader('location'))
+    {
+      $boolean ? $this->test->pass(sprintf('page redirected to "%s"', $location)) : $this->test->fail(sprintf('page redirected to "%s"', $location));
+    }
+    else
+    {
+      $boolean ? $this->test->fail('page redirected') : $this->test->pass('page not redirected');
+    }
+
+    return $this;
+  }
+
+  /**
+   * Checks that the current response contains a given text.
+   *
+   * @param string Uniform resource identifier
+   * @param string Text in the response
+   *
+   * @return sfBrowser The current sfBrowser instance
+   */
+  public function check($uri, $text = null)
+  {
+    $this->get($uri)->isStatusCode();
+
+    if ($text !== null)
+    {
+      $this->responseContains($text);
+    }
+
+    return $this;
+  }
+
+  /**
+   * Test an status code for the current test browser.
+   *
+   * @param string Status code to check, default 200
+   *
+   * @return sfBrowser The current sfBrowser instance
+   */
+  public function isStatusCode($statusCode = 200)
+  {
+    $this->test->is($this->getResponse()->getStatusCode(), $statusCode, sprintf('status code is "%s"', $statusCode));
+
+    return $this;
+  }
+
+  /**
+   * Tests whether or not a given string is in the response.
+   *
+   * @param string Text to check
+   *
+   * @return sfBrowser The current sfBrowser instance
+   */
+  public function responseContains($text)
+  {
+    $this->test->like($this->getResponse()->getContent(), '/'.preg_quote($text, '/').'/', sprintf('response contains "%s"', substr($text, 0, 40)));
+
+    return $this;
+  }
+
+  /**
+   * Tests whether or not a given key and value exists in the current request.
+   *
+   * @param string Key
+   * @param string Value
+   *
+   * @return sfBrowser The current sfBrowser instance
+   */
+  public function isRequestParameter($key, $value)
+  {
+    $this->test->is($this->getRequest()->getParameter($key), $value, sprintf('request parameter "%s" is "%s"', $key, $value));
+
+    return $this;
+  }
+
+  /**
+   * Checks that the request is forwarded to a given module/action.
+   *
+   * @param string The module name
+   * @param string The action name
+   * @param mixed  The position in the action stack (default to the last entry)
+   *
+   * @return object this
+   */
+  public function isForwardedTo($moduleName, $actionName, $position = 'last')
+  {
+    $actionStack = $this->getContext()->getActionStack();
+
+    switch ($position)
+    {
+      case 'first':
+        $entry = $actionStack->getFirstEntry();
+        break;
+      case 'last':
+        $entry = $actionStack->getLastEntry();
+        break;
+      default:
+        $entry = $actionStack->getEntry($position);
+    }
+
+    $this->test->is($entry->getModuleName(), $moduleName, sprintf('request is forwarded to the "%s" module (%s)', $moduleName, $position));
+    $this->test->is($entry->getActionName(), $actionName, sprintf('request is forwarded to the "%s" action (%s)', $actionName, $position));
+
+    return $this;
+  }
+
+  /**
+   * Tests for a response header.
+   *
+   * @param string Key
+   * @param string Value
+   *
+   * @return sfBrowser The current sfBrowser instance
+   */
+  public function isResponseHeader($key, $value)
+  {
+    $headers = $this->getResponse()->getHttpHeader($key);
+
+    $ok = false;
+    foreach ($headers as $header)
+    {
+      if ($header == $value)
+      {
+        $ok = true;
+        break;
+      }
+    }
+
+    $this->test->ok($ok, sprintf('response header "%s" is "%s"', $key, $value));
+
+    return $this;
+  }
+
+  /**
+   * Tests that the current response matches a given CSS selector.
+   *
+   * @param string The response selector
+   * @param string Flag for the selector
+   * @param array Options for the current test
+   *
+   * @return sfBrowser The current sfBrowser instance
+   */
+  public function checkResponseElement($selector, $value = true, $options = array())
+  {
+    $texts = $this->getResponseDomCssSelector()->getTexts($selector);
+
+    if (false === $value)
+    {
+      $this->test->is(count($texts), 0, sprintf('response selector "%s" does not exist', $selector));
+    }
+    else if (true === $value)
+    {
+      $this->test->cmp_ok(count($texts), '>', 0, sprintf('response selector "%s" exists', $selector));
+    }
+    else if (is_int($value))
+    {
+      $this->test->is(count($texts), $value, sprintf('response selector "%s" matches "%s" times', $selector, $value));
+    }
+    else if (preg_match('/^(!)?([^a-zA-Z0-9\\\\]).+?\\2[ims]?$/', $value, $match))
+    {
+      $position = isset($options['position']) ? $options['position'] : 0;
+      if ($match[1] == '!')
+      {
+        $this->test->unlike(@$texts[$position], substr($value, 1), sprintf('response selector "%s" does not match regex "%s"', $selector, substr($value, 1)));
+      }
+      else
+      {
+        $this->test->like(@$texts[$position], $value, sprintf('response selector "%s" matches regex "%s"', $selector, $value));
+      }
+    }
+    else
+    {
+      $position = isset($options['position']) ? $options['position'] : 0;
+      $this->test->is(@$texts[$position], $value, sprintf('response selector "%s" matches "%s"', $selector, $value));
+    }
+
+    if (isset($options['count']))
+    {
+      $this->test->is(count($texts), $options['count'], sprintf('response selector "%s" matches "%s" times', $selector, $options['count']));
+    }
+
+    return $this;
+  }
+
+  /**
+   * Tests if an exception is thrown by the latest request.
+   *
+   * @param string Class name
+   * @param string Message name
+   *
+   * @return sfBrowser The current sfBrowser instance
+   */
+  public function throwsException($class = null, $message = null)
+  {
+    $e = $this->getCurrentException();
+
+    if (null === $e)
+    {
+      $this->test->fail('response returns an exception');
+    }
+    else
+    {
+      if (null !== $class)
+      {
+        $this->test->ok($e instanceof $class, sprintf('response returns an exception of class "%s"', $class));
+      }
+
+      if (null !== $message && preg_match('/^(!)?([^a-zA-Z0-9\\\\]).+?\\2[ims]?$/', $message, $match))
+      {
+        if ($match[1] == '!')
+        {
+          $this->test->unlike($e->getMessage(), substr($message, 1), sprintf('response exception message does not match regex "%s"', $message));
+        }
+        else
+        {
+          $this->test->like($e->getMessage(), $message, sprintf('response exception message matches regex "%s"', $message));
+        }
+      }
+      else if (null !== $message)
+      {
+        $this->test->is($e->getMessage(), $message, sprintf('response exception message matches regex "%s"', $message));
+      }
+    }
+
+    return $this;
+  }
+
+  /**
+   * Tests if the given uri is cached.
+   *
+   * @param boolean Flag for checking the cache
+   * @param boolean If have or not layout
+   *
+   * @return sfBrowser The current sfBrowser instance
+   */
+  public function isCached($boolean, $with_layout = false)
+  {
+    return $this->isUriCached(sfRouting::getInstance()->getCurrentInternalUri(), $boolean, $with_layout);
+  }
+
+  /**
+   * Tests if the given uri is cached.
+   *
+   * @param string Uniform resource identifier
+   * @param boolean Flag for checking the cache
+   * @param boolean If have or not layout
+   *
+   * @param sfTestBrowser Test browser instance
+   */
+  public function isUriCached($uri, $boolean, $with_layout = false)
+  {
+    $cacheManager = $this->getContext()->getViewCacheManager();
+
+    // check that cache is enabled
+    if (!$cacheManager)
+    {
+      $this->test->ok(!$boolean, 'cache is disabled');
+
+      return $this;
+    }
+
+    if ($uri == sfRouting::getInstance()->getCurrentInternalUri())
+    {
+      $main = true;
+      $type = $with_layout ? 'page' : 'action';
+    }
+    else
+    {
+      $main = false;
+      $type = $uri;
+    }
+
+    // check layout configuration
+    if ($cacheManager->withLayout($uri) && !$with_layout)
+    {
+      $this->test->fail('cache without layout');
+      $this->test->skip('cache is not configured properly', 2);
+    }
+    else if (!$cacheManager->withLayout($uri) && $with_layout)
+    {
+      $this->test->fail('cache with layout');
+      $this->test->skip('cache is not configured properly', 2);
+    }
+    else
+    {
+      $this->test->pass('cache is configured properly');
+
+      // check page is cached
+      $ret = $this->test->is($cacheManager->has($uri), $boolean, sprintf('"%s" %s in cache', $type, $boolean ? 'is' : 'is not'));
+
+      // check that the content is ok in cache
+      if ($boolean)
+      {
+        if (!$ret)
+        {
+          $this->test->fail('content in cache is ok');
+        }
+        else if ($with_layout)
+        {
+          $response = unserialize($cacheManager->get($uri));
+          $content = $response->getContent();
+          $this->test->ok($content == $this->getResponse()->getContent(), 'content in cache is ok');
+        }
+        else if (true === $main)
+        {
+          $ret = unserialize($cacheManager->get($uri));
+          $content = $ret['content'];
+          $this->test->ok(false !== strpos($this->getResponse()->getContent(), $content), 'content in cache is ok');
+        }
+        else
+        {
+          $content = $cacheManager->get($uri);
+          $this->test->ok(false !== strpos($this->getResponse()->getContent(), $content), 'content in cache is ok');
+        }
+      }
+    }
+
+    return $this;
+  }
+}
+
+/**
+ * Error handler for the current test browser instance.
+ *
+ * @param mixed Error number
+ * @param string Error message
+ * @param string Error file
+ * @param mixed Error line
+ */
+function sfTestBrowserErrorHandler($errno, $errstr, $errfile, $errline)
+{
+  if (($errno & error_reporting()) == 0)
+  {
+    return;
+  }
+
+  $msg = sprintf('PHP send a "%s" error at %s line %s (%s)', '%s', $errfile, $errline, $errstr);
+  switch ($errno)
+  {
+    case E_WARNING:
+      throw new Exception(sprintf($msg, 'warning'));
+      break;
+    case E_NOTICE:
+      throw new Exception(sprintf($msg, 'notice'));
+      break;
+    case E_STRICT:
+      throw new Exception(sprintf($msg, 'strict'));
+      break;
+  }
+}
+
+set_error_handler('sfTestBrowserErrorHandler');


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/test/sfTestBrowser.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/sfBasicSecurityUser.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/sfBasicSecurityUser.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/sfBasicSecurityUser.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,256 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfBasicSecurityUser will handle any type of data as a credential.
+ *
+ * @package    symfony
+ * @subpackage user
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfBasicSecurityUser.class.php 3148 2007-01-04 19:34:28Z fabien $
+ */
+class sfBasicSecurityUser extends sfUser implements sfSecurityUser
+{
+  const LAST_REQUEST_NAMESPACE = 'symfony/user/sfUser/lastRequest';
+  const AUTH_NAMESPACE = 'symfony/user/sfUser/authenticated';
+  const CREDENTIAL_NAMESPACE = 'symfony/user/sfUser/credentials';
+
+  protected $lastRequest = null;
+
+  protected $credentials = null;
+  protected $authenticated = null;
+
+  protected $timedout = false;
+
+  /**
+   * Clears all credentials.
+   *
+   */
+  public function clearCredentials()
+  {
+    $this->credentials = null;
+    $this->credentials = array();
+  }
+
+  /**
+   * returns an array containing the credentials
+   */
+  public function listCredentials()
+  {
+    return $this->credentials;
+  }
+
+  /**
+   * Removes a credential.
+   *
+   * @param  mixed credential
+   */  
+  public function removeCredential($credential)
+  {
+    if ($this->hasCredential($credential))
+    {
+      foreach ($this->credentials as $key => $value)
+      {
+        if ($credential == $value)
+        {
+          if (sfConfig::get('sf_logging_enabled'))
+          {
+            $this->getContext()->getLogger()->info('{sfUser} remove credential "'.$credential.'"');
+          }
+
+          unset($this->credentials[$key]);
+          return;
+        }
+      }
+    }
+  }  
+
+  /**
+   * Adds a credential.
+   *
+   * @param  mixed credential
+   */
+  public function addCredential($credential)
+  {
+    $this->addCredentials(func_get_args());
+  }
+
+  /**
+   * Adds several credential at once.
+   *
+   * @param  mixed array or list of credentials
+   */
+  public function addCredentials()
+  {
+    if (func_num_args() == 0) return;
+
+    // Add all credentials
+    $credentials = (is_array(func_get_arg(0))) ? func_get_arg(0) : func_get_args();
+
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfUser} add credential(s) "'.implode(', ', $credentials).'"');
+    }
+
+    foreach ($credentials as $aCredential)
+    {
+      if (!in_array($aCredential, $this->credentials))
+      {
+        $this->credentials[] = $aCredential;
+      }
+    }
+  }
+
+  
+  /**
+   * Returns true if user has credential.
+   *
+   * @param  mixed credentials
+   * @param  boolean useAnd specify the mode, either AND or OR
+   * @return boolean
+   *
+   * @author Olivier Verdier <Olivier.Verdier en free.fr>
+   */
+  public function hasCredential($credentials, $useAnd = true)
+  {
+    if (!is_array($credentials))
+    {
+      return in_array($credentials, $this->credentials);
+    }
+
+    // now we assume that $credentials is an array
+    $test = false;
+
+    foreach ($credentials as $credential)
+    {
+      // recursively check the credential with a switched AND/OR mode
+      $test = $this->hasCredential($credential, $useAnd ? false : true);
+
+      if ($useAnd)
+      {
+        $test = $test ? false : true;
+      }
+
+      if ($test) // either passed one in OR mode or failed one in AND mode
+      {
+        break; // the matter is settled
+      }
+    }
+
+    if ($useAnd) // in AND mode we succeed if $test is false
+    {
+      $test = $test ? false : true;
+    }
+
+    return $test;
+  }
+
+  /**
+   * Returns true if user is authenticated.
+   *
+   * @return boolean
+   */
+  public function isAuthenticated()
+  {
+    return $this->authenticated;
+  }
+
+  /**
+   * Sets authentication for user.
+   *
+   * @param  boolean
+   */
+  public function setAuthenticated($authenticated)
+  {
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfUser} user is '.($authenticated === true ? '' : 'not ').'authenticated');
+    }
+
+    if ($authenticated === true)
+    {
+      $this->authenticated = true;
+    }
+    else
+    {
+      $this->authenticated = false;
+      $this->clearCredentials();
+    }
+  }
+
+  public function setTimedOut()
+  {
+    $this->timedout = true;
+  }
+
+  public function isTimedOut()
+  {
+    return $this->timedout;
+  }
+
+  /**
+   * Returns the timestamp of the last user request.
+   *
+   * @param  integer
+   */
+  public function getLastRequestTime()
+  {
+    return $this->lastRequest;
+  }
+
+  public function initialize($context, $parameters = null)
+  {
+    // initialize parent
+    parent::initialize($context, $parameters);
+
+    // read data from storage
+    $storage = $this->getContext()->getStorage();
+
+    $this->authenticated = $storage->read(self::AUTH_NAMESPACE);
+    $this->credentials   = $storage->read(self::CREDENTIAL_NAMESPACE);
+    $this->lastRequest   = $storage->read(self::LAST_REQUEST_NAMESPACE);
+
+    if ($this->authenticated == null)
+    {
+      $this->authenticated = false;
+      $this->credentials   = array();
+    }
+
+    // Automatic logout if no request for more than [sf_timeout]
+    if (null !== $this->lastRequest && (time() - $this->lastRequest) > sfConfig::get('sf_timeout'))
+    {
+      if (sfConfig::get('sf_logging_enabled'))
+      {
+        $this->getContext()->getLogger()->info('{sfUser} automatic user logout');
+      }
+      $this->setTimedOut();
+      $this->clearCredentials();
+      $this->setAuthenticated(false);
+    }
+
+    $this->lastRequest = time();
+  }
+
+  public function shutdown()
+  {
+    $storage = $this->getContext()->getStorage();
+
+    // write the last request time to the storage
+    $storage->write(self::LAST_REQUEST_NAMESPACE, $this->lastRequest);
+
+    $storage->write(self::AUTH_NAMESPACE,         $this->authenticated);
+    $storage->write(self::CREDENTIAL_NAMESPACE,   $this->credentials);
+
+    // call the parent shutdown method
+    parent::shutdown();
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/sfBasicSecurityUser.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/sfSecurityUser.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/sfSecurityUser.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/sfSecurityUser.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfSecurityUser interface provides advanced security manipulation methods.
+ *
+ * @package    symfony
+ * @subpackage user
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfSecurityUser.class.php 2971 2006-12-08 12:14:14Z fabien $
+ */
+interface sfSecurityUser
+{
+  /**
+   * Add a credential to this user.
+   *
+   * @param mixed Credential data.
+   *
+   * @return void
+   */
+  public function addCredential($credential);
+
+  /**
+   * Clear all credentials associated with this user.
+   *
+   * @return void
+   */
+  public function clearCredentials();
+
+  /**
+   * Indicates whether or not this user has a credential.
+   *
+   * @param mixed Credential data.
+   *
+   * @return bool true, if this user has the credential, otherwise false.
+   */
+  public function hasCredential($credential);
+
+  /**
+   * Indicates whether or not this user is authenticated.
+   *
+   * @return bool true, if this user is authenticated, otherwise false.
+   */
+  public function isAuthenticated();
+
+  /**
+   * Remove a credential from this user.
+   *
+   * @param mixed Credential data.
+   *
+   * @return void
+   */
+  public function removeCredential($credential);
+
+  /**
+   * Set the authenticated status of this user.
+   *
+   * @param bool A flag indicating the authenticated status of this user.
+   *
+   * @return void
+   */
+  public function setAuthenticated($authenticated);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/sfSecurityUser.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/sfUser.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/sfUser.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/sfUser.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,228 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * sfUser wraps a client session and provides accessor methods for user
+ * attributes. It also makes storing and retrieving multiple page form data
+ * rather easy by allowing user attributes to be stored in namespaces, which
+ * help organize data.
+ *
+ * @package    symfony
+ * @subpackage user
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfUser.class.php 2971 2006-12-08 12:14:14Z fabien $
+ */
+class sfUser
+{
+  /**
+   * The namespace under which attributes will be stored.
+   */
+  const ATTRIBUTE_NAMESPACE = 'symfony/user/sfUser/attributes';
+
+  const CULTURE_NAMESPACE = 'symfony/user/sfUser/culture';
+
+  protected
+    $parameterHolder = null,
+    $attributeHolder = null,
+    $culture         = null,
+    $context         = null;
+
+  /**
+   * Retrieve the current application context.
+   *
+   * @return Context A Context instance.
+   */
+  public function getContext()
+  {
+    return $this->context;
+  }
+
+  /**
+   * Initialize this User.
+   *
+   * @param Context A Context instance.
+   * @param array   An associative array of initialization parameters.
+   *
+   * @return bool true, if initialization completes successfully, otherwise
+   *              false.
+   *
+   * @throws <b>sfInitializationException</b> If an error occurs while initializing this User.
+   */
+  public function initialize($context, $parameters = array())
+  {
+    $this->context = $context;
+
+    $this->parameterHolder = new sfParameterHolder();
+    $this->parameterHolder->add($parameters);
+
+    $this->attributeHolder = new sfParameterHolder(self::ATTRIBUTE_NAMESPACE);
+
+    // read attributes from storage
+    $attributes = $context->getStorage()->read(self::ATTRIBUTE_NAMESPACE);
+    if (is_array($attributes))
+    {
+      foreach ($attributes as $namespace => $values)
+      {
+        $this->attributeHolder->add($values, $namespace);
+      }
+    }
+
+    // set the user culture to sf_culture parameter if present in the request
+    // otherwise
+    //  - use the culture defined in the user session
+    //  - use the default culture set in i18n.yml
+    if (!($culture = $context->getRequest()->getParameter('sf_culture')))
+    {
+      if (null === ($culture = $context->getStorage()->read(self::CULTURE_NAMESPACE)))
+      {
+        $culture = sfConfig::get('sf_i18n_default_culture', 'en');
+      }
+    }
+
+    $this->setCulture($culture);
+  }
+
+  /**
+   * Retrieve a new sfUser implementation instance.
+   *
+   * @param string A sfUser implementation name
+   *
+   * @return User A sfUser implementation instance.
+   *
+   * @throws <b>sfFactoryException</b> If a user implementation instance cannot
+   */
+  public static function newInstance($class)
+  {
+    // the class exists
+    $object = new $class();
+
+    if (!($object instanceof sfUser))
+    {
+      // the class name is of the wrong type
+      $error = 'Class "%s" is not of the type sfUser';
+      $error = sprintf($error, $class);
+
+      throw new sfFactoryException($error);
+    }
+
+    return $object;
+  }
+
+  /**
+   * Sets culture.
+   *
+   * @param  string culture
+   */
+  public function setCulture($culture)
+  {
+    if ($this->culture != $culture)
+    {
+      $this->culture = $culture;
+
+      // change the message format object with the new culture
+      if (sfConfig::get('sf_i18n'))
+      {
+        $this->context->getI18N()->setCulture($culture);
+      }
+
+      // add the culture in the routing default parameters
+      sfConfig::set('sf_routing_defaults', array_merge((array) sfConfig::get('sf_routing_defaults'), array('sf_culture' => $culture)));
+    }
+  }
+
+  /**
+   * Gets culture.
+   *
+   * @return string
+   */
+  public function getCulture()
+  {
+    return $this->culture;
+  }
+
+  public function getParameterHolder()
+  {
+    return $this->parameterHolder;
+  }
+
+  public function getAttributeHolder()
+  {
+    return $this->attributeHolder;
+  }
+
+  public function getAttribute($name, $default = null, $ns = null)
+  {
+    return $this->attributeHolder->get($name, $default, $ns);
+  }
+
+  public function hasAttribute($name, $ns = null)
+  {
+    return $this->attributeHolder->has($name, $ns);
+  }
+
+  public function setAttribute($name, $value, $ns = null)
+  {
+    return $this->attributeHolder->set($name, $value, $ns);
+  }
+
+  public function getParameter($name, $default = null, $ns = null)
+  {
+    return $this->parameterHolder->get($name, $default, $ns);
+  }
+
+  public function hasParameter($name, $ns = null)
+  {
+    return $this->parameterHolder->has($name, $ns);
+  }
+
+  public function setParameter($name, $value, $ns = null)
+  {
+    return $this->parameterHolder->set($name, $value, $ns);
+  }
+
+  /**
+   * Execute the shutdown procedure.
+   *
+   * @return void
+   */
+  public function shutdown()
+  {
+    $storage = $this->getContext()->getStorage();
+
+    $attributes = array();
+    foreach ($this->attributeHolder->getNamespaces() as $namespace)
+    {
+      $attributes[$namespace] = $this->attributeHolder->getAll($namespace);
+    }
+
+    // write attributes to the storage
+    $storage->write(self::ATTRIBUTE_NAMESPACE, $attributes);
+
+    // write culture to the storage
+    $storage->write(self::CULTURE_NAMESPACE, $this->culture);
+
+    session_write_close();
+  }
+
+  public function __call($method, $arguments)
+  {
+    if (!$callable = sfMixer::getCallable('sfUser:'.$method))
+    {
+      throw new sfException(sprintf('Call to undefined method sfUser::%s', $method));
+    }
+
+    array_unshift($arguments, $this);
+
+    return call_user_func_array($callable, $arguments);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/user/sfUser.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/Spyc.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/Spyc.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/Spyc.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1014 @@
+<?php
+  /** 
+   * Spyc -- A Simple PHP YAML Class
+   * @version 0.2.3 -- 2006-02-04
+   * @author Chris Wanstrath <chris en ozmm.org>
+   * @link http://spyc.sourceforge.net/
+   * @copyright Copyright 2005-2006 Chris Wanstrath
+   * @license http://www.opensource.org/licenses/mit-license.php MIT License
+   * @package Spyc
+   */
+
+/** 
+ * A node, used by Spyc for parsing YAML.
+ * @package Spyc
+ */
+class YAMLNode
+{
+  public $parent;
+  public $id;
+  public $data;
+  public $indent;
+  public $children = false;
+
+  static protected $lastNodeId = 0;
+
+  /**
+   * The constructor assigns the node a unique ID.
+   *
+   * @return void
+   */
+  public function __construct()
+  {
+    $this->id = ++self::$lastNodeId;
+  }
+}
+
+/**
+ * The Simple PHP YAML Class.
+ *
+ * This class can be used to read a YAML file and convert its contents
+ * into a PHP array.  It currently supports a very limited subsection of
+ * the YAML spec.
+ *
+ * Usage:
+ * <code>
+ *   $parser = new Spyc;
+ *   $array  = $parser->load($file);
+ * </code>
+ * @package Spyc
+ */
+class Spyc
+{
+  /**
+   * Load YAML into a PHP array statically
+   *
+   * The load method, when supplied with a YAML stream (string or file), 
+   * will do its best to convert YAML in a file into a PHP array.  Pretty 
+   * simple.
+   *  Usage: 
+   *  <code>
+   *   $array = Spyc::YAMLLoad('lucky.yml');
+   *   print_r($array);
+   *  </code>
+   *
+   * @return array
+   * @param string $input Path of YAML file or string containing YAML
+   */
+  public static function YAMLLoad($input)
+  {
+    $spyc = new Spyc();
+
+    return $spyc->load($input);
+  }
+
+  /**
+   * Dump YAML from PHP array statically
+   *
+   * The dump method, when supplied with an array, will do its best
+   * to convert the array into friendly YAML.  Pretty simple.  Feel free to
+   * save the returned string as nothing.yml and pass it around.
+   *
+   * Oh, and you can decide how big the indent is and what the wordwrap
+   * for folding is.  Pretty cool -- just pass in 'false' for either if 
+   * you want to use the default.
+   *
+   * Indent's default is 2 spaces, wordwrap's default is 40 characters.  And
+   * you can turn off wordwrap by passing in 0.
+   *
+   * @return string
+   * @param array $array PHP array
+   * @param int $indent Pass in false to use the default, which is 2 
+   * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40)
+   */
+  public static function YAMLDump($array, $indent = false, $wordwrap = false)
+  {
+    $spyc = new Spyc();
+
+    return $spyc->dump($array, $indent, $wordwrap);
+  }
+
+  /**
+   * Load YAML into a PHP array from an instantiated object
+   *
+   * The load method, when supplied with a YAML stream (string or file path), 
+   * will do its best to convert the YAML into a PHP array.  Pretty simple.
+   *  Usage: 
+   *  <code>
+   *   $parser = new Spyc;
+   *   $array  = $parser->load('lucky.yml');
+   *   print_r($array);
+   *  </code>
+   *
+   * @return array
+   * @param string $input Path of YAML file or string containing YAML
+   */
+  public function load($input)
+  {
+    // See what type of input we're talking about
+    // If it's not a file, assume it's a string
+    if (!empty($input) && (strpos($input, "\n") === false) && file_exists($input))
+    {
+      $file = $input;
+      $yaml = file($input);
+    }
+    else
+    {
+      $file = null;
+      $yaml = explode("\n", $input);
+    }
+
+    // Initiate some objects and values
+    $base              = new YAMLNode();
+    $base->indent      = 0;
+    $this->_lastIndent = 0;
+    $this->_lastNode   = $base->id;
+    $this->_inBlock    = false;
+    $this->_isInline   = false;
+
+    foreach ($yaml as $linenum => $line)
+    {
+      $ifchk = trim($line);
+
+      // If the line starts with a tab (instead of a space), throw a fit.
+      if (preg_match('/^(\t)+(\w+)/', $line))
+      {
+        $error = sprintf('ERROR: %sLine %d in your input YAML begins with a tab. YAML only recognizes spaces. Please reformat.', ($file ? "File $file " : ''), $linenum + 1);
+
+        throw new Exception($error);
+      }
+
+      if ($this->_inBlock === false && empty($ifchk))
+      {
+        continue;
+      }
+      else if ($this->_inBlock == true && empty($ifchk))
+      {
+        $last =& $this->_allNodes[$this->_lastNode];
+        $last->data[key($last->data)] .= "\n";
+      }
+      else if ($ifchk{0} != '#' && substr($ifchk, 0, 3) != '---')
+      {
+        // Create a new node and get its indent
+        $node         = new YAMLNode();
+        $node->indent = $this->_getIndent($line);
+
+        // Check where the node lies in the hierarchy
+        if ($this->_lastIndent == $node->indent)
+        {
+          // If we're in a block, add the text to the parent's data
+          if ($this->_inBlock === true)
+          {
+            $parent =& $this->_allNodes[$this->_lastNode];
+            $parent->data[key($parent->data)] .= trim($line).$this->_blockEnd;
+          }
+          else
+          {
+            // The current node's parent is the same as the previous node's
+            if (isset($this->_allNodes[$this->_lastNode]))
+            {
+              $node->parent = $this->_allNodes[$this->_lastNode]->parent;
+            }
+          }
+        }
+        else if ($this->_lastIndent < $node->indent)
+        {
+          if ($this->_inBlock === true)
+          {
+            $parent =& $this->_allNodes[$this->_lastNode];
+            $parent->data[key($parent->data)] .= substr($line, $this->_lastIndent).$this->_blockEnd;
+          }
+          else if ($this->_inBlock === false)
+          {
+            // The current node's parent is the previous node
+            $node->parent = $this->_lastNode;
+
+            // If the value of the last node's data was > or | we need to
+            // start blocking i.e. taking in all lines as a text value until
+            // we drop our indent.
+            $parent =& $this->_allNodes[$node->parent];
+            $this->_allNodes[$node->parent]->children = true;
+            if (is_array($parent->data))
+            {
+              $chk = $parent->data[key($parent->data)];
+              if ($chk === '>')
+              {
+                $this->_inBlock  = true;
+                $this->_blockEnd = ' ';
+                $parent->data[key($parent->data)] = str_replace('>', '', $parent->data[key($parent->data)]);
+                $parent->data[key($parent->data)] .= trim($line).' ';
+                $this->_allNodes[$node->parent]->children = false;
+                $this->_lastIndent = $node->indent;
+              }
+              else if ($chk === '|')
+              {
+                $this->_inBlock  = true;
+                $this->_blockEnd = "\n";
+                $parent->data[key($parent->data)] = str_replace('|', '', $parent->data[key($parent->data)]);
+                $parent->data[key($parent->data)] .= trim($line)."\n";
+                $this->_allNodes[$node->parent]->children = false;
+                $this->_lastIndent = $node->indent;
+              }
+            }
+          }
+        }
+        else if ($this->_lastIndent > $node->indent)
+        {
+          // Any block we had going is dead now
+          if ($this->_inBlock === true)
+          {
+            $this->_inBlock = false;
+            if ($this->_blockEnd = "\n")
+            {
+              $last =& $this->_allNodes[$this->_lastNode];
+              $last->data[key($last->data)] = trim($last->data[key($last->data)]);
+            }
+          }
+
+          // We don't know the parent of the node so we have to find it
+          // foreach ($this->_allNodes as $n) {
+          foreach ($this->_indentSort[$node->indent] as $n)
+          {
+            if ($n->indent == $node->indent)
+            {
+              $node->parent = $n->parent;
+            }
+          }
+        }
+
+        if ($this->_inBlock === false)
+        {
+          // Set these properties with information from our current node
+          $this->_lastIndent = $node->indent;
+          // Set the last node
+          $this->_lastNode = $node->id;
+          // Parse the YAML line and return its data
+          $node->data = $this->_parseLine($line);
+          // Add the node to the master list
+          $this->_allNodes[$node->id] = $node;
+          // Add a reference to the node in an indent array
+          $this->_indentSort[$node->indent][] =& $this->_allNodes[$node->id];
+          // Add a reference to the node in a References array if this node
+          // has a YAML reference in it.
+          if ( 
+             ((is_array($node->data)) &&
+              isset($node->data[key($node->data)]) &&
+              (!is_array($node->data[key($node->data)])))
+            &&
+             ((preg_match('/^&([^ ]+)/', $node->data[key($node->data)]))
+              || 
+              (preg_match('/^\*([^ ]+)/', $node->data[key($node->data)])))
+          )
+          {
+            $this->_haveRefs[] =& $this->_allNodes[$node->id];
+          }
+          else if (
+            ((is_array($node->data)) &&
+             isset($node->data[key($node->data)]) &&
+             (is_array($node->data[key($node->data)])))
+          )
+          {
+            // Incomplete reference making code.  Ugly, needs cleaned up.
+            foreach ($node->data[key($node->data)] as $d)
+            {
+              if (!is_array($d) && ((preg_match('/^&([^ ]+)/', $d)) || (preg_match('/^\*([^ ]+)/', $d))))
+              {
+                $this->_haveRefs[] =& $this->_allNodes[$node->id];
+              }
+            }
+          }
+        }
+      }
+    }
+    unset($node);
+
+    // Here we travel through node-space and pick out references (& and *)
+    $this->_linkReferences();
+
+    // Build the PHP array out of node-space
+    $trunk = $this->_buildArray();
+
+    return $trunk;
+  }
+
+  /**
+   * Dump PHP array to YAML
+   *
+   * The dump method, when supplied with an array, will do its best
+   * to convert the array into friendly YAML.  Pretty simple.  Feel free to
+   * save the returned string as tasteful.yml and pass it around.
+   *
+   * Oh, and you can decide how big the indent is and what the wordwrap
+   * for folding is.  Pretty cool -- just pass in 'false' for either if 
+   * you want to use the default.
+   *
+   * Indent's default is 2 spaces, wordwrap's default is 40 characters.  And
+   * you can turn off wordwrap by passing in 0.
+   *
+   * @return string
+   * @param array $array PHP array
+   * @param int $indent Pass in false to use the default, which is 2 
+   * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40)
+   */
+   public function dump($array, $indent = false, $wordwrap = false)
+   {
+    // Dumps to some very clean YAML.  We'll have to add some more features
+    // and options soon.  And better support for folding.
+
+    // New features and options.
+    if ($indent === false or !is_numeric($indent))
+    {
+      $this->_dumpIndent = 2;
+    }
+    else
+    {
+      $this->_dumpIndent = $indent;
+    }
+
+    if ($wordwrap === false or !is_numeric($wordwrap))
+    {
+      $this->_dumpWordWrap = 40;
+    }
+    else
+    {
+      $this->_dumpWordWrap = $wordwrap;
+    }
+
+    // New YAML document
+    $string = "---\n";
+
+    // Start at the base of the array and move through it.
+    foreach ($array as $key => $value)
+    {
+      $string .= $this->_yamlize($key, $value, 0);
+    }
+
+    return $string;
+  }
+
+  protected $_haveRefs;
+  protected $_allNodes;
+  protected $_lastIndent;
+  protected $_lastNode;
+  protected $_inBlock;
+  protected $_isInline;
+  protected $_dumpIndent;
+  protected $_dumpWordWrap;
+
+  /**
+   * Attempts to convert a key / value array item to YAML
+   *
+   * @return string
+   * @param $key The name of the key
+   * @param $value The value of the item
+   * @param $indent The indent of the current node
+   */
+   protected function _yamlize($key, $value, $indent)
+   {
+    if (is_array($value))
+    {
+      // It has children.  What to do?
+      // Make it the right kind of item
+      $string = $this->_dumpNode($key, null, $indent);
+      // Add the indent
+      $indent += $this->_dumpIndent;
+      // Yamlize the array
+      $string .= $this->_yamlizeArray($value, $indent);
+    }
+    else if (!is_array($value))
+    {
+      // It doesn't have children.  Yip.
+      $string = $this->_dumpNode($key, $value, $indent);
+    }
+
+    return $string;
+  }
+
+  /**
+   * Attempts to convert an array to YAML
+   *
+   * @return string
+   * @param $array The array you want to convert
+   * @param $indent The indent of the current level
+   */
+   protected function _yamlizeArray($array, $indent)
+   {
+    if (is_array($array))
+    {
+      $string = '';
+      foreach ($array as $key => $value)
+      {
+        $string .= $this->_yamlize($key, $value, $indent);
+      }
+
+      return $string;
+    }
+    else
+    {
+      return false;
+    }
+  }
+
+  /**
+   * Returns YAML from a key and a value
+   *
+   * @return string
+   * @param $key The name of the key
+   * @param $value The value of the item
+   * @param $indent The indent of the current node
+   */
+   protected function _dumpNode($key, $value, $indent)
+   {
+    if (is_object($value))
+    {
+       if (method_exists($value, '__toString'))
+       {
+         $value = (string) $value;
+       }
+       else
+       {
+         $ref = new ReflectionObject($value);
+         $value = $ref->getName();
+       }
+    }
+
+    // do some folding here, for blocks
+    if (strpos($value,"\n"))
+    {
+      $value = $this->_doLiteralBlock($value, $indent);
+    }
+    else
+    {
+      $value  = $this->_doFolding($value, $indent);
+    }
+
+    $spaces = str_repeat(' ', $indent);
+
+    if (is_int($key))
+    {
+      // It's a sequence
+      $string = $spaces.'- '.$value."\n";
+    }
+    else
+    {
+      // It's mapped
+      $string = $spaces.$key.': '.$value."\n";
+    }
+
+    return $string;
+  }
+
+  /**
+   * Creates a literal block for dumping
+   *
+   * @return string
+   * @param $value 
+   * @param $indent int The value of the indent
+   */ 
+   protected function _doLiteralBlock($value, $indent)
+   {
+    $exploded = explode("\n", $value);
+    $newValue = '|';
+    $indent  += $this->_dumpIndent;
+    $spaces   = str_repeat(' ', $indent);
+    foreach ($exploded as $line)
+    {
+      $newValue .= "\n".$spaces.trim($line);
+    }
+    return $newValue;
+  }
+
+  /**
+   * Folds a string of text, if necessary
+   *
+   * @return string
+   * @param $value The string you wish to fold
+   */
+   protected function _doFolding($value, $indent)
+   {
+    // Don't do anything if wordwrap is set to 0
+    if ($this->_dumpWordWrap === 0)
+    {
+      return $value;
+    }
+
+    if (strlen($value) > $this->_dumpWordWrap)
+    {
+      $indent += $this->_dumpIndent;
+      $indent = str_repeat(' ', $indent);
+      $wrapped = wordwrap($value, $this->_dumpWordWrap, "\n$indent");
+      $value   = ">\n".$indent.$wrapped;
+    }
+
+    return $value;
+  }
+
+  /* Methods used in loading */
+
+  /**
+   * Finds and returns the indentation of a YAML line
+   *
+   * @return int
+   * @param string $line A line from the YAML file
+   */
+   protected function _getIndent($line)
+   {
+    preg_match('/^\s{1,}/', $line, $match);
+    if (!empty($match[0]))
+    {
+      $indent = substr_count($match[0], ' ');
+    }
+    else
+    {
+      $indent = 0;
+    }
+
+    return $indent;
+  }
+
+  /**
+   * Parses YAML code and returns an array for a node
+   *
+   * @return array
+   * @param string $line A line from the YAML file
+   */
+  protected function _parseLine($line)
+  {
+    $line = trim($line);
+
+    $array = array();
+
+    if (preg_match('/^-(.*):$/', $line))
+    {
+      // It's a mapped sequence
+      $key         = trim(substr(substr($line,1), 0, -1));
+      $array[$key] = '';
+    }
+    else if ($line[0] == '-' && substr($line, 0, 3) != '---')
+    {
+      // It's a list item but not a new stream
+      if (strlen($line) > 1)
+      {
+        $value   = trim(substr($line, 1));
+        // Set the type of the value.  Int, string, etc
+        $value   = $this->_toType($value);
+        $array[] = $value;
+      }
+      else
+      {
+        $array[] = array();
+      }
+    }
+    else if (preg_match('/^(.+):/', $line, $key))
+    {
+      // It's a key/value pair most likely
+      // If the key is in double quotes pull it out
+      if (preg_match('/^(["\'](.*)["\'](\s)*:)/', $line, $matches))
+      {
+        $value = trim(str_replace($matches[1], '', $line));
+        $key   = $matches[2];
+      }
+      else
+      {
+        // Do some guesswork as to the key and the value
+        $explode = explode(':', $line);
+        $key     = trim($explode[0]);
+        array_shift($explode);
+        $value   = trim(implode(':', $explode));
+      }
+
+      // Set the type of the value.  Int, string, etc
+      $value = $this->_toType($value);
+      if (empty($key))
+      {
+        $array[]     = $value;
+      }
+      else
+      {
+        $array[$key] = $value;
+      }
+    }
+
+    return $array;
+  }
+
+  /**
+   * Finds the type of the passed value, returns the value as the new type.
+   *
+   * @param string $value
+   * @return mixed
+   */
+  protected function _toType($value)
+  {
+    $value = trim($value);
+    if ($value && !('"' == $value[0] || "'" == $value[0]))
+    {
+      $value = preg_replace('/\s*#(.+)$/', '', $value);
+    }
+
+    if (preg_match('/^("(.*)"|\'(.*)\')/', $value, $matches))
+    {
+      $value = (string) preg_replace('/(\'\'|\\\\\')/', "'", end($matches));
+      $value = preg_replace('/\\\\"/', '"', $value);
+    }
+    else if (preg_match('/^\\[\s*\\]$/', $value, $matches))
+    {
+      $value = array();
+    }
+    else if (preg_match('/^{}$/', $value, $matches))
+    {
+      $value = array();
+    }
+    else if (preg_match('/^\\[(.+)\\]$/', $value, $matches))
+    {
+      // Inline Sequence
+
+      // Take out strings sequences and mappings
+      $explode = $this->_inlineEscape($matches[1]);
+
+      // Propogate value array
+      $value  = array();
+      foreach ($explode as $v)
+      {
+        $value[] = $this->_toType($v);
+      }
+    }
+    else if (strpos($value,': ') !== false && !preg_match('/^{(.+)/', $value))
+    {
+        // It's a map
+        $array = explode(': ', $value);
+        $key   = trim($array[0]);
+        array_shift($array);
+        $value = trim(implode(': ', $array));
+        $value = $this->_toType($value);
+        $value = array($key => $value);
+    }
+    else if (preg_match("/{(.+)}$/", $value, $matches))
+    {
+      // Inline Mapping
+
+      // Take out strings sequences and mappings
+      $explode = $this->_inlineEscape($matches[1]);
+
+      // Propogate value array
+      $array = array();
+      foreach ($explode as $v)
+      {
+        $array = $array + $this->_toType($v);
+      }
+      $value = $array;
+    }
+    else if (strtolower($value) == 'null' or $value == '' or $value == '~')
+    {
+      $value = null;
+    }
+    else if (ctype_digit($value))
+    {
+      $value = (int) $value;
+    }
+    else if (in_array(strtolower($value), array('true', 'on', '+', 'yes', 'y')))
+    {
+      $value = true;
+    }
+    else if (in_array(strtolower($value), array('false', 'off', '-', 'no', 'n')))
+    {
+      $value = false;
+    }
+    else if (is_numeric($value))
+    {
+      $value = (float) $value;
+    }
+
+    return $value;
+  }
+
+  /**
+   * Used in inlines to check for more inlines or quoted strings
+   *
+   * @return array
+   */
+   protected function _inlineEscape($inline)
+   {
+    // There's gotta be a cleaner way to do this...
+    // While pure sequences seem to be nesting just fine,
+    // pure mappings and mappings with sequences inside can't go very
+    // deep.  This needs to be fixed.
+
+    // Check for strings
+    $regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/';
+    if (preg_match_all($regex, $inline, $strings))
+    {
+      foreach ($strings[0] as $string)
+      {
+        $saved_strings[] = $string;
+      }
+      $inline  = preg_replace($regex, 'YAMLString', $inline);
+    }
+    unset($regex);
+
+    // Check for sequences
+    if (preg_match_all('/\[(.+)\]/U', $inline, $seqs))
+    {
+      $inline = preg_replace('/\[(.+)\]/U', 'YAMLSeq', $inline);
+      $seqs   = $seqs[0];
+    }
+
+    // Check for mappings
+    if (preg_match_all('/{(.+)}/U', $inline, $maps))
+    {
+      $inline = preg_replace('/{(.+)}/U', 'YAMLMap', $inline);
+      $maps   = $maps[0];
+    }
+
+    $explode = explode(', ', $inline);
+
+    // Re-add the strings
+    if (!empty($saved_strings))
+    {
+      $i = 0;
+      foreach ($explode as $key => $value)
+      {
+        if (strpos($value,'YAMLString'))
+        {
+          $explode[$key] = str_replace('YAMLString', $saved_strings[$i], $value);
+          ++$i;
+        }
+      }
+    }
+
+    // Re-add the sequences
+    if (!empty($seqs))
+    {
+      $i = 0;
+      foreach ($explode as $key => $value)
+      {
+        if (strpos($value,'YAMLSeq') !== false)
+        {
+          $explode[$key] = str_replace('YAMLSeq', $seqs[$i], $value);
+          ++$i;
+        }
+      }
+    }
+
+    // Re-add the mappings
+    if (!empty($maps))
+    {
+      $i = 0;
+      foreach ($explode as $key => $value)
+      {
+        if (strpos($value,'YAMLMap') !== false)
+        {
+          $explode[$key] = str_replace('YAMLMap', $maps[$i], $value);
+          ++$i;
+        }
+      }
+    }
+
+    return $explode;
+  }
+
+  /**
+   * Builds the PHP array from all the YAML nodes we've gathered
+   *
+   * @return array
+   */
+   protected function _buildArray()
+   {
+    $trunk = array();
+
+    if (!isset($this->_indentSort[0]))
+    {
+      return $trunk;
+    }
+
+    foreach ($this->_indentSort[0] as $n)
+    {
+      if (empty($n->parent))
+      {
+        $this->_nodeArrayizeData($n);
+        // Check for references and copy the needed data to complete them.
+        $this->_makeReferences($n);
+        // Merge our data with the big array we're building
+        $trunk = $this->_array_kmerge($trunk, $n->data);
+      }
+    }
+
+    return $trunk;
+  }
+
+  /**
+   * Traverses node-space and sets references (& and *) accordingly
+   *
+   * @return bool
+   */
+   protected function _linkReferences()
+   {
+    if (is_array($this->_haveRefs))
+    {
+      foreach ($this->_haveRefs as $node)
+      {
+        if (!empty($node->data))
+        {
+          $key = key($node->data);
+          // If it's an array, don't check.
+          if (is_array($node->data[$key]))
+          {
+            foreach ($node->data[$key] as $k => $v)
+            {
+              $this->_linkRef($node, $key, $k, $v);
+            }
+          }
+          else
+          {
+            $this->_linkRef($node, $key);
+          }
+        }
+      } 
+    }
+
+    return true;
+  }
+
+  function _linkRef(&$n, $key, $k = null, $v = null)
+  {
+    if (empty($k) && empty($v))
+    {
+      // Look for &refs
+      if (preg_match('/^&([^ ]+)/', $n->data[$key], $matches))
+      {
+        // Flag the node so we know it's a reference
+        $this->_allNodes[$n->id]->ref = substr($matches[0], 1);
+        $this->_allNodes[$n->id]->data[$key] = substr($n->data[$key], strlen($matches[0]) + 1);
+      // Look for *refs
+      }
+      else if (preg_match('/^\*([^ ]+)/', $n->data[$key], $matches))
+      {
+        $ref = substr($matches[0], 1);
+        // Flag the node as having a reference
+        $this->_allNodes[$n->id]->refKey = $ref;
+      }
+    }
+    else if (!empty($k) && !empty($v))
+    {
+      if (preg_match('/^&([^ ]+)/', $v, $matches))
+      {
+        // Flag the node so we know it's a reference
+        $this->_allNodes[$n->id]->ref = substr($matches[0], 1);
+        $this->_allNodes[$n->id]->data[$key][$k] = substr($v, strlen($matches[0]) + 1);
+      // Look for *refs
+      }
+      else if (preg_match('/^\*([^ ]+)/', $v, $matches))
+      {
+        $ref = substr($matches[0], 1);
+        // Flag the node as having a reference
+        $this->_allNodes[$n->id]->refKey =  $ref;
+      }
+    }
+  }
+
+  /**
+   * Finds the children of a node and aids in the building of the PHP array
+   *
+   * @param int $nid The id of the node whose children we're gathering
+   * @return array
+   */
+   protected function _gatherChildren($nid)
+   {
+    $return = array();
+    $node   =& $this->_allNodes[$nid];
+    foreach ($this->_allNodes as $z)
+    {
+      if ($z->parent == $node->id)
+      {
+        // We found a child
+        $this->_nodeArrayizeData($z);
+        // Check for references
+        $this->_makeReferences($z);
+        // Merge with the big array we're returning
+        // The big array being all the data of the children of our parent node
+        $return = $this->_array_kmerge($return, $z->data);
+      }
+    }
+
+    return $return;
+  }
+
+  /**
+   * Turns a node's data and its children's data into a PHP array
+   *
+   *
+   * @param array $node The node which you want to arrayize
+   * @return boolean
+   */
+   protected function _nodeArrayizeData(&$node)
+   {
+    if (is_array($node->data) && $node->children == true)
+    {
+      // This node has children, so we need to find them
+      $childs = $this->_gatherChildren($node->id);
+      // We've gathered all our children's data and are ready to use it
+      $key = key($node->data);
+      $key = empty($key) ? 0 : $key;
+      // If it's an array, add to it of course
+      if (is_array($node->data[$key]))
+      {
+        $node->data[$key] = $this->_array_kmerge($node->data[$key], $childs);
+      }
+      else
+      {
+        $node->data[$key] = $childs;
+      }
+    }
+    else if (!is_array($node->data) && $node->children == true)
+    {
+      // Same as above, find the children of this node
+      $childs       = $this->_gatherChildren($node->id);
+      $node->data   = array();
+      $node->data[] = $childs;
+    }
+
+    // We edited $node by reference, so just return true
+    return true;
+  }
+
+  /**
+   * Traverses node-space and copies references to / from this object.
+   *
+   * @param object $z A node whose references we wish to make real
+   * @return bool
+   */
+   protected function _makeReferences(&$z)
+   {
+    // It is a reference
+    if (isset($z->ref))
+    {
+      $key                = key($z->data);
+      // Copy the data to this object for easy retrieval later
+      $this->ref[$z->ref] =& $z->data[$key];
+    // It has a reference
+    }
+    else if (isset($z->refKey))
+    {
+      if (isset($this->ref[$z->refKey]))
+      {
+        $key           = key($z->data);
+        // Copy the data from this object to make the node a real reference
+        $z->data[$key] =& $this->ref[$z->refKey];
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * Merges arrays and maintains numeric keys.
+   *
+   * An ever-so-slightly modified version of the array_kmerge() function posted
+   * to php.net by mail at nospam dot iaindooley dot com on 2004-04-08.
+   *
+   * http://us3.php.net/manual/en/function.array-merge.php#41394
+   *
+   * @param array $arr1
+   * @param array $arr2
+   * @return array
+   */
+  protected function _array_kmerge($arr1, $arr2)
+  {
+    if (!is_array($arr1))
+    {
+      $arr1 = array();
+    }
+    if (!is_array($arr2))
+    {
+      $arr2 = array();
+    }
+
+    $keys  = array_merge(array_keys($arr1), array_keys($arr2));
+    $vals  = array_merge(array_values($arr1), array_values($arr2));
+    $ret   = array();
+    foreach ($keys as $key)
+    {
+      list($unused, $val) = each($vals);
+      if (isset($ret[$key]) && is_int($key))
+      {
+        $ret[] = $val;
+      }
+      else
+      {
+        $ret[$key] = $val;
+      }
+    }
+
+    return $ret;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/Spyc.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfBrowser.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfBrowser.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfBrowser.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,506 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfBrowser simulates a fake browser which can surf a symfony application.
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfBrowser.class.php 3334 2007-01-23 15:46:08Z fabien $
+ */
+class sfBrowser
+{
+  protected
+    $context            = null,
+    $hostname           = null,
+    $remote             = null,
+    $dom                = null,
+    $stack              = array(),
+    $stackPosition      = -1,
+    $cookieJar          = array(),
+    $fields             = array(),
+    $vars               = array(),
+    $defaultServerArray = array(),
+    $currentException   = null;
+
+  public function initialize($hostname = null, $remote = null, $options = array())
+  {
+    unset($_SERVER['argv']);
+    unset($_SERVER['argc']);
+
+    // setup our fake environment
+    $this->hostname = $hostname;
+    $this->remote   = $remote;
+
+    sfConfig::set('sf_path_info_array', 'SERVER');
+    sfConfig::set('sf_test', true);
+
+    // we set a session id (fake cookie / persistence)
+    $this->newSession();
+
+    // store default global $_SERVER array
+    $this->defaultServerArray = $_SERVER;
+
+    // register our shutdown function
+    register_shutdown_function(array($this, 'shutdown'));
+  }
+
+  public function setVar($name, $value)
+  {
+    $this->vars[$name] = $value;
+
+    return $this;
+  }
+
+  public function setAuth($login, $password)
+  {
+    $this->vars['PHP_AUTH_USER'] = $login;
+    $this->vars['PHP_AUTH_PW']   = $password;
+
+    return $this;
+  }
+
+  public function get($uri, $parameters = array())
+  {
+    return $this->call($uri, 'get', $parameters);
+  }
+
+  public function post($uri, $parameters = array())
+  {
+    return $this->call($uri, 'post', $parameters);
+  }
+
+  public function call($uri, $method = 'get', $parameters = array(), $changeStack = true)
+  {
+    $uri = $this->fixUri($uri);
+
+    // add uri to the stack
+    if ($changeStack)
+    {
+      $this->stack = array_slice($this->stack, 0, $this->stackPosition + 1);
+      $this->stack[] = array(
+        'uri'        => $uri,
+        'method'     => $method,
+        'parameters' => $parameters,
+      );
+      $this->stackPosition = count($this->stack) - 1;
+    }
+
+    list($path, $query_string) = false !== ($pos = strpos($uri, '?')) ? array(substr($uri, 0, $pos), substr($uri, $pos + 1)) : array($uri, '');
+    $query_string = html_entity_decode($query_string);
+
+    // remove anchor
+    $path = preg_replace('/#.*/', '', $path);
+
+    // removes all fields from previous request
+    $this->fields = array();
+
+    // prepare the request object
+    $_SERVER = $this->defaultServerArray;
+    $_SERVER['HTTP_HOST']       = $this->hostname ? $this->hostname : sfConfig::get('sf_app').'-'.sfConfig::get('sf_environment');
+    $_SERVER['SERVER_NAME']     = $_SERVER['HTTP_HOST'];
+    $_SERVER['SERVER_PORT']     = 80;
+    $_SERVER['HTTP_USER_AGENT'] = 'PHP5/CLI';
+    $_SERVER['REMOTE_ADDR']     = $this->remote ? $this->remote : '127.0.0.1';
+    $_SERVER['REQUEST_METHOD']  = strtoupper($method);
+    $_SERVER['PATH_INFO']       = $path;
+    $_SERVER['REQUEST_URI']     = '/index.php'.$uri;
+    $_SERVER['SCRIPT_NAME']     = '/index.php';
+    $_SERVER['SCRIPT_FILENAME'] = '/index.php';
+    $_SERVER['QUERY_STRING']    = $query_string;
+    foreach ($this->vars as $key => $value)
+    {
+      $_SERVER[strtoupper($key)] = $value;
+    }
+
+    // request parameters
+    $_GET = $_POST = array();
+    if (strtoupper($method) == 'POST')
+    {
+      $_POST = $parameters;
+    }
+    if (strtoupper($method) == 'GET')
+    {
+      $_GET  = $parameters;
+    }
+    parse_str($query_string, $qs);
+    if (is_array($qs))
+    {
+      $_GET = array_merge($qs, $_GET);
+    }
+
+    // restore cookies
+    $_COOKIE = array();
+    foreach ($this->cookieJar as $name => $cookie)
+    {
+      $_COOKIE[$name] = $cookie['value'];
+    }
+
+    // recycle our context object
+    sfContext::removeInstance();
+    $this->context = sfContext::getInstance();
+
+    // launch request via controller
+    $controller = $this->context->getController();
+    $request    = $this->context->getRequest();
+    $response   = $this->context->getResponse();
+
+    // we register a fake rendering filter
+    sfConfig::set('sf_rendering_filter', array('sfFakeRenderingFilter', null));
+
+    $this->currentException = null;
+
+    // dispatch our request
+    ob_start();
+    try
+    {
+      $controller->dispatch();
+    }
+    catch (sfException $e)
+    {
+      $this->currentException = $e;
+
+      $e->printStackTrace();
+    }
+    catch (Exception $e)
+    {
+      $this->currentException = $e;
+
+      $sfException = new sfException();
+      $sfException->printStackTrace($e);
+    }
+    $retval = ob_get_clean();
+
+    if ($this->currentException instanceof sfStopException)
+    {
+      $this->currentException = null;
+    }
+
+    // append retval to the response content
+    $response->setContent($retval);
+
+    // manually shutdown user to save current session data
+    $this->context->getUser()->shutdown();
+    $this->context->getStorage()->shutdown();
+
+    // save cookies
+    $this->cookieJar = array();
+    foreach ($response->getCookies() as $name => $cookie)
+    {
+      // FIXME: deal with expire, path, secure, ...
+      $this->cookieJar[$name] = $cookie;
+    }
+
+    // for HTML/XML content, create a DOM and sfDomCssSelector objects for the response content
+    if (preg_match('/(x|ht)ml/i', $response->getContentType()))
+    {
+      $this->dom = new DomDocument('1.0', sfConfig::get('sf_charset'));
+      $this->dom->validateOnParse = true;
+      @$this->dom->loadHTML($response->getContent());
+      $this->domCssSelector = new sfDomCssSelector($this->dom);
+    }
+
+    return $this;
+  }
+
+  public function back()
+  {
+    if ($this->stackPosition < 1)
+    {
+      throw new sfException('You are already on the first page.');
+    }
+
+    --$this->stackPosition;
+    return $this->call($this->stack[$this->stackPosition]['uri'], $this->stack[$this->stackPosition]['method'], $this->stack[$this->stackPosition]['parameters'], false);
+  }
+
+  public function forward()
+  {
+    if ($this->stackPosition > count($this->stack) - 2)
+    {
+      throw new sfException('You are already on the last page.');
+    }
+
+    ++$this->stackPosition;
+    return $this->call($this->stack[$this->stackPosition]['uri'], $this->stack[$this->stackPosition]['method'], $this->stack[$this->stackPosition]['parameters'], false);
+  }
+
+  public function reload()
+  {
+    if (-1 == $this->stackPosition)
+    {
+      throw new sfException('No page to reload.');
+    }
+
+    return $this->call($this->stack[$this->stackPosition]['uri'], $this->stack[$this->stackPosition]['method'], $this->stack[$this->stackPosition]['parameters'], false);
+  }
+
+  public function getResponseDomCssSelector()
+  {
+    return $this->domCssSelector;
+  }
+
+  public function getResponseDom()
+  {
+    return $this->dom;
+  }
+
+  public function getContext()
+  {
+    return $this->context;
+  }
+
+  public function getResponse()
+  {
+    return $this->context->getResponse();
+  }
+
+  public function getRequest()
+  {
+    return $this->context->getRequest();
+  }
+
+  public function getCurrentException()
+  {
+    return $this->currentException;
+  }
+
+  public function followRedirect()
+  {
+    if (null === $this->getContext()->getResponse()->getHttpHeader('Location'))
+    {
+      throw new sfException('The request was not redirected');
+    }
+
+    return $this->get($this->getContext()->getResponse()->getHttpHeader('Location'));
+  }
+
+  public function setField($name, $value)
+  {
+    // as we don't know yet the form, just store name/value pairs
+    $this->parseArgumentAsArray($name, $value, $this->fields);
+
+    return $this;
+  }
+
+  // link or button
+  public function click($name, $arguments = array())
+  {
+    if (!$this->dom)
+    {
+      throw new sfException('Cannot click because there is no current page in the browser');
+    }
+
+    $xpath = new DomXpath($this->dom);
+    $dom   = $this->dom;
+
+    // text link
+    if ($link = $xpath->query(sprintf('//a[.="%s"]', $name))->item(0))
+    {
+      return $this->get($link->getAttribute('href'));
+    }
+
+    // image link
+    if ($link = $xpath->query(sprintf('//a/img[@alt="%s"]/ancestor::a', $name))->item(0))
+    {
+      return $this->get($link->getAttribute('href'));
+    }
+
+    // form
+    if (!$form = $xpath->query(sprintf('//input[((@type="submit" or @type="button") and @value="%s") or (@type="image" and @alt="%s")]/ancestor::form', $name, $name))->item(0))
+    {
+      throw new sfException(sprintf('Cannot find the "%s" link or button.', $name));
+    }
+
+    // form attributes
+    $url = $form->getAttribute('action');
+    $method = $form->getAttribute('method') ? strtolower($form->getAttribute('method')) : 'get';
+
+    // merge form default values and arguments
+    $defaults = array();
+    foreach ($xpath->query('descendant::input | descendant::textarea | descendant::select', $form) as $element)
+    {
+      $elementName = $element->getAttribute('name');
+      $nodeName    = $element->nodeName;
+      $value       = null;
+      if ($nodeName == 'input' && ($element->getAttribute('type') == 'checkbox' || $element->getAttribute('type') == 'radio'))
+      {
+        if ($element->getAttribute('checked'))
+        {
+          $value = $element->getAttribute('value');
+        }
+      }
+      else if (
+        $nodeName == 'input'
+        &&
+        (($element->getAttribute('type') != 'submit' && $element->getAttribute('type') != 'button') || $element->getAttribute('value') == $name)
+        &&
+        ($element->getAttribute('type') != 'image' || $element->getAttribute('alt') == $name)
+      )
+      {
+        $value = $element->getAttribute('value');
+      }
+      else if ($nodeName == 'textarea')
+      {
+        $value = '';
+        foreach ($element->childNodes as $el)
+        {
+          $value .= $dom->saveXML($el);
+        }
+      }
+      else if ($nodeName == 'select')
+      {
+        if ($multiple = $element->hasAttribute('multiple'))
+        {
+          $elementName = str_replace('[]', '', $elementName);
+          $value = array();
+        }
+        else
+        {
+          $value = null;
+        }
+
+        $found = false;
+        foreach ($xpath->query('descendant::option', $element) as $option)
+        {
+          if ($option->getAttribute('selected'))
+          {
+            $found = true;
+            if ($multiple)
+            {
+              $value[] = $option->getAttribute('value');
+            }
+            else
+            {
+              $value = $option->getAttribute('value');
+            }
+          }
+        }
+
+        // if no option is selected and if it is a simple select box, take the first option as the value
+        if (!$found && !$multiple)
+        {
+          $value = $xpath->query('descendant::option', $element)->item(0)->getAttribute('value');
+        }
+      }
+
+      if (null !== $value)
+      {
+        $this->parseArgumentAsArray($elementName, $value, $defaults);
+      }
+    }
+
+    // create request parameters
+    $arguments = sfToolkit::arrayDeepMerge($defaults, $this->fields, $arguments);
+    if ('post' == $method)
+    {
+      return $this->post($url, $arguments);
+    }
+    else
+    {
+      $query_string = http_build_query($arguments);
+      $sep = false === strpos($url, '?') ? '?' : '&';
+
+      return $this->get($url.($query_string ? $sep.$query_string : ''));
+    }
+  }
+
+  protected function parseArgumentAsArray($name, $value, &$vars)
+  {
+    if (false !== $pos = strpos($name, '['))
+    {
+      $var = &$vars;
+      $tmps = array_filter(preg_split('/(\[ | \[\] | \])/x', $name));
+      foreach ($tmps as $tmp)
+      {
+        $var = &$var[$tmp];
+      }
+      if ($var)
+      {
+        if (!is_array($var))
+        {
+          $var = array($var);
+        }
+        $var[] = $value;
+      }
+      else
+      {
+        $var = $value;
+      }
+    }
+    else
+    {
+      $vars[$name] = $value;
+    }
+  }
+
+  public function restart()
+  {
+    $this->newSession();
+    $this->cookieJar     = array();
+    $this->stack         = array();
+    $this->fields        = array();
+    $this->vars          = array();
+    $this->dom           = null;
+    $this->stackPosition = -1;
+
+    return $this;
+  }
+
+  public function shutdown()
+  {
+    // we remove all session data
+    sfToolkit::clearDirectory(sfConfig::get('sf_test_cache_dir').'/sessions');
+  }
+
+  protected function fixUri($uri)
+  {
+    // remove absolute information if needed (to be able to do follow redirects, click on links, ...)
+    if (0 === strpos($uri, 'http'))
+    {
+      // detect secure request
+      if (0 === strpos($uri, 'https'))
+      {
+        $this->defaultServerArray['HTTPS'] = 'on';
+      }
+      else
+      {
+        unset($this->defaultServerArray['HTTPS']);
+      }
+
+      $uri = substr($uri, strpos($uri, 'index.php') + strlen('index.php'));
+    }
+    $uri = str_replace('/index.php', '', $uri);
+
+    // # as a uri
+    if ($uri && '#' == $uri[0])
+    {
+      $uri = $this->stack[$this->stackPosition]['uri'].$uri;
+    }
+
+    return $uri;
+  }
+
+  protected function newSession()
+  {
+    $_SERVER['session_id'] = md5(uniqid(rand(), true));
+  }
+}
+
+class sfFakeRenderingFilter extends sfFilter
+{
+  public function execute($filterChain)
+  {
+    $filterChain->execute();
+
+    $this->getContext()->getResponse()->sendContent();
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfBrowser.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfContext.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfContext.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfContext.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,331 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfContext provides information about the current application context, such as
+ * the module and action names and the module directory. References to the
+ * current controller, request, and user implementation instances are also
+ * provided.
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfContext.class.php 3493 2007-02-18 09:23:10Z fabien $
+ */
+class sfContext
+{
+  protected
+    $actionStack       = null,
+    $controller        = null,
+    $databaseManager   = null,
+    $request           = null,
+    $response          = null,
+    $storage           = null,
+    $viewCacheManager  = null,
+    $i18n              = null,
+    $logger            = null,
+    $user              = null;
+
+  protected static
+    $instance          = null;
+
+  /**
+   * Removes current sfContext instance
+   *
+   * This method only exists for testing purpose. Don't use it in your application code.
+   */
+  public static function removeInstance()
+  {
+    self::$instance = null;
+  }
+
+  protected function initialize()
+  {
+    $this->logger = sfLogger::getInstance();
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->logger->info('{sfContext} initialization');
+    }
+
+    if (sfConfig::get('sf_use_database'))
+    {
+      // setup our database connections
+      $this->databaseManager = new sfDatabaseManager();
+      $this->databaseManager->initialize();
+    }
+
+    // create a new action stack
+    $this->actionStack = new sfActionStack();
+
+    // include the factories configuration
+    require(sfConfigCache::getInstance()->checkConfig(sfConfig::get('sf_app_config_dir_name').'/factories.yml'));
+
+    // register our shutdown function
+    register_shutdown_function(array($this, 'shutdown'));
+  }
+
+  /**
+   * Retrieve the singleton instance of this class.
+   *
+   * @return sfContext A sfContext implementation instance.
+   */
+  public static function getInstance()
+  {
+    if (!isset(self::$instance))
+    {
+      $class = __CLASS__;
+      self::$instance = new $class();
+      self::$instance->initialize();
+    }
+
+    return self::$instance;
+  }
+
+  public static function hasInstance()
+  {
+    return isset(self::$instance);
+  }
+
+  /**
+   * Retrieve the action name for this context.
+   *
+   * @return string The currently executing action name, if one is set,
+   *                otherwise null.
+   */
+  public function getActionName()
+  {
+    // get the last action stack entry
+    if ($this->actionStack && $lastEntry = $this->actionStack->getLastEntry())
+    {
+      return $lastEntry->getActionName();
+    }
+  }
+
+
+  /**
+   * Retrieve the ActionStack.
+   *
+   * @return sfActionStack the sfActionStack instance
+   */
+  public function getActionStack()
+  {
+    return $this->actionStack;
+  }
+
+  /**
+   * Retrieve the controller.
+   *
+   * @return sfController The current sfController implementation instance.
+   */
+   public function getController()
+   {
+     return $this->controller;
+   }
+
+   public function getLogger()
+   {
+     return $this->logger;
+   }
+
+  /**
+   * Retrieve a database connection from the database manager.
+   *
+   * This is a shortcut to manually getting a connection from an existing
+   * database implementation instance.
+   *
+   * If the [sf_use_database] setting is off, this will return null.
+   *
+   * @param name A database name.
+   *
+   * @return mixed A Database instance.
+   *
+   * @throws <b>sfDatabaseException</b> If the requested database name does not exist.
+   */
+  public function getDatabaseConnection($name = 'default')
+  {
+    if ($this->databaseManager != null)
+    {
+      return $this->databaseManager->getDatabase($name)->getConnection();
+    }
+
+    return null;
+  }
+
+  public function retrieveObjects($class, $peerMethod)
+  {
+    $retrievingClass = 'sf'.ucfirst(sfConfig::get('sf_orm', 'propel')).'DataRetriever';
+
+    return call_user_func(array($retrievingClass, 'retrieveObjects'), $class, $peerMethod);
+  }
+
+  /**
+   * Retrieve the database manager.
+   *
+   * @return sfDatabaseManager The current sfDatabaseManager instance.
+   */
+  public function getDatabaseManager()
+  {
+    return $this->databaseManager;
+  }
+
+  /**
+   * Retrieve the module directory for this context.
+   *
+   * @return string An absolute filesystem path to the directory of the
+   *                currently executing module, if one is set, otherwise null.
+   */
+  public function getModuleDirectory()
+  {
+    // get the last action stack entry
+    if ($this->actionStack && $lastEntry = $this->actionStack->getLastEntry())
+    {
+      return sfConfig::get('sf_app_module_dir').'/'.$lastEntry->getModuleName();
+    }
+  }
+
+  /**
+   * Retrieve the module name for this context.
+   *
+   * @return string The currently executing module name, if one is set,
+   *                otherwise null.
+   */
+  public function getModuleName()
+  {
+    // get the last action stack entry
+    if ($this->actionStack && $lastEntry = $this->actionStack->getLastEntry())
+    {
+      return $lastEntry->getModuleName();
+    }
+  }
+
+  /**
+   * Retrieve the curretn view instance for this context.
+   *
+   * @return sfView The currently view instance, if one is set,
+   *                otherwise null.
+   */
+  public function getCurrentViewInstance()
+  {
+    // get the last action stack entry
+    if ($this->actionStack && $lastEntry = $this->actionStack->getLastEntry())
+    {
+      return $lastEntry->getViewInstance();
+    }
+  }
+
+  /**
+   * Retrieve the request.
+   *
+   * @return sfRequest The current sfRequest implementation instance.
+   */
+  public function getRequest()
+  {
+    return $this->request;
+  }
+
+  /**
+   * Retrieve the response.
+   *
+   * @return sfResponse The current sfResponse implementation instance.
+   */
+  public function getResponse()
+  {
+    return $this->response;
+  }
+
+  /**
+   * Set the response object.
+   *
+   * @param sfResponse A sfResponse instance.
+   *
+   * @return void.
+   */
+  public function setResponse($response)
+  {
+    $this->response = $response;
+  }
+
+  /**
+   * Retrieve the storage.
+   *
+   * @return sfStorage The current sfStorage implementation instance.
+   */
+  public function getStorage()
+  {
+    return $this->storage;
+  }
+
+  /**
+   * Retrieve the view cache manager
+   *
+   * @return sfViewCacheManager The current sfViewCacheManager implementation instance.
+   */
+  public function getViewCacheManager()
+  {
+    return $this->viewCacheManager;
+  }
+
+  /**
+   * Retrieve the i18n instance
+   *
+   * @return sfI18N The current sfI18N implementation instance.
+   */
+  public function getI18N()
+  {
+    if (!$this->i18n && sfConfig::get('sf_i18n'))
+    {
+      $this->i18n = sfI18N::getInstance();
+      $this->i18n->initialize($this);
+    }
+
+    return $this->i18n;
+  }
+
+  /**
+   * Retrieve the user.
+   *
+   * @return sfUser The current sfUser implementation instance.
+   */
+  public function getUser()
+  {
+    return $this->user;
+  }
+
+  /**
+   * Execute the shutdown procedure.
+   *
+   * @return void
+   */
+  public function shutdown()
+  {
+    // shutdown all factories
+    $this->getUser()->shutdown();
+    $this->getStorage()->shutdown();
+    $this->getRequest()->shutdown();
+    $this->getResponse()->shutdown();
+
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getLogger()->shutdown();
+    }
+
+    if (sfConfig::get('sf_use_database'))
+    {
+      $this->getDatabaseManager()->shutdown();
+    }
+
+    if (sfConfig::get('sf_cache'))
+    {
+      $this->getViewCacheManager()->shutdown();
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfContext.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfCore.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfCore.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfCore.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,270 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * core symfony class.
+ *
+ * @package    symfony
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfCore.class.php 3128 2007-01-03 08:01:46Z fabien $
+ */
+class sfCore
+{
+  static protected
+    $autoloadCallables = array(),
+    $classes           = array();
+
+  static public function bootstrap($sf_symfony_lib_dir, $sf_symfony_data_dir)
+  {
+    require_once($sf_symfony_lib_dir.'/util/sfToolkit.class.php');
+    require_once($sf_symfony_lib_dir.'/config/sfConfig.class.php');
+
+    sfCore::initConfiguration($sf_symfony_lib_dir, $sf_symfony_data_dir);
+    if (sfConfig::get('sf_check_lock'))
+    {
+      sfCore::checkLock();
+    }
+    if (sfConfig::get('sf_check_symfony_version'))
+    {
+      sfCore::checkSymfonyVersion();
+    }
+    sfCore::initIncludePath();
+
+    sfCore::callBootstrap();
+  }
+
+  static public function callBootstrap()
+  {
+    $bootstrap = sfConfig::get('sf_config_cache_dir').'/config_bootstrap_compile.yml.php';
+    if (is_readable($bootstrap))
+    {
+      sfConfig::set('sf_in_bootstrap', true);
+      require($bootstrap);
+    }
+    else
+    {
+      require(sfConfig::get('sf_symfony_lib_dir').'/symfony.php');
+    }
+  }
+
+  static public function initConfiguration($sf_symfony_lib_dir, $sf_symfony_data_dir, $test = false)
+  {
+    // start timer
+    if (SF_DEBUG)
+    {
+      sfConfig::set('sf_timer_start', microtime(true));
+    }
+
+    // main configuration
+    sfConfig::add(array(
+      'sf_root_dir'         => SF_ROOT_DIR,
+      'sf_app'              => SF_APP,
+      'sf_environment'      => SF_ENVIRONMENT,
+      'sf_debug'            => SF_DEBUG,
+      'sf_symfony_lib_dir'  => $sf_symfony_lib_dir,
+      'sf_symfony_data_dir' => $sf_symfony_data_dir,
+      'sf_test'             => $test,
+    ));
+
+    // directory layout
+    include($sf_symfony_data_dir.'/config/constants.php');
+  }
+
+  static public function initIncludePath()
+  {
+    set_include_path(
+      sfConfig::get('sf_lib_dir').PATH_SEPARATOR.
+      sfConfig::get('sf_root_dir').PATH_SEPARATOR.
+      sfConfig::get('sf_app_lib_dir').PATH_SEPARATOR.
+      sfConfig::get('sf_symfony_lib_dir').DIRECTORY_SEPARATOR.'vendor'.PATH_SEPARATOR.
+      get_include_path()
+    );
+  }
+
+  // check to see if we're not in a cache cleaning process
+  static public function checkLock()
+  {
+    if (sfToolkit::hasLockFile(SF_ROOT_DIR.DIRECTORY_SEPARATOR.SF_APP.'_'.SF_ENVIRONMENT.'.lck', 5))
+    {
+      // application is not available
+      $file = sfConfig::get('sf_web_dir').'/errors/unavailable.php';
+      include(is_readable($file) ? $file : sfConfig::get('sf_symfony_data_dir').'/web/errors/unavailable.php');
+
+      die(1);
+    }
+  }
+
+  static public function checkSymfonyVersion()
+  {
+    // recent symfony update?
+    $last_version    = @file_get_contents(sfConfig::get('sf_config_cache_dir').'/VERSION');
+    $current_version = trim(file_get_contents(sfConfig::get('sf_symfony_lib_dir').'/VERSION'));
+    if ($last_version != $current_version)
+    {
+      // clear cache
+      sfToolkit::clearDirectory(sfConfig::get('sf_config_cache_dir'));
+    }
+  }
+
+  static public function getClassPath($class)
+  {
+    return isset(self::$classes[$class]) ? self::$classes[$class] : null;
+  }
+
+  static public function addAutoloadCallable($callable)
+  {
+    self::$autoloadCallables[] = $callable;
+
+    if (function_exists('spl_autoload_register'))
+    {
+      spl_autoload_register($callable);
+    }
+  }
+
+  static public function getAutoloadCallables()
+  {
+    return self::$autoloadCallables;
+  }
+
+  /**
+   * Handles autoloading of classes that have been specified in autoload.yml.
+   *
+   * @param  string  A class name.
+   *
+   * @return boolean Returns true if the class has been loaded
+   */
+  static public function splAutoload($class)
+  {
+    // load the list of autoload classes
+    if (!self::$classes)
+    {
+      $file = sfConfigCache::getInstance()->checkConfig(sfConfig::get('sf_app_config_dir_name').'/autoload.yml');
+      self::$classes = include($file);
+    }
+
+    // class already exists
+    if (class_exists($class, false))
+    {
+      return true;
+    }
+
+    // we have a class path, let's include it
+    if (isset(self::$classes[$class]))
+    {
+      require(self::$classes[$class]);
+
+      return true;
+    }
+
+    // see if the file exists in the current module lib directory
+    // must be in a module context
+    if (sfContext::hasInstance() && ($module = sfContext::getInstance()->getModuleName()) && isset(self::$classes[$module.'/'.$class]))
+    {
+      require(self::$classes[$module.'/'.$class]);
+
+      return true;
+    }
+
+    return false;
+  }
+
+  static public function initAutoload()
+  {
+    if (function_exists('spl_autoload_register'))
+    {
+      ini_set('unserialize_callback_func', 'spl_autoload_call');
+    }
+    else if (!function_exists('__autoload'))
+    {
+      ini_set('unserialize_callback_func', '__autoload');
+
+      function __autoload($class)
+      {
+        foreach (sfCore::getAutoloadCallables() as $callable)
+        {
+          if (call_user_func($callable, $class))
+          {
+            return true;
+          }
+        }
+
+        // unspecified class
+        // do not print an error if the autoload came from class_exists
+        $trace = debug_backtrace();
+        if (count($trace) < 1 || ($trace[1]['function'] != 'class_exists' && $trace[1]['function'] != 'is_a'))
+        {
+          $error = sprintf('Autoloading of class "%s" failed. Try to clear the symfony cache and refresh. [err0003]', $class);
+          $e = new sfAutoloadException($error);
+
+          $e->printStackTrace();
+        }
+      }
+    }
+
+    self::addAutoloadCallable(array('sfCore', 'splAutoload'));
+  }
+
+  static public function splSimpleAutoload($class)
+  {
+    // class already exists
+    if (class_exists($class, false))
+    {
+      return true;
+    }
+
+    // we have a class path, let's include it
+    if (isset(self::$classes[$class]))
+    {
+      require(self::$classes[$class]);
+
+      return true;
+    }
+
+    return false;
+  }
+
+  static public function initSimpleAutoload($dirs)
+  {
+    require_once(dirname(__FILE__).'/sfFinder.class.php');
+    self::$classes = array();
+    $finder = sfFinder::type('file')->ignore_version_control()->name('*.php');
+    foreach ((array) $dirs as $dir)
+    {
+      $files = $finder->in(glob($dir));
+      if (is_array($files))
+      {
+        foreach ($files as $file)
+        {
+          preg_match_all('~^\s*(?:abstract\s+|final\s+)?(?:class|interface)\s+(\w+)~mi', file_get_contents($file), $classes);
+          foreach ($classes[1] as $class)
+          {
+            self::$classes[$class] = $file;
+          }
+        }
+      }
+    }
+
+    if (function_exists('spl_autoload_register'))
+    {
+      ini_set('unserialize_callback_func', 'spl_autoload_call');
+
+      spl_autoload_register(array('sfCore', 'splSimpleAutoload'));
+    }
+    elseif (!function_exists('__autoload'))
+    {
+      ini_set('unserialize_callback_func', '__autoload');
+
+      function __autoload($class)
+      {
+        return sfCore::splSimpleAutoload($class);
+      }
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfCore.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfDomCssSelector.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfDomCssSelector.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfDomCssSelector.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,295 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfDomCssSelector allows to navigate a DOM with CSS selector.
+ *
+ * based on getElementsBySelector version 0.4 - Simon Willison, March 25th 2003
+ * http://simon.incutio.com/archive/2003/03/25/getElementsBySelector
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfDomCssSelector.class.php 3053 2006-12-16 16:01:30Z fabien $
+ */
+class sfDomCssSelector
+{
+  protected $dom = null;
+
+  public function __construct($dom)
+  {
+    $this->dom = $dom;
+  }
+
+  public function getTexts($selector)
+  {
+    $texts = array();
+    foreach ($this->getElements($selector) as $element)
+    {
+      $texts[] = $element->nodeValue;
+    }
+
+    return $texts;
+  }
+
+  public function getElements($selector)
+  {
+    $all_nodes = array();
+    foreach ($this->tokenize_selectors($selector) as $selector)
+    {
+      $nodes = array($this->dom);
+      foreach ($this->tokenize($selector) as $token)
+      {
+        $combinator = $token['combinator'];
+        $token = trim($token['name']);
+        $pos = strpos($token, '#');
+        if (false !== $pos && preg_match('/^[A-Za-z0-9]*$/', substr($token, 0, $pos)))
+        {
+          // Token is an ID selector
+          $tagName = substr($token, 0, $pos);
+          $id = substr($token, $pos + 1);
+          $xpath = new DomXPath($this->dom);
+          $element = $xpath->query(sprintf("//*[@id = '%s']", $id))->item(0);
+          if (!$element || ($tagName && strtolower($element->nodeName) != $tagName))
+          {
+            // tag with that ID not found
+            return array();
+          }
+
+          // Set nodes to contain just this element
+          $nodes = array($element);
+
+          continue; // Skip to next token
+        }
+
+        $pos = strpos($token, '.');
+        if (false !== $pos && preg_match('/^[A-Za-z0-9]*$/', substr($token, 0, $pos)))
+        {
+          // Token contains a class selector
+          $tagName = substr($token, 0, $pos);
+          if (!$tagName)
+          {
+            $tagName = '*';
+          }
+          $className = substr($token, $pos + 1);
+
+          // Get elements matching tag, filter them for class selector
+          $founds = $this->getElementsByTagName($nodes, $tagName, $combinator);
+          $nodes = array();
+          foreach ($founds as $found)
+          {
+            if (preg_match('/\b'.$className.'\b/', $found->getAttribute('class')))
+            {
+              $nodes[] = $found;
+            }
+          }
+
+          continue; // Skip to next token
+        }
+
+        // Code to deal with attribute selectors
+        if (preg_match('/^(\w*)(\[.+\])$/', $token, $matches))
+        {
+          $tagName = $matches[1] ? $matches[1] : '*';
+          preg_match_all('/
+            \[
+              (\w+)                 # attribute
+              ([=~\|\^\$\*]?)       # modifier (optional)
+              =?                    # equal (optional)
+              (
+                "([^"]*)"           # quoted value (optional)
+                |
+                ([^\]]*)            # non quoted value (optional)
+              )
+            \]
+          /x', $matches[2], $matches, PREG_SET_ORDER);
+
+          // Grab all of the tagName elements within current node
+          $founds = $this->getElementsByTagName($nodes, $tagName, $combinator);
+          $nodes = array();
+          foreach ($founds as $found)
+          {
+            $ok = false;
+            foreach ($matches as $match)
+            {
+              $attrName = $match[1];
+              $attrOperator = $match[2];
+              $attrValue = $match[4];
+
+              switch ($attrOperator)
+              {
+                case '=': // Equality
+                  $ok = $found->getAttribute($attrName) == $attrValue;
+                  break;
+                case '~': // Match one of space seperated words
+                  $ok = preg_match('/\b'.preg_quote($attrValue, '/').'\b/', $found->getAttribute($attrName));
+                  break;
+                case '|': // Match start with value followed by optional hyphen
+                  $ok = preg_match('/^'.preg_quote($attrValue, '/').'-?/', $found->getAttribute($attrName));
+                  break;
+                case '^': // Match starts with value
+                  $ok = 0 === strpos($found->getAttribute($attrName), $attrValue);
+                  break;
+                case '$': // Match ends with value
+                  $ok = $attrValue == substr($found->getAttribute($attrName), -strlen($attrValue));
+                  break;
+                case '*': // Match ends with value
+                  $ok = false !== strpos($found->getAttribute($attrName), $attrValue);
+                  break;
+                default :
+                  // Just test for existence of attribute
+                  $ok = $found->hasAttribute($attrName);
+              }
+
+              if (false == $ok)
+              {
+                break;
+              }
+            }
+
+            if ($ok)
+            {
+              $nodes[] = $found;
+            }
+          }
+
+          continue; // Skip to next token
+        }
+
+        // If we get here, token is JUST an element (not a class or ID selector)
+        $nodes = $this->getElementsByTagName($nodes, $token, $combinator);
+      }
+
+      foreach ($nodes as $node)
+      {
+        if (!$node->getAttribute('sf_matched'))
+        {
+          $node->setAttribute('sf_matched', true);
+          $all_nodes[] = $node;
+        }
+      }
+    }
+
+    foreach ($all_nodes as $node)
+    {
+      $node->removeAttribute('sf_matched');
+    }
+
+    return $all_nodes;
+  }
+
+  protected function getElementsByTagName($nodes, $tagName, $combinator = ' ')
+  {
+    $founds = array();
+    foreach ($nodes as $node)
+    {
+      switch ($combinator)
+      {
+        case ' ':
+          foreach ($node->getElementsByTagName($tagName) as $element)
+          {
+            $founds[] = $element;
+          }
+          break;
+        case '>':
+          foreach ($node->childNodes as $element)
+          {
+            if ($tagName == $element->nodeName)
+            {
+              $founds[] = $element;
+            }
+          }
+          break;
+        case '+':
+          $element = $node->childNodes->item(0);
+          if ($element && $tagName == $element->nodeName)
+          {
+            $founds[] = $element;
+          }
+          break;
+      }
+    }
+
+    return $founds;
+  }
+
+  protected function tokenize_selectors($selector)
+  {
+    // split tokens by , except in an attribute selector
+    $tokens = array();
+    $quoted = false;
+    $token = '';
+    for ($i = 0, $max = strlen($selector); $i < $max; $i++)
+    {
+      if (',' == $selector[$i] && !$quoted)
+      {
+        $tokens[] = trim($token);
+        $token = '';
+      }
+      else if ('"' == $selector[$i])
+      {
+        $token .= $selector[$i];
+        $quoted = $quoted ? false : true;
+      }
+      else
+      {
+        $token .= $selector[$i];
+      }
+    }
+    if ($token)
+    {
+      $tokens[] = trim($token);
+    }
+
+    return $tokens;
+  }
+
+  protected function tokenize($selector)
+  {
+    // split tokens by space except if space is in an attribute selector
+    $tokens = array();
+    $combinators = array(' ', '>', '+');
+    $quoted = false;
+    $token = array('combinator' => ' ', 'name' => '');
+    for ($i = 0, $max = strlen($selector); $i < $max; $i++)
+    {
+      if (in_array($selector[$i], $combinators) && !$quoted)
+      {
+        // remove all whitespaces around the combinator
+        $combinator = $selector[$i];
+        while (in_array($selector[$i + 1], $combinators))
+        {
+          if (' ' != $selector[++$i])
+          {
+            $combinator = $selector[$i];
+          }
+        }
+
+        $tokens[] = $token;
+        $token = array('combinator' => $combinator, 'name' => '');
+      }
+      else if ('"' == $selector[$i])
+      {
+        $token['name'] .= $selector[$i];
+        $quoted = $quoted ? false : true;
+      }
+      else
+      {
+        $token['name'] .= $selector[$i];
+      }
+    }
+    if ($token['name'])
+    {
+      $tokens[] = $token;
+    }
+
+    return $tokens;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfDomCssSelector.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfFillInForm.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfFillInForm.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfFillInForm.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,207 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfFillInForm.class.php 2976 2006-12-08 19:11:36Z fabien $
+ */
+class sfFillInForm
+{
+  protected
+    $converters  = array(),
+    $skipFields  = array(),
+    $types       = array('text', 'checkbox', 'radio', 'hidden', 'password');
+
+  public function addConverter($callable, $fields)
+  {
+    foreach ((array) $fields as $field)
+    {
+      $this->converters[$field][] = $callable;
+    }
+  }
+
+  public function setSkipFields($fields)
+  {
+    $this->skipFields = $fields;
+  }
+
+  public function setTypes($types)
+  {
+    $this->types = $types;
+  }
+
+  public function fillInHtml($html, $formName, $formId, $values)
+  {
+    $dom = new DomDocument('1.0', sfConfig::get('sf_charset', 'UTF-8'));
+    @$dom->loadHTML($html);
+
+    $dom = $this->fillInDom($dom, $formName, $formId, $values);
+
+    return $dom->saveHTML();
+  }
+
+  public function fillInXml($xml, $formName, $formId, $values)
+  {
+    $dom = new DomDocument('1.0', sfConfig::get('sf_charset', 'UTF-8'));
+    @$dom->loadXML($xml);
+
+    $dom = $this->fillInDom($dom, $formName, $formId, $values);
+
+    return $dom->saveXML();
+  }
+
+  public function fillInDom($dom, $formName, $formId, $values)
+  {
+    $xpath = new DomXPath($dom);
+
+    $query = 'descendant::input[@name and (not(@type)';
+    foreach ($this->types as $type)
+    {
+      $query .= ' or @type="'.$type.'"';
+    }
+    $query .= ')] | descendant::textarea[@name] | descendant::select[@name]';
+
+    // find our form
+    if ($formName)
+    {
+      $xpath_query = '//form[@name="'.$formName.'"]';
+    }
+    elseif ($formId)
+    {
+      $xpath_query = '//form[@id="'.$formId.'"]';
+    }
+    else
+    {
+      $xpath_query = '//form';
+    }
+
+    $form = $xpath->query($xpath_query)->item(0);
+    if (!$form)
+    {
+      if (!$formName && !$formId)
+      {
+        throw new sfException('No form found in this page');
+      }
+      else
+      {
+        throw new sfException(sprintf('The form "%s" cannot be found', $formName ? $formName : $formId));
+      }
+    }
+
+    foreach ($xpath->query($query, $form) as $element)
+    {
+      $name  = (string) $element->getAttribute('name');
+      $value = (string) $element->getAttribute('value');
+      $type  = (string) $element->getAttribute('type');
+
+      // skip fields
+      if (!$this->hasValue($values, $name) || in_array($name, $this->skipFields))
+      {
+        continue;
+      }
+
+      if ($element->nodeName == 'input')
+      {
+        if ($type == 'checkbox' || $type == 'radio')
+        {
+          // checkbox and radio
+          $element->removeAttribute('checked');
+          if ($this->hasValue($values, $name) && ($this->getValue($values, $name) == $value || !$element->hasAttribute('value')))
+          {
+            $element->setAttribute('checked', 'checked');
+          }
+        }
+        else
+        {
+          // text input
+          $element->removeAttribute('value');
+          if ($this->hasValue($values, $name))
+          {
+            $element->setAttribute('value', $this->escapeValue($this->getValue($values, $name), $name));
+          }
+        }
+      }
+      else if ($element->nodeName == 'textarea')
+      {
+        $el = $element->cloneNode(false);
+        $el->appendChild($dom->createTextNode($this->escapeValue($this->getValue($values, $name), $name)));
+        $element->parentNode->replaceChild($el, $element);
+      }
+      else if ($element->nodeName == 'select')
+      {
+        // select
+        $value    = $this->getValue($values, $name);
+        $multiple = $element->hasAttribute('multiple');
+        foreach ($xpath->query('descendant::option', $element) as $option)
+        {
+          $option->removeAttribute('selected');
+          if ($multiple && is_array($value))
+          {
+            if (in_array($option->getAttribute('value'), $value))
+            {
+              $option->setAttribute('selected', 'selected');
+            }
+          }
+          else if ($value == $option->getAttribute('value'))
+          {
+            $option->setAttribute('selected', 'selected');
+          }
+        }
+      }
+    }
+
+    return $dom;
+  }
+
+  protected function hasValue($values, $name)
+  {
+    if (array_key_exists($name, $values))
+    {
+      return true;
+    }
+
+    return null !== sfToolkit::getArrayValueForPath($values, $name);
+  }
+
+  protected function getValue($values, $name)
+  {
+    if (array_key_exists($name, $values))
+    {
+      return $values[$name];
+    }
+
+    return sfToolkit::getArrayValueForPath($values, $name);
+  }
+
+  protected function escapeValue($value, $name)
+  {
+    if (function_exists('iconv') && strtolower(sfConfig::get('sf_charset')) != 'utf-8')
+    {
+      $new_value = iconv(sfConfig::get('sf_charset'), 'UTF-8', $value);
+      if (false !== $new_value)
+      {
+        $value = $new_value;
+      }
+    }
+
+    if (isset($this->converters[$name]))
+    {
+      foreach ($this->converters[$name] as $callable)
+      {
+        $value = call_user_func($callable, $value);
+      }
+    }
+
+    return $value;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfFillInForm.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfFinder.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfFinder.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfFinder.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,723 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfFinder.class.php 3268 2007-01-13 20:19:33Z fabien $
+ */
+
+/**
+ *
+ * Allow to build rules to find files and directories.
+ *
+ * All rules may be invoked several times, except for ->in() method.
+ * Some rules are cumulative (->name() for example) whereas others are destructive
+ * (most recent value is used, ->maxdepth() method for example).
+ *
+ * All methods return the current sfFinder object to allow easy chaining:
+ *
+ * $files = sfFinder::type('file')->name('*.php')->in(.);
+ *
+ * Interface loosely based on perl File::Find::Rule module.
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfFinder.class.php 3268 2007-01-13 20:19:33Z fabien $
+ */
+class sfFinder
+{
+  protected $type        = 'file';
+  protected $names       = array();
+  protected $prunes      = array();
+  protected $discards    = array();
+  protected $execs       = array();
+  protected $mindepth    = 0;
+  protected $sizes       = array();
+  protected $maxdepth    = 1000000;
+  protected $relative    = false;
+  protected $follow_link = false;
+
+  /**
+   * Sets maximum directory depth.
+   *
+   * Finder will descend at most $level levels of directories below the starting point.
+   *
+   * @param  integer level
+   * @return object current sfFinder object
+   */
+  public function maxdepth($level)
+  {
+    $this->maxdepth = $level;
+
+    return $this;
+  }
+
+  /**
+   * Sets minimum directory depth.
+   *
+   * Finder will start applying tests at level $level.
+   *
+   * @param  integer level
+   * @return object current sfFinder object
+   */
+  public function mindepth($level)
+  {
+    $this->mindepth = $level;
+
+    return $this;
+  }
+
+  public function get_type()
+  {
+    return $this->type;
+  }
+
+  /**
+   * Sets the type of elements to returns.
+   *
+   * @param  string directory or file or any (for both file and directory)
+   * @return object new sfFinder object
+   */
+  public static function type($name)
+  {
+    $finder = new sfFinder();
+
+    if (strtolower(substr($name, 0, 3)) == 'dir')
+    {
+      $finder->type = 'directory';
+    }
+    else if (strtolower($name) == 'any')
+    {
+      $finder->type = 'any';
+    }
+    else
+    {
+      $finder->type = 'file';
+    }
+
+    return $finder;
+  }
+
+  /*
+   * glob, patterns (must be //) or strings
+   */
+  protected function to_regex($str)
+  {
+    if ($str{0} == '/' && $str{strlen($str) - 1} == '/')
+    {
+      return $str;
+    }
+    else
+    {
+      return sfGlobToRegex::glob_to_regex($str);
+    }
+  }
+
+  protected function args_to_array($arg_list, $not = false)
+  {
+    $list = array();
+
+    for ($i = 0; $i < count($arg_list); $i++)
+    {
+      if (is_array($arg_list[$i]))
+      {
+        foreach ($arg_list[$i] as $arg)
+        {
+          $list[] = array($not, $this->to_regex($arg));
+        }
+      }
+      else
+      {
+        $list[] = array($not, $this->to_regex($arg_list[$i]));
+      }
+    }
+
+    return $list;
+  }
+
+  /**
+   * Adds rules that files must match.
+   *
+   * You can use patterns (delimited with / sign), globs or simple strings.
+   *
+   * $finder->name('*.php')
+   * $finder->name('/\.php$/') // same as above
+   * $finder->name('test.php')
+   *
+   * @param  list   a list of patterns, globs or strings
+   * @return object current sfFinder object
+   */
+  public function name()
+  {
+    $args = func_get_args();
+    $this->names = array_merge($this->names, $this->args_to_array($args));
+
+    return $this;
+  }
+
+  /**
+   * Adds rules that files must not match.
+   *
+   * @see    ->name()
+   * @param  list   a list of patterns, globs or strings
+   * @return object current sfFinder object
+   */
+  public function not_name()
+  {
+    $args = func_get_args();
+    $this->names = array_merge($this->names, $this->args_to_array($args, true));
+
+    return $this;
+  }
+
+  /**
+   * Adds tests for file sizes.
+   *
+   * $finder->size('> 10K');
+   * $finder->size('<= 1Ki');
+   * $finder->size(4);
+   *
+   * @param  list   a list of comparison strings
+   * @return object current sfFinder object
+   */
+  public function size()
+  {
+    $args = func_get_args();
+    for ($i = 0; $i < count($args); $i++)
+    {
+      $this->sizes[] = new sfNumberCompare($args[$i]);
+    }
+
+    return $this;
+  }
+
+  /**
+   * Traverses no further.
+   *
+   * @param  list   a list of patterns, globs to match
+   * @return object current sfFinder object
+   */
+  public function prune()
+  {
+    $args = func_get_args();
+    $this->prunes = array_merge($this->prunes, $this->args_to_array($args));
+
+    return $this;
+  }
+
+  /**
+   * Discards elements that matches.
+   *
+   * @param  list   a list of patterns, globs to match
+   * @return object current sfFinder object
+   */
+  public function discard()
+  {
+    $args = func_get_args();
+    $this->discards = array_merge($this->discards, $this->args_to_array($args));
+
+    return $this;
+  }
+
+  /**
+   * Ignores version control directories.
+   *
+   * Currently supports subversion, CVS, DARCS, Gnu Arch, Monotone, Bazaar-NG
+   *
+   * @return object current pakeFinder object
+   */
+  public function ignore_version_control()
+  {
+    $ignores = array('.svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr');
+
+    return $this->discard($ignores)->prune($ignores);
+  }
+
+  /**
+   * Executes function or method for each element.
+   *
+   * Element match if functino or method returns true.
+   *
+   * $finder->exec('myfunction');
+   * $finder->exec(array($object, 'mymethod'));
+   *
+   * @param  mixed  function or method to call
+   * @return object current sfFinder object
+   */
+  public function exec()
+  {
+    $args = func_get_args();
+    for ($i = 0; $i < count($args); $i++)
+    {
+      if (is_array($args[$i]) && !method_exists($args[$i][0], $args[$i][1]))
+      {
+        throw new sfException("method {$args[$i][1]} does not exist for object {$args[$i][0]}");
+      }
+      else if (!is_array($args[$i]) && !function_exists($args[$i]))
+      {
+        throw new sfException("function {$args[$i]} does not exist");
+      }
+
+      $this->execs[] = $args[$i];
+    }
+
+    return $this;
+  }
+
+  /**
+   * Returns relative paths for all files and directories.
+   *
+   * @return object current sfFinder object
+   */
+  public function relative()
+  {
+    $this->relative = true;
+
+    return $this;
+  }
+
+  /**
+   * Symlink following.
+   *
+   * @return object current sfFinder object
+   */
+  public function follow_link()
+  {
+    $this->follow_link = true;
+
+    return $this;
+  }
+
+  /**
+   * Searches files and directories which match defined rules.
+   *
+   * @return array list of files and directories
+   */
+  public function in()
+  {
+    $files    = array();
+    $here_dir = getcwd();
+    $numargs  = func_num_args();
+    $arg_list = func_get_args(); 
+
+    // first argument is an array?
+    if ($numargs == 1 && is_array($arg_list[0]))
+    {
+      $arg_list = $arg_list[0];
+      $numargs  = count($arg_list);
+    }
+
+    for ($i = 0; $i < $numargs; $i++)
+    {
+      $real_dir = realpath($arg_list[$i]);
+
+      // absolute path?
+      if (!self::isPathAbsolute($real_dir))
+      {
+        $dir = $here_dir.DIRECTORY_SEPARATOR.$real_dir;
+      }
+      else
+      {
+        $dir = $real_dir;
+      }
+
+      if (!is_dir($real_dir))
+      {
+        continue;
+      }
+
+      if ($this->relative)
+      {
+        $files = array_merge($files, str_replace($dir.DIRECTORY_SEPARATOR, '', $this->search_in($dir)));
+      }
+      else
+      {
+        $files = array_merge($files, $this->search_in($dir));
+      }
+    }
+
+    return array_unique($files);
+  }
+
+  protected function search_in($dir, $depth = 0)
+  {
+    if ($depth > $this->maxdepth)
+    {
+      return array();
+    }
+
+    if (is_link($dir) && !$this->follow_link)
+    {
+      return array();
+    }
+
+    $files = array();
+
+    if (is_dir($dir))
+    {
+      $current_dir = opendir($dir);
+      while (false !== $entryname = readdir($current_dir))
+      {
+        if ($entryname == '.' || $entryname == '..') continue;
+
+        $current_entry = $dir.DIRECTORY_SEPARATOR.$entryname;
+        if (is_link($current_entry) && !$this->follow_link)
+        {
+          continue;
+        }
+
+        if (is_dir($current_entry))
+        {
+          if (($this->type == 'directory' || $this->type == 'any') && ($depth >= $this->mindepth) && !$this->is_discarded($dir, $entryname) && $this->match_names($dir, $entryname) && $this->exec_ok($dir, $entryname))
+          {
+            $files[] = realpath($current_entry);
+          }
+
+          if (!$this->is_pruned($dir, $entryname))
+          {
+            $files = array_merge($files, $this->search_in($current_entry, $depth + 1));
+          }
+        }
+        else
+        {
+          if (($this->type != 'directory' || $this->type == 'any') && ($depth >= $this->mindepth) && !$this->is_discarded($dir, $entryname) && $this->match_names($dir, $entryname) && $this->size_ok($dir, $entryname) && $this->exec_ok($dir, $entryname))
+          {
+            $files[] = realpath($current_entry);
+          }
+        }
+      }
+      closedir($current_dir);
+    }
+
+    return $files;
+  }
+
+  protected function match_names($dir, $entry)
+  {
+    if (!count($this->names)) return true;
+
+    // we must match one "not_name" rules to be ko
+    $one_not_name_rule = false;
+    foreach ($this->names as $args)
+    {
+      list($not, $regex) = $args;
+      if ($not)
+      {
+        $one_not_name_rule = true;
+        if (preg_match($regex, $entry))
+        {
+          return false;
+        }
+      }
+    }
+
+    $one_name_rule = false;
+    // we must match one "name" rules to be ok
+    foreach ($this->names as $args)
+    {
+      list($not, $regex) = $args;
+      if (!$not)
+      {
+        $one_name_rule = true;
+        if (preg_match($regex, $entry))
+        {
+          return true;
+        }
+      }
+    }
+
+    if ($one_not_name_rule && $one_name_rule)
+    {
+      return false;
+    }
+    else if ($one_not_name_rule)
+    {
+      return true;
+    }
+    else if ($one_name_rule)
+    {
+      return false;
+    }
+    else
+    {
+      return true;
+    }
+  }
+
+  protected function size_ok($dir, $entry)
+  {
+    if (!count($this->sizes)) return true;
+
+    if (!is_file($dir.DIRECTORY_SEPARATOR.$entry)) return true;
+
+    $filesize = filesize($dir.DIRECTORY_SEPARATOR.$entry);
+    foreach ($this->sizes as $number_compare)
+    {
+      if (!$number_compare->test($filesize)) return false;
+    }
+
+    return true;
+  }
+
+  protected function is_pruned($dir, $entry)
+  {
+    if (!count($this->prunes)) return false;
+
+    foreach ($this->prunes as $args)
+    {
+      $regex = $args[1];
+      if (preg_match($regex, $entry)) return true;
+    }
+
+    return false;
+  }
+
+  protected function is_discarded($dir, $entry)
+  {
+    if (!count($this->discards)) return false;
+
+    foreach ($this->discards as $args)
+    {
+      $regex = $args[1];
+      if (preg_match($regex, $entry)) return true;
+    }
+
+    return false;
+  }
+
+  protected function exec_ok($dir, $entry)
+  {
+    if (!count($this->execs)) return true;
+
+    foreach ($this->execs as $exec)
+    {
+      if (!call_user_func_array($exec, array($dir, $entry))) return false;
+    }
+
+    return true;
+  }
+
+  public static function isPathAbsolute($path)
+  {
+    if ($path{0} == '/' || $path{0} == '\\' ||
+        (strlen($path) > 3 && ctype_alpha($path{0}) &&
+         $path{1} == ':' &&
+         ($path{2} == '\\' || $path{2} == '/')
+        )
+       )
+    {
+      return true;
+    }
+
+    return false;
+  }
+}
+
+/**
+ * Match globbing patterns against text.
+ *
+ *   if match_glob("foo.*", "foo.bar") echo "matched\n";
+ *
+ * // prints foo.bar and foo.baz
+ * $regex = glob_to_regex("foo.*");
+ * for (array('foo.bar', 'foo.baz', 'foo', 'bar') as $t)
+ * {
+ *   if (/$regex/) echo "matched: $car\n";
+ * }
+ *
+ * sfGlobToRegex implements glob(3) style matching that can be used to match
+ * against text, rather than fetching names from a filesystem.
+ *
+ * based on perl Text::Glob module.
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en gmail.com> php port
+ * @author     Richard Clamp <richardc en unixbeard.net> perl version
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en gmail.com>
+ * @copyright  2002 Richard Clamp <richardc en unixbeard.net>
+ * @version    SVN: $Id: sfFinder.class.php 3268 2007-01-13 20:19:33Z fabien $
+ */
+class sfGlobToRegex
+{
+  protected static $strict_leading_dot = true;
+  protected static $strict_wildcard_slash = true;
+
+  public static function setStrictLeadingDot($boolean)
+  {
+    self::$strict_leading_dot = $boolean;
+  }
+
+  public static function setStrictWildcardSlash($boolean)
+  {
+    self::$strict_wildcard_slash = $boolean;
+  }
+
+  /**
+   * Returns a compiled regex which is the equiavlent of the globbing pattern.
+   *
+   * @param  string glob pattern
+   * @return string regex
+   */
+  public static function glob_to_regex($glob)
+  {
+    $first_byte = true;
+    $escaping = false;
+    $in_curlies = 0;
+    $regex = '';
+    for ($i = 0; $i < strlen($glob); $i++)
+    {
+      $car = $glob[$i];
+      if ($first_byte)
+      {
+        if (self::$strict_leading_dot && $car != '.')
+        {
+          $regex .= '(?=[^\.])';
+        }
+
+        $first_byte = false;
+      }
+
+      if ($car == '/')
+      {
+        $first_byte = true;
+      }
+
+      if ($car == '.' || $car == '(' || $car == ')' || $car == '|' || $car == '+' || $car == '^' || $car == '$')
+      {
+        $regex .= "\\$car";
+      }
+      else if ($car == '*')
+      {
+        $regex .= ($escaping ? "\\*" : (self::$strict_wildcard_slash ? "[^/]*" : ".*"));
+      }
+      else if ($car == '?')
+      {
+        $regex .= ($escaping ? "\\?" : (self::$strict_wildcard_slash ? "[^/]" : "."));
+      }
+      else if ($car == '{')
+      {
+        $regex .= ($escaping ? "\\{" : "(");
+        if (!$escaping) ++$in_curlies;
+      }
+      else if ($car == '}' && $in_curlies)
+      {
+        $regex .= ($escaping ? "}" : ")");
+        if (!$escaping) --$in_curlies;
+      }
+      else if ($car == ',' && $in_curlies)
+      {
+        $regex .= ($escaping ? "," : "|");
+      }
+      else if ($car == "\\")
+      {
+        if ($escaping)
+        {
+          $regex .= "\\\\";
+          $escaping = false;
+        }
+        else
+        {
+          $escaping = true;
+        }
+
+        continue;
+      }
+      else
+      {
+        $regex .= $car;
+        $escaping = false;
+      }
+      $escaping = false;
+    }
+
+    return "#^$regex$#";
+  }
+}
+
+/**
+ * Numeric comparisons.
+ *
+ * sfNumberCompare compiles a simple comparison to an anonymous
+ * subroutine, which you can call with a value to be tested again.
+
+ * Now this would be very pointless, if sfNumberCompare didn't understand
+ * magnitudes.
+
+ * The target value may use magnitudes of kilobytes (k, ki),
+ * megabytes (m, mi), or gigabytes (g, gi).  Those suffixed
+ * with an i use the appropriate 2**n version in accordance with the
+ * IEC standard: http://physics.nist.gov/cuu/Units/binary.html
+ *
+ * based on perl Number::Compare module.
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en gmail.com> php port
+ * @author     Richard Clamp <richardc en unixbeard.net> perl version
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en gmail.com>
+ * @copyright  2002 Richard Clamp <richardc en unixbeard.net>
+ * @see        http://physics.nist.gov/cuu/Units/binary.html
+ * @version    SVN: $Id: sfFinder.class.php 3268 2007-01-13 20:19:33Z fabien $
+ */
+class sfNumberCompare
+{
+  protected $test = '';
+
+  public function __construct($test)
+  {
+    $this->test = $test;
+  }
+
+  public function test($number)
+  {
+    if (!preg_match('{^([<>]=?)?(.*?)([kmg]i?)?$}i', $this->test, $matches))
+    {
+      throw new sfException('don\'t understand "'.$this->test.'" as a test');
+    }
+
+    $target = array_key_exists(2, $matches) ? $matches[2] : '';
+    $magnitude = array_key_exists(3, $matches) ? $matches[3] : '';
+    if (strtolower($magnitude) == 'k')  $target *=           1000;
+    if (strtolower($magnitude) == 'ki') $target *=           1024;
+    if (strtolower($magnitude) == 'm')  $target *=        1000000;
+    if (strtolower($magnitude) == 'mi') $target *=      1024*1024;
+    if (strtolower($magnitude) == 'g')  $target *=     1000000000;
+    if (strtolower($magnitude) == 'gi') $target *= 1024*1024*1024;
+
+    $comparison = array_key_exists(1, $matches) ? $matches[1] : '==';
+    if ($comparison == '==' || $comparison == '')
+    {
+      return ($number == $target);
+    }
+    else if ($comparison == '>')
+    {
+      return ($number > $target);
+    }
+    else if ($comparison == '>=')
+    {
+      return ($number >= $target);
+    }
+    else if ($comparison == '<')
+    {
+      return ($number < $target);
+    }
+    else if ($comparison == '<=')
+    {
+      return ($number <= $target);
+    }
+
+    return false;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfFinder.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfInflector.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfInflector.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfInflector.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,118 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfInflector.class.php 1415 2006-06-11 08:33:51Z fabien $
+ */
+class sfInflector
+{
+  /**
+   * Returns a camelized string from a lower case and underscored string by replaceing slash with
+   * double-colol and upper-casing each letter preceded by an underscore.
+   *
+   * @param string String to camelize.
+   *
+   * @return string Camelized string.
+   */
+  public static function camelize($lower_case_and_underscored_word)
+  {
+    $tmp = $lower_case_and_underscored_word;
+    $tmp = sfToolkit::pregtr($tmp, array('#/(.?)#e'    => "'::'.strtoupper('\\1')",
+                                         '/(^|_)(.)/e' => "strtoupper('\\2')"));
+
+    return $tmp;
+  }
+
+  /**
+   * Returns an underscore-syntaxed version or the CamelCased string.
+   *
+   * @param string String to underscore.
+   *
+   * @return string Underscored string.
+   */
+  public static function underscore($camel_cased_word)
+  {
+    $tmp = $camel_cased_word;
+    $tmp = str_replace('::', '/', $tmp);
+    $tmp = sfToolkit::pregtr($tmp, array('/([A-Z]+)([A-Z][a-z])/' => '\\1_\\2',
+                                         '/([a-z\d])([A-Z])/'     => '\\1_\\2'));
+
+    return strtolower($tmp);
+  }
+
+  /**
+   * Returns classname::module with classname:: stripped off.
+   *
+   * @param string Classname and module pair.
+   *
+   * @return string Module name.
+   */
+  public static function demodulize($class_name_in_module)
+  {
+    return preg_replace('/^.*::/', '', $class_name_in_module);
+  }
+
+  /**
+   * Returns classname in underscored form, with "_id" tacked on at the end.
+   * This is for use in dealing with foreign keys in the database.
+   *
+   * @param string Class name.
+   * @param boolean Seperate with underscore.
+   *
+   * @return strong Foreign key
+   */
+  public static function foreign_key($class_name, $separate_class_name_and_id_with_underscore = true)
+  {
+    return sfInflector::underscore(sfInflector::demodulize($class_name)).($separate_class_name_and_id_with_underscore ? "_id" : "id");
+  }
+
+  /**
+   * Returns corresponding table name for given classname.
+   *
+   * @param string Name of class to get database table name for.
+   *
+   * @return string Name of the databse table for given class.
+   */
+  public static function tableize($class_name)
+  {
+    return sfInflector::underscore($class_name);
+  }
+
+  /**
+   * Returns model class name for given database table.
+   *
+   * @param string Table name.
+   *
+   * @return string Classified table name.
+   */
+  public static function classify($table_name)
+  {
+    return sfInflector::camelize($table_name);
+  }
+
+  /**
+   * Returns a human-readable string from a lower case and underscored word by replacing underscores
+   * with a space, and by upper-casing the initial characters.
+   *
+   * @param string String to make more readable.
+   *
+   * @return string Human-readable string.
+   */
+  public static function humanize($lower_case_and_underscored_word)
+  {
+    if (substr($lower_case_and_underscored_word, -3) === '_id')
+        $lower_case_and_underscored_word = substr($lower_case_and_underscored_word, 0, -3);
+    return ucfirst(str_replace('_', ' ', $lower_case_and_underscored_word));
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfInflector.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfMixer.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfMixer.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfMixer.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,194 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfMixer implements mixins and hooks.
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfMixer.class.php 2845 2006-11-28 16:41:45Z fabien $
+ */
+class sfMixer
+{
+  static protected
+    $mixins          = array(),
+    $mixinParameters = array(),
+    $mixinInstances  = array();
+
+  static public function register($name, $callable)
+  {
+    $lazy = false;
+
+    if (is_array($callable))
+    {
+      $mixinClass = $callable[0];
+      $mixinMethod = $callable[1];
+      if (!is_object($mixinClass))
+      {
+        $rc = new ReflectionClass($mixinClass);
+        $rm = $rc->getMethod($mixinMethod);
+        if (!$rm->isStatic())
+        {
+          $lazy = true;
+        }
+      }
+    }
+    else
+    {
+      $mixinMethod = $callable;
+    }
+
+    $tmp = explode(':', $name);
+    $class = $tmp[0];
+
+    // do we have a method name
+    if (isset($tmp[1]))
+    {
+      $method = $tmp[1];
+
+      // do we have a hook name
+      if (isset($tmp[2]))
+      {
+        $hook = $tmp[2];
+      }
+      else
+      {
+        $hook = $method;
+        $name .= ':'.$hook;
+      }
+    }
+    else
+    {
+      // this will be called with __call
+      $method = $mixinMethod;
+      $name = $class.':'.$method;
+      $hook = '';
+    }
+
+    // we cannot register 2 new methods with the same name
+    if (!$hook && isset(self::$mixins[$name]))
+    {
+      throw new Exception(sprintf('The class "%s" has already a mixin for method "%s"', $class, $mixinMethod));
+    }
+
+    // register mixin
+    if (!isset(self::$mixins[$name]))
+    {
+      self::$mixins[$name] = array();
+    }
+
+    if (!isset(self::$mixinParameters[$name]))
+    {
+      self::$mixinParameters[$name] = array();
+    }
+
+    self::$mixins[$name][] = $callable;
+    self::$mixinParameters[$name][] = array(
+      'lazy'     => $lazy,
+      'class'    => $class,
+      'method'   => $method,
+      'hook'     => $hook,
+    );
+  }
+
+  static public function getMixinInstance($name)
+  {
+    if (!isset(self::$mixins[$name]))
+    {
+      return;
+    }
+
+    foreach (self::$mixins[$name] as $i => $mixin)
+    {
+      if (!self::$mixinParameters[$name][$i]['lazy'])
+      {
+        continue;
+      }
+
+      $class = $mixin[0];
+      if (!isset(self::$mixinInstances[$class]))
+      {
+        self::$mixinInstances[$class] = new $class();
+        if (method_exists(self::$mixinInstances[$class], 'initialize'))
+        {
+          self::$mixinInstances[$class]->initialize();
+        }
+      }
+
+      self::$mixinParameters[$name][$i]['lazy'] = false;
+      self::$mixins[$name][$i][0] = self::$mixinInstances[$class];
+    }
+  }
+
+  static public function getCallables($name)
+  {
+    self::getMixinInstance($name);
+
+    return isset(self::$mixins[$name]) ? self::$mixins[$name] : array();
+  }
+
+  static public function getCallable($name)
+  {
+    self::getMixinInstance($name);
+
+    return isset(self::$mixins[$name]) ? self::$mixins[$name][0] : null;
+  }
+
+  static public function callMixins($hookName = null, $moreParams = array())
+  {
+    $traces = debug_backtrace();
+    $function = $traces[1]['function'];
+    $parameters = $traces[1]['args'];
+    $class = $traces[1]['class'];
+    $type = $traces[1]['type'];
+    if ('__call' == $function)
+    {
+      $method     = $parameters[0];
+      $parameters = $parameters[1];
+    }
+    else
+    {
+      $method = $function;
+    }
+
+    if ('->' == $type)
+    {
+      array_unshift($parameters, $traces[1]['object']);
+    }
+    else
+    {
+      array_unshift($parameters, $class);
+    }
+
+    // add more parameters
+    $parameters = array_merge($parameters, (array) $moreParams);
+
+    if ('__call' == $function)
+    {
+      if ($callable = self::getCallable($class.':'.$method))
+      {
+        return call_user_func_array($callable, $parameters);
+      }
+      else
+      {
+        throw new Exception(sprintf('Call to undefined method %s::%s', $class, $method));
+      }
+    }
+    else
+    {
+      $hookName = $hookName ? $hookName : $method;
+      foreach (self::getCallables($class.':'.$method.':'.$hookName) as $callable)
+      {
+        call_user_func_array($callable, $parameters);
+      }
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfMixer.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfParameterHolder.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfParameterHolder.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfParameterHolder.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,386 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfParameterHolder provides a base class for managing parameters.
+ *
+ * Parameters, in this case, are used to extend classes with additional data
+ * that requires no additional logic to manage.
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfParameterHolder.class.php 3329 2007-01-23 08:29:34Z fabien $
+ */
+class sfParameterHolder
+{
+  protected $default_namespace = null;
+  protected $parameters = array();
+
+  /**
+   * The constructor for sfParameterHolder.
+   * 
+   * The default namespace may be overridden at initialization as follows:
+   * <code>
+   * <?php
+   * $mySpecialPH = new sfParameterHolder('symfony/special');
+   * ?>
+   * </code>
+   */
+  public function __construct($namespace = 'symfony/default')
+  {
+    $this->default_namespace = $namespace;
+  }
+
+  /**
+   * Get the default namespace value.
+   *
+   * The $default_namespace is defined as 'symfony/default'.
+   *
+   * @return string The default namespace.
+   */
+  public function getDefaultNamespace()
+  {
+    return $this->default_namespace;
+  }
+
+  /**
+   * Clear all parameters associated with this request.
+   *
+   * @return void
+   */
+  public function clear()
+  {
+    $this->parameters = null;
+    $this->parameters = array();
+  }
+
+  /**
+   * Retrieve a parameter with an optionally specified namespace.
+   *
+   * An isolated namespace may be identified by providing a value for the third
+   * argument.  If not specified, the default namespace 'symfony/default' is
+   * used.
+   *
+   * @param string A parameter name.
+   * @param mixed  A default parameter value.
+   * @param string A parameter namespace.
+   *
+   * @return mixed A parameter value, if the parameter exists, otherwise null.
+   */
+  public function & get($name, $default = null, $ns = null)
+  {
+    if (!$ns)
+    {
+      $ns = $this->default_namespace;
+    }
+
+    if (isset($this->parameters[$ns][$name]))
+    {
+      $value = & $this->parameters[$ns][$name];
+    }
+    else if (isset($this->parameters[$ns]))
+    {
+      $value = sfToolkit::getArrayValueForPath($this->parameters[$ns], $name, $default);
+    }
+    else
+    {
+      $value = $default;
+    }
+
+    return $value;
+  }
+
+  /**
+   * Retrieve an array of parameter names from an optionally specified namespace.
+   *
+   * @param string A parameter namespace.
+   *
+   * @return array An indexed array of parameter names, if the namespace exists, otherwise null.
+   */
+  public function getNames($ns = null)
+  {
+    if (!$ns)
+    {
+      $ns = $this->default_namespace;
+    }
+
+    if (isset($this->parameters[$ns]))
+    {
+      return array_keys($this->parameters[$ns]);
+    }
+
+    return array();
+  }
+
+  /**
+   * Retrieve an array of parameter namespaces.
+   *
+   * @return array An indexed array of parameter namespaces.
+   */
+  public function getNamespaces()
+  {
+    return array_keys($this->parameters);
+  }
+
+  /**
+   * Retrieve an array of parameters, within a namespace.
+   *
+   * This method is limited to a namespace.  Without any argument,
+   * it returns the parameters of the default namespace.  If a 
+   * namespace is passed as an argument, only the parameters of the
+   * specified namespace are returned.
+   *
+   * @param string A parameter namespace.
+   *
+   * @return array An associative array of parameters.
+   */
+  public function & getAll($ns = null)
+  {
+    if (!$ns)
+    {
+      $ns = $this->default_namespace;
+    }
+
+    $parameters = array();
+
+    if (isset($this->parameters[$ns]))
+    {
+      $parameters = $this->parameters[$ns];
+    }
+
+    return $parameters;
+  }
+
+  /**
+   * Indicates whether or not a parameter exists.
+   *
+   * @param string A parameter name.
+   * @param string A parameter namespace.
+   *
+   * @return bool true, if the parameter exists, otherwise false.
+   */
+  public function has($name, $ns = null)
+  {
+    if (!$ns)
+    {
+      $ns = $this->default_namespace;
+    }
+
+    if (false !== ($offset = strpos($name, '[')))
+    {
+      if (isset($this->parameters[$ns][substr($name, 0, $offset)]))
+      {
+        $array = $this->parameters[$ns][substr($name, 0, $offset)];
+
+        while ($pos = strpos($name, '[', $offset))
+        {
+          $end = strpos($name, ']', $pos);
+          if ($end == $pos + 1)
+          {
+            // reached a []
+            return true;
+          }
+          else if (!isset($array[substr($name, $pos + 1, $end - $pos - 1)]))
+          {
+            return false;
+          }
+          $array = $array[substr($name, $pos + 1, $end - $pos - 1)];
+          $offset = $end;
+        }
+
+        return true;
+      }
+    }
+    elseif (isset($this->parameters[$ns][$name]))
+    {
+      return true;
+    }
+
+    return false;
+  }
+
+  /**
+   * Indicates whether or not A parameter namespace exists.
+   *
+   * @param string A parameter namespace.
+   *
+   * @return bool true, if the namespace exists, otherwise false.
+   */
+  public function hasNamespace($ns)
+  {
+    return isset($this->parameters[$ns]);
+  }
+
+  /**
+   * Remove a parameter.
+   *
+   * @param string A parameter name.
+   * @param string A parameter namespace.
+   *
+   * @return string A parameter value, if the parameter was removed, otherwise null.
+   */
+  public function & remove($name, $ns = null)
+  {
+    if (!$ns)
+    {
+      $ns = $this->default_namespace;
+    }
+
+    $retval = null;
+
+    if (isset($this->parameters[$ns]) && isset($this->parameters[$ns][$name]))
+    {
+      $retval =& $this->parameters[$ns][$name];
+      unset($this->parameters[$ns][$name]);
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Remove A parameter namespace and all of its associated parameters.
+   *
+   * @param string A parameter namespace.
+   *
+   * @return void
+   */
+  public function & removeNamespace($ns = null)
+  {
+    if (!$ns)
+    {
+      $ns = $this->default_namespace;
+    }
+
+    $retval = null;
+
+    if (isset($this->parameters[$ns]))
+    {
+      $retval =& $this->parameters[$ns];
+      unset($this->parameters[$ns]);
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Set a parameter.
+   *
+   * If a parameter with the name already exists the value will be overridden.
+   *
+   * @param string A parameter name.
+   * @param mixed  A parameter value.
+   * @param string A parameter namespace.
+   *
+   * @return void
+   */
+  public function set($name, $value, $ns = null)
+  {
+    if (!$ns)
+    {
+      $ns = $this->default_namespace;
+    }
+
+    if (!isset($this->parameters[$ns]))
+    {
+      $this->parameters[$ns] = array();
+    }
+
+    $this->parameters[$ns][$name] = $value;
+  }
+
+  /**
+   * Set a parameter by reference.
+   *
+   * If a parameter with the name already exists the value will be overridden.
+   *
+   * @param string A parameter name.
+   * @param mixed  A reference to a parameter value.
+   * @param string A parameter namespace.
+   *
+   * @return void
+   */
+  public function setByRef($name, & $value, $ns = null)
+  {
+    if (!$ns)
+    {
+      $ns = $this->default_namespace;
+    }
+
+    if (!isset($this->parameters[$ns]))
+    {
+      $this->parameters[$ns] = array();
+    }
+
+    $this->parameters[$ns][$name] =& $value;
+  }
+
+  /**
+   * Set an array of parameters.
+   *
+   * If an existing parameter name matches any of the keys in the supplied
+   * array, the associated value will be overridden.
+   *
+   * @param array An associative array of parameters and their associated values.
+   * @param string A parameter namespace.
+   *
+   * @return void
+   */
+  public function add($parameters, $ns = null)
+  {
+    if ($parameters === null) return;
+
+    if (!$ns)
+    {
+      $ns = $this->default_namespace;
+    }
+
+    if (!isset($this->parameters[$ns]))
+    {
+      $this->parameters[$ns] = array();
+    }
+
+    foreach ($parameters as $key => $value)
+    {
+      $this->parameters[$ns][$key] = $value;
+    }
+  }
+
+  /**
+   * Set an array of parameters by reference.
+   *
+   * If an existing parameter name matches any of the keys in the supplied
+   * array, the associated value will be overridden.
+   *
+   * @param array An associative array of parameters and references to their associated values.
+   * @param string A parameter namespace.
+   *
+   * @return void
+   */
+  public function addByRef(& $parameters, $ns = null)
+  {
+    if (!$ns)
+    {
+      $ns = $this->default_namespace;
+    }
+
+    if (!isset($this->parameters[$ns]))
+    {
+      $this->parameters[$ns] = array();
+    }
+
+    foreach ($parameters as $key => &$value)
+    {
+      $this->parameters[$ns][$key] =& $value;
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfParameterHolder.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfToolkit.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfToolkit.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfToolkit.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,517 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfToolkit provides basic utility methods.
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfToolkit.class.php 3251 2007-01-12 20:49:29Z fabien $
+ */
+class sfToolkit
+{
+  /**
+   * Extract the class or interface name from filename.
+   *
+   * @param string A filename.
+   *
+   * @return string A class or interface name, if one can be extracted, otherwise null.
+   */
+  public static function extractClassName($filename)
+  {
+    $retval = null;
+
+    if (self::isPathAbsolute($filename))
+    {
+      $filename = basename($filename);
+    }
+
+    $pattern = '/(.*?)\.(class|interface)\.php/i';
+
+    if (preg_match($pattern, $filename, $match))
+    {
+      $retval = $match[1];
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Clear all files in a given directory.
+   *
+   * @param  string An absolute filesystem path to a directory.
+   *
+   * @return void
+   */
+  public static function clearDirectory($directory)
+  {
+    if (!is_dir($directory))
+    {
+      return;
+    }
+
+    // open a file point to the cache dir
+    $fp = opendir($directory);
+
+    // ignore names
+    $ignore = array('.', '..', 'CVS', '.svn');
+
+    while (($file = readdir($fp)) !== false)
+    {
+      if (!in_array($file, $ignore))
+      {
+        if (is_link($directory.'/'.$file))
+        {
+          // delete symlink
+          unlink($directory.'/'.$file);
+        }
+        else if (is_dir($directory.'/'.$file))
+        {
+          // recurse through directory
+          self::clearDirectory($directory.'/'.$file);
+
+          // delete the directory
+          rmdir($directory.'/'.$file);
+        }
+        else
+        {
+          // delete the file
+          unlink($directory.'/'.$file);
+        }
+      }
+    }
+
+    // close file pointer
+    fclose($fp);
+  }
+
+  /**
+   * Clear all files and directories corresponding to a glob pattern.
+   *
+   * @param  string An absolute filesystem pattern.
+   *
+   * @return void
+   */
+  public static function clearGlob($pattern)
+  {
+    $files = glob($pattern);
+
+    // order is important when removing directories
+    sort($files);
+
+    foreach ($files as $file)
+    {
+      if (is_dir($file))
+      {
+        // delete directory
+        self::clearDirectory($file);
+      }
+      else
+      {
+        // delete file
+        unlink($file);
+      }
+    }
+  }
+
+  /**
+   * Determine if a filesystem path is absolute.
+   *
+   * @param path A filesystem path.
+   *
+   * @return bool true, if the path is absolute, otherwise false.
+   */
+  public static function isPathAbsolute($path)
+  {
+    if ($path[0] == '/' || $path[0] == '\\' ||
+        (strlen($path) > 3 && ctype_alpha($path[0]) &&
+         $path[1] == ':' &&
+         ($path[2] == '\\' || $path[2] == '/')
+        )
+       )
+    {
+      return true;
+    }
+
+    return false;
+  }
+
+  /**
+   * Determine if a lock file is present.
+   *
+   * @param integer A max amount of life time for the lock file.
+   *
+   * @return bool true, if the lock file is present, otherwise false.
+   */
+  public static function hasLockFile($lockFile, $maxLockFileLifeTime = 0)
+  {
+    $isLocked = false;
+    if (is_readable($lockFile) && ($last_access = fileatime($lockFile)))
+    {
+      $now = time();
+      $timeDiff = $now - $last_access;
+
+      if (!$maxLockFileLifeTime || $timeDiff < $maxLockFileLifeTime)
+      {
+        $isLocked = true;
+      }
+      else
+      {
+        unlink($lockFile);
+      }
+    }
+
+    return $isLocked;
+  }
+
+  public static function stripComments($source)
+  {
+    if (!sfConfig::get('sf_strip_comments', true))
+    {
+      return $source;
+    }
+
+    // tokenizer available?
+    if (!function_exists('token_get_all'))
+    {
+      $source = sfToolkit::pregtr($source, array('#/\*((?!\*/)[\d\D\s])*\*/#' => '',   // remove /* ... */
+                                                 '#^\s*//.*$#m'               => '')); // remove // ...
+
+      return $source;
+    }
+
+    $output = '';
+
+    $tokens = token_get_all($source);
+    foreach ($tokens as $token)
+    {
+      if (is_string($token))
+      {
+        // simple 1-character token
+        $output .= $token;
+      }
+      else
+      {
+        // token array
+        list($id, $text) = $token;
+
+        switch ($id)
+        {
+          case T_COMMENT:
+          case T_DOC_COMMENT:
+            // no action on comments
+            break;
+          default:
+            // anything else -> output "as is"
+            $output .= $text;
+            break;
+        }
+      }
+    }
+
+    return $output;
+  }
+
+  public static function stripslashesDeep($value)
+  {
+    return is_array($value) ? array_map(array('sfToolkit', 'stripslashesDeep'), $value) : stripslashes($value);
+  }
+
+  // code from php at moechofe dot com (array_merge comment on php.net)
+  /*
+   * array arrayDeepMerge ( array array1 [, array array2 [, array ...]] )
+   *
+   * Like array_merge
+   *
+   *  arrayDeepMerge() merges the elements of one or more arrays together so
+   * that the values of one are appended to the end of the previous one. It
+   * returns the resulting array.
+   *  If the input arrays have the same string keys, then the later value for
+   * that key will overwrite the previous one. If, however, the arrays contain
+   * numeric keys, the later value will not overwrite the original value, but
+   * will be appended.
+   *  If only one array is given and the array is numerically indexed, the keys
+   * get reindexed in a continuous way.
+   *
+   * Different from array_merge
+   *  If string keys have arrays for values, these arrays will merge recursively.
+   */
+  public static function arrayDeepMerge()
+  {
+    switch (func_num_args())
+    {
+      case 0:
+        return false;
+      case 1:
+        return func_get_arg(0);
+      case 2:
+        $args = func_get_args();
+        $args[2] = array();
+        if (is_array($args[0]) && is_array($args[1]))
+        {
+          foreach (array_unique(array_merge(array_keys($args[0]),array_keys($args[1]))) as $key)
+          {
+            $isKey0 = array_key_exists($key, $args[0]);
+            $isKey1 = array_key_exists($key, $args[1]);
+            if ($isKey0 && $isKey1 && is_array($args[0][$key]) && is_array($args[1][$key]))
+            {
+              $args[2][$key] = self::arrayDeepMerge($args[0][$key], $args[1][$key]);
+            }
+            else if ($isKey0 && $isKey1)
+            {
+              $args[2][$key] = $args[1][$key];
+            }
+            else if (!$isKey1)
+            {
+              $args[2][$key] = $args[0][$key];
+            }
+            else if (!$isKey0)
+            {
+              $args[2][$key] = $args[1][$key];
+            }
+          }
+          return $args[2];
+        }
+        else
+        {
+          return $args[1];
+        }
+      default :
+        $args = func_get_args();
+        $args[1] = sfToolkit::arrayDeepMerge($args[0], $args[1]);
+        array_shift($args);
+        return call_user_func_array(array('sfToolkit', 'arrayDeepMerge'), $args);
+        break;
+    }
+  }
+
+  public static function stringToArray($string)
+  {
+    preg_match_all('/
+      \s*(\w+)              # key                               \\1
+      \s*=\s*               # =
+      (\'|")?               # values may be included in \' or " \\2
+      (.*?)                 # value                             \\3
+      (?(2) \\2)            # matching \' or " if needed        \\4
+      \s*(?:
+        (?=\w+\s*=) | \s*$  # followed by another key= or the end of the string
+      )
+    /x', $string, $matches, PREG_SET_ORDER);
+
+    $attributes = array();
+    foreach ($matches as $val)
+    {
+      $attributes[$val[1]] = self::literalize($val[3]);
+    }
+
+    return $attributes;
+  }
+
+  /**
+   * Finds the type of the passed value, returns the value as the new type.
+   *
+   * @param  string
+   * @return mixed
+   */
+  public static function literalize($value, $quoted = false)
+  {
+    // lowercase our value for comparison
+    $value  = trim($value);
+    $lvalue = strtolower($value);
+
+    if (in_array($lvalue, array('null', '~', '')))
+    {
+      $value = null;
+    }
+    else if (in_array($lvalue, array('true', 'on', '+', 'yes')))
+    {
+      $value = true;
+    }
+    else if (in_array($lvalue, array('false', 'off', '-', 'no')))
+    {
+      $value = false;
+    }
+    else if (ctype_digit($value))
+    {
+      $value = (int) $value;
+    }
+    else if (is_numeric($value))
+    {
+      $value = (float) $value;
+    }
+    else
+    {
+      $value = self::replaceConstants($value);
+      if ($quoted)
+      {
+        $value = '\''.str_replace('\'', '\\\'', $value).'\'';
+      }
+    }
+
+    return $value;
+  }
+
+  /**
+   * Replaces constant identifiers in a scalar value.
+   *
+   * @param string the value to perform the replacement on
+   * @return string the value with substitutions made
+   */
+  public static function replaceConstants($value)
+  {
+    return is_string($value) ? preg_replace('/%(.+?)%/e', 'sfConfig::has(strtolower("\\1")) ? sfConfig::get(strtolower("\\1")) : "%\\1%"', $value) : $value;
+  }
+
+  /**
+   * Returns subject replaced with regular expression matchs
+   *
+   * @param mixed subject to search
+   * @param array array of search => replace pairs
+   */
+  public static function pregtr($search, $replacePairs)
+  {
+    return preg_replace(array_keys($replacePairs), array_values($replacePairs), $search);
+  }
+
+  public static function isArrayValuesEmpty($array)
+  {
+    static $isEmpty = true;
+    foreach ($array as $value)
+    {
+      $isEmpty = (is_array($value)) ? self::isArrayValuesEmpty($value) : (strlen($value) == 0);
+      if (!$isEmpty)
+      {
+        break;
+      }
+    }
+
+    return $isEmpty;
+  }
+
+  /**
+   * Check if a string is an utf8 using a W3C regular expression
+   * http://fr3.php.net/manual/en/function.mb-detect-encoding.php#50087
+   *
+   * @param string
+   *
+   * @return bool true if $string is valid UTF-8 and false otherwise.
+   */
+  public static function isUTF8($string)
+  {
+    // from http://w3.org/International/questions/qa-forms-utf-8.html
+    return preg_match('%^(?:
+             [\x09\x0A\x0D\x20-\x7E]            # ASCII
+           | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
+           |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
+           | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
+           |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
+           |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
+           | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
+           |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
+       )*$%xs', $string);
+  }
+
+  public static function getArrayValueForPath($values, $name, $default = null)
+  {
+    if (false !== ($offset = strpos($name, '[')))
+    {
+      if (isset($values[substr($name, 0, $offset)]))
+      {
+        $array = $values[substr($name, 0, $offset)];
+
+        while ($pos = strpos($name, '[', $offset))
+        {
+          $end = strpos($name, ']', $pos);
+          if ($end == $pos + 1)
+          {
+            // reached a []
+            break;
+          }
+          else if (!isset($array[substr($name, $pos + 1, $end - $pos - 1)]))
+          {
+            return $default;
+          }
+          $array = $array[substr($name, $pos + 1, $end - $pos - 1)];
+          $offset = $end;
+        }
+
+        return $array;
+      }
+    }
+
+    return $default;
+  }
+
+  public static function getPhpCli()
+  {
+    $path = getenv('PATH') ? getenv('PATH') : getenv('Path');
+    $suffixes = DIRECTORY_SEPARATOR == '\\' ? (getenv('PATHEXT') ? explode(PATH_SEPARATOR, getenv('PATHEXT')) : array('.exe', '.bat', '.cmd', '.com')) : array('');
+    foreach (array('php5', 'php') as $phpCli)
+    {
+      foreach ($suffixes as $suffix)
+      {
+        foreach (explode(PATH_SEPARATOR, $path) as $dir)
+        {
+          $file = $dir.DIRECTORY_SEPARATOR.$phpCli.$suffix;
+          if (is_executable($file))
+          {
+            return $file;
+          }
+        }
+      }
+    }
+
+    throw new sfException('Unable to find PHP executable');
+  }
+
+  /**
+   * From PEAR System.php
+   *
+   * LICENSE: This source file is subject to version 3.0 of the PHP license
+   * that is available through the world-wide-web at the following URI:
+   * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
+   * the PHP License and are unable to obtain it through the web, please
+   * send a note to license en php.net so we can mail you a copy immediately.
+   *
+   * @author     Tomas V.V.Cox <cox en idecnet.com>
+   * @copyright  1997-2006 The PHP Group
+   * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
+   */
+  public static function getTmpDir()
+  {
+    if (DIRECTORY_SEPARATOR == '\\')
+    {
+      if ($var = isset($_ENV['TEMP']) ? $_ENV['TEMP'] : getenv('TEMP'))
+      {
+        return $var;
+      }
+      if ($var = isset($_ENV['TMP']) ? $_ENV['TMP'] : getenv('TMP'))
+      {
+        return $var;
+      }
+      if ($var = isset($_ENV['windir']) ? $_ENV['windir'] : getenv('windir'))
+      {
+        return $var;
+      }
+
+      return getenv('SystemRoot').'\temp';
+    }
+
+    if ($var = isset($_ENV['TMPDIR']) ? $_ENV['TMPDIR'] : getenv('TMPDIR'))
+    {
+      return $var;
+    }
+
+    return '/tmp';
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfToolkit.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfYaml.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfYaml.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfYaml.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,105 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfYaml class.
+ *
+ * @package    symfony
+ * @subpackage util
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfYaml.class.php 3378 2007-02-01 06:47:15Z fabien $
+ */
+class sfYaml
+{
+  /**
+   * Load YAML into a PHP array statically
+   *
+   * The load method, when supplied with a YAML stream (string or file),
+   * will do its best to convert YAML in a file into a PHP array.
+   *
+   *  Usage:
+   *  <code>
+   *   $array = sfYAML::Load('config.yml');
+   *   print_r($array);
+   *  </code>
+   *
+   * @return array
+   * @param string $input Path of YAML file or string containing YAML
+   */
+  public static function load($input)
+  {
+    $input = self::getIncludeContents($input);
+
+    // if an array is returned by the config file assume it's in plain php form else in yaml
+    if (is_array($input))
+    {
+      return $input;
+    }
+
+    // syck is prefered over spyc
+    if (function_exists('syck_load'))
+    {
+      $retval = syck_load($input);
+
+      return is_array($retval) ? $retval : array();
+    }
+    else
+    {
+      require_once(dirname(__FILE__).'/Spyc.class.php');
+
+      $spyc = new Spyc();
+
+      return $spyc->load($input);
+    }
+  }
+
+  /**
+   * Dump YAML from PHP array statically
+   *
+   * The dump method, when supplied with an array, will do its best
+   * to convert the array into friendly YAML.
+   *
+   * @return string
+   * @param array $array PHP array
+   */
+  public static function dump($array)
+  {
+    require_once(dirname(__FILE__).'/Spyc.class.php');
+
+    $spyc = new Spyc();
+
+    return $spyc->dump($array);
+  }
+
+  protected static function getIncludeContents($input)
+  {
+    // if input is a file, process it
+    if (strpos($input, "\n") === false && is_file($input))
+    {
+      ob_start();
+      $retval = include($input);
+      $contents = ob_get_clean();
+
+      // if an array is returned by the config file assume it's in plain php form else in yaml
+      return is_array($retval) ? $retval : $contents;
+    }
+
+    // else return original input
+    return $input;
+  }
+}
+
+/**
+ * Wraps echo to automatically provide a newline
+ */
+function echoln($string)
+{
+  echo $string."\n";
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/util/sfYaml.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfCallbackValidator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfCallbackValidator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfCallbackValidator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,85 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfCallbackValidator allows you to use a custom callback function or method to
+ * validate the input. The function should return true on valid and false on invalid
+ * and should be callable using is_callable().
+ *
+ * <b>Required parameters:</b>
+ *
+ * # <b>callback</b> - [none] - A valid callback function or Class::method array.
+ * When using class/method specify it as an array in yml file as [class, method]
+ *
+ * <b>Optional parameters:</b>
+ *
+ * # <b>invalid_error</b> - [Invalid input] - An error message to use when the
+ *                                          input fails the callback check
+ *
+ * @package    symfony
+ * @subpackage validator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfCallbackValidator.class.php 3329 2007-01-23 08:29:34Z fabien $
+ */
+class sfCallbackValidator extends sfValidator
+{
+  /**
+   * Executes this validator.
+   *
+   * @param string A parameter value
+   * @param string An error message reference
+   *
+   * @return boolean true, if this validator executes successfully, otherwise false
+   */
+  public function execute(&$value, &$error)
+  {
+    $callback = $this->getParameterHolder()->get('callback');
+
+    if (!call_user_func($callback, $value))
+    {
+      $error = $this->getParameterHolder()->get('invalid_error');
+
+      return false;
+    }
+
+    return true;
+  }
+
+  /**
+   * Initializes this validator.
+   *
+   * @param sfContext The current application context
+   * @param array   An associative array of initialization parameters
+   *
+   * @return boolean true, if initialization completes successfully, otherwise false
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // initialize parent
+    parent::initialize($context);
+
+    // set defaults
+    $this->getParameterHolder()->set('callback', null);
+    $this->getParameterHolder()->set('invalid_error', 'Invalid input');
+
+    $this->getParameterHolder()->add($parameters);
+
+    // check parameters
+    if (!is_callable($this->getParameterHolder()->get('callback')))
+    {
+      // no pattern specified
+      $error = 'Callback function must be a valid callback using is_callable()';
+
+      throw new sfValidatorException($error);
+    }
+
+    return true;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfCallbackValidator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfCompareValidator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfCompareValidator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfCompareValidator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfCompareValidator checks the equality of two different request parameters.
+ *
+ * passwordValidator:
+ *   class:            sfCompareValidator
+ *   param:
+ *     check:          password2
+ *     compare_error:  The passwords you entered do not match. Please try again.
+ *
+ * @package    symfony
+ * @subpackage validator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfCompareValidator.class.php 3233 2007-01-11 21:01:08Z fabien $
+ */
+class sfCompareValidator extends sfValidator
+{
+  /**
+   * Executes this validator.
+   *
+   * @param mixed A file or parameter value/array
+   * @param error An error message reference
+   *
+   * @return bool true, if this validator executes successfully, otherwise false
+   */
+  public function execute(&$value, &$error)
+  {
+    $check_param = $this->getParameterHolder()->get('check');
+    $check_value = $this->getContext()->getRequest()->getParameter($check_param);
+
+    if ($value !== $check_value)
+    {
+      $error = $this->getParameterHolder()->get('compare_error');
+      return false;
+    }
+
+    return true;
+  }
+
+  public function initialize($context, $parameters = null)
+  {
+    // initialize parent
+    parent::initialize($context);
+
+    // set defaults
+    $this->getParameterHolder()->set('compare_error', 'Invalid input');
+
+    $this->getParameterHolder()->add($parameters);
+
+    return true;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfCompareValidator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfDateValidator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfDateValidator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfDateValidator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,137 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfDateValidator verifies a parameter is of a date format.
+ *
+ * @package    symfony
+ * @subpackage validator
+ * @author     Nick Lane <nick.lane en internode.on.net>
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfDateValidator.class.php 3233 2007-01-11 21:01:08Z fabien $
+ */
+class sfDateValidator extends sfValidator
+{
+  /**
+   * Execute this validator.
+   *
+   * @param mixed A file or parameter value/array
+   * @param error An error message reference
+   *
+   * @return bool true, if this validator executes successfully, otherwise false
+   */
+  public function execute(&$value, &$error)
+  {
+    $culture = $this->getContext()->getUser()->getCulture();
+
+    // Validate the given date
+    $value1 = $this->getValidDate($value, $culture);
+    if (!$value1)
+    {
+      $error = $this->getParameter('date_error');
+
+      return false;
+    }
+
+    // Is there a compare to do?
+    $compareDateParam = $this->getParameter('compare');
+    $compareDate = $this->getContext()->getRequest()->getParameter($compareDateParam);
+
+    // If the compare date is given
+    if ($compareDate)
+    {
+      $operator = trim($this->getParameter('operator', '=='), '\'" ');
+      $value2 = $this->getValidDate($compareDate, $culture);
+
+      // If the check date is valid, compare it. Otherwise ignore the comparison
+      if ($value2)
+      {
+        $valid = false;
+        switch ($operator)
+        {
+          case '>':
+            $valid = $value1 >  $value2;
+            break;
+          case '>=':
+            $valid = $value1 >= $value2;
+            break;
+          case '==':
+            $valid = $value1 == $value2;
+            break;          
+          case '<=':
+            $valid = $value1 <= $value2;
+            break;
+          case '<':
+            $valid = $value1 <  $value2;
+            break;
+
+          default:
+            throw new sfValidatorException(sprintf('Invalid date comparison operator "%s"', $operator));
+        }
+
+        if (!$valid)
+        {
+          $error = $this->getParameter('compare_error');
+
+          return false;
+        }
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * Converts the given date into a Unix timestamp.
+   * 
+   * Returns null if the date is invalid
+   * 
+   * @param $value    Date to convert
+   * @param $culture  Language culture to use
+   */
+  protected function getValidDate($value, $culture)
+  {
+    // Use the language culture date format
+    $result = sfI18N::getDateForCulture($value, $culture);
+    list($d, $m, $y) = $result;
+
+    // Make sure the date is a valid gregorian calendar date also
+    if ($result === null || !checkdate($m, $d, $y))
+    {
+      return null;
+    }
+
+    return strtotime("$y-$m-$d 00:00");
+  }
+
+  /**
+   * Initializes the validator.
+   *
+   * @param sfContext The current application context
+   * @param array   An associative array of initialization parameters
+   *
+   * @return bool true, if initialization completes successfully, otherwise false
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // Initialize parent
+    parent::initialize($context, $parameters);
+
+    // Set defaults
+    $this->getParameterHolder()->set('date_error', 'Invalid date');
+    $this->getParameterHolder()->set('compare_error', 'Compare failed');
+
+    $this->getParameterHolder()->add($parameters);
+
+    return true;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfDateValidator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfEmailValidator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfEmailValidator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfEmailValidator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,116 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfEmailValidator verifies a parameter contains a value that qualifies as an
+ * email address.
+ *
+ * @package    symfony
+ * @subpackage validator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfEmailValidator.class.php 3233 2007-01-11 21:01:08Z fabien $
+ */
+class sfEmailValidator extends sfValidator
+{
+  /**
+   * Executes this validator.
+   *
+   * @param mixed A file or parameter value/array
+   * @param error An error message reference
+   *
+   * @return bool true, if this validator executes successfully, otherwise false
+   */
+  public function execute(&$value, &$error)
+  {
+    $strict = $this->getParameterHolder()->get('strict');
+    if ($strict == true)
+    {
+      $re = '/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i';
+    }
+    else
+    {
+      /* Cal Henderson: http://iamcal.com/publish/articles/php/parsing_email/pdf/
+       * The long regular expression below is made by the following code
+       * fragment:
+       *
+       *   $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
+       *   $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
+       *   $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c'
+       *         . '\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
+       *   $quoted_pair = '\\x5c\\x00-\\x7f';
+       *   $domain_literal = "\\x5b($dtext|$quoted_pair)*\\x5d";
+       *   $quoted_string = "\\x22($qtext|$quoted_pair)*\\x22";
+       *   $domain_ref = $atom;
+       *   $sub_domain = "($domain_ref|$domain_literal)";
+       *   $word = "($atom|$quoted_string)";
+       *   $domain = "$sub_domain(\\x2e$sub_domain)*";
+       *   $local_part = "$word(\\x2e$word)*";
+       *   $addr_spec = "$local_part\\x40$domain";
+       */
+
+      $re = '/^([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-'
+           .'\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c\\x00-'
+           .'\\x7f)*\\x22)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-'
+           .'\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80'
+           .'-\\xff]|\\x5c\\x00-\\x7f)*\\x22))*\\x40([^\\x00-\\x20\\x22\\x28\\x29'
+           .'\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x5b([^'
+           .'\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*\\x5d)(\\x2e([^\\x00-'
+           .'\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-'
+           .'\\xff]+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*'
+           .'\\x5d))*$/'
+      ;
+    }
+
+    if (!preg_match($re, $value))
+    {
+      $error = $this->getParameterHolder()->get('email_error');
+      return false;
+    }
+
+    $checkDomain = $this->getParameterHolder()->get('check_domain');
+    if ($checkDomain && function_exists('checkdnsrr'))
+    {
+      $tokens = explode('@', $value);
+      if (!checkdnsrr($tokens[1], 'MX') && !checkdnsrr($tokens[1], 'A'))
+      {
+        $error = $this->getParameterHolder()->get('email_error');
+
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * Initializes this validator.
+   *
+   * @param sfContext The current application context
+   * @param array   An associative array of initialization parameters
+   *
+   * @return bool true, if initialization completes successfully, otherwise false
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // initialize parent
+    parent::initialize($context);
+
+    // set defaults
+    $this->getParameterHolder()->set('strict',       true);
+    $this->getParameterHolder()->set('check_domain', false);
+    $this->getParameterHolder()->set('email_error',  'Invalid input');
+
+    $this->getParameterHolder()->add($parameters);
+
+    return true;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfEmailValidator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfFileValidator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfFileValidator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfFileValidator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,111 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfFileValidator allows you to apply constraints to file upload.
+ *
+ * <b>Optional parameters:</b>
+ *
+ * # <b>max_size</b>         - [none]               - Maximum file size length.
+ * # <b>max_size_error</b>   - [File is too large]  - An error message to use when
+ *                                                file is too large.
+ * # <b>mime_types</b>       - [none]               - An array of mime types the file
+ *                                                is allowed to match.
+ * # <b>mime_types_error</b> - [Invalid mime type]  - An error message to use when
+ *                                                file mime type does not match a value
+ *                                                listed in the mime types array.
+ *
+ * @package    symfony
+ * @subpackage validator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfFileValidator.class.php 3233 2007-01-11 21:01:08Z fabien $
+ */
+class sfFileValidator extends sfValidator
+{
+  /**
+   * Executes this validator.
+   *
+   * @param mixed A file or parameter value/array
+   * @param error An error message reference
+   *
+   * @return bool true, if this validator executes successfully, otherwise false
+   */
+  public function execute(&$value, &$error)
+  {
+    $request = $this->getContext()->getRequest();
+
+    // file too large?
+    $max_size = $this->getParameter('max_size');
+    if ($max_size !== null && $max_size < $value['size'])
+    {
+      $error = $this->getParameter('max_size_error');
+
+      return false;
+    }
+
+    // supported mime types formats
+    $mime_types = $this->getParameter('mime_types');
+    if ($mime_types !== null && !in_array($value['type'], $mime_types))
+    {
+      $error = $this->getParameter('mime_types_error');
+
+      return false;
+    }
+
+    return true;
+  }
+
+  /**
+   * Initializes this validator.
+   *
+   * @param sfContext The current application context
+   * @param array   An associative array of initialization parameters
+   *
+   * @return bool true, if initialization completes successfully, otherwise false
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // initialize parent
+    parent::initialize($context);
+
+    // set defaults
+    $this->getParameterHolder()->set('max_size',         null);
+    $this->getParameterHolder()->set('max_size_error',   'File is too large');
+    $this->getParameterHolder()->set('mime_types',        null);
+    $this->getParameterHolder()->set('mime_types_error', 'Invalid mime type');
+
+    $this->getParameterHolder()->add($parameters);
+
+    // pre-defined categories
+    $categories = array(
+      '@web_images' => array(
+        'image/jpeg',
+        'image/pjpeg',
+        'image/png',
+        'image/x-png',
+        'image/gif',
+      ),
+    );
+
+    if (!is_array($this->getParameter('mime_types')))
+    {
+      if (isset($categories[$this->getParameter('mime_types')]))
+      {
+        $this->setParameter('mime_types', $categories[$this->getParameter('mime_types')]);
+      }
+    }
+    elseif ($this->getParameter('mime_types', null))
+    {
+      $this->setParameter('mime_types', $this->getParameter('mime_types'));
+    }
+
+    return true;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfFileValidator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfHtmlValidator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfHtmlValidator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfHtmlValidator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage validator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfHtmlValidator.class.php 3233 2007-01-11 21:01:08Z fabien $
+ */
+class sfHtmlValidator extends sfValidator
+{
+  /**
+   * Executes this validator.
+   *
+   * @param mixed A file or parameter value/array
+   * @param error An error message reference
+   *
+   * @return bool true, if this validator executes successfully, otherwise false
+   */
+  public function execute(&$value, &$error)
+  {
+    if (trim(strip_tags($value)) == '')
+    {
+      // If page contains an object or an image, it's ok
+      if (preg_match('/<img/i', $value) || preg_match('/<object/i', $value))
+        return true;
+      else
+      {
+        $error = $this->getParameterHolder()->get('html_error');
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * Initializes this validator.
+   *
+   * @param sfContext The current application context
+   * @param array   An associative array of initialization parameters
+   *
+   * @return bool true, if initialization completes successfully, otherwise false
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // initialize parent
+    parent::initialize($context);
+
+    // set defaults
+    $this->getParameterHolder()->set('html_error', 'Invalid input');
+
+    $this->getParameterHolder()->add($parameters);
+
+    return true;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfHtmlValidator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfNumberValidator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfNumberValidator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfNumberValidator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,159 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfNumberValidator verifies a parameter is a number and allows you to apply
+ * size constraints.
+ *
+ * <b>Optional parameters:</b>
+ *
+ * # <b>max</b>        - [none]                  - Maximum number size.
+ * # <b>max_error</b>  - [Input is too large]    - An error message to use when
+ *                                                 input is too large.
+ * # <b>min</b>        - [none]                  - Minimum number size.
+ * # <b>min_error</b>  - [Input is too small]    - An error message to use when
+ *                                                 input is too small.
+ * # <b>nan_error</b>  - [Input is not a number] - Default error message when
+ *                                                 input is not a number.
+ * # <b>type</b>       - [Any]                   - Type of number (Any, Float).
+ * # <b>type_error</b> - [Input is not a number] - An error message to use when
+ *                                                 input is not a number.
+ *
+ * @package    symfony
+ * @subpackage validator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfNumberValidator.class.php 3233 2007-01-11 21:01:08Z fabien $
+ */
+class sfNumberValidator extends sfValidator
+{
+  /**
+   * Executes this validator.
+   *
+   * @param mixed A file or parameter value/array
+   * @param error An error message reference
+   *
+   * @return bool true, if this validator executes successfully, otherwise false
+   */
+  public function execute(&$value, &$error)
+  {
+    if (!is_numeric($value))
+    {
+      // it's NaN, what nerve!
+      $error = $this->getParameterHolder()->get('nan_error');
+
+      return false;
+    }
+
+    $type = strtolower($this->getParameterHolder()->get('type'));
+
+    switch ($type)
+    {
+      case "decimal":
+      case "float":
+      {
+        if (substr_count($value, '.') != 1)
+        {
+          // value isn't a float, shazbot!
+          $error = $this->getParameterHolder()->get('type_error');
+          return false;
+        }
+
+        // cast our value to a float
+        $value = (float) $value;
+
+        break;
+      }
+
+      case "int":
+      case "integer":
+      {
+        // Note: (Both 3 AND 3.0 are BOTH considered integers and 3.1 is not)
+        if ((float) $value != (int) $value)
+        {
+          // is not an integer.
+          $error = $this->getParameterHolder()->get('type_error');
+          return false;
+        }
+
+        // cast our value to an integer
+        $value = (int) $value;
+
+        break;
+      }
+
+    }
+
+    $min = $this->getParameterHolder()->get('min');
+
+    if ($min !== null && $value < $min)
+    {
+      // too small
+      $error = $this->getParameterHolder()->get('min_error');
+
+      return false;
+    }
+
+    $max = $this->getParameterHolder()->get('max');
+
+    if ($max !== null && $value > $max)
+    {
+      // too large
+      $error = $this->getParameterHolder()->get('max_error');
+
+      return false;
+    }
+
+    return true;
+  }
+
+  /**
+   * Initializes this validator.
+   *
+   * @param sfContext The current application context
+   * @param array   An associative array of initialization parameters
+   *
+   * @return bool true, if initialization completes successfully, otherwise false
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // initialize parent
+    parent::initialize($context);
+
+    // set defaults
+    $this->getParameterHolder()->set('max',        null);
+    $this->getParameterHolder()->set('max_error',  'Input is too large');
+    $this->getParameterHolder()->set('min',        null);
+    $this->getParameterHolder()->set('min_error',  'Input is too small');
+    $this->getParameterHolder()->set('nan_error',  'Input is not a number');
+    $this->getParameterHolder()->set('type',       'any');
+    $this->getParameterHolder()->set('type_error', 'Input is not a number');
+
+    $this->getParameterHolder()->add($parameters);
+
+    // check user-specified parameters
+    $type = strtolower($this->getParameterHolder()->get('type'));
+
+    // array of allowed types
+    $allowed_types = array('any', 'decimal', 'float', 'int', 'integer');
+
+    if (!in_array(strtolower($type), $allowed_types))
+    {
+      // unknown type
+      $error = 'Unknown number type "%s" in NumberValidator';
+      $error = sprintf($error, $this->getParameterHolder()->get('type'));
+
+      throw new sfValidatorException($error);
+    }
+
+    return true;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfNumberValidator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfRegexValidator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfRegexValidator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfRegexValidator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,92 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfRegexValidator allows you to match a value against a regular expression
+ * pattern.
+ *
+ * <b>Required parameters:</b>
+ *
+ * # <b>pattern</b> - [none] - A PCRE, preg_match() style regular expression
+ *                             pattern.
+ *
+ * <b>Optional parameters:</b>
+ *
+ * # <b>match</b>       - [true]          - Indicates that the pattern must be
+ *                                          matched or must not match.
+ * # <b>match_error</b> - [Invalid input] - An error message to use when the
+ *                                          input does not meet the regex
+ *                                          specifications.
+ *
+ * @package    symfony
+ * @subpackage validator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfRegexValidator.class.php 3233 2007-01-11 21:01:08Z fabien $
+ */
+class sfRegexValidator extends sfValidator
+{
+  /**
+   * Executes this validator.
+   *
+   * @param string A parameter value
+   * @param string An error message reference
+   *
+   * @return bool true, if this validator executes successfully, otherwise false
+   */
+  public function execute(&$value, &$error)
+  {
+    $match   = $this->getParameterHolder()->get('match');
+    $pattern = $this->getParameterHolder()->get('pattern');
+
+    if (($match && !preg_match($pattern, $value)) ||
+        (!$match && preg_match($pattern, $value)))
+    {
+      $error = $this->getParameterHolder()->get('match_error');
+
+      return false;
+    }
+
+    return true;
+  }
+
+  /**
+   * Initializes this validator.
+   *
+   * @param sfContext The current application context
+   * @param array   An associative array of initialization parameters
+   *
+   * @return bool true, if initialization completes successfully, otherwise false
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // initialize parent
+    parent::initialize($context);
+
+    // set defaults
+    $this->getParameterHolder()->set('match',       true);
+    $this->getParameterHolder()->set('match_error', 'Invalid input');
+    $this->getParameterHolder()->set('pattern',     null);
+
+    $this->getParameterHolder()->add($parameters);
+
+    // check parameters
+    if ($this->getParameterHolder()->get('pattern') == null)
+    {
+      // no pattern specified
+      $error = 'Please specify a PCRE regular expression pattern for your registered RegexValidator';
+
+      throw new sfValidatorException($error);
+    }
+
+    return true;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfRegexValidator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfStringValidator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfStringValidator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfStringValidator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,138 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfStringValidator allows you to apply string-related constraints to a
+ * parameter.
+ *
+ * <b>Optional parameters:</b>
+ *
+ * # <b>insensitive</b>  - [false]              - Whether or not the value check
+ *                                                against the array of values is
+ *                                                case-insensitive. <b>Note:</b>
+ *                                                When using this option, values
+ *                                                in the values array must be
+ *                                                entered in lower-case.
+ * # <b>max</b>          - [none]               - Maximum string length.
+ * # <b>max_error</b>    - [Input is too long]  - An error message to use when
+ *                                                input is too long.
+ * # <b>min</b>          - [none]               - Minimum string length.
+ * # <b>min_error</b>    - [Input is too short] - An error message to use when
+ *                                                input is too short.
+ * # <b>values</b>       - [none]               - An array of values the input
+ *                                                is allowed to match.
+ * # <b>values_error</b> - [Invalid selection]  - An error message to use when
+ *                                                input does not match a value
+ *                                                listed in the values array.
+ *
+ * @package    symfony
+ * @subpackage validator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfStringValidator.class.php 3233 2007-01-11 21:01:08Z fabien $
+ */
+class sfStringValidator extends sfValidator
+{
+  /**
+   * Executes this validator.
+   *
+   * @param mixed A parameter value
+   * @param error An error message reference
+   *
+   * @return bool true, if this validator executes successfully, otherwise false
+   */
+  public function execute(&$value, &$error)
+  {
+    $decodedValue = sfToolkit::isUTF8($value) && function_exists('utf8_decode') ? utf8_decode($value) : $value;
+
+    $min = $this->getParameterHolder()->get('min');
+    if ($min !== null && strlen(trim($decodedValue)) < $min)
+    {
+      // too short
+      $error = $this->getParameterHolder()->get('min_error');
+
+      return false;
+    }
+
+    $max = $this->getParameterHolder()->get('max');
+    if ($max !== null && strlen(trim($decodedValue)) > $max)
+    {
+      // too long
+      $error = $this->getParameterHolder()->get('max_error');
+
+      return false;
+    }
+
+    $values = $this->getParameterHolder()->get('values');
+    if ($values !== null)
+    {
+      if ($this->getParameterHolder()->get('insensitive'))
+      {
+        $value = strtolower($value);
+        $found = false;
+        foreach ($values as $avalue)
+        {
+          if ($value == strtolower($avalue))
+          {
+            $found = true;
+            break;
+          }
+        }
+        if (!$found)
+        {
+          // can't find a match
+          $error = $this->getParameterHolder()->get('values_error');
+
+          return false;
+        }
+      }
+      else
+      {
+        if (!in_array($value, (array) $values))
+        {
+          // can't find a match
+          $error = $this->getParameterHolder()->get('values_error');
+
+          return false;
+        }
+      }
+    }
+
+    return true;
+  }
+
+  /**
+   * Initializes this validator.
+   *
+   * @param sfContext The current application context
+   * @param array   An associative array of initialization parameters
+   *
+   * @return bool true, if initialization completes successfully, otherwise false
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // initialize parent
+    parent::initialize($context);
+
+    // set defaults
+    $this->getParameterHolder()->set('insensitive',  false);
+    $this->getParameterHolder()->set('max',          null);
+    $this->getParameterHolder()->set('max_error',    'Input is too long');
+    $this->getParameterHolder()->set('min',          null);
+    $this->getParameterHolder()->set('min_error',    'Input is too short');
+    $this->getParameterHolder()->set('values',       null);
+    $this->getParameterHolder()->set('values_error', 'Invalid selection');
+
+    $this->getParameterHolder()->add($parameters);
+
+    return true;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfStringValidator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfUrlValidator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfUrlValidator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfUrlValidator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfUrlValidator verifies a parameter contains a value that qualifies as a valid URL.
+ *
+ * @package    symfony
+ * @subpackage validator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfUrlValidator.class.php 3345 2007-01-29 10:25:09Z fabien $
+ */
+class sfUrlValidator extends sfValidator
+{
+  /**
+   * Executes this validator.
+   *
+   * @param mixed A file or parameter value/array
+   * @param error An error message reference
+   *
+   * @return bool true, if this validator executes successfully, otherwise false
+   */
+  public function execute(&$value, &$error)
+  {
+    $re = '/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)/i';
+
+    if (!preg_match($re, $value))
+    {
+      $error = $this->getParameterHolder()->get('url_error');
+      return false;
+    }
+
+    return true;
+  }
+
+  /**
+   * Initializes this validator.
+   *
+   * @param sfContext The current application context
+   * @param array   An associative array of initialization parameters
+   *
+   * @return bool true, if initialization completes successfully, otherwise false
+   */
+  public function initialize($context, $parameters = null)
+  {
+    // initialize parent
+    parent::initialize($context);
+
+    // set defaults
+    $this->getParameterHolder()->set('url_error', 'Invalid input');
+
+    $this->getParameterHolder()->add($parameters);
+
+    return true;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfUrlValidator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfValidator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfValidator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfValidator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,113 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfValidator allows you to apply constraints to user entered parameters.
+ *
+ * @package    symfony
+ * @subpackage validator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfValidator.class.php 3250 2007-01-12 20:09:11Z fabien $
+ */
+abstract class sfValidator
+{
+  protected
+    $parameterHolder = null,
+    $context         = null;
+
+  /**
+   * Executes this validator.
+   *
+   * @param mixed A file or parameter value/array
+   * @param string An error message reference
+   *
+   * @return bool true, if this validator executes successfully, otherwise false
+   */
+  abstract function execute(&$value, &$error);
+
+  /**
+   * Retrieves the current application context.
+   *
+   * @return sfContext The current sfContext instance
+   */
+  public final function getContext()
+  {
+    return $this->context;
+  }
+
+  /**
+   * Initializes this validator.
+   *
+   * @param sfContext The current application context
+   * @param array   An associative array of initialization parameters
+   *
+   * @return bool true, if initialization completes successfully, otherwise false
+   */
+  public function initialize($context, $parameters = array())
+  {
+    $this->context = $context;
+
+    $this->parameterHolder = new sfParameterHolder();
+    $this->parameterHolder->add($parameters);
+
+    return true;
+  }
+
+  /**
+   * Retrieves the parameters from the validator.
+   *
+   * @return sfParameterHolder List of parameters
+   */
+  public function getParameterHolder()
+  {
+    return $this->parameterHolder;
+  }
+
+  /**
+   * Retrieves a parameter from the validator.
+   *
+   * @param string Parameter name
+   * @param mixed A default parameter value
+   * @param string A parameter namespace
+   *
+   * @return mixed A parameter value
+   */
+  public function getParameter($name, $default = null, $ns = null)
+  {
+    return $this->parameterHolder->get($name, $default, $ns);
+  }
+
+  /**
+   * Indicates whether or not a parameter exist for the validator.
+   *
+   * @param string A parameter name
+   * @param string A parameter namespace
+   *
+   * @return boolean true, if parameter exists, otherwise false
+   */
+  public function hasParameter($name, $ns = null)
+  {
+    return $this->parameterHolder->has($name, $ns);
+  }
+
+  /**
+   * Sets a parameter for the validator.
+   *
+   * @param string A parameter name
+   * @param mixed A parameter value
+   * @param string A parameter namespace
+   */
+  public function setParameter($name, $value, $ns = null)
+  {
+    $this->parameterHolder->set($name, $value, $ns);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfValidator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfValidatorManager.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfValidatorManager.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfValidatorManager.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,310 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * sfValidatorManager provides management for request parameters and their
+ * associated validators.
+ *
+ * @package    symfony
+ * @subpackage validator
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfValidatorManager.class.php 3233 2007-01-11 21:01:08Z fabien $
+ */
+class sfValidatorManager
+{
+  protected
+    $groups  = array(),
+    $names   = array(),
+    $request = null;
+
+  /**
+   * Clears this validator manager so it can be reused.
+   */
+  public function clear()
+  {
+    $this->groups = null;
+    $this->groups = array();
+    $this->names  = null;
+    $this->names  = array();
+  }
+
+  /**
+   * Executes all validators and determine the validation status.
+   *
+   * @return bool true, if validation completed successfully, otherwise false
+   */
+  public function execute()
+  {
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      sfContext::getInstance()->getLogger()->info('{sfValidator} validation execution');
+    }
+
+    $retval = true;
+
+    // loop through the names and start our validation
+    // if 1 or more groups exist, we'll have to do a second pass
+    $pass = 1;
+
+    while (true)
+    {
+      foreach ($this->names as $name => &$data)
+      {
+        if (isset($data['_is_parent']))
+        {
+          // this is a parent
+          foreach ($data as $subname => &$subdata)
+          {
+            if ($subname == '_is_parent')
+            {
+              // this isn't an actual index, but more of a flag
+              continue;
+            }
+
+            if ($subdata['validation_status'] == true && !$this->validate($subname, $subdata, $name))
+            {
+              // validation failed
+              $retval = false;
+            }
+          }
+        }
+        else
+        {
+          // single parameter
+          if ($data['validation_status'] == true && !$this->validate($name, $data, null))
+          {
+            // validation failed
+            $retval = false;
+          }
+        }
+      }
+
+      if (count($this->groups) == 0 || $pass == 2)
+      {
+        break;
+      }
+
+      // increase our pass indicator
+      ++$pass;
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Initializes this validator manager.
+   *
+   * @param sfContext A sfContext instance
+   */
+  public function initialize($context)
+  {
+    $this->request = $context->getRequest();
+  }
+
+  /**
+   * Registers a file or parameter.
+   *
+   * @param string  A file or parameter name
+   * @param bool    The required status
+   * @param string  A required error message
+   * @param string  A group name
+   * @param string  A parent array
+   */
+  public function registerName($name, $required = true, $message = 'Required', $parent = null, $group = null, $isFile = false)
+  {
+    // create the entry
+    $entry                      = array();
+    $entry['group']             = null;
+    $entry['is_file']           = $isFile;
+    $entry['required']          = $required;
+    $entry['required_msg']      = $message;
+    $entry['validation_status'] = true;
+    $entry['validators']        = array();
+
+    if ($parent != null)
+    {
+      // this parameter has a parent array
+      if (!isset($this->names[$parent]))
+      {
+        // create the parent array
+        $this->names[$parent] = array('_is_parent' => true);
+      }
+
+      // register this parameter
+      $this->names[$parent][$name] =& $entry;
+    }
+    else
+    {
+      // no parent
+
+      // register this parameter
+      $this->names[$name] =& $entry;
+    }
+
+    if ($group != null)
+    {
+      // set group
+      if (!isset($this->groups[$group]))
+      {
+        // create our group
+        $this->groups[$group] = array('_force' => false);
+      }
+
+      // add this file/parameter name to the group
+      $this->groups[$group][] = $name;
+
+      // add a reference back to the group array to the file/param array
+      $entry['group'] =& $this->groups[$group];
+    }
+  }
+
+  /**
+   * Registers a validator for a file or parameter.
+   *
+   * @param string    A file or parameter name
+   * @param Validator A validator implementation instance
+   * @param string    A parent array name
+   */
+  public function registerValidator($name, $validator, $parent = null)
+  {
+    if ($parent != null)
+    {
+      // this parameter has a parent
+      $this->names[$parent][$name]['validators'][] = $validator;
+    }
+    else
+    {
+      // no parent
+      $this->names[$name]['validators'][] = $validator;
+    }
+  }
+
+  /**
+   * Validates a file or parameter.
+   *
+   * @param string A file or parameter name
+   * @param array  Data associated with the file or parameter
+   * @param string A parent name
+   *
+   * @return bool true, if validation completes successfully, otherwise false
+   */
+  protected function validate(&$name, &$data, $parent)
+  {
+    // get defaults
+    $error     = null;
+    $errorName = null;
+    $force     = null !== $data['group'] ? $data['group']['_force'] : false;
+    $retval    = true;
+    $value     = null;
+
+    // get our parameter value
+    if ($parent == null)
+    {
+      // normal file/parameter
+      $errorName = $name;
+
+      if ($data['is_file'])
+      {
+        // file
+        $value = $this->request->getFile($name);
+      }
+      else
+      {
+        // parameter
+        $value = $this->request->getParameterHolder()->get($name);
+      }
+    }
+    else
+    {
+      // we have a parent
+      $errorName = $parent.'{'.$name.'}';
+
+      if ($data['is_file'])
+      {
+        // file
+        $parent = $this->request->getFile($parent.'['.$name.']');
+
+        if ($parent != null)
+        {
+          $value = $parent;
+        }
+      }
+      else
+      {
+        // parameter
+        $parent = $this->request->getParameterHolder()->get($parent);
+
+        if ($parent != null && isset($parent[$name]))
+        {
+          $value = $parent[$name];
+        }
+      }
+    }
+
+    // now for the dirty work
+    if (
+      ($data['is_file'] && !$value['name'])
+      ||
+      (!$data['is_file'] && (is_array($value) ? sfToolkit::isArrayValuesEmpty($value) : ($value == null || strlen($value) == 0)))
+    )
+    {
+      if ($data['required'] || $force)
+      {
+        // it's empty!
+        $error  = $data['required_msg'];
+        $retval = false;
+      }
+      else
+      {
+        // we don't have to validate it
+        $retval = true;
+      }
+    }
+    else
+    {
+      // time for the fun
+      $error = null;
+
+      // get group force status
+      if ($data['group'] != null)
+      {
+        // we set this because we do have a value for a parameter in this group
+        $data['group']['_force'] = true;
+      }
+
+      if (count($data['validators']) > 0)
+      {
+        // loop through our validators
+        foreach ($data['validators'] as $validator)
+        {
+          if (!$validator->execute($value, $error))
+          {
+            $retval = false;
+
+            break;
+          }
+        }
+      }
+    }
+
+    if (!$retval)
+    {
+      // set validation status
+      $data['validation_status'] = false;
+
+      // set the request error
+      $this->request->setError($errorName, $error);
+    }
+
+    return $retval;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/validator/sfValidatorManager.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/CallableStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/CallableStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/CallableStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,135 @@
+<?php
+/*
+ *  $Id: CallableStatement.php,v 1.7 2004/03/20 04:16:49 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/PreparedStatement.php';
+
+/**
+ * Interface for callable statements.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.7 $
+ * @package   creole
+ */
+interface CallableStatement extends PreparedStatement {
+                        
+    /**
+     * Register a parameter as an output param.
+     * @param string $paramIndex The stored procedure param name (e.g. @val1).
+     * @param int $sqlType The type of the parameter (e.g. Type::BIT)
+     * @param int $maxLength The maximum expected length (size) of output parameter.
+     */
+    public function registerOutParameter($paramIndex, $sqlType, $maxLength = null);
+    
+    /**
+     * 
+     * @param mixed $paramIndex Parameter name (e.g. "@var1").
+     * @return array
+     * @throws SQLException if $paramIndex was not bound as output variable.
+     */
+    public function getArray($paramIndex);
+    
+    /**
+     * 
+     * @param mixed $paramIndex Parameter name (e.g. "@var1").
+     * @return boolean
+     * @throws SQLException if $paramIndex was not bound as output variable.
+     */
+    public function getBoolean($paramIndex);    
+            
+    /**
+     * 
+     * @param mixed $paramIndex Parameter name (e.g. "@var1").
+     * @return Blob blob object
+     * @throws SQLException if $paramIndex was not bound as output variable.
+     */
+    public function getBlob($paramIndex);
+        
+    /**
+     * @param mixed $paramIndex Column name (string) or index (int).
+     * @return Clob clob object.
+     */
+    public function getClob($paramIndex);     
+    
+    /**
+     * Return a formatted date.
+     * 
+     * The default format for dates returned is preferred (in your locale, as specified using setlocale()) 
+     * format w/o time (i.e. strftime("%x", $val)).  Override this by specifying a format second parameter.  You
+     * can also specify a date()-style formatter; if you do, make sure there are no "%" symbols in your format string.
+     * 
+     * @param mixed $column Column name (string) or index (int) starting with 1 (if ResultSet::FETCHMODE_NUM was used).
+     * @param string $format Date formatter for use w/ strftime() or date() (it will choose based on examination of format string)
+     *                          If format is NULL, then the integer unix timestamp will be returned (no formatting performed).
+     * @return mixed  Formatted date, or integer unix timestamp (using 00:00:00 for time) if $format was null. 
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    public function getDate($column, $format = '%x');
+
+    /**
+     * @param mixed $paramIndex Column name (string) or index (int).
+     * @return float
+     */
+    public function getFloat($paramIndex);    
+
+    /**
+     * @param mixed $paramIndex Column name (string) or index (int).
+     * @return int
+     */
+    public function getInt($paramIndex);    
+
+    /**
+     * @param mixed $paramIndex Column name (string) or index (int).
+     * @return string
+     */
+    public function getString($paramIndex);        
+        
+    /**
+     * Return a formatted time.
+     * 
+     * The default format for times returned is preferred (in your locale, as specified using setlocale()) 
+     * format w/o date (i.e. strftime("%X", $val)).  Override this by specifying a format second parameter.  You
+     * can also specify a date()-style formatter; if you do, make sure there are no "%" symbols in your format string.
+     * 
+     * @param mixed $column Column name (string) or index (int) starting with 1 (if ResultSet::FETCHMODE_NUM was used).
+     * @param string $format Date formatter for use w/ strftime() or date() (it will choose based on examination of format string)
+     *                          If format is NULL, then the integer unix timestamp will be returned (no formatting performed).
+     * @return mixed  Formatted time, or integer unix timestamp (using today's date) if $format was null. 
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    public function getTime($column, $format = '%X');
+
+    /**
+     * Return a formatted timestamp.
+     * 
+     * The default format for timestamp is ISO standard YYYY-MM-DD HH:MM:SS (i.e. date('Y-m-d H:i:s', $val).
+     * Override this by specifying a format second parameter.  You can also specify a strftime()-style formatter.
+     * 
+     * Hint: if you want to get the unix timestamp use the "U" formatter string.
+     * 
+     * @param mixed $column Column name (string) or index (int) starting with 1 (if ResultSet::FETCHMODE_NUM was used).
+     * @param string $format Date formatter for use w/ strftime() or date() (it will choose based on examination of format string)
+     *                          If format is NULL, then the integer unix timestamp will be returned (no formatting performed).
+     * @return mixed Formatted timestamp, or integer unix timestamp (if $format was null)
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    public function getTimestamp($column, $format = 'Y-m-d H:i:s');
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/CallableStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/Connection.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/Connection.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/Connection.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,220 @@
+<?php
+/*
+ *  $Id: Connection.php,v 1.29 2005/10/17 19:03:50 dlawson_mi Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+include_once 'creole/ResultSet.php'; // we need this for the fetchmode ResultSet flags (constants) that are passed to executeQuery()
+
+/**
+ * Connection is an abstract base class for DB dialect implementations, and must be
+ * inherited by all such.
+ * 
+ * Developer notes:
+ *  (1) Make sure that your Connection class can be serialized.  See the ConnectionCommon __sleep() and __wakeup() implimentation.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.29 $
+ * @package   creole
+ */
+interface Connection {
+
+    // Constants that define transaction isolation levels.
+    // [We don't have any code using these yet, so there's no need
+    // to initialize these values at this point.]
+    // const TRANSACTION_NONE = 0;
+    // const TRANSACTION_READ_UNCOMMITTED = 1;
+    // const TRANSACTION_READ_COMMITTED = 2;
+    // const TRANSACTION_REPEATABLE_READ = 3;
+    // const TRANSACTION_SERIALIZABLE = 4;
+    
+    /**
+     * Connect to a database and log in as the specified user.
+     *
+     * @param array $dsn The PEAR-style data source hash.
+     * @param int $flags (optional) Flags for connection (e.g. Creole::PERSISTENT).  These flags
+     *                   may apply to any of the driver classes.
+     */
+    public function connect($dsn, $flags = false);    
+    
+    /**
+     * Get the PHP native resource for the database connection/link.
+     * @return resource
+     */
+    public function getResource();
+        
+    /**
+     * Get any flags that were passed to connection.
+     * @return int
+     */
+    public function getFlags();        
+    
+    /**
+     * Get the DSN array used by connect() method to connect to database.
+     * @see connect()
+     * @return array
+     */
+    public function getDSN();      
+    
+    /**
+     * Gets a DatabaseInfo class for the current database.
+     *
+     * This is not modeled on the JDBC MetaData class, but provides a possibly more 
+     * useful metadata system.  All the same, there may eventually be a getMetaData()
+     * which returns a class that behaves like JDBC's DatabaseMetaData.
+     *
+     * @return DatabaseInfo
+     */
+    public function getDatabaseInfo();
+    
+    /**
+     * Loads and returns an IdGenerator object for current RDBMS.
+     * @return IdGenerator
+     */
+    public function getIdGenerator();
+    
+    /**
+     * Prepares a query for multiple execution with execute().
+     *
+     * With some database backends, this is emulated.
+     * prepare() requires a generic query as string like
+     * "INSERT INTO numbers VALUES(?,?,?)". The ? are placeholders.
+        * 
+     * IMPORTANT:  All occurrences of the placeholder (?) will be assumed
+     * to be a parameter.  Therefore be sure not to have ? anywhere else in
+     * the query.
+     * 
+     * So, ... DO NOT MIX WILDCARDS WITH ALREADY-PREPARED QUERIES
+     *
+     * INCORRECT:
+     *     SELECT * FROM mytable WHERE id = ? AND title = 'Where are you?' and body LIKE ?
+     * 
+     * CORRECT:
+     *    SELECT * FROM mytable WHERE id = ? AND title = ? and body LIKE ?
+     * 
+     * @param string $sql The query to prepare.
+     * @return PreparedStatement
+     * @throws SQLException
+     * @see PreparedStatement::execute()
+     */
+    public function prepareStatement($sql);
+    
+    /**
+     * Creates a new empty Statement.
+     * @return Statement
+     */
+    public function createStatement();
+    
+    /**
+     * If RDBMS supports native LIMIT/OFFSET then query SQL is modified
+     * so that no emulation is performed in ResultSet.
+     * 
+     * @param string &$sql The query that will be modified.
+     * @param int $offset
+     * @param int $limit
+     * @return void
+     * @throws SQLException - if unable to modify query for any reason.
+     */
+    public function applyLimit(&$sql, $offset, $limit);
+    
+    /**
+     * Executes the SQL query in this PreparedStatement object and returns the resultset.
+     * 
+     * @param string $sql The SQL statement.
+     * @param int $fetchmode
+     * @return object ResultSet
+     * @throws SQLException if a database access error occurs.
+     */
+    public function executeQuery($sql, $fetchmode = null);
+
+    /**
+     * Executes the SQL INSERT, UPDATE, or DELETE statement.
+     * 
+     * @param string $sql This method may optionally be called with the SQL statement.
+     * @return int Number of affected rows (or 0 for drivers that return nothing).
+     * @throws SQLException if a database access error occurs.
+     */
+    public function executeUpdate($sql);
+    
+    /**
+     * Creates a CallableStatement object for calling database stored procedures.
+     * 
+     * @param string $sql
+     * @return CallableStatement
+     */
+    public function prepareCall($sql);
+    
+    /**
+     * Free the db resources.
+     * @return void
+     */
+    public function close();
+    
+    /**
+     * Returns false if connection is closed.
+     * @return boolean
+     */
+    public function isConnected();
+    
+    /**
+     * Get auto-commit status.
+     *
+     * @return boolean
+     */
+    public function getAutoCommit();
+    
+    /**
+     * Enable/disable automatic commits.
+     * 
+     * Pushes SQLWarning onto $warnings stack if the autocommit value is being changed mid-transaction. This function
+     * is overridden by driver classes so that they can perform the necessary begin/end transaction SQL.
+     * 
+     * If auto-commit is being set to TRUE, then the current transaction will be committed immediately.
+     * 
+     * @param boolean $bit New value for auto commit.
+     * @return void
+     */
+    public function setAutoCommit($bit);
+    
+    /**
+     * Begins a transaction (if supported).
+     *
+     */
+    public function begin();
+    
+    /**
+     * Commits statements in a transaction.
+     *
+     */
+    public function commit();
+    
+    /**
+     * Rollback changes in a transaction.
+     *
+     */
+    public function rollback();
+    
+    /**
+     * Gets the number of rows affected by the data manipulation
+     * query.
+     *
+     * @return int Number of rows affected by the last query.
+     */
+    public function getUpdateCount();
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/Connection.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/Creole.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/Creole.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/Creole.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,377 @@
+<?php
+/*
+ *  $Id: Creole.php,v 1.14 2006/01/17 20:06:31 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+include_once 'creole/SQLException.php';
+include_once 'creole/Connection.php';
+
+// static:
+// track errors is used by drivers to get better error messages
+// make sure it's set.
+
+ en ini_set('track_errors', true);
+
+/**
+ * This is the class that manages the database drivers.
+ *
+ * There are a number of default drivers (at the time of writing this comment: MySQL, MSSQL, SQLite, PgSQL, Oracle)
+ * that are "shipped" with Creole.  You may wish to either add a new driver or swap out one of the existing drivers
+ * for your own custom driver.  To do this you simply need to register your driver using the registerDriver() method.
+ *
+ * Note that you register your Connection class because the Connection class is responsible for calling the other
+ * driver classes (e.g. ResultSet, PreparedStatement, etc.).
+ *
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.14 $
+ * @package   creole
+ */
+class Creole {
+
+    /**
+     * Constant that indicates a connection object should be used.
+     */
+    const PERSISTENT = 1;
+
+    /**
+     * Flag to pass to the connection to indicate that no case conversions
+     * should be performed by ResultSet on keys of fetched rows.
+	 * @deprecated use COMPAT_ASSOC_LOWER
+     */
+    const NO_ASSOC_LOWER = 16;
+	
+    /**
+     * Flag to pass to the connection to indicate that a to-lower case conversion
+     * should be performed by ResultSet on keys of fetched rows.
+     */
+	const COMPAT_ASSOC_LOWER = 32;
+
+    /**
+     * Flag to pass to the connection to indicate that an rtrim() should be performed
+	 * on strings (using ResultSet->getString(), etc.).
+     */
+	const COMPAT_RTRIM_STRING = 64;
+	
+	/**
+	 * Flag to indicate that all compatibility flags should be set.
+	 */
+	const COMPAT_ALL = 96;
+	
+    /**
+     * Map of built-in drivers.
+     * Change or add your own using registerDriver()
+     * @see registerDriver()
+     * @var array Hash mapping phptype => driver class (in dot-path notation, e.g. 'mysql' => 'creole.drivers.mysql.MySQLConnection').
+     */
+    private static $driverMap = array(  'mysql' => 'creole.drivers.mysql.MySQLConnection',
+                                        'mysqli' => 'creole.drivers.mysqli.MySQLiConnection',
+                                        'pgsql' => 'creole.drivers.pgsql.PgSQLConnection',
+                                        'sqlite' => 'creole.drivers.sqlite.SQLiteConnection',
+                                        'oracle' => 'creole.drivers.oracle.OCI8Connection',
+                                        'mssql' => 'creole.drivers.mssql.MSSQLConnection',
+                                        'odbc' => 'creole.drivers.odbc.ODBCConnection'
+                                       );
+
+    /**
+     * Map of already established connections
+     * @see getConnection()
+     * @var array Hash mapping connection DSN => Connection instance
+     */
+    private static $connectionMap = array();
+
+    /**
+     * Register your own RDBMS driver class.
+     *
+     * You can use this to specify your own class that replaces a default driver or
+     * adds support for a new driver.  Register your own class by specifying the
+     * 'phptype' (e.g. mysql) and a dot-path notation to where your Connection class is
+     * relative to any location on the include path.  You can also specify '*' as the phptype
+     * if you want to register a driver that will handle any native type (e.g. if creating
+     * a set of decorator classes that log SQL before calling native driver methods).  YOU CAN
+     * ONLY REGISTER ONE CATCHALL ('*') DRIVER.
+     * <p>
+     * Note: the class you need to register is your Connection class because this is the
+     * class that's responsible for instantiating the other classes that are part of your
+     * driver.  It is possible to mix & match drivers -- i.e. to write a custom driver where
+     * the Connection object just instantiates stock classes for ResultSet and PreparedStatement.
+     * Note that if you wanted to "override" only the ResultSet class you would also have to override
+     * the Connection and PreparedStatement classes so that they would return the correct ResultSet
+     * class.  In the future we may implement a more "packaged" approach to drivers; for now we
+     * want to keep it simple.
+     *
+     * @param string $phptype   The phptype (mysql, mssql, etc.). This is first part of DSN URL (e.g. mysql://localhost/...).
+     *                          You may also specify '*' to register a driver that will "wrap" the any native drivers.
+     * @param string $dotpath   A dot-path locating your class.  For example 'creole.drivers.mssql.MSSQLConnection'
+     *                          will be included like: include 'creole/drivers/mssql/MSSQLConnection.php' and the
+     *                          classname will be assumed to be 'MSSQLConnection'.
+     * @return void
+     */
+    public static function registerDriver($phptype, $dotpath)
+    {
+        self::$driverMap[$phptype] = $dotpath;
+    }
+
+    /**
+     * Removes the driver for a PHP type.  Note that this will remove user-registered
+     * drivers _and_ the default drivers.
+     * @param string $phptype The PHP type for driver to de-register.
+     * @see registerDriver()
+     */
+    public static function deregisterDriver($phptype)
+    {
+        unset(self::$driverMap[$phptype]);
+    }
+
+    /**
+     * Returns the class path to the driver registered for specified type.
+     * @param string $phptype The phptype handled by driver (e.g. 'mysql', 'mssql', '*').
+     * @return string The driver class in dot-path notation (e.g. creole.drivers.mssql.MSSQLConnection)
+     *                  or NULL if no registered driver found.
+     */
+    public static function getDriver($phptype)
+    {
+        if (isset(self::$driverMap[$phptype])) {
+            return self::$driverMap[$phptype];
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Create a new DB connection object and connect to the specified
+     * database
+     *
+     * @param mixed $dsn "data source name", see the self::parseDSN
+     * method for a description of the dsn format.  Can also be
+     * specified as an array of the format returned by DB::parseDSN().
+
+     * @param int $flags Connection flags (e.g. PERSISTENT).
+     *
+     * @return Connection Newly created DB connection object
+     * @throws SQLException
+     * @see self::parseDSN()
+     */
+    public static function getConnection($dsn, $flags = 0)
+    {
+        if (is_array($dsn)) {
+            $dsninfo = $dsn;
+        } else {
+            $dsninfo = self::parseDSN($dsn);
+        }
+		
+		// gather any flags from the DSN
+		if ( isset ( $dsninfo['persistent'] ) && ! empty ( $dsninfo['persistent'] ) )
+			$flags |= Creole::PERSISTENT;
+		if ( isset ( $dsninfo['compat_assoc_lower'] ) && ! empty ( $dsninfo['compat_assoc_lower'] ) )
+			$flags |= Creole::COMPAT_ASSOC_LOWER;
+		if ( isset ( $dsninfo['compat_rtrim_string'] ) && ! empty ( $dsninfo['compat_rtrim_string'] ) )
+			$flags |= Creole::COMPAT_RTRIM_STRING;
+		if ( isset ( $dsninfo['compat_all'] ) && ! empty ( $dsninfo['compat_all'] ) )
+			$flags |= Creole::COMPAT_ALL;
+		
+		if ($flags & Creole::NO_ASSOC_LOWER) {
+			trigger_error("The Creole::NO_ASSOC_LOWER flag has been deprecated, and is now the default behavior. Use Creole::COMPAT_ASSOC_LOWER to lowercase resulset keys.", E_USER_WARNING);
+		}
+
+        // sort $dsninfo by keys so the serialized result is always the same
+        // for identical connection parameters, no matter what their order is
+        ksort($dsninfo);
+        $connectionMapKey = crc32(serialize($dsninfo + array('compat_flags' => ($flags & Creole::COMPAT_ALL))));
+
+        // see if we already have a connection with these parameters cached
+        if(isset(self::$connectionMap[$connectionMapKey]))
+        {
+            // persistent connections will be used if a non-persistent one was requested and is available
+            // but a persistent connection will be created if a non-persistent one is present
+
+	    // TODO: impliment auto close of non persistent and replacing the
+	    // non persistent with the persistent object so as we dont have
+	    // both links open for no reason
+
+            if( isset(self::$connectionMap[$connectionMapKey][1]) ) { // is persistent
+                // a persistent connection with these parameters is already there,
+                // so we return it, no matter what was specified as persistent flag
+                $con = self::$connectionMap[$connectionMapKey][1];
+            } else {
+                // we don't have a persistent connection, and since the persistent
+                // flag wasn't set either, we just return the non-persistent connection
+                $con = self::$connectionMap[$connectionMapKey][0];
+            }
+
+            // if we're here, a non-persistent connection was already there, but
+            // the user wants a persistent one, so it will be created
+            
+            if ($con->isConnected())
+                return $con;            
+        }
+
+        // support "catchall" drivers which will themselves handle the details of connecting
+        // using the proper RDBMS driver.
+        if (isset(self::$driverMap['*'])) {
+            $type = '*';
+        } else {
+            $type = $dsninfo['phptype'];
+            if (!isset(self::$driverMap[$type])) {
+                throw new SQLException("No driver has been registered to handle connection type: $type");
+            }
+        }
+
+        // may need to make this more complex if we add support
+        // for 'dbsyntax'
+        $clazz = self::import(self::$driverMap[$type]);
+        $obj = new $clazz();
+
+        if (!($obj instanceof Connection)) {
+            throw new SQLException("Class does not implement creole.Connection interface: $clazz");
+        }
+
+        try {
+            $obj->connect($dsninfo, $flags);
+        } catch(SQLException $sqle) {
+            $sqle->setUserInfo($dsninfo);
+            throw $sqle;
+        }
+		$persistent = ($flags & Creole::PERSISTENT) === Creole::PERSISTENT;
+        return self::$connectionMap[$connectionMapKey][(int)$persistent] = $obj;
+    }
+
+    /**
+     * Parse a data source name.
+     *
+     * This isn't quite as powerful as DB::parseDSN(); it's also a lot simpler, a lot faster,
+     * and many fewer lines of code.
+     *
+     * A array with the following keys will be returned:
+     *  phptype: Database backend used in PHP (mysql, odbc etc.)
+     *  protocol: Communication protocol to use (tcp, unix etc.)
+     *  hostspec: Host specification (hostname[:port])
+     *  database: Database to use on the DBMS server
+     *  username: User name for login
+     *  password: Password for login
+     *
+     * The format of the supplied DSN is in its fullest form:
+     *
+     *  phptype://username:password@protocol+hostspec/database
+     *
+     * Most variations are allowed:
+     *
+     *  phptype://username:password@protocol+hostspec:110//usr/db_file.db
+     *  phptype://username:password@hostspec/database_name
+     *  phptype://username:password@hostspec
+     *  phptype://username@hostspec
+     *  phptype://hostspec/database
+     *  phptype://hostspec
+     *  phptype
+     *
+     * @param string $dsn Data Source Name to be parsed
+     * @return array An associative array
+     */
+    public static function parseDSN($dsn)
+    {
+        if (is_array($dsn)) {
+            return $dsn;
+        }
+
+        $parsed = array(
+            'phptype'  => null,
+            'username' => null,
+            'password' => null,
+            'protocol' => null,
+            'hostspec' => null,
+            'port'     => null,
+            'socket'   => null,
+            'database' => null
+        );
+
+        $info = parse_url($dsn);
+
+        if (count($info) === 1) { // if there's only one element in result, then it must be the phptype
+            $parsed['phptype'] = array_pop($info);
+            return $parsed;
+        }
+
+        // some values can be copied directly
+        $parsed['phptype'] = @$info['scheme'];
+        $parsed['username'] = @$info['user'];
+        $parsed['password'] = @$info['pass'];
+        $parsed['port'] = @$info['port'];
+
+        $host = @$info['host'];
+        if (false !== ($pluspos = strpos($host, '+'))) {
+            $parsed['protocol'] = substr($host,0,$pluspos);
+            if ($parsed['protocol'] === 'unix') {
+                $parsed['socket'] = substr($host,$pluspos+1);
+            } else {
+                $parsed['hostspec'] = substr($host,$pluspos+1);
+            }
+        } else {
+            $parsed['hostspec'] = $host;
+        }
+
+        if (isset($info['path'])) {
+            $parsed['database'] = substr($info['path'], 1); // remove first char, which is '/'
+        }
+
+        if (isset($info['query'])) {
+                $opts = explode('&', $info['query']);
+                foreach ($opts as $opt) {
+                    list($key, $value) = explode('=', $opt);
+                    if (!isset($parsed[$key])) { // don't allow params overwrite
+                        $parsed[$key] = urldecode($value);
+                    }
+                }
+        }
+
+        return $parsed;
+    }
+
+    /**
+     * Include once a file specified in DOT notation.
+     * Package notation is expected to be relative to a location
+     * on the PHP include_path.
+     * @param string $class
+     * @return string unqualified classname
+     * @throws SQLException - if class does not exist and cannot load file
+     *                      - if after loading file class still does not exist
+     */
+    public static function import($class) {
+        $pos = strrpos($class, '.');
+        // get just classname ('path.to.ClassName' -> 'ClassName')
+        if ($pos !== false) {
+            $classname = substr($class, $pos + 1);
+        }
+        else
+        {
+          $classname = $class;
+        }
+        if (!class_exists($classname, false)) {
+            $path = strtr($class, '.', DIRECTORY_SEPARATOR) . '.php';
+            $ret = include_once($path);
+            if ($ret === false) {
+                throw new SQLException("Unable to load driver class: " . $class);
+            }
+            if (!class_exists($classname)) {
+                throw new SQLException("Unable to find loaded class: $classname (Hint: make sure classname matches filename)");
+            }
+        }
+        return $classname;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/Creole.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/CreoleTypes.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/CreoleTypes.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/CreoleTypes.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,187 @@
+<?php
+/*
+ *  $Id: CreoleTypes.php,v 1.18 2005/11/07 22:38:52 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * Generic Creole types modeled on JDBC types.
+ * 
+ * @author    David Giffin <david en giffin.org>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.18 $
+ * @package   creole
+ */
+abstract class CreoleTypes {
+
+        const BOOLEAN = 1;
+        const BIGINT = 2;
+        const SMALLINT = 3;
+        const TINYINT = 4;
+        const INTEGER = 5;
+        const CHAR = 6;
+        const VARCHAR = 7;
+        const TEXT = 17;
+        const FLOAT = 8;
+        const DOUBLE = 9;
+        const DATE = 10;
+        const TIME = 11;
+        const TIMESTAMP = 12;
+        const VARBINARY = 13;
+        const NUMERIC = 14;
+        const BLOB = 15;
+        const CLOB = 16;
+        const LONGVARCHAR = 17;
+        const DECIMAL = 18;
+        const REAL = 19;
+        const BINARY = 20;
+        const LONGVARBINARY = 21;
+        const YEAR = 22;
+        
+        /** this is "ARRAY" from JDBC types */
+        const ARR = 23;
+        
+        const OTHER = -1;
+        
+        /** Map of Creole type integers to the setter/getter affix. */
+        protected static $affixMap = array(
+                self::BOOLEAN => 'Boolean',
+                self::BIGINT => 'String',
+                self::CHAR => 'String',
+                self::DATE => 'Date',
+                self::DOUBLE => 'Float',
+                self::FLOAT => 'Float',
+                self::INTEGER => 'Int',
+                self::SMALLINT => 'Int',
+                self::TINYINT => 'Int',
+                self::TIME => 'Time',
+                self::TIMESTAMP => 'Timestamp',
+                self::VARCHAR => 'String',                
+                self::VARBINARY => 'Blob',
+                self::NUMERIC => 'Float',
+                self::BLOB => 'Blob',
+                self::CLOB => 'Clob',
+                self::LONGVARCHAR => 'String',
+                self::DECIMAL => 'Float',
+                self::REAL => 'Float',
+                self::BINARY => 'Blob',
+                self::LONGVARBINARY => 'Blob',
+                self::YEAR => 'Int',
+                self::ARR => 'Array',
+                self::OTHER => '', // get() and set() for unknown
+                );
+        
+        /** Map of Creole type integers to their textual name. */
+        protected static $creoleTypeMap = array(
+                self::BOOLEAN => 'BOOLEAN',
+                self::BIGINT => 'BIGINT',
+                self::SMALLINT => 'SMALLINT',
+                self::TINYINT => 'TINYINT',
+                self::INTEGER => 'INTEGER',
+                self::NUMERIC => 'NUMERIC',
+                self::DECIMAL => 'DECIMAL',
+                self::REAL => 'REAL',
+                self::FLOAT => 'FLOAT',
+                self::DOUBLE => 'DOUBLE',
+                self::CHAR => 'CHAR',
+                self::VARCHAR => 'VARCHAR',
+                self::TEXT => 'TEXT',
+                self::TIME => 'TIME',
+                self::TIMESTAMP => 'TIMESTAMP',
+                self::DATE => 'DATE',
+                self::YEAR => 'YEAR',
+                self::VARBINARY => 'VARBINARY',                
+                self::BLOB => 'BLOB',
+                self::CLOB => 'CLOB',
+                self::LONGVARCHAR => 'LONGVARCHAR',
+                self::BINARY => 'BINARY',
+                self::LONGVARBINARY => 'LONGVARBINARY',                
+                self::ARR => 'ARR',
+                self::OTHER => 'OTHER', // string is "raw" return
+                );
+        
+        /**
+         * This method returns the generic Creole (JDBC-like) type
+         * when given the native db type.
+         * @param string $nativeType DB native type (e.g. 'TEXT', 'byetea', etc.).
+         * @return int Creole native type (e.g. Types::LONGVARCHAR, Types::BINARY, etc.).
+         */
+        public static function getType($nativeType) {
+        	throw new Exception('This method must be overridden in subclasses!'); // abstract static not allowed since PHP 5.2
+        }
+        
+        /**
+         * This method will return a native type that corresponds to the specified
+         * Creole (JDBC-like) type.
+         * If there is more than one matching native type, then the LAST defined 
+         * native type will be returned.
+         * @return string Native type string.
+         */
+        public static function getNativeType($creoleType) {
+        	 throw new Exception('This method must be overridden in subclasses!'); // abstract static not allowed since PHP 5.2
+        }
+        
+        /**
+         * Gets the "affix" to use for ResultSet::get*() and PreparedStatement::set*() methods.
+         * <code>
+         * $setter = 'set' . CreoleTypes::getAffix(CreoleTypes::INTEGER);
+         * $stmt->$setter(1, $intval);
+         * // or
+         * $getter = 'get' . CreoleTypes::getAffix(CreoleTypes::TIMESTAMP);
+         * $timestamp = $rs->$getter();
+         * </code>
+         * @param int $creoleType The Creole types.
+         * @return string The default affix for getting/setting cols of this type.
+         * @throws SQLException if $creoleType does not correspond to an affix
+         */
+        public static function getAffix($creoleType)
+        {
+            if (!isset(self::$affixMap[$creoleType])) {
+                $e = new SQLException("Unable to return 'affix' for unknown CreoleType: " . $creoleType);
+                throw $e;
+            }
+            return self::$affixMap[$creoleType];
+        }
+        
+        /**
+         * Given the integer type, this method will return the corresponding type name.
+         * @param int $creoleType the integer Creole type.
+         * @return string The name of the Creole type (e.g. 'VARCHAR').
+         */
+        public static function getCreoleName($creoleType)
+        {
+            if (!isset(self::$creoleTypeMap[$creoleType])) {
+                return null;
+            }
+            return self::$creoleTypeMap[$creoleType];
+        }
+        
+        /**
+         * Given the name of a type (e.g. 'VARCHAR') this method will return the corresponding integer.
+         * @param string $creoleTypeName The case-sensisive (must be uppercase) name of the Creole type (e.g. 'VARCHAR').
+         * @return int the Creole type.
+         */
+        public static function getCreoleCode($creoleTypeName)
+        {
+            $type = array_search($creoleTypeName, self::$creoleTypeMap);
+            if ($type === false) {
+               return null;
+            }
+            return $type;
+        }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/CreoleTypes.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/IdGenerator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/IdGenerator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/IdGenerator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * Interface for classes that provide functionality to get SEQUENCE or AUTO-INCREMENT ids from the database.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.3 $
+ * @package   creole
+ */
+interface IdGenerator {
+    
+    /** SEQUENCE id generator type */
+    const SEQUENCE = 1;
+    
+    /** AUTO INCREMENT id generator type */
+    const AUTOINCREMENT = 2;                
+    
+    /**
+     * Convenience method that returns TRUE if id is generated
+     * before an INSERT statement.  This is the same as checking
+     * whether the generator type is SEQUENCE.
+     * @return boolean TRUE if gen id method is SEQUENCE
+     * @see getIdMethod()
+     */
+    public function isBeforeInsert();
+    
+    /**
+     * Convenience method that returns TRUE if id is generated
+     * after an INSERT statement.  This is the same as checking
+     * whether the generator type is AUTOINCREMENT.
+     * @return boolean TRUE if gen id method is AUTOINCREMENT
+     * @see getIdMethod()
+     */
+    public function isAfterInsert();
+    
+    /**
+     * Get the preferred type / style for generating ids for RDBMS.
+     * @return int SEQUENCE or AUTOINCREMENT
+     */
+    public function getIdMethod();
+    
+    /**
+     * Get the autoincrement or sequence id given the current connection
+     * and any additional needed info (e.g. sequence name for sequences).
+     * <p>
+     * Note: if you take advantage of the fact that $keyInfo may not be specified
+     * you should make sure that your code is setup in such a way that it will
+     * be portable if you change from an RDBMS that uses AUTOINCREMENT to one that
+     * uses SEQUENCE (i.e. in which case you would need to specify sequence name).
+     * 
+     * @param mixed $keyInfo Any additional information (e.g. sequence name) needed to fetch the id.
+     * @return int The last id / next id.
+     */
+    public function getId($keyInfo = null);
+    
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/IdGenerator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/PreparedStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/PreparedStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/PreparedStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,253 @@
+<?php
+/*
+ *  $Id: PreparedStatement.php,v 1.21 2005/03/29 16:56:09 gamr Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * Interface for a pre-compiled SQL statement.
+ * 
+ * Many drivers do not take advantage of pre-compiling SQL statements; for these
+ * cases the precompilation is emulated.  This emulation comes with slight penalty involved
+ * in parsing the queries, but provides other benefits such as a cleaner object model and ability
+ * to work with BLOB and CLOB values w/o needing special LOB-specific routines.
+ * 
+ * This class is abstract because there are driver-specific implementations in [clearly] how queries
+ * are executed, and how parameters are bound.
+ * 
+ * This class is not as abstract as the JDBC version.  For exmple, if you are using a driver
+ * that uses name-based query param substitution, then you'd better bind your variables to
+ * names rather than index numbers.  e.g. in Oracle
+ * <code>
+ *            $stmt = $conn->prepareStatement("INSERT INTO users (name, passwd) VALUES (:name, :pass)");
+ *            $stmt->setString(":name", $name);
+ *            $stmt->executeUpdate();            
+ * </code>
+ * 
+ * Developer note:  In many ways this interface is an extension of the Statement interface.  However, due 
+ * to limitations in PHP5's interface extension model (specifically that you cannot change signatures on
+ * methods defined in parent interface), we cannot extend the Statement interface.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.21 $
+ * @package   creole
+ */
+interface PreparedStatement {
+     
+    /**
+     * Gets the db Connection that created this statement.
+     * @return Connection
+     */
+    public function getConnection();    
+
+    /**
+     * Get the PHP native resource for the statement (if supported).
+     * @return resource
+     */
+    public function getResource();
+        
+    /**
+     * Free resources associated with this statement.
+     * Some drivers will need to implement this method to free
+     * database result resources. 
+     * 
+     * @return void
+     */
+    public function close();
+    
+    /**
+     * Get result set.
+     * This assumes that the last thing done was an executeQuery() or an execute()
+     * with SELECT-type query.
+     *
+     * @return RestultSet Last ResultSet or <code>null</code> if not applicable.
+     */
+    public function getResultSet();
+    
+    /**
+     * Gets next result set (if this behavior is supported by driver).
+     * Some drivers (e.g. MSSQL) support returning multiple result sets -- e.g.
+     * from stored procedures.
+     *
+     * This function also closes any current restult set.
+     *
+     * Default behavior is for this function to return false.  Driver-specific
+     * implementations of this class can override this method if they actually
+     * support multiple result sets.
+     * 
+     * @return boolean True if there is another result set, otherwise false.
+     */
+    public function getMoreResults();
+    
+    /**
+     * Get update count.
+     *
+     * @return int Number of records affected, or <code>null</code> if not applicable.
+     */
+    public function getUpdateCount();
+
+    /**
+     * Sets the maximum number of rows to return from db.
+     * This will affect the SQL if the RDBMS supports native LIMIT; if not,
+     * it will be emulated.  Limit only applies to queries (not update sql).
+     * @param int $v Maximum number of rows or 0 for all rows.
+     * @return void
+     */
+    public function setLimit($v);
+    
+    /**
+     * Returns the maximum number of rows to return or 0 for all.
+     * @return int
+     */
+    public function getLimit();
+    
+    /**
+     * Sets the start row.
+     * This will affect the SQL if the RDBMS supports native OFFSET; if not,
+     * it will be emulated. Offset only applies to queries (not update) and 
+     * only is evaluated when LIMIT is set!
+     * @param int $v
+     * @return void
+     */ 
+    public function setOffset($v);
+    
+    /**
+     * Returns the start row.
+     * Offset only applies when Limit is set!
+     * @return int
+     */
+    public function getOffset();
+    
+    /**
+     * Executes the SQL query in this PreparedStatement object and returns the resultset generated by the query.
+     * We support two signatures for this method:
+     * - $stmt->executeQuery(ResultSet::FETCHMODE_NUM);
+     * - $stmt->executeQuery(array($param1, $param2), ResultSet::FETCHMODE_NUM);
+     * @param mixed $p1 Either (array) Parameters that will be set using PreparedStatement::set() before query is executed or (int) fetchmode.
+     * @param int $fetchmode The mode to use when fetching the results (e.g. ResultSet::FETCHMODE_NUM, ResultSet::FETCHMODE_ASSOC).
+     * @return ResultSet
+     * @throws SQLException if a database access error occurs.
+     */
+    public function executeQuery();
+    
+    /**
+     * Executes the SQL INSERT, UPDATE, or DELETE statement in this PreparedStatement object.
+     * 
+     * @param array $params Parameters that will be set using PreparedStatement::set() before query is executed.
+     * @return int Number of affected rows (or 0 for drivers that return nothing).
+     * @throws SQLException if a database access error occurs.
+     */
+    public function executeUpdate($params = null);
+
+    /**
+     * A generic set method.
+     * 
+     * You can use this if you don't want to concern yourself with the details.  It involves
+     * slightly more overhead than the specific settesr, since it grabs the PHP type to determine
+     * which method makes most sense.
+     * 
+     * @param int $paramIndex
+     * @param mixed $value
+     * @return void
+     * @throws SQLException
+     */
+    public function set($paramIndex, $value);
+    
+    /**
+     * Sets an array.
+     * Unless a driver-specific method is used, this means simply serializing
+     * the passed parameter and storing it as a string.
+     * @param int $paramIndex
+     * @param array $value
+     * @return void
+     */
+    public function setArray($paramIndex, $value);
+
+    /**
+     * Sets a boolean value.
+     * Default behavior is true = 1, false = 0.
+     * @param int $paramIndex
+     * @param boolean $value
+     * @return void
+     */
+    public function setBoolean($paramIndex, $value);
+    
+
+    /**
+     * @param int $paramIndex
+     * @param mixed $blob Blob object or string containing data.
+     * @return void
+     */
+    public function setBlob($paramIndex, $blob);
+
+    /**
+     * @param int $paramIndex
+     * @param mixed $clob Clob object  or string containing data.
+     * @return void
+     */
+    public function setClob($paramIndex, $clob);
+
+    /**
+     * @param int $paramIndex
+     * @param string $value
+     * @return void
+     */
+    public function setDate($paramIndex, $value);
+        
+    /**
+     * @param int $paramIndex
+     * @param float $value
+     * @return void
+     */
+    public function setFloat($paramIndex, $value);
+
+    /**
+     * @param int $paramIndex
+     * @param int $value
+     * @return void
+     */
+    public function setInt($paramIndex, $value);
+
+    /**
+     * @param int $paramIndex
+     * @return void
+     */
+    public function setNull($paramIndex);
+
+    /**
+     * @param int $paramIndex
+     * @param string $value
+     * @return void
+     */
+    public function setString($paramIndex, $value);
+    
+    /**
+     * @param int $paramIndex
+     * @param string $value
+     * @return void
+     */
+    public function setTime($paramIndex, $value);
+    
+    /**
+     * @param int $paramIndex
+     * @param string $value
+     * @return void
+     */
+    public function setTimestamp($paramIndex, $value);
+            
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/PreparedStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/ResultSet.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/ResultSet.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/ResultSet.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,380 @@
+<?php
+/*
+ *  $Id: ResultSet.php,v 1.28 2006/01/17 19:44:38 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * This is the interface for classes the wrap db results.
+ * 
+ * The get*() methods in this interface will format values before returning them. Note
+ * that if they will return null if the database returned NULL.  If the requested column does
+ * not exist than an exception (SQLException) will be thrown.
+ * 
+ * <code>
+ * $rs = $conn->executeQuery("SELECT MAX(stamp) FROM event", ResultSet::FETCHMODE_NUM);
+ * $rs->next();
+ * 
+ * $max_stamp = $rs->getTimestamp(1, "d/m/Y H:i:s");
+ * // $max_stamp will be date string or null if no MAX(stamp) was found
+ * 
+ * $max_stamp = $rs->getTimestamp("max(stamp)", "d/m/Y H:i:s");
+ * // will THROW EXCEPTION, because the resultset was fetched using numeric indexing
+ * // SQLException: Invalid resultset column: max(stamp)
+ * </code>
+ * 
+ * This class implements SPL IteratorAggregate, so you may iterate over the database results
+ * using foreach():
+ * <code>
+ * foreach($rs as $row) {
+ *   print_r($row); // row is assoc array returned by getRow()
+ * }
+ * </code>
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.28 $
+ * @package   creole
+ */
+interface ResultSet extends IteratorAggregate {
+        
+    /**
+     * Index result set by field name.
+     */
+    const FETCHMODE_ASSOC = 1;
+
+    /**
+     * Index result set numerically.
+     */
+    const FETCHMODE_NUM = 2;
+    
+    /**
+     * Get the PHP native resource for the result.
+     * Arguably this should not be part of the interface: i.e. every driver should implement
+     * it if they have a result resource, but conceivably drivers could be created that do
+     * not.  For now every single driver does have a "dblink" resource property, and other
+     * classes (e.g. ResultSet) need this info in order to get correct native errors.  We'll
+     * leave it in for now, as it helps with driver development, with the caveat that it 
+     * could be removed from the interface at a later point.
+     * @return resource Query result or NULL if not not applicable.
+     */
+    public function getResource();
+        
+    /**
+     * Sets the fetchmode used to retrieve results.
+     * Changing fetchmodes mid-result retrieval is supported (haven't encountered any drivers 
+     * that don't support that yet).
+     * @param int $mode ResultSet::FETCHMODE_NUM or  ResultSet::FETCHMODE_ASSOC (default).
+     * @return void
+     */
+    public function setFetchmode($mode);
+    
+    /**
+     * Gets the fetchmode used to retrieve results.
+     * @return int ResultSet::FETCHMODE_NUM or ResultSet::FETCHMODE_ASSOC (default).
+     */
+    public function getFetchmode();       
+    
+    /**
+     * Whether assoc result keys get converted to lowercase for compatibility.
+     * 
+     * This defaults to FALSE unless Creole::COMPAT_ASSOC_LOWER flag has been passed to connection.
+     * This property is read-only since it must be set when connection is created.  The
+     * reason for this behavior is some drivers (e.g. SQLite) do the case conversions internally
+     * based on a PHP ini value; it would not be possible to change the behavior from the ResultSet
+     * (since query has already been executed).
+	 * 
+     * @return boolean
+     */
+    public function isLowerAssocCase();
+        
+    /**
+     * Moves the internal cursor to the next position and fetches the row at that position.
+     * 
+     * @return boolean <tt>true</tt> if success, <tt>false</tt> if no next record.
+     * @throws SQLException on any driver-level errors.
+     */
+    public function next();
+
+    /**
+     * Moves the internal cursor to the previous position and fetches the
+     * row at that position.
+     * 
+     * @return boolean <tt>true</tt> if success, <tt>false</tt> if no previous record.
+     * @throws SQLException - if unable to move to previous position
+     *                      - if ResultSet doesn't support reverse scrolling
+     */
+    public function previous();
+
+    /**
+     * Moves the cursor a relative number of rows, either positive or negative and fetches
+     * the row at that position.
+     * 
+     * Attempting to move beyond the first/last row in the result set positions the cursor before/after 
+     * the first/last row and issues a Warning. Calling relative(0) is valid, but does not change the cursor 
+     * position. 
+     * 
+     * @param integer $offset
+     * @return boolean <tt>true</tt> if cursor is on a row, <tt>false</tt> otherwise.
+     * @throws SQLException - if unable to move to relative position
+     *                      - if rel pos is negative & ResultSet doesn't support reverse scrolling
+     */
+    public function relative($offset);
+
+
+    /**
+     * Moves the cursor to an absolute cursor position and fetches the row at that position.
+     * 
+     * Attempting to move beyond the first/last row in the result set positions the cursor before/after 
+     * the first/last row and issues a Warning.
+     * 
+     * @param integer $pos cursor position, first position is 1.
+     * @return boolean <tt>true</tt> if cursor is on a row, <tt>false</tt> otherwise.
+     * @throws SQLException - if unable to move to absolute position
+     *                      - if position is before current pos & ResultSet doesn't support reverse scrolling
+     */
+    public function absolute($pos);
+
+    /**
+     * Moves cursor position WITHOUT FETCHING ROW AT THAT POSITION.
+     * 
+     * Generally this method is for internal driver stuff (e.g. other methods like
+     * absolute() or relative() might call this and then call next() to get the row).
+     * This method is public to facilitate more advanced ResultSet scrolling tools
+     * -- e.g. cleaner implimentation of ResultSetIterator.
+     * 
+     * Some drivers will emulate seek() and not allow reverse seek (Oracle).
+     * 
+     * Seek is 0-based, but seek() is only for moving to the space _before_ the record
+     * that you want to read.  I.e. if you seek(0) and then call next() you will have the 
+     * first row (i.e. same as calling first() or absolute(1)).
+     * 
+     * <strong>IMPORTANT:  You cannot rely on the return value of this method to know whether a given
+     * record exists for reading.  In some cases seek() will correctly return <code>false</code> if
+     * the position doesn't exist, but in other drivers the seek is not performed until the
+     * record is fetched. You can check the return value of absolute() if you need to know
+     * whether a specific rec position is valid.</strong>
+     * 
+     * @param int $rownum The cursor pos to seek to.
+     * @return boolean true on success, false if unable to seek to specified record.
+     * @throws SQLException if trying to seek backwards with a driver that doesn't
+     *                      support reverse-scrolling
+     */
+    public function seek($rownum);    
+    
+    /**
+     * Move cursor to beginning of recordset.
+     * @return boolean <tt>true</tt> on success or <tt>false</tt> if not found.
+     * @throws SQLException - if unable to move to first position
+     *                      - if not at first pos & ResultSet doesn't support reverse scrolling
+     */
+    public function first();
+
+    /**
+     * Move cursor to end of recordset.
+     * @return boolean <tt>true</tt> on success or <tt>false</tt> if not found.
+     * @throws SQLException - if unable to move to last position
+     *                      - if unable to get num rows
+     */
+    public function last();
+    
+    /**
+     * Sets cursort to before first record. This does not actually seek(), but
+     * simply sets cursor pos to 0.
+     * This is useful for inserting a record before the first in the set, etc.
+     * @return void
+     */
+    public function beforeFirst();
+
+
+    /**
+     * Sets cursort to after the last record. This does not actually seek(), but
+     * simply sets the cursor pos  to last + 1.
+     * This [will be] useful for inserting a record after the last in the set,
+     * when/if Creole supports updateable ResultSets.
+     * @return void
+     */
+    public function afterLast();
+
+
+    /**
+     * Checks whether cursor is after the last record.
+     * @return boolean
+     * @throws SQLException on any driver-level error.
+     */
+    public function isAfterLast();
+
+    /**
+     * Checks whether cursor is before the first record.
+     * @return boolean
+     * @throws SQLException on any driver-level error.
+     */
+    public function isBeforeFirst();
+
+    /**
+     * Returns the current cursor position.
+     * Cursor positions start at 0, but as soon as first row is fetched
+     * cursor position is 1. (so first row is 1)
+     * @return int
+     */
+    public function getCursorPos();
+
+    /**
+     * Gets current fields (assoc array).
+     * @return array
+     */
+    public function getRow();
+
+    /**
+     * Get the number of rows in a result set.
+     * @return int the number of rows
+     * @throws SQLException - if unable to get a rowcount.
+     */
+    public function getRecordCount();
+            
+    /**
+     * Frees the resources allocated for this result set.
+     * Also empties any internal field array so that any calls to
+     * get() method on closed ResultSet will result in "Invalid column" SQLException.
+     * @return void
+     */
+    public function close();
+    
+    /**
+     * A generic get method returns unformatted (=string) value.
+     * This returns the raw results from the database.  Usually this will be a string, but some drivers
+     * also can return objects (lob descriptors, etc) in certain cases.
+     * @param mixed $column Column name (string) or index (int) starting with 1 (if ResultSet::FETCHMODE_NUM was used) (if ResultSet::FETCHMODE_NUM was used).
+     * @return mixed Usually expect a string.
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    public function get($column);
+    
+    /**
+     * Reads a column as an array.
+     * The value of the column is unserialized & returned as an array.  The generic case of this function is 
+     * very PHP-specific.  Other drivers (e.g. Postgres) will format values into their native array format.
+     * @param mixed $column Column name (string) or index (int) starting with 1 (if ResultSet::FETCHMODE_NUM was used).
+     * @return array value or null if database returned null.
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    public function getArray($column);
+
+    /**
+     * Returns value translated to boolean.
+     * Default is to map 0 => false, 1 => true, but some database drivers may override this behavior.
+     * @param mixed $column Column name (string) or index (int) starting with 1 (if ResultSet::FETCHMODE_NUM was used).
+     * @return boolean value or null if database returned null.
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    public function getBoolean($column);
+            
+    /**
+     * Returns Blob with contents of column value.
+     * 
+     * @param mixed $column Column name (string) or index (int) starting with 1 (if ResultSet::FETCHMODE_NUM was used).
+     * @return Blob New Blob with data from column or null if database returned null.
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    public function getBlob($column);
+
+    /**
+     * Returns Clob with contents of column value.
+     * 
+     * @param mixed $column Column name (string) or index (int) starting with 1 (if ResultSet::FETCHMODE_NUM was used).
+     * @return Clob New Clob object with data from column or null if database returned null.
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    public function getClob($column);
+
+    /**
+     * Return a formatted date.
+     * 
+     * The default format for dates returned is preferred (in your locale, as specified using setlocale()) 
+     * format w/o time (i.e. strftime("%x", $val)).  Override this by specifying a format second parameter.  You
+     * can also specify a date()-style formatter; if you do, make sure there are no "%" symbols in your format string.
+     * 
+     * @param mixed $column Column name (string) or index (int) starting with 1 (if ResultSet::FETCHMODE_NUM was used).
+     * @param string $format Date formatter for use w/ strftime() or date() (it will choose based on examination of format string)
+     *                          If format is NULL, then the integer unix timestamp will be returned (no formatting performed).
+     * @return mixed  Formatted date, or integer unix timestamp (using 00:00:00 for time) if $format was null. 
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    public function getDate($column, $format = '%x');   
+
+    /**
+     * Returns value cast as a float (in PHP this is same as double).
+     * 
+     * @param mixed $column Column name (string) or index (int) starting with 1 (if ResultSet::FETCHMODE_NUM was used).
+     * @return float value or null if database returned null
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    public function getFloat($column);
+
+    /**
+     * Returns value cast as integer.
+     * 
+     * @param mixed $column Column name (string) or index (int) starting with 1 (if ResultSet::FETCHMODE_NUM was used).
+     * @return int value or null if database returned null
+     * @see getInteger()
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    public function getInt($column);      
+
+    /**
+     * Returns value cast as string.
+     * 
+     * @param mixed $column Column name (string) or index (int) starting with 1 (if ResultSet::FETCHMODE_NUM was used).
+     * @return string value or null if database returned null
+     * @see get()
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    public function getString($column);
+    
+    /**
+     * Return a formatted time.
+     * 
+     * The default format for times returned is preferred (in your locale, as specified using setlocale()) 
+     * format w/o date (i.e. strftime("%X", $val)).  Override this by specifying a format second parameter.  You
+     * can also specify a date()-style formatter; if you do, make sure there are no "%" symbols in your format string.
+     * 
+     * @param mixed $column Column name (string) or index (int) starting with 1 (if ResultSet::FETCHMODE_NUM was used).
+     * @param string $format Date formatter for use w/ strftime() or date() (it will choose based on examination of format string)
+     *                          If format is NULL, then the integer unix timestamp will be returned (no formatting performed).
+     * @return mixed  Formatted time, or integer unix timestamp (using today's date) if $format was null. 
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    public function getTime($column, $format = '%X');
+
+    /**
+     * Return a formatted timestamp.
+     * 
+     * The default format for timestamp is ISO standard YYYY-MM-DD HH:MM:SS (i.e. date('Y-m-d H:i:s', $val).
+     * Override this by specifying a format second parameter.  You can also specify a strftime()-style formatter.
+     * 
+     * Hint: if you want to get the unix timestamp use the "U" formatter string.
+     * 
+     * @param mixed $column Column name (string) or index (int) starting with 1 (if ResultSet::FETCHMODE_NUM was used).
+     * @param string $format Date formatter for use w/ strftime() or date() (it will choose based on examination of format string)
+     *                          If format is NULL, then the integer unix timestamp will be returned (no formatting performed).
+     * @return mixed Formatted timestamp, or integer unix timestamp (if $format was null)
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    public function getTimestamp($column, $format = 'Y-m-d H:i:s');
+    
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/ResultSet.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/ResultSetIterator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/ResultSetIterator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/ResultSetIterator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,113 @@
+<?php
+/*
+ *  $Id: ResultSetIterator.php,v 1.3 2004/03/15 17:47:45 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * Basic ResultSet Iterator.
+ * 
+ * This can be returned by your class's getIterator() method, but of course
+ * you can also implement your own (e.g. to get better performance, by using direct
+ * driver calls and avoiding other side-effects inherent in ResultSet scrolling
+ * functions -- e.g. beforeFirst() / afterLast(), etc.).
+ *
+ * Important: ResultSet iteration does rewind the resultset if it is not at the
+ * start.  Not all drivers support reverse scrolling, so this may result in an
+ * exception in some cases (Oracle).
+ * 
+ * Developer note:
+ * The implementation of this class is a little weird because it fetches the
+ * array _early_ in order to answer valid() w/o needing to know total num
+ * of fields.  Remember the way iterators work:
+ * <code>
+ * $it = $obj->getIterator();
+ * for($it->rewind(); $it->valid(); $it->next()) {
+ *  $key = $it->current();
+ *  $val = $it->key();
+ *  echo "$key = $val\n";
+ * }
+ * unset($it);
+ * </code>
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.3 $
+ * @package   creole
+ */
+class ResultSetIterator implements Iterator {
+
+    private $rs;    
+    
+    /**
+     * Construct the iterator.
+     * @param ResultSet $rs
+     */
+    public function __construct(ResultSet $rs)
+    {
+        $this->rs = $rs;
+    }
+    
+    /**
+     * If not at start of resultset, this method will call seek(0).
+     * @see ResultSet::seek()
+     */
+    function rewind()
+    {
+        if (!$this->rs->isBeforeFirst()) {
+            $this->rs->seek(0);
+        }
+    }
+    
+    /**
+     * This method checks to see whether there are more results
+     * by advancing the cursor position.
+     * @see ResultSet::next()
+     */
+    function valid()
+    {
+        return $this->rs->next();
+    }
+    
+    /**
+     * Returns the cursor position.
+     * @return int
+     */
+    function key()
+    {
+        return $this->rs->getCursorPos();
+    }
+    
+    /**
+     * Returns the row (assoc array) at current cursor pos.
+     * @return array
+     */
+    function current()
+    {
+       return $this->rs->getRow();
+    }
+    
+    /**
+     * This method does not actually do anything since we have already advanced
+     * the cursor pos in valid().
+     * @see valid()
+     */
+    function next()
+    {
+    }
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/ResultSetIterator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/SQLException.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/SQLException.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/SQLException.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,105 @@
+<?php
+/*
+ *  $Id: SQLException.php,v 1.10 2004/03/20 04:16:49 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * A class for handling database-related errors.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.10 $
+ * @package   creole
+ */
+class SQLException extends Exception {
+    
+    /** Information that provides additional information for context of Exception (e.g. SQL statement or DSN). */
+    protected $userInfo;
+    
+    /** Native RDBMS error string */
+    protected $nativeError;
+    
+    /**
+     * Constructs a SQLException.
+     * @param string $msg Error message
+     * @param string $native Native DB error message.
+     * @param string $userinfo More info, e.g. the SQL statement or the connection string that caused the error.
+     */
+    public function __construct($msg, $native = null, $userinfo = null)
+    {
+        parent::__construct($msg);
+        if ($native !== null) {
+            $this->setNativeError($native);
+        }
+        if ($userinfo !== null) {
+            $this->setUserInfo($userinfo);
+        }
+    }
+    
+    /**
+     * Sets additional user / debug information for this error.
+     *  
+     * @param array $info
+     * @return void
+     */ 
+    public function setUserInfo($info)
+    {
+        $this->userInfo = $info;
+        $this->message .= " [User Info: " .$this->userInfo . "]";
+    }
+    
+    /**
+     * Returns the additional / debug information for this error. 
+     * 
+     * @return array hash of user info properties.
+     */
+    public function getUserInfo()
+    {
+        return $this->userInfo;
+    }
+    
+    /**
+     * Sets driver native error message.
+     *  
+     * @param string $info
+     * @return void
+     */ 
+    public function setNativeError($msg)
+    {
+        $this->nativeError = $msg;
+        $this->message .= " [Native Error: " .$this->nativeError . "]";
+    }
+    
+    /**
+     * Gets driver native error message.
+     * 
+     * @return string
+     */
+    public function getNativeError()
+    {
+        return $this->nativeError;
+    }        
+    
+    /**
+     * @deprecated This method only exists right now for easier compatibility w/ PHPUnit!
+     */
+    public function toString()
+    {
+        return $this->getMessage();
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/SQLException.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/Statement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/Statement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/Statement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,147 @@
+<?php
+/*
+ *  $Id: Statement.php,v 1.17 2004/03/20 04:16:49 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * Class that represents a SQL statement.
+ * 
+ * This class is very generic and has no driver-specific implementations.  In fact,
+ * it wouldn't be possible to have driver-specific classes, since PHP doesn't support
+ * multiple inheritance.  I.e. you couldn't have MySQLPreparedStatement that extended
+ * both the abstract PreparedStatement class and the MySQLStatement class.  In Java
+ * this isn't a concern since PreparedStatement is an interface, not a class.
+ *
+ * 
+ * @author   Hans Lellelid <hans en xmpl.org>
+ * @version  $Revision: 1.17 $
+ * @package  creole
+ */
+interface Statement {    
+    
+    /**
+     * Sets the maximum number of rows to return from db.
+     * This will affect the SQL if the RDBMS supports native LIMIT; if not,
+     * it will be emulated.  Limit only applies to queries (not update sql).
+     * @param int $v Maximum number of rows or 0 for all rows.
+     * @return void
+     */
+    public function setLimit($v);
+    
+    /**
+     * Returns the maximum number of rows to return or 0 for all.
+     * @return int
+     */
+    public function getLimit();
+    
+    /**
+     * Sets the start row.
+     * This will affect the SQL if the RDBMS supports native OFFSET; if not,
+     * it will be emulated. Offset only applies to queries (not update) and 
+     * only is evaluated when LIMIT is set!
+     * @param int $v
+     * @return void
+     */ 
+    public function setOffset($v);
+    
+    /**
+     * Returns the start row.
+     * Offset only applies when Limit is set!
+     * @return int
+     */
+    public function getOffset();
+    
+    /**
+     * Free resources associated with this statement.
+     * Some drivers will need to implement this method to free
+     * database result resources. 
+     * 
+     * @return void
+     */
+    public function close();
+    
+    /**
+     * Generic execute() function has to check to see whether SQL is an update or select query.
+     * 
+     * If you already know whether it's a SELECT or an update (manipulating) SQL, then use
+     * the appropriate method, as this one will incurr overhead to check the SQL.
+     * 
+     * @param int $fetchmode Fetchmode (only applies to queries).
+     * @return boolean True if it is a result set, false if not or if no more results (this is identical to JDBC return val).
+     * @throws SQLException
+     */
+    public function execute($sql, $fetchmode = null);
+
+    /**
+     * Get result set.
+     * This assumes that the last thing done was an executeQuery() or an execute()
+     * with SELECT-type query.
+     *
+     * @return RestultSet (or null if none)
+     */
+    public function getResultSet();
+
+    /**
+     * Get update count.
+     *
+     * @return int Number of records affected, or <code>null</code> if not applicable.
+     */
+    public function getUpdateCount();        
+
+    /**
+     * Executes the SQL query in this PreparedStatement object and returns the resultset generated by the query.
+     * 
+     * @param string $sql This method may optionally be called with the SQL statement.
+     * @param int $fetchmode The mode to use when fetching the results (e.g. ResultSet::FETCHMODE_NUM, ResultSet::FETCHMODE_ASSOC).
+     * @return object Creole::ResultSet
+     * @throws SQLException if a database access error occurs.
+     */
+    public function executeQuery($sql, $fetchmode = null);
+    
+    /**
+     * Executes the SQL INSERT, UPDATE, or DELETE statement in this PreparedStatement object.
+     * 
+     * @param string $sql This method may optionally be called with the SQL statement.
+     * @return int Number of affected rows (or 0 for drivers that return nothing).
+     * @throws SQLException if a database access error occurs.
+     */
+    public function executeUpdate($sql);
+    
+    /**
+     * Gets next result set (if this behavior is supported by driver).
+     * Some drivers (e.g. MSSQL) support returning multiple result sets -- e.g.
+     * from stored procedures.
+     *
+     * This function also closes any current restult set.
+     *
+     * Default behavior is for this function to return false.  Driver-specific
+     * implementations of this class can override this method if they actually
+     * support multiple result sets.
+     * 
+     * @return boolean True if there is another result set, otherwise false.
+     */
+    public function getMoreResults();
+     
+    /**
+     * Gets the db Connection that created this statement.
+     * @return Connection
+     */
+    public function getConnection();
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/Statement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/ConnectionCommon.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/ConnectionCommon.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/ConnectionCommon.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,258 @@
+<?php
+/*
+ *  $Id: ConnectionCommon.php,v 1.5 2005/10/17 19:03:51 dlawson_mi Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * Class that contains some shared/default information for connections.  Classes may wish to extend this so
+ * as not to worry about the sleep/wakeup methods, etc.
+ * 
+ * In reality this class is not very useful yet, so there's not much incentive for drivers to extend this.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.5 $
+ * @package   creole.common
+ */
+abstract class ConnectionCommon {
+
+    // Constants that define transaction isolation levels.
+    // [We don't have any code using these yet, so there's no need
+    // to initialize these values at this point.]
+    // const TRANSACTION_NONE = 0;
+    // const TRANSACTION_READ_UNCOMMITTED = 1;
+    // const TRANSACTION_READ_COMMITTED = 2;
+    // const TRANSACTION_REPEATABLE_READ = 3;
+    // const TRANSACTION_SERIALIZABLE = 4;
+    
+       /**
+     * The depth level of current transaction.
+     * @var int
+     */ 
+    protected $transactionOpcount = 0;
+    
+    /**
+     * DB connection resource id.     
+     * @var resource
+     */ 
+    protected $dblink;
+    
+    /**
+     * Array hash of connection properties.
+     * @var array
+     */
+    protected $dsn;
+
+    /**
+     * Flags (e.g. Connection::PERSISTENT) for current connection.
+     * @var int
+     */
+    protected $flags = 0;
+        
+    /**
+     * This "magic" method is invoked upon serialize() and works in tandem with the __wakeup()
+     * method to ensure that your database connection is serializable.
+     * 
+     * This method returns an array containing the names of any members of your class
+     * which need to be serialized in order to allow the class to re-connect to the database
+     * when it is unserialized.
+     * 
+     * <p>
+     * Developers:
+     * 
+     * Note that you cannot serialize resources (connection links) and expect them to 
+     * be valid when you unserialize.  For this reason, you must re-connect to the database in the
+     * __wakeup() method.
+     * 
+     * It's up to your class implimentation to ensure that the necessary data is serialized. 
+     * You probably at least need to serialize:
+     * 
+     *  (1) the DSN array used by connect() method
+     *  (2) Any flags that were passed to the connection
+     *  (3) Possibly the autocommit state
+     * 
+     * @return array The class variable names that should be serialized.
+     * @see __wakeup()
+     * @see DriverManager::getConnection()
+     * @see DatabaseInfo::__sleep()
+     */
+    public function __sleep()
+    {
+        return array('dsn', 'flags');
+    }
+    
+    /**
+     * This "magic" method is invoked upon unserialize().
+     * This method will re-connects to the database using the information that was
+     * stored using the __sleep() method.
+     * @see __sleep()
+     */
+    public function __wakeup() 
+    {
+        $this->connect($this->dsn, $this->flags);
+    }
+   
+    /**
+     * @see Connection::getResource()
+     */
+    public function getResource()
+    {
+        return $this->dblink;
+    }
+    
+    /**
+     * @see Connection::getDSN()
+     */
+    public function getDSN() {
+        return $this->dsn;
+    }
+       
+    /**
+     * @see Connection::getFlags()
+     */
+    public function getFlags()
+    {
+        return $this->flags;
+    }    
+
+    /**
+     * Creates a CallableStatement object for calling database stored procedures.
+     * 
+     * @param string $sql
+     * @return CallableStatement
+     */
+    public function prepareCall($sql) 
+    {
+        throw new SQLException("Current driver does not support stored procedures using CallableStatement.");
+    }    
+    
+    /**
+     * Driver classes should override this if they support transactions.
+     * 
+     * @return boolean
+     */
+    public function supportsNestedTrans() 
+    {
+        return false;
+    }
+    
+    /**
+     * Begins a transaction (if supported).
+     */
+    public function begin() 
+    {
+        if ($this->transactionOpcount === 0 || $this->supportsNestedTrans()) {
+            $this->beginTrans();
+        }
+        $this->transactionOpcount++;
+    }
+
+    /**
+     * Commits statements in a transaction.
+     */
+    public function commit() 
+    {
+        if ($this->transactionOpcount > 0) {
+            if ($this->transactionOpcount == 1 || $this->supportsNestedTrans()) {
+                $this->commitTrans();
+            }
+            $this->transactionOpcount--;       
+        }
+    }
+    
+    /**
+     * Rollback changes in a transaction.
+     */
+    public function rollback() 
+    {
+        if ($this->transactionOpcount > 0) {
+            if ($this->transactionOpcount == 1 || $this->supportsNestedTrans()) {
+                $this->rollbackTrans();
+            }
+            $this->transactionOpcount--;       
+        }
+    }
+
+    /**
+     * Enable/disable automatic commits.
+     * 
+     * Pushes SQLWarning onto $warnings stack if the autocommit value is being changed mid-transaction. This function
+     * is overridden by driver classes so that they can perform the necessary begin/end transaction SQL.
+     * 
+     * If auto-commit is being set to TRUE, then the current transaction will be committed immediately.
+     * 
+     * @param boolean $bit New value for auto commit.
+     * @return void
+     */
+    public function setAutoCommit($bit) 
+    {
+        if ($this->transactionOpcount > 0) {
+            trigger_error("Changing autocommit in mid-transaction; committing " . $this->transactionOpcount . " uncommitted statements.", E_USER_WARNING);
+        }
+
+        if (!$bit) {
+            $this->begin();
+        }
+        else {
+            $this->commit();
+        }
+    }
+
+    /**
+     * Get auto-commit status.
+     *
+     * @return boolean
+     */
+    public function getAutoCommit() 
+    {
+        return ($this->transactionOpcount == 0);
+    }
+    
+    /**
+     * Begin new transaction.
+     * Driver classes should override this method if they support transactions.
+     */
+    protected function beginTrans()
+    {
+    }
+    
+    /**
+     * Commit the current transaction.
+     * Driver classes should override this method if they support transactions.
+     */
+    protected function commitTrans() 
+    {
+    }
+    
+    /**
+     * Roll back (undo) the current transaction.
+     * Driver classes should override this method if they support transactions.
+     */
+    protected function rollbackTrans() 
+    {
+    }
+ 
+    /**
+     * Returns false if connection is closed.
+     * @return boolean
+     */
+    public function isConnected()
+    {
+        return !empty($this->dblink);
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/ConnectionCommon.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/PreparedStatementCommon.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/PreparedStatementCommon.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/PreparedStatementCommon.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,640 @@
+<?php
+/*
+ *  $Id: PreparedStatementCommon.php,v 1.16 2005/11/13 01:30:00 gamr Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * Class that represents a shared code for handling emulated pre-compiled statements.
+ * 
+ * Many drivers do not take advantage of pre-compiling SQL statements; for these
+ * cases the precompilation is emulated.  This emulation comes with slight penalty involved
+ * in parsing the queries, but provides other benefits such as a cleaner object model and ability
+ * to work with BLOB and CLOB values w/o needing special LOB-specific routines.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.16 $
+ * @package   creole.common
+ */
+abstract class PreparedStatementCommon {
+
+    /**
+     * The database connection.
+     * @var Connection
+     */ 
+    protected $conn;
+    
+    /**
+     * Max rows to retrieve from DB.
+     * @var int
+     */
+    protected $limit = 0;
+    
+    /**
+     * Offset at which to start processing DB rows.
+     * "Skip X rows"
+     * @var int
+     */
+    protected $offset = 0;
+    
+    /**
+     * The SQL this class operates on.
+     * @var string
+     */
+    protected $sql;
+
+    /**
+     * Possibly contains a cached prepared SQL Statement.
+     * Gives an early out to replaceParams if the same
+     * query is run multiple times without changing the
+     * params.
+     * @var string
+     */
+    protected $sql_cache;
+
+    /**
+     * Flag to set if the cache is upto date or not
+     * @var boolean
+     */
+    protected $sql_cache_valid = false;
+
+    /**
+     * The string positions of the parameters in the SQL.
+     * @var array
+     */
+    protected $positions;
+
+
+    /**
+     * Number of positions (simply to save processing).
+     * @var int
+     */
+    protected $positionsCount;
+
+    /**
+     * Map of index => value for bound params.
+     * @var array string[]
+     */
+    protected $boundInVars = array();    
+    
+    /**
+     * Temporarily hold a ResultSet object after an execute() query.
+     * @var ResultSet
+     */
+    protected $resultSet;
+
+    /**
+     * Temporary hold the affected row cound after an execute() query.
+     * @var int
+     */
+    protected $updateCount;
+    
+    /**
+     * Create new prepared statement instance.
+     * 
+     * @param object $conn Connection object
+     * @param string $sql The SQL to work with.
+     * @param array $positions The positions in SQL of ?'s.
+     * @param restult $stmt If the driver supports prepared queries, then $stmt will contain the statement to use.
+     */ 
+    public function __construct(Connection $conn, $sql)
+    {
+        $this->conn = $conn;
+        $this->sql = $sql;
+    
+	$this->positions = $this->parseQuery ( $sql );
+        // save processing later in cases where we may repeatedly exec statement
+	$this->positionsCount = count ( $this->positions );
+    }
+
+    /**
+     * Parse the SQL query for ? positions
+     *
+     * @param string $sql The query to process
+     * @return array Positions from the start of the string that ?'s appear at
+    */
+    protected function parseQuery ( $sql )
+    {
+
+        $positions = array();
+	// match anything ? ' " or \ in $sql with an early out if we find nothing
+        if ( preg_match_all ( '([\?]|[\']|[\"]|[\\\])', $sql, $matches, PREG_OFFSET_CAPTURE ) !== 0 ) {
+                $matches = $matches['0'];
+                $open = NULL;
+		// go thru all our matches and see what we can find
+                for ( $i = 0, $j = count ( $matches ); $i < $j; $i++ ) {
+                        switch ( $matches[$i]['0'] ) {
+				// if we already have an open " or ' then check if this is the end
+				// to close it or not
+                                case $open:
+                                        $open = NULL;
+                                        break;
+				// we have a quote, set ourselves open
+                                case '"':
+                                case "'":
+                                        $open = $matches[$i]['0'];
+                                        break;
+				// check if it is an escaped quote and skip if it is
+                                case '\\':
+                                        $next_match = $matches[$i+1]['0'];
+                                        if ( $next_match === '"' || $next_match === "'" ) {
+                                                $i++;
+                                        }
+                                        unset ( $next_match );
+                                        break;
+				// we found a ?, check we arent in an open "/' first and
+				// add it to the position list if we arent
+                                default:
+                                        if ( $open === NULL ) {
+                                                $positions[] = $matches[$i]['1'];
+                                        }
+                        }
+                        unset ( $matches[$i] );
+                }
+                unset ( $open, $matches, $i, $j );
+        }
+
+	return $positions;
+
+    }
+
+    /**
+     * @see PreparedStatement::setLimit()
+     */
+    public function setLimit($v)
+    {
+        $this->limit = (int) $v;
+    }
+    
+    /**
+     * @see PreparedStatement::getLimit()
+     */
+    public function getLimit()
+    {
+        return $this->limit;
+    }
+    
+    /**
+     * @see PreparedStatement::setOffset()
+     */ 
+    public function setOffset($v)
+    {
+        $this->offset = (int) $v;
+    }
+    
+    /**
+     * @see PreparedStatement::getOffset()
+     */
+    public function getOffset()
+    {
+        return $this->offset;
+    }
+    
+    /**
+     * @see PreparedStatement::getResultSet()
+     */
+    public function getResultSet()
+    {
+        return $this->resultSet;
+    }
+
+    /**
+     * @see PreparedStatement::getUpdateCount()
+     */
+    public function getUpdateCount()
+    {
+        return $this->updateCount;
+    }
+    
+    /**
+     * @see PreparedStatement::getMoreResults()
+     */
+    public function getMoreResults()
+    {
+        if ($this->resultSet) $this->resultSet->close();
+        $this->resultSet = null;
+        return false;
+    }
+     
+    /**
+     * @see PreparedStatement::getConnection()
+     */
+    public function getConnection()
+    {
+        return $this->conn;
+    }
+    
+    /**
+     * Statement resources do not exist for emulated prepared statements,
+     * so this just returns <code>null</code>.
+     * @return null
+     */
+    public function getResource()
+    {
+        return null;
+    }
+    
+    /**
+     * Nothing to close for emulated prepared statements.
+     */
+    public function close()
+    {       
+    }
+    
+    /**
+     * Replaces placeholders with the specified parameter values in the SQL.
+     * 
+     * This is for emulated prepared statements.
+     * 
+     * @return string New SQL statement with parameters replaced.
+     * @throws SQLException - if param not bound.
+     */
+    protected function replaceParams()
+    {
+    	// early out if we still have the same query ready
+    	if ( $this->sql_cache_valid === true ) {
+		return $this->sql_cache;
+	}
+
+        // Default behavior for this function is to behave in 'emulated' mode.    
+        $sql = '';    
+        $last_position = 0;
+
+        for ($position = 0; $position < $this->positionsCount; $position++) {
+            if (!isset($this->boundInVars[$position + 1])) {
+                throw new SQLException('Replace params: undefined query param: ' . ($position + 1));
+            }
+            $current_position = $this->positions[$position];            
+            $sql .= substr($this->sql, $last_position, $current_position - $last_position);
+            $sql .= $this->boundInVars[$position + 1];                    
+            $last_position = $current_position + 1;            
+        }
+        // append the rest of the query
+        $sql .= substr($this->sql, $last_position);
+
+	// just so we dont touch anything with a blob/clob
+	if ( strlen ( $sql ) > 2048 ) { 
+		$this->sql_cache = $sql;
+    		$this->sql_cache_valid = true;
+		return $this->sql_cache;
+	} else {
+		return $sql;
+	}
+    }
+
+    /**
+     * Executes the SQL query in this PreparedStatement object and returns the resultset generated by the query.
+     * We support two signatures for this method:
+     * - $stmt->executeQuery(ResultSet::FETCHMODE_NUM);
+     * - $stmt->executeQuery(array($param1, $param2), ResultSet::FETCHMODE_NUM);
+     * @param mixed $p1 Either (array) Parameters that will be set using PreparedStatement::set() before query is executed or (int) fetchmode.
+     * @param int $fetchmode The mode to use when fetching the results (e.g. ResultSet::FETCHMODE_NUM, ResultSet::FETCHMODE_ASSOC).
+     * @return ResultSet
+     * @throws SQLException if a database access error occurs.
+     */
+	public function executeQuery($p1 = null, $fetchmode = null)
+	{    
+	    $params = null;
+		if ($fetchmode !== null) {
+			$params = $p1;
+		} elseif ($p1 !== null) {
+			if (is_array($p1)) $params = $p1;
+			else $fetchmode = $p1;
+		}
+	    
+	    	foreach ( (array) $params as $i=>$param ) {
+			$this->set ( $i + 1, $param );
+			unset ( $i, $param );
+		}
+		unset ( $params );
+        
+        $this->updateCount = null; // reset
+        $sql = $this->replaceParams();        
+        
+        if ($this->limit > 0 || $this->offset > 0) {
+            $this->conn->applyLimit($sql, $this->offset, $this->limit);
+        }
+        
+        $this->resultSet = $this->conn->executeQuery($sql, $fetchmode);
+        return $this->resultSet;
+    }
+
+    /**
+     * Executes the SQL INSERT, UPDATE, or DELETE statement in this PreparedStatement object.
+     * 
+     * @param array $params Parameters that will be set using PreparedStatement::set() before query is executed.
+     * @return int Number of affected rows (or 0 for drivers that return nothing).
+     * @throws SQLException if a database access error occurs.
+     */
+    public function executeUpdate($params = null) 
+    {
+		foreach ( (array) $params as $i=>$param ) {
+			$this->set ( $i + 1, $param );
+			unset ( $i, $param );
+		}
+		unset ( $params );
+
+        if($this->resultSet) $this->resultSet->close();
+        $this->resultSet = null; // reset                
+        $sql = $this->replaceParams();        
+        $this->updateCount = $this->conn->executeUpdate($sql);
+        return $this->updateCount;
+    }    
+
+    /**
+     * Escapes special characters (usu. quotes) using native driver function.
+     * @param string $str The input string.
+     * @return string The escaped string.
+     */
+    abstract protected function escape($str);
+    
+    /**
+     * A generic set method.
+     * 
+     * You can use this if you don't want to concern yourself with the details.  It involves
+     * slightly more overhead than the specific settesr, since it grabs the PHP type to determine
+     * which method makes most sense.
+     * 
+     * @param int $paramIndex
+     * @param mixed $value
+     * @return void
+     * @throws SQLException
+     */
+    function set($paramIndex, $value)
+    {
+        $type = gettype($value);
+        if ($type == "object") {
+            if (is_a($value, 'Blob')) {
+                $this->setBlob($paramIndex, $value);
+            } elseif (is_a($value, 'Clob')) {
+                $this->setClob($paramIndex, $value);
+            } elseif (is_a($value, 'Date')) {
+                 // can't be sure if the column type is a DATE, TIME, or TIMESTAMP column
+                 // we'll just use TIMESTAMP by default; hopefully DB won't complain (if
+                 // it does, then this method just shouldn't be used).
+                 $this->setTimestamp($paramIndex, $value);
+            } else {
+                throw new SQLException("Unsupported object type passed to set(): " . get_class($value));
+            }
+        } else {
+	    switch ( $type ) {
+	    	case 'integer':
+			$type = 'int';
+			break;
+		case 'double':
+			$type = 'float';
+			break;
+	    }
+		$setter = 'set' . ucfirst($type); // PHP types are case-insensitive, but we'll do this in case that change
+		if ( method_exists ( $this, $setter ) ) {
+			$this->$setter($paramIndex, $value);
+		} else {
+			throw new SQLException ( "Unsupported datatype passed to set(): " . $type );
+		}
+        }
+    }
+    
+    /**
+     * Sets an array.
+     * Unless a driver-specific method is used, this means simply serializing
+     * the passed parameter and storing it as a string.
+     * @param int $paramIndex
+     * @param array $value
+     * @return void
+     */
+    function setArray($paramIndex, $value) 
+    {        
+	    $this->sql_cache_valid = false;
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            $this->boundInVars[$paramIndex] = "'" . $this->escape(serialize($value)) . "'";
+        }
+    }
+
+    /**
+     * Sets a boolean value.
+     * Default behavior is true = 1, false = 0.
+     * @param int $paramIndex
+     * @param boolean $value
+     * @return void
+     */
+    function setBoolean($paramIndex, $value) 
+    {                
+	    $this->sql_cache_valid = false;
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            $this->boundInVars[$paramIndex] = (int) $value;
+        }
+    }
+    
+
+    /**
+     * @see PreparedStatement::setBlob()
+     */
+    function setBlob($paramIndex, $blob) 
+    {        
+	    $this->sql_cache_valid = false;
+        if ($blob === null) {
+            $this->setNull($paramIndex);
+        } else {
+            // they took magic __toString() out of PHP5.0.0; this sucks
+            if (is_object($blob)) {
+            	$this->boundInVars[$paramIndex] = "'" . $this->escape($blob->__toString()) . "'";
+            } else {
+            	$this->boundInVars[$paramIndex] = "'" . $this->escape($blob) . "'";
+	    }
+        }
+    } 
+
+    /**
+     * @see PreparedStatement::setClob()
+     */
+    function setClob($paramIndex, $clob) 
+    {
+	    $this->sql_cache_valid = false;
+        if ($clob === null) {
+            $this->setNull($paramIndex);
+        } else {      
+            // they took magic __toString() out of PHP5.0.0; this sucks
+            if (is_object($clob)) {
+            	$this->boundInVars[$paramIndex] = "'" . $this->escape($clob->__toString()) . "'";
+            } else {
+            	$this->boundInVars[$paramIndex] = "'" . $this->escape($clob) . "'";
+	    }
+        }
+    }     
+
+    /**
+     * @param int $paramIndex
+     * @param string $value
+     * @return void
+     */
+    function setDate($paramIndex, $value) 
+    {
+	    $this->sql_cache_valid = false;
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            if (is_numeric($value)) $value = date("Y-m-d", $value);
+            elseif (is_object($value)) $value = date("Y-m-d", $value->getTime());        
+            $this->boundInVars[$paramIndex] = "'" . $this->escape($value) . "'";
+        }
+    } 
+    
+    /**
+     * @param int $paramIndex
+     * @param double $value
+     * @return void
+     */
+    function setDecimal($paramIndex, $value) 
+    {
+	    $this->sql_cache_valid = false;
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            $this->boundInVars[$paramIndex] = (float) $value;
+        }
+    }             
+
+    /**
+     * @param int $paramIndex
+     * @param double $value
+     * @return void
+     */
+    function setDouble($paramIndex, $value) 
+    {
+	    $this->sql_cache_valid = false;
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            $this->boundInVars[$paramIndex] = (double) $value;
+        }
+    } 
+        
+    /**
+     * @param int $paramIndex
+     * @param float $value
+     * @return void
+     */
+    function setFloat($paramIndex, $value) 
+    {
+	    $this->sql_cache_valid = false;
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            $this->boundInVars[$paramIndex] = (float) $value;
+        }
+    } 
+
+    /**
+     * @param int $paramIndex
+     * @param int $value
+     * @return void
+     */
+    function setInt($paramIndex, $value) 
+    {
+	    $this->sql_cache_valid = false;
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            $this->boundInVars[$paramIndex] = (int) $value;
+        }
+    } 
+    
+    /**
+     * Alias for setInt()
+     * @param int $paramIndex
+     * @param int $value
+     */
+    function setInteger($paramIndex, $value)
+    {
+	    $this->sql_cache_valid = false;
+        $this->setInt($paramIndex, $value);
+    }
+
+    /**
+     * @param int $paramIndex
+     * @return void
+     */
+    function setNull($paramIndex) 
+    {
+	    $this->sql_cache_valid = false;
+        $this->boundInVars[$paramIndex] = 'NULL';
+    }
+
+    /**
+     * @param int $paramIndex
+     * @param string $value
+     * @return void
+     */
+    function setString($paramIndex, $value) 
+    {
+	    $this->sql_cache_valid = false;
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            // it's ok to have a fatal error here, IMO, if object doesn't have
+            // __toString() and is being passed to this method.
+	    if ( is_object ( $value ) ) {
+            	$this->boundInVars[$paramIndex] = "'" . $this->escape($value->__toString()) . "'";
+	    } else {
+            	$this->boundInVars[$paramIndex] = "'" . $this->escape((string)$value) . "'";
+	    }
+        }
+    } 
+    
+    /**
+     * @param int $paramIndex
+     * @param string $value
+     * @return void
+     */
+    function setTime($paramIndex, $value) 
+    {        
+	    $this->sql_cache_valid = false;
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            if ( is_numeric ( $value ) ) {
+	    		$value = date ('H:i:s', $value );
+		    } elseif ( is_object ( $value ) ) {
+		    	$value = date ('H:i:s', $value->getTime ( ) );
+		    }
+            $this->boundInVars [ $paramIndex ] = "'" . $this->escape ( $value ) . "'";
+        }
+    }
+    
+    /**
+     * @param int $paramIndex
+     * @param string $value
+     * @return void
+     */
+    function setTimestamp($paramIndex, $value) 
+    {        
+	    $this->sql_cache_valid = false;
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+       	    if (is_numeric($value)) $value = date('Y-m-d H:i:s', $value);
+       	    elseif (is_object($value)) $value = date('Y-m-d H:i:s', $value->getTime());
+            $this->boundInVars[$paramIndex] = "'".$this->escape($value)."'";
+        }
+    }
+            
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/PreparedStatementCommon.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/ResultSetCommon.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/ResultSetCommon.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/ResultSetCommon.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,447 @@
+<?php
+/*
+ *  $Id: ResultSetCommon.php,v 1.9 2006/01/17 19:44:38 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * This class implements many shared or common methods needed by resultset drivers.
+ * 
+ * This class may (optionally) be extended by driver classes simply to make it easier
+ * to create driver classes.  This is also useful in the early stages of Creole development
+ * as it means that API changes affect fewer files. As Creole matures/stabalizes having
+ * a common class may become less useful, as drivers may have their own ways of doing things
+ * (and we'll have a solid unit test framework to make sure drivers conform to the API
+ * described by the interfaces).
+ * 
+ * The get*() methods in this class will format values before returning them. Note
+ * that if they will return <code>null</code> if the database returned <code>NULL</code>
+ * which makes these functions easier to use than simply typecasting the values from the
+ * db. If the requested column does not exist than an exception (SQLException) will be thrown.
+ * 
+ * <code>
+ * $rs = $conn->executeQuery("SELECT MAX(stamp) FROM event", ResultSet::FETCHMODE_NUM);
+ * $rs->next();
+ * 
+ * $max_stamp = $rs->getTimestamp(1, "d/m/Y H:i:s");
+ * // $max_stamp will be date string or null if no MAX(stamp) was found
+ * 
+ * $max_stamp = $rs->getTimestamp("max(stamp)", "d/m/Y H:i:s");
+ * // will THROW EXCEPTION, because the resultset was fetched using numeric indexing
+ * // SQLException: Invalid resultset column: max(stamp)
+ * </code>
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.9 $
+ * @package   creole.common
+ */
+abstract class ResultSetCommon {          
+    
+    /**
+     * The fetchmode for this recordset.
+     * @var int
+     */
+    protected $fetchmode;
+    
+    /**
+     * DB connection.
+     * @var Connection
+     */
+    protected $conn;
+    
+    /**
+     * Resource identifier used for native result set handling.
+     * @var resource
+     */
+    protected $result;
+
+    /**
+     * The current cursor position (row number). First row is 1. Before first row is 0.
+     * @var int
+     */
+    protected $cursorPos = 0;
+    
+    /**
+     * The current unprocessed record/row from the db.
+     * @var array
+     */
+    protected $fields;
+    
+    /**
+     * Whether to convert assoc col case.
+	 * @var boolean
+     */
+    protected $lowerAssocCase = false;
+    
+	/**
+	 * Whether to apply rtrim() to strings.
+	 * @var boolean
+	 */
+	protected $rtrimString = false;
+	
+    /**
+     * Constructor.
+     */
+    public function __construct(Connection $conn, $result, $fetchmode = null)
+    {
+        $this->conn = $conn;
+        $this->result = $result;             
+        if ($fetchmode !== null) {
+            $this->fetchmode = $fetchmode;
+        } else {
+            $this->fetchmode = ResultSet::FETCHMODE_ASSOC; // default
+        }
+        $this->lowerAssocCase = (($conn->getFlags() & Creole::COMPAT_ASSOC_LOWER) === Creole::COMPAT_ASSOC_LOWER);
+		$this->rtrimString = (($conn->getFlags() & Creole::COMPAT_RTRIM_STRING) === Creole::COMPAT_RTRIM_STRING);
+    }
+    
+    /**
+     * Destructor
+     *
+     * Free db result resource.
+     */
+    public function __destruct()
+    {
+          $this->close();
+    }
+    
+    /**
+     * @see ResultSet::getIterator()
+     */
+    public function getIterator()
+    {
+        require_once 'creole/ResultSetIterator.php';
+        return new ResultSetIterator($this);
+    }
+    
+    /**
+     * @see ResultSet::getResource()
+     */
+    public function getResource()
+    {
+        return $this->result;
+    }
+    
+    /**
+     * @see ResultSet::isLowereAssocCase()
+     */
+    public function isLowerAssocCase()
+    {
+        return $this->lowerAssocCase;
+    }        
+    
+    /**
+     * @see ResultSet::setFetchmode()
+     */
+    public function setFetchmode($mode)
+    {
+        $this->fetchmode = $mode;
+    }
+    
+    /**
+     * @see ResultSet::getFetchmode()
+     */
+    public function getFetchmode()
+    {
+        return $this->fetchmode;
+    }                
+
+    /**
+     * @see ResultSet::previous()
+     */
+    public function previous()
+    {
+        // Go back 2 spaces so that we can then advance 1 space.
+        $ok = $this->seek($this->cursorPos - 2);
+        if ($ok === false) {
+            $this->beforeFirst();
+            return false;
+        }        
+        return $this->next();      
+    }
+
+    /**
+     * @see ResultSet::isBeforeFirst()
+     */
+    public function relative($offset)
+    {
+        // which absolute row number are we seeking
+        $pos = $this->cursorPos + ($offset - 1);
+        $ok = $this->seek($pos);
+                
+        if ($ok === false) {
+            if ($pos < 0) {
+                $this->beforeFirst();
+            } else {
+                $this->afterLast();
+            }
+        } else {
+            $ok = $this->next();
+        }
+        
+        return $ok;
+    }
+
+    /**
+     * @see ResultSet::absolute()
+     */
+    public function absolute($pos)
+    {
+        $ok = $this->seek( $pos - 1 ); // compensate for next() factor        
+        if ($ok === false) {
+            if ($pos - 1 < 0) {
+                $this->beforeFirst();
+            } else {
+                $this->afterLast();
+            }
+        } else {
+            $ok = $this->next();
+        }        
+        return $ok;
+    }
+    
+    /**
+     * @see ResultSet::first()
+     */
+    public function first()
+    {
+        if($this->cursorPos !== 0) { $this->seek(0); }
+        return $this->next();
+    }
+
+    /**
+     * @see ResultSet::last()
+     */
+    public function last()
+    {
+        if($this->cursorPos !==  ($last = $this->getRecordCount() - 1)) {
+            $this->seek( $last );
+        }
+        return $this->next();
+    }
+    
+    /**
+     * @see ResultSet::beforeFirst()
+     */
+    public function beforeFirst()
+    {
+        $this->cursorPos = 0;
+    }
+
+    /**
+     * @see ResultSet::afterLast()
+     */
+    public function afterLast()
+    {
+        $this->cursorPos = $this->getRecordCount() + 1;
+    }
+
+    /**
+     * @see ResultSet::isAfterLast()
+     */
+    public function isAfterLast()
+    {
+        return ($this->cursorPos === $this->getRecordCount() + 1);
+    }
+
+    /**
+     * @see ResultSet::isBeforeFirst()
+     */
+    public function isBeforeFirst()
+    {
+        return ($this->cursorPos === 0);
+    }    
+
+    /**
+     * @see ResultSet::getCursorPos()
+     */
+    public function getCursorPos()
+    {
+        return $this->cursorPos;
+    }
+    
+    /**
+     * @see ResultSet::getRow()
+     */
+    public function getRow()
+    {
+        return $this->fields;
+    }
+    
+    /**
+     * @see ResultSet::get()
+     */
+    public function get($column)
+    {
+        $idx = (is_int($column) ? $column - 1 : $column);
+        if (!array_key_exists($idx, $this->fields)) { throw new SQLException("Invalid resultset column: " . $column); }
+        return $this->fields[$idx];
+    }
+    
+    /**
+     * @see ResultSet::getArray()
+     */
+    public function getArray($column) 
+    {
+        $idx = (is_int($column) ? $column - 1 : $column);
+        if (!array_key_exists($idx, $this->fields)) { throw new SQLException("Invalid resultset column: " . $column); }
+        if ($this->fields[$idx] === null) { return null; }
+        return (array) unserialize($this->fields[$idx]);
+    } 
+
+    /**
+     * @see ResultSet::getBoolean()
+     */
+    public function getBoolean($column) 
+    {
+        $idx = (is_int($column) ? $column - 1 : $column);
+        if (!array_key_exists($idx, $this->fields)) { throw new SQLException("Invalid resultset column: " . $column); }
+        if ($this->fields[$idx] === null) { return null; }
+        return (boolean) $this->fields[$idx];
+    }
+            
+    /**
+     * @see ResultSet::getBlob()
+     */
+    public function getBlob($column) 
+    {
+        $idx = (is_int($column) ? $column - 1 : $column);
+        if (!array_key_exists($idx, $this->fields)) { throw new SQLException("Invalid resultset column: " . $column); }
+        if ($this->fields[$idx] === null) { return null; }
+        require_once 'creole/util/Blob.php';
+        $b = new Blob();
+        $b->setContents($this->fields[$idx]);
+        return $b;
+    }    
+
+    /**
+     * @see ResultSet::getClob()
+     */
+    public function getClob($column) 
+    {
+        $idx = (is_int($column) ? $column - 1 : $column);
+        if (!array_key_exists($idx, $this->fields)) { throw new SQLException("Invalid resultset column: " . $column); }
+        if ($this->fields[$idx] === null) { return null; }
+        require_once 'creole/util/Clob.php';
+        $c = new Clob();
+        $c->setContents($this->fields[$idx]);
+        return $c;
+    } 
+
+    /**
+     * @see ResultSet::getDate()
+     */
+    public function getDate($column, $format = '%x') 
+    {
+        $idx = (is_int($column) ? $column - 1 : $column);
+        if (!array_key_exists($idx, $this->fields)) { throw new SQLException("Invalid resultset column: " . $column); }
+        if ($this->fields[$idx] === null) { return null; }
+        $ts = strtotime($this->fields[$idx]);        
+        if ($ts === -1 || $ts === false) { // in PHP 5.1 return value changes to FALSE
+            throw new SQLException("Unable to convert value at column " . $column . " to timestamp: " . $this->fields[$idx]);
+        }
+        if ($format === null) {
+            return $ts;
+        }
+        if (strpos($format, '%') !== false) {
+            return strftime($format, $ts);
+        } else {
+            return date($format, $ts);
+        }
+    }    
+
+    /**
+     * @see ResultSet::getFloat()
+     */
+    public function getFloat($column) 
+    {
+        $idx = (is_int($column) ? $column - 1 : $column);
+        if (!array_key_exists($idx, $this->fields)) { throw new SQLException("Invalid resultset column: " . $column); }
+        if ($this->fields[$idx] === null) { return null; }
+        return (float) $this->fields[$idx];
+    }
+
+    /**
+     * @see ResultSet::getInt()
+     */
+    public function getInt($column) 
+    {
+        $idx = (is_int($column) ? $column - 1 : $column);
+        if (!array_key_exists($idx, $this->fields)) { throw new SQLException("Invalid resultset column: " . $column); }
+        if ($this->fields[$idx] === null) { return null; }
+        return (int) $this->fields[$idx];
+    }
+       
+    /**
+     * @see ResultSet::getString()
+     */
+    public function getString($column) 
+    {
+        $idx = (is_int($column) ? $column - 1 : $column);
+        if (!array_key_exists($idx, $this->fields)) { throw new SQLException("Invalid resultset column: " . $column); }
+        if ($this->fields[$idx] === null) { return null; }
+		return ($this->rtrimString ? rtrim($this->fields[$idx]) : (string) $this->fields[$idx]);
+    }
+    
+    /**
+     * @see ResultSet::getTime()
+     */
+    public function getTime($column, $format = '%X') 
+    {
+        $idx = (is_int($column) ? $column - 1 : $column);
+        if (!array_key_exists($idx, $this->fields)) { throw new SQLException("Invalid resultset column: " . $column); }
+        if ($this->fields[$idx] === null) { return null; }
+        
+        $ts = strtotime($this->fields[$idx]);
+        
+        if ($ts === -1 || $ts === false) { // in PHP 5.1 return value changes to FALSE
+            throw new SQLException("Unable to convert value at column " . (is_int($column) ? $column + 1 : $column) . " to timestamp: " . $this->fields[$idx]);
+        }
+        if ($format === null) {
+            return $ts;
+        }        
+        if (strpos($format, '%') !== false) {
+            return strftime($format, $ts);
+        } else {
+            return date($format, $ts);
+        }        
+    }
+
+    /**
+     * @see ResultSet::getTimestamp()
+     */
+    public function getTimestamp($column, $format = 'Y-m-d H:i:s') 
+    {
+        $idx = (is_int($column) ? $column - 1 : $column);
+        if (!array_key_exists($idx, $this->fields)) { throw new SQLException("Invalid resultset column: " . $column); }
+        if ($this->fields[$idx] === null) { return null; }
+        
+        $ts = strtotime($this->fields[$idx]);
+        if ($ts === -1 || $ts === false) { // in PHP 5.1 return value changes to FALSE
+            throw new SQLException("Unable to convert value at column " . $column . " to timestamp: " . $this->fields[$idx]);
+        }
+        if ($format === null) {
+            return $ts;
+        }
+        if (strpos($format, '%') !== false) {
+            return strftime($format, $ts);
+        } else {
+            return date($format, $ts);
+        }        
+    }  
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/ResultSetCommon.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/StatementCommon.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/StatementCommon.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/StatementCommon.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,289 @@
+<?php
+/*
+ *  $Id: StatementCommon.php,v 1.4 2004/06/13 02:31:07 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * Class that contains common/shared functionality for Statements.
+ * 
+ * @author   Hans Lellelid <hans en xmpl.org>
+ * @version  $Revision: 1.4 $
+ * @package  creole.common
+ */
+abstract class StatementCommon {
+
+    /**
+     * The database connection.
+     * @var Connection
+     */ 
+    protected $conn;
+    
+    /**
+     * Temporarily hold a ResultSet object after an execute() query.
+     * @var ResultSet
+     */
+    protected $resultSet;
+
+    /**
+     * Temporary hold the affected row cound after an execute() query.
+     * @var int
+     */
+    protected $updateCount;
+    
+    /**
+     * Array of warning objects generated by methods performed on result set.
+     * @var array SQLWarning[]
+     */
+    protected $warnings = array();
+    
+    /** 
+     * The ResultSet class name.
+     * @var string
+     */
+    protected $resultClass;
+    
+    /**
+     * The prepared statement resource id.
+     * @var resource
+     */
+    protected $stmt;
+    
+    /**
+     * Max rows to retrieve from DB.
+     * @var int
+     */
+    protected $limit = 0;
+    
+    /**
+     * Offset at which to start processing DB rows.
+     * "Skip X rows"
+     * @var int
+     */
+    protected $offset = 0;
+    
+    /**
+     * Create new statement instance.
+     * 
+     * @param Connection $conn Connection object
+     */ 
+    function __construct(Connection $conn) 
+    {
+        $this->conn = $conn;        
+    }
+    
+    /**
+     * Sets the maximum number of rows to return from db.
+     * This will affect the SQL if the RDBMS supports native LIMIT; if not,
+     * it will be emulated.  Limit only applies to queries (not update sql).
+     * @param int $v Maximum number of rows or 0 for all rows.
+     * @return void
+     */
+    public function setLimit($v)
+    {
+        $this->limit = (int) $v;
+    }
+    
+    /**
+     * Returns the maximum number of rows to return or 0 for all.
+     * @return int
+     */
+    public function getLimit()
+    {
+        return $this->limit;
+    }
+    
+    /**
+     * Sets the start row.
+     * This will affect the SQL if the RDBMS supports native OFFSET; if not,
+     * it will be emulated. Offset only applies to queries (not update) and 
+     * only is evaluated when LIMIT is set!
+     * @param int $v
+     * @return void
+     */ 
+    public function setOffset($v)
+    {
+        $this->offset = (int) $v;
+    }
+    
+    /**
+     * Returns the start row.
+     * Offset only applies when Limit is set!
+     * @return int
+     */
+    public function getOffset()
+    {
+        return $this->offset;
+    }
+    
+    /**
+     * Free resources associated with this statement.
+     * Some drivers will need to implement this method to free
+     * database result resources. 
+     * 
+     * @return void
+     */
+    public function close()
+    {
+        // do nothing here (subclasses will implement)
+    }
+    
+    /**
+     * Generic execute() function has to check to see whether SQL is an update or select query.
+     * 
+     * If you already know whether it's a SELECT or an update (manipulating) SQL, then use
+     * the appropriate method, as this one will incurr overhead to check the SQL.
+     * 
+     * @param int $fetchmode Fetchmode (only applies to queries).
+     * @return boolean True if it is a result set, false if not or if no more results (this is identical to JDBC return val).
+     * @throws SQLException
+     * @todo -cStatementCommon Update execute() to not use isSelect() method, but rather to determine type based on returned results.
+     */
+    public function execute($sql, $fetchmode = null)
+    {
+        
+        if (!$this->isSelect($sql)) {                    
+            $this->updateCount = $this->executeUpdate($sql);
+            return false;
+        } else {
+            $this->resultSet = $this->executeQuery($sql, $fetchmode);
+            if ($this->resultSet->getRecordCount() === 0) {
+                return false;
+            }
+            return true;
+        }
+    }
+
+    /**
+     * Get result set.
+     * This assumes that the last thing done was an executeQuery() or an execute()
+     * with SELECT-type query.
+     *
+     * @return RestultSet (or null if none)
+     */
+    public function getResultSet()
+    {
+        return $this->resultSet;
+    }
+
+    /**
+     * Get update count.
+     *
+     * @return int Number of records affected, or <code>null</code> if not applicable.
+     */
+    public function getUpdateCount()
+    {
+        return $this->updateCount;
+    }
+        
+    /**
+     * Returns whether the passed SQL is a SELECT statement.
+     * 
+     * Returns true if SQL starts with 'SELECT' but not 'SELECT INTO'.  This exists
+     * to support the execute() function -- which could either execute an update or
+     * a query.
+     * 
+     * Currently this function does not take into consideration comments, primarily
+     * because there are a number of different comment options for different drivers:
+     * <pre>
+     *     -- SQL-defined comment, but not truly comment in Oracle
+     *  # comment in mysql
+     *  /* comment in mssql, others * /
+     *  // comment sometimes?
+     *  REM also comment ...
+     * </pre>
+     * 
+     * If you're wondering why we can't just execute the query and look at the return results
+     * to see whether it was an update or a select, the reason is that for update queries we
+     * need to do stuff before we execute them -- like start transactions if auto-commit is off.
+     * 
+     * @param string $sql
+     * @return boolean Whether statement is a SELECT SQL statement.
+     * @see execute()
+     */
+    protected function isSelect($sql)
+    {
+        // is first word is SELECT, then return true, unless it's SELECT INTO ...
+        // this doesn't, however, take comments into account ...
+        $sql = trim($sql);
+        return (stripos($sql, 'select') === 0 && stripos($sql, 'select into ') !== 0);
+    }
+
+    /**
+     * Executes the SQL query in this PreparedStatement object and returns the resultset generated by the query.
+     * 
+     * @param string $sql This method may optionally be called with the SQL statement.
+     * @param int $fetchmode The mode to use when fetching the results (e.g. ResultSet::FETCHMODE_NUM, ResultSet::FETCHMODE_ASSOC).
+     * @return object Creole::ResultSet
+     * @throws SQLException If there is an error executing the specified query.
+     * @todo -cStatementCommon Put native query execution logic in statement subclasses.
+     */
+    public function executeQuery($sql, $fetchmode = null)
+    {
+        $this->updateCount = null;
+        if ($this->limit > 0 || $this->offset > 0) {
+            $this->conn->applyLimit($sql, $this->offset, $this->limit);
+        }
+        $this->resultSet = $this->conn->executeQuery($sql, $fetchmode);
+        return $this->resultSet;
+    }
+
+    /**
+     * Executes the SQL INSERT, UPDATE, or DELETE statement in this PreparedStatement object.
+     * 
+     * @param string $sql This method may optionally be called with the SQL statement.
+     * @return int Number of affected rows (or 0 for drivers that return nothing).
+     * @throws SQLException if a database access error occurs.
+     */
+    public function executeUpdate($sql) 
+    {
+        if ($this->resultSet) $this->resultSet->close();
+        $this->resultSet = null;
+        $this->updateCount = $this->conn->executeUpdate($sql);
+        return $this->updateCount;
+    }
+    
+    /**
+     * Gets next result set (if this behavior is supported by driver).
+     * Some drivers (e.g. MSSQL) support returning multiple result sets -- e.g.
+     * from stored procedures.
+     *
+     * This function also closes any current restult set.
+     *
+     * Default behavior is for this function to return false.  Driver-specific
+     * implementations of this class can override this method if they actually
+     * support multiple result sets.
+     * 
+     * @return boolean True if there is another result set, otherwise false.
+     */
+    public function getMoreResults()
+    {
+        if ($this->resultSet) $this->resultSet->close();        
+        $this->resultSet = null;
+        return false;        
+    }
+     
+    /**
+     * Gets the db Connection that created this statement.
+     * @return Connection
+     */
+    public function getConnection()
+    {
+        return $this->conn;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/common/StatementCommon.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLCallableStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLCallableStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLCallableStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,478 @@
+<?php
+/*
+ *  $Id: MSSQLCallableStatement.php,v 1.20 2005/09/16 13:09:50 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/drivers/mssql/MSSQLPreparedStatement.php';
+require_once 'creole/CallableStatement.php';
+include_once 'creole/CreoleTypes.php';
+
+/**
+ * MS SQL Server class to handle stored procedure execution.
+ * 
+ * Developer note: 
+ *
+ *    There is no CallableStatement superclass.  Unlike JDBC, Creole
+ *    uses abstract parent classes rather than interfaces -- in order
+ *    to minimize code duplication.  Since PHP doesn't support multiple
+ *    inheritance, the DRIVERCallableStatement class cannot extend both
+ *    the DRIVERPreparedStatement class and the would-be abstract
+ *    CallableStatement class.
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 1.20 $
+ * @package creole.drivers.mssql
+ */
+class MSSQLCallableStatement extends MSSQLPreparedStatement implements CallableStatement {
+    
+    /** Output variables */
+    private $boundOutVars = array();
+    
+    /**
+     * Match Creole types to SQL Server types
+     * @var array
+     */
+    private static $typeMap = array(
+        CreoleTypes::BOOLEAN => SQLBIT,
+        CreoleTypes::BIGINT => SQLINT4,
+        CreoleTypes::SMALLINT => SQLINT2,
+        CreoleTypes::TINYINT => SQLINT2,
+        CreoleTypes::INTEGER => SQLINT4,
+        CreoleTypes::CHAR => SQLCHAR,
+        CreoleTypes::VARCHAR => SQLVARCHAR,
+        CreoleTypes::TEXT => SQLTEXT,
+        CreoleTypes::FLOAT => SQLFLT8,
+        CreoleTypes::DOUBLE => SQLFLT8,
+        CreoleTypes::DATE => SQLVARCHAR,
+        CreoleTypes::TIME => SQLVARCHAR,
+        CreoleTypes::TIMESTAMP => SQLVARCHAR,
+        CreoleTypes::VARBINARY => SQLVARCHAR,
+        CreoleTypes::NUMERIC => SQLINT4,
+        CreoleTypes::DECIMAL => SQLFLT8                                        
+    );
+    
+    /**
+     * Statement created by mssql_init()
+     * @var resource
+     */
+    private $stmt;
+
+
+    /**
+     * The result resource.
+     * @var resource
+     */
+    private $result;
+    
+    /**
+     * Construct new MSSQLCallableStatement.
+     * 
+     * @param Connection $conn
+     * @param resource $stmt
+     */
+    public function __construct(Connection $conn, $stmt)
+    {
+        print " - > IN CONSTRUCTOR \n";
+        $this->conn = $conn;
+        $this->stmt = $stmt;
+    }   
+    
+    /**
+     * @see CallableStatement::getResource()
+     */
+    public function getResource()
+    {
+        return $this->stmt;
+    }
+        
+    /**
+     * @see CallableStatement::close()
+     */
+    function close()
+    {
+        @mssql_free_statement($this->stmt);
+        $this->rsFetchCount = 0;
+    }
+    
+    /**
+     * @see CallableStatement::executeQuery()
+     */
+    function executeQuery($p1 = null, $fetchmode = null)
+    {
+        $params = null;
+        if ($fetchmode !== null) {
+            $params = $p1;
+        } elseif ($p1 !== null) {
+            if (is_array($p1)) $params = $p1;
+            else $fetchmode = $p1;
+        }
+        
+        if ($params) {
+            for($i=0,$cnt=count($params); $i < $cnt; $i++) {
+                $this->set($i+1, $params[$i]);
+            }
+        }                
+        
+        $this->result = mssql_execute($this->stmt);
+        if (!$this->result) {
+            throw new SQLException('unable to execute callable statement', mssql_get_last_message());
+        }
+        
+        return new MSSQLResultSet($this->conn, $this->result, $fetchmode, $this->offset, $this->limit);
+    }
+    
+    /**
+     * @see CallableStatement::getMoreResults()
+     */
+    function getMoreResults()
+    {
+        $this->rsFetchCount++; // we track this because 
+        $hasMore = mssql_next_result($this->result);
+        if ($this->resultSet) $this->resultSet->close();                    
+        if ($hasMore) {
+            $clazz = $this->resultClass;
+            $this->resultSet = new $clazz($this, $this->result);
+        } else {
+            $this->resultSet = null;
+        }
+        return $hasMore;
+    }
+
+    /**
+     * @see CallableStatement::registerOutParameter()
+     */
+    function registerOutParameter($paramIndex, $sqlType, $maxLength = null)
+    {
+        mssql_bind($this->stmt, $paramIndex, $this->boundOutVars[$paramIndex], self::$typeMap[$sqlType], true, false, $maxLength);
+    }
+    
+    /**
+     * @see CallableStatement::setArray()
+     */
+    function setArray($paramIndex, $value, $out = false) 
+    {
+        if ($out) $this->boundOutVars[$paramIndex] = &$value; // reference means that changes to value, will be reflected
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            $value = serialize($value);
+            mssql_bind($this->stmt, $paramIndex, $value, SQLTEXT, $out);
+        }
+    }
+
+    /**
+     * @see CallableStatement::setBoolean()
+     */
+    function setBoolean($paramIndex, $value, $out = false) 
+    {
+        if ($out) $this->boundOutVars[$paramIndex] = &$value; // reference means that changes to value, will be reflected        
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            $value = ($value) ? 1 : 0;
+            mssql_bind($this->stmt, $paramIndex, $value, SQLBIT, $out);
+        }
+    }
+    
+
+    /**
+     * @see CallableStatement::setBlob()
+     */
+    function setBlob($paramIndex, $blob, $out = false) 
+    {
+        if ($blob === null) {
+            $this->setNull($paramIndex);
+        } else {
+            if (is_object($blob)) {
+                $blob = $blob->__toString();
+            }
+            if ($out) $this->boundOutVars[$paramIndex] = &$blob; // reference means that changes to value, will be reflected        
+            $data = unpack("H*hex", $blob);
+            mssql_bind($this->stmt, $paramIndex, $data, SQLTEXT, $out);
+        }
+    } 
+    
+    /**
+     * @see CallableStatement::setClob()
+     */
+    function setClob($paramIndex, $clob, $out = false) 
+    {
+        if ($clob === null) {
+            $this->setNull($paramIndex);
+        } else {
+            if (is_object($clob)) {
+                $clob = $clob->__toString();
+            }
+            if ($out) $this->boundOutVars[$paramIndex] = &$clob; // reference means that changes to value, will be reflected
+            mssql_bind($this->stmt, $paramIndex, $clob, SQLTEXT, $out);
+        }
+    }
+
+    /**
+     * @see CallableStatement::setDate()
+     */
+    function setDate($paramIndex, $value, $out = false) 
+    {
+        if ($out) $this->boundOutVars[$paramIndex] = &$value; // reference means that changes to value, will be reflected
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            if (is_numeric($value)) $value = date("Y-m-d", $value);
+            mssql_bind($this->stmt, $paramIndex, $value, SQLVARCHAR, $out);
+        }
+    } 
+        
+    /**
+     * @see CallableStatement::setFloat()
+     */
+    function setFloat($paramIndex, $value, $out = false) 
+    {
+        if ($out) $this->boundOutVars[$paramIndex] = &$value; // reference means that changes to value, will be reflected
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            $value = (float) $value;
+            mssql_bind($this->stmt, $paramIndex, $value, SQLFLT8, $out);
+        }
+    }
+    
+    /**
+     * @see CallableStatement::setInt()
+     */
+    function setInt($paramIndex, $value, $out = false) 
+    {
+        if ($out) $this->boundOutVars[$paramIndex] = &$value; // reference means that changes to value, will be reflected
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            $value = (int) $value;
+            mssql_bind($this->stmt, $paramIndex, $value, SQLINT4, $out);
+        }
+    }    
+    
+    /**
+     * @see CallableStatement::setNull()
+     */
+    function setNull($paramIndex) 
+    {
+        // hopefully type isn't essential here :)
+        $value = null; // wants a var to pass by reference
+        mssql_bind($this->stmt, $paramIndex, $value, $type=null, $out=false, $is_null=true);
+    }
+
+    /**
+     * @see CallableStatement::setString()
+     */
+    function setString($paramIndex, $value, $out = false) 
+    {    
+        if ($out) $this->boundOutVars[$paramIndex] = &$value; // reference means that changes to value, will be reflected
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            $value = (string) $value;            
+            mssql_bind($this->stmt, $paramIndex, $value, SQLVARCHAR, $out);
+        }
+    } 
+    
+    /**
+     * @see CallableStatement::setTime()
+     */
+    function setTime($paramIndex, $value, $out = false) 
+    {    
+        if ($out) $this->boundOutVars[$paramIndex] = &$value; // reference means that changes to value, will be reflected
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            if (is_numeric($value)) $value = date("H:i:s", $value);
+            mssql_bind($this->stmt, $paramIndex, $value, SQLVARCHAR, $out);
+        }
+    }
+    
+    /**
+     * @see CallableStatement::setTimestamp()
+     */
+    function setTimestamp($paramIndex, $value, $out = false) 
+    {
+        if ($out) $this->boundOutVars[$paramIndex] = &$value; // reference means that changes to value, will be reflected
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            if (is_numeric($value)) $value = date('Y-m-d H:i:s', $value);
+            mssql_bind($this->stmt, $paramIndex, $value, SQLVARCHAR, $out);
+        }
+    }            
+        
+    /**
+     * @see CallableStatement::getArray()
+     */
+    function getArray($paramIndex) 
+    {
+        if (!array_key_exists($paramIndex, $this->boundOutVars)) {
+            throw new SQLException('Requesting variable not bound to output var: '.$paramIndex);
+        }
+        if ($this->boundOutVars[$paramIndex] === null) { return null; }
+        return (array) unserialize($this->boundOutVars[$paramIndex]);
+    } 
+
+    /**
+     * @see CallableStatement::getBoolean()
+     */
+    function getBoolean($paramIndex) 
+    {
+        if (!array_key_exists($paramIndex, $this->boundOutVars)) {
+            throw new SQLException('Requesting variable not bound to output var: '.$paramIndex);
+        }
+        if ($this->boundOutVars[$paramIndex] === null) { return null; }
+        return (boolean) $this->boundOutVars[$paramIndex];
+    }
+            
+    /**
+     * @see CallableStatement::getBlob()
+     */
+    function getBlob($paramIndex) 
+    {
+        if (!array_key_exists($paramIndex, $this->boundOutVars)) {
+            throw new SQLException('Requesting variable not bound to output var: '.$paramIndex);
+        }
+        if ($this->boundOutVars[$paramIndex] === null) { return null; }
+        require_once 'creole/util/Blob.php';
+        $b = new Blob();
+        $b->setContents($this->boundOutVars[$paramIndex]);
+        return $b;
+    }     
+
+    /**
+     * @see CallableStatement::getClob()
+     */
+    function getClob($paramIndex) 
+    {
+        if (!array_key_exists($paramIndex, $this->boundOutVars)) {
+            throw new SQLException('Requesting variable not bound to output var: '.$paramIndex);
+        }
+        if ($this->boundOutVars[$paramIndex] === null) { return null; }
+        require_once 'creole/util/Clob.php';
+        $c = new Clob();
+        $c->setContents($this->boundOutVars[$paramIndex]);
+        return $c;
+    } 
+    
+    /**
+     * @see CallableStatement::getDate()
+     */
+    function getDate($paramIndex, $fmt = '%Y-%m-%d') 
+    {
+        if (!array_key_exists($paramIndex, $this->boundOutVars)) {
+            throw new SQLException('Requesting variable not bound to output var: '.$paramIndex);
+        }
+        if ($this->boundOutVars[$paramIndex] === null) { return null; }
+        
+        $ts = strtotime($this->boundOutVars[$paramIndex]);        
+        if ($ts === -1 || $ts === false) { // in PHP 5.1 return value changes to FALSE
+            throw new SQLException("Unable to convert value at column " . $paramIndex . " to timestamp: " . $this->boundOutVars[$paramIndex]);
+        }        
+        if (strpos($format, '%') !== false) {
+            return strftime($format, $ts);
+        } else {
+            return date($format, $ts);
+        }
+        
+        return $this->boundOutVars[$paramIndex];
+    } 
+
+    /**
+     * @param mixed $paramIndex Column name (string) or index (int).
+     * @return float
+     */
+    function getFloat($paramIndex) 
+    {
+        if (!array_key_exists($paramIndex, $this->boundOutVars)) {
+            throw new SQLException('Requesting variable not bound to output var: '.$paramIndex);
+        }
+        if ($this->boundOutVars[$paramIndex] === null) { return null; }
+        return (float) $this->boundOutVars[$paramIndex];
+    }
+
+    /**
+     * @see CallableStatement::getInt()
+     */
+    function getInt($paramIndex) 
+    {
+        if (!array_key_exists($paramIndex, $this->boundOutVars)) {
+            throw new SQLException('Requesting variable not bound to output var: '.$paramIndex);
+        }
+        if ($this->boundOutVars[$paramIndex] === null) { return null; }
+        return (int) $this->boundOutVars[$paramIndex];
+    }            
+
+    /**
+     * @see CallableStatement::getString()
+     */
+    function getString($paramIndex) 
+    {
+        if (!array_key_exists($paramIndex, $this->boundOutVars)) {
+            throw new SQLException('Requesting variable not bound to output var: '.$paramIndex);
+        }
+        if ($this->boundOutVars[$paramIndex] === null) { return null; }
+        return (string) $this->boundOutVars[$paramIndex];
+    } 
+
+    /**
+     * @see CallableStatement::getTime()
+     */
+    function getTime($paramIndex, $format='%X') 
+    {
+        if (!array_key_exists($paramIndex, $this->boundOutVars)) {
+            throw new SQLException('Requesting variable not bound to output var: '.$paramIndex);
+        }
+        if ($this->boundOutVars[$paramIndex] === null) { return null; }
+        
+        $ts = strtotime($this->boundOutVars[$paramIndex]);        
+        if ($ts === -1  || $ts === false) { // in PHP 5.1 return value changes to FALSE
+            throw new SQLException("Unable to convert value at column " . $paramIndex . " to timestamp: " . $this->boundOutVars[$paramIndex]);
+        }        
+        if (strpos($format, '%') !== false) {
+            return strftime($format, $ts);
+        } else {
+            return date($format, $ts);
+        }
+            
+    }
+
+    /**
+     * @see CallableStatement::getTimestamp()
+     */
+    function getTimestamp($paramIndex, $format = 'Y-m-d H:i:s') 
+    {
+        if (!array_key_exists($paramIndex, $this->boundOutVars)) {
+            throw new SQLException('Requesting variable not bound to output var: '.$paramIndex);
+        }
+        if ($this->boundOutVars[$paramIndex] === null) { return null; }
+                
+        $ts = strtotime($this->boundOutVars[$paramIndex]);        
+        if ($ts === -1 || $ts === false) { // in PHP 5.1 return value changes to FALSE
+            throw new SQLException("Unable to convert value at column " . $paramIndex . " to timestamp: " . $this->boundOutVars[$paramIndex]);
+        }        
+        if (strpos($format, '%') !== false) {
+            return strftime($format, $ts);
+        } else {
+            return date($format, $ts);
+        }
+    }    
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLCallableStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLConnection.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLConnection.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLConnection.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,283 @@
+<?php
+
+/*
+ *  $Id: MSSQLConnection.php,v 1.25 2005/10/17 19:03:51 dlawson_mi Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+
+require_once 'creole/Connection.php';
+require_once 'creole/common/ConnectionCommon.php';
+include_once 'creole/drivers/mssql/MSSQLResultSet.php';
+
+/**
+ * MS SQL Server implementation of Connection.
+ * 
+ * If you have trouble with BLOB / CLOB support
+ * --------------------------------------------
+ * 
+ * You may need to change some PHP ini settings.  In particular, the following settings
+ * set the text size to maximum which should get around issues with truncated data:
+ * <code>
+ *  ini_set('mssql.textsize', 2147483647);
+ *  ini_set('mssql.textlimit', 2147483647);
+ * </code>
+ * We do not set these by default (anymore) because they do not apply to cases where MSSQL
+ * is being used w/ FreeTDS.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @author    Stig Bakken <ssb en fast.no> 
+ * @author    Lukas Smith
+ * @version   $Revision: 1.25 $
+ * @package   creole.drivers.mssql
+ */ 
+class MSSQLConnection extends ConnectionCommon implements Connection {        
+    
+    /** Current database (used in mssql_select_db()). */
+    private $database;
+    
+    /**
+     * @see Connection::connect()
+     */
+    function connect($dsninfo, $flags = 0)
+    {                
+        if (!extension_loaded('mssql') && !extension_loaded('sybase') && !extension_loaded('sybase_ct')) {
+            throw new SQLException('mssql extension not loaded');
+        }
+
+        $this->dsn = $dsninfo;
+        $this->flags = $flags;
+                
+        $persistent = ($flags & Creole::PERSISTENT === Creole::PERSISTENT);
+
+        $user = $dsninfo['username'];
+        $pw = $dsninfo['password'];
+        $dbhost = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'localhost';
+		
+		if (PHP_OS == "WINNT" || PHP_OS == "WIN32") {
+            $portDelimiter = ",";
+        } else {
+            $portDelimiter = ":";
+        }
+       
+        if(!empty($dsninfo['port'])) {
+                $dbhost .= $portDelimiter.$dsninfo['port'];
+        } else {
+                $dbhost .= $portDelimiter.'1433';
+        }
+		
+        $connect_function = $persistent ? 'mssql_pconnect' : 'mssql_connect';
+
+        if ($dbhost && $user && $pw) {
+            $conn = @$connect_function($dbhost, $user, $pw);
+        } elseif ($dbhost && $user) {
+            $conn = @$connect_function($dbhost, $user);
+        } else {
+            $conn = @$connect_function($dbhost);
+        }
+        if (!$conn) {
+            throw new SQLException('connect failed', mssql_get_last_message());
+        }
+        
+        if ($dsninfo['database']) {
+            if (!@mssql_select_db($dsninfo['database'], $conn)) {
+                throw new SQLException('No database selected');               
+            }
+            
+            $this->database = $dsninfo['database'];
+        }
+        
+        $this->dblink = $conn;        
+    }    
+    
+    /**
+     * @see Connection::getDatabaseInfo()
+     */
+    public function getDatabaseInfo()
+    {
+        require_once 'creole/drivers/mssql/metadata/MSSQLDatabaseInfo.php';
+        return new MSSQLDatabaseInfo($this);
+    }
+    
+     /**
+     * @see Connection::getIdGenerator()
+     */
+    public function getIdGenerator()
+    {
+        require_once 'creole/drivers/mssql/MSSQLIdGenerator.php';
+        return new MSSQLIdGenerator($this);
+    }
+    
+    /**
+     * @see Connection::prepareStatement()
+     */
+    public function prepareStatement($sql) 
+    {
+        require_once 'creole/drivers/mssql/MSSQLPreparedStatement.php';
+        return new MSSQLPreparedStatement($this, $sql);
+    }
+    
+    /**
+     * @see Connection::createStatement()
+     */
+    public function createStatement()
+    {
+        require_once 'creole/drivers/mssql/MSSQLStatement.php';
+        return new MSSQLStatement($this);
+    }
+    
+    /**
+     * Returns false since MSSQL doesn't support this method.
+     */
+    public function applyLimit(&$sql, $offset, $limit)
+    {
+        return false;
+    }
+    
+    /**
+     * @see Connection::close()
+     */
+    function close()
+    {
+        $ret = @mssql_close($this->dblink);
+        $this->dblink = null;
+        return $ret;
+    }
+    
+    /**
+     * @see Connection::executeQuery()
+     */
+    function executeQuery($sql, $fetchmode = null)
+    {            
+        $this->lastQuery = $sql;
+        if (!@mssql_select_db($this->database, $this->dblink)) {
+            throw new SQLException('No database selected');
+        }       
+        $result = @mssql_query($sql, $this->dblink);
+        if (!$result) {
+            throw new SQLException('Could not execute query', mssql_get_last_message());
+        }
+        return new MSSQLResultSet($this, $result, $fetchmode);
+    }
+
+    /**
+     * @see Connection::executeUpdate()
+     */
+    function executeUpdate($sql)
+    {    
+        
+        $this->lastQuery = $sql;
+        if (!mssql_select_db($this->database, $this->dblink)) {
+            throw new SQLException('No database selected');
+        }
+        
+        $result = @mssql_query($sql, $this->dblink);
+        if (!$result) {
+            throw new SQLException('Could not execute update', mssql_get_last_message(), $sql);
+        }
+        
+        return $this->getUpdateCount();
+    }
+
+    /**
+     * Start a database transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function beginTrans()
+    {
+        $result = @mssql_query('BEGIN TRAN', $this->dblink);
+        if (!$result) {
+            throw new SQLException('Could not begin transaction', mssql_get_last_message());
+        }
+    }
+    
+    /**
+     * Commit the current transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function commitTrans()
+    {
+        if (!@mssql_select_db($this->database, $this->dblink)) {
+            throw new SQLException('No database selected');
+        }
+        $result = @mssql_query('COMMIT TRAN', $this->dblink);
+        if (!$result) {
+            throw new SQLException('Could not commit transaction', mssql_get_last_message());
+        }
+    }
+
+    /**
+     * Roll back (undo) the current transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function rollbackTrans()
+    {
+        if (!@mssql_select_db($this->database, $this->dblink)) {            
+            throw new SQLException('no database selected');
+        }
+        $result = @mssql_query('ROLLBACK TRAN', $this->dblink);
+        if (!$result) {
+            throw new SQLException('Could not rollback transaction', mssql_get_last_message());
+        }
+    }
+
+    /**
+     * Gets the number of rows affected by the last query.
+     * if the last query was a select, returns 0.
+     *
+     * @return int Number of rows affected by the last query
+     * @throws SQLException
+     */
+    function getUpdateCount()
+    {       
+        $res = @mssql_query('select @@rowcount', $this->dblink);
+        if (!$res) {
+            throw new SQLException('Unable to get affected row count', mssql_get_last_message());
+        }
+        $ar = @mssql_fetch_row($res);
+        if (!$ar) {
+            $result = 0;
+        } else {
+            @mssql_free_result($res);
+            $result = $ar[0];
+        }
+        
+        return $result;
+    }          
+    
+    
+    /**
+     * Creates a CallableStatement object for calling database stored procedures.
+     * 
+     * @param string $sql
+     * @return CallableStatement
+     * @throws SQLException
+     */
+    function prepareCall($sql) 
+    {             
+        require_once 'creole/drivers/mssql/MSSQLCallableStatement.php';
+        $stmt = mssql_init($sql);
+        if (!$stmt) {
+            throw new SQLException('Unable to prepare statement', mssql_get_last_message(), $sql);
+        }
+        return new MSSQLCallableStatement($this, $stmt);
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLConnection.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLIdGenerator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLIdGenerator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLIdGenerator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,62 @@
+<?php
+
+require_once 'creole/IdGenerator.php';
+
+/**
+ * MSSQL IdGenerator implimenation.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.6 $
+ * @package   creole.drivers.mssql
+ */
+class MSSQLIdGenerator implements IdGenerator {
+    
+    /** Connection object that instantiated this class */
+    private $conn;
+
+    /**
+     * Creates a new IdGenerator class, saves passed connection for use
+     * later by getId() method.
+     * @param Connection $conn
+     */
+    public function __construct(Connection $conn)
+    {
+        $this->conn = $conn;
+    }
+    
+    /**
+     * @see IdGenerator::isBeforeInsert()
+     */
+    public function isBeforeInsert()
+    {
+        return false;
+    }    
+    
+    /**
+     * @see IdGenerator::isAfterInsert()
+     */
+    public function isAfterInsert()
+    {
+        return true;
+    }
+        
+    /**
+     * @see IdGenerator::getIdMethod()
+     */
+    public function getIdMethod()
+    {
+        return self::AUTOINCREMENT;
+    }
+    
+    /**
+     * @see IdGenerator::getId()
+     */
+    public function getId($unused = null)
+    {
+        $rs = $this->conn->executeQuery("SELECT SCOPE_IDENTITY()", ResultSet::FETCHMODE_NUM);
+        $rs->next();
+        return $rs->getInt(1);        
+    }
+    
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLIdGenerator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLPreparedStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLPreparedStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLPreparedStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,99 @@
+<?php
+/*
+ *  $Id: MSSQLPreparedStatement.php,v 1.13 2005/11/13 01:29:01 gamr Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/PreparedStatement.php';
+require_once 'creole/common/PreparedStatementCommon.php';
+
+/**
+ * MSSQL specific PreparedStatement functions.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.13 $
+ * @package   creole.drivers.mssql
+ */
+class MSSQLPreparedStatement extends PreparedStatementCommon implements PreparedStatement {
+    
+    /**
+     * MSSQL-specific implementation of setBlob().
+     * 
+     * If you are having trouble getting BLOB data into the database, see the phpdoc comment
+     * in the MSSQLConnection for some PHP ini values that may need to be set. (This also
+     * applies to CLOB support.)
+     * 
+     * @param int $paramIndex
+     * @param mixed $value Blob object or string.
+     * @return void
+     */
+    function setBlob($paramIndex, $blob) 
+    {
+    	$this->sql_cache_valid = false;
+        if ($blob === null) {
+            $this->setNull($paramIndex);
+        } else {
+            // they took magic __toString() out of PHP5.0.0; this sucks
+            if (is_object($blob)) {
+                $blob = $blob->__toString();
+            }            
+            $data = unpack("H*hex", $blob);
+            $this->boundInVars[$paramIndex] = '0x'.$data['hex']; // no surrounding quotes!
+        }        
+    }
+
+    
+    /**
+     * Add quotes using str_replace.
+     * This is not as thorough as MySQL.
+     */
+    protected function escape($subject)
+    {
+        // use this instead of magic_quotes_sybase + addslashes(),
+        // just in case multiple RDBMS being used at the same time
+        return str_replace("'", "''", $subject);
+    }
+    
+    /**
+     * MSSQL must emulate OFFSET/LIMIT support.
+     */
+    public function executeQuery($p1 = null, $fetchmode = null)
+    {    
+        $params = null;
+        if ($fetchmode !== null) {
+            $params = $p1;
+        } elseif ($p1 !== null) {
+            if (is_array($p1)) $params = $p1;
+            else $fetchmode = $p1;
+        }
+        
+        if ($params) {
+            for($i=0,$cnt=count($params); $i < $cnt; $i++) {
+                $this->set($i+1, $params[$i]);
+            }
+        }
+        
+        $this->updateCount = null; // reset
+        $sql = $this->replaceParams();                
+        
+        $this->resultSet = $this->conn->executeQuery($sql, $fetchmode);
+        $this->resultSet->_setOffset($this->offset);
+        $this->resultSet->_setLimit($this->limit);                
+        return $this->resultSet;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLPreparedStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLResultSet.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLResultSet.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLResultSet.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,159 @@
+<?php
+/*
+ *  $Id: MSSQLResultSet.php,v 1.21 2006/01/17 19:44:38 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/ResultSet.php';
+require_once 'creole/common/ResultSetCommon.php';
+
+/**
+ * MSSQL implementation of ResultSet.
+ *
+ * MS SQL does not support LIMIT or OFFSET natively so the methods
+ * in here need to perform some adjustments and extra checking to make sure
+ * that this behaves the same as RDBMS drivers using native OFFSET/LIMIT.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.21 $
+ * @package   creole.drivers.mssql
+ */
+class MSSQLResultSet extends ResultSetCommon implements ResultSet {    
+    
+    /**
+     * Offset at which to start reading rows.
+     * @var int
+     */
+    private $offset = 0;
+    
+    /**
+     * Maximum rows to retrieve, or 0 if all.
+     * @var int
+     */
+    private $limit = 0;   
+    
+    /**
+     * This MSSQL-only function exists to set offset after ResultSet is instantiated.
+     * This function should be "protected" in Java sense: only available to classes in package.
+     * THIS METHOD SHOULD NOT BE CALLED BY ANYTHING EXCEPTION DRIVER CLASSES.
+     * @param int $offset New offset.  If great than 0, then seek(0) will be called to move cursor.
+     * @access protected
+     */
+    public function _setOffset($offset)
+    {
+        $this->offset = $offset;
+        if ($offset > 0) {
+            $this->seek(0);  // 0 becomes $offset by seek() method
+        }
+    }
+    
+    /**
+     * This MSSQL-only function exists to set limit after ResultSet is instantiated.
+     * This function should be "protected" in Java sense: only available to classes in package.
+     * THIS METHOD SHOULD NOT BE CALLED BY ANYTHING EXCEPTION DRIVER CLASSES.
+     * @param int $limit New limit.
+     * @access protected
+     */
+    public function _setLimit($limit)
+    {
+        $this->limit = $limit;
+    }
+    
+    /**
+     * @see ResultSet::seek()
+     */ 
+    function seek($rownum)
+    {
+        // support emulated OFFSET
+        $actual = $rownum + $this->offset;
+        
+        if (($this->limit > 0 && $rownum >= $this->limit) || $rownum < 0) {
+                    // have to check for rownum < 0, because mssql_seek() won't
+                    // complain if the $actual is valid.
+            return false;
+        }
+                
+        // MSSQL rows start w/ 0, but this works, because we are
+        // looking to move the position _before_ the next desired position
+         if (!@mssql_data_seek($this->result, $actual)) {
+                return false;
+        }
+
+        $this->cursorPos = $rownum;
+        return true;
+    }
+    
+    /**
+     * @see ResultSet::next()
+     */
+    function next()
+    {
+        // support emulated LIMIT
+        if ( $this->limit > 0 && ($this->cursorPos >= $this->limit) ) {
+            $this->afterLast();
+            return false;
+        }
+        
+        $this->fields = mssql_fetch_array($this->result, $this->fetchmode);        
+                
+        if (!$this->fields) {
+            if ($errmsg = mssql_get_last_message()) {
+                throw new SQLException("Error fetching result", $errmsg);
+             } else {
+                // We've advanced beyond end of recordset.
+                $this->afterLast();
+                return false;
+             }          
+        }
+        
+        if ($this->fetchmode === ResultSet::FETCHMODE_ASSOC && $this->lowerAssocCase) {
+            $this->fields = array_change_key_case($this->fields, CASE_LOWER);
+        }
+        
+        // Advance cursor position
+        $this->cursorPos++;
+        return true;
+    }
+    
+    /**
+     * @see ResultSet::getRecordCount()
+     */
+    function getRecordCount()
+    {
+        $rows = @mssql_num_rows($this->result);
+        if ($rows === null) {
+            throw new SQLException('Error getting record count', mssql_get_last_message());
+        }
+        // adjust count based on emulated LIMIT/OFFSET
+        $rows -= $this->offset;
+        return ($this->limit > 0 && $rows > $this->limit ? $this->limit : $rows);
+    }
+
+    /**
+     * @see ResultSet::close()
+     */ 
+    function close()
+    {
+        $ret = @mssql_free_result($this->result);
+        $this->result = false;
+        $this->fields = array();
+        $this->limit = 0;
+        $this->offset = 0;        
+    }   
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLResultSet.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,72 @@
+<?php
+/*
+ *  $Id: MSSQLStatement.php,v 1.4 2004/06/13 02:31:07 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/common/StatementCommon.php';
+require_once 'creole/Statement.php';
+
+/**
+ * Class that contains MSSQL functionality for Statements.
+ * 
+ * @author   Hans Lellelid <hans en xmpl.org>
+ * @version  $Revision: 1.4 $
+ * @package  creole.drivers.mssql
+ */
+class MSSQLStatement extends StatementCommon implements Statement {
+    
+    /**
+     * Executes the SQL query in this PreparedStatement object and returns the resultset generated by the query.
+     * 
+     * @param string $sql This method may optionally be called with the SQL statement.
+     * @param int $fetchmode The mode to use when fetching the results (e.g. ResultSet::FETCHMODE_NUM, ResultSet::FETCHMODE_ASSOC).
+     * @return object Creole::ResultSet
+     * @throws SQLException If there is an error executing the specified query.
+     */
+    public function executeQuery($sql, $fetchmode = null)
+    {
+        $this->updateCount = null;                
+        $this->resultSet = $this->conn->executeQuery($sql, $fetchmode);
+        $this->resultSet->_setOffset($this->offset);
+        $this->resultSet->_setLimit($this->limit);
+        return $this->resultSet;
+    }
+
+
+    /**
+     * Gets next result set (if this behavior is supported by driver).
+     * Some drivers (e.g. MSSQL) support returning multiple result sets -- e.g.
+     * from stored procedures.
+     *
+     * This function also closes any current restult set.
+     *
+     * Default behavior is for this function to return false.  Driver-specific
+     * implementations of this class can override this method if they actually
+     * support multiple result sets.
+     * 
+     * @return boolean True if there is another result set, otherwise false.
+     */
+    public function getMoreResults()
+    {
+        if ($this->resultSet) $this->resultSet->close();        
+        $this->resultSet = null;
+        return false;        
+    }
+         
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLTypes.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLTypes.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLTypes.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,94 @@
+<?php
+
+/*
+ *  $Id: MSSQLTypes.php,v 1.8 2004/07/27 23:16:50 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/CreoleTypes.php';
+
+/**
+ * MSSQL types / type map.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.8 $
+ * @package   creole.drivers.mssql
+ */
+class MSSQLTypes extends CreoleTypes {
+
+    /** Map PostgreSQL native types to Creole (JDBC) types. */
+    private static $typeMap = array (
+                "binary" => CreoleTypes::BINARY,
+                "bit" => CreoleTypes::BOOLEAN, 
+                "char" => CreoleTypes::CHAR,
+                "datetime" => CreoleTypes::TIMESTAMP,
+                "decimal() identity"  => CreoleTypes::DECIMAL,
+                "decimal"  => CreoleTypes::DECIMAL,                
+                "image" => CreoleTypes::LONGVARBINARY,
+                "int" => CreoleTypes::INTEGER,
+                "int identity" => CreoleTypes::INTEGER,
+                "integer" => CreoleTypes::INTEGER,
+                "money" => CreoleTypes::DECIMAL, 
+                "nchar" => CreoleTypes::CHAR, 
+                "ntext" => CreoleTypes::LONGVARCHAR, 
+                "numeric() identity" => CreoleTypes::NUMERIC,
+                "numeric" => CreoleTypes::NUMERIC,                  
+                "nvarchar" => CreoleTypes::VARCHAR,
+                "real" => CreoleTypes::REAL, 
+                "float" => CreoleTypes::FLOAT,
+                "smalldatetime" => CreoleTypes::TIMESTAMP, 
+                "smallint" => CreoleTypes::SMALLINT, 
+                "smallint identity" => CreoleTypes::SMALLINT,
+                "smallmoney" => CreoleTypes::DECIMAL,
+                "sysname" => CreoleTypes::VARCHAR,
+                "text" => CreoleTypes::LONGVARCHAR,
+                "timestamp" => CreoleTypes::BINARY,
+                "tinyint identity" => CreoleTypes::TINYINT, 
+                "tinyint" => CreoleTypes::TINYINT,                 
+                "uniqueidentifier" => CreoleTypes::CHAR,
+                "varbinary" => CreoleTypes::VARBINARY,
+                "varchar" => CreoleTypes::VARCHAR,
+                "uniqueidentifier" => CreoleTypes::CHAR,
+                // SQL Server 2000 only
+                "bigint identity" => CreoleTypes::BIGINT,
+                "bigint" => CreoleTypes::BIGINT,                
+                "sql_variant" => CreoleTypes::VARCHAR,
+                ); 
+                 
+    /** Reverse lookup map, created on demand. */
+    private static $reverseMap = null;
+    
+    public static function getType($mssqlType)
+    {    
+        $t = strtolower($mssqlType);
+        if (isset(self::$typeMap[$t])) {
+            return self::$typeMap[$t];
+        } else {
+            return CreoleTypes::OTHER;
+        }
+    }
+    
+    public static function getNativeType($creoleType)
+    {
+        if (self::$reverseMap === null) {
+            self::$reverseMap = array_flip(self::$typeMap);
+        }
+        return @self::$reverseMap[$creoleType];
+    }
+    
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/MSSQLTypes.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/metadata/MSSQLDatabaseInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/metadata/MSSQLDatabaseInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/metadata/MSSQLDatabaseInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,69 @@
+<?php
+/*
+ *  $Id: MSSQLDatabaseInfo.php,v 1.11 2006/01/17 19:44:39 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/metadata/DatabaseInfo.php';
+
+/**
+ * MSSQL impementation of DatabaseInfo.
+ *
+ * @author    Hans Lellelid
+ * @version   $Revision: 1.11 $
+ * @package   creole.drivers.mssql.metadata
+ */ 
+class MSSQLDatabaseInfo extends DatabaseInfo {
+    
+    /**
+     * @throws SQLException
+     * @return void
+     */
+    protected function initTables()
+    {
+        include_once 'creole/drivers/mssql/metadata/MSSQLTableInfo.php';
+        
+        $dsn = $this->conn->getDSN();
+        
+        
+        if (!@mssql_select_db($this->dbname, $this->conn->getResource())) {
+            throw new SQLException('No database selected');
+        }
+             
+        $result = mssql_query("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME <> 'dtproperties'", $this->conn->getResource());
+    
+        if (!$result) {
+            throw new SQLException("Could not list tables", mssql_get_last_message());            
+        }
+        
+        while ($row = mssql_fetch_row($result)) {
+            $this->tables[strtoupper($row[0])] = new MSSQLTableInfo($this, $row[0]);            
+        }
+    }            
+    
+    /**
+     * 
+     * @return void 
+     * @throws SQLException
+     */
+    protected function initSequences()
+    {
+        // there are no sequences -- afaik -- in MSSQL.
+    }
+        
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/metadata/MSSQLDatabaseInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/metadata/MSSQLTableInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/metadata/MSSQLTableInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/metadata/MSSQLTableInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,183 @@
+<?php
+/*
+ *  $Id: MSSQLTableInfo.php,v 1.14 2006/01/17 19:44:39 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/CreoleTypes.php';
+require_once 'creole/metadata/TableInfo.php';
+
+/**
+ * MSSQL implementation of TableInfo.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.14 $
+ * @package   creole.drivers.mssql.metadata
+ */
+class MSSQLTableInfo extends TableInfo {    
+    
+    /**
+     * Loads the columns for this table.
+     * @return void
+     */                          
+    protected function initColumns() 
+    {    
+        include_once 'creole/metadata/ColumnInfo.php';
+        include_once 'creole/drivers/mssql/MSSQLTypes.php';
+        
+        if (!@mssql_select_db($this->dbname, $this->conn->getResource())) {
+            throw new SQLException('No database selected');
+        }
+         
+        $res = mssql_query("sp_columns ".$this->name, $this->conn->getResource());
+        if (!$res) {
+            throw new SQLException('Could not get column names', mssql_get_last_message());
+        }
+        
+        while ($row = mssql_fetch_array($res)) {
+            $name = $row['COLUMN_NAME'];
+            $type = $row['TYPE_NAME'];
+            $length = $row['LENGTH'];
+            $is_nullable = $row['NULLABLE'];
+            $default = $row['COLUMN_DEF'];
+            $precision = $row['PRECISION'];
+            $scale = $row['SCALE'];
+			$identity = false;
+			if (strtolower($type) == "int identity") {
+			    $identity = true;
+			}
+            $this->columns[$name] = new ColumnInfo($this, $name, MSSQLTypes::getType($type), $type, $length, $precision, $scale, $is_nullable, $default, $identity);
+        }
+                
+        $this->colsLoaded = true;
+    }
+
+    /**
+     * Loads the indexes for this table.
+     * @return void
+     */      
+    protected function initIndexes()
+    {
+        // columns have to be loaded first
+        if (!$this->colsLoaded) $this->initColumns();
+        include_once 'creole/metadata/IndexInfo.php';
+        
+        if (!@mssql_select_db($this->dbname, $this->conn->getResource())) {
+            throw new SQLException('No database selected');
+        } 
+        
+        $res = mssql_query("sp_indexes_rowset ".$this->name, $this->conn->getResource());
+        
+        while ($row = mssql_fetch_array($res)) {
+            $name = $row['INDEX_NAME'];            
+            // All primary keys are indexes (right...?)
+            if (!isset($this->indexes[$name])) {
+                $this->indexes[$name] = new IndexInfo($name);
+            }
+            $this->indexes[$name]->addColumn($this->columns[ $row['COLUMN_NAME'] ]);
+        }
+        
+        $this->indexesLoaded = true;        
+    }
+
+    /**
+     * Loads the foreign keys for this table.
+     * @return void
+     */      
+    protected function initForeignKeys()
+    {
+        // columns have to be loaded first
+        if (!$this->colsLoaded) $this->initColumns();
+        include_once 'creole/metadata/ForeignKeyInfo.php';
+        
+        if (!@mssql_select_db($this->dbname, $this->conn->getResource())) {
+            throw new SQLException('No database selected');
+        } 
+        
+        $res = mssql_query("SELECT     ccu1.TABLE_NAME, ccu1.COLUMN_NAME, ccu2.TABLE_NAME AS FK_TABLE_NAME, ccu2.COLUMN_NAME AS FK_COLUMN_NAME
+                            FROM         INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu1 INNER JOIN
+                                      INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc1 ON tc1.CONSTRAINT_NAME = ccu1.CONSTRAINT_NAME AND 
+                                      CONSTRAINT_TYPE = 'Foreign Key' INNER JOIN
+                                      INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1 ON rc1.CONSTRAINT_NAME = tc1.CONSTRAINT_NAME INNER JOIN
+                                      INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu2 ON ccu2.CONSTRAINT_NAME = rc1.UNIQUE_CONSTRAINT_NAME
+                            WHERE     (ccu1.table_name = '".$this->name."')", $this->conn->getResource());
+        
+        while($row = mssql_fetch_array($res)) {
+            $name = $row['COLUMN_NAME'];
+            $ftbl = $row['FK_TABLE_NAME'];
+            $fcol = $row['FK_COLUMN_NAME'];
+
+            if (!isset($this->foreignKeys[$name])) {
+                $this->foreignKeys[$name] = new ForeignKeyInfo($name);
+
+                if ($this->database->hasTable($ftbl)) {
+                    $foreignTable = $this->database->getTable($ftbl);
+                } else {                
+                    $foreignTable = new TableInfo($ltbl);
+                    $this->database->addTable($foreignTable);
+                }
+
+                if ($foreignTable->hasColumn($fcol)) {
+                    $foreignCol = $foreignTable->getColumn($fcol);
+                } else {                
+                    $foreignCol = new ColumnInfo($foreignTable, $fcol);
+                    $foreignTable->addColumn($foreignCol);
+                }
+                                
+                $this->foreignKeys[$name]->addReference($this->columns[$name], $foreignCol);
+            }
+        }
+        
+        $this->fksLoaded = true;
+    }
+
+    /**
+     * Loads the primary key info for this table.
+     * @return void
+     */      
+    protected function initPrimaryKey()
+    {
+        // columns have to be loaded first
+        if (!$this->colsLoaded) $this->initColumns();
+        include_once 'creole/metadata/PrimaryKeyInfo.php';
+        
+        if (!@mssql_select_db($this->dbname, $this->conn->getResource())) {
+            throw new SQLException('No database selected');
+        } 
+        
+        $res = mssql_query("SELECT COLUMN_NAME 
+                        FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
+                                INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ON 
+                      INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_NAME = INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE.constraint_name
+                        WHERE     (INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'PRIMARY KEY') AND 
+                      (INFORMATION_SCHEMA.TABLE_CONSTRAINTS.TABLE_NAME = '".$this->name."')", $this->conn->getResource());
+        
+        // Loop through the returned results, grouping the same key_name together.
+        // name of the primary key will be the first column name in the key.
+        while($row = mssql_fetch_row($res)) {
+            $name = $row[0];            
+            if (!isset($this->primaryKey)) {
+                $this->primaryKey = new PrimaryKeyInfo($name);
+            }
+            $this->primaryKey->addColumn($this->columns[ $name ]);
+        }        
+        
+        $this->pkLoaded = true;
+    }    
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mssql/metadata/MSSQLTableInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLConnection.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLConnection.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLConnection.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,290 @@
+<?php
+/*
+ *  $Id: MySQLConnection.php,v 1.18 2004/09/01 14:00:28 dlawson_mi Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/Connection.php';
+require_once 'creole/common/ConnectionCommon.php';
+include_once 'creole/drivers/mysql/MySQLResultSet.php';
+
+/**
+ * MySQL implementation of Connection.
+ * 
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @author    Stig Bakken <ssb en fast.no> 
+ * @author    Lukas Smith
+ * @version   $Revision: 1.18 $
+ * @package   creole.drivers.mysql
+ */ 
+class MySQLConnection extends ConnectionCommon implements Connection {
+
+    /** Current database (used in mysql_select_db()). */
+    private $database;
+    
+    /**
+     * Connect to a database and log in as the specified user.
+     *
+     * @param $dsn the data source name (see DB::parseDSN for syntax)
+     * @param $flags Any conneciton flags.
+     * @access public
+     * @throws SQLException
+     * @return void
+     */
+    function connect($dsninfo, $flags = 0)
+    {
+        if (!extension_loaded('mysql')) {
+            throw new SQLException('mysql extension not loaded');
+        }
+
+        $this->dsn = $dsninfo;
+        $this->flags = $flags;
+        
+        $persistent = ($flags & Creole::PERSISTENT) === Creole::PERSISTENT;
+
+        if (isset($dsninfo['protocol']) && $dsninfo['protocol'] == 'unix') {
+            $dbhost = ':' . $dsninfo['socket'];
+        } else {
+            $dbhost = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'localhost';
+            if (!empty($dsninfo['port'])) {
+                $dbhost .= ':' . $dsninfo['port'];
+            }
+        }
+        $user = $dsninfo['username'];
+        $pw = $dsninfo['password'];
+        
+		$encoding = !empty($dsninfo['encoding']) ? $dsninfo['encoding'] : null;
+		
+        $connect_function = $persistent ? 'mysql_pconnect' : 'mysql_connect';
+
+        @ini_set('track_errors', true);
+        if ($dbhost && $user && $pw) {
+            $conn = @$connect_function($dbhost, $user, $pw);
+        } elseif ($dbhost && $user) {
+            $conn = @$connect_function($dbhost, $user);
+        } elseif ($dbhost) {
+            $conn = @$connect_function($dbhost);
+        } else {
+            $conn = false;
+        }
+        @ini_restore('track_errors');
+        if (empty($conn)) {
+            if (($err = @mysql_error()) != '') {
+                throw new SQLException("connect failed", $err);
+            } elseif (empty($php_errormsg)) {
+                throw new SQLException("connect failed");
+            } else {
+                throw new SQLException("connect failed", $php_errormsg);
+            }
+        }
+
+        if ($dsninfo['database']) {
+            if (!@mysql_select_db($dsninfo['database'], $conn)) {
+               switch(mysql_errno($conn)) {
+                        case 1049:
+                            $exc = new SQLException("no such database", mysql_error($conn));         
+                        break;
+                        case 1044:
+                            $exc = new SQLException("access violation", mysql_error($conn));
+                        break;
+                        default:
+                           $exc = new SQLException("cannot select database", mysql_error($conn));
+                }
+                
+                throw $exc;
+                
+            }
+            // fix to allow calls to different databases in the same script
+            $this->database = $dsninfo['database'];
+        }
+
+        $this->dblink = $conn;
+        
+        if ($encoding) {
+			$this->executeUpdate("SET NAMES " . $encoding);
+		}
+    }    
+    
+    /**
+     * @see Connection::getDatabaseInfo()
+     */
+    public function getDatabaseInfo()
+    {
+        require_once 'creole/drivers/mysql/metadata/MySQLDatabaseInfo.php';
+        return new MySQLDatabaseInfo($this);
+    }
+    
+    /**
+     * @see Connection::getIdGenerator()
+     */
+    public function getIdGenerator()
+    {
+        require_once 'creole/drivers/mysql/MySQLIdGenerator.php';
+        return new MySQLIdGenerator($this);
+    }
+    
+    /**
+     * @see Connection::prepareStatement()
+     */
+    public function prepareStatement($sql) 
+    {
+        require_once 'creole/drivers/mysql/MySQLPreparedStatement.php';
+        return new MySQLPreparedStatement($this, $sql);
+    }
+    
+    /**
+     * @see Connection::prepareCall()
+     */
+    public function prepareCall($sql) {
+        throw new SQLException('MySQL does not support stored procedures.');
+    }
+    
+    /**
+     * @see Connection::createStatement()
+     */
+    public function createStatement()
+    {
+        require_once 'creole/drivers/mysql/MySQLStatement.php';
+        return new MySQLStatement($this);
+    }
+        
+    /**
+     * @see Connection::disconnect()
+     */
+    function close()
+    {
+        $ret = mysql_close($this->dblink);
+        $this->dblink = null;
+        return $ret;
+    }
+    
+    /**
+     * @see Connection::applyLimit()
+     */
+    public function applyLimit(&$sql, $offset, $limit)
+    {
+        if ( $limit > 0 ) {
+            $sql .= " LIMIT " . ($offset > 0 ? $offset . ", " : "") . $limit;
+        } else if ( $offset > 0 ) {
+            $sql .= " LIMIT " . $offset . ", 18446744073709551615";
+        }
+    }
+
+    /**
+     * @see Connection::executeQuery()
+     */
+    function executeQuery($sql, $fetchmode = null)
+    {
+        $this->lastQuery = $sql;
+        if ($this->database) {
+            if (!@mysql_select_db($this->database, $this->dblink)) {
+                throw new SQLException('No database selected', mysql_error($this->dblink));
+            }
+        }
+        $result = @mysql_query($sql, $this->dblink);
+        if (!$result) {
+            throw new SQLException('Could not execute query', mysql_error($this->dblink), $sql);
+        }
+        return new MySQLResultSet($this, $result, $fetchmode);
+    }
+    
+    /**
+     * @see Connection::executeUpdate()
+     */
+    function executeUpdate($sql)
+    {    
+        $this->lastQuery = $sql;
+
+        if ($this->database) {
+            if (!@mysql_select_db($this->database, $this->dblink)) {
+                    throw new SQLException('No database selected', mysql_error($this->dblink));
+            }
+        }
+        
+        $result = @mysql_query($sql, $this->dblink);
+        if (!$result) {
+            throw new SQLException('Could not execute update', mysql_error($this->dblink), $sql);
+        }        
+        return (int) mysql_affected_rows($this->dblink);
+    }
+
+    /**
+     * Start a database transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function beginTrans()
+    {
+        $result = @mysql_query('SET AUTOCOMMIT=0', $this->dblink);
+        $result = @mysql_query('BEGIN', $this->dblink);
+        if (!$result) {
+            throw new SQLException('Could not begin transaction', mysql_error($this->dblink));
+        }
+    }
+        
+    /**
+     * Commit the current transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function commitTrans()
+    {
+        if ($this->database) {
+            if (!@mysql_select_db($this->database, $this->dblink)) {
+                 throw new SQLException('No database selected', mysql_error($this->dblink));
+            }
+        }
+        $result = @mysql_query('COMMIT', $this->dblink);
+        $result = @mysql_query('SET AUTOCOMMIT=1', $this->dblink);
+        if (!$result) {
+            throw new SQLException('Can not commit transaction', mysql_error($this->dblink));                
+        }
+    }
+
+    /**
+     * Roll back (undo) the current transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function rollbackTrans()
+    {
+        if ($this->database) {
+            if (!@mysql_select_db($this->database, $this->dblink)) {
+                throw new SQLException('No database selected', mysql_error($this->dblink));
+            }
+        }
+        $result = @mysql_query('ROLLBACK', $this->dblink);
+        $result = @mysql_query('SET AUTOCOMMIT=1', $this->dblink);
+        if (!$result) {
+            throw new SQLException('Could not rollback transaction', mysql_error($this->dblink));
+        }
+    }
+
+    /**
+     * Gets the number of rows affected by the data manipulation
+     * query.
+     *
+     * @return int Number of rows affected by the last query.
+     */
+    function getUpdateCount()
+    {
+        return (int) @mysql_affected_rows($this->dblink);
+    }
+    
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLConnection.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLIdGenerator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLIdGenerator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLIdGenerator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,75 @@
+<?php
+
+require_once 'creole/IdGenerator.php';
+
+/**
+ * MySQL IdGenerator implimenation.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.6 $
+ * @package   creole.drivers.mysql
+ */
+class MySQLIdGenerator implements IdGenerator {
+    
+    /** Connection object that instantiated this class */
+    private $conn;
+
+    /**
+     * Creates a new IdGenerator class, saves passed connection for use
+     * later by getId() method.
+     * @param Connection $conn
+     */
+    public function __construct(Connection $conn)
+    {
+        $this->conn = $conn;
+    }
+    
+    /**
+     * @see IdGenerator::isBeforeInsert()
+     */
+    public function isBeforeInsert()
+    {
+        return false;
+    }    
+    
+    /**
+     * @see IdGenerator::isAfterInsert()
+     */
+    public function isAfterInsert()
+    {
+        return true;
+    }
+        
+    /**
+     * @see IdGenerator::getIdMethod()
+     */
+    public function getIdMethod()
+    {
+        return self::AUTOINCREMENT;
+    }
+    
+    /**
+     * Returns last-generated auto-increment ID.
+     * 
+     * Note that for very large values (2,147,483,648 to 9,223,372,036,854,775,807) a string
+     * will be returned, because these numbers are larger than supported by PHP's native
+     * numeric datatypes.
+     * 
+     * @see IdGenerator::getId()
+     */
+    public function getId($unused = null)
+    {
+        $insert_id = mysql_insert_id($this->conn->getResource());
+        if ( $insert_id < 0 ) {
+            $insert_id = null;
+            $result = mysql_query('SELECT LAST_INSERT_ID()', $this->conn->getResource());
+            if ( $result ) {
+                $row = mysql_fetch_row($result);
+                $insert_id = $row ? $row[0] : null;
+            }
+        }
+        return $insert_id;
+    }
+    
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLIdGenerator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLPreparedStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLPreparedStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLPreparedStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,44 @@
+<?php
+/*
+ *  $Id: MySQLPreparedStatement.php,v 1.7 2005/12/10 13:46:55 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/PreparedStatement.php';
+require_once 'creole/common/PreparedStatementCommon.php';
+
+/**
+ * MySQL subclass for prepared statements.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.7 $
+ * @package   creole.drivers.mysql
+ */
+class MySQLPreparedStatement extends PreparedStatementCommon implements PreparedStatement {        
+    
+    /**
+     * Quotes string using native mysql function (mysql_real_escape_string()).
+     * @param string $str
+     * @return string
+     */
+    protected function escape($str)
+    {
+        return mysql_real_escape_string($str, $this->conn->getResource());
+    }    
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLPreparedStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLResultSet.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLResultSet.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLResultSet.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,149 @@
+<?php
+/*
+ *  $Id: MySQLResultSet.php,v 1.24 2006/01/17 19:44:39 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/ResultSet.php';
+require_once 'creole/common/ResultSetCommon.php';
+
+/**
+ * MySQL implementation of ResultSet class.
+ *
+ * MySQL supports OFFSET / LIMIT natively; this means that no adjustments or checking
+ * are performed.  We will assume that if the lmitSQL() operation failed that an
+ * exception was thrown, and that OFFSET/LIMIT will never be emulated for MySQL.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.24 $
+ * @package   creole.drivers.mysql
+ */
+class MySQLResultSet extends ResultSetCommon implements ResultSet {
+
+    /**
+     * @see ResultSet::seek()
+     */ 
+    public function seek($rownum)
+    {
+        // MySQL rows start w/ 0, but this works, because we are
+        // looking to move the position _before_ the next desired position
+         if (!@mysql_data_seek($this->result, $rownum)) {
+                return false;
+        }
+        $this->cursorPos = $rownum;
+        return true;
+    }
+    
+    /**
+     * @see ResultSet::next()
+     */ 
+    public function next()
+    {
+        $this->fields = mysql_fetch_array($this->result, $this->fetchmode);        
+
+           if (!$this->fields) {
+            $errno = mysql_errno($this->conn->getResource());
+            if (!$errno) {
+                // We've advanced beyond end of recordset.
+                $this->afterLast();
+                return false;
+            } else {
+                throw new SQLException("Error fetching result", mysql_error($this->conn->getResource()));
+            }
+        }
+        
+        if ($this->fetchmode === ResultSet::FETCHMODE_ASSOC && $this->lowerAssocCase) {
+            $this->fields = array_change_key_case($this->fields, CASE_LOWER);
+        }
+        
+        // Advance cursor position
+        $this->cursorPos++;                
+        return true;
+    }
+
+    /**
+     * @see ResultSet::getRecordCount()
+     */
+    function getRecordCount()
+    {
+        $rows = @mysql_num_rows($this->result);
+        if ($rows === null) {
+            throw new SQLException("Error fetching num rows", mysql_error($this->conn->getResource()));
+        }
+        return (int) $rows;
+    }
+
+    /**
+     * @see ResultSet::close()
+     */ 
+    function close()
+    {        
+        if(is_resource($this->result))
+            @mysql_free_result($this->result);
+        $this->fields = array();
+    }    
+        
+    /**
+     * Get string version of column.
+     * No rtrim() necessary for MySQL, as this happens natively.
+     * @see ResultSet::getString()
+     */
+    public function getString($column) 
+    {
+        $idx = (is_int($column) ? $column - 1 : $column);
+        if (!array_key_exists($idx, $this->fields)) { throw new SQLException("Invalid resultset column: " . $column); }
+        if ($this->fields[$idx] === null) { return null; }
+        return (string) $this->fields[$idx];
+    }
+    
+    /**
+     * Returns a unix epoch timestamp based on either a TIMESTAMP or DATETIME field.
+     * @param mixed $column Column name (string) or index (int) starting with 1.
+     * @return string
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    function getTimestamp($column, $format='Y-m-d H:i:s') 
+    {
+        if (is_int($column)) { $column--; } // because Java convention is to start at 1 
+        if (!array_key_exists($column, $this->fields)) { throw new SQLException("Invalid resultset column: " . (is_int($column) ? $column + 1 : $column)); }
+        if ($this->fields[$column] === null) { return null; }
+        
+        $ts = strtotime($this->fields[$column]);
+        if ($ts === -1 || $ts === false) { // in PHP 5.1 return value changes to FALSE
+            // otherwise it's an ugly MySQL timestamp!
+            // YYYYMMDDHHMMSS
+            if (preg_match('/([\d]{4})([\d]{2})([\d]{2})([\d]{2})([\d]{2})([\d]{2})/', $this->fields[$column], $matches)) {
+                //              YYYY      MM        DD      HH        MM       SS
+                //                $1        $2          $3      $4        $5         $6
+                $ts = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);        
+            }
+        }
+        if ($ts === -1 || $ts === false) { // if it's still -1, then there's nothing to be done; use a different method.
+            throw new SQLException("Unable to convert value at column " . (is_int($column) ? $column + 1 : $column) . " to timestamp: " . $this->fields[$column]);
+        }        
+        if ($format === null) {
+            return $ts;
+        }
+        if (strpos($format, '%') !== false) {
+            return strftime($format, $ts);
+        } else {
+            return date($format, $ts);
+        }
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLResultSet.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,36 @@
+<?php
+/*
+ *  $Id: MySQLStatement.php,v 1.1 2004/02/19 02:49:42 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/Statement.php';
+require_once 'creole/common/StatementCommon.php';
+
+/**
+ * MySQL Statement
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @author    Stig Bakken <ssb en fast.no> 
+ * @author    Lukas Smith
+ * @version   $Revision: 1.1 $
+ * @package   creole.drivers.mysql
+ */ 
+class MySQLStatement extends StatementCommon implements Statement {   
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLTypes.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLTypes.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLTypes.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,102 @@
+<?php
+
+/*
+ *  $Id: MySQLTypes.php,v 1.8 2005/02/10 09:22:40 pachanga Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/CreoleTypes.php';
+
+/**
+ * MySQL types / type map.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.8 $
+ * @package   creole.drivers.mysql
+ */
+class MySQLTypes extends CreoleTypes {
+
+    /** Map MySQL native types to Creole (JDBC) types. */
+    private static $typeMap = array(
+                                'tinyint' => CreoleTypes::TINYINT,
+                                'smallint' => CreoleTypes::SMALLINT,
+                                'mediumint' => CreoleTypes::SMALLINT,
+                                'int' => CreoleTypes::INTEGER,
+                                'integer' => CreoleTypes::INTEGER,
+                                'bigint' => CreoleTypes::BIGINT,
+                                'int24' => CreoleTypes::BIGINT,
+                                'real' => CreoleTypes::REAL,
+                                'float' => CreoleTypes::FLOAT,
+                                'decimal' => CreoleTypes::DECIMAL,
+                                'numeric' => CreoleTypes::NUMERIC,
+                                'double' => CreoleTypes::DOUBLE,
+                                'char' => CreoleTypes::CHAR,
+                                'varchar' => CreoleTypes::VARCHAR,
+                                'date' => CreoleTypes::DATE,
+                                'time' => CreoleTypes::TIME,
+                                'year' => CreoleTypes::YEAR,
+                                'datetime' => CreoleTypes::TIMESTAMP,
+                                'timestamp' => CreoleTypes::TIMESTAMP,
+                                'tinyblob' => CreoleTypes::BINARY,
+                                'blob' => CreoleTypes::VARBINARY,
+                                'mediumblob' => CreoleTypes::VARBINARY,
+                                'longblob' => CreoleTypes::VARBINARY,
+                                'longtext' => CreoleTypes::LONGVARCHAR,
+                                'tinytext' => CreoleTypes::VARCHAR,
+                                'mediumtext' => CreoleTypes::LONGVARCHAR,
+                                'text' => CreoleTypes::LONGVARCHAR,
+                                'enum' => CreoleTypes::CHAR,
+                                'set' => CreoleTypes::CHAR,
+                                );
+
+    /** Reverse mapping, created on demand. */
+    private static $reverseMap = null;
+
+    /**
+     * This method returns the generic Creole (JDBC-like) type
+     * when given the native db type.
+     * @param string $nativeType DB native type (e.g. 'TEXT', 'byetea', etc.).
+     * @return int Creole native type (e.g. CreoleTypes::LONGVARCHAR, CreoleTypes::BINARY, etc.).
+     */
+    public static function getType($nativeType)
+    {
+        $t = strtolower($nativeType);
+        if (isset(self::$typeMap[$t])) {
+            return self::$typeMap[$t];
+        } else {
+            return CreoleTypes::OTHER;
+        }
+    }
+
+    /**
+     * This method will return a native type that corresponds to the specified
+     * Creole (JDBC-like) type.
+     * If there is more than one matching native type, then the LAST defined
+     * native type will be returned.
+     * @param int $creoleType
+     * @return string Native type string.
+     */
+    public static function getNativeType($creoleType)
+    {
+        if (self::$reverseMap === null) {
+            self::$reverseMap = array_flip(self::$typeMap);
+        }
+        return @self::$reverseMap[$creoleType];
+    }
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/MySQLTypes.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/metadata/MySQLDatabaseInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/metadata/MySQLDatabaseInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/metadata/MySQLDatabaseInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,66 @@
+<?php
+/*
+ * $Id: MySQLDatabaseInfo.php,v 1.13 2006/01/17 19:44:39 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/metadata/DatabaseInfo.php';
+
+/**
+ * MySQL implementation of DatabaseInfo.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.13 $
+ * @package   creole.drivers.mysql.metadata
+ */
+class MySQLDatabaseInfo extends DatabaseInfo {
+
+    /**
+     * @throws SQLException
+     * @return void
+     */
+    protected function initTables()
+    {
+        include_once 'creole/drivers/mysql/metadata/MySQLTableInfo.php';		
+																		// using $this->dblink was causing tests to break
+																		// perhaps dblink is changed by another test ... ?
+        $result = @mysql_query("SHOW TABLES FROM `" . $this->dbname . "`", $this->conn->getResource());
+
+        if (!$result) {
+            throw new SQLException("Could not list tables", mysql_error($this->conn->getResource()));
+        }
+
+        while ($row = mysql_fetch_row($result)) {
+            $this->tables[strtoupper($row[0])] = new MySQLTableInfo($this, $row[0]);
+        }
+		
+		$this->tablesLoaded = true;
+		
+    }
+
+    /**
+     * MySQL does not support sequences.
+     *
+     * @return void
+     * @throws SQLException
+     */
+    protected function initSequences()
+    {
+        // throw new SQLException("MySQL does not support sequences natively.");
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/metadata/MySQLDatabaseInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/metadata/MySQLTableInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/metadata/MySQLTableInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/metadata/MySQLTableInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,252 @@
+<?php
+/*
+ *  $Id: MySQLTableInfo.php,v 1.20 2006/01/17 19:44:39 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/metadata/TableInfo.php';
+
+/**
+ * MySQL implementation of TableInfo.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.20 $
+ * @package   creole.drivers.mysql.metadata
+ */
+class MySQLTableInfo extends TableInfo {
+
+    /** Loads the columns for this table. */
+    protected function initColumns()
+    {
+        include_once 'creole/metadata/ColumnInfo.php';
+        include_once 'creole/drivers/mysql/MySQLTypes.php';
+
+        if (!@mysql_select_db($this->dbname, $this->conn->getResource())) {
+            throw new SQLException('No database selected');
+        }
+
+        // To get all of the attributes we need, we use
+        // the MySQL "SHOW COLUMNS FROM $tablename" SQL.  We cannot
+        // use the API functions (e.g. mysql_list_fields() because they
+        // do not return complete information -- e.g. precision / scale, default
+        // values).
+
+        $res = mysql_query("SHOW COLUMNS FROM `" . $this->name . "`", $this->conn->getResource());
+
+        $defaults = array();
+        $nativeTypes = array();
+        $precisions = array();
+
+        while($row = mysql_fetch_assoc($res)) {
+            $name = $row['Field'];
+            $is_nullable = ($row['Null'] == 'YES');
+            $is_auto_increment = (strpos($row['Extra'], 'auto_increment') !== false);
+            $size = null;
+            $precision = null;
+			$scale = null;
+			
+            if (preg_match('/^(\w+)[\(]?([\d,]*)[\)]?( |$)/', $row['Type'], $matches)) {
+                //            colname[1]   size/precision[2]
+                $nativeType = $matches[1];
+                if ($matches[2]) {
+                    if ( ($cpos = strpos($matches[2], ',')) !== false) {
+                        $size = (int) substr($matches[2], 0, $cpos);
+                        $precision = $size;
+                        $scale = (int) substr($matches[2], $cpos + 1);
+                    } else {
+                        $size = (int) $matches[2];
+                    }
+                }
+            } elseif (preg_match('/^(\w+)\(/', $row['Type'], $matches)) {
+                $nativeType = $matches[1];
+            } else {
+                $nativeType = $row['Type'];
+            }
+            //BLOBs can't have any default values in MySQL
+            $default = preg_match('~blob|text~', $nativeType) ? null : $row['Default'];
+            $this->columns[$name] = new ColumnInfo($this,
+                                                   $name,
+                                                   MySQLTypes::getType($nativeType),
+                                                   $nativeType,
+                                                   $size,
+                                                   $precision,
+                                                   $scale,
+                                                   $is_nullable,
+                                                   $default,
+                                                   $is_auto_increment,
+                                                   $row);
+        }
+
+        $this->colsLoaded = true;
+    }
+
+    /** Loads the primary key information for this table. */
+    protected function initPrimaryKey()
+    {
+        include_once 'creole/metadata/PrimaryKeyInfo.php';
+
+        // columns have to be loaded first
+        if (!$this->colsLoaded) $this->initColumns();
+
+        if (!@mysql_select_db($this->dbname, $this->conn->getResource())) {
+            throw new SQLException('No database selected');
+        }
+
+        // Primary Keys
+        $res = mysql_query("SHOW KEYS FROM `" . $this->name . "`", $this->conn->getResource());
+
+        // Loop through the returned results, grouping the same key_name together
+        // adding each column for that key.
+
+        while($row = mysql_fetch_assoc($res)) {
+            // Skip any non-primary keys.
+            if ($row['Key_name'] !== 'PRIMARY') {
+                continue;
+            }
+            $name = $row["Column_name"];
+            if (!isset($this->primaryKey)) {
+                $this->primaryKey = new PrimaryKeyInfo($name, $row);
+            }
+            $this->primaryKey->addColumn($this->columns[$name]);
+        }
+
+        $this->pkLoaded = true;
+    }
+
+    /** Loads the indexes for this table. */
+    protected function initIndexes() {
+
+        include_once 'creole/metadata/IndexInfo.php';
+
+        // columns have to be loaded first
+        if (!$this->colsLoaded) $this->initColumns();
+
+        if (!@mysql_select_db($this->dbname, $this->conn->getResource())) {
+            throw new SQLException('No database selected');
+        }
+
+        // Indexes
+        $res = mysql_query("SHOW INDEX FROM `" . $this->name . "`", $this->conn->getResource());
+
+        // Loop through the returned results, grouping the same key_name together
+        // adding each column for that key.
+
+        while($row = mysql_fetch_assoc($res)) {
+            $colName = $row["Column_name"];
+            $name = $row["Key_name"];
+
+            if($name == "PRIMARY") {
+                continue;
+            }
+
+            if (!isset($this->indexes[$name])) {
+                $isUnique = ($row["Non_unique"] == 0);
+                $this->indexes[$name] = new IndexInfo($name, $isUnique, $row);
+            }
+            $this->indexes[$name]->addColumn($this->columns[$colName]);
+        }
+
+        $this->indexesLoaded = true;
+    }
+
+  /**
+   * Load foreign keys for supporting versions of MySQL.
+   * @author Tony Bibbs
+   */
+  protected function initForeignKeys() {
+
+    // First make sure we have supported version of MySQL:
+    $res = mysql_query("SELECT VERSION()");
+    $row = mysql_fetch_row($res);
+
+    // Yes, it is OK to hardcode this...this was the first version of MySQL
+    // that supported foreign keys
+    if ($row[0] < '3.23.44') {
+       $this->fksLoaded = true;
+       return;
+    }
+
+    include_once 'creole/metadata/ForeignKeyInfo.php';
+
+    // columns have to be loaded first
+    if (!$this->colsLoaded) $this->initColumns();
+    if (!@mysql_select_db($this->dbname, $this->conn->getResource())) {
+      throw new SQLException('No database selected');
+    }
+       // Get the CREATE TABLE syntax
+    $res = mysql_query("SHOW CREATE TABLE `" . $this->name . "`", $this->conn->getResource());
+    $row = mysql_fetch_row($res);
+
+    // Get the information on all the foreign keys
+    $regEx = '/FOREIGN KEY \(`([^`]*)`\) REFERENCES `([^`]*)` \(`([^`]*)`\)(.*)/';
+    if (preg_match_all($regEx,$row[1],$matches)) {
+      $tmpArray = array_keys($matches[0]);
+      foreach ($tmpArray as $curKey) {
+        $name = $matches[1][$curKey];
+        $ftbl = $matches[2][$curKey];
+        $fcol = $matches[3][$curKey];
+        $fkey = $matches[4][$curKey];
+        if (!isset($this->foreignKeys[$name])) {
+          $this->foreignKeys[$name] = new ForeignKeyInfo($name);
+          if ($this->database->hasTable($ftbl)) {
+            $foreignTable = $this->database->getTable($ftbl);
+          } else {
+            $foreignTable = new MySQLTableInfo($this->database, $ftbl);
+            $this->database->addTable($foreignTable);
+          }
+          if ($foreignTable->hasColumn($fcol)) {
+            $foreignCol = $foreignTable->getColumn($fcol);
+          } else {
+            $foreignCol = new ColumnInfo($foreignTable, $fcol);
+            $foreignTable->addColumn($foreignCol);
+          }
+
+          //typical for mysql is RESTRICT
+          $fkactions = array(
+            'ON DELETE'	=> ForeignKeyInfo::RESTRICT,
+            'ON UPDATE'	=> ForeignKeyInfo::RESTRICT,
+          );
+                              
+          if ($fkey) {
+            //split foreign key information -> search for ON DELETE and afterwords for ON UPDATE action
+            foreach (array_keys($fkactions) as $fkaction) {
+              $result = NULL;
+              preg_match('/' . $fkaction . ' (' . ForeignKeyInfo::CASCADE . '|' . ForeignKeyInfo::SETNULL . ')/', $fkey, $result);
+              if ($result && is_array($result) && isset($result[1])) {
+                $fkactions[$fkaction] = $result[1];
+              }
+            }
+          }
+
+          $this->foreignKeys[$name]->addReference($this->columns[$name], $foreignCol, $fkactions['ON DELETE'], $fkactions['ON UPDATE']);
+        }
+      }
+    }
+    $this->fksLoaded = true;
+    
+  }
+
+  protected function initVendorSpecificInfo()
+  {
+      $res = mysql_query("SHOW TABLE STATUS LIKE '" . $this->name . "'", $this->conn->getResource());
+      $this->vendorSpecificInfo = mysql_fetch_assoc($res);
+
+      $this->vendorLoaded = true;
+  }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysql/metadata/MySQLTableInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiConnection.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiConnection.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiConnection.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,293 @@
+<?php
+/*
+ * $Id: MySQLiConnection.php,v 1.7 2004/09/18 09:29:22 sb Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/Connection.php';
+require_once 'creole/common/ConnectionCommon.php';
+include_once 'creole/drivers/mysqli/MySQLiResultSet.php';
+
+/**
+ * MySQLi implementation of Connection.
+ *
+ *
+ * @author    Sebastian Bergmann <sb en sebastian-bergmann.de>
+ * @version   $Revision: 1.7 $
+ * @package   creole.drivers.mysqli
+ */
+class MySQLiConnection extends ConnectionCommon implements Connection {
+    /** Current database (used in mysqli_select_db()). */
+    private $database;
+
+    /**
+     * Connect to a database and log in as the specified user.
+     *
+     * @param $dsn the data source name (see DB::parseDSN for syntax)
+     * @param $flags Any conneciton flags.
+     * @access public
+     * @throws SQLException
+     * @return void
+     */
+    public function connect($dsninfo, $flags = 0)
+    {
+        if (!extension_loaded('mysqli')) {
+            throw new SQLException('mysqli extension not loaded');
+        }
+
+        $this->dsn = $dsninfo;
+        $this->flags = $flags;
+		
+		$dbhost = null;
+		
+
+        if (isset($dsninfo['protocol']) && $dsninfo['protocol'] == 'unix') {
+            $dbhost = ':' . $dsninfo['socket'];
+        } else {
+            $dbhost = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'localhost';
+
+            if (!empty($dsninfo['port'])) {
+                $dbhost .= ':' . $dsninfo['port'];
+            }
+        }
+
+		$host = !empty($dsninfo['hostspec']) ? $dsninfo['hostspec'] : null;
+        $user = !empty($dsninfo['username']) ? $dsninfo['username'] : null;
+        $pw = !empty($dsninfo['password']) ? $dsninfo['password'] : null;
+		$port = !empty($dsninfo['port']) ? $dsninfo['port'] : null;
+		$socket = !empty($dsninfo['socket']) ? $dsninfo['socket'] : null;
+		$database = !empty($dsninfo['database']) ? $dsninfo['database'] : null;
+
+		$encoding = !empty($dsninfo['encoding']) ? $dsninfo['encoding'] : null;
+
+        @ini_set('track_errors', true);
+
+		$conn = mysqli_connect($host, $user, $pw, $database, $port, $socket);
+
+            @ini_restore('track_errors');
+
+        if (empty($conn)) {
+            if (($err = @mysqli_error()) != '') {
+                throw new SQLException("connect failed", $err);
+            } elseif (empty($php_errormsg)) {
+                throw new SQLException("connect failed");
+            } else {
+                throw new SQLException("connect failed", $php_errormsg);
+            }
+        }
+
+        if ($dsninfo['database']) {
+            if (!@mysqli_select_db($conn, $dsninfo['database'])) {
+               switch(mysqli_errno($conn)) {
+                        case 1049:
+                            $exc = new SQLException("no such database", mysqli_error($conn));
+                        break;
+                        case 1044:
+                            $exc = new SQLException("access violation", mysqli_error($conn));
+                        break;
+                        default:
+                           $exc = new SQLException("cannot select database", mysqli_error($conn));
+                }
+
+                throw $exc;
+
+            }
+
+            // fix to allow calls to different databases in the same script
+            $this->database = $dsninfo['database'];
+        }
+
+        $this->dblink = $conn;
+
+        if ($encoding) {
+			$this->executeUpdate("SET NAMES " . $encoding);
+		}
+    }
+
+    /**
+     * @see Connection::getDatabaseInfo()
+     */
+    public function getDatabaseInfo()
+    {
+        require_once 'creole/drivers/mysqli/metadata/MySQLiDatabaseInfo.php';
+        return new MySQLiDatabaseInfo($this);
+    }
+
+    /**
+     * @see Connection::getIdGenerator()
+     */
+    public function getIdGenerator()
+    {
+        require_once 'creole/drivers/mysqli/MySQLiIdGenerator.php';
+        return new MySQLiIdGenerator($this);
+    }
+
+    /**
+     * @see Connection::prepareStatement()
+     */
+    public function prepareStatement($sql)
+    {
+        require_once 'creole/drivers/mysqli/MySQLiPreparedStatement.php';
+        return new MySQLiPreparedStatement($this, $sql);
+    }
+
+    /**
+     * @see Connection::prepareCall()
+     */
+    public function prepareCall($sql) {
+        throw new SQLException('MySQL does not support stored procedures.');
+    }
+
+    /**
+     * @see Connection::createStatement()
+     */
+    public function createStatement()
+    {
+        require_once 'creole/drivers/mysqli/MySQLiStatement.php';
+        return new MySQLiStatement($this);
+    }
+
+    /**
+     * @see Connection::disconnect()
+     */
+    public function close()
+    {
+        $ret = mysqli_close($this->dblink);
+        $this->dblink = null;
+        return $ret;
+    }
+
+    /**
+     * @see Connection::applyLimit()
+     */
+    public function applyLimit(&$sql, $offset, $limit)
+    {
+        if ( $limit > 0 ) {
+            $sql .= " LIMIT " . ($offset > 0 ? $offset . ", " : "") . $limit;
+        } else if ( $offset > 0 ) {
+            $sql .= " LIMIT " . $offset . ", 18446744073709551615";
+        }
+    }
+
+    /**
+     * @see Connection::executeQuery()
+     */
+    public function executeQuery($sql, $fetchmode = null)
+    {
+        $this->lastQuery = $sql;
+
+        if ($this->database) {
+            if (!@mysqli_select_db($this->dblink, $this->database)) {
+                throw new SQLException('No database selected', mysqli_error($this->dblink));
+            }
+        }
+
+        $result = @mysqli_query($this->dblink, $sql);
+
+        if (!$result) {
+            throw new SQLException('Could not execute query', mysqli_error($this->dblink), $sql);
+        }
+
+        return new MySQLiResultSet($this, $result, $fetchmode);
+    }
+
+    /**
+     * @see Connection::executeUpdate()
+     */
+    public function executeUpdate($sql)
+    {
+        $this->lastQuery = $sql;
+
+        if ($this->database) {
+            if (!@mysqli_select_db($this->dblink, $this->database)) {
+                    throw new SQLException('No database selected', mysqli_error($this->dblink));
+            }
+        }
+
+        $result = @mysqli_query($this->dblink, $sql);
+
+        if (!$result) {
+            throw new SQLException('Could not execute update', mysqli_error($this->dblink), $sql);
+        }
+
+        return (int) mysqli_affected_rows($this->dblink);
+    }
+
+    /**
+     * Start a database transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function beginTrans()
+    {
+        if (!mysqli_autocommit($this->dblink, FALSE)) {
+            throw new SQLException('Could not begin transaction', mysqli_error($this->dblink));
+        }
+    }
+
+    /**
+     * Commit the current transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function commitTrans()
+    {
+        if ($this->database) {
+            if (!@mysqli_select_db($this->dblink, $this->database)) {
+                 throw new SQLException('No database selected', mysqli_error($this->dblink));
+            }
+        }
+
+        if (!mysqli_commit($this->dblink)) {
+            throw new SQLException('Can not commit transaction', mysqli_error($this->dblink));                
+        }
+
+        mysqli_autocommit($this->dblink, TRUE);
+    }
+
+    /**
+     * Roll back (undo) the current transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function rollbackTrans()
+    {
+        if ($this->database) {
+            if (!@mysqli_select_db($this->dblink, $this->database)) {
+                throw new SQLException('No database selected', mysqli_error($this->dblink));
+            }
+        }
+
+        if (!mysqli_rollback($this->dblink)) {
+            throw new SQLException('Could not rollback transaction', mysqli_error($this->dblink));
+        }
+
+        mysqli_autocommit($this->dblink, TRUE);
+    }
+
+    /**
+     * Gets the number of rows affected by the data manipulation
+     * query.
+     *
+     * @return int Number of rows affected by the last query.
+     */
+    public function getUpdateCount()
+    {
+        return (int) @mysqli_affected_rows($this->dblink);
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiConnection.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiIdGenerator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiIdGenerator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiIdGenerator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,96 @@
+<?php
+/*
+ * $Id: MySQLiIdGenerator.php,v 1.4 2004/09/18 09:15:49 sb Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/IdGenerator.php';
+
+/**
+ * MySQLi implementation of IdGenerator.
+ *
+ * @author    Sebastian Bergmann <sb en sebastian-bergmann.de>
+ * @version   $Revision: 1.4 $
+ * @package   creole.drivers.mysqli
+ */
+class MySQLiIdGenerator implements IdGenerator {
+    /** Connection object that instantiated this class */
+    private $conn;
+
+    /**
+     * Creates a new IdGenerator class, saves passed connection for use
+     * later by getId() method.
+     * @param Connection $conn
+     */
+    public function __construct(Connection $conn)
+    {
+        $this->conn = $conn;
+    }
+
+    /**
+     * @see IdGenerator::isBeforeInsert()
+     */
+    public function isBeforeInsert()
+    {
+        return false;
+    }
+
+    /**
+     * @see IdGenerator::isAfterInsert()
+     */
+    public function isAfterInsert()
+    {
+        return true;
+    }
+
+    /**
+     * @see IdGenerator::getIdMethod()
+     */
+    public function getIdMethod()
+    {
+        return self::AUTOINCREMENT;
+    }
+
+    /**
+     * Returns last-generated auto-increment ID.
+     *
+     * Note that for very large values (2,147,483,648 to 9,223,372,036,854,775,807) a string
+     * will be returned, because these numbers are larger than supported by PHP's native
+     * numeric datatypes.
+     *
+     * @see IdGenerator::getId()
+     */
+    public function getId($unused = null)
+    {
+        $resource = $this->conn->getResource();
+        $insert_id = mysqli_insert_id($resource);
+
+        if ( $insert_id < 0 ) {
+            $insert_id = null;
+
+            $result = mysqli_query($resource, 'SELECT LAST_INSERT_ID()');
+
+            if ( $result ) {
+                $row = mysqli_fetch_row($result);
+                $insert_id = $row ? $row[0] : null;
+            }
+        }
+
+        return $insert_id;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiIdGenerator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiPreparedStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiPreparedStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiPreparedStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,42 @@
+<?php
+/*
+ * $Id: MySQLiPreparedStatement.php,v 1.3 2004/09/18 09:15:49 sb Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/PreparedStatement.php';
+require_once 'creole/common/PreparedStatementCommon.php';
+
+/**
+ * MySQLi implementation of PreparedStatement.
+ *
+ * @author    Sebastian Bergmann <sb en sebastian-bergmann.de>
+ * @version   $Revision: 1.3 $
+ * @package   creole.drivers.mysqli
+ */
+class MySQLiPreparedStatement extends PreparedStatementCommon implements PreparedStatement {
+    /**
+     * Quotes string using native MySQL function.
+     * @param string $str
+     * @return string
+     */
+    protected function escape($str)
+    {
+        return mysqli_real_escape_string($this->getConnection()->getResource(), $str);
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiPreparedStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiResultSet.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiResultSet.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiResultSet.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,173 @@
+<?php
+/*
+ * $Id: MySQLiResultSet.php,v 1.5 2006/01/17 19:44:39 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/ResultSet.php';
+require_once 'creole/common/ResultSetCommon.php';
+
+/**
+ * MySQLi implementation of ResultSet.
+ *
+ * MySQL supports OFFSET / LIMIT natively; this means that no adjustments or checking
+ * are performed.  We will assume that if the lmitSQL() operation failed that an
+ * exception was thrown, and that OFFSET/LIMIT will never be emulated for MySQL.
+ *
+ * @author    Sebastian Bergmann <sb en sebastian-bergmann.de>
+ * @version   $Revision: 1.5 $
+ * @package   creole.drivers.mysqli
+ */
+class MySQLiResultSet extends ResultSetCommon implements ResultSet {
+    /**
+     * @see ResultSet::seek()
+     */
+    public function seek($rownum)
+    {
+        // MySQL rows start w/ 0, but this works, because we are
+        // looking to move the position _before_ the next desired position
+         if (!@mysqli_data_seek($this->result, $rownum)) {
+                return false;
+        }
+
+        $this->cursorPos = $rownum;
+
+        return true;
+    }
+
+    /**
+     * @see ResultSet::next()
+     */
+    public function next()
+    {
+        $this->fields = mysqli_fetch_array($this->result, $this->fetchmode);
+        $resource = $this->conn->getResource();
+
+        if (!$this->fields) {
+            $errno = mysqli_errno($resource);
+
+            if (!$errno) {
+                // We've advanced beyond end of recordset.
+                $this->afterLast();
+                return false;
+            } else {
+                throw new SQLException("Error fetching result", mysqli_error($resource));
+            }
+        }
+
+        if ($this->fetchmode === ResultSet::FETCHMODE_ASSOC && $this->lowerAssocCase) {
+            $this->fields = array_change_key_case($this->fields, CASE_LOWER);
+        }
+
+        // Advance cursor position
+        $this->cursorPos++;
+        return true;
+    }
+
+    /**
+     * @see ResultSet::getRecordCount()
+     */
+    public function getRecordCount()
+    {
+        $rows = @mysqli_num_rows($this->result);
+
+        if ($rows === null) {
+            throw new SQLException("Error fetching num rows", mysqli_error($this->conn->getResource()));
+        }
+
+        return (int) $rows;
+    }
+
+    /**
+     * @see ResultSet::close()
+     */
+    public function close()
+    {
+        @mysqli_free_result($this->result);
+        $this->fields = array();
+    }
+
+    /**
+     * Get string version of column.
+     * No rtrim() necessary for MySQL, as this happens natively.
+     * @see ResultSet::getString()
+     */
+    public function getString($column)
+    {
+        $idx = (is_int($column) ? $column - 1 : $column);
+
+        if (!array_key_exists($idx, $this->fields)) {
+            throw new SQLException("Invalid resultset column: " . $column);
+        }
+
+        if ($this->fields[$idx] === null) {
+            return null;
+        }
+
+        return (string) $this->fields[$idx];
+    }
+
+    /**
+     * Returns a unix epoch timestamp based on either a TIMESTAMP or DATETIME field.
+     * @param mixed $column Column name (string) or index (int) starting with 1.
+     * @return string
+     * @throws SQLException - If the column specified is not a valid key in current field array.
+     */
+    public function getTimestamp($column, $format='Y-m-d H:i:s')
+    {
+        if (is_int($column)) {
+            // because Java convention is to start at 1
+            $column--;
+        }
+
+        if (!array_key_exists($column, $this->fields)) {
+            throw new SQLException("Invalid resultset column: " . (is_int($column) ? $column + 1 : $column));
+        }
+
+        if ($this->fields[$column] === null) {
+            return null;
+        }
+
+        $ts = strtotime($this->fields[$column]);
+
+        if ($ts === -1 || $ts === false) { // in PHP 5.1 return value changes to FALSE
+            // otherwise it's an ugly MySQL timestamp!
+            // YYYYMMDDHHMMSS
+            if (preg_match('/([\d]{4})([\d]{2})([\d]{2})([\d]{2})([\d]{2})([\d]{2})/', $this->fields[$column], $matches)) {
+                //              YYYY       MM       DD       HH       MM       SS
+                //                $1       $2       $3       $4       $5       $6
+                $ts = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
+            }
+        }
+
+        if ($ts === -1 || $ts === false) { // in PHP 5.1 return value changes to FALSE
+            // if it's still -1, then there's nothing to be done; use a different method.
+            throw new SQLException("Unable to convert value at column " . (is_int($column) ? $column + 1 : $column) . " to timestamp: " . $this->fields[$column]);
+        }
+
+        if ($format === null) {
+            return $ts;
+        }
+
+        if (strpos($format, '%') !== false) {
+            return strftime($format, $ts);
+        } else {
+            return date($format, $ts);
+        }
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiResultSet.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,33 @@
+<?php
+/*
+ * $Id: MySQLiStatement.php,v 1.2 2004/09/18 09:15:49 sb Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/Statement.php';
+require_once 'creole/common/StatementCommon.php';
+
+/**
+ * MySQLi implementation of Statement.
+ *
+ * @author    Sebastian Bergmann <sb en sebastian-bergmann.de>
+ * @version   $Revision: 1.2 $
+ * @package   creole.drivers.mysqli
+ */
+class MySQLiStatement extends StatementCommon implements Statement {
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/MySQLiStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/metadata/MySQLiDatabaseInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/metadata/MySQLiDatabaseInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/metadata/MySQLiDatabaseInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,61 @@
+<?php
+/*
+ * $Id: MySQLiDatabaseInfo.php,v 1.3 2006/01/17 19:44:39 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/metadata/DatabaseInfo.php';
+
+/**
+ * MySQLi implementation of DatabaseInfo.
+ *
+ * @author    Sebastian Bergmann <sb en sebastian-bergmann.de>
+ * @version   $Revision: 1.3 $
+ * @package   creole.drivers.mysqli.metadata
+ */
+class MySQLiDatabaseInfo extends DatabaseInfo {
+    /**
+     * @throws SQLException
+     * @return void
+     */
+    protected function initTables()
+    {
+        include_once 'creole/drivers/mysqli/metadata/MySQLiTableInfo.php';
+        
+        $result = @mysqli_query($this->conn->getResource(), 'SHOW TABLES FROM ' . $this->dbname);
+    
+        if (!$result) {
+            throw new SQLException("Could not list tables", mysqli_error($this->conn->getResource()));
+        }
+        
+        while ($row = mysqli_fetch_row($result)) {
+            $this->tables[strtoupper($row[0])] = new MySQLiTableInfo($this, $row[0]);
+        }
+    }
+
+    /**
+     * MySQL does not support sequences.
+     *
+     * @return void
+     * @throws SQLException
+     */
+    protected function initSequences()
+    {
+        // throw new SQLException("MySQL does not support sequences natively.");
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/metadata/MySQLiDatabaseInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/metadata/MySQLiTableInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/metadata/MySQLiTableInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/metadata/MySQLiTableInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,155 @@
+<?php
+/*
+ * $Id: MySQLiTableInfo.php,v 1.3 2006/01/17 19:44:39 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/metadata/TableInfo.php';
+
+/**
+ * MySQLi implementation of TableInfo.
+ *
+ * @author    Sebastian Bergmann <sb en sebastian-bergmann.de>
+ * @version   $Revision: 1.3 $
+ * @package   creole.drivers.mysqli.metadata
+ */
+class MySQLiTableInfo extends TableInfo {
+    /** Loads the columns for this table. */
+    protected function initColumns()
+    {
+        require_once 'creole/metadata/ColumnInfo.php';
+        require_once 'creole/drivers/mysql/MySQLTypes.php';
+
+        if (!@mysqli_select_db($this->conn->getResource(), $this->dbname)) {
+            throw new SQLException('No database selected');
+        }
+
+        // To get all of the attributes we need, we use
+        // the MySQL "SHOW COLUMNS FROM $tablename" SQL.
+        $res = mysqli_query($this->conn->getResource(), "SHOW COLUMNS FROM " . $this->name);
+
+        $defaults = array();
+        $nativeTypes = array();
+        $precisions = array();
+
+        while($row = mysqli_fetch_assoc($res)) {
+            $name = $row['Field'];
+            $default = $row['Default'];
+            $is_nullable = ($row['Null'] == 'YES');
+
+            $size = null;
+            $precision = null;
+            $scale = null;
+
+            if (preg_match('/^(\w+)[\(]?([\d,]*)[\)]?( |$)/', $row['Type'], $matches)) {
+                //            colname[1]   size/precision[2]
+                $nativeType = $matches[1];
+                if ($matches[2]) {
+                    if ( ($cpos = strpos($matches[2], ',')) !== false) {
+                        $size = (int) substr($matches[2], 0, $cpos);
+                        $precision = $size;
+                        $scale = (int) substr($matches[2], $cpos + 1);
+                    } else {
+                        $size = (int) $matches[2];
+                    }
+                }
+            } elseif (preg_match('/^(\w+)\(/', $row['Type'], $matches)) {
+                $nativeType = $matches[1];
+            } else {
+                $nativeType = $row['Type'];
+            }
+
+            $this->columns[$name] = new ColumnInfo($this, $name, MySQLTypes::getType($nativeType), $nativeType, $size, $precision, $scale, $is_nullable, $default);
+        }
+
+        $this->colsLoaded = true;
+    }
+
+    /** Loads the primary key information for this table. */
+    protected function initPrimaryKey()
+    {
+        require_once 'creole/metadata/PrimaryKeyInfo.php';
+
+        // columns have to be loaded first
+        if (!$this->colsLoaded) {
+            $this->initColumns();
+        }
+
+        if (!@mysqli_select_db($this->conn->getResource(), $this->dbname)) {
+            throw new SQLException('No database selected');
+        }
+
+        // Primary Keys
+        $res = mysqli_query($this->conn->getResource(), "SHOW KEYS FROM " . $this->name);
+
+        // Loop through the returned results, grouping the same key_name together
+        // adding each column for that key.
+        while($row = mysqli_fetch_assoc($res)) {
+            $name = $row["Column_name"];
+            if (!isset($this->primaryKey)) {
+                $this->primaryKey = new PrimaryKeyInfo($name);
+            }
+
+            $this->primaryKey->addColumn($this->columns[ $name ]);
+        }
+
+        $this->pkLoaded = true;
+    }
+
+    /** Loads the indexes for this table. */
+    protected function initIndexes() {
+        require_once 'creole/metadata/IndexInfo.php';
+
+        // columns have to be loaded first
+        if (!$this->colsLoaded) {
+            $this->initColumns();
+        }
+
+        if (!@mysqli_select_db($this->conn->getResource(), $this->dbname)) {
+            throw new SQLException('No database selected');
+        }
+
+        // Indexes
+        $res = mysqli_query($this->conn->getResource(), "SHOW INDEX FROM " . $this->name);
+
+        // Loop through the returned results, grouping the same key_name together
+        // adding each column for that key.
+        while($row = mysqli_fetch_assoc($res)) {
+            $name = $row["Column_name"];
+
+            if (!isset($this->indexes[$name])) {
+                $this->indexes[$name] = new IndexInfo($name);
+            }
+
+            $this->indexes[$name]->addColumn($this->columns[ $name ]);
+        }
+
+        $this->indexesLoaded = true;
+    }
+
+    /** Load foreign keys (unsupported in MySQL). */
+    protected function initForeignKeys() {
+        // columns have to be loaded first
+        if (!$this->colsLoaded) {
+            $this->initColumns();
+        }
+
+        // Foreign keys are not supported in mysql.
+        $this->fksLoaded = true;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/mysqli/metadata/MySQLiTableInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCCachedResultSet.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCCachedResultSet.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCCachedResultSet.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,218 @@
+<?php
+/*
+ *  $Id: ODBCCachedResultSet.php,v 1.2 2005/04/01 17:04:00 dlawson_mi Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/drivers/odbc/ODBCResultSetCommon.php';
+require_once 'creole/drivers/odbc/ODBCTypes.php';
+
+/**
+ * ODBC implementation of a cached ResultSet.
+ *
+ * In addition to limit/offset emulation, this class implements a resultset
+ * cache. This can be useful as a workaround for some ODBC drivers which lack
+ * support for reverse/absolute cursor scrolling, etc. 
+ *
+ * This class will cache rows _on-demand_. So if you only read the first couple
+ * rows of a result, then only those rows will be cached. However, note that if
+ * you call getRecordCount() or last(), the class must read and cache all 
+ * available records. 
+ *
+ * The offset / limit variables are also taken into account when caching. Any 
+ * rows preceding the offset value will be skipped. Caching will stop once the
+ * limit value is reached.
+ *
+ * To use this class, create a derived {@link ODBCAdapter} class which returns
+ * an instance of ODBCCachedResultSet from the {@link ODBCAdapter::createResultSet()} method.
+ * Specify the adapter via the query portion of the Connection URL:
+ *
+ * odbc://localhost/Driver=MySQL ODBC 3.51 Driver;Database=test?adapter=MySQL
+ *
+ * @author    Dave Lawson <dlawson en masterytech.com>
+ * @version   $Revision: 1.2 $
+ * @package   creole.drivers.odbc
+ */
+class ODBCCachedResultSet extends ODBCResultSetCommon implements ResultSet
+{
+    /**
+     * Record cache
+     * @var array
+     */
+    protected $recs = array();
+
+    /**
+     * Tracks the last cursor position of the recordset.
+     * @var integer
+     */
+    protected $lastPos = -1;
+
+    /**
+     * True if blobs/clobs should also be cached.
+     * @var boolean
+     */
+    protected $cacheLobs = false;
+
+    /**
+     * @see ResultSet::__construct()
+     */
+    public function __construct(Connection $conn, $result, $fetchmode = null, $cacheLobs = false)
+    {
+        parent::__construct($conn, $result, $fetchmode);
+
+        $this->cacheLobs = $cacheLobs;
+    }
+
+    /**
+     * @see ODBCResultSetCommon::close()
+     */
+    function close()
+    {
+        parent::close();
+        $this->recs = null;
+        $this->lastPos = -1;
+        $this->cacheLobs = false;
+    }
+
+    /**
+     * Caches specified records up to and including the specified 1-based
+     * record position. If -1 is specified, all records will be cached.
+     * @param integer Maximum record position to cache.
+     * @return void
+     * @throws SQLException
+     */
+    public function loadCache($recPos = -1)
+    {
+        $rid = $this->result->getHandle();
+
+        $curRecs = count($this->recs);
+        $totRecs = ($curRecs ? $this->offset + $curRecs : 0);
+
+        while (1)
+        {
+            // Is record already cached?
+            if ($this->lastPos != -1 || ($recPos > -1 && $recPos <= $curRecs))
+                return;
+
+            // Fetch row (no buffers copied yet).
+            $rowNum = ++$totRecs;
+            $result = @odbc_fetch_row($rid, $rowNum);
+
+            // All records cached?
+            if ($result === false || ($this->limit > 0 && $curRecs+1 > $this->limit))
+            {
+                $this->lastPos = $curRecs;
+                continue;
+            }
+
+            // Ignore offset records.
+            if ($totRecs <= $this->offset)
+                continue;
+
+            // Load row array.
+            $row = array();
+            for ($i = 0, $n = @odbc_num_fields($rid); $i < $n; $i++)
+            {
+                $fldNum = $i+1;
+                $row[$i] = odbc_result($rid, $fldNum);
+                
+                // Cache lobs if necessary
+                if ($this->cacheLobs)
+                {
+                    ODBCTypes::loadTypeMap($this->conn);
+
+                    $nativeType = @odbc_field_type($rid, $fldNum);
+                    $creoleType = ODBCTypes::getType($nativeType);
+
+                    $isBlob = ($creoleType == CreoleTypes::BLOB ||
+                               $creoleType == CreoleTypes::LONGVARBINARY);
+
+                    $isClob = ($creoleType == CreoleTypes::CLOB ||
+                               $creoleType == CreoleTypes::LONGVARCHAR);
+
+                    if (($isBlob || $isClob) && $row[$i] !== null)
+                    {
+                        $binmode = ($isBlob ? ODBC_BINMODE_RETURN : ODBC_BINMODE_CONVERT);
+                        $curdata = $row[$i];
+                        $row[$i] = $this->readLobData($fldNum, $binmode, $curdata);
+                    }
+                }
+            }
+                        
+            // Add record to cache.
+            $this->recs[++$curRecs] = $row;
+        }
+    }
+
+    /**
+     * @see ResultSet::seek()
+     */
+    public function seek($rownum)
+    {
+        $this->loadCache($rownum);
+
+        if ($rownum < 0 || $rownum > count($this->recs)+1)
+            return false;
+
+        $this->cursorPos = $rownum;
+
+        return true;
+    }
+
+    /**
+     * @see ResultSet::next()
+     */
+    function next()
+    {
+        $this->loadCache(++$this->cursorPos);
+
+        if ($this->isAfterLast())
+        {
+            $this->afterLast();
+            return false;
+        }
+
+        $this->fields =& $this->checkFetchMode($this->recs[$this->cursorPos]);
+
+        return true;
+    }
+
+    /**
+     * @see ResultSet::getRecordCount()
+     */
+    function getRecordCount()
+    {
+        if ($this->lastPos == -1)
+            $this->loadCache(-1);
+
+        return $this->lastPos;
+    }
+
+    /**
+     * @see ResultSet::isAfterLast()
+     */
+    public function isAfterLast()
+    {
+        // All records cached yet?
+        if ($this->lastPos == -1)
+            return false;
+
+        return ($this->cursorPos > $this->lastPos);
+    }
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCCachedResultSet.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCConnection.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCConnection.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCConnection.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,362 @@
+<?php
+/*
+ *  $Id: ODBCConnection.php,v 1.6 2006/01/17 19:44:39 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/Connection.php';
+require_once 'creole/common/ConnectionCommon.php';
+require_once 'creole/drivers/odbc/adapters/ODBCAdapter.php';
+
+/**
+ * ODBC implementation of Connection.
+ *
+ * @author    Dave Lawson <dlawson en masterytech.com>
+ * @version   $Revision: 1.6 $
+ * @package   creole.drivers.odbc
+ */
+class ODBCConnection extends ConnectionCommon implements Connection {
+
+    /**
+     * Implements driver-specific behavior
+     * @var ODBCAdapter
+     */
+    protected $adapter = null;
+
+    /**
+     * Last ODBC result resource from executeQuery/executeUpdate. Used in getUpdateCount()
+     * @var ODBCResultResource
+     */
+    protected $odbcresult = null;
+
+    /**
+     * @see Connection::connect()
+     */
+    public function connect($dsninfo, $flags = 0)
+    {
+		if (!function_exists('odbc_connect'))
+            throw new SQLException('odbc extension not loaded');
+
+        $adapterclass = isset($dsninfo['adapter']) ? $dsninfo['adapter'] : null;
+
+        if (!$adapterclass)
+            $adapterclass = 'ODBCAdapter';
+        else
+            $adapterclass .= 'Adapter';
+
+        Creole::import('creole.drivers.odbc.adapters.' . $adapterclass);
+        $this->adapter = new $adapterclass();
+
+        $this->dsn = $dsninfo;
+        $this->flags = $flags;
+
+        if ( !($this->flags & Creole::COMPAT_ASSOC_LOWER) && !$this->adapter->preservesColumnCase())
+        {
+            trigger_error('Connection created without Creole::COMPAT_ASSOC_LOWER, ' .
+                          'but driver does not support case preservation.',
+                          E_USER_WARNING);
+            $this->flags != Creole::COMPAT_ASSOC_LOWER;
+        }
+
+        $persistent = ($flags & Creole::PERSISTENT) === Creole::PERSISTENT;
+
+        if ($dsninfo['database'])
+            $odbcdsn = $dsninfo['database'];
+        elseif ($dsninfo['hostspec'])
+            $odbcdsn = $dsninfo['hostspec'];
+        else
+            $odbcdsn = 'localhost';
+
+        $user = @$dsninfo['username'];
+        $pw = @$dsninfo['password'];
+
+        $connect_function = $persistent ? 'odbc_pconnect' : 'odbc_connect';
+
+        $conn = @$connect_function($odbcdsn, $user, $pw, SQL_CUR_USE_IF_NEEDED);
+
+        if (!is_resource($conn))
+            throw new SQLException('connect failed', $this->nativeError(), $odbcdsn);
+
+        $this->dblink = $conn;
+
+        /**
+         * This prevents blob fields from being fetched when a row is loaded
+         * from a recordset. Clob fields however are loaded with up to
+         * 'odbc.defaultlrl' data. This should be the default anyway, but we'll
+         * set it here just to keep things consistent.
+         */
+        @odbc_binmode(0, ODBC_BINMODE_PASSTHRU);
+        @odbc_longreadlen(0, ini_get('odbc.defaultlrl'));
+    }
+
+    /**
+     * @see Connection::close()
+     */
+    public function close()
+    {
+        $ret = true;
+
+        $this->adapter = null;
+        $this->odbcresult = null;
+
+        if ($this->dblink !== null)
+        {
+            $ret = @odbc_close($this->dblink);
+            $this->dblink = null;
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Shouldn't this be in ConnectionCommon.php?
+     */
+    public function __destruct()
+    {
+        $this->close();
+    }
+
+    /**
+     * Returns a formatted ODBC error string.
+     * @return string
+     */
+    public function nativeError()
+    {
+        if ($this->dblink && is_resource($this->dblink))
+            $errstr = '[' . @odbc_error($this->dblink) . '] ' . @odbc_errormsg($this->dblink);
+        else
+            $errstr = '[' . @odbc_error() . '] ' . @odbc_errormsg();
+
+        return $errstr;
+    }
+
+    /**
+     * Returns driver-specific ODBCAdapter.
+     * @return ODBCAdapter
+     */
+    public function getAdapter()
+    {
+        return $this->adapter;
+    }
+
+    /**
+     * @see Connection::getDatabaseInfo()
+     */
+    public function getDatabaseInfo()
+    {
+        require_once 'creole/drivers/odbc/metadata/ODBCDatabaseInfo.php';
+        return new ODBCDatabaseInfo($this);
+    }
+
+    /**
+     * @see Connection::getIdGenerator()
+     */
+    public function getIdGenerator()
+    {
+        return $this->adapter->getIdGenerator($this);
+    }
+
+    /**
+     * Creates the appropriate ResultSet
+     * @return ResultSet
+     */
+    public function createResultSet($odbcresult, $fetchmode)
+    {
+        return $this->adapter->createResultSet($this, $odbcresult, $fetchmode);
+    }
+
+    /**
+     * @see Connection::prepareStatement()
+     */
+    public function prepareStatement($sql)
+    {
+        require_once 'creole/drivers/odbc/ODBCPreparedStatement.php';
+        return new ODBCPreparedStatement($this, $sql);
+    }
+
+    /**
+     * @see Connection::createStatement()
+     */
+    public function createStatement()
+    {
+        require_once 'creole/drivers/odbc/ODBCStatement.php';
+        return new ODBCStatement($this);
+    }
+
+    /**
+     * @todo To be implemented
+     * @see Connection::prepareCall()
+     */
+    public function prepareCall($sql)
+    {
+        throw new SQLException('Stored procedures not currently implemented.');
+    }
+
+    /**
+     * @see Connection::applyLimit()
+     */
+    public function applyLimit(&$sql, $offset, $limit)
+    {
+        if ($this->adapter->hasLimitOffset())
+            $this->adapter->applyLimit($sql, $offset, $limit);
+    }
+
+    /**
+     * @see Connection::executeQuery()
+     */
+    public function executeQuery($sql, $fetchmode = null)
+    {
+        if ($this->odbcresult)
+            $this->odbcresult = null;
+
+        $r = @odbc_exec($this->dblink, $sql);
+
+        if ($r === false)
+            throw new SQLException('Could not execute query', $this->nativeError(), $sql);
+
+        $this->odbcresult = new ODBCResultResource($r);
+
+        return $this->createResultSet($this->odbcresult, $fetchmode);
+    }
+
+    /**
+     * @see Connection::executeUpdate()
+     */
+    public function executeUpdate($sql)
+    {
+        if ($this->odbcresult)
+            $this->odbcresult = null;
+
+        $r = @odbc_exec($this->dblink, $sql);
+
+        if ($r === false)
+            throw new SQLException('Could not execute update', $this->nativeError(), $sql);
+
+        $this->odbcresult = new ODBCResultResource($r);
+
+        return $this->getUpdateCount();
+    }
+
+    /**
+     * Start a database transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function beginTrans()
+    {
+        if ($this->adapter->supportsTransactions()) {
+            @odbc_autocommit($this->dblink, false);
+            if (odbc_error($this->dblink) == 'S1C00') {
+                throw new SQLException('Could not begin transaction', $this->nativeError());
+            }
+        }
+    }
+    
+    /**
+     * Commit the current transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function commitTrans()
+    {
+        if ($this->adapter->supportsTransactions()) {
+            $result = @odbc_commit($this->dblink);
+            if (!$result) {
+                throw new SQLException('Could not commit transaction', $this->nativeError());
+            }
+            @odbc_autocommit($this->dblink, true);
+            if (odbc_error($this->dblink) == 'S1C00') {
+                throw new SQLException('Could not commit transaction (autocommit failed)', $this->nativeError());
+            }
+        }
+    }
+
+    /**
+     * Roll back (undo) the current transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function rollbackTrans()
+    {
+        if ($this->adapter->supportsTransactions()) {
+            $result = @odbc_rollback($this->dblink);
+            if (!$result) {
+                throw new SQLException('Could not rollback transaction', $this->nativeError());
+            }
+            @odbc_autocommit($this->dblink, true);
+            if (odbc_error($this->dblink) == 'S1C00') {
+                throw new SQLException('Could not rollback transaction (autocommit failed)', $this->nativeError());
+            }
+        }
+    }
+
+    /**
+     * @see Connection::getUpdateCount()
+     */
+    public function getUpdateCount()
+    {
+        if ($this->odbcresult === null)
+            return 0;
+
+        $n = @odbc_num_rows($this->odbcresult->getHandle());
+
+        if ($n == -1)
+            throw new SQLException('Could not retrieve update count', $this->nativeError());
+
+        return (int) $n;
+    }
+
+}
+
+/**
+ * This is a simple wrapper class to manage the lifetime of an ODBC result resource
+ * (returned by odbc_exec(), odbc_execute(), etc.) We use a separate class because
+ * the resource can be shared by both ODBCConnection and an ODBCResultSet at the
+ * same time. ODBCConnection hangs on to the last result resource to be used in
+ * its getUpdateCount() method. It also passes this resource to new instances of
+ * ODBCResultSet. At some point the resource has to be cleaned up via
+ * odbc_free_result(). Using this class as a wrapper, we can pass around multiple
+ * references to the same resource. PHP's reference counting mechanism will clean
+ * up the resource when its no longer used via ODBCResultResource::__destruct().
+ * @package   creole.drivers.odbc
+ */
+class ODBCResultResource
+{
+    /**
+     * @var resource ODBC result resource returned by {@link odbc_exec()}/{@link odbc_execute()}.
+     */
+    protected $handle = null;
+
+    public function __construct($handle)
+    {
+        if (is_resource($handle))
+            $this->handle = $handle;
+    }
+
+    public function __destruct()
+    {
+        if ($this->handle !== null)
+            @odbc_free_result($this->handle);
+    }
+
+    public function getHandle()
+    {
+        return $this->handle;
+    }
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCConnection.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCIdGenerator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCIdGenerator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCIdGenerator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,118 @@
+<?php
+
+require_once 'creole/IdGenerator.php';
+
+/**
+ * ODBC IdGenerator implimenation.
+ *
+ * NOTE: I tried keeping the SQL as basic as possible in this class.
+ *       If you need something more optimized, derive your own IdGenerator
+ *       and use {@link ODBCAdapter::getIdGenerator()} to use it.
+ *
+ * @author    Dave Lawson <dlawson en masterytech.com>
+ * @version   $Revision: 1.2 $
+ * @package   creole.drivers.odbc
+ */
+class ODBCIdGenerator implements IdGenerator {
+
+    /** Connection object that instantiated this class */
+    private $conn;
+
+    /**
+     * Creates a new IdGenerator class, saves passed connection for use
+     * later by getId() method.
+     * @param Connection $conn
+     */
+    public function __construct(Connection $conn)
+    {
+        $this->conn = $conn;
+    }
+
+    /**
+     * @see IdGenerator::isBeforeInsert()
+     */
+    public function isBeforeInsert()
+    {
+        return true;
+    }
+
+    /**
+     * @see IdGenerator::isAfterInsert()
+     */
+    public function isAfterInsert()
+    {
+        return false;
+    }
+
+    /**
+     * @see IdGenerator::getIdMethod()
+     */
+    public function getIdMethod()
+    {
+        return self::SEQUENCE;
+    }
+
+    /**
+     * @see IdGenerator::getId()
+     */
+    public function getId($seqname = null)
+    {
+        if ($seqname === null)
+            throw new SQLException('You must specify the sequence name when calling getId() method.');
+
+        $triedcreate = false;
+
+        while (1)
+        {
+            try
+            {
+                $n = $this->conn->executeUpdate("UPDATE $seqname SET id = id + 1", ResultSet::FETCHMODE_NUM);
+
+                if ($n == 0)
+                    throw new SQLException('Failed to update IdGenerator id', $this->conn->nativeError());
+
+                $rs = $this->conn->executeQuery("SELECT id FROM $seqname", ResultSet::FETCHMODE_NUM);
+            }
+            catch (SQLException $e)
+            {
+                //$odbcerr = odbc_error($this->conn->getResource());
+
+                if ($triedcreate)// || ($odbcerr != 'S0000' && $odbcerr != 'S0002'))
+                    throw $e;
+
+                $this->drop($seqname, true);
+                $this->create($seqname);
+                $triedcreate = true;
+                continue;
+            }
+
+            break;
+        }
+
+        $rs->first();
+
+        return $rs->getInt(1);
+    }
+
+    /**
+     * Creates the sequence emulation table.
+     */
+    public function create($seqname)
+    {
+        $this->conn->executeUpdate("CREATE TABLE $seqname ( id numeric(19,0) NOT NULL )");
+        $this->conn->executeUpdate("INSERT INTO $seqname ( id ) VALUES ( 0 )");
+    }
+
+    /**
+     * Drops the sequence emulation table.
+     */
+    public function drop($seqname, $ignoreerrs = false)
+    {
+        try {
+            $this->conn->executeUpdate("DROP TABLE $seqname");
+        } catch (Exception $e) {
+            if (!$ignoreerrs) throw $e;
+        }
+    }
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCIdGenerator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCPreparedStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCPreparedStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCPreparedStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,246 @@
+<?php
+/*
+ *  $Id: ODBCPreparedStatement.php,v 1.4 2005/11/13 01:29:01 gamr Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/PreparedStatement.php';
+require_once 'creole/common/PreparedStatementCommon.php';
+require_once 'creole/util/Lob.php';
+
+/**
+ * ODBC specific PreparedStatement functions.
+ *
+ * @author    Dave Lawson <dlawson en masterytech.com>
+ * @version   $Revision: 1.4 $
+ * @package   creole.drivers.odbc
+ */
+class ODBCPreparedStatement extends PreparedStatementCommon implements PreparedStatement
+{
+    /**
+     * This does nothing since ODBC natively supports prepared statements.
+     * @see PreparedStatementCommon::replaceParams()
+     */
+    protected function replaceParams()
+    {
+        if ($this->conn->getAdapter()->emulatePrepareStmt())
+            return parent::replaceParams();
+        else
+            return $this->sql;
+    }
+
+    /**
+     * Internal function to call native ODBC prepare/execute functions.
+     */
+    protected function _execute($sql, $params, $fetchmode, $isupdate)
+    {
+        if ($this->resultSet)
+        {
+            $this->resultSet->close();
+            $this->resultSet = null;
+        }
+
+        $this->updateCount = null;
+
+        if ($this->conn->getAdapter()->emulatePrepareStmt())
+        {
+            $stmt = @odbc_exec($this->conn->getResource(), $sql);
+            $ret = ($stmt !== false);
+        }
+        else
+        {
+            // Trim surrounding quotes added from default set methods.
+            // Exception: for LOB-based parameters, odbc_execute() will
+            // accept a filename surrounded by single-quotes.
+            foreach ($this->boundInVars as $idx => $var)
+            {
+                if ($var instanceof Lob)
+                {
+                    $file = ($isupdate ? $var->getInputFile() : $var->getOutputFile());
+                    $this->boundInVars[$idx] = "'$file'";
+                }
+                else if (is_string($var))
+                {
+                    $this->boundInVars[$idx] = trim($var, "\"\'");
+                }
+            }
+
+            $stmt = @odbc_prepare($this->conn->getResource(), $sql);
+
+            if ($stmt === FALSE)
+                throw new SQLException('Could not prepare query', $this->conn->nativeError(), $sql);
+
+            $ret = @odbc_execute($stmt, $this->boundInVars);
+        }
+
+        if ($ret === FALSE)
+        {
+            @odbc_free_result($stmt);
+            throw new SQLException('Could not execute query', $this->conn->nativeError(), $sql);
+        }
+
+        return $this->conn->createResultSet(new ODBCResultResource($stmt), $fetchmode);
+    }
+
+    /**
+     * @see PreparedStatement::executeQuery()
+     */
+    public function executeQuery()
+    {
+        switch (func_num_args()) {
+        case 2:
+        list($params, $fetchmode) = func_get_args();
+            if (!is_array($params)) {
+                unset($params);
+            }
+            break;
+        case 1:
+            $params = null;
+            list($fetchmode) = func_get_args();
+            break;
+        case 0:
+            $params = null;
+            $fetchmode = null;
+            break;
+        }	
+        
+        // Set any params passed directly
+        if (isset($params)) {
+            for($i=0,$cnt=count($params); $i < $cnt; $i++) {
+                $this->set($i+1, $params[$i]);
+            }
+        }
+        
+        $sql = $this->replaceParams();
+        
+        if ($this->conn->getAdapter()->hasLimitOffset())
+        {
+            if ($this->limit > 0 || $this->offset > 0)
+                $this->conn->applyLimit($sql, $this->offset, $this->limit);
+        }
+
+        $this->resultSet = $this->_execute($sql, $params, $fetchmode, false);
+
+        if (!$this->conn->getAdapter()->hasLimitOffset())
+        {
+            $this->resultSet->_setOffset($this->offset);
+            $this->resultSet->_setLimit($this->limit);
+        }
+
+        return $this->resultSet;
+    }
+
+    /**
+     * @see PreparedStatement::executeUpdate()
+     */
+    public function executeUpdate($params = null)
+    {
+        // Set any params passed directly
+        if ($params) {
+            for($i=0,$cnt=count($params); $i < $cnt; $i++) {
+                $this->set($i+1, $params[$i]);
+            }
+        }
+
+        $sql = $this->replaceParams();
+        $this->_execute($sql, $params, 0, true);
+        $this->updateCount = $this->conn->getUpdateCount();
+
+        return $this->updateCount;
+    }
+
+    /**
+     * @see PreparedStatementCommon::escape()
+     */
+    protected function escape($str)
+    {
+        if ($this->conn->getAdapter()->emulatePrepareStmt())
+            return $this->conn->getAdapter()->escape($str);
+            
+        // Nothing to do here. odbc_execute() takes care of escaping strings.
+        return $str;
+    }
+
+    /**
+     * @see PreparedStatement::setNull()
+     */
+    function setNull($paramIndex)
+    {
+    	$this->sql_cache_valid = false;
+        $this->boundInVars[$paramIndex] = null;
+    }
+
+    /**
+     * @see PreparedStatement::setBlob()
+     */
+    function setBlob($paramIndex, $blob)
+    {
+        if ($this->conn->getAdapter()->emulatePrepareStmt())
+            return parent::setBlob($paramIndex, $blob);
+            
+    	$this->sql_cache_valid = false;
+        if ($blob === null)
+        {
+            $this->setNull($paramIndex);
+            return;
+        }
+
+        if ($blob instanceof Blob)
+        {
+            if ($blob->isFromFile() && !$blob->isModified())
+            {
+                $this->boundInVars[$paramIndex] = $blob;
+                return;
+            }
+
+            $blob = $blob->__toString();
+        }
+
+        $this->boundInVars[$paramIndex] = "'" . $this->escape($blob) . "'";
+    }
+
+    /**
+     * @see PreparedStatement::setClob()
+     */
+    function setClob($paramIndex, $clob)
+    {
+        if ($this->conn->getAdapter()->emulatePrepareStmt())
+            return parent::setClob($paramIndex, $clob);
+
+    	$this->sql_cache_valid = false;
+        if ($clob === null)
+        {
+            $this->setNull($paramIndex);
+            return;
+        }
+
+        if ($clob instanceof Clob)
+        {
+            if ($clob->isFromFile() && !$clob->isModified())
+            {
+                $this->boundInVars[$paramIndex] = $clob;
+                return;
+            }
+
+            $clob = $clob->__toString();
+        }
+
+        $this->boundInVars[$paramIndex] = "'" . $this->escape($clob) . "'";
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCPreparedStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCResultSet.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCResultSet.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCResultSet.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,209 @@
+<?php
+/*
+ *  $Id: ODBCResultSet.php,v 1.2 2005/04/01 17:10:42 dlawson_mi Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/drivers/odbc/ODBCResultSetCommon.php';
+
+/**
+ * ODBC implementation of ResultSet.
+ *
+ * If the current ODBC driver does not support LIMIT or OFFSET natively,
+ * the methods in here perform some adjustments and extra checking to make
+ * sure that this behaves the same as RDBMS drivers using native OFFSET/LIMIT.
+ *
+ * This class also emulates a row count if the driver is not capable of 
+ * providing one natively.
+ * 
+ * NOTE: This class only works with drivers that support absolute cursor 
+ *       positioning (SQL_FETCH_DIRECTION = SQL_FD_FETCH_ABSOLUTE). If the
+ *       driver you are using does not support reverse/absolute cursor 
+ *       scrolling, you should use the {@link ODBCCachedResultSet} class instead.
+ *       See the documentation for ODBCCachedResultSet for instructions on how
+ *       to use it.
+ *
+ * @author    Dave Lawson <dlawson en masterytech.com>
+ * @version   $Revision: 1.2 $
+ * @package   creole.drivers.odbc
+ */
+class ODBCResultSet extends ODBCResultSetCommon implements ResultSet
+{
+    /**
+     * Number of rows in resultset.
+     *
+     * @var int
+     */
+    protected $numRows = -1;
+
+    /**
+     * True if ODBC driver supports odbc_num_rows().
+     *
+     * @var boolean
+     */
+    protected $hasRowCount = false;
+    
+    /**
+     * @see ResultSet::__construct()
+     */
+    public function __construct(Connection $conn, $result, $fetchmode = null)
+    {
+        parent::__construct($conn, $result, $fetchmode);
+
+        /**
+         * Some ODBC drivers appear not to handle odbc_num_rows() very well when
+         * more than one result handle is active at once. For example, the MySQL
+         * ODBC driver always returns the number of rows for the last executed
+         * result. For this reason, we'll store the row count here.
+         *
+         * Note also that many ODBC drivers do not support this method. In this
+         * case, getRecordCount() will perform a manual count.
+         */
+        $this->numRows = @odbc_num_rows($result->getHandle());
+        $this->hasRowCount = $this->numRows != -1;
+    }
+
+    /**
+     * @see ODBCResultSetCommon::close()
+     */
+    function close()
+    {
+        parent::close();
+        $numRows = -1;
+    }
+
+    /**
+     * @see ResultSet::seek()
+     */
+    public function seek($rownum)
+    {
+        if ($rownum < 0 || $this->limit > 0 && $rownum > $this->limit)
+            return false;
+        
+        $this->cursorPos = $rownum;
+
+        return true;
+    }
+
+    /**
+     * @see ResultSet::next()
+     */
+    public function next()
+    {
+        $this->cursorPos++;
+        
+        if ($this->limit > 0 && $this->cursorPos > $this->limit) {
+            $this->cursorPos = $this->limit+1;
+            return false;
+        }
+
+        $rowNum = $this->offset + $this->cursorPos;
+        $fields = null;
+        
+        $cols = @odbc_fetch_into($this->result->getHandle(), $fields, $rowNum);
+
+        if ($cols === false) {
+            $this->cursorPos = -1;
+            return false;
+        }
+
+        $this->fields =& $this->checkFetchMode($fields);
+        
+        return true;
+    }
+
+    /**
+     * @see ResultSet::isAfterLast()
+     */
+    public function isAfterLast()
+    {
+        // Force calculation of last record pos.
+        if ($this->cursorPos == -1)
+            $this->getRecordCount();
+            
+        return parent::isAfterLast();
+    }
+
+    /**
+     * @see ResultSet::getRecordCount()
+     */
+    function getRecordCount()
+    {
+        if ($this->hasRowCount)
+        {
+            // Use driver row count if provided.
+            $numRows = $this->numRows - $this->offset;
+
+            if ($this->limit > 0 && $numRows > $this->limit)
+                $numRows = $this->limit;
+        }
+        else 
+        {
+            // Do manual row count if driver doesn't provide one.
+            if ($this->numRows == -1) 
+            {
+                $this->numRows = 0;
+                $this->beforeFirst();
+            
+                while($this->next()) 
+                    $this->numRows++;
+            }
+                
+            $numRows = $this->numRows;
+        }
+
+        // Cursor pos is -1 when an attempt to fetch past the last row was made
+        // (or a fetch error occured).
+        
+        if ($this->cursorPos == -1)
+            $this->cursorPos = $numRows+1;
+            
+        return $numRows;
+    }
+
+    /**
+     * @see ResultSet::getBlob()
+     */
+    public function getBlob($column)
+    {
+        require_once 'creole/util/Blob.php';
+        $idx = (is_int($column) ? $column - 1 : $column);
+        if (!array_key_exists($idx, $this->fields)) { throw new SQLException("Invalid resultset column: " . $column); }
+        $data = $this->readLobData($column, ODBC_BINMODE_RETURN, $this->fields[$idx]);
+        if (!$data) { return null; }
+        $b = new Blob();
+        $b->setContents($data);
+        return $b;
+    }
+
+    /**
+     * @see ResultSet::getClob()
+     */
+    public function getClob($column)
+    {
+        require_once 'creole/util/Clob.php';
+        $idx = (is_int($column) ? $column - 1 : $column);
+        if (!array_key_exists($idx, $this->fields)) { throw new SQLException("Invalid resultset column: " . $column); }
+        $data = $this->readLobData($column, ODBC_BINMODE_CONVERT, $this->fields[$idx]);
+        if (!$data) { return null; }
+        $c = new Clob();
+        $c->setContents($data);
+        return $c;
+    }
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCResultSet.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCResultSetCommon.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCResultSetCommon.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCResultSetCommon.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,188 @@
+<?php
+/*
+ *  $Id: ODBCResultSetCommon.php,v 1.3 2006/01/17 19:44:39 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/ResultSet.php';
+require_once 'creole/common/ResultSetCommon.php';
+
+/**
+ * Base class for ODBC implementation of ResultSet.
+ *
+ * @author    Dave Lawson <dlawson en masterytech.com>
+ * @version   $Revision: 1.3 $
+ * @package   creole.drivers.odbc
+ */
+abstract class ODBCResultSetCommon extends ResultSetCommon
+{
+    /**
+     * Offset at which to start reading rows (for emulated offset).
+     * @var int
+     */
+    protected $offset = 0;
+
+    /**
+     * Maximum rows to retrieve, or 0 if all (for emulated limit).
+     * @var int
+     */
+    protected $limit = 0;
+
+    /**
+     * @see ResultSet::__construct()
+     */
+    public function __construct(Connection $conn, $result, $fetchmode = null)
+    {
+        parent::__construct($conn, $result, $fetchmode);
+    }
+
+    /**
+     * @see ResultSet::close()
+     */
+    public function close()
+    {
+        $this->result = null;
+        $this->conn = null;
+        $this->fetchmode = null;
+        $this->cursorPos = 0;
+        $this->fields = null;
+        $this->lowerAssocCase = false;
+        $this->limit = 0;
+        $this->offset = 0;
+    }
+
+    /**
+     * This function exists to set offset after ResultSet is instantiated.
+     * This function should be "protected" in Java sense: only available to classes in package.
+     * THIS METHOD SHOULD NOT BE CALLED BY ANYTHING EXCEPTION DRIVER CLASSES.
+     * @param int $offset New offset.
+     * @access protected
+     */
+    public function _setOffset($offset)
+    {
+        $this->offset = $offset;
+    }
+
+    /**
+     * This function exists to set limit after ResultSet is instantiated.
+     * This function should be "protected" in Java sense: only available to classes in package.
+     * THIS METHOD SHOULD NOT BE CALLED BY ANYTHING EXCEPTION DRIVER CLASSES.
+     * @param int $limit New limit.
+     * @access protected
+     */
+    public function _setLimit($limit)
+    {
+        $this->limit = $limit;
+    }
+
+    /**
+     * If fetchmode is FETCHMODE_ASSOC, returns the 1-based field index number
+     * for the specified column name. Otherwise returns 0 (false).
+     * @return int
+     */
+    function getFieldNum($colname)
+    {
+        $fieldnum = 0;
+
+        if ($this->fetchmode == ResultSet::FETCHMODE_ASSOC)
+        {
+            $keys = array_keys($this->fields);
+            $fieldnum = array_search($colname, $keys);
+        }
+
+        return $fieldnum;
+    }
+
+    /**
+     * Reads in any unread LOB data. For long char fields, we may already
+     * have up to odbc_longreadlen() bytes in the buffer. These are passed
+     * in via the $curdata parm. For long binary fields, no data is read
+     * initially since odbc_binmode() is set to ODBC_BINMODE_PASSTHRU.
+     * This method adjusts the binmode and longreadlen to finish reading
+     * these datatypes into the buffer. Returns a string with the complete
+     * contents.
+     *
+     * @param int|string $column Column index or name to read data from.
+     * @param int $binmode ODBC_BINMODE_RETURN for binary data, ODBC_BINMODE_CONVERT for char data.
+     * @param string $curdata Existing LOB data already in buffer.
+     * @return string
+     */
+    protected function readLobData($column, $binmode, $curdata = null)
+    {
+        // Retrieve field num
+        $fldNum = (is_int($column) ? $column : getFieldNum($column));
+
+        $data = $curdata;
+        $newdata = null;
+
+        // Adjust binmode and longreadlen
+        odbc_binmode($this->result->getHandle(), $binmode);
+        odbc_longreadlen($this->result->getHandle(), 4096);
+
+        while (1)
+        {
+            $newdata = odbc_result($this->result->getHandle(), $fldNum);
+
+            if ($newdata === false)
+                break;
+            else
+                $data .= $newdata;
+        }
+
+        // Restore the default binmode and longreadlen
+        odbc_binmode($this->result->getHandle(), ODBC_BINMODE_PASSTHRU);
+        odbc_longreadlen($this->result->getHandle(), ini_get('odbc.defaultlrl'));
+
+        // The ODBC driver I use seems to return a string with an escaped
+        // null char at the end for clob data.
+        $data = rtrim($data, "\x0");
+
+        return $data;
+    }
+    
+    /**
+     * Converts row fields to names if FETCHMODE_ASSOC is set.
+     *
+     * @param array& Row to convert.
+     *
+     * @return array& Converted row.
+     */
+    protected function checkFetchMode(&$row)
+    {
+        if ($this->fetchmode == ResultSet::FETCHMODE_ASSOC)
+        {
+            $newrow = array();
+            
+            for ($i = 0, $n = count($row); $i < $n; $i++)
+            {
+                $colname = @odbc_field_name($this->result->getHandle(), $i+1);
+                
+                if ($this->lowerAssocCase) {
+                    $colname = strtolower($colname);
+                }
+				
+                $newrow[$colname] = $row[$i];
+            }
+            
+            $row =& $newrow;
+        }
+        
+        return $row;
+    }
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCResultSetCommon.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,64 @@
+<?php
+/*
+ *  $Id: ODBCStatement.php,v 1.1 2004/07/27 23:08:30 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/Statement.php';
+require_once 'creole/common/StatementCommon.php';
+
+/**
+ * ODBC Statement
+ *
+ * @author    Dave Lawson <dlawson en masterytech.com>
+ * @version   $Revision: 1.1 $
+ * @package   creole.drivers.odbc
+ */
+class ODBCStatement extends StatementCommon implements Statement
+{
+    /**
+     * @see Statement::executeQuery()
+     */
+    public function executeQuery($sql, $fetchmode = null)
+    {
+        if ($this->resultSet)
+        {
+            $this->resultSet->close();
+            $this->resultSet = null;
+        }
+
+        $this->updateCount = null;
+
+        if ($this->conn->getAdapter()->hasLimitOffset())
+        {
+            if ($this->limit > 0 || $this->offset > 0)
+                $this->conn->applyLimit($sql, $this->offset, $this->limit);
+        }
+
+        $this->resultSet = $this->conn->executeQuery($sql, $fetchmode);
+
+        if (!$this->conn->getAdapter()->hasLimitOffset())
+        {
+            $this->resultSet->_setOffset($this->offset);
+            $this->resultSet->_setLimit($this->limit);
+        }
+
+        return $this->resultSet;
+    }
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCTypes.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCTypes.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCTypes.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,189 @@
+<?php
+
+/*
+ *  $Id: ODBCTypes.php,v 1.1 2004/07/27 23:08:30 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/CreoleTypes.php';
+
+/**
+ * ODBC types / type map.
+ *
+ * @author    Dave Lawson <dlawson en masterytech.com>
+ * @version   $Revision: 1.1 $
+ * @package   creole.drivers.odbc
+ */
+class ODBCTypes extends CreoleTypes {
+
+    /**
+     * Map ODBC native types to Creole (JDBC) types.
+     */
+    protected static $typeMap = null;
+
+    /**
+     * Reverse mapping, created on demand.
+     */
+    protected static $reverseMap = null;
+
+    /**
+     * Loads the map of ODBC data types to Creole (JDBC) types.
+     *
+     * NOTE: This function cannot map DBMS-specific datatypes. If you use a
+     *       driver which implements DBMS-specific datatypes, you will need
+     *       to modify/extend this class to add the correct mapping.
+     */
+    public static function loadTypeMap($conn = null)
+    {
+        if (self::$typeMap !== null && count(self::$typeMap) > 0)
+            return;
+
+        if ($conn == null)
+            throw new SQLException('No connection specified when loading ODBC type map.');
+
+        self::$typeMap = array();
+
+        $result = @odbc_gettypeinfo($conn->getResource());
+
+        if ($result === false)
+            throw new SQLException('Failed to retrieve type info.', $conn->nativeError());
+
+        $rowNum = 1;
+
+        while (odbc_fetch_row($result, $rowNum++))
+        {
+            $odbctypeid = odbc_result($result, 'DATA_TYPE');
+            $odbctypename = odbc_result($result, 'TYPE_NAME');
+
+            switch ($odbctypeid)
+            {
+                case SQL_CHAR:
+                    self::$typeMap[$odbctypename] = CreoleTypes::CHAR;
+                    break;
+                case SQL_VARCHAR:
+                    self::$typeMap[$odbctypename] = CreoleTypes::VARCHAR;
+                    break;
+                case SQL_LONGVARCHAR:
+                    self::$typeMap[$odbctypename] = CreoleTypes::LONGVARCHAR;
+                    break;
+                case SQL_DECIMAL:
+                    self::$typeMap[$odbctypename] = CreoleTypes::DECIMAL;
+                    break;
+                case SQL_NUMERIC:
+                    self::$typeMap[$odbctypename] = CreoleTypes::NUMERIC;
+                    break;
+                case SQL_BIT:
+                    self::$typeMap[$odbctypename] = CreoleTypes::BOOLEAN;
+                    break;
+                case SQL_TINYINT:
+                    self::$typeMap[$odbctypename] = CreoleTypes::TINYINT;
+                    break;
+                case SQL_SMALLINT:
+                    self::$typeMap[$odbctypename] = CreoleTypes::SMALLINT;
+                    break;
+                case SQL_INTEGER:
+                    self::$typeMap[$odbctypename] = CreoleTypes::INTEGER;
+                    break;
+                case SQL_BIGINT:
+                    self::$typeMap[$odbctypename] = CreoleTypes::BIGINT;
+                    break;
+                case SQL_REAL:
+                    self::$typeMap[$odbctypename] = CreoleTypes::REAL;
+                    break;
+                case SQL_FLOAT:
+                    self::$typeMap[$odbctypename] = CreoleTypes::FLOAT;
+                    break;
+                case SQL_DOUBLE:
+                    self::$typeMap[$odbctypename] = CreoleTypes::DOUBLE;
+                    break;
+                case SQL_BINARY:
+                    self::$typeMap[$odbctypename] = CreoleTypes::BINARY;
+                    break;
+                case SQL_VARBINARY:
+                    self::$typeMap[$odbctypename] = CreoleTypes::VARBINARY;
+                    break;
+                case SQL_LONGVARBINARY:
+                    self::$typeMap[$odbctypename] = CreoleTypes::LONGVARBINARY;
+                    break;
+                case SQL_DATE:
+                    self::$typeMap[$odbctypename] = CreoleTypes::DATE;
+                    break;
+                case SQL_TIME:
+                    self::$typeMap[$odbctypename] = CreoleTypes::TIME;
+                    break;
+                case SQL_TIMESTAMP:
+                    self::$typeMap[$odbctypename] = CreoleTypes::TIMESTAMP;
+                    break;
+                case SQL_TYPE_DATE:
+                    self::$typeMap[$odbctypename] = CreoleTypes::DATE;
+                    break;
+                case SQL_TYPE_TIME:
+                    self::$typeMap[$odbctypename] = CreoleTypes::TIME;
+                    break;
+                case SQL_TYPE_TIMESTAMP:
+                    self::$typeMap[$odbctypename] = CreoleTypes::TIMESTAMP;
+                    break;
+                default:
+                    self::$typeMap[$odbctypename] = CreoleTypes::OTHER;
+                    break;
+            }
+        }
+
+        @odbc_free_result($result);
+    }
+
+    /**
+     * This method returns the generic Creole (JDBC-like) type
+     * when given the native db type.
+     * @param string $nativeType DB native type (e.g. 'TEXT', 'byetea', etc.).
+     * @return int Creole native type (e.g. CreoleTypes::LONGVARCHAR, CreoleTypes::BINARY, etc.).
+     */
+    public static function getType($nativeType)
+    {
+        if (!self::$typeMap)
+            self::loadTypeMap();
+
+        $t = strtoupper($nativeType);
+
+        if (isset(self::$typeMap[$t])) {
+            return self::$typeMap[$t];
+        } else {
+            return CreoleTypes::OTHER;
+        }
+    }
+
+    /**
+     * This method will return a native type that corresponds to the specified
+     * Creole (JDBC-like) type.
+     * If there is more than one matching native type, then the LAST defined
+     * native type will be returned.
+     * @param int $creoleType
+     * @return string Native type string.
+     */
+    public static function getNativeType($creoleType)
+    {
+        if (!self::$typeMap)
+            self::loadTypeMap();
+
+        if (self::$reverseMap === null) {
+            self::$reverseMap = array_flip(self::$typeMap);
+        }
+        return @self::$reverseMap[$creoleType];
+    }
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/ODBCTypes.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/README
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/README	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/README	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,90 @@
+
+
+Creole ODBC Bridge Driver
+=========================
+
+
+I. Overview
+-----------
+
+In the text below, the word "driver" can get somewhat muddled since there are 
+two libraries concerned here (Creole & ODBC). So, we'll use the term "bridge 
+driver" to refer to Creole's ODBC bridge driver, and "ODBC driver" to refer to 
+an ODBC database driver.
+
+The Creole ODBC Bridge driver provides a solution for databases which 
+currently have no PHP-native interface. It is currently in an experimental
+stage of development. It has been tested with two ODBC drivers (Sequiter's
+CodeBase ODBC driver and the MySQL ODBC driver (as a baseline test)). To
+use any other ODBC drivers you may need to write your own ODBCAdapter-derived
+class (see below).
+
+
+II. ODBCAdapter
+---------------
+
+Because ODBC itself is a database abstraction library, the bridge driver needed
+a way of hiding ODBC driver-specific behavior. The solution to this was to 
+create an adapter layer (akin to how the Propel runtime engine works). Think of
+it as a sub-driver for the bridge driver. Any ODBC driver-specific behavior is
+handled by an ODBCAdapter-derived class. To use a specific adapter class, you
+specify its name via a parameter in the connection string:
+
+odbc://localhost/DSN=CodeBase;?adapter=CodeBase
+
+The string above will load the following file as the adapter to use with the
+bridge driver: creole/drivers/odbc/adapters/CodeBaseAdapter.php
+
+Some ODBC drivers are limited in support for various Creole features. The 
+ODBCAdapter also provides a method for emulation of some of these missing 
+features:
+
+    -The emulatePrepareStmt() method provides a switch for enabling prepared
+     statement emulation for drivers that do not support (or have trouble with)
+     prepared statements. This emulation is disabled by default.
+     
+    -The hasLimitOffset() method provides a switch for enabling LIMIT/OFFSET 
+     emulation for drivers that do not support this. This emulation is enabled
+     by default. The LIMIT/OFFSET emulation was borrowed from the MSSQL Creole 
+     driver.
+
+    -The createResultSet() method provides a switch for enabling cached 
+     result sets. To enable this feature, return an instance of 
+     ODBCCachedResultSet in the createResultSet() method of your ODBCAdapter-
+     derived class. This can be useful as a workaround for ODBC drivers which
+     lack support for record count retrieval, reverse/absolute cursor
+     scrolling, etc. In most cases, result rows are cached on-demand. So if 
+     you only read the first couple rows of a result, then only those rows will 
+     be cached.
+
+    -The getIdGenerator() method provides a switch for enabling sequence
+     emulation. This feature is enabled by default in ODBCAdapter and is 
+     implemented in the ODBCIdGenerator class. The emulation code was inspired
+     by the PEAR::DB nextID() method. If your database supports sequences or
+     autoincrement natively, you can return your own IdGenerator-derived class 
+     instead. Check out some of the other Creole drivers for IdGenerator 
+     examples.
+     
+     
+III. Incomplete Features
+------------------------
+
+    -The database metadata classes are not fully tested/complete. Specifically, 
+     the ODBCDatabaseInfo class does not currently set the database name. There 
+     may be other problems as well. 
+ 
+    -The Creole CallableStatement class (stored procedures) is not currently 
+     implemented. No immediate plans to do this in the future, but it looks
+     feasible.
+
+
+IV. Known Issues
+----------------
+
+This driver was developed using the PHP v5.0 final build. During the course 
+of testing I uncovered several bugs in the php_odbc module. I submitted
+patches for these bugs, but have not yet received word that they were 
+committed (they were just submitted this morning). If you want more details
+on the problems I encountered or would like a copy of the patches, please
+e-mail me (dlawson en masterytech.com).
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/CodeBaseAdapter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/CodeBaseAdapter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/CodeBaseAdapter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,73 @@
+<?php
+/*
+ *  $Id: CodeBaseAdapter.php,v 1.3 2005/10/17 19:03:51 dlawson_mi Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/drivers/odbc/adapters/ODBCAdapter.php';
+
+/**
+ * CodeBase driver-specific behavior.
+ *
+ * This adapter is for Sequiter's CodeBaseSQL product. It is a dBase ODBC
+ * driver. The driver only supports forward-only cursor scrolling so this
+ * adapter causes the ODBCCachedResultSet to be used.
+ *
+ * A couple other quirks exist: 
+ * 
+ * 1) Cannot get blobs to work correctly. If I try writing one to a 
+ *    LONGVARBINARY typed field, only the first few bytes are written.
+ *    This will cause the ResultSetTest::testGetBlob() test case to fail
+ *    when running tests for the driver.
+ *
+ * 2) For some reason the character count is off for the 
+ *    ResultSetTest::testSetClob() test case _only_ when running from the 
+ *    command line. If I run the same test through a web server it works fine.
+ *    Looks like it has something to do with line endings in Windows. The 
+ *    difference in file sizes is 9803 vs 10090.
+ *
+ * 3) Setting a clob field to null writes a space to the field in the table. 
+ *    This causes the PreparedStatementTest::testSetNull() test case to fail 
+ *    when running tests for the driver.
+ *
+ * @author    Dave Lawson <dlawson en masterytech.com>
+ * @version   $Revision: 1.3 $
+ * @package   creole.drivers.odbc
+ */
+class CodeBaseAdapter extends ODBCAdapter
+{
+    /**
+     * @see ODBCAdapter::createResultSet()
+     */
+    public function preservesColumnCase()
+    {
+        return false;
+    }
+
+    /**
+     * @see ODBCAdapter::createResultSet()
+     */
+    public function createResultSet($conn, $odbcresult, $fetchmode)
+    {
+        require_once 'creole/drivers/odbc/ODBCResultSet.php';
+        return new ODBCResultSet($conn, $odbcresult, $fetchmode, true);
+    }
+
+}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/CodeBaseAdapter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/MySQLAdapter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/MySQLAdapter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/MySQLAdapter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,78 @@
+<?php
+/*
+ *  $Id: MySQLAdapter.php,v 1.1 2004/07/27 23:08:30 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/drivers/odbc/ODBCCachedResultSet.php';
+require_once 'creole/drivers/odbc/ODBCResultSet.php';
+require_once 'creole/drivers/odbc/adapters/ODBCAdapter.php';
+
+/**
+ * Implements MySQL driver-specific behavior.
+ *
+ * Obviously it would be much more efficient to simply use the Creole
+ * MySQL driver. This adapter was created for the sole purpose of testing
+ * the ODBC driver.
+ *
+ * @author    Dave Lawson <dlawson en masterytech.com>
+ * @version   $Revision: 1.1 $
+ * @package   creole.drivers.odbc
+ */
+class MySQLAdapter extends ODBCAdapter
+{
+    /**
+     * @see ODBCAdapter::hasLimitOffset()
+     */
+    public function hasLimitOffset()
+    {
+        return true;
+    }
+
+    /**
+     * @see ODBCAdapter::applyLimit()
+     */
+    public function applyLimit(&$sql, $offset, $limit)
+    {
+        if ( $limit > 0 ) {
+            $sql .= " LIMIT " . ($offset > 0 ? $offset . ", " : "") . $limit;
+        } else if ( $offset > 0 ) {
+            $sql .= " LIMIT " . $offset . ", 18446744073709551615";
+        }
+    }
+
+    /**
+     * @see ODBCAdapter::escape()
+     */
+    public function escape($str)
+    {
+        return addslashes($str);
+    }
+
+    /**
+     * @see ODBCAdapter::createResultSet()
+     */
+    public function createResultSet($conn, $odbcresult, $fetchmode)
+    {
+//        return new ODBCCachedResultSet($conn, $odbcresult, $fetchmode, true);
+        return new ODBCResultSet($conn, $odbcresult, $fetchmode);
+    }
+
+}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/MySQLAdapter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/ODBCAdapter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/ODBCAdapter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/ODBCAdapter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,115 @@
+<?php
+/*
+ *  $Id: ODBCAdapter.php,v 1.3 2005/10/17 19:03:51 dlawson_mi Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * Default class for ODBC driver-specific behavior.
+ *
+ * @author    Dave Lawson <dlawson en masterytech.com>
+ * @version   $Revision: 1.3 $
+ * @package   creole.drivers.odbc
+ */
+class ODBCAdapter
+{
+    /**
+     * Returns true if column case is preserved in the database when a table
+     * is first created. Returns false if table does not preserve case (i.e.
+     * ProductID => PRODUCTID).
+     *
+     * @return boolean
+     */
+    public function preservesColumnCase()
+    {
+        return true;
+    }
+
+    /**
+     * Returns true if prepared statements should be emulated. This
+     * might be useful if your driver does not support (or has trouble with)
+     * prepared statements.
+     * 
+     * @return boolean
+     */
+    public function emulatePrepareStmt()
+    {
+        return false;
+    }
+    
+    /**
+     * Returns true if ODBC driver supports LIMIT/OFFSET via SQL.
+     *
+     * @return boolean
+     */
+    public function hasLimitOffset()
+    {
+        return false;
+    }
+
+    /**
+     * @see Connection::applyLimit()
+     */
+    public function applyLimit(&$sql, $offset, $limit)
+    {
+    }
+
+    /**
+     * @see PreparedStatementCommon::escape()
+     */
+    public function escape($str)
+    {
+        // use this instead of magic_quotes_sybase + addslashes(),
+        // just in case multiple RDBMS being used at the same time
+        return str_replace("'", "''", $str);
+    }
+
+    /**
+     * Returns an instance of the default resultset.
+     *
+     * @return boolean
+     */
+    public function createResultSet($conn, $odbcresult, $fetchmode)
+    {
+        require_once 'creole/drivers/odbc/ODBCResultSet.php';
+        return new ODBCResultSet($conn, $odbcresult, $fetchmode);
+    }
+
+    /**
+     * Returns the default ODBCIdGenerator for emulating sequences.
+     *
+     * @return ODBCIdGenerator
+     */
+    public function getIdGenerator($conn)
+    {
+        require_once 'creole/drivers/odbc/ODBCIdGenerator.php';
+        return new ODBCIdGenerator($conn);
+    }
+
+    /**
+     * Returns true if driver support transactions.
+     * 
+     * @return boolean
+     */
+    public function supportsTransactions()
+    {
+        return true;
+    }
+}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/adapters/ODBCAdapter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/metadata/ODBCDatabaseInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/metadata/ODBCDatabaseInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/metadata/ODBCDatabaseInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,66 @@
+<?php
+/*
+ *  $Id: ODBCDatabaseInfo.php,v 1.2 2006/01/17 19:44:39 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/metadata/DatabaseInfo.php';
+
+/**
+ * ODBC implementation of DatabaseInfo.
+ *
+ * @todo Still need a way to obtain the database name. Not sure how to do this yet.
+ * @todo This might need to be an {@link ODBCAdapter} method.
+ *
+ * @author    Dave Lawson <dlawson en masterytech.com>
+ * @version   $Revision: 1.2 $
+ * @package   creole.drivers.odbc.metadata
+ */
+class ODBCDatabaseInfo extends DatabaseInfo {
+
+    /**
+     * @see DatabaseInfo::initTables()
+     */
+    protected function initTables()
+    {
+        include_once 'creole/drivers/odbc/metadata/ODBCTableInfo.php';
+
+        $result = @odbc_tables($this->conn->getResource());
+
+        if (!$result)
+            throw new SQLException('Could not list tables', $this->conn->nativeError());
+
+        while (odbc_fetch_row($result))
+        {
+            $tablename = strtoupper(odbc_result($result, 'TABLE_NAME'));
+            $this->tables[$tablename] = new ODBCTableInfo($this, $tablename);
+        }
+
+        @odbc_free_result($result);
+    }
+
+    /**
+     * @return void
+     * @throws SQLException
+     */
+    protected function initSequences()
+    {
+        // Not sure how this is used yet.
+    }
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/metadata/ODBCDatabaseInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/metadata/ODBCTableInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/metadata/ODBCTableInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/metadata/ODBCTableInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,141 @@
+<?php
+/*
+ *  $Id: ODBCTableInfo.php,v 1.2 2006/01/17 19:44:39 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/metadata/TableInfo.php';
+
+/**
+ * ODBC implementation of TableInfo.
+ *
+ * @author    Dave Lawson <dlawson en masterytech.com>
+ * @version   $Revision: 1.2 $
+ * @package   creole.drivers.odbc.metadata
+ */
+class ODBCTableInfo extends TableInfo {
+
+    /**
+     * @see TableInfo::initColumns()
+     */
+    protected function initColumns()
+    {
+        include_once 'creole/metadata/ColumnInfo.php';
+        include_once 'creole/drivers/odbc/ODBCTypes.php';
+
+        ODBCTypes::loadTypeMap($this->conn);
+
+        $result = @odbc_columns($this->conn->getResource(), $this->dbname, '', $this->name);
+
+        if (!$result)
+            throw new SQLException('Could not get column names', $this->conn->nativeError());
+
+        while (odbc_fetch_row($result))
+        {
+            $name = odbc_result($result, 'COLUMN_NAME');
+            $type = odbc_result($result, 'TYPE_NAME');
+            $length = odbc_result($result, 'LENGTH');
+            $is_nullable = odbc_result($result, 'NULLABLE');
+            $default = '';
+            $precision = odbc_result($result, 'PRECISION');
+            $scale = odbc_result($result, 'SCALE');
+            $this->columns[$name] = new ColumnInfo($this, $name, ODBCTypes::getType($type), $type, $length, $precision, $scale, $is_nullable, $default);
+        }
+
+        @odbc_free_result($result);
+
+        $this->colsLoaded = true;
+    }
+
+    /**
+     * @see TableInfo::initPrimaryKey()
+     */
+    protected function initPrimaryKey()
+    {
+        include_once 'creole/metadata/PrimaryKeyInfo.php';
+
+        // columns have to be loaded first
+        if (!$this->colsLoaded) $this->initColumns();
+
+        $result = @odbc_primarykeys($this->conn->getResource(), $this->dbname, '', $this->name);
+
+        while (odbc_fetch_row($result))
+        {
+            $name = odbc_result($result, 'COLUMN_NAME');
+
+            if (!isset($this->primaryKey))
+                $this->primaryKey = new PrimaryKeyInfo($name);
+
+            $this->primaryKey->addColumn($this->columns[$name]);
+        }
+
+        @odbc_free_result($result);
+
+        $this->pkLoaded = true;
+    }
+
+    /**
+     * @see TableInfo::initIndexes()
+     */
+    protected function initIndexes()
+    {
+        // Not sure if this can be implemented in a driver-independent way.
+    }
+
+    /**
+     * @see TableInfo::initForeignKeys()
+     */
+    protected function initForeignKeys()
+    {
+        // columns have to be loaded first
+        if (!$this->colsLoaded) $this->initColumns();
+
+        $result = @odbc_foreignkeys($this->conn->getResource(), '', '', '', $this->dbname, '', $this->name);
+
+        while (odbc_fetch_row($result))
+        {
+            $name = odbc_result($result, 'COLUMN_NAME');
+            $ftbl = odbc_result($result, 'FKTABLE_NAME');
+            $fcol = odbc_result($result, 'FKCOLUMN_NAME');
+
+            if (!isset($this->foreignKeys[$name]))
+            {
+                $this->foreignKeys[$name] = new ForeignKeyInfo($name);
+
+                if (($foreignTable = $this->database->getTable($ftbl)) === null)
+                {
+                    $foreignTable = new TableInfo($ltbl);
+                    $this->database->addTable($foreignTable);
+                }
+
+                if (($foreignCol = $foreignTable->getColumn($name)) === null)
+                {
+                    $foreignCol = new ColumnInfo($foreignTable, $name);
+                    $foreignTable->addColumn($foreignCol);
+                }
+
+                $this->foreignKeys[$name]->addReference($this->columns[$name], $foreignCol);
+            }
+        }
+
+        @odbc_free_result($result);
+
+        $this->fksLoaded = true;
+    }
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/odbc/metadata/ODBCTableInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8Connection.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8Connection.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8Connection.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,398 @@
+<?php
+
+/**
+ *  $Id: OCI8Connection.php,v 1.18 2005/10/17 19:03:51 dlawson_mi Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ( INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/Connection.php';
+require_once 'creole/common/ConnectionCommon.php';
+include_once 'creole/drivers/oracle/OCI8ResultSet.php';
+
+/**
+ * Oracle implementation of Connection.
+ * 
+ * @author    David Giffin <david en giffin.org>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @author    Stig Bakken <ssb en fast.no> 
+ * @author    Lukas Smith
+ * @version   $Revision: 1.18 $
+ * @package   creole.drivers.oracle
+ */ 
+class OCI8Connection extends ConnectionCommon implements Connection
+{        
+    protected $lastStmt			= null;    
+
+    /**
+     * Auto commit mode for oci_execute
+     * @var int
+     */
+    protected $execMode			= OCI_COMMIT_ON_SUCCESS;
+
+    /**
+     * Connect to a database and log in as the specified user.
+     *
+     * @param array $dsn The data source hash.
+     * @param int $flags Any connection flags.
+     * @access public
+     * @throws SQLException
+     * @return void
+     */
+    function connect( $dsninfo, $flags = 0 )
+    {
+        if ( !extension_loaded( 'oci8' ) )
+		{
+            throw new SQLException( 'oci8 extension not loaded' );
+        }
+
+        $this->dsn				= $dsninfo;
+        $this->flags			= $flags;
+        
+        $persistent				=
+			( $flags & Creole::PERSISTENT === Creole::PERSISTENT );
+        
+        $user					= $dsninfo[ 'username' ];
+        $pw						= $dsninfo[ 'password' ];
+        $hostspec				= $dsninfo[ 'hostspec' ];
+        $port       = $dsninfo[ 'port' ];
+        $db					= $dsninfo[ 'database' ];
+
+        $connect_function		= ( $persistent )
+									? 'oci_pconnect'
+									: 'oci_connect';
+		$encoding = !empty($dsninfo['encoding']) ? $dsninfo['encoding'] : null;
+
+		@ini_set( 'track_errors', true );
+		
+		if ( $hostspec && $port )
+		{
+		  $hostspec .= ':' . $port;
+		}
+
+        if ( $db && $hostspec && $user && $pw )
+	{
+			$conn				= @$connect_function( $user, $pw, "//$hostspec/$db", $encoding);
+	}
+        elseif ( $hostspec && $user && $pw )
+		{
+			$conn				= @$connect_function( $user, $pw, $hostspec, $encoding );
+        }
+		
+		elseif ( $user || $pw )
+		{
+			$conn				= @$connect_function( $user, $pw, null, $encoding );
+        }
+		
+		else
+		{
+			$conn				= false;
+        }
+
+        @ini_restore( 'track_errors' );
+        
+        if ( $conn == false )
+		{
+            $error				= oci_error();
+            $error				= ( is_array( $error ) )
+									? $error[ 'message' ]
+									: null;
+
+            throw new SQLException( 'connect failed', $error );
+        }
+
+        $this->dblink			= $conn;
+
+        //connected ok, need to set a few environment settings
+        //please note, if this is changed, the function setTimestamp and setDate in OCI8PreparedStatement.php
+        //must be changed to match
+        $sql = "ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'";
+        $this->executeQuery($sql);
+    }
+
+
+    /**
+     * @see Connection::disconnect()
+     */
+    function close()
+    {
+        $ret = @oci_close( $this->dblink );
+        $this->dblink = null;
+        return $ret;
+    }        
+    
+    /**
+     * @see Connection::executeQuery()
+     */
+    function executeQuery( $sql, $fetchmode = null )
+    {
+        $this->lastQuery		= $sql;
+
+        // $result = @oci_parse( $this->dblink, $sql );
+        $result					= oci_parse( $this->dblink, $sql );
+
+        if ( ! $result )
+		{
+            throw new SQLException( 'Unable to prepare query'
+				, $this->nativeError()
+				, $sql
+			);
+        }
+
+        $success				= oci_execute( $result, $this->execMode );
+
+        if ( ! $success )
+		{
+            throw new SQLException( 'Unable to execute query'
+				, $this->nativeError( $result )
+				, $sql
+			);
+        }
+        
+        return new OCI8ResultSet( $this, $result, $fetchmode );
+    }
+
+    
+    /**
+     * @see Connection::simpleUpdate()
+     */
+    
+    function executeUpdate( $sql )
+    {    
+        $this->lastQuery		= $sql;
+
+        $statement				= oci_parse( $this->dblink, $sql );
+		
+        if ( ! $statement )
+		{
+            throw new SQLException( 'Unable to prepare update'
+				, $this->nativeError()
+				, $sql
+			);
+        }
+                
+        $success				= oci_execute( $statement, $this->execMode );
+
+        if ( ! $success )
+		{
+            throw new SQLException( 'Unable to execute update'
+				, $this->nativeError( $statement )
+				, $sql
+			);
+        }
+
+        $this->lastStmt			= $statement;
+
+        return oci_num_rows( $statement );
+    }
+
+    /**
+     * Start a database transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function beginTrans()
+    {
+        $this->execMode			= OCI_DEFAULT;
+    }
+        
+    /**
+     * Commit the current transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function commitTrans()
+    {
+        $result					= oci_commit( $this->dblink );
+
+        if ( ! $result )
+		{
+            throw new SQLException( 'Unable to commit transaction'
+				, $this->nativeError()
+			);
+        }
+
+        $this->execMode			= OCI_COMMIT_ON_SUCCESS;
+    }
+
+    
+    /**
+     * Roll back ( undo ) the current transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function rollbackTrans()
+    {
+        $result					= oci_rollback( $this->dblink );
+
+        if ( ! $result )
+		{
+            throw new SQLException( 'Unable to rollback transaction'
+				, $this->nativeError()
+			);
+        }
+
+        $this->execMode			= OCI_COMMIT_ON_SUCCESS;
+    }
+
+    
+    /**
+     * Gets the number of rows affected by the data manipulation
+     * query.
+     *
+     * @return int Number of rows affected by the last query.
+     * @todo -cOCI8Connection Figure out whether getUpdateCount() should throw exception on error or just return 0.
+     */
+    function getUpdateCount()
+    {
+        if ( ! $this->lastStmt )
+		{
+            return 0;
+        }
+
+        $result					= oci_num_rows( $this->lastStmt );
+
+        if ( $result === false )
+		{
+            throw new SQLException( 'Update count failed'
+				, $this->nativeError( $this->lastStmt )
+			);
+        }
+
+        return $result;
+    }
+
+
+   /**
+    * Build Oracle-style query with limit or offset.
+    * If the original SQL is in variable: query then the requlting
+    * SQL looks like this:
+    * <pre>
+    * SELECT B.* FROM ( 
+    *          SELECT A.*, rownum as TORQUE$ROWNUM FROM ( 
+    *                  query
+    *           ) A
+    *      ) B WHERE B.TORQUE$ROWNUM > offset AND B.TORQUE$ROWNUM
+    *     <= offset + limit
+    * </pre>
+    *
+    * @param string &$sql the query
+    * @param int $offset
+    * @param int $limit
+    * @return void ( $sql parameter is currently manipulated directly )
+    */
+   public function applyLimit( &$sql, $offset, $limit )
+   {
+        $sql					=
+			'SELECT B.* FROM (  '
+			.  'SELECT A.*, rownum AS CREOLE$ROWNUM FROM (  '
+			. $sql
+			. '  ) A '
+			.  ' ) B WHERE ';
+
+        if ( $offset > 0 )
+		{
+            $sql				.= ' B.CREOLE$ROWNUM > ' . $offset;            
+
+            if ( $limit > 0 )
+			{
+                $sql			.= ' AND B.CREOLE$ROWNUM <= '
+									. ( $offset + $limit );
+            }
+        }
+
+		else
+		{
+			$sql				.= ' B.CREOLE$ROWNUM <= ' . $limit;
+		}
+   } 
+
+    /**
+     * Get the native Oracle Error Message as a string.
+     *
+     * @param string $msg The Internal Error Message
+     * @param mixed $errno The Oracle Error resource
+     */
+    public function nativeError( $result = null )
+	{
+		if ( $result !== null )
+		{
+			$error				= oci_error( $result );
+		}
+	
+		else
+		{
+			$error				= oci_error( $this->dblink );
+		}         
+
+		return $error[ 'code' ] . ': ' . $error[ 'message' ];
+	}
+    
+    
+    /**
+     * @see Connection::getDatabaseInfo()
+     */
+    public function getDatabaseInfo()
+    {
+        require_once 'creole/drivers/oracle/metadata/OCI8DatabaseInfo.php';
+
+        return new OCI8DatabaseInfo( $this );
+    }
+    
+    /**
+     * @see Connection::getIdGenerator()
+     */
+    public function getIdGenerator()
+    {
+        require_once 'creole/drivers/oracle/OCI8IdGenerator.php';
+
+        return new OCI8IdGenerator( $this );
+    }
+    
+    /**
+     * Oracle supports native prepared statements, but the oci_parse call
+     * is actually called by the OCI8PreparedStatement class because
+     * some additional SQL processing may be necessary ( e.g. to apply limit ).
+     * @see OCI8PreparedStatement::executeQuery()
+     * @see OCI8PreparedStatement::executeUpdate()
+     * @see Connection::prepareStatement()
+     */
+    public function prepareStatement( $sql ) 
+    {
+        require_once 'creole/drivers/oracle/OCI8PreparedStatement.php';
+
+        return new OCI8PreparedStatement( $this, $sql );
+    }
+    
+    /**
+     * @see Connection::prepareCall()
+     */
+    public function prepareCall( $sql )
+	{
+        throw new SQLException( 'Oracle driver does not yet support stored procedures using CallableStatement.' );
+    }
+    
+    /**
+     * @see Connection::createStatement()
+     */
+    public function createStatement()
+    {
+        require_once 'creole/drivers/oracle/OCI8Statement.php';
+
+        return new OCI8Statement( $this );
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8Connection.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8IdGenerator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8IdGenerator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8IdGenerator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,65 @@
+<?php
+
+require_once 'creole/IdGenerator.php';
+
+/**
+ * Oracle (OCI8) IdGenerator implimenation.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.5 $
+ * @package   creole.drivers.oracle
+ */
+class OCI8IdGenerator implements IdGenerator {
+    
+    /** Connection object that instantiated this class */
+    private $conn;
+
+    /**
+     * Creates a new IdGenerator class, saves passed connection for use
+     * later by getId() method.
+     * @param Connection $conn
+     */
+    public function __construct(Connection $conn)
+    {
+        $this->conn = $conn;
+    }
+    
+    /**
+     * @see IdGenerator::isBeforeInsert()
+     */
+    public function isBeforeInsert()
+    {
+        return true;
+    }    
+    
+    /**
+     * @see IdGenerator::isAfterInsert()
+     */
+    public function isAfterInsert()
+    {
+        return false;
+    }
+        
+    /**
+     * @see IdGenerator::getIdMethod()
+     */
+    public function getIdMethod()
+    {
+        return self::SEQUENCE;
+    }
+    
+    /**
+     * @see IdGenerator::getId()
+     */
+    public function getId($name = null)
+    {
+        if ($name === null) {
+            throw new SQLException("You must specify the sequence name when calling getId() method.");
+        }
+        $rs = $this->conn->executeQuery("select " . $name . ".nextval from dual", ResultSet::FETCHMODE_NUM);
+        $rs->next();
+        return $rs->getInt(1);
+    }
+    
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8IdGenerator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8PreparedStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8PreparedStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8PreparedStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,424 @@
+<?php
+/*
+ *  $Id: OCI8PreparedStatement.php,v 1.26 2006/01/30 21:32:05 sethr Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/PreparedStatement.php';
+require_once 'creole/common/PreparedStatementCommon.php';
+
+/**
+ * Oracle (OCI8) implementation of PreparedStatement.
+ * 
+ * @author    David Giffin <david en giffin.org>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.26 $
+ * @package   creole.drivers.oracle
+ */
+class OCI8PreparedStatement extends PreparedStatementCommon implements PreparedStatement {
+
+    /**
+     * Descriptor holders for LOB values.
+     * There are other types of descriptors, but we need to keep
+     * them separate, because we need to execute the save()/savefile() method
+     * on lob descriptors.
+     * @var array object from oci_new_descriptor
+     */
+    private $lobDescriptors = array();
+    
+    /**
+     * Hold any Blob/Clob data.
+     * These can be matched (by key) to descriptors in $lobDescriptors.
+     * @var array Lob[]
+     */
+    private $lobs = array();        
+
+    /**
+     * Array to store the columns in an insert or update statement.
+     * This is necessary for the proper handling of lob variables
+     * @var arrary columns[]
+     */
+    private $columns = array();
+    
+    /**
+     * If the statement is set, free it.
+     * @see PreparedStatement::close()
+     */
+    function close()
+    {
+         if (isset($this->stmt))
+              @oci_free_statement($this->stmt);
+    }
+    
+    /**
+     * Nothing to do - since oci_bind is used to insert data, no escaping is needed
+     * @param string $str
+     * @return string
+     */
+    protected function escape($str)
+    {
+        return $str;
+    }
+
+    /**
+     * Executes the SQL query in this PreparedStatement object and returns the resultset generated by the query.
+     * @param mixed $p1 Either (array) Parameters that will be set using PreparedStatement::set() before query is executed or (int) fetchmode.
+     * @param int $fetchmode The mode to use when fetching the results (e.g. ResultSet::FETCHMODE_NUM, ResultSet::FETCHMODE_ASSOC).
+     * @return ResultSet
+     * @throws SQLException if a database access error occurs.
+     */
+    public function executeQuery($p1 = null, $fetchmode = null)
+    {
+        $params = null;
+        if ($fetchmode !== null) {
+            $params = $p1;
+        } elseif ($p1 !== null) {
+            if (is_array($p1)) $params = $p1;
+            else $fetchmode = $p1;
+        }
+        
+        if ($params) {
+            for($i=0,$cnt=count($params); $i < $cnt; $i++) {
+                $this->set($i+1, $params[$i]);
+            }
+        }
+
+        $this->updateCount = null; // reset        
+                
+        $sql = $this->sqlToOracleBindVars($this->sql);
+        
+        if ($this->limit > 0 || $this->offset > 0) {
+            $this->conn->applyLimit($sql, $this->offset, $this->limit);
+        }
+        
+        $result = oci_parse($this->conn->getResource(), $sql);
+        if (!$result) {
+            throw new SQLException("Unable to prepare query", $this->conn->nativeError(), $this->sqlToOracleBindVars($this->sql));
+        }
+        
+        // bind all variables
+        $this->bindVars($result);
+        
+        $success = oci_execute($result, OCI_DEFAULT);
+        if (!$success) {
+            throw new SQLException("Unable to execute query", $this->conn->nativeError($result), $this->sqlToOracleBindVars($this->sql));
+        }
+        
+        $this->resultSet = new OCI8ResultSet($this->conn, $result, $fetchmode);
+        
+        return $this->resultSet;
+    }
+    
+    /**
+     * Executes the SQL INSERT, UPDATE, or DELETE statement in this PreparedStatement object.
+     * 
+     * @param array $params Parameters that will be set using PreparedStatement::set() before query is executed.
+     * @return int Number of affected rows (or 0 for drivers that return nothing).
+     * @throws SQLException if a database access error occurs.
+     */
+    public function executeUpdate($params = null) 
+    {
+        if ($params) {
+            for($i=0,$cnt=count($params); $i < $cnt; $i++) {
+                $this->set($i+1, $params[$i]);
+            }
+        }
+
+        if($this->resultSet) $this->resultSet->close();
+        $this->resultSet = null; // reset
+
+        $stmt = oci_parse($this->conn->getResource(), $this->sqlToOracleBindVars($this->sql));
+
+        if (!$stmt) {
+            throw new SQLException("Unable to prepare update", $this->conn->nativeError(), $this->sqlToOracleBindVars($this->sql));
+        }
+        
+        // bind all variables
+        $this->bindVars($stmt); 
+
+        // Even if autocommit is on, delay commit until after LOBS have been saved
+        $success = oci_execute($stmt, OCI_DEFAULT);
+        if (!$success) {
+            throw new SQLException("Unable to execute update", $this->conn->nativeError($stmt), $this->sqlToOracleBindVars($this->sql));
+        }        
+
+        // save data in any LOB descriptors, then free them
+        foreach($this->lobDescriptors as $paramIndex => $lobster) {
+            $lob = $this->lobs[$paramIndex]; // corresponding Blob/Clob
+            if ($lob->isFromFile()) {
+                $success = $lobster->savefile($lob->getInputFile());
+            } else {
+                $success = $lobster->save($lob->getContents());
+            }
+            if (!$success) {                
+                $lobster->free();
+                throw new SQLException("Error saving lob bound to " . $paramIndex);
+            }
+            $lobster->free();
+        }
+
+        if ($this->conn->getAutoCommit()) {
+            oci_commit($this->conn->getResource()); // perform deferred commit
+        }
+        
+        $this->updateCount = @oci_num_rows($stmt);
+
+        return $this->updateCount;
+    }
+
+    /**
+     * Performs the actual binding of variables using oci_bind_by_name().
+     * 
+     * This may seem like useless overhead, but the reason why calls to oci_bind_by_name() 
+     * are not performed in the set*() methods is that it is possible that the SQL will
+     * need to be modified -- e.g. by a setLimit() call -- and re-prepared.  We cannot assume
+     * that the statement has been prepared when the set*() calls are invoked.  This also means,
+     * therefore, that the set*() calls will not throw exceptions; all exceptions will be thrown
+     * when the statement is prepared.
+     * 
+     * @param resource $stmt The statement result of oci_parse to use for binding.
+     * @return void
+     */
+    private function bindVars($stmt)
+    {
+        foreach ($this->boundInVars as $idx => $val) {
+            $idxName = ":var" . $idx;
+            if (!oci_bind_by_name($stmt, $idxName, $this->boundInVars[$idx], -1)) {
+                throw new SQLException("Erorr binding value to placeholder " . $idx);
+            } 
+        } // foreach
+
+        foreach ($this->lobs as $idx => $val) {
+            $idxName = ":var" . $idx;
+            if (class_exists('Blob') && $val instanceof Blob){
+                if (!oci_bind_by_name($stmt, $idxName, $this->lobDescriptors[$idx], -1, OCI_B_BLOB))
+                    throw new SQLException("Erorr binding blob to placeholder " . $idx);
+            } elseif (class_exists('Clob') && $val instanceof Clob){
+                if (!oci_bind_by_name($stmt, $idxName, $this->lobDescriptors[$idx], -1, OCI_B_CLOB))
+                    throw new SQLException("Erorr binding clob to placeholder " . $idx);
+            }
+        } // foreach
+    }
+
+
+    /**
+     * Convert a Propel SQL into Oracle SQL
+     *
+     * Look for all of the '?' and replace with ":varX"
+     *
+     * @param string $sql SQL in Propel native format
+     * @return string SQL in Oracle Bind Var format
+     * @todo -cOCI8PreparedStatement Consider changing this implementation to use the fact that we
+     *                               already know where all the '?' chars are (in $positions array).
+     */
+    private function sqlToOracleBindVars($sql)
+    {
+        $out = "";
+        $in_literal = 0;
+        $idxNum = 1;
+        for ($i = 0; $i < strlen($sql); $i++) {
+            $char = $sql[$i];
+            if (strcmp($char,"'")==0) {
+                $in_literal = ~$in_literal;
+            }
+            if (strcmp($char,"?")==0 && !$in_literal) {
+                if (array_key_exists($idxNum, $this->lobs)){
+                    if (class_exists('Blob') && ($this->lobs[$idxNum] instanceof Blob))
+                        $out .= "empty_blob()";
+                    if (class_exists('Clob') && ($this->lobs[$idxNum] instanceof Clob))
+                        $out .= "empty_clob()";
+                } else
+                    $out .= ":var" . $idxNum;
+                $idxNum++;
+            } else {
+                $out .= $char;
+            }
+        }
+
+        if (isset($this->lobs) && !empty($this->lobs)) {
+            $this->setColumnArray();
+
+            $retstmt = " Returning ";
+            $collist = "";
+            $bindlist = "";
+            foreach ($this->lobs as $idx=>$val) {
+                $idxName = ":var" . $idx;
+                if ((class_exists('Blob') && $val instanceof Blob) || (class_exists('Clob') && $val instanceof Clob)) {
+                    //the columns array starts at zero instead of 1 like the lobs array
+                    $collist .= $this->columns[$idx-1] . ",";
+                    $bindlist .= $idxName . ",";
+                }
+            }
+
+            if (!empty($collist))
+                $out .= $retstmt . rtrim($collist, ",") . " into " . rtrim($bindlist, ",");
+        }
+
+        return $out;
+    }
+
+    /**
+     * @param string $paramIndex
+     * @param mixed $blob Blob object or string containing data.
+     * @return void
+     */
+    function setBlob($paramIndex, $blob) 
+    {
+        require_once 'creole/util/Blob.php';
+        if (!($blob instanceof Blob)) {
+            $b = new Blob();
+            $b->setContents($blob);
+            $blob = $b;
+        }
+        $this->lobDescriptors[$paramIndex] = oci_new_descriptor($this->conn->getResource(), OCI_D_LOB);
+        $this->lobs[$paramIndex] = $blob;        
+    }
+
+    /**
+     * @param string $paramIndex
+     * @param mixed $clob Clob object or string containing data.
+     * @return void
+     */
+    function setClob($paramIndex, $clob) 
+    {
+        require_once 'creole/util/Clob.php';
+        if (!($clob instanceof Clob)) {
+            $c = new Clob();
+            $c->setContents($clob);
+            $clob = $c;
+        }
+        $this->lobDescriptors[$paramIndex] = oci_new_descriptor($this->conn->getResource(), OCI_D_LOB);
+        $this->lobs[$paramIndex] = $clob;        
+    }
+
+    /**
+     * Since bind variables in oracle have no special characters, this setString method differs from the
+     * common one in that it does not single quote strings.
+     *
+     * @param int $paramIndex
+     * @param string $value
+     * @return void
+     */
+    function setString($paramIndex, $value)
+    {
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            // it's ok to have a fatal error here, IMO, if object doesn't have
+            // __toString() and is being passed to this method.
+            if ( is_object ( $value ) ) {
+                $this->boundInVars[$paramIndex] = $value->__toString();
+            } else {
+                $this->boundInVars[$paramIndex] = (string)$value;
+            }
+        }
+    }
+
+    /**
+     * Copied this function from common/PreparedStatement.php and modified to work with Oracle
+     * Please note the format used with date() matches that of NLS_DATE_FORMAT set in
+     * OCI8Connection.php
+     *
+     * @param int $paramIndex
+     * @param string $value
+     * @return void
+     */
+    function setTimestamp($paramIndex, $value)
+    {
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            if (is_numeric($value)) $value = date('Y-m-d H:i:s', $value);
+            elseif (is_object($value)) $value = date('Y-m-d H:i:s', $value->getTime());
+            $this->boundInVars[$paramIndex] = $value;
+        }
+    }
+
+    /**
+     * Please note the format used with date() matches that of NLS_DATE_FORMAT set in
+     * OCI8Connection.php
+     *
+     * @param int $paramIndex
+     * @param string $value
+     * @return void
+     */
+    function setDate($paramIndex, $value)
+    {
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            if (is_numeric($value)) $value = date("Y-m-d", $value);
+            elseif (is_object($value)) $value = date("Y-m-d", $value->getTime());
+            $this->boundInVars[$paramIndex] = $value;
+        }
+    }
+
+    /**
+     * In order to send lob data (clob/blob) to the Oracle data base, the 
+     * sqlToOracleBindVars function needs to have an ordered list of the
+     * columns being addressed in the sql statement.
+     * Since only insert and update statements require special handling,
+     * there are two ways to find the columns:
+     *  1) find the first set of () and parse out the columns names based on
+     *     the token ','
+     *  2) find all the text strings to the left of the equal signs.
+     *
+     * @param void
+     * @return void
+     */
+    private function setColumnArray()
+    {
+        $this->columns = array();
+
+        //handle the simple insert case first
+        if(strtoupper(substr($this->sql, 0, 6)) == 'INSERT') {
+            $firstPos = strpos($this->sql, '(');
+            $secPos = strpos($this->sql, ')');
+            $collist = substr($this->sql, $firstPos + 1, $secPos - $firstPos - 1);
+            $this->columns = explode(',', $collist);
+        }
+        if (strtoupper(substr($this->sql, 0, 6)) == 'UPDATE') {
+            //handle more complex update case
+            //first get the string setup so we can explode based on '=?'
+            //second split results from previous action based on ' '
+            // the last token from this should be a column name
+            $tmp = $this->sql;
+            $tmp = str_replace(" =", "=", $this->sql);
+            $tmp = str_replace("= ", "=", $tmp);
+            $tmp = str_replace(",", " ", $tmp);
+            $stage1 = explode("=?",$tmp);
+            
+            foreach($stage1 as $chunk) {
+                $stage2 = explode(' ', $chunk);
+                $this->columns[count($this->columns)] = $stage2[count($stage2) - 1];
+            }
+        }
+   }
+
+   /**
+     * @param int $paramIndex
+     * @return void
+     */
+    function setNull($paramIndex)
+    {
+        $this->boundInVars[$paramIndex] = '';
+    }
+
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8PreparedStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8ResultSet.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8ResultSet.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8ResultSet.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,131 @@
+<?php
+/*
+ *  $Id: OCI8ResultSet.php,v 1.13 2006/01/17 19:44:40 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/ResultSet.php';
+require_once 'creole/common/ResultSetCommon.php';
+
+/**
+ * Oracle (OCI8) implementation of ResultSet class.
+ *
+ * @author    David Giffin <david en giffin.org>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.13 $
+ * @package   creole.drivers.oracle
+ */
+class OCI8ResultSet extends ResultSetCommon implements ResultSet
+{
+    /**
+     * @see ResultSet::seek()
+     */ 
+    function seek($rownum)
+    {
+        if ( $rownum < $this->cursorPos )
+		{
+            // this will effectively disable previous(), first() and some calls to relative() or absolute()
+            throw new SQLException( 'Oracle ResultSet is FORWARD-ONLY' );
+        }
+        
+        // Oracle has no seek function imulate it here
+        while ( $this->cursorPos < $rownum )
+		{
+            $this->next();
+        }
+
+        $this->cursorPos		= $rownum;
+
+        return true;
+    }
+    
+    /**
+     * @see ResultSet::next()
+     */ 
+    function next()
+    {   
+		// no specific result position available
+
+		// Returns an array, which corresponds to the next result row or FALSE
+		// in case of error or there is no more rows in the result.
+        $this->fields			= oci_fetch_array( $this->result
+									, $this->fetchmode
+										+ OCI_RETURN_NULLS
+										+ OCI_RETURN_LOBS
+								);
+
+		if ( ! $this->fields )
+		{
+			// grab error via array
+			$error				= oci_error( $this->result );
+
+			if ( ! $error )
+			{
+				// end of recordset
+				$this->afterLast();
+
+				return false;
+			}
+
+			else
+			{
+				throw new SQLException( 'Error fetching result'
+					, $error[ 'code' ] . ': ' . $error[ 'message' ]
+				);
+			}
+		}
+
+		// Oracle returns all field names in uppercase and associative indices
+		// in the result array will be uppercased too.
+        if ($this->fetchmode === ResultSet::FETCHMODE_ASSOC && $this->lowerAssocCase)
+		{
+			$this->fields = array_change_key_case($this->fields, CASE_LOWER);
+        }
+        
+        // Advance cursor position
+        $this->cursorPos++;
+
+        return true;
+    }
+
+    /**
+     * @see ResultSet::getRecordCount()
+     */
+    function getRecordCount()
+    {
+        $rows					= oci_num_rows( $this->result );
+
+        if ( $rows === false )
+		{
+            throw new SQLException( 'Error fetching num rows'
+				, $this->conn->nativeError( $this->result )
+			);
+        }
+
+        return ( int ) $rows;
+    }
+
+    /**
+     * @see ResultSet::close()
+     */ 
+    function close()
+    {
+		$this->fields			= array();
+        @oci_free_statement( $this->result );
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8ResultSet.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8Statement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8Statement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8Statement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+<?php
+/*
+ *  $Id: OCI8Statement.php,v 1.2 2004/03/05 15:46:12 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/Statement.php';
+require_once 'creole/common/StatementCommon.php';
+
+/**
+ * Oracle (OCI8) Statement implementation.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.2 $
+ * @package   creole.drivers.oracle
+ */ 
+class OCI8Statement extends StatementCommon implements Statement {
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8Statement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8Types.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8Types.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8Types.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,90 @@
+<?php
+
+/*
+ *  $Id: OCI8Types.php,v 1.8 2004/03/20 04:16:50 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/CreoleTypes.php';
+
+/**
+ * Oracle types / type map.
+ *
+ * @author    David Giffin <david en giffin.org>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.8 $
+ * @package   creole.drivers.oracle
+ */
+class OCI8Types extends CreoleTypes {
+
+    /** Map Oracle native types to Creole (JDBC) types. */
+    private static $typeMap = array(
+                                'char' => CreoleTypes::CHAR,
+                                'varchar2' => CreoleTypes::VARCHAR,
+                                'long' => CreoleTypes::LONGVARCHAR,
+                                'number' => CreoleTypes::NUMERIC,
+                                'float' => CreoleTypes::FLOAT,
+                                'integer' => CreoleTypes::INTEGER,
+                                'smallint' => CreoleTypes::SMALLINT,
+                                'double' => CreoleTypes::DOUBLE,
+                                'raw' => CreoleTypes::VARBINARY,
+                                'longraw' => CreoleTypes::LONGVARBINARY,
+                                'date' => CreoleTypes::DATE,
+                                'timestamp' => CreoleTypes::TIMESTAMP,
+                                'blob' => CreoleTypes::BLOB,
+                                'clob' => CreoleTypes::CLOB,
+                                'varray' => CreoleTypes::ARR,
+                                );
+    
+    /** Reverse mapping, created on demand. */
+    private static $reverseMap = null;
+    
+    /**
+     * This method returns the generic Creole (JDBC-like) type
+     * when given the native db type.
+     * @param string $nativeType DB native type (e.g. 'TEXT', 'byetea', etc.).
+     * @return int Creole native type (e.g. CreoleTypes::LONGVARCHAR, CreoleTypes::BINARY, etc.).
+     */
+    public static function getType($nativeType)
+    {
+        $t = str_replace(' ', '', strtolower($nativeType));
+        if ( substr($t, 0, 9) == 'timestamp' ) return CreoleTypes::TIMESTAMP;
+        if (isset(self::$typeMap[$t])) {
+            return self::$typeMap[$t];
+        } else {
+            return CreoleTypes::OTHER;
+        }
+    }
+            
+    /**
+     * This method will return a native type that corresponds to the specified
+     * Creole (JDBC-like) type.
+     * If there is more than one matching native type, then the LAST defined 
+     * native type will be returned.
+     * @param int $creoleType
+     * @return string Native type string.
+     */
+    public static function getNativeType($creoleType)
+    {
+        if (self::$reverseMap === null) {
+            self::$reverseMap = array_flip(self::$typeMap);
+        }
+        return @self::$reverseMap[$creoleType];
+    }
+                                
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/OCI8Types.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/metadata/OCI8DatabaseInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/metadata/OCI8DatabaseInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/metadata/OCI8DatabaseInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,90 @@
+<?php
+/*
+ *  $Id: OCI8DatabaseInfo.php,v 1.11 2006/01/17 19:44:40 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/metadata/DatabaseInfo.php';
+
+/**
+ * Oracle (OCI8) implementation of DatabaseInfo.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.11 $
+ * @package   creole.drivers.oracle.metadata
+ */ 
+class OCI8DatabaseInfo extends DatabaseInfo {
+    
+    private $schema;
+           
+    public function __construct(Connection $conn) {
+        parent::__construct($conn);
+        
+        $dsn = $conn->getDSN();
+        
+        if (isset($dsn['schema'])) {
+        	$this->schema = $dsn['schema']; 
+        } else {
+			// For Changing DB/Schema in Meta Data Interface
+	        $this->schema = $dsn['username'];
+		}
+        
+		$this->schema = strtoupper( $this->schema );
+    }
+    
+    public function getSchema() {
+        return $this->schema;
+    }
+    
+    /**
+     * @throws SQLException
+     * @return void
+     */
+    protected function initTables()
+    {
+        include_once 'creole/drivers/oracle/metadata/OCI8TableInfo.php';
+        
+        $sql = "SELECT table_name
+            FROM all_tables
+            WHERE owner = '{$this->schema}'";
+
+        $statement = @oci_parse($this->conn->getResource(),$sql);
+
+        $success = @oci_execute($statement,OCI_DEFAULT);        
+        if (!$success) {
+            throw new SQLException("Could not get tables", $this->conn->getResource()->nativeError($statement));
+        }
+        while ( $statement && $row = oci_fetch_assoc( $statement ) )
+		{
+            $row = array_change_key_case($row,CASE_LOWER);
+            $this->tables[strtoupper($row['table_name'])] = new OCI8TableInfo($this,$row['table_name']);
+        }
+    }            
+    
+    /**
+     * Oracle supports sequences.
+     *
+     * @return void 
+     * @throws SQLException
+     */
+    protected function initSequences()
+    {
+        // throw new SQLException("MySQL does not support sequences natively.");
+    }
+        
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/metadata/OCI8DatabaseInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/metadata/OCI8TableInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/metadata/OCI8TableInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/metadata/OCI8TableInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,273 @@
+<?php
+/*
+ *  $Id: OCI8TableInfo.php,v 1.13 2006/01/06 00:02:38 sethr Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/metadata/TableInfo.php';
+
+/**
+ * Oracle (OCI8) implementation of TableInfo.
+ * 
+ * @author    David Giffin <david en giffin.org>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision$
+ * @package   creole.drivers.oracle.metadata
+ */
+class OCI8TableInfo extends TableInfo {
+    
+    private $schema;
+        
+    public function __construct(OCI8DatabaseInfo $database, $name)
+    {
+        $this->schema = strtoupper( $database->getSchema() );
+        parent::__construct($database, $name);
+		$this->name = strtoupper( $this->name );
+    }
+    
+    /** Loads the columns for this table. */
+    protected function initColumns() 
+    {
+        
+        include_once 'creole/metadata/ColumnInfo.php';
+        include_once 'creole/drivers/oracle/OCI8Types.php';
+        
+
+        // To get all of the attributes we need, we'll actually do 
+        // two separate queries.  The first gets names and default values
+        // the second will fill in some more details.
+        
+        $sql = "
+			SELECT column_name
+				, data_type
+				, data_precision
+				, data_length
+				, data_default
+				, nullable 
+				, data_scale
+            FROM  all_tab_columns
+            WHERE table_name = '{$this->name}'
+                AND OWNER = '{$this->schema}'";
+
+        $statement = @oci_parse($this->conn->getResource(),$sql);
+        $success = @oci_execute($statement,OCI_DEFAULT);
+		if (!$success) {
+            throw new SQLException("Could Not Get Columns");
+        }
+
+        while ( $statement && $row = oci_fetch_array( $statement
+			, OCI_ASSOC + OCI_RETURN_NULLS ) ) {
+            $row = array_change_key_case($row, CASE_LOWER);
+            $this->columns[$row['column_name']] = new ColumnInfo( $this
+				, $row['column_name']
+				, OCI8Types::getType($row['data_type'])
+				, $row['data_type']
+				, $row['data_length']
+				, $row['data_precision']
+				, $row['data_scale']
+				, $row['nullable']
+				, $row['data_default']
+			);
+        }
+                
+        $this->colsLoaded = true;
+    }
+    
+    /** Loads the primary key information for this table. */
+    protected function initPrimaryKey()
+    {
+        include_once 'creole/metadata/PrimaryKeyInfo.php';
+        
+        // columns have to be loaded first
+        if (!$this->colsLoaded) $this->initColumns();
+        
+
+        // Primary Keys Query
+        $sql = "SELECT a.owner, a.table_name,
+                            a.constraint_name, a.column_name
+                        FROM all_cons_columns a, all_constraints b
+                        WHERE b.constraint_type = 'P'
+                        AND a.constraint_name = b.constraint_name
+                        AND b.table_name = '{$this->name}'
+            AND b.owner = '{$this->schema}'
+            ";
+
+
+        $statement = @oci_parse($this->conn->getResource(),$sql);
+        $success = @oci_execute($statement,OCI_DEFAULT);
+        if (!$success) {
+            throw new SQLException("Could Not Get Primary Keys");
+        }
+
+        while ( $statement && $row = oci_fetch_assoc( $statement )) {
+            $row = array_change_key_case($row,CASE_LOWER);
+
+            $name = $row['column_name'];
+
+            if (!isset($this->primaryKey)) {
+                $this->primaryKey = new PrimaryKeyInfo($name);
+            }
+
+            $this->primaryKey->addColumn($this->columns[$name]);
+        }
+        
+        $this->pkLoaded = true;
+    }
+    
+    /** Loads the indexes for this table. */
+    protected function initIndexes() {
+    
+        include_once 'creole/metadata/IndexInfo.php';    
+
+        // columns have to be loaded first
+        if (!$this->colsLoaded) $this->initColumns();        
+
+        // Indexes
+        $sql = "SELECT
+            allind.index_name,
+            allind.table_name,
+            allind.index_type,
+            allind.uniqueness,
+            indcol.column_name
+            FROM all_indexes allind INNER JOIN all_ind_columns indcol
+                ON allind.owner = indcol.index_owner
+                AND allind.index_name = indcol.index_name
+            WHERE allind.table_owner = '{$this->schema}'
+            AND allind.table_name = '{$this->name}'
+            AND allind.index_name NOT IN (SELECT
+                    constraint_name
+                    FROM all_constraints
+                    WHERE constraint_type = 'P')
+            ORDER BY allind.index_name,
+                indcol.column_position";
+
+        $statement = @oci_parse($this->conn->getResource(),$sql);
+        $success = @oci_execute($statement,OCI_DEFAULT);
+        if (!$success) {
+            throw new SQLException("Could Not Get Primary Keys");
+        }
+
+
+        // Loop through the returned results, grouping the same key_name together
+        // adding each column for that key.
+
+        while ( $statement && $row = oci_fetch_assoc( $statement )) {
+            $row = array_change_key_case($row,CASE_LOWER);
+
+            $name = $row['index_name'];
+            $index_col_name = $row['column_name'];
+
+            if (!isset($this->indexes[$name])) {
+                $this->indexes[$name] = new IndexInfo($name);
+            }
+
+            $this->indexes[$name]->addColumn($this->columns[ $index_col_name ]);
+        }
+        
+                
+        $this->indexesLoaded = true;
+    }
+    
+    /** Load foreign keys */
+    protected function initForeignKeys() {
+        
+        include_once 'creole/metadata/ForeignKeyInfo.php';    
+
+        // columns have to be loaded first
+        if (!$this->colsLoaded) $this->initColumns();        
+        
+        // Foreign keys
+		// TODO resolve cross schema references
+		// use all_cons... to do so, however, very slow queries then
+		// optimizations are very ugly
+        $sql					= "
+			SELECT a.owner AS local_owner
+				, a.table_name AS local_table
+				, c.column_name AS local_column
+				, a.constraint_name AS foreign_key_name
+				, b.owner AS foreign_owner
+				, b.table_name AS foreign_table
+				, d.column_name AS foreign_column
+				, b.constraint_name AS foreign_constraint_name
+				, a.delete_rule AS on_delete
+            FROM user_constraints a
+				, user_constraints b
+				, user_cons_columns c
+				, user_cons_columns d
+            WHERE a.r_constraint_name = b.constraint_name
+                AND c.constraint_name = a.constraint_name
+                AND d.constraint_name = b.constraint_name
+                AND a.r_owner = b.owner
+                AND a.constraint_type='R'
+				AND a.table_name = '{$this->name}'
+				AND a.owner = '{$this->schema}'
+		";
+
+        $statement = @oci_parse($this->conn->getResource(),$sql);
+        $success = @oci_execute($statement,OCI_DEFAULT);
+        if (!$success) {
+            throw new SQLException("Could Not Get Primary Keys");
+        }
+
+        // Loop through the returned results, grouping the same key_name
+		// together adding each column for that key.
+
+        while ( $statement && $row = oci_fetch_assoc( $statement )) {
+            $row = array_change_key_case($row,CASE_LOWER);
+
+            $name = $row['foreign_key_name'];            
+
+            $foreignTable = $this->database->getTable($row['foreign_table']);
+            $foreignColumn = $foreignTable->getColumn($row['foreign_column']);
+
+            $localTable   = $this->database->getTable($row['local_table']);    
+            $localColumn   = $localTable->getColumn($row['local_column']);
+
+            if (!isset($this->foreignKeys[$name])) {
+                $this->foreignKeys[$name] = new ForeignKeyInfo($name);
+            }
+
+			switch ( $row[ 'on_delete' ] )
+			{
+				case 'CASCADE':
+					$onDelete	= ForeignKeyInfo::CASCADE;
+					break;
+
+				case 'SET NULL':
+					$onDelete	= ForeignKeyInfo::SETNULL;
+					break;
+
+				default:
+				case 'NO ACTION':
+					$onDelete	= ForeignKeyInfo::NONE;
+					break;
+			}
+
+			// addReference( local, foreign, onDelete, onUpdate )
+			// Oracle doesn't support 'on update'
+            $this->foreignKeys[ $name ]->addReference(
+				$localColumn
+				, $foreignColumn
+				, $onDelete
+			);
+        }
+        
+        $this->fksLoaded = true;
+    }
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/oracle/metadata/OCI8TableInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLConnection.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLConnection.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLConnection.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,260 @@
+<?php
+/*
+ *  $Id: PgSQLConnection.php,v 1.21 2005/08/03 17:56:22 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/Connection.php';
+require_once 'creole/common/ConnectionCommon.php';
+include_once 'creole/drivers/pgsql/PgSQLResultSet.php';
+
+/**
+ * PgSQL implementation of Connection.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org> (Creole)
+ * @author    Stig Bakken <ssb en fast.no> (PEAR::DB)
+ * @author    Lukas Smith (PEAR::MDB)
+ * @version   $Revision: 1.21 $
+ * @package   creole.drivers.pgsql
+ */ 
+class PgSQLConnection extends ConnectionCommon implements Connection {        
+                
+    /** 
+     * Affected Rows of last executed query.
+     * Postgres needs this for getUpdateCount()
+     * We used to store the entire result set
+     * instead but that can be a large dataset.
+     * @var int
+     */
+    private $result_affected_rows;
+    
+    /**
+     * Connect to a database and log in as the specified user.
+     *
+     * @param array $dsn The datasource hash.
+     * @param $flags Any connection flags.
+     * @access public
+     * @throws SQLException
+     * @return void
+     */
+    function connect($dsninfo, $flags = 0)
+    {    
+        global $php_errormsg;
+                
+        if (!extension_loaded('pgsql')) {
+            throw new SQLException('pgsql extension not loaded');
+        }
+
+        $this->dsn = $dsninfo;
+        $this->flags = $flags;
+        
+        $persistent = ($flags & Creole::PERSISTENT === Creole::PERSISTENT);
+                
+        $protocol = (isset($dsninfo['protocol'])) ? $dsninfo['protocol'] : 'tcp';
+        $connstr = '';
+
+        if ($protocol == 'tcp') {
+            if (!empty($dsninfo['hostspec'])) {
+                $connstr = 'host=' . $dsninfo['hostspec'];
+            }
+            if (!empty($dsninfo['port'])) {
+                $connstr .= ' port=' . $dsninfo['port'];
+            }
+        }
+
+        if (isset($dsninfo['database'])) {
+            $connstr .= ' dbname=\'' . addslashes($dsninfo['database']) . '\'';
+        }
+        if (!empty($dsninfo['username'])) {
+            $connstr .= ' user=\'' . addslashes($dsninfo['username']) . '\'';
+        }
+        if (!empty($dsninfo['password'])) {
+            $connstr .= ' password=\'' . addslashes($dsninfo['password']) . '\'';
+        }
+        if (!empty($dsninfo['options'])) {
+            $connstr .= ' options=' . $dsninfo['options'];
+        }
+        if (!empty($dsninfo['tty'])) {
+            $connstr .= ' tty=' . $dsninfo['tty'];
+        }
+        
+        if ($persistent) {
+            $conn = @pg_pconnect($connstr);
+        } else {
+            $conn = @pg_connect($connstr);
+        }
+        
+        if (!$conn) {
+			// hide the password from connstr
+			$cleanconnstr = preg_replace('/password=\'.*?\'($|\s)/', 'password=\'*********\'', $connstr);
+            throw new SQLException('Could not connect', $php_errormsg, $cleanconnstr);
+        }
+        
+        $this->dblink = $conn;        
+    }
+    
+    /**
+     * @see Connection::applyLimit()
+     */
+    public function applyLimit(&$sql, $offset, $limit)
+    {
+        if ( $limit > 0 ) {
+            $sql .= " LIMIT ".$limit;
+        }
+        if ( $offset > 0 ) {
+            $sql .= " OFFSET ".$offset;
+        }
+    }
+    
+    /**
+     * @see Connection::disconnect()
+     */
+    function close()
+    {
+        $ret = @pg_close($this->dblink);
+	$this->result_affected_rows = null;
+        $this->dblink = null;
+        return $ret;
+    }
+    
+    /**
+     * @see Connection::simpleQuery()
+     */
+    function executeQuery($sql, $fetchmode = null)
+    {
+        $result = @pg_query($this->dblink, $sql);
+        if (!$result) {
+            throw new SQLException('Could not execute query', pg_last_error($this->dblink), $sql);
+        }
+	$this->result_affected_rows = (int) @pg_affected_rows($result);
+
+        return new PgSQLResultSet($this, $result, $fetchmode);
+    }        
+
+    /**
+     * @see Connection::simpleUpdate()
+     */
+    function executeUpdate($sql)
+    {            
+        $result = @pg_query($this->dblink, $sql);
+        if (!$result) {
+            throw new SQLException('Could not execute update', pg_last_error($this->dblink), $sql);
+        }
+	$this->result_affected_rows = (int) @pg_affected_rows($result);
+
+	return $this->result_affected_rows;
+    }
+
+    /**
+     * Start a database transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function beginTrans()
+    {
+        $result = @pg_query($this->dblink, "BEGIN");
+        if (!$result) {
+            throw new SQLException('Could not begin transaction', pg_last_error($this->dblink));
+        }
+    }
+        
+    /**
+     * Commit the current transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function commitTrans()
+    {
+        $result = @pg_query($this->dblink, "COMMIT");
+        if (!$result) {
+            throw new SQLException('Could not commit transaction', pg_last_error($this->dblink));
+        }
+    }
+
+    /**
+     * Roll back (undo) the current transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function rollbackTrans()
+    {
+        $result = @pg_query($this->dblink, "ROLLBACK");
+        if (!$result) {
+            throw new SQLException('Could not rollback transaction', pg_last_error($this->dblink));
+        }
+    }
+
+    /**
+     * Gets the number of rows affected by the data manipulation
+     * query.
+     * @see Statement::getUpdateCount()
+     * @return int Number of rows affected by the last query.
+     */
+    function getUpdateCount()
+    {
+	if ( $this->result_affected_rows === null ) {
+		throw new SQLException('getUpdateCount called before any sql queries were executed');
+	}
+	return $this->result_affected_rows;
+    }    
+
+    
+    /**
+     * @see Connection::getDatabaseInfo()
+     */
+    public function getDatabaseInfo()
+    {
+        require_once 'creole/drivers/pgsql/metadata/PgSQLDatabaseInfo.php';
+        return new PgSQLDatabaseInfo($this);
+    }
+    
+    /**
+     * @see Connection::getIdGenerator()
+     */
+    public function getIdGenerator()
+    {
+        require_once 'creole/drivers/pgsql/PgSQLIdGenerator.php';
+        return new PgSQLIdGenerator($this);
+    }
+    
+    /**
+     * @see Connection::prepareStatement()
+     */
+    public function prepareStatement($sql) 
+    {
+        require_once 'creole/drivers/pgsql/PgSQLPreparedStatement.php';
+        return new PgSQLPreparedStatement($this, $sql);
+    }
+    
+    /**
+     * @see Connection::prepareCall()
+     */
+    public function prepareCall($sql) {
+        throw new SQLException('PostgreSQL does not support stored procedures.');
+    }
+    
+    /**
+     * @see Connection::createStatement()
+     */
+    public function createStatement()
+    {
+        require_once 'creole/drivers/pgsql/PgSQLStatement.php';
+        return new PgSQLStatement($this);
+    }
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLConnection.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLIdGenerator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLIdGenerator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLIdGenerator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,84 @@
+<?php
+/*
+ *  $Id: PgSQLIdGenerator.php,v 1.5 2004/03/19 14:19:50 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/IdGenerator.php';
+
+/**
+ * PostgreSQL IdGenerator implemenation.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.5 $
+ * @package   creole.drivers.pgsql
+ */
+class PgSQLIdGenerator implements IdGenerator {
+    
+    /** Connection object that instantiated this class */
+    private $conn;
+
+    /**
+     * Creates a new IdGenerator class, saves passed connection for use
+     * later by getId() method.
+     * @param Connection $conn
+     */
+    public function __construct(Connection $conn)
+    {
+        $this->conn = $conn;
+    }
+    
+    /**
+     * @see IdGenerator::isBeforeInsert()
+     */
+    public function isBeforeInsert()
+    {
+        return true;
+    }    
+    
+    /**
+     * @see IdGenerator::isAfterInsert()
+     */
+    public function isAfterInsert()
+    {
+        return false;
+    }
+        
+    /**
+     * @see IdGenerator::getIdMethod()
+     */
+    public function getIdMethod()
+    {
+        return self::SEQUENCE;
+    }
+    
+    /**
+     * @see IdGenerator::getId()
+     */
+    public function getId($name = null)
+    {
+        if ($name === null) {
+            throw new SQLException("You must specify the sequence name when calling getId() method.");
+        }
+        $rs = $this->conn->executeQuery("SELECT nextval('" . pg_escape_string ( $name ) . "')", ResultSet::FETCHMODE_NUM);
+        $rs->next();
+        return $rs->getInt(1);
+    }
+    
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLIdGenerator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLPreparedStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLPreparedStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLPreparedStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,157 @@
+<?php
+/*
+ *  $Id: PgSQLPreparedStatement.php,v 1.14 2005/04/16 18:55:28 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/PreparedStatement.php';
+require_once 'creole/common/PreparedStatementCommon.php';
+
+/**
+ * PgSQL subclass for prepared statements.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 1.14 $
+ * @package creole.drivers.pgsql
+ */
+class PgSQLPreparedStatement extends PreparedStatementCommon implements PreparedStatement {
+    
+    /**
+     * Quotes string using native pgsql function (pg_escape_string).
+     * @param string $str
+     * @return string
+     */
+    protected function escape($str)
+    {
+        return pg_escape_string($str);
+    }
+    
+    /**
+     * Recursive function to turn multi-dim array into str representation.
+     * @param array $arr
+     * @return string Array in pgsql-friendly string notation: {val1, val2} or {{sub1,sub2}, {sub3, sub4}}
+     */
+    private function arrayToStr($arr)
+    {
+        $parts = array();
+        foreach((array)$arr as $el) {
+            if (is_array($el)) {
+                $parts[] = $this->arrayToStr($el);
+            } else {
+                if (is_string($el)) {
+                    $parts[] = '"' . $this->escape($el) . '"';
+                } else {
+                    $parts[] = $el;
+                }                
+            }
+        }        
+        return '{' . implode(',', $parts) . '}';
+    }
+    
+    /**
+     * Sets an array.
+     * Unless a driver-specific method is used, this means simply serializing
+     * the passed parameter and storing it as a string.
+     * @param int $paramIndex
+     * @param array $value
+     * @return void
+     * @see PreparedStatement::setArray()
+     */
+    function setArray($paramIndex, $value) 
+    {
+        if( $paramIndex > $this->positionsCount || $paramIndex < 1) {
+            throw new SQLException('Cannot bind to invalid param index: '.$paramIndex);
+        }
+        if ($value === null)
+            $this->setNull($paramIndex);
+        else
+            $this->boundInVars[$paramIndex] = "'" . $this->arrayToStr($value) . "'";        
+    }
+
+    /**
+     * For setting value of Postgres BOOLEAN column.
+     * @param int $paramIndex
+     * @param boolean $value
+     * @return void
+     */
+    function setBoolean($paramIndex, $value) 
+    {
+        if( $paramIndex > $this->positionsCount || $paramIndex < 1) {
+            throw new SQLException('Cannot bind to invalid param index: '.$paramIndex);
+        }        
+        if ($value === null)
+            $this->setNull($paramIndex);
+        else
+            $this->boundInVars[$paramIndex] = ($value ? "'t'" : "'f'");
+    }
+
+    /**
+     * Applies sqlite_udf_encode_binary() to ensure that binary contents will be handled correctly by sqlite.
+     * @param int $paramIndex
+     * @param mixed $blob Blob object or string containing data.
+     * @return void
+     */
+    function setBlob($paramIndex, $blob) 
+    {    
+        if ($blob === null) {
+            $this->setNull($paramIndex);
+        } else {
+            // they took magic __toString() out of PHP5.0.0; this sucks
+            if (is_object($blob)) {
+                $blob = $blob->__toString();
+            }            
+            $this->boundInVars[$paramIndex] = "'" . pg_escape_bytea( $blob ) . "'";
+        }    
+        
+    }
+	
+	/**
+     * @param int $paramIndex
+     * @param string $value
+     * @return void
+     */
+    function setTime($paramIndex, $value) 
+    {        
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+            if ( is_numeric ( $value ) ) {
+	    	$value = date ( "H:i:s O", $value );
+	    } elseif ( is_object ( $value ) ) {
+	    	$value = date ( "H:i:s O", $value->getTime ( ) );
+	    }
+            $this->boundInVars [ $paramIndex ] = "'" . $this->escape ( $value ) . "'";
+        }
+    }
+    
+    /**
+     * @param int $paramIndex
+     * @param string $value
+     * @return void
+     */
+    function setTimestamp($paramIndex, $value) 
+    {        
+        if ($value === null) {
+            $this->setNull($paramIndex);
+        } else {
+       	    if (is_numeric($value)) $value = date('Y-m-d H:i:s O', $value);
+       	    elseif (is_object($value)) $value = date("Y-m-d H:i:s O", $value->getTime());
+            $this->boundInVars[$paramIndex] = "'".$this->escape($value)."'";
+        }
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLPreparedStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLResultSet.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLResultSet.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLResultSet.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,205 @@
+<?php
+/*
+ *  $Id: PgSQLResultSet.php,v 1.31 2006/01/17 19:44:40 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/ResultSet.php';
+require_once 'creole/common/ResultSetCommon.php';
+
+/**
+ * PostgreSQL implementation of ResultSet.
+ *
+ * @author	Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.31 $
+ * @package   creole.drivers.pgsql
+ */
+class PgSQLResultSet extends ResultSetCommon implements ResultSet {
+
+
+	/**
+	 * Gets optimized PgSQLResultSetIterator.
+	 * @return PgSQLResultSetIterator
+	 */
+	/*
+	public function getIterator()
+	{   
+		require_once 'creole/drivers/pgsql/PgSQLResultSetIterator.php';
+		return new PgSQLResultSetIterator($this);
+	}
+	*/
+
+	/**
+	 * Postgres doesn't actually move the db pointer.  The specific row
+	 * is fetched by call to pg_fetch_array() rather than by a seek and
+	 * then an unspecified pg_fetch_array() call.
+	 * 
+	 * The only side-effect of this situation is that we don't really know 
+	 * if the seek will fail or succeed until we have called next().  This
+	 * behavior is acceptible - and explicitly documented in 
+	 * ResultSet::seek() phpdoc.
+	 * 
+	 * @see ResultSet::seek()
+	 */ 
+	public function seek($rownum)
+	{
+		if ($rownum < 0) {
+			return false;
+		}
+		
+		// PostgreSQL rows start w/ 0, but this works, because we are
+		// looking to move the position _before_ the next desired position
+		$this->cursorPos = $rownum;
+		return true;
+	}
+	
+	/**
+	 * @see ResultSet::next()
+	 */ 
+	public function next()
+	{
+
+		$this->fields = @pg_fetch_array($this->result, $this->cursorPos, $this->fetchmode);
+
+		if (!$this->fields) {
+			$err = @pg_result_error($this->result);
+			if (!$err) {
+				// We've advanced beyond end of recordset.
+				$this->afterLast();
+				return false;
+			} else {
+				throw new SQLException("Error fetching result", $err);				
+			}
+		}
+
+		if ($this->fetchmode === ResultSet::FETCHMODE_ASSOC && $this->lowerAssocCase) {
+            $this->fields = array_change_key_case($this->fields, CASE_LOWER);
+        }
+		// Advance cursor position
+		$this->cursorPos++;	
+		return true;
+	}
+
+	/**
+	 * @see ResultSet::getRecordCount()
+	 */
+	public function getRecordCount()
+	{
+		$rows = @pg_num_rows($this->result);
+		if ($rows === null) {
+			throw new SQLException("Error fetching num rows", pg_result_error($this->result));
+		}
+		return (int) $rows;
+	}	
+
+	/**
+	 * @see ResultSet::close()
+	 */
+	public function close()
+	{
+		$this->fields = array();
+		@pg_free_result($this->result);
+	}
+		
+	/**
+	 * Convert Postgres string representation of array into native PHP array.
+	 * @param string $str Postgres string array rep: {1223, 2343} or {{"welcome", "home"}, {"test2", ""}}
+	 * @return array
+	 */
+	private function strToArray($str)
+	{
+		$str = substr($str, 1, -1); // remove { }
+		$res = array();
+		
+		$subarr = array();
+		$in_subarr = 0;
+		
+		$toks = explode(',', $str);
+		foreach($toks as $tok) {					
+			if ($in_subarr > 0) { // already in sub-array?
+				$subarr[$in_subarr][] = $tok;
+				if ('}' === substr($tok, -1, 1)) { // check to see if we just added last component					
+					$res[] = $this->strToArray(implode(',', $subarr[$in_subarr]));
+					$in_subarr--;
+				}
+			} elseif ($tok{0} === '{') { // we're inside a new sub-array							   
+				if ('}' !== substr($tok, -1, 1)) {
+					$in_subarr++;
+					// if sub-array has more than one element
+					$subarr[$in_subarr] = array();
+					$subarr[$in_subarr][] = $tok;					
+				} else {
+					$res[] = $this->strToArray($tok);
+				}
+			} else { // not sub-array
+				$val = trim($tok, '"'); // remove " (surrounding strings)
+				// perform type castng here?
+				$res[] = $val;
+			}
+		}
+		
+		return $res;
+	}
+
+	/**
+	 * Reads a column as an array.
+	 * The value of the column is unserialized & returned as an array.
+	 * @param mixed $column Column name (string) or index (int) starting with 1.
+	 * @return array
+	 * @throws SQLException - If the column specified is not a valid key in current field array.
+	 */
+	public function getArray($column) 
+	{
+		if (is_int($column)) { $column--; } // because Java convention is to start at 1 
+		if (!array_key_exists($column, $this->fields)) { throw new SQLException("Invalid resultset column: " . (is_int($column) ? $column + 1 : $column)); }
+		if ($this->fields[$column] === null) { return null; }
+		return $this->strToArray($this->fields[$column]);
+	} 
+	
+	/**
+	 * Returns Blob with contents of column value.
+	 * 
+	 * @param mixed $column Column name (string) or index (int) starting with 1 (if ResultSet::FETCHMODE_NUM was used).
+	 * @return Blob New Blob with data from column.
+	 * @throws SQLException - If the column specified is not a valid key in current field array.
+	 */
+	public function getBlob($column) 
+	{
+		if (is_int($column)) { $column--; } // because Java convention is to start at 1 
+		if (!array_key_exists($column, $this->fields)) { throw new SQLException("Invalid resultset column: " . (is_int($column) ? $column + 1 : $column)); }
+		if ($this->fields[$column] === null) { return null; }
+		require_once 'creole/util/Blob.php';
+		$b = new Blob();
+		$b->setContents(pg_unescape_bytea($this->fields[$column]));
+		return $b;
+	}	 
+
+	/**
+	 * @param mixed $column Column name (string) or index (int) starting with 1.
+	 * @return boolean
+	 * @throws SQLException - If the column specified is not a valid key in current field array.
+	 */
+	public function getBoolean($column) 
+	{
+		if (is_int($column)) { $column--; } // because Java convention is to start at 1 
+		if (!array_key_exists($column, $this->fields)) { throw new SQLException("Invalid resultset column: " . (is_int($column) ? $column + 1 : $column)); }
+		if ($this->fields[$column] === null) { return null; }
+		return ($this->fields[$column] === 't');
+	}
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLResultSet.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLResultSetIterator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLResultSetIterator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLResultSetIterator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,109 @@
+<?php
+/*
+ *  $Id: PgSQLResultSetIterator.php,v 1.1 2004/12/04 05:58:53 gamr Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * Optimized iterator for PostgreSQL, based off of SQLite iterator.
+ * Testing with SeekableIterator, no idea if it will keep this
+ * functionality or what uses it or even how to use it as yet.
+ * 
+ * @author    Cameron Brunner <webmaster en animetorrents.com>
+ * @version   $Revision: 1.1 $
+ * @package   creole.drivers.pgsql
+ */
+class PgSQLResultSetIterator implements SeekableIterator, Countable {
+
+    private $result;
+    private $pos = 0;
+    private $fetchmode;
+    private $row_count;
+    private $rs;
+    
+    /**
+     * Construct the iterator.
+     * @param PgSQLResultSet $rs
+     */
+    public function __construct(PgSQLResultSet $rs)
+    {
+        $this->result = $rs->getResource();
+        $this->fetchmode = $rs->getFetchmode();
+		$this->row_count = $rs->getRecordCount();
+		$this->rs = $rs; // This is to address reference count bug: http://creole.phpdb.org/trac/ticket/6
+    }
+    
+    /**
+     * This method actually has no effect, since we do not rewind ResultSet for iteration.
+     */
+    function rewind()
+    {        
+        $this->pos = 0;
+    }
+    
+    function valid()
+    {
+		return ( $this->pos < $this->row_count );
+    }
+    
+    /**
+     * Returns the cursor position.  Note that this will not necessarily
+     * be 1 for the first row, since no rewind is performed at beginning
+     * of iteration.
+     * @return int
+     */
+    function key()
+    {
+        return $this->pos;
+    }
+    
+    /**
+     * Returns the row (assoc array) at current cursor pos.
+     * @return array
+     */
+    function current()
+    {
+       return pg_fetch_array($this->result, $this->pos, $this->fetchmode);
+    }
+    
+    /**
+     * Advances internal cursor pos.
+     */
+    function next()
+    {
+        $this->pos++;
+    }
+
+    /**
+     * Sets cursor to specific value.
+     */
+    function seek ( $index )
+    {
+    	if ( ! is_int ( $index ) ) {
+			throw new InvalidArgumentException ( 'Invalid arguement to seek' );
+		}
+		if ( $index < 0 || $index > $this->row_count ) {
+			throw new OutOfBoundsException ( 'Invalid seek position' );
+		}
+		$this->pos = $index;
+    }
+
+    function count ( ) {
+		return $this->row_count;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLResultSetIterator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+<?php
+/*
+ *  $Id: PgSQLStatement.php,v 1.1 2004/02/19 02:49:42 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/Statement.php';
+require_once 'creole/common/StatementCommon.php';
+
+/**
+ * PostgreSQL Statement implementation.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.1 $
+ * @package   creole.drivers.pgsql
+ */ 
+class PgSQLStatement extends StatementCommon implements Statement {
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLTypes.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLTypes.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLTypes.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,101 @@
+<?php
+
+/*
+ *  $Id: PgSQLTypes.php,v 1.8 2004/04/09 19:16:05 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/CreoleTypes.php';
+
+/**
+ * PostgreSQL types / type map.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.8 $
+ * @package   creole.drivers.pgsql
+ */
+class PgSQLTypes extends CreoleTypes {
+
+    /** Map PostgreSQL native types to Creole (JDBC) types. */
+    private static $typeMap = array (
+                "int2" => CreoleTypes::SMALLINT,
+                "int4" => CreoleTypes::INTEGER, 
+                "oid" => CreoleTypes::INTEGER,
+                "int8" => CreoleTypes::BIGINT,
+                "cash"  => CreoleTypes::DOUBLE,
+                "money"  => CreoleTypes::DOUBLE,
+                "numeric" => CreoleTypes::NUMERIC,
+                "float4" => CreoleTypes::REAL,
+                "float8" => CreoleTypes::DOUBLE,
+                "bpchar" => CreoleTypes::CHAR, 
+                "char" => CreoleTypes::CHAR, 
+                "char2" => CreoleTypes::CHAR, 
+                "char4" => CreoleTypes::CHAR, 
+                "char8" => CreoleTypes::CHAR, 
+                "char16" => CreoleTypes::CHAR,
+                "varchar" => CreoleTypes::VARCHAR, 
+                "text" => CreoleTypes::VARCHAR, 
+                "name" => CreoleTypes::VARCHAR, 
+                "filename" => CreoleTypes::VARCHAR,
+                "bytea" => CreoleTypes::BINARY,
+                "bool" => CreoleTypes::BOOLEAN,
+                "date" => CreoleTypes::DATE,
+                "time" => CreoleTypes::TIME,
+                "abstime" => CreoleTypes::TIMESTAMP, 
+                "timestamp" => CreoleTypes::TIMESTAMP, 
+                "timestamptz" => CreoleTypes::TIMESTAMP,
+                "_bool" => CreoleTypes::ARR,     
+                "_char" => CreoleTypes::ARR, 
+                "_int2" => CreoleTypes::ARR, 
+                "_int4" => CreoleTypes::ARR, 
+                "_text" => CreoleTypes::ARR,
+                "_oid" => CreoleTypes::ARR, 
+                "_varchar" => CreoleTypes::ARR, 
+                "_int8" => CreoleTypes::ARR, 
+                "_float4" => CreoleTypes::ARR, 
+                "_float8" => CreoleTypes::ARR,
+                "_abstime" => CreoleTypes::ARR, 
+                "_date" => CreoleTypes::ARR, 
+                "_time" => CreoleTypes::ARR, 
+                "_timestamp" => CreoleTypes::ARR, 
+                "_numeric" => CreoleTypes::ARR,
+                "_bytea" => CreoleTypes::ARR,
+            );
+                
+    /** Reverse lookup map, created on demand. */
+    private static $reverseMap = null;
+    
+    public static function getType($pgsqlType)
+    {
+        $t = strtolower($pgsqlType);
+        if (isset(self::$typeMap[$t])) {
+            return self::$typeMap[$t];
+        } else {
+            return CreoleTypes::OTHER;
+        }
+    }
+    
+    public static function getNativeType($creoleType)
+    {
+        if (self::$reverseMap === null) {
+            self::$reverseMap = array_flip(self::$typeMap);
+        }
+        return @self::$reverseMap[$creoleType];
+    }
+    
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/PgSQLTypes.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/metadata/PgSQLDatabaseInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/metadata/PgSQLDatabaseInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/metadata/PgSQLDatabaseInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,115 @@
+<?php
+/*
+ *  $Id: PgSQLDatabaseInfo.php,v 1.11 2006/01/17 19:44:40 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/metadata/DatabaseInfo.php';
+
+/**
+ * MySQL implementation of DatabaseInfo.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.11 $
+ * @package   creole.drivers.pgsql.metadata
+ */
+class PgSQLDatabaseInfo extends DatabaseInfo {
+
+    /**
+     * @throws SQLException
+     * @return void
+     */
+    protected function initTables()
+    {
+        include_once 'creole/drivers/pgsql/metadata/PgSQLTableInfo.php';
+        
+        // Get Database Version
+	// TODO: www.php.net/pg_version
+        $result = pg_query ($this->conn->getResource(), "SELECT version() as ver");
+        
+        if (!$result)
+        {
+        	throw new SQLException ("Failed to select database version");
+        } // if (!$result)
+        $row = pg_fetch_assoc ($result, 0);
+        $arrVersion = sscanf ($row['ver'], '%*s %d.%d');
+        $version = sprintf ("%d.%d", $arrVersion[0], $arrVersion[1]);
+        // Clean up
+        $arrVersion = null;
+        $row = null;
+        pg_free_result ($result);
+        $result = null;
+
+        $result = pg_query($this->conn->getResource(), "SELECT oid, relname FROM pg_class
+										WHERE relkind = 'r' AND relnamespace = (SELECT oid
+										FROM pg_namespace
+										WHERE
+										     nspname NOT IN ('information_schema','pg_catalog')
+										     AND nspname NOT LIKE 'pg_temp%'
+										     AND nspname NOT LIKE 'pg_toast%'
+										LIMIT 1)
+										ORDER BY relname");
+
+        if (!$result) {
+            throw new SQLException("Could not list tables", pg_last_error($this->dblink));
+        }
+
+        while ($row = pg_fetch_assoc($result)) {
+            $this->tables[strtoupper($row['relname'])] = new PgSQLTableInfo($this, $row['relname'], $version, $row['oid']);
+        }
+		
+		$this->tablesLoaded = true;
+    }
+
+    /**
+     * PgSQL sequences.
+     *
+     * @return void
+     * @throws SQLException
+     */
+    protected function initSequences()
+    {
+     
+	 	$this->sequences = array();
+		   
+        $result = pg_query($this->conn->getResource(), "SELECT oid, relname FROM pg_class
+										WHERE relkind = 'S' AND relnamespace = (SELECT oid
+										FROM pg_namespace
+										WHERE
+										     nspname NOT IN ('information_schema','pg_catalog')
+										     AND nspname NOT LIKE 'pg_temp%'
+										     AND nspname NOT LIKE 'pg_toast%'
+										LIMIT 1)
+										ORDER BY relname");
+
+        if (!$result) {
+            throw new SQLException("Could not list sequences", pg_last_error($this->dblink));
+        }
+		
+		while ($row = pg_fetch_assoc($result)) {
+			// FIXME -- decide what info we need for sequences & then create a SequenceInfo object (if needed)
+			$obj = new stdClass;
+			$obj->name = $row['relname'];
+			$obj->oid = $row['oid'];
+            $this->sequences[strtoupper($row['relname'])] = $obj;
+        }
+		
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/metadata/PgSQLDatabaseInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/metadata/PgSQLTableInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/metadata/PgSQLTableInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/metadata/PgSQLTableInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,423 @@
+<?php
+/*
+ *  $Id: PgSQLTableInfo.php,v 1.31 2006/01/17 19:44:40 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/metadata/TableInfo.php';
+
+/**
+ * PgSQL implementation of TableInfo.
+ *
+ * See this Python code by David M. Cook for some good reference on Pgsql metadata
+ * functions:
+ * @link http://www.sandpyt.org/pipermail/sandpyt/2003-March/000008.html
+ *
+ * Here's some more information from postgresql:
+ * @link http://developer.postgresql.org/docs/pgsql/src/backend/catalog/information_schema.sql
+ *
+ * @todo -c Eventually move to supporting only Postgres >= 7.4, which has the information_schema
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.31 $
+ * @package   creole.drivers.pgsql.metadata
+ */
+class PgSQLTableInfo extends TableInfo {
+	
+    /**
+     * Database Version.
+     * @var String
+     */
+    private $version;
+	
+    /**
+     * Table OID
+     * @var Integer
+     */
+    private $oid;
+
+    /**
+     * @param string $table The table name.
+     * @param string $database The database name.
+     * @param resource $dblink The db connection resource.
+     */
+    function __construct(DatabaseInfo $database, $name, $version, $intOID) {
+        parent::__construct ($database, $name);
+        $this->version = $version;
+        $this->oid = $intOID;
+    } // function __construct(DatabaseInfo $database, $name) {
+
+    /** Load the columns for this table */
+    protected function initColumns () {
+    	// Include dependencies
+    	include_once ('creole/metadata/ColumnInfo.php');
+    	include_once ('creole/drivers/pgsql/PgSQLTypes.php');
+
+    	// Get the columns, types, etc.
+    	// Based on code from pgAdmin3 (http://www.pgadmin.org/)
+    	$result = pg_query ($this->conn->getResource(), sprintf ("SELECT 
+    								att.attname,
+    								att.atttypmod,
+    								att.atthasdef,
+    								att.attnotnull,
+    								def.adsrc, 
+    								CASE WHEN att.attndims > 0 THEN 1 ELSE 0 END AS isarray, 
+    								CASE 
+    									WHEN ty.typname = 'bpchar' 
+    										THEN 'char' 
+    									WHEN ty.typname = '_bpchar' 
+	    									THEN '_char' 
+    									ELSE 
+	    									ty.typname 
+    								END AS typname,
+    								ty.typtype
+								FROM pg_attribute att
+									JOIN pg_type ty ON ty.oid=att.atttypid
+									LEFT OUTER JOIN pg_attrdef def ON adrelid=att.attrelid AND adnum=att.attnum
+								WHERE att.attrelid = %d AND att.attnum > 0
+									AND att.attisdropped IS FALSE
+								ORDER BY att.attnum", $this->oid));
+
+        if (!$result) {
+            throw new SQLException("Could not list fields for table: " . $this->name, pg_last_error($this->conn->getResource()));
+        }
+        while($row = pg_fetch_assoc($result)) {
+        	
+        	$size = null;
+        	$precision = null;
+        	$scale = null;
+        	
+        	// Check to ensure that this column isn't an array data type
+        	if (((int) $row['isarray']) === 1)
+        	{
+        		throw new SQLException (sprintf ("Array datatypes are not currently supported [%s.%s]", $this->name, $row['attname']));
+        	} // if (((int) $row['isarray']) === 1)
+            $name = $row['attname'];
+            // If they type is a domain, Process it
+            if (strtolower ($row['typtype']) == 'd')
+            {
+            	$arrDomain = $this->processDomain ($row['typname']);
+            	$type = $arrDomain['type'];
+            	$size = $arrDomain['length'];
+            	$precision = $size;
+            	$scale = $arrDomain['scale'];
+            	$boolHasDefault = (strlen (trim ($row['atthasdef'])) > 0) ? $row['atthasdef'] : $arrDomain['hasdefault'];
+            	$default = (strlen (trim ($row['adsrc'])) > 0) ? $row['adsrc'] : $arrDomain['default'];
+            	$is_nullable = (strlen (trim ($row['attnotnull'])) > 0) ? $row['attnotnull'] : $arrDomain['notnull'];
+            	$is_nullable = (($is_nullable == 't') ? false : true);
+            } // if (strtolower ($row['typtype']) == 'd')
+            else
+            {
+	            $type = $row['typname'];
+	            $arrLengthPrecision = $this->processLengthScale ($row['atttypmod'], $type);
+	            $size = $arrLengthPrecision['length'];
+	            $precision = $size;
+	            $scale = $arrLengthPrecision['scale'];
+	            $boolHasDefault = $row['atthasdef'];
+	            $default = $row['adsrc'];
+	            $is_nullable = (($row['attnotnull'] == 't') ? false : true);
+            } // else (strtolower ($row['typtype']) == 'd')
+
+            $autoincrement = null;
+                       
+            // if column has a default
+            if (($boolHasDefault == 't') && (strlen (trim ($default)) > 0))
+            {
+	            if (!preg_match('/^nextval\(/', $default))
+	            {
+	            	$strDefault= preg_replace ('/::[\W\D]*/', '', $default);
+	            	$default = str_replace ("'", '', $strDefault);
+	            } // if (!preg_match('/^nextval\(/', $row['atthasdef']))
+	            else
+	            {
+	            	$autoincrement = true;
+	            	$default = null;
+	            } // else
+            } // if (($boolHasDefault == 't') && (strlen (trim ($default)) > 0))
+            else
+            {
+            	$default = null;
+            } // else (($boolHasDefault == 't') && (strlen (trim ($default)) > 0))
+
+            $this->columns[$name] = new ColumnInfo($this, $name, PgSQLTypes::getType($type), $type, $size, $precision, $scale, $is_nullable, $default, $autoincrement);
+        }
+
+        $this->colsLoaded = true;
+    } // protected function initColumns ()
+
+    private function processLengthScale ($intTypmod, $strName)
+    {
+    	// Define the return array
+    	$arrRetVal = array ('length'=>null, 'scale'=>null);
+
+    	// Some datatypes don't have a Typmod
+    	if ($intTypmod == -1)
+    	{
+    		return $arrRetVal;
+    	} // if ($intTypmod == -1)
+
+    	// Numeric Datatype?
+    	if ($strName == PgSQLTypes::getNativeType (CreoleTypes::NUMERIC))
+    	{
+    		$intLen = ($intTypmod - 4) >> 16;
+    		$intPrec = ($intTypmod - 4) & 0xffff;
+    		$intLen = sprintf ("%ld", $intLen);
+    		if ($intPrec)
+    		{
+    			$intPrec = sprintf ("%ld", $intPrec);
+    		} // if ($intPrec)
+    		$arrRetVal['length'] = $intLen;
+    		$arrRetVal['scale'] = $intPrec;
+    	} // if ($strName == PgSQLTypes::getNativeType (CreoleTypes::NUMERIC))
+    	elseif ($strName == PgSQLTypes::getNativeType (CreoleTypes::TIME) || $strName == 'timetz'
+    		|| $strName == PgSQLTypes::getNativeType (CreoleTypes::TIMESTAMP) || $strName == 'timestamptz'
+    		|| $strName == 'interval' || $strName == 'bit')
+    	{
+    		$arrRetVal['length'] = sprintf ("%ld", $intTypmod);
+    	} // elseif (TIME, TIMESTAMP, INTERVAL, BIT)
+    	else
+    	{
+    		$arrRetVal['length'] = sprintf ("%ld", ($intTypmod - 4));
+    	} // else
+    	return $arrRetVal;
+    } // private function processLengthScale ($intTypmod, $strName)
+
+    private function processDomain ($strDomain)
+    {
+    	if (strlen (trim ($strDomain)) < 1)
+    	{
+    		throw new SQLException ("Invalid domain name [" . $strDomain . "]");
+    	} // if (strlen (trim ($strDomain)) < 1)
+    	$result = pg_query ($this->conn->getResource(), sprintf ("SELECT
+														d.typname as domname,
+														b.typname as basetype,
+														d.typlen,
+														d.typtypmod,
+														d.typnotnull,
+														d.typdefault
+													FROM pg_type d
+														INNER JOIN pg_type b ON b.oid = CASE WHEN d.typndims > 0 then d.typelem ELSE d.typbasetype END
+													WHERE
+														d.typtype = 'd'
+														AND d.typname = '%s'
+													ORDER BY d.typname", $strDomain));
+
+        if (!$result) {
+            throw new SQLException("Query for domain [" . $strDomain . "] failed.", pg_last_error($this->conn->getResource()));
+        }
+
+        $row = pg_fetch_assoc ($result);
+        if (!$row)
+        {
+        	throw new SQLException ("Domain [" . $strDomain . "] not found.");
+        } // if (!$row)
+        $arrDomain = array ();
+        $arrDomain['type'] = $row['basetype'];
+	    $arrLengthPrecision = $this->processLengthScale ($row['typtypmod'], $row['basetype']);
+	    $arrDomain['length'] = $arrLengthPrecision['length'];
+	    $arrDomain['scale'] = $arrLengthPrecision['scale'];
+	    $arrDomain['notnull'] = $row['typnotnull'];
+	    $arrDomain['default'] = $row['typdefault'];
+	    $arrDomain['hasdefault'] = (strlen (trim ($row['typdefault'])) > 0) ? 't' : 'f';
+
+	    pg_free_result ($result);
+	    return $arrDomain;
+    } // private function processDomain ($strDomain)
+
+    /** Load foreign keys for this table. */
+    protected function initForeignKeys()
+    {
+        include_once 'creole/metadata/ForeignKeyInfo.php';
+
+        $result = pg_query ($this->conn->getResource(), sprintf ("SELECT
+						      conname,
+						      confupdtype,
+						      confdeltype,
+						      cl.relname as fktab,
+						      a2.attname as fkcol,
+						      cr.relname as reftab,
+						      a1.attname as refcol
+						FROM pg_constraint ct
+						     JOIN pg_class cl ON cl.oid=conrelid
+						     JOIN pg_class cr ON cr.oid=confrelid
+						     LEFT JOIN pg_catalog.pg_attribute a1 ON a1.attrelid = ct.confrelid
+						     LEFT JOIN pg_catalog.pg_attribute a2 ON a2.attrelid = ct.conrelid
+						WHERE
+						     contype='f'
+						     AND conrelid = %d
+						     AND a2.attnum = ct.conkey[1]
+						     AND a1.attnum = ct.confkey[1]
+						ORDER BY conname", $this->oid));
+        if (!$result) {
+            throw new SQLException("Could not list foreign keys for table: " . $this->name, pg_last_error($this->conn->getResource()));
+        }
+
+        while($row = pg_fetch_assoc($result)) {
+            $name = $row['conname'];
+            $local_table = $row['fktab'];
+            $local_column = $row['fkcol'];
+            $foreign_table = $row['reftab'];
+            $foreign_column = $row['refcol'];
+
+            // On Update
+            switch ($row['confupdtype']) {
+              case 'c':
+                $onupdate = ForeignKeyInfo::CASCADE; break;
+              case 'd':
+                $onupdate = ForeignKeyInfo::SETDEFAULT; break;
+              case 'n':
+                $onupdate = ForeignKeyInfo::SETNULL; break;
+              case 'r':
+                $onupdate = ForeignKeyInfo::RESTRICT; break;
+              default:
+              case 'a':
+                //NOACTION is the postgresql default
+                $onupdate = ForeignKeyInfo::NONE; break;
+            }
+            // On Delete
+            switch ($row['confdeltype']) {
+              case 'c':
+                $ondelete = ForeignKeyInfo::CASCADE; break;
+              case 'd':
+                $ondelete = ForeignKeyInfo::SETDEFAULT; break;
+              case 'n':
+                $ondelete = ForeignKeyInfo::SETNULL; break;
+              case 'r':
+                $ondelete = ForeignKeyInfo::RESTRICT; break;
+              default:
+              case 'a':
+                //NOACTION is the postgresql default
+                $ondelete = ForeignKeyInfo::NONE; break;
+            }
+
+
+            $foreignTable = $this->database->getTable($foreign_table);
+            $foreignColumn = $foreignTable->getColumn($foreign_column);
+
+            $localTable   = $this->database->getTable($local_table);
+            $localColumn   = $localTable->getColumn($local_column);
+
+            if (!isset($this->foreignKeys[$name])) {
+                $this->foreignKeys[$name] = new ForeignKeyInfo($name);
+            }
+            $this->foreignKeys[$name]->addReference($localColumn, $foreignColumn, $ondelete, $onupdate);
+        }
+
+        $this->fksLoaded = true;
+    }
+
+    /** Load indexes for this table */
+    protected function initIndexes()
+    {
+        include_once 'creole/metadata/IndexInfo.php';
+
+        // columns have to be loaded first
+        if (!$this->colsLoaded) $this->initColumns();
+
+		$result = pg_query ($this->conn->getResource(), sprintf ("SELECT
+													      DISTINCT ON(cls.relname)
+													      cls.relname as idxname,
+													      indkey,
+													      indisunique
+													FROM pg_index idx
+													     JOIN pg_class cls ON cls.oid=indexrelid
+													WHERE indrelid = %d AND NOT indisprimary
+													ORDER BY cls.relname", $this->oid));
+
+
+        if (!$result) {
+            throw new SQLException("Could not list indexes keys for table: " . $this->name, pg_last_error($this->conn->getResource()));
+        }
+
+        while($row = pg_fetch_assoc($result)) {
+            $name = $row["idxname"];
+            $unique = ($row["indisunique"] == 't') ? true : false;
+            if (!isset($this->indexes[$name])) {
+                $this->indexes[$name] = new IndexInfo($name, $unique);
+            }
+            $arrColumns = explode (' ', $row['indkey']);
+            foreach ($arrColumns as $intColNum)
+            {
+	            $result2 = pg_query ($this->conn->getResource(), sprintf ("SELECT a.attname
+															FROM pg_catalog.pg_class c JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid
+															WHERE c.oid = '%s' AND a.attnum = %d AND NOT a.attisdropped
+															ORDER BY a.attnum", $this->oid, $intColNum));
+				if (!$result2)
+				{
+            		throw new SQLException("Could not list indexes keys for table: " . $this->name, pg_last_error($this->conn->getResource()));
+				}
+				$row2 = pg_fetch_assoc($result2);
+	            $this->indexes[$name]->addColumn($this->columns[ $row2['attname'] ]);
+			} // foreach ($arrColumns as $intColNum)
+        }
+
+        $this->indexesLoaded = true;
+    }
+
+    /** Loads the primary keys for this table. */
+    protected function initPrimaryKey() {
+
+        include_once 'creole/metadata/PrimaryKeyInfo.php';
+
+
+        // columns have to be loaded first
+        if (!$this->colsLoaded) $this->initColumns();
+
+        // Primary Keys
+        
+        $result = pg_query($this->conn->getResource(), sprintf ("SELECT
+													      DISTINCT ON(cls.relname)
+													      cls.relname as idxname,
+													      indkey,
+													      indisunique
+													FROM pg_index idx
+													     JOIN pg_class cls ON cls.oid=indexrelid
+													WHERE indrelid = %s AND indisprimary
+													ORDER BY cls.relname", $this->oid));
+        if (!$result) {
+            throw new SQLException("Could not list primary keys for table: " . $this->name, pg_last_error($this->conn->getResource()));
+        }
+
+        // Loop through the returned results, grouping the same key_name together
+        // adding each column for that key.
+
+        while($row = pg_fetch_assoc($result)) {
+            $arrColumns = explode (' ', $row['indkey']);
+            foreach ($arrColumns as $intColNum)
+            {
+	            $result2 = pg_query ($this->conn->getResource(), sprintf ("SELECT a.attname
+															FROM pg_catalog.pg_class c JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid
+															WHERE c.oid = '%s' AND a.attnum = %d AND NOT a.attisdropped
+															ORDER BY a.attnum", $this->oid, $intColNum));
+				if (!$result2)
+				{
+            		throw new SQLException("Could not list indexes keys for table: " . $this->name, pg_last_error($this->conn->getResource()));
+				}
+				$row2 = pg_fetch_assoc($result2);
+				if (!isset($this->primaryKey)) {
+					$this->primaryKey = new PrimaryKeyInfo($row2['attname']);
+				}
+	            $this->primaryKey->addColumn($this->columns[ $row2['attname'] ]);
+			} // foreach ($arrColumns as $intColNum)
+        }
+        $this->pkLoaded = true;
+    }
+
+    
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/pgsql/metadata/PgSQLTableInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteConnection.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteConnection.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteConnection.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,245 @@
+<?php
+/*
+ *  $Id: SQLiteConnection.php,v 1.15 2006/01/17 19:44:41 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/Connection.php';
+require_once 'creole/common/ConnectionCommon.php';
+
+/**
+ * SQLite implementation of Connection.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @author    Stig Bakken <ssb en fast.no> 
+ * @author    Lukas Smith
+ * @version   $Revision: 1.15 $
+ * @package   creole.drivers.sqlite
+ */ 
+class SQLiteConnection extends ConnectionCommon implements Connection {   
+    
+    /**
+     * The case to use for SQLite results.
+     * (0=nochange, 1=upper, 2=lower) 
+     * This is set in each call to executeQuery() in order to ensure that different
+     * Connections do not overwrite each other's settings
+     */
+    private $sqliteAssocCase;
+    
+    /**
+     * @see Connection::connect()
+     */
+    function connect($dsninfo, $flags = 0)
+    {        
+        if (!extension_loaded('sqlite')) {
+            throw new SQLException('sqlite extension not loaded');
+        }
+
+        $file = $dsninfo['database'];
+        
+        $this->dsn = $dsninfo;
+        $this->flags = $flags;
+        
+        $persistent = ($flags & Creole::PERSISTENT === Creole::PERSISTENT);
+        
+        if (PHP_VERSION == '5.0.4' || PHP_VERSION == '5.0.5') {
+            $nochange = TRUE;
+        } else {
+            $nochange = !(($flags & Creole::COMPAT_ASSOC_LOWER) === Creole::COMPAT_ASSOC_LOWER);
+        }
+        
+        if ($nochange) {     
+            $this->sqliteAssocCase = 0;
+        } else {
+            $this->sqliteAssocCase = 2;
+        }
+        
+        if ($file === null) {
+            throw new SQLException("No SQLite database specified.");
+        }
+        
+        $mode = (isset($dsninfo['mode']) && is_numeric($dsninfo['mode'])) ? $dsninfo['mode'] : 0644;
+        
+        if ($file != ':memory:') {
+            if (!file_exists($file)) {
+                touch($file);
+                chmod($file, $mode);
+                if (!file_exists($file)) {
+                    throw new SQLException("Unable to create SQLite database.");
+                }
+            }
+            if (!is_file($file)) {
+                throw new SQLException("Unable to open SQLite database: not a valid file.");
+            }
+            if (!is_readable($file)) {
+                throw new SQLException("Unable to read SQLite database.");
+            }
+        }
+
+        $connect_function = $persistent ? 'sqlite_popen' : 'sqlite_open';
+        if (!($conn = @$connect_function($file, $mode, $errmsg) )) {
+            throw new SQLException("Unable to connect to SQLite database", $errmsg);
+        }
+        
+        $this->dblink = $conn;
+    }   
+
+    /**
+     * @see Connection::getDatabaseInfo()
+     */
+    public function getDatabaseInfo()
+    {
+        require_once 'creole/drivers/sqlite/metadata/SQLiteDatabaseInfo.php';
+        return new SQLiteDatabaseInfo($this);
+    }
+    
+     /**
+     * @see Connection::getIdGenerator()
+     */
+    public function getIdGenerator()
+    {
+        require_once 'creole/drivers/sqlite/SQLiteIdGenerator.php';
+        return new SQLiteIdGenerator($this);
+    }
+    
+    /**
+     * @see Connection::prepareStatement()
+     */
+    public function prepareStatement($sql) 
+    {
+        require_once 'creole/drivers/sqlite/SQLitePreparedStatement.php';
+        return new SQLitePreparedStatement($this, $sql);
+    }
+    
+    /**
+     * @see Connection::prepareCall()
+     */
+    public function prepareCall($sql) {
+        throw new SQLException('SQLite does not support stored procedures using CallableStatement.');        
+    }
+    
+    /**
+     * @see Connection::createStatement()
+     */
+    public function createStatement()
+    {
+        require_once 'creole/drivers/sqlite/SQLiteStatement.php';
+        return new SQLiteStatement($this);
+    }
+        
+    /**
+     * @see Connection::close()
+     */
+    function close()
+    {
+        $ret = @sqlite_close($this->dblink);
+        $this->dblink = null;
+        return $ret;
+    }
+    
+    /**
+     * @see Connection::applyLimit()
+     */
+    public function applyLimit(&$sql, $offset, $limit)
+    {
+        if ( $limit > 0 ) {
+            $sql .= " LIMIT " . $limit . ($offset > 0 ? " OFFSET " . $offset : "");
+        } elseif ( $offset > 0 ) {
+            $sql .= " LIMIT -1 OFFSET " . $offset;
+        }
+    } 
+
+    /**
+     * @see Connection::executeQuery()
+     */
+    public function executeQuery($sql, $fetchmode = null)
+    {    
+        ini_set('sqlite.assoc_case', $this->sqliteAssocCase);
+        $this->lastQuery = $sql;
+        $result = @sqlite_query($this->dblink, $this->lastQuery);
+        if (!$result) {
+            throw new SQLException('Could not execute query', $php_errormsg, $this->lastQuery); //sqlite_error_string(sqlite_last_error($this->dblink))
+        }
+        require_once 'creole/drivers/sqlite/SQLiteResultSet.php';
+        return new SQLiteResultSet($this, $result, $fetchmode);    
+    }    
+    
+    /**
+     * @see Connection::executeUpdate()
+     */
+    function executeUpdate($sql)
+    {
+        $this->lastQuery = $sql;
+        $result = @sqlite_query($this->dblink, $this->lastQuery);
+        if (!$result) {            
+            throw new SQLException('Could not execute update', $php_errormsg, $this->lastQuery); //sqlite_error_string(sqlite_last_error($this->dblink))
+        }
+        return (int) @sqlite_changes($this->dblink);
+    }
+    
+    /**
+     * Start a database transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function beginTrans()
+    {
+        $result = @sqlite_query($this->dblink, 'BEGIN');
+        if (!$result) {
+            throw new SQLException('Could not begin transaction', $php_errormsg); //sqlite_error_string(sqlite_last_error($this->dblink))
+        }
+    }
+    
+    /**
+     * Commit the current transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function commitTrans()
+    {
+        $result = @sqlite_query($this->dblink, 'COMMIT');
+        if (!$result) {
+            throw new SQLException('Can not commit transaction', $php_errormsg); // sqlite_error_string(sqlite_last_error($this->dblink))
+        }
+    }
+
+    /**
+     * Roll back (undo) the current transaction.
+     * @throws SQLException
+     * @return void
+     */
+    protected function rollbackTrans()
+    {
+        $result = @sqlite_query($this->dblink, 'ROLLBACK');
+        if (!$result) {
+            throw new SQLException('Could not rollback transaction', $php_errormsg); // sqlite_error_string(sqlite_last_error($this->dblink))
+        }
+    }
+
+    /**
+     * Gets the number of rows affected by the data manipulation
+     * query.
+     *
+     * @return int Number of rows affected by the last query.
+     */
+    function getUpdateCount()
+    {
+        return (int) @sqlite_changes($this->dblink);
+    }
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteConnection.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteIdGenerator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteIdGenerator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteIdGenerator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,60 @@
+<?php
+
+require_once 'creole/IdGenerator.php';
+
+/**
+ * SQLite IdGenerator implimenation.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.4 $
+ * @package   creole.drivers.sqlite
+ */
+class SQLiteIdGenerator implements IdGenerator {
+    
+    /** Connection object that instantiated this class */
+    private $conn;
+
+    /**
+     * Creates a new IdGenerator class, saves passed connection for use
+     * later by getId() method.
+     * @param Connection $conn
+     */
+    public function __construct(Connection $conn)
+    {
+        $this->conn = $conn;
+    }
+    
+    /**
+     * @see IdGenerator::isBeforeInsert()
+     */
+    public function isBeforeInsert()
+    {
+        return false;
+    }    
+    
+    /**
+     * @see IdGenerator::isAfterInsert()
+     */
+    public function isAfterInsert()
+    {
+        return true;
+    }
+       
+    /**
+     * @see IdGenerator::getIdMethod()
+     */
+    public function getIdMethod()
+    {
+        return self::AUTOINCREMENT;
+    }
+    
+    /**
+     * @see IdGenerator::getId()
+     */
+    public function getId($unused = null)
+    {
+        return sqlite_last_insert_rowid($this->conn->getResource());
+    }
+    
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteIdGenerator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLitePreparedStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLitePreparedStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLitePreparedStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,61 @@
+<?php
+/*
+ *  $Id: SQLitePreparedStatement.php,v 1.7 2004/03/20 04:16:50 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/PreparedStatement.php';
+require_once 'creole/common/PreparedStatementCommon.php';
+
+/**
+ * MySQL subclass for prepared statements.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.7 $
+ * @package   creole.drivers.sqlite
+ */
+class SQLitePreparedStatement extends PreparedStatementCommon implements PreparedStatement {
+    
+    /**
+     * Quotes string using native sqlite_escape_string() function.
+     * @see ResultSetCommon::escape()
+     */
+    protected function escape($str)
+    {
+        return sqlite_escape_string($str);
+    }
+    
+    /**
+     * Applies sqlite_udf_encode_binary() to ensure that binary contents will be handled correctly by sqlite.
+     * @see PreparedStatement::setBlob()
+     * @see ResultSet::getBlob()
+     */
+    function setBlob($paramIndex, $blob) 
+    {    
+        if ($blob === null) {
+            $this->setNull($paramIndex);
+        } else {
+            // they took magic __toString() out of PHP5.0.0; this sucks
+            if (is_object($blob)) {
+                $blob = $blob->__toString();
+            }
+            $this->boundInVars[$paramIndex] = "'" . sqlite_udf_encode_binary( $blob ) . "'";
+        }
+    }
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLitePreparedStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteResultSet.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteResultSet.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteResultSet.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,120 @@
+<?php
+/*
+ *  $Id: SQLiteResultSet.php,v 1.9 2004/11/29 13:41:24 micha Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/ResultSet.php';
+require_once 'creole/common/ResultSetCommon.php';
+
+/**
+ * SQLite implementation of ResultSet class.
+ *
+ * SQLite supports OFFSET / LIMIT natively; this means that no adjustments or checking
+ * are performed.  We will assume that if the lmitSQL() operation failed that an
+ * exception was thrown, and that OFFSET/LIMIT will never be emulated for SQLite.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.9 $
+ * @package   creole.drivers.sqlite
+ */
+class SQLiteResultSet extends ResultSetCommon implements ResultSet {
+    
+    /**
+     * Gets optimized SQLiteResultSetIterator.
+     * @return SQLiteResultSetIterator
+     */
+    public function getIterator()
+    {
+        require_once 'creole/drivers/sqlite/SQLiteResultSetIterator.php';
+        return new SQLiteResultSetIterator($this);
+    }
+           
+    /**
+     * @see ResultSet::seek()
+     */ 
+    public function seek($rownum)
+    {
+        // MySQL rows start w/ 0, but this works, because we are
+        // looking to move the position _before_ the next desired position
+         if (!@sqlite_seek($this->result, $rownum)) {
+                return false;
+        }
+        $this->cursorPos = $rownum;
+        return true;
+    }
+    
+    /**
+     * @see ResultSet::next()
+     */ 
+    function next()
+    {
+        $this->fields = sqlite_fetch_array($this->result, $this->fetchmode); // (ResultSet::FETCHMODE_NUM = SQLITE_NUM, etc.)
+           if (!$this->fields) {
+            $errno = sqlite_last_error($this->conn->getResource());
+            if (!$errno) {
+                // We've advanced beyond end of recordset.
+                $this->afterLast();
+                return false;
+            } else {
+                throw new SQLException("Error fetching result", sqlite_error_string($errno));
+            }
+        }
+        
+        // Advance cursor position
+        $this->cursorPos++;
+        return true;
+    }
+
+    /**
+     * @see ResultSet::getRecordCount()
+     */
+    public function getRecordCount()
+    {
+        $rows = @sqlite_num_rows($this->result);
+        if ($rows === null) {
+            throw new SQLException("Error fetching num rows", sqlite_error_string(sqlite_last_error($this->conn->getResource())));
+        }
+        return (int) $rows;
+    }    
+
+    /**
+     * Performs sqlite_udf_decode_binary on binary data.
+     * @see ResultSet::getBlob()
+     */
+    public function getBlob($column) 
+    {
+        $idx = (is_int($column) ? $column - 1 : $column);
+        if (!array_key_exists($idx, $this->fields)) { throw new SQLException("Invalid resultset column: " . $column); }
+        if ($this->fields[$idx] === null) { return null; }
+        require_once 'creole/util/Blob.php';
+        $b = new Blob();
+        $b->setContents(sqlite_udf_decode_binary($this->fields[$idx]));
+        return $b;
+    }    
+    
+    /**
+     * Simply empties array as there is no result free method for sqlite.
+     * @see ResultSet::close()
+     */
+    public function close()
+    {
+        $this->fields = array();
+        $this->result = null;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteResultSet.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteResultSetIterator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteResultSetIterator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteResultSetIterator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,88 @@
+<?php
+/*
+ *  $Id: SQLiteResultSetIterator.php,v 1.6 2004/12/03 16:57:54 gamr Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * Optimized iterator for SQLite.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.6 $
+ * @package   creole.drivers.sqlite
+ */
+class SQLiteResultSetIterator implements Iterator {
+
+    private $result;
+    private $pos = 0;
+    private $fetchmode;
+    private $row_count;
+    
+    /**
+     * Construct the iterator.
+     * @param SQLiteResultSet $rs
+     */
+    public function __construct(SQLiteResultSet $rs)
+    {
+        $this->result = $rs->getResource();
+        $this->fetchmode = $rs->getFetchmode();
+	$this->row_count = $rs->getRecordCount();
+    }
+    
+    /**
+     * This method actually has no effect, since we do not rewind ResultSet for iteration.
+     */
+    function rewind()
+    {        
+        sqlite_rewind($this->result);
+    }
+    
+    function valid()
+    {
+	return ( $this->pos < $this->row_count );
+    }
+    
+    /**
+     * Returns the cursor position.  Note that this will not necessarily
+     * be 1 for the first row, since no rewind is performed at beginning
+     * of iteration.
+     * @return int
+     */
+    function key()
+    {
+        return $this->pos;
+    }
+    
+    /**
+     * Returns the row (assoc array) at current cursor pos.
+     * @return array
+     */
+    function current()
+    {
+       return sqlite_fetch_array($this->result, $this->fetchmode);
+    }
+    
+    /**
+     * Advances internal cursor pos.
+     */
+    function next()
+    {
+        $this->pos++;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteResultSetIterator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteStatement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteStatement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteStatement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+<?php
+/*
+ *  $Id: SQLiteStatement.php,v 1.1 2004/02/19 02:49:43 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/Statement.php';
+require_once 'creole/common/StatementCommon.php';
+
+/**
+ * SQLite Statement
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.1 $
+ * @package   creole.drivers.sqlite
+ */ 
+class SQLiteStatement extends StatementCommon implements Statement {   
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteStatement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteTypes.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteTypes.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteTypes.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,108 @@
+<?php
+
+/*
+ *  $Id: SQLiteTypes.php,v 1.3 2004/03/20 04:16:50 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/CreoleTypes.php';
+
+/**
+ * MySQL types / type map.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.3 $
+ * @package   creole.drivers.sqlite
+ */
+class SQLiteTypes extends CreoleTypes {
+
+    /** 
+     * Map some fake SQLite types CreoleTypes. 
+     * SQLite is typeless so this is really only for "hint" / readability
+     * purposes.    
+     * @var array
+     */
+    private static $typeMap = array(
+                                'tinyint' => CreoleTypes::TINYINT,
+                                'smallint' => CreoleTypes::SMALLINT,
+                                'mediumint' => CreoleTypes::SMALLINT,
+                                'int' => CreoleTypes::INTEGER,
+                                'integer' => CreoleTypes::INTEGER,
+                                'bigint' => CreoleTypes::BIGINT,
+                                'int24' => CreoleTypes::BIGINT,
+                                'real' => CreoleTypes::REAL,
+                                'float' => CreoleTypes::FLOAT,
+                                'decimal' => CreoleTypes::DECIMAL,
+                                'numeric' => CreoleTypes::NUMERIC,
+                                'double' => CreoleTypes::DOUBLE,
+                                'char' => CreoleTypes::CHAR,
+                                'varchar' => CreoleTypes::VARCHAR,
+                                'date' => CreoleTypes::DATE,
+                                'time' => CreoleTypes::TIME,
+                                'year' => CreoleTypes::YEAR,
+                                'datetime' => CreoleTypes::TIMESTAMP,
+                                'timestamp' => CreoleTypes::TIMESTAMP,                                
+                                'tinyblob' => CreoleTypes::BINARY,
+                                'blob' => CreoleTypes::VARBINARY,
+                                'mediumblob' => CreoleTypes::VARBINARY,
+                                'longblob' => CreoleTypes::VARBINARY,
+                                'tinytext' => CreoleTypes::VARCHAR,
+                                'mediumtext' => CreoleTypes::LONGVARCHAR,
+                                'text' => CreoleTypes::LONGVARCHAR,
+                                );
+    
+    /** Reverse mapping, created on demand. */
+    private static $reverseMap = null;
+    
+    /**
+     * This method returns the generic Creole (JDBC-like) type
+     * when given the native db type.  If no match is found then we just
+     * return CreoleTypes::TEXT because SQLite is typeless.
+     * @param string $nativeType DB native type (e.g. 'TEXT', 'byetea', etc.).
+     * @return int Creole native type (e.g. CreoleTypes::LONGVARCHAR, CreoleTypes::BINARY, etc.).
+     */
+    public static function getType($nativeType)
+    {
+        $t = strtolower($nativeType);
+        if (isset(self::$typeMap[$t])) {
+            return self::$typeMap[$t];
+        } else {
+            return CreoleTypes::TEXT; // because SQLite is typeless
+        }
+    }
+            
+    /**
+     * This method will return a native type that corresponds to the specified
+     * Creole (JDBC-like) type.  Remember that this is really only for "hint" purposes
+     * as SQLite is typeless.
+     * 
+     * If there is more than one matching native type, then the LAST defined 
+     * native type will be returned.
+     * 
+     * @param int $creoleType
+     * @return string Native type string.
+     */
+    public static function getNativeType($creoleType)
+    {
+        if (self::$reverseMap === null) {
+            self::$reverseMap = array_flip(self::$typeMap);
+        }
+        return @self::$reverseMap[$creoleType];
+    }
+                                
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/SQLiteTypes.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/metadata/SQLiteDatabaseInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/metadata/SQLiteDatabaseInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/metadata/SQLiteDatabaseInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,64 @@
+<?php
+/*
+ *  $Id: SQLiteDatabaseInfo.php,v 1.3 2004/03/20 04:16:50 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/metadata/DatabaseInfo.php';
+
+/**
+ * SQLite implementation of DatabaseInfo.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.3 $
+ * @package   creole.drivers.sqlite.metadata
+ */ 
+class SQLiteDatabaseInfo extends DatabaseInfo {
+    
+    /**
+     * @throws SQLException
+     * @return void
+     */
+    protected function initTables()
+    {
+        include_once 'creole/drivers/sqlite/metadata/SQLiteTableInfo.php';        
+        
+        $sql = "SELECT name FROM sqlite_master WHERE type='table' UNION ALL SELECT name FROM sqlite_temp_master WHERE type='table' ORDER BY name;";
+        $result = sqlite_query($this->dblink, $sql);
+            
+        if (!$result) {
+            throw new SQLException("Could not list tables", sqlite_last_error($this->dblink));
+        }
+        
+        while ($row = sqlite_fetch_array($result)) {
+            $this->tables[strtoupper($row[0])] = new SQLiteTableInfo($this, $row[0]);
+        }
+    }
+    
+    /**
+     * SQLite does not support sequences.
+     *
+     * @return void 
+     * @throws SQLException
+     */
+    protected function initSequences()
+    {
+        // throw new SQLException("MySQL does not support sequences natively.");
+    }
+        
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/metadata/SQLiteDatabaseInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/metadata/SQLiteTableInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/metadata/SQLiteTableInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/metadata/SQLiteTableInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,137 @@
+<?php
+/*
+ *  $Id: SQLiteTableInfo.php,v 1.8 2005/10/18 02:27:50 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+require_once 'creole/metadata/TableInfo.php';
+
+/**
+ * MySQL implementation of TableInfo.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.8 $
+ * @package   creole.drivers.sqlite.metadata
+ */
+class SQLiteTableInfo extends TableInfo {
+    
+    /** Loads the columns for this table. */
+    protected function initColumns() 
+    {
+        
+        include_once 'creole/metadata/ColumnInfo.php';
+        include_once 'creole/metadata/PrimaryKeyInfo.php';
+        include_once 'creole/drivers/sqlite/SQLiteTypes.php';                
+        
+        // To get all of the attributes we need, we'll actually do 
+        // two separate queries.  The first gets names and default values
+        // the second will fill in some more details.
+        
+        $sql = "PRAGMA table_info('".$this->name."')";
+                
+        $res = sqlite_query($this->conn->getResource(), $sql);
+        
+        
+        while($row = sqlite_fetch_array($res, SQLITE_ASSOC)) {
+        
+            $name = $row['name'];
+            
+            $fulltype = $row['type'];            
+            $size = null;
+            $precision = null;
+            $scale = null;
+            
+            if (preg_match('/^([^\(]+)\(\s*(\d+)\s*,\s*(\d+)\s*\)$/', $fulltype, $matches)) {
+                $type = $matches[1];
+                $precision = $matches[2];
+                $scale = $matches[3]; // aka precision    
+            } elseif (preg_match('/^([^\(]+)\(\s*(\d+)\s*\)$/', $fulltype, $matches)) {
+                $type = $matches[1];
+                $size = $matches[2];
+            } else {
+                $type = $fulltype;
+            }
+            // If column is primary key and of type INTEGER, it is auto increment
+            // See: http://sqlite.org/faq.html#q1
+            $is_auto_increment = ($row['pk'] == 1 && $fulltype == 'INTEGER');
+            $not_null = $row['notnull'];
+            $is_nullable = !$not_null;
+            
+            $default_val = $row['dflt_value'];
+            
+            $this->columns[$name] = new ColumnInfo($this, $name, SQLiteTypes::getType($type), $type, $size, $precision, $scale, $is_nullable, $default_val);
+            
+            if (($row['pk'] == 1) || (strtolower($type) == 'integer primary key')) {
+                if ($this->primaryKey === null) {
+                    $this->primaryKey = new PrimaryKeyInfo($name);
+                }
+                $this->primaryKey->addColumn($this->columns[ $name ]);
+            }
+            
+        }        
+                
+        $this->colsLoaded = true;
+    }
+    
+    /** Loads the primary key information for this table. */
+    protected function initPrimaryKey()
+    {        
+        // columns have to be loaded first
+        if (!$this->colsLoaded) $this->initColumns();                        
+        // keys are loaded by initColumns() in this class.
+        $this->pkLoaded = true;
+    }
+    
+    /** Loads the indexes for this table. */
+    protected function initIndexes() {
+    
+        include_once 'creole/metadata/IndexInfo.php';        
+
+        // columns have to be loaded first
+        if (!$this->colsLoaded) $this->initColumns();        
+
+        $sql = "PRAGMA index_list('".$this->name."')";
+        $res = sqlite_query($this->conn->getResource(), $sql);
+        
+        while($row = sqlite_fetch_array($res, SQLITE_ASSOC)) {        
+            $name = $row['name'];
+            $this->indexes[$name] = new IndexInfo($name);
+            
+            // get columns for that index
+            $res2 = sqlite_query($this->conn->getResource(), "PRAGMA index_info('$name')");
+            while($row2 = sqlite_fetch_array($res2, SQLITE_ASSOC)) {
+                $colname = $row2['name'];
+                $this->indexes[$name]->addColumn($this->columns[ $colname ]);
+            }
+        }        
+                
+        $this->indexesLoaded = true;
+    }
+    
+    /** Load foreign keys (unsupported in SQLite). */
+    protected function initForeignKeys() {
+        
+        // columns have to be loaded first
+        if (!$this->colsLoaded) $this->initColumns();        
+        
+        // No fkeys in SQLite
+        
+        $this->fksLoaded = true;
+    }
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/drivers/sqlite/metadata/SQLiteTableInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/ColumnInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/ColumnInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/ColumnInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,232 @@
+<?php
+
+/*
+ *  $Id: ColumnInfo.php,v 1.13 2005/02/25 15:47:02 pachanga Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * Represents a Column.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.13 $
+ * @package   creole.metadata
+ */
+class ColumnInfo {
+
+     // FIXME
+     //    - Currently all member attributes are public.  This should be fixed
+     // when PHP's magic __sleep() and __wakeup() functions & serialization support
+     // handles protected/private members. (if ever)
+
+    /** Column name */
+    public $name;
+
+    /** Column Creole type. */
+    public $type;
+
+    /** Column native type */
+    public $nativeType;
+
+    /** Column length */
+    public $size;
+    
+    /** Column presision */
+    public $precision;
+
+    /** Column scale (number of digits after decimal ) */
+    public $scale;
+
+    /** Is nullable? */
+    public $isNullable;
+
+    /** Default value */
+    public $defaultValue;
+
+    /** Is autoincrement? */
+    public $isAutoIncrement;
+
+    /** Table */
+    public $table;
+
+    /**
+     * Additional and optional vendor specific information.
+     * @var vendorSpecificInfo
+     */
+    protected $vendorSpecificInfo = array();
+
+    /**
+     * Construct a new ColumnInfo object.
+     *
+     * @param TableInfo $table The table that owns this column.
+     * @param string $name Column name.
+     * @param int $type Creole type.
+     * @param string $nativeType Native type name.
+     * @param int $size Column length.
+     * @param int $scale Column scale (number of digits after decimal).
+     * @param boolean $is_nullable Whether col is nullable.
+     * @param mixed $default Default value.
+     * @param boolean $is_auto_increment Whether col is of autoIncrement type.
+     */
+    function __construct(TableInfo
+                         $table,
+                         $name,
+                         $type = null,
+                         $nativeType = null,
+                         $size = null,
+                         $precision=null,
+                         $scale = null,
+                         $is_nullable = null,
+                         $default = null,
+                         $is_auto_increment = null,
+                         $vendorInfo = array())
+    {
+        $this->table = $table;
+        $this->name = $name;
+        $this->type = $type;
+        $this->nativeType = $nativeType;
+        $this->size = $size;
+        $this->precision = $precision;
+        $this->scale = $scale;
+        $this->isNullable = $is_nullable;
+        $this->defaultValue = $default;
+        $this->isAutoIncrement = $is_auto_increment;
+        $this->vendorSpecificInfo = $vendorInfo;
+    }
+
+    /**
+     * This "magic" method is invoked upon serialize().
+     * Because the Info class hierarchy is recursive, we must handle
+     * the serialization and unserialization of this object.
+     * @return array The class variables that should be serialized (all must be public!).
+     */
+    function __sleep()
+    {
+        return array('name', 'type', 'nativeType', 'size', 'precision', 'isNullable', 'defaultValue');
+    }
+
+    /**
+     * Get column name.
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Get column type.
+     * @return int
+     */
+    public function getType()
+    {
+        return $this->type;
+    }
+
+    /**
+     * Gets the native type name.
+     * @return string
+     */
+    public function getNativeType()
+    {
+        return $this->nativeType;
+    }
+
+    /**
+     * Get column size.
+     * @return int
+     */
+    public function getSize()
+    {
+        return $this->size;
+    }
+
+    /**
+     * Get column precision.
+     * @return int
+     */
+    public function getPrecision()
+    {
+        return $this->precision;
+    }
+
+    /**
+     * Get column scale.
+     * Scale refers to number of digits after the decimal.  Sometimes this is referred
+     * to as precision, but precision is the total number of digits (i.e. length).
+     * @return int
+     */
+    public function getScale()
+    {
+        return $this->scale;
+    }
+
+    /**
+     * Get the default value.
+     * @return mixed
+     */
+    public function getDefaultValue()
+    {
+        return $this->defaultValue;
+    }
+
+    /**
+     * Is column nullable?
+     * @return boolean
+     */
+    public function isNullable()
+    {
+        return $this->isNullable;
+    }
+
+    /**
+     * Is column of autoincrement type?
+     * @return boolean
+     */
+    public function isAutoIncrement()
+    {
+        return $this->isAutoIncrement === true;
+    }
+
+    /**
+     * Get vendor specific optional information for this column.
+     * @return array vendorSpecificInfo[]
+     */
+    public function getVendorSpecificInfo()
+    {
+        return $this->vendorSpecificInfo;
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Get parent table.
+     * @return TableInfo
+     */
+    public function getTable()
+    {
+        return $this->table;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/ColumnInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/DatabaseInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/DatabaseInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/DatabaseInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,207 @@
+<?php
+
+/*
+ *  $Id: DatabaseInfo.php,v 1.15 2005/11/08 04:24:50 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * "Info" metadata class for a database.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.15 $
+ * @package   creole.metadata
+ */
+abstract class DatabaseInfo {
+
+    protected $tables = array();
+
+    protected $sequences = array();
+
+    /** have tables been loaded */
+    protected $tablesLoaded = false;
+
+    /** have sequences been loaded */
+    protected $seqsLoaded = false;
+
+    /** additional vendor specific information */
+    private $vendorSpecificInfo = array();
+
+    /**
+     * The database Connection.
+     * @var Connection
+     */
+    protected $conn;
+
+    /** Database name. */
+    protected $dbname;
+
+    /**
+     * Database link
+     * @var resource
+     */
+    protected $dblink;
+
+    /**
+     * @param Connection $dbh
+     */
+    public function __construct(Connection $conn, $vendorInfo = array())
+    {
+        $this->conn = $conn;
+        $this->dblink = $conn->getResource();
+        $dsn = $conn->getDSN();
+        $this->dbname = $dsn['database'];
+        $this->vendorSpecificInfo = $vendorInfo;
+    }
+
+    /**
+     * Get name of database.
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->dbname;
+    }
+
+    /**
+     * This method is invoked upon serialize().
+     * Because the Info class hierarchy is recursive, we must handle
+     * the serialization and unserialization of this object.
+     * @return array The class variables that should be serialized (all must be public!).
+     */
+    function __sleep()
+    {
+        return array('tables','sequences','conn');
+    }
+
+    /**
+     * This method is invoked upon unserialize().
+     * This method re-hydrates the object and restores the recursive hierarchy.
+     */
+    function __wakeup()
+    {
+        // Re-init vars from serialized connection
+        $this->dbname = $conn->database;
+        $this->dblink = $conn->connection;
+
+        // restore chaining
+        foreach($this->tables as $tbl) {
+            $tbl->database = $this;
+            $tbl->dbname = $this->dbname;
+            $tbl->dblink = $this->dblink;
+            $tbl->schema = $this->schema;
+        }
+    }
+
+    /**
+     * Returns Connection being used.
+     * @return Connection
+     */
+    public function getConnection()
+    {
+        return $this->conn;
+    }
+
+    /**
+     * Get the TableInfo object for specified table name.
+     * @param string $name The name of the table to retrieve.
+     * @return TableInfo
+     * @throws SQLException - if table does not exist in this db.
+     */
+    public function getTable($name)
+    {
+        if(!$this->tablesLoaded) $this->initTables();
+        if (!isset($this->tables[strtoupper($name)])) {
+            throw new SQLException("Database `".$this->dbname."` has no table `".$name."`");
+        }
+        return $this->tables[ strtoupper($name) ];
+    }
+
+  /**
+   * Return whether database contains specified table.
+   * @param string $name The table name.
+   * @return boolean
+   */
+  public function hasTable($name)
+  {
+    if(!$this->tablesLoaded) $this->initTables();
+    return isset($this->tables[strtoupper($name)]);
+  }
+
+    /**
+     * Gets array of TableInfo objects.
+     * @return array TableInfo[]
+     */
+    public function getTables()
+    {
+        if(!$this->tablesLoaded) $this->initTables();
+        return array_values($this->tables); //re-key [numerically]
+    }
+
+    /**
+     * Adds a table to this db.
+     * Table name is case-insensitive.
+     * @param TableInfo $table
+     */
+    public function addTable(TableInfo $table)
+    {
+        $this->tables[strtoupper($table->getName())] = $table;
+    }
+
+    /**
+     * @return void
+     * @throws SQLException
+     */
+    abstract protected function initTables();
+
+    /**
+     * @return void
+     * @throws SQLException
+     */
+    abstract protected function initSequences();
+
+    /**
+     * @return boolean
+     * @throws SQLException
+     */
+    public function isSequence($key)
+    {
+        if(!$this->seqsLoaded) $this->initSequences();
+        return isset($this->sequences[ strtoupper($key) ]);
+    }
+
+    /**
+     * Gets array of ? objects.
+     * @return array ?[]
+     */
+    public function getSequences()
+    {
+        if(!$this->seqsLoaded) $this->initSequences();
+        return array_values($this->sequences); //re-key [numerically]
+    }
+
+    /**
+     * Get vendor specific optional information for this primary key.
+     * @return array vendorSpecificInfo[]
+     */
+    public function getVendorSpecificInfo()
+    {
+        return $this->vendorSpecificInfo;
+    }
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/DatabaseInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/ForeignKeyInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/ForeignKeyInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/ForeignKeyInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,103 @@
+<?php
+
+/*
+ *  $Id: ForeignKeyInfo.php,v 1.9 2005/08/02 14:42:36 sethr Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * Represents a foreign key.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.9 $
+ * @package   creole.metadata
+ */
+class ForeignKeyInfo {
+
+    private $name;
+    private $references = array();
+
+    /**
+     * Additional and optional vendor specific information.
+     * @var vendorSpecificInfo
+     */
+    protected $vendorSpecificInfo = array();
+
+
+    const NONE       = "";            // No "ON [ DELETE | UPDATE]" behaviour specified.
+    const NOACTION   = "NO ACTION";
+    const CASCADE    = "CASCADE";
+    const RESTRICT   = "RESTRICT";
+    const SETDEFAULT = "SET DEFAULT";
+    const SETNULL    = "SET NULL";
+
+    /**
+     * @param string $name The name of the foreign key.
+     */
+    function __construct($name, $vendorInfo = array())
+    {
+        $this->name = $name;
+        $this->vendorSpecificInfo = $vendorInfo;
+    }
+
+    /**
+     * Get foreign key name.
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Adds a foreign-local mapping.
+     * @param ColumnInfo $local
+     * @param ColumnInfo $foreign
+     */
+    public function addReference(ColumnInfo $local, ColumnInfo $foreign, $onDelete = self::NONE, $onUpdate = self::NONE)
+    {
+        $this->references[] = array($local, $foreign, $onDelete, $onUpdate);
+    }
+
+    /**
+     * Gets the local-foreign column mapping.
+     * @return array array( [0] => array([0] => local ColumnInfo object, [1] => foreign ColumnInfo object, [2] => onDelete, [3] => onUpdate) )
+     */
+    public function getReferences()
+    {
+        return $this->references;
+    }
+
+    /**
+     * Get vendor specific optional information for this primary key.
+     * @return array vendorSpecificInfo[]
+     */
+    public function getVendorSpecificInfo()
+    {
+        return $this->vendorSpecificInfo;
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return $this->name;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/ForeignKeyInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/IndexInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/IndexInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/IndexInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,84 @@
+<?php
+/*
+ *  $Id: IndexInfo.php,v 1.7 2005/02/25 15:47:02 pachanga Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * Represents an index.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.7 $
+ * @package   creole.metadata
+ */
+class IndexInfo {
+
+    /** name of the index */
+    private $name;
+
+    /** columns in this index */
+    private $columns = array();
+
+    /** uniqueness flag */
+    private $isUnique = false;
+
+    /** additional vendor specific information */
+    private $vendorSpecificInfo = array();
+
+    function __construct($name, $isUnique = false, $vendorInfo = array())
+    {
+        $this->name = $name;
+        $this->isUnique = $isUnique;
+        $this->vendorSpecificInfo = $vendorInfo;
+    }
+
+    public function isUnique()
+    {
+        return $this->isUnique;
+    }
+
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Get vendor specific optional information for this index.
+     * @return array vendorSpecificInfo[]
+     */
+    public function getVendorSpecificInfo()
+    {
+        return $this->vendorSpecificInfo;
+    }
+
+    public function addColumn($column)
+    {
+        $this->columns[] = $column;
+    }
+
+    public function getColumns()
+    {
+        return $this->columns;
+    }
+
+    public function toString()
+    {
+        return $this->name;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/IndexInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/PrimaryKeyInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/PrimaryKeyInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/PrimaryKeyInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,91 @@
+<?php
+/*
+ *  $Id: PrimaryKeyInfo.php,v 1.6 2005/02/25 15:47:02 pachanga Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * Represents a PrimaryKey
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.6 $
+ * @package   creole.metadata
+ */
+class PrimaryKeyInfo {
+
+    /** name of the primary key */
+    private $name;
+
+    /** columns in the primary key */
+    private $columns = array();
+
+    /** additional vendor specific information */
+    private $vendorSpecificInfo = array();
+
+    /**
+     * @param string $name The name of the foreign key.
+     */
+    function __construct($name, $vendorInfo = array())
+    {
+        $this->name = $name;
+        $this->vendorSpecificInfo = $vendorInfo;
+    }
+
+    /**
+     * Get foreign key name.
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * @param Column $column
+     * @return void
+     */
+    public function addColumn($column)
+    {
+        $this->columns[] = $column;
+    }
+
+    /**
+     * @return array Column[]
+     */
+    public function getColumns()
+    {
+        return $this->columns;
+    }
+
+    /**
+     * Get vendor specific optional information for this primary key.
+     * @return array vendorSpecificInfo[]
+     */
+    public function getVendorSpecificInfo()
+    {
+        return $this->vendorSpecificInfo;
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return $this->name;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/PrimaryKeyInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/TableInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/TableInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/TableInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,305 @@
+<?php
+
+/*
+ *  $Id: TableInfo.php,v 1.16 2005/10/17 19:05:10 dlawson_mi Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * Represents a table.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.16 $
+ * @package   creole.metadata
+ */
+abstract class TableInfo {
+
+    protected $name;
+    protected $columns = array();
+    protected $foreignKeys = array();
+    protected $indexes = array();
+    protected $primaryKey;
+
+    protected $pkLoaded = false;
+    protected $fksLoaded = false;
+    protected $indexesLoaded = false;
+    protected $colsLoaded = false;
+    protected $vendorLoaded = false;
+
+    /**
+     * Additional and optional vendor specific information.
+     * @var vendorSpecificInfo
+     */
+    protected $vendorSpecificInfo = array();
+
+    /**
+     * Database Connection.
+     * @var Connection
+     */
+    protected $conn;
+
+    /**
+     * The parent DatabaseInfo object.
+     * @var DatabaseInfo
+     */
+    protected $database;
+
+    /** Shortcut to db resource link id (needed by drivers for queries). */
+    protected $dblink;
+
+    /** Shortcut to db name (needed by many drivers for queries). */
+    protected $dbname;
+
+    /**
+     * @param string $table The table name.
+     * @param string $database The database name.
+     * @param resource $dblink The db connection resource.
+     */
+    function __construct(DatabaseInfo $database, $name) {
+        $this->database = $database;
+        $this->name = $name;
+        $this->conn = $database->getConnection(); // shortcut because all drivers need this for the queries
+        $this->dblink = $this->conn->getResource();
+        $this->dbname = $database->getName();
+    }
+
+    /**
+     * This "magic" method is invoked upon serialize().
+     * Because the Info class hierarchy is recursive, we must handle
+     * the serialization and unserialization of this object.
+     * @return array The class variables that should be serialized (all must be public!).
+     */
+    function __sleep()
+    {
+        return array('name', 'columns', 'foreignKeys', 'indexes', 'primaryKey');
+    }
+
+    /**
+     * This "magic" method is invoked upon unserialize().
+     * This method re-hydrates the object and restores the recursive hierarchy.
+     */
+    function __wakeup()
+    {
+        // restore chaining
+        foreach($this->columns as $col) {
+            $col->table = $this;
+        }
+    }
+
+    /**
+     * Loads the columns.
+     * @return void
+     */
+    abstract protected function initColumns();
+
+    /**
+     * Loads the primary key information for this table.
+     * @return void
+     */
+    abstract protected function initPrimaryKey();
+
+    /**
+     * Loads the foreign keys for this table.
+     * @return void
+     */
+    abstract protected function initForeignKeys();
+
+    /**
+     * Loads the indexes information for this table.
+     * @return void
+     */
+    abstract protected function initIndexes();
+
+    /**
+     * Loads the vendor specific information for this table.
+     * @return void
+     */
+    //it must be asbtract and be implemented in every vendor specific driver,
+    //however since it's an experimental stuff it has an empty body in order
+    //not to break BC
+    /*abstract*/ protected function initVendorSpecificInfo(){}
+
+    /**
+     * Get parimary key in this table.
+     * @throws Exception - if foreign keys are unsupported by DB.
+     * @return array ForeignKeyInfo[]
+     */
+    public function getPrimaryKey()
+    {
+        if(!$this->pkLoaded) $this->initPrimaryKey();
+        return $this->primaryKey;
+    }
+
+    /**
+     * Get the ColumnInfo object for specified column.
+     * @param string $name The column name.
+     * @return ColumnInfo
+     * @throws SQLException - if column does not exist for this table.
+     */
+    public function getColumn($name)
+    {
+        if(!$this->colsLoaded) $this->initColumns();
+        if (!isset($this->columns[$name])) {
+            throw new SQLException("Table `".$this->name."` has no column `".$name."`");
+        }
+        return $this->columns[$name];
+    }
+
+    /**
+     * Return whether table contains specified column.
+     * @param string $name The column name.
+     * @return boolean
+     */
+    public function hasColumn($name)
+    {
+        if(!$this->colsLoaded) $this->initColumns();
+        return isset($this->columns[$name]);
+    }
+
+    /**
+     * Get array of columns for this table.
+     * @return array ColumnInfo[]
+     */
+    public function getColumns()
+    {
+        if(!$this->colsLoaded) $this->initColumns();
+        return array_values($this->columns); // re-key numerically
+    }
+
+    /**
+     * Get specified fk for this table.
+     * @param string $name The foreign key name to retrieve.
+     * @return ForeignKeyInfo
+     * @throws SQLException - if fkey does not exist for this table.
+     */
+    public function getForeignKey($name)
+    {
+        if(!$this->fksLoaded) $this->initForeignKeys();
+        if (!isset($this->foreignKeys[$name])) {
+            throw new SQLException("Table `".$this->name."` has no foreign key `".$name."`");
+        }
+        return $this->foreignKeys[$name];
+    }
+
+    /**
+     * Get all foreign keys.
+     * @return array ForeignKeyInfo[]
+     */
+    public function getForeignKeys()
+    {
+        if(!$this->fksLoaded) $this->initForeignKeys();
+        return array_values($this->foreignKeys);
+    }
+
+    /**
+     * Gets the IndexInfo object for a specified index.
+     * @param string $name The index name to retrieve.
+     * @return IndexInfo
+     * @throws SQLException - if index does not exist for this table.
+     */
+    public function getIndex($name)
+    {
+        if(!$this->indexesLoaded) $this->initIndexes();
+        if (!isset($this->indexes[$name])) {
+            throw new SQLException("Table `".$this->name."` has no index `".$name."`");
+        }
+        return $this->indexes[$name];
+    }
+
+    /**
+     * Get array of IndexInfo objects for this table.
+     * @return array IndexInfo[]
+     */
+    public function getIndexes()
+    {
+        if(!$this->indexesLoaded) $this->initIndexes();
+        return array_values($this->indexes);
+    }
+
+    /**
+     * Alias for getIndexes() method.
+     * @return array
+     */
+    public function getIndices()
+    {
+        return $this->getIndexes();
+    }
+
+    /**
+     * Get table name.
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return $this->name;
+    }
+
+    /** Have foreign keys been loaded? */
+    public function foreignKeysLoaded()
+    {
+        return $this->fksLoaded;
+    }
+
+    /** Has primary key info been loaded? */
+    public function primaryKeyLoaded()
+    {
+        return $this->pkLoaded;
+    }
+
+    /** Have columns been loaded? */
+    public function columnsLoaded()
+    {
+        return $this->colsLoaded;
+    }
+
+    /** Has index information been loaded? */
+    public function indexesLoaded()
+    {
+        return $this->indexesLoaded;
+    }
+
+    /**
+     * Get vendor specific optional information for this table.
+     * @return array vendorSpecificInfo[]
+     */
+    public function getVendorSpecificInfo()
+    {
+        if(!$this->vendorLoaded) $this->initVendorSpecificInfo();
+        return $this->vendorSpecificInfo;
+    }
+
+    /** Adds a column to this table. */
+    public function addColumn(ColumnInfo $column)
+    {
+        $this->columns[$column->getName()] = $column;
+    }
+
+    /** Get the parent DatabaseInfo object. */
+    public function getDatabase()
+    {
+        return $this->database;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/metadata/TableInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/Blob.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/Blob.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/Blob.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,62 @@
+<?php
+/*
+ *  $Id: Blob.php,v 1.5 2004/03/20 04:16:50 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/util/Lob.php';
+
+/**
+ * A class for handling binary LOBs.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.5 $
+ * @package   creole.util
+ */
+class Blob extends Lob {            
+    
+    /**
+     * Dump the contents of the file using fpassthru().
+     *
+     * @return void
+     * @throws Exception if no file or contents.
+     */
+    function dump()
+    {
+        if (!$this->data) {            
+            // hmmm .. must be a file that needs to read in
+            if ($this->inFile) {
+                $fp = @fopen($this->inFile, "rb");
+                if (!$fp) {
+                    throw new Exception('Unable to open file: '.$this->inFile);
+                }
+                fpassthru($fp);
+                @fclose($fp);
+            } else {
+                throw new Exception('No data to dump');
+            }
+        
+        } else {            
+            echo $this->data;
+        }        
+        
+    }
+    
+    
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/Blob.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/Clob.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/Clob.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/Clob.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,112 @@
+<?php
+/*
+ *  $Id: Clob.php,v 1.6 2004/07/27 23:15:13 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+require_once 'creole/util/Lob.php';
+
+/**
+ * A class for handling character (ASCII) LOBs.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.6 $
+ * @package   creole.util
+ */
+class Clob extends Lob {
+
+    /**
+     * Read LOB data from file.
+     * @param string $file Filename may also be specified here (if not specified using setInputFile()).
+     * @return void
+     * @throws Exception - if no file specified or error on read.
+     * @see setInputFile()
+     */
+    public function readFromFile($file = null)
+    {
+        if ($file !== null) {
+            $this->setInputFile($file);
+        }
+        if (!$this->inFile) {
+            throw Exception('No file specified for read.');
+        }
+        $data = null;
+        $file = fopen($this->inFile, "rt");
+        while (!feof($file)) $data .= fgets($file, 4096);
+        fclose($file);
+        if ($data === false) {
+            throw new Exception('Unable to read from file: '.$this->inFile);
+        }
+        $this->setContents($data);
+    }
+
+
+    /**
+     * Write LOB data to file.
+     * @param string $file Filename may also be specified here (if not set using setOutputFile()).
+     * @throws Exception - if no file specified, no contents to write, or error on write.
+     * @see setOutputFile()
+     */
+    public function writeToFile($file = null)
+    {
+        if ($file !== null) {
+            $this->setOutputFile($file);
+        }
+        if (!$this->outFile) {
+            throw new Exception('No file specified for write');
+        }
+        if ($this->data === null) {
+            throw new Exception('No data to write to file');
+        }
+        $file = fopen($this->inFile, "wt");
+        if (fputs($file, $this->data) === false)
+            throw new Exception('Unable to write to file: '.$this->outFile);
+        fclose($file);
+    }
+
+    /**
+     * Dump the contents of the file using fpassthru().
+     *
+     * @return void
+     * @throws Exception if no file or contents.
+     */
+    function dump()
+    {
+        if (!$this->data) {
+
+            // is there a file name set?
+            if ($this->inFile) {
+                $fp = @fopen($this->inFile, "r");
+                if (!$fp) {
+                    throw new Exception('Unable to open file: '.$this->inFile);
+                }
+                fpassthru($fp);
+                @fclose($fp);
+            } else {
+                throw new Exception('No data to dump');
+            }
+
+        } else {
+            echo $this->data;
+        }
+
+    }
+
+
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/Clob.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/Lob.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/Lob.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/Lob.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,243 @@
+<?php
+/*
+ *  $Id: Lob.php,v 1.10 2004/03/20 04:16:50 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+
+/**
+ * An abstract class for handling LOB (Locator Object) columns.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.10 $
+ * @package   creole.util
+ */
+abstract class Lob {
+
+    /** 
+     * The contents of the Lob.
+     * DO NOT SET DIRECTLY (or you will disrupt the
+     * ability of isModified() to give accurate results).
+     * @var string
+     */
+    protected $data;
+    
+    /** 
+     * File that blob should be written out to.
+     * @var string
+     */
+    protected $outFile;
+    
+    /** 
+     * File that blob should be read in from 
+     * @var string
+     */
+    protected $inFile;
+    
+    /**
+     * This is a 3-state value indicating whether column has been
+     * modified.
+     * Initially it is NULL.  Once first call to setContents() is made
+     * it is FALSE, because this will be initial state of Lob.  Once
+     * a subsequent call to setContents() is made it is TRUE.
+     * @var boolean
+     */
+    private $modified = null;
+    
+    /**
+     * Construct a new Lob.
+     * @param sttring $data The data contents of the Lob.
+     * @see setContents()
+     */
+    public function __construct($data = null)
+    {
+        if ($data !== null) {
+            $this->setContents($data);
+        }
+    }
+    
+    /**
+     * Get the contents of the LOB.
+     * @return string The characters in this LOB.
+     * @throws Exception
+     */
+    public function getContents()
+    {
+        if ($this->data === null && $this->isFromFile()) {
+            $this->readFromFile();
+        }
+        return $this->data;
+    }
+    
+    /**
+     * Set the contents of this LOB.
+     * Sets the modified flag to FALSE if this is the first call
+     * to setContents() for this object.  Sets the bit to TRUE if
+     * this any subsequent call to setContents().
+     * @param string $bytes
+     */
+    public function setContents($data)
+    {
+        $this->data = $data;
+               
+        if ($this->modified === null) {
+             // if modified bit hasn't been set yet,
+            // then it should now be set to FALSE, since
+            // we just did inital population
+            $this->modified = false;
+        } elseif ($this->modified === false) {
+            // if it was already FALSE, then it should
+            // now be set to TRUE, since this is a subsequent
+            // modfiication.
+            $this->modified = true;
+        }
+    }
+        
+    /**
+     * Dump the contents of the file to stdout.
+     * Must be implemented by subclasses so that binary status is handled
+     * correctly. (i.e. ignored for Clob, handled for Blob)
+     * @return void
+     * @throws Exception if no file or contents.
+     */
+    abstract public function dump();
+    
+    /**
+     * Specify the file that we want this LOB read from.
+     * @param string $filePath The location of the file.
+     * @return void
+     */
+    public function setInputFile($filePath)
+    {
+        $this->inFile = $filePath;
+    }    
+
+    /**
+     * Get the file that we want this LOB read from.
+     * @return string The location of the file.
+     */
+    public function getInputFile()
+    {
+        return $this->inFile;
+    }    
+    
+    /**
+     * Specify the file that we want this LOB saved to.
+     * @param string $filePath The location of the file.
+     * @return void
+     */
+    public function setOutputFile($filePath)
+    {
+        $this->outFile = $filePath;        
+    }
+    
+    /**
+     * Get the file that we want this LOB saved to.
+     * @return string $filePath The location of the file.
+     */
+    public function getOutputFile()
+    {
+        return $this->outFile;
+    }
+
+    /**
+     * Returns whether this Lob is loaded from file.
+     * This is useful for bypassing need to read in the contents of the Lob.
+     * @return boolean Whether this LOB is to be read from a file.
+     */
+    public function isFromFile()
+    {
+        return ($this->inFile !== null);
+    }
+    
+    /**
+     * Read LOB data from file (binary safe).
+     * (Implementation may need to be moved into Clob / Blob subclasses, but 
+     * since file_get_contents() is binary-safe, it hasn't been necessary so far.)
+     * @param string $file Filename may also be specified here (if not specified using setInputFile()).
+     * @return void
+     * @throws Exception - if no file specified or error on read.
+     * @see setInputFile()
+     */
+    public function readFromFile($file = null)
+    {
+        if ($file !== null) {
+            $this->setInputFile($file);
+        }
+        if (!$this->inFile) {
+            throw Exception('No file specified for read.');
+        }        
+        $data = @file_get_contents($this->inFile);
+        if ($data === false) {
+            throw new Exception('Unable to read from file: '.$this->inFile);
+        }        
+        $this->setContents($data);                
+    }
+    
+    
+    /**
+     * Write LOB data to file (binary safe).
+     * (Impl may need to move into subclasses, but so far not necessary.)
+     * @param string $file Filename may also be specified here (if not set using setOutputFile()).
+     * @throws Exception - if no file specified, no contents to write, or error on write.
+     * @see setOutputFile()
+     */
+    public function writeToFile($file = null)
+    {
+        if ($file !== null) {
+            $this->setOutputFile($file);
+        }        
+        if (!$this->outFile) {
+            throw new Exception('No file specified for write');
+        }
+        if ($this->data === null) {
+            throw new Exception('No data to write to file');
+        }        
+        if (false === @file_put_contents($this->outFile, $this->data)) {
+            throw new Exception('Unable to write to file: '.$this->outFile);
+        }
+    }
+    
+    /**
+     * Convenience method to get contents of LOB as string.
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getContents();
+    }
+    
+    /**
+     * Set whether LOB contents have been modified after initial setting.
+     * @param boolean $b
+     */
+    public function setModified($b)
+    {
+        $this->modified = $b;
+    }
+    
+    /**
+     * Whether LOB contents have been modified after initial setting.
+     * @return boolean TRUE if the contents have been modified after initial setting. 
+     *                  FALSE if contents have not been modified or if no contents have bene set.
+     */
+    public function isModified()
+    {
+        // cast it so that NULL will also eval to false
+        return (boolean) $this->modified;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/Lob.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/sql/SQLStatementExtractor.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/sql/SQLStatementExtractor.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/sql/SQLStatementExtractor.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,164 @@
+<?php
+/*
+ *  $Id: SQLStatementExtractor.php,v 1.5 2004/07/27 23:13:46 hlellelid Exp $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://creole.phpdb.org>.
+ */
+ 
+/**
+ * Static class for extracting SQL statements from a string or file.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.5 $
+ * @package   creole.util.sql
+ */
+class SQLStatementExtractor {
+    
+    protected static $delimiter = ';';
+    
+    /**
+     * Get SQL statements from file.
+     * 
+     * @param string $filename Path to file to read.
+     * @return array SQL statements
+     */
+    public static function extractFile($filename) {
+        $buffer = file_get_contents($filename);
+        if ($buffer === false) {
+           throw new Exception("Unable to read file: " . $filename);
+        }
+        return self::extractStatements(self::getLines($buffer));
+    }
+    
+    /**
+     * Extract statements from string.
+     * 
+     * @param string $txt
+     * @return array
+     */
+    public static function extract($buffer) {
+        return self::extractStatements(self::getLines($buffer));
+    }
+    
+    /**
+     * Extract SQL statements from array of lines.
+     *
+     * @param array $lines Lines of the read-in file.
+     * @return string
+     */
+    protected static function extractStatements($lines) {
+        
+        $statements = array();
+        $sql = "";
+               
+        foreach($lines as $line) {
+        
+                $line = trim($line);
+                
+                if (self::startsWith("//", $line) || 
+                    self::startsWith("--", $line) ||
+                    self::startsWith("#", $line)) {
+                    continue;
+                }
+                
+                if (strlen($line) > 4 && strtoupper(substr($line,0, 4)) == "REM ") {
+                    continue;
+                }
+
+                $sql .= " " . $line;
+                $sql = trim($sql);
+
+                // SQL defines "--" as a comment to EOL
+                // and in Oracle it may contain a hint
+                // so we cannot just remove it, instead we must end it
+                if (strpos($line, "--") !== false) {
+                    $sql .= "\n";
+                }
+    
+                if (self::endsWith(self::$delimiter, $sql)) {
+                    $statements[] = self::substring($sql, 0, strlen($sql)-1 - strlen(self::$delimiter));
+                    $sql = "";
+                }
+            }
+        return $statements;           
+    }
+    
+    //
+    // Some string helper methods
+    // 
+    
+    /**
+     * Tests if a string starts with a given string.
+     * @param string $check The substring to check.
+     * @param string $string The string to check in (haystack).
+     * @return boolean True if $string starts with $check, or they are equal, or $check is empty.
+     */
+    protected static function startsWith($check, $string) {
+        if ($check === "" || $check === $string) {
+            return true;
+        } else {
+            return (strpos($string, $check) === 0) ? true : false;
+        }
+    }
+    
+    /**
+     * Tests if a string ends with a given string.
+     * @param string $check The substring to check.
+     * @param string $string The string to check in (haystack).
+     * @return boolean True if $string ends with $check, or they are equal, or $check is empty.
+     */
+    protected static function endsWith($check, $string) {
+        if ($check === "" || $check === $string) {
+            return true;
+        } else {
+            return (strpos(strrev($string), strrev($check)) === 0) ? true : false;
+        }
+    } 
+
+    /**
+     * a natural way of getting a subtring, php's circular string buffer and strange
+     * return values suck if you want to program strict as of C or friends 
+     */
+    protected static function substring($string, $startpos, $endpos = -1) {
+        $len    = strlen($string);
+        $endpos = (int) (($endpos === -1) ? $len-1 : $endpos);
+        if ($startpos > $len-1 || $startpos < 0) {
+            trigger_error("substring(), Startindex out of bounds must be 0<n<$len", E_USER_ERROR);
+        }
+        if ($endpos > $len-1 || $endpos < $startpos) {
+            trigger_error("substring(), Endindex out of bounds must be $startpos<n<".($len-1), E_USER_ERROR);
+        }
+        if ($startpos === $endpos) {
+            return (string) $string{$startpos};
+        } else {
+            $len = $endpos-$startpos;
+        }
+        return substr($string, $startpos, $len+1);
+    }
+    
+    /**
+     * Convert string buffer into array of lines.
+     * 
+     * @param string $filename
+     * @return array string[] lines of file.
+     */
+    protected static function getLines($buffer) {       
+       $lines = preg_split("/\r?\n|\r/", $buffer);
+       return $lines;
+    }
+    
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/creole/util/sql/SQLStatementExtractor.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/lime/lime.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/lime/lime.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/lime/lime.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,933 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Unit test library.
+ *
+ * @package    lime
+ * @author     Fabien Potencier <fabien.potencier en gmail.com>
+ * @version    SVN: $Id: lime.php 3298 2007-01-17 06:08:15Z fabien $
+ */
+
+class lime_test
+{
+  public $plan = null;
+  public $test_nb = 0;
+  public $failed = 0;
+  public $passed = 0;
+  public $skipped = 0;
+  public $output = null;
+
+  function __construct($plan = null, $output_instance = null)
+  {
+    $this->plan = $plan;
+    $this->output = $output_instance ? $output_instance : new lime_output();
+
+    null !== $this->plan and $this->output->echoln(sprintf("1..%d", $this->plan));
+  }
+
+  function __destruct()
+  {
+    $total = $this->passed + $this->failed + $this->skipped;
+
+    null === $this->plan and $this->plan = $total and $this->output->echoln(sprintf("1..%d", $this->plan));
+
+    if ($total > $this->plan)
+    {
+      $this->output->diag(sprintf("Looks like you planned %d tests but ran %d extra.", $this->plan, $total - $this->plan));
+    }
+    elseif ($total < $this->plan)
+    {
+      $this->output->diag(sprintf("Looks like you planned %d tests but only ran %d.", $this->plan, $total));
+    }
+
+    if ($this->failed)
+    {
+      $this->output->diag(sprintf("Looks like you failed %d tests of %d.", $this->failed, $this->plan));
+    }
+
+    flush();
+  }
+
+  function ok($exp, $message = '')
+  {
+    if ($result = (boolean) $exp)
+    {
+      ++$this->passed;
+    }
+    else
+    {
+      ++$this->failed;
+    }
+    $this->output->echoln(sprintf("%s %d%s", $result ? 'ok' : 'not ok', ++$this->test_nb, $message = $message ? sprintf('%s %s', 0 === strpos($message, '#') ? '' : ' -', $message) : ''));
+
+    if (!$result)
+    {
+      $traces = debug_backtrace();
+      if ($_SERVER['PHP_SELF'])
+      {
+        $i = strstr($traces[0]['file'], $_SERVER['PHP_SELF']) ? 0 : 1;
+      }
+      else
+      {
+        $i = 0;
+      }
+      $this->output->diag(sprintf('    Failed test (%s at line %d)', str_replace(getcwd(), '.', $traces[$i]['file']), $traces[$i]['line']));
+    }
+
+    return $result;
+  }
+
+  function is($exp1, $exp2, $message = '')
+  {
+    if (is_object($exp1) || is_object($exp2))
+    {
+      $value = $exp1 === $exp2;
+    }
+    else
+    {
+      $value = $exp1 == $exp2;
+    }
+
+    if (!$result = $this->ok($value, $message))
+    {
+      $this->output->diag(sprintf("           got: %s", str_replace("\n", '', var_export($exp1, true))), sprintf("      expected: %s", str_replace("\n", '', var_export($exp2, true))));
+    }
+
+    return $result;
+  }
+
+  function isnt($exp1, $exp2, $message = '')
+  {
+    if (!$result = $this->ok($exp1 != $exp2, $message))
+    {
+      $this->output->diag(sprintf("      %s", str_replace("\n", '', var_export($exp1, true))), '          ne', sprintf("      %s", str_replace("\n", '', var_export($exp2, true))));
+    }
+
+    return $result;
+  }
+
+  function like($exp, $regex, $message = '')
+  {
+    if (!$result = $this->ok(preg_match($regex, $exp), $message))
+    {
+      $this->output->diag(sprintf("                    '%s'", $exp), sprintf("      doesn't match '%s'", $regex));
+    }
+
+    return $result;
+  }
+
+  function unlike($exp, $regex, $message = '')
+  {
+    if (!$result = $this->ok(!preg_match($regex, $exp), $message))
+    {
+      $this->output->diag(sprintf("               '%s'", $exp), sprintf("      matches '%s'", $regex));
+    }
+
+    return $result;
+  }
+
+  function cmp_ok($exp1, $op, $exp2, $message = '')
+  {
+    eval(sprintf("\$result = \$exp1 $op \$exp2;"));
+    if (!$this->ok($result, $message))
+    {
+      $this->output->diag(sprintf("      %s", str_replace("\n", '', var_export($exp1, true))), sprintf("          %s", $op), sprintf("      %s", str_replace("\n", '', var_export($exp2, true))));
+    }
+
+    return $result;
+  }
+
+  function can_ok($object, $methods, $message = '')
+  {
+    $result = true;
+    $failed_messages = array();
+    foreach ((array) $methods as $method)
+    {
+      if (!method_exists($object, $method))
+      {
+        $failed_messages[] = sprintf("      method '%s' does not exist", $method);
+        $result = false;
+      }
+    }
+
+    !$this->ok($result, $message);
+
+    !$result and $this->output->diag($failed_messages);
+
+    return $result;
+  }
+
+  function isa_ok($var, $class, $message = '')
+  {
+    $type = is_object($var) ? get_class($var) : gettype($var);
+    if (!$result = $this->ok($type == $class, $message))
+    {
+      $this->output->diag(sprintf("      isa_ok isn't a '%s' it's a '%s'", $class, $type));
+    }
+
+    return $result;
+  }
+
+  function is_deeply($exp1, $exp2, $message = '')
+  {
+    if (!$result = $this->ok($this->test_is_deeply($exp1, $exp2), $message))
+    {
+      $this->output->diag(sprintf("           got: %s", str_replace("\n", '', var_export($exp1, true))), sprintf("      expected: %s", str_replace("\n", '', var_export($exp2, true))));
+    }
+
+    return $result;
+  }
+
+  function pass($message = '')
+  {
+    return $this->ok(true, $message);
+  }
+
+  function fail($message = '')
+  {
+    return $this->ok(false, $message);
+  }
+
+  function diag($message)
+  {
+    $this->output->diag($message);
+  }
+
+  function skip($message = '', $nb_tests = 1)
+  {
+    for ($i = 0; $i < $nb_tests; $i++)
+    {
+      ++$this->skipped and --$this->passed;
+      $this->pass(sprintf("# SKIP%s", $message ? ' '.$message : ''));
+    }
+  }
+
+  function todo($message = '')
+  {
+    ++$this->skipped and --$this->passed;
+    $this->pass(sprintf("# TODO%s", $message ? ' '.$message : ''));
+  }
+
+  function include_ok($file, $message = '')
+  {
+    if (!$result = $this->ok((@include($file)) == 1, $message))
+    {
+      $this->output->diag(sprintf("      Tried to include '%s'", $file));
+    }
+
+    return $result;
+  }
+
+  private function test_is_deeply($var1, $var2)
+  {
+    if (gettype($var1) != gettype($var2))
+    {
+      return false;
+    }
+
+    if (is_array($var1))
+    {
+      ksort($var1);
+      ksort($var2);
+      if (array_diff(array_keys($var1), array_keys($var2)))
+      {
+        return false;
+      }
+      $is_equal = true;
+      foreach ($var1 as $key => $value)
+      {
+        $is_equal = $this->test_is_deeply($var1[$key], $var2[$key]);
+        if ($is_equal === false)
+        {
+          break;
+        }
+      }
+
+      return $is_equal;
+    }
+    else
+    {
+      return $var1 === $var2;
+    }
+  }
+
+  function comment($message)
+  {
+    $this->output->comment($message);
+  }
+
+  static function get_temp_directory()
+  {
+    if ('\\' == DIRECTORY_SEPARATOR)
+    {
+      foreach (array('TEMP', 'TMP', 'windir') as $dir)
+      {
+        if ($var = isset($_ENV[$dir]) ? $_ENV[$dir] : getenv($dir))
+        {
+          return $var;
+        }
+      }
+
+      return getenv('SystemRoot').'\temp';
+    }
+
+    if ($var = isset($_ENV['TMPDIR']) ? $_ENV['TMPDIR'] : getenv('TMPDIR'))
+    {
+      return $var;
+    }
+
+    return '/tmp';
+  }
+}
+
+class lime_output
+{
+  function diag()
+  {
+    $messages = func_get_args();
+    foreach ($messages as $message)
+    {
+      array_map(array($this, 'comment'), (array) $message);
+    }
+  }
+
+  function comment($message)
+  {
+    echo "# $message\n";
+  }
+
+  function echoln($message)
+  {
+    echo "$message\n";
+  }
+}
+
+class lime_output_color extends lime_output
+{
+  public $colorizer = null;
+
+  function __construct()
+  {
+    $this->colorizer = new lime_colorizer();
+  }
+
+  function diag()
+  {
+    $messages = func_get_args();
+    foreach ($messages as $message)
+    {
+      echo $this->colorizer->colorize('# '.join("\n# ", (array) $message), 'COMMENT')."\n";
+    }
+  }
+
+  function comment($message)
+  {
+    echo $this->colorizer->colorize(sprintf('# %s', $message), 'COMMENT')."\n";
+  }
+
+  function echoln($message, $colorizer_parameter = null)
+  {
+    $message = preg_replace('/(?:^|\.)((?:not ok|dubious) *\d*)\b/e', '$this->colorizer->colorize(\'$1\', \'ERROR\')', $message);
+    $message = preg_replace('/(?:^|\.)(ok *\d*)\b/e', '$this->colorizer->colorize(\'$1\', \'INFO\')', $message);
+    $message = preg_replace('/"(.+?)"/e', '$this->colorizer->colorize(\'$1\', \'PARAMETER\')', $message);
+    $message = preg_replace('/(\->|\:\:)?([a-zA-Z0-9_]+?)\(\)/e', '$this->colorizer->colorize(\'$1$2()\', \'PARAMETER\')', $message);
+
+    echo ($colorizer_parameter ? $this->colorizer->colorize($message, $colorizer_parameter) : $message)."\n";
+  }
+}
+
+class lime_colorizer
+{
+  static public $styles = array();
+
+  static function style($name, $options = array())
+  {
+    self::$styles[$name] = $options;
+  }
+
+  static function colorize($text = '', $parameters = array())
+  {
+    // disable colors if not supported (windows or non tty console)
+    if (DIRECTORY_SEPARATOR == '\\' || !function_exists('posix_isatty') || !@posix_isatty(STDOUT))
+    {
+      return $text;
+    }
+
+    static $options    = array('bold' => 1, 'underscore' => 4, 'blink' => 5, 'reverse' => 7, 'conceal' => 8);
+    static $foreground = array('black' => 30, 'red' => 31, 'green' => 32, 'yellow' => 33, 'blue' => 34, 'magenta' => 35, 'cyan' => 36, 'white' => 37);
+    static $background = array('black' => 40, 'red' => 41, 'green' => 42, 'yellow' => 43, 'blue' => 44, 'magenta' => 45, 'cyan' => 46, 'white' => 47);
+
+    !is_array($parameters) && isset(self::$styles[$parameters]) and $parameters = self::$styles[$parameters];
+
+    $codes = array();
+    isset($parameters['fg']) and $codes[] = $foreground[$parameters['fg']];
+    isset($parameters['bg']) and $codes[] = $background[$parameters['bg']];
+    foreach ($options as $option => $value)
+    {
+      isset($parameters[$option]) && $parameters[$option] and $codes[] = $value;
+    }
+
+    return "\033[".implode(';', $codes).'m'.$text."\033[0m";
+  }
+}
+
+lime_colorizer::style('ERROR', array('bg' => 'red', 'fg' => 'white', 'bold' => true));
+lime_colorizer::style('INFO',  array('fg' => 'green', 'bold' => true));
+lime_colorizer::style('PARAMETER', array('fg' => 'cyan'));
+lime_colorizer::style('COMMENT',  array('fg' => 'yellow'));
+
+class lime_harness extends lime_registration
+{
+  public $php_cli = '';
+  public $stats = array();
+  public $output = null;
+
+  function __construct($output_instance, $php_cli = null)
+  {
+    $this->php_cli = null === $php_cli ? PHP_BINDIR.DIRECTORY_SEPARATOR.'php' : $php_cli;
+    if (!is_executable($this->php_cli))
+    {
+      $this->php_cli = $this->find_php_cli();
+    }
+
+    $this->output = $output_instance ? $output_instance : new lime_output();
+  }
+
+  protected function find_php_cli()
+  {
+    $path = getenv('PATH') ? getenv('PATH') : getenv('Path');
+    $exe_suffixes = DIRECTORY_SEPARATOR == '\\' ? (getenv('PATHEXT') ? explode(PATH_SEPARATOR, getenv('PATHEXT')) : array('.exe', '.bat', '.cmd', '.com')) : array('');
+    foreach (array('php5', 'php') as $php_cli)
+    {
+      foreach ($exe_suffixes as $suffix)
+      {
+        foreach (explode(PATH_SEPARATOR, $path) as $dir)
+        {
+          $file = $dir.DIRECTORY_SEPARATOR.$php_cli.$suffix;
+          if (is_executable($file))
+          {
+            return $file;
+          }
+        }
+      }
+    }
+
+    throw new Exception("Unable to find PHP executable.");
+  }
+
+  function run()
+  {
+    if (!count($this->files))
+    {
+      throw new Exception('You must register some test files before running them!');
+    }
+
+    // sort the files to be able to predict the order
+    sort($this->files);
+
+    $this->stats =array(
+      '_failed_files' => array(),
+      '_failed_tests' => 0,
+      '_nb_tests'     => 0,
+    );
+
+    foreach ($this->files as $file)
+    {
+      $this->stats[$file] = array(
+        'plan'     =>   null,
+        'nb_tests' => 0,
+        'failed'   => array(),
+        'passed'   => array(),
+      );
+      $this->current_file = $file;
+      $this->current_test = 0;
+      $relative_file = $this->get_relative_file($file);
+
+      ob_start(array($this, 'process_test_output'));
+      passthru(sprintf('%s -d html_errors=off -d open_basedir= -q "%s" 2>&1', $this->php_cli, $file), $return);
+      ob_end_clean();
+
+      if ($return > 0)
+      {
+        $this->stats[$file]['status'] = 'dubious';
+        $this->stats[$file]['status_code'] = $return;
+      }
+      else
+      {
+        $delta = $this->stats[$file]['plan'] - $this->stats[$file]['nb_tests'];
+        if ($delta > 0)
+        {
+          $this->output->echoln(sprintf('%s%s%s', substr($relative_file, -67), str_repeat('.', 70 - min(67, strlen($relative_file))), $this->output->colorizer->colorize(sprintf('# Looks like you planned %d tests but only ran %d.', $this->stats[$file]['plan'], $this->stats[$file]['nb_tests']), 'COMMENT')));
+          $this->stats[$file]['status'] = 'dubious';
+          $this->stats[$file]['status_code'] = 255;
+          $this->stats['_nb_tests'] += $delta;
+          for ($i = 1; $i <= $delta; $i++)
+          {
+            $this->stats[$file]['failed'][] = $this->stats[$file]['nb_tests'] + $i;
+          }
+        }
+        else if ($delta < 0)
+        {
+          $this->output->echoln(sprintf('%s%s%s', substr($relative_file, -67), str_repeat('.', 70 - min(67, strlen($relative_file))), $this->output->colorizer->colorize(sprintf('# Looks like you planned %s test but ran %s extra.', $this->stats[$file]['plan'], $this->stats[$file]['nb_tests'] - $this->stats[$file]['plan']), 'COMMENT')));
+          $this->stats[$file]['status'] = 'dubious';
+          $this->stats[$file]['status_code'] = 255;
+          for ($i = 1; $i <= -$delta; $i++)
+          {
+            $this->stats[$file]['failed'][] = $this->stats[$file]['plan'] + $i;
+          }
+        }
+        else
+        {
+          $this->stats[$file]['status_code'] = 0;
+          $this->stats[$file]['status'] = $this->stats[$file]['failed'] ? 'not ok' : 'ok';
+        }
+      }
+
+      $this->output->echoln(sprintf('%s%s%s', substr($relative_file, -67), str_repeat('.', 70 - min(67, strlen($relative_file))), $this->stats[$file]['status']));
+      if (($nb = count($this->stats[$file]['failed'])) || $return > 0)
+      {
+        if ($nb)
+        {
+          $this->output->echoln(sprintf("    Failed tests: %s", implode(', ', $this->stats[$file]['failed'])));
+        }
+        $this->stats['_failed_files'][] = $file;
+        $this->stats['_failed_tests']  += $nb;
+      }
+
+      if ('dubious' == $this->stats[$file]['status'])
+      {
+        $this->output->echoln(sprintf('    Test returned status %s', $this->stats[$file]['status_code']));
+      }
+    }
+
+    if (count($this->stats['_failed_files']))
+    {
+      $format = "%-30s  %4s  %5s  %5s  %s";
+      $this->output->echoln(sprintf($format, 'Failed Test', 'Stat', 'Total', 'Fail', 'List of Failed'));
+      $this->output->echoln("------------------------------------------------------------------");
+      foreach ($this->stats as $file => $file_stat)
+      {
+        if (!in_array($file, $this->stats['_failed_files'])) continue;
+
+        $this->output->echoln(sprintf($format, substr($this->get_relative_file($file), -30), $file_stat['status_code'], count($file_stat['failed']) + count($file_stat['passed']), count($file_stat['failed']), implode(' ', $file_stat['failed'])));
+      }
+
+      $this->output->echoln(sprintf('Failed %d/%d test scripts, %.2f%% okay. %d/%d subtests failed, %.2f%% okay.',
+        $nb_failed_files = count($this->stats['_failed_files']),
+        $nb_files = count($this->files),
+        ($nb_files - $nb_failed_files) * 100 / $nb_files,
+        $nb_failed_tests = $this->stats['_failed_tests'],
+        $nb_tests = $this->stats['_nb_tests'],
+        $nb_tests > 0 ? ($nb_tests - $nb_failed_tests) * 100 / $nb_tests : 0
+      ), 'ERROR');
+    }
+    else
+    {
+      $this->output->echoln('All tests successful.', 'INFO');
+      $this->output->echoln(sprintf('Files=%d, Tests=%d', count($this->files), $this->stats['_nb_tests']), 'INFO');
+    }
+
+    return $this->stats['_failed_tests'] ? false : true;
+  }
+
+  private function process_test_output($lines)
+  {
+    foreach (explode("\n", $lines) as $text)
+    {
+      if (false !== strpos($text, 'not ok '))
+      {
+        ++$this->current_test;
+        $test_number = (int) substr($text, 7);
+        $this->stats[$this->current_file]['failed'][] = $test_number;
+
+        ++$this->stats[$this->current_file]['nb_tests'];
+        ++$this->stats['_nb_tests'];
+      }
+      else if (false !== strpos($text, 'ok '))
+      {
+        ++$this->stats[$this->current_file]['nb_tests'];
+        ++$this->stats['_nb_tests'];
+      }
+      else if (preg_match('/^1\.\.(\d+)/', $text, $match))
+      {
+        $this->stats[$this->current_file]['plan'] = $match[1];
+      }
+    }
+
+    return;
+  }
+}
+
+class lime_coverage extends lime_registration
+{
+  public $files = array();
+  public $extension = '.php';
+  public $base_dir = '';
+  public $harness = null;
+  public $verbose = false;
+
+  function __construct($harness)
+  {
+    $this->harness = $harness;
+  }
+
+  function run()
+  {
+    if (!function_exists('xdebug_start_code_coverage'))
+    {
+      throw new Exception('You must install and enable xdebug before using lime coverage.');
+    }
+
+    if (!count($this->harness->files))
+    {
+      throw new Exception('You must register some test files before running coverage!');
+    }
+
+    if (!count($this->files))
+    {
+      throw new Exception('You must register some files to cover!');
+    }
+
+    $coverage = array();
+    $tmp_file = lime_test::get_temp_directory().DIRECTORY_SEPARATOR.'test.php';
+    foreach ($this->harness->files as $file)
+    {
+      $tmp = <<<EOF
+<?php
+xdebug_start_code_coverage();
+ob_start();
+include('$file');
+ob_end_clean();
+echo '<PHP_SER>'.serialize(xdebug_get_code_coverage()).'</PHP_SER>';
+EOF;
+      file_put_contents($tmp_file, $tmp);
+      ob_start();
+      passthru(sprintf('%s -d html_errors=off -d open_basedir= -q "%s" 2>&1', $this->harness->php_cli, $tmp_file), $return);
+      $retval = ob_get_clean();
+      if (0 == $return)
+      {
+        if (false === $cov = unserialize(substr($retval, strpos($retval, '<PHP_SER>') + 9, strpos($retval, '</PHP_SER>') - 9)))
+        {
+          throw new Exception(sprintf('Unable to unserialize coverage for file "%s"', $file));
+        }
+
+        foreach ($cov as $file => $lines)
+        {
+          if (!isset($coverage[$file]))
+          {
+            $coverage[$file] = array();
+          }
+
+          foreach ($lines as $line => $count)
+          {
+            if (!isset($coverage[$file][$line]))
+            {
+              $coverage[$file][$line] = 0;
+            }
+            $coverage[$file][$line] = $coverage[$file][$line] + $count;
+          }
+        }
+      }
+    }
+    unlink($tmp_file);
+
+    ksort($coverage);
+    $total_php_lines = 0;
+    $total_covered_lines = 0;
+    foreach ($this->files as $file)
+    {
+      $cov = isset($coverage[$file]) ? $coverage[$file] : array();
+
+      list($cov, $php_lines) = $this->compute(file_get_contents($file), $cov);
+
+      $output = $this->harness->output;
+      $percent = count($php_lines) ? count($cov) * 100 / count($php_lines) : 100;
+
+      $total_php_lines += count($php_lines);
+      $total_covered_lines += count($cov);
+
+      $output->echoln(sprintf("%-70s %3.0f%%", substr($this->get_relative_file($file), -70), $percent), $percent == 100 ? 'INFO' : ($percent > 90 ? 'PARAMETER' : ($percent < 20 ? 'ERROR' : '')));
+      if ($this->verbose && $percent != 100)
+      {
+        $output->comment(sprintf("missing: %s", $this->format_range(array_keys(array_diff_key($php_lines, $cov)))));
+      }
+    }
+
+    $output->echoln(sprintf("TOTAL COVERAGE: %3.0f%%", $total_covered_lines * 100 / $total_php_lines));
+  }
+
+  static function get_php_lines($content)
+  {
+    if (is_file($content))
+    {
+      $content = file_get_contents($content);
+    }
+
+    $tokens = token_get_all($content);
+    $php_lines = array();
+    $current_line = 1;
+    $in_class = false;
+    $in_function = false;
+    $in_function_declaration = false;
+    $end_of_current_expr = true;
+    $open_braces = 0;
+    foreach ($tokens as $token)
+    {
+      if (is_string($token))
+      {
+        switch ($token)
+        {
+          case '=':
+            if (false === $in_class || (false !== $in_function && !$in_function_declaration))
+            {
+              $php_lines[$current_line] = true;
+            }
+            break;
+          case '{':
+            ++$open_braces;
+            $in_function_declaration = false;
+            break;
+          case ';':
+            $in_function_declaration = false;
+            $end_of_current_expr = true;
+            break;
+          case '}':
+            $end_of_current_expr = true;
+            --$open_braces;
+            if ($open_braces == $in_class)
+            {
+              $in_class = false;
+            }
+            if ($open_braces == $in_function)
+            {
+              $in_function = false;
+            }
+            break;
+        }
+
+        continue;
+      }
+
+      list($id, $text) = $token;
+
+      switch ($id)
+      {
+        case T_CURLY_OPEN:
+        case T_DOLLAR_OPEN_CURLY_BRACES:
+          ++$open_braces;
+          break;
+        case T_WHITESPACE:
+        case T_OPEN_TAG:
+        case T_CLOSE_TAG:
+          $end_of_current_expr = true;
+          $current_line += count(explode("\n", $text)) - 1;
+          break;
+        case T_COMMENT:
+        case T_DOC_COMMENT:
+          $current_line += count(explode("\n", $text)) - 1;
+          break;
+        case T_CLASS:
+          $in_class = $open_braces;
+          break;
+        case T_FUNCTION:
+          $in_function = $open_braces;
+          $in_function_declaration = true;
+          break;
+        case T_AND_EQUAL:
+        case T_CASE:
+        case T_CATCH:
+        case T_CLONE:
+        case T_CONCAT_EQUAL:
+        case T_CONTINUE:
+        case T_DEC:
+        case T_DECLARE:
+        case T_DEFAULT:
+        case T_DIV_EQUAL:
+        case T_DO:
+        case T_ECHO:
+        case T_ELSEIF:
+        case T_EMPTY:
+        case T_ENDDECLARE:
+        case T_ENDFOR:
+        case T_ENDFOREACH:
+        case T_ENDIF:
+        case T_ENDSWITCH:
+        case T_ENDWHILE:
+        case T_EVAL:
+        case T_EXIT:
+        case T_FOR:
+        case T_FOREACH:
+        case T_GLOBAL:
+        case T_IF:
+        case T_INC:
+        case T_INCLUDE:
+        case T_INCLUDE_ONCE:
+        case T_INSTANCEOF:
+        case T_ISSET:
+        case T_IS_EQUAL:
+        case T_IS_GREATER_OR_EQUAL:
+        case T_IS_IDENTICAL:
+        case T_IS_NOT_EQUAL:
+        case T_IS_NOT_IDENTICAL:
+        case T_IS_SMALLER_OR_EQUAL:
+        case T_LIST:
+        case T_LOGICAL_AND:
+        case T_LOGICAL_OR:
+        case T_LOGICAL_XOR:
+        case T_MINUS_EQUAL:
+        case T_MOD_EQUAL:
+        case T_MUL_EQUAL:
+        case T_NEW:
+        case T_OBJECT_OPERATOR:
+        case T_OR_EQUAL:
+        case T_PLUS_EQUAL:
+        case T_PRINT:
+        case T_REQUIRE:
+        case T_REQUIRE_ONCE:
+        case T_RETURN:
+        case T_SL:
+        case T_SL_EQUAL:
+        case T_SR:
+        case T_SR_EQUAL:
+        case T_THROW:
+        case T_TRY:
+        case T_UNSET:
+        case T_UNSET_CAST:
+        case T_USE:
+        case T_WHILE:
+        case T_XOR_EQUAL:
+          $php_lines[$current_line] = true;
+          $end_of_current_expr = false;
+          break;
+        default:
+          if (false === $end_of_current_expr)
+          {
+            $php_lines[$current_line] = true;
+          }
+          //print "$current_line: ".token_name($id)."\n";
+      }
+    }
+
+    return $php_lines;
+  }
+
+  function compute($content, $cov)
+  {
+    $php_lines = self::get_php_lines($content);
+
+    // we remove from $cov non php lines
+    foreach (array_diff_key($cov, $php_lines) as $line => $tmp)
+    {
+      unset($cov[$line]);
+    }
+
+    return array($cov, $php_lines);
+  }
+
+  function format_range($lines)
+  {
+    sort($lines);
+    $formatted = '';
+    $first = -1;
+    $last = -1;
+    foreach ($lines as $line)
+    {
+      if ($last + 1 != $line)
+      {
+        if ($first != -1)
+        {
+          $formatted .= $first == $last ? "$first " : "[$first - $last] ";
+        }
+        $first = $line;
+        $last = $line;
+      }
+      else
+      {
+        $last = $line;
+      }
+    }
+    if ($first != -1)
+    {
+      $formatted .= $first == $last ? "$first " : "[$first - $last] ";
+    }
+
+    return $formatted;
+  }
+}
+
+class lime_registration
+{
+  public $files = array();
+  public $extension = '.php';
+  public $base_dir = '';
+
+  function register($files_or_directories)
+  {
+    foreach ((array) $files_or_directories as $f_or_d)
+    {
+      if (is_file($f_or_d))
+      {
+        $this->files[] = realpath($f_or_d);
+      }
+      elseif (is_dir($f_or_d))
+      {
+        $this->register_dir($f_or_d);
+      }
+      else
+      {
+        throw new Exception(sprintf('The file or directory "%s" does not exist.', $f_or_d));
+      }
+    }
+  }
+
+  function register_glob($glob)
+  {
+    if ($dirs = glob($glob))
+    {
+      foreach ($dirs as $file)
+      {
+        $this->files[] = realpath($file);
+      }
+    }
+  }
+
+  function register_dir($directory)
+  {
+    if (!is_dir($directory))
+    {
+      throw new Exception(sprintf('The directory "%s" does not exist.', $directory));
+    }
+
+    $files = array();
+
+    $current_dir = opendir($directory);
+    while ($entry = readdir($current_dir))
+    {
+      if ($entry == '.' || $entry == '..') continue;
+
+      if (is_dir($entry))
+      {
+        $this->register_dir($entry);
+      }
+      elseif (preg_match('#'.$this->extension.'$#', $entry))
+      {
+        $files[] = realpath($directory.DIRECTORY_SEPARATOR.$entry);
+      }
+    }
+
+    $this->files = array_merge($this->files, $files);
+  }
+
+  protected function get_relative_file($file)
+  {
+    return str_replace(DIRECTORY_SEPARATOR, '/', str_replace(array(realpath($this->base_dir).DIRECTORY_SEPARATOR, $this->extension), '', $file));
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/lime/lime.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeApp.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeApp.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeApp.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,426 @@
+<?php
+
+/**
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeApp.class.php 2574 2006-10-31 06:44:28Z fabien $
+ */
+
+/**
+ *
+ * main pake class.
+ *
+ * This class is a singleton.
+ *
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeApp.class.php 2574 2006-10-31 06:44:28Z fabien $
+ */
+class pakeApp
+{
+  const VERSION = '1.1.DEV';
+
+  private static $MAX_LINE_SIZE = 65;
+  private static $PROPERTIES = array();
+  private static $PAKEFILES = array('pakefile', 'Pakefile', 'pakefile.php', 'Pakefile.php');
+  private static $PLUGINDIRS = array();
+  private static $OPTIONS = array(
+    array('--dry-run',  '-n', pakeGetopt::NO_ARGUMENT,       "Do a dry run without executing actions."),
+    array('--help',     '-H', pakeGetopt::NO_ARGUMENT,       "Display this help message."),
+    array('--libdir',   '-I', pakeGetopt::REQUIRED_ARGUMENT, "Include LIBDIR in the search path for required modules."),
+    array('--nosearch', '-N', pakeGetopt::NO_ARGUMENT,       "Do not search parent directories for the pakefile."),
+    array('--prereqs',  '-P', pakeGetopt::NO_ARGUMENT,       "Display the tasks and dependencies, then exit."),
+    array('--quiet',    '-q', pakeGetopt::NO_ARGUMENT,       "Do not log messages to standard output."),
+    array('--pakefile', '-f', pakeGetopt::REQUIRED_ARGUMENT, "Use FILE as the pakefile."),
+    array('--require',  '-r', pakeGetopt::REQUIRED_ARGUMENT, "Require MODULE before executing pakefile."),
+    array('--tasks',    '-T', pakeGetopt::NO_ARGUMENT,       "Display the tasks and dependencies, then exit."),
+    array('--trace',    '-t', pakeGetopt::NO_ARGUMENT,       "Turn on invoke/execute tracing, enable full backtrace."),
+    array('--usage',    '-h', pakeGetopt::NO_ARGUMENT,       "Display usage."),
+    array('--verbose',  '-v', pakeGetopt::NO_ARGUMENT,       "Log message to standard output (default)."),
+    array('--version',  '-V', pakeGetopt::NO_ARGUMENT,       "Display the program version."),
+  );
+
+  private $opt = null;
+  private $nosearch = false;
+  private $trace = false;
+  private $verbose = true;
+  private $dryrun = false;
+  private $nowrite = false;
+  private $show_tasks = false;
+  private $show_prereqs = false;
+  private $pakefile = '';
+  private static $instance = null;
+
+  private function __construct()
+  {
+    self::$PLUGINDIRS[] = dirname(__FILE__).'/tasks';
+  }
+
+  public static function get_plugin_dirs()
+  {
+    return self::$PLUGINDIRS;
+  }
+
+  public function get_properties()
+  {
+    return self::$PROPERTIES;
+  }
+
+  public function set_properties($properties)
+  {
+    self::$PROPERTIES = $properties;
+  }
+
+  public static function get_instance()
+  {
+    if (!self::$instance) self::$instance = new pakeApp();
+
+    return self::$instance;
+  }
+
+  public function get_verbose()
+  {
+    return $this->verbose;
+  }
+
+  public function get_trace()
+  {
+    return $this->trace;
+  }
+
+  public function get_dryrun()
+  {
+    return $this->dryrun;
+  }
+
+  public function run($pakefile = null, $options = null, $load_pakefile = true)
+  {
+    if ($pakefile)
+    {
+      pakeApp::$PAKEFILES = array($pakefile);
+    }
+
+    $this->handle_options($options);
+    if ($load_pakefile)
+    {
+      $this->load_pakefile();
+    }
+
+    if ($this->show_tasks)
+    {
+      $this->display_tasks_and_comments();
+    }
+    else if ($this->show_prereqs)
+    {
+      $this->display_prerequisites();
+    }
+    else
+    {
+      $args = $this->opt->get_arguments();
+      $task = array_shift($args);
+
+      $abbrev_options = $this->abbrev(array_keys(pakeTask::get_tasks()));
+      $task = pakeTask::get_full_task_name($task);
+      if (!$task)
+      {
+        $task = 'default';
+      }
+
+      if (!array_key_exists($task, $abbrev_options))
+      {
+        throw new pakeException(sprintf('Task "%s" is not defined.', $task));
+      }
+      else if (count($abbrev_options[$task]) > 1)
+      {
+        throw new pakeException(sprintf('Task "%s" is ambiguous (%s).', $task, implode(', ', $abbrev_options[$task])));
+      }
+      else
+      {
+        return pakeTask::get($abbrev_options[$task][0])->invoke($args);
+      }
+    }
+  }
+
+  // Read and handle the command line options.
+  public function handle_options($options = null)
+  {
+    $this->opt = new pakeGetopt(pakeApp::$OPTIONS);
+    $this->opt->parse($options);
+    foreach ($this->opt->get_options() as $opt => $value)
+    {
+      $this->do_option($opt, $value);
+    }
+  }
+
+  // True if one of the files in RAKEFILES is in the current directory.
+  // If a match is found, it is copied into @pakefile.
+  public function have_pakefile()
+  {
+    foreach (pakeApp::$PAKEFILES as $file)
+    {
+      if (file_exists($file))
+      {
+        $this->pakefile = $file;
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  public function load_pakefile()
+  {
+    $here = getcwd();
+    while (!$this->have_pakefile())
+    {
+      chdir('..');
+      if (getcwd() == $here || $this->nosearch)
+      {
+        throw new pakeException(sprintf('No pakefile found (looking for: %s)', join(', ', pakeApp::$PAKEFILES))."\n");
+      }
+
+      $here = getcwd();
+    }
+
+    require_once($this->pakefile);
+  }
+
+  // Do the option defined by +opt+ and +value+.
+  public function do_option($opt, $value)
+  {
+    switch ($opt)
+    {
+      case 'dry-run':
+        $this->verbose = true;
+        $this->nowrite = true;
+        $this->dryrun = true;
+        $this->trace = true;
+        break;
+      case 'help':
+        $this->help();
+        exit();
+      case 'libdir':
+        set_include_path($value.PATH_SEPARATOR.get_include_path());
+        break;
+      case 'nosearch':
+        $this->nosearch = true;
+        break;
+      case 'prereqs':
+        $this->show_prereqs = true;
+        break;
+      case 'quiet':
+        $this->verbose = false;
+        break;
+      case 'pakefile':
+        pakeApp::$PAKEFILES = array($value);
+        break;
+      case 'require':
+        require $value;
+        break;
+      case 'tasks':
+        $this->show_tasks = true;
+        break;
+      case 'trace':
+        $this->trace = true;
+        $this->verbose = true;
+        break;
+      case 'usage':
+        $this->usage();
+        exit();
+      case 'verbose':
+        $this->verbose = true;
+        break;
+      case 'version':
+        echo sprintf('pake version %s', pakeColor::colorize(pakeApp::VERSION, 'INFO'))."\n";
+        exit();
+      default:
+        throw new pakeException(sprintf("Unknown option: %s", $opt));
+    }
+  }
+
+  // Display the program usage line.
+  public function usage()
+  {
+    echo "pake [-f pakefile] {options} targets...\n".pakeColor::colorize("Try pake -H for more information", 'INFO')."\n";
+  }
+
+  // Display the rake command line help.
+  public function help()
+  {
+    $this->usage();
+    echo "\n";
+    echo "available options:";
+    echo "\n";
+
+    foreach (pakeApp::$OPTIONS as $option)
+    {
+      list($long, $short, $mode, $comment) = $option;
+      if ($mode == pakeGetopt::REQUIRED_ARGUMENT)
+      {
+        if (preg_match('/\b([A-Z]{2,})\b/', $comment, $match))
+          $long .= '='.$match[1];
+      }
+      printf("  %-20s (%s)\n", pakeColor::colorize($long, 'INFO'), pakeColor::colorize($short, 'INFO'));
+      printf("      %s\n", $comment);
+    }
+  }
+
+  // Display the tasks and dependencies.
+  public function display_tasks_and_comments()
+  {
+    $width = 0;
+    $tasks = pakeTask::get_tasks();
+    foreach ($tasks as $name => $task)
+    {
+      $w = strlen(pakeTask::get_mini_task_name($name));
+      if ($w > $width) $width = $w;
+    }
+    $width += strlen(pakeColor::colorize(' ', 'INFO'));
+
+    echo "available pake tasks:\n";
+
+    // display tasks
+    $has_alias = false;
+    ksort($tasks);
+    foreach ($tasks as $name => $task)
+    {
+      if ($task->get_alias())
+      {
+        $has_alias = true;
+      }
+
+      if (!$task->get_alias() && $task->get_comment())
+      {
+        $mini_name = pakeTask::get_mini_task_name($name);
+        printf('  %-'.$width.'s > %s'."\n", pakeColor::colorize($mini_name, 'INFO'), $task->get_comment().($mini_name != $name ? ' ['.$name.']' : ''));
+      }
+    }
+
+    if ($has_alias)
+    {
+      print("\ntask aliases:\n");
+
+      // display aliases
+      foreach ($tasks as $name => $task)
+      {
+        if ($task->get_alias())
+        {
+          $mini_name = pakeTask::get_mini_task_name($name);
+          printf('  %-'.$width.'s = pake %s'."\n", pakeColor::colorize(pakeTask::get_mini_task_name($name), 'INFO'), $task->get_alias().($mini_name != $name ? ' ['.$name.']' : ''));
+        }
+      }
+    }
+  }
+
+  // Display the tasks and prerequisites
+  public function display_prerequisites()
+  {
+    foreach (pakeTask::get_tasks() as $name => $task)
+    {
+      echo "pake ".pakeTask::get_mini_task_name($name)."\n";
+      foreach ($task->get_prerequisites() as $prerequisite)
+      {
+        echo "    $prerequisite\n";
+      }
+    }
+  }
+
+  public static function get_files_from_argument($arg, $target_dir = '', $relative = false)
+  {
+    $files = array();
+    if (is_array($arg))
+    {
+      $files = $arg;
+    }
+    else if (is_string($arg))
+    {
+      $files[] = $arg;
+    }
+    else if ($arg instanceof pakeFinder)
+    {
+      $files = $arg->in($target_dir);
+    }
+    else
+    {
+      throw new pakeException('Wrong argument type (must be a list, a string or a pakeFinder object).');
+    }
+
+    if ($relative && $target_dir)
+    {
+      $files = preg_replace('/^'.preg_quote(realpath($target_dir), '/').'/', '', $files);
+
+      // remove leading /
+      $files = array_map(create_function('$f', 'return 0 === strpos($f, DIRECTORY_SEPARATOR) ? substr($f, 1) : $f;'), $files);
+    }
+
+    return $files;
+  }
+
+  public static function excerpt($text, $size = null)
+  {
+    if (!$size)
+    {
+      $size = self::$MAX_LINE_SIZE;
+    }
+
+    if (strlen($text) < $size)
+    {
+      return $text;
+    }
+
+    $subsize = floor(($size - 3) / 2);
+
+    return substr($text, 0, $subsize).pakeColor::colorize('...', 'INFO').substr($text, -$subsize);
+  }
+
+  /* see perl Text::Abbrev module */
+  private function abbrev($options)
+  {
+    $abbrevs = array();
+    $table = array();
+
+    foreach ($options as $option)
+    {
+      $option = pakeTask::get_mini_task_name($option);
+
+      for ($len = (strlen($option)) - 1; $len > 0; --$len)
+      {
+        $abbrev = substr($option, 0, $len);
+        if (!array_key_exists($abbrev, $table))
+          $table[$abbrev] = 1;
+        else
+          ++$table[$abbrev];
+
+        $seen = $table[$abbrev];
+        if ($seen == 1)
+        { 
+          // we're the first word so far to have this abbreviation.
+          $abbrevs[$abbrev] = array($option);
+        }
+        else if ($seen == 2)
+        { 
+          // we're the second word to have this abbreviation, so we can't use it.
+          //unset($abbrevs[$abbrev]);
+          $abbrevs[$abbrev][] = $option;
+        }
+        else
+        { 
+          // we're the third word to have this abbreviation, so skip to the next word.
+          continue;
+        }
+      }
+    }
+
+    // Non-abbreviations always get entered, even if they aren't unique
+    foreach ($options as $option)
+    {
+      $abbrevs[$option] = array($option);
+    }
+
+    return $abbrevs;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeApp.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeColor.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeColor.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeColor.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeColor.class.php 2990 2006-12-09 11:10:59Z fabien $
+ */
+
+/**
+ *
+ * main pake class.
+ *
+ * This class is a singleton.
+ *
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeColor.class.php 2990 2006-12-09 11:10:59Z fabien $
+ */
+class pakeColor
+{
+  static public $styles = array();
+
+  static function style($name, $options = array())
+  {
+    self::$styles[$name] = $options;
+  }
+
+  static function colorize($text = '', $parameters = array(), $stream = STDOUT)
+  {
+    // disable colors if not supported (windows or non tty console)
+    if (DIRECTORY_SEPARATOR == '\\' || !function_exists('posix_isatty') || !@posix_isatty($stream))
+    {
+      return $text;
+    }
+
+    static $options    = array('bold' => 1, 'underscore' => 4, 'blink' => 5, 'reverse' => 7, 'conceal' => 8);
+    static $foreground = array('black' => 30, 'red' => 31, 'green' => 32, 'yellow' => 33, 'blue' => 34, 'magenta' => 35, 'cyan' => 36, 'white' => 37);
+    static $background = array('black' => 40, 'red' => 41, 'green' => 42, 'yellow' => 43, 'blue' => 44, 'magenta' => 45, 'cyan' => 46, 'white' => 47);
+
+    if (!is_array($parameters) && isset(self::$styles[$parameters]))
+    {
+      $parameters = self::$styles[$parameters];
+    }
+
+    $codes = array();
+    if (isset($parameters['fg']))
+    {
+      $codes[] = $foreground[$parameters['fg']];
+    }
+    if (isset($parameters['bg']))
+    {
+      $codes[] = $background[$parameters['bg']];
+    }
+    foreach ($options as $option => $value)
+    {
+      if (isset($parameters[$option]) && $parameters[$option])
+      {
+        $codes[] = $value;
+      }
+    }
+
+    return "\033[".implode(';', $codes).'m'.$text."\033[0m";
+  }
+}
+
+pakeColor::style('ERROR',    array('bg' => 'red', 'fg' => 'white', 'bold' => true));
+pakeColor::style('INFO',     array('fg' => 'green', 'bold' => true));
+pakeColor::style('COMMENT',  array('fg' => 'yellow'));


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeColor.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeException.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeException.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeException.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,91 @@
+<?php
+
+/*
+ * This file is part of the pake package.
+ * (c) 2004, 2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * pakeException is the base class for all pake related exceptions and
+ * provides an additional method for printing up a detailed view of an
+ * exception.
+ *
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: pakeException.class.php 2795 2006-11-23 19:51:21Z fabien $
+ */
+class pakeException extends Exception
+{
+  public static function strlen($string)
+  {
+      return function_exists('mb_strlen') ? mb_strlen($string) : strlen($string);
+  }
+
+  function render($e)
+  {
+    $title = '  ['.get_class($e).']  ';
+    $len = self::strlen($title);
+    $lines = array();
+    foreach (explode("\n", $e->getMessage()) as $line)
+    {
+      $lines[] = '  '.$line.'  ';
+      $len = max(self::strlen($line) + 4, $len);
+    }
+    $messages = array(
+      str_repeat(' ', $len),
+      $title.str_repeat(' ', $len - self::strlen($title)),
+    );
+
+    foreach ($lines as $line)
+    {
+      $messages[] = $line.str_repeat(' ', $len - self::strlen($line));
+    }
+
+    $messages[] = str_repeat(' ', $len);
+
+    fwrite(STDERR, "\n");
+    foreach ($messages as $message)
+    {
+      fwrite(STDERR, pakeColor::colorize($message, 'ERROR', STDERR)."\n");
+    }
+    fwrite(STDERR, "\n");
+
+    $pake = pakeApp::get_instance();
+
+    if ($pake->get_trace())
+    {
+      fwrite(STDERR, "exception trace:\n");
+
+      $trace = $this->trace($e);
+      for ($i = 0, $count = count($trace); $i < $count; $i++)
+      {
+        $class = (isset($trace[$i]['class']) ? $trace[$i]['class'] : '');
+        $type = (isset($trace[$i]['type']) ? $trace[$i]['type'] : '');
+        $function = $trace[$i]['function'];
+        $file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a';
+        $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a';
+
+        fwrite(STDERR, sprintf(" %s%s%s at %s:%s\n", $class, $type, $function, pakeColor::colorize($file, 'INFO', STDERR), pakeColor::colorize($line, 'INFO', STDERR)));
+      }
+    }
+
+    fwrite(STDERR, "\n");
+  }
+
+  function trace($exception)
+  {
+    // exception related properties
+    $trace = $exception->getTrace();
+    array_unshift($trace, array(
+      'function' => '',
+      'file'     => ($exception->getFile() != null) ? $exception->getFile() : 'n/a',
+      'line'     => ($exception->getLine() != null) ? $exception->getLine() : 'n/a',
+      'args'     => array(),
+    ));
+
+    return $trace;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeException.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeFileTask.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeFileTask.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeFileTask.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeFileTask.class.php 1791 2006-08-23 21:17:06Z fabien $
+ */
+ 
+/**
+ *
+ * .
+ *
+ * .
+ *
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeFileTask.class.php 1791 2006-08-23 21:17:06Z fabien $
+ */
+class pakeFileTask extends pakeTask
+{
+  public function is_needed()
+  {
+    if (!file_exists($this->get_name())) return true;
+    $latest_prereq = 0;
+    foreach ($this->prerequisites as $prerequisite)
+    {
+      $t = pakeTask::get($prerequisite)->timestamp();
+      if ($t > $latest_prereq)
+      {
+        $latest_prereq = $t;
+      }
+    }
+
+    if ($latest_prereq == 0)
+    {
+      return false;
+    }
+
+    return ($this->timestamp() < $latest_prereq);
+  }
+
+  public function timestamp()
+  {
+    if (!file_exists($this->get_name()))
+    {
+      throw new pakeException(sprintf('File "%s" does not exist!', $this->get_name()));
+    }
+
+    $stats = stat($this->get_name());
+
+    return $stats['mtime'];
+  }
+
+  public static function define_task($name, $deps = null)
+  {
+     $task = pakeTask::lookup($name, 'pakeFileTask');
+     $task->add_comment();
+     $task->enhance($deps);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeFileTask.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeFinder.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeFinder.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeFinder.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,538 @@
+<?php
+
+/**
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeFinder.class.php 3268 2007-01-13 20:19:33Z fabien $
+ */
+
+require_once dirname(__FILE__).'/pakeGlobToRegex.class.php';
+require_once dirname(__FILE__).'/pakeNumberCompare.class.php';
+
+if (class_exists('pakeFinder'))
+{
+  return;
+}
+
+/**
+ *
+ * Allow to build rules to find files and directories.
+ *
+ * All rules may be invoked several times, except for ->in() method.
+ * Some rules are cumulative (->name() for example) whereas others are destructive
+ * (most recent value is used, ->maxdepth() method for example).
+ *
+ * All methods return the current pakeFinder object to allow easy chaining:
+ *
+ * $files = pakeFinder::type('file')->name('*.php')->in(.);
+ *
+ * Interface loosely based on perl File::Find::Rule module.
+ *
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeFinder.class.php 3268 2007-01-13 20:19:33Z fabien $
+ */
+class pakeFinder
+{
+  private $type        = 'file';
+  private $names       = array();
+  private $prunes      = array();
+  private $discards    = array();
+  private $execs       = array();
+  private $mindepth    = 0;
+  private $sizes       = array();
+  private $maxdepth    = 1000000;
+  private $relative    = false;
+  private $follow_link = false;
+  private $search_dir  = '';
+
+  /**
+   * Sets maximum directory depth.
+   *
+   * Finder will descend at most $level levels of directories below the starting point.
+   *
+   * @param  integer level
+   * @return object current pakeFinder object
+   */
+  public function maxdepth($level)
+  {
+    $this->maxdepth = $level;
+
+    return $this;
+  }
+
+  /**
+   * Sets minimum directory depth.
+   *
+   * Finder will start applying tests at level $level.
+   *
+   * @param  integer level
+   * @return object current pakeFinder object
+   */
+  public function mindepth($level)
+  {
+    $this->mindepth = $level;
+
+    return $this;
+  }
+
+  public function get_type()
+  {
+    return $this->type;
+  }
+
+  /**
+   * Sets the type of elements to returns.
+   *
+   * @param  string directory or file or any (for both file and directory)
+   * @return object new pakeFinder object
+   */
+  public static function type($name)
+  {
+    $finder = new pakeFinder();
+
+    if (strtolower(substr($name, 0, 3)) == 'dir')
+    {
+      $finder->type = 'directory';
+    }
+    else if (strtolower($name) == 'any')
+    {
+      $finder->type = 'any';
+    }
+    else
+    {
+      $finder->type = 'file';
+    }
+
+    return $finder;
+  }
+
+  /*
+   * glob, patterns (must be //) or strings
+   */
+  private function to_regex($str)
+  {
+    if ($str[0] == '/' && $str[strlen($str) - 1] == '/')
+    {
+      return $str;
+    }
+    else
+    {
+      return pakeGlobToRegex::glob_to_regex($str);
+    }
+  }
+
+  private function args_to_array($arg_list, $not = false)
+  {
+    $list = array();
+
+    for ($i = 0; $i < count($arg_list); $i++)
+    {
+      if (is_array($arg_list[$i]))
+      {
+        foreach ($arg_list[$i] as $arg)
+        {
+          $list[] = array($not, $this->to_regex($arg));
+        }
+      }
+      else
+      {
+        $list[] = array($not, $this->to_regex($arg_list[$i]));
+      }
+    }
+
+    return $list;
+  }
+
+  /**
+   * Adds rules that files must match.
+   *
+   * You can use patterns (delimited with / sign), globs or simple strings.
+   *
+   * $finder->name('*.php')
+   * $finder->name('/\.php$/') // same as above
+   * $finder->name('test.php')
+   *
+   * @param  list   a list of patterns, globs or strings
+   * @return object current pakeFinder object
+   */
+  public function name()
+  {
+    $args = func_get_args();
+    $this->names = array_merge($this->names, $this->args_to_array($args));
+
+    return $this;
+  }
+
+  /**
+   * Adds rules that files must not match.
+   *
+   * @see    ->name()
+   * @param  list   a list of patterns, globs or strings
+   * @return object current pakeFinder object
+   */
+  public function not_name()
+  {
+    $args = func_get_args();
+    $this->names = array_merge($this->names, $this->args_to_array($args, true));
+
+    return $this;
+  }
+
+  /**
+   * Adds tests for file sizes.
+   *
+   * $finder->size('> 10K');
+   * $finder->size('<= 1Ki');
+   * $finder->size(4);
+   *
+   * @param  list   a list of comparison strings
+   * @return object current pakeFinder object
+   */
+  public function size()
+  {
+    $args = func_get_args();
+    for ($i = 0; $i < count($args); $i++)
+    {
+      $this->sizes[] = new pakeNumberCompare($args[$i]);
+    }
+
+    return $this;
+  }
+
+  /**
+   * Traverses no further.
+   *
+   * @param  list   a list of patterns, globs to match
+   * @return object current pakeFinder object
+   */
+  public function prune()
+  {
+    $args = func_get_args();
+    $this->prunes = array_merge($this->prunes, $this->args_to_array($args));
+
+    return $this;
+  }
+
+  /**
+   * Discards elements that matches.
+   *
+   * @param  list   a list of patterns, globs to match
+   * @return object current pakeFinder object
+   */
+  public function discard()
+  {
+    $args = func_get_args();
+    $this->discards = array_merge($this->discards, $this->args_to_array($args));
+
+    return $this;
+  }
+
+  /**
+   * Ignores version control directories.
+   *
+   * Currently supports subversion, CVS, DARCS, Gnu Arch, Monotone, Bazaar-NG
+   *
+   * @return object current pakeFinder object
+   */
+  public function ignore_version_control()
+  {
+    $ignores = array('.svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr');
+
+    return $this->discard($ignores)->prune($ignores);
+  }
+
+  /**
+   * Executes function or method for each element.
+   *
+   * Element match if functino or method returns true.
+   *
+   * $finder->exec('myfunction');
+   * $finder->exec(array($object, 'mymethod'));
+   *
+   * @param  mixed  function or method to call
+   * @return object current pakeFinder object
+   */
+  public function exec()
+  {
+    $args = func_get_args();
+    for ($i = 0; $i < count($args); $i++)
+    {
+      if (is_array($args[$i]) && !method_exists($args[$i][0], $args[$i][1]))
+      {
+        throw new pakeException(sprintf("Method %s does not exist for object %s.", $args[$i][1], $args[$i][0]));
+      }
+      else if (!is_array($args[$i]) && !function_exists($args[$i]))
+      {
+        throw new pakeException(sprintf("Function %s does not exist.", $args[$i]));
+      }
+
+      $this->execs[] = $args[$i];
+    }
+
+    return $this;
+  }
+
+  /**
+   * Returns relative paths for all files and directories.
+   *
+   * @return object current pakeFinder object
+   */
+  public function relative()
+  {
+    $this->relative = true;
+
+    return $this;
+  }
+
+  /**
+   * Symlink following.
+   *
+   * @return object current sfFinder object
+   */
+  public function follow_link()
+  {
+    $this->follow_link = true;
+
+    return $this;
+  }
+
+  /**
+   * Searches files and directories which match defined rules.
+   *
+   * @return array list of files and directories
+   */
+  public function in()
+  {
+    $files    = array();
+    $here_dir = getcwd();
+    $numargs  = func_num_args();
+    $arg_list = func_get_args(); 
+
+    // first argument is an array?
+    if ($numargs == 1 && is_array($arg_list[0]))
+    {
+      $arg_list = $arg_list[0];
+      $numargs  = count($arg_list);
+    }
+
+    $dirs = array();
+    for ($i = 0; $i < $numargs; $i++)
+    {
+      if ($argDirs = glob($arg_list[$i]))
+      {
+        $dirs = array_merge($dirs, $argDirs);
+      }
+    }
+
+    foreach ($dirs as $dir)
+    {
+      $real_dir = realpath($dir);
+
+      // absolute path?
+      if (!self::isPathAbsolute($real_dir))
+      {
+        $dir = $here_dir.DIRECTORY_SEPARATOR.$real_dir;
+      }
+      else
+      {
+        $dir = $real_dir;
+      }
+
+      if (!is_dir($real_dir))
+      {
+        continue;
+      }
+
+      $this->search_dir = $dir;
+
+      if ($this->relative)
+      {
+        $files = array_merge($files, str_replace($dir.DIRECTORY_SEPARATOR, '', $this->search_in($dir)));
+      }
+      else
+      {
+        $files = array_merge($files, $this->search_in($dir));
+      }
+    }
+
+    return array_unique($files);
+  }
+
+  private function search_in($dir, $depth = 0)
+  {
+    if ($depth > $this->maxdepth)
+    {
+      return array();
+    }
+
+    if (is_link($dir) && !$this->follow_link)
+    {
+      return array();
+    }
+
+    $files = array();
+
+    if (is_dir($dir))
+    {
+      $current_dir = opendir($dir);
+      while (false !== $entryname = readdir($current_dir))
+      {
+        if ($entryname == '.' || $entryname == '..') continue;
+
+        $current_entry = $dir.DIRECTORY_SEPARATOR.$entryname;
+        if (is_link($current_entry) && !$this->follow_link)
+        {
+          continue;
+        }
+
+        if (is_dir($current_entry))
+        {
+          if (($this->type == 'directory' || $this->type == 'any') && ($depth >= $this->mindepth) && !$this->is_discarded($dir, $entryname) && $this->match_names($dir, $entryname) && $this->exec_ok($dir, $entryname))
+          {
+            $files[] = realpath($current_entry);
+          }
+
+          if (!$this->is_pruned($dir, $entryname))
+          {
+            $files = array_merge($files, $this->search_in($current_entry, $depth + 1));
+          }
+        }
+        else
+        {
+          if (($this->type != 'directory' || $this->type == 'any') && ($depth >= $this->mindepth) && !$this->is_discarded($dir, $entryname) && $this->match_names($dir, $entryname) && $this->size_ok($dir, $entryname) && $this->exec_ok($dir, $entryname))
+          {
+            $files[] = realpath($current_entry);
+          }
+        }
+      }
+      closedir($current_dir);
+    }
+
+    return $files;
+  }
+
+  private function match_names($dir, $entry)
+  {
+    if (!count($this->names)) return true;
+
+    // we must match one "not_name" rules to be ko
+    $one_not_name_rule = false;
+    foreach ($this->names as $args)
+    {
+      list($not, $regex) = $args;
+      if ($not)
+      {
+        $one_not_name_rule = true;
+        if (preg_match($regex, $entry))
+        {
+          return false;
+        }
+      }
+    }
+
+    $one_name_rule = false;
+    // we must match one "name" rules to be ok
+    foreach ($this->names as $args)
+    {
+      list($not, $regex) = $args;
+      if (!$not)
+      {
+        $one_name_rule = true;
+        if (preg_match($regex, $entry))
+        {
+          return true;
+        }
+      }
+    }
+
+    if ($one_not_name_rule && $one_name_rule)
+    {
+      return false;
+    }
+    else if ($one_not_name_rule)
+    {
+      return true;
+    }
+    else if ($one_name_rule)
+    {
+      return false;
+    }
+    else
+    {
+      return true;
+    }
+  }
+
+  private function size_ok($dir, $entry)
+  {
+    if (!count($this->sizes)) return true;
+
+    if (!is_file($dir.DIRECTORY_SEPARATOR.$entry)) return true;
+
+    $filesize = filesize($dir.DIRECTORY_SEPARATOR.$entry);
+    foreach ($this->sizes as $number_compare)
+    {
+      if (!$number_compare->test($filesize)) return false;
+    }
+
+    return true;
+  }
+
+  private function is_pruned($dir, $entry)
+  {
+    if (!count($this->prunes)) return false;
+
+    foreach ($this->prunes as $args)
+    {
+      $regex = $args[1];
+      if (preg_match($regex, $entry)) return true;
+    }
+
+    return false;
+  }
+
+  private function is_discarded($dir, $entry)
+  {
+    if (!count($this->discards)) return false;
+
+    foreach ($this->discards as $args)
+    {
+      $regex = $args[1];
+      if (preg_match($regex, $entry)) return true;
+    }
+
+    return false;
+  }
+
+  private function exec_ok($dir, $entry)
+  {
+    if (!count($this->execs)) return true;
+
+    foreach ($this->execs as $exec)
+    {
+      if (!call_user_func_array($exec, array($dir, $entry))) return false;
+    }
+
+    return true;
+  }
+
+  public static function isPathAbsolute($path)
+  {
+    if ($path{0} == '/' || $path{0} == '\\' ||
+        (strlen($path) > 3 && ctype_alpha($path{0}) &&
+         $path{1} == ':' &&
+         ($path{2} == '\\' || $path{2} == '/')
+        )
+       )
+    {
+      return true;
+    }
+
+    return false;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeFinder.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeFunction.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeFunction.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeFunction.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,429 @@
+<?php
+
+/**
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeFunction.php 3263 2007-01-13 14:20:52Z fabien $
+ */
+
+require_once dirname(__FILE__).'/pakeException.class.php';
+require_once dirname(__FILE__).'/pakeYaml.class.php';
+require_once dirname(__FILE__).'/pakeGetopt.class.php';
+require_once dirname(__FILE__).'/pakeFinder.class.php';
+require_once dirname(__FILE__).'/pakeTask.class.php';
+require_once dirname(__FILE__).'/pakeFileTask.class.php';
+require_once dirname(__FILE__).'/pakeColor.class.php';
+require_once dirname(__FILE__).'/pakeApp.class.php';
+
+function pake_import($name, $import_default_tasks = true)
+{
+  $class_name = 'pake'.ucfirst(strtolower($name)).'Task';
+
+  if (!class_exists($class_name))
+  {
+    // plugin available?
+    $plugin_path = '';
+    foreach (pakeApp::get_plugin_dirs() as $dir)
+    {
+      if (file_exists($dir.DIRECTORY_SEPARATOR.$class_name.'.class.php'))
+      {
+        $plugin_path = $dir.DIRECTORY_SEPARATOR.$class_name.'.class.php';
+        break;
+      }
+    }
+
+    if ($plugin_path)
+    {
+      require_once $plugin_path;
+    }
+    else
+    {
+      throw new pakeException(sprintf('Plugin "%s" does not exist.', $name));
+    }
+  }
+
+  if ($import_default_tasks && is_callable($class_name, 'import_default_tasks'))
+  {
+    call_user_func(array($class_name, 'import_default_tasks'));
+  }
+}
+
+function pake_task($name)
+{
+  $args = func_get_args();
+  array_shift($args);
+  pakeTask::define_task($name, $args);
+
+  return $name;
+}
+
+function pake_alias($alias, $name)
+{
+  pakeTask::define_alias($alias, $name);
+
+  return $alias;
+}
+
+function pake_desc($comment)
+{
+  pakeTask::define_comment($comment);
+}
+
+function pake_properties($property_file)
+{
+  $file = $property_file;
+  if (!pakeFinder::isPathAbsolute($file))
+  {
+    $file = getcwd().DIRECTORY_SEPARATOR.$property_file;
+  }
+
+  if (file_exists($file))
+  {
+    pakeApp::get_instance()->set_properties(parse_ini_file($file, true));
+  }
+  else
+  {
+    throw new pakeException('Properties file does not exist.');
+  }
+}
+
+function pake_file($name)
+{
+  $args = func_get_args();
+  array_shift($args);
+  pakeFileTask::define_task($name, $args);
+
+  return $name;
+}
+
+function pake_mkdirs($path, $mode = 0777)
+{
+  if (is_dir($path))
+  {
+    return true;
+  }
+
+  pake_echo_action('dir+', $path);
+
+  return @mkdir($path, $mode, true);
+}
+
+/*
+  override => boolean
+*/
+function pake_copy($origin_file, $target_file, $options = array())
+{
+  if (!array_key_exists('override', $options))
+  {
+    $options['override'] = false;
+  }
+
+  // we create target_dir if needed
+  if (!is_dir(dirname($target_file)))
+  {
+    pake_mkdirs(dirname($target_file));
+  }
+
+  $most_recent = false;
+  if (file_exists($target_file))
+  {
+    $stat_target = stat($target_file);
+    $stat_origin = stat($origin_file);
+    $most_recent = ($stat_origin['mtime'] > $stat_target['mtime']) ? true : false;
+  }
+
+  if ($options['override'] || !file_exists($target_file) || $most_recent)
+  {
+    pake_echo_action('file+', $target_file);
+    copy($origin_file, $target_file);
+  }
+}
+
+function pake_rename($origin, $target, $options = array())
+{
+  // we check that target does not exist
+  if (is_readable($target))
+  {
+    throw new pakeException(sprintf('Cannot rename because the target "%" already exist.', $target));
+  }
+
+  pake_echo_action('rename', $origin.' > '.$target);
+  rename($origin, $target);
+}
+
+function pake_mirror($arg, $origin_dir, $target_dir, $options = array())
+{
+  $files = pakeApp::get_files_from_argument($arg, $origin_dir, true);
+
+  foreach ($files as $file)
+  {
+    if (is_dir($origin_dir.DIRECTORY_SEPARATOR.$file))
+    {
+      pake_mkdirs($target_dir.DIRECTORY_SEPARATOR.$file);
+    }
+    else if (is_file($origin_dir.DIRECTORY_SEPARATOR.$file))
+    {
+      pake_copy($origin_dir.DIRECTORY_SEPARATOR.$file, $target_dir.DIRECTORY_SEPARATOR.$file, $options);
+    }
+    else if (is_link($origin_dir.DIRECTORY_SEPARATOR.$file))
+    {
+      pake_symlink($origin_dir.DIRECTORY_SEPARATOR.$file, $target_dir.DIRECTORY_SEPARATOR.$file);
+    }
+    else
+    {
+      throw new pakeException(sprintf('Unable to determine "%s" type', $file));
+    }
+  }
+}
+
+function pake_remove($arg, $target_dir)
+{
+  $files = array_reverse(pakeApp::get_files_from_argument($arg, $target_dir));
+
+  foreach ($files as $file)
+  {
+    if (is_dir($file) && !is_link($file))
+    {
+      pake_echo_action('dir-', $file);
+
+      rmdir($file);
+    }
+    else
+    {
+      pake_echo_action(is_link($file) ? 'link-' : 'file-', $file);
+
+      unlink($file);
+    }
+  }
+}
+
+function pake_touch($arg, $target_dir)
+{
+  $files = pakeApp::get_files_from_argument($arg, $target_dir);
+
+  foreach ($files as $file)
+  {
+    pake_echo_action('file+', $file);
+
+    touch($file);
+  }
+}
+
+function pake_replace_tokens($arg, $target_dir, $begin_token, $end_token, $tokens)
+{
+  $files = pakeApp::get_files_from_argument($arg, $target_dir, true);
+
+  foreach ($files as $file)
+  {
+    $replaced = false;
+    $content = file_get_contents($target_dir.DIRECTORY_SEPARATOR.$file);
+    foreach ($tokens as $key => $value)
+    {
+      $content = str_replace($begin_token.$key.$end_token, $value, $content, $count);
+      if ($count) $replaced = true;
+    }
+
+    pake_echo_action('tokens', $target_dir.DIRECTORY_SEPARATOR.$file);
+
+    file_put_contents($target_dir.DIRECTORY_SEPARATOR.$file, $content);
+  }
+}
+
+function pake_symlink($origin_dir, $target_dir, $copy_on_windows = false)
+{
+  if (!function_exists('symlink') && $copy_on_windows)
+  {
+    $finder = pakeFinder::type('any')->ignore_version_control();
+    pake_mirror($finder, $origin_dir, $target_dir);
+    return;
+  }
+
+  $ok = false;
+  if (is_link($target_dir))
+  {
+    if (readlink($target_dir) != $origin_dir)
+    {
+      unlink($target_dir);
+    }
+    else
+    {
+      $ok = true;
+    }
+  }
+
+  if (!$ok)
+  {
+    pake_echo_action('link+', $target_dir);
+    symlink($origin_dir, $target_dir);
+  }
+}
+
+function pake_chmod($arg, $target_dir, $mode, $umask = 0000)
+{
+  $current_umask = umask();
+  umask($umask);
+
+  $files = pakeApp::get_files_from_argument($arg, $target_dir, true);
+
+  foreach ($files as $file)
+  {
+    pake_echo_action(sprintf('chmod %o', $mode), $target_dir.DIRECTORY_SEPARATOR.$file);
+    chmod($target_dir.DIRECTORY_SEPARATOR.$file, $mode);
+  }
+
+  umask($current_umask);
+}
+
+function pake_sh($cmd)
+{
+  $verbose = pakeApp::get_instance()->get_verbose();
+  pake_echo_action('exec ', $cmd);
+
+  ob_start();
+  passthru($cmd.' 2>&1', $return);
+  $content = ob_get_contents();
+  ob_end_clean();
+
+  if ($return > 0)
+  {
+    throw new pakeException(sprintf('Problem executing command %s', $verbose ? "\n".$content : ''));
+  }
+
+  return $content;
+}
+
+function pake_strip_php_comments($arg)
+{
+  /* T_ML_COMMENT does not exist in PHP 5.
+   * The following three lines define it in order to
+   * preserve backwards compatibility.
+   *
+   * The next two lines define the PHP 5-only T_DOC_COMMENT,
+   * which we will mask as T_ML_COMMENT for PHP 4.
+   */
+  if (!defined('T_ML_COMMENT'))
+  {
+    define('T_ML_COMMENT', T_COMMENT);
+  }
+  else
+  {
+    if (!defined('T_DOC_COMMENT')) define('T_DOC_COMMENT', T_ML_COMMENT);
+  }
+
+  $files = pakeApp::get_files_from_argument($arg);
+
+  foreach ($files as $file)
+  {
+    if (!is_file($file)) continue;
+
+    $source = file_get_contents($file);
+    $output = '';
+
+    $tokens = token_get_all($source);
+    foreach ($tokens as $token)
+    {
+      if (is_string($token))
+      {
+        // simple 1-character token
+        $output .= $token;
+      }
+      else
+      {
+        // token array
+        list($id, $text) = $token;
+        switch ($id)
+        {
+          case T_COMMENT:
+          case T_ML_COMMENT: // we've defined this
+          case T_DOC_COMMENT: // and this
+            // no action on comments
+            break;
+          default:
+          // anything else -> output "as is"
+          $output .= $text;
+          break;
+        }
+      }
+    }
+
+    file_put_contents($file, $output);
+  }
+}
+
+function pake_format_action($section, $text, $size = null)
+{
+  if (pakeApp::get_instance()->get_verbose())
+  {
+    $width = 9 + strlen(pakeColor::colorize('', 'INFO'));
+    return sprintf('>> %-'.$width.'s %s', pakeColor::colorize($section, 'INFO'), pakeApp::excerpt($text, $size))."\n";
+  }
+}
+
+function pake_echo_action($section, $text)
+{
+  echo pake_format_action($section, $text);
+}
+
+function pake_excerpt($text)
+{
+  if (pakeApp::get_instance()->get_verbose())
+  {
+    echo pakeApp::excerpt($text)."\n";
+  }
+}
+
+function pake_echo($text)
+{
+  if (pakeApp::get_instance()->get_verbose())
+  {
+    echo $text."\n";
+  }
+}
+
+function pake_echo_comment($text)
+{
+  if (pakeApp::get_instance()->get_verbose())
+  {
+    echo sprintf(pakeColor::colorize('   # %s', 'COMMENT'), $text)."\n";
+  }
+}
+
+// register our default exception handler
+function pake_exception_default_handler($exception)
+{
+  $e = new pakeException();
+  $e->render($exception);
+  exit(1);
+}
+set_exception_handler('pake_exception_default_handler');
+
+// fix php behavior if using cgi php
+// from http://www.sitepoint.com/article/php-command-line-1/3
+if (false !== strpos(PHP_SAPI, 'cgi'))
+{
+   // handle output buffering
+   @ob_end_flush();
+   ob_implicit_flush(true);
+
+   // PHP ini settings
+   set_time_limit(0);
+   ini_set('track_errors', true);
+   ini_set('html_errors', false);
+   ini_set('magic_quotes_runtime', false);
+
+   // define stream constants
+   define('STDIN', fopen('php://stdin', 'r'));
+   define('STDOUT', fopen('php://stdout', 'w'));
+   define('STDERR', fopen('php://stderr', 'w'));
+
+   // change directory
+   if (isset($_SERVER['PWD']))
+   {
+     chdir($_SERVER['PWD']);
+   }
+
+   // close the streams on script termination
+   register_shutdown_function(create_function('', 'fclose(STDIN); fclose(STDOUT); fclose(STDERR); return true;'));
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeFunction.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeGetopt.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeGetopt.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeGetopt.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,274 @@
+<?php
+
+/**
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeGetopt.class.php 1791 2006-08-23 21:17:06Z fabien $
+ */
+
+if (class_exists('pakeGetopt'))
+{
+  return;
+}
+
+/**
+ *
+ * Console options parsing class.
+ *
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeGetopt.class.php 1791 2006-08-23 21:17:06Z fabien $
+ */
+class pakeGetopt
+{
+  const NO_ARGUMENT = 0;
+  const REQUIRED_ARGUMENT = 1;
+  const OPTIONAL_ARGUMENT = 2;
+  private $short_options = array();
+  private $long_options = array();
+  private $args = '';
+  private $options = array();
+  private $arguments = array();
+
+  public function __construct($options)
+  {
+    $this->args = '';
+    foreach ($options as $option)
+    {
+      if (!$option[0])
+      {
+        throw new pakeException(sprintf("pakeGetopt: You must define a long option name! for option %s (%s).", $option[1], $option[3]));
+      }
+
+      $this->add_option($option[0], $option[1], $option[2], $option[3]);
+    }
+  }
+
+  public function add_option($long_opt, $short_opt, $mode = self::NO_ARGUMENT, $comment = '')
+  {
+    if ($long_opt{0} == '-' && $long_opt{1} == '-')
+    {
+      $long_opt = substr($long_opt, 2);
+    }
+
+    if ($short_opt)
+    {
+      if ($short_opt{0} == '-')
+      {
+        $short_opt = substr($short_opt, 1);
+      }
+      $this->short_options[$short_opt] = array('mode' => $mode, 'comment' => $comment, 'name' => $long_opt);
+    }
+
+    $this->long_options[$long_opt] = array('mode' => $mode, 'comment' => $comment, 'name' => $long_opt);
+  }
+
+  public function parse($args = null)
+  {
+    if (is_string($args))
+    {
+      // hack to split arguments with spaces : --test="with some spaces"
+      $args = preg_replace('/(\'|")(.+?)\\1/e', "str_replace(' ', '=PLACEHOLDER=', '\\2')", $args);
+      $args = preg_split('/\s+/', $args);
+      $args = str_replace('=PLACEHOLDER=', ' ', $args);
+    }
+    else if (!$args)
+    {
+      $args = $this->read_php_argv();
+
+      // we strip command line program
+      if (isset($args[0]) && $args[0]{0} != '-')
+      {
+        array_shift($args);
+      }
+    }
+
+    $this->args = $args;
+
+    $this->options = array();
+    $this->arguments = array();
+
+    while ($arg = array_shift($this->args))
+    {
+      /* '--' stop options parsing. */
+      if ($arg == '--')
+      {
+        $this->arguments = array_merge($this->arguments, $this->args);
+        break;
+      }
+
+      if ($arg{0} != '-' || (strlen($arg) > 1 && $arg{1} == '-' && !$this->long_options))
+      {
+        $this->arguments = array_merge($this->arguments, array($arg), $this->args);
+        break;
+      }
+      elseif (strlen($arg) > 1 && $arg{1} == '-')
+      {
+        $this->parse_long_option(substr($arg, 2));
+      }
+      else
+      {
+        $this->parse_short_option(substr($arg, 1));
+      }
+    }
+  }
+
+  public function has_option($option)
+  {
+    return (array_key_exists($option, $this->options) ? true : false);
+  }
+
+  public function get_option($option)
+  {
+    // is it a long option?
+    if (array_key_exists($option, $this->long_options) && $this->long_options[$option]['mode'] != self::NO_ARGUMENT)
+    {
+      return (array_key_exists($option, $this->options) ? $this->options[$option] : '');
+    }
+    else
+    {
+      throw new pakeException('pakeGetopt: You cannot get a value for a NO_ARGUMENT option.');
+    }
+  }
+
+  public function get_options()
+  {
+    return $this->options;
+  }
+
+  public function get_arguments()
+  {
+    return $this->arguments;
+  }
+
+  private function parse_short_option($arg)
+  {
+    for ($i = 0; $i < strlen($arg); $i++)
+    {
+      $opt = $arg{$i};
+      $opt_arg = true;
+
+      /* option exists? */
+      if (!array_key_exists($opt, $this->short_options))
+      {
+        throw new pakeException(sprintf("pakeGetopt: unrecognized option -%s.", $opt));
+      }
+
+      /* required or optional argument? */
+      if ($this->short_options[$opt]['mode'] == self::REQUIRED_ARGUMENT)
+      {
+        if ($i + 1 < strlen($arg))
+        {
+          $this->options[$this->short_options[$opt]['name']] = substr($arg, $i + 1);
+          break;
+        }
+        else
+        {
+          // take next element as argument (if it doesn't start with a -)
+          if (count($this->args) && $this->args[0]{0} != '-')
+          {
+            $this->options[$this->short_options[$opt]['name']] = array_shift($this->args);
+            break;
+          }
+          else
+          {
+            throw new pakeException(sprintf("pakeGetopt: option -%s requires an argument", $opt));
+          }
+        }
+      }
+      else if ($this->short_options[$opt]['mode'] == self::OPTIONAL_ARGUMENT)
+      {
+        if (substr($arg, $i + 1) != '')
+        {
+          $this->options[$this->short_options[$opt]['name']] = substr($arg, $i + 1);
+        }
+        else
+        {
+          // take next element as argument (if it doesn't start with a -)
+          if (count($this->args) && $this->args[0]{0} != '-')
+          {
+            $this->options[$this->short_options[$opt]['name']] = array_shift($this->args);
+          }
+          else
+          {
+            $this->options[$this->short_options[$opt]['name']] = true;
+          }
+        }
+
+        break;
+      }
+
+      $this->options[$this->short_options[$opt]['name']] = $opt_arg;
+    }
+  }
+
+  private function parse_long_option($arg)
+  {
+    @list($opt, $opt_arg) = explode('=', $arg);
+
+    if (!$opt_arg)
+    {
+      $opt_arg = true;
+    }
+
+    /* option exists? */
+    if (!array_key_exists($opt, $this->long_options))
+    {
+      throw new pakeException(sprintf("pakeGetopt: unrecognized option --%s.", $opt));
+    }
+
+    /* required or optional argument? */
+    if ($this->long_options[$opt]['mode'] == self::REQUIRED_ARGUMENT)
+    {
+      if ($opt_arg)
+      {
+        $this->options[$this->long_options[$opt]['name']] = $opt_arg;
+        return;
+      }
+      else
+      {
+        throw new pakeException(sprintf("pakeGetopt: option --%s requires an argument.", $opt));
+      }
+    }
+    else if ($this->long_options[$opt]['mode'] == self::OPTIONAL_ARGUMENT)
+    {
+      $this->options[$this->long_options[$opt]['name']] = $opt_arg;
+      return;
+    }
+    else
+    {
+      $this->options[$this->long_options[$opt]['name']] = true;
+    }
+  }
+
+  /**
+   * Function from PEAR::Console_Getopt.
+   * Safely read the $argv PHP array across different PHP configurations.
+   * Will take care on register_globals and register_argc_argv ini directives
+   *
+   * @access public
+   * @return mixed the $argv PHP array
+   */
+  private function read_php_argv()
+  {
+    global $argv;
+    if (!is_array($argv))
+    {
+      if (!@is_array($_SERVER['argv']))
+      {
+        if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv']))
+        {
+          throw new pakeException("pakeGetopt: Could not read cmd args (register_argc_argv=Off?).");
+        }
+
+        return $GLOBALS['HTTP_SERVER_VARS']['argv'];
+      }
+      return $_SERVER['argv'];
+    }
+    return $argv;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeGetopt.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeGlobToRegex.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeGlobToRegex.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeGlobToRegex.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,139 @@
+<?php
+
+/**
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com> php port
+ * @author     Richard Clamp <richardc en unixbeard.net> perl version
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2002 Richard Clamp <richardc en unixbeard.net>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeGlobToRegex.class.php 1791 2006-08-23 21:17:06Z fabien $
+ */
+
+if (class_exists('pakeGlobToRegex'))
+{
+  return;
+}
+
+/**
+ *
+ * Match globbing patterns against text.
+ *
+ *   if match_glob("foo.*", "foo.bar") echo "matched\n";
+ *
+ * // prints foo.bar and foo.baz
+ * $regex = glob_to_regex("foo.*");
+ * for (array('foo.bar', 'foo.baz', 'foo', 'bar') as $t)
+ * {
+ *   if (/$regex/) echo "matched: $car\n";
+ * }
+ *
+ * pakeGlobToRegex implements glob(3) style matching that can be used to match
+ * against text, rather than fetching names from a filesystem.
+ *
+ * based on perl Text::Glob module.
+ *
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com> php port
+ * @author     Richard Clamp <richardc en unixbeard.net> perl version
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2002 Richard Clamp <richardc en unixbeard.net>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeGlobToRegex.class.php 1791 2006-08-23 21:17:06Z fabien $
+ */
+class pakeGlobToRegex
+{
+  private static $strict_leading_dot = true;
+  private static $strict_wildcard_slash = true;
+
+  public static function setStrictLeadingDot($boolean)
+  {
+    self::$strict_leading_dot = $boolean;
+  }
+
+  public static function setStrictWildcardSlash($boolean)
+  {
+    self::$strict_wildcard_slash = $boolean;
+  }
+
+  /**
+   * Returns a compiled regex which is the equiavlent of the globbing pattern.
+   *
+   * @param  string glob pattern
+   * @return string regex
+   */
+  public static function glob_to_regex($glob)
+  {
+    $first_byte = true;
+    $escaping = false;
+    $in_curlies = 0;
+    $regex = '';
+    for ($i = 0; $i < strlen($glob); $i++)
+    {
+      $car = $glob[$i];
+      if ($first_byte)
+      {
+        if (self::$strict_leading_dot && $car != '.')
+        {
+          $regex .= '(?=[^\.])';
+        }
+
+        $first_byte = false;
+      }
+
+      if ($car == '/')
+      {
+        $first_byte = true;
+      }
+
+      if ($car == '.' || $car == '(' || $car == ')' || $car == '|' || $car == '+' || $car == '^' || $car == '$')
+      {
+        $regex .= "\\$car";
+      }
+      else if ($car == '*')
+      {
+        $regex .= ($escaping ? "\\*" : (self::$strict_wildcard_slash ? "[^/]*" : ".*"));
+      }
+      else if ($car == '?')
+      {
+        $regex .= ($escaping ? "\\?" : (self::$strict_wildcard_slash ? "[^/]" : "."));
+      }
+      else if ($car == '{')
+      {
+        $regex .= ($escaping ? "\\{" : "(");
+        if (!$escaping) ++$in_curlies;
+      }
+      else if ($car == '}' && $in_curlies)
+      {
+        $regex .= ($escaping ? "}" : ")");
+        if (!$escaping) --$in_curlies;
+      }
+      else if ($car == ',' && $in_curlies)
+      {
+        $regex .= ($escaping ? "," : "|");
+      }
+      else if ($car == "\\")
+      {
+        if ($escaping)
+        {
+          $regex .= "\\\\";
+          $escaping = false;
+        }
+        else
+        {
+          $escaping = true;
+        }
+
+        continue;
+      }
+      else
+      {
+        $regex .= $car;
+        $escaping = false;
+      }
+      $escaping = false;
+    }
+
+    return "#^$regex$#";
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeGlobToRegex.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeNumberCompare.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeNumberCompare.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeNumberCompare.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,120 @@
+<?php
+
+/**
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com> php port
+ * @author     Richard Clamp <richardc en unixbeard.net> perl version
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2002 Richard Clamp <richardc en unixbeard.net>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeNumberCompare.class.php 1791 2006-08-23 21:17:06Z fabien $
+ */
+
+if (class_exists('pakeNumberCompare'))
+{
+ return;
+}
+
+/**
+ *
+ * Numeric comparisons.
+ *
+ * sfNumberCompare compiles a simple comparison to an anonymous
+ * subroutine, which you can call with a value to be tested again.
+
+ * Now this would be very pointless, if sfNumberCompare didn't understand
+ * magnitudes.
+
+ * The target value may use magnitudes of kilobytes (C<k>, C<ki>),
+ * megabytes (C<m>, C<mi>), or gigabytes (C<g>, C<gi>).  Those suffixed
+ * with an C<i> use the appropriate 2**n version in accordance with the
+ * IEC standard: http://physics.nist.gov/cuu/Units/binary.html
+ *
+ * based on perl Number::Compare module.
+ *
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com> php port
+ * @author     Richard Clamp <richardc en unixbeard.net> perl version
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2002 Richard Clamp <richardc en unixbeard.net>
+ * @see        http://physics.nist.gov/cuu/Units/binary.html
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeNumberCompare.class.php 1791 2006-08-23 21:17:06Z fabien $
+ */
+class pakeNumberCompare
+{
+  private $test = '';
+
+  public function __construct($test)
+  {
+    $this->test = $test;
+  }
+
+  public function test($number)
+  {
+    if (!preg_match('{^([<>]=?)?(.*?)([kmg]i?)?$}i', $this->test, $matches))
+    {
+      throw new pakeException(sprintf('Don\'t understand "%s" as a test.', $this->test));
+    }
+
+    $target = array_key_exists(2, $matches) ? $matches[2] : '';
+    $magnitude = array_key_exists(3, $matches) ? $matches[3] : '';
+    if (strtolower($magnitude) == 'k')  $target *=           1000;
+    if (strtolower($magnitude) == 'ki') $target *=           1024;
+    if (strtolower($magnitude) == 'm')  $target *=        1000000;
+    if (strtolower($magnitude) == 'mi') $target *=      1024*1024;
+    if (strtolower($magnitude) == 'g')  $target *=     1000000000;
+    if (strtolower($magnitude) == 'gi') $target *= 1024*1024*1024;
+
+    $comparison = array_key_exists(1, $matches) ? $matches[1] : '==';
+    if ($comparison == '==' || $comparison == '')
+    {
+      return ($number == $target);
+    }
+    else if ($comparison == '>')
+    {
+      return ($number > $target);
+    }
+    else if ($comparison == '>=')
+    {
+      return ($number >= $target);
+    }
+    else if ($comparison == '<')
+    {
+      return ($number < $target);
+    }
+    else if ($comparison == '<=')
+    {
+      return ($number <= $target);
+    }
+
+    return false;
+  }
+}
+
+/*
+=head1 SYNOPSIS
+
+ Number::Compare->new(">1Ki")->test(1025); # is 1025 > 1024
+
+ my $c = Number::Compare->new(">1M");
+ $c->(1_200_000);                          # slightly terser invocation
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=head2 ->new( $test )
+
+Returns a new object that compares the specified test.
+
+=head2 ->test( $value )
+
+A longhanded version of $compare->( $value ).  Predates blessed
+subroutine reference implementation.
+
+=head2 ->parse_to_perl( $test )
+
+Returns a perl code fragment equivalent to the test.
+*/


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeNumberCompare.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeTask.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeTask.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeTask.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,310 @@
+<?php
+
+/**
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeTask.class.php 1794 2006-08-24 05:37:10Z fabien $
+ */
+ 
+/**
+ *
+ * .
+ *
+ * .
+ *
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeTask.class.php 1794 2006-08-24 05:37:10Z fabien $
+ */
+class pakeTask
+{
+  protected static $TASKS = array();
+  protected static $ALIAS = array();
+  protected static $last_comment = '';
+  protected $prerequisites = array();
+  protected $name = '';
+  protected $comment = '';
+  protected $already_invoked = false;
+  protected $trace = null;
+  protected $verbose = null;
+  protected $dryrun = null;
+  protected $alias = '';
+
+  public function __construct($task_name)
+  {
+    $this->name = $task_name;
+    $this->comment = '';
+    $this->prerequisites = array();
+    $this->already_invoked = false;
+    $pake = pakeApp::get_instance();
+    $this->trace = $pake->get_trace();
+    $this->dryrun = $pake->get_dryrun();
+    $this->verbose = $pake->get_verbose();
+  }
+
+  public function is_verbose()
+  {
+    return $this->verbose;
+  }
+
+  public function enhance($deps = null)
+  {
+    if (!$deps) return;
+
+    if (is_array($deps))
+    {
+      $this->prerequisites = array_merge($this->prerequisites, $deps);
+    }
+    else
+    {
+      $this->prerequisites[] = $deps;
+    }
+  }
+
+  public static function get_tasks()
+  {
+    $tasks = pakeTask::$TASKS;
+    // we merge tasks and aliases
+    foreach (pakeTask::$ALIAS as $alias => $name)
+    {
+      if (!array_key_exists($name, $tasks))
+      {
+        throw new pakeException(sprintf('Task "%s" cannot be cloned to "%s" because it does not exist.', $name, $alias));
+      }
+
+      $alias_task = clone $tasks[$name];
+      $alias_task->alias = $name;
+      $alias_task->name = $alias;
+      $tasks[$alias] = $alias_task;
+    }
+
+    return $tasks;
+  }
+
+  public function get_property($name, $section = null)
+  {
+    $properties = pakeApp::get_instance()->get_properties();
+
+    if ($section)
+    {
+      if (!array_key_exists($section, $properties) || !array_key_exists($name, $properties[$section]))
+      {
+        throw new pakeException(sprintf('Property "%s/%s" does not exist.', $section, $name));
+      }
+      else
+      {
+        return $properties[$section][$name];
+      }
+    }
+    else
+    {
+      if (!array_key_exists($name, $properties))
+      {
+        throw new pakeException(sprintf('Property "%s" does not exist.', $name));
+      }
+      else
+      {
+        return $properties[$name];
+      }
+    }
+  }
+
+  public function get_alias()
+  {
+    return $this->alias;
+  }
+
+  public function get_prerequisites()
+  {
+    return $this->prerequisites;
+  }
+
+  public function get_name()
+  {
+    return $this->name;
+  }
+
+  public function get_comment()
+  {
+    return $this->comment;
+  }
+
+  // Format the trace flags for display.
+  private function format_trace_flags()
+  {
+    $flags = array();
+    if (!$this->already_invoked)
+    {
+      $flags[] = 'first_time';
+    }
+    if (!$this->is_needed())
+    {
+      $flags[] = 'not_needed';
+    }
+
+    return (count($flags)) ? '('.join(', ', $flags).')' : '';
+  }
+
+  public function invoke($args)
+  {
+    if ($this->trace)
+    {
+      pake_echo_action('invoke', $this->name.' '.$this->format_trace_flags());
+    }
+
+    // return if already invoked
+    if ($this->already_invoked) return;
+    $this->already_invoked = true;
+
+    // run prerequisites
+    $tasks = self::get_tasks();
+    foreach ($this->prerequisites as $prerequisite)
+    {
+      $real_prerequisite = self::get_full_task_name($prerequisite);
+      if (array_key_exists($real_prerequisite, $tasks))
+      {
+        $tasks[$real_prerequisite]->invoke($args);
+      }
+      else
+      {
+        throw new pakeException(sprintf('Prerequisite "%s" does not exist.', $prerequisite));
+      }
+    }
+
+    // only run if needed
+    if ($this->is_needed())
+    {
+      return $this->execute($args);
+    }
+  }
+
+  public function execute($args)
+  {
+    if ($this->dryrun)
+    {
+      pake_echo_action('execute', '(dry run) '.$this->name);
+      return;
+    }
+
+    if ($this->trace)
+    {
+      pake_echo_action('execute', $this->name);
+    }
+
+    // action to run
+    $function = ($this->get_alias() ? $this->get_alias() : $this->get_name());
+    if ($pos = strpos($function, '::'))
+    {
+      $function = array(substr($function, 0, $pos), preg_replace('/\-/', '_', 'run_'.strtolower(substr($function, $pos + 2))));
+      if (!is_callable($function))
+      {
+        throw new pakeException(sprintf('Task "%s" is defined but with no action defined.', $function[1]));
+      }
+    }
+    else
+    {
+      $function = preg_replace('/\-/', '_', 'run_'.strtolower($function));
+      if (!function_exists($function))
+      {
+        throw new pakeException(sprintf('Task "%s" is defined but with no action defined.', $this->name));
+      }
+    }
+
+    // execute action
+    return call_user_func_array($function, array($this, $args));
+  }
+
+  public function is_needed()
+  {
+    return true;
+  }
+
+  public function timestamp()
+  {
+    $max = 0;
+    foreach ($this->prerequisites as $prerequisite)
+    {
+      $t = pakeTask::get($prerequisite)->timestamp();
+      if ($t > $max) $max = $t;
+    }
+
+    return ($max ? $max : time());
+  }
+
+  public static function define_task($name, $deps = null)
+  {
+     $task = pakeTask::lookup($name, 'pakeTask');
+     $task->add_comment();
+     $task->enhance($deps);
+  }
+
+  public static function define_alias($alias, $name)
+  {
+    self::$ALIAS[$alias] = $name;
+  }
+
+  public static function lookup($task_name, $class = 'pakeTask')
+  {
+    $tasks = self::get_tasks();
+    $task_name = self::get_full_task_name($task_name);
+    if (!array_key_exists($task_name, $tasks))
+    {
+      pakeTask::$TASKS[$task_name] = new $class($task_name);
+    }
+
+    return pakeTask::$TASKS[$task_name];
+  }
+
+  public static function get($task_name)
+  {
+    $tasks = self::get_tasks();
+    $task_name = self::get_full_task_name($task_name);
+    if (!array_key_exists($task_name, $tasks))
+    {
+      throw new pakeException(sprintf('Task "%s" is not defined.', $task_name));
+    }
+
+    return $tasks[$task_name];
+  }
+
+  public static function get_full_task_name($task_name)
+  {
+    foreach (self::get_tasks() as $task)
+    {
+      $mini_task_name = self::get_mini_task_name($task->get_name());
+      if ($mini_task_name == $task_name)
+      {
+        return $task->get_name();
+      }
+    }
+
+    return $task_name;
+  }
+
+  public static function get_mini_task_name($task_name)
+  {
+    $is_method_task = strpos($task_name, '::');
+    return ($is_method_task ? substr($task_name, $is_method_task + 2) : $task_name);
+  }
+
+  public static function define_comment($comment)
+  {
+    pakeTask::$last_comment = $comment;
+  }
+
+  public function add_comment()
+  {
+    if (!pakeTask::$last_comment) return;
+    if ($this->comment)
+    {
+      $this->comment .= ' / ';
+    }
+
+    $this->comment .= pakeTask::$last_comment;
+    pakeTask::$last_comment = '';
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeTask.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeYaml.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeYaml.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeYaml.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,890 @@
+<?php
+
+/**
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeYaml.class.php 2978 2006-12-08 19:15:44Z fabien $
+ */
+
+  class pakeYaml
+  {
+    public static function load($input)
+    {
+      // syck is prefered over spyc
+      if (function_exists('syck_load')) {
+        if (!empty($input) && is_readable($input))
+        {
+          $input = file_get_contents($input);
+        }
+
+        return syck_load($input);
+      }
+      else
+      {
+        $spyc = new pakeSpyc();
+
+        return $spyc->load($input);
+      }
+    }
+
+    public static function dump($array)
+    {
+      $spyc = new pakeSpyc();
+
+      return $spyc->dump($array);
+    }
+  }
+
+  /** 
+   * Spyc -- A Simple PHP YAML Class
+   * @version 0.2.2 -- 2006-01-29
+   * @author Chris Wanstrath <chris en ozmm.org>
+   * @link http://spyc.sourceforge.net/
+   * @copyright Copyright 2005-2006 Chris Wanstrath
+   * @license http://www.opensource.org/licenses/mit-license.php MIT License
+   * @package Spyc
+   */
+
+  /** 
+   * A node, used by Spyc for parsing YAML.
+   * @package Spyc
+   */
+  class pakeYAMLNode {
+    /**#@+
+     * @access public
+     * @var string
+     */ 
+    public $parent;
+    public $id;
+    /**#@+*/
+    /** 
+     * @access public
+     * @var mixed
+     */
+    public $data;
+    /** 
+     * @access public
+     * @var int
+     */
+    public $indent;
+    /** 
+     * @access public
+     * @var bool
+     */
+    public $children = false;
+
+    /**
+     * The constructor assigns the node a unique ID.
+     * @access public
+     * @return void
+     */
+     public function pakeYAMLNode() {
+      $this->id = uniqid('');
+    }
+  }
+
+  /**
+   * The Simple PHP YAML Class.
+   *
+   * This class can be used to read a YAML file and convert its contents
+   * into a PHP array.  It currently supports a very limited subsection of
+   * the YAML spec.
+   *
+   * Usage:
+   * <code>
+   *   $parser = new Spyc;
+   *   $array  = $parser->load($file);
+   * </code>
+   * @package Spyc
+   */
+  class pakeSpyc {
+    
+    /**
+     * Load YAML into a PHP array statically
+     *
+     * The load method, when supplied with a YAML stream (string or file), 
+     * will do its best to convert YAML in a file into a PHP array.  Pretty 
+     * simple.
+     *  Usage: 
+     *  <code>
+     *   $array = Spyc::YAMLLoad('lucky.yml');
+     *   print_r($array);
+     *  </code>
+     * @access public
+     * @return array
+     * @param string $input Path of YAML file or string containing YAML
+     */
+     public function YAMLLoad($input) {
+      $spyc = new pakeSpyc;
+      return $spyc->load($input);
+    }
+    
+    /**
+     * Dump YAML from PHP array statically
+     *
+     * The dump method, when supplied with an array, will do its best
+     * to convert the array into friendly YAML.  Pretty simple.  Feel free to
+     * save the returned string as nothing.yml and pass it around.
+     *
+     * Oh, and you can decide how big the indent is and what the wordwrap
+     * for folding is.  Pretty cool -- just pass in 'false' for either if 
+     * you want to use the default.
+     *
+     * Indent's default is 2 spaces, wordwrap's default is 40 characters.  And
+     * you can turn off wordwrap by passing in 0.
+     *
+     * @access public
+     * @return string
+     * @param array $array PHP array
+     * @param int $indent Pass in false to use the default, which is 2 
+     * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40)
+     */
+     public function YAMLDump($array,$indent = false,$wordwrap = false) {
+      $spyc = new pakeSpyc;
+      return $spyc->dump($array,$indent,$wordwrap);
+    }
+  
+    /**
+     * Load YAML into a PHP array from an instantiated object
+     *
+     * The load method, when supplied with a YAML stream (string or file path), 
+     * will do its best to convert the YAML into a PHP array.  Pretty simple.
+     *  Usage: 
+     *  <code>
+     *   $parser = new Spyc;
+     *   $array  = $parser->load('lucky.yml');
+     *   print_r($array);
+     *  </code>
+     * @access public
+     * @return array
+     * @param string $input Path of YAML file or string containing YAML
+     */
+     public function load($input) {
+      // See what type of input we're talking about
+      // If it's not a file, assume it's a string
+      if (!empty($input) && (strpos($input, "\n") === false) 
+          && file_exists($input)) {
+        $yaml = file($input);
+      } else {
+        $yaml = explode("\n",$input);
+      }
+      // Initiate some objects and values
+      $base              = new pakeYAMLNode;
+      $base->indent      = 0;
+      $this->_lastIndent = 0;
+      $this->_lastNode   = $base->id;
+      $this->_inBlock    = false;
+      $this->_isInline   = false;
+  
+      foreach ($yaml as $linenum => $line) {
+        $ifchk = trim($line);
+
+        // If the line starts with a tab (instead of a space), throw a fit.
+        if (preg_match('/^(\t)+(\w+)/', $line)) {
+          $err = 'ERROR: Line '. ($linenum + 1) .' in your input YAML begins'.
+                 ' with a tab.  YAML only recognizes spaces.  Please reformat.';
+          throw new Exception($err);
+        }
+        
+        if ($this->_inBlock === false && empty($ifchk)) {
+          continue;
+        } elseif ($this->_inBlock == true && empty($ifchk)) {
+          $last =& $this->_allNodes[$this->_lastNode];
+          $last->data[key($last->data)] .= "\n";
+        } elseif ($ifchk{0} != '#' && substr($ifchk,0,3) != '---') {
+          // Create a new node and get its indent
+          $node         = new pakeYAMLNode;
+          $node->indent = $this->_getIndent($line);
+          
+          // Check where the node lies in the hierarchy
+          if ($this->_lastIndent == $node->indent) {
+            // If we're in a block, add the text to the parent's data
+            if ($this->_inBlock === true) {
+              $parent =& $this->_allNodes[$this->_lastNode];
+              $parent->data[key($parent->data)] .= trim($line).$this->_blockEnd;
+            } else {
+              // The current node's parent is the same as the previous node's
+              if (isset($this->_allNodes[$this->_lastNode])) {
+                $node->parent = $this->_allNodes[$this->_lastNode]->parent;
+              }
+            }
+          } elseif ($this->_lastIndent < $node->indent) {            
+            if ($this->_inBlock === true) {
+              $parent =& $this->_allNodes[$this->_lastNode];
+              $parent->data[key($parent->data)] .= trim($line).$this->_blockEnd;
+            } elseif ($this->_inBlock === false) {
+              // The current node's parent is the previous node
+              $node->parent = $this->_lastNode;
+              
+              // If the value of the last node's data was > or | we need to 
+              // start blocking i.e. taking in all lines as a text value until 
+              // we drop our indent.
+              $parent =& $this->_allNodes[$node->parent];
+              $this->_allNodes[$node->parent]->children = true;
+              if (is_array($parent->data)) {
+                $chk = $parent->data[key($parent->data)];
+                if ($chk === '>') {
+                  $this->_inBlock  = true;
+                  $this->_blockEnd = ' ';
+                  $parent->data[key($parent->data)] = 
+                        str_replace('>','',$parent->data[key($parent->data)]);
+                  $parent->data[key($parent->data)] .= trim($line).' ';
+                  $this->_allNodes[$node->parent]->children = false;
+                  $this->_lastIndent = $node->indent;
+                } elseif ($chk === '|') {
+                  $this->_inBlock  = true;
+                  $this->_blockEnd = "\n";
+                  $parent->data[key($parent->data)] =               
+                        str_replace('|','',$parent->data[key($parent->data)]);
+                  $parent->data[key($parent->data)] .= trim($line)."\n";
+                  $this->_allNodes[$node->parent]->children = false;
+                  $this->_lastIndent = $node->indent;
+                }
+              }
+            }
+          } elseif ($this->_lastIndent > $node->indent) {
+            // Any block we had going is dead now
+            if ($this->_inBlock === true) {
+              $this->_inBlock = false;
+              if ($this->_blockEnd = "\n") {
+                $last =& $this->_allNodes[$this->_lastNode];
+                $last->data[key($last->data)] = 
+                      trim($last->data[key($last->data)]);
+              }
+            }
+            
+            // We don't know the parent of the node so we have to find it
+            // foreach ($this->_allNodes as $n) {
+            foreach ($this->_indentSort[$node->indent] as $n) {
+              if ($n->indent == $node->indent) {
+                $node->parent = $n->parent;
+              }
+            }
+          }
+        
+          if ($this->_inBlock === false) {
+            // Set these properties with information from our current node
+            $this->_lastIndent = $node->indent;
+            // Set the last node
+            $this->_lastNode = $node->id;
+            // Parse the YAML line and return its data
+            $node->data = $this->_parseLine($line);
+            // Add the node to the master list
+            $this->_allNodes[$node->id] = $node;
+            // Add a reference to the node in an indent array
+            $this->_indentSort[$node->indent][] =& $this->_allNodes[$node->id];
+            // Add a reference to the node in a References array if this node
+            // has a YAML reference in it.
+            if ( 
+              ( (is_array($node->data)) &&
+                isset($node->data[key($node->data)]) &&
+                (!is_array($node->data[key($node->data)])) )
+              &&
+              ( (preg_match('/^&([^ ]+)/',$node->data[key($node->data)])) 
+                || 
+                (preg_match('/^\*([^ ]+)/',$node->data[key($node->data)])) )
+            ) {
+                $this->_haveRefs[] =& $this->_allNodes[$node->id];
+            } elseif (
+              ( (is_array($node->data)) &&
+                isset($node->data[key($node->data)]) &&
+                 (is_array($node->data[key($node->data)])) )
+            ) {
+              // Incomplete reference making code.  Ugly, needs cleaned up.
+              foreach ($node->data[key($node->data)] as $d) {
+                if ( !is_array($d) && 
+                  ( (preg_match('/^&([^ ]+)/',$d)) 
+                    || 
+                    (preg_match('/^\*([^ ]+)/',$d)) )
+                  ) {
+                    $this->_haveRefs[] =& $this->_allNodes[$node->id];
+                }
+              }
+            }
+          }
+        }
+      }
+      unset($node);
+      
+      // Here we travel through node-space and pick out references (& and *)
+      $this->_linkReferences();
+      
+      // Build the PHP array out of node-space
+      $trunk = $this->_buildArray();
+      return $trunk;
+    }
+  
+    /**
+     * Dump PHP array to YAML
+     *
+     * The dump method, when supplied with an array, will do its best
+     * to convert the array into friendly YAML.  Pretty simple.  Feel free to
+     * save the returned string as tasteful.yml and pass it around.
+     *
+     * Oh, and you can decide how big the indent is and what the wordwrap
+     * for folding is.  Pretty cool -- just pass in 'false' for either if 
+     * you want to use the default.
+     *
+     * Indent's default is 2 spaces, wordwrap's default is 40 characters.  And
+     * you can turn off wordwrap by passing in 0.
+     *
+     * @access public
+     * @return string
+     * @param array $array PHP array
+     * @param int $indent Pass in false to use the default, which is 2 
+     * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40)
+     */
+     public function dump($array,$indent = false,$wordwrap = false) {
+      // Dumps to some very clean YAML.  We'll have to add some more features
+      // and options soon.  And better support for folding.
+
+      // New features and options.
+      if ($indent === false or !is_numeric($indent)) {
+        $this->_dumpIndent = 2;
+      } else {
+        $this->_dumpIndent = $indent;
+      }
+      
+      if ($wordwrap === false or !is_numeric($wordwrap)) {
+        $this->_dumpWordWrap = 40;
+      } else {
+        $this->_dumpWordWrap = $wordwrap;
+      }
+      
+      // New YAML document
+      $string = "---\n";
+      
+      // Start at the base of the array and move through it.
+      foreach ($array as $key => $value) {
+        $string .= $this->_yamlize($key,$value,0);
+      }
+      return $string;
+    }
+  
+    /**** Private Properties ****/
+    
+    /**#@+
+     * @access private
+     * @var mixed
+     */ 
+    private $_haveRefs;
+    private $_allNodes;
+    private $_lastIndent;
+    private $_lastNode;
+    private $_inBlock;
+    private $_isInline;
+    private $_dumpIndent;
+    private $_dumpWordWrap;
+    /**#@+*/
+
+    /**** Private Methods ****/
+    
+    /**
+     * Attempts to convert a key / value array item to YAML
+     * @access private
+     * @return string
+     * @param $key The name of the key
+     * @param $value The value of the item
+     * @param $indent The indent of the current node
+     */    
+     private function _yamlize($key,$value,$indent) {
+      if (is_array($value)) {
+        // It has children.  What to do?
+        // Make it the right kind of item
+        $string = $this->_dumpNode($key,NULL,$indent);
+        // Add the indent
+        $indent += $this->_dumpIndent;
+        // Yamlize the array
+        $string .= $this->_yamlizeArray($value,$indent);
+      } elseif (!is_array($value)) {
+        // It doesn't have children.  Yip.
+        $string = $this->_dumpNode($key,$value,$indent);
+      }
+      return $string;
+    }
+    
+    /**
+     * Attempts to convert an array to YAML
+     * @access private
+     * @return string
+     * @param $array The array you want to convert
+     * @param $indent The indent of the current level
+     */ 
+     private function _yamlizeArray($array,$indent) {
+      if (is_array($array)) {
+        $string = '';
+        foreach ($array as $key => $value) {
+          $string .= $this->_yamlize($key,$value,$indent);
+        }
+        return $string;
+      } else {
+        return false;
+      }
+    }
+  
+    /**
+     * Returns YAML from a key and a value
+     * @access private
+     * @return string
+     * @param $key The name of the key
+     * @param $value The value of the item
+     * @param $indent The indent of the current node
+     */ 
+     private function _dumpNode($key,$value,$indent) {
+      // do some folding here, for blocks
+      if (strpos($value,"\n")) {
+        $value = $this->_doLiteralBlock($value,$indent);
+      } else {  
+        $value  = $this->_doFolding($value,$indent);
+      }
+      
+      $spaces = str_repeat(' ',$indent);
+
+      if (is_int($key)) {
+        // It's a sequence
+        $string = $spaces.'- '.$value."\n";
+      } else {
+        // It's mapped
+        $string = $spaces.$key.': '.$value."\n";
+      }
+      return $string;
+    }
+
+    /**
+     * Creates a literal block for dumping
+     * @access private
+     * @return string
+     * @param $value 
+     * @param $indent int The value of the indent
+     */ 
+     private function _doLiteralBlock($value,$indent) {
+      $exploded = explode("\n",$value);
+      $newValue = '|';
+      $indent  += $this->_dumpIndent;
+      $spaces   = str_repeat(' ',$indent);
+      foreach ($exploded as $line) {
+        $newValue .= "\n" . $spaces . trim($line);
+      }
+      return $newValue;
+    }
+    
+    /**
+     * Folds a string of text, if necessary
+     * @access private
+     * @return string
+     * @param $value The string you wish to fold
+     */
+     private function _doFolding($value,$indent) {
+      // Don't do anything if wordwrap is set to 0
+      if ($this->_dumpWordWrap === 0) {
+        return $value;
+      }
+      
+      if (strlen($value) > $this->_dumpWordWrap) {
+        $indent += $this->_dumpIndent;
+        $indent = str_repeat(' ',$indent);
+        $wrapped = wordwrap($value,$this->_dumpWordWrap,"\n$indent");
+        $value   = ">\n".$indent.$wrapped;
+      }
+      return $value;
+    }
+  
+    /* Methods used in loading */
+    
+    /**
+     * Finds and returns the indentation of a YAML line
+     * @access private
+     * @return int
+     * @param string $line A line from the YAML file
+     */
+     private function _getIndent($line) {
+      preg_match('/^\s{1,}/',$line,$match);
+      if (!empty($match[0])) {
+        $indent = substr_count($match[0],' ');
+      } else {
+        $indent = 0;
+      }
+      return $indent;
+    }
+
+    /**
+     * Parses YAML code and returns an array for a node
+     * @access private
+     * @return array
+     * @param string $line A line from the YAML file
+     */
+     private function _parseLine($line) {
+      $line = trim($line);  
+
+      $array = array();
+
+      if (preg_match('/^-(.*):$/',$line)) {
+        // It's a mapped sequence
+        $key         = trim(substr(substr($line,1),0,-1));
+        $array[$key] = '';
+      } elseif ($line[0] == '-' && substr($line,0,3) != '---') {
+        // It's a list item but not a new stream
+        if (strlen($line) > 1) {
+          $value   = trim(substr($line,1));
+          // Set the type of the value.  Int, string, etc
+          $value   = $this->_toType($value);
+          $array[] = $value;
+        } else {
+          $array[] = array();
+        }
+      } elseif (preg_match('/^(.+):/',$line,$key)) {
+        // It's a key/value pair most likely
+        // If the key is in double quotes pull it out
+        if (preg_match('/^(["\'](.*)["\'](\s)*:)/',$line,$matches)) {
+          $value = trim(str_replace($matches[1],'',$line));
+          $key   = $matches[2];
+        } else {
+          // Do some guesswork as to the key and the value
+          $explode = explode(':',$line);
+          $key     = trim($explode[0]);
+          array_shift($explode);
+          $value   = trim(implode(':',$explode));
+        }
+
+        // Set the type of the value.  Int, string, etc
+        $value = $this->_toType($value);
+        if (empty($key)) {
+          $array[]     = $value;
+        } else {
+          $array[$key] = $value;
+        }
+      }
+      return $array;
+    }
+    
+    /**
+     * Finds the type of the passed value, returns the value as the new type.
+     * @access private
+     * @param string $value
+     * @return mixed
+     */
+     private function _toType($value) {
+      if (preg_match('/^("(.*)"|\'(.*)\')/',$value,$matches)) {        
+       $value = (string)preg_replace('/(\'\'|\\\\\')/',"'",end($matches));
+       $value = preg_replace('/\\\\"/','"',$value);
+      } elseif (preg_match('/^\\[(.+)\\]$/',$value,$matches)) {
+        // Inline Sequence
+
+        // Take out strings sequences and mappings
+        $explode = $this->_inlineEscape($matches[1]);
+        
+        // Propogate value array
+        $value  = array();
+        foreach ($explode as $v) {
+          $value[] = $this->_toType($v);
+        }
+      } elseif (strpos($value,': ')!==false && !preg_match('/^{(.+)/',$value)) {
+          // It's a map
+          $array = explode(': ',$value);
+          $key   = trim($array[0]);
+          array_shift($array);
+          $value = trim(implode(': ',$array));
+          $value = $this->_toType($value);
+          $value = array($key => $value);
+      } elseif (preg_match("/{(.+)}$/",$value,$matches)) {
+        // Inline Mapping
+
+        // Take out strings sequences and mappings
+        $explode = $this->_inlineEscape($matches[1]);
+
+        // Propogate value array
+        $array = array();
+        foreach ($explode as $v) {
+          $array = $array + $this->_toType($v);
+        }
+        $value = $array;
+      } elseif (strtolower($value) == 'null' or $value == '' or $value == '~') {
+        $value = NULL;
+      } elseif (ctype_digit($value)) {
+        $value = (int)$value;
+      } elseif (in_array(strtolower($value), 
+                  array('true', 'on', '+', 'yes', 'y'))) {
+        $value = TRUE;
+      } elseif (in_array(strtolower($value), 
+                  array('false', 'off', '-', 'no', 'n'))) {
+        $value = FALSE;
+      } elseif (is_numeric($value)) {
+        $value = (float)$value;
+      } else {
+        // Just a normal string, right?
+        $value = trim(preg_replace('/#(.+)$/','',$value));
+      }
+      
+      return $value;
+    }
+    
+    /**
+     * Used in inlines to check for more inlines or quoted strings
+     * @access private
+     * @return array
+     */
+     private function _inlineEscape($inline) {
+      // There's gotta be a cleaner way to do this...
+      // While pure sequences seem to be nesting just fine,
+      // pure mappings and mappings with sequences inside can't go very
+      // deep.  This needs to be fixed.
+      
+      // Check for strings      
+      $regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/';
+      if (preg_match_all($regex,$inline,$strings)) {
+        $strings = $strings[2];
+        $inline  = preg_replace($regex,'YAMLString',$inline); 
+      }
+      unset($regex);
+
+      // Check for sequences
+      if (preg_match_all('/\[(.+)\]/U',$inline,$seqs)) {
+        $inline = preg_replace('/\[(.+)\]/U','YAMLSeq',$inline);
+        $seqs   = $seqs[0];
+      }
+      
+      // Check for mappings
+      if (preg_match_all('/{(.+)}/U',$inline,$maps)) {
+        $inline = preg_replace('/{(.+)}/U','YAMLMap',$inline);
+        $maps   = $maps[0];
+      }
+      
+      $explode = explode(', ',$inline);
+      
+      // Re-add the strings
+      if (!empty($strings)) {
+        $i = 0;
+        foreach ($explode as $key => $value) {
+          if ($value == 'YAMLString') {
+            $explode[$key] = $strings[$i];
+            ++$i;
+          }
+        }
+      }
+      
+      // Re-add the sequences
+      if (!empty($seqs)) {
+        $i = 0;
+        foreach ($explode as $key => $value) {
+          if (strpos($value,'YAMLSeq') !== false) {
+            $explode[$key] = str_replace('YAMLSeq',$seqs[$i],$value);
+            ++$i;
+          }
+        }
+      }
+      
+      // Re-add the mappings
+      if (!empty($maps)) {
+        $i = 0;
+        foreach ($explode as $key => $value) {
+          if (strpos($value,'YAMLMap') !== false) {
+            $explode[$key] = str_replace('YAMLMap',$maps[$i],$value);
+            ++$i;
+          }
+        }
+      }
+      
+      return $explode;
+    }
+  
+    /**
+     * Builds the PHP array from all the YAML nodes we've gathered
+     * @access private
+     * @return array
+     */
+     private function _buildArray() {
+      $trunk = array();
+
+      if (!isset($this->_indentSort[0])) {
+        return $trunk;
+      }
+
+      foreach ($this->_indentSort[0] as $n) {
+        if (empty($n->parent)) {
+          $this->_nodeArrayizeData($n);
+          // Check for references and copy the needed data to complete them.
+          $this->_makeReferences($n);
+          // Merge our data with the big array we're building
+          $trunk = $this->_array_kmerge($trunk,$n->data);
+        }
+      }
+      
+      return $trunk;
+    }
+  
+    /**
+     * Traverses node-space and sets references (& and *) accordingly
+     * @access private
+     * @return bool
+     */
+     private function _linkReferences() {
+      if (is_array($this->_haveRefs)) {
+        foreach ($this->_haveRefs as $node) {
+          if (!empty($node->data)) {
+            $key = key($node->data);
+            // If it's an array, don't check.
+            if (is_array($node->data[$key])) {  
+              foreach ($node->data[$key] as $k => $v) {
+                $this->_linkRef($node,$key,$k,$v);
+              }
+            } else {
+              $this->_linkRef($node,$key);
+            }
+          }
+        } 
+      }
+      return true;
+    }
+    
+    function _linkRef(&$n,$key,$k = NULL,$v = NULL) {
+      if (empty($k) && empty($v)) {
+        // Look for &refs
+        if (preg_match('/^&([^ ]+)/',$n->data[$key],$matches)) {
+          // Flag the node so we know it's a reference
+          $this->_allNodes[$n->id]->ref = substr($matches[0],1);
+          $this->_allNodes[$n->id]->data[$key] = 
+                   substr($n->data[$key],strlen($matches[0])+1);
+        // Look for *refs
+        } elseif (preg_match('/^\*([^ ]+)/',$n->data[$key],$matches)) {
+          $ref = substr($matches[0],1);
+          // Flag the node as having a reference
+          $this->_allNodes[$n->id]->refKey =  $ref;
+        }
+      } elseif (!empty($k) && !empty($v)) {
+        if (preg_match('/^&([^ ]+)/',$v,$matches)) {
+          // Flag the node so we know it's a reference
+          $this->_allNodes[$n->id]->ref = substr($matches[0],1);
+          $this->_allNodes[$n->id]->data[$key][$k] = 
+                              substr($v,strlen($matches[0])+1);
+        // Look for *refs
+        } elseif (preg_match('/^\*([^ ]+)/',$v,$matches)) {
+          $ref = substr($matches[0],1);
+          // Flag the node as having a reference
+          $this->_allNodes[$n->id]->refKey =  $ref;
+        }
+      }
+    }
+  
+    /**
+     * Finds the children of a node and aids in the building of the PHP array
+     * @access private
+     * @param int $nid The id of the node whose children we're gathering
+     * @return array
+     */
+     private function _gatherChildren($nid) {
+      $return = array();
+      $node   =& $this->_allNodes[$nid];
+      foreach ($this->_allNodes as $z) {
+        if ($z->parent == $node->id) {
+          // We found a child
+          $this->_nodeArrayizeData($z);
+          // Check for references
+          $this->_makeReferences($z);
+          // Merge with the big array we're returning
+          // The big array being all the data of the children of our parent node
+          $return = $this->_array_kmerge($return,$z->data);
+        }
+      }
+      return $return;
+    }
+  
+    /**
+     * Turns a node's data and its children's data into a PHP array
+     *
+     * @access private
+     * @param array $node The node which you want to arrayize
+     * @return boolean
+     */
+     private function _nodeArrayizeData(&$node) {
+      if (is_array($node->data) && $node->children == true) {
+        // This node has children, so we need to find them
+        $childs = $this->_gatherChildren($node->id);
+        // We've gathered all our children's data and are ready to use it
+        $key = key($node->data);
+        $key = empty($key) ? 0 : $key;
+        // If it's an array, add to it of course
+        if (is_array($node->data[$key])) {
+          $node->data[$key] = $this->_array_kmerge($node->data[$key],$childs);
+        } else {
+          $node->data[$key] = $childs;
+        }
+      } elseif (!is_array($node->data) && $node->children == true) {
+        // Same as above, find the children of this node
+        $childs       = $this->_gatherChildren($node->id);
+        $node->data   = array();
+        $node->data[] = $childs;
+      }
+
+      // We edited $node by reference, so just return true
+      return true;
+    }
+
+    /**
+     * Traverses node-space and copies references to / from this object.
+     * @access private
+     * @param object $z A node whose references we wish to make real
+     * @return bool
+     */
+     private function _makeReferences(&$z) {
+      // It is a reference
+      if (isset($z->ref)) {
+        $key                = key($z->data);
+        // Copy the data to this object for easy retrieval later
+        $this->ref[$z->ref] =& $z->data[$key];
+      // It has a reference
+      } elseif (isset($z->refKey)) {
+        if (isset($this->ref[$z->refKey])) {
+          $key           = key($z->data);
+          // Copy the data from this object to make the node a real reference
+          $z->data[$key] =& $this->ref[$z->refKey];
+        }
+      }
+      return true;
+    }
+  
+
+    /**
+     * Merges arrays and maintains numeric keys.
+     *
+     * An ever-so-slightly modified version of the array_kmerge() function posted
+     * to php.net by mail at nospam dot iaindooley dot com on 2004-04-08.
+     *
+     * http://us3.php.net/manual/en/function.array-merge.php#41394
+     *
+     * @access private
+     * @param array $arr1
+     * @param array $arr2
+     * @return array
+     */
+     private function _array_kmerge($arr1,$arr2) { 
+      if(!is_array($arr1)) 
+        $arr1 = array(); 
+
+      if(!is_array($arr2))
+        $arr2 = array(); 
+    
+      $keys1 = array_keys($arr1); 
+      $keys2 = array_keys($arr2); 
+      $keys  = array_merge($keys1,$keys2); 
+      $vals1 = array_values($arr1); 
+      $vals2 = array_values($arr2); 
+      $vals  = array_merge($vals1,$vals2); 
+      $ret   = array(); 
+
+      foreach($keys as $key) { 
+        list($unused,$val) = each($vals);
+        // This is the good part!  If a key already exists, but it's part of a
+        // sequence (an int), just keep addin numbers until we find a fresh one.
+        if (isset($ret[$key]) and is_int($key)) {
+          while (array_key_exists($key, $ret)) {
+            $key++;
+          }
+        }  
+        $ret[$key] = $val; 
+      } 
+
+      return $ret; 
+    }
+  }


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/pakeYaml.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/pakePearTask.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/pakePearTask.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/pakePearTask.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakePearTask.class.php 1791 2006-08-23 21:17:06Z fabien $
+ */
+
+class pakePearTask
+{
+  public static function import_default_tasks()
+  {
+    pake_desc('create a PEAR package');
+    pake_task('pakePearTask::pear');
+  }
+
+  public static function run_pear($task, $args)
+  {
+    $results = pake_sh('pear package');
+    if ($task->is_verbose())
+    {
+      echo $results;
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/pakePearTask.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/pakePhingTask.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/pakePhingTask.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/pakePhingTask.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,85 @@
+<?php
+
+/**
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakePhingTask.class.php 1846 2006-08-25 12:35:26Z fabien $
+ */
+
+include_once 'phing/Phing.php';
+if (!class_exists('Phing'))
+{
+  throw new pakeException('You must install Phing to use this task. (pear install http://phing.info/pear/phing-current.tgz)');
+}
+
+class pakePhingTask
+{
+  public static function import_default_tasks()
+  {
+  }
+
+  public static function call_phing($task, $target, $build_file = '', $options = array())
+  {
+    $args = array();
+    foreach ($options as $key => $value)
+    {
+      $args[] = "-D$key=$value";
+    }
+
+    if ($build_file)
+    {
+      $args[] = '-f';
+      $args[] = realpath($build_file);
+    }
+
+    if (!$task->is_verbose())
+    {
+      $args[] = '-q';
+    }
+
+    if (is_array($target))
+    {
+      $args = array_merge($args, $target);
+    }
+    else
+    {
+      $args[] = $target;
+    }
+
+    Phing::startup();
+    Phing::setProperty('phing.home', getenv('PHING_HOME'));
+
+    ob_start(array('pakePhingTask', 'colorize'), 2);
+    $m = new pakePhing();
+    $m->execute($args);
+    $m->runBuild();
+    ob_end_clean();
+  }
+
+  public static function colorize($text)
+  {
+    return preg_replace(array(
+      '#\[(.+?)\]#',
+      '#{{PHP Error}}#e',
+      '#({{.+?}})#e',
+      '#(\+ [^ ]+)#e',
+      '#{{(.+?)}}#',
+    ), array(
+      '{{$1}}',
+      'pakeColor::colorize("(PHP Error)", "ERROR")',
+      'pakeColor::colorize("$1", "INFO")',
+      'pakeColor::colorize("$1", "INFO")',
+      '[$1]',
+    ), $text);
+  }
+}
+
+class pakePhing extends Phing
+{
+  function getPhingVersion()
+  {
+    return 'pakePhing';
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/pakePhingTask.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/pakeSimpletestTask.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/pakeSimpletestTask.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/pakeSimpletestTask.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,112 @@
+<?php
+
+/**
+ * @package    pake
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @copyright  2004-2005 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @license    see the LICENSE file included in the distribution
+ * @version    SVN: $Id: pakeSimpletestTask.class.php 1791 2006-08-23 21:17:06Z fabien $
+ */
+
+class pakeSimpletestTask
+{
+  public static function import_default_tasks()
+  {
+    pake_desc('launch project test suite');
+    pake_task('pakeSimpletestTask::test');
+  }
+
+  public static function call_simpletest($task, $type = 'text', $dirs = array())
+  {
+    // remove E_STRICT because simpletest is not E_STRICT compatible
+    $old_error_reporting = ini_get('error_reporting');
+    if ($old_error_reporting & E_STRICT)
+    {
+      error_reporting($old_error_reporting ^ E_STRICT);
+    }
+
+    set_include_path('test'.PATH_SEPARATOR.'lib'.PATH_SEPARATOR.'classes'.PATH_SEPARATOR.get_include_path());
+
+    include_once('simpletest/unit_tester.php');
+    include_once('simpletest/web_tester.php');
+    if (!class_exists('GroupTest'))
+    {
+      throw new pakeException('You must install SimpleTest to use this task.');
+    }
+
+    require_once('simpletest/reporter.php');
+    require_once('simpletest/mock_objects.php');
+
+    $base_test_dir = 'test';
+    $test_dirs = array();
+
+    // run tests only in these subdirectories
+    if ($dirs)
+    {
+      foreach ($dirs as $dir)
+      {
+        $test_dirs[] = $base_test_dir.DIRECTORY_SEPARATOR.$dir;
+      }
+    }
+    else
+    {
+      $test_dirs[] = $base_test_dir;
+    }
+
+    $test = new GroupTest('Test suite in ('.implode(', ', $test_dirs).')');
+    $files = pakeFinder::type('file')->name('*Test.php')->in($test_dirs);
+    foreach ($files as $file)
+    {
+      $test->addTestFile($file);
+    }
+
+    if (count($files))
+    {
+      ob_start();
+      if ($type == 'html')
+      {
+        $result = $test->run(new HtmlReporter());
+      }
+      else if ($type == 'xml')
+      {
+        $result = $test->run(new XmlReporter());
+      }
+      else
+      {
+        $result = $test->run(new TextReporter());
+      }
+      $content = ob_get_contents();
+      ob_end_clean();
+
+      if ($task->is_verbose())
+      {
+        echo $content;
+      }
+    }
+    else
+    {
+      throw new pakeException('No test to run.');
+    }
+
+    error_reporting($old_error_reporting);
+  }
+
+  public static function run_test($task, $args)
+  {
+    $types = array('text', 'html', 'xml');
+    $type = 'text';
+    if (array_key_exists(0, $args) && in_array($args[0], $types))
+    {
+      $type = $args[0];
+      array_shift($args);
+    }
+
+    $dirs = array();
+    if (is_array($args) && array_key_exists(0, $args))
+    {
+      $dirs[] = $args[0];
+    }
+
+    self::call_simpletest($task, $type, $dirs);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/pake/tasks/pakeSimpletestTask.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/patch/propel-generator-1.patch
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/patch/propel-generator-1.patch	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/patch/propel-generator-1.patch	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,39 @@
+Index: lib/vendor/propel-generator/classes/propel/engine/database/model/AppData.php
+===================================================================
+--- lib/vendor/propel-generator/classes/propel/engine/database/model/AppData.php	(revision 3150)
++++ lib/vendor/propel-generator/classes/propel/engine/database/model/AppData.php	(working copy)
+@@ -95,7 +95,7 @@
+      */
+     public function getShortName()
+     {
+-        return str_replace("-schema", "", $name);
++        return str_replace("-schema", "", $this->name);
+     }
+ 
+     /**
+Index: lib/vendor/propel-generator/classes/propel/engine/database/model/Table.php
+===================================================================
+--- lib/vendor/propel-generator/classes/propel/engine/database/model/Table.php	(revision 3150)
++++ lib/vendor/propel-generator/classes/propel/engine/database/model/Table.php	(working copy)
+@@ -1015,7 +1015,7 @@
+ 
+         if ($this->abstractValue) {
+             $result .= " abstract=\""
+-                  . ($abstractValue ? "true" : "false")
++                  . ($this->abstractValue ? "true" : "false")
+                   . '"';
+         }
+ 
+Index: lib/vendor/propel-generator/classes/propel/phing/PropelSQLExec.php
+===================================================================
+--- lib/vendor/propel-generator/classes/propel/phing/PropelSQLExec.php	(revision 3150)
++++ lib/vendor/propel-generator/classes/propel/phing/PropelSQLExec.php	(working copy)
+@@ -667,7 +667,7 @@
+     {
+         if (!empty($this->tSqlCommand)) {
+             $this->parent->log("Executing commands", PROJECT_MSG_INFO);
+-            $this->parent->runStatements($tSqlCommand, $out);
++            $this->parent->runStatements($this->tSqlCommand, $out);
+         }
+ 
+         if ($this->tSrcFile !== null) {

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/BuildEvent.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/BuildEvent.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/BuildEvent.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,205 @@
+<?php
+/*
+ *  $Id: BuildEvent.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/system/lang/EventObject.php';
+
+/**
+ * Encapsulates a build specific event.
+ *
+ * <p>We have three sources of events all handled by this class:
+ * 
+ * <ul>
+ *  <li>Project level events</li>
+ *  <li>Target level events</li>
+ *  <li>Task level events</li>
+ * </ul>
+ *
+ * <p> Events are all fired from the project class by creating an event object
+ * using this class and passing it to the listeners.
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.10 $
+ * @package   phing
+ */
+class BuildEvent extends EventObject {
+
+    /**
+     *  A reference to the project
+     *  @var Project
+     */
+    protected $project;
+
+    /**
+     *  A reference to the target
+     *  @var Target
+     */
+    protected $target;
+
+    /**
+     *  A reference to the task
+     *
+     *  @var Task
+     */
+    protected $task;
+
+    /**
+     *  The message of this event, if the event is a message
+     *  @var    string
+     *  @access private
+     */
+    protected $message = null;
+
+    /**
+     *  The priority of the message
+     *
+     *  @var    string
+     *  @see    $message
+     *  @access private
+     */
+    protected $priority = PROJECT_MSG_VERBOSE;
+
+    /**
+     *  The execption that caused the event, if any
+     *
+     *  @var    object
+     *  @access private
+     */
+    protected $exception = null;
+
+    /**
+     *  Construct a BuildEvent for a project, task or target source event
+     *
+     *  @param  object  project the project that emitted the event.
+     *  @access public
+     */
+    function __construct($source) {
+        parent::__construct($source);
+        if ($source instanceof Project) {
+            $this->project = $source;
+            $this->target = null;
+            $this->task = null;
+        } elseif ($source instanceof Target) {
+            $this->project = $source->getProject();
+            $this->target = $source;
+            $this->task = null;
+        } elseif ($source instanceof Task) {
+            $this->project = $source->getProject();
+            $this->target = $source->getOwningTarget();
+            $this->task = $source;
+        } else {
+            throw new Exception("Can not construct BuildEvent, unknown source given.");
+        }
+    }
+
+    /**
+     *  Sets the message with details and the message priority for this event.
+     *
+     *  @param  string   The string message of the event
+     *  @param  integer  The priority this message should have
+     */
+    function setMessage($message, $priority) {
+        $this->message = (string) $message;
+        $this->priority = (int) $priority;
+    }
+
+    /**
+     *  Set the exception that was the cause of this event.
+     *
+     *  @param  Exception The exception that caused the event
+     */
+    function setException($exception) {
+        $this->exception = $exception;
+    }
+
+    /**
+     *  Returns the project instance that fired this event.
+     *
+     *  The reference to the project instance is set by the constructor if this
+     *  event was fired from the project class.
+     *
+     *  @return  Project  The project instance that fired this event
+     */
+    function getProject() {
+        return $this->project;
+    }
+
+    /**
+     *  Returns the target instance that fired this event.
+     *
+     *  The reference to the target instance is set by the constructor if this
+     *  event was fired from the target class.
+     *
+     *  @return  object  The target that fired this event
+     *  @access  public
+     */
+    function getTarget() {
+        return $this->target;
+    }
+
+    /**
+     *  Returns the target instance that fired this event.
+     *
+     *  The reference to the task instance is set by the constructor if this
+     *  event was fired within a task.
+     *
+     *  @return  object  The task that fired this event
+     *  @access  public
+     */
+    function getTask() {
+        return $this->task;
+    }
+
+    /**
+     *  Returns the logging message. This field will only be set for
+     *  "messageLogged" events.
+     *
+     *  @return  string   The log message
+     *  @access  public
+     */
+    function getMessage() {
+        return $this->message;
+    }
+
+    /**
+     *  Returns the priority of the logging message. This field will only
+     *  be set for "messageLogged" events.
+     *
+     *  @return  integer  The message priority
+     *  @access  public
+     */
+    function getPriority() {
+        return $this->priority;
+    }
+
+    /**
+     *  Returns the exception that was thrown, if any.
+     *  This field will only be set for "taskFinished", "targetFinished", and
+     *  "buildFinished" events.
+     *
+     *  @see BuildListener::taskFinished()
+     *  @see BuildListener::targetFinished()
+     *  @see BuildListener::buildFinished()
+     */
+    function getException() {
+        return $this->exception;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/BuildEvent.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/BuildException.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/BuildException.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/BuildException.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,100 @@
+<?php
+/*
+ *  $Id: BuildException.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+/**
+ * BuildException is for when things go wrong in a build execution.
+ *
+ * @author   Andreas Aderhold <andi en binarycloud.com>
+ * @version  $Revision: 1.12 $
+ * @package  phing
+ */
+class BuildException extends Exception {
+
+    /** location in the xml file */
+    protected $location = null; 
+            
+    /** The nested "cause" exception. */
+    protected $cause;
+    
+    /**
+     * Construct a BuildException.
+     * Supported signatures:
+     *         throw new BuildException($causeExc);
+     *         throw new BuildException($msg);
+     *         throw new Buildexception($causeExc, $loc);
+     *         throw new BuildException($msg, $causeExc);
+     *         throw new BuildException($msg, $loc);
+     *         throw new BuildException($msg, $causeExc, $loc);
+     */
+    function __construct($p1, $p2 = null, $p3 = null) {        
+        
+        $cause = null;
+        $loc = null;
+        $msg = "";
+        
+        if ($p3 !== null) {
+            $cause = $p2;
+            $loc = $p3;
+            $msg = $p1;
+        } elseif ($p2 !== null) {
+            if ($p2 instanceof Exception) {
+                $cause = $p2;
+                $msg = $p1;
+            } elseif ($p2 instanceof Location) {
+                $loc = $p2;
+                if ($p1 instanceof Exception) {
+                    $cause = $p1;
+                } else {
+                    $msg = $p1;
+                }
+            }
+        } elseif ($p1 instanceof Exception) {
+            $cause = $p1;
+        } else {
+            $msg = $p1;
+        }
+        
+        parent::__construct($msg);
+        
+        if ($cause !== null) {
+            $this->cause = $cause;
+            $this->message .= " [wrapped: " . $cause->getMessage() ."]";
+        }
+        
+        if ($loc !== null) {
+            $this->setLocation($loc);
+        }                
+    }
+    
+    function getCause() {
+        return $this->cause;
+    }
+    
+    function getLocation() {
+        return $this->location;
+    }
+
+    function setLocation($loc) {        
+        $this->location = $loc;
+        $this->message = $loc->toString() . ': ' . $this->message;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/BuildException.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/BuildListener.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/BuildListener.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/BuildListener.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,91 @@
+<?php
+/*
+ *  $Id: BuildListener.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ * Interface for build listeners.
+ *
+ * Classes that implement a listener must extend this class and (faux)implement
+ * all methods that are decleard as dummies below.
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.6 $
+ * @see       BuildEvent
+ * @see       Project::addBuildListener()
+ * @package   phing
+ */
+interface BuildListener {
+
+    /**
+     * Fired before any targets are started.
+     *
+     * @param BuildEvent The BuildEvent
+     */
+    function buildStarted(BuildEvent $event);
+
+    /**
+     * Fired after the last target has finished.
+     *
+     * @param BuildEvent The BuildEvent
+     * @see BuildEvent::getException()
+     */
+    function buildFinished(BuildEvent $event);
+
+    /**
+     * Fired when a target is started.
+     *
+     * @param BuildEvent The BuildEvent
+     * @see BuildEvent::getTarget()
+     */
+    function targetStarted(BuildEvent $event);
+
+    /**
+     * Fired when a target has finished.
+     *
+     * @param BuildEvent The BuildEvent
+     * @see BuildEvent#getException()
+     */
+    function targetFinished(BuildEvent $event);
+
+    /**
+     * Fired when a task is started.
+     *
+     * @param BuildEvent The BuildEvent
+     * @see BuildEvent::getTask()
+     */
+    function taskStarted(BuildEvent $event);
+
+    /**
+     *  Fired when a task has finished.
+     *
+     *  @param BuildEvent The BuildEvent
+     *  @see BuildEvent::getException()
+     */
+    function taskFinished(BuildEvent $event);
+
+    /**
+     *  Fired whenever a message is logged.
+     *
+     *  @param BuildEvent The BuildEvent
+     *  @see BuildEvent::getMessage()
+     */
+    function messageLogged(BuildEvent $event);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/BuildListener.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/IntrospectionHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/IntrospectionHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/IntrospectionHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,542 @@
+<?php
+
+/*
+ *  $Id: IntrospectionHelper.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/types/Reference.php';
+include_once 'phing/types/Path.php';
+include_once 'phing/util/StringHelper.php';
+
+/**
+ * Helper class that collects the methods that a task or nested element
+ * holds to set attributes, create nested elements or hold PCDATA
+ * elements.
+ *
+ *<ul>
+ * <li><strong>SMART-UP INLINE DOCS</strong></li>
+ * <li><strong>POLISH-UP THIS CLASS</strong></li>
+ *</ul>
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @copyright © 2001,2002 THYRELL. All rights reserved
+ * @version   $Revision: 1.19 $
+ * @package   phing
+ */
+class IntrospectionHelper {
+
+
+
+    /** 
+     * Holds the attribute setter methods.
+     * 
+     * @var array string[]
+     */
+    private $attributeSetters = array();
+
+    /**  
+     * Holds methods to create nested elements. 
+     *
+     * @var array string[]
+     */
+    private $nestedCreators = array();
+
+    /**
+     * Holds methods to store configured nested elements. 
+     *
+     * @var array string[]
+     */
+    private $nestedStorers = array();
+    
+    /**
+     * Map from attribute names to nested types.
+     */
+    private $nestedTypes = array();
+        
+    /**
+     * New idea in phing: any class can register certain
+     * keys -- e.g. "task.current_file" -- which can be used in
+     * task attributes, if supported.  In the build XML these
+     * are referred to like this:
+     *         <regexp pattern="\n" replace="%{task.current_file}"/>
+     * In the type/task a listener method must be defined:
+     *         function setListeningReplace($slot) {}
+     * @var array string[]
+      */
+    private $slotListeners = array();
+    
+    /** 
+     * The method to add PCDATA stuff. 
+     *
+     * @var string Method name of the addText (redundant?) method, if class supports it :)
+     */
+    private $methodAddText = null;
+
+    /**
+     * The Class that's been introspected.
+     *
+     * @var     object
+     * @access  private
+     */
+    private $bean;
+    
+    /**
+     * The cache of IntrospectionHelper classes instantiated by getHelper().
+     * @var array IntrospectionHelpers[]
+     */
+    private static $helpers = array();
+    
+    /** 
+     * Factory method for helper objects. 
+     *
+     * @param string $class The class to create a Helper for
+     */
+    public static function getHelper($class) {
+        if (!isset(self::$helpers[$class])) {
+            self::$helpers[$class] = new IntrospectionHelper($class);
+        }
+        return self::$helpers[$class];
+    }
+
+    /**
+     * This function constructs a new introspection helper for a specific class.
+     * 
+     * This method loads all methods for the specified class and categorizes them
+     * as setters, creators, slot listeners, etc.  This way, the setAttribue() doesn't
+     * need to perform any introspection -- either the requested attribute setter/creator
+     * exists or it does not & a BuildException is thrown.
+     * 
+     * @param string $bean The classname for this IH.
+     */
+    function __construct($class) {
+    
+        $this->bean = new ReflectionClass($class);
+        
+        //$methods = get_class_methods($bean);
+        foreach($this->bean->getMethods() as $method) {
+        
+            if ($method->isPublic()) {                
+            
+                // We're going to keep case-insensitive method names
+                // for as long as we're allowed :)  It makes it much
+                // easier to map XML attributes to PHP class method names.
+                $name = strtolower($method->getName());
+                
+                // There are a few "reserved" names that might look like attribute setters
+                // but should actually just be skipped.  (Note: this means you can't ever
+                // have an attribute named "location" or "tasktype" or a nested element named "task".)
+                if ($name === "setlocation" || $name === "settasktype" || $name === "addtask") {
+                    continue;
+                }
+                
+                if ($name === "addtext") {
+                    
+                    $this->methodAddText = $method;
+                    
+                } elseif (strpos($name, "setlistening") === 0) {
+                    
+                    // Phing supports something unique called "RegisterSlots"
+                    // These are dynamic values that use a basic slot system so that
+                    // classes can register to listen to specific slots, and the value
+                    // will always be grabbed from the slot (and never set in the project
+                    // component).  This is useful for things like tracking the current
+                    // file being processed by a filter (e.g. AppendTask sets an append.current_file
+                    // slot, which can be ready by the XSLTParam type.)
+                    
+                    if (count($method->getParameters()) !== 1) {
+                        throw new BuildException($method->getDeclaringClass()->getName()."::".$method->getName()."() must take exactly one parameter.");
+                    }
+                                                
+                    $this->slotListeners[$name] = $method;
+                    
+                } elseif (strpos($name, "set") === 0) {
+                    
+                    // A standard attribute setter.
+                    
+                    if (count($method->getParameters()) !== 1) {
+                        throw new BuildException($method->getDeclaringClass()->getName()."::".$method->getName()."() must take exactly one parameter.");
+                    }
+                    
+                    $this->attributeSetters[$name] = $method;
+                    
+                } elseif (strpos($name, "create") === 0) {                            
+                    
+                    if (count($method->getParameters()) > 0) {
+                        throw new BuildException($method->getDeclaringClass()->getName()."::".$method->getName()."() may not take any parameters.");
+                    }
+                    
+                    // Because PHP doesn't support return types, we are going to do
+                    // two things here to guess return type:
+                    //     1) parse comments for an explicit value
+                    //     2) if that fails, assume that the part of the method after "create"
+                    //    is the name of the return type (in many cases it is not)
+                    
+                    // This isn't super important -- i.e. we're not instantaiting classes
+                    // based on this information.  It's more just so that IntrospectionHelper
+                    // can keep track of all the nested types -- and provide more helpful
+                    // exception messages, etc.
+                                
+                    preg_match('/@return[\s]+([\w]+)/', $method->getDocComment(), $matches);
+                    if (!empty($matches[1]) && class_exists($matches[1], false)) {
+                        $this->nestedTypes[$name] = $matches[1];
+                    } else {                    
+                        // assume that method createEquals() creates object of type "Equals"
+                        // (that example would be false, of course)                    
+                        $this->nestedTypes[$name] = $this->getPropertyName($name, "create");
+                    }
+                    
+                    $this->nestedCreators[$name] = $method;
+                    
+                } elseif (strpos($name, "addconfigured") === 0) {
+                    
+                    // *must* use class hints if using addConfigured ...
+                    
+                    // 1 param only
+                    $params = $method->getParameters();
+                    
+                    if (count($params) < 1) {
+                        throw new BuildException($method->getDeclaringClass()->getName()."::".$method->getName()."() must take at least one parameter.");
+                    }
+                    
+                    if (count($params) > 1) {
+                        $this->warn($method->getDeclaringClass()->getName()."::".$method->getName()."() takes more than one parameter. (IH only uses the first)");
+                    }
+                    
+                    $classname = null;
+                    
+                    if (($hint = $params[0]->getClass()) !== null) { 
+                        $classname = $hint->getName();    
+                    }                    
+                    
+                    if ($classname === null) {
+                        throw new BuildException($method->getDeclaringClass()->getName()."::".$method->getName()."() method MUST use a class hint to indicate the class type of parameter.");
+                    }
+                        
+                    $this->nestedTypes[$name] = $classname;
+                
+                    $this->nestedStorers[$name] = $method;
+                    
+                } elseif (strpos($name, "add") === 0) {
+                    
+                    // *must* use class hints if using add ...
+                    
+                    // 1 param only
+                    $params = $method->getParameters();
+                    if (count($params) < 1) {
+                        throw new BuildException($method->getDeclaringClass()->getName()."::".$method->getName()."() must take at least one parameter.");
+                    }
+                    
+                    if (count($params) > 1) {
+                        $this->warn($method->getDeclaringClass()->getName()."::".$method->getName()."() takes more than one parameter. (IH only uses the first)");
+                    }
+
+                    $classname = null;
+                    
+                    if (($hint = $params[0]->getClass()) !== null) { 
+                        $classname = $hint->getName();    
+                    }                    
+                    
+                    // we don't use the classname here, but we need to make sure it exists before
+                    // we later try to instantiate a non-existant class
+                    if ($classname === null) {
+                        throw new BuildException($method->getDeclaringClass()->getName()."::".$method->getName()."() method MUST use a class hint to indicate the class type of parameter.");
+                    }
+                
+                    $this->nestedCreators[$name] = $method;
+                } 
+            } // if $method->isPublic()        
+        } // foreach        
+    }
+
+
+    /** Sets the named attribute. */
+    function setAttribute(Project $project, $element, $attributeName, &$value) {
+        
+        // we want to check whether the value we are setting looks like
+        // a slot-listener variable:  %{task.current_file}
+        //
+        // slot-listener variables are not like properties, in that they cannot be mixed with
+        // other text values.  The reason for this disparity is that properties are only
+        // set when first constructing objects from XML, whereas slot-listeners are always dynamic.
+        //
+        // This is made possible by PHP5 (objects automatically passed by reference) and PHP's loose
+        // typing.
+        
+        if (StringHelper::isSlotVar($value)) {
+            
+            $as = "setlistening" . strtolower($attributeName);
+
+            if (!isset($this->slotListeners[$as])) {
+                $msg = $this->getElementName($project, $element) . " doesn't support a slot-listening '$attributeName' attribute.";
+                throw new BuildException($msg);
+            }
+            
+            $method = $this->slotListeners[$as];
+            
+            $key = StringHelper::slotVar($value);
+            $value = Register::getSlot($key); // returns a RegisterSlot object which will hold current value of that register (accessible using getValue())
+            
+        } else {
+            
+            // Traditional value options
+            
+            $as = "set".strtolower($attributeName);
+            
+            if (!isset($this->attributeSetters[$as])) {
+                $msg = $this->getElementName($project, $element) . " doesn't support the '$attributeName' attribute.";
+                throw new BuildException($msg);
+            }
+            
+            $method = $this->attributeSetters[$as];            
+            
+            if ($as == "setrefid") {            
+                $value = new Reference($value);
+            } else {
+            
+                // decode any html entities in string
+                $value = html_entity_decode($value);                
+                
+                // value is a string representation of a boolean type,
+                // convert it to primitive
+                if (StringHelper::isBoolean($value)) {
+
+                    $value = StringHelper::booleanValue($value);
+                }
+                
+                // does method expect a PhingFile object? if so, then 
+                // pass a project-relative file.
+                $params = $method->getParameters();
+
+                $classname = null;
+                
+                if (($hint = $params[0]->getClass()) !== null) { 
+                    $classname = $hint->getName();    
+                }
+                
+                // there should only be one param; we'll just assume ....
+                if ($classname !== null) {
+                    switch(strtolower($classname)) {
+                        case "phingfile":
+                            $value = $project->resolveFile($value);
+                            break;
+                        case "path":
+                            $value = new Path($project, $value);
+                            break;
+                        case "reference":
+                            $value = new Reference($value);
+                            break;            
+                        // any other object params we want to support should go here ...
+                    }
+                    
+                } // if hint !== null
+                
+            } // if not setrefid
+            
+        } // if is slot-listener
+        
+        try {
+            $project->log("    -calling setter ".$method->getDeclaringClass()->getName()."::".$method->getName()."()", PROJECT_MSG_DEBUG);
+            $method->invoke($element, $value);
+        } catch(Exception $exc) {
+            throw new BuildException($exc);
+        }
+        
+    }
+
+    /** Adds PCDATA areas.*/
+    function addText(Project $project, $element, $text) {
+        if ($this->methodAddText === null) {
+            $msg = $this->getElementName($project, $element)." doesn't support nested text data.";
+            throw new BuildException($msg);
+        }        
+        try {
+            $method = $this->methodAddText;
+            $method->invoke($element, $text);
+        } catch (Exception $exc) {
+            throw new BuildException($exc);
+        }
+    }
+
+    /**
+     * Creates a named nested element. 
+     * 
+     * Valid creators can be in the form createFoo() or addFoo(Bar).
+     * @return object Returns the nested element.
+     * @throws BuildException
+     */
+    function createElement(Project $project, $element, $elementName) {
+    
+        $addMethod = "add".strtolower($elementName);
+        $createMethod = "create".strtolower($elementName);
+        $nestedElement = null;
+        
+        if (isset($this->nestedCreators[$createMethod])) {
+            
+            $method = $this->nestedCreators[$createMethod];
+             try { // try to invoke the creator method on object
+                $project->log("    -calling creator ".$method->getDeclaringClass()->getName()."::".$method->getName()."()", PROJECT_MSG_DEBUG);
+                $nestedElement = $method->invoke($element);
+            } catch (Exception $exc) {
+                throw new BuildException($exc);
+            }            
+            
+        } elseif (isset($this->nestedCreators[$addMethod])) {            
+            
+            $method = $this->nestedCreators[$addMethod];
+            
+            // project components must use class hints to support the add methods
+            
+            try { // try to invoke the adder method on object
+            
+                $project->log("    -calling adder ".$method->getDeclaringClass()->getName()."::".$method->getName()."()", PROJECT_MSG_DEBUG);
+                // we've already assured that correct num of params
+                // exist and that method is using class hints                
+                $params = $method->getParameters();
+
+                $classname = null;
+            
+                if (($hint = $params[0]->getClass()) !== null) { 
+                    $classname = $hint->getName();    
+                }                
+                
+                // create a new instance of the object and add it via $addMethod                
+                $nestedElement = new $classname();
+                
+                $method->invoke($element, $nestedElement);
+                                
+            } catch (Exception $exc) {
+                throw new BuildException($exc);
+            }
+        } else {
+            $msg = $this->getElementName($project, $element) . " doesn't support the '$elementName' creator/adder.";
+            throw new BuildException($msg);
+        }                                
+        
+        if ($nestedElement instanceof ProjectComponent) {
+            $nestedElement->setProject($project);
+        }
+        
+        return $nestedElement;
+    }
+
+    /**
+     * Creates a named nested element.
+     * @return void
+     * @throws BuildException
+     */
+    function storeElement($project, $element, $child, $elementName = null) {
+    
+        if ($elementName === null) {
+            return;
+        }
+        
+        $storer = "addconfigured".strtolower($elementName);
+          
+        if (isset($this->nestedStorers[$storer])) {
+            
+            $method = $this->nestedStorers[$storer];
+            
+            try {                                
+                $project->log("    -calling storer ".$method->getDeclaringClass()->getName()."::".$method->getName()."()", PROJECT_MSG_DEBUG);                    
+                $method->invoke($element, $child);            
+            } catch (Exception $exc) {
+                throw new BuildException($exc);
+            }
+        }
+        
+    }
+
+    /** Does the introspected class support PCDATA? */
+    function supportsCharacters() {
+        return ($this->methodAddText !== null);
+    }
+
+    /** Return all attribues supported by the introspected class. */
+    function getAttributes() {
+        $attribs = array();
+        foreach (array_keys($this->attributeSetters) as $setter) {
+            $attribs[] =$this->getPropertyName($setter, "set");
+        }
+        return $attribs;
+    }
+
+    /** Return all nested elements supported by the introspected class. */
+    function getNestedElements() {
+        return $this->nestedTypes;
+    }
+    
+    /**
+     * Get the the name for an element.
+     * When possible the full classnam (phing.tasks.system.PropertyTask) will
+     * be returned.  If not available (loaded in taskdefs or typedefs) then the
+     * XML element name will be returned.
+     *
+     * @param Project $project
+     * @param object $element The Task or type element.
+     * @return string Fully qualified class name of element when possible.
+     */
+    function getElementName(Project $project, $element) {
+       
+          $taskdefs = $project->getTaskDefinitions();
+        $typedefs = $project->getDataTypeDefinitions();
+        
+        // check if class of element is registered with project (tasks & types)        
+        // most element types don't have a getTag() method
+        $elClass = get_class($element);
+        
+        if (!in_array('getTag', get_class_methods($elClass))) {
+                // loop through taskdefs and typesdefs and see if the class name
+                // matches (case-insensitive) any of the classes in there
+                foreach(array_merge($taskdefs, $typedefs) as $elName => $class) {
+                    if (0 === strcasecmp($elClass, StringHelper::unqualify($class))) {
+                        return $class;
+                    }
+                }
+                return "$elClass (unknown)";
+        } else {
+            // ->getTag() method does exist, so use it
+            $elName = $element->getTag();
+            if (isset($taskdefs[$elName])) {
+                return $taskdefs[$elName];
+            } elseif (isset($typedefs[$elName])) {
+
+                return $typedefs[$elName];
+            } else {
+                return "$elName (unknown)";
+            }
+        }        
+    }
+
+    /** extract the name of a property from a method name - subtracting  a given prefix. */
+    function getPropertyName($methodName, $prefix) {
+        $start = strlen($prefix);
+        return strtolower(substr($methodName, $start));
+    }
+    
+    /**
+     * Prints warning message to screen if -debug was used.
+     */
+    function warn($msg) {
+        if (Phing::getMsgOutputLevel() === PROJECT_MSG_DEBUG) {
+            print("[IntrospectionHelper] " . $msg . "\n");
+        }
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/IntrospectionHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Phing.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Phing.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Phing.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1161 @@
+<?php
+/*
+ * $Id: Phing.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/Project.php';
+require_once 'phing/ProjectComponent.php';
+require_once 'phing/Target.php';
+require_once 'phing/Task.php';
+
+include_once 'phing/BuildException.php';
+include_once 'phing/BuildEvent.php';
+
+include_once 'phing/parser/Location.php';
+include_once 'phing/parser/ExpatParser.php';
+include_once 'phing/parser/AbstractHandler.php';
+include_once 'phing/parser/ProjectConfigurator.php';
+include_once 'phing/parser/RootHandler.php';
+include_once 'phing/parser/ProjectHandler.php';
+include_once 'phing/parser/TaskHandler.php';
+include_once 'phing/parser/TargetHandler.php';
+include_once 'phing/parser/DataTypeHandler.php';
+include_once 'phing/parser/NestedElementHandler.php';
+
+include_once 'phing/system/util/Properties.php';
+include_once 'phing/util/StringHelper.php';
+include_once 'phing/system/io/PhingFile.php';
+include_once 'phing/system/io/FileReader.php';
+include_once 'phing/system/util/Register.php';
+
+/**
+ * Entry point into Phing.  This class handles the full lifecycle of a build -- from 
+ * parsing & handling commandline arguments to assembling the project to shutting down
+ * and cleaning up in the end.
+ *
+ * If you are invoking Phing from an external application, this is still
+ * the class to use.  Your applicaiton can invoke the start() method, passing
+ * any commandline arguments or additional properties.
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.51 $
+ * @package   phing
+ */
+class Phing {
+
+    /** The default build file name */
+    const DEFAULT_BUILD_FILENAME = "build.xml";
+
+    /** Our current message output status. Follows PROJECT_MSG_XXX */
+    private static $msgOutputLevel = PROJECT_MSG_INFO;
+
+    /** PhingFile that we are using for configuration */
+    private $buildFile = null;
+
+    /** The build targets */
+    private $targets = array();
+
+    /**
+     * Set of properties that are passed in from commandline or invoking code.
+     * @var Properties
+     */
+    private static $definedProps;
+
+    /** Names of classes to add as listeners to project */
+    private $listeners = array();
+
+    private $loggerClassname = null;
+
+    /** The class to handle input (can be only one). */
+    private $inputHandlerClassname;
+    
+    /** Indicates if this phing should be run */
+    private $readyToRun = false;
+
+    /** Indicates we should only parse and display the project help information */
+    private $projectHelp = false;
+    
+    /** Used by utility function getResourcePath() */
+    private static $importPaths;
+    
+    /** System-wide static properties (moved from System) */
+    private static $properties = array();
+    
+    /** Static system timer. */
+    private static $timer;
+    
+	/** The current Project */
+	private static $currentProject;
+	
+	/** Whether to capture PHP errors to buffer. */
+	private static $phpErrorCapture = false;
+	
+	/** Array of captured PHP errors */
+	private static $capturedPhpErrors = array();
+	
+    /**
+     * Prints the message of the Exception if it's not null.
+     */
+    function printMessage(Exception $t) {
+        print($t->getMessage() . "\n");
+        if (self::getMsgOutputLevel() === PROJECT_MSG_DEBUG) {
+            print($t->getTraceAsString()."\n");
+            if ($t instanceof Exception) {                
+                $c = $t->getCause();
+                if ($c !== null) {
+                    print("Wrapped exception trace:\n");
+                    print($c->getTraceAsString() . "\n");
+                }
+            }
+        } // if output level is DEBUG
+    }
+
+    /** 
+     * Entry point allowing for more options from other front ends.
+     * 
+     * This method encapsulates the complete build lifecycle.
+     * 
+     * @param array &$args The commandline args passed to phing shell script.
+     * @param array $additionalUserProperties   Any additional properties to be passed to Phing (alternative front-end might implement this).
+     *                                          These additional properties will be available using the getDefinedProperty() method and will
+     *                                          be added to the project's "user" properties.
+     * @return void
+     * @see execute()
+     * @see runBuild()
+     */
+    public static function start(&$args, $additionalUserProperties = null) {
+
+        try {
+            $m = new Phing();
+            $m->execute($args);
+        } catch (Exception $exc) {
+            $m->printMessage($exc);
+            self::halt(-1); // Parameter error
+        }
+
+        if ($additionalUserProperties !== null) {
+            $keys = $m->additionalUserProperties->keys();
+            while(count($keys)) {
+                $key = array_shift($keys);
+                $property = $m->additionalUserProperties->getProperty($key);
+                $m->setDefinedProperty($key, $property);
+            }
+        }
+
+        try {
+            $m->runBuild();
+        } catch(Exception $exc) {
+            self::halt(1); // Errors occured
+        }
+        
+        // everything fine, shutdown
+        self::halt(0); // no errors, everything is cake
+    }
+    
+    /**
+     * Making output level a static property so that this property
+     * can be accessed by other parts of the system, enabling
+     * us to display more information -- e.g. backtraces -- for "debug" level.
+     * @return int
+     */
+    public static function getMsgOutputLevel() {
+        return self::$msgOutputLevel;
+    }        
+    
+    /**
+     * Command line entry point. This method kicks off the building
+     * of a project object and executes a build using either a given
+     * target or the default target.
+     *
+     * @param array $args Command line args.
+     * @return void
+     */
+    public static function fire($args) {
+        self::start($args, null);
+    }
+    
+    /**
+     * Setup/initialize Phing environment from commandline args.
+     * @param array $args commandline args passed to phing shell.
+     * @return void
+     */
+    public function execute($args) {
+    
+        self::$definedProps = new Properties();
+        $this->searchForThis = null;
+
+        // cycle through given args
+        for ($i = 0, $argcount = count($args); $i < $argcount; ++$i) { 
+                            // ++$i intentional here, as first param is script name
+            $arg = $args[$i];
+
+            if ($arg == "-help" || $arg == "-h") {
+                $this->printUsage();
+                return;
+            } elseif ($arg == "-version" || $arg == "-v") {
+                $this->printVersion();
+                return;
+            } elseif ($arg == "-quiet" || $arg == "-q") {
+                self::$msgOutputLevel = PROJECT_MSG_WARN;
+            } elseif ($arg == "-verbose") {
+                $this->printVersion();
+                self::$msgOutputLevel = PROJECT_MSG_VERBOSE;
+            } elseif ($arg == "-debug") {
+                $this->printVersion();
+                self::$msgOutputLevel = PROJECT_MSG_DEBUG;
+            } elseif ($arg == "-logfile") {
+                try { // try to set logfile
+                    if (!isset($args[$i+1])) {
+                        print("You must specify a log file when using the -logfile argument\n");
+                        return;
+                    } else {
+                        $logFile = new PhingFile($args[++$i]);
+                        $this->loggerClassname = 'phing.listener.PearLogger';
+                        $this->setDefinedProperty('pear.log.name', $logFile->getAbsolutePath());
+                    }
+                } catch (IOException $ioe) {
+                    print("Cannot write on the specified log file. Make sure the path exists and you have write permissions.\n");
+                    throw $ioe;
+                }
+            } elseif ($arg == "-buildfile" || $arg == "-file" || $arg == "-f") {
+                if (!isset($args[$i+1])) {
+                    print("You must specify a buildfile when using the -buildfile argument\n");
+                    return;
+                } else {
+                    $this->buildFile = new PhingFile($args[++$i]);
+                }
+            } elseif ($arg == "-listener") {
+                if (!isset($args[$i+1])) {
+                    print("You must specify a listener class when using the -listener argument\n");
+                    return;
+                } else {
+                    $this->listeners[] = $args[++$i];
+                }
+                
+            } elseif (StringHelper::startsWith("-D", $arg)) {
+                $name = substr($arg, 2);
+                $value = null;
+                $posEq = strpos($name, "=");
+                if ($posEq !== false) {
+                    $value = substr($name, $posEq+1);
+                    $name  = substr($name, 0, $posEq);
+                } elseif ($i < count($args)-1) {
+                    $value = $args[++$i];
+                }
+                self::$definedProps->setProperty($name, $value);
+            } elseif ($arg == "-logger") {
+                if (!isset($args[$i+1])) {
+                    print("You must specify a classname when using the -logger argument\n");
+                    return;
+                } else {
+                    $this->loggerClassname = $args[++$i];
+                }
+            } elseif ($arg == "-inputhandler") {
+                if ($this->inputHandlerClassname !== null) {
+                    throw new BuildException("Only one input handler class may be specified.");
+                }
+                if (!isset($args[$i+1])) {
+                    print("You must specify a classname when using the -inputhandler argument\n");
+                    return;
+                } else {
+                    $this->inputHandlerClassname = $args[++$i];
+                }
+            } elseif ($arg == "-projecthelp" || $arg == "-targets" || $arg == "-list" || $arg == "-l") {
+                // set the flag to display the targets and quit
+                $this->projectHelp = true;
+            } elseif ($arg == "-find") {
+                // eat up next arg if present, default to build.xml
+                if ($i < count($args)-1) {
+                    $this->searchForThis = $args[++$i];
+                } else {
+                    $this->searchForThis = self::DEFAULT_BUILD_FILENAME;
+                }
+            } elseif (substr($arg,0,1) == "-") {
+                // we don't have any more args
+                print("Unknown argument: $arg\n");
+                $this->printUsage();
+                return;
+            } else {
+                // if it's no other arg, it may be the target
+                array_push($this->targets, $arg);
+            }
+        }
+
+        // if buildFile was not specified on the command line,
+        if ($this->buildFile === null) {
+            // but -find then search for it
+            if ($this->searchForThis !== null) {
+                $this->buildFile = $this->_findBuildFile(self::getProperty("user.dir"), $this->searchForThis);
+            } else {
+                $this->buildFile = new PhingFile(self::DEFAULT_BUILD_FILENAME);
+            }
+        }
+        // make sure buildfile exists
+        if (!$this->buildFile->exists()) {
+            throw new BuildException("Buildfile: " . $this->buildFile->__toString() . " does not exist!");
+        }
+
+        // make sure it's not a directory
+        if ($this->buildFile->isDirectory()) {   
+            throw new BuildException("Buildfile: " . $this->buildFile->__toString() . " is a dir!");
+        }
+
+        $this->readyToRun = true;
+    }
+
+    /**
+     * Helper to get the parent file for a given file.
+     *
+     * @param PhingFile $file
+     * @return PhingFile Parent file or null if none
+     */
+    function _getParentFile(PhingFile $file) {
+        $filename = $file->getAbsolutePath();
+        $file     = new PhingFile($filename);
+        $filename = $file->getParent();
+
+        if ($filename !== null && self::$msgOutputLevel >= PROJECT_MSG_VERBOSE) {
+            print("Searching in $filename\n");
+        }
+
+        return ($filename === null) ? null : new PhingFile($filename);
+    }
+
+    /**
+     * Search parent directories for the build file.
+     *
+     * Takes the given target as a suffix to append to each
+     * parent directory in search of a build file.  Once the
+     * root of the file-system has been reached an exception
+     * is thrown.
+     * 
+     * @param string $start Start file path.
+     * @param string $suffix Suffix filename to look for in parents.
+     * @return PhingFile A handle to the build file
+     *
+     * @throws BuildException    Failed to locate a build file
+     */
+    function _findBuildFile($start, $suffix) {
+        if (self::$msgOutputLevel >= PROJECT_MSG_INFO) {
+            print("Searching for $suffix ...\n");
+        }
+        $startf = new PhingFile($start);
+        $parent = new PhingFile($startf->getAbsolutePath());
+        $file   = new PhingFile($parent, $suffix);
+
+        // check if the target file exists in the current directory
+        while (!$file->exists()) {
+            // change to parent directory
+            $parent = $this->_getParentFile($parent);
+
+            // if parent is null, then we are at the root of the fs,
+            // complain that we can't find the build file.
+            if ($parent === null) {
+                throw new BuildException("Could not locate a build file!");
+            }
+            // refresh our file handle
+            $file = new PhingFile($parent, $suffix);
+        }
+        return $file;
+    }
+
+    /**
+     * Executes the build.
+     * @return void
+     */
+    function runBuild() {
+
+        if (!$this->readyToRun) {
+            return;
+        }
+        
+        $project = new Project();
+		
+		self::setCurrentProject($project);
+		set_error_handler(array('Phing', 'handlePhpError'));
+		
+        $error = null;
+
+        $this->addBuildListeners($project);
+        $this->addInputHandler($project);
+        
+        // set this right away, so that it can be used in logging.
+        $project->setUserProperty("phing.file", $this->buildFile->getAbsolutePath());
+
+        try {
+            $project->fireBuildStarted();
+            $project->init();
+        } catch (Exception $exc) {
+            $project->fireBuildFinished($exc);
+            throw $exc;        
+        }
+
+        $project->setUserProperty("phing.version", $this->getPhingVersion());
+
+        $e = self::$definedProps->keys();
+        while (count($e)) {
+            $arg   = (string) array_shift($e);
+            $value = (string) self::$definedProps->getProperty($arg);
+            $project->setUserProperty($arg, $value);
+        }
+        unset($e);
+
+        $project->setUserProperty("phing.file", $this->buildFile->getAbsolutePath());
+
+        // first use the Configurator to create the project object
+        // from the given build file.
+                
+        try {
+            ProjectConfigurator::configureProject($project, $this->buildFile);
+        } catch (Exception $exc) {
+            $project->fireBuildFinished($exc);
+			restore_error_handler();
+			self::unsetCurrentProject();
+            throw $exc;
+        }         
+
+        // make sure that we have a target to execute
+        if (count($this->targets) === 0) {
+            $this->targets[] = $project->getDefaultTarget();
+        }
+
+        // execute targets if help param was not given
+        if (!$this->projectHelp) {
+            
+            try { 
+                $project->executeTargets($this->targets);
+            } catch (Exception $exc) {
+                $project->fireBuildFinished($exc);
+				restore_error_handler();
+				self::unsetCurrentProject();
+                throw $exc;
+            }
+        }
+        // if help is requested print it
+        if ($this->projectHelp) {
+            try {
+                $this->printDescription($project);
+                $this->printTargets($project);
+            } catch (Exception $exc) {
+                $project->fireBuildFinished($exc);
+				restore_error_handler();
+				self::unsetCurrentProject();
+                throw $exc;
+            }
+        }
+                
+        // finally {
+        if (!$this->projectHelp) {
+            $project->fireBuildFinished(null);
+        }
+		
+		restore_error_handler();
+		self::unsetCurrentProject();
+    }
+    
+    /**
+     * Bind any default build listeners to this project.
+     * Currently this means adding the logger.
+     * @param Project $project
+     * @return void
+     */
+    private function addBuildListeners(Project $project) {
+        // Add the default listener
+        $project->addBuildListener($this->createLogger());
+    }
+    
+    /**
+     * Creates the InputHandler and adds it to the project.
+     *
+     * @param Project $project the project instance.
+     *
+     * @throws BuildException if a specified InputHandler
+     *                           class could not be loaded.
+     */
+    private function addInputHandler(Project $project) {
+        if ($this->inputHandlerClassname === null) {
+            $handler = new DefaultInputHandler();
+        } else {
+            try {
+                $clz = Phing::import($this->inputHandlerClassname);
+                $handler = new $clz();
+                if ($project !== null && method_exists($handler, 'setProject')) {
+                    $handler->setProject($project);
+                } 
+            } catch (Exception $e) {
+                $msg = "Unable to instantiate specified input handler "
+                    . "class " . $this->inputHandlerClassname . " : "
+                    . $e->getMessage();
+                throw new BuildException($msg);
+            }
+        }
+        $project->setInputHandler($handler);
+    }
+
+    /**
+     * Creates the default build logger for sending build events to the log.
+     * @return BuildListener The created Logger
+     */
+    private function createLogger() {
+        if ($this->loggerClassname !== null) {
+            self::import($this->loggerClassname);
+            // get class name part            
+            $classname = self::import($this->loggerClassname);
+            $logger = new $classname;
+        } else {
+            require_once 'phing/listener/DefaultLogger.php';
+            $logger = new DefaultLogger();
+        }
+        $logger->setMessageOutputLevel(self::$msgOutputLevel);
+        return $logger;
+    }
+	
+	/**
+	 * Sets the current Project
+	 * @param Project $p
+	 */
+	public static function setCurrentProject($p) {
+		self::$currentProject = $p;
+	}
+	
+	/**
+	 * Unsets the current Project
+	 */
+	public static function unsetCurrentProject() {
+		self::$currentProject = null;
+	}
+	
+	/**
+	 * Gets the current Project.
+	 * @return Project Current Project or NULL if none is set yet/still.
+	 */
+	public static function getCurrentProject() {
+		return self::$currentProject;
+	}
+	
+	/**
+	 * A static convenience method to send a log to the current (last-setup) Project.
+	 * If there is no currently-configured Project, then this will do nothing.
+	 * @param string $message
+	 * @param int $priority PROJECT_MSG_INFO, etc.
+	 */
+	public static function log($message, $priority = PROJECT_MSG_INFO) {
+		$p = self::getCurrentProject();
+		if ($p) {
+			$p->log($message, $priority);
+		}
+	}
+	
+	/**
+	 * Error handler for PHP errors encountered during the build.
+	 * This uses the logging for the currently configured project.
+	 */
+	public static function handlePhpError($level, $message, $file, $line) {
+		
+        // don't want to print supressed errors
+        if (error_reporting() > 0) {
+		
+			if (self::$phpErrorCapture) {
+			
+				self::$capturedPhpErrors[] = array('message' => $message, 'level' => $level, 'line' => $line, 'file' => $file);
+				
+			} else {
+			
+				$message = '[PHP Error] ' . $message;
+				$message .= ' [line ' . $line . ' of ' . $file . ']';
+		
+	            switch ($level) {
+				
+					case E_STRICT:
+					case E_NOTICE:
+	                case E_USER_NOTICE:
+						self::log($message, PROJECT_MSG_VERBOSE);
+	                    break;
+					case E_WARNING:
+	                case E_USER_WARNING:
+						self::log($message, PROJECT_MSG_WARN);
+	                    break;
+	                case E_ERROR:
+					case E_USER_ERROR:
+	                default:
+						self::log($message, PROJECT_MSG_ERR);
+	
+	            } // switch
+				
+			} // if phpErrorCapture
+			
+        } // if not @
+		
+	}
+	
+	/**
+	 * Begins capturing PHP errors to a buffer.
+	 * While errors are being captured, they are not logged.
+	 */
+	public static function startPhpErrorCapture() {
+		self::$phpErrorCapture = true;
+		self::$capturedPhpErrors = array();
+	}
+	
+	/**
+	 * Stops capturing PHP errors to a buffer.
+	 * The errors will once again be logged after calling this method.
+	 */
+	public static function stopPhpErrorCapture() {
+		self::$phpErrorCapture = false;
+	}
+	
+	/**
+	 * Clears the captured errors without affecting the starting/stopping of the capture.
+	 */
+	public static function clearCapturedPhpErrors() {
+		self::$capturedPhpErrors = array();
+	}
+	
+	/**
+	 * Gets any PHP errors that were captured to buffer.
+	 * @return array array('message' => message, 'line' => line number, 'file' => file name, 'level' => error level)
+	 */
+	public static function getCapturedPhpErrors() {
+		return self::$capturedPhpErrors;
+	}
+	
+    /**  Prints the usage of how to use this class */
+    function printUsage() {
+        $lSep = self::getProperty("line.separator");
+        $msg = "";
+        $msg .= "phing [options] [target [target2 [target3] ...]]" . $lSep;
+        $msg .= "Options: " . $lSep;
+        $msg .= "  -h -help               print this message" . $lSep;
+        $msg .= "  -l -list               list available targets in this project" . $lSep;
+        $msg .= "  -v -version            print the version information and exit" . $lSep;
+        $msg .= "  -q -quiet              be extra quiet" . $lSep;
+        $msg .= "  -verbose               be extra verbose" . $lSep;
+        $msg .= "  -debug                 print debugging information" . $lSep;
+        $msg .= "  -logfile <file>        use given file for log" . $lSep;
+        $msg .= "  -logger <classname>    the class which is to perform logging" . $lSep;
+        $msg .= "  -f -buildfile <file>   use given buildfile" . $lSep;
+        $msg .= "  -D<property>=<value>   use value for given property" . $lSep;
+        $msg .= "  -find <file>           search for buildfile towards the root of the" . $lSep;
+        $msg .= "                         filesystem and use it" . $lSep;
+        //$msg .= "  -recursive <file>      search for buildfile downwards and use it" . $lSep;
+        $msg .= $lSep;
+        $msg .= "Report bugs to <dev en phing.tigris.org>".$lSep;
+        print($msg);
+    }
+
+    function printVersion() {
+        print(self::getPhingVersion()."\n");
+    }
+
+    function getPhingVersion() {
+        $versionPath = self::getResourcePath("phing/etc/VERSION.TXT");
+		if ($versionPath === null) {
+		    $versionPath = self::getResourcePath("etc/VERSION.TXT");
+		}
+        try { // try to read file
+            $buffer = null;
+            $file = new PhingFile($versionPath);
+            $reader = new FileReader($file);
+            $reader->readInto($buffer);
+            $buffer = trim($buffer);
+            //$buffer = "PHING version 1.0, Released 2002-??-??";
+            $phingVersion = $buffer;
+        } catch (IOException $iox) {
+            print("Can't read version information file\n");
+            throw new BuildException("Build failed");
+        }        
+        return $phingVersion;
+    }
+
+    /**  Print the project description, if any */
+    function printDescription(Project $project) {
+        if ($project->getDescription() !== null) {
+            print($project->getDescription()."\n");
+        }
+    }
+
+    /** Print out a list of all targets in the current buildfile */
+    function printTargets($project) {
+        // find the target with the longest name
+        $maxLength = 0;
+        $targets = $project->getTargets();
+        $targetNames = array_keys($targets);
+        $targetName = null;
+        $targetDescription = null;
+        $currentTarget = null;
+
+        // split the targets in top-level and sub-targets depending
+        // on the presence of a description
+        
+        $subNames = array();
+        $topNameDescMap = array();
+        
+        foreach($targets as $currentTarget) {        
+            $targetName = $currentTarget->getName();
+            $targetDescription = $currentTarget->getDescription();            
+            
+            // subtargets are targets w/o descriptions
+            if ($targetDescription === null) {
+                $subNames[] = $targetName;
+            } else {
+                // topNames and topDescriptions are handled later
+                // here we store in hash map (for sorting purposes)
+                $topNameDescMap[$targetName] = $targetDescription;               
+                if (strlen($targetName) > $maxLength) {
+                    $maxLength = strlen($targetName);
+                }
+            }
+        }
+        
+        // Sort the arrays
+        sort($subNames); // sort array values, resetting keys (which are numeric)        
+        ksort($topNameDescMap); // sort the keys (targetName) keeping key=>val associations
+        
+        $topNames = array_keys($topNameDescMap);
+        $topDescriptions = array_values($topNameDescMap);
+
+        $defaultTarget = $project->getDefaultTarget();
+
+        if ($defaultTarget !== null && $defaultTarget !== "") {
+            $defaultName = array();
+            $defaultDesc = array();
+            $defaultName[] = $defaultTarget;
+
+            $indexOfDefDesc = array_search($defaultTarget, $topNames, true);
+            if ($indexOfDefDesc !== false && $indexOfDefDesc >= 0) {
+                $defaultDesc = array();
+                $defaultDesc[] = $topDescriptions[$indexOfDefDesc];
+            }
+
+            $this->_printTargets($defaultName, $defaultDesc, "Default target:", $maxLength);
+
+        }
+        $this->_printTargets($topNames, $topDescriptions, "Main targets:", $maxLength);
+        $this->_printTargets($subNames, null, "Subtargets:", 0);
+    }    
+
+    /**
+     * Writes a formatted list of target names with an optional description.
+     *
+     * @param array $names The names to be printed.
+     *              Must not be <code>null</code>.
+     * @param array $descriptions The associated target descriptions.
+     *                     May be <code>null</code>, in which case
+     *                     no descriptions are displayed.
+     *                     If non-<code>null</code>, this should have
+     *                     as many elements as <code>names</code>.
+     * @param string $heading The heading to display.
+     *                Should not be <code>null</code>.
+     * @param int $maxlen The maximum length of the names of the targets.
+     *               If descriptions are given, they are padded to this
+     *               position so they line up (so long as the names really
+     *               <i>are</i> shorter than this).
+     */
+    private function _printTargets($names, $descriptions, $heading, $maxlen) {
+        $lSep = self::getProperty("line.separator");
+        $spaces = '  ';
+        while (strlen($spaces) < $maxlen) {
+            $spaces .= $spaces;
+        }
+        $msg = "";
+        $msg .= $heading . $lSep;
+        $msg .= str_repeat("-",79) . $lSep;
+
+        $total = count($names);
+        for($i=0; $i < $total; $i++) {
+            $msg .= " ";
+            $msg .= $names[$i];
+            if (!empty($descriptions)) {
+                $msg .= substr($spaces, 0, $maxlen - strlen($names[$i]) + 2);
+                $msg .= $descriptions[$i];
+            }
+            $msg .= $lSep;
+        }
+        if ($total > 0) {
+          print $msg . $lSep;
+        } 
+   }
+   
+   /**
+    * Import a dot-path notation class path.
+    * @param string $dotPath
+    * @param mixed $classpath String or object supporting __toString()
+    * @return string The unqualified classname (which can be instantiated).
+    * @throws BuildException - if cannot find the specified file
+    */
+   public static function import($dotPath, $classpath = null) {
+        
+        // first check to see that the class specified hasn't already been included.
+        // (this also handles case where this method is called w/ a classname rather than dotpath)
+        $classname = StringHelper::unqualify($dotPath);
+        if (class_exists($classname, false)) {
+            return $classname;
+        }
+        
+        $dotClassname = basename($dotPath);
+        $dotClassnamePos = strlen($dotPath) - strlen($dotClassname);
+        $classFile = strtr($dotClassname, '.', DIRECTORY_SEPARATOR) . ".php";
+        $path = substr_replace($dotPath, $classFile, $dotClassnamePos);
+        
+        Phing::__import($path, $classpath);
+        
+        return $classname;
+   }
+
+   /**
+    * Import a PHP file
+    * @param string $path Path to the PHP file
+    * @param mixed $classpath String or object supporting __toString()
+    * @throws BuildException - if cannot find the specified file
+    */
+   public static function __import($path, $classpath = null) {
+        
+        if ($classpath) {
+        
+            // Apparently casting to (string) no longer invokes __toString() automatically.
+            if (is_object($classpath)) {
+                $classpath = $classpath->__toString();
+            }
+            
+            // classpaths are currently additive, but we also don't want to just
+            // indiscriminantly prepand/append stuff to the include_path.  This means
+            // we need to parse current incldue_path, and prepend any
+            // specified classpath locations that are not already in the include_path.              
+            //
+            // NOTE:  the reason why we do it this way instead of just changing include_path
+            // and then changing it back, is that in many cases applications (e.g. Propel) will
+            // include/require class files from within method calls.  This means that not all
+            // necessary files will be included in this import() call, and hence we can't
+            // change the include_path back without breaking those apps.  While this method could
+            // be more expensive than switching & switching back (not sure, but maybe), it makes it
+            // possible to write far less expensive run-time applications (e.g. using Propel), which is
+            // really where speed matters more.
+            
+            $curr_parts = explode(PATH_SEPARATOR, ini_get('include_path'));
+            $add_parts = explode(PATH_SEPARATOR, $classpath);
+            $new_parts = array_diff($add_parts, $curr_parts);
+            if ($new_parts) {
+                if (self::getMsgOutputLevel() === PROJECT_MSG_DEBUG) {
+                    print("Phing::import() prepending new include_path components: " . implode(PATH_SEPARATOR, $new_parts) . "\n");
+                }
+                ini_set('include_path', implode(PATH_SEPARATOR, array_merge($new_parts, $curr_parts)));
+            }
+        }
+        
+        $ret = include_once($path);        
+        
+        if ($ret === false) {
+            $e = new BuildException("Error importing $path");
+            if (self::getMsgOutputLevel() === PROJECT_MSG_DEBUG) {
+                // We can't log this because listeners belong
+                // to projects.  We'll just print it -- of course
+                // that isn't very compatible w/ other frontends (but
+                // there aren't any right now, so I'm not stressing)
+                print("Error importing $path\n");
+                print($e->getTraceAsString()."\n");
+            }        
+            throw $e;
+        }
+        
+        return;
+   }
+   
+   /**
+    * Looks on include path for specified file.
+    * @return string File found (null if no file found).
+    */
+   public static function getResourcePath($path) {
+        
+        if (self::$importPaths === null) {
+            $paths = ini_get("include_path");            
+            self::$importPaths = explode(PATH_SEPARATOR, ini_get("include_path"));
+        }
+        
+        $path = str_replace('\\', DIRECTORY_SEPARATOR, $path);
+        $path = str_replace('/', DIRECTORY_SEPARATOR, $path);
+
+        foreach (self::$importPaths as $prefix) {
+            $foo_path = $prefix . DIRECTORY_SEPARATOR . $path;
+            if (file_exists($foo_path)) {
+                return $foo_path;
+            }
+        }
+        
+        // Check for the property phing.home
+        $home_dir = self::getProperty('phing.home');
+        
+        if ($home_dir)
+        {
+			$home_path = $home_dir . DIRECTORY_SEPARATOR . $path;
+			
+			if (file_exists($home_path))
+			{
+				return $home_path;
+			}
+		}
+        
+        // If we are using this via PEAR then check for the file in the data dir
+        // This is a bit of a hack, but works better than previous solution of assuming
+        // data_dir is on the include_path.
+        $data_dir = '@DATA-DIR@';
+        if ($data_dir{0} != '@') { // if we're using PEAR then the @ DATA-DIR @ token will have been substituted.
+            $data_path = $data_dir . DIRECTORY_SEPARATOR . $path;
+            if (file_exists($data_path)) {
+                   return $data_path;
+               }
+        }
+        
+        return null;
+   }
+   
+   // -------------------------------------------------------------------------------------------
+   // System-wide methods (moved from System class, which had namespace conflicts w/ PEAR System)
+   // -------------------------------------------------------------------------------------------
+             
+    /**
+     * Set System constants which can be retrieved by calling Phing::getProperty($propName).
+     * @return void
+     */
+    private static function setSystemConstants() {
+
+        /*
+         * PHP_OS returns on
+         *   WindowsNT4.0sp6  => WINNT
+         *   Windows2000      => WINNT
+         *   Windows ME       => WIN32
+         *   Windows 98SE     => WIN32
+         *   FreeBSD 4.5p7    => FreeBSD
+         *   Redhat Linux     => Linux
+		 *   Mac OS X		  => Darwin
+         */
+        self::setProperty('host.os', PHP_OS);
+		
+		// this is used by some tasks too
+        self::setProperty('os.name', PHP_OS);
+		
+        // it's still possible this won't be defined,
+        // e.g. if Phing is being included in another app w/o
+        // using the phing.php script.
+        if (!defined('PHP_CLASSPATH')) {
+            define('PHP_CLASSPATH', get_include_path());
+        }
+        
+        self::setProperty('php.classpath', PHP_CLASSPATH);
+
+        // try to determine the host filesystem and set system property
+        // used by Fileself::getFileSystem to instantiate the correct
+        // abstraction layer
+
+        switch (strtoupper(PHP_OS)) {
+            case 'WINNT':
+                self::setProperty('host.fstype', 'WINNT');
+                break;
+            case 'WIN32':
+                self::setProperty('host.fstype', 'WIN32');
+                break;
+            default:
+                self::setProperty('host.fstype', 'UNIX');
+                break;
+        }
+
+        self::setProperty('php.version', PHP_VERSION);
+        self::setProperty('user.home', getenv('HOME'));
+        self::setProperty('application.startdir', getcwd());
+        self::setProperty('line.separator', "\n");
+
+        // try to detect machine dependent information
+        $sysInfo = array();
+        if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' && function_exists("posix_uname")) {
+              $sysInfo = posix_uname();
+        } else {
+              $sysInfo['nodename'] = php_uname('n');
+              $sysInfo['machine']= php_uname('m') ;
+              //this is a not so ideal substition, but maybe better than nothing
+              $sysInfo['domain'] = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : "unknown";
+              $sysInfo['release'] = php_uname('r');
+              $sysInfo['version'] = php_uname('v');
+        }              
+     
+
+        self::setProperty("host.name", isset($sysInfo['nodename']) ? $sysInfo['nodename'] : "unknown");
+        self::setProperty("host.arch", isset($sysInfo['machine']) ? $sysInfo['machine'] : "unknown");
+        self::setProperty("host.domain",isset($sysInfo['domain']) ? $sysInfo['domain'] : "unknown");
+        self::setProperty("host.os.release", isset($sysInfo['release']) ? $sysInfo['release'] : "unknown");
+        self::setProperty("host.os.version", isset($sysInfo['version']) ? $sysInfo['version'] : "unknown");
+        unset($sysInfo);
+    }
+    
+    /**
+     * This gets a property that was set via command line or otherwise passed into Phing.
+     * "Defined" in this case means "externally defined".  The reason this method exists is to
+     * provide a public means of accessing commandline properties for (e.g.) logger or listener 
+     * scripts.  E.g. to specify which logfile to use, PearLogger needs to be able to access
+     * the pear.log.name property.
+     * 
+     * @param string $name
+     * @return string value of found property (or null, if none found).
+     */
+    public static function getDefinedProperty($name) {
+        return self::$definedProps->getProperty($name);
+    }
+    
+    /**
+     * This sets a property that was set via command line or otherwise passed into Phing.
+     * 
+     * @param string $name
+     * @return string value of found property (or null, if none found).
+     */
+    public static function setDefinedProperty($name, $value) {
+        return self::$definedProps->setProperty($name, $value);
+    }
+    
+    /**
+     * Returns property value for a System property.
+     * System properties are "global" properties like line.separator,
+     * and user.dir.  Many of these correspond to similar properties in Java
+     * or Ant.
+     * 
+     * @param string $paramName
+     * @return string Value of found property (or null, if none found).
+     */
+    public static function getProperty($propName) {
+    
+        // some properties are detemined on each access
+        // some are cached, see below
+
+        // default is the cached value:
+        $val = isset(self::$properties[$propName]) ? self::$properties[$propName] : null;
+    
+        // special exceptions        
+        switch($propName) {
+            case 'user.dir':
+                $val = getcwd();
+            break;            
+        }
+        
+        return $val;
+    }
+
+    /** Retuns reference to all properties*/
+    public static function &getProperties() {
+        return self::$properties;
+    }
+
+    public static function setProperty($propName, $propValue) {    
+        $propName = (string) $propName;
+        $oldValue = self::getProperty($propName);
+        self::$properties[$propName] = $propValue;
+        return $oldValue;
+    }
+    
+    public static function currentTimeMillis() {
+        list($usec, $sec) = explode(" ",microtime());
+        return ((float)$usec + (float)$sec);
+    }
+    
+    /**
+     * Sets the include path based on PHP_CLASSPATH constant (set in phing.php).
+     * @return void
+     */
+    private static function setIncludePaths() {
+        $success = false;
+        
+        if (defined('PHP_CLASSPATH')) {
+            $success = ini_set('include_path', PHP_CLASSPATH);
+        } else {
+            // don't do anything, just assume that include_path has been properly set.
+            $success = true;
+        }
+        
+        if ($success === false) {
+            print("SYSTEM FAILURE: Could not set PHP include path\n");
+            self::halt(-1);
+        }
+    }
+    
+    /**
+     * Sets PHP INI values that Phing needs.
+     * @return void
+     */
+    private static function setIni() {
+        error_reporting(E_ALL);
+        set_time_limit(0);
+        ini_set('magic_quotes_gpc', 'off');
+        ini_set('short_open_tag', 'off');
+        ini_set('default_charset', 'iso-8859-1');
+        ini_set('register_globals', 'off');
+        ini_set('allow_call_time_pass_reference', 'on');
+        
+        // should return memory limit in MB  
+        $mem_limit = (int) ini_get('memory_limit');
+        if ($mem_limit < 32) {
+            ini_set('memory_limit', '32M'); // nore: this may need to be higher for many projects
+        }        
+    }
+
+    /**
+     * Returns reference to Timer object.
+     * @return Timer
+     */
+    public static function getTimer() {
+        if (self::$timer === null) {
+            include_once 'phing/system/util/Timer.php';
+            self::$timer= new Timer();
+        }
+        return self::$timer;
+    }
+        
+     /**
+     * Start up Phing.
+     * Sets up the Phing environment -- does NOT initiate the build process.
+     * @return void
+     */
+    public static function startup() {
+       
+        register_shutdown_function(array('Phing', 'shutdown'));
+
+        // some init stuff
+        self::getTimer()->start();
+
+        self::setSystemConstants();
+        self::setIncludePaths();
+        self::setIni();
+    }
+    
+    /**
+     * Halts the system.
+     * @see shutdown()
+     */
+    public static function halt($code=0) {        
+        self::shutdown($code);        
+    }
+
+    /**
+     * Stops timers & exits.
+     * @return void
+     */
+    public static function shutdown($exitcode = 0) {
+        //print("[AUTOMATIC SYSTEM SHUTDOWN]\n");
+        self::getTimer()->stop();
+        exit($exitcode); // final point where everything stops
+    }
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Phing.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Project.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Project.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Project.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,966 @@
+<?php
+/*
+ *  $Id: Project.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+define('PROJECT_MSG_DEBUG', 4);
+define('PROJECT_MSG_VERBOSE', 3);
+define('PROJECT_MSG_INFO', 2);
+define('PROJECT_MSG_WARN', 1);
+define('PROJECT_MSG_ERR', 0);
+
+include_once 'phing/system/io/PhingFile.php';
+include_once 'phing/util/FileUtils.php';
+include_once 'phing/TaskAdapter.php';
+include_once 'phing/util/StringHelper.php';
+include_once 'phing/BuildEvent.php';
+include_once 'phing/input/DefaultInputHandler.php';
+
+/**
+ *  The Phing project class. Represents a completely configured Phing project.
+ *  The class defines the project and all tasks/targets. It also contains
+ *  methods to start a build as well as some properties and FileSystem
+ *  abstraction.
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.29 $
+ * @package   phing
+ */
+class Project {
+
+    /** contains the targets */
+    private $targets         = array();
+    /** global filterset (future use) */
+    private $globalFilterSet = array();
+    /**  all globals filters (future use) */
+    private $globalFilters   = array();
+    
+    /** Project properties map (usually String to String). */
+    private $properties = array();
+    
+    /**
+     * Map of "user" properties (as created in the Ant task, for example).
+     * Note that these key/value pairs are also always put into the
+     * project properties, so only the project properties need to be queried.
+     * Mapping is String to String.
+     */
+    private $userProperties = array();
+    
+    /**
+     * Map of inherited "user" properties - that are those "user"
+     * properties that have been created by tasks and not been set
+     * from the command line or a GUI tool.
+     * Mapping is String to String.
+     */
+    private $inheritedProperties = array();
+    
+    /** task definitions for this project*/
+    private $taskdefs = array();
+    
+    /** type definitions for this project */
+    private $typedefs = array();
+    
+    /** holds ref names and a reference to the referred object*/
+    private $references = array();
+    
+    /** The InputHandler being used by this project. */
+    private $inputHandler;
+    
+    /* -- properties that come in via xml attributes -- */
+    
+    /** basedir (PhingFile object) */
+    private $basedir;
+    
+    /** the default target name */
+    private $defaultTarget = 'all';
+    
+    /** project name (required) */
+    private $name;
+    
+    /** project description */
+    private $description;
+
+    /** a FileUtils object */
+    private $fileUtils;
+    
+    /**  Build listeneers */
+    private $listeners = array();
+
+    /**
+     *  Constructor, sets any default vars.
+     */
+    function __construct() {
+        $this->fileUtils = new FileUtils();
+        $this->inputHandler = new DefaultInputHandler();
+    }
+
+    /**
+     * Sets the input handler
+     */
+    public function setInputHandler(InputHandler $handler) {
+        $this->inputHandler = $handler;
+    }
+
+    /**
+     * Retrieves the current input handler.
+     */
+    public function getInputHandler() {
+        return $this->inputHandler;
+    }
+
+    /** inits the project, called from main app */
+    function init() {
+        // set builtin properties
+        $this->setSystemProperties();
+        
+        // load default tasks
+        $taskdefs = Phing::getResourcePath("phing/tasks/defaults.properties");
+        
+        try { // try to load taskdefs
+            $props = new Properties();
+            $in = new PhingFile((string)$taskdefs);
+
+            if ($in === null) {
+                throw new BuildException("Can't load default task list");
+            }
+            $props->load($in);
+
+            $enum = $props->propertyNames();
+            foreach($enum as $key) {
+                $value = $props->getProperty($key);
+                $this->addTaskDefinition($key, $value);
+            }
+        } catch (IOException $ioe) {
+            throw new BuildException("Can't load default task list");
+        }
+
+        // load default tasks
+        $typedefs = Phing::getResourcePath("phing/types/defaults.properties");
+
+        try { // try to load typedefs
+            $props = new Properties();
+            $in    = new PhingFile((string)$typedefs);
+            if ($in === null) {
+                throw new BuildException("Can't load default datatype list");
+            }
+            $props->load($in);
+
+            $enum = $props->propertyNames();
+            foreach($enum as $key) {
+                $value = $props->getProperty($key);
+                $this->addDataTypeDefinition($key, $value);
+            }
+        } catch(IOException $ioe) {
+            throw new BuildException("Can't load default datatype list");
+        }
+    }
+
+    /** returns the global filterset (future use) */
+    function getGlobalFilterSet() {
+        return $this->globalFilterSet;
+    }
+
+    // ---------------------------------------------------------
+    // Property methods
+    // ---------------------------------------------------------
+    
+    /**
+     * Sets a property. Any existing property of the same name
+     * is overwritten, unless it is a user property.
+     * @param string $name The name of property to set.
+     *             Must not be <code>null</code>.
+     * @param string $value The new value of the property.
+     *              Must not be <code>null</code>.
+     * @return void
+     */
+    public function setProperty($name, $value) {
+	
+        // command line properties take precedence
+        if (isset($this->userProperties[$name])) {
+            $this->log("Override ignored for user property " . $name, PROJECT_MSG_VERBOSE);
+            return;
+        }
+
+        if (isset($this->properties[$name])) {
+            $this->log("Overriding previous definition of property " . $name, PROJECT_MSG_VERBOSE);
+        }
+
+        $this->log("Setting project property: " . $name . " -> " . $value, PROJECT_MSG_DEBUG);
+        $this->properties[$name] = $value;
+    }
+
+    /**
+     * Sets a property if no value currently exists. If the property
+     * exists already, a message is logged and the method returns with
+     * no other effect.
+     *
+     * @param string $name The name of property to set.
+     *             Must not be <code>null</code>.
+     * @param string $value The new value of the property.
+     *              Must not be <code>null</code>.
+     * @since 2.0
+     */
+    public function setNewProperty($name, $value) {
+        if (isset($this->properties[$name])) {
+            $this->log("Override ignored for property " . $name, PROJECT_MSG_DEBUG);
+            return;
+        }
+        $this->log("Setting project property: " . $name . " -> " . $value, PROJECT_MSG_DEBUG);
+        $this->properties[$name] = $value;
+    }
+
+    /**
+     * Sets a user property, which cannot be overwritten by
+     * set/unset property calls. Any previous value is overwritten.
+     * @param string $name The name of property to set.
+     *             Must not be <code>null</code>.
+     * @param string $value The new value of the property.
+     *              Must not be <code>null</code>.
+     * @see #setProperty()
+     */
+    public function setUserProperty($name, $value) {
+        $this->log("Setting ro project property: " . $name . " -> " . $value, PROJECT_MSG_DEBUG);
+        $this->userProperties[$name] = $value;
+        $this->properties[$name] = $value;
+    }
+
+    /**
+     * Sets a user property, which cannot be overwritten by set/unset
+     * property calls. Any previous value is overwritten. Also marks
+     * these properties as properties that have not come from the
+     * command line.
+     *
+     * @param string $name The name of property to set.
+     *             Must not be <code>null</code>.
+     * @param string $value The new value of the property.
+     *              Must not be <code>null</code>.
+     * @see #setProperty()
+     */
+    public function setInheritedProperty($name, $value) {
+        $this->inheritedProperties[$name] = $value;
+        $this->setUserProperty($name, $value);
+    }
+
+    /**
+     * Sets a property unless it is already defined as a user property
+     * (in which case the method returns silently).
+     *
+     * @param name The name of the property.
+     *             Must not be <code>null</code>.
+     * @param value The property value. Must not be <code>null</code>.
+     */
+    private function setPropertyInternal($name, $value) {
+        if (isset($this->userProperties[$name])) {
+			$this->log("Override ignored for user property " . $name, PROJECT_MSG_VERBOSE);
+            return;
+        }
+        $this->properties[$name] = $value;
+    }
+
+    /**
+     * Returns the value of a property, if it is set.
+     *
+     * @param string $name The name of the property.
+     *             May be <code>null</code>, in which case
+     *             the return value is also <code>null</code>.
+     * @return string The property value, or <code>null</code> for no match
+     *         or if a <code>null</code> name is provided.
+     */
+    public function getProperty($name) {
+        if (!isset($this->properties[$name])) {
+            return null;
+        }
+        return $this->properties[$name];
+    }
+
+    /**
+     * Replaces ${} style constructions in the given value with the
+     * string value of the corresponding data types.
+     *
+     * @param value The string to be scanned for property references.
+     *              May be <code>null</code>.
+     *
+     * @return the given string with embedded property names replaced
+     *         by values, or <code>null</code> if the given string is
+     *         <code>null</code>.
+     *
+     * @exception BuildException if the given value has an unclosed
+     *                           property name, e.g. <code>${xxx</code>
+     */
+    public function replaceProperties($value) {
+        return ProjectConfigurator::replaceProperties($this, $value, $this->properties);
+    }
+
+    /**
+     * Returns the value of a user property, if it is set.
+     *
+     * @param string $name The name of the property.
+     *             May be <code>null</code>, in which case
+     *             the return value is also <code>null</code>.
+     * @return string  The property value, or <code>null</code> for no match
+     *         or if a <code>null</code> name is provided.
+     */
+     public function getUserProperty($name) {
+        if (!isset($this->userProperties[$name])) {
+            return null;
+        }
+        return $this->userProperties[$name];
+    }
+
+    /**
+     * Returns a copy of the properties table.
+     * @return array A hashtable containing all properties
+     *         (including user properties).
+     */
+    public function getProperties() {
+        return $this->properties;
+    }
+
+    /**
+     * Returns a copy of the user property hashtable
+     * @return a hashtable containing just the user properties
+     */
+    public function getUserProperties() {
+        return $this->userProperties;
+    }
+
+    /**
+     * Copies all user properties that have been set on the command
+     * line or a GUI tool from this instance to the Project instance
+     * given as the argument.
+     *
+     * <p>To copy all "user" properties, you will also have to call
+     * {@link #copyInheritedProperties copyInheritedProperties}.</p>
+     *
+     * @param Project $other the project to copy the properties to.  Must not be null.
+     * @return void
+     * @since phing 2.0
+     */
+    public function copyUserProperties(Project $other) {        
+        foreach($this->userProperties as $arg => $value) {
+            if (isset($this->inheritedProperties[$arg])) {
+                continue;
+            }
+            $other->setUserProperty($arg, $value);
+        }
+    }
+
+    /**
+     * Copies all user properties that have not been set on the
+     * command line or a GUI tool from this instance to the Project
+     * instance given as the argument.
+     *
+     * <p>To copy all "user" properties, you will also have to call
+     * {@link #copyUserProperties copyUserProperties}.</p>
+     *
+     * @param other the project to copy the properties to.  Must not be null.
+     *
+     * @since phing 2.0
+     */
+    public function copyInheritedProperties(Project $other) {
+        foreach($this->userProperties as $arg => $value) {
+            if ($other->getUserProperty($arg) !== null) {
+                continue;
+            }
+            $other->setInheritedProperty($arg, $value);
+        }        
+    }
+    
+    // ---------------------------------------------------------
+    //  END Properties methods
+    // ---------------------------------------------------------
+
+
+    function setDefaultTarget($targetName) {
+        $this->defaultTarget = (string) trim($targetName);
+    }
+
+    function getDefaultTarget() {
+        return (string) $this->defaultTarget;
+    }
+
+    /**
+     * Sets the name of the current project
+     *
+     * @param    string   name of project
+     * @return   void
+     * @access   public
+     * @author   Andreas Aderhold, andi en binarycloud.com
+     */
+
+    function setName($name) {
+        $this->name = (string) trim($name);
+        $this->setProperty("phing.project.name", $this->name);
+    }
+
+    /**
+     * Returns the name of this project
+     *
+     * @returns  string  projectname
+     * @access   public
+     * @author   Andreas Aderhold, andi en binarycloud.com
+     */
+    function getName() {
+        return (string) $this->name;
+    }
+
+    /** Set the projects description */
+    function setDescription($description) {
+        $this->description = (string) trim($description);
+    }
+
+    /** return the description, null otherwise */
+    function getDescription() {
+        return $this->description;
+    }
+
+    /** Set basedir object from xml*/
+    function setBasedir($dir) {
+        if ($dir instanceof PhingFile) {
+            $dir = $dir->getAbsolutePath();
+        }
+
+        $dir = $this->fileUtils->normalize($dir);
+
+        $dir = new PhingFile((string) $dir);
+        if (!$dir->exists()) {
+            throw new BuildException("Basedir ".$dir->getAbsolutePath()." does not exist");
+        }
+        if (!$dir->isDirectory()) {
+            throw new BuildException("Basedir ".$dir->getAbsolutePath()." is not a directory");
+        }
+        $this->basedir = $dir;
+        $this->setPropertyInternal("project.basedir", $this->basedir->getAbsolutePath());
+        $this->log("Project base dir set to: " . $this->basedir->getPath(), PROJECT_MSG_VERBOSE);
+        
+        // [HL] added this so that ./ files resolve correctly.  This may be a mistake ... or may be in wrong place.                
+        chdir($dir->getAbsolutePath());
+    }
+
+    /**
+     * Returns the basedir of this project
+     *
+     * @returns  PhingFile  Basedir PhingFile object
+     * @access   public
+     * @throws   BuildException
+     * @author   Andreas Aderhold, andi en binarycloud.com
+     */
+    function getBasedir() {
+        if ($this->basedir === null) {            
+            try { // try to set it
+                $this->setBasedir(".");
+            } catch (BuildException $exc) {
+                throw new BuildException("Can not set default basedir. ".$exc->getMessage());
+            }
+        }
+        return $this->basedir;
+    }
+
+    /**
+     * Sets system properties and the environment variables for this project.
+     * 
+     * @return void
+     */
+    function setSystemProperties() {
+        
+        // first get system properties
+        $systemP = array_merge( self::getProperties(), Phing::getProperties() );
+        foreach($systemP as $name => $value) {
+            $this->setPropertyInternal($name, $value);
+        }
+        
+        // and now the env vars
+        foreach($_SERVER as $name => $value) {
+            // skip arrays
+            if (is_array($value)) {
+                continue;
+            }
+            $this->setPropertyInternal('env.' . $name, $value);
+        }
+        return true;
+    }
+
+
+    /**
+     * Adds a task definition.
+     * @param string $name Name of tag.
+     * @param string $class The class path to use.
+     * @param string $classpath The classpat to use.
+     */
+    function addTaskDefinition($name, $class, $classpath = null) {
+        $name  = $name;
+        $class = $class;
+        if ($class === "") {
+            $this->log("Task $name has no class defined.", PROJECT_MSG_ERR);
+        }  elseif (!isset($this->taskdefs[$name])) {
+            Phing::import($class, $classpath);
+            $this->taskdefs[$name] = $class;
+            $this->log("  +Task definiton: $name ($class)", PROJECT_MSG_DEBUG);
+        } else {
+            $this->log("Task $name ($class) already registerd, skipping", PROJECT_MSG_VERBOSE);
+        }
+    }
+
+    function &getTaskDefinitions() {
+        return $this->taskdefs;
+    }
+
+    /**
+     * Adds a data type definition.
+     * @param string $name Name of tag.
+     * @param string $class The class path to use.
+     * @param string $classpath The classpat to use.
+     */
+    function addDataTypeDefinition($typeName, $typeClass, $classpath = null) {    
+        if (!isset($this->typedefs[$typeName])) {        
+            Phing::import($typeClass, $classpath);
+            $this->typedefs[$typeName] = $typeClass;
+            $this->log("  +User datatype: $typeName ($typeClass)", PROJECT_MSG_DEBUG);
+        } else {
+            $this->log("Type $name ($class) already registerd, skipping", PROJECT_MSG_VERBOSE);
+        }
+    }
+
+    function getDataTypeDefinitions() {
+        return $this->typedefs;
+    }
+
+    /** add a new target to the project */
+    function addTarget($targetName, &$target) {
+        if (isset($this->targets[$targetName])) {
+            throw new BuildException("Duplicate target: $targetName");
+        }
+        $this->addOrReplaceTarget($targetName, $target);
+    }
+
+    function addOrReplaceTarget($targetName, &$target) {
+        $this->log("  +Target: $targetName", PROJECT_MSG_DEBUG);
+        $target->setProject($this);
+        $this->targets[$targetName] = $target;
+    }
+
+    function getTargets() {
+        return $this->targets;
+    }
+
+    /**
+     * Create a new task instance and return reference to it. This method is
+     * sorta factory like. A _local_ instance is created and a reference returned to
+     * that instance. Usually PHP destroys local variables when the function call
+     * ends. But not if you return a reference to that variable.
+     * This is kinda error prone, because if no reference exists to the variable
+     * it is destroyed just like leaving the local scope with primitive vars. There's no
+     * central place where the instance is stored as in other OOP like languages.
+     *
+     * [HL] Well, ZE2 is here now, and this is  still working. We'll leave this alone
+     * unless there's any good reason not to.
+     *
+     * @param    string    $taskType    Task name
+     * @returns  Task                A task object
+     * @throws   BuildException
+     *           Exception
+     */
+    function createTask($taskType) {
+        try {
+            $cls = "";
+            $tasklwr = strtolower($taskType);
+            foreach ($this->taskdefs as $name => $class) {
+                if (strtolower($name) === $tasklwr) {
+                    $cls = StringHelper::unqualify($class);                                    
+                    break;
+                }
+            }
+            
+            if ($cls === "") {
+                return null;
+            }
+            
+            if (!class_exists($cls)) {
+                throw new BuildException("Could not instantiate class $cls, even though a class was specified. (Make sure that the specified class file contains a class with the correct name.)");
+            }
+            
+            $o = new $cls();        
+    
+            if ($o instanceof Task) {
+                $task = $o;
+            } else {
+                $this->log ("  (Using TaskAdapter for: $taskType)", PROJECT_MSG_DEBUG);
+                // not a real task, try adapter
+                $taskA = new TaskAdapter();
+                $taskA->setProxy($o);
+                $task = $taskA;
+            }
+            $task->setProject($this);
+            $task->setTaskType($taskType);
+            // set default value, can be changed by the user
+            $task->setTaskName($taskType);
+            $this->log ("  +Task: " . $taskType, PROJECT_MSG_DEBUG);
+        } catch (Exception $t) {
+            throw new BuildException("Could not create task of type: " . $taskType, $t);
+        }
+        // everything fine return reference
+        return $task;
+    }
+
+    /**
+     * Create a task instance and return reference to it
+     * See createTask() for explanation how this works
+     *
+     * @param    string   Type name
+     * @returns  object   A datatype object
+     * @throws   BuildException
+     *           Exception
+     */
+    function createDataType($typeName) {        
+        try {
+            $cls = "";
+            $typelwr = strtolower($typeName);
+            foreach ($this->typedefs as $name => $class) {
+                if (strtolower($name) === $typelwr) {
+                    $cls = StringHelper::unqualify($class);                                    
+                    break;
+                }
+            }
+            
+            if ($cls === "") {
+                return null;
+            }
+            
+            if (!class_exists($cls)) {
+                throw new BuildException("Could not instantiate class $cls, even though a class was specified. (Make sure that the specified class file contains a class with the correct name.)");
+            }
+            
+            $type = new $cls();
+            $this->log("  +Type: $typeName", PROJECT_MSG_DEBUG);
+            if (!($type instanceof DataType)) {
+                throw new Exception("$class is not an instance of phing.types.DataType");
+            }
+            if ($type instanceof ProjectComponent) {
+                $type->setProject($this);
+            }
+        } catch (Exception $t) {
+            throw new BuildException("Could not create type: $typeName", $t);
+        }
+        // everything fine return reference
+        return $type;
+    }
+
+    /**
+     * Executes a list of targets
+     *
+     * @param    array  List of target names to execute
+     * @returns  void
+     * @throws   BuildException
+     */
+    function executeTargets($targetNames) {
+        foreach($targetNames as $tname) {
+            $this->executeTarget($tname);
+        }
+    }
+
+    /**
+     * Executes a target
+     *
+     * @param    string  Name of Target to execute
+     * @returns  void
+     * @throws   BuildException
+     */
+    function executeTarget($targetName) {
+
+        // complain about executing void
+        if ($targetName === null) {
+            throw new BuildException("No target specified");
+        }
+
+        // invoke topological sort of the target tree and run all targets
+        // until targetName occurs.
+        $sortedTargets = $this->_topoSort($targetName, $this->targets);        
+
+        $curIndex = (int) 0;
+        $curTarget = null;
+        do {
+            try {
+                $curTarget = $sortedTargets[$curIndex++];
+                $curTarget->performTasks();
+            } catch (BuildException $exc) {
+                $this->log("Execution of target \"".$curTarget->getName()."\" failed for the following reason: ".$exc->getMessage(), PROJECT_MSG_ERR);
+                throw $exc;
+            }
+        } while ($curTarget->getName() !== $targetName);
+    }
+
+
+    function resolveFile($fileName, $rootDir = null) {
+        if ($rootDir === null) {
+            return $this->fileUtils->resolveFile($this->basedir, $fileName);
+        } else {
+            return $this->fileUtils->resolveFile($rootDir, $fileName);
+        }
+    }    
+
+    /**
+     * Topologically sort a set of Targets.
+     * @param  $root is the (String) name of the root Target. The sort is
+     *         created in such a way that the sequence of Targets until the root
+     *         target is the minimum possible such sequence.
+     * @param  $targets is a array representing a "name to Target" mapping
+     * @return An array of Strings with the names of the targets in
+     *         sorted order.
+     */
+    function _topoSort($root, &$targets) {
+
+        $root     = (string) $root;
+        $ret      = array();
+        $state    = array();
+        $visiting = array();
+
+        // We first run a DFS based sort using the root as the starting node.
+        // This creates the minimum sequence of Targets to the root node.
+        // We then do a sort on any remaining unVISITED targets.
+        // This is unnecessary for doing our build, but it catches
+        // circular dependencies or missing Targets on the entire
+        // dependency tree, not just on the Targets that depend on the
+        // build Target.
+
+        $this->_tsort($root, $targets, $state, $visiting, $ret);
+
+        $retHuman = "";
+        for ($i=0, $_i=count($ret); $i < $_i; $i++) {
+            $retHuman .= $ret[$i]->toString()." ";
+        }
+        $this->log("Build sequence for target '$root' is: $retHuman", PROJECT_MSG_VERBOSE);
+
+        $keys = array_keys($targets);
+        while($keys) {
+            $curTargetName = (string) array_shift($keys);
+            if (!isset($state[$curTargetName])) {
+                $st = null;
+            } else {
+                $st = (string) $state[$curTargetName];
+            }
+
+            if ($st === null) {
+                $this->_tsort($curTargetName, $targets, $state, $visiting, $ret);
+            } elseif ($st === "VISITING") {
+                throw new Exception("Unexpected node in visiting state: $curTargetName");
+            }
+        }
+
+        $retHuman = "";
+        for ($i=0,$_i=count($ret); $i < $_i; $i++) {
+            $retHuman .= $ret[$i]->toString()." ";
+        }
+        $this->log("Complete build sequence is: $retHuman", PROJECT_MSG_VERBOSE);
+
+        return $ret;
+    }
+
+    // one step in a recursive DFS traversal of the target dependency tree.
+    // - The array "state" contains the state (VISITED or VISITING or null)
+    //   of all the target names.
+    // - The stack "visiting" contains a stack of target names that are
+    //   currently on the DFS stack. (NB: the target names in "visiting" are
+    //    exactly the target names in "state" that are in the VISITING state.)
+    // 1. Set the current target to the VISITING state, and push it onto
+    //    the "visiting" stack.
+    // 2. Throw a BuildException if any child of the current node is
+    //    in the VISITING state (implies there is a cycle.) It uses the
+    //    "visiting" Stack to construct the cycle.
+    // 3. If any children have not been VISITED, tsort() the child.
+    // 4. Add the current target to the Vector "ret" after the children
+    //    have been visited. Move the current target to the VISITED state.
+    //    "ret" now contains the sorted sequence of Targets upto the current
+    //    Target.
+
+    function _tsort($root, &$targets, &$state, &$visiting, &$ret) {
+        $state[$root] = "VISITING";
+        $visiting[]  = $root;
+
+        if (!isset($targets[$root]) || !($targets[$root] instanceof Target)) {
+            $target = null;
+        } else {
+            $target = $targets[$root];
+        }
+
+        // make sure we exist
+        if ($target === null) {
+            $sb = "Target '$root' does not exist in this project.";
+            array_pop($visiting);
+            if (!empty($visiting)) {
+                $parent = (string) $visiting[count($visiting)-1];
+                $sb .= "It is used from target '$parent'.";
+            }
+            throw new BuildException($sb);
+        }
+
+        $deps = $target->getDependencies();
+
+        while($deps) {
+            $cur = (string) array_shift($deps);
+            if (!isset($state[$cur])) {
+                $m = null;
+            } else {
+                $m = (string) $state[$cur];
+            }
+            if ($m === null) {
+                // not been visited
+                $this->_tsort($cur, $targets, $state, $visiting, $ret);
+            } elseif ($m == "VISITING") {
+                // currently visiting this node, so have a cycle
+                throw $this->_makeCircularException($cur, $visiting);
+            }
+        }
+
+        $p = (string) array_pop($visiting);
+        if ($root !== $p) {
+            throw new Exception("Unexpected internal error: expected to pop $root but got $p");
+        }
+
+        $state[$root] = "VISITED";
+        $ret[] = $target;
+    }
+
+    function _makeCircularException($end, $stk) {
+        $sb = "Circular dependency: $end";
+        do {
+            $sb .= " <- ".(string) array_pop($stk);
+        } while($c != $end);
+        return new BuildException($sb);
+    }
+
+    /**
+     * Adds a reference to an object. This method is called when the parser
+     * detects a id="foo" attribute. It passes the id as $name and a reference
+     * to the object assigned to this id as $value
+     */
+    function addReference($name, $object) {
+        if (isset($this->references[$name])) {
+            $this->log("Overriding previous definition of reference to $name", PROJECT_MSG_WARN);
+        }
+        $this->log("Adding reference: $name -> ".get_class($object), PROJECT_MSG_DEBUG);
+        $this->references[$name] = $object;
+    }
+
+    /**
+     * Returns the references array.
+     * @return array
+     */
+    function getReferences() {
+        return $this->references;
+    }
+	
+	/**
+	 * Returns a specific reference.
+	 * @param string $key The reference id/key.
+	 * @return object or null if not defined
+	 */
+	function getReference($key)
+	{
+		if (isset($this->references[$key])) {
+		    return $this->references[$key];
+		}
+		return null; // just to be explicit
+	}
+
+    /**
+     * Abstracting and simplifyling Logger calls for project messages
+     */
+    function log($msg, $level = PROJECT_MSG_INFO) {
+        $this->logObject($this, $msg, $level);
+    }
+
+    function logObject($obj, $msg, $level) {
+        $this->fireMessageLogged($obj, $msg, $level);
+    }
+
+    function addBuildListener(BuildListener $listener) {
+        $this->listeners[] = $listener;
+    }
+
+    function removeBuildListener(BuildListener $listener) {
+        $newarray = array();
+        for ($i=0, $size=count($this->listeners); $i < $size; $i++) {
+            if ($this->listeners[$i] !== $listener) {
+                $newarray[] = $this->listeners[$i];
+            }
+        }
+        $this->listeners = $newarray;
+    }
+
+    function getBuildListeners() {
+        return $this->listeners;
+    }
+
+    function fireBuildStarted() {
+        $event = new BuildEvent($this);        
+        foreach($this->listeners as $listener) {
+            $listener->buildStarted($event);
+        }
+    }
+
+    function fireBuildFinished($exception) {        
+        $event = new BuildEvent($this);
+        $event->setException($exception);
+        foreach($this->listeners as $listener) {
+            $listener->buildFinished($event);
+        }
+    }
+
+    function fireTargetStarted($target) {
+        $event = new BuildEvent($target);        
+           foreach($this->listeners as $listener) {
+            $listener->targetStarted($event);
+        }
+    }
+
+    function fireTargetFinished($target, $exception) {
+        $event = new BuildEvent($target);        
+        $event->setException($exception);
+        foreach($this->listeners as $listener) {
+            $listener->targetFinished($event);
+        }
+    }
+
+    function fireTaskStarted($task) {
+        $event = new BuildEvent($task);        
+        foreach($this->listeners as $listener) {
+            $listener->taskStarted($event);
+        }
+    }
+
+    function fireTaskFinished($task, $exception) {
+        $event = new BuildEvent($task);        
+        $event->setException($exception);
+        foreach($this->listeners as $listener) {
+            $listener->taskFinished($event);
+        }
+    }
+
+    function fireMessageLoggedEvent($event, $message, $priority) {
+        $event->setMessage($message, $priority);
+        foreach($this->listeners as $listener) {
+            $listener->messageLogged($event);
+        }
+    }
+
+    function fireMessageLogged($object, $message, $priority) {
+        $this->fireMessageLoggedEvent(new BuildEvent($object), $message, $priority);
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Project.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/ProjectComponent.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/ProjectComponent.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/ProjectComponent.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,72 @@
+<?php
+/*
+ *  $Id: ProjectComponent.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ *  Abstract class providing properties and methods common to all
+ *  the project components
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @author    Hans Lellelid <hans en xmpl.org> 
+ * @version   $Revision: 1.5 $
+ * @package   phing
+ */
+abstract class ProjectComponent {
+
+    /**
+     *  Holds a reference to the project that a project component
+     *  (a task, a target, etc.) belongs to
+     *
+     *  @var    object  A reference to the current project instance
+     */
+    protected $project = null;
+
+    /**
+     *  References the project to the current component.
+     *
+     *  @param    object    The reference to the current project
+     *  @access   public
+     */
+    function setProject($project) {
+        $this->project = $project;
+    }
+
+    /**
+     *  Returns a reference to current project
+     *
+     *  @return   object   Reference to current porject object
+     *  @access   public
+     */
+    function getProject() {
+        return $this->project;
+    }
+
+    /**
+     *  Logs a message with the given priority.
+     *
+     *  @param  string   The message to be logged.
+     *  @param  integer  The message's priority at this message should have
+     */
+    public function log($msg, $level = PROJECT_MSG_INFO) {
+        if ($this->project !== null) {
+            $this->project->log($msg, $level);
+        }
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/ProjectComponent.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/RuntimeConfigurable.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/RuntimeConfigurable.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/RuntimeConfigurable.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,118 @@
+<?php
+/*
+ *  $Id: RuntimeConfigurable.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ *  Wrapper class that holds the attributes of a Task (or elements
+ *  nested below that level) and takes care of configuring that element
+ *  at runtime.
+ *
+ *  <strong>SMART-UP INLINE DOCS</strong>
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.6 $
+ * @package   phing
+ */
+class RuntimeConfigurable {
+
+    private $elementTag = null;
+    private $children = array();
+    private $wrappedObject = null;
+    private $attributes = array();
+    private $characters = "";
+
+
+    /** @param proxy The element to wrap. */
+    function __construct($proxy, $elementTag) {
+        $this->wrappedObject = $proxy;
+        $this->elementTag = $elementTag;
+    }
+
+    function setProxy($proxy) {
+        $this->wrappedObject = $proxy;
+    }
+
+    /** Set's the attributes for the wrapped element. */
+    function setAttributes($attributes) {
+        $this->attributes = $attributes;
+    }
+
+    /** Returns the AttributeList of the wrapped element. */
+    function getAttributes() {
+        return $this->attributes;
+    }
+
+    /** Adds child elements to the wrapped element. */
+    function addChild(RuntimeConfigurable $child) {
+        $this->children[] = $child;
+    }
+
+    /** Returns the child with index */
+    function getChild($index) {
+        return $this->children[(int)$index];
+    }
+
+    /** Add characters from #PCDATA areas to the wrapped element. */
+    function addText($data) {
+        $this->characters .= (string) $data;
+    }
+
+    function getElementTag() {
+        return $this->elementTag;
+    }
+
+
+    /** Configure the wrapped element and all children. */
+    function maybeConfigure(Project $project) {
+        $id = null;
+
+        // DataType configured in ProjectConfigurator
+        //        if ( is_a($this->wrappedObject, "DataType") )
+        //            return;
+
+        if ($this->attributes || $this->characters) {
+            ProjectConfigurator::configure($this->wrappedObject, $this->attributes, $project);
+
+            if (isset($this->attributes["id"])) {
+                $id = $this->attributes["id"];
+            }
+
+            $this->attributes = null;
+
+            if ($this->characters) {
+                ProjectConfigurator::addText($project, $this->wrappedObject, (string) $this->characters);
+                $this->characters="";
+            }
+            if ($id !== null) {
+                $project->addReference($id, $this->wrappedObject);
+            }
+        }
+
+        if ( is_array($this->children) && !empty($this->children) ) {
+            // Configure all child of this object ...
+            foreach($this->children as $child) {
+                $child->maybeConfigure($project);
+                ProjectConfigurator::storeChild($project, $this->wrappedObject, $child->wrappedObject, strtolower($child->getElementTag()));
+            }
+        }
+    }
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/RuntimeConfigurable.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Target.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Target.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Target.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,317 @@
+<?php
+/*
+ * $Id: Target.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/TaskContainer.php';
+
+/**
+ *  The Target component. Carries all required target data. Implements the
+ *  abstract class {@link TaskContainer}
+ *
+ *  @author    Andreas Aderhold <andi en binarycloud.com>
+ *  @copyright © 2001,2002 THYRELL. All rights reserved
+ *  @version   $Revision: 1.10 $ $Date$
+ *  @access    public
+ *  @see       TaskContainer
+ *  @package   phing
+ */
+
+class Target implements TaskContainer {
+    
+    /** name of target */
+    private $name;
+    
+    /** dependencies */
+    private $dependencies = array();
+    
+    /** holds objects of children of this target */
+    private $children = array();
+    
+    /** the if cond. from xml */
+    private $ifCondition = "";
+    
+    /** the unless cond. from xml */
+    private $unlessCondition = "";
+    
+    /** description of this target */
+    private $description;
+    
+    /** reference to project */
+    private $project;
+
+    /**
+     *  References the project to the current component.
+     *
+     *  @param Project The reference to the current project
+     */
+    public function setProject(Project $project) {
+        $this->project = $project;
+    }
+
+    /**
+     *  Returns reference to current project
+     *
+     *  @return Project Reference to current porject object
+     */
+    public function getProject() {
+        return $this->project;
+    }
+
+    /**
+     *  Sets the target dependencies from xml
+     *
+     *  @param string $depends Comma separated list of targetnames that depend on
+     *                  this target
+     *  @throws BuildException
+     */
+    public function setDepends($depends) {
+        // explode should be faster than strtok
+        $deps = explode(',', $depends);
+        for ($i=0, $size=count($deps); $i < $size; $i++) {
+            $trimmed = trim($deps[$i]);
+            if ($trimmed === "") {
+                throw new BuildException("Syntax Error: Depend attribute for target ".$this->getName()." is malformed.");
+            } 
+            $this->addDependency($trimmed);
+        }
+    }
+
+    /**
+     *  Adds a singular dependent target name to the list
+     *
+     *  @param   string   The dependency target to add
+     *  @access  public
+     */
+    public function addDependency($dependency) {
+        $this->dependencies[] = (string) $dependency;
+    }
+
+    /**
+     *  Returns reference to indexed array of the dependencies this target has.
+     *
+     *  @return  array  Referece to target dependencoes
+     */
+    public function getDependencies() {
+        return $this->dependencies;
+    }
+
+    /**
+     *  Sets the name of the target
+     *
+     *  @param  string   Name of this target
+     */
+    public function setName($name) {
+        $this->name = (string) $name;
+    }
+
+    /**
+     *  Returns name of this target.
+     *
+     *  @return  string     The name of the target
+     *  @access   public
+     */
+    function getName() {
+        return (string) $this->name;
+    }
+
+    /**
+     *  Adds a task element to the list of this targets child elements
+     *
+     *  @param   object  The task object to add
+     *  @access  public
+     */
+    function addTask(Task $task) {
+        $this->children[] = $task;
+    }
+
+    /**
+     *  Adds a runtime configurable element to the list of this targets child
+     *  elements.
+     *
+     *  @param   object  The RuntimeConfigurabel object
+     *  @access  public
+     */
+    function addDataType($rtc) {
+        $this->children[] = $rtc;
+    }
+
+    /**
+     *  Returns an array of all tasks this target has as childrens.
+     *
+     *  The task objects are copied here. Don't use this method to modify
+     *  task objects.
+     *
+     *  @return  array  Task[]
+     */
+    public function getTasks() {
+        $tasks = array();
+        for ($i=0,$size=count($this->children); $i < $size; $i++) {
+            $tsk = $this->children[$i];
+            if ($tsk instanceof Task) {
+                // note: we're copying objects here!
+                $tasks[] = clone $tsk;
+            }
+        }
+        return $tasks;
+    }
+
+    /**
+     *  Set the if-condition from the XML tag, if any. The property name given
+     *  as parameter must be present so the if condition evaluates to true
+     *
+     *  @param   string  The property name that has to be present
+     *  @access  public
+     */
+    public function setIf($property) {
+        $this->ifCondition = ($property === null) ? "" : $property;
+    }
+
+    /**
+     *  Set the unless-condition from the XML tag, if any. The property name
+     *  given as parameter must be present so the unless condition evaluates
+     *  to true
+     *
+     *  @param   string  The property name that has to be present
+     *  @access  public
+     */
+    public function setUnless($property) {
+        $this->unlessCondition = ($property === null) ? "" : $property;
+    }
+
+    /**
+     *  Sets a textual description of this target.
+     *
+     *  @param string The description text
+     */
+    public function setDescription($description) {
+        if ($description !== null && strcmp($description, "") !== 0) {
+            $this->description = (string) $description;
+        } else {
+            $this->description = null;
+        }
+    }
+
+    /**
+     *  Returns the description of this target.
+     *
+     *  @return string The description text of this target
+     */
+    public function getDescription() {
+        return $this->description;
+    }
+
+    /**
+     *  Returns a string representation of this target. In our case it
+     *  simply returns the target name field
+     *
+     *  @return string The string representation of this target
+     */
+    function toString() {
+        return (string) $this->name;
+    }
+
+    /**
+     *  The entry point for this class. Does some checking, then processes and
+     *  performs the tasks for this target.
+     *
+     */
+    public function main() {
+        if ($this->testIfCondition() && $this->testUnlessCondition()) {
+            foreach($this->children as $o) {
+                if ($o instanceof Task) {
+                    // child is a task
+                    $o->perform();
+                } else {
+                    // child is a RuntimeConfigurable
+                    $o->maybeConfigure($this->project);
+                }
+            }
+        } elseif (!$this->testIfCondition()) {
+            $this->project->log("Skipped target '".$this->name."' because property '".$this->ifCondition."' not set.", PROJECT_MSG_VERBOSE);
+        } else {
+            $this->project->log("Skipped target '".$this->name."' because property '".$this->unlessCondition."' set.", PROJECT_MSG_VERBOSE);
+        }
+    }
+
+    /**
+     *  Performs the tasks by calling the main method of this target that
+     *  actually executes the tasks.
+     *
+     *  This method is for ZE2 and used for proper exception handling of
+     *  task exceptions.
+     */
+    public function performTasks() {
+        try {// try to execute this target
+            $this->project->fireTargetStarted($this);
+            $this->main();
+            $this->project->fireTargetFinished($this, $null=null);
+        } catch (Exception $exc) {
+            // log here and rethrow
+            $this->project->fireTargetFinished($this, $exc);
+            throw $exc;
+        }
+    }    
+
+    /**
+     *  Tests if the property set in ifConfiditon exists.
+     *
+     *  @return  boolean  <code>true</code> if the property specified
+     *                    in <code>$this->ifCondition</code> exists;
+     *                    <code>false</code> otherwise
+     */
+    private function testIfCondition() {
+        if ($this->ifCondition === "") {
+            return true;
+        }
+
+        $properties = explode(",", $this->ifCondition);
+
+        $result = true;
+        foreach ($properties as $property) {
+            $test = ProjectConfigurator::replaceProperties($this->getProject(), $property, $this->project->getProperties());
+            $result = $result && ($this->project->getProperty($test) !== null);
+        }
+
+        return $result;
+    }
+
+    /**
+     *  Tests if the property set in unlessCondition exists.
+     *
+     *  @return  boolean  <code>true</code> if the property specified
+     *                    in <code>$this->unlessCondition</code> exists;
+     *                    <code>false</code> otherwise
+     */
+    private function testUnlessCondition() {
+        if ($this->unlessCondition === "") {
+            return true;
+        }
+        
+        $properties = explode(",", $this->unlessCondition);
+
+        $result = true;
+        foreach ($properties as $property) {
+            $test = ProjectConfigurator::replaceProperties($this->getProject(), $property, $this->project->getProperties());
+            $result = $result && ($this->project->getProperty($test) === null);
+        }
+        return $result;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Target.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Task.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Task.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Task.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,266 @@
+<?php
+/*
+ *  $Id: Task.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/ProjectComponent.php';
+include_once 'phing/RuntimeConfigurable.php';
+
+/**
+ * The base class for all Tasks.
+ *
+ * Use {@link Project#createTask} to register a new Task.
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @copyright © 2001,2002 THYRELL. All rights reserved
+ * @version   $Revision: 1.11 $
+ * @see       Project#createTask()
+ * @package   phing
+ */
+abstract class Task extends ProjectComponent {
+
+    /** owning Target object */
+    protected $target;
+    
+    /** description of the task */
+    protected $description;
+    
+    /** internal taskname (req) */
+    protected $taskType;
+    
+    /** taskname for logger */
+    protected $taskName;
+    
+    /** stored buildfile location */
+    protected $location;
+    
+    /** wrapper of the task */
+    protected $wrapper;
+
+    /**
+     * Sets the owning target this task belongs to.
+     *
+     * @param   object  Reference to owning target
+     * @access  public
+     */
+    function setOwningTarget(Target $target) {
+        $this->target = $target;
+    }
+
+    /**
+     *  Returns the owning target of this task.
+     *
+     *  @return  object    The target object that owns this task
+     *  @access  public
+     */
+    function getOwningTarget() {
+        return $this->target;
+    }
+
+    /**
+     *  Returns the name of task, used only for log messages
+     *
+     *  @return  string  Name of this task
+     *  @access  public
+     */
+    function getTaskName() {
+        if ($this->taskName === null) {
+            // if no task name is set, then it's possible
+            // this task was created from within another task.  We don't
+            // therefore know the XML tag name for this task, so we'll just
+            // use the class name stripped of "task" suffix.  This is only
+            // for log messages, so we don't have to worry much about accuracy.
+            return preg_replace('/task$/i', '', get_class($this));
+        }
+        return $this->taskName;
+    }
+
+    /**
+     *  Sets the name of this task for log messages
+     *
+     *  @return  string  A string representing the name of this task for log
+     *  @access  public
+     */
+    function setTaskName($name) {
+        $this->taskName = (string) $name;
+    }
+
+    /**
+     *  Returns the name of the task under which it was invoked,
+     *  usually the XML tagname
+     *
+     *  @return string The type of this task (XML Tag)
+     */
+    function getTaskType() {
+        return $this->taskType;
+    }
+
+    /**
+     *  Sets the type of the task. Usually this is the name of the XML tag
+     *
+     *  @param string The type of this task (XML Tag)
+     */
+    function setTaskType($name) {
+        $this->taskType = (string) $name;
+    }
+	
+	/**
+	 * Returns a name 
+	 * 
+	 */
+	protected function getRegisterSlot($slotName) {
+		return Register::getSlot('task.' . $this->getTaskName() . '.' . $slotName);
+	}
+	
+    /**
+     *  Provides a project level log event to the task.
+     *
+     *  @param string  The message to log
+     *  @param integer The priority of the message
+     *  @see BuildEvent
+     *  @see BuildListener
+     */
+    function log($msg, $level = PROJECT_MSG_INFO) {
+        $this->project->logObject($this, $msg, $level);
+    }
+
+    /**
+     *  Sets a textual description of the task
+     *
+     *  @param    string    The text describing the task
+     */
+    public function setDescription($desc) {
+        $this->description = $desc;
+    }
+
+    /**
+     *  Returns the textual description of the task
+     *
+     *  @return  string  The text description of the task
+     */
+    public function getDescription() {
+        return $this->description;
+    }
+
+    /**
+     *  Called by the parser to let the task initialize properly.
+     *  Should throw a BuildException if something goes wrong with the build
+     *
+     *  This is abstract here, but may not be overloaded by subclasses.
+     *
+     * @throws BuildException
+     */
+    public function init() {
+    }
+
+    /**
+     *  Called by the project to let the task do it's work. This method may be
+     *  called more than once, if the task is invoked more than once. For
+     *  example, if target1 and target2 both depend on target3, then running
+     *  <em>phing target1 target2</em> will run all tasks in target3 twice.
+     *
+     *  Should throw a BuildException if someting goes wrong with the build
+     *
+     *  This is abstract here. Must be overloaded by real tasks.
+     *
+     *  @access  public
+     */
+    abstract function main();
+
+    /**
+     *  Returns the location within the buildfile this task occurs. Used
+     *  by {@link BuildException} to give detailed error messages.
+     *
+     *  @return Location The location object describing the position of this
+     *                   task within the buildfile.
+     */
+    function getLocation() {
+        return $this->location;
+    }
+
+    /**
+     *  Sets the location within the buildfile this task occurs. Called by
+     *  the parser to set location information.
+     *
+     *  @return  object  The location object describing the position of this
+     *                   task within the buildfile.
+     *  @access  public
+     */
+    function setLocation(Location $location) {
+        $this->location = $location;
+    }
+
+    /**
+     *  Returns the wrapper object for runtime configuration
+     *
+     *  @return  object  The wrapper object used by this task
+     *  @access  public
+     */
+    function getRuntimeConfigurableWrapper() {
+        if ($this->wrapper === null) {
+            $this->wrapper = new RuntimeConfigurable($this, $this->getTaskName());
+        }
+        return $this->wrapper;
+    }
+
+    /**
+     *  Sets the wrapper object this task should use for runtime
+     *  configurable elements.
+     *
+     *  @param   object  The wrapper object this task should use
+     *  @access  public
+     */
+    function setRuntimeConfigurableWrapper(RuntimeConfigurable $wrapper) {
+        $this->wrapper = $wrapper;
+    }
+
+    /**
+     *  Configure this task if it hasn't been done already.
+     *
+     *  @access  public
+     */
+    function maybeConfigure() {
+        if ($this->wrapper !== null) {
+            $this->wrapper->maybeConfigure($this->project);
+        }
+    }
+
+    /**
+     *  Perfrom this task
+     *
+     *  @access  public
+     */
+    function perform() {
+
+        try { // try executing task
+            $this->project->fireTaskStarted($this);
+            $this->maybeConfigure();
+            $this->main();
+            $this->project->fireTaskFinished($this, $null=null);
+        } catch (Exception $exc) {
+            if ($exc instanceof BuildException) {
+                if ($exc->getLocation() === null) {
+                    $exc->setLocation($this->getLocation());
+                }
+            }
+            $this->project->fireTaskFinished($this, $exc);
+            throw $exc;
+        }
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/Task.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/TaskAdapter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/TaskAdapter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/TaskAdapter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,84 @@
+<?php
+/*
+ *  $Id: TaskAdapter.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+
+/**
+ *  Use introspection to "adapt" an arbitrary ( not extending Task, but with
+ *  similar patterns).
+ *
+ *  @author    Andreas Aderhold <andi en binarycloud.com>
+ *  @copyright © 2001,2002 THYRELL. All rights reserved
+ *  @version   $Revision: 1.7 $
+ *  @package   phing
+ */
+class TaskAdapter extends Task {
+    
+    /** target object */
+    private $proxy;
+    
+    /**
+     * Main entry point.
+     * @return void
+     */
+    function main() {
+    
+        if (method_exists($this->proxy, "setProject")) {
+            try {  // try to set project
+                $this->proxy->setProject($this->project);
+            } catch (Exception $ex) {
+                $this->log("Error setting project in " . get_class($this->proxy) . PROJECT_MSG_ERR);
+                throw new BuildException($ex);
+            }
+        } else {
+            throw new Exception("Error setting project in class " . get_class($this->proxy));
+        }
+               
+        if (method_exists($this->proxy, "main")) {
+            try { //try to call main
+                $this->proxy->main($this->project);
+            } catch (Exception $ex) {
+                $this->log("Error in " . get_class($this->proxy), PROJECT_MSG_ERR);
+                throw new BuildException($ex->getMessage());
+            }
+        } else {
+            throw new BuildException("Your task-like class '" . get_class($this->proxy) ."' does not have a main() method");
+        }
+    }
+
+    /**
+     * Set the target object.
+     * @param object $o
+     * @return void
+     */
+    function setProxy($o) {
+        $this->proxy = $o;
+    }
+
+    /**
+     * Gets the target object.
+     * @return object
+     */
+    function getProxy() {
+        return $this->proxy;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/TaskAdapter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/TaskContainer.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/TaskContainer.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/TaskContainer.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,42 @@
+<?php
+/*
+ *  $Id: TaskContainer.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ *  Abstract interface for objects which can contain tasks (targets)
+ *  Used to check if a class can contain tasks (via instanceof)
+ *
+ *  @author    Andreas Aderhold <andi en binarycloud.com>
+ *  @copyright © 2001,2002 THYRELL. All rights reserved
+ *  @version   $Revision: 1.5 $ $Date$
+ *  @access    public
+ *  @package   phing
+ */
+interface TaskContainer {
+
+    /**
+     *  Adds a task to this task container. Must be implemented
+     *  by derived class
+     *
+     *  @param  object  The task to be added to the container
+     *  @access public
+     */
+    function addTask(Task $task);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/TaskContainer.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/UnknownElement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/UnknownElement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/UnknownElement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,211 @@
+<?php
+/*
+ *  $Id: UnknownElement.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+
+/**
+ * Wrapper class that holds all information necessary to create a task
+ * that did not exist when Phing started.
+ *
+ * <em> This has something to do with phing encountering an task XML element
+ * it is not aware of at start time. This is a situation where special steps
+ * need to be taken so that the element is then known.</em>
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.9 $
+ * @package   phing
+ */
+class UnknownElement extends Task {
+
+    private $elementName;
+    private $realThing;
+    private $children = array();
+
+    /**
+     * Constructs a UnknownElement object
+     *
+     * @param    string  The XML element name that is unknown
+     * @access   public
+     */
+    function __construct($elementName) {
+        $this->elementName = (string) $elementName;
+    }
+
+    /**
+     * Return the XML element name that this <code>UnnownElement</code>
+     * handles.
+     *
+     * @return  string  The XML element name that is unknown
+     */
+    public function getTag() {
+        return (string) $this->elementName;
+    }
+
+    /**
+     * Tries to configure the unknown element
+     *
+     * @throws  BuildException if the element can not be configured
+     */
+    public function maybeConfigure() {
+    
+        $this->realThing = $this->makeObject($this, $this->wrapper);
+        $this->wrapper->setProxy($this->realThing);
+        if ($this->realThing instanceof Task) {
+            $this->realThing->setRuntimeConfigurableWrapper($this->wrapper);
+        }
+    
+        $this->handleChildren($this->realThing, $this->wrapper);
+        $this->wrapper->maybeConfigure($this->getProject());
+                                    
+    }
+
+    /**
+     * Called when the real task has been configured for the first time.
+     *
+     * @throws  BuildException if the task can not be created
+     */
+    public function main() {
+    
+        if ($this->realThing === null) {
+            // plain impossible to get here, maybeConfigure should
+            // have thrown an exception.
+            throw new BuildException("Should not be executing UnknownElement::main() -- task/type: {$this->elementName}");
+        }
+        
+        if ($this->realThing instanceof Task) {
+            $this->realThing->main();
+        }
+        
+    }
+
+    /**
+     * Add a child element to the unknown element
+     *
+     * @param   object  The object representing the child element
+     */
+    public function addChild(UnknownElement $child) {
+        $this->children[] = $child;
+    }
+
+    /**
+     *  Handle child elemets of the unknown element, if any.
+     *
+     *  @param ProjectComponent The parent object the unkown element belongs to
+     *  @param object The parent wrapper object
+     */
+    function handleChildren(ProjectComponent $parent, $parentWrapper) {
+
+        if ($parent instanceof TaskAdapter) {
+            $parent = $parent->getProxy();
+        }
+
+        $parentClass = get_class($parent);
+        $ih = IntrospectionHelper::getHelper($parentClass);
+
+        for ($i=0, $childrenCount=count($this->children); $i < $childrenCount; $i++) {
+
+            $childWrapper = $parentWrapper->getChild($i);
+            $child = $this->children[$i];
+            $realChild = null;
+            if ($parent instanceof TaskContainer) {
+                $realChild = $this->makeTask($child, $childWrapper, false);
+                $parent->addTask($realChild);
+            } else {
+                $realChild = $ih->createElement($this->project, $parent, $child->getTag());
+            }
+
+            $childWrapper->setProxy($realChild);
+            if ($realChild instanceof Task) {
+                $realChild->setRuntimeConfigurableWrapper($childWrapper);
+            }
+
+            $child->handleChildren($realChild, $childWrapper);
+            if ($realChild instanceof Task) {
+                $realChild->maybeConfigure();
+            }
+        }
+    }
+
+    /**
+     * Creates a named task or data type. If the real object is a task,
+     * it is configured up to the init() stage.
+     *
+     * @param UnknownElement $ue The unknown element to create the real object for.
+     *           Must not be <code>null</code>.
+     * @param RuntimeConfigurable $w  Ignored in this implementation.
+     * @return object The Task or DataType represented by the given unknown element.
+     */
+    protected function makeObject(UnknownElement $ue, RuntimeConfigurable $w) {
+        $o = $this->makeTask($ue, $w, true);
+        if ($o === null) {
+            $o = $this->project->createDataType($ue->getTag());
+        }
+        if ($o === null) {
+            throw new BuildException("Could not create task/type: '".$ue->getTag()."'. Make sure that this class has been declared using taskdef / typedef.");
+        }
+        return $o;
+    }
+    
+    /**
+     *  Create a named task and configure it up to the init() stage.
+     *
+     * @param UnknownElement $ue The unknwon element to create a task from
+     * @param RuntimeConfigurable $w The wrapper object
+     * @param boolean $onTopLevel Whether to treat this task as if it is top-level.
+     * @return Task The freshly created task
+     */
+    protected function makeTask(UnknownElement $ue, RuntimeConfigurable $w, $onTopLevel = false) {
+
+        $task = $this->project->createTask($ue->getTag());
+
+        if ($task === null) {
+            if (!$onTopLevel) {
+                throw new BuildException("Could not create task of type: '".$this->elementName."'. Make sure that this class has been declared using taskdef.");
+            }
+            return null;            
+        }
+
+        // used to set the location within the xmlfile so that exceptions can
+        // give detailed messages
+
+        $task->setLocation($this->getLocation());
+        $attrs = $w->getAttributes();
+        if (isset($attrs['id'])) {
+            $this->project->addReference($attrs['id'], $task);
+        }
+
+        // UnknownElement always has an associated target
+        $task->setOwningTarget($this->target);
+
+        $task->init();
+        return $task;
+    }
+
+    /**
+     *  Get the name of the task to use in logging messages.
+     *
+     *  @return  string  The task's name
+     */
+    function getTaskName() {
+        return $this->realThing === null ? parent::getTaskName() : $this->realThing->getTaskName();
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/UnknownElement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/BaseFilterReader.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/BaseFilterReader.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/BaseFilterReader.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,157 @@
+<?php
+
+/*
+ *  $Id: BaseFilterReader.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/system/io/FilterReader.php';
+include_once 'phing/system/io/StringReader.php';
+
+
+/**
+ * Base class for core filter readers.
+ *
+ * @author    <a href="mailto:yl en seasonfive.com">Yannick Lecaillez</a>
+ * @version   $Revision: 1.8 $ $Date$
+ * @access    public
+ * @see       FilterReader
+ * @package   phing.filters
+ */
+class BaseFilterReader extends FilterReader {
+    
+    /** Have the parameters passed been interpreted? */
+    protected $initialized = false;
+    
+    /** The Phing project this filter is part of. */
+    protected $project = null;
+
+    /**
+     * Constructor used by Phing's introspection mechanism.
+     * The original filter reader is only used for chaining
+     * purposes, never for filtering purposes (and indeed
+     * it would be useless for filtering purposes, as it has
+     * no real data to filter). ChainedReaderHelper uses
+     * this placeholder instance to create a chain of real filters.
+     * 
+     * @param Reader $in
+     */
+    function __construct($in = null) {
+        if ($in === null) {
+            $dummy = "";
+            $in = new StringReader($dummy);
+        }
+        parent::__construct($in);
+    }
+
+    /**
+     * Returns the initialized status.
+     * 
+     * @return boolean whether or not the filter is initialized
+     */
+    function getInitialized() {
+        return $this->initialized;
+    }
+
+    /**
+     * Sets the initialized status.
+     * 
+     * @param boolean $initialized Whether or not the filter is initialized.
+     */
+    function setInitialized($initialized) {
+        $this->initialized = (boolean) $initialized;
+    }
+
+    /**
+     * Sets the project to work with.
+     * 
+     * @param object $project The project this filter is part of. 
+     *                Should not be <code>null</code>.
+     */
+    function setProject(Project $project) {
+        // type check, error must never occur, bad code of it does      
+        $this->project = $project;
+    }
+
+    /**
+     * Returns the project this filter is part of.
+     * 
+     * @return object The project this filter is part of
+     */
+    function getProject() {
+        return $this->project;
+    }
+
+    /**
+     * Reads characters.
+     *
+     * @param  off  Offset at which to start storing characters.
+     * @param  len  Maximum number of characters to read.
+     *
+     * @return Characters read, or -1 if the end of the stream
+     *         has been reached
+     *
+     * @throws IOException If an I/O error occurs
+     */
+    function read($len = null) {
+        return $this->in->read($len);
+    }
+
+    /**
+     * Reads a line of text ending with '\n' (or until the end of the stream).
+     * The returned String retains the '\n'.
+     * 
+     * @return the line read, or <code>null</code> if the end of the
+               stream has already been reached
+     * 
+     * @throws IOException if the underlying reader throws one during 
+     *                        reading
+     */
+    function readLine() {
+        $line = null;
+
+        while ( ($ch = $this->in->read(1)) !== -1 ) {
+            $line .= $ch;
+            if ( $ch === "\n" )
+                break;
+        }
+
+        return $line;
+    }
+    
+    /**
+     * Returns whether the end of file has been reached with input stream.
+     * @return boolean
+     */ 
+    function eof() {
+        return $this->in->eof();
+    }
+    
+    /**
+     * Convenience method to support logging in filters.
+     * @param string $msg Message to log.
+     * @param int $level Priority level.
+     */
+    function log($msg, $level = PROJECT_MSG_INFO) {
+        if ($this->project !== null) {
+            $this->project->log("[filter:".get_class($this)."] ".$msg, $level);    
+        }
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/BaseFilterReader.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/BaseParamFilterReader.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/BaseParamFilterReader.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/BaseParamFilterReader.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,69 @@
+<?php
+
+/*
+ *  $Id: BaseParamFilterReader.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/filters/BaseFilterReader.php';
+include_once 'phing/types/Parameterizable.php';
+include_once 'phing/types/Parameter.php';
+
+/**
+ * Base class for core filter readers.
+ *
+ * @author <a href="mailto:yl en seasonfive.com">Yannick Lecaillez</a>
+ * @copyright © 2003 seasonfive. All rights reserved
+ * @version   $Revision: 1.5 $ $Date$
+ * @access    public
+ * @see       FilterReader
+ * @package   phing.filters
+ */
+class BaseParamFilterReader extends BaseFilterReader implements Parameterizable {
+    
+    /** The passed in parameter array. */
+    protected $_parameters = array();
+    
+    /*
+     * Sets the parameters used by this filter, and sets
+     * the filter to an uninitialized status.
+     * 
+     * @param array Array of parameters to be used by this filter.
+     *              Should not be <code>null</code>.
+    */
+    function setParameters($parameters) {
+        // type check, error must never occur, bad code of it does
+        if ( !is_array($parameters) ) {
+            throw new Exception("Expected parameters array got something else");            
+        }
+
+        $this->_parameters = $parameters;
+        $this->setInitialized(false);
+    }
+
+    /*
+     * Returns the parameters to be used by this filter.
+     * 
+     * @return the parameters to be used by this filter
+    */
+    function &getParameters() {
+        return $this->_parameters;
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/BaseParamFilterReader.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ChainableReader.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ChainableReader.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ChainableReader.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,42 @@
+<?php
+
+/*
+ *  $Id: ChainableReader.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+/**
+ * Interface indicating that a reader may be chained to another one.
+ *
+ * @author Magesh Umasankar
+ */
+interface ChainableReader {
+
+    /**
+     * Returns a reader with the same configuration as this one,
+     * but filtering input from the specified reader.
+     * 
+     * @param Reader $rdr the reader which the returned reader should be filtering
+     * 
+     * @return Reader A reader with the same configuration as this one, but
+     *         filtering input from the specified reader
+     */
+    public function chain(Reader $rdr);
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ChainableReader.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ExpandProperties.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ExpandProperties.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ExpandProperties.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ *  $Id: ExpandProperties.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+require_once 'phing/filters/BaseFilterReader.php';
+include_once 'phing/filters/ChainableReader.php';
+
+/**
+ * Expands Phing Properties, if any, in the data.
+ * <p>
+ * Example:<br>
+ * <pre><expandproperties/></pre>
+ * Or:
+ * <pre><filterreader classname="phing.filters.ExpandProperties'/></pre>
+ *
+ * @author    Yannick Lecaillez <yl en seasonfive.com>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.6 $
+ * @see       BaseFilterReader
+ * @package   phing.filters
+ */
+class ExpandProperties extends BaseFilterReader implements ChainableReader {
+   
+    /**
+     * Returns the filtered stream. 
+     * The original stream is first read in fully, and the Phing properties are expanded.
+     * 
+     * @return mixed     the filtered stream, or -1 if the end of the resulting stream has been reached.
+     * 
+     * @exception IOException if the underlying stream throws an IOException
+     * during reading
+     */
+    function read($len = null) {
+                
+        $buffer = $this->in->read($len);
+        
+        if($buffer === -1) {
+            return -1;
+        }
+        
+        $project = $this->getProject();
+        $buffer = ProjectConfigurator::replaceProperties($project, $buffer, $project->getProperties());
+        
+        return $buffer;
+    }
+        
+    /**
+     * Creates a new ExpandProperties filter using the passed in
+     * Reader for instantiation.
+     * 
+     * @param object A Reader object providing the underlying stream.
+     *               Must not be <code>null</code>.
+     * 
+     * @return object A new filter based on this configuration, but filtering
+     *         the specified reader
+     */
+    function chain(Reader $reader) {
+        $newFilter = new ExpandProperties($reader);
+        $newFilter->setProject($this->getProject());
+        return $newFilter;
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ExpandProperties.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/HeadFilter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/HeadFilter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/HeadFilter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,161 @@
+<?php
+
+/*
+ *  $Id: HeadFilter.php 3076 2006-12-18 08:52:12Z fabien $  
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/filters/BaseParamFilterReader.php';
+include_once 'phing/filters/ChainableReader.php';
+
+/**
+ * Reads the first <code>n</code> lines of a stream.
+ * (Default is first 10 lines.)
+ * <p>
+ * Example:
+ * <pre><headfilter lines="3"/></pre>
+ * Or:
+ * <pre><filterreader classname="phing.filters.HeadFilter">
+ *    <param name="lines" value="3"/>
+ * </filterreader></pre>
+ *
+ * @author    <a href="mailto:yl en seasonfive.com">Yannick Lecaillez</a>
+ * @author    hans lellelid, hans en velum.net
+ * @version   $Revision: 1.6 $ $Date$
+ * @access    public
+ * @see       FilterReader
+ * @package   phing.filters
+ */
+class HeadFilter extends BaseParamFilterReader implements ChainableReader {
+
+    /**
+     * Parameter name for the number of lines to be returned.
+     */ 
+    const LINES_KEY = "lines";
+    
+    /**
+     * Number of lines currently read in.
+     * @var integer
+     */ 
+    private $_linesRead = 0;
+    
+    /**
+     * Number of lines to be returned in the filtered stream.
+     * @var integer
+     */ 
+    private $_lines     = 10;
+
+    /**
+     * Returns first n lines of stream.
+     * @return the resulting stream, or -1
+     * if the end of the resulting stream has been reached
+     * 
+     * @exception IOException if the underlying stream throws an IOException
+     * during reading     
+     */
+    function read($len = null) {
+    
+        if ( !$this->getInitialized() ) {
+            $this->_initialize();
+            $this->setInitialized(true);
+        }
+        
+        // note, if buffer contains fewer lines than
+        // $this->_lines this code will not work.
+        
+        if($this->_linesRead < $this->_lines) {
+        
+            $buffer = $this->in->read($len);
+            
+            if($buffer === -1) {
+                return -1;
+            }
+            
+            // now grab first X lines from buffer
+            
+            $lines = explode("\n", $buffer);
+            
+            $linesCount = count($lines);
+            
+            // must account for possibility that the num lines requested could 
+            // involve more than one buffer read.            
+            $len = ($linesCount > $this->_lines ? $this->_lines - $this->_linesRead : $linesCount);
+            $filtered_buffer = implode("\n", array_slice($lines, 0, $len) );
+            $this->_linesRead += $len;
+            
+            return $filtered_buffer;
+        
+        }
+        
+        return -1; // EOF, since the file is "finished" as far as subsequent filters are concerned.
+    }    
+
+    /**
+     * Sets the number of lines to be returned in the filtered stream.
+     * 
+     * @param integer $lines the number of lines to be returned in the filtered stream.
+     */
+    function setLines($lines) {
+        $this->_lines = (int) $lines;
+    }
+
+    /**
+     * Returns the number of lines to be returned in the filtered stream.
+     * 
+     * @return integer The number of lines to be returned in the filtered stream.
+     */
+    function getLines() {
+        return $this->_lines;
+    }
+
+    /**
+     * Creates a new HeadFilter using the passed in
+     * Reader for instantiation.
+     * 
+     * @param object A Reader object providing the underlying stream.
+     *            Must not be <code>null</code>.
+     * 
+     * @return object A new filter based on this configuration, but filtering
+     *         the specified reader.
+     */
+    function chain(Reader $reader) {
+        $newFilter = new HeadFilter($reader);
+        $newFilter->setLines($this->getLines());
+        $newFilter->setInitialized(true);
+        $newFilter->setProject($this->getProject());        
+        return $newFilter;
+    }
+
+    /**
+     * Scans the parameters list for the "lines" parameter and uses
+     * it to set the number of lines to be returned in the filtered stream.
+     */
+    private function _initialize() {
+        $params = $this->getParameters();
+        if ( $params !== null ) {
+            for($i = 0, $_i=count($params) ; $i < $_i; $i++) {
+                if ( self::LINES_KEY == $params[$i]->getName() ) {
+                    $this->_lines = (int) $params[$i]->getValue();
+                    break;
+                }
+            }
+        }
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/HeadFilter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/LineContains.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/LineContains.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/LineContains.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,258 @@
+<?php
+
+/*
+ *  $Id: LineContains.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/filters/BaseParamFilterReader.php';
+include_once 'phing/filters/BaseFilterReader.php';
+include_once 'phing/filters/ChainableReader.php';
+
+/**
+ * Filter which includes only those lines that contain all the user-specified
+ * strings.
+ *
+ * Example:
+ *
+ * <pre><linecontains>
+ *   <contains value="foo">
+ *   <contains value="bar">
+ * </linecontains></pre>
+ *
+ * Or:
+ *
+ * <pre><filterreader classname="phing.filters.LineContains">
+ *    <param type="contains" value="foo"/>
+ *    <param type="contains" value="bar"/>
+ * </filterreader></pre>
+ *
+ * This will include only those lines that contain <code>foo</code> and
+ * <code>bar</code>.
+ *
+ * @author    Yannick Lecaillez <yl en seasonfive.com>
+ * @author    Hans Lellelid <hans en velum.net>
+ * @version   $Revision: 1.11 $
+ * @see       PhingFilterReader
+ * @package   phing.filters
+*/
+class LineContains extends BaseParamFilterReader implements ChainableReader {
+
+    /**
+     * The parameter name for the string to match on.
+     * @var string
+     */ 
+    const CONTAINS_KEY = "contains";
+
+    /**
+     * Array of Contains objects.
+     * @var array
+     */ 
+    private $_contains = array();
+
+    /**
+     * [Deprecated] 
+     * @var string
+     */ 
+    private $_line = null;
+
+    /**
+     * Returns all lines in a buffer that contain specified strings.
+     * @return mixed buffer, -1 on EOF
+     */
+    function read($len = null) {
+        if ( !$this->getInitialized() ) {
+            $this->_initialize();
+            $this->setInitialized(true);
+        }
+        
+        $buffer = $this->in->read($len);
+        
+        if ($buffer === -1) {
+            return -1;
+        }
+        
+        $lines = explode("\n", $buffer);        
+        $matched = array();        
+        $containsSize = count($this->_contains);
+        
+        foreach($lines as $line) {                                
+            for($i = 0 ; $i < $containsSize ; $i++) {
+                $containsStr = $this->_contains[$i]->getValue();
+                if ( strstr($line, $containsStr) === false ) {
+                    $line = null;
+                    break;
+                }
+            }                
+            if($line !== null) {
+                $matched[] = $line;
+            }                
+        }        
+        $filtered_buffer = implode("\n", $matched);    
+        return $filtered_buffer;
+    }
+    
+    /**
+     * [Deprecated. For reference only, used to be read() method.] 
+     * Returns the next character in the filtered stream, only including
+     * lines from the original stream which contain all of the specified words.
+     *
+     * @return the next character in the resulting stream, or -1
+     * if the end of the resulting stream has been reached
+     *
+     * @exception IOException if the underlying stream throws an IOException
+     * during reading
+     */
+    function readChar() {
+        if ( !$this->getInitialized() ) {
+            $this->_initialize();
+            $this->setInitialized(true);
+        }
+
+        $ch = -1;
+
+        if ( $this->_line !== null ) {
+            $ch = substr($this->_line, 0, 1);
+            if ( strlen($this->_line) === 1 )
+                $this->_line = null;
+            else
+                $this->_line = substr($this->_line, 1);
+        } else {
+            $this->_line = $this->readLine();
+            if ( $this->_line === null ) {
+                $ch = -1;
+            } else {
+                $containsSize = count($this->_contains);
+                for($i = 0 ; $i < $containsSize ; $i++) {
+                    $containsStr = $this->_contains[$i]->getValue();
+                    if ( strstr($this->_line, $containsStr) === false ) {
+                        $this->_line = null;
+                        break;
+                    }
+                }
+                return $this->readChar();
+            }
+        }
+
+        return $ch;
+    }
+
+    /**
+     * Adds a <code><contains></code> nested element.
+     *
+     * @return Contains The <code>contains</code> element added.
+     *                  Must not be <code>null</code>.
+     */
+    function createContains() {
+        $num = array_push($this->_contains, new Contains());
+        return $this->_contains[$num-1];
+    }
+
+    /**
+     * Sets the array of words which must be contained within a line read
+     * from the original stream in order for it to match this filter.
+     *
+     * @param array $contains An array of words which must be contained
+     *                 within a line in order for it to match in this filter.
+     *                 Must not be <code>null<code>.
+     */
+    function setContains($contains) {
+        // type check, error must never occur, bad code of it does
+        if ( !is_array($contains) ) {
+            throw new Exception("Excpected array got something else");
+        }
+
+        $this->_contains = $contains;
+    }
+
+    /**
+     * Returns the vector of words which must be contained within a line read
+     * from the original stream in order for it to match this filter.
+     *
+     * @return array The array of words which must be contained within a line read
+     *         from the original stream in order for it to match this filter. The
+     *         returned object is "live" - in other words, changes made to the
+     *         returned object are mirrored in the filter.
+     */
+    function getContains() {
+        return $this->_contains;
+    }
+
+    /**
+     * Creates a new LineContains using the passed in
+     * Reader for instantiation.
+     *
+     * @param object A Reader object providing the underlying stream.
+     *               Must not be <code>null</code>.
+     *
+     * @return object A new filter based on this configuration, but filtering
+     *         the specified reader
+     */
+    function chain(Reader $reader) {
+        $newFilter = new LineContains($reader);
+        $newFilter->setContains($this->getContains());
+        $newFilter->setInitialized(true);
+        $newFilter->setProject($this->getProject());        
+        return $newFilter;
+    }
+
+    /**
+     * Parses the parameters to add user-defined contains strings.
+     */
+    private function _initialize() {
+        $params = $this->getParameters();
+        if ( $params !== null ) {
+            foreach($params as $param) {
+                if ( self::CONTAINS_KEY == $param->getType() ) {
+                    $cont = new Contains();
+                    $cont->setValue($param->getValue());
+                    array_push($this->_contains, $cont);
+                    break; // because we only support a single contains
+                }
+            }
+        }
+    }
+}
+
+/**
+ * Holds a contains element.
+ */
+class Contains {
+
+    /**
+     * @var string
+     */ 
+    private $_value;
+    
+    /**
+     * Set 'contains' value.
+     * @param string $contains
+     */ 
+    function setValue($contains) {
+        $this->_value = (string) $contains;
+    }
+    
+    /**
+     * Returns 'contains' value.
+     * @return string
+     */ 
+    function getValue() {
+        return $this->_value;
+    }
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/LineContains.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/LineContainsRegexp.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/LineContainsRegexp.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/LineContainsRegexp.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,179 @@
+<?php
+/*
+ *  $Id: LineContainsRegexp.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/filters/BaseParamFilterReader.php';
+include_once 'phing/types/RegularExpression.php';
+include_once 'phing/filters/ChainableReader.php';
+
+/**
+ * Filter which includes only those lines that contain the user-specified
+ * regular expression matching strings.
+ *
+ * Example:
+ * <pre><linecontainsregexp>
+ *   <regexp pattern="foo*">
+ * </linecontainsregexp></pre>
+ *
+ * Or:
+ *
+ * <pre><filterreader classname="phing.filters.LineContainsRegExp">
+ *    <param type="regexp" value="foo*"/>
+ * </filterreader></pre>
+ *
+ * This will fetch all those lines that contain the pattern <code>foo</code>
+ *
+ * @author    Yannick Lecaillez <yl en seasonfive.com>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.8 $
+ * @see       FilterReader
+ * @package   phing.filters
+ */
+class LineContainsRegexp extends BaseParamFilterReader implements ChainableReader {
+
+    /**
+     * Parameter name for regular expression.
+     * @var string
+     */ 
+    const REGEXP_KEY = "regexp";
+    
+    /**
+     * Regular expressions that are applied against lines.
+     * @var array
+     */ 
+    private    $_regexps = array();
+        
+    /**
+     * Returns all lines in a buffer that contain specified strings.
+     * @return mixed buffer, -1 on EOF
+     */
+    function read($len = null) {
+    
+        if ( !$this->getInitialized() ) {
+            $this->_initialize();
+            $this->setInitialized(true);
+        }
+        
+        $buffer = $this->in->read($len);
+        
+        if ($buffer === -1) {
+            return -1;
+        }
+        
+        $lines = explode("\n", $buffer);        
+        $matched = array();        
+        
+        $regexpsSize = count($this->_regexps);
+        foreach($lines as $line) {    
+             for($i = 0 ; $i<$regexpsSize ; $i++) {
+                    $regexp = $this->_regexps[$i];
+                    $re = $regexp->getRegexp($this->getProject());
+                    $matches = $re->matches($line);
+                    if ( !$matches ) {
+                        $line = null;
+                        break;
+                    }
+            }            
+            if($line !== null) {
+                $matched[] = $line;
+            }                
+        }        
+        $filtered_buffer = implode("\n", $matched);    
+        return $filtered_buffer;
+    }
+    
+    /**
+     * Adds a <code>regexp</code> element.
+     * 
+     * @return object regExp The <code>regexp</code> element added. 
+     */
+    function createRegexp() {
+        $num = array_push($this->_regexps, new RegularExpression());
+        return $this->_regexps[$num-1];
+    }
+
+    /**
+     * Sets the vector of regular expressions which must be contained within 
+     * a line read from the original stream in order for it to match this 
+     * filter.
+     * 
+     * @param regexps An array of regular expressions which must be contained 
+     *                within a line in order for it to match in this filter. Must not be 
+     *                <code>null</code>.
+     */
+    function setRegexps($regexps) {
+        // type check, error must never occur, bad code of it does
+        if ( !is_array($regexps) ) {
+            throw new Exception("Excpected an 'array', got something else");
+        }
+        $this->_regexps = $regexps;
+    }
+
+    /**
+     * Returns the array of regular expressions which must be contained within 
+     * a line read from the original stream in order for it to match this 
+     * filter.
+     * 
+     * @return array The array of regular expressions which must be contained within 
+     *         a line read from the original stream in order for it to match this 
+     *         filter. The returned object is "live" - in other words, changes made to 
+     *         the returned object are mirrored in the filter.
+     */
+    function getRegexps() {
+        return $this->_regexps;
+    }
+
+    /**
+     * Creates a new LineContainsRegExp using the passed in
+     * Reader for instantiation.
+     * 
+     * @param object A Reader object providing the underlying stream.
+     *               Must not be <code>null</code>.
+     * 
+     * @return object A new filter based on this configuration, but filtering
+     *         the specified reader
+     */
+    function chain(Reader $reader) {
+        $newFilter = new LineContainsRegExp($reader);
+        $newFilter->setRegexps($this->getRegexps());
+        $newFilter->setInitialized(true);
+        $newFilter->setProject($this->getProject());        
+        return $newFilter;
+    }
+
+    /**
+     * Parses parameters to add user defined regular expressions.
+     */
+    private function _initialize() {
+        $params = $this->getParameters();
+        if ( $params !== null ) {
+            for($i = 0 ; $i<count($params) ; $i++) {
+                if ( self::REGEXP_KEY === $params[$i]->getType() ) {
+                    $pattern = $params[$i]->getValue();
+                    $regexp = new RegularExpression();
+                    $regexp->setPattern($pattern);
+                    array_push($this->_regexps, $regexp);
+                }
+            }
+        }
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/LineContainsRegexp.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/PrefixLines.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/PrefixLines.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/PrefixLines.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,142 @@
+<?php
+
+/*
+ *  $Id: PrefixLines.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/filters/BaseParamFilterReader.php';
+include_once 'phing/filters/ChainableReader.php';
+
+/**
+ * Attaches a prefix to every line.
+ *
+ * Example:
+ * <pre><prefixlines prefix="Foo"/></pre>
+ *
+ * Or:
+ *
+ * <pre><filterreader classname="phing.filters.PrefixLines">
+ *  <param name="prefix" value="Foo"/>
+ * </filterreader></pre>
+ *
+ * @author    <a href="mailto:yl en seasonfive.com">Yannick Lecaillez</a>
+ * @author    hans lellelid, hans en velum.net
+ * @version   $Revision: 1.6 $ $Date$
+ * @access    public
+ * @see       FilterReader
+ * @package   phing.filters
+*/
+class PrefixLines extends BaseParamFilterReader implements ChainableReader {
+
+    /**
+     * Parameter name for the prefix.
+     * @var string
+     */ 
+    const PREFIX_KEY = "lines";
+    
+    /**
+     * The prefix to be used.
+     * @var string
+     */ 
+    private    $_prefix = null;
+ 
+    /**
+     * Adds a prefix to each line of input stream and returns resulting stream.
+     * 
+     * @return mixed buffer, -1 on EOF
+     */
+    function read($len = null) {
+        if ( !$this->getInitialized() ) {
+            $this->_initialize();
+            $this->setInitialized(true);
+        }
+        
+        $buffer = $this->in->read($len);
+        
+        if ($buffer === -1) {
+            return -1;
+        }
+        
+        $lines = explode("\n", $buffer);        
+        $filtered = array();        
+        
+        foreach($lines as $line) {
+            $line = $this->_prefix . $line;
+            $filtered[] = $line;
+        }
+                
+        $filtered_buffer = implode("\n", $filtered);    
+        return $filtered_buffer;
+    }
+    
+    /**
+     * Sets the prefix to add at the start of each input line.
+     * 
+     * @param string $prefix The prefix to add at the start of each input line.
+     *               May be <code>null</code>, in which case no prefix
+     *               is added.
+     */
+    function setPrefix($prefix) {
+        $this->_prefix = (string) $prefix;
+    }
+
+    /**
+     * Returns the prefix which will be added at the start of each input line.
+     * 
+     * @return string The prefix which will be added at the start of each input line
+     */
+    function getPrefix() {
+        return $this->_prefix;
+    }
+
+    /**
+     * Creates a new PrefixLines filter using the passed in
+     * Reader for instantiation.
+     * 
+     * @param object A Reader object providing the underlying stream.
+     *               Must not be <code>null</code>.
+     * 
+     * @return object A new filter based on this configuration, but filtering
+     *         the specified reader
+     */
+    function chain(Reader $reader) {  
+        $newFilter = new PrefixLines($reader);
+        $newFilter->setPrefix($this->getPrefix());
+        $newFilter->setInitialized(true);
+        $newFilter->setProject($this->getProject());        
+        return $newFilter;
+    }
+
+    /**
+     * Initializes the prefix if it is available from the parameters.
+     */
+    private function _initialize() {
+        $params = $this->getParameters();
+        if ( $params !== null ) {
+            for($i = 0, $_i=count($params) ; $i < $_i ; $i++) {
+                if ( self::PREFIX_KEY == $params[$i]->getName() ) {
+                    $this->_prefix = (string) $params[$i]->getValue();
+                    break;
+                }
+            }
+        }
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/PrefixLines.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ReplaceRegexp.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ReplaceRegexp.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ReplaceRegexp.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,129 @@
+<?php
+
+/*
+ *  $Id: ReplaceRegexp.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+require_once 'phing/filters/BaseFilterReader.php';
+include_once 'phing/filters/ChainableReader.php';
+include_once 'phing/types/RegularExpression.php';
+
+/**
+ * Performs a regexp find/replace on stream.
+ * <p>
+ * Example:<br>
+ * <pre>
+ * <replaceregexp>
+ *    <regexp pattern="\r\n" replace="\n"/>
+ *    <regexp pattern="(\w+)\.xml" replace="\1.php" ignoreCase="true"/>
+ * </replaceregexp>
+ * </pre>
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.5 $
+ * @package   phing.filters
+ */
+class ReplaceRegexp extends BaseFilterReader implements ChainableReader {
+    
+    /**
+     * @var array RegularExpression[]
+     */
+    private $regexps = array();            
+    
+    /**
+     * Creator method handles nested <regexp> tags.
+     * @return RegularExpression
+     */
+    function createRegexp() {
+        $num = array_push($this->regexps, new RegularExpression());
+        return $this->regexps[$num-1];
+    }
+    
+    /**
+     * Sets the current regexps.
+     * (Used when, e.g., cloning/chaining the method.)
+     * @param array RegularExpression[]
+     */
+    function setRegexps($regexps) {
+        $this->regexps = $regexps;
+    }
+    
+    /**
+     * Gets the current regexps.
+     * (Used when, e.g., cloning/chaining the method.)
+     * @return array RegularExpression[]
+     */    
+    function getRegexps() {
+        return $this->regexps;
+    }
+    
+    /**
+     * Returns the filtered stream. 
+     * The original stream is first read in fully, and the regex replace is performed.
+     * 
+     * @param int $len Required $len for Reader compliance.
+     * 
+     * @return mixed The filtered stream, or -1 if the end of the resulting stream has been reached.
+     * 
+     * @exception IOException if the underlying stream throws an IOException
+     * during reading
+     */
+    function read($len = null) {
+                
+        $buffer = $this->in->read($len);
+        
+        if($buffer === -1) {
+            return -1;
+        }
+
+        // perform regex replace here ...
+        foreach($this->regexps as $exptype) {
+            $regexp = $exptype->getRegexp($this->project);
+            try {
+                $buffer = $regexp->replace($buffer);
+                $this->log("Performing regexp replace: /".$regexp->getPattern()."/".$regexp->getReplace()."/g".($regexp->getIgnoreCase() ? 'i' : ''), PROJECT_MSG_VERBOSE);
+            } catch (Exception $e) {
+                // perhaps mismatch in params (e.g. no replace or pattern specified)
+                $this->log("Error performing regexp replace: " . $e->getMessage(), PROJECT_MSG_WARN);
+            }
+        }
+        
+        return $buffer;
+    }
+
+    /**
+     * Creates a new ReplaceRegExp filter using the passed in
+     * Reader for instantiation.
+     * 
+     * @param Reader $reader A Reader object providing the underlying stream.
+     *               Must not be <code>null</code>.
+     * 
+     * @return ReplaceRegExp A new filter based on this configuration, but filtering
+     *         the specified reader
+     */
+    function chain(Reader $reader) {
+        $newFilter = new ReplaceRegExp($reader);
+        $newFilter->setProject($this->getProject());
+        $newFilter->setRegexps($this->getRegexps());
+        return $newFilter;
+    }
+
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ReplaceRegexp.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ReplaceTokens.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ReplaceTokens.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ReplaceTokens.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,415 @@
+<?php
+
+/*
+ *  $Id: ReplaceTokens.php 3076 2006-12-18 08:52:12Z fabien $  
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/filters/BaseParamFilterReader.php';
+include_once 'phing/types/TokenSource.php';
+include_once 'phing/filters/ChainableReader.php';
+
+/*
+ * Replaces tokens in the original input with user-supplied values.
+ *
+ * Example:
+ *
+ * <pre><replacetokens begintoken="#" endtoken="#">;
+ *   <token key="DATE" value="${TODAY}"/>
+ * </replacetokens></pre>
+ *
+ * Or:
+ *
+ * <pre><filterreader classname="phing.filters.ReplaceTokens">
+ *   <param type="tokenchar" name="begintoken" value="#"/>
+ *   <param type="tokenchar" name="endtoken" value="#"/>
+ *   <param type="token" name="DATE" value="${TODAY}"/>
+ * </filterreader></pre>
+ *
+ * @author    <a href="mailto:yl en seasonfive.com">Yannick Lecaillez</a>
+ * @author    hans lellelid, hans en velum.net
+ * @version   $Revision: 1.14 $ $Date$
+ * @access    public
+ * @see       BaseParamFilterReader
+ * @package   phing.filters
+ */
+class ReplaceTokens extends BaseParamFilterReader implements ChainableReader {
+
+    /**
+     * Default "begin token" character.
+     * @var string
+     */
+    const DEFAULT_BEGIN_TOKEN = "@";
+
+    /**
+     * Default "end token" character.
+     * @var string
+     */
+    const DEFAULT_END_TOKEN = "@";
+
+    /**
+     * [Deprecated] Data that must be read from, if not null.
+     * @var string
+     */
+    private    $_queuedData = null;
+
+    /**
+     * Array to hold the replacee-replacer pairs (String to String).
+     * @var array
+     */
+    private $_tokens = array();
+
+    /**
+     * Array to hold the token sources that make tokens from
+     * different sources available
+     * @var array
+     */
+    private $_tokensources = array();
+
+    /**
+     * Array holding all tokens given directly to the Filter and
+     * those passed via a TokenSource.
+     * @var array
+     */
+    private $_alltokens = null;
+
+    /**
+     * Character marking the beginning of a token.
+     * @var string
+     */
+    private    $_beginToken = "@";  // self::DEFAULT_BEGIN_TOKEN;
+
+    /**
+     * Character marking the end of a token.
+     * @var string
+     */
+    private    $_endToken = "@"; //self::DEFAULT_END_TOKEN;
+
+    /**
+     * Performs lookup on key and returns appropriate replacement string.
+     * @param array $matches Array of 1 el containing key to search for.
+     * @return string     Text with which to replace key or value of key if none is found.
+     * @access private
+     */
+    private function replaceTokenCallback($matches) {
+                
+        $key = $matches[1];
+        
+        /* Get tokens from tokensource and merge them with the
+         * tokens given directly via build file. This should be 
+         * done a bit more elegantly
+         */
+        if ($this->_alltokens === null) {
+            $this->_alltokens = array();
+
+            $count = count($this->_tokensources);
+            for ($i = 0; $i < $count; $i++) {
+                $source = $this->_tokensources[$i];
+                $this->_alltokens = array_merge($this->_alltokens, $source->getTokens());
+            }
+
+
+            $this->_alltokens = array_merge($this->_tokens, $this->_alltokens);
+        }
+
+        $tokens = $this->_alltokens;
+
+        $replaceWith = null;
+        $count = count($tokens);
+
+        for ($i = 0; $i < $count; $i++) {
+            if ($tokens[$i]->getKey() === $key) {
+                $replaceWith = $tokens[$i]->getValue();
+            }
+        }
+
+        if ($replaceWith === null) {
+            $replaceWith = $this->_beginToken . $key . $this->_endToken;            
+            $this->log("No token defined for key \"".$this->_beginToken  . $key . $this->_endToken."\"");
+        } else {
+            $this->log("Replaced \"".$this->_beginToken  . $key . $this->_endToken ."\" with \"".$replaceWith."\"");
+        }
+
+        return $replaceWith;
+    }
+
+    /**
+     * Returns stream with tokens having been replaced with appropriate values.
+     * If a replacement value is not found for a token, the token is left in the stream.
+     * 
+     * @return mixed filtered stream, -1 on EOF.
+     */
+    function read($len = null) {
+        if ( !$this->getInitialized() ) {
+            $this->_initialize();
+            $this->setInitialized(true);
+        }
+
+        // read from next filter up the chain
+        $buffer = $this->in->read($len);
+
+        if($buffer === -1) {
+            return -1;
+        }    
+        
+        // filter buffer
+        $buffer = preg_replace_callback(
+            "/".preg_quote($this->_beginToken)."([\w\.\-:]+?)".preg_quote($this->_endToken)."/",
+            array($this, 'replaceTokenCallback'), $buffer);
+
+        return $buffer;
+    }
+   
+    /**
+     * Sets the "begin token" character.
+     * 
+     * @param string $beginToken the character used to denote the beginning of a token.
+     */
+    function setBeginToken($beginToken) {
+        $this->_beginToken = (string) $beginToken;
+    }
+
+    /**
+     * Returns the "begin token" character.
+     * 
+     * @return string The character used to denote the beginning of a token.
+     */
+    function getBeginToken() {
+        return $this->_beginToken;
+    }
+
+    /**
+     * Sets the "end token" character.
+     * 
+     * @param string $endToken the character used to denote the end of a token
+     */
+    function setEndToken($endToken) {
+        $this->_endToken = (string) $endToken;
+    }
+
+    /**
+     * Returns the "end token" character.
+     * 
+     * @return the character used to denote the beginning of a token
+     */
+    function getEndToken() {
+        return $this->_endToken;
+    }
+
+    /**
+     * Adds a token element to the map of tokens to replace.
+     * 
+     * @return object The token added to the map of replacements.
+     *               Must not be <code>null</code>.
+     */
+    function createToken() {
+        $num = array_push($this->_tokens, new Token());
+        return $this->_tokens[$num-1];
+    }
+    
+    /**
+     * Adds a token source to the sources of this filter.
+     *
+     * @return  object  A Reference to the source just added.
+     */
+    function createTokensource() {
+        $num = array_push($this->_tokensources, new TokenSource());
+        return $this->_tokensources[$num-1];
+    }
+
+    /**
+     * Sets the map of tokens to replace.
+     * ; used by ReplaceTokens::chain()
+     *
+     * @param array A map (String->String) of token keys to replacement
+     *              values. Must not be <code>null</code>.
+     */
+    function setTokens($tokens) {
+        // type check, error must never occur, bad code of it does
+        if ( !is_array($tokens) ) {
+            throw new Exception("Excpected 'array', got something else");
+        }
+
+        $this->_tokens = $tokens;
+    }
+
+    /**
+     * Returns the map of tokens which will be replaced.
+     * ; used by ReplaceTokens::chain()
+     *
+     * @return array A map (String->String) of token keys to replacement values.
+     */
+    function getTokens() {
+        return $this->_tokens;
+    }
+
+    /**
+     * Sets the tokensources to use; used by ReplaceTokens::chain()
+     * 
+     * @param   array   An array of token sources.
+     */ 
+    function setTokensources($sources) {
+        // type check
+        if ( !is_array($sources)) {
+            throw new Exception("Exspected 'array', got something else");
+        }
+        $this->_tokensources = $sources;
+    }
+
+    /**
+     * Returns the token sources used by this filter; used by ReplaceTokens::chain()
+     * 
+     * @return  array
+     */
+    function getTokensources() {
+        return $this->_tokensources;
+    }
+
+    /**
+     * Creates a new ReplaceTokens using the passed in
+     * Reader for instantiation.
+     * 
+     * @param object A Reader object providing the underlying stream.
+     *               Must not be <code>null</code>.
+     * 
+     * @return object A new filter based on this configuration, but filtering
+     *         the specified reader
+     */
+    function chain(Reader $reader) {
+        $newFilter = new ReplaceTokens($reader);
+        $newFilter->setProject($this->getProject());
+        $newFilter->setBeginToken($this->getBeginToken());
+        $newFilter->setEndToken($this->getEndToken());
+        $newFilter->setTokens($this->getTokens());
+        $newFilter->setTokensources($this->getTokensources());
+        $newFilter->setInitialized(true);
+        return $newFilter;
+    }
+
+    /**
+     * Initializes tokens and loads the replacee-replacer hashtable.
+     * This method is only called when this filter is used through
+     * a <filterreader> tag in build file.
+     */
+    private function _initialize() {
+        $params = $this->getParameters();
+        if ( $params !== null ) {
+            for($i = 0 ; $i<count($params) ; $i++) {
+                if ( $params[$i] !== null ) {
+                    $type = $params[$i]->getType();
+                    if ( $type === "tokenchar" ) {
+                        $name = $params[$i]->getName();
+                        if ( $name === "begintoken" ) {
+                            $this->_beginToken = substr($params[$i]->getValue(), 0, 1);
+                        } else if ( $name === "endtoken" ) {
+                            $this->_endToken = substr($params[$i]->getValue(), 0, 1);
+                        }
+                    } else if ( $type === "token" ) {
+                        $name  = $params[$i]->getName();
+                        $value = $params[$i]->getValue();
+
+                        $tok = new Token();
+                        $tok->setKey($name);
+                        $tok->setValue($value);
+
+                        array_push($this->_tokens, $tok);
+                    } else if ( $type === "tokensource" ) {
+                        // Store data from nested tags in local array
+                        $arr = array(); $subparams = $params[$i]->getParams();
+                        $count = count($subparams);
+                        for ($i = 0; $i < $count; $i++)  {
+                            $arr[$subparams[$i]->getName()] = $subparams[$i]->getValue();
+                        }
+
+                        // Create TokenSource
+                        $tokensource = new TokenSource();
+                        if (isset($arr["classname"])) 
+                            $tokensource->setClassname($arr["classname"]);
+
+                        // Copy other parameters 1:1 to freshly created TokenSource
+                        foreach ($arr as $key => $value) {
+                            if (strtolower($key) === "classname")
+                                continue;
+                            $param = $tokensource->createParam();
+                            $param->setName($key);
+                            $param->setValue($value);
+                        }
+
+                        $this->_tokensources[] = $tokensource;
+                    }
+                }
+            }
+        }
+    }
+}
+
+/**
+ * Holds a token.
+ */
+class Token {
+
+    /**
+     * Token key.
+     * @var string
+     */
+    private $_key;
+
+    /**
+     * Token value.
+     * @var string
+     */
+    private $_value;
+
+    /**
+     * Sets the token key.
+     * 
+     * @param string $key The key for this token. Must not be <code>null</code>.
+     */
+    function setKey($key) {
+        $this->_key = (string) $key;
+    }
+
+    /**
+     * Sets the token value.
+     * 
+     * @param string $value The value for this token. Must not be <code>null</code>.
+     */
+    function setValue($value) {
+        $this->_value = (string) $value;
+    }
+
+    /**
+     * Returns the key for this token.
+     * 
+     * @return string The key for this token.
+     */
+    function getKey() {
+        return $this->_key;
+    }
+
+    /**
+     * Returns the value for this token.
+     * 
+     * @return string The value for this token.
+     */
+    function getValue() {
+        return $this->_value;
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/ReplaceTokens.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/StripLineBreaks.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/StripLineBreaks.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/StripLineBreaks.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,148 @@
+<?php
+
+/*
+ *  $Id: StripLineBreaks.php 3076 2006-12-18 08:52:12Z fabien $  
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/filters/BaseParamFilterReader.php';
+include_once 'phing/filters/ChainableReader.php';
+
+/**
+ * Filter to flatten the stream to a single line.
+ * 
+ * Example:
+ *
+ * <pre><striplinebreaks/></pre>
+ *
+ * Or:
+ *
+ * <pre><filterreader classname="phing.filters.StripLineBreaks"/></pre>
+ *
+ * @author    <a href="mailto:yl en seasonfive.com">Yannick Lecaillez</a>
+ * @author    hans lellelid, hans en velum.net
+ * @version   $Revision: 1.8 $ $Date$
+ * @access    public
+ * @see       BaseParamFilterReader
+ * @package   phing.filters
+ */
+class StripLineBreaks extends BaseParamFilterReader implements ChainableReader {
+
+    /**
+     * Default line-breaking characters.
+     * @var string
+     */
+    const DEFAULT_LINE_BREAKS = "\r\n";
+    
+    /**
+     * Parameter name for the line-breaking characters parameter.
+     * @var string
+     */
+    const LINES_BREAKS_KEY = "linebreaks";
+    
+    /**
+     * The characters that are recognized as line breaks.
+     * @var string
+     */ 
+    private    $_lineBreaks = "\r\n"; // self::DEFAULT_LINE_BREAKS;
+ 
+    /**
+     * Returns the filtered stream, only including
+     * characters not in the set of line-breaking characters.
+     * 
+     * @return mixed    the resulting stream, or -1
+     *         if the end of the resulting stream has been reached.
+     * 
+     * @exception IOException if the underlying stream throws an IOException
+     *            during reading     
+     */
+    function read($len = null) {
+        if ( !$this->getInitialized() ) {
+            $this->_initialize();
+            $this->setInitialized(true);
+        }
+
+        $buffer = $this->in->read($len);
+        if($buffer === -1) {
+            return -1;
+        }
+        
+        $buffer = preg_replace("/[".$this->_lineBreaks."]/", '', $buffer);           
+
+        return $buffer;
+    }
+    
+     /**
+     * Sets the line-breaking characters.
+     * 
+     * @param string $lineBreaks A String containing all the characters to be
+     *                   considered as line-breaking.
+     */
+    function setLineBreaks($lineBreaks) {
+        $this->_lineBreaks = (string) $lineBreaks;
+    }
+
+    /**
+     * Gets the line-breaking characters.
+     * 
+     * @return string A String containing all the characters that are considered as line-breaking.
+     */ 
+    function getLineBreaks() {
+        return $this->_lineBreaks;
+    }
+
+    /**
+     * Creates a new StripLineBreaks using the passed in
+     * Reader for instantiation.
+     * 
+     * @param object A Reader object providing the underlying stream.
+     *               Must not be <code>null</code>.
+     * 
+     * @return object A new filter based on this configuration, but filtering
+     *         the specified reader
+     */
+    function chain(Reader $reader) {
+        $newFilter = new StripLineBreaks($reader);
+        $newFilter->setLineBreaks($this->getLineBreaks());
+        $newFilter->setInitialized(true);
+        $newFilter->setProject($this->getProject());        
+        return $newFilter;
+    }
+
+    /**
+     * Parses the parameters to set the line-breaking characters.
+     */
+    private function _initialize() {
+        $userDefinedLineBreaks = null;
+        $params = $this->getParameters();
+        if ( $params !== null ) {
+            for($i = 0 ; $i<count($params) ; $i++) {
+                if ( self::LINE_BREAKS_KEY === $params[$i]->getName() ) {
+                    $userDefinedLineBreaks = $params[$i]->getValue();
+                    break;
+                }
+            }
+        }
+
+        if ( $userDefinedLineBreaks !== null ) {
+            $this->_lineBreaks = $userDefinedLineBreaks;
+        }
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/StripLineBreaks.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/StripLineComments.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/StripLineComments.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/StripLineComments.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,205 @@
+<?php
+
+/*
+ *  $Id: StripLineComments.php 3076 2006-12-18 08:52:12Z fabien $  
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/filters/BaseParamFilterReader.php';
+include_once 'phing/filters/ChainableReader.php';
+
+/*
+ * This filter strips line comments.
+ *
+ * Example:
+ *
+ * <pre><striplinecomments>
+ *   <comment value="#"/>
+ *   <comment value="--"/>
+ *   <comment value="REM "/>
+ *   <comment value="rem "/>
+ *   <comment value="//"/>
+ * </striplinecomments></pre>
+ *
+ * Or:
+ *
+ * <pre><filterreader classname="phing.filters.StripLineComments">
+ *   <param type="comment" value="#"/>
+ *   <param type="comment" value="--"/>
+ *   <param type="comment" value="REM "/>
+ *   <param type="comment" value="rem "/>
+ *   <param type="comment" value="//"/>
+ * </filterreader></pre>
+ *
+ * @author    <a href="mailto:yl en seasonfive.com">Yannick Lecaillez</a>
+ * @author    hans lellelid, hans en velum.net
+ * @version   $Revision: 1.8 $ $Date$
+ * @access    public
+ * @see       BaseParamFilterReader
+ * @package   phing.filters
+ */
+class StripLineComments extends BaseParamFilterReader implements ChainableReader {
+    
+    /** Parameter name for the comment prefix. */
+    const COMMENTS_KEY = "comment";
+    
+    /** Array that holds the comment prefixes. */
+    private $_comments = array();
+    
+    /**
+     * Returns stream only including
+     * lines from the original stream which don't start with any of the 
+     * specified comment prefixes.
+     * 
+     * @return mixed the resulting stream, or -1
+     *         if the end of the resulting stream has been reached.
+     * 
+     * @throws IOException if the underlying stream throws an IOException
+     *            during reading     
+     */
+    function read($len = null) {
+    
+        if ( !$this->getInitialized() ) {
+            $this->_initialize();
+            $this->setInitialized(true);
+        }
+        
+        $buffer = $this->in->read($len);
+        
+        if ($buffer === -1) {
+            return -1;
+        }
+        
+        $lines = explode("\n", $buffer);        
+        $filtered = array();    
+            
+        $commentsSize = count($this->_comments);
+        
+        foreach($lines as $line) {            
+            for($i = 0; $i < $commentsSize; $i++) {
+                $comment = $this->_comments[$i]->getValue();
+                if ( StringHelper::startsWith($comment, ltrim($line)) ) {
+                    $line = null;
+                    break;
+                }
+            }
+            if ($line !== null) {
+                $filtered[] = $line;
+            }
+        }
+                
+        $filtered_buffer = implode("\n", $filtered);    
+        return $filtered_buffer;
+    }        
+
+    /*
+     * Adds a <code>comment</code> element to the list of prefixes.
+     * 
+     * @return comment The <code>comment</code> element added to the
+     *                 list of comment prefixes to strip.
+    */
+    function createComment() {
+        $num = array_push($this->_comments, new Comment());
+        return $this->_comments[$num-1];
+    }
+
+    /*
+     * Sets the list of comment prefixes to strip.
+     * 
+     * @param comments A list of strings, each of which is a prefix
+     *                 for a comment line. Must not be <code>null</code>.
+    */
+    function setComments($lineBreaks) {
+        if (!is_array($lineBreaks)) {
+            throw new Exception("Excpected 'array', got something else");
+        }
+        $this->_comments = $lineBreaks;
+    }
+
+    /*
+     * Returns the list of comment prefixes to strip.
+     * 
+     * @return array The list of comment prefixes to strip.
+    */
+    function getComments() {
+        return $this->_comments;
+    }
+
+    /*
+     * Creates a new StripLineComments using the passed in
+     * Reader for instantiation.
+     * 
+     * @param reader A Reader object providing the underlying stream.
+     *               Must not be <code>null</code>.
+     * 
+     * @return a new filter based on this configuration, but filtering
+     *         the specified reader
+     */
+    function chain(Reader $reader) {
+        $newFilter = new StripLineComments($reader);
+        $newFilter->setComments($this->getComments());
+        $newFilter->setInitialized(true);
+        $newFilter->setProject($this->getProject());        
+        return $newFilter;
+    }
+
+    /*
+     * Parses the parameters to set the comment prefixes.
+    */
+    private function _initialize() {
+        $params = $this->getParameters();
+        if ( $params !== null ) {
+            for($i = 0 ; $i<count($params) ; $i++) {
+                if ( self::COMMENTS_KEY === $params[$i]->getType() ) {
+                    $comment = new Comment();
+                    $comment->setValue($params[$i]->getValue());
+                    array_push($this->_comments, $comment);
+                }
+            }
+        }
+    }
+}
+
+/*
+ * The class that holds a comment representation.
+*/
+class Comment {
+    
+    /** The prefix for a line comment. */
+    private    $_value;
+
+    /*
+     * Sets the prefix for this type of line comment.
+     *
+     * @param string $value The prefix for a line comment of this type.
+     *                Must not be <code>null</code>.
+     */
+    function setValue($value) {
+        $this->_value = (string) $value;
+    }
+
+    /*
+     * Returns the prefix for this type of line comment.
+     * 
+     * @return string The prefix for this type of line comment.
+    */
+    function getValue() {
+        return $this->_value;
+    }
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/StripLineComments.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/StripPhpComments.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/StripPhpComments.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/StripPhpComments.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,190 @@
+<?php
+
+/*
+ *  $Id: StripPhpComments.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/filters/BaseFilterReader.php';
+include_once 'phing/filters/ChainableReader.php';
+
+/**
+ * This is a Php comment and string stripper reader that filters
+ * those lexical tokens out for purposes of simple Php parsing.
+ * (if you have more complex Php parsing needs, use a real lexer).
+ * Since this class heavily relies on the single char read function,
+ * you are reccomended to make it work on top of a buffered reader.
+ *
+ * @author    <a href="mailto:yl en seasonfive.com">Yannick Lecaillez</a>
+ * @author    hans lellelid, hans en velum.net
+ * @version   $Revision: 1.6 $ $Date$
+ * @access    public
+ * @see       FilterReader
+ * @package   phing.filters
+ * @todo -c use new PHP functions to perform this instead of regex.
+ */
+class StripPhpComments extends BaseFilterReader implements ChainableReader {
+    /**
+     * The read-ahead character, used for effectively pushing a single
+     * character back. -1 indicates that no character is in the buffer.
+     */
+    private $_readAheadCh = -1;
+
+    /**
+     * Whether or not the parser is currently in the middle of a string
+     * literal.
+     * @var boolean
+     */
+    private $_inString = false;    
+
+    /**
+     * Returns the  stream without Php comments.
+     * 
+     * @return the resulting stream, or -1
+     *         if the end of the resulting stream has been reached
+     * 
+     * @throws IOException if the underlying stream throws an IOException
+     *                        during reading     
+     */
+    function read($len = null) {
+    
+        $buffer = $this->in->read($len);
+        if($buffer === -1) {
+            return -1;
+        }
+        
+        // This regex replace /* */ and // style comments
+        $buffer = preg_replace('/\/\*[^*]*\*+([^\/*][^*]*\*+)*\/|\/\/[^\n]*|("(\\\\.|[^"\\\\])*"|\'(\\\\.|[^\'\\\\])*\'|.[^\/"\'\\\\]*)/s', "$2", $buffer);
+                
+        // The regex above is not identical to, but is based on the expression below:
+        //
+        // created by Jeffrey Friedl
+        //   and later modified by Fred Curtis.
+        //     s{
+        //          /\*         ##  Start of /* ... */ comment
+        //          [^*]*\*+    ##  Non-* followed by 1-or-more *'s
+        //          (
+        //            [^/*][^*]*\*+
+        //          )*          ##  0-or-more things which don't start with /
+        //                      ##    but do end with '*'
+        //          /           ##  End of /* ... */ comment
+        //
+        //        |         ##     OR  various things which aren't comments:
+        //
+        //          (
+        //            "           ##  Start of " ... " string
+        //            (
+        //              \\.           ##  Escaped char
+        //            |               ##    OR
+        //              [^"\\]        ##  Non "\
+        //            )*
+        //           "           ##  End of " ... " string
+        //
+        //          |         ##     OR
+        //
+        //            '           ##  Start of ' ... ' string
+        //            (
+        //              \\.           ##  Escaped char
+        //            |               ##    OR
+        //              [^'\\]        ##  Non '\
+        //            )*
+        //            '           ##  End of ' ... ' string
+        //
+        //          |         ##     OR
+        //
+        //            .           ##  Anything other char
+        //            [^/"'\\]*   ##  Chars which doesn't start a comment, string or escape
+        //          )
+        //        }{$2}gxs;
+                                
+        return $buffer;
+    }
+        
+    
+    /*
+     * Returns the next character in the filtered stream, not including
+     * Php comments.
+     * 
+     * @return the next character in the resulting stream, or -1
+     *         if the end of the resulting stream has been reached
+     * 
+     * @throws IOException if the underlying stream throws an IOException
+     *                        during reading     
+     * @deprecated
+     */
+    function readChar() {
+        $ch = -1;
+
+        if ( $this->_readAheadCh !== -1 ) {
+            $ch = $this->_readAheadCh;
+            $this->_readAheadCh = -1;
+        } else {
+            $ch = $this->in->readChar();
+            if ( $ch === "\"" ) {
+                $this->_inString = !$this->_inString;
+            } else {
+                if ( !$this->_inString ) {
+                    if ( $ch === "/" ) {
+                        $ch = $this->in->readChar();
+                        if ( $ch === "/" ) {
+                            while ( $ch !== "\n" && $ch !== -1 ) {
+                                $ch = $this->in->readChar();
+                            }
+                        } else if ( $ch === "*" ) {
+                            while ( $ch !== -1 ) {
+                                $ch = $this->in->readChar();
+                                while ( $ch === "*" && $ch !== -1 ) {
+                                    $ch = $this->in->readChar();
+                                }
+
+                                if ( $ch === "/" ) {
+                                    $ch = $this->readChar();
+                                    echo "$ch\n";
+                                    break;
+                                }
+                            }
+                        } else {
+                            $this->_readAheadCh = $ch;
+                            $ch = "/";
+                        }
+                    }
+                }
+            }
+        }
+
+        return $ch;
+    }
+
+    /**
+     * Creates a new StripJavaComments using the passed in
+     * Reader for instantiation.
+     * 
+     * @param reader A Reader object providing the underlying stream.
+     *               Must not be <code>null</code>.
+     * 
+     * @return a new filter based on this configuration, but filtering
+     *         the specified reader
+     */
+    function chain(Reader $reader) {
+        $newFilter = new StripPhpComments($reader);
+        $newFilter->setProject($this->getProject());        
+        return $newFilter;
+    }
+}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/StripPhpComments.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TabToSpaces.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TabToSpaces.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TabToSpaces.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,144 @@
+<?php
+
+/*
+ *  $Id: TabToSpaces.php 3076 2006-12-18 08:52:12Z fabien $  
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+require_once 'phing/filters/BaseParamFilterReader.php';
+require_once 'phing/filters/ChainableReader.php';
+
+/**
+ * Converts tabs to spaces.
+ *
+ * Example:
+ *
+ * <pre><tabtospaces tablength="8"></pre>
+ *
+ * Or:
+ *
+ * <pre><filterreader classname="phing.filters.TabsToSpaces">
+ *   <param name="tablength" value="8">
+ * </filterreader></pre>
+ *
+ * @author    Yannick Lecaillez <yl en seasonfive.com>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.9 $
+ * @see       BaseParamFilterReader
+ * @package   phing.filters
+ */
+class TabToSpaces extends BaseParamFilterReader implements ChainableReader {
+
+    /**
+     * The default tab length. 
+     * @var int
+     */
+    const DEFAULT_TAB_LENGTH = 8;
+    
+    /**
+     * Parameter name for the length of a tab.
+     * @var string
+     */
+    const TAB_LENGTH_KEY = "tablength";
+    
+    /**
+     * Tab length in this filter.
+     * @var int
+     */  
+    private $tabLength = 8; //self::DEFAULT_TAB_LENGTH;    
+
+    /**
+     * Returns stream after converting tabs to the specified number of spaces.
+     * 
+     * @return the resulting stream, or -1
+     *         if the end of the resulting stream has been reached
+     * 
+     * @exception IOException if the underlying stream throws an IOException
+     *            during reading     
+     */
+    function read($len = null) {
+    
+        if ( !$this->getInitialized() ) {
+            $this->_initialize();
+            $this->setInitialized(true);
+        }
+
+          $buffer = $this->in->read($len);
+        
+        if($buffer === -1) {
+            return -1;
+        }
+        
+        $buffer = str_replace("\t", str_repeat(' ', $this->tabLength), $buffer);
+        
+        return $buffer;        
+    }
+    
+    /**
+     * Sets the tab length.
+     * 
+     * @param int $tabLength The number of spaces to be used when converting a tab.
+     */
+    function setTablength($tabLength) {
+        $this->tabLength = (int) $tabLength;
+    }
+
+    /**
+     * Returns the tab length.
+     * 
+     * @return int The number of spaces used when converting a tab
+     */
+    function getTablength() {
+        return $this->tabLength;
+    }
+
+    /**
+     * Creates a new TabsToSpaces using the passed in
+     * Reader for instantiation.
+     * 
+     * @param Reader $reader A Reader object providing the underlying stream.
+     *               Must not be <code>null</code>.
+     * 
+     * @return Reader A new filter based on this configuration, but filtering
+     *         the specified reader
+     */
+    function chain(Reader $reader) {
+        $newFilter = new TabToSpaces($reader);
+        $newFilter->setTablength($this->getTablength());
+        $newFilter->setInitialized(true);
+        $newFilter->setProject($this->getProject());        
+        return $newFilter;
+    }
+
+    /**
+     * Parses the parameters to set the tab length.
+     */
+    private function _initialize() {
+        $params = $this->getParameters();
+        if ( $params !== null ) {
+            for($i = 0 ; $i<count($params) ; $i++) {
+                if (self::TAB_LENGTH_KEY === $params[$i]->getName()) {
+                    $this->tabLength = $params[$i]->getValue();
+                    break;
+                }
+            }
+        }
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TabToSpaces.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TailFilter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TailFilter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TailFilter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,157 @@
+<?php
+
+/*
+ *  $Id: TailFilter.php 3076 2006-12-18 08:52:12Z fabien $  
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+require_once 'phing/filters/BaseParamFilterReader.php';
+
+/**
+ * Reads the last <code>n</code> lines of a stream. (Default is last10 lines.)
+ *
+ * Example:
+ *
+ * <pre><tailfilter lines="3" /></pre>
+ *
+ * Or:
+ *
+ * <pre><filterreader classname="phing.filters.TailFilter">
+ *   <param name="lines" value="3">
+ * </filterreader></pre>
+ *
+ * @author    <a href="mailto:yl en seasonfive.com">Yannick Lecaillez</a>
+ * @author    hans lellelid, hans en velum.net
+ * @copyright © 2003 seasonfive. All rights reserved
+ * @version   $Revision: 1.7 $
+ * @see       BaseParamFilterReader
+ * @package   phing.filters
+ */
+class TailFilter extends BaseParamFilterReader implements ChainableReader {
+
+    /**
+     * Parameter name for the number of lines to be returned.
+     * @var string
+     */
+    const LINES_KEY = "lines";
+    
+    
+    /**
+     * Number of lines to be returned in the filtered stream.
+     * @var integer
+     */ 
+    private $_lines = 10;
+    
+    /**
+     * Array to hold lines.
+     * @var array
+     */ 
+    private    $_lineBuffer = array();
+                
+    /**
+     * Returns the last n lines of a file.
+     * @param int $len Num chars to read.
+     * @return mixed The filtered buffer or -1 if EOF.
+     */
+    function read($len = null) {
+    
+        while ( ($buffer = $this->in->read($len)) !== -1 ) {
+            // Remove the last "\n" from buffer for
+            // prevent explode to add an empty cell at
+            // the end of array
+            $buffer= trim($buffer, "\n");
+            
+            $lines = explode("\n", $buffer);
+
+            if ( count($lines) >= $this->_lines ) {
+                // Buffer have more (or same) number of lines than needed.
+                // Fill lineBuffer with the last "$this->_lines" lasts ones.
+                $off = count($lines)-$this->_lines;
+                $this->_lineBuffer = array_slice($lines, $off);
+            } else {
+                // Some new lines ...
+                // Prepare space for insert these new ones
+                $this->_lineBuffer = array_slice($this->_lineBuffer, count($lines)-1);
+                $this->_lineBuffer = array_merge($this->_lineBuffer, $lines);
+            }
+        }
+
+        if ( empty($this->_lineBuffer) )
+            $ret = -1;
+        else {
+            $ret = implode("\n", $this->_lineBuffer);
+            $this->_lineBuffer = array();
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Sets the number of lines to be returned in the filtered stream.
+     * 
+     * @param integer $lines the number of lines to be returned in the filtered stream.
+     */
+    function setLines($lines) {
+        $this->_lines = (int) $lines;
+    }
+
+    /**
+     * Returns the number of lines to be returned in the filtered stream.
+     * 
+     * @return integer The number of lines to be returned in the filtered stream.
+     */
+    function getLines() {
+        return $this->_lines;
+    }
+
+    /**
+     * Creates a new TailFilter using the passed in
+     * Reader for instantiation.
+     * 
+     * @param object A Reader object providing the underlying stream.
+     *               Must not be <code>null</code>.
+     * 
+     * @return object A new filter based on this configuration, but filtering
+     *         the specified reader.
+     */
+    function chain(Reader $reader) {
+        $newFilter = new TailFilter($reader);
+        $newFilter->setLines($this->getLines());
+        $newFilter->setInitialized(true);
+        $newFilter->setProject($this->getProject());        
+        return $newFilter;
+    }
+
+    /**
+     * Scans the parameters list for the "lines" parameter and uses
+     * it to set the number of lines to be returned in the filtered stream.
+     */
+    private function _initialize() {
+        $params = $this->getParameters();
+        if ( $params !== null ) {
+            for($i=0, $_i=count($params); $i < $_i; $i++) {
+                if ( self::LINES_KEY == $params[$i]->getName() ) {
+                    $this->_lines = (int) $params[$i]->getValue();
+                    break;
+                }
+            }
+        }
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TailFilter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TidyFilter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TidyFilter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TidyFilter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,162 @@
+<?php
+/*
+ *  $Id: TidyFilter.php 3076 2006-12-18 08:52:12Z fabien $  
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/filters/BaseParamFilterReader.php';
+include_once 'phing/filters/ChainableReader.php';
+
+/**
+ * This filter uses the bundled-with-PHP Tidy extension to filter input.
+ * 
+ * <p>
+ * Example:<br/>
+ * <pre>
+ * <tidyfilter encoding="utf8">
+ *   <config name="indent" value="true"/>
+ *   <config name="output-xhtml" value="true"/>
+ * </tidyfilter>
+ * </pre>
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.2 $ $Date$
+ * @package   phing.filters
+ */
+class TidyFilter extends BaseParamFilterReader implements ChainableReader {
+   	
+	/** @var string Encoding of resulting document. */
+	private $encoding = 'utf8';
+   
+    /** @var array Parameter[] */
+	private $configParameters = array();
+     
+	/**
+	 * Set the encoding for resulting (X)HTML document.
+	 * @param string $v
+	 */
+	public function setEncoding($v) {
+		$this->encoding = $v;
+	}
+	
+	/**
+	 * Sets the config params.
+	 * @param array Parameter[]
+	 * @see chain()
+	 */
+	public function setConfigParameters($params)
+	{
+		$this->configParameters = $params;
+	}
+	
+	/**
+	 * Adds a <config> element (which is a Parameter).
+	 * @return Parameter
+	 */
+	public function createConfig() {
+		$num = array_push($this->configParameters, new Parameter());
+        return $this->configParameters[$num-1];
+	}
+	
+	/**
+	 * Converts the Parameter objects being used to store configuration into a simle assoc array.
+	 * @return array
+	 */
+	private function getDistilledConfig() {
+		$config = array();
+		foreach($this->configParameters as $p) {
+			$config[$p->getName()] = $p->getValue();
+		}
+		return $config;
+	}
+	
+    /**
+     * Reads input and returns Tidy-filtered output.
+     * 
+     * @return the resulting stream, or -1 if the end of the resulting stream has been reached
+     * 
+     * @throws IOException if the underlying stream throws an IOException
+     *                        during reading     
+     */
+    function read($len = null) {
+    	
+		if (!class_exists('Tidy')) {
+			throw new BuildException("You must enable the 'tidy' extension in your PHP configuration in order to use the Tidy filter.");
+		}
+		
+		if ( !$this->getInitialized() ) {
+            $this->_initialize();
+            $this->setInitialized(true);
+        }
+		
+        $buffer = $this->in->read($len);
+        if($buffer === -1) {
+            return -1;
+        }
+		
+		$config = $this->getDistilledConfig();
+		
+		$tidy = new Tidy();
+		$tidy->parseString($buffer, $config, $this->encoding);
+		$tidy->cleanRepair();
+
+		return tidy_get_output($tidy);
+		
+    }
+
+
+    /**
+     * Creates a new TidyFilter using the passed in Reader for instantiation.
+     * 
+     * @param reader A Reader object providing the underlying stream.
+     *               Must not be <code>null</code>.
+     * 
+     * @return a new filter based on this configuration, but filtering
+     *         the specified reader
+     */
+    public function chain(Reader $reader) {
+        $newFilter = new TidyFilter($reader);
+		$newFilter->setConfigParameters($this->configParameters);
+		$newFilter->setEncoding($this->encoding);
+        $newFilter->setProject($this->getProject());
+        return $newFilter;
+    }
+	
+	/**
+     * Initializes any parameters (e.g. config options).
+     * This method is only called when this filter is used through a <filterreader> tag in build file.
+     */
+    private function _initialize() {
+        $params = $this->getParameters();
+		if ($params) {
+			foreach($params as $param) {
+				if ($param->getType() == "config") {
+					$this->configParameters[] = $param;
+				} else {
+					
+					if ($param->getName() == "encoding") {
+					    $this->setEncoding($param->getValue());
+					}
+					
+				}
+				
+			}
+		}
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TidyFilter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TranslateGettext.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TranslateGettext.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TranslateGettext.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,285 @@
+<?php
+
+/*
+ *  $Id: TranslateGettext.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+require_once 'phing/filters/BaseParamFilterReader.php';
+include_once 'phing/filters/ChainableReader.php';
+
+/**
+ * Replaces gettext("message id") and _("message id") with the translated string.
+ * 
+ * Gettext is great for creating multi-lingual sites, but in some cases (e.g. for 
+ * performance reasons) you may wish to replace the gettext calls with the translations
+ * of the strings; that's what this task is for.  Note that this is similar to
+ * ReplaceTokens, but both the find and the replace aspect is more complicated -- hence
+ * this is a separate, stand-alone filter.
+ * 
+ * <p>
+ * Example:<br>
+ * <pre>
+ * <translategettext locale="en_US" domain="messages" dir="${webroot}/local"/>
+ * </pre>
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.11 $ $Date$
+ * @access    public
+ * @see       BaseFilterReader
+ * @package   phing.filters
+ */
+class TranslateGettext extends BaseParamFilterReader implements ChainableReader {
+
+    // constants for specifying keys to expect
+    // when this is called using <filterreader ... />
+    const DOMAIN_KEY = "domain";
+    const DIR_KEY = "dir";
+    const LOCALE_KEY = "locale";
+    
+    /** The domain to use */
+    private $domain = 'messages';
+    
+    /** The dir containing LC_MESSAGES */
+    private $dir;
+
+    /** The locale to use */
+    private $locale;
+    
+    /** The system locale before it was changed for this filter. */
+    private $storedLocale;
+    
+    /**
+     * Set the text domain to use.
+     * The text domain must correspond to the name of the compiled .mo files.
+     * E.g. "messages" ==> $dir/LC_MESSAGES/messages.mo
+     *         "mydomain" ==> $dir/LC_MESSAGES/mydomain.mo
+     * @param string $domain
+     */
+    function setDomain($domain) {
+        $this->domain = $domain;
+    }
+    
+    /**
+     * Get the current domain.
+     * @return string
+     */
+    function getDomain() {
+        return $this->domain;
+    }
+    
+    /**
+     * Sets the root locale directory.
+     * @param PhingFile $dir
+     */
+    function setDir(PhingFile $dir) {
+        $this->dir = $dir;
+    }
+    
+    /**
+     * Gets the root locale directory.
+     * @return PhingFile
+     */
+    function getDir() {
+        return $this->dir;
+    }
+    
+    /**
+     * Sets the locale to use for translation.
+     * Note that for gettext() to work, you have to make sure this locale
+     * is specific enough for your system (e.g. some systems may allow an 'en' locale,
+     * but others will require 'en_US', etc.).
+     * @param string $locale 
+     */
+    function setLocale($locale) {
+        $this->locale = $locale;
+    }
+    
+    /**
+     * Gets the locale to use for translation.
+     * @return string
+     */
+    function getLocale() {
+        return $this->locale;
+    }
+    
+    /**
+     * Make sure that required attributes are set.
+     * @throws BuldException - if any required attribs aren't set.
+     */
+    protected function checkAttributes() {
+        if (!$this->domain || !$this->locale || !$this->dir) {
+            throw new BuildException("You must specify values for domain, locale, and dir attributes.");
+        }
+    }
+    
+    /**
+     * Initialize the gettext/locale environment.
+     * This method will change some env vars and locale settings; the
+     * restoreEnvironment should put them all back :)
+     * 
+     * @return void
+     * @throws BuildException - if locale cannot be set.
+     * @see restoreEnvironment()
+     */
+    protected function initEnvironment() {
+        $this->storedLocale = getenv("LANG");
+        
+        $this->log("Setting locale to " . $this->locale, PROJECT_MSG_DEBUG);
+        putenv("LANG=".$this->locale);
+        $ret = setlocale(LC_ALL, $this->locale);
+        if ($ret === false) {
+            $msg = "Could not set locale to " . $this->locale
+                    . ". You may need to use fully qualified name"
+                    . " (e.g. en_US instead of en).";
+            throw new BuildException($msg);
+        }        
+        
+        $this->log("Binding domain '".$this->domain."' to "  . $this->dir, PROJECT_MSG_DEBUG);
+        bindtextdomain($this->domain, $this->dir->getAbsolutePath());
+        textdomain($this->domain);        
+    }
+    
+    /**
+     * Restores environment settings and locale.
+     * This does _not_ restore any gettext-specific settings
+     * (e.g. textdomain()).
+     * 
+     * @return void
+     */
+    protected function restoreEnvironment() {
+        putenv("LANG=".$this->storedLocale);
+        setlocale(LC_ALL, $this->storedLocale);
+    }
+
+    /**
+     * Performs gettext translation of msgid and returns translated text.
+     * 
+     * This function simply wraps gettext() call, but provides ability to log
+     * string replacements.  (alternative would be using preg_replace with /e which
+     * would probably be faster, but no ability to debug/log.)
+     * 
+     * @param array $matches Array of matches; we're interested in $matches[2].
+     * @return string Translated text
+     */
+    private function xlateStringCallback($matches) {
+        $charbefore = $matches[1];
+        $msgid = $matches[2];
+        $translated = gettext($msgid);
+        $this->log("Translating \"$msgid\" => \"$translated\"", PROJECT_MSG_DEBUG);
+        return $charbefore . '"' . $translated . '"';
+    }
+        
+    /**
+     * Returns the filtered stream. 
+     * The original stream is first read in fully, and then translation is performed.
+     * 
+     * @return mixed     the filtered stream, or -1 if the end of the resulting stream has been reached.
+     * 
+     * @throws IOException - if the underlying stream throws an IOException during reading
+     * @throws BuildException - if the correct params are not supplied
+     */
+    function read($len = null) {
+                
+        if ( !$this->getInitialized() ) {
+            $this->_initialize();
+            $this->setInitialized(true);
+        }
+        
+        // Make sure correct params/attribs have been set
+        $this->checkAttributes();
+        
+        $buffer = $this->in->read($len);        
+        if($buffer === -1) {
+            return -1;
+        }
+
+        // Setup the locale/gettext environment
+        $this->initEnvironment();
+        
+
+        // replace any occurrences of _("") or gettext("") with
+        // the translated value.
+        //
+        // ([^\w]|^)_\("((\\"|[^"])*)"\)
+        //  --$1---      -----$2----   
+        //                 ---$3--  [match escaped quotes or any char that's not a quote]
+        // 
+        // also match gettext() -- same as above
+        
+        $buffer = preg_replace_callback('/([^\w]|^)_\("((\\\"|[^"])*)"\)/', array($this, 'xlateStringCallback'), $buffer);
+        $buffer = preg_replace_callback('/([^\w]|^)gettext\("((\\\"|[^"])*)"\)/', array($this, 'xlateStringCallback'), $buffer);
+
+        // Check to see if there are any _('') calls and flag an error
+
+        // Check to see if there are any unmatched gettext() calls -- and flag an error        
+                    
+        $matches = array();
+        if (preg_match('/([^\w]|^)(gettext\([^\)]+\))/', $buffer, $matches)) {
+            $this->log("Unable to perform translation on: " . $matches[2], PROJECT_MSG_WARN);
+        }
+                
+        $this->restoreEnvironment();
+        
+        return $buffer;
+    }
+
+    /**
+     * Creates a new TranslateGettext filter using the passed in
+     * Reader for instantiation.
+     * 
+     * @param Reader $reader A Reader object providing the underlying stream.
+     *               Must not be <code>null</code>.
+     * 
+     * @return TranslateGettext A new filter based on this configuration, but filtering
+     *         the specified reader
+     */
+    function chain(Reader $reader) {
+        $newFilter = new TranslateGettext($reader);
+        $newFilter->setProject($this->getProject());
+        $newFilter->setDomain($this->getDomain());
+        $newFilter->setLocale($this->getLocale());
+        $newFilter->setDir($this->getDir());
+        return $newFilter;
+    }
+
+    /**
+     * Parses the parameters if this filter is being used in "generic" mode.
+     */
+    private function _initialize() {
+        $params = $this->getParameters();
+        if ( $params !== null ) {
+            foreach($params as $param) {
+                switch($param->getType()) {
+                    case self::DOMAIN_KEY:
+                        $this->setDomain($param->getValue());
+                        break;
+                    case self::DIR_KEY:
+                        $this->setDir($this->project->resolveFile($param->getValue()));
+                        break;
+                        
+                    case self::LOCALE_KEY:
+                        $this->setLocale($param->getValue());
+                        break;                
+                } // switch
+            }
+        } // if params !== null
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/TranslateGettext.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/XsltFilter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/XsltFilter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/XsltFilter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,317 @@
+<?php
+
+/*
+ *  $Id: XsltFilter.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/filters/BaseParamFilterReader.php';
+include_once 'phing/filters/ChainableReader.php';
+
+/**
+ * Applies XSL stylesheet to incoming text.
+ * 
+ * Uses PHP XSLT support (libxslt).
+ * 
+ * @author    Hans Lellelid <hans en velum.net>
+ * @author    Yannick Lecaillez <yl en seasonfive.com>
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @version   $Revision: 1.16 $
+ * @see       FilterReader
+ * @package   phing.filters
+ */
+class XsltFilter extends BaseParamFilterReader implements ChainableReader {
+
+    /**
+     * Path to XSL stylesheet.
+     * @var string
+     */
+    private $xslFile   = null;
+
+    /**
+     * Whether XML file has been transformed.
+     * @var boolean
+     */
+    private $processed = false;
+    
+    /**
+     * XSLT Params.
+     * @var array
+     */
+    private $xsltParams = array();    
+    
+    /**
+     * Whether to use loadHTML() to parse the input XML file.
+     */
+    private $html = false;
+    
+    /**
+     * Create new XSLT Param object, to handle the <param/> nested element.
+     * @return XSLTParam
+     */
+    function createParam() {
+        $num = array_push($this->xsltParams, new XSLTParam());
+        return $this->xsltParams[$num-1];
+    }
+    
+    /**
+     * Sets the XSLT params for this class.
+     * This is used to "clone" this class, in the chain() method.
+     * @param array $params
+     */
+    function setParams($params) {
+        $this->xsltParams = $params;
+    }
+    
+    /**
+     * Returns the XSLT params set for this class.
+     * This is used to "clone" this class, in the chain() method.
+     * @return array
+     */
+    function getParams() {
+        return $this->xsltParams;
+    }
+        
+    /**
+     * Set the XSLT stylesheet.
+     * @param mixed $file PhingFile object or path.
+     */
+    function setStyle(PhingFile $file) {
+        $this->xslFile = $file;
+    }
+
+    /**
+     * Whether to use HTML parser for the XML.
+     * This is supported in libxml2 -- Yay!
+     * @return boolean
+     */
+    function getHtml() {
+        return $this->html;
+    }
+    
+    /**
+     * Whether to use HTML parser for XML.
+     * @param boolean $b
+     */
+    function setHtml($b) {        
+        $this->html = (boolean) $b;
+    }
+    
+    /**
+     * Get the path to XSLT stylesheet.
+     * @return mixed XSLT stylesheet path.
+     */
+    function getStyle() {
+        return $this->xslFile;
+    }
+    
+    /**
+     * Reads stream, applies XSLT and returns resulting stream.
+     * @return string transformed buffer.
+     * @throws BuildException - if XSLT support missing, if error in xslt processing
+     */
+    function read($len = null) {
+        
+        if (!class_exists('XSLTProcessor')) {
+            throw new BuildException("Could not find the XSLTProcessor class. Make sure PHP has been compiled/configured to support XSLT.");
+        }
+        
+        if ($this->processed === true) {
+            return -1; // EOF
+        }
+        
+        if ( !$this->getInitialized() ) {
+            $this->_initialize();
+            $this->setInitialized(true);
+        }
+
+        // Read XML
+        $_xml = null;
+        while ( ($data = $this->in->read($len)) !== -1 )
+            $_xml .= $data;
+
+        if ($_xml === null ) { // EOF?
+            return -1;
+        }
+
+        if(empty($_xml)) {
+            $this->log("XML file is empty!", PROJECT_MSG_WARN);
+            return ''; // return empty string, don't attempt to apply XSLT
+        }
+       
+        // Read XSLT
+        $_xsl = null;
+        $xslFr = new FileReader($this->xslFile);
+        $xslFr->readInto($_xsl);
+        
+        $this->log("Tranforming XML " . $this->in->getResource() . " using style " . $this->xslFile->getPath(), PROJECT_MSG_VERBOSE);
+        
+        $out = '';
+        try {
+            $out = $this->process($_xml, $_xsl);
+            $this->processed = true;
+        } catch (IOException $e) {            
+            throw new BuildException($e);
+        }
+
+        return $out;
+    }
+
+    // {{{ method _ProcessXsltTransformation($xml, $xslt) throws BuildException
+    /**
+     * Try to process the XSLT transformation
+     *
+     * @param   string  XML to process.
+     * @param   string  XSLT sheet to use for the processing.
+     *
+     * @throws BuildException   On XSLT errors
+     */
+    protected function process($xml, $xsl) {    
+                
+        $processor = new XSLTProcessor();
+        
+        $xmlDom = new DOMDocument();
+        $xslDom = new DOMDocument();        
+        
+        if ($this->html) {            
+            $xmlDom->loadHTML($xml);
+        } else {
+            $xmlDom->loadXML($xml);
+        }
+        
+        $xslDom->loadxml($xsl);
+        
+        $processor->importStylesheet($xslDom);
+
+        // ignoring param "type" attrib, because
+        // we're only supporting direct XSL params right now
+        foreach($this->xsltParams as $param) {
+            $this->log("Setting XSLT param: " . $param->getName() . "=>" . $param->getExpression(), PROJECT_MSG_DEBUG);
+            $processor->setParameter(null, $param->getName(), $param->getExpression());
+        }
+        
+        $result = $processor->transformToXML($xmlDom);
+        
+        if ( !$result ) {
+            //$errno = xslt_errno($processor);
+            //$err   = xslt_error($processor);    
+            throw new BuildException("XSLT Error");            
+        } else {
+            return $result;
+        }
+    }    
+
+    /**
+     * Creates a new XsltFilter using the passed in
+     * Reader for instantiation.
+     *
+     * @param Reader A Reader object providing the underlying stream.
+     *               Must not be <code>null</code>.
+     *
+     * @return Reader A new filter based on this configuration, but filtering
+     *         the specified reader
+     */
+    function chain(Reader $reader) {
+        $newFilter = new XsltFilter($reader);
+        $newFilter->setProject($this->getProject());
+        $newFilter->setStyle($this->getStyle());
+        $newFilter->setInitialized(true);
+        $newFilter->setParams($this->getParams());
+        $newFilter->setHtml($this->getHtml());
+        return $newFilter;
+    }
+
+    /**
+     * Parses the parameters to get stylesheet path.
+     */
+    private function _initialize() {        
+        $params = $this->getParameters();
+        if ( $params !== null ) {
+            for($i = 0, $_i=count($params) ; $i < $_i; $i++) {
+                if ( $params[$i]->getType() === null ) {
+                    if ($params[$i]->getName() === "style") {
+                        $this->setStyle($params[$i]->getValue());
+                    }
+                } elseif ($params[$i]->getType() == "param") {
+                    $xp = new XSLTParam();
+                    $xp->setName($params[$i]->getName());
+                    $xp->setExpression($params[$i]->getValue());
+                    $this->xsltParams[] = $xp;
+                }
+            }
+        }
+    }
+
+}
+
+
+/**
+ * Class that holds an XSLT parameter.
+ */
+class XSLTParam {
+    
+    private $name;
+    
+    private $expr;    
+    
+    /**
+     * Sets param name.
+     * @param string $name
+     */
+    public function setName($name) {
+        $this->name = $name;
+    }
+    
+    /**
+     * Get param name.
+     * @return string
+     */
+    public function getName() {
+        return $this->name;
+    }
+    
+    /**
+     * Sets expression value.
+     * @param string $expr
+     */
+    public function setExpression($expr) {
+        $this->expr = $expr;
+    }
+    
+    /**
+     * Sets expression to dynamic register slot.
+     * @param RegisterSlot $expr
+     */
+    public function setListeningExpression(RegisterSlot $expr) {
+        $this->expr = $expr;    
+    }
+    
+    /**
+     * Returns expression value -- performs lookup if expr is registerslot.
+     * @return string
+     */
+    public function getExpression() {
+        if ($this->expr instanceof RegisterSlot) {
+            return $this->expr->getValue();
+        } else {
+            return $this->expr;
+        }
+    }        
+}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/XsltFilter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/util/ChainReaderHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/util/ChainReaderHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/util/ChainReaderHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,184 @@
+<?php
+/*
+ *  $Id: ChainReaderHelper.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/Project.php';
+include_once 'phing/filters/BaseFilterReader.php';
+include_once 'phing/types/PhingFilterReader.php';
+include_once 'phing/types/FilterChain.php';
+include_once 'phing/types/Parameter.php';
+include_once 'phing/util/FileUtils.php';
+include_once 'phing/util/StringHelper.php';
+include_once 'phing/filters/ChainableReader.php';
+
+/**
+ * Process a FilterReader chain.
+ *
+ * Here, the interesting method is 'getAssembledReader'.
+ * The purpose of this one is to create a simple Reader object which
+ * apply all filters on another primary Reader object. 
+ *
+ * For example : In copyFile (phing.util.FileUtils) the primary Reader
+ * is a FileReader object (more accuratly, a BufferedReader) previously 
+ * setted for the source file to copy. So, consider this filterchain :
+ *        
+ *     <filterchain>
+ *        <stripphpcomments />
+ *        <linecontains>
+ *            <contains value="foo">
+ *        </linecontains>
+ *      <tabtospaces tablength="8" />
+ *    </filterchain>
+ *
+ *    getAssembledReader will return a Reader object wich read on each
+ *    of these filters. Something like this : ('->' = 'which read data from') :
+ *
+ *  [TABTOSPACES] -> [LINECONTAINS] -> [STRIPPHPCOMMENTS] -> [FILEREADER]
+ *                                                         (primary reader)
+ *
+ *  So, getAssembledReader will return the TABTOSPACES Reader object. Then
+ *  each read done with this Reader object will follow this path.
+ *
+ *    Hope this explanation is clear :)
+ *
+ * TODO: Implement the classPath feature.
+ *
+ * @author    <a href="mailto:yl en seasonfive.com">Yannick Lecaillez</a>
+ * @version   $Revision: 1.8 $ $Date$
+ * @access    public
+ * @package   phing.filters.util
+*/
+class ChainReaderHelper {
+    
+    /** Primary reader to wich the reader chain is to be attached */
+    private $primaryReader = null;
+    
+    /** The site of the buffer to be used. */
+    private $bufferSize = 8192;
+    
+    /** Chain of filters */
+    private $filterChains = array();
+    
+    /** The Phing project */
+    private $project;
+
+    /*
+     * Sets the primary reader
+    */
+    function setPrimaryReader(Reader $reader) {
+        $this->primaryReader = $reader;
+    }
+
+    /*
+     * Set the project to work with
+    */
+    function setProject(Project $project) {
+        $this->project = $project;
+    }
+
+    /*
+     * Get the project
+    */
+    function getProject() {
+        return $this->project;
+    }
+
+    /*
+     * Sets the buffer size to be used.  Defaults to 8192,
+     * if this method is not invoked.
+    */
+    function setBufferSize($size) {
+        $this->bufferSize = $size;
+    }
+
+    /*
+     * Sets the collection of filter reader sets
+    */
+    function setFilterChains(&$fchain) {
+        $this->filterChains = &$fchain;
+    }
+
+    /*
+     * Assemble the reader
+    */
+    function getAssembledReader() {
+    
+        $instream = $this->primaryReader;
+        $filterReadersCount = count($this->filterChains);
+        $finalFilters = array();
+
+        // Collect all filter readers of all filter chains used ...
+        for($i = 0 ; $i<$filterReadersCount ; $i++) {
+            $filterchain = &$this->filterChains[$i];
+            $filterReaders = $filterchain->getFilterReaders();
+            $readerCount = count($filterReaders);
+            for($j = 0 ; $j<$readerCount ; $j++) {
+                $finalFilters[] = $filterReaders[$j];
+            }
+        }
+
+        // ... then chain the filter readers.
+        $filtersCount = count($finalFilters);
+        if ( $filtersCount > 0 ) {
+            for($i = 0 ; $i<$filtersCount ; $i++) {
+                $filter = $finalFilters[$i];
+                
+                if ( $filter instanceof PhingFilterReader ) {
+                
+                    // This filter reader is an external class.
+                    $className = $filter->getClassName();
+                    $classpath = $filter->getClasspath();
+                    $project   = $filter->getProject();
+                    
+                    if ( $className !== null ) {
+                        $cls = Phing::import($className, $classpath);
+                        $impl = new $cls();                        
+                    }
+
+                    if ( !($impl instanceof FilterReader) ) {
+                        throw new Exception($className." does not extend phing.system.io.FilterReader");
+                    }
+                    
+                    $impl->setReader($instream); // chain
+                    $impl->setProject($this->getProject()); // what about $project above ?
+
+                    if ( $impl instanceof Parameterizable ) {
+                        $impl->setParameters($filter->getParams());
+                    }
+                    
+                    $instream = $impl; // now that it's been chained
+                                                            
+                } elseif (($filter instanceof ChainableReader) && ($filter instanceof Reader)) {                   
+                    if ( $this->getProject() !== null && ($filter instanceof BaseFilterReader) ) {
+                        $filter->setProject($this->getProject());
+                    }                    
+                    $instream = $filter->chain($instream);
+                } else {
+                    throw new Exception("Cannot chain invalid filter: " . get_class($filter));
+                }
+            }
+        }
+
+        return $instream;
+    }    
+
+}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/util/ChainReaderHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/util/IniFileTokenReader.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/util/IniFileTokenReader.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/util/IniFileTokenReader.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,96 @@
+<?php
+/*
+ *  $Id: IniFileTokenReader.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/types/TokenReader.php';
+include_once 'phing/system/io/IOException.php';
+include_once 'phing/filters/ReplaceTokens.php'; // For class Token
+
+/**
+ * Class that allows reading tokens from INI files.
+ * 
+ * @author    Manuel Holtgewe
+ * @version   $Revision: 1.7 $
+ * @package   phing.filters.util
+ */
+class IniFileTokenReader extends TokenReader {
+
+    /**
+     * Holds the path to the INI file that is to be read.
+     * @var object  Reference to a PhingFile Object representing
+     *              the path to the INI file.
+     */
+    private $file = null;
+
+    /**
+     * @var string  Sets the section to load from the INI file.
+     *              if omitted, all sections are loaded.
+     */
+    private $section = null;
+
+    /**
+     * Reads the next token from the INI file
+     *
+     * @throws  IOException     On error
+     */
+    function readToken() {
+        if ($this->file === null) {
+            throw new BuildException("No File set for IniFileTokenReader");
+        }
+
+        static $tokens = null;
+        if ($tokens === null) {
+            $tokens = array();
+            $arr = parse_ini_file($this->file->getAbsolutePath(), true);
+            if ($this->section === null) {
+                foreach ($arr as $sec_name => $values) {
+                    foreach($arr[$sec_name] as $key => $value) {
+                        $tok = new Token;
+                        $tok->setKey($key);
+                        $tok->setValue($value);
+                        $tokens[] = $tok;
+                    }
+                }
+            } else if (isset($arr[$this->section])) {
+                foreach ($arr[$this->section] as $key => $value) {
+                    $tok = new Token;
+                    $tok->setKey($key);
+                    $tok->setValue($value);
+                    $tokens[] = $tok;
+                }
+            }
+        }
+
+        if (count($tokens) > 0) {
+            return array_pop($tokens);
+        } else
+            return null;
+    }
+    
+    function setFile(PhingFile $file) {
+        $this->file = $file;
+    }
+
+    function setSection($str) {
+        $this->section = (string) $str;
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/filters/util/IniFileTokenReader.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/DefaultInputHandler.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/DefaultInputHandler.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/DefaultInputHandler.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ *  $Id: DefaultInputHandler.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/input/InputHandler.php';
+include_once 'phing/system/io/ConsoleReader.php';
+
+/**
+ * Prompts using print(); reads input from Console.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Stefan Bodewig <stefan.bodewig en epost.de> (Ant)
+ * @version $Revision: 1.6 $
+ * @package phing.input
+ */
+class DefaultInputHandler implements InputHandler {
+    
+    /**
+     * Prompts and requests input.  May loop until a valid input has
+     * been entered.
+     * @throws BuildException 
+     */
+    public function handleInput(InputRequest $request) {
+        $prompt = $this->getPrompt($request);
+        $in = new ConsoleReader();           
+        do {
+            print $prompt;
+            try {
+                $input = $in->readLine();
+                if ($input === "" && ($request->getDefaultValue() !== null) ) {
+                    $input = $request->getDefaultValue();
+                }
+                $request->setInput($input);
+            } catch (Exception $e) {
+                throw new BuildException("Failed to read input from Console.", $e);
+            }
+        } while (!$request->isInputValid());
+    }
+
+    /**
+     * Constructs user prompt from a request.
+     *
+     * <p>This implementation adds (choice1,choice2,choice3,...) to the
+     * prompt for <code>MultipleChoiceInputRequest</code>s.</p>
+     *
+     * @param $request the request to construct the prompt for.
+     *                Must not be <code>null</code>.
+     */
+    protected function getPrompt(InputRequest $request) {
+        $prompt = $request->getPrompt();
+        
+        // use is_a() to avoid needing the class to be loaded
+        if (is_a($request, 'YesNoInputRequest')) { // (yes/no)
+            $prompt .= '(' . implode('/', $request->getChoices()) .')';
+        } elseif (is_a($request, 'MultipleChoiceInputRequest')) { // (a,b,c,d)
+            $prompt .= '(' . implode(',', $request->getChoices()) . ')';            
+        }
+        if ($request->getDefaultValue() !== null) {
+            $prompt .= ' ['.$request->getDefaultValue().']';
+        }
+        $pchar = $request->getPromptChar();        
+        return $prompt . ($pchar ? $pchar . ' ' : ' ');
+    } 
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/DefaultInputHandler.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/InputHandler.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/InputHandler.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/InputHandler.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ *  $Id: InputHandler.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ * Plugin to Phing to handle requests for user input.
+ *
+ * @author Stefan Bodewig <stefan.bodewig en epost.de>
+ * @version $Revision: 1.3 $
+ * @package phing.input
+ */
+interface InputHandler {
+
+    /**
+     * Handle the request encapsulated in the argument.
+     *
+     * <p>Precondition: the request.getPrompt will return a non-null
+     * value.</p>
+     *
+     * <p>Postcondition: request.getInput will return a non-null
+     * value, request.isInputValid will return true.</p>
+     * @return void
+     * @throws BuildException
+     */
+    public function handleInput(InputRequest $request);
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/InputHandler.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/InputRequest.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/InputRequest.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/InputRequest.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,107 @@
+<?php
+
+/*
+ *  $Id: InputRequest.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ * Encapsulates an input request.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Stefan Bodewig <stefan.bodewig en epost.de> (Ant)
+ * @version $Revision: 1.4 $
+ * @package phing.input
+ */
+class InputRequest {
+
+    protected $prompt;
+    protected $input;
+    protected $defaultValue;
+    protected $promptChar;
+    
+    /**
+     * @param string $prompt The prompt to show to the user.  Must not be null.
+     */
+    public function __construct($prompt) {
+        if ($prompt === null) {
+            throw new BuildException("prompt must not be null");
+        }        
+        $this->prompt = $prompt;
+    }
+
+    /**
+     * Retrieves the prompt text.
+     */
+    public function getPrompt() {
+        return $this->prompt;
+    }
+
+    /**
+     * Sets the user provided input.
+     */
+    public function setInput($input) {
+        $this->input = $input;
+    }
+    
+    /**
+     * Is the user input valid?
+     */
+    public function isInputValid() {
+        return true;
+    }
+
+    /**
+     * Retrieves the user input.
+     */
+    public function getInput() {
+        return $this->input;
+    }
+    
+    /**
+     * Set the default value to use.
+     * @param mixed $v
+     */
+    public function setDefaultValue($v) {
+        $this->defaultValue = $v;
+    }
+    
+    /**
+     * Return the default value to use.
+     * @return mixed
+     */
+    public function getDefaultValue() {
+        return $this->defaultValue;
+    }
+    
+    /**
+     * Set the default value to use.
+     * @param string $c
+     */
+    public function setPromptChar($c) {
+        $this->promptChar = $c;
+    }
+    
+    /**
+     * Return the default value to use.
+     * @return string
+     */
+    public function getPromptChar() {
+        return $this->promptChar;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/InputRequest.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/MultipleChoiceInputRequest.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/MultipleChoiceInputRequest.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/MultipleChoiceInputRequest.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,58 @@
+<?php
+/*
+ *  $Id: MultipleChoiceInputRequest.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/input/InputRequest.php';
+
+/**
+ * Encapsulates an input request.
+ *
+ * @author Stefan Bodewig <stefan.bodewig en epost.de>
+ * @version $Revision: 1.5 $
+ * @package phing.input
+ */
+class MultipleChoiceInputRequest extends InputRequest {
+
+    protected $choices = array();
+
+    /**
+     * @param string $prompt The prompt to show to the user.  Must not be null.
+     * @param array $choices holds all input values that are allowed.
+     *                Must not be null.
+     */
+    public function __construct($prompt, $choices) {
+        parent::__construct($prompt);        
+        $this->choices = $choices;
+    }
+
+    /**
+     * @return The possible values.
+     */
+    public function getChoices() {
+        return $this->choices;
+    }
+
+    /**
+     * @return true if the input is one of the allowed values.
+     */
+    public function isInputValid() {
+        return in_array($this->getInput(), $this->choices); // not strict (?)
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/MultipleChoiceInputRequest.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/PropertyFileInputHandler.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/PropertyFileInputHandler.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/PropertyFileInputHandler.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,129 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2002 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Ant" and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact apache en apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package org.apache.tools.ant.input;
+
+import org.apache.tools.ant.BuildException;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+/**
+ * Reads input from a property file, the file name is read from the
+ * system property ant.input.properties, the prompt is the key for input.
+ *
+ * @author <a href="mailto:stefan.bodewig en epost.de">Stefan Bodewig</a>
+ * @version $Revision: 1.1 $
+ * @since Ant 1.5
+ */
+public class PropertyFileInputHandler implements InputHandler {
+    private Properties props = null;
+
+    /**
+     * Name of the system property we expect to hold the file name.
+     */
+    public static final String FILE_NAME_KEY = "ant.input.properties";
+
+    /**
+     * Empty no-arg constructor.
+     */
+    public PropertyFileInputHandler() {
+    }
+
+    /**
+     * Picks up the input from a property, using the prompt as the
+     * name of the property.
+     *
+     * @exception BuildException if no property of that name can be found.
+     */
+    public void handleInput(InputRequest request) throws BuildException {
+        readProps();
+        
+        Object o = props.get(request.getPrompt());
+        if (o == null) {
+            throw new BuildException("Unable to find input for \'"
+                                     + request.getPrompt()+"\'");
+        }
+        request.setInput(o.toString());
+        if (!request.isInputValid()) {
+            throw new BuildException("Found invalid input " + o
+                                     + " for \'" + request.getPrompt() + "\'");
+        }
+    }
+
+    /**
+     * Reads the properties file if it hasn't already been read.
+     */
+    private synchronized void readProps() throws BuildException {
+        if (props == null) {
+            String propsFile = System.getProperty(FILE_NAME_KEY);
+            if (propsFile == null) {
+                throw new BuildException("System property "
+                                         + FILE_NAME_KEY
+                                         + " for PropertyFileInputHandler not"
+                                         + " set");
+            }
+            
+            props = new Properties();
+            
+            try {
+                props.load(new FileInputStream(propsFile));
+            } catch (IOException e) {
+                throw new BuildException("Couldn't load " + propsFile, e);
+            }
+        }
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/PropertyFileInputHandler.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/YesNoInputRequest.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/YesNoInputRequest.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/YesNoInputRequest.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,47 @@
+<?php
+/*
+ *  $Id: YesNoInputRequest.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/input/MultipleChoiceInputRequest.php';
+
+/**
+ * Encapsulates an input request that returns a boolean (yes/no).
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 1.4 $
+ * @package phing.input
+ */
+class YesNoInputRequest extends MultipleChoiceInputRequest {     
+
+    /**
+     * @return true if the input is one of the allowed values.
+     */
+    public function isInputValid() {
+        return StringHelper::isBoolean($this->input);        
+    }
+    
+    /**
+     * Converts input to boolean.
+     * @return boolean
+     */
+    public function getInput() {
+        return StringHelper::booleanValue($this->input);
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/input/YesNoInputRequest.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/lib/Capsule.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/lib/Capsule.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/lib/Capsule.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,266 @@
+<?php
+
+/**
+ * Capsule is a simple "template" engine that essentially provides an isolated context
+ * for PHP scripts.
+ * 
+ * There is no special templating language, and therefore no limitations to what
+ * can be accomplished within templates. The main purpose of Capsule is to separate 
+ * the business logic from display / output logic.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 1.9 $ $Date$
+ */
+class Capsule {
+    
+    /**
+     * Look for templates here (if relative path provided).
+     * @var string
+     */
+    protected $templatePath;
+    
+    /**
+     * Where should output files be written?
+     * (This is named inconsistently to be compatible w/ Texen.)
+     * @var string
+     */
+    protected $outputDirectory;
+    
+    /**
+     * The variables that can be used by the templates.
+     * @var array Hash of variables.
+     */
+    public $vars = array();
+    
+    /**
+     * Has template been initialized.
+     */    
+    protected $initialized = false;
+    
+    /**
+     * Stores the pre-parse() include_path.
+     * @var string
+     */
+    private $old_include_path;
+    
+    function __construct() {
+    }
+    
+    /**
+     * Clears one or several or all variables.
+     * @param mixed $which String name of var, or array of names.
+     * @return void
+     */
+    function clear($which = null) {
+        if ($which === null) {
+            $this->vars = array();
+        } elseif (is_array($which)) {
+            foreach($which as $var) {
+                unset($this->vars[$var]);
+            }
+        } else {
+            unset($this->vars[$which]);
+        }
+    }
+    
+    /**
+     * Set the basepath to use for template lookups.
+     * @param string $v
+     */
+    function setTemplatePath($v) {
+        $this->templatePath = rtrim($v, DIRECTORY_SEPARATOR.'/');
+    }
+
+    /**
+     * Get the basepath to use for template lookups.
+     * @return string
+     */
+    function getTemplatePath() {
+        return $this->templatePath;
+    }
+    
+    /**
+     * Set a basepath to use for output file creation.
+     * @param string $v
+     */
+    function setOutputDirectory($v) {
+        $this->outputDirectory = rtrim($v, DIRECTORY_SEPARATOR.'/');
+    }
+
+    /**
+     * Get basepath to use for output file creation.
+     * @return string
+     */
+    function getOutputDirectory() {
+        return $this->outputDirectory;
+    }
+    
+    /**
+     * Low overhead (no output buffering) method to simply dump template
+     * to buffer.
+     * 
+     * @param string $__template
+     * @return void
+     * @throws Exception - if template cannot be found
+     */ 
+    function display($__template) {
+        
+        // Prepend "private" variable names with $__ in this function
+        // to keep namespace conflict potential to a minimum.
+            
+        // Alias this class to $generator.
+        $generator = $this;
+                        
+        if (isset($this->vars['this'])) {
+            throw new Exception("Assigning a variable named \$this to a context conflicts with class namespace.");
+        }
+        
+        // extract variables into local namespace
+        extract($this->vars);
+        
+        // prepend template path to include path, 
+        // so that include "path/relative/to/templates"; can be used within templates
+        $__old_inc_path = ini_get('include_path');
+        ini_set('include_path', $this->templatePath . PATH_SEPARATOR . $__old_inc_path);
+                
+        @ini_set('track_errors', true);
+        include $__template;
+        @ini_restore('track_errors');
+        
+        // restore the include path
+        ini_set('include_path', $__old_inc_path);
+        
+        if (!empty($php_errormsg)) {
+            throw new Exception("Unable to parse template " . $__template . ": " . $php_errormsg);
+        }
+    }
+    
+    /**
+     * Fetches the results of a tempalte parse and either returns
+     * the string or writes results to a specified output file.
+     *
+     * @param string $template The template filename (relative to templatePath or absolute).
+     * @param string $outputFile If specified, contents of template will also be written to this file.
+     * @param boolean $append Should output be appended to source file?
+     * @return string The "parsed" template output.
+     * @throws Exception - if template not found.
+     */
+    function parse($template, $outputFile = null, $append = false) {
+                
+        // main work done right here:
+        // hopefully this works recursively ... fingers crossed.    
+        ob_start();
+        
+        try {
+            $this->display($template);
+        } catch (Exception $e) {
+            ob_end_flush(); // flush the output on error (so we can see up to what point it parsed everything)
+            throw $e;
+        }
+                
+        $output = ob_get_contents();
+        ob_end_clean();
+        
+        if ($outputFile !== null) {
+            $outputFile = $this->resolvePath($outputFile, $this->outputDirectory);
+            
+            $flags = null;
+            if ($append) $flags = FILE_APPEND;
+            
+            if (!file_put_contents($outputFile, $output, $flags) && $output != "") {
+                throw new Exception("Unable to write output to " . $outputFile);
+            }
+        }
+
+        return $output;
+    }
+    
+    /**
+     * This returns a "best guess" path for the given file.
+     *
+     * @param string $file File name or possibly absolute path.
+     * @param string $basepath The basepath that should be prepended if $file is not absolute.
+     * @return string "Best guess" path for this file.
+     */
+    protected function resolvePath($file, $basepath) {
+        if ( !($file{0} == DIRECTORY_SEPARATOR || $file{0} == '/') 
+            // also account for C:\ style path
+                && !($file{1} == ':' && ($file{2} ==  DIRECTORY_SEPARATOR || $file{2} == '/'))) { 
+            if ($basepath != null) {
+                $file = $basepath . DIRECTORY_SEPARATOR . $file;
+            }
+        }
+        return $file;
+    }
+
+    /**
+     * Gets value of specified var or NULL if var has not been put().
+     * @param string $name Variable name to retrieve.
+     * @return mixed
+     */
+    function get($name) {
+        if (!isset($this->vars[$name])) return null;
+        return $this->vars[$name];
+    }
+    
+    /**
+     * Merges in passed hash to vars array.
+     *
+     * Given an array like:
+     *
+     *            array(     'myvar' => 'Hello',
+     *                    'myvar2' => 'Hello')
+     *
+     * Resulting template will have access to $myvar and $myvar2.
+     *
+     * @param array $vars
+     * @param boolean $recursiveMerge Should matching keys be recursively merged?
+     * @return void
+     */
+    function putAll($vars, $recursiveMerge = false) {
+        if ($recursiveMerge) {
+            $this->vars = array_merge_recursive($this->vars, $vars);
+        } else {
+            $this->vars = array_merge($this->vars, $vars);
+        }
+    }
+    
+    /**
+     * Adds a variable to the context.
+     * 
+     * Resulting template will have access to ${$name$} variable.
+     * 
+     * @param string $name
+     * @param mixed $value
+     */
+    function put($name, $value) {
+        $this->vars[$name] = $value;
+    }
+        
+    /**
+     * Put a variable into the context, assigning it by reference.
+     * This means that if the template modifies the variable, then it
+     * will also be modified in the context.
+     *
+     * @param $name
+     * @param &$value
+     */
+    function putRef($name, &$value) {
+        $this->vars[$name] = &$value;
+    }
+    
+    /**
+     * Makes a copy of the value and puts it into the context.
+     * This is primarily to force copying (cloning) of objects, rather
+     * than the default behavior which is to assign them by reference.
+     * @param string $name
+     * @param mixed $value
+     */
+    function putCopy($name, $value) {
+        if (is_object($value)) {
+            $value = clone $value;
+        }
+        $this->vars[$name] = $value;
+    }
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/lib/Capsule.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/lib/Zip.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/lib/Zip.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/lib/Zip.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,3588 @@
+<?php
+/* vim: set ts=4 sw=4: */
+// +----------------------------------------------------------------------+
+// | PHP Version 4                                                        |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2003 The PHP Group                                |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 3.0 of the PHP license,       |
+// | that is bundled with this package in the file LICENSE, and is        |
+// | available through the world-wide-web at the following url:           |
+// | http://www.php.net/license/3_0.txt.                                  |
+// | If you did not receive a copy of the PHP license and are unable to   |
+// | obtain it through the world-wide-web, please send a note to          |
+// | license en php.net so we can mail you a copy immediately.               |
+// +----------------------------------------------------------------------+
+// | Author: Vincent Blavet <vincent en blavet.net>                          |
+// +----------------------------------------------------------------------+
+//
+// $Id: Zip.php 3076 2006-12-18 08:52:12Z fabien $
+
+  // ----- Constants
+  define( 'ARCHIVE_ZIP_READ_BLOCK_SIZE', 2048 );
+
+  // ----- File list separator
+  define( 'ARCHIVE_ZIP_SEPARATOR', ',' );
+
+  // ----- Optional static temporary directory
+  //       By default temporary files are generated in the script current
+  //       path.
+  //       If defined :
+  //       - MUST BE terminated by a '/'.
+  //       - MUST be a valid, already created directory
+  //       Samples :
+  // define( 'ARCHIVE_ZIP_TEMPORARY_DIR', '/temp/' );
+  // define( 'ARCHIVE_ZIP_TEMPORARY_DIR', 'C:/Temp/' );
+  define( 'ARCHIVE_ZIP_TEMPORARY_DIR', '' );
+
+  // ----- Error codes
+  define( 'ARCHIVE_ZIP_ERR_NO_ERROR', 0 );
+  define( 'ARCHIVE_ZIP_ERR_WRITE_OPEN_FAIL', -1 );
+  define( 'ARCHIVE_ZIP_ERR_READ_OPEN_FAIL', -2 );
+  define( 'ARCHIVE_ZIP_ERR_INVALID_PARAMETER', -3 );
+  define( 'ARCHIVE_ZIP_ERR_MISSING_FILE', -4 );
+  define( 'ARCHIVE_ZIP_ERR_FILENAME_TOO_LONG', -5 );
+  define( 'ARCHIVE_ZIP_ERR_INVALID_ZIP', -6 );
+  define( 'ARCHIVE_ZIP_ERR_BAD_EXTRACTED_FILE', -7 );
+  define( 'ARCHIVE_ZIP_ERR_DIR_CREATE_FAIL', -8 );
+  define( 'ARCHIVE_ZIP_ERR_BAD_EXTENSION', -9 );
+  define( 'ARCHIVE_ZIP_ERR_BAD_FORMAT', -10 );
+  define( 'ARCHIVE_ZIP_ERR_DELETE_FILE_FAIL', -11 );
+  define( 'ARCHIVE_ZIP_ERR_RENAME_FILE_FAIL', -12 );
+  define( 'ARCHIVE_ZIP_ERR_BAD_CHECKSUM', -13 );
+  define( 'ARCHIVE_ZIP_ERR_INVALID_ARCHIVE_ZIP', -14 );
+  define( 'ARCHIVE_ZIP_ERR_MISSING_OPTION_VALUE', -15 );
+  define( 'ARCHIVE_ZIP_ERR_INVALID_PARAM_VALUE', -16 );
+
+  // ----- Warning codes
+  define( 'ARCHIVE_ZIP_WARN_NO_WARNING', 0 );
+  define( 'ARCHIVE_ZIP_WARN_FILE_EXIST', 1 );
+
+  // ----- Methods parameters
+  define( 'ARCHIVE_ZIP_PARAM_PATH', 'path' );
+  define( 'ARCHIVE_ZIP_PARAM_ADD_PATH', 'add_path' );
+  define( 'ARCHIVE_ZIP_PARAM_REMOVE_PATH', 'remove_path' );
+  define( 'ARCHIVE_ZIP_PARAM_REMOVE_ALL_PATH', 'remove_all_path' );
+  define( 'ARCHIVE_ZIP_PARAM_SET_CHMOD', 'set_chmod' );
+  define( 'ARCHIVE_ZIP_PARAM_EXTRACT_AS_STRING', 'extract_as_string' );
+  define( 'ARCHIVE_ZIP_PARAM_NO_COMPRESSION', 'no_compression' );
+  define( 'ARCHIVE_ZIP_PARAM_BY_NAME', 'by_name' );
+  define( 'ARCHIVE_ZIP_PARAM_BY_INDEX', 'by_index' );
+  define( 'ARCHIVE_ZIP_PARAM_BY_EREG', 'by_ereg' );
+  define( 'ARCHIVE_ZIP_PARAM_BY_PREG', 'by_preg' );
+
+  define( 'ARCHIVE_ZIP_PARAM_PRE_EXTRACT', 'callback_pre_extract' );
+  define( 'ARCHIVE_ZIP_PARAM_POST_EXTRACT', 'callback_post_extract' );
+  define( 'ARCHIVE_ZIP_PARAM_PRE_ADD', 'callback_pre_add' );
+  define( 'ARCHIVE_ZIP_PARAM_POST_ADD', 'callback_post_add' );
+
+
+
+/**
+* Class for manipulating zip archive files
+*
+* A class which provided common methods to manipulate ZIP formatted
+* archive files.
+* It provides creation, extraction, deletion and add features.
+*
+* @author   Vincent Blavet <vincent en blavet.net>
+* @version  $Revision: 1.3 $
+* @package  phing.lib
+*/
+class Archive_Zip
+{
+    /**
+    * The filename of the zip archive.
+    *
+    * @var string Name of the Zip file
+    */
+    var $_zipname='';
+
+    /**
+    * File descriptor of the opened Zip file.
+    *
+    * @var int Internal zip file descriptor
+    */
+    var $_zip_fd=0;
+
+    /**
+    * @var int last error code
+    */
+    var $_error_code=1;
+
+    /**
+    * @var string Last error description
+    */
+    var $_error_string='';
+
+    // {{{ constructor
+    /**
+    * Archive_Zip Class constructor. This flavour of the constructor only
+    * declare a new Archive_Zip object, identifying it by the name of the
+    * zip file.
+    *
+    * @param    string  $p_zipname  The name of the zip archive to create
+    * @access public
+    */
+    function __construct($p_zipname)
+    {
+      if (!extension_loaded('zlib')) {
+          throw new Exception("The extension 'zlib' couldn't be found.\n".
+              "Please make sure your version of PHP was built ".
+              "with 'zlib' support.");
+      }
+
+      // ----- Set the attributes
+      $this->_zipname = $p_zipname;
+      $this->_zip_fd = 0;
+    }
+    // }}}
+
+    // {{{ create()
+    /**
+    * This method creates a Zip Archive with the filename set with
+	* the constructor.
+	* The files and directories indicated in $p_filelist
+    * are added in the archive.
+	* When a directory is in the list, the directory and its content is added
+    * in the archive.
+    * The methods takes a variable list of parameters in $p_params.
+    * The supported parameters for this method are :
+    *   'add_path' : Add a path to the archived files.
+    *   'remove_path' : Remove the specified 'root' path of the archived files.
+    *   'remove_all_path' : Remove all the path of the archived files.
+    *   'no_compression' : The archived files will not be compressed.
+    *
+    * @access public
+    * @param  mixed  $p_filelist  The list of the files or folders to add.
+    *                             It can be a string with filenames separated
+    *                             by a comma, or an array of filenames.
+    * @param  mixed  $p_params  An array of variable parameters and values.
+    * @return mixed An array of file description on success,
+	*               an error code on error
+    */
+    function create($p_filelist, $p_params=0)
+    {
+        $this->_errorReset();
+
+        // ----- Set default values
+        if ($p_params === 0) {
+    	    $p_params = array();
+        }
+        if ($this->_check_parameters($p_params,
+	                                 array('no_compression' => false,
+	                                       'add_path' => "",
+	                                       'remove_path' => "",
+	                                       'remove_all_path' => false)) != 1) {
+		    return 0;
+	    }
+
+        // ----- Look if the $p_filelist is really an array
+        $p_result_list = array();
+        if (is_array($p_filelist)) {
+            $v_result = $this->_create($p_filelist, $p_result_list, $p_params);
+        }
+
+        // ----- Look if the $p_filelist is a string
+        else if (is_string($p_filelist)) {
+            // ----- Create a list with the elements from the string
+            $v_list = explode(ARCHIVE_ZIP_SEPARATOR, $p_filelist);
+
+            $v_result = $this->_create($v_list, $p_result_list, $p_params);
+        }
+
+        // ----- Invalid variable
+        else {
+            $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER,
+	                         'Invalid variable type p_filelist');
+            $v_result = ARCHIVE_ZIP_ERR_INVALID_PARAMETER;
+        }
+
+        if ($v_result != 1) {
+            return 0;
+        }
+
+        return $p_result_list;
+    }
+    // }}}
+
+    // {{{ add()
+    /**
+    * This method add files or directory in an existing Zip Archive.
+    * If the Zip Archive does not exist it is created.
+	* The files and directories to add are indicated in $p_filelist.
+	* When a directory is in the list, the directory and its content is added
+    * in the archive.
+    * The methods takes a variable list of parameters in $p_params.
+    * The supported parameters for this method are :
+    *   'add_path' : Add a path to the archived files.
+    *   'remove_path' : Remove the specified 'root' path of the archived files.
+    *   'remove_all_path' : Remove all the path of the archived files.
+    *   'no_compression' : The archived files will not be compressed.
+    *   'callback_pre_add' : A callback function that will be called before
+    *                        each entry archiving.
+    *   'callback_post_add' : A callback function that will be called after
+    *                         each entry archiving.
+    *
+    * @access public
+    * @param    mixed  $p_filelist  The list of the files or folders to add.
+    *                               It can be a string with filenames separated
+    *                               by a comma, or an array of filenames.
+    * @param    mixed  $p_params  An array of variable parameters and values.
+    * @return mixed An array of file description on success,
+	*               0 on an unrecoverable failure, an error code is logged.
+    */
+    function add($p_filelist, $p_params=0)
+    {
+        $this->_errorReset();
+
+        // ----- Set default values
+        if ($p_params === 0) {
+        	$p_params = array();
+        }
+        if ($this->_check_parameters($p_params,
+	                                 array ('no_compression' => false,
+	                                        'add_path' => '',
+	                                        'remove_path' => '',
+	                                        'remove_all_path' => false,
+						    	     		'callback_pre_add' => '',
+							    		    'callback_post_add' => '')) != 1) {
+		    return 0;
+	    }
+
+        // ----- Look if the $p_filelist is really an array
+        $p_result_list = array();
+        if (is_array($p_filelist)) {
+            // ----- Call the create fct
+            $v_result = $this->_add($p_filelist, $p_result_list, $p_params);
+        }
+
+        // ----- Look if the $p_filelist is a string
+        else if (is_string($p_filelist)) {
+            // ----- Create a list with the elements from the string
+            $v_list = explode(ARCHIVE_ZIP_SEPARATOR, $p_filelist);
+
+            // ----- Call the create fct
+            $v_result = $this->_add($v_list, $p_result_list, $p_params);
+        }
+
+        // ----- Invalid variable
+        else {
+            $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER,
+	                         "add() : Invalid variable type p_filelist");
+            $v_result = ARCHIVE_ZIP_ERR_INVALID_PARAMETER;
+        }
+
+        if ($v_result != 1) {
+            return 0;
+        }
+
+        // ----- Return the result list
+        return $p_result_list;
+    }
+    // }}}
+
+    // {{{ listContent()
+    /**
+    * This method gives the names and properties of the files and directories
+	* which are present in the zip archive.
+    * The properties of each entries in the list are :
+    *   filename : Name of the file.
+	*              For create() or add() it's the filename given by the user.
+	*              For an extract() it's the filename of the extracted file.
+    *   stored_filename : Name of the file / directory stored in the archive.
+    *   size : Size of the stored file.
+    *   compressed_size : Size of the file's data compressed in the archive
+    *                     (without the zip headers overhead)
+    *   mtime : Last known modification date of the file (UNIX timestamp)
+    *   comment : Comment associated with the file
+    *   folder : true | false (indicates if the entry is a folder)
+    *   index : index of the file in the archive (-1 when not available)
+    *   status : status of the action on the entry (depending of the action) :
+    *            Values are :
+    *              ok : OK !
+    *              filtered : the file/dir was not extracted (filtered by user)
+    *              already_a_directory : the file can't be extracted because a
+    *                                    directory with the same name already
+	*                                    exists
+    *              write_protected : the file can't be extracted because a file
+    *                                with the same name already exists and is
+    *                                write protected
+    *              newer_exist : the file was not extracted because a newer
+	*                            file already exists
+    *              path_creation_fail : the file is not extracted because the
+	*                                   folder does not exists and can't be
+	*                                   created
+    *              write_error : the file was not extracted because there was a
+    *                            error while writing the file
+    *              read_error : the file was not extracted because there was a
+	*                           error while reading the file
+    *              invalid_header : the file was not extracted because of an
+	*                               archive format error (bad file header)
+    * Note that each time a method can continue operating when there
+    * is an error on a single file, the error is only logged in the file status.
+    *
+    * @access public
+    * @return mixed An array of file description on success,
+	*               0 on an unrecoverable failure, an error code is logged.
+    */
+    function listContent()
+    {
+        $this->_errorReset();
+
+        // ----- Check archive
+        if (!$this->_checkFormat()) {
+            return(0);
+        }
+
+        $v_list = array();
+        if ($this->_list($v_list) != 1) {
+            unset($v_list);
+            return(0);
+        }
+
+        return $v_list;
+    }
+    // }}}
+
+    // {{{ extract()
+    /**
+    * This method extract the files and folders which are in the zip archive.
+    * It can extract all the archive or a part of the archive by using filter
+    * feature (extract by name, by index, by ereg, by preg). The extraction
+    * can occur in the current path or an other path.
+    * All the advanced features are activated by the use of variable
+	* parameters.
+	* The return value is an array of entry descriptions which gives
+	* information on extracted files (See listContent()).
+	* The method may return a success value (an array) even if some files
+	* are not correctly extracted (see the file status in listContent()).
+    * The supported variable parameters for this method are :
+    *   'add_path' : Path where the files and directories are to be extracted
+    *   'remove_path' : First part ('root' part) of the memorized path
+    *                   (if similar) to remove while extracting.
+    *   'remove_all_path' : Remove all the memorized path while extracting.
+    *   'extract_as_string' :
+    *   'set_chmod' : After the extraction of the file the indicated mode
+    *                 will be set.
+    *   'by_name' : It can be a string with file/dir names separated by ',',
+    *               or an array of file/dir names to extract from the archive.
+    *   'by_index' : A string with range of indexes separated by ',',
+    *                (sample "1,3-5,12").
+    *   'by_ereg' : A regular expression (ereg) that must match the extracted
+    *               filename.
+    *   'by_preg' : A regular expression (preg) that must match the extracted
+    *               filename.
+    *   'callback_pre_extract' : A callback function that will be called before
+    *                            each entry extraction.
+    *   'callback_post_extract' : A callback function that will be called after
+    *                            each entry extraction.
+    *
+    * @access public
+    * @param    mixed  $p_params  An array of variable parameters and values.
+    * @return mixed An array of file description on success,
+	*               0 on an unrecoverable failure, an error code is logged.
+    */
+    function extract($p_params=0)
+    {
+
+        $this->_errorReset();
+
+        // ----- Check archive
+        if (!$this->_checkFormat()) {
+            return(0);
+        }
+
+        // ----- Set default values
+        if ($p_params === 0) {
+        	$p_params = array();
+        }
+        if ($this->_check_parameters($p_params,
+	                                 array ('extract_as_string' => false,
+	                                        'add_path' => '',
+	                                        'remove_path' => '',
+	                                        'remove_all_path' => false,
+					    		     		'callback_pre_extract' => '',
+						    			    'callback_post_extract' => '',
+							    		    'set_chmod' => 0,
+								    	    'by_name' => '',
+									        'by_index' => '',
+									        'by_ereg' => '',
+									        'by_preg' => '') ) != 1) {
+	    	return 0;
+	    }
+
+        // ----- Call the extracting fct
+        $v_list = array();
+        if ($this->_extractByRule($v_list, $p_params) != 1) {
+            unset($v_list);
+            return(0);
+        }
+
+        return $v_list;
+    }
+    // }}}
+
+
+    // {{{ delete()
+    /**
+    * This methods delete archive entries in the zip archive.
+    * Notice that at least one filtering rule (set by the variable parameter
+    * list) must be set.
+    * Also notice that if you delete a folder entry, only the folder entry
+    * is deleted, not all the files bellonging to this folder.
+    * The supported variable parameters for this method are :
+    *   'by_name' : It can be a string with file/dir names separated by ',',
+    *               or an array of file/dir names to delete from the archive.
+    *   'by_index' : A string with range of indexes separated by ',',
+    *                (sample "1,3-5,12").
+    *   'by_ereg' : A regular expression (ereg) that must match the extracted
+    *               filename.
+    *   'by_preg' : A regular expression (preg) that must match the extracted
+    *               filename.
+    *
+    * @access public
+    * @param    mixed  $p_params  An array of variable parameters and values.
+    * @return mixed An array of file description on success,
+	*               0 on an unrecoverable failure, an error code is logged.
+    */
+    function delete($p_params)
+    {
+        $this->_errorReset();
+
+        // ----- Check archive
+        if (!$this->_checkFormat()) {
+            return(0);
+        }
+
+        // ----- Set default values
+        if ($this->_check_parameters($p_params,
+	                                 array ('by_name' => '',
+									        'by_index' => '',
+									        'by_ereg' => '',
+									        'by_preg' => '') ) != 1) {
+	    	return 0;
+    	}
+
+        // ----- Check that at least one rule is set
+        if (   ($p_params['by_name'] == '')
+            && ($p_params['by_index'] == '')
+            && ($p_params['by_ereg'] == '')
+            && ($p_params['by_preg'] == '')) {
+            $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER,
+			                 'At least one filtering rule must'
+							 .' be set as parameter');
+            return 0;
+        }
+
+        // ----- Call the delete fct
+        $v_list = array();
+        if ($this->_deleteByRule($v_list, $p_params) != 1) {
+            unset($v_list);
+            return(0);
+        }
+
+        return $v_list;
+    }
+    // }}}
+
+    // {{{ properties()
+    /**
+    * This method gives the global properties of the archive.
+    *  The properties are :
+    *    nb : Number of files in the archive
+    *    comment : Comment associated with the archive file
+    *    status : not_exist, ok
+    *
+    * @access public
+    * @param    mixed  $p_params  {Description}
+    * @return mixed An array with the global properties or 0 on error.
+    */
+    function properties()
+    {
+        $this->_errorReset();
+
+        // ----- Check archive
+        if (!$this->_checkFormat()) {
+            return(0);
+        }
+
+        // ----- Default properties
+        $v_prop = array();
+        $v_prop['comment'] = '';
+        $v_prop['nb'] = 0;
+        $v_prop['status'] = 'not_exist';
+
+        // ----- Look if file exists
+        if (@is_file($this->_zipname)) {
+            // ----- Open the zip file
+            if (($this->_zip_fd = @fopen($this->_zipname, 'rb')) == 0) {
+                $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL,
+				                 'Unable to open archive \''.$this->_zipname
+								 .'\' in binary read mode');
+                return 0;
+            }
+
+            // ----- Read the central directory informations
+            $v_central_dir = array();
+            if (($v_result = $this->_readEndCentralDir($v_central_dir)) != 1) {
+                return 0;
+            }
+
+            $this->_closeFd();
+
+            // ----- Set the user attributes
+            $v_prop['comment'] = $v_central_dir['comment'];
+            $v_prop['nb'] = $v_central_dir['entries'];
+            $v_prop['status'] = 'ok';
+        }
+
+        return $v_prop;
+    }
+    // }}}
+
+
+    // {{{ duplicate()
+    /**
+    * This method creates an archive by copying the content of an other one.
+	* If the archive already exist, it is replaced by the new one without
+	* any warning.
+    *
+    * @access public
+    * @param  mixed  $p_archive  It can be a valid Archive_Zip object or
+	*                            the filename of a valid zip archive.
+    * @return integer 1 on success, 0 on failure.
+    */
+    function duplicate($p_archive)
+    {
+        $this->_errorReset();
+
+        // ----- Look if the $p_archive is a Archive_Zip object
+        if (   (is_object($p_archive))
+		    && (strtolower(get_class($p_archive)) == 'archive_zip')) {
+            $v_result = $this->_duplicate($p_archive->_zipname);
+        }
+
+        // ----- Look if the $p_archive is a string (so a filename)
+        else if (is_string($p_archive)) {
+            // ----- Check that $p_archive is a valid zip file
+            // TBC : Should also check the archive format
+            if (!is_file($p_archive)) {
+                $this->_errorLog(ARCHIVE_ZIP_ERR_MISSING_FILE,
+				                 "No file with filename '".$p_archive."'");
+                $v_result = ARCHIVE_ZIP_ERR_MISSING_FILE;
+            }
+            else {
+                $v_result = $this->_duplicate($p_archive);
+            }
+        }
+
+        // ----- Invalid variable
+        else {
+            $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER,
+			                 "Invalid variable type p_archive_to_add");
+            $v_result = ARCHIVE_ZIP_ERR_INVALID_PARAMETER;
+        }
+
+        return $v_result;
+    }
+    // }}}
+
+    // {{{ merge()
+    /**
+    *  This method merge a valid zip archive at the end of the
+	*  archive identified by the Archive_Zip object.
+    *  If the archive ($this) does not exist, the merge becomes a duplicate.
+    *  If the archive to add does not exist, the merge is a success.
+    *
+    * @access public
+    * @param mixed $p_archive_to_add  It can be a valid Archive_Zip object or
+	*                                 the filename of a valid zip archive.
+    * @return integer 1 on success, 0 on failure.
+    */
+    function merge($p_archive_to_add)
+    {
+        $v_result = 1;
+        $this->_errorReset();
+
+        // ----- Check archive
+        if (!$this->_checkFormat()) {
+            return(0);
+        }
+
+        // ----- Look if the $p_archive_to_add is a Archive_Zip object
+        if (   (is_object($p_archive_to_add))
+		    && (strtolower(get_class($p_archive_to_add)) == 'archive_zip')) {
+            $v_result = $this->_merge($p_archive_to_add);
+        }
+
+        // ----- Look if the $p_archive_to_add is a string (so a filename)
+        else if (is_string($p_archive_to_add)) {
+            // ----- Create a temporary archive
+            $v_object_archive = new Archive_Zip($p_archive_to_add);
+
+            // ----- Merge the archive
+            $v_result = $this->_merge($v_object_archive);
+        }
+
+        // ----- Invalid variable
+        else {
+            $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER,
+			                 "Invalid variable type p_archive_to_add");
+            $v_result = ARCHIVE_ZIP_ERR_INVALID_PARAMETER;
+        }
+
+        return $v_result;
+    }
+    // }}}
+
+    // {{{ errorCode()
+    /**
+    * Method that gives the lastest error code.
+    *
+    * @access public
+    * @return integer The error code value.
+    */
+    function errorCode()
+    {
+        return($this->_error_code);
+    }
+    // }}}
+
+    // {{{ errorName()
+    /**
+    * This method gives the latest error code name.
+    *
+    * @access public
+    * @param  boolean $p_with_code  If true, gives the name and the int value.
+    * @return string The error name.
+    */
+    function errorName($p_with_code=false)
+    {
+        $v_const_list = get_defined_constants();
+  	
+      	// ----- Extract error constants from all const.
+        for (reset($v_const_list);
+		     list($v_key, $v_value) = each($v_const_list);) {
+     	    if (substr($v_key, 0, strlen('ARCHIVE_ZIP_ERR_'))
+			    =='ARCHIVE_ZIP_ERR_') {
+    		    $v_error_list[$v_key] = $v_value;
+    	    }
+        }
+    
+        // ----- Search the name form the code value
+        $v_key=array_search($this->_error_code, $v_error_list, true);
+  	    if ($v_key!=false) {
+            $v_value = $v_key;
+  	    }
+  	    else {
+            $v_value = 'NoName';
+  	    }
+  	
+        if ($p_with_code) {
+            return($v_value.' ('.$this->_error_code.')');
+        }
+        else {
+          return($v_value);
+        }
+    }
+    // }}}
+
+    // {{{ errorInfo()
+    /**
+    * This method returns the description associated with the latest error.
+    *
+    * @access public
+    * @param  boolean $p_full If set to true gives the description with the
+    *                         error code, the name and the description.
+    *                         If set to false gives only the description
+    *                         and the error code.
+    * @return string The error description.
+    */
+    function errorInfo($p_full=false)
+    {
+        if ($p_full) {
+            return($this->errorName(true)." : ".$this->_error_string);
+        }
+        else {
+            return($this->_error_string." [code ".$this->_error_code."]");
+        }
+    }
+    // }}}
+
+
+// -----------------------------------------------------------------------------
+// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS *****
+// *****                                                        *****
+// *****       THESES FUNCTIONS MUST NOT BE USED DIRECTLY       *****
+// -----------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _checkFormat()
+  // Description :
+  //   This method check that the archive exists and is a valid zip archive.
+  //   Several level of check exists. (futur)
+  // Parameters :
+  //   $p_level : Level of check. Default 0.
+  //              0 : Check the first bytes (magic codes) (default value))
+  //              1 : 0 + Check the central directory (futur)
+  //              2 : 1 + Check each file header (futur)
+  // Return Values :
+  //   true on success,
+  //   false on error, the error code is set.
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_checkFormat()
+  *
+  * { Description }
+  *
+  * @param integer $p_level
+  */
+  function _checkFormat($p_level=0)
+  {
+    $v_result = true;
+
+    // ----- Reset the error handler
+    $this->_errorReset();
+
+    // ----- Look if the file exits
+    if (!is_file($this->_zipname)) {
+      // ----- Error log
+      $this->_errorLog(ARCHIVE_ZIP_ERR_MISSING_FILE,
+	                   "Missing archive file '".$this->_zipname."'");
+      return(false);
+    }
+
+    // ----- Check that the file is readeable
+    if (!is_readable($this->_zipname)) {
+      // ----- Error log
+      $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL,
+	                   "Unable to read archive '".$this->_zipname."'");
+      return(false);
+    }
+
+    // ----- Check the magic code
+    // TBC
+
+    // ----- Check the central header
+    // TBC
+
+    // ----- Check each file header
+    // TBC
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _create()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_create()
+  *
+  * { Description }
+  *
+  */
+  function _create($p_list, &$p_result_list, &$p_params)
+  {
+    $v_result=1;
+    $v_list_detail = array();
+
+	$p_add_dir = $p_params['add_path'];
+	$p_remove_dir = $p_params['remove_path'];
+	$p_remove_all_dir = $p_params['remove_all_path'];
+
+    // ----- Open the file in write mode
+    if (($v_result = $this->_openFd('wb')) != 1)
+    {
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Add the list of files
+    $v_result = $this->_addList($p_list, $p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, $p_params);
+
+    // ----- Close
+    $this->_closeFd();
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _add()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_add()
+  *
+  * { Description }
+  *
+  */
+  function _add($p_list, &$p_result_list, &$p_params)
+  {
+    $v_result=1;
+    $v_list_detail = array();
+
+	$p_add_dir = $p_params['add_path'];
+	$p_remove_dir = $p_params['remove_path'];
+	$p_remove_all_dir = $p_params['remove_all_path'];
+
+    // ----- Look if the archive exists or is empty and need to be created
+    if ((!is_file($this->_zipname)) || (filesize($this->_zipname) == 0)) {
+      $v_result = $this->_create($p_list, $p_result_list, $p_params);
+      return $v_result;
+    }
+
+    // ----- Open the zip file
+    if (($v_result=$this->_openFd('rb')) != 1) {
+      return $v_result;
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir = array();
+    if (($v_result = $this->_readEndCentralDir($v_central_dir)) != 1)
+    {
+      $this->_closeFd();
+      return $v_result;
+    }
+
+    // ----- Go to beginning of File
+    @rewind($this->_zip_fd);
+
+    // ----- Creates a temporay file
+    $v_zip_temp_name = ARCHIVE_ZIP_TEMPORARY_DIR.uniqid('archive_zip-').'.tmp';
+
+    // ----- Open the temporary file in write mode
+    if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
+    {
+      $this->_closeFd();
+
+      $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL,
+	                   'Unable to open temporary file \''
+					   .$v_zip_temp_name.'\' in binary write mode');
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Copy the files from the archive to the temporary file
+    // TBC : Here I should better append the file and go back to erase the
+	// central dir
+    $v_size = $v_central_dir['offset'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < ARCHIVE_ZIP_READ_BLOCK_SIZE
+	                  ? $v_size : ARCHIVE_ZIP_READ_BLOCK_SIZE);
+      $v_buffer = fread($this->_zip_fd, $v_read_size);
+      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Swap the file descriptor
+    // Here is a trick : I swap the temporary fd with the zip fd, in order to 
+    // use the following methods on the temporary fil and not the real archive
+    $v_swap = $this->_zip_fd;
+    $this->_zip_fd = $v_zip_temp_fd;
+    $v_zip_temp_fd = $v_swap;
+
+    // ----- Add the files
+    $v_header_list = array();
+    if (($v_result = $this->_addFileList($p_list, $v_header_list,
+	                                     $p_add_dir, $p_remove_dir,
+										 $p_remove_all_dir, $p_params)) != 1)
+    {
+      fclose($v_zip_temp_fd);
+      $this->_closeFd();
+      @unlink($v_zip_temp_name);
+
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Store the offset of the central dir
+    $v_offset = @ftell($this->_zip_fd);
+
+    // ----- Copy the block of file headers from the old archive
+    $v_size = $v_central_dir['size'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < ARCHIVE_ZIP_READ_BLOCK_SIZE
+	                  ? $v_size : ARCHIVE_ZIP_READ_BLOCK_SIZE);
+      $v_buffer = @fread($v_zip_temp_fd, $v_read_size);
+      @fwrite($this->_zip_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Create the Central Dir files header
+    for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++)
+    {
+      // ----- Create the file header
+      if ($v_header_list[$i]['status'] == 'ok') {
+        if (($v_result=$this->_writeCentralFileHeader($v_header_list[$i]))!=1) {
+          fclose($v_zip_temp_fd);
+          $this->_closeFd();
+          @unlink($v_zip_temp_name);
+
+          // ----- Return
+          return $v_result;
+        }
+        $v_count++;
+      }
+
+      // ----- Transform the header to a 'usable' info
+      $this->_convertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
+    }
+
+    // ----- Zip file comment
+    $v_comment = '';
+
+    // ----- Calculate the size of the central header
+    $v_size = @ftell($this->_zip_fd)-$v_offset;
+
+    // ----- Create the central dir footer
+    if (($v_result = $this->_writeCentralHeader($v_count
+	                                              +$v_central_dir['entries'],
+	                                            $v_size, $v_offset,
+												$v_comment)) != 1) {
+      // ----- Reset the file list
+      unset($v_header_list);
+
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Swap back the file descriptor
+    $v_swap = $this->_zip_fd;
+    $this->_zip_fd = $v_zip_temp_fd;
+    $v_zip_temp_fd = $v_swap;
+
+    // ----- Close
+    $this->_closeFd();
+
+    // ----- Close the temporary file
+    @fclose($v_zip_temp_fd);
+
+    // ----- Delete the zip file
+    // TBC : I should test the result ...
+    @unlink($this->_zipname);
+
+    // ----- Rename the temporary file
+    // TBC : I should test the result ...
+    //@rename($v_zip_temp_name, $this->_zipname);
+    $this->_tool_Rename($v_zip_temp_name, $this->_zipname);
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _openFd()
+  // Description :
+  // Parameters :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_openFd()
+  *
+  * { Description }
+  *
+  */
+  function _openFd($p_mode)
+  {
+    $v_result=1;
+
+    // ----- Look if already open
+    if ($this->_zip_fd != 0)
+    {
+      $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL,
+	                   'Zip file \''.$this->_zipname.'\' already open');
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Open the zip file
+    if (($this->_zip_fd = @fopen($this->_zipname, $p_mode)) == 0)
+    {
+      $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL,
+	                   'Unable to open archive \''.$this->_zipname
+					   .'\' in '.$p_mode.' mode');
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _closeFd()
+  // Description :
+  // Parameters :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_closeFd()
+  *
+  * { Description }
+  *
+  */
+  function _closeFd()
+  {
+    $v_result=1;
+
+    if ($this->_zip_fd != 0)
+      @fclose($this->_zip_fd);
+    $this->_zip_fd = 0;
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _addList()
+  // Description :
+  //   $p_add_dir and $p_remove_dir will give the ability to memorize a path which is
+  //   different from the real path of the file. This is usefull if you want to have PclTar
+  //   running in any directory, and memorize relative path from an other directory.
+  // Parameters :
+  //   $p_list : An array containing the file or directory names to add in the tar
+  //   $p_result_list : list of added files with their properties (specially the status field)
+  //   $p_add_dir : Path to add in the filename path archived
+  //   $p_remove_dir : Path to remove in the filename path archived
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_addList()
+  *
+  * { Description }
+  *
+  */
+  function _addList($p_list, &$p_result_list,
+                    $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_params)
+  {
+    $v_result=1;
+
+    // ----- Add the files
+    $v_header_list = array();
+    if (($v_result = $this->_addFileList($p_list, $v_header_list,
+	                                     $p_add_dir, $p_remove_dir,
+										 $p_remove_all_dir, $p_params)) != 1) {
+      return $v_result;
+    }
+
+    // ----- Store the offset of the central dir
+    $v_offset = @ftell($this->_zip_fd);
+
+    // ----- Create the Central Dir files header
+    for ($i=0,$v_count=0; $i<sizeof($v_header_list); $i++)
+    {
+      // ----- Create the file header
+      if ($v_header_list[$i]['status'] == 'ok') {
+        if (($v_result = $this->_writeCentralFileHeader($v_header_list[$i])) != 1) {
+          return $v_result;
+        }
+        $v_count++;
+      }
+
+      // ----- Transform the header to a 'usable' info
+      $this->_convertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
+    }
+
+    // ----- Zip file comment
+    $v_comment = '';
+
+    // ----- Calculate the size of the central header
+    $v_size = @ftell($this->_zip_fd)-$v_offset;
+
+    // ----- Create the central dir footer
+    if (($v_result = $this->_writeCentralHeader($v_count, $v_size, $v_offset,
+	                                            $v_comment)) != 1)
+    {
+      // ----- Reset the file list
+      unset($v_header_list);
+
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _addFileList()
+  // Description :
+  //   $p_add_dir and $p_remove_dir will give the ability to memorize a path which is
+  //   different from the real path of the file. This is usefull if you want to
+  //   run the lib in any directory, and memorize relative path from an other directory.
+  // Parameters :
+  //   $p_list : An array containing the file or directory names to add in the tar
+  //   $p_result_list : list of added files with their properties (specially the status field)
+  //   $p_add_dir : Path to add in the filename path archived
+  //   $p_remove_dir : Path to remove in the filename path archived
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_addFileList()
+  *
+  * { Description }
+  *
+  */
+  function _addFileList($p_list, &$p_result_list,
+                        $p_add_dir, $p_remove_dir, $p_remove_all_dir,
+						&$p_params)
+  {
+    $v_result=1;
+    $v_header = array();
+
+    // ----- Recuperate the current number of elt in list
+    $v_nb = sizeof($p_result_list);
+
+    // ----- Loop on the files
+    for ($j=0; ($j<count($p_list)) && ($v_result==1); $j++)
+    {
+      // ----- Recuperate the filename
+      $p_filename = $this->_tool_TranslateWinPath($p_list[$j], false);
+
+      // ----- Skip empty file names
+      if ($p_filename == "")
+      {
+        continue;
+      }
+
+      // ----- Check the filename
+      if (!file_exists($p_filename))
+      {
+        $this->_errorLog(ARCHIVE_ZIP_ERR_MISSING_FILE,
+		                 "File '$p_filename' does not exists");
+        return Archive_Zip::errorCode();
+      }
+
+      // ----- Look if it is a file or a dir with no all pathnre move
+      if ((is_file($p_filename)) || ((is_dir($p_filename)) && !$p_remove_all_dir)) {
+        // ----- Add the file
+        if (($v_result = $this->_addFile($p_filename, $v_header, $p_add_dir, $p_remove_dir, $p_remove_all_dir, $p_params)) != 1)
+        {
+          // ----- Return status
+          return $v_result;
+        }
+
+        // ----- Store the file infos
+        $p_result_list[$v_nb++] = $v_header;
+      }
+
+      // ----- Look for directory
+      if (is_dir($p_filename))
+      {
+
+        // ----- Look for path
+        if ($p_filename != ".")
+          $v_path = $p_filename."/";
+        else
+          $v_path = "";
+
+        // ----- Read the directory for files and sub-directories
+        $p_hdir = opendir($p_filename);
+        $p_hitem = readdir($p_hdir); // '.' directory
+        $p_hitem = readdir($p_hdir); // '..' directory
+        while ($p_hitem = readdir($p_hdir))
+        {
+
+          // ----- Look for a file
+          if (is_file($v_path.$p_hitem))
+          {
+
+            // ----- Add the file
+            if (($v_result = $this->_addFile($v_path.$p_hitem, $v_header, $p_add_dir, $p_remove_dir, $p_remove_all_dir, $p_params)) != 1)
+            {
+              // ----- Return status
+              return $v_result;
+            }
+
+            // ----- Store the file infos
+            $p_result_list[$v_nb++] = $v_header;
+          }
+
+          // ----- Recursive call to _addFileList()
+          else
+          {
+
+            // ----- Need an array as parameter
+            $p_temp_list[0] = $v_path.$p_hitem;
+            $v_result = $this->_addFileList($p_temp_list, $p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, $p_params);
+
+            // ----- Update the number of elements of the list
+            $v_nb = sizeof($p_result_list);
+          }
+        }
+
+        // ----- Free memory for the recursive loop
+        unset($p_temp_list);
+        unset($p_hdir);
+        unset($p_hitem);
+      }
+    }
+
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _addFile()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_addFile()
+  *
+  * { Description }
+  *
+  */
+  function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_params)
+  {
+    $v_result=1;
+
+    if ($p_filename == "")
+    {
+      // ----- Error log
+      $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)");
+
+      // ----- Return
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Calculate the stored filename
+    $v_stored_filename = $p_filename;
+
+    // ----- Look for all path to remove
+    if ($p_remove_all_dir) {
+      $v_stored_filename = basename($p_filename);
+    }
+    // ----- Look for partial path remove
+    else if ($p_remove_dir != "")
+    {
+      if (substr($p_remove_dir, -1) != '/')
+        $p_remove_dir .= "/";
+
+      if ((substr($p_filename, 0, 2) == "./") || (substr($p_remove_dir, 0, 2) == "./"))
+      {
+        if ((substr($p_filename, 0, 2) == "./") && (substr($p_remove_dir, 0, 2) != "./"))
+          $p_remove_dir = "./".$p_remove_dir;
+        if ((substr($p_filename, 0, 2) != "./") && (substr($p_remove_dir, 0, 2) == "./"))
+          $p_remove_dir = substr($p_remove_dir, 2);
+      }
+
+      $v_compare = $this->_tool_PathInclusion($p_remove_dir, $p_filename);
+      if ($v_compare > 0)
+//      if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir)
+      {
+
+        if ($v_compare == 2) {
+          $v_stored_filename = "";
+        }
+        else {
+          $v_stored_filename = substr($p_filename, strlen($p_remove_dir));
+        }
+      }
+    }
+    // ----- Look for path to add
+    if ($p_add_dir != "")
+    {
+      if (substr($p_add_dir, -1) == "/")
+        $v_stored_filename = $p_add_dir.$v_stored_filename;
+      else
+        $v_stored_filename = $p_add_dir."/".$v_stored_filename;
+    }
+
+    // ----- Filename (reduce the path of stored name)
+    $v_stored_filename = $this->_tool_PathReduction($v_stored_filename);
+
+
+    /* filename length moved after call-back in release 1.3
+    // ----- Check the path length
+    if (strlen($v_stored_filename) > 0xFF)
+    {
+      // ----- Error log
+      $this->_errorLog(-5, "Stored file name is too long (max. 255) : '$v_stored_filename'");
+
+      // ----- Return
+      return Archive_Zip::errorCode();
+    }
+    */
+
+    // ----- Set the file properties
+    clearstatcache();
+    $p_header['version'] = 20;
+    $p_header['version_extracted'] = 10;
+    $p_header['flag'] = 0;
+    $p_header['compression'] = 0;
+    $p_header['mtime'] = filemtime($p_filename);
+    $p_header['crc'] = 0;
+    $p_header['compressed_size'] = 0;
+    $p_header['size'] = filesize($p_filename);
+    $p_header['filename_len'] = strlen($p_filename);
+    $p_header['extra_len'] = 0;
+    $p_header['comment_len'] = 0;
+    $p_header['disk'] = 0;
+    $p_header['internal'] = 0;
+    $p_header['external'] = (is_file($p_filename)?0xFE49FFE0:0x41FF0010);
+    $p_header['offset'] = 0;
+    $p_header['filename'] = $p_filename;
+    $p_header['stored_filename'] = $v_stored_filename;
+    $p_header['extra'] = '';
+    $p_header['comment'] = '';
+    $p_header['status'] = 'ok';
+    $p_header['index'] = -1;
+
+    // ----- Look for pre-add callback
+    if (   (isset($p_params[ARCHIVE_ZIP_PARAM_PRE_ADD]))
+	    && ($p_params[ARCHIVE_ZIP_PARAM_PRE_ADD] != '')) {
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->_convertHeader2FileInfo($p_header, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+      eval('$v_result = '.$p_params[ARCHIVE_ZIP_PARAM_PRE_ADD].'(ARCHIVE_ZIP_PARAM_PRE_ADD, $v_local_header);');
+      if ($v_result == 0) {
+        // ----- Change the file status
+        $p_header['status'] = "skipped";
+        $v_result = 1;
+      }
+
+      // ----- Update the informations
+      // Only some fields can be modified
+      if ($p_header['stored_filename'] != $v_local_header['stored_filename']) {
+        $p_header['stored_filename'] = $this->_tool_PathReduction($v_local_header['stored_filename']);
+      }
+    }
+
+    // ----- Look for empty stored filename
+    if ($p_header['stored_filename'] == "") {
+      $p_header['status'] = "filtered";
+    }
+
+    // ----- Check the path length
+    if (strlen($p_header['stored_filename']) > 0xFF) {
+      $p_header['status'] = 'filename_too_long';
+    }
+
+    // ----- Look if no error, or file not skipped
+    if ($p_header['status'] == 'ok') {
+
+      // ----- Look for a file
+      if (is_file($p_filename))
+      {
+        // ----- Open the source file
+        if (($v_file = @fopen($p_filename, "rb")) == 0) {
+          $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");
+          return Archive_Zip::errorCode();
+        }
+        
+        if ($p_params['no_compression']) {
+          // ----- Read the file content
+          $v_content_compressed = @fread($v_file, $p_header['size']);
+
+          // ----- Calculate the CRC
+          $p_header['crc'] = crc32($v_content_compressed);
+        }
+        else {
+          // ----- Read the file content
+          $v_content = @fread($v_file, $p_header['size']);
+
+          // ----- Calculate the CRC
+          $p_header['crc'] = crc32($v_content);
+
+          // ----- Compress the file
+          $v_content_compressed = gzdeflate($v_content);
+        }
+
+        // ----- Set header parameters
+        $p_header['compressed_size'] = strlen($v_content_compressed);
+        $p_header['compression'] = 8;
+
+        // ----- Call the header generation
+        if (($v_result = $this->_writeFileHeader($p_header)) != 1) {
+          @fclose($v_file);
+          return $v_result;
+        }
+
+        // ----- Write the compressed content
+        $v_binary_data = pack('a'.$p_header['compressed_size'], $v_content_compressed);
+        @fwrite($this->_zip_fd, $v_binary_data, $p_header['compressed_size']);
+
+        // ----- Close the file
+        @fclose($v_file);
+      }
+
+      // ----- Look for a directory
+      else
+      {
+        // ----- Set the file properties
+        $p_header['filename'] .= '/';
+        $p_header['filename_len']++;
+        $p_header['size'] = 0;
+        $p_header['external'] = 0x41FF0010;   // Value for a folder : to be checked
+
+        // ----- Call the header generation
+        if (($v_result = $this->_writeFileHeader($p_header)) != 1)
+        {
+          return $v_result;
+        }
+      }
+    }
+
+    // ----- Look for pre-add callback
+    if (   (isset($p_params[ARCHIVE_ZIP_PARAM_POST_ADD]))
+	    && ($p_params[ARCHIVE_ZIP_PARAM_POST_ADD] != '')) {
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->_convertHeader2FileInfo($p_header, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+      eval('$v_result = '.$p_params[ARCHIVE_ZIP_PARAM_POST_ADD].'(ARCHIVE_ZIP_PARAM_POST_ADD, $v_local_header);');
+      if ($v_result == 0) {
+        // ----- Ignored
+        $v_result = 1;
+      }
+
+      // ----- Update the informations
+      // Nothing can be modified
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _writeFileHeader()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_writeFileHeader()
+  *
+  * { Description }
+  *
+  */
+  function _writeFileHeader(&$p_header)
+  {
+    $v_result=1;
+
+    // TBC
+    //for(reset($p_header); $key = key($p_header); next($p_header)) {
+    //}
+
+    // ----- Store the offset position of the file
+    $p_header['offset'] = ftell($this->_zip_fd);
+
+    // ----- Transform UNIX mtime to DOS format mdate/mtime
+    $v_date = getdate($p_header['mtime']);
+    $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
+    $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];
+
+    // ----- Packed data
+    $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, $p_header['version'], $p_header['flag'],
+                          $p_header['compression'], $v_mtime, $v_mdate,
+                          $p_header['crc'], $p_header['compressed_size'], $p_header['size'],
+                          strlen($p_header['stored_filename']), $p_header['extra_len']);
+
+    // ----- Write the first 148 bytes of the header in the archive
+    fputs($this->_zip_fd, $v_binary_data, 30);
+
+    // ----- Write the variable fields
+    if (strlen($p_header['stored_filename']) != 0)
+    {
+      fputs($this->_zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
+    }
+    if ($p_header['extra_len'] != 0)
+    {
+      fputs($this->_zip_fd, $p_header['extra'], $p_header['extra_len']);
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _writeCentralFileHeader()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_writeCentralFileHeader()
+  *
+  * { Description }
+  *
+  */
+  function _writeCentralFileHeader(&$p_header)
+  {
+    $v_result=1;
+
+    // TBC
+    //for(reset($p_header); $key = key($p_header); next($p_header)) {
+    //}
+
+    // ----- Transform UNIX mtime to DOS format mdate/mtime
+    $v_date = getdate($p_header['mtime']);
+    $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
+    $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];
+
+    // ----- Packed data
+    $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, $p_header['version'], $p_header['version_extracted'],
+                          $p_header['flag'], $p_header['compression'], $v_mtime, $v_mdate, $p_header['crc'],
+                          $p_header['compressed_size'], $p_header['size'],
+                          strlen($p_header['stored_filename']), $p_header['extra_len'], $p_header['comment_len'],
+                          $p_header['disk'], $p_header['internal'], $p_header['external'], $p_header['offset']);
+
+    // ----- Write the 42 bytes of the header in the zip file
+    fputs($this->_zip_fd, $v_binary_data, 46);
+
+    // ----- Write the variable fields
+    if (strlen($p_header['stored_filename']) != 0)
+    {
+      fputs($this->_zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
+    }
+    if ($p_header['extra_len'] != 0)
+    {
+      fputs($this->_zip_fd, $p_header['extra'], $p_header['extra_len']);
+    }
+    if ($p_header['comment_len'] != 0)
+    {
+      fputs($this->_zip_fd, $p_header['comment'], $p_header['comment_len']);
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _writeCentralHeader()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_writeCentralHeader()
+  *
+  * { Description }
+  *
+  */
+  function _writeCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment)
+  {
+    $v_result=1;
+
+    // ----- Packed data
+    $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, $p_nb_entries, $p_size, $p_offset, strlen($p_comment));
+
+    // ----- Write the 22 bytes of the header in the zip file
+    fputs($this->_zip_fd, $v_binary_data, 22);
+
+    // ----- Write the variable fields
+    if (strlen($p_comment) != 0)
+    {
+      fputs($this->_zip_fd, $p_comment, strlen($p_comment));
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _list()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_list()
+  *
+  * { Description }
+  *
+  */
+  function _list(&$p_list)
+  {
+    $v_result=1;
+
+    // ----- Open the zip file
+    if (($this->_zip_fd = @fopen($this->_zipname, 'rb')) == 0)
+    {
+      // ----- Error log
+      $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->_zipname.'\' in binary read mode');
+
+      // ----- Return
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir = array();
+    if (($v_result = $this->_readEndCentralDir($v_central_dir)) != 1)
+    {
+      return $v_result;
+    }
+
+    // ----- Go to beginning of Central Dir
+    @rewind($this->_zip_fd);
+    if (@fseek($this->_zip_fd, $v_central_dir['offset']))
+    {
+      // ----- Error log
+      $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
+
+      // ----- Return
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Read each entry
+    for ($i=0; $i<$v_central_dir['entries']; $i++)
+    {
+      // ----- Read the file header
+      if (($v_result = $this->_readCentralFileHeader($v_header)) != 1)
+      {
+        return $v_result;
+      }
+      $v_header['index'] = $i;
+
+      // ----- Get the only interesting attributes
+      $this->_convertHeader2FileInfo($v_header, $p_list[$i]);
+      unset($v_header);
+    }
+
+    // ----- Close the zip file
+    $this->_closeFd();
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _convertHeader2FileInfo()
+  // Description :
+  //   This function takes the file informations from the central directory
+  //   entries and extract the interesting parameters that will be given back.
+  //   The resulting file infos are set in the array $p_info
+  //     $p_info['filename'] : Filename with full path. Given by user (add),
+  //                           extracted in the filesystem (extract).
+  //     $p_info['stored_filename'] : Stored filename in the archive.
+  //     $p_info['size'] = Size of the file.
+  //     $p_info['compressed_size'] = Compressed size of the file.
+  //     $p_info['mtime'] = Last modification date of the file.
+  //     $p_info['comment'] = Comment associated with the file.
+  //     $p_info['folder'] = true/false : indicates if the entry is a folder or not.
+  //     $p_info['status'] = status of the action on the file.
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_convertHeader2FileInfo()
+  *
+  * { Description }
+  *
+  */
+  function _convertHeader2FileInfo($p_header, &$p_info)
+  {
+    $v_result=1;
+
+    // ----- Get the interesting attributes
+    $p_info['filename'] = $p_header['filename'];
+    $p_info['stored_filename'] = $p_header['stored_filename'];
+    $p_info['size'] = $p_header['size'];
+    $p_info['compressed_size'] = $p_header['compressed_size'];
+    $p_info['mtime'] = $p_header['mtime'];
+    $p_info['comment'] = $p_header['comment'];
+    $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010);
+    $p_info['index'] = $p_header['index'];
+    $p_info['status'] = $p_header['status'];
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _extractByRule()
+  // Description :
+  //   Extract a file or directory depending of rules (by index, by name, ...)
+  // Parameters :
+  //   $p_file_list : An array where will be placed the properties of each
+  //                  extracted file
+  //   $p_path : Path to add while writing the extracted files
+  //   $p_remove_path : Path to remove (from the file memorized path) while writing the
+  //                    extracted files. If the path does not match the file path,
+  //                    the file is extracted with its memorized path.
+  //                    $p_remove_path does not apply to 'list' mode.
+  //                    $p_path and $p_remove_path are commulative.
+  // Return Values :
+  //   1 on success,0 or less on error (see error code list)
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_extractByRule()
+  *
+  * { Description }
+  *
+  */
+  function _extractByRule(&$p_file_list, &$p_params)
+  {
+    $v_result=1;
+
+	$p_path = $p_params['add_path'];
+	$p_remove_path = $p_params['remove_path'];
+	$p_remove_all_path = $p_params['remove_all_path'];
+
+    // ----- Check the path
+    if (($p_path == "")
+	    || ((substr($p_path, 0, 1) != "/")
+	    && (substr($p_path, 0, 3) != "../") && (substr($p_path,1,2)!=":/")))
+      $p_path = "./".$p_path;
+
+    // ----- Reduce the path last (and duplicated) '/'
+    if (($p_path != "./") && ($p_path != "/")) {
+      // ----- Look for the path end '/'
+      while (substr($p_path, -1) == "/") {
+        $p_path = substr($p_path, 0, strlen($p_path)-1);
+      }
+    }
+
+    // ----- Look for path to remove format (should end by /)
+    if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) {
+      $p_remove_path .= '/';
+    }
+    $p_remove_path_size = strlen($p_remove_path);
+
+    // ----- Open the zip file
+    if (($v_result = $this->_openFd('rb')) != 1)
+    {
+      return $v_result;
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir = array();
+    if (($v_result = $this->_readEndCentralDir($v_central_dir)) != 1)
+    {
+      // ----- Close the zip file
+      $this->_closeFd();
+
+      return $v_result;
+    }
+
+    // ----- Start at beginning of Central Dir
+    $v_pos_entry = $v_central_dir['offset'];
+
+    // ----- Read each entry
+    $j_start = 0;
+    for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) {
+      // ----- Read next Central dir entry
+      @rewind($this->_zip_fd);
+      if (@fseek($this->_zip_fd, $v_pos_entry)) {
+        $this->_closeFd();
+
+        $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_ARCHIVE_ZIP,
+		                 'Invalid archive size');
+
+        return Archive_Zip::errorCode();
+      }
+
+      // ----- Read the file header
+      $v_header = array();
+      if (($v_result = $this->_readCentralFileHeader($v_header)) != 1) {
+        $this->_closeFd();
+
+        return $v_result;
+      }
+
+      // ----- Store the index
+      $v_header['index'] = $i;
+
+      // ----- Store the file position
+      $v_pos_entry = ftell($this->_zip_fd);
+
+      // ----- Look for the specific extract rules
+      $v_extract = false;
+
+      // ----- Look for extract by name rule
+      if (   (isset($p_params[ARCHIVE_ZIP_PARAM_BY_NAME]))
+          && ($p_params[ARCHIVE_ZIP_PARAM_BY_NAME] != 0)) {
+
+          // ----- Look if the filename is in the list
+          for ($j=0;
+		          ($j<sizeof($p_params[ARCHIVE_ZIP_PARAM_BY_NAME]))
+			   && (!$v_extract);
+			   $j++) {
+
+              // ----- Look for a directory
+              if (substr($p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j], -1) == "/") {
+
+                  // ----- Look if the directory is in the filename path
+                  if (   (strlen($v_header['stored_filename']) > strlen($p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j]))
+                      && (substr($v_header['stored_filename'], 0, strlen($p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j])) == $p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j])) {
+                      $v_extract = true;
+                  }
+              }
+              // ----- Look for a filename
+              elseif ($v_header['stored_filename'] == $p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j]) {
+                  $v_extract = true;
+              }
+          }
+      }
+
+      // ----- Look for extract by ereg rule
+      else if (   (isset($p_params[ARCHIVE_ZIP_PARAM_BY_EREG]))
+               && ($p_params[ARCHIVE_ZIP_PARAM_BY_EREG] != "")) {
+
+          if (ereg($p_params[ARCHIVE_ZIP_PARAM_BY_EREG], $v_header['stored_filename'])) {
+              $v_extract = true;
+          }
+      }
+
+      // ----- Look for extract by preg rule
+      else if (   (isset($p_params[ARCHIVE_ZIP_PARAM_BY_PREG]))
+               && ($p_params[ARCHIVE_ZIP_PARAM_BY_PREG] != "")) {
+
+          if (preg_match($p_params[ARCHIVE_ZIP_PARAM_BY_PREG], $v_header['stored_filename'])) {
+              $v_extract = true;
+          }
+      }
+
+      // ----- Look for extract by index rule
+      else if (   (isset($p_params[ARCHIVE_ZIP_PARAM_BY_INDEX]))
+               && ($p_params[ARCHIVE_ZIP_PARAM_BY_INDEX] != 0)) {
+
+          // ----- Look if the index is in the list
+          for ($j=$j_start; ($j<sizeof($p_params[ARCHIVE_ZIP_PARAM_BY_INDEX])) && (!$v_extract); $j++) {
+
+              if (($i>=$p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['start']) && ($i<=$p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['end'])) {
+                  $v_extract = true;
+              }
+              if ($i>=$p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['end']) {
+                  $j_start = $j+1;
+              }
+
+              if ($p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['start']>$i) {
+                  break;
+              }
+          }
+      }
+
+      // ----- Look for no rule, which means extract all the archive
+      else {
+          $v_extract = true;
+      }
+
+
+      // ----- Look for real extraction
+      if ($v_extract)
+      {
+
+        // ----- Go to the file position
+        @rewind($this->_zip_fd);
+        if (@fseek($this->_zip_fd, $v_header['offset']))
+        {
+          // ----- Close the zip file
+          $this->_closeFd();
+
+          // ----- Error log
+          $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
+
+          // ----- Return
+          return Archive_Zip::errorCode();
+        }
+
+        // ----- Look for extraction as string
+        if ($p_params[ARCHIVE_ZIP_PARAM_EXTRACT_AS_STRING]) {
+
+          // ----- Extracting the file
+          if (($v_result = $this->_extractFileAsString($v_header, $v_string)) != 1)
+          {
+            // ----- Close the zip file
+            $this->_closeFd();
+
+            return $v_result;
+          }
+
+          // ----- Get the only interesting attributes
+          if (($v_result = $this->_convertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1)
+          {
+            // ----- Close the zip file
+            $this->_closeFd();
+
+            return $v_result;
+          }
+
+          // ----- Set the file content
+          $p_file_list[$v_nb_extracted]['content'] = $v_string;
+
+          // ----- Next extracted file
+          $v_nb_extracted++;
+        }
+        else {
+          // ----- Extracting the file
+          if (($v_result = $this->_extractFile($v_header, $p_path, $p_remove_path, $p_remove_all_path, $p_params)) != 1)
+          {
+            // ----- Close the zip file
+            $this->_closeFd();
+
+            return $v_result;
+          }
+
+          // ----- Get the only interesting attributes
+          if (($v_result = $this->_convertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1)
+          {
+            // ----- Close the zip file
+            $this->_closeFd();
+
+            return $v_result;
+          }
+        }
+      }
+    }
+
+    // ----- Close the zip file
+    $this->_closeFd();
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _extractFile()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_extractFile()
+  *
+  * { Description }
+  *
+  */
+  function _extractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_params)
+  {
+    $v_result=1;
+
+    // ----- Read the file header
+    if (($v_result = $this->_readFileHeader($v_header)) != 1)
+    {
+      // ----- Return
+      return $v_result;
+    }
+
+
+    // ----- Check that the file header is coherent with $p_entry info
+    // TBC
+
+    // ----- Look for all path to remove
+    if ($p_remove_all_path == true) {
+        // ----- Get the basename of the path
+        $p_entry['filename'] = basename($p_entry['filename']);
+    }
+
+    // ----- Look for path to remove
+    else if ($p_remove_path != "")
+    {
+      //if (strcmp($p_remove_path, $p_entry['filename'])==0)
+      if ($this->_tool_PathInclusion($p_remove_path, $p_entry['filename']) == 2)
+      {
+
+        // ----- Change the file status
+        $p_entry['status'] = "filtered";
+
+        // ----- Return
+        return $v_result;
+      }
+
+      $p_remove_path_size = strlen($p_remove_path);
+      if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path)
+      {
+
+        // ----- Remove the path
+        $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size);
+
+      }
+    }
+
+    // ----- Add the path
+    if ($p_path != '')
+    {
+      $p_entry['filename'] = $p_path."/".$p_entry['filename'];
+    }
+
+    // ----- Look for pre-extract callback
+    if (   (isset($p_params[ARCHIVE_ZIP_PARAM_PRE_EXTRACT]))
+	    && ($p_params[ARCHIVE_ZIP_PARAM_PRE_EXTRACT] != '')) {
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->_convertHeader2FileInfo($p_entry, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+      eval('$v_result = '.$p_params[ARCHIVE_ZIP_PARAM_PRE_EXTRACT].'(ARCHIVE_ZIP_PARAM_PRE_EXTRACT, $v_local_header);');
+      if ($v_result == 0) {
+        // ----- Change the file status
+        $p_entry['status'] = "skipped";
+        $v_result = 1;
+      }
+
+      // ----- Update the informations
+      // Only some fields can be modified
+      $p_entry['filename'] = $v_local_header['filename'];
+    }
+
+    // ----- Trace
+
+    // ----- Look if extraction should be done
+    if ($p_entry['status'] == 'ok') {
+
+    // ----- Look for specific actions while the file exist
+    if (file_exists($p_entry['filename']))
+    {
+
+      // ----- Look if file is a directory
+      if (is_dir($p_entry['filename']))
+      {
+
+        // ----- Change the file status
+        $p_entry['status'] = "already_a_directory";
+
+        // ----- Return
+        //return $v_result;
+      }
+      // ----- Look if file is write protected
+      else if (!is_writeable($p_entry['filename']))
+      {
+
+        // ----- Change the file status
+        $p_entry['status'] = "write_protected";
+
+        // ----- Return
+        //return $v_result;
+      }
+
+      // ----- Look if the extracted file is older
+      else if (filemtime($p_entry['filename']) > $p_entry['mtime'])
+      {
+
+        // ----- Change the file status
+        $p_entry['status'] = "newer_exist";
+
+        // ----- Return
+        //return $v_result;
+      }
+    }
+
+    // ----- Check the directory availability and create it if necessary
+    else {
+      if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/'))
+        $v_dir_to_check = $p_entry['filename'];
+      else if (!strstr($p_entry['filename'], "/"))
+        $v_dir_to_check = "";
+      else
+        $v_dir_to_check = dirname($p_entry['filename']);
+
+      if (($v_result = $this->_dirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) {
+
+        // ----- Change the file status
+        $p_entry['status'] = "path_creation_fail";
+
+        // ----- Return
+        //return $v_result;
+        $v_result = 1;
+      }
+    }
+    }
+
+    // ----- Look if extraction should be done
+    if ($p_entry['status'] == 'ok') {
+
+      // ----- Do the extraction (if not a folder)
+      if (!(($p_entry['external']&0x00000010)==0x00000010))
+      {
+
+        // ----- Look for not compressed file
+        if ($p_entry['compressed_size'] == $p_entry['size'])
+        {
+
+          // ----- Opening destination file
+          if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0)
+          {
+
+            // ----- Change the file status
+            $p_entry['status'] = "write_error";
+
+            // ----- Return
+            return $v_result;
+          }
+
+
+          // ----- Read the file by ARCHIVE_ZIP_READ_BLOCK_SIZE octets blocks
+          $v_size = $p_entry['compressed_size'];
+          while ($v_size != 0)
+          {
+            $v_read_size = ($v_size < ARCHIVE_ZIP_READ_BLOCK_SIZE ? $v_size : ARCHIVE_ZIP_READ_BLOCK_SIZE);
+            $v_buffer = fread($this->_zip_fd, $v_read_size);
+            $v_binary_data = pack('a'.$v_read_size, $v_buffer);
+            @fwrite($v_dest_file, $v_binary_data, $v_read_size);
+            $v_size -= $v_read_size;
+          }
+
+          // ----- Closing the destination file
+          fclose($v_dest_file);
+
+          // ----- Change the file mtime
+          touch($p_entry['filename'], $p_entry['mtime']);
+        }
+        else
+        {
+          // ----- Trace
+
+          // ----- Opening destination file
+          if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {
+
+            // ----- Change the file status
+            $p_entry['status'] = "write_error";
+
+            return $v_result;
+          }
+
+
+          // ----- Read the compressed file in a buffer (one shot)
+          $v_buffer = @fread($this->_zip_fd, $p_entry['compressed_size']);
+
+          // ----- Decompress the file
+          $v_file_content = gzinflate($v_buffer);
+          unset($v_buffer);
+
+          // ----- Write the uncompressed data
+          @fwrite($v_dest_file, $v_file_content, $p_entry['size']);
+          unset($v_file_content);
+
+          // ----- Closing the destination file
+          @fclose($v_dest_file);
+
+          // ----- Change the file mtime
+          touch($p_entry['filename'], $p_entry['mtime']);
+        }
+
+        // ----- Look for chmod option
+        if (   (isset($p_params[ARCHIVE_ZIP_PARAM_SET_CHMOD]))
+		    && ($p_params[ARCHIVE_ZIP_PARAM_SET_CHMOD] != 0)) {
+
+          // ----- Change the mode of the file
+          chmod($p_entry['filename'], $p_params[ARCHIVE_ZIP_PARAM_SET_CHMOD]);
+        }
+
+      }
+    }
+
+    // ----- Look for post-extract callback
+    if (   (isset($p_params[ARCHIVE_ZIP_PARAM_POST_EXTRACT]))
+	    && ($p_params[ARCHIVE_ZIP_PARAM_POST_EXTRACT] != '')) {
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->_convertHeader2FileInfo($p_entry, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+      eval('$v_result = '.$p_params[ARCHIVE_ZIP_PARAM_POST_EXTRACT].'(ARCHIVE_ZIP_PARAM_POST_EXTRACT, $v_local_header);');
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _extractFileAsString()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_extractFileAsString()
+  *
+  * { Description }
+  *
+  */
+  function _extractFileAsString(&$p_entry, &$p_string)
+  {
+    $v_result=1;
+
+    // ----- Read the file header
+    $v_header = array();
+    if (($v_result = $this->_readFileHeader($v_header)) != 1)
+    {
+      // ----- Return
+      return $v_result;
+    }
+
+
+    // ----- Check that the file header is coherent with $p_entry info
+    // TBC
+
+    // ----- Trace
+
+    // ----- Do the extraction (if not a folder)
+    if (!(($p_entry['external']&0x00000010)==0x00000010))
+    {
+      // ----- Look for not compressed file
+      if ($p_entry['compressed_size'] == $p_entry['size'])
+      {
+        // ----- Trace
+
+        // ----- Reading the file
+        $p_string = fread($this->_zip_fd, $p_entry['compressed_size']);
+      }
+      else
+      {
+        // ----- Trace
+
+        // ----- Reading the file
+        $v_data = fread($this->_zip_fd, $p_entry['compressed_size']);
+
+        // ----- Decompress the file
+        $p_string = gzinflate($v_data);
+      }
+
+      // ----- Trace
+    }
+    else {
+        // TBC : error : can not extract a folder in a string
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _readFileHeader()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_readFileHeader()
+  *
+  * { Description }
+  *
+  */
+  function _readFileHeader(&$p_header)
+  {
+    $v_result=1;
+
+    // ----- Read the 4 bytes signature
+    $v_binary_data = @fread($this->_zip_fd, 4);
+    $v_data = unpack('Vid', $v_binary_data);
+
+    // ----- Check signature
+    if ($v_data['id'] != 0x04034b50)
+    {
+
+      // ----- Error log
+      $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
+
+      // ----- Return
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Read the first 42 bytes of the header
+    $v_binary_data = fread($this->_zip_fd, 26);
+
+    // ----- Look for invalid block size
+    if (strlen($v_binary_data) != 26)
+    {
+      $p_header['filename'] = "";
+      $p_header['status'] = "invalid_header";
+
+      // ----- Error log
+      $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
+
+      // ----- Return
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Extract the values
+    $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data);
+
+    // ----- Get filename
+    $p_header['filename'] = fread($this->_zip_fd, $v_data['filename_len']);
+
+    // ----- Get extra_fields
+    if ($v_data['extra_len'] != 0) {
+      $p_header['extra'] = fread($this->_zip_fd, $v_data['extra_len']);
+    }
+    else {
+      $p_header['extra'] = '';
+    }
+
+    // ----- Extract properties
+    $p_header['compression'] = $v_data['compression'];
+    $p_header['size'] = $v_data['size'];
+    $p_header['compressed_size'] = $v_data['compressed_size'];
+    $p_header['crc'] = $v_data['crc'];
+    $p_header['flag'] = $v_data['flag'];
+
+    // ----- Recuperate date in UNIX format
+    $p_header['mdate'] = $v_data['mdate'];
+    $p_header['mtime'] = $v_data['mtime'];
+    if ($p_header['mdate'] && $p_header['mtime'])
+    {
+      // ----- Extract time
+      $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
+      $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
+      $v_seconde = ($p_header['mtime'] & 0x001F)*2;
+
+      // ----- Extract date
+      $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
+      $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
+      $v_day = $p_header['mdate'] & 0x001F;
+
+      // ----- Get UNIX date format
+      $p_header['mtime'] = mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
+
+    }
+    else
+    {
+      $p_header['mtime'] = time();
+    }
+
+    // ----- Other informations
+
+    // TBC
+    //for(reset($v_data); $key = key($v_data); next($v_data)) {
+    //}
+
+    // ----- Set the stored filename
+    $p_header['stored_filename'] = $p_header['filename'];
+
+    // ----- Set the status field
+    $p_header['status'] = "ok";
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _readCentralFileHeader()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_readCentralFileHeader()
+  *
+  * { Description }
+  *
+  */
+  function _readCentralFileHeader(&$p_header)
+  {
+    $v_result=1;
+
+    // ----- Read the 4 bytes signature
+    $v_binary_data = @fread($this->_zip_fd, 4);
+    $v_data = unpack('Vid', $v_binary_data);
+
+    // ----- Check signature
+    if ($v_data['id'] != 0x02014b50)
+    {
+
+      // ----- Error log
+      $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
+
+      // ----- Return
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Read the first 42 bytes of the header
+    $v_binary_data = fread($this->_zip_fd, 42);
+
+    // ----- Look for invalid block size
+    if (strlen($v_binary_data) != 42)
+    {
+      $p_header['filename'] = "";
+      $p_header['status'] = "invalid_header";
+
+      // ----- Error log
+      $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
+
+      // ----- Return
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Extract the values
+    $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data);
+
+    // ----- Get filename
+    if ($p_header['filename_len'] != 0)
+      $p_header['filename'] = fread($this->_zip_fd, $p_header['filename_len']);
+    else
+      $p_header['filename'] = '';
+
+    // ----- Get extra
+    if ($p_header['extra_len'] != 0)
+      $p_header['extra'] = fread($this->_zip_fd, $p_header['extra_len']);
+    else
+      $p_header['extra'] = '';
+
+    // ----- Get comment
+    if ($p_header['comment_len'] != 0)
+      $p_header['comment'] = fread($this->_zip_fd, $p_header['comment_len']);
+    else
+      $p_header['comment'] = '';
+
+    // ----- Extract properties
+
+    // ----- Recuperate date in UNIX format
+    if ($p_header['mdate'] && $p_header['mtime'])
+    {
+      // ----- Extract time
+      $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
+      $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
+      $v_seconde = ($p_header['mtime'] & 0x001F)*2;
+
+      // ----- Extract date
+      $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
+      $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
+      $v_day = $p_header['mdate'] & 0x001F;
+
+      // ----- Get UNIX date format
+      $p_header['mtime'] = mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
+
+    }
+    else
+    {
+      $p_header['mtime'] = time();
+    }
+
+    // ----- Set the stored filename
+    $p_header['stored_filename'] = $p_header['filename'];
+
+    // ----- Set default status to ok
+    $p_header['status'] = 'ok';
+
+    // ----- Look if it is a directory
+    if (substr($p_header['filename'], -1) == '/')
+    {
+      $p_header['external'] = 0x41FF0010;
+    }
+
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _readEndCentralDir()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_readEndCentralDir()
+  *
+  * { Description }
+  *
+  */
+  function _readEndCentralDir(&$p_central_dir)
+  {
+    $v_result=1;
+
+    // ----- Go to the end of the zip file
+    $v_size = filesize($this->_zipname);
+    @fseek($this->_zip_fd, $v_size);
+    if (@ftell($this->_zip_fd) != $v_size) {
+      $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT,
+	                   'Unable to go to the end of the archive \''
+					   .$this->_zipname.'\'');
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- First try : look if this is an archive with no commentaries
+	// (most of the time)
+    // in this case the end of central dir is at 22 bytes of the file end
+    $v_found = 0;
+    if ($v_size > 26) {
+      @fseek($this->_zip_fd, $v_size-22);
+      if (($v_pos = @ftell($this->_zip_fd)) != ($v_size-22)) {
+        $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT,
+		                 'Unable to seek back to the middle of the archive \''
+						 .$this->_zipname.'\'');
+        return Archive_Zip::errorCode();
+      }
+
+      // ----- Read for bytes
+      $v_binary_data = @fread($this->_zip_fd, 4);
+      $v_data = unpack('Vid', $v_binary_data);
+
+      // ----- Check signature
+      if ($v_data['id'] == 0x06054b50) {
+        $v_found = 1;
+      }
+
+      $v_pos = ftell($this->_zip_fd);
+    }
+
+    // ----- Go back to the maximum possible size of the Central Dir End Record
+    if (!$v_found) {
+      $v_maximum_size = 65557; // 0xFFFF + 22;
+      if ($v_maximum_size > $v_size)
+        $v_maximum_size = $v_size;
+      @fseek($this->_zip_fd, $v_size-$v_maximum_size);
+      if (@ftell($this->_zip_fd) != ($v_size-$v_maximum_size)) {
+        $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT,
+		                 'Unable to seek back to the middle of the archive \''
+						 .$this->_zipname.'\'');
+        return Archive_Zip::errorCode();
+      }
+
+      // ----- Read byte per byte in order to find the signature
+      $v_pos = ftell($this->_zip_fd);
+      $v_bytes = 0x00000000;
+      while ($v_pos < $v_size) {
+        // ----- Read a byte
+        $v_byte = @fread($this->_zip_fd, 1);
+
+        // -----  Add the byte
+        $v_bytes = ($v_bytes << 8) | Ord($v_byte);
+
+        // ----- Compare the bytes
+        if ($v_bytes == 0x504b0506) {
+          $v_pos++;
+          break;
+        }
+
+        $v_pos++;
+      }
+
+      // ----- Look if not found end of central dir
+      if ($v_pos == $v_size) {
+        $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT,
+		                 "Unable to find End of Central Dir Record signature");
+        return Archive_Zip::errorCode();
+      }
+    }
+
+    // ----- Read the first 18 bytes of the header
+    $v_binary_data = fread($this->_zip_fd, 18);
+
+    // ----- Look for invalid block size
+    if (strlen($v_binary_data) != 18) {
+      $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT,
+	                   "Invalid End of Central Dir Record size : "
+					   .strlen($v_binary_data));
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Extract the values
+    $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data);
+
+    // ----- Check the global size
+    if (($v_pos + $v_data['comment_size'] + 18) != $v_size) {
+      $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT,
+	                   "Fail to find the right signature");
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Get comment
+    if ($v_data['comment_size'] != 0)
+      $p_central_dir['comment'] = fread($this->_zip_fd, $v_data['comment_size']);
+    else
+      $p_central_dir['comment'] = '';
+
+    $p_central_dir['entries'] = $v_data['entries'];
+    $p_central_dir['disk_entries'] = $v_data['disk_entries'];
+    $p_central_dir['offset'] = $v_data['offset'];
+    $p_central_dir['size'] = $v_data['size'];
+    $p_central_dir['disk'] = $v_data['disk'];
+    $p_central_dir['disk_start'] = $v_data['disk_start'];
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _deleteByRule()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_deleteByRule()
+  *
+  * { Description }
+  *
+  */
+  function _deleteByRule(&$p_result_list, &$p_params)
+  {
+    $v_result=1;
+    $v_list_detail = array();
+
+    // ----- Open the zip file
+    if (($v_result=$this->_openFd('rb')) != 1)
+    {
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir = array();
+    if (($v_result = $this->_readEndCentralDir($v_central_dir)) != 1)
+    {
+      $this->_closeFd();
+      return $v_result;
+    }
+
+    // ----- Go to beginning of File
+    @rewind($this->_zip_fd);
+
+    // ----- Scan all the files
+    // ----- Start at beginning of Central Dir
+    $v_pos_entry = $v_central_dir['offset'];
+    @rewind($this->_zip_fd);
+    if (@fseek($this->_zip_fd, $v_pos_entry)) {
+      // ----- Clean
+      $this->_closeFd();
+
+      $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_ARCHIVE_ZIP,
+	                   'Invalid archive size');
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Read each entry
+    $v_header_list = array();
+    $j_start = 0;
+    for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) {
+
+      // ----- Read the file header
+      $v_header_list[$v_nb_extracted] = array();
+      $v_result
+	    = $this->_readCentralFileHeader($v_header_list[$v_nb_extracted]);
+      if ($v_result != 1) {
+        // ----- Clean
+        $this->_closeFd();
+
+        return $v_result;
+      }
+
+      // ----- Store the index
+      $v_header_list[$v_nb_extracted]['index'] = $i;
+
+      // ----- Look for the specific extract rules
+      $v_found = false;
+
+      // ----- Look for extract by name rule
+      if (   (isset($p_params[ARCHIVE_ZIP_PARAM_BY_NAME]))
+          && ($p_params[ARCHIVE_ZIP_PARAM_BY_NAME] != 0)) {
+
+          // ----- Look if the filename is in the list
+          for ($j=0;
+		       ($j<sizeof($p_params[ARCHIVE_ZIP_PARAM_BY_NAME]))
+			     && (!$v_found);
+			   $j++) {
+
+              // ----- Look for a directory
+              if (substr($p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j], -1) == "/") {
+
+                  // ----- Look if the directory is in the filename path
+                  if (   (strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j]))
+                      && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j])) == $p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j])) {
+                      $v_found = true;
+                  }
+                  elseif (   (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */
+                          && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j])) {
+                      $v_found = true;
+                  }
+              }
+              // ----- Look for a filename
+              elseif ($v_header_list[$v_nb_extracted]['stored_filename']
+			          == $p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j]) {
+                  $v_found = true;
+              }
+          }
+      }
+
+      // ----- Look for extract by ereg rule
+      else if (   (isset($p_params[ARCHIVE_ZIP_PARAM_BY_EREG]))
+               && ($p_params[ARCHIVE_ZIP_PARAM_BY_EREG] != "")) {
+
+          if (ereg($p_params[ARCHIVE_ZIP_PARAM_BY_EREG],
+		           $v_header_list[$v_nb_extracted]['stored_filename'])) {
+              $v_found = true;
+          }
+      }
+
+      // ----- Look for extract by preg rule
+      else if (   (isset($p_params[ARCHIVE_ZIP_PARAM_BY_PREG]))
+               && ($p_params[ARCHIVE_ZIP_PARAM_BY_PREG] != "")) {
+
+          if (preg_match($p_params[ARCHIVE_ZIP_PARAM_BY_PREG],
+		                 $v_header_list[$v_nb_extracted]['stored_filename'])) {
+              $v_found = true;
+          }
+      }
+
+      // ----- Look for extract by index rule
+      else if (   (isset($p_params[ARCHIVE_ZIP_PARAM_BY_INDEX]))
+               && ($p_params[ARCHIVE_ZIP_PARAM_BY_INDEX] != 0)) {
+
+          // ----- Look if the index is in the list
+          for ($j=$j_start;
+		       ($j<sizeof($p_params[ARCHIVE_ZIP_PARAM_BY_INDEX]))
+			     && (!$v_found);
+			   $j++) {
+
+              if (   ($i>=$p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['start'])
+			      && ($i<=$p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['end'])) {
+                  $v_found = true;
+              }
+              if ($i>=$p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['end']) {
+                  $j_start = $j+1;
+              }
+
+              if ($p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['start']>$i) {
+                  break;
+              }
+          }
+      }
+
+      // ----- Look for deletion
+      if ($v_found) {
+        unset($v_header_list[$v_nb_extracted]);
+      }
+      else {
+        $v_nb_extracted++;
+      }
+    }
+
+    // ----- Look if something need to be deleted
+    if ($v_nb_extracted > 0) {
+
+        // ----- Creates a temporay file
+        $v_zip_temp_name = ARCHIVE_ZIP_TEMPORARY_DIR.uniqid('archive_zip-')
+		                   .'.tmp';
+
+        // ----- Creates a temporary zip archive
+        $v_temp_zip = new Archive_Zip($v_zip_temp_name);
+
+        // ----- Open the temporary zip file in write mode
+        if (($v_result = $v_temp_zip->_openFd('wb')) != 1) {
+            $this->_closeFd();
+
+            // ----- Return
+            return $v_result;
+        }
+
+        // ----- Look which file need to be kept
+        for ($i=0; $i<sizeof($v_header_list); $i++) {
+
+            // ----- Calculate the position of the header
+            @rewind($this->_zip_fd);
+            if (@fseek($this->_zip_fd,  $v_header_list[$i]['offset'])) {
+                // ----- Clean
+                $this->_closeFd();
+                $v_temp_zip->_closeFd();
+                @unlink($v_zip_temp_name);
+
+                $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_ARCHIVE_ZIP,
+				                 'Invalid archive size');
+                return Archive_Zip::errorCode();
+            }
+
+            // ----- Read the file header
+            if (($v_result = $this->_readFileHeader($v_header_list[$i])) != 1) {
+                // ----- Clean
+                $this->_closeFd();
+                $v_temp_zip->_closeFd();
+                @unlink($v_zip_temp_name);
+
+                return $v_result;
+            }
+
+            // ----- Write the file header
+            $v_result = $v_temp_zip->_writeFileHeader($v_header_list[$i]);
+            if ($v_result != 1) {
+                // ----- Clean
+                $this->_closeFd();
+                $v_temp_zip->_closeFd();
+                @unlink($v_zip_temp_name);
+
+                return $v_result;
+            }
+
+            // ----- Read/write the data block
+            $v_result = $this->_tool_CopyBlock($this->_zip_fd,
+			                                   $v_temp_zip->_zip_fd,
+								       $v_header_list[$i]['compressed_size']);
+            if ($v_result != 1) {
+                // ----- Clean
+                $this->_closeFd();
+                $v_temp_zip->_closeFd();
+                @unlink($v_zip_temp_name);
+
+                return $v_result;
+            }
+        }
+
+        // ----- Store the offset of the central dir
+        $v_offset = @ftell($v_temp_zip->_zip_fd);
+
+        // ----- Re-Create the Central Dir files header
+        for ($i=0; $i<sizeof($v_header_list); $i++) {
+            // ----- Create the file header
+            $v_result=$v_temp_zip->_writeCentralFileHeader($v_header_list[$i]);
+            if ($v_result != 1) {
+            	// ----- Clean
+                $v_temp_zip->_closeFd();
+                $this->_closeFd();
+                @unlink($v_zip_temp_name);
+
+                return $v_result;
+            }
+
+            // ----- Transform the header to a 'usable' info
+            $v_temp_zip->_convertHeader2FileInfo($v_header_list[$i],
+			                                     $p_result_list[$i]);
+        }
+
+
+        // ----- Zip file comment
+        $v_comment = '';
+
+        // ----- Calculate the size of the central header
+        $v_size = @ftell($v_temp_zip->_zip_fd)-$v_offset;
+
+        // ----- Create the central dir footer
+        $v_result = $v_temp_zip->_writeCentralHeader(sizeof($v_header_list),
+		                                             $v_size, $v_offset,
+													 $v_comment);
+        if ($v_result != 1) {
+            // ----- Clean
+            unset($v_header_list);
+            $v_temp_zip->_closeFd();
+            $this->_closeFd();
+            @unlink($v_zip_temp_name);
+
+            return $v_result;
+        }
+
+        // ----- Close
+        $v_temp_zip->_closeFd();
+        $this->_closeFd();
+
+        // ----- Delete the zip file
+        // TBC : I should test the result ...
+        @unlink($this->_zipname);
+
+        // ----- Rename the temporary file
+        // TBC : I should test the result ...
+        //@rename($v_zip_temp_name, $this->_zipname);
+        $this->_tool_Rename($v_zip_temp_name, $this->_zipname);
+
+        // ----- Destroy the temporary archive
+        unset($v_temp_zip);
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _dirCheck()
+  // Description :
+  //   Check if a directory exists, if not it creates it and all the parents directory
+  //   which may be useful.
+  // Parameters :
+  //   $p_dir : Directory path to check.
+  // Return Values :
+  //    1 : OK
+  //   -1 : Unable to create directory
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_dirCheck()
+  *
+  * { Description }
+  *
+  * @param [type] $p_is_dir
+  */
+  function _dirCheck($p_dir, $p_is_dir=false)
+  {
+    $v_result = 1;
+
+    // ----- Remove the final '/'
+    if (($p_is_dir) && (substr($p_dir, -1)=='/')) {
+      $p_dir = substr($p_dir, 0, strlen($p_dir)-1);
+    }
+
+    // ----- Check the directory availability
+    if ((is_dir($p_dir)) || ($p_dir == "")) {
+      return 1;
+    }
+
+    // ----- Extract parent directory
+    $p_parent_dir = dirname($p_dir);
+
+    // ----- Just a check
+    if ($p_parent_dir != $p_dir) {
+      // ----- Look for parent directory
+      if ($p_parent_dir != "") {
+        if (($v_result = $this->_dirCheck($p_parent_dir)) != 1) {
+          return $v_result;
+        }
+      }
+    }
+
+    // ----- Create the directory
+    if (!@mkdir($p_dir, 0777)) {
+      $this->_errorLog(ARCHIVE_ZIP_ERR_DIR_CREATE_FAIL,
+	                   "Unable to create directory '$p_dir'");
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _merge()
+  // Description :
+  //   If $p_archive_to_add does not exist, the function exit with a success result.
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_merge()
+  *
+  * { Description }
+  *
+  */
+  function _merge(&$p_archive_to_add)
+  {
+    $v_result=1;
+
+    // ----- Look if the archive_to_add exists
+    if (!is_file($p_archive_to_add->_zipname)) {
+      // ----- Nothing to merge, so merge is a success
+      return 1;
+    }
+
+    // ----- Look if the archive exists
+    if (!is_file($this->_zipname)) {
+      // ----- Do a duplicate
+      $v_result = $this->_duplicate($p_archive_to_add->_zipname);
+
+      return $v_result;
+    }
+
+    // ----- Open the zip file
+    if (($v_result=$this->_openFd('rb')) != 1) {
+      return $v_result;
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir = array();
+    if (($v_result = $this->_readEndCentralDir($v_central_dir)) != 1) {
+      $this->_closeFd();
+      return $v_result;
+    }
+
+    // ----- Go to beginning of File
+    @rewind($this->_zip_fd);
+
+    // ----- Open the archive_to_add file
+    if (($v_result=$p_archive_to_add->_openFd('rb')) != 1) {
+      $this->_closeFd();
+      return $v_result;
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir_to_add = array();
+    $v_result = $p_archive_to_add->_readEndCentralDir($v_central_dir_to_add);
+    if ($v_result != 1) {
+      $this->_closeFd();
+      $p_archive_to_add->_closeFd();
+      return $v_result;
+    }
+
+    // ----- Go to beginning of File
+    @rewind($p_archive_to_add->_zip_fd);
+
+    // ----- Creates a temporay file
+    $v_zip_temp_name = ARCHIVE_ZIP_TEMPORARY_DIR.uniqid('archive_zip-').'.tmp';
+
+    // ----- Open the temporary file in write mode
+    if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) {
+      $this->_closeFd();
+      $p_archive_to_add->_closeFd();
+      $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL,
+	                   'Unable to open temporary file \''
+					   .$v_zip_temp_name.'\' in binary write mode');
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Copy the files from the archive to the temporary file
+    // TBC : Here I should better append the file and go back to erase the
+	// central dir
+    $v_size = $v_central_dir['offset'];
+    while ($v_size != 0) {
+      $v_read_size = ($v_size < ARCHIVE_ZIP_READ_BLOCK_SIZE
+	                  ? $v_size : ARCHIVE_ZIP_READ_BLOCK_SIZE);
+      $v_buffer = fread($this->_zip_fd, $v_read_size);
+      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Copy the files from the archive_to_add into the temporary file
+    $v_size = $v_central_dir_to_add['offset'];
+    while ($v_size != 0) {
+      $v_read_size = ($v_size < ARCHIVE_ZIP_READ_BLOCK_SIZE
+	                  ? $v_size : ARCHIVE_ZIP_READ_BLOCK_SIZE);
+      $v_buffer = fread($p_archive_to_add->_zip_fd, $v_read_size);
+      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Store the offset of the central dir
+    $v_offset = @ftell($v_zip_temp_fd);
+
+    // ----- Copy the block of file headers from the old archive
+    $v_size = $v_central_dir['size'];
+    while ($v_size != 0) {
+      $v_read_size = ($v_size < ARCHIVE_ZIP_READ_BLOCK_SIZE
+	                  ? $v_size : ARCHIVE_ZIP_READ_BLOCK_SIZE);
+      $v_buffer = @fread($this->_zip_fd, $v_read_size);
+      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Copy the block of file headers from the archive_to_add
+    $v_size = $v_central_dir_to_add['size'];
+    while ($v_size != 0) {
+      $v_read_size = ($v_size < ARCHIVE_ZIP_READ_BLOCK_SIZE
+	                  ? $v_size : ARCHIVE_ZIP_READ_BLOCK_SIZE);
+      $v_buffer = @fread($p_archive_to_add->_zip_fd, $v_read_size);
+      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Zip file comment
+    // TBC : I should merge the two comments
+    $v_comment = '';
+
+    // ----- Calculate the size of the (new) central header
+    $v_size = @ftell($v_zip_temp_fd)-$v_offset;
+
+    // ----- Swap the file descriptor
+    // Here is a trick : I swap the temporary fd with the zip fd, in order to use
+    // the following methods on the temporary fil and not the real archive fd
+    $v_swap = $this->_zip_fd;
+    $this->_zip_fd = $v_zip_temp_fd;
+    $v_zip_temp_fd = $v_swap;
+
+    // ----- Create the central dir footer
+    if (($v_result = $this->_writeCentralHeader($v_central_dir['entries']
+	                                          +$v_central_dir_to_add['entries'],
+												$v_size, $v_offset,
+												$v_comment)) != 1) {
+      $this->_closeFd();
+      $p_archive_to_add->_closeFd();
+      @fclose($v_zip_temp_fd);
+      $this->_zip_fd = null;
+
+      // ----- Reset the file list
+      unset($v_header_list);
+
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Swap back the file descriptor
+    $v_swap = $this->_zip_fd;
+    $this->_zip_fd = $v_zip_temp_fd;
+    $v_zip_temp_fd = $v_swap;
+
+    // ----- Close
+    $this->_closeFd();
+    $p_archive_to_add->_closeFd();
+
+    // ----- Close the temporary file
+    @fclose($v_zip_temp_fd);
+
+    // ----- Delete the zip file
+    // TBC : I should test the result ...
+    @unlink($this->_zipname);
+
+    // ----- Rename the temporary file
+    // TBC : I should test the result ...
+    //@rename($v_zip_temp_name, $this->_zipname);
+    $this->_tool_Rename($v_zip_temp_name, $this->_zipname);
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _duplicate()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_duplicate()
+  *
+  * { Description }
+  *
+  */
+  function _duplicate($p_archive_filename)
+  {
+    $v_result=1;
+
+    // ----- Look if the $p_archive_filename exists
+    if (!is_file($p_archive_filename)) {
+
+      // ----- Nothing to duplicate, so duplicate is a success.
+      $v_result = 1;
+
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Open the zip file
+    if (($v_result=$this->_openFd('wb')) != 1) {
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Open the temporary file in write mode
+    if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) {
+      $this->_closeFd();
+      $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL,
+	                   'Unable to open archive file \''
+					   .$p_archive_filename.'\' in binary write mode');
+      return Archive_Zip::errorCode();
+    }
+
+    // ----- Copy the files from the archive to the temporary file
+    // TBC : Here I should better append the file and go back to erase the
+	// central dir
+    $v_size = filesize($p_archive_filename);
+    while ($v_size != 0) {
+      $v_read_size = ($v_size < ARCHIVE_ZIP_READ_BLOCK_SIZE
+	                  ? $v_size : ARCHIVE_ZIP_READ_BLOCK_SIZE);
+      $v_buffer = fread($v_zip_temp_fd, $v_read_size);
+      @fwrite($this->_zip_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Close
+    $this->_closeFd();
+
+    // ----- Close the temporary file
+    @fclose($v_zip_temp_fd);
+
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  /**
+  * Archive_Zip::_check_parameters()
+  *
+  * { Description }
+  *
+  * @param integer $p_error_code
+  * @param string $p_error_string
+  */
+  function _check_parameters(&$p_params, $p_default)
+  {
+    
+    // ----- Check that param is an array
+    if (!is_array($p_params)) {
+        $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER,
+		                 'Unsupported parameter, waiting for an array');
+        return Archive_Zip::errorCode();
+    }
+    
+    // ----- Check that all the params are valid
+    for (reset($p_params); list($v_key, $v_value) = each($p_params); ) {
+    	if (!isset($p_default[$v_key])) {
+            $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER,
+			                 'Unsupported parameter with key \''.$v_key.'\'');
+
+            return Archive_Zip::errorCode();
+    	}
+    }
+
+	// ----- Set the default values
+    for (reset($p_default); list($v_key, $v_value) = each($p_default); ) {
+    	if (!isset($p_params[$v_key])) {
+    		$p_params[$v_key] = $p_default[$v_key];
+    	}
+    }
+    
+    // ----- Check specific parameters
+    $v_callback_list = array ('callback_pre_add','callback_post_add',
+	                          'callback_pre_extract','callback_post_extract');
+    for ($i=0; $i<sizeof($v_callback_list); $i++) {
+    	$v_key=$v_callback_list[$i];
+        if (   (isset($p_params[$v_key])) && ($p_params[$v_key] != '')) {
+            if (!function_exists($p_params[$v_key])) {
+                $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAM_VALUE,
+				                 "Callback '".$p_params[$v_key]
+								 ."()' is not an existing function for "
+								 ."parameter '".$v_key."'");
+                return Archive_Zip::errorCode();
+            }
+	    }
+    }
+
+    return(1);
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _errorLog()
+  // Description :
+  // Parameters :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_errorLog()
+  *
+  * { Description }
+  *
+  * @param integer $p_error_code
+  * @param string $p_error_string
+  */
+  function _errorLog($p_error_code=0, $p_error_string='')
+  {
+      $this->_error_code = $p_error_code;
+      $this->_error_string = $p_error_string;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : _errorReset()
+  // Description :
+  // Parameters :
+  // ---------------------------------------------------------------------------
+  /**
+  * Archive_Zip::_errorReset()
+  *
+  * { Description }
+  *
+  */
+  function _errorReset()
+  {
+      $this->_error_code = 1;
+      $this->_error_string = '';
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : $this->_tool_PathReduction()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * _tool_PathReduction()
+  *
+  * { Description }
+  *
+  */
+  function _tool_PathReduction($p_dir)
+  {
+    $v_result = "";
+
+    // ----- Look for not empty path
+    if ($p_dir != "")
+    {
+      // ----- Explode path by directory names
+      $v_list = explode("/", $p_dir);
+
+      // ----- Study directories from last to first
+      for ($i=sizeof($v_list)-1; $i>=0; $i--)
+      {
+        // ----- Look for current path
+        if ($v_list[$i] == ".")
+        {
+          // ----- Ignore this directory
+          // Should be the first $i=0, but no check is done
+        }
+        else if ($v_list[$i] == "..")
+        {
+          // ----- Ignore it and ignore the $i-1
+          $i--;
+        }
+        else if (($v_list[$i] == "") && ($i!=(sizeof($v_list)-1)) && ($i!=0))
+        {
+          // ----- Ignore only the double '//' in path,
+          // but not the first and last '/'
+        }
+        else
+        {
+          $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:"");
+        }
+      }
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : $this->_tool_PathInclusion()
+  // Description :
+  //   This function indicates if the path $p_path is under the $p_dir tree. Or,
+  //   said in an other way, if the file or sub-dir $p_path is inside the dir
+  //   $p_dir.
+  //   The function indicates also if the path is exactly the same as the dir.
+  //   This function supports path with duplicated '/' like '//', but does not
+  //   support '.' or '..' statements.
+  // Parameters :
+  // Return Values :
+  //   0 if $p_path is not inside directory $p_dir
+  //   1 if $p_path is inside directory $p_dir
+  //   2 if $p_path is exactly the same as $p_dir
+  // ---------------------------------------------------------------------------
+  /**
+  * _tool_PathInclusion()
+  *
+  * { Description }
+  *
+  */
+  function _tool_PathInclusion($p_dir, $p_path)
+  {
+    $v_result = 1;
+
+    // ----- Explode dir and path by directory separator
+    $v_list_dir = explode("/", $p_dir);
+    $v_list_dir_size = sizeof($v_list_dir);
+    $v_list_path = explode("/", $p_path);
+    $v_list_path_size = sizeof($v_list_path);
+
+    // ----- Study directories paths
+    $i = 0;
+    $j = 0;
+    while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) {
+
+      // ----- Look for empty dir (path reduction)
+      if ($v_list_dir[$i] == '') {
+        $i++;
+        continue;
+      }
+      if ($v_list_path[$j] == '') {
+        $j++;
+        continue;
+      }
+
+      // ----- Compare the items
+      if (   ($v_list_dir[$i] != $v_list_path[$j])
+	      && ($v_list_dir[$i] != '')
+		  && ( $v_list_path[$j] != ''))  {
+        $v_result = 0;
+      }
+
+      // ----- Next items
+      $i++;
+      $j++;
+    }
+
+    // ----- Look if everything seems to be the same
+    if ($v_result) {
+      // ----- Skip all the empty items
+      while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++;
+      while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++;
+
+      if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) {
+        // ----- There are exactly the same
+        $v_result = 2;
+      }
+      else if ($i < $v_list_dir_size) {
+        // ----- The path is shorter than the dir
+        $v_result = 0;
+      }
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : $this->_tool_CopyBlock()
+  // Description :
+  // Parameters :
+  //   $p_mode : read/write compression mode
+  //             0 : src & dest normal
+  //             1 : src gzip, dest normal
+  //             2 : src normal, dest gzip
+  //             3 : src & dest gzip
+  // Return Values :
+  // ---------------------------------------------------------------------------
+  /**
+  * _tool_CopyBlock()
+  *
+  * { Description }
+  *
+  * @param integer $p_mode
+  */
+  function _tool_CopyBlock($p_src, $p_dest, $p_size, $p_mode=0)
+  {
+    $v_result = 1;
+
+    if ($p_mode==0)
+    {
+      while ($p_size != 0)
+      {
+        $v_read_size = ($p_size < ARCHIVE_ZIP_READ_BLOCK_SIZE
+		                ? $p_size : ARCHIVE_ZIP_READ_BLOCK_SIZE);
+        $v_buffer = @fread($p_src, $v_read_size);
+        @fwrite($p_dest, $v_buffer, $v_read_size);
+        $p_size -= $v_read_size;
+      }
+    }
+    else if ($p_mode==1)
+    {
+      while ($p_size != 0)
+      {
+        $v_read_size = ($p_size < ARCHIVE_ZIP_READ_BLOCK_SIZE
+		                ? $p_size : ARCHIVE_ZIP_READ_BLOCK_SIZE);
+        $v_buffer = @gzread($p_src, $v_read_size);
+        @fwrite($p_dest, $v_buffer, $v_read_size);
+        $p_size -= $v_read_size;
+      }
+    }
+    else if ($p_mode==2)
+    {
+      while ($p_size != 0)
+      {
+        $v_read_size = ($p_size < ARCHIVE_ZIP_READ_BLOCK_SIZE
+		                ? $p_size : ARCHIVE_ZIP_READ_BLOCK_SIZE);
+        $v_buffer = @fread($p_src, $v_read_size);
+        @gzwrite($p_dest, $v_buffer, $v_read_size);
+        $p_size -= $v_read_size;
+      }
+    }
+    else if ($p_mode==3)
+    {
+      while ($p_size != 0)
+      {
+        $v_read_size = ($p_size < ARCHIVE_ZIP_READ_BLOCK_SIZE
+		                ? $p_size : ARCHIVE_ZIP_READ_BLOCK_SIZE);
+        $v_buffer = @gzread($p_src, $v_read_size);
+        @gzwrite($p_dest, $v_buffer, $v_read_size);
+        $p_size -= $v_read_size;
+      }
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : $this->_tool_Rename()
+  // Description :
+  //   This function tries to do a simple rename() function. If it fails, it
+  //   tries to copy the $p_src file in a new $p_dest file and then unlink the
+  //   first one.
+  // Parameters :
+  //   $p_src : Old filename
+  //   $p_dest : New filename
+  // Return Values :
+  //   1 on success, 0 on failure.
+  // ---------------------------------------------------------------------------
+  /**
+  * _tool_Rename()
+  *
+  * { Description }
+  *
+  */
+  function _tool_Rename($p_src, $p_dest)
+  {
+    $v_result = 1;
+
+    // ----- Try to rename the files
+    if (!@rename($p_src, $p_dest)) {
+
+      // ----- Try to copy & unlink the src
+      if (!@copy($p_src, $p_dest)) {
+        $v_result = 0;
+      }
+      else if (!@unlink($p_src)) {
+        $v_result = 0;
+      }
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // ---------------------------------------------------------------------------
+
+  // ---------------------------------------------------------------------------
+  // Function : $this->_tool_TranslateWinPath()
+  // Description :
+  //   Translate windows path by replacing '\' by '/' and optionally removing
+  //   drive letter.
+  // Parameters :
+  //   $p_path : path to translate.
+  //   $p_remove_disk_letter : true | false
+  // Return Values :
+  //   The path translated.
+  // ---------------------------------------------------------------------------
+  /**
+  * _tool_TranslateWinPath()
+  *
+  * { Description }
+  *
+  * @param [type] $p_remove_disk_letter
+  */
+  function _tool_TranslateWinPath($p_path, $p_remove_disk_letter=true)
+  {
+    if (stristr(php_uname(), 'windows')) {
+      // ----- Look for potential disk letter
+      if (   ($p_remove_disk_letter)
+	      && (($v_position = strpos($p_path, ':')) != false)) {
+          $p_path = substr($p_path, $v_position+1);
+      }
+      // ----- Change potential windows directory separator
+      if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) {
+          $p_path = strtr($p_path, '\\', '/');
+      }
+    }
+    return $p_path;
+  }
+  // ---------------------------------------------------------------------------
+
+  }
+  // End of class
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/lib/Zip.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/AnsiColorLogger.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/AnsiColorLogger.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/AnsiColorLogger.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,231 @@
+<?php
+/*
+ * $Id: AnsiColorLogger.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/listener/DefaultLogger.php';
+include_once 'phing/system/util/Properties.php';
+
+/**
+ * Uses ANSI Color Code Sequences to colorize messages
+ * sent to the console.
+ *
+ * If used with the -logfile option, the output file
+ * will contain all the necessary escape codes to
+ * display the text in colorized mode when displayed
+ * in the console using applications like cat, more,
+ * etc.
+ *
+ * This is designed to work on terminals that support ANSI
+ * color codes.  It works on XTerm, ETerm, Mindterm, etc.
+ * It also works on Win9x (with ANSI.SYS loaded.)
+ *
+ * NOTE:
+ * It doesn't work on WinNT's COMMAND.COM even with
+ * ANSI.SYS loaded.
+ *
+ * The default colors used for differentiating
+ * the message levels can be changed by editing the
+ * /org/apache/tools/ant/listener/defaults.properties
+ * file.
+ * This file contains 5 key/value pairs:
+ * AnsiColorLogger.ERROR_COLOR=2;31
+ * AnsiColorLogger.WARNING_COLOR=2;35
+ * AnsiColorLogger.INFO_COLOR=2;36
+ * AnsiColorLogger.VERBOSE_COLOR=2;32
+ * AnsiColorLogger.DEBUG_COLOR=2;34
+ *
+ * Another option is to pass a system variable named
+ * ant.logger.defaults, with value set to the path of
+ * the file that contains user defined Ansi Color
+ * Codes, to the <B>java</B> command using -D option.
+ *
+ * To change these colors use the following chart:
+ *
+ *      <B>ANSI COLOR LOGGER CONFIGURATION</B>
+ *
+ * Format for AnsiColorLogger.*=
+ *  Attribute;Foreground;Background
+ * 
+ *  Attribute is one of the following:
+ *  0 -> Reset All Attributes (return to normal mode)
+ *  1 -> Bright (Usually turns on BOLD)
+ *  2 -> Dim
+ *  3 -> Underline
+ *  5 -> link
+ *  7 -> Reverse
+ *  8 -> Hidden
+ *
+ *  Foreground is one of the following:
+ *  30 -> Black
+ *  31 -> Red
+ *  32 -> Green
+ *  33 -> Yellow
+ *  34 -> Blue
+ *  35 -> Magenta
+ *  36 -> Cyan
+ *  37 -> White
+ *
+ *  Background is one of the following:
+ *  40 -> Black
+ *  41 -> Red
+ *  42 -> Green
+ *  43 -> Yellow
+ *  44 -> Blue
+ *  45 -> Magenta
+ *  46 -> Cyan
+ *  47 -> White
+ * 
+ * @author     Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author     Magesh Umasankar (Ant)
+ * @package    phing.listener
+ * @version    $Revision: 1.13 $
+ */
+final class AnsiColorLogger extends DefaultLogger {
+
+    const ATTR_NORMAL = 0;
+    const ATTR_BRIGHT = 1;
+    const ATTR_DIM = 2;
+    const ATTR_UNDERLINE = 3;
+    const ATTR_BLINK = 5;
+    const ATTR_REVERSE = 7;
+    const ATTR_HIDDEN = 8;
+
+    const FG_BLACK = 30;
+    const FG_RED = 31;
+    const FG_GREEN = 32;
+    const FG_YELLOW = 33;
+    const FG_BLUE = 34;
+    const FG_MAGENTA = 35;
+    const FG_CYAN = 36;
+    const FG_WHITE = 37;
+
+    const BG_BLACK = 40;
+    const BG_RED = 41;
+    const BG_GREEN = 42;
+    const BG_YELLOW = 44;
+    const BG_BLUE = 44;
+    const BG_MAGENTA = 45;
+    const BG_CYAN = 46;
+    const BG_WHITE = 47;
+
+    const PREFIX = "\x1b[";
+    const SUFFIX = "m";
+    const SEPARATOR = ';';
+    const END_COLOR = "\x1b[m"; // self::PREFIX . self::SUFFIX;
+
+    private $errColor;
+    private $warnColor;
+    private $infoColor;
+    private $verboseColor;
+    private $debugColor;
+
+    private $colorsSet = false;
+    
+    /**
+     * Construct new AnsiColorLogger
+     * Perform initializations that cannot be done in var declarations.
+     */
+    public function __construct() {
+        parent::__construct();
+        $this->errColor = self::PREFIX . self::ATTR_DIM . self::SEPARATOR . self::FG_RED . self::SUFFIX;
+        $this->warnColor = self::PREFIX . self::ATTR_DIM . self::SEPARATOR . self::FG_MAGENTA . self::SUFFIX;
+        $this->infoColor = self::PREFIX . self::ATTR_DIM . self::SEPARATOR . self::FG_CYAN . self::SUFFIX;
+        $this->verboseColor = self::PREFIX . self::ATTR_DIM . self::SEPARATOR . self::FG_GREEN . self::SUFFIX;
+        $this->debugColor = self::PREFIX . self::ATTR_DIM . self::SEPARATOR . self::FG_BLUE . self::SUFFIX;
+    }
+    
+    /**
+     * Set the colors to use from a property file specified by the
+     * special ant property ant.logger.defaults
+     */
+    private final function setColors() {
+    
+        $userColorFile = Phing::getProperty("phing.logger.defaults");
+        $systemColorFile = new PhingFile(Phing::getResourcePath("phing/listener/defaults.properties"));
+
+        $in = null;
+
+        try {
+            $prop = new Properties();
+
+            if ($userColorFile !== null) {
+                $prop->load($userColorFile);
+            } else {
+                $prop->load($systemColorFile);
+            }                        
+            
+            $err = $prop->getProperty("AnsiColorLogger.ERROR_COLOR");
+            $warn = $prop->getProperty("AnsiColorLogger.WARNING_COLOR");
+            $info = $prop->getProperty("AnsiColorLogger.INFO_COLOR");
+            $verbose = $prop->getProperty("AnsiColorLogger.VERBOSE_COLOR");
+            $debug = $prop->getProperty("AnsiColorLogger.DEBUG_COLOR");
+            if ($err !== null) {
+                $errColor = self::PREFIX . $err . self::SUFFIX;
+            }
+            if ($warn !== null) {
+                $warnColor = self::PREFIX . $warn . self::SUFFIX;
+            }
+            if ($info !== null) {
+                $infoColor = self::PREFIX . $info . self::SUFFIX;
+            }
+            if ($verbose !== null) {
+                $verboseColor = self::PREFIX . $verbose . self::SUFFIX;
+            }
+            if ($debug !== null) {
+                $debugColor = self::PREFIX . $debug . self::SUFFIX;
+            }
+        } catch (IOException $ioe) {
+            //Ignore exception - we will use the defaults.
+        }
+    }
+
+    /**
+     * @see DefaultLogger#printMessage
+     */
+    protected final function printMessage($message, $priority) {
+    
+        if ($message !== null) {
+        
+            if (!$this->colorsSet) {
+                $this->setColors();
+                $this->colorsSet = true;
+            }
+            
+            switch ($priority) {
+                case PROJECT_MSG_ERR:
+                    $message = $this->errColor . $message . self::END_COLOR;
+                    break;
+                case PROJECT_MSG_WARN:
+                    $message = $this->warnColor . $message . self::END_COLOR;                    
+                    break;
+                case PROJECT_MSG_INFO:
+                    $message = $this->infoColor . $message . self::END_COLOR;
+                    break;
+                case PROJECT_MSG_VERBOSE:
+                    $message = $this->verboseColor . $message . self::END_COLOR;
+                    break;
+                case PROJECT_MSG_DEBUG:
+                    $message = $this->debugColor . $message . self::END_COLOR;
+                    break;
+            }
+            print($message."\n");
+        }
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/AnsiColorLogger.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/BuildLogger.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/BuildLogger.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/BuildLogger.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,42 @@
+<?php
+	/**
+	 * $Id: BuildLogger.php 3076 2006-12-18 08:52:12Z fabien $
+	 *
+	 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+	 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+	 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+	 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+	 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+	 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+	 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+	 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+	 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+	 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+	 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+	 *
+	 * This software consists of voluntary contributions made by many individuals
+	 * and is licensed under the LGPL. For more information please see
+	 * <http://phing.info>.
+	 */
+	
+	require_once 'phing/BuildListener.php';
+	/**
+	 * Interface used by Phing Ant to log the build output.
+	 *
+	 * @author Michiel Rook <michiel.rook en gmail.com>
+	 * @version $Id: BuildLogger.php 3076 2006-12-18 08:52:12Z fabien $
+	 * @package phing.listener
+	 */
+	interface BuildLogger extends BuildListener
+	{
+		/**
+		 * Sets the highest level of message this logger should respond to.
+		 *
+		 * Only messages with a message level lower than or equal to the
+		 * given level should be written to the log.
+		 *
+		 * @param int the logging level for the logger.
+		 */
+		function setMessageOutputLevel($level);
+	};
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/BuildLogger.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/DefaultLogger.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/DefaultLogger.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/DefaultLogger.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,233 @@
+<?php
+/*
+ *  $Id: DefaultLogger.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/BuildListener.php';
+include_once 'phing/BuildEvent.php';
+
+/**
+ *  Writes a build event to the console.
+ *
+ *  Currently, it only writes which targets are being executed, and
+ *  any messages that get logged.
+ *
+ *  @author    Andreas Aderhold <andi en binarycloud.com>
+ *  @copyright © 2001,2002 THYRELL. All rights reserved
+ *  @version   $Revision: 1.11 $ $Date$
+ *  @see       BuildEvent
+ *  @package   phing.listener
+ */
+class DefaultLogger implements BuildListener {
+
+    /**
+     *  Size of the left column in output. The default char width is 12.
+     *  @var int
+     */
+    const LEFT_COLUMN_SIZE = 12;
+
+    /**
+     *  The message output level that should be used. The default is
+     *  <code>PROJECT_MSG_VERBOSE</code>.
+     *  @var int
+     */
+    protected $msgOutputLevel = PROJECT_MSG_ERR;
+
+    /**
+     *  Time that the build started
+     *  @var int
+     */
+    protected $startTime;
+
+    /**
+     *  Char that should be used to seperate lines. Default is the system
+     *  property <em>line.seperator</em>.
+     *  @var string
+     */
+    protected $lSep;
+
+    /**
+     *  Construct a new default logger.
+     */
+    public function __construct() {
+        $this->lSep = Phing::getProperty("line.separator");
+    }
+
+    /**
+     *  Set the msgOutputLevel this logger is to respond to.
+     *
+     *  Only messages with a message level lower than or equal to the given
+     *  level are output to the log.
+     *
+     *  <p> Constants for the message levels are in Project.php. The order of
+     *  the levels, from least to most verbose, is:
+     *
+     *  <ul>
+     *    <li>PROJECT_MSG_ERR</li>
+     *    <li>PROJECT_MSG_WARN</li>
+     *    <li>PROJECT_MSG_INFO</li>
+     *    <li>PROJECT_MSG_VERBOSE</li>
+     *    <li>PROJECT_MSG_DEBUG</li>
+     *  </ul>
+     *
+     *  The default message level for DefaultLogger is PROJECT_MSG_ERR.
+     *
+     *  @param  integer  the logging level for the logger.
+     *  @access public
+     */
+    function setMessageOutputLevel($level) {
+        $this->msgOutputLevel = (int) $level;
+    }
+
+    /**
+    *  Sets the start-time when the build started. Used for calculating
+    *  the build-time.
+    *
+    *  @param  object  The BuildEvent
+    *  @access public
+    */
+
+    function buildStarted(BuildEvent $event) {
+        $this->startTime = Phing::currentTimeMillis();
+        if ($this->msgOutputLevel >= PROJECT_MSG_INFO) {
+            $this->printMessage("Buildfile: ".$event->getProject()->getProperty("phing.file"), PROJECT_MSG_INFO);
+        }
+    }
+
+    /**
+     *  Prints whether the build succeeded or failed, and any errors that
+     *  occured during the build. Also outputs the total build-time.
+     *
+     *  @param  object  The BuildEvent
+     *  @access public
+     *  @see    BuildEvent::getException()
+     */
+    function buildFinished(BuildEvent $event) {
+        $error = $event->getException();
+        if ($error === null) {
+            print($this->lSep . "BUILD FINISHED" . $this->lSep);
+        } else {
+            print($this->lSep . "BUILD FAILED" . $this->lSep);
+            if (PROJECT_MSG_VERBOSE <= $this->msgOutputLevel || !($error instanceof BuildException)) {
+                print($error->__toString().$this->lSep);
+            } else {
+                print($error->getMessage());
+            }
+        }
+        print($this->lSep . "Total time: " .$this->_formatTime(Phing::currentTimeMillis() - $this->startTime) . $this->lSep);
+    }
+
+    /**
+     *  Prints the current target name
+     *
+     *  @param  object  The BuildEvent
+     *  @access public
+     *  @see    BuildEvent::getTarget()
+     */
+    function targetStarted(BuildEvent $event) {
+        if (PROJECT_MSG_INFO <= $this->msgOutputLevel) {
+            print($this->lSep . $event->getProject()->getName() . ' > ' . $event->getTarget()->getName() . ':' . $this->lSep);
+        }
+    }
+
+    /**
+     *  Fired when a target has finished. We don't need specific action on this
+     *  event. So the methods are empty.
+     *
+     *  @param  object  The BuildEvent
+     *  @access public
+     *  @see    BuildEvent::getException()
+     */
+    function targetFinished(BuildEvent $event) {}
+
+    /**
+     *  Fired when a task is started. We don't need specific action on this
+     *  event. So the methods are empty.
+     *
+     *  @param  object  The BuildEvent
+     *  @access public
+     *  @see    BuildEvent::getTask()
+     */
+    function taskStarted(BuildEvent $event) {}
+
+    /**
+     *  Fired when a task has finished. We don't need specific action on this
+     *  event. So the methods are empty.
+     *
+     *  @param  object  The BuildEvent
+     *  @access public
+     *  @see    BuildEvent::getException()
+     */
+    function taskFinished(BuildEvent $event) {}
+
+    /**
+     *  Print a message to the stdout.
+     *
+     *  @param  object  The BuildEvent
+     *  @access public
+     *  @see    BuildEvent::getMessage()
+     */
+    function messageLogged(BuildEvent $event) {
+        if ($event->getPriority() <= $this->msgOutputLevel) {
+            $msg = "";
+            if ($event->getTask() !== null) {
+                $name = $event->getTask();
+                $name = $name->getTaskName();
+                $msg = str_pad("[$name] ", self::LEFT_COLUMN_SIZE, " ", STR_PAD_LEFT);
+                #for ($i=0; $i < ($this->LEFT_COLUMN_SIZE - strlen($msg)); ++$i) {
+                #    print(" ");
+                #}
+                #print($msg);
+            }
+            $msg .= $event->getMessage();
+            $this->printMessage($msg, $event->getPriority());
+        }
+    }
+
+    /**
+     *  Formats a time micro integer to human readable format.
+     *
+     *  @param  integer The time stamp
+     *  @access private
+     */
+    function _formatTime($micros) {
+        $seconds = $micros;
+        $minutes = $seconds / 60;
+        if ($minutes > 1) {
+            return sprintf("%1.0f minute%s %0.2f second%s",
+                                    $minutes, ($minutes === 1 ? " " : "s "),
+                                    $seconds - floor($seconds/60) * 60, ($seconds%60 === 1 ? "" : "s"));
+        } else {
+            return sprintf("%0.4f second%s", $seconds, ($seconds%60 === 1 ? "" : "s"));
+        }
+    }
+    
+    /**
+     * Prints a message to console.
+     * 
+     * @param string $message  The message to print. 
+     *                 Should not be <code>null</code>.
+     * @param int $priority The priority of the message. 
+     *                 (Ignored in this implementation.)
+     * @return void
+     */
+    protected function printMessage($message, $priority) {
+        print($message . $this->lSep);
+    }    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/DefaultLogger.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/NoBannerLogger.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/NoBannerLogger.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/NoBannerLogger.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,61 @@
+<?php
+/*
+ * $Id: NoBannerLogger.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/listener/DefaultLogger.php';
+
+/**
+ *  Extends DefaultLogger to strip out empty targets.  This logger is most
+ *  commonly used and also enforced by the default phing invokation scripts
+ *  in bin/.
+ *
+ *  @author    Andreas Aderhold <andi en binarycloud.com>
+ *  @copyright © 2001,2002 THYRELL. All rights reserved
+ *  @version   $Revision: 1.4 $ $Date$
+ *  @package   phing.listener
+ */
+class NoBannerLogger extends DefaultLogger {
+
+    private $targetName = null;
+
+    function targetStarted(BuildEvent $event) {
+        $target = $event->getTarget();
+        $this->targetName = $target->getName();
+    }
+
+    function targetFinished(BuildEvent $event) {
+        $this->targetName = null;
+    }
+
+    function messageLogged(BuildEvent $event) {
+        if ($event->getPriority() > $this->msgOutputLevel ||
+                null === $event->getMessage() ||
+                         trim($event->getMessage() === "")) {
+            return;
+        }
+
+        if ($this->targetName !== null) {
+            print($this->lSep . "Target: ".$this->targetName . $this->lSep);
+            $this->targetName = null;
+        }
+
+        parent::messageLogged($event);
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/NoBannerLogger.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/PearLogger.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/PearLogger.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/PearLogger.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,246 @@
+<?php
+/*
+ *  $Id: PearLogger.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/BuildListener.php';
+include_once 'phing/BuildEvent.php';
+require_once 'Log.php';
+
+/**
+ * Writes log messages to PEAR Log.
+ * 
+ * By default it will log to file in current directory w/ name 'phing.log'.  You can customize
+ * this behavior by setting properties:
+ * - pear.log.type
+ * - pear.log.name
+ * - pear.log.ident (note that this class changes ident to project name)
+ * - pear.log.conf (note that array values are currently unsupported in Phing property files)
+ * 
+ * <code>
+ *  phing -f build.xml -logger phing.listener.PearLogger -Dpear.log.type=file -Dpear.log.name=/path/to/log.log
+ * </code>
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.3 $ $Date$
+ * @see       BuildEvent
+ * @package   phing.listener
+ */
+class PearLogger implements BuildListener {
+
+    /**
+     *  Size of the left column in output. The default char width is 12.
+     *  @var int
+     */
+    const LEFT_COLUMN_SIZE = 12;
+
+    /**
+     *  The message output level that should be used. The default is
+     *  <code>PROJECT_MSG_VERBOSE</code>.
+     *  @var int
+     */
+    protected $msgOutputLevel = PROJECT_MSG_ERR;
+
+    /**
+     *  Time that the build started
+     *  @var int
+     */
+    protected $startTime;
+    
+    /**
+     * Maps Phing PROJECT_MSG_* constants to PEAR_LOG_* constants.
+     * @var array
+     */
+    protected static $levelMap = array( PROJECT_MSG_DEBUG => PEAR_LOG_DEBUG,
+                                        PROJECT_MSG_INFO => PEAR_LOG_INFO,
+                                        PROJECT_MSG_VERBOSE => PEAR_LOG_NOTICE,
+                                        PROJECT_MSG_WARN => PEAR_LOG_WARNING,
+                                        PROJECT_MSG_ERR => PEAR_LOG_ERR
+                                       );
+    /**
+     * Whether logging has been configured.
+     * @var boolean
+     */
+    protected $logConfigured = false;
+              
+    /**
+     * Configure the logger.
+     */
+    protected function configureLogging() {
+    
+        $type = Phing::getDefinedProperty('pear.log.type');
+        $name = Phing::getDefinedProperty('pear.log.name');
+        $ident = Phing::getDefinedProperty('pear.log.ident');
+        $conf = Phing::getDefinedProperty('pear.log.conf');
+        
+        if ($type === null) $type = 'file';
+        if ($name === null) $name = 'phing.log';
+        if ($ident === null) $ident = 'phing';
+        if ($conf === null) $conf = array();
+        
+        $this->logger = Log::singleton($type, $name, $ident, $conf, self::$levelMap[$this->msgOutputLevel]);
+    }        
+    
+    /**
+     * Get the configured PEAR logger to use.
+     * This method just ensures that logging has been configured and returns the configured logger.
+     * @return Log
+     */
+    protected function logger() {
+        if (!$this->logConfigured) {
+            $this->configureLogging();
+        }
+        return $this->logger;
+    }
+    
+    /**
+     *  Set the msgOutputLevel this logger is to respond to.
+     *
+     *  Only messages with a message level lower than or equal to the given
+     *  level are output to the log.
+     *
+     *  <p> Constants for the message levels are in Project.php. The order of
+     *  the levels, from least to most verbose, is:
+     *
+     *  <ul>
+     *    <li>PROJECT_MSG_ERR</li>
+     *    <li>PROJECT_MSG_WARN</li>
+     *    <li>PROJECT_MSG_INFO</li>
+     *    <li>PROJECT_MSG_VERBOSE</li>
+     *    <li>PROJECT_MSG_DEBUG</li>
+     *  </ul>
+     *
+     *  The default message level for DefaultLogger is PROJECT_MSG_ERR.
+     *
+     *  @param  integer  the logging level for the logger.
+     *  @access public
+     */
+    function setMessageOutputLevel($level) {
+        $this->msgOutputLevel = (int) $level;
+    }
+
+    /**
+    *  Sets the start-time when the build started. Used for calculating
+    *  the build-time.
+    *
+    *  @param  object  The BuildEvent
+    *  @access public
+    */
+
+    function buildStarted(BuildEvent $event) {
+        $this->startTime = Phing::currentTimeMillis();
+        $this->logger()->setIdent($event->getProject()->getName());
+        $this->logger()->info("Starting build with buildfile: ". $event->getProject()->getProperty("phing.file"));
+    }
+
+    /**
+     *  Prints whether the build succeeded or failed, and any errors that
+     *  occured during the build. Also outputs the total build-time.
+     *
+     *  @param  object  The BuildEvent
+     *  @access public
+     *  @see    BuildEvent::getException()
+     */
+    function buildFinished(BuildEvent $event) {
+        $error = $event->getException();
+        if ($error === null) {
+            $msg = "Finished successful build.";
+        } else {
+            $msg = "Build failed. [reason: " . $error->getMessage() ."]";
+        }
+        $this->logger()->log($msg . " Total time: " . $this->_formatTime(Phing::currentTimeMillis() - $this->startTime));
+    }
+
+    /**
+     *  Prints the current target name
+     *
+     *  @param  object  The BuildEvent
+     *  @access public
+     *  @see    BuildEvent::getTarget()
+     */
+    function targetStarted(BuildEvent $event) {}
+
+    /**
+     *  Fired when a target has finished. We don't need specific action on this
+     *  event. So the methods are empty.
+     *
+     *  @param  object  The BuildEvent
+     *  @access public
+     *  @see    BuildEvent::getException()
+     */
+    function targetFinished(BuildEvent $event) {}
+
+    /**
+     *  Fired when a task is started. We don't need specific action on this
+     *  event. So the methods are empty.
+     *
+     *  @param  object  The BuildEvent
+     *  @access public
+     *  @see    BuildEvent::getTask()
+     */
+    function taskStarted(BuildEvent $event) {}
+
+    /**
+     *  Fired when a task has finished. We don't need specific action on this
+     *  event. So the methods are empty.
+     *
+     *  @param  object  The BuildEvent
+     *  @access public
+     *  @see    BuildEvent::getException()
+     */
+    function taskFinished(BuildEvent $event) {}
+
+    /**
+     *  Print a message to the stdout.
+     *
+     *  @param  object  The BuildEvent
+     *  @access public
+     *  @see    BuildEvent::getMessage()
+     */
+    function messageLogged(BuildEvent $event) {
+        if ($event->getPriority() <= $this->msgOutputLevel) {            
+            $msg = "";
+            if ($event->getTask() !== null) {
+                $name = $event->getTask();
+                $name = $name->getTaskName();
+                $msg = str_pad("[$name] ", self::LEFT_COLUMN_SIZE, " ", STR_PAD_LEFT);
+            }
+            $msg .= $event->getMessage();
+            $this->logger()->log($msg, self::$levelMap[$event->getPriority()]);
+        }
+    }
+
+    /**
+     *  Formats a time micro integer to human readable format.
+     *
+     *  @param  integer The time stamp
+     *  @access private
+     */
+    function _formatTime($micros) {
+        $seconds = $micros;
+        $minutes = $seconds / 60;
+        if ($minutes > 1) {
+            return sprintf("%1.0f minute%s %0.2f second%s",
+                                    $minutes, ($minutes === 1 ? " " : "s "),
+                                    $seconds - floor($seconds/60) * 60, ($seconds%60 === 1 ? "" : "s"));
+        } else {
+            return sprintf("%0.4f second%s", $seconds, ($seconds%60 === 1 ? "" : "s"));
+        }
+    }         
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/PearLogger.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/XmlLogger.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/XmlLogger.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/XmlLogger.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,265 @@
+<?php
+	/**
+	 * $Id: XmlLogger.php 3076 2006-12-18 08:52:12Z fabien $
+	 *
+	 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+	 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+	 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+	 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+	 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+	 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+	 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+	 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+	 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+	 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+	 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+	 *
+	 * This software consists of voluntary contributions made by many individuals
+	 * and is licensed under the LGPL. For more information please see
+	 * <http://phing.info>.
+	 */
+	
+	require_once 'phing/listener/BuildLogger.php';
+	require_once 'phing/listener/DefaultLogger.php';
+	require_once 'phing/system/util/Timer.php';
+	/**
+	 * Generates a file in the current directory with
+	 * an XML description of what happened during a build.
+	 * The default filename is "log.xml", but this can be overridden
+	 * with the property <code>XmlLogger.file</code>.
+	 *
+	 * @author Michiel Rook <michiel.rook en gmail.com>
+	 * @version $Id: XmlLogger.php 3076 2006-12-18 08:52:12Z fabien $
+	 * @package phing.listener
+	 */	
+	class XmlLogger implements BuildLogger
+	{
+		/** XML element name for a build. */
+		const BUILD_TAG = "build";
+		/** XML element name for a target. */
+		const TARGET_TAG = "target";
+		/** XML element name for a task. */
+		const TASK_TAG = "task";
+		/** XML element name for a message. */
+		const MESSAGE_TAG = "message";
+		/** XML attribute name for a name. */
+		const NAME_ATTR = "name";
+		/** XML attribute name for a time. */
+		const TIME_ATTR = "time";
+		/** XML attribute name for a message priority. */
+		const PRIORITY_ATTR = "priority";
+		/** XML attribute name for a file location. */
+		const LOCATION_ATTR = "location";
+		/** XML attribute name for an error description. */
+		const ERROR_ATTR = "error";
+		/** XML element name for a stack trace. */
+		const STACKTRACE_TAG = "stacktrace";
+		
+		private $doc = NULL;
+		
+		private $buildStartTime = 0;
+		private $targetStartTime = 0;
+		private $taskStartTime = 0;
+		
+		private $buildElement = NULL;
+		
+		private $msgOutputLevel = PROJECT_MSG_DEBUG;
+		
+		/**
+		 *  Constructs a new BuildListener that logs build events to an XML file.
+		 */
+		function __construct()
+		{
+			$this->doc = new DOMDocument();
+			$this->doc->formatOutput = true;
+			
+			$this->buildTimer = new Timer();
+			$this->targetTimer = new Timer();
+			$this->taskTimer = new Timer();
+		}
+		
+		/**
+		 * Fired when the build starts, this builds the top-level element for the
+		 * document and remembers the time of the start of the build.
+		 *
+		 * @param BuildEvent Ignored.
+		 */
+		function buildStarted(BuildEvent $event)
+		{
+			$this->buildTimerStart = Phing::currentTimeMillis();
+			$this->buildElement = $this->doc->createElement(XmlLogger::BUILD_TAG);
+		}
+		
+		/**
+		 * Fired when the build finishes, this adds the time taken and any
+		 * error stacktrace to the build element and writes the document to disk.
+		 *
+		 * @param BuildEvent An event with any relevant extra information.
+		 *              Will not be <code>null</code>.
+		 */
+		function buildFinished(BuildEvent $event)
+		{
+			$this->buildTimer->stop();
+			
+			$elapsedTime = Phing::currentTimeMillis() - $this->buildTimerStart;
+			
+			$this->buildElement->setAttribute(XmlLogger::TIME_ATTR, DefaultLogger::_formatTime($elapsedTime));
+			
+			if ($event->getException() != null)
+			{
+				$this->buildElement->setAttribute(XmlLogger::ERROR_ATTR, $event->getException()->toString());
+				
+				$errText = $this->doc->createCDATASection($event->getException()->getTraceAsString());
+				$stacktrace = $this->doc->createElement(XmlLogger::STACKTRACE_TAG);
+				$stacktrace->appendChild($errText);
+				$this->buildElement->appendChild($stacktrace);
+			}
+			
+			$outFilename = $event->getProject()->getProperty("XmlLogger.file");
+			
+			if ($outFilename == "")
+			{
+				$outFilename = "log.xml";
+			}
+			$writer = new FileWriter($outFilename);
+			
+			$writer->write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+			$writer->write($this->doc->saveXML($this->buildElement));
+			$writer->close();
+		}
+		/**
+		 * Fired when a target starts building, remembers the current time and the name of the target.
+		 *
+		 * @param BuildEvent An event with any relevant extra information.
+		 *              Will not be <code>null</code>.
+		 */
+		function targetStarted(BuildEvent $event)
+		{
+			$target = $event->getTarget();
+			
+			$this->targetTimerStart = Phing::currentTimeMillis();
+			
+			$this->targetElement = $this->doc->createElement(XmlLogger::TARGET_TAG);
+			$this->targetElement->setAttribute(XmlLogger::NAME_ATTR, $target->getName());
+		}
+		
+		/**
+		 * Fired when a target finishes building, this adds the time taken
+		 * to the appropriate target element in the log.
+		 *
+		 * @param BuildEvent An event with any relevant extra information.
+		 *              Will not be <code>null</code>.
+		 */
+		function targetFinished(BuildEvent $event)
+		{
+			$target = $event->getTarget();
+			
+			$elapsedTime = Phing::currentTimeMillis() - $this->targetTimerStart;
+			
+			$this->targetElement->setAttribute(XmlLogger::TIME_ATTR, DefaultLogger::_formatTime($elapsedTime));
+			
+			$this->buildElement->appendChild($this->targetElement);
+		}
+		
+		/**
+		 * Fired when a task starts building, remembers the current time and the name of the task.
+		 *
+		 * @param BuildEvent An event with any relevant extra information.
+		 *              Will not be <code>null</code>.
+		 */
+		function taskStarted(BuildEvent $event)
+		{
+			$task = $event->getTask();
+			
+			$this->taskTimerStart = Phing::currentTimeMillis();
+			
+			$this->taskElement = $this->doc->createElement(XmlLogger::TASK_TAG);
+			$this->taskElement->setAttribute(XmlLogger::NAME_ATTR, $task->getTaskName());
+			$this->taskElement->setAttribute(XmlLogger::LOCATION_ATTR, $task->getLocation()->toString());
+		}
+		/**
+		 * Fired when a task finishes building, this adds the time taken
+		 * to the appropriate task element in the log.
+		 *
+		 * @param BuildEvent An event with any relevant extra information.
+		 *              Will not be <code>null</code>.
+		 */		
+		function taskFinished(BuildEvent $event)
+		{
+			$task = $event->getTask();
+			
+			$elapsedTime = Phing::currentTimeMillis() - $this->taskTimerStart;
+			$this->taskElement->setAttribute(XmlLogger::TIME_ATTR, DefaultLogger::_formatTime($elapsedTime));
+			
+			$this->targetElement->appendChild($this->taskElement);
+		}
+		
+		/**
+		 * Fired when a message is logged, this adds a message element to the
+		 * most appropriate parent element (task, target or build) and records
+		 * the priority and text of the message.
+		 *
+		 * @param BuildEvent An event with any relevant extra information.
+		 *              Will not be <code>null</code>.
+		 */
+		function messageLogged(BuildEvent $event)
+		{
+			$priority = $event->getPriority();
+			
+			if ($priority > $this->msgOutputLevel)
+			{
+				return;
+			}
+			
+			$messageElement = $this->doc->createElement(XmlLogger::MESSAGE_TAG);
+			
+			switch ($priority)
+			{
+				case PROJECT_MSG_ERR: 
+					$name = "error"; 
+					break;
+					
+				case PROJECT_MSG_WARN:
+					$name = "warn";
+					break;
+				
+				case PROJECT_MSG_INFO:
+					$name = "info";
+					break;
+					
+				default:
+					$name = "debug";
+					break;
+			}
+			
+			$messageElement->setAttribute(XmlLogger::PRIORITY_ATTR, $name);
+			
+			$messageText = $this->doc->createCDATASection($event->getMessage());
+			
+			$messageElement->appendChild($messageText);
+			
+			if ($event->getTask() != null)
+			{
+				$this->taskElement->appendChild($messageElement);
+			}
+			else
+			if ($event->getTarget() != null)
+			{
+				$this->targetElement->appendChild($messageElement);
+			}
+			else
+			if ($this->buildElement != null)
+			{			
+				$this->buildElement->appendChild($messageElement);
+			}
+		}
+		
+		/**
+		 * Set the logging level when using this as a Logger
+		 */
+		function setMessageOutputLevel($level)
+		{
+			$this->msgOutputLevel = $level;
+		}
+	};
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/XmlLogger.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/defaults.properties
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/defaults.properties	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/listener/defaults.properties	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,43 @@
+####################################################
+#
+#           ANSI COLOR LOGGER CONFIGURATION
+#
+# Format for AnsiColorLogger.*=
+#  Attribute;Foreground;Background
+#
+#  Attribute is one of the following:
+#  0 -> Reset All Attributes (return to normal mode)
+#  1 -> Bright (Usually turns on BOLD)
+#  2 -> Dim
+#  3 -> Underline
+#  5 -> link
+#  7 -> Reverse
+#  8 -> Hidden
+#  
+#  Foreground is one of the following:
+#  30 -> Black
+#  31 -> Red
+#  32 -> Green
+#  33 -> Yellow
+#  34 -> Blue
+#  35 -> Magenta
+#  36 -> Cyan
+#  37 -> White
+#
+#  Background is one of the following:
+#  40 -> Black
+#  41 -> Red
+#  42 -> Green
+#  43 -> Yellow
+#  44 -> Blue
+#  45 -> Magenta
+#  46 -> Cyan
+#  47 -> White
+#
+####################################################
+
+AnsiColorLogger.ERROR_COLOR=2;31
+AnsiColorLogger.WARNING_COLOR=2;35
+AnsiColorLogger.INFO_COLOR=2;36
+AnsiColorLogger.VERBOSE_COLOR=2;32
+AnsiColorLogger.DEBUG_COLOR=2;34

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/FileNameMapper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/FileNameMapper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/FileNameMapper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,59 @@
+<?php
+/* 
+ *  $Id: FileNameMapper.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+/**
+ * Interface for filename mapper classes.
+ *
+ * @author Andreas Aderhold, andi en binarycloud.com
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 1.7 $
+ * @package phing.mappers
+ */
+interface FileNameMapper {
+
+    /**
+     * The mapper implementation.
+     *
+     * @param mixed $sourceFileName The data the mapper works on.
+     * @return  array The data after the mapper has been applied; must be in array format (for some reason).
+     */
+    public function main($sourceFileName);
+
+    /**
+     * Accessor. Sets the to property. The actual implementation
+     * depends on the child class.
+     *
+     * @param string $to To what this mapper should convert the from string
+     * @return void
+     */
+    public function setTo($to);
+
+    /**
+     * Accessor. Sets the from property. What this mapper should
+     * recognize. The actual implementation is dependent upon the
+     * child class
+     *
+     * @param string $from On what this mapper should work
+     * @return void
+     */
+    public function setFrom($from);
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/FileNameMapper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/FlattenMapper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/FlattenMapper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/FlattenMapper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,55 @@
+<?php
+/* 
+ *  $Id: FlattenMapper.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+require_once 'phing/mappers/FileNameMapper.php';
+
+/**
+ * Removes any directory information from the passed path.
+ *
+ * @author   Andreas Aderhold <andi en binarycloud.com>
+ * @version  $Revision: 1.9 $
+ * @package  phing.mappers
+ */
+class FlattenMapper implements FileNameMapper {
+
+    /**
+     * The mapper implementation. Returns string with source filename
+     * but without leading directory information
+     *
+     * @param string $sourceFileName The data the mapper works on
+     * @return array The data after the mapper has been applied
+     */
+    function main($sourceFileName) {
+        $f = new PhingFile($sourceFileName);
+        return array($f->getName());
+    }
+
+    /**
+     * Ignored here.
+     */
+    function setTo($to) {}
+
+    /**
+     * Ignored here.
+     */
+    function setFrom($from) {}
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/FlattenMapper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/GlobMapper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/GlobMapper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/GlobMapper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,113 @@
+<?php
+/* 
+ *  $Id: GlobMapper.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+include_once 'phing/mappers/FileNameMapper.php';
+
+/**
+ * description here
+ *
+ * @author   Andreas Aderhold, andi en binarycloud.com
+ * @version  $Revision: 1.10 $
+ * @package   phing.mappers
+ */
+class GlobMapper implements FileNameMapper {
+
+    /**
+     * Part of &quot;from&quot; pattern before the *.
+     */
+    private $fromPrefix = null;
+
+    /**
+     * Part of &quot;from&quot; pattern after the *.
+     */
+    private $fromPostfix = null;
+
+    /**
+     * Length of the prefix (&quot;from&quot; pattern).
+     */
+    private $prefixLength;
+
+    /**
+     * Length of the postfix (&quot;from&quot; pattern).
+     */
+    private $postfixLength;
+
+    /**
+     * Part of &quot;to&quot; pattern before the *.
+     */
+    private $toPrefix = null;
+
+    /**
+     * Part of &quot;to&quot; pattern after the *.
+     */
+    private $toPostfix = null;
+
+
+    function main($_sourceFileName) {
+        if (($this->fromPrefix === null)
+            || !StringHelper::startsWith($this->fromPrefix, $_sourceFileName)
+            || !StringHelper::endsWith($this->fromPostfix, $_sourceFileName)) {
+            return null;
+        }
+        $varpart = $this->_extractVariablePart($_sourceFileName);
+        $substitution = $this->toPrefix.$varpart.$this->toPostfix;
+        return array($substitution);
+    }
+
+
+
+   function setFrom($from) {
+        $index = strrpos($from, '*');
+
+        if ($index === false) {
+            $this->fromPrefix = $from;
+            $this->fromPostfix = "";
+        } else {
+            $this->fromPrefix  = substr($from, 0, $index);
+            $this->fromPostfix = substr($from, $index+1);
+        }
+        $this->prefixLength  = strlen($this->fromPrefix);
+        $this->postfixLength = strlen($this->fromPostfix);
+    }
+
+    /**
+     * Sets the &quot;to&quot; pattern. Required.
+     */
+    function setTo($to) {
+        $index = strrpos($to, '*');
+        if ($index === false) {
+            $this->toPrefix = $to;
+            $this->toPostfix = "";
+        } else {
+            $this->toPrefix  = substr($to, 0, $index);
+            $this->toPostfix = substr($to, $index+1);
+        }
+    }
+
+    private function _extractVariablePart($_name) {
+        // ergh, i really hate php's string functions .... all but natural
+        $start = ($this->prefixLength === 0) ? 0 : $this->prefixLength;
+        $end   = ($this->postfixLength === 0) ? strlen($_name) : strlen($_name) - $this->postfixLength;
+        $len   = $end-$start;
+        return substr($_name, $start, $len);
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/GlobMapper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/IdentityMapper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/IdentityMapper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/IdentityMapper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,54 @@
+<?php
+/* 
+ *  $Id: IdentityMapper.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+require_once 'phing/mappers/FileNameMapper.php';
+
+/**
+ * This mapper does nothing ;)
+ * 
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.7 $
+ * @package   phing.mappers
+ */
+class IdentityMapper implements FileNameMapper {
+
+    /**
+     * The mapper implementation. Basically does nothing in this case.
+     *
+     * @param  string $sourceFileName The data the mapper works on.
+     * @return array The data after the mapper has been applied
+     */
+    function main($sourceFileName) {
+        return array($sourceFileName);
+    }
+
+    /**
+     * Ignored here.
+     */
+    function setTo($to) {}
+
+    /**
+     * Ignored here.
+     */
+    function setFrom($from) {}
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/IdentityMapper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/MergeMapper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/MergeMapper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/MergeMapper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,69 @@
+<?php
+/* 
+ *  $Id: MergeMapper.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+include_once 'phing/mappers/FileNameMapper.php';
+
+/**
+ * For merging files into a single file.  In practice just returns whatever value
+ * was set for "to".
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @version   $Revision: 1.8 $
+ * @package   phing.mappers
+ */
+class MergeMapper implements FileNameMapper {
+    
+    /** the merge */
+    private $mergedFile;
+
+    /**
+     * The mapper implementation. Basically does nothing in this case.
+     *
+     * @param    mixed     The data the mapper works on
+     * @returns  mixed     The data after the mapper has been applied
+     * @access   public
+     * @author   Andreas Aderhold, andi en binarycloud.com
+     */
+    function main($sourceFileName) {
+        if ($this->mergedFile === null) {            
+            throw new BuildException("MergeMapper error, to attribute not set");            
+        }         
+        return array($this->mergedFile);
+    }
+
+    /**
+     * Accessor. Sets the to property
+     *
+     * @param    string     To what this mapper should convert the from string
+     * @returns  boolean    True
+     * @access   public
+     * @author   Andreas Aderhold, andi en binarycloud.com
+     */
+    function setTo($to) {
+        $this->mergedFile = $to;
+    }    
+
+    /**
+     * Ignored.
+     */
+    function setFrom($from) {}
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/MergeMapper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/RegexpMapper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/RegexpMapper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/RegexpMapper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,97 @@
+<?php
+/* 
+ *  $Id: RegexpMapper.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+require_once 'phing/mappers/FileNameMapper.php';
+include_once 'phing/util/StringHelper.php';
+include_once 'phing/util/regexp/Regexp.php';
+
+/**
+ * Uses regular expressions to perform filename transformations.
+ *
+ * @author Andreas Aderhold <andi en binarycloud.com>
+ * @author Hans Lellelid <hans en velum.net>
+ * @version $Revision: 1.9 $
+ * @package phing.mappers
+ */
+class RegexpMapper implements FileNameMapper {
+
+    /**
+     * @var string
+     */
+    private $to;
+    
+    /**
+     * The Regexp engine.
+     * @var Regexp
+     */
+    private $reg;
+
+    function __construct() {                
+        // instantiage regexp matcher here
+        $this->reg = new Regexp();
+    }
+
+    /**
+     * Sets the &quot;from&quot; pattern. Required.
+     */
+    function setFrom($from) {
+        $this->reg->SetPattern($from);
+    }
+
+    /**
+     * Sets the &quot;to&quot; pattern. Required.
+     */
+    function setTo($to) {
+    
+        // [HL] I'm changing the way this works for now to just use string
+        //$this->to = StringHelper::toCharArray($to);
+        
+        $this->to = $to;
+    }
+
+    function main($sourceFileName) {
+        if ($this->reg === null  || $this->to === null || !$this->reg->matches((string) $sourceFileName)) {
+            return null;
+        }
+        return array($this->replaceReferences($sourceFileName));
+    }
+
+    /**
+     * Replace all backreferences in the to pattern with the matched groups.
+     * groups of the source.
+     * @param string $source The source filename.
+     */
+    private function replaceReferences($source) {
+        
+        // FIXME
+        // Can't we just use engine->replace() to handle this?  the Preg engine
+        // will automatically convert \1 references to $1
+        
+        // the expression has already been processed (when ->matches() was run in Main())
+        // so no need to pass $source again to the engine.
+        $groups = (array) $this->reg->getGroups();            
+        
+        // replace \1 with value of $groups[1] and return the modified "to" string
+        return preg_replace('/\\\([\d]+)/e', "\$groups[$1]", $this->to);            
+    }
+    
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/mappers/RegexpMapper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/AbstractHandler.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/AbstractHandler.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/AbstractHandler.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,98 @@
+<?php
+
+/*
+ * $Id: AbstractHandler.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/parser/ExpatParseException.php';
+
+/**
+ * This is an abstract class all SAX handler classes must extend
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @copyright © 2001,2002 THYRELL. All rights reserved
+ * @version   $Revision: 1.6 $
+ * @package   phing.parser
+ */
+abstract class AbstractHandler {
+
+    public $parentHandler = null;
+    public $parser = null;
+
+    /**
+     * Constructs a SAX handler parser.
+     *
+     * The constructor must be called by all derived classes.
+     *
+     * @param   object  the parser object
+     * @param   object  the parent handler of this handler
+     */
+    protected function __construct($parser, $parentHandler) {
+        $this->parentHandler = $parentHandler;
+        $this->parser = $parser;
+        $this->parser->setHandler($this);
+    }
+        
+    /**
+     * Gets invoked when a XML open tag occurs
+     *
+     * Must be overloaded by the child class. Throws an ExpatParseException
+     * if there is no handler registered for an element.
+     *
+     * @param  string  the name of the XML element
+     * @param  array   the attributes of the XML element
+     */
+    public function startElement($name, $attribs) {
+        throw new ExpatParseException("Unexpected element $name");
+    }
+
+    /**
+     * Gets invoked when element closes method.
+     *
+     */
+    protected function finished() {}
+
+    /**
+     * Gets invoked when a XML element ends.
+     *
+     * Can be overloaded by the child class. But should not. It hands
+     * over control to the parentHandler of this.
+     *
+     * @param  string  the name of the XML element
+     */
+    public function endElement($name) {
+        $this->finished();        
+        $this->parser->setHandler($this->parentHandler);
+    }
+
+    /**
+     * Invoked by occurance of #PCDATA.
+     *
+     * @param     string  the name of the XML element
+     * @exception ExpatParserException if there is no CDATA but method
+     *            was called
+     * @access    public
+     */
+    public function characters($data) {
+        $s = trim($data);
+        if (strlen($s) > 0) {
+            throw new ExpatParseException("Unexpected text '$s'", $this->parser->getLocation());
+        }
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/AbstractHandler.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/AbstractSAXParser.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/AbstractSAXParser.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/AbstractSAXParser.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,140 @@
+<?php
+/*
+ *  $Id: AbstractSAXParser.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ * The abstract SAX parser class.
+ *
+ * This class represents a SAX parser. It is a abstract calss that must be
+ * implemented by the real parser that must extend this class
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @copyright © 2001,2002 THYRELL. All rights reserved
+ * @version   $Revision: 1.13 $
+ * @package   phing.parser
+ */
+abstract class AbstractSAXParser {
+    
+    /** The AbstractHandler object. */
+    protected $handler;
+
+    /**
+     * Constructs a SAX parser
+     */
+    function __construct() {}
+
+    /**
+     * Sets options for PHP interal parser. Must be implemented by the parser
+     * class if it should be used.
+     */
+    abstract function parserSetOption($opt, $val);
+
+    /**
+     * Sets the current element handler object for this parser. Usually this
+     * is an object using extending "AbstractHandler".
+     *
+     * @param AbstractHandler $obj The handler object.
+     */
+    function setHandler( $obj) {
+        $this->handler = $obj;
+    }
+
+    /**
+     * Method that gets invoked when the parser runs over a XML start element.
+     *
+     * This method is called by PHP's internal parser funcitons and registered
+     * in the actual parser implementation.
+     * It gives control to the current active handler object by calling the
+     * <code>startElement()</code> method.
+     * 
+     * BECAUSE OF PROBLEMS WITH EXCEPTIONS BUBBLING UP THROUGH xml_parse() THIS
+     * METHOD WILL CALL Phing::halt(-1) ON EXCEPTION.
+     *
+     * @param  object  the php's internal parser handle
+     * @param  string  the open tag name
+     * @param  array   the tag's attributes if any
+     */
+    function startElement($parser, $name, $attribs) {
+        try {
+            $this->handler->startElement($name, $attribs);        
+        } catch (Exception $e) {
+            print "[Exception in XML parsing]\n";
+            print $e;
+            Phing::halt(-1);
+        }
+    }
+
+    /**
+     * Method that gets invoked when the parser runs over a XML close element.
+     *
+     * This method is called by PHP's internal parser funcitons and registered
+     * in the actual parser implementation.
+     *
+     * It gives control to the current active handler object by calling the
+     * <code>endElement()</code> method.
+     *
+     * BECAUSE OF PROBLEMS WITH EXCEPTIONS BUBBLING UP THROUGH xml_parse() THIS
+     * METHOD WILL CALL Phing::halt(-1) ON EXCEPTION.
+     * 
+     * @param   object  the php's internal parser handle
+     * @param   string  the closing tag name
+     */
+    function endElement($parser, $name) {
+        try {
+            $this->handler->endElement($name);
+        } catch (Exception $e) {
+            print "[Exception in XML parsing]\n";
+            print $e;
+            Phing::halt(-1);
+        }
+    }
+
+    /**
+     * Method that gets invoked when the parser runs over CDATA.
+     *
+     * This method is called by PHP's internal parser functions and registered
+     * in the actual parser implementation.
+     *
+     * It gives control to the current active handler object by calling the
+     * <code>characters()</code> method. That processes the given CDATA.
+     *
+     * BECAUSE OF PROBLEMS WITH EXCEPTIONS BUBBLING UP THROUGH xml_parse() THIS
+     * METHOD WILL CALL Phing::halt(-1) ON EXCEPTION.
+     * 
+     * @param resource $parser php's internal parser handle.
+     * @param string $data the CDATA
+     */
+    function characters($parser, $data) {
+        try {     
+            $this->handler->characters($data);        
+        } catch (Exception $e) {
+            print "[Exception in XML parsing]\n";
+            print $e;
+            Phing::halt(-1);
+        }
+    }
+
+    /**
+     * Entrypoint for parser. This method needs to be implemented by the
+     * child classt that utilizes the concrete parser
+     */
+    abstract function parse();
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/AbstractSAXParser.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/DataTypeHandler.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/DataTypeHandler.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/DataTypeHandler.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,144 @@
+<?php
+/*
+ *  $Id: DataTypeHandler.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/RuntimeConfigurable.php';
+
+/**
+ * Configures a Project (complete with Targets and Tasks) based on
+ * a XML build file.
+ * <p>
+ * Design/ZE2 migration note:
+ * If PHP would support nested classes. All the phing/parser/*Filter
+ * classes would be nested within this class
+ *
+ * @author      Andreas Aderhold <andi en binarycloud.com>
+ * @copyright © 2001,2002 THYRELL. All rights reserved
+ * @version   $Revision: 1.8 $ $Date$
+ * @access    public
+ * @package   phing.parser
+ */
+
+class DataTypeHandler extends AbstractHandler {
+
+    private $target;
+    private $element;
+    private $wrapper;
+
+    /**
+     * Constructs a new DataTypeHandler and sets up everything.
+     *
+     * @param AbstractSAXParser $parser The XML parser (default: ExpatParser)
+     * @param AbstractHandler $parentHandler The parent handler that invoked this handler.
+     * @param ProjectConfigurator $configurator The ProjectConfigurator object
+     * @param Target $target The target object this datatype is contained in (null for top-level datatypes).
+     */
+    function __construct(AbstractSAXParser $parser, AbstractHandler $parentHandler, ProjectConfigurator $configurator, $target = null) { // FIXME b2 typehinting
+        parent::__construct($parser, $parentHandler);
+        $this->target = $target;
+        $this->configurator = $configurator;
+    }
+
+    /**
+     * Executes initialization actions required to setup the data structures
+     * related to the tag.
+     * <p>
+     * This includes:
+     * <ul>
+     * <li>creation of the datatype object</li>
+     * <li>calling the setters for attributes</li>
+     * <li>adding the type to the target object if any</li>
+     * <li>adding a reference to the task (if id attribute is given)</li>
+         * </ul>
+     *
+     * @param  string  the tag that comes in
+     * @param  array   attributes the tag carries
+     * @throws ExpatParseException if attributes are incomplete or invalid
+     * @access public
+     */
+    function init($propType, $attrs) {
+        // shorthands
+        $project = $this->configurator->project;
+        $configurator = $this->configurator;
+
+        try {//try
+            $this->element = $project->createDataType($propType);
+
+            if ($this->element === null) {
+                throw new BuildException("Unknown data type $propType");
+            }
+
+            if ($this->target !== null) {
+                $this->wrapper = new RuntimeConfigurable($this->element, $propType);
+                $this->wrapper->setAttributes($attrs);
+                $this->target->addDataType($this->wrapper);
+            } else {
+                $configurator->configure($this->element, $attrs, $project);
+                $configurator->configureId($this->element, $attrs);
+            }
+
+        } catch (BuildException $exc) {
+            throw new ExpatParseException($exc, $this->parser->getLocation());
+        }
+    }
+
+    /**
+     * Handles character data.
+     *
+     * @param  string  the CDATA that comes in
+     * @access public
+     */
+    function characters($data) {
+        $project = $this->configurator->project;
+        try {//try
+            $this->configurator->addText($project, $this->element, $data);
+        } catch (BuildException $exc) {
+            throw new ExpatParseException($exc->getMessage(), $this->parser->getLocation());
+        }
+    }
+
+    /**
+     * Checks for nested tags within the current one. Creates and calls
+     * handlers respectively.
+     *
+     * @param  string  the tag that comes in
+     * @param  array   attributes the tag carries
+     * @access public
+     */
+    function startElement($name, $attrs) {
+        $nef = new NestedElementHandler($this->parser, $this, $this->configurator, $this->element, $this->wrapper, $this->target);
+        $nef->init($name, $attrs);
+    }
+    
+   /**
+    * Overrides endElement for data types. Tells the type
+    * handler that processing the element had been finished so
+    * handlers know they can perform actions that need to be
+    * based on the data contained within the element.
+    *
+    * @param  string  the name of the XML element
+    * @return void
+    */
+   function endElement($name) {
+       $this->element->parsingComplete();
+       parent::endElement($name);
+   }
+         
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/DataTypeHandler.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ExpatParseException.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ExpatParseException.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ExpatParseException.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,31 @@
+<?php
+/*
+ *  $Id: ExpatParseException.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+ 
+require_once 'phing/BuildException.php';
+
+/**
+ * This class throws errors for Expat, the XML processor.
+ *
+ * @author   Andreas Aderhold, andi en binarycloud.com
+ * @version  $Revision: 1.5 $ $Date$
+ * @package  phing.parser
+ */
+class ExpatParseException extends BuildException {}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ExpatParseException.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ExpatParser.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ExpatParser.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ExpatParser.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,140 @@
+<?php
+/*
+ *  $Id: ExpatParser.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/parser/AbstractSAXParser.php';
+include_once 'phing/parser/ExpatParseException.php';
+include_once 'phing/system/io/IOException.php';
+include_once 'phing/system/io/FileReader.php';
+
+/**
+ * This class is a wrapper for the PHP's internal expat parser.
+ *
+ * It takes an XML file represented by a abstract path name, and starts
+ * parsing the file and calling the different "trap" methods inherited from
+ * the AbstractParser class.
+ *
+ * Those methods then invoke the represenatative methods in the registered
+ * handler classes.
+ *
+ * @author      Andreas Aderhold <andi en binarycloud.com>
+ * @copyright © 2001,2002 THYRELL. All rights reserved
+ * @version   $Revision: 1.8 $ $Date$
+ * @access    public
+ * @package   phing.parser
+ */
+
+class ExpatParser extends AbstractSAXParser {
+    
+    /** @var resource */
+    private $parser;
+    
+    /** @var Reader */
+    private $reader;
+    
+    private $file;
+    
+    private $buffer = 4096;
+    
+    private $error_string = "";
+    
+    private $line = 0;
+    
+    /** @var Location Current cursor pos in XML file. */
+    private $location;
+
+    /**
+     * Constructs a new ExpatParser object.
+     *
+     * The constructor accepts a PhingFile object that represents the filename
+     * for the file to be parsed. It sets up php's internal expat parser
+     * and options.
+     *
+     * @param Reader $reader  The Reader Object that is to be read from.
+     * @param string $filename Filename to read.
+     * @throws Exception if the given argument is not a PhingFile object
+     */
+    function __construct(Reader $reader, $filename=null) {
+
+        $this->reader = $reader;
+        if ($filename !== null) {
+            $this->file = new PhingFile($filename);
+        }
+        $this->parser = xml_parser_create();
+        $this->buffer = 4096;
+        $this->location = new Location();
+        xml_set_object($this->parser, $this);
+        xml_set_element_handler($this->parser, array($this,"startElement"),array($this,"endElement"));
+        xml_set_character_data_handler($this->parser, array($this, "characters"));
+    }
+
+    /**
+     * Override PHP's parser default settings, created in the constructor.
+     *
+     * @param  string  the option to set
+     * @throws mixed   the value to set
+     * @return boolean true if the option could be set, otherwise false
+     * @access public
+     */
+    function parserSetOption($opt, $val) {
+        return xml_parser_set_option($this->parser, $opt, $val);
+    }
+
+    /**
+     * Returns the location object of the current parsed element. It describes
+     * the location of the element within the XML file (line, char)
+     *
+     * @return object  the location of the current parser
+     * @access public
+     */
+    function getLocation() {
+        if ($this->file !== null) {
+            $path = $this->file->getAbsolutePath();
+        } else {
+            $path = $this->reader->getResource();
+        }
+        $this->location = new Location($path, xml_get_current_line_number($this->parser), xml_get_current_column_number($this->parser));
+        return $this->location;
+    }
+
+    /**
+     * Starts the parsing process.
+     *
+     * @param  string  the option to set
+     * @return int     1 if the parsing succeeded
+     * @throws ExpatParseException if something gone wrong during parsing
+     * @throws IOException if XML file can not be accessed
+     * @access public
+     */
+    function parse() {
+    
+        while ( ($data = $this->reader->read()) !== -1 ) {            
+            if (!xml_parse($this->parser, $data, $this->reader->eof())) {
+                $error = xml_error_string(xml_get_error_code($this->parser));
+                $e = new ExpatParseException($error, $this->getLocation());
+                xml_parser_free($this->parser);                
+                throw $e;  
+            }
+        }
+        xml_parser_free($this->parser);
+        
+        return 1;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ExpatParser.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/Location.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/Location.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/Location.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,72 @@
+<?php
+/*
+ *  $Id: Location.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ * Stores the file name and line number of a XML file
+ *
+ * @author      Andreas Aderhold <andi en binarycloud.com>
+ * @copyright © 2001,2002 THYRELL. All rights reserved
+ * @version   $Revision: 1.6 $ $Date$
+ * @access    public
+ * @package   phing.parser
+ */
+
+class Location {
+
+    private $fileName;
+    private $lineNumber;
+    private $columnNumber;
+
+    /**
+     * Constructs the location consisting of a file name and line number
+     *
+     * @param  string  the filename
+     * @param  integer the line number
+     * @param  integer the column number
+     * @access public
+     */
+    function Location($fileName = null, $lineNumber = null, $columnNumber = null) {
+        $this->fileName = $fileName;
+        $this->lineNumber = $lineNumber;
+        $this->columnNumber = $columnNumber;
+    }
+
+    /**
+     * Returns the file name, line number and a trailing space.
+     *
+     * An error message can be appended easily. For unknown locations,
+     * returns empty string.
+     *
+     * @return string the string representation of this Location object
+     * @access public
+     */
+    function toString() {
+        $buf = "";
+        if ($this->fileName !== null) {
+            $buf.=$this->fileName;
+            if ($this->lineNumber !== null) {
+                $buf.= ":".$this->lineNumber;
+            }
+            $buf.=":".$this->columnNumber;
+        }
+        return (string) $buf;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/Location.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/NestedElementHandler.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/NestedElementHandler.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/NestedElementHandler.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,186 @@
+<?php
+/*
+ *  $Id: NestedElementHandler.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/IntrospectionHelper.php';
+include_once 'phing/TaskContainer.php';
+
+/**
+ * The nested element handler class.
+ *
+ * This class handles the occurance of runtime registered tags like
+ * datatypes (fileset, patternset, etc) and it's possible nested tags. It
+ * introspects the implementation of the class and sets up the data structures.
+ *
+ * @author      Andreas Aderhold <andi en binarycloud.com>
+ * @copyright © 2001,2002 THYRELL. All rights reserved
+ * @version   $Revision: 1.10 $ $Date$
+ * @access    public
+ * @package   phing.parser
+ */
+
+class NestedElementHandler extends AbstractHandler {
+
+    /**
+     * Reference to the parent object that represents the parent tag
+     * of this nested element
+     * @var object
+     */
+    private $parent;
+
+    /**
+     * Reference to the child object that represents the child tag
+     * of this nested element
+     * @var object
+     */
+    private $child;
+
+    /**
+     *  Reference to the parent wrapper object
+     *  @var object
+     */
+    private $parentWrapper;
+
+    /**
+     *  Reference to the child wrapper object
+     *  @var object
+     */
+    private $childWrapper;
+
+    /**
+     *  Reference to the related target object
+     *  @var object the target instance
+     */
+    private $target;
+
+    /**
+     *  Constructs a new NestedElement handler and sets up everything.
+     *
+     *  @param  object  the ExpatParser object
+     *  @param  object  the parent handler that invoked this handler
+     *  @param  object  the ProjectConfigurator object
+     *  @param  object  the parent object this element is contained in
+     *  @param  object  the parent wrapper object
+     *  @param  object  the target object this task is contained in
+     *  @access public
+     */
+    function __construct($parser, $parentHandler, $configurator, $parent, $parentWrapper, $target) {
+        parent::__construct($parser, $parentHandler);
+        $this->configurator = $configurator;
+        if ($parent instanceof TaskAdapter) {
+            $this->parent = $parent->getProxy();
+        } else {
+            $this->parent = $parent;
+        }
+        $this->parentWrapper = $parentWrapper;
+        $this->target = $target;        
+    }
+
+    /**
+     * Executes initialization actions required to setup the data structures
+     * related to the tag.
+     * <p>
+     * This includes:
+     * <ul>
+     * <li>creation of the nested element</li>
+     * <li>calling the setters for attributes</li>
+     * <li>adding the element to the container object</li>
+     * <li>adding a reference to the element (if id attribute is given)</li>
+         * </ul>
+     *
+     * @param  string  the tag that comes in
+     * @param  array   attributes the tag carries
+     * @throws ExpatParseException if the setup process fails
+     * @access public
+     */
+    function init($propType, $attrs) {
+        $configurator = $this->configurator;
+        $project = $this->configurator->project;
+
+        // introspect the parent class that is custom
+        $parentClass = get_class($this->parent);
+        $ih = IntrospectionHelper::getHelper($parentClass);
+        try {
+            if ($this->parent instanceof UnknownElement) {
+                $this->child = new UnknownElement(strtolower($propType));
+                $this->parent->addChild($this->child);
+            } else {                
+                $this->child = $ih->createElement($project, $this->parent, strtolower($propType));
+            }
+            
+            $configurator->configureId($this->child, $attrs);
+            
+            if ($this->parentWrapper !== null) {
+                $this->childWrapper = new RuntimeConfigurable($this->child, $propType);
+                $this->childWrapper->setAttributes($attrs);
+                $this->parentWrapper->addChild($this->childWrapper);
+            } else {
+                $configurator->configure($this->child, $attrs, $project);
+                $ih->storeElement($project, $this->parent, $this->child, strtolower($propType));
+            }
+        } catch (BuildException $exc) {
+            throw new ExpatParseException("Error initializing nested element <$propType>", $exc, $this->parser->getLocation());
+        }
+    }
+
+    /**
+     * Handles character data.
+     *
+     * @param  string  the CDATA that comes in
+     * @throws ExpatParseException if the CDATA could not be set-up properly
+     * @access public
+     */
+    function characters($data) {
+
+        $configurator = $this->configurator;        
+        $project = $this->configurator->project;
+
+        if ($this->parentWrapper === null) {
+            try {                
+                $configurator->addText($project, $this->child, $data);
+            } catch (BuildException $exc) {
+                throw new ExpatParseException($exc->getMessage(), $this->parser->getLocation());
+            }
+        } else {                    
+            $this->childWrapper->addText($data);
+        }
+    }
+
+    /**
+     * Checks for nested tags within the current one. Creates and calls
+     * handlers respectively.
+     *
+     * @param  string  the tag that comes in
+     * @param  array   attributes the tag carries
+     * @access public
+     */
+    function startElement($name, $attrs) {
+        //print(get_class($this) . " name = $name, attrs = " . implode(",",$attrs) . "\n");
+		if ($this->child instanceof TaskContainer) {
+                // taskcontainer nested element can contain other tasks - no other
+                // nested elements possible
+			$tc = new TaskHandler($this->parser, $this, $this->configurator, $this->child, $this->childWrapper, $this->target);
+			$tc->init($name, $attrs);
+		} else {
+			$neh = new NestedElementHandler($this->parser, $this, $this->configurator, $this->child, $this->childWrapper, $this->target);
+        	$neh->init($name, $attrs);
+		}
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/NestedElementHandler.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ProjectConfigurator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ProjectConfigurator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ProjectConfigurator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,246 @@
+<?php
+/*
+ * $Id: ProjectConfigurator.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/system/io/BufferedReader.php';
+include_once 'phing/system/io/FileReader.php';
+include_once 'phing/BuildException.php';
+include_once 'phing/system/lang/FileNotFoundException.php';
+include_once 'phing/system/io/PhingFile.php';
+
+/**
+ * The datatype handler class.
+ *
+ * This class handles the occurance of registered datatype tags like
+ * FileSet
+ *
+ * @author      Andreas Aderhold <andi en binarycloud.com>
+ * @copyright © 2001,2002 THYRELL. All rights reserved
+ * @version   $Revision: 1.17 $ $Date$
+ * @access    public
+ * @package   phing.parser
+ */
+class ProjectConfigurator {
+
+    public $project;
+    public $locator;
+    
+    public $buildFile;
+    public $buildFileParent;
+        
+    /**
+     * Static call to ProjectConfigurator. Use this to configure a
+     * project. Do not use the new operator.
+     *
+     * @param  object  the Project instance this configurator should use
+     * @param  object  the buildfile object the parser should use
+     * @access public
+     */
+    public static function configureProject(Project $project, PhingFile $buildFile) {
+        $pc = new ProjectConfigurator($project, $buildFile);
+        $pc->parse();
+    }
+
+    /**
+     * Constructs a new ProjectConfigurator object
+     * This constructor is private. Use a static call to
+     * <code>configureProject</code> to configure a project.
+     *
+     * @param  object  the Project instance this configurator should use
+     * @param  object  the buildfile object the parser should use
+     * @access private
+     */
+    function __construct(Project $project, PhingFile $buildFile) {
+        $this->project = $project;
+        $this->buildFile = new PhingFile($buildFile->getAbsolutePath());
+        $this->buildFileParent = new PhingFile($this->buildFile->getParent());
+    }
+
+    /**
+     * Creates the ExpatParser, sets root handler and kick off parsing
+     * process.
+     *
+     * @throws BuildException if there is any kind of execption during
+     *         the parsing process
+     * @access private
+     */
+    protected function parse() {
+        try {
+            $reader = new BufferedReader(new FileReader($this->buildFile));
+            $reader->open();
+            $parser = new ExpatParser($reader);
+            $parser->parserSetOption(XML_OPTION_CASE_FOLDING,0);
+            $parser->setHandler(new RootHandler($parser, $this));
+            $this->project->log("parsing buildfile ".$this->buildFile->getName(), PROJECT_MSG_VERBOSE);
+            $parser->parse();
+            $reader->close();
+        } catch (Exception $exc) {
+            throw new BuildException("Error reading project file", $exc);
+        }
+    }
+
+    /**
+     * Configures an element and resolves eventually given properties.
+     *
+     * @param  object  the element to configure
+     * @param  array   the element's attributes
+     * @param  object  the project this element belongs to
+     * @throws Exception if arguments are not valid
+     * @throws BuildException if attributes can not be configured
+     * @access public
+     */
+    public static function configure($target, $attrs, Project $project) {               
+
+        if ($target instanceof TaskAdapter) {
+            $target = $target->getProxy();
+        }
+        
+		// if the target is an UnknownElement, this means that the tag had not been registered
+		// when the enclosing element (task, target, etc.) was configured.  It is possible, however, 
+		// that the tag was registered (e.g. using <taskdef>) after the original configuration.
+		// ... so, try to load it again:
+		if ($target instanceof UnknownElement) {
+			$tryTarget = $project->createTask($target->getTaskType());
+			if ($tryTarget) {
+				$target = $tryTarget;
+			}
+		}
+
+        $bean = get_class($target);
+        $ih = IntrospectionHelper::getHelper($bean);
+
+        foreach ($attrs as $key => $value) {
+            if ($key == 'id') {
+                continue;
+                // throw new BuildException("Id must be set Extermnally");
+            }            
+            $value = self::replaceProperties($project, $value, $project->getProperties());
+            try { // try to set the attribute
+                $ih->setAttribute($project, $target, strtolower($key), $value);
+            } catch (BuildException $be) {
+                // id attribute must be set externally
+                if ($key !== "id") {
+                    throw $be;
+                }
+            }
+        }
+    }
+
+    /**
+     * Configures the #CDATA of an element.
+     *
+     * @param  object  the project this element belongs to
+     * @param  object  the element to configure
+     * @param  string  the element's #CDATA
+     * @access public
+     */
+    public static function addText($project, $target, $text = null) {
+        if ($text === null || strlen(trim($text)) === 0) {
+            return;
+        }    
+        $ih = IntrospectionHelper::getHelper(get_class($target));
+        $text = self::replaceProperties($project, $text, $project->getProperties());
+        $ih->addText($project, $target, $text);
+    }
+
+    /**
+     * Stores a configured child element into its parent object
+     *
+     * @param  object  the project this element belongs to
+     * @param  object  the parent element
+     * @param  object  the child element
+     * @param  string  the XML tagname
+     * @access public
+     */
+    public static function storeChild($project, $parent, $child, $tag) {
+        $ih = IntrospectionHelper::getHelper(get_class($parent));
+        $ih->storeElement($project, $parent, $child, $tag);
+    }
+
+    // The following two properties are a sort of hack
+    // to enable a static function to serve as the callback
+    // for preg_replace_callback().  Clearly we cannot use object
+    // variables, since the replaceProperties() is called statically.
+    // This is IMO better than using global variables in the callback.
+    
+    private static $propReplaceProject;
+    private static $propReplaceProperties;
+         
+    /**
+     * Replace ${} style constructions in the given value with the
+     * string value of the corresponding data types. This method is
+     * static.
+     *
+     * @param  object  the project that should be used for property look-ups
+     * @param  string  the string to be scanned for property references
+     * @param  array   proeprty keys
+     * @return string  the replaced string or <code>null</code> if the string
+     *                 itself was null
+     */
+    public static function replaceProperties(Project $project, $value, $keys) {
+        
+        if ($value === null) {
+            return null;
+        }
+        
+        // These are a "hack" to support static callback for preg_replace_callback()
+        
+        // make sure these get initialized every time        
+        self::$propReplaceProperties = $keys;
+        self::$propReplaceProject = $project;
+        
+        // Because we're not doing anything special (like multiple passes),
+        // regex is the simplest / fastest.  PropertyTask, though, uses
+        // the old parsePropertyString() method, since it has more stringent
+        // requirements.
+        
+        $sb = preg_replace_callback('/\$\{([^}]+)\}/', array('ProjectConfigurator', 'replacePropertyCallback'), $value);
+        return $sb;        
+    }
+    
+    /**
+     * Private [static] function for use by preg_replace_callback to replace a single param.
+     * This method makes use of a static variable to hold the 
+     */
+    private static function replacePropertyCallback($matches)
+    {
+        $propertyName = $matches[1];
+        if (!isset(self::$propReplaceProperties[$propertyName])) {
+                    self::$propReplaceProject->log('Property ${'.$propertyName.'} has not been set.', PROJECT_MSG_VERBOSE);
+                    return $matches[0];
+        } else {
+			self::$propReplaceProject->log('Property ${'.$propertyName.'} => ' . self::$propReplaceProperties[$propertyName], PROJECT_MSG_DEBUG);
+		}
+        return self::$propReplaceProperties[$propertyName];
+    }           
+
+    /**
+     * Scan Attributes for the id attribute and maybe add a reference to
+     * project.
+     *
+     * @param object the element's object
+     * @param array  the element's attributes
+     */
+    function configureId(&$target, $attr) {
+        if (isset($attr['id']) && $attr['id'] !== null) {
+            $this->project->addReference($attr['id'], $target);
+        }
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ProjectConfigurator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ProjectHandler.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ProjectHandler.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ProjectHandler.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,146 @@
+<?php
+/*
+ * $Id: ProjectHandler.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/parser/AbstractHandler.php';
+require_once 'phing/system/io/PhingFile.php';
+
+/**
+ * Handler class for the <project> XML element This class handles all elements
+ * under the <project> element.
+ *
+ * @author      Andreas Aderhold <andi en binarycloud.com>
+ * @copyright (c) 2001,2002 THYRELL. All rights reserved
+ * @version   $Revision: 1.14 $ $Date$
+ * @access    public
+ * @package   phing.parser
+ */
+class ProjectHandler extends AbstractHandler {
+
+    /**
+     * The phing project configurator object.
+     * @var ProjectConfigurator
+     */
+    private $configurator;
+
+    /**
+     * Constructs a new ProjectHandler
+     *
+     * @param  object  the ExpatParser object
+     * @param  object  the parent handler that invoked this handler
+     * @param  object  the ProjectConfigurator object
+     * @access public
+     */
+    function __construct($parser, $parentHandler, $configurator) {
+        $this->configurator = $configurator;
+        parent::__construct($parser, $parentHandler);
+    }
+
+    /**
+     * Executes initialization actions required to setup the project. Usually
+     * this method handles the attributes of a tag.
+     *
+     * @param  string  the tag that comes in
+     * @param  array   attributes the tag carries
+     * @param  object  the ProjectConfigurator object
+     * @throws ExpatParseException if attributes are incomplete or invalid
+     * @access public
+     */
+    function init($tag, $attrs) {
+        $def = null;
+        $name = null;
+        $id    = null;
+        $baseDir = null;
+
+        // some shorthands
+        $project = $this->configurator->project;
+        $buildFileParent = $this->configurator->buildFileParent;
+
+        foreach ($attrs as $key => $value) {
+            if ($key === "default") {
+                $def = $value;
+            } elseif ($key === "name") {
+                $name = $value;
+            } elseif ($key === "id") {
+                $id = $value;
+            } elseif ($key === "basedir") {
+                $baseDir = $value;
+            } else {
+                throw new ExpatParseException("Unexpected attribute '$key'");
+            }
+        }
+        if ($def === null) {
+            throw new ExpatParseException("The default attribute of project is required");
+        }
+        $project->setDefaultTarget($def);
+
+        if ($name !== null) {
+            $project->setName($name);
+            $project->addReference($name, $project);
+        }
+
+        if ($id !== null) {
+            $project->addReference($id, $project);
+        }
+
+        if ($project->getProperty("project.basedir") !== null) {
+            $project->setBasedir($project->getProperty("project.basedir"));
+        } else {
+            if ($baseDir === null) {
+                $project->setBasedir($buildFileParent->getAbsolutePath());
+            } else {
+                // check whether the user has specified an absolute path
+                $f = new PhingFile($baseDir);
+                if ($f->isAbsolute()) {
+                    $project->setBasedir($baseDir);
+                } else {
+                    $project->setBaseDir($project->resolveFile($baseDir, $buildFileParent));
+                }
+            }
+        }
+    }
+
+    /**
+     * Handles start elements within the <project> tag by creating and
+     * calling the required handlers for the detected element.
+     *
+     * @param  string  the tag that comes in
+     * @param  array   attributes the tag carries
+     * @throws ExpatParseException if a unxepected element occurs
+     * @access public
+     */
+    function startElement($name, $attrs) {
+    
+		$project = $this->configurator->project;
+        $types = $project->getDataTypeDefinitions();
+		
+		if ($name == "target") {
+			$tf = new TargetHandler($this->parser, $this, $this->configurator);
+			$tf->init($name, $attrs);
+		} elseif (isset($types[$name])) {
+           $tyf = new DataTypeHandler($this->parser, $this, $this->configurator);
+           $tyf->init($name, $attrs);
+        } else {
+			$tf = new TaskHandler($this->parser, $this, $this->configurator);
+			$tf->init($name, $attrs);
+        }
+    }
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/ProjectHandler.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/RootHandler.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/RootHandler.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/RootHandler.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,82 @@
+<?php
+/*
+ *  $Id: RootHandler.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/parser/AbstractHandler.php';
+include_once 'phing/parser/ExpatParseException.php';
+include_once 'phing/parser/ProjectHandler.php';
+
+/**
+ * Root filter class for a phing buildfile.
+ *
+ * The root filter is called by the parser first. This is where the phing
+ * specific parsing starts. RootHandler decides what to do next.
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @copyright © 2001,2002 THYRELL. All rights reserved
+ * @version   $Revision: 1.7 $
+ * @package   phing.parser
+ */
+class RootHandler extends AbstractHandler {
+
+    /**
+     * The phing project configurator object
+     */
+    private $configurator;
+
+    /**
+     * Constructs a new RootHandler
+     *
+     * The root filter is required so the parser knows what to do. It's
+     * called by the ExpatParser that is instatiated in ProjectConfigurator.
+     *
+     * It recieves the expat parse object ref and a reference to the
+     * configurator
+     *
+     * @param AbstractSAXParser $parser The ExpatParser object.
+     * @param ProjectConfigurator $configurator The ProjectConfigurator object.
+     */
+    function __construct(AbstractSAXParser $parser, ProjectConfigurator $configurator) {
+        $this->configurator = $configurator;
+        parent::__construct($parser, $this);
+    }
+
+    /**
+     * Kick off a custom action for a start element tag.
+     *
+     * The root element of our buildfile is the &lt;project&gt; element. The
+     * root filter handles this element if it occurs, creates ProjectHandler 
+     * to handle any nested tags & attributes of the &lt;project&gt; tag,
+     * and calls init.
+     *
+     * @param string $tag The xml tagname
+     * @param array  $attrs The attributes of the tag
+     * @throws ExpatParseException if the first element within our build file
+     *         is not the &gt;project&lt; element
+     */
+    function startElement($tag, $attrs) {
+        if ($tag === "project") {
+            $ph = new ProjectHandler($this->parser, $this, $this->configurator);
+            $ph->init($tag, $attrs);
+        } else {
+            throw new ExpatParseException("Unexpected tag <$tag> in top-level of build file.", $this->parser->getLocation());
+        }
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/RootHandler.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/TargetHandler.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/TargetHandler.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/TargetHandler.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,149 @@
+<?php
+/*
+ * $Id: TargetHandler.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/parser/AbstractHandler.php';
+
+/**
+ * The target handler class.
+ *
+ * This class handles the occurance of a <target> tag and it's possible
+ * nested tags (datatypes and tasks).
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @copyright  2001,2002 THYRELL. All rights reserved
+ * @version   $Revision: 1.10 $
+ * @package   phing.parser
+ */
+class TargetHandler extends AbstractHandler {
+
+    /**
+     * Reference to the target object that represents the currently parsed
+     * target.
+     * @var object the target instance
+     */
+    private $target;
+
+    /**
+     * The phing project configurator object
+     * @var ProjectConfigurator
+     */
+    private $configurator;
+
+    /**
+     * Constructs a new TargetHandler
+     *
+     * @param  object  the ExpatParser object
+     * @param  object  the parent handler that invoked this handler
+     * @param  object  the ProjectConfigurator object
+     */
+    function __construct(AbstractSAXParser $parser, AbstractHandler $parentHandler, ProjectConfigurator $configurator) {
+        parent::__construct($parser, $parentHandler);
+        $this->configurator = $configurator;      
+    }
+
+    /**
+     * Executes initialization actions required to setup the data structures
+     * related to the tag.
+     * <p>
+     * This includes:
+     * <ul>
+     * <li>creation of the target object</li>
+     * <li>calling the setters for attributes</li>
+     * <li>adding the target to the project</li>
+     * <li>adding a reference to the target (if id attribute is given)</li>
+     * </ul>
+     *
+     * @param  string  the tag that comes in
+     * @param  array   attributes the tag carries
+     * @throws ExpatParseException if attributes are incomplete or invalid
+     */
+    function init($tag, $attrs) {
+        $name = null;
+        $depends = "";
+        $ifCond = null;
+        $unlessCond = null;
+        $id = null;
+        $description = null;
+
+        foreach($attrs as $key => $value) {
+            if ($key==="name") {
+                $name = (string) $value;
+            } else if ($key==="depends") {
+                $depends = (string) $value;
+            } else if ($key==="if") {
+                $ifCond = (string) $value;
+            } else if ($key==="unless") {
+                $unlessCond = (string) $value;
+            } else if ($key==="id") {
+                $id = (string) $value;
+            } else if ($key==="description") {
+                $description = (string)$value;
+            } else {
+                throw new ExpatParseException("Unexpected attribute '$key'", $this->parser->getLocation());
+            }
+        }
+
+        if ($name === null) {
+            throw new ExpatParseException("target element appears without a name attribute",  $this->parser->getLocation());
+        }
+
+        // shorthand
+        $project = $this->configurator->project;
+
+        $this->target = new Target();
+        $this->target->setName($name);
+        $this->target->setIf($ifCond);
+        $this->target->setUnless($unlessCond);
+        $this->target->setDescription($description);
+
+        $project->addTarget($name, $this->target);
+
+        if ($id !== null && $id !== "") {
+            $project->addReference($id, $this->target);
+        }
+        // take care of dependencies
+        if (strlen($depends) > 0) {
+            $this->target->setDepends($depends);
+        }
+
+    }
+
+    /**
+     * Checks for nested tags within the current one. Creates and calls
+     * handlers respectively.
+     *
+     * @param  string  the tag that comes in
+     * @param  array   attributes the tag carries
+     */
+    function startElement($name, $attrs) {
+        // shorthands
+        $project = $this->configurator->project;
+        $types = $project->getDataTypeDefinitions();
+
+        if (isset($types[$name])) {
+            $th = new DataTypeHandler($this->parser, $this, $this->configurator, $this->target);
+            $th->init($name, $attrs);
+        } else {
+            $tmp = new TaskHandler($this->parser, $this, $this->configurator, $this->target, null, $this->target);
+            $tmp->init($name, $attrs);
+        }
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/TargetHandler.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/TaskHandler.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/TaskHandler.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/TaskHandler.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,234 @@
+<?php
+/*
+ *  $Id: TaskHandler.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/UnknownElement.php';
+
+/**
+ * The task handler class.
+ *
+ * This class handles the occurance of a <task> tag and it's possible
+ * nested tags (datatypes and tasks) that may be unknown off bat and are
+ * initialized on the fly.
+ *
+ * @author      Andreas Aderhold <andi en binarycloud.com>
+ * @copyright © 2001,2002 THYRELL. All rights reserved
+ * @version   $Revision: 1.10 $
+ * @package   phing.parser
+ */
+class TaskHandler extends AbstractHandler {
+
+    /**
+     * Reference to the target object that contains the currently parsed
+     * task
+     * @var object the target instance
+     */
+    private $target;
+
+    /**
+     * Reference to the target object that represents the currently parsed
+     * target. This must not necessarily be a target, hence extra variable.
+     * @var object the target instance
+     */
+    private $container;
+
+    /**
+     * Reference to the task object that represents the currently parsed
+     * target.
+     * @var Task
+     */
+    private $task;
+	
+	/**
+ 	 * Wrapper for the parent element, if any. The wrapper for this
+	 * element will be added to this wrapper as a child.
+	 * @var RuntimeConfigurable
+	 */
+	private $parentWrapper;
+	
+	/**
+	 * Wrapper for this element which takes care of actually configuring
+	 * the element, if this element is contained within a target.
+	 * Otherwise the configuration is performed with the configure method.
+	 * @see ProjectHelper::configure(Object,AttributeList,Project)
+	 */
+    private $wrapper;
+
+    /**
+     * The phing project configurator object
+     * @var ProjectConfigurator
+     */
+    private $configurator;
+
+    /**
+     * Constructs a new TaskHandler and sets up everything.
+     *
+     * @param AbstractSAXParser The ExpatParser object
+     * @param object $parentHandler The parent handler that invoked this handler
+     * @param ProjectConfigurator $configurator
+     * @param TaskContainer $container The container object this task is contained in (null for top-level tasks).
+	 * @param RuntimeConfigurable $parentWrapper  Wrapper for the parent element, if any.
+     * @param Target $target The target object this task is contained in (null for top-level tasks).
+     */
+    function __construct(AbstractSAXParser $parser, $parentHandler, ProjectConfigurator $configurator, $container = null, $parentWrapper = null, $target = null) {
+        
+        parent::__construct($parser, $parentHandler);
+    
+        if (($container !== null) && !($container instanceof TaskContainer)) {
+            throw new Exception("Argument expected to be a TaskContainer, got something else");
+        }
+		if (($parentWrapper !== null) && !($parentWrapper instanceof RuntimeConfigurable)) {
+            throw new Exception("Argument expected to be a RuntimeConfigurable, got something else.");
+        }
+        if (($target !== null) && !($target instanceof Target)) {
+            throw new Exception("Argument expected to be a Target, got something else");
+        }
+
+		$this->configurator = $configurator;
+        $this->container = $container;
+		$this->parentWrapper = $parentWrapper;
+        $this->target = $target;
+    }
+
+    /**
+     * Executes initialization actions required to setup the data structures
+     * related to the tag.
+     * <p>
+     * This includes:
+     * <ul>
+     * <li>creation of the task object</li>
+     * <li>calling the setters for attributes</li>
+     * <li>adding the task to the container object</li>
+     * <li>adding a reference to the task (if id attribute is given)</li>
+     * <li>executing the task if the container is the &lt;project&gt;
+     * element</li>
+     * </ul>
+     *
+     * @param string $tag The tag that comes in
+     * @param array $attrs Attributes the tag carries
+     * @throws ExpatParseException if attributes are incomplete or invalid
+     */
+    function init($tag, $attrs) {
+        // shorthands
+        try {
+            $configurator = $this->configurator;
+            $project = $this->configurator->project;
+            
+            $this->task = $project->createTask($tag);
+        } catch (BuildException $be) {
+            // swallow here, will be thrown again in
+            // UnknownElement->maybeConfigure if the problem persists.
+            print("Swallowing exception: ".$be->getMessage() . "\n");
+        }
+
+        // the task is not known of bat, try to load it on thy fly
+        if ($this->task === null) {
+            $this->task = new UnknownElement($tag);
+            $this->task->setProject($project);
+            $this->task->setTaskType($tag);
+            $this->task->setTaskName($tag);
+        }
+
+        // add file position information to the task (from parser)
+        // should be used in task exceptions to provide details
+        $this->task->setLocation($this->parser->getLocation());
+        $configurator->configureId($task, $attrs);
+		
+		if ($this->container) {
+			$this->container->addTask($this->task);
+		}
+		
+        // Top level tasks don't have associated targets
+		// FIXME: if we do like Ant 1.6 and create an implicitTarget in the projectconfigurator object
+		// then we don't need to check for null here ... but there's a lot of stuff that will break if we
+		// do that at this point.
+        if ($this->target !== null) {
+            $this->task->setOwningTarget($this->target);
+            $this->task->init();
+            $this->wrapper = $this->task->getRuntimeConfigurableWrapper();
+            $this->wrapper->setAttributes($attrs);
+            /*
+			Commenting this out as per thread on Premature configurate of ReuntimeConfigurables 
+            with Matthias Pigulla: http://phing.tigris.org/servlets/ReadMsg?list=dev&msgNo=251
+            
+			if ($this->parentWrapper !== null) { // this may not make sense only within this if-block, but it
+												// seems to address current use cases adequately
+		    	$this->parentWrapper->addChild($this->wrapper);
+			}
+			*/
+        } else {
+            $this->task->init();
+            $configurator->configure($this->task, $attrs, $project);
+        }
+    }
+
+    /**
+     * Executes the task at once if it's directly beneath the <project> tag.
+     */
+    protected function finished() {
+        if ($this->task !== null && $this->target === null && $this->container === null) {
+            try {
+                $this->task->main();
+            } catch (Exception $e) {
+                $this->task->log($e->getMessage(), PROJECT_MSG_ERR);
+                throw $e;
+            }
+        }
+    }
+
+    /**
+     * Handles character data.
+     *
+     * @param string $data The CDATA that comes in
+     */
+    function characters($data) {
+        if ($this->wrapper === null) {
+            $configurator = $this->configurator;
+            $project = $this->configurator->project;
+            try { // try
+                $configurator->addText($project, $this->task, $data);
+            } catch (BuildException $exc) {
+                throw new ExpatParseException($exc->getMessage(), $this->parser->getLocation());
+            }
+        } else {
+            $this->wrapper->addText($data);
+        }
+    }
+
+    /**
+     * Checks for nested tags within the current one. Creates and calls
+     * handlers respectively.
+     *
+     * @param string $name The tag that comes in
+     * @param array $attrs Attributes the tag carries
+     */
+    function startElement($name, $attrs) {
+        $project = $this->configurator->project;
+        if ($this->task instanceof TaskContainer) {
+            //print("TaskHandler::startElement() (TaskContainer) name = $name, attrs = " . implode(",",$attrs) . "\n");
+            $th = new TaskHandler($this->parser, $this, $this->configurator, $this->task, $this->wrapper, $this->target);
+            $th->init($name, $attrs);
+        } else {
+            //print("TaskHandler::startElement() name = $name, attrs = " . implode(",",$attrs) . "\n");
+            $tmp = new NestedElementHandler($this->parser, $this, $this->configurator, $this->task, $this->wrapper, $this->target);
+            $tmp->init($name, $attrs);
+        }
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/parser/TaskHandler.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/BufferedReader.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/BufferedReader.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/BufferedReader.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,170 @@
+<?php
+/*
+ *  $Id: BufferedReader.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/system/io/Reader.php';
+
+/*
+ * Convenience class for reading files.
+ *
+ * @author    <a href="mailto:yl en seasonfive.com">Yannick Lecaillez</a>
+ * @version   $Revision: 1.6 $ $Date$
+ * @access    public
+ * @see       FilterReader
+ * @package   phing.system.io
+*/
+class BufferedReader extends Reader {
+
+    private $bufferSize = 0;
+    private $buffer     = null;
+    private $bufferPos  = 0;
+    
+    /**
+     * The Reader we are buffering for.
+     */
+    private $in;
+    
+    /**
+     * 
+     * @param object $reader The reader (e.g. FileReader).
+     * @param integer $buffsize The size of the buffer we should use for reading files.
+     *                             A large buffer ensures that most files (all scripts?) are parsed in 1 buffer.
+     */     
+    function __construct(Reader $reader, $buffsize = 65536) {
+        $this->in = $reader;
+        $this->bufferSize = $buffsize;
+    }
+
+    /**
+     * Reads and returns $_bufferSize chunk of data.
+     * @return mixed buffer or -1 if EOF.
+     */
+    function read($len = null) {
+        // ignore $len param, not sure how to hanlde it, since 
+        // this should only read bufferSize amount of data.
+        if ($len !== null) {
+            $this->currentPosition = ftell($this->fd);
+        }
+        
+        if ( ($data = $this->in->read($this->bufferSize)) !== -1 ) {
+		
+			// not all files end with a newline character, so we also need to check EOF
+			if (!$this->in->eof()) {
+			
+	            $notValidPart = strrchr($data, "\n");
+	            $notValidPartSize = strlen($notValidPart);
+	        
+	            if ( $notValidPartSize > 1 ) {
+	                // Block doesn't finish on a EOL
+	                // Find the last EOL and forgot all following stuff
+	                $dataSize = strlen($data);
+	                $validSize = $dataSize - $notValidPartSize + 1;
+	            
+	                $data = substr($data, 0, $validSize);
+	
+	                // Rewind to the begining of the forgotten stuff.
+	                $this->in->skip(-$notValidPartSize+1);
+	            }
+				
+			} // if !EOF
+        }
+        return $data;
+    }
+    
+    function skip($n) {
+        return $this->in->skip($n);
+    }
+    
+    function reset() {
+        return $this->in->reset();
+    }
+    
+    function close() {
+        return $this->in->close();
+    }
+    
+    function open() {
+        return $this->in->open();
+    }
+    
+    /**
+     * Read a line from input stream.
+     */
+    function readLine() {
+        $line = null;
+        while ( ($ch = $this->readChar()) !== -1 ) {
+            if ( $ch === "\n" ) {
+                break;
+            }
+            $line .= $ch;
+        }
+
+        // Warning : Not considering an empty line as an EOF
+        if ( $line === null && $ch !== -1 )
+            return "";
+
+        return $line;
+    }
+    
+    /**
+     * Reads a single char from the reader.
+     * @return string single char or -1 if EOF.
+     */
+    function readChar() {        
+
+        if ( $this->buffer === null ) {
+            // Buffer is empty, fill it ...
+            $read = $this->in->read($this->bufferSize);
+            if ($read === -1) {
+                $ch = -1;
+            } else {
+                $this->buffer = $read;
+                return $this->readChar(); // recurse
+            }
+        } else {            
+            // Get next buffered char ...
+            // handle case where buffer is read-in, but is empty.  The next readChar() will return -1 EOF,
+            // so we just return empty string (char) at this point.  (Probably could also return -1 ...?)
+            $ch = ($this->buffer !== "") ? $this->buffer{$this->bufferPos} : '';
+            $this->bufferPos++;
+            if ( $this->bufferPos >= strlen($this->buffer) ) {
+                $this->buffer = null;
+                $this->bufferPos = 0;
+            }
+        }
+
+        return $ch;
+    }
+    
+    /**
+     * Returns whether eof has been reached in stream.
+     * This is important, because filters may want to know if the end of the file (and not just buffer)
+     * has been reached.
+     * @return boolean
+     */ 
+    function eof() {
+        return $this->in->eof();
+    }
+
+    function getResource() {
+        return $this->in->getResource();
+    }    
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/BufferedReader.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/BufferedWriter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/BufferedWriter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/BufferedWriter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,72 @@
+<?php
+/*
+ *  $Id: BufferedWriter.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+ 
+include_once 'phing/system/io/Writer.php';
+
+/**
+ * Convenience class for writing files.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.10 $
+ * @package   phing.system.io 
+ */
+class BufferedWriter extends Writer {
+    
+    /**
+     * The size of the buffer in kb.
+     */
+    private $bufferSize    = 0;
+    
+    /**
+     * The Writer we are buffering output to.
+     */
+    private $out;
+
+    function __construct(Writer $writer, $buffsize = 8192) {
+        $this->out = $writer;
+        $this->bufferSize = $buffsize;
+    }
+
+    function write($buf, $off = null, $len = null) {
+        return $this->out->write($buf, $off, $len);
+    }
+    
+    function newLine() {
+        $this->write(Phing::getProperty('line.separator'));
+    }
+    
+    function getResource() {
+        return $this->out->getResource();
+    }
+
+    function reset() {
+        return $this->out->reset();
+    }
+    
+    function close() {
+        return $this->out->close();
+    }
+    
+    function open() {
+        return $this->out->open();
+    }
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/BufferedWriter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/ConsoleReader.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/ConsoleReader.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/ConsoleReader.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,84 @@
+<?php
+/*
+ *  $Id: ConsoleReader.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+ 
+include_once 'phing/system/io/Reader.php';
+
+/**
+ * Convenience class for reading console input.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @author Matthew Hershberger <matthewh en lightsp.com>
+ * @version $Revision: 1.4 $
+ * @package phing.system.io
+ */
+class ConsoleReader extends Reader {
+    
+    function readLine() {
+        
+        $out = fgets(STDIN); // note: default maxlen is 1kb
+        $out = rtrim($out);
+
+        return $out;
+    }
+    
+    /**
+     * 
+     * @param int $len Num chars to read.
+     * @return string chars read or -1 if eof.
+     */
+    function read($len = null) {
+        
+        $out = fread(STDIN, $len);
+        
+        
+        return $out;
+        // FIXME
+        // read by chars doesn't work (yet?) with PHP stdin.  Maybe
+        // this is just a language feature, maybe there's a way to get
+        // ability to read chars w/o <enter> ?
+        
+    }   
+        
+    function close() {
+		// STDIN is always open
+    }
+
+    function open() {
+		// STDIN is always open
+    }
+
+    /**
+     * Whether eof has been reached with stream.
+     * @return boolean
+     */
+    function eof() {
+        return feof(STDIN);
+    }        
+    
+    /**
+     * Returns path to file we are reading.
+     * @return string
+     */
+    function getResource() {
+        return "console";
+    }
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/ConsoleReader.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FileReader.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FileReader.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FileReader.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,179 @@
+<?php
+/*
+ *  $Id: FileReader.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+ 
+include_once 'phing/system/io/PhingFile.php';
+include_once 'phing/system/io/Reader.php';
+
+/**
+ * Convenience class for reading files. The constructor of this
+ *  @package   phing.system.io
+ */
+
+class FileReader extends Reader {
+
+    protected $file;
+    protected $fd;
+
+    protected $currentPosition = 0;
+    protected $mark = 0;
+
+    function __construct($file, $exclusive = false) {
+    
+        if ($file instanceof PhingFile) {
+            $this->file = $file;
+        } elseif (is_string($file)) {
+            $this->file = new PhingFile($file);
+        } else {
+            throw new Exception("Illegal argument type to " . __METHOD__);
+        }
+    }
+
+    function skip($n) {
+        $this->open();
+
+        $start = $this->currentPosition;
+
+        $ret = @fseek($this->fd, $n, SEEK_CUR);
+        if ( $ret === -1 )
+            return -1;
+
+        $this->currentPosition = ftell($this->fd);
+
+        if ( $start > $this->currentPosition )
+            $skipped = $start - $this->currentPosition;
+        else
+            $skipped = $this->currentPosition - $start;
+
+        return $skipped;
+    }
+    
+    /**
+     * Read data from file.
+     * @param int $len Num chars to read.
+     * @return string chars read or -1 if eof.
+     */
+    function read($len = null) {
+        $this->open();
+        if (feof($this->fd)) {
+            return -1;
+        }
+
+        // Compute length to read
+        // possible that filesize($this->file) will be larger than 
+        // available bytes to read, but that's fine -- better to err on high end
+        $length = ($len === null) ? filesize($this->file->getAbsolutePath()) : $len;
+
+        // Read data
+        $out = fread($this->fd, $length + 1); // adding 1 seems to ensure that next call to read() will return EOF (-1)
+        $this->currentPosition = ftell($this->fd);
+
+        return $out;
+    }    
+    
+    function mark($n = null) {
+        $this->mark = $this->currentPosition;
+    }
+    
+    function reset() {
+        // goes back to last mark, by default this would be 0 (i.e. rewind file).
+        fseek($this->fd, SEEK_SET, $this->mark);
+        $this->mark = 0;
+    }
+
+    function close() {
+        if ($this->fd === null) {
+            return true;
+        }
+
+        if (false === @fclose($this->fd)) {
+            // FAILED.
+            $msg = "Cannot fclose " . $this->file->__toString() . " $php_errormsg";
+            throw new IOException($msg);
+        } else {
+            $this->fd = null;
+            return true;
+        }
+    }
+
+    function open() {
+        global $php_errormsg;
+        
+        if ($this->fd === null) {
+            $this->fd = @fopen($this->file->getAbsolutePath(), "rb");
+        }
+
+        if ($this->fd === false) {
+            // fopen FAILED.
+            // Add error from php to end of log message. $php_errormsg.
+            $msg = "Cannot fopen ".$this->file->getAbsolutePath().". $php_errormsg";
+            throw new IOException($msg);
+        }
+
+        if (false) {
+            // Locks don't seem to work on windows??? HELP!!!!!!!!!
+            // if (FALSE === @flock($fp, LOCK_EX)) { // FAILED.
+            $msg = "Cannot acquire flock on $file. $php_errormsg";
+            throw new IOException($msg);
+        }
+
+        return true;
+    }
+
+    /**
+     * Whether eof has been reached with stream.
+     * @return boolean
+     */
+    function eof() {
+        return feof($this->fd);
+    }
+     
+    /**
+     * Reads a entire file and stores the data in the variable
+     * passed by reference.
+     *
+     * @param    string $file    String. Path and/or name of file to read.
+     * @param    object &$rBuffer    Reference. Variable of where to put contents.
+     *
+     * @return    TRUE on success. Err object on failure.
+     * @author  Charlie Killian, charlie en tizac.com
+     */
+    function readInto(&$rBuffer) {
+
+        $this->open();
+
+        $fileSize = $this->file->length();
+        if ($fileSize === false) {
+            $msg = "Cannot get filesize of " . $this->file->__toString() . " $php_errormsg";
+            throw new IOException($msg);
+        }
+        $rBuffer = fread($this->fd, $fileSize);
+        $this->close();
+    }
+    
+    /**
+     * Returns path to file we are reading.
+     * @return string
+     */
+    function getResource() {
+        return $this->file->toString();
+    }
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FileReader.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FileSystem.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FileSystem.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FileSystem.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,657 @@
+<?php
+
+/* 
+ *  $Id: FileSystem.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+/**
+ * This is an abstract class for platform specific filesystem implementations
+ * you have to implement each method in the platform specific filesystem implementation
+ * classes Your local filesytem implementation must extend this class.
+ * You should also use this class as a template to write your local implementation
+ * Some native PHP filesystem specific methods are abstracted here as well. Anyway
+ * you _must_ always use this methods via a PhingFile object (that by nature uses the
+ * *FileSystem drivers to access the real filesystem via this class using natives.
+ *
+ * FIXME:
+ *  - Error handling reduced to min fallthrough runtime excetions
+ *    more precise errorhandling is done by the PhingFile class
+ *    
+ * @author Charlie Killian <charlie en tizac.com>
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 1.11 $
+ * @package phing.system.io
+ */
+abstract class FileSystem {    
+
+    /* properties for simple boolean attributes */
+    const BA_EXISTS    = 0x01;
+    const BA_REGULAR   = 0x02;
+    const BA_DIRECTORY = 0x04;
+    const BA_HIDDEN    = 0x08;
+    
+    /** Instance for getFileSystem() method. */
+    private static $fs;
+    
+    /**
+     * Static method to return the FileSystem singelton representing
+     * this platform's local filesystem driver.
+     */
+    public static function getFileSystem() {
+        if (self::$fs === null) {
+            switch(Phing::getProperty('host.fstype')) {
+                case 'UNIX':
+                    include_once 'phing/system/io/UnixFileSystem.php';
+                    self::$fs = new UnixFileSystem();
+                break;
+                case 'WIN32':
+                    include_once 'phing/system/io/Win32FileSystem.php';
+                    self::$fs = new Win32FileSystem();
+                break;
+                case 'WINNT':
+                    include_once 'phing/system/io/WinNTFileSystem.php';
+                    self::$fs = new WinNTFileSystem();
+                break;
+                default:
+                    throw new Exception("Host uses unsupported filesystem, unable to proceed");
+            }
+        }
+        return self::$fs;
+    }
+
+    /* -- Normalization and construction -- */
+
+    /**
+     * Return the local filesystem's name-separator character.
+     */
+    abstract function getSeparator();
+
+    /**
+     * Return the local filesystem's path-separator character.
+     */
+    abstract function getPathSeparator();
+
+    /**
+     * Convert the given pathname string to normal form.  If the string is
+     * already in normal form then it is simply returned.
+     */
+    abstract function normalize($strPath);
+
+    /**
+     * Compute the length of this pathname string's prefix.  The pathname
+     * string must be in normal form.
+     */
+    abstract function prefixLength($pathname);
+
+    /**
+     * Resolve the child pathname string against the parent.
+     * Both strings must be in normal form, and the result
+     * will be a string in normal form.
+     */
+    abstract function resolve($parent, $child);
+    
+    /**
+     * Resolve the given abstract pathname into absolute form.  Invoked by the
+     * getAbsolutePath and getCanonicalPath methods in the PhingFile class.
+     */
+    abstract function resolveFile(PhingFile $f);
+
+    /**
+     * Return the parent pathname string to be used when the parent-directory
+     * argument in one of the two-argument PhingFile constructors is the empty
+     * pathname.
+     */
+    abstract function getDefaultParent();
+
+    /**
+     * Post-process the given URI path string if necessary.  This is used on
+     * win32, e.g., to transform "/c:/foo" into "c:/foo".  The path string
+     * still has slash separators; code in the PhingFile class will translate them
+     * after this method returns.
+     */
+    abstract function fromURIPath($path);
+
+    /* -- Path operations -- */
+
+    /**
+     * Tell whether or not the given abstract pathname is absolute.
+     */
+    abstract function isAbsolute(PhingFile $f);
+
+    /** 
+     * canonicalize filename by checking on disk 
+     * @return mixed Canonical path or false if the file doesn't exist.
+     */
+    function canonicalize($strPath) {
+        return @realpath($strPath);        
+    }
+
+    /* -- Attribute accessors -- */
+
+    /**
+     * Return the simple boolean attributes for the file or directory denoted
+     * by the given abstract pathname, or zero if it does not exist or some
+     * other I/O error occurs.
+     */
+    function getBooleanAttributes($f) {
+        throw new Exception("SYSTEM ERROR method getBooleanAttributes() not implemented by fs driver");
+    }
+
+    /**
+     * Check whether the file or directory denoted by the given abstract
+     * pathname may be accessed by this process.  If the second argument is
+     * false, then a check for read access is made; if the second
+     * argument is true, then a check for write (not read-write)
+     * access is made.  Return false if access is denied or an I/O error
+     * occurs.
+     */
+    function checkAccess(PhingFile $f, $write = false) {
+        // we clear stat cache, its expensive to look up from scratch,
+        // but we need to be sure
+        @clearstatcache();
+
+
+        // Shouldn't this be $f->GetAbsolutePath() ?
+        // And why doesn't GetAbsolutePath() work?
+
+        $strPath = (string) $f->getPath();
+
+        // FIXME
+        // if file object does denote a file that yet not existst
+        // path rights are checked
+        if (!@file_exists($strPath) && !is_dir($strPath)) {
+            $strPath = $f->getParent();
+            if ($strPath === null || !is_dir($strPath)) {
+                $strPath = Phing::getProperty("user.dir");
+            }
+            //$strPath = dirname($strPath);
+        }
+
+        if (!$write) {
+            return (boolean) @is_readable($strPath);
+        } else {
+            return (boolean) @is_writable($strPath);
+        }
+    }
+
+    /**
+     * Return the time at which the file or directory denoted by the given
+     * abstract pathname was last modified, or zero if it does not exist or
+     * some other I/O error occurs.
+     */
+    function getLastModifiedTime(PhingFile $f) {
+        
+        if (!$f->exists()) {
+            return 0;
+        }
+
+        @clearstatcache();
+        $strPath = (string) $f->getPath();
+        $mtime = @filemtime($strPath);
+        if (false === $mtime) {
+            // FAILED. Log and return err.
+            $msg = "FileSystem::Filemtime() FAILED. Cannot can not get modified time of $strPath. $php_errormsg";
+            throw new Exception($msg);
+        } else {
+            return (int) $mtime;
+        }
+    }
+
+    /**
+     * Return the length in bytes of the file denoted by the given abstract
+     * pathname, or zero if it does not exist, is a directory, or some other
+     * I/O error occurs.
+     */
+    function getLength(PhingFile $f) {
+        $strPath = (string) $f->getAbsolutePath();
+        $fs = filesize((string) $strPath);
+        if ($fs !== false) {
+            return $fs;
+        } else {
+            $msg = "FileSystem::Read() FAILED. Cannot get filesize of $strPath. $php_errormsg";
+            throw new Exception($msg);
+        }
+    }
+
+    /* -- File operations -- */
+
+    /**
+     * Create a new empty file with the given pathname.  Return
+     * true if the file was created and false if a
+     * file or directory with the given pathname already exists.  Throw an
+     * IOException if an I/O error occurs.
+     *
+     * @param       string      Path of the file to be created.
+     *     
+     * @throws      IOException
+     */
+    function createNewFile($strPathname) {
+        if (@file_exists($strPathname))
+            return false;
+            
+        // Create new file
+        $fp = @fopen($strPathname, "w");
+        if ($fp === false) {
+            throw new IOException("The file \"$strPathname\" could not be created");            
+        }
+        @fclose($fp);        
+        return true;
+    }
+
+    /**
+     * Delete the file or directory denoted by the given abstract pathname,
+     * returning true if and only if the operation succeeds.
+     */
+    function delete(PhingFile $f) {
+        if ($f->isDirectory()) {
+            return $this->rmdir($f->getPath());
+        } else {
+            return $this->unlink($f->getPath());
+        }
+    }
+
+    /**
+     * Arrange for the file or directory denoted by the given abstract
+     * pathname to be deleted when Phing::shutdown is called, returning
+    * true if and only if the operation succeeds.
+     */
+    function deleteOnExit($f) {
+        throw new Exception("deleteOnExit() not implemented by local fs driver");
+    }
+
+    /**
+     * List the elements of the directory denoted by the given abstract
+     * pathname.  Return an array of strings naming the elements of the
+     * directory if successful; otherwise, return <code>null</code>.
+     */
+    function listDir(PhingFile $f) {
+        $strPath = (string) $f->getAbsolutePath();
+        $d = @dir($strPath);
+        if (!$d) {
+            return null;
+        }
+        $list = array();
+        while($entry = $d->read()) {
+            if ($entry != "." && $entry != "..") {
+                array_push($list, $entry);
+            }
+        }
+        $d->close();
+        unset($d);
+        return $list;
+    }
+
+    /**
+     * Create a new directory denoted by the given abstract pathname,
+     * returning true if and only if the operation succeeds.
+     */
+    function createDirectory(&$f) {
+        return @mkdir($f->getAbsolutePath(),0755);
+    }
+
+    /**
+     * Rename the file or directory denoted by the first abstract pathname to
+     * the second abstract pathname, returning true if and only if
+     * the operation succeeds.
+     *
+     * @param PhingFile $f1 abstract source file
+     * @param PhingFile $f2 abstract destination file
+     * @return void    
+     * @throws Exception if rename cannot be performed
+     */
+    function rename(PhingFile $f1, PhingFile $f2) {        
+        // get the canonical paths of the file to rename
+        $src = $f1->getAbsolutePath();
+        $dest = $f2->getAbsolutePath();
+        if (false === @rename($src, $dest)) {
+            $msg = "Rename FAILED. Cannot rename $src to $dest. $php_errormsg";
+            throw new Exception($msg);
+        }
+    }
+
+    /**
+     * Set the last-modified time of the file or directory denoted by the
+     * given abstract pathname returning true if and only if the
+     * operation succeeds.
+     * @return void
+     * @throws Exception
+     */
+    function setLastModifiedTime(PhingFile $f, $time) {        
+        $path = $f->getPath();
+        $success = @touch($path, $time);
+        if (!$success) {
+            throw new Exception("Could not create directory due to: $php_errormsg");
+        }
+    }
+
+    /**
+     * Mark the file or directory denoted by the given abstract pathname as
+     * read-only, returning <code>true</code> if and only if the operation
+     * succeeds.
+     */
+    function setReadOnly($f) {
+        throw new Exception("setReadonle() not implemented by local fs driver");
+    }
+
+    /* -- Filesystem interface -- */
+
+    /**
+     * List the available filesystem roots, return array of PhingFile objects
+     */
+    function listRoots() {
+        throw new Exception("SYSTEM ERROR [listRoots() not implemented by local fs driver]");
+    }
+
+    /* -- Basic infrastructure -- */
+
+    /**
+     * Compare two abstract pathnames lexicographically.
+     */
+    function compare($f1, $f2) {
+        throw new Exception("SYSTEM ERROR [compare() not implemented by local fs driver]");
+    }
+
+    /**
+     * Copy a file.
+     *
+     * @param PhingFile $src Source path and name file to copy.
+     * @param PhingFile $dest Destination path and name of new file.
+     *
+     * @return void     
+     * @throws Exception if file cannot be copied.
+     */
+    function copy(PhingFile $src, PhingFile $dest) {
+        global $php_errormsg;
+        $srcPath  = $src->getAbsolutePath();
+        $destPath = $dest->getAbsolutePath();
+
+        if (false === @copy($srcPath, $destPath)) { // Copy FAILED. Log and return err.
+            // Add error from php to end of log message. $php_errormsg.
+            $msg = "FileSystem::copy() FAILED. Cannot copy $srcPath to $destPath. $php_errormsg";
+            throw new Exception($msg);
+        }
+        
+        try {
+            $dest->setMode($src->getMode());
+        } catch(Exception $exc) {
+            // [MA] does chmod returns an error on systems that do not support it ?
+            // eat it up for now.
+        }
+    }
+
+    /**
+     * Change the permissions on a file or directory.
+     *
+     * @param    pathname    String. Path and name of file or directory.
+     * @param    mode        Int. The mode (permissions) of the file or
+     *                        directory. If using octal add leading 0. eg. 0777.
+     *                        Mode is affected by the umask system setting.
+     *
+     * @return void     
+     * @throws Exception if operation failed.
+     */
+    function chmod($pathname, $mode) {    
+        $str_mode = decoct($mode); // Show octal in messages.    
+        if (false === @chmod($pathname, $mode)) {// FAILED.
+            $msg = "FileSystem::chmod() FAILED. Cannot chmod $pathname. Mode $str_mode. $php_errormsg";
+            throw new Exception($msg);
+        }
+    }
+
+    /**
+     * Locks a file and throws an Exception if this is not possible.
+     * @return void
+     * @throws Exception
+     */
+    function lock(PhingFile $f) {
+        $filename = $f->getPath();
+        $fp = @fopen($filename, "w");
+        $result = @flock($fp, LOCK_EX);
+        @fclose($fp);
+        if (!$result) {
+            throw new Exception("Could not lock file '$filename'");
+        }
+    }
+
+    /**
+     * Unlocks a file and throws an IO Error if this is not possible.
+     *
+     * @throws Exception
+     * @return void
+     */
+    function unlock(PhingFile $f) {
+        $filename = $f->getPath();
+        $fp = @fopen($filename, "w");
+        $result = @flock($fp, LOCK_UN);
+        fclose($fp);
+        if (!$result) {
+            throw new Exception("Could not unlock file '$filename'");
+        }
+    }
+
+    /**
+     * Delete a file.
+     *
+     * @param    file    String. Path and/or name of file to delete.
+     *
+     * @return void
+     * @throws Exception - if an error is encountered.
+     */
+    function unlink($file) {
+        global $php_errormsg;
+        if (false === @unlink($file)) {
+            $msg = "FileSystem::unlink() FAILED. Cannot unlink '$file'. $php_errormsg";
+            throw new Exception($msg);
+        }
+    }
+
+    /**
+     * Symbolically link a file to another name.
+     * 
+     * Currently symlink is not implemented on Windows. Don't use if the application is to be portable.
+     *
+     * @param string $target Path and/or name of file to link.
+     * @param string $link Path and/or name of link to be created.
+     * @return void
+     */
+    function symlink($target, $link) {
+    
+        // If Windows OS then symlink() will report it is not supported in
+        // the build. Use this error instead of checking for Windows as the OS.
+
+        if (false === @symlink($target, $link)) {
+            // Add error from php to end of log message. $php_errormsg.
+            $msg = "FileSystem::Symlink() FAILED. Cannot symlink '$target' to '$link'. $php_errormsg";
+            throw new Exception($msg);
+        }
+
+    }
+
+    /**
+     * Set the modification and access time on a file to the present time.
+     *
+     * @param string $file Path and/or name of file to touch.
+     * @param int $time 
+     * @return void
+     */
+    function touch($file, $time = null) {
+        global $php_errormsg;
+        
+        if (null === $time) {
+            $error = @touch($file);
+        } else {
+            $error = @touch($file, $time);
+        }
+
+        if (false === $error) { // FAILED.
+            // Add error from php to end of log message. $php_errormsg.
+            $msg = "FileSystem::touch() FAILED. Cannot touch '$file'. $php_errormsg";            
+            throw new Exception($msg);            
+        }
+    }
+
+    /**
+     * Delete an empty directory OR a directory and all of its contents.
+     *
+     * @param    dir    String. Path and/or name of directory to delete.
+     * @param    children    Boolean.    False: don't delete directory contents.
+     *                                    True: delete directory contents.
+     *
+     * @return void
+     */
+    function rmdir($dir, $children = false) {
+        global $php_errormsg;
+        
+        // If children=FALSE only delete dir if empty.
+        if (false === $children) {
+        
+            if (false === @rmdir($dir)) { // FAILED.
+                // Add error from php to end of log message. $php_errormsg.
+                $msg = "FileSystem::rmdir() FAILED. Cannot rmdir $dir. $php_errormsg";
+                throw new Exception($msg);
+            }
+            
+        } else { // delete contents and dir.
+
+            $handle = @opendir($dir);
+
+            if (false === $handle) { // Error.
+
+                $msg = "FileSystem::rmdir() FAILED. Cannot opendir() $dir. $php_errormsg";                
+                throw new Exception($msg);
+
+            } else { // Read from handle.
+
+                // Don't error on readdir().
+                while (false !== ($entry = @readdir($handle))) {
+
+                    if ($entry != '.' && $entry != '..') {
+
+                        // Only add / if it isn't already the last char.
+                        // This ONLY serves the purpose of making the Logger
+                        // output look nice:)
+
+                        if (strpos(strrev($dir), DIRECTORY_SEPARATOR) === 0) {// there is a /
+                            $next_entry = $dir . $entry;
+                        } else { // no /
+                            $next_entry = $dir . DIRECTORY_SEPARATOR . $entry;
+                        }
+
+                        // NOTE: As of php 4.1.1 is_dir doesn't return FALSE it
+                        // returns 0. So use == not ===.
+
+                        // Don't error on is_dir()
+                        if (false == @is_dir($next_entry)) { // Is file.
+                            
+                            try {
+                                self::unlink($next_entry); // Delete.
+                            } catch (Exception $e) {                            
+                                $msg = "FileSystem::Rmdir() FAILED. Cannot FileSystem::Unlink() $next_entry. ". $e->getMessage();
+                                throw new Exception($msg);
+                            }
+
+                        } else { // Is directory.
+                            
+                            try {
+                                self::rmdir($next_entry, true); // Delete
+                            } catch (Exception $e) {
+                                $msg = "FileSystem::rmdir() FAILED. Cannot FileSystem::rmdir() $next_entry. ". $e->getMessage();
+                                throw new Exception($msg);
+                            }
+
+                        } // end is_dir else
+                    } // end .. if
+                } // end while
+            } // end handle if
+
+            // Don't error on closedir()
+            @closedir($handle);
+            
+            if (false === @rmdir($dir)) { // FAILED.
+                // Add error from php to end of log message. $php_errormsg.
+                $msg = "FileSystem::rmdir() FAILED. Cannot rmdir $dir. $php_errormsg";
+                throw new Exception($msg);
+            }
+            
+        }
+                
+    }
+
+    /**
+     * Set the umask for file and directory creation.
+     *
+     * @param    mode    Int. Permissions ususally in ocatal. Use leading 0 for
+     *                    octal. Number between 0 and 0777.
+     *
+     * @return void
+     * @throws Exception if there is an error performing operation.     
+     */
+    function umask($mode) {
+        global $php_errormsg;
+        
+        // CONSIDERME:
+        // Throw a warning if mode is 0. PHP converts illegal octal numbers to
+        // 0 so 0 might not be what the user intended.
+                        
+        $str_mode = decoct($mode); // Show octal in messages.
+
+        if (false === @umask($mode)) { // FAILED.
+            // Add error from php to end of log message. $php_errormsg.
+            $msg = "FileSystem::Umask() FAILED. Value $mode. $php_errormsg";
+            throw new Exception($msg);
+        }
+    }
+
+    /**
+     * Compare the modified time of two files.
+     *
+     * @param    file1    String. Path and name of file1.
+     * @param    file2    String. Path and name of file2.
+     *
+     * @return    Int.     1 if file1 is newer.
+     *                 -1 if file2 is newer.
+     *                  0 if files have the same time.
+     *                  Err object on failure.
+     *     
+     * @throws Exception - if cannot get modified time of either file.
+     */
+    function compareMTimes($file1, $file2) {
+
+        $mtime1 = filemtime($file1);
+        $mtime2 = filemtime($file2);
+
+        if ($mtime1 === false) { // FAILED. Log and return err.        
+            // Add error from php to end of log message. $php_errormsg.
+            $msg = "FileSystem::compareMTimes() FAILED. Cannot can not get modified time of $file1.";
+            throw new Exception($msg);            
+        } elseif ($mtime2 === false) { // FAILED. Log and return err.
+            // Add error from php to end of log message. $php_errormsg.
+            $msg = "FileSystem::compareMTimes() FAILED. Cannot can not get modified time of $file2.";
+            throw new Exception($msg);
+        } else { // Worked. Log and return compare.                
+            // Compare mtimes.
+            if ($mtime1 == $mtime2) {
+                return 0;
+            } else {
+                return ($mtime1 < $mtime2) ? -1 : 1;
+            } // end compare
+        }
+    }
+        
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FileSystem.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FileWriter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FileWriter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FileWriter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,139 @@
+<?php
+/*
+ *  $Id: FileWriter.php 3076 2006-12-18 08:52:12Z fabien $  
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+include_once 'phing/system/io/PhingFile.php';
+include_once 'phing/system/io/Writer.php';
+
+/**
+ * Convenience class for reading files. The constructor of this
+ *
+ * @package   phing.system.io
+ */
+class FileWriter extends Writer {
+
+    protected $file;
+    protected $fd;
+    
+    /** Whether to append contents to file. */
+    protected $append;
+    
+    /** Whether we should attempt to lock the file (currently disabled). */
+    protected $exclusive;
+    
+    /**
+     * Construct a new FileWriter.
+     * @param mixed $file PhingFile or string pathname.
+     * @param boolean $append Append to existing file?
+     * @param boolean $exclusive Lock file? (currently disabled due to windows incompatibility)
+     */
+    function __construct($file, $append = false, $exclusive = false) {
+        if ($file instanceof PhingFile) {
+            $this->file = $file;
+        } elseif (is_string($file)) {
+            $this->file = new PhingFile($file);
+        } else {
+            throw new Exception("Invalid argument type for \$file.");
+        }
+        $this->append = $append;
+        $this->exclusive = $exclusive;
+    }
+
+    function close() {
+        if ($this->fd === null) {
+            return true;
+        }
+
+        if (false === @fclose($this->fd)) {
+            // FAILED.
+            $msg = "Cannot fclose " . $this->file->__toString() . " $php_errormsg";
+            throw new IOException($msg);
+        } else {
+            $this->fd = null;
+            return true;
+        }
+    }
+
+    function open() {
+        if ($this->fd === null) {
+            if ($this->append) { $flags = "ab"; } else { $flags = "wb"; }
+            $this->fd = @fopen($this->file->getPath(), $flags);
+        }
+
+        if ($this->fd === false) {
+            // fopen FAILED.
+            // Add error from php to end of log message. $php_errormsg.
+            $msg = "Cannot fopen ".$this->file->getPath()." $php_errormsg";
+            throw new IOException($msg);
+        }
+
+        if (false) {
+            // Locks don't seem to work on windows??? HELP!!!!!!!!!
+            // if (FALSE === @flock($fp, LOCK_EX)) { // FAILED.
+            $msg = "Cannot acquire flock on $file. $php_errormsg";
+            throw new IOException($msg);
+        }
+
+        return true;
+    }
+    
+    function reset() {
+        // FIXME -- what exactly should this do, if anything?
+        // reset to beginning of file (i.e. re-open)?
+    }
+    
+    function writeBuffer($buffer) {
+
+        if (!$this->file->canWrite()) {
+            throw new IOException("No permission to write to file: " . $this->file->__toString());
+        }
+
+        $this->open();
+        $result = @fwrite($this->fd, $buffer);
+        $this->close();
+
+        if ($result === false) {
+            throw new IOException("Error writing file: ". $this->file->toString());
+        } else {
+            return true;
+        }
+    }
+
+    function write($buf, $off = null, $len = null) {
+        if ( $off === null && $len === null )
+            $to_write = $buf;
+        else
+            $to_write = substr($buf, $off, $len);
+
+        $this->open();
+        $result = @fwrite($this->fd, $to_write);
+
+        if ( $result === false ) {
+            throw new IOException("Error writing file.");
+        } else {
+            return true;
+        }
+    }
+    
+    function getResource() {
+        return $this->file->toString();
+    }
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FileWriter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FilterReader.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FilterReader.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FilterReader.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,72 @@
+<?php
+/*
+ *  $Id: FilterReader.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+include_once 'phing/system/io/Reader.php';
+
+/**
+ * Convenience class for reading files. The constructor of this
+ *  @package   phing.system.io
+ *
+ * TODO: All filters should be ProjectComponents, too!
+ */
+class FilterReader extends Reader {
+    
+    protected $in;
+    
+    function __construct(Reader $in = null) {
+        $this->in = $in;
+        //parent::__construct(new FileReader($file, $exclusive));
+    }
+    
+    public function setReader(Reader $in) {
+        $this->in = $in;
+    }
+    
+    public function skip($n) {
+        return $this->in->skip($n);
+    }
+    
+    /**
+     * Read data from source.
+     * FIXME: Clean up this function signature, as it a) params aren't being used
+     * and b) it doesn't make much sense.
+     */
+    public function read($len = null) {
+        return $this->in->read($len);
+    }
+
+    public function reset() {
+        return $this->in->reset();
+    }
+    
+    public function close() {
+        return $this->in->close();
+    }
+    
+    public function open() {
+        return $this->in->open();
+    }
+
+    function getResource() {
+        return $this->in->getResource();
+    }
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/FilterReader.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/IOException.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/IOException.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/IOException.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,28 @@
+<?php
+/*
+ *  $Id: IOException.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+/**
+ * Extends Exception to take advantage of methods therein.
+ *
+ * @package   phing.system.io
+ */
+class IOException extends Exception {}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/IOException.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/PhingFile.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/PhingFile.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/PhingFile.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,866 @@
+<?php
+/*
+ *  $Id: PhingFile.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/system/io/FileSystem.php';
+include_once 'phing/system/lang/NullPointerException.php';
+
+/**
+ * An abstract representation of file and directory pathnames.
+ *
+ * @version   $Revision: 1.1 $
+ * @package   phing.system.io
+ */
+class PhingFile {
+
+    /** separator string, static, obtained from FileSystem */
+    public static $separator;
+
+    /** path separator string, static, obtained from FileSystem (; or :)*/
+    public static $pathSeparator;
+    
+    /**
+     * This abstract pathname's normalized pathname string.  A normalized
+     * pathname string uses the default name-separator character and does not
+     * contain any duplicate or redundant separators.
+     */
+    private $path = null;
+
+    /** The length of this abstract pathname's prefix, or zero if it has no prefix. */
+    private $prefixLength = 0;
+
+    /** constructor */
+    function __construct($arg1 = null, $arg2 = null) {
+        
+        if (self::$separator === null || self::$pathSeparator === null) {
+            $fs = FileSystem::getFileSystem();
+            self::$separator = $fs->getSeparator();
+            self::$pathSeparator = $fs->getPathSeparator();
+        }
+
+        /* simulate signature identified constructors */
+        if ($arg1 instanceof PhingFile && is_string($arg2)) {
+            $this->_constructFileParentStringChild($arg1, $arg2);
+        } elseif (is_string($arg1) && ($arg2 === null)) {
+            $this->_constructPathname($arg1);
+        } elseif(is_string($arg1) && is_string($arg2)) {
+            $this->_constructStringParentStringChild($arg1, $arg2);
+        } else {
+            if ($arg1 === null) {
+                throw new NullPointerException("Argument1 to function must not be null");
+            }
+            $this->path = (string) $arg1;
+            $this->prefixLength = (int) $arg2;
+        }
+    }
+
+    /** Returns the length of this abstract pathname's prefix. */
+    function getPrefixLength() {
+        return (int) $this->prefixLength;
+    }
+    
+    /* -- constructors not called by signature match, so we need some helpers --*/
+
+    function _constructPathname($pathname) {
+        // obtain ref to the filesystem layer
+        $fs = FileSystem::getFileSystem();
+
+        if ($pathname === null) {
+            throw new NullPointerException("Argument to function must not be null");
+        }
+
+        $this->path = (string) $fs->normalize($pathname);
+        $this->prefixLength = (int) $fs->prefixLength($this->path);
+    }
+
+    function _constructStringParentStringChild($parent, $child = null) {
+        // obtain ref to the filesystem layer
+        $fs = FileSystem::getFileSystem();
+
+        if ($child === null) {
+            throw new NullPointerException("Argument to function must not be null");
+        }
+        if ($parent !== null) {
+            if ($parent === "") {
+                $this->path = $fs->resolve($fs->getDefaultParent(), $fs->normalize($child));
+            } else {
+                $this->path = $fs->resolve($fs->normalize($parent), $fs->normalize($child));
+            }
+        } else {
+            $this->path = (string) $fs->normalize($child);
+        }
+        $this->prefixLength = (int) $fs->prefixLength($this->path);
+    }
+
+    function _constructFileParentStringChild($parent, $child = null) {
+        // obtain ref to the filesystem layer
+        $fs = FileSystem::getFileSystem();
+
+        if ($child === null) {
+            throw new NullPointerException("Argument to function must not be null");
+        }
+
+        if ($parent !== null) {
+            if ($parent->path === "") {
+                $this->path = $fs->resolve($fs->getDefaultParent(), $fs->normalize($child));
+            } else {
+                $this->path = $fs->resolve($parent->path, $fs->normalize($child));
+            }
+        } else {
+            $this->path = $fs->normalize($child);
+        }
+        $this->prefixLength = $fs->prefixLength($this->path);
+    }
+
+    /* -- Path-component accessors -- */
+
+    /**
+     * Returns the name of the file or directory denoted by this abstract
+     * pathname.  This is just the last name in the pathname's name
+     * sequence.  If the pathname's name sequence is empty, then the empty
+     * string is returned.
+     *
+     * @return  The name of the file or directory denoted by this abstract
+     *          pathname, or the empty string if this pathname's name sequence
+     *          is empty
+     */
+    function getName() {
+        // that's a lastIndexOf
+        $index = ((($res = strrpos($this->path, self::$separator)) === false) ? -1 : $res);
+        if ($index < $this->prefixLength) {
+            return substr($this->path, $this->prefixLength);
+        }
+        return substr($this->path, $index + 1);
+    }
+
+    /**
+     * Returns the pathname string of this abstract pathname's parent, or
+     * null if this pathname does not name a parent directory.
+     *
+     * The parent of an abstract pathname consists of the pathname's prefix,
+     * if any, and each name in the pathname's name sequence except for the last.
+     * If the name sequence is empty then the pathname does not name a parent
+     * directory.
+     *
+     * @return  The pathname string of the parent directory named by this
+     *          abstract pathname, or null if this pathname does not name a parent
+     */
+    function getParent() {
+        // that's a lastIndexOf
+        $index = ((($res = strrpos($this->path, self::$separator)) === false) ? -1 : $res);
+        if ($index < $this->prefixLength) {
+            if (($this->prefixLength > 0) && (strlen($this->path > $this->prefixLength))) {
+                return substr($this->path, 0, $this->prefixLength);
+            }
+            return null;
+        }
+        return substr($this->path, 0, $index);
+    }
+
+    /**
+     * Returns the abstract pathname of this abstract pathname's parent,
+     * or null if this pathname does not name a parent directory.
+     *
+     * The parent of an abstract pathname consists of the pathname's prefix,
+     * if any, and each name in the pathname's name sequence except for the
+     * last.  If the name sequence is empty then the pathname does not name
+     * a parent directory.
+     *
+     * @return  The abstract pathname of the parent directory named by this
+     *          abstract pathname, or null if this pathname
+     *          does not name a parent
+     */
+    function getParentFile() {
+        $p = $this->getParent();
+        if ($p === null) {
+            return null;
+        }
+        return new PhingFile((string) $p, (int) $this->prefixLength);
+    }
+
+    /**
+     * Converts this abstract pathname into a pathname string.  The resulting
+     * string uses the default name-separator character to separate the names
+     * in the name sequence.
+     *
+     * @return  The string form of this abstract pathname
+     */
+    function getPath() {
+        return (string) $this->path;
+    }
+
+    /**
+     * Tests whether this abstract pathname is absolute.  The definition of
+     * absolute pathname is system dependent.  On UNIX systems, a pathname is
+     * absolute if its prefix is "/".  On Win32 systems, a pathname is absolute
+     * if its prefix is a drive specifier followed by "\\", or if its prefix
+     * is "\\".
+     *
+     * @return  true if this abstract pathname is absolute, false otherwise
+     */
+    function isAbsolute() {
+        return ($this->prefixLength !== 0);
+    }
+
+
+    /**
+     * Returns the absolute pathname string of this abstract pathname.
+     *
+     * If this abstract pathname is already absolute, then the pathname
+     * string is simply returned as if by the getPath method.
+     * If this abstract pathname is the empty abstract pathname then
+     * the pathname string of the current user directory, which is named by the
+     * system property user.dir, is returned.  Otherwise this
+     * pathname is resolved in a system-dependent way.  On UNIX systems, a
+     * relative pathname is made absolute by resolving it against the current
+     * user directory.  On Win32 systems, a relative pathname is made absolute
+     * by resolving it against the current directory of the drive named by the
+     * pathname, if any; if not, it is resolved against the current user
+     * directory.
+     *
+     * @return  The absolute pathname string denoting the same file or
+     *          directory as this abstract pathname
+     * @see     #isAbsolute()
+     */
+    function getAbsolutePath() {
+        $fs = FileSystem::getFileSystem();        
+        return $fs->resolveFile($this);
+    }
+
+    /**
+     * Returns the absolute form of this abstract pathname.  Equivalent to
+     * getAbsolutePath.
+     *
+     * @return  The absolute abstract pathname denoting the same file or
+     *          directory as this abstract pathname
+     */
+    function getAbsoluteFile() {
+        return new PhingFile((string) $this->getAbsolutePath());
+    }
+
+
+    /**
+     * Returns the canonical pathname string of this abstract pathname.
+     *
+     * A canonical pathname is both absolute and unique. The precise
+     * definition of canonical form is system-dependent. This method first
+     * converts this pathname to absolute form if necessary, as if by invoking the
+     * getAbsolutePath() method, and then maps it to its unique form in a
+     * system-dependent way.  This typically involves removing redundant names
+     * such as "." and .. from the pathname, resolving symbolic links
+     * (on UNIX platforms), and converting drive letters to a standard case
+     * (on Win32 platforms).
+     *
+     * Every pathname that denotes an existing file or directory has a
+     * unique canonical form.  Every pathname that denotes a nonexistent file
+     * or directory also has a unique canonical form.  The canonical form of
+     * the pathname of a nonexistent file or directory may be different from
+     * the canonical form of the same pathname after the file or directory is
+     * created.  Similarly, the canonical form of the pathname of an existing
+     * file or directory may be different from the canonical form of the same
+     * pathname after the file or directory is deleted.
+     *
+     * @return  The canonical pathname string denoting the same file or
+     *          directory as this abstract pathname
+     */
+    function getCanonicalPath() {
+        $fs = FileSystem::getFileSystem();
+        return $fs->canonicalize($this->path);
+    }
+
+
+    /**
+     * Returns the canonical form of this abstract pathname.  Equivalent to
+     * getCanonicalPath(.
+     *
+     * @return  PhingFile The canonical pathname string denoting the same file or
+     *          directory as this abstract pathname
+     */
+    function getCanonicalFile() {
+        return new PhingFile($this->getCanonicalPath());
+    }
+
+    /**
+     * Converts this abstract pathname into a file: URL.  The
+     * exact form of the URL is system-dependent.  If it can be determined that
+     * the file denoted by this abstract pathname is a directory, then the
+     * resulting URL will end with a slash.
+     *
+     * Usage note: This method does not automatically escape
+     * characters that are illegal in URLs.  It is recommended that new code
+     * convert an abstract pathname into a URL by first converting it into a
+     * URI, via the toURI() method, and then converting the URI
+     * into a URL via the URI::toURL()
+     *
+     * @return  A URL object representing the equivalent file URL
+     *
+     *
+     */
+    function toURL() {
+        /*
+        // URL class not implemented yet
+        return new URL("file", "", $this->_slashify($this->getAbsolutePath(), $this->isDirectory()));
+        */
+    }
+
+    /**
+     * Constructs a file: URI that represents this abstract pathname.
+     * Not implemented yet
+     */
+    function toURI() {
+        /*
+        $f = $this->getAbsoluteFile();
+           $sp = (string) $this->slashify($f->getPath(), $f->isDirectory());
+           if (StringHelper::startsWith('//', $sp))
+        $sp = '//' + sp;
+           return new URI('file', null, $sp, null);
+        */
+    }
+
+    function _slashify($path, $isDirectory) {
+        $p = (string) $path;
+
+        if (self::$separator !== '/') {
+            $p = str_replace(self::$separator, '/', $p);
+        }
+
+        if (!StringHelper::startsWith('/', $p)) {
+            $p = '/'.$p;
+        }
+
+        if (!StringHelper::endsWith('/', $p) && $isDirectory) {
+            $p = $p.'/';
+        }
+
+        return $p;
+    }
+
+    /* -- Attribute accessors -- */
+
+    /**
+     * Tests whether the application can read the file denoted by this
+     * abstract pathname.
+     *
+     * @return  true if and only if the file specified by this
+     *          abstract pathname exists and can be read by the
+     *          application; false otherwise
+     */
+    function canRead() {
+        $fs = FileSystem::getFileSystem();
+
+        if ($fs->checkAccess($this)) {
+            return (boolean) @is_readable($this->getAbsolutePath());
+        }
+        return false;
+    }
+
+    /**
+     * Tests whether the application can modify to the file denoted by this
+     * abstract pathname.
+     *
+     * @return  true if and only if the file system actually
+     *          contains a file denoted by this abstract pathname and
+     *          the application is allowed to write to the file;
+     *          false otherwise.
+     *
+     */
+    function canWrite() {
+        $fs = FileSystem::getFileSystem();
+        return $fs->checkAccess($this, true);
+    }
+
+    /**
+     * Tests whether the file denoted by this abstract pathname exists.
+     *
+     * @return  true if and only if the file denoted by this
+     *          abstract pathname exists; false otherwise
+     *
+     */
+    function exists() {                
+        if ($this->isFile()) {
+            return @file_exists($this->path);
+        } else {
+            return @is_dir($this->path);
+        }
+    }
+
+    /**
+     * Tests whether the file denoted by this abstract pathname is a
+     * directory.
+     *
+     * @return true if and only if the file denoted by this
+     *         abstract pathname exists and is a directory;
+     *         false otherwise
+     *
+     */
+    function isDirectory() {
+        $fs = FileSystem::getFileSystem();
+        if ($fs->checkAccess($this) !== true) {
+            throw new IOException("No read access to ".$this->path);
+        }
+        return @is_dir($this->path);
+    }
+
+    /**
+     * Tests whether the file denoted by this abstract pathname is a normal
+     * file.  A file is normal if it is not a directory and, in
+     * addition, satisfies other system-dependent criteria.  Any non-directory
+     * file created by a Java application is guaranteed to be a normal file.
+     *
+     * @return  true if and only if the file denoted by this
+     *          abstract pathname exists and is a normal file;
+     *          false otherwise
+     */
+    function isFile() {
+        //$fs = FileSystem::getFileSystem();
+        return @is_file($this->path);
+    }
+
+    /**
+     * Tests whether the file named by this abstract pathname is a hidden
+     * file.  The exact definition of hidden is system-dependent.  On
+     * UNIX systems, a file is considered to be hidden if its name begins with
+     * a period character ('.').  On Win32 systems, a file is considered to be
+     * hidden if it has been marked as such in the filesystem. Currently there
+     * seems to be no way to dermine isHidden on Win file systems via PHP
+     *
+     * @return  true if and only if the file denoted by this
+     *          abstract pathname is hidden according to the conventions of the
+     *          underlying platform
+     */
+    function isHidden() {
+        $fs = FileSystem::getFileSystem();
+        if ($fs->checkAccess($this) !== true) {
+            throw new IOException("No read access to ".$this->path);
+        }
+        return (($fs->getBooleanAttributes($this) & $fs->BA_HIDDEN) !== 0);
+    }
+
+    /**
+     * Returns the time that the file denoted by this abstract pathname was
+     * last modified.
+     *
+     * @return  A integer value representing the time the file was
+     *          last modified, measured in milliseconds since the epoch
+     *          (00:00:00 GMT, January 1, 1970), or 0 if the
+     *          file does not exist or if an I/O error occurs
+     */
+    function lastModified() {
+        $fs = FileSystem::getFileSystem();
+        if ($fs->checkAccess($this) !== true) {
+            throw new IOException("No read access to " . $this->path);
+        }
+        return $fs->getLastModifiedTime($this);
+    }
+
+    /**
+     * Returns the length of the file denoted by this abstract pathname.
+     * The return value is unspecified if this pathname denotes a directory.
+     *
+     * @return  The length, in bytes, of the file denoted by this abstract
+     *          pathname, or 0 if the file does not exist
+     */
+    function length() {
+        $fs = FileSystem::getFileSystem();
+        if ($fs->checkAccess($this) !== true) {
+            throw new IOException("No read access to ".$this->path."\n");
+        }
+        return $fs->getLength($this);
+    }
+
+    /**
+     * Convenience method for returning the contents of this file as a string.
+     * This method uses file_get_contents() to read file in an optimized way.
+     * @return string
+     * @throws Exception - if file cannot be read
+     */
+    function contents() {
+        if (!$this->canRead() || !$this->isFile()) {
+            throw new IOException("Cannot read file contents!");
+        }
+        return file_get_contents($this->getAbsolutePath());
+    }
+    
+    /* -- File operations -- */
+
+    /**
+     * Atomically creates a new, empty file named by this abstract pathname if
+     * and only if a file with this name does not yet exist.  The check for the
+     * existence of the file and the creation of the file if it does not exist
+     * are a single operation that is atomic with respect to all other
+     * filesystem activities that might affect the file.
+     *
+     * @return  true if the named file does not exist and was
+     *          successfully created; <code>false</code> if the named file
+     *          already exists
+     * @throws IOException if file can't be created
+     */
+    function createNewFile($parents=true, $mode=0777) {
+        $file = FileSystem::getFileSystem()->createNewFile($this->path);
+        return $file;
+    }
+
+    /**
+     * Deletes the file or directory denoted by this abstract pathname.  If
+     * this pathname denotes a directory, then the directory must be empty in
+     * order to be deleted.
+     *
+     * @return  true if and only if the file or directory is
+     *          successfully deleted; false otherwise
+     */
+    function delete() {
+        $fs = FileSystem::getFileSystem();
+        if ($fs->checkAccess($this, true) !== true) {
+            throw new IOException("No read access to " . $this->path."\n");
+        }
+        return $fs->delete($this);
+    }
+
+    /**
+     * Requests that the file or directory denoted by this abstract pathname
+     * be deleted when php terminates.  Deletion will be attempted only for
+     * normal termination of php and if and if only Phing::shutdown() is
+     * called.
+     *
+     * Once deletion has been requested, it is not possible to cancel the
+     * request.  This method should therefore be used with care.
+     *
+     */
+    function deleteOnExit() {
+        $fs = FileSystem::getFileSystem();
+        $fs->deleteOnExit($this);
+    }
+
+    /**
+     * Returns an array of strings naming the files and directories in the
+     * directory denoted by this abstract pathname.
+     *
+     * If this abstract pathname does not denote a directory, then this
+     * method returns null  Otherwise an array of strings is
+     * returned, one for each file or directory in the directory.  Names
+     * denoting the directory itself and the directory's parent directory are
+     * not included in the result.  Each string is a file name rather than a
+     * complete path.
+     *
+     * There is no guarantee that the name strings in the resulting array
+     * will appear in any specific order; they are not, in particular,
+     * guaranteed to appear in alphabetical order.
+     *
+     * @return  An array of strings naming the files and directories in the
+     *          directory denoted by this abstract pathname.  The array will be
+     *          empty if the directory is empty.  Returns null if
+     *          this abstract pathname does not denote a directory, or if an
+     *          I/O error occurs.
+     *
+     */
+    function listDir($filter = null) {
+        $fs = FileSystem::getFileSystem();
+        return $fs->lister($this, $filter);
+    }
+
+    function listFiles($filter = null) {
+        $ss = $this->listDir($filter);
+        if ($ss === null) {
+            return null;
+        }
+        $n = count($ss);
+        $fs = array();
+        for ($i = 0; $i < $n; $i++) {
+            $fs[$i] = new PhingFile((string)$this->path, (string)$ss[$i]);
+        }
+        return $fs;
+    }
+
+    /**
+     * Creates the directory named by this abstract pathname, including any
+     * necessary but nonexistent parent directories.  Note that if this
+     * operation fails it may have succeeded in creating some of the necessary
+     * parent directories.
+     *
+     * @return  true if and only if the directory was created,
+     *          along with all necessary parent directories; false
+     *          otherwise
+     * @throws  IOException
+     */
+    function mkdirs() {
+        if ($this->exists()) {
+            return false;
+        }
+		try {
+			if ($this->mkdir()) {
+	            return true;
+	        }
+		} catch (IOException $ioe) {
+			// IOException from mkdir() means that directory propbably didn't exist.
+		}        
+        $parentFile = $this->getParentFile();
+        return (($parentFile !== null) && ($parentFile->mkdirs() && $this->mkdir()));
+    }
+
+    /**
+     * Creates the directory named by this abstract pathname.
+     *
+     * @return  true if and only if the directory was created; false otherwise
+     * @throws  IOException
+     */
+    function mkdir() {
+        $fs = FileSystem::getFileSystem();
+
+        if ($fs->checkAccess(new PhingFile($this->path), true) !== true) {
+            throw new IOException("No write access to " . $this->getPath());
+        }
+        return $fs->createDirectory($this);
+    }
+
+    /**
+     * Renames the file denoted by this abstract pathname.
+     *
+     * @param   destFile  The new abstract pathname for the named file
+     * @return  true if and only if the renaming succeeded; false otherwise
+     */
+    function renameTo(PhingFile $destFile) {
+        $fs = FileSystem::getFileSystem();
+        if ($fs->checkAccess($this) !== true) {
+            throw new IOException("No write access to ".$this->getPath());
+        }
+        return $fs->rename($this, $destFile);
+    }
+
+    /**
+     * Simple-copies file denoted by this abstract pathname into another
+     * PhingFile
+     *
+     * @param PhingFile $destFile  The new abstract pathname for the named file
+     * @return true if and only if the renaming succeeded; false otherwise
+     */
+    function copyTo(PhingFile $destFile) {
+        $fs = FileSystem::getFileSystem();
+
+        if ($fs->checkAccess($this) !== true) {
+            throw new IOException("No read access to ".$this->getPath()."\n");
+        }
+
+        if ($fs->checkAccess($destFile, true) !== true) {
+            throw new IOException("File::copyTo() No write access to ".$destFile->getPath());
+        }
+        return $fs->copy($this, $destFile);
+    }
+
+    /**
+     * Sets the last-modified time of the file or directory named by this
+     * abstract pathname.
+     *
+     * All platforms support file-modification times to the nearest second,
+     * but some provide more precision.  The argument will be truncated to fit
+     * the supported precision.  If the operation succeeds and no intervening
+     * operations on the file take place, then the next invocation of the
+     * lastModified method will return the (possibly truncated) time argument
+     * that was passed to this method.
+     *
+     * @param  time  The new last-modified time, measured in milliseconds since
+     *               the epoch (00:00:00 GMT, January 1, 1970)
+     * @return true if and only if the operation succeeded; false otherwise
+     */
+    function setLastModified($time) {
+        $time = (int) $time;
+        if ($time < 0) {
+            throw new Exception("IllegalArgumentException, Negative $time\n");
+        }
+
+        // FIXME check if accessible
+        $fs = FileSystem::getFileSystem();
+        if ($fs->checkAccess($this, true) !== true) {
+            throw new IOException("File::setLastModified(). No write access to file\n");
+        }
+        return $fs->setLastModifiedTime($this, $time);
+    }
+
+    /**
+     * Marks the file or directory named by this abstract pathname so that
+     * only read operations are allowed.  After invoking this method the file
+     * or directory is guaranteed not to change until it is either deleted or
+     * marked to allow write access.  Whether or not a read-only file or
+     * directory may be deleted depends upon the underlying system.
+     *
+     * @return true if and only if the operation succeeded; false otherwise
+     */
+    function setReadOnly() {
+        $fs = FileSystem::getFileSystem();
+        if ($fs->checkAccess($this, true) !== true) {
+            // Error, no write access
+            throw new IOException("No write access to " . $this->getPath());
+        }
+        return $fs->setReadOnly($this);
+    }
+
+    /**
+     * Sets the mode of the file
+     * @param int $mode Ocatal mode.
+     */
+    function setMode($mode) {
+        $fs = FileSystem::getFileSystem();
+        return $fs->chmod($this->getPath(), $mode);
+    }
+
+    /**
+     * Retrieve the mode of this file.
+     * @return int
+     */
+    function getMode() {
+        return @fileperms($this->getPath());
+    }
+
+    /* -- Filesystem interface -- */
+
+    /**
+     * List the available filesystem roots.
+     *
+     * A particular platform may support zero or more hierarchically-organized
+     * file systems.  Each file system has a root  directory from which all
+     * other files in that file system can be reached.
+     * Windows platforms, for example, have a root directory for each active
+     * drive; UNIX platforms have a single root directory, namely "/".
+     * The set of available filesystem roots is affected by various system-level
+     * operations such the insertion or ejection of removable media and the
+     * disconnecting or unmounting of physical or virtual disk drives.
+     *
+     * This method returns an array of PhingFile objects that
+     * denote the root directories of the available filesystem roots.  It is
+     * guaranteed that the canonical pathname of any file physically present on
+     * the local machine will begin with one of the roots returned by this
+     * method.
+     *
+     * The canonical pathname of a file that resides on some other machine
+     * and is accessed via a remote-filesystem protocol such as SMB or NFS may
+     * or may not begin with one of the roots returned by this method.  If the
+     * pathname of a remote file is syntactically indistinguishable from the
+     * pathname of a local file then it will begin with one of the roots
+     * returned by this method.  Thus, for example, PhingFile objects
+     * denoting the root directories of the mapped network drives of a Windows
+     * platform will be returned by this method, while PhingFile
+     * objects containing UNC pathnames will not be returned by this method.
+     *
+     * @return  An array of PhingFile objects denoting the available
+     *          filesystem roots, or null if the set of roots
+     *          could not be determined.  The array will be empty if there are
+     *          no filesystem roots.
+     */
+    function listRoots() {
+        $fs = FileSystem::getFileSystem();
+        return (array) $fs->listRoots();
+    }
+
+    /* -- Tempfile management -- */
+
+    /**
+     * Returns the path to the temp directory.
+     */
+    function getTempDir() {
+        return Phing::getProperty('php.tmpdir');
+    }
+
+    /**
+     * Static method that creates a unique filename whose name begins with
+     * $prefix and ends with $suffix in the directory $directory. $directory
+     * is a reference to a PhingFile Object.
+     * Then, the file is locked for exclusive reading/writing.
+     *
+     * @author      manuel holtgrewe, grin en gmx.net
+     * @throws      IOException
+     * @access      public
+     */
+    function createTempFile($prefix, $suffix, PhingFile $directory) {
+        
+        // quick but efficient hack to create a unique filename ;-)
+        $result = null;
+        do {
+            $result = new PhingFile($directory, $prefix . substr(md5(time()), 0, 8) . $suffix);
+        } while (file_exists($result->getPath()));
+
+        $fs = FileSystem::getFileSystem();
+        $fs->createNewFile($result->getPath());
+        $fs->lock($result);
+
+        return $result;
+    }
+
+    /**
+     * If necessary, $File the lock on $File is removed and then the file is
+     * deleted
+     *
+     * @access      public
+     */
+    function removeTempFile() {
+        $fs = FileSystem::getFileSystem();
+        // catch IO Exception
+        $fs->unlock($this);
+        $this->delete();
+    }
+
+
+    /* -- Basic infrastructure -- */
+
+    /**
+     * Compares two abstract pathnames lexicographically.  The ordering
+     * defined by this method depends upon the underlying system.  On UNIX
+     * systems, alphabetic case is significant in comparing pathnames; on Win32
+     * systems it is not.
+     *
+     * @param PhingFile $file Th file whose pathname sould be compared to the pathname of this file.
+     *
+     * @return int Zero if the argument is equal to this abstract pathname, a
+     *        value less than zero if this abstract pathname is
+     *        lexicographically less than the argument, or a value greater
+     *        than zero if this abstract pathname is lexicographically
+     *        greater than the argument
+     */
+    function compareTo(PhingFile $file) {
+        $fs = FileSystem::getFileSystem();
+        return $fs->compare($this, $file);
+    }
+
+    /**
+     * Tests this abstract pathname for equality with the given object.
+     * Returns <code>true</code> if and only if the argument is not
+     * <code>null</code> and is an abstract pathname that denotes the same file
+     * or directory as this abstract pathname.  Whether or not two abstract
+     * pathnames are equal depends upon the underlying system.  On UNIX
+     * systems, alphabetic case is significant in comparing pathnames; on Win32
+     * systems it is not.
+     * @return boolean
+     */
+    function equals($obj) {
+        if (($obj !== null) && ($obj instanceof PhingFile)) {
+            return ($this->compareTo($obj) === 0);
+        }
+        return false;
+    }
+
+    /** Backwards compatibility -- use PHP5's native __tostring method. */
+    function toString() {
+        return $this->getPath();
+    }
+    
+    /** PHP5's native method. */
+    function __toString() {
+        return $this->getPath();
+    }
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/PhingFile.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/Reader.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/Reader.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/Reader.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,88 @@
+<?php
+/*
+ *  $Id: Reader.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+/**
+ * Abstract class for reading character streams.
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @author Yannick Lecaillez <yl en seasonfive.com>
+ * @version $Revision: 1.5 $
+ * @package phing.system.io
+ */
+abstract class Reader {
+
+    /**
+     * Read data from source.
+     * If length is specified, then only that number of chars is read,
+     * otherwise stream is read until EOF.
+     * @param int $len
+     */
+    abstract public function read($len = null);
+            
+    /**
+     * Close stream.
+     */
+    abstract public function close();
+    
+    /**
+     * Open stream for reading.
+     */
+    abstract public function open();
+    
+    /**
+     * Returns the filename, url, etc. that is being read from.
+     * This is critical for, e.g., ExpatParser's ability to know
+     * the filename that is throwing an ExpatParserException, etc.
+     * @return string
+     */
+    abstract function getResource();
+
+    /**
+     * Move stream position relative to current pos.
+     * @param int $n
+     */
+    public function skip($n) {}
+    
+    /**
+     * Reset the current position in stream to beginning or last mark (if supported).
+     */    
+    public function reset() {}
+        
+    /**
+     * If supported, places a "marker" (like a bookmark) at current stream position.
+     * A subsequent call to reset() will move stream position back
+     * to last marker (if supported).
+     */    
+    public function mark() {}
+
+    /**
+     * Whether marking is supported.
+     * @return boolean
+     */
+    public function markSupported() {}
+    
+    /**
+     * Is stream ready for reading.
+     * @return boolean
+     */
+    public function ready() {}
+
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/Reader.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/StringReader.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/StringReader.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/StringReader.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,73 @@
+<?php
+/*
+ *  $Id: StringReader.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+/**
+ * Dummy class for reading character streams. 
+ * @package phing.system.io
+ */
+class StringReader extends Reader {
+    
+    private    $_string;
+    private $mark = 0;
+    private $currPos = 0;
+    
+    function __construct($string) {
+        $this->_string = $string;
+    }
+
+    function skip($n) {}
+
+    function read($len = null) {
+        if ($len === null) {
+            return $this->_string;
+        } else {            
+            if ($this->currPos >= strlen($this->_string)) {
+                return -1;
+            }            
+            $out = substr($this->_string, $this->currPos, $len);
+            $this->currPos += $len;
+            return $out;
+        }
+    }
+
+    function mark() {
+        $this->mark = $this->currPos;
+    }
+
+    function reset() {
+        $this->currPos = $this->mark;
+    }
+
+    function close() {}
+
+    function open() {}
+
+    function ready() {}
+
+    function markSupported() {
+        return true;
+    }
+    
+    function getResource() {
+        return '(string) "'.$this->_string . '"';
+    }
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/StringReader.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/TokenReader.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/TokenReader.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/TokenReader.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,51 @@
+<?php
+/*
+ *  $Id: TokenReader.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/system/io/Reader.php';
+include_once 'phing/filters/ReplaceTokens.php'; // for class Token
+
+/**
+ * Abstract class for reading Tokens from a resource
+ *
+ * @author    Manuel Holtgewe
+ * @version   $Revision: 1.3 $
+ * @access    public
+ * @package   phing.system.io
+ */
+class TokenReader extends Reader {
+
+    /**
+     * Constructor
+     */
+    function __construct() {
+    }
+
+    /**
+     * Reads a token from the resource and returns it as a
+     * Token object.
+     *
+     * @access  public
+     */
+    function readToken() {
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/TokenReader.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/UnixFileSystem.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/UnixFileSystem.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/UnixFileSystem.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,266 @@
+<?php
+/*
+ *  $Id: UnixFileSystem.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/system/io/FileSystem.php';
+
+/**
+ * UnixFileSystem class. This class encapsulates the basic file system functions
+ * for platforms using the unix (posix)-stylish filesystem. It wraps php native
+ * functions suppressing normal PHP error reporting and instead uses Exception
+ * to report and error.
+ *
+ * This class is part of a oop based filesystem abstraction and targeted to run
+ * on all supported php platforms.
+ *
+ * Note: For debugging turn track_errors on in the php.ini. The error messages
+ * and log messages from this class will then be clearer because $php_errormsg
+ * is passed as part of the message.
+ *
+ * FIXME:
+ *  - Comments
+ *  - Error handling reduced to min, error are handled by PhingFile mainly
+ *
+ * @author    Andreas Aderhold, andi en binarycloud.com
+ * @version   $Revision: 1.10 $
+ * @package   phing.system.io
+ */
+class UnixFileSystem extends FileSystem {
+
+    /**
+     * returns OS dependant path separator char
+     */
+    function getSeparator() {
+        return '/';
+    }
+
+    /**
+     * returns OS dependant directory separator char
+     */
+    function getPathSeparator() {
+        return ':';
+    }
+
+    /**
+     * A normal Unix pathname contains no duplicate slashes and does not end
+     * with a slash.  It may be the empty string.
+     *
+     * Check that the given pathname is normal.  If not, invoke the real
+     * normalizer on the part of the pathname that requires normalization.
+     * This way we iterate through the whole pathname string only once.
+     */
+    function normalize($strPathname) {
+        
+        if (empty($strPathname)) {
+            return;
+        }
+        
+        // Resolve home directories. We assume /home is where all home
+        // directories reside, b/c there is no other way to do this with
+        // PHP AFAIK.
+        if ($strPathname{0} === "~") {
+            if ($strPathname{1} === "/") { // like ~/foo => /home/user/foo
+                $strPathname = "/home/" . get_current_user() . substr($strPathname, 1);
+            } else { // like ~foo => /home/foo
+                $pos = strpos($strPathname, "/");
+                $name = substr($strPathname, 1, $pos - 2);
+                $strPathname = "/home/" . $name . substr($strPathname, $pos);
+            }
+        }
+
+        $n = strlen($strPathname);
+        $prevChar = 0;
+        for ($i=0; $i < $n; $i++) {
+            $c = $strPathname{$i};
+            if (($prevChar === '/') && ($c === '/')) {
+                return self::normalizer($strPathname, $n, $i - 1);
+            }
+            $prevChar = $c;
+        }
+        if ($prevChar === '/') {
+            return self::normalizer($strPathname, $n, $n - 1);
+        }
+        return $strPathname;
+    }
+
+    /**
+     * Normalize the given pathname, whose length is $len, starting at the given
+     * $offset; everything before this offset is already normal.
+     */
+    protected function normalizer($pathname, $len, $offset) {
+        if ($len === 0) {
+            return $pathname;
+        }
+        $n = (int) $len;
+        while (($n > 0) && ($pathname{$n-1} === '/')) {
+            $n--;
+        }
+        if ($n === 0) {
+            return '/';
+        }
+        $sb = "";
+
+        if ($offset > 0) {
+            $sb .= substr($pathname, 0, $offset);
+        }
+        $prevChar = 0;
+        for ($i = $offset; $i < $n; $i++) {
+            $c = $pathname{$i};
+            if (($prevChar === '/') && ($c === '/')) {
+                continue;
+            }
+            $sb .= $c;
+            $prevChar = $c;
+        }
+        return $sb;
+    }
+
+    /**
+     * Compute the length of the pathname string's prefix.  The pathname
+     * string must be in normal form.
+     */
+    function prefixLength($pathname) {
+        if (strlen($pathname === 0)) {
+            return 0;
+        }
+        return (($pathname{0} === '/') ? 1 : 0);
+    }
+
+    /**
+     * Resolve the child pathname string against the parent.
+     * Both strings must be in normal form, and the result
+     * will be in normal form.
+     */
+    function resolve($parent, $child) {
+
+        if ($child === "") {
+            return $parent;
+        }
+
+        if ($child{0} === '/') {
+            if ($parent === '/') {
+                return $child;
+            }
+            return $parent.$child;
+        }
+
+        if ($parent === '/') {
+            return $parent.$child;
+        }
+
+        return $parent.'/'.$child;
+    }
+
+    function getDefaultParent() {
+        return '/';
+    }
+
+    function isAbsolute(PhingFile $f) {
+        return ($f->getPrefixLength() !== 0);
+    }
+
+    /**
+     * the file resolver
+     */
+    function resolveFile(PhingFile $f) {
+        // resolve if parent is a file oject only
+        if ($this->isAbsolute($f)) {
+            return $f->getPath();
+        } else {
+            return $this->resolve(Phing::getProperty("user.dir"), $f->getPath());
+        }       
+    }
+
+    /* -- most of the following is mapped to the php natives wrapped by FileSystem */    
+
+    /* -- Attribute accessors -- */
+    function getBooleanAttributes(&$f) {
+        //$rv = getBooleanAttributes0($f);
+        $name = $f->getName();
+        $hidden = (strlen($name) > 0) && ($name{0} == '.');
+        return ($hidden ? $this->BA_HIDDEN : 0);
+    }
+
+    /**
+     * set file readonly on unix
+     */
+    function setReadOnly($f) {
+        if ($f instanceof File) {
+            $strPath = (string) $f->getPath();
+            $perms = (int) (@fileperms($strPath) & 0444);
+            return FileSystem::Chmod($strPath, $perms);
+        } else {
+            throw new Exception("IllegalArgutmentType: Argument is not File");
+        }
+    }
+
+    /**
+     * compares file paths lexicographically
+     */
+    function compare($f1, $f2) {
+        if ( ($f1 instanceof PhingFile) && ($f2 instanceof PhingFile) ) {
+            $f1Path = $f1->getPath();
+            $f2Path = $f2->getPath();
+            return (boolean) strcmp((string) $f1Path, (string) $f2Path);
+        } else {
+            throw new Exception("IllegalArgutmentType: Argument is not PhingFile");
+        }
+    }
+
+    /* -- fs interface --*/
+
+    function listRoots() {
+        if (!$this->checkAccess('/', false)) {
+            die ("Can not access root");
+        }
+        return array(new PhingFile("/"));
+    }
+
+    /**
+     * returns the contents of a directory in an array
+     */
+    function lister($f) {
+        $dir = @opendir($f->getAbsolutePath());
+        if (!$dir) {
+            throw new Exception("Can't open directory " . $f->__toString());
+        }
+        $vv = array();
+        while (($file = @readdir($dir)) !== false) {
+            if ($file == "." || $file == "..") {
+                continue;
+            }
+            $vv[] = (string) $file;
+        }
+        @closedir($dir);
+        return $vv;
+    }
+
+    function fromURIPath($p) {
+        if (StringHelper::endsWith("/", $p) && (strlen($p) > 1)) {
+
+            // "/foo/" --> "/foo", but "/" --> "/"            
+            $p = substr($p, 0, strlen($p) - 1);
+
+        }
+
+        return $p;
+    }
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/UnixFileSystem.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/Win32FileSystem.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/Win32FileSystem.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/Win32FileSystem.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,477 @@
+<?php
+/*
+ *  $Id: Win32FileSystem.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+include_once 'phing/system/io/FileSystem.php';
+
+/**
+ *  @package   phing.system.io
+ */
+class Win32FileSystem extends FileSystem {
+
+    protected $slash;
+    protected $altSlash;
+    protected $semicolon;
+
+    private static $driveDirCache = array();
+
+    function __construct() {
+        $this->slash = self::getSeparator();
+        $this->semicolon = self::getPathSeparator();
+        $this->altSlash = ($this->slash === '\\') ? '/' : '\\';
+    }
+
+    function isSlash($c) {
+        return ($c == '\\') || ($c == '/');
+    }
+
+    function isLetter($c) {
+        return ((ord($c) >= ord('a')) && (ord($c) <= ord('z')))
+               || ((ord($c) >= ord('A')) && (ord($c) <= ord('Z')));
+    }
+
+    function slashify($p) {
+        if ((strlen($p) > 0) && ($p{0} != $this->slash)) {
+            return $this->slash.$p;
+        }
+        else {
+            return $p;
+        }
+    }
+
+    /* -- Normalization and construction -- */
+
+    function getSeparator() {
+        // the ascii value of is the \
+        return chr(92);
+    }
+
+    function getPathSeparator() {
+        return ';';
+    }
+
+    /**
+     * A normal Win32 pathname contains no duplicate slashes, except possibly
+     * for a UNC prefix, and does not end with a slash.  It may be the empty
+     * string.  Normalized Win32 pathnames have the convenient property that
+     * the length of the prefix almost uniquely identifies the type of the path
+     * and whether it is absolute or relative:
+     *
+     *    0  relative to both drive and directory
+     *    1  drive-relative (begins with '\\')
+     *    2  absolute UNC (if first char is '\\'), else directory-relative (has form "z:foo")
+     *    3  absolute local pathname (begins with "z:\\")
+     */
+    function normalizePrefix($strPath, $len, $sb) {
+        $src = 0;
+        while (($src < $len) && $this->isSlash($strPath{$src})) {
+            $src++;
+        }
+        $c = "";
+        if (($len - $src >= 2)
+                && $this->isLetter($c = $strPath{$src})
+                && $strPath{$src + 1} === ':') {
+            /* Remove leading slashes if followed by drive specifier.
+             * This hack is necessary to support file URLs containing drive
+             * specifiers (e.g., "file://c:/path").  As a side effect,
+             * "/c:/path" can be used as an alternative to "c:/path". */
+            $sb .= $c;
+            $sb .= ':';
+            $src += 2;
+        }
+        else {
+            $src = 0;
+            if (($len >= 2)
+                    && $this->isSlash($strPath{0})
+                    && $this->isSlash($strPath{1})) {
+                /* UNC pathname: Retain first slash; leave src pointed at
+                 * second slash so that further slashes will be collapsed
+                 * into the second slash.  The result will be a pathname
+                 * beginning with "\\\\" followed (most likely) by a host
+                 * name. */
+                $src = 1;
+                $sb.=$this->slash;
+            }
+        }
+        return $src;
+    }
+
+    /** Normalize the given pathname, whose length is len, starting at the given
+       offset; everything before this offset is already normal. */
+    protected function normalizer($strPath, $len, $offset) {
+        if ($len == 0) {
+            return $strPath;
+        }
+        if ($offset < 3) {
+            $offset = 0;    //Avoid fencepost cases with UNC pathnames
+        }
+        $src = 0;
+        $slash = $this->slash;
+        $sb = "";
+
+        if ($offset == 0) {
+            // Complete normalization, including prefix
+            $src = $this->normalizePrefix($strPath, $len, $sb);
+        } else {
+            // Partial normalization
+            $src = $offset;
+            $sb .= substr($strPath, 0, $offset);
+        }
+
+        // Remove redundant slashes from the remainder of the path, forcing all
+        // slashes into the preferred slash
+        while ($src < $len) {
+            $c = $strPath{$src++};
+            if ($this->isSlash($c)) {
+                while (($src < $len) && $this->isSlash($strPath{$src})) {
+                    $src++;
+                }
+                if ($src === $len) {
+                    /* Check for trailing separator */
+                    $sn = (int) strlen($sb);
+                    if (($sn == 2) && ($sb{1} === ':')) {
+                        // "z:\\"
+                        $sb .= $slash;
+                        break;
+                    }
+                    if ($sn === 0) {
+                        // "\\"
+                        $sb .= $slash;
+                        break;
+                    }
+                    if (($sn === 1) && ($this->isSlash($sb{0}))) {
+                        /* "\\\\" is not collapsed to "\\" because "\\\\" marks
+                        the beginning of a UNC pathname.  Even though it is
+                        not, by itself, a valid UNC pathname, we leave it as
+                        is in order to be consistent with the win32 APIs,
+                        which treat this case as an invalid UNC pathname
+                        rather than as an alias for the root directory of
+                        the current drive. */
+                        $sb .= $slash;
+                        break;
+                    }
+                    // Path does not denote a root directory, so do not append
+                    // trailing slash
+                    break;
+                } else {
+                    $sb .= $slash;
+                }
+            } else {
+                $sb.=$c;
+            }
+        }
+        $rv = (string) $sb;
+        return $rv;
+    }
+
+    /**
+     * Check that the given pathname is normal.  If not, invoke the real
+     * normalizer on the part of the pathname that requires normalization.
+     * This way we iterate through the whole pathname string only once.
+     * @param string $strPath
+     * @return string
+     */
+    function normalize($strPath) {
+        $n = strlen($strPath);
+        $slash    = $this->slash;
+        $altSlash = $this->altSlash;
+        $prev = 0;
+        for ($i = 0; $i < $n; $i++) {
+            $c = $strPath{$i};
+            if ($c === $altSlash) {
+                return $this->normalizer($strPath, $n, ($prev === $slash) ? $i - 1 : $i);
+            }
+            if (($c === $slash) && ($prev === $slash) && ($i > 1)) {
+                return $this->normalizer($strPath, $n, $i - 1);
+            }
+            if (($c === ':') && ($i > 1)) {
+                return $this->normalizer($strPath, $n, 0);
+            }
+            $prev = $c;
+        }
+        if ($prev === $slash) {
+            return $this->normalizer($strPath, $n, $n - 1);
+        }
+        return $strPath;
+    }
+
+    function prefixLength($strPath) {
+        $path  = (string) $strPath;
+        $slash = (string) $this->slash;
+        $n = (int) strlen($path);
+        if ($n === 0) {
+            return 0;
+        }
+        $c0 = $path{0};
+        $c1 = ($n > 1) ? $path{1} :
+              0;
+        if ($c0 === $slash) {
+            if ($c1 === $slash) {
+                return 2;            // absolute UNC pathname "\\\\foo"
+            }
+            return 1;                // drive-relative "\\foo"
+        }
+
+        if ($this->isLetter($c0) && ($c1 === ':')) {
+            if (($n > 2) && ($path{2}) === $slash) {
+                return 3;            // Absolute local pathname "z:\\foo" */
+            }
+            return 2;                // Directory-relative "z:foo"
+        }
+        return 0;                    // Completely relative
+    }
+
+    function resolve($parent, $child) {
+        $parent = (string) $parent;
+        $child  = (string) $child;
+        $slash  = (string) $this->slash;
+
+        $pn = (int) strlen($parent);
+        if ($pn === 0) {
+            return $child;
+        }
+        $cn = (int) strlen($child);
+        if ($cn === 0) {
+            return $parent;
+        }
+
+        $c = $child;
+        if (($cn > 1) && ($c{0} === $slash)) {
+            if ($c{1} === $slash) {
+                // drop prefix when child is a UNC pathname
+                $c = substr($c, 2);
+            }
+            else {
+                //Drop prefix when child is drive-relative */
+                $c = substr($c, 1);
+            }
+        }
+
+        $p = $parent;
+        if ($p{$pn - 1} === $slash) {
+            $p = substr($p, 0, $pn - 1);
+        }
+        return $p.$this->slashify($c);
+    }
+
+    function getDefaultParent() {
+        return (string) ("".$this->slash);
+    }
+
+    function fromURIPath($strPath) {
+        $p = (string) $strPath;
+        if ((strlen($p) > 2) && ($p{2} === ':')) {
+
+            // "/c:/foo" --> "c:/foo"
+            $p = substr($p,1);
+
+            // "c:/foo/" --> "c:/foo", but "c:/" --> "c:/"
+            if ((strlen($p) > 3) && StringHelper::endsWith('/', $p)) {
+                $p = substr($p, 0, strlen($p) - 1);
+            }
+        } elseif ((strlen($p) > 1) && StringHelper::endsWith('/', $p)) {
+            // "/foo/" --> "/foo"
+            $p = substr($p, 0, strlen($p) - 1);
+        }
+        return (string) $p;
+    }
+
+
+    /* -- Path operations -- */
+
+    function isAbsolute(PhingFile $f) {
+        $pl = (int) $f->getPrefixLength();
+        $p  = (string) $f->getPath();
+        return ((($pl === 2) && ($p{0} === $this->slash)) || ($pl === 3) || ($pl === 1 && $p{0} === $this->slash));
+    }
+
+    /** private */
+    function _driveIndex($d) {
+        $d = (string) $d{0};
+        if ((ord($d) >= ord('a')) && (ord($d) <= ord('z'))) {
+            return ord($d) - ord('a');
+        }
+        if ((ord($d) >= ord('A')) && (ord($d) <= ord('Z'))) {
+            return ord($d) - ord('A');
+        }
+        return -1;
+    }
+
+    /** private */
+    function _getDriveDirectory($drive) {
+        $drive = (string) $drive{0};
+        $i = (int) $this->_driveIndex($drive);
+        if ($i < 0) {
+            return null;
+        }
+
+        $s = (isset(self::$driveDirCache[$i]) ? self::$driveDirCache[$i] : null);
+
+        if ($s !== null) {
+            return $s;
+        }
+
+        $s = $this->_getDriveDirectory($i + 1);
+        self::$driveDirCache[$i] = $s;
+        return $s;
+    }
+
+    function _getUserPath() {
+        //For both compatibility and security, we must look this up every time
+        return (string) $this->normalize(Phing::getProperty("user.dir"));
+    }
+
+    function _getDrive($path) {
+        $path = (string) $path;
+        $pl   = $this->prefixLength($path);
+        return ($pl === 3) ? substr($path, 0, 2) : null;
+    }
+
+    function resolveFile(PhingFile $f) {
+        $path = $f->getPath();
+        $pl   = (int) $f->getPrefixLength();
+
+        if (($pl === 2) && ($path{0} === $this->slash)) {
+            return path;            // UNC
+        }
+
+        if ($pl === 3) {
+            return $path;            // Absolute local
+        }
+
+        if ($pl === 0) {
+            return (string) ($this->_getUserPath().$this->slashify($path)); //Completely relative
+        }
+
+        if ($pl === 1) {            // Drive-relative
+            $up = (string) $this->_getUserPath();
+            $ud = (string) $this->_getDrive($up);
+            if ($ud !== null) {
+                return (string) $ud.$path;
+            }
+            return (string) $up.$path;            //User dir is a UNC path
+        }
+
+        if ($pl === 2) {                // Directory-relative
+            $up = (string) $this->_getUserPath();
+            $ud = (string) $this->_getDrive($up);
+            if (($ud !== null) && StringHelper::startsWith($ud, $path)) {
+                return (string) ($up . $this->slashify(substr($path,2)));
+            }
+            $drive = (string) $path{0};
+            $dir   = (string) $this->_getDriveDirectory($drive);
+
+            $np = (string) "";
+            if ($dir !== null) {
+                /* When resolving a directory-relative path that refers to a
+                drive other than the current drive, insist that the caller
+                have read permission on the result */
+                $p = (string) $drive . (':'.$dir.$this->slashify(substr($path,2)));
+
+                if (!$this->checkAccess($p, false)) {
+                    // FIXME
+                    // throw security error
+                    die("Can't resolve path $p");
+                }
+                return $p;
+            }
+            return (string) $drive.':'.$this->slashify(substr($path,2)); //fake it
+        }
+        
+        throw new Exception("Unresolvable path: " . $path);
+    }
+
+    /* -- most of the following is mapped to the functions mapped th php natives in FileSystem */
+
+    /* -- Attribute accessors -- */
+
+    function setReadOnly($f) {
+        // dunno how to do this on win
+        throw new Exception("WIN32FileSystem doesn't support read-only yet.");
+    }
+
+    /* -- Filesystem interface -- */
+
+    protected function _access($path) {
+        if (!$this->checkAccess($path, false)) {
+            throw new Exception("Can't resolve path $p");
+        }
+        return true;
+    }
+
+    function _nativeListRoots() {
+        // FIXME
+    }
+
+    function listRoots() {
+        $ds = _nativeListRoots();
+        $n = 0;
+        for ($i = 0; $i < 26; $i++) {
+            if ((($ds >> $i) & 1) !== 0) {
+                if (!$this->access((string)( chr(ord('A') + $i) . ':' . $this->slash))) {
+                    $ds &= ~(1 << $i);
+                } else {
+                    $n++;
+                }
+            }
+        }
+        $fs = array();
+        $j = (int) 0;
+        $slash = (string) $this->slash;
+        for ($i = 0; $i < 26; $i++) {
+            if ((($ds >> $i) & 1) !== 0) {
+                $fs[$j++] = new PhingFile(chr(ord('A') + $i) . ':' . $this->slash);
+            }
+        }
+        return $fs;
+    }
+
+    /* -- Basic infrastructure -- */
+
+    /** compares file paths lexicographically */
+    function compare(PhingFile $f1, PhingFile $f2) {
+        $f1Path = $f1->getPath();
+        $f2Path = $f2->getPath();
+        return (boolean) strcasecmp((string) $f1Path, (string) $f2Path);        
+    }
+
+
+    /**
+     * returns the contents of a directory in an array
+     */
+    function lister($f) {
+        $dir = @opendir($f->getAbsolutePath());
+        if (!$dir) {
+            throw new Exception("Can't open directory " . $f->__toString());
+        }
+        $vv = array();
+        while (($file = @readdir($dir)) !== false) {
+            if ($file == "." || $file == "..") {
+                continue;
+            }
+            $vv[] = (string) $file;
+        }
+        @closedir($dir);
+        return $vv;
+    }
+
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/Win32FileSystem.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/WinNTFileSystem.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/WinNTFileSystem.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/WinNTFileSystem.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+<?php
+/*
+ *  $Id: WinNTFileSystem.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+include_once 'phing/system/io/Win32FileSystem.php';
+
+/**
+ * FileSystem for Windows NT/2000.
+ *  @package   phing.system.io
+ */
+
+class WinNTFileSystem extends Win32FileSystem {
+
+    /* -- class only for convenience and future use everything is inherinted --*/
+
+
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/WinNTFileSystem.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/Writer.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/Writer.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/Writer.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,48 @@
+<?php
+/*
+ *  $Id: Writer.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+/**
+ * Abstract class for writing character streams. 
+ * @package   phing.system.io
+ */
+abstract class Writer {
+
+    abstract public function write($buf, $off = null, $len = null);
+
+    abstract public function reset();
+    
+    abstract public function close();
+    
+    abstract public function open();
+
+    public function mark() {}
+    
+    public function ready() {}
+
+    public function markSupported() {}
+    
+    /**
+     * Returns the filename, url, etc. that is being written to.
+     * @return string
+     */    
+    abstract function getResource();
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/io/Writer.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/Character.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/Character.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/Character.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,49 @@
+<?php
+/*
+ *  $Id: Character.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ * @package phing.system.lang
+ */
+class Character {
+
+    // this class might be extended with plenty of ordinal char constants
+    // and the like to support the multibyte aware datatype (char) in php
+    // in form of an object.
+    // anyway just a thought
+
+    public static function isLetter($char) {
+
+        if (strlen($char) !== 1)
+            $char = 0;
+
+        $char = (int) ord($char);
+
+        if ($char >= ord('A') && $char <= ord('Z'))
+            return true;
+
+        if ($char >= ord('a') && $char <= ord('z'))
+            return true;
+
+        return false;
+    }
+
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/Character.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/EventObject.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/EventObject.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/EventObject.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,52 @@
+<?php
+/*
+ *  $Id: EventObject.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ *  @package phing.system.lang
+ */
+class EventObject {
+
+    /** The object on which the Event initially occurred. */
+    protected $source;
+
+    /** Constructs a prototypical Event. */
+    function __construct($source) {
+        if ($source === null) {
+            throw new Exception("Null source");
+        }
+        $this->source = $source;
+    }
+
+    /** The object on which the Event initially occurred. */
+    function getSource() {
+        return $this->source;
+    }
+
+    /** Returns a String representation of this EventObject.*/
+    function toString() {
+        if (method_exists($this->source, "toString")) {
+            return get_class($this)."[source=".$this->source->toString()."]";
+        } else {
+            return get_class($this)."[source=".get_class($this->source)."]";
+        }
+    }
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/EventObject.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/FileNotFoundException.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/FileNotFoundException.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/FileNotFoundException.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,27 @@
+<?php
+/*
+ *  $Id: FileNotFoundException.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ *  @package   phing.system.lang
+ */
+class FileNotFoundException extends Exception {}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/FileNotFoundException.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/NullPointerException.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/NullPointerException.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/NullPointerException.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,27 @@
+<?php
+/*
+ *  $Id: NullPointerException.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ * @package phing.system.lang
+ */
+class NullPointerException extends Exception {}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/NullPointerException.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/SecurityException.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/SecurityException.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/SecurityException.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,27 @@
+<?php
+/*
+ *  $Id: SecurityException.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ * @package phing.system.lang
+ */
+class SecurityException extends Exception {}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/lang/SecurityException.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Message.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Message.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Message.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,9 @@
+<?php
+//
+// FIXME. Logger will be renamed to Message, new level is introduces MSG_NOTICE
+// Message can handle some more later on
+//   - formatted output
+//   - sending to dialog or phpgtk whatever
+//   - etc
+//
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Message.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Properties.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Properties.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Properties.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,270 @@
+<?php
+
+/*
+ *  $Id: Properties.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/system/io/PhingFile.php';
+include_once 'phing/system/io/FileWriter.php';
+
+/**
+ * Convenience class for reading and writing property files.
+ * 
+ * FIXME
+ *        - Add support for arrays (separated by ',')
+ *
+ * @package    phing.system.util
+ * @version $Revision: 1.13 $
+ */
+class Properties {
+
+    private $properties = array();
+
+    /**
+     * Load properties from a file.
+     *
+     * @param PhingFile $file
+     * @return void
+     * @throws IOException - if unable to read file.
+     */
+    function load(PhingFile $file) {
+        if ($file->canRead()) {
+            $this->parse($file->getPath(), false);                    
+        } else {
+            throw new IOException("Can not read file ".$file->getPath());
+        }
+        
+    }
+    
+    /**
+     * Replaces parse_ini_file() or better_parse_ini_file().
+     * Saves a step since we don't have to parse and then check return value
+     * before throwing an error or setting class properties.
+     * 
+     * @param string $filePath
+     * @param boolean $processSections Whether to honor [SectionName] sections in INI file.
+     * @return array Properties loaded from file (no prop replacements done yet).
+     */
+    protected function parse($filePath) {
+
+        // load() already made sure that file is readable                
+        // but we'll double check that when reading the file into 
+        // an array
+        
+        if (($lines = @file($filePath)) === false) {
+            throw new IOException("Unable to parse contents of $filePath");
+        }
+        
+        $this->properties = array();
+        $sec_name = "";
+        
+        foreach($lines as $line) {
+            
+            $line = trim($line);
+    
+            if($line == "")
+                continue;
+                    
+            if ($line{0} == '#' or $line{0} == ';') {
+                // it's a comment, so continue to next line
+                continue;
+            } else {
+                $pos = strpos($line, '=');
+                $property = trim(substr($line, 0, $pos));
+                $value = trim(substr($line, $pos + 1));                
+                $this->properties[$property] = $this->inVal($value);
+            }
+            
+        } // for each line        
+    }
+    
+    /**
+     * Process values when being read in from properties file.
+     * does things like convert "true" => true
+     * @param string $val Trimmed value.
+     * @return mixed The new property value (may be boolean, etc.)
+     */
+    protected function inVal($val) {
+        if ($val === "true") { 
+            $val = true;
+        } elseif ($val === "false") { 
+            $val = false; 
+        }
+        return $val;
+    }
+    
+    /**
+     * Process values when being written out to properties file.
+     * does things like convert true => "true"
+     * @param mixed $val The property value (may be boolean, etc.)
+     * @return string
+     */
+    protected function outVal($val) {
+        if ($val === true) {
+            $val = "true";
+        } elseif ($val === false) {
+            $val = "false";
+        }
+        return $val;
+    }
+    
+    /**
+     * Create string representation that can be written to file and would be loadable using load() method.
+     * 
+     * Essentially this function creates a string representation of properties that is ready to
+     * write back out to a properties file.  This is used by store() method.
+     *
+     * @return string
+     */
+    public function toString() {
+        $buf = "";        
+        foreach($this->properties as $key => $item) {
+            $buf .= $key . "=" . $this->outVal($item) . Phing::getProperty('line.separator');
+        }
+        return $buf;    
+    }
+    
+    /**
+     * Stores current properties to specified file.
+     * 
+     * @param PhingFile $file File to create/overwrite with properties.
+     * @param string $header Header text that will be placed (within comments) at the top of properties file.
+     * @return void
+     * @throws IOException - on error writing properties file.
+     */
+    function store(PhingFile $file, $header = null) {
+        // stores the properties in this object in the file denoted
+        // if file is not given and the properties were loaded from a
+        // file prior, this method stores them in the file used by load()        
+        try {
+            $fw = new FileWriter($file);
+            $fw->open();
+            if ($header !== null) {
+                $fw->write( "# " . $header . Phing::getProperty("line.separator") );
+            }
+            $fw->write($this->toString());
+            $fw->close();
+        } catch (IOException $e) {
+            throw new IOException("Error writing property file: " . $e->getMessage());
+        }                
+    }
+    
+    /**
+     * Returns copy of internal properties hash.
+     * Mostly for performance reasons, property hashes are often
+     * preferable to passing around objects.
+     *
+     * @return array
+     */
+    function getProperties() {
+        return $this->properties;
+    }
+    
+    /**
+     * Get value for specified property.
+     * This is the same as get() method.
+     *
+     * @param string $prop The property name (key).
+     * @return mixed
+     * @see get()
+     */
+    function getProperty($prop) {
+        if (!isset($this->properties[$prop])) {
+            return null;
+        }
+        return $this->properties[$prop];
+    }
+
+    /**
+     * Get value for specified property.
+     * This function exists to provide a hashtable-like interface for
+     * properties.
+     *
+     * @param string $prop The property name (key).
+     * @return mixed
+     * @see getProperty()
+     */    
+    function get($prop) {
+         if (!isset($this->properties[$prop])) {
+            return null;
+        }
+        return $this->properties[$prop];
+    }
+    
+    /**
+     * Set the value for a property.
+     *
+     * @param string $key
+     * @param mixed $value
+     * @return mixed Old property value or NULL if none was set.
+     */
+    function setProperty($key, $value) {
+        $oldValue = @$this->properties[$key];       
+        $this->properties[$key] = $value;
+        return $oldValue;
+    }
+    
+    /**
+     * Set the value for a property.
+     * This function exists to provide hashtable-lie
+     * interface for properties.
+     *
+     * @param string $key
+     * @param mixed $value
+     */
+    function put($key, $value) {
+        return $this->setProperty($key, $value);
+    }
+    
+    /**
+     * Same as keys() function, returns an array of property names.
+     * @return array
+     */
+    function propertyNames() {
+        return $this->keys();
+    }
+    
+    /**
+     * Whether loaded properties array contains specified property name.
+     * @return boolean
+     */
+    function containsKey($key) {
+        return isset($this->properties[$key]);
+    }
+
+    /**
+     * Returns properties keys.
+     * Use this for foreach() {} iterations, as this is
+     * faster than looping through property values.
+     * @return array
+     */
+    function keys() {
+        return array_keys($this->properties);
+    }
+    
+    /**
+     * Whether properties list is empty.
+     * @return boolean
+     */
+    function isEmpty() {
+        return empty($this->properties);
+    }
+
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Properties.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Register.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Register.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Register.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,115 @@
+<?php
+
+/**
+ * Static class to handle a slot-listening system.
+ *
+ * Unlike the slots/signals Qt model, this class manages something that is
+ * more like a simple hashtable, where each slot has only one value.  For that
+ * reason "Registers" makes more sense, the reference being to CPU registers.
+ *
+ * This could be used for anything, but it's been built for a pretty specific phing
+ * need, and that is to allow access to dynamic values that are set by logic
+ * that is not represented in a build file.  For exampe, we need a system for getting
+ * the current resource (file) that is being processed by a filterchain in a fileset.
+ * 
+ * Each slot corresponds to only one read-only, dynamic-value RegisterSlot object. In
+ * a build.xml register slots are expressed using a syntax similar to variables:
+ * 
+ * <replaceregexp>
+ *    <regexp pattern="\n" replace="%{task.current_file}"/>
+ * </replaceregexp>
+ * 
+ * The task/type must provide a supporting setter for the attribute:
+ * 
+ * <code>
+ *     function setListeningReplace(RegisterSlot $slot) {
+ *        $this->replace = $slot;
+ *  }
+ *
+ *  // in main()
+ *  if ($this->replace instanceof RegisterSlot) {
+ *        $this->regexp->setReplace($this->replace->getValue());
+ *  } else {
+ *        $this->regexp->setReplace($this->replace);
+ *  }
+ * </code>
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 1.3 $
+ * @package phing.system.util
+ */
+class Register {
+    
+    /** Slots that have been registered */
+    private static $slots = array();
+    
+    /**
+     * Returns RegisterSlot for specified key.
+     * 
+     * If not slot exists a new one is created for key.
+     * 
+     * @param string $key
+     * @return RegisterSlot
+     */
+    public static function getSlot($key) {
+        if (!isset(self::$slots[$key])) {
+            self::$slots[$key] = new RegisterSlot($key);
+        }
+        return self::$slots[$key];
+    }    
+}
+
+
+/**
+ * Represents a slot in the register.
+ */
+class RegisterSlot {
+    
+    /** The name of this slot. */
+    private $key;
+    
+    /** The value for this slot. */
+    private $value;
+    
+    /**
+     * Constructs a new RegisterSlot, setting the key to passed param.
+     * @param string $key
+     */
+    public function __construct($key) {
+        $this->key = (string) $key;
+    }
+    
+    /**
+     * Sets the key / name for this slot.
+     * @param string $k
+     */
+    public function setKey($k) {
+        $this->key = (string) $k;
+    }
+
+    /**
+     * Gets the key / name for this slot.
+     * @return string
+     */
+    public function getKey() {
+        return $this->key;
+    }
+    
+    /**
+     * Sets the value for this slot.
+     * @param mixed
+     */
+    public function setValue($v) {
+        $this->value = $v;
+    }
+    
+    /**
+     * Returns the value at this slot.
+     * @return mixed
+     */
+    public function getValue() {
+        return $this->value;
+    }
+    
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Register.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Timer.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Timer.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Timer.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,96 @@
+<?php
+/*
+ *  $Id: Timer.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+
+/**
+ * This class can be used to obtain the execution time of all of the scripts
+ * that are executed in the process of building a page.
+ *
+ * Example:
+ * To be done before any scripts execute:
+ *
+ * $Timer = new Timer;
+ * $Timer->Start_Timer();
+ *
+ * To be done after all scripts have executed:
+ *
+ * $timer->Stop_Timer();
+ * $timer->Get_Elapsed_Time(int number_of_places);
+ *
+ * @author    Charles Killian
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @package    phing.system.util
+ * @version    $Revision: 1.5 $ $Date$
+ */
+class Timer {
+
+    /** start time */
+    protected $stime;
+    
+    /** end time */
+    protected $etime;  
+
+    /**
+     * This function sets the class variable $stime to the current time in
+     * microseconds.
+     * @return void
+     */
+    public function start() {
+        $this->stime = $this->getMicrotime();
+    }
+
+    /**
+     * This function sets the class variable $etime to the current time in
+     * microseconds.
+     * @return void
+     */
+    function stop() {
+        $this->etime = $this->getMicrotime();
+    }
+    
+    /**
+     * This function returns the elapsed time in seconds.
+     *
+     * Call start_time() at the beginning of script execution and end_time() at
+     * the end of script execution.  Then, call elapsed_time() to obtain the
+     * difference between start_time() and end_time().
+     *
+     * @param    $places  decimal place precision of elapsed time (default is 5)
+     * @return string Properly formatted time.
+     */
+    function getElapsedTime($places=5) {
+        $etime = $this->etime - $this->stime;
+        $format = "%0.".$places."f";
+        return (sprintf ($format, $etime));
+    }
+
+    /**
+     * This function returns the current time in microseconds.
+     *
+     * @author    Everett Michaud, Zend.com
+     * @return    current time in microseconds
+     * @access    private
+     */
+    function getMicrotime() {
+        list($usec, $sec) = explode(" ", microtime());
+        return ((float)$usec + (float)$sec);
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/system/util/Timer.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/defaults.properties
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/defaults.properties	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/defaults.properties	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,72 @@
+; -------------------------------------
+; These taskdefs are loaded at startup.
+; -------------------------------------
+
+; Internal system tasks
+; 
+adhoc=phing.tasks.system.AdhocTask
+adhoc-task=phing.tasks.system.AdhocTaskdefTask
+adhoc-type=phing.tasks.system.AdhocTypedefTask
+append=phing.tasks.system.AppendTask
+available=phing.tasks.system.AvailableTask
+chmod=phing.tasks.system.ChmodTask
+concat=phing.tasks.system.AppendTask
+condition=phing.tasks.system.ConditionTask
+copy=phing.tasks.system.CopyTask
+cvs=phing.tasks.system.CvsTask
+cvspass=phing.tasks.system.CvsPassTask
+delete=phing.tasks.system.DeleteTask
+echo=phing.tasks.system.EchoTask
+exec=phing.tasks.system.ExecTask
+fail=phing.tasks.system.ExitTask
+foreach=phing.tasks.system.ForeachTask
+includepath=phing.tasks.system.IncludePathTask
+input=phing.tasks.system.InputTask
+mkdir=phing.tasks.system.MkdirTask
+move=phing.tasks.system.MoveTask
+phing=phing.tasks.system.PhingTask
+phingcall=phing.tasks.system.PhingCallTask
+php=phing.tasks.system.PhpEvalTask
+property=phing.tasks.system.PropertyTask
+propertyprompt=phing.tasks.system.PropertyPromptTask
+reflexive=phing.tasks.system.ReflexiveTask
+resolvepath=phing.tasks.system.ResolvePathTask
+taskdef=phing.tasks.system.TaskdefTask
+touch=phing.tasks.system.TouchTask
+tstamp=phing.tasks.system.TstampTask
+typedef=phing.tasks.system.TypedefTask
+uptodate=phing.tasks.system.UpToDateTask
+xslt=phing.tasks.system.XsltTask
+if=phing.tasks.system.IfTask
+warn=phing.tasks.system.WarnTask
+
+; "Core" contributed tasks
+; -- i.e. no taskdef needed.
+
+sql=phing.tasks.ext.CreoleSQLExecTask
+package-as-path=phing.tasks.ext.PackageAsPathTask
+smarty=phing.tasks.ext.SmartyTask
+capsule=phing.tasks.ext.CapsuleTask
+tar=phing.tasks.ext.TarTask
+untar=phing.tasks.ext.UntarTask
+pearpkg=phing.tasks.ext.PearPackageTask
+mail=phing.tasks.ext.MailTask
+zip=phing.tasks.ext.ZipTask
+unzip=phing.tasks.ext.UnzipTask
+phplint=phing.tasks.ext.PhpLintTask
+
+; "ext" tasks
+phpdoc=phing.tasks.ext.phpdoc.PHPDocumentorTask
+svnlastrevision=phing.tasks.ext.svn.SvnLastRevisionTask
+svnexport=phing.tasks.ext.svn.SvnExportTask
+phpunit2=phing.tasks.ext.phpunit2.PHPUnit2Task
+phpunit2report=phing.tasks.ext.phpunit2.PHPUnit2ReportTask
+coverage-setup=phing.tasks.ext.coverage.CoverageSetupTask
+coverage-merger=phing.tasks.ext.coverage.CoverageMergerTask
+coverage-report=phing.tasks.ext.coverage.CoverageReportTask
+ioncubeencoder=phing.tasks.ext.ioncube.IoncubeEncoderTask
+ioncubelicense=phing.tasks.ext.ioncube.IoncubeLicenseTask
+simpletest=phing.tasks.ext.simpletest.SimpleTestTask
+phplint=phing.tasks.ext.PhpLintTask
+xmllint=phing.tasks.ext.XmlLintTask
+analyze=phing.tasks.ext.ZendCodeAnalyzerTask
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/CapsuleTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/CapsuleTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/CapsuleTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,478 @@
+<?php
+
+/*
+ *  $Id: CapsuleTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+ 
+include_once 'phing/Task.php';
+include_once 'phing/BuildException.php';
+include_once 'phing/lib/Capsule.php';
+include_once 'phing/util/StringHelper.php';
+
+/**
+ * A phing task for generating output by using Capsule.
+ *
+ * This is based on the interface to TexenTask from Apache's Velocity engine. 
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.17 $
+ * @package   phing.tasks.ext
+ */
+class CapsuleTask extends Task {
+
+    /**
+     * Capsule "template" engine.
+     * @var Capsule
+     */
+    protected $context;
+       
+    /**
+     * Any vars assigned via the build file.
+     * @var array AssignedVar[]
+     */
+    protected $assignedVars = array();
+    
+    /**
+     * This is the control template that governs the output.
+     * It may or may not invoke the services of worker
+     * templates.
+     * @var string
+     */
+    protected $controlTemplate;
+    
+    /**
+     * This is where Velocity will look for templates
+     * using the file template loader.
+     * @var string
+     */
+    protected $templatePath;
+    
+    /**
+     * This is where texen will place all the output
+     * that is a product of the generation process.
+     * @var string
+     */
+    protected $outputDirectory;
+    
+    /**
+     * This is the file where the generated text
+     * will be placed.
+     * @var string
+     */
+    protected $outputFile;
+
+    /**
+     * <p>
+     * These are properties that are fed into the
+     * initial context from a properties file. This
+     * is simply a convenient way to set some values
+     * that you wish to make available in the context.
+     * </p>
+     * <p>
+     * These values are not critical, like the template path
+     * or output path, but allow a convenient way to
+     * set a value that may be specific to a particular
+     * generation task.
+     * </p>
+     * <p>
+     * For example, if you are generating scripts to allow
+     * user to automatically create a database, then
+     * you might want the <code>$databaseName</code> 
+     * to be placed
+     * in the initial context so that it is available
+     * in a script that might look something like the
+     * following:
+     * <code><pre>
+     * #!bin/sh
+     * 
+     * echo y | mysqladmin create $databaseName
+     * </pre></code>
+     * The value of <code>$databaseName</code> isn't critical to
+     * output, and you obviously don't want to change
+     * the ant task to simply take a database name.
+     * So initial context values can be set with
+     * properties file.
+     *
+     * @var array
+     */
+    protected $contextProperties;
+        
+    // -----------------------------------------------------------------------
+    // The following getters & setters are used by phing to set properties
+    // specified in the XML for the capsule task.
+    // -----------------------------------------------------------------------
+    
+    /**
+     * [REQUIRED] Set the control template for the
+     * generating process.
+     * @param string $controlTemplate
+     * @return void
+     */
+    public function setControlTemplate ($controlTemplate) {
+        $this->controlTemplate = $controlTemplate;
+    }
+
+    /**
+     * Get the control template for the
+     * generating process.
+     * @return string
+     */
+    public function getControlTemplate() {
+        return $this->controlTemplate;
+    }
+
+    /**
+     * [REQUIRED] Set the path where Velocity will look
+     * for templates using the file template
+     * loader.
+     * @return void
+     * @throws Exception 
+     */
+    public function setTemplatePath($templatePath) {
+        $resolvedPath = "";        
+        $tok = strtok($templatePath, ",");
+        while ( $tok ) {            
+            // resolve relative path from basedir and leave
+            // absolute path untouched.
+            $fullPath = $this->project->resolveFile($tok);
+            $cpath = $fullPath->getCanonicalPath();
+            if ($cpath === false) {
+                $this->log("Template directory does not exist: " . $fullPath->getAbsolutePath());
+            } else {
+                $resolvedPath .= $cpath;
+            }
+            $tok = strtok(",");
+            if ( $tok ) {
+                $resolvedPath .= ",";
+            }
+        }
+        $this->templatePath = $resolvedPath;
+     }
+
+    /**
+     * Get the path where Velocity will look
+     * for templates using the file template
+     * loader.
+     * @return string
+     */
+    public function getTemplatePath() {
+        return $this->templatePath;
+    }        
+
+    /**
+     * [REQUIRED] Set the output directory. It will be
+     * created if it doesn't exist.
+     * @param PhingFile $outputDirectory
+     * @return void
+     * @throws Exception
+     */
+    public function setOutputDirectory(PhingFile $outputDirectory) {
+        try {
+            if (!$outputDirectory->exists()) {
+                $this->log("Output directory does not exist, creating: " . $outputDirectory->getPath(),PROJECT_MSG_VERBOSE);
+                if (!$outputDirectory->mkdirs()) {
+                    throw new IOException("Unable to create Ouptut directory: " . $outputDirectory->getAbsolutePath());
+                }
+            }
+            $this->outputDirectory = $outputDirectory->getCanonicalPath();
+        } catch (IOException $ioe) {
+            throw new BuildException($ioe);
+        }
+    }
+      
+    /**
+     * Get the output directory.
+     * @return string
+     */
+    public function getOutputDirectory() {
+        return $this->outputDirectory;
+    }        
+
+    /**
+     * [REQUIRED] Set the output file for the
+     * generation process.
+     * @param string $outputFile (TODO: change this to File)
+     * @return void
+     */
+    public function setOutputFile($outputFile) {
+        $this->outputFile = $outputFile;
+    }
+
+    /**
+     * Get the output file for the
+     * generation process.
+     * @return string
+     */
+    public function getOutputFile() {
+        return $this->outputFile;
+    }        
+    
+    /**
+     * Set the context properties that will be
+     * fed into the initial context be the
+     * generating process starts.
+     * @param string $file
+     * @return void
+     */
+    public function setContextProperties($file) {
+        $sources = explode(",", $file);
+        $this->contextProperties = new Properties();
+        
+        // Always try to get the context properties resource
+        // from a file first. Templates may be taken from a JAR
+        // file but the context properties resource may be a 
+        // resource in the filesystem. If this fails than attempt
+        // to get the context properties resource from the
+        // classpath.
+        for ($i=0, $sourcesLength=count($sources); $i < $sourcesLength; $i++) {
+            $source = new Properties();
+            
+            try {
+            
+                // resolve relative path from basedir and leave
+                // absolute path untouched.
+                $fullPath = $this->project->resolveFile($sources[$i]);
+                $this->log("Using contextProperties file: " . $fullPath->toString());
+                $source->load($fullPath);
+                
+            } catch (Exception $e) {
+              
+              throw new BuildException("Context properties file " . $sources[$i] .
+                            " could not be found in the file system!");
+                     
+            }
+        
+            $keys = $source->keys();
+            
+            foreach ($keys as $key) {
+                $name = $key;
+                $value = $this->project->replaceProperties($source->getProperty($name));
+                $this->contextProperties->setProperty($name, $value);
+            }
+        }
+    }
+
+    /**
+     * Get the context properties that will be
+     * fed into the initial context be the
+     * generating process starts.
+     * @return Properties
+     */
+    public function getContextProperties() {
+        return $this->contextProperties;
+    }     
+
+    /** 
+     * Creates an "AssignedVar" class.
+     */
+    public function createAssign() {
+        $a = new AssignedVar();
+        $this->assignedVars[] = $a;
+        return $a;
+    }
+    
+    // ---------------------------------------------------------------
+    // End of XML setters & getters
+    // ---------------------------------------------------------------
+   
+    /**
+     * Creates a Smarty object.
+     *
+     * @return Smarty initialized (cleared) Smarty context.
+     * @throws Exception the execute method will catch 
+     *         and rethrow as a <code>BuildException</code>
+     */
+    public function initControlContext() {
+        $this->context->clear();
+        foreach($this->assignedVars as $var) {
+            $this->context->put($var->getName(), $var->getValue());
+        }
+        return $this->context;
+    }
+    
+    /**
+     * Execute the input script with Velocity
+     *
+     * @throws BuildException  
+     * BuildExceptions are thrown when required attributes are missing.
+     * Exceptions thrown by Velocity are rethrown as BuildExceptions.
+     */
+    public function main() {
+    
+        // Make sure the template path is set.
+        if (empty($this->templatePath)) {
+            throw new BuildException("The template path needs to be defined!");
+        }            
+    
+        // Make sure the control template is set.
+        if ($this->controlTemplate === null) {
+            throw new BuildException("The control template needs to be defined!");
+        }            
+
+        // Make sure the output directory is set.
+        if ($this->outputDirectory === null) {
+            throw new BuildException("The output directory needs to be defined!");
+        }            
+        
+        // Make sure there is an output file.
+        if ($this->outputFile === null) {
+            throw new BuildException("The output file needs to be defined!");
+        }            
+        
+        // Setup Smarty runtime.
+        
+        // Smarty uses one object to store properties and to store
+        // the context for the template (unlike Velocity).  We setup this object, calling it
+        // $this->context, and then initControlContext simply zeros out
+        // any assigned variables.
+        $this->context = new Capsule();
+                
+        if ($this->templatePath !== null) {
+            $this->log("Using templatePath: " . $this->templatePath);
+            $this->context->setTemplatePath($this->templatePath);
+        }                                                        
+                
+        // Make sure the output directory exists, if it doesn't
+        // then create it.
+        $outputDir = new PhingFile($this->outputDirectory);
+        if (!$outputDir->exists()) {
+            $this->log("Output directory does not exist, creating: " . $outputDir->getAbsolutePath());
+            $outputDir->mkdirs();
+        }
+        
+        $this->context->setOutputDirectory($outputDir->getAbsolutePath());
+        
+        $path = $this->outputDirectory . DIRECTORY_SEPARATOR . $this->outputFile;
+        $this->log("Generating to file " . $path);
+        
+        //$writer = new FileWriter($path);
+                
+        // The generator and the output path should
+        // be placed in the init context here and
+        // not in the generator class itself.
+        $c = $this->initControlContext();
+        
+        // Set any variables that need to always
+        // be loaded
+        $this->populateInitialContext($c);
+        
+        // Feed all the options into the initial
+        // control context so they are available
+        // in the control/worker templates.
+        if ($this->contextProperties !== null) {
+            
+            foreach($this->contextProperties->keys() as $property) {
+                    
+            $value = $this->contextProperties->getProperty($property);
+            
+            // Special exception (from Texen)
+            // for properties ending in file.contents:
+            // in that case we dump the contents of the file
+            // as the "value" for the Property.
+            if (preg_match('/file\.contents$/', $property)) {
+                // pull in contents of file specified 
+                                        
+                $property = substr($property, 0, strpos($property, "file.contents") - 1);
+                
+                // reset value, and then 
+                // read in teh contents of the file into that var
+                $value = "";
+                $f = new PhingFile($project->resolveFile($value)->getCanonicalPath());                        
+                if ($f->exists()) {
+                    $fr = new FileReader($f);
+                    $fr->readInto($value);
+                }
+                                                                
+            } // if ends with file.contents
+            
+            if (StringHelper::isBoolean($value)) {
+                $value = StringHelper::booleanValue($value);
+            }
+                                                            
+            $c->put($property, $value); 
+                 
+            } // foreach property
+                
+        } // if contextProperties !== null
+        
+        try {
+            $this->log("Parsing control template: " . $this->controlTemplate);
+            $c->parse($this->controlTemplate, $path);
+        } catch (Exception $ioe) {
+            throw new BuildException("Cannot write parsed template: ". $ioe->getMessage());
+        }        
+        
+        $this->cleanup();    
+    }
+
+    /**
+     * Place useful objects into the initial context.
+     *
+     *
+     * @param Capsule $context The context to populate, as retrieved from
+     * {@link #initControlContext()}.
+     * @return void
+     * @throws Exception Error while populating context.  The {@link
+     * #main()} method will catch and rethrow as a
+     * <code>BuildException</code>.
+     */
+    protected function populateInitialContext(Capsule $context) {
+        $this->context->put("now", strftime("%c", time()));
+        $this->context->put("task", $this);
+    }
+
+    /**
+     * A hook method called at the end of {@link #execute()} which can
+     * be overridden to perform any necessary cleanup activities (such
+     * as the release of database connections, etc.).  By default,
+     * does nothing.
+     * @return void
+     * @throws Exception Problem cleaning up.
+     */
+    protected function cleanup() {
+    }
+}
+
+
+/**
+ * An "inner" class for holding assigned var values.
+ * May be need to expand beyond name/value in the future.
+ */
+class AssignedVar {
+    
+    private $name;
+    private $value;
+    
+    function setName($v) {
+        $this->name = $v;
+    }
+    
+    function setValue($v) {
+        $this->value = $v;
+    }
+    
+    function getName() {
+        return $this->name;
+    }
+    
+    function getValue() {
+        return $this->value;
+    }
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/CapsuleTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/CreoleSQLExecTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/CreoleSQLExecTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/CreoleSQLExecTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,556 @@
+<?php
+/*
+ *  $Id: CreoleSQLExecTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/ext/CreoleTask.php';
+include_once 'phing/system/io/StringReader.php';
+
+/**
+ * Executes a series of SQL statements on a database using Creole.
+ *
+ * <p>Statements can
+ * either be read in from a text file using the <i>src</i> attribute or from 
+ * between the enclosing SQL tags.</p>
+ * 
+ * <p>Multiple statements can be provided, separated by semicolons (or the 
+ * defined <i>delimiter</i>). Individual lines within the statements can be 
+ * commented using either --, // or REM at the start of the line.</p>
+ * 
+ * <p>The <i>autocommit</i> attribute specifies whether auto-commit should be 
+ * turned on or off whilst executing the statements. If auto-commit is turned 
+ * on each statement will be executed and committed. If it is turned off the 
+ * statements will all be executed as one transaction.</p>
+ * 
+ * <p>The <i>onerror</i> attribute specifies how to proceed when an error occurs 
+ * during the execution of one of the statements. 
+ * The possible values are: <b>continue</b> execution, only show the error;
+ * <b>stop</b> execution and commit transaction;
+ * and <b>abort</b> execution and transaction and fail task.</p>
+ *
+ * @author    Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author    Jeff Martin <jeff en custommonkey.org> (Ant)
+ * @author    Michael McCallum <gholam en xtra.co.nz> (Ant)
+ * @author    Tim Stephenson <tim.stephenson en sybase.com> (Ant)
+ * @package   phing.tasks.ext
+ * @version   $Revision: 1.21 $
+ */
+class CreoleSQLExecTask extends CreoleTask {
+
+    private $goodSql = 0;
+    private $totalSql = 0;
+
+    const DELIM_ROW = "row";
+    const DELIM_NORMAL = "normal";
+
+    /**
+     * Database connection
+     */
+    private $conn = null;
+
+    /**
+     * files to load
+     */
+    private $filesets = array();
+
+    /**
+     * SQL statement
+     */
+    private $statement = null;
+
+    /**
+     * SQL input file
+     */
+    private $srcFile = null;
+
+    /**
+     * SQL input command
+     */
+    private $sqlCommand = "";
+
+    /**
+     * SQL transactions to perform
+     */
+    private $transactions = array();
+
+    /**
+     * SQL Statement delimiter
+     */
+    private $delimiter = ";";
+    
+    /**
+     * The delimiter type indicating whether the delimiter will
+     * only be recognized on a line by itself
+     */
+    private $delimiterType = "normal"; // can't use constant just defined
+    
+    /**
+     * Print SQL results.
+     */
+    private $print = false;
+
+    /**
+     * Print header columns.
+     */
+    private $showheaders = true;
+
+    /**
+     * Results Output file.
+     */
+    private $output = null;
+
+    
+    /**
+     * Action to perform if an error is found
+     **/
+    private $onError = "abort";
+    
+    /**
+     * Encoding to use when reading SQL statements from a file
+     */
+    private $encoding = null;
+
+    /**
+     * Append to an existing file or overwrite it?
+     */
+    private $append = false;
+        
+    /**
+     * Set the name of the SQL file to be run.
+     * Required unless statements are enclosed in the build file
+     */
+    public function setSrc(PhingFile $srcFile) {       
+        $this->srcFile = $srcFile;
+    }
+    
+    /**
+     * Set an inline SQL command to execute. 
+     * NB: Properties are not expanded in this text.
+     */
+    public function addText($sql) {
+        $this->sqlCommand .= $sql;
+    }
+    
+    /**
+     * Adds a set of files (nested fileset attribute).
+     */
+    public function addFileset(FileSet $set) {
+        $this->filesets[] = $set;
+    }
+
+    /**
+     * Add a SQL transaction to execute
+     */
+    public function createTransaction() {
+        $t = new SQLExecTransaction($this);
+        $this->transactions[] = $t;
+        return $t;
+    }
+    
+    /**
+     * Set the file encoding to use on the SQL files read in
+     *
+     * @param encoding the encoding to use on the files
+     */
+    public function setEncoding($encoding) {
+        $this->encoding = $encoding;
+    }
+    
+    /**
+     * Set the statement delimiter.
+     *
+     * <p>For example, set this to "go" and delimitertype to "ROW" for
+     * Sybase ASE or MS SQL Server.</p>
+     *
+     * @param delimiter
+     */
+    public function setDelimiter($delimiter)
+    {
+        $this->delimiter = $delimiter;
+    }
+
+    /**
+     * Set the Delimiter type for this sql task. The delimiter type takes two
+     * values - normal and row. Normal means that any occurence of the delimiter
+     * terminate the SQL command whereas with row, only a line containing just
+     * the delimiter is recognized as the end of the command.
+     *
+     * @param string $delimiterType
+     */
+    public function setDelimiterType($delimiterType)
+    {
+        $this->delimiterType = $delimiterType;
+    }
+    
+    /**
+     * Set the print flag.
+     *
+     * @param boolean $print
+     */
+    public function setPrint($print)
+    {
+        $this->print = (boolean) $print;
+    }
+        
+    /**
+     * Print headers for result sets from the 
+     * statements; optional, default true.
+     * @param boolean $showheaders
+     */
+    public function setShowheaders($showheaders) {
+        $this->showheaders = (boolean) $showheaders;
+    }
+
+    /**
+     * Set the output file; 
+     * optional, defaults to the console.
+     * @param PhingFile $output
+     */
+    public function setOutput(PhingFile $output) {
+        $this->output = $output;
+    }
+
+    /**
+     * whether output should be appended to or overwrite
+     * an existing file.  Defaults to false.
+     * @param $append
+     */
+    public function setAppend($append) {
+        $this->append = (boolean) $append;
+    }
+
+    
+    /**
+     * Action to perform when statement fails: continue, stop, or abort
+     * optional; default &quot;abort&quot;
+     */
+    public function setOnerror($action) {
+        $this->onError = $action;
+    }
+
+    /**
+     * Load the sql file and then execute it
+     * @throws BuildException
+     */
+    public function main()  {
+            
+        $savedTransaction = array();
+        for($i=0,$size=count($this->transactions); $i < $size; $i++) {
+            $savedTransaction[] = clone $this->transactions[$i];
+        }
+        
+        $savedSqlCommand = $this->sqlCommand;
+
+        $this->sqlCommand = trim($this->sqlCommand);
+
+        try {
+            if ($this->srcFile === null && $this->sqlCommand === "" 
+                && empty($this->filesets)) { 
+                if (count($this->transactions) === 0) {
+                    throw new BuildException("Source file or fileset, "
+                                             . "transactions or sql statement "
+                                             . "must be set!", $this->location);
+                }
+            }
+        
+            if ($this->srcFile !== null && !$this->srcFile->exists()) {
+                throw new BuildException("Source file does not exist!", $this->location);
+            }
+
+            // deal with the filesets
+            for ($i = 0,$size=count($this->filesets); $i < $size; $i++) {
+                $fs = $this->filesets[$i];
+                $ds = $fs->getDirectoryScanner($this->project);
+                $srcDir = $fs->getDir($this->project);
+                
+                $srcFiles = $ds->getIncludedFiles();
+                
+                // Make a transaction for each file
+                for ($j=0, $size=count($srcFiles); $j < $size; $j++) {
+                    $t = $this->createTransaction();
+                    $t->setSrc(new PhingFile($srcDir, $srcFiles[$j]));
+                }
+            }
+            
+            // Make a transaction group for the outer command
+            $t = $this->createTransaction();
+            if ($this->srcFile) $t->setSrc($this->srcFile);
+            $t->addText($this->sqlCommand);
+            $this->conn = $this->getConnection();
+
+            try {
+                
+                $this->statement = $this->conn->createStatement();
+                
+                $out = null;
+                
+                try {
+                    
+                    if ($this->output !== null) {
+                        $this->log("Opening output file " . $this->output, PROJECT_MSG_VERBOSE);
+                        $out = new BufferedWriter(new FileWriter($this->output->getAbsolutePath(), $this->append));
+                    }
+                    
+                    // Process all transactions
+                    for ($i=0,$size=count($this->transactions); $i < $size; $i++) {
+                        $this->transactions[$i]->runTransaction($out);
+                        if (!$this->isAutocommit()) {
+                            $this->log("Commiting transaction", PROJECT_MSG_VERBOSE);
+                            $this->conn->commit();
+                        }
+                    }
+                    if ($out) $out->close();
+                } catch (Exception $e) {
+                    if ($out) $out->close();
+                    throw $e;
+                } 
+            } catch (IOException $e) {
+                if (!$this->isAutocommit() && $this->conn !== null && $this->onError == "abort") {
+                    try {
+                        $this->conn->rollback();
+                    } catch (SQLException $ex) {}
+                }
+                throw new BuildException($e->getMessage(), $this->location);
+            } catch (SQLException $e){
+                if (!$this->isAutocommit() && $this->conn !== null && $this->onError == "abort") {
+                    try {
+                        $this->conn->rollback();
+                    } catch (SQLException $ex) {}
+                }
+                throw new BuildException($e->getMessage(), $this->location);
+            }
+            
+            $this->log($this->goodSql . " of " . $this->totalSql .
+                " SQL statements executed successfully");
+        } catch (Exception $e) {
+            $this->transactions = $savedTransaction;
+            $this->sqlCommand = $savedSqlCommand;
+            throw $e;
+        }
+        // finally {
+        $this->transactions = $savedTransaction;
+        $this->sqlCommand = $savedSqlCommand;
+        
+    }
+
+
+    /**
+     * read in lines and execute them
+     * @throws SQLException, IOException 
+     */
+    public function runStatements(Reader $reader, $out = null) {
+        $sql = "";
+        $line = "";
+        $in = new BufferedReader($reader);
+        try {
+            while (($line = $in->readLine()) !== null) {
+                $line = trim($line);
+                $line = ProjectConfigurator::replaceProperties($this->project, $line,
+                        $this->project->getProperties());
+                
+                if (StringHelper::startsWith("//", $line) || 
+                    StringHelper::startsWith("--", $line) ||
+                    StringHelper::startsWith("#", $line)) {
+                    continue;
+                }
+                
+                if (strlen($line) > 4
+                        && strtoupper(substr($line,0, 4)) == "REM ") {
+                    continue;
+                }
+
+                $sql .= " " . $line;
+                $sql = trim($sql);
+
+                // SQL defines "--" as a comment to EOL
+                // and in Oracle it may contain a hint
+                // so we cannot just remove it, instead we must end it
+                if (strpos($line, "--") !== false) {
+                    $sql .= "\n";
+                }
+
+                if ($this->delimiterType == self::DELIM_NORMAL
+                        && StringHelper::endsWith($this->delimiter, $sql)
+                        || $this->delimiterType == self::DELIM_ROW
+                        && $line == $this->delimiter) {
+                    $this->log("SQL: " . $sql, PROJECT_MSG_VERBOSE);
+                    $this->execSQL(StringHelper::substring($sql, 0, strlen($sql) - strlen($this->delimiter) - 1), $out);
+                    $sql = "";
+                }
+            }
+
+            // Catch any statements not followed by ;
+            if ($sql !== "") {
+                $this->execSQL($sql, $out);
+            }
+        } catch (SQLException $e) {
+            throw new BuildException("Error running statements", $e);
+        }
+    }
+ 
+        
+    /**
+     * Exec the sql statement.
+     * @throws SQLException 
+     */
+    protected function execSQL($sql, $out = null) {
+        // Check and ignore empty statements
+        if (trim($sql) == "") {
+            return;
+        }
+
+        try {
+            $this->totalSql++;
+            if (!$this->statement->execute($sql)) {
+                $this->log($this->statement->getUpdateCount() . " rows affected", PROJECT_MSG_VERBOSE);
+            } else {
+                if ($this->print) {
+                    $this->printResults($out);
+                }
+            }
+            
+            $this->goodSql++;
+            
+        } catch (SQLException $e) {            
+            $this->log("Failed to execute: " . $sql, PROJECT_MSG_ERR);
+            if ($this->onError != "continue") {            
+                throw new BuildException("Failed to execute SQL", $e);
+            }
+            $this->log($e->getMessage(), PROJECT_MSG_ERR);
+        }
+    }
+    
+    /**
+     * print any results in the statement.
+     * @throw SQLException
+     */
+    protected function printResults($out = null) {
+        $lSep = Phing::getProperty('line.separator');
+        $rs = null;        
+        do {
+            $rs = $this->statement->getResultSet();
+            
+            if ($rs !== null) {
+            
+                $this->log("Processing new result set.", PROJECT_MSG_VERBOSE);            
+    
+                $line = "";
+
+                $colsprinted = false;
+                
+                while ($rs->next()) {
+                    $fields = $rs->getRow();
+                    
+                    if (!$colsprinted && $this->showheaders) {
+                        $first = true;
+                        foreach($fields as $fieldName => $ignore) {
+                            if ($first) $first = false; else $line .= ",";
+                            $line .= $fieldName;
+                        }
+                        if ($out !== null) {
+                            $out->write($line);
+                            $out->newLine();
+                        } else {
+                            print($line.$lSep);
+                        }
+                        $line = "";
+                        $colsprinted = true;
+                    } // if show headers
+                    
+                    $first = true;
+                    foreach($fields as $columnValue) {
+                        
+                        if ($columnValue != null) {
+                            $columnValue = trim($columnValue);
+                        }
+
+                        if ($first) {
+                            $first = false;
+                        } else {
+                            $line .= ",";
+                        }
+                        $line .= $columnValue;
+                    }
+                    
+                    if ($out !== null) {
+                        $out->write($line);
+                        $out->newLine();
+                    } else {                    
+                        print($line . $lSep);
+                    }
+                    $line = "";
+                    
+                } // while rs->next()
+            }
+        } while ($this->statement->getMoreResults());
+        print($lSep);
+        if ($out !== null) $out->newLine();
+    }
+}
+
+
+/**
+ * "Inner" class that contains the definition of a new transaction element.
+ * Transactions allow several files or blocks of statements
+ * to be executed using the same JDBC connection and commit
+ * operation in between.
+ */
+class SQLExecTransaction {
+
+    private $tSrcFile = null;
+    private $tSqlCommand = "";
+    private $parent;
+    
+    function __construct($parent)
+    {
+        // Parent is required so that we can log things ...
+        $this->parent = $parent;
+    }
+    
+    public function setSrc(PhingFile $src)
+    {
+        $this->tSrcFile = $src;
+    }
+
+    public function addText($sql)
+    {
+        $this->tSqlCommand .= $sql;
+    }
+
+    /**
+     * @throws IOException, SQLException
+     */
+    public function runTransaction($out = null)
+    {
+        if (!empty($this->tSqlCommand)) {
+            $this->parent->log("Executing commands", PROJECT_MSG_INFO);
+            $this->parent->runStatements(new StringReader($this->tSqlCommand), $out);
+        }
+
+        if ($this->tSrcFile !== null) {
+            $this->parent->log("Executing file: " . $this->tSrcFile->getAbsolutePath(),
+                PROJECT_MSG_INFO);
+            $reader = new FileReader($this->tSrcFile);
+            $this->parent->runStatements($reader, $out);
+            $reader->close();
+        }
+    }
+}
+
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/CreoleSQLExecTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/CreoleTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/CreoleTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/CreoleTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,242 @@
+<?php
+
+/*
+ *  $Id: CreoleTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+include_once 'phing/types/Reference.php';
+
+/**
+ * Handles Creole configuration needed by SQL type tasks.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author    Nick Chalko <nick en chalko.com> (Ant)
+ * @author    Jeff Martin <jeff en custommonkey.org> (Ant)
+ * @author    Michael McCallum <gholam en xtra.co.nz> (Ant)
+ * @author    Tim Stephenson <tim.stephenson en sybase.com> (Ant)
+ * @version   $Revision: 1.13 $
+ * @package   phing.tasks.system
+ */
+abstract class CreoleTask extends Task {
+
+    /**
+     * Used for caching loaders / driver. This is to avoid
+     * getting an OutOfMemoryError when calling this task
+     * multiple times in a row.
+     * 
+     * NOT IMPLEMENTED YET
+     */
+    private static $loaderMap = array();
+
+    private $caching = true;
+
+    /**
+     * Autocommit flag. Default value is false
+     */
+    private $autocommit = false;
+    
+    /**
+     * [optional] Classpath to Creole driver to use.
+     * @param string
+     */
+    private $driver;
+    
+    /**
+     * DB url.
+     */
+    private $url;
+
+    /**
+     * User name.
+     */
+    private $userId;
+
+    /**
+     * Password
+     */
+    private $password;
+
+    /**
+     * RDBMS Product needed for this SQL.
+     **/
+    private $rdbms;
+   
+      /**
+     * Initialize CreoleTask.
+     * This method includes any necessary Creole libraries and triggers
+     * appropriate error if they cannot be found.  This is not done in header
+     * because we may want this class to be loaded w/o triggering an error.
+     */
+    function init() {
+        include_once 'creole/Creole.php';
+        if (!class_exists('Creole')) {
+            throw new Exception("Creole task depends on Creole classes being on include_path. (i.e. include of 'creole/Creole.php' failed.)");
+        }
+    }
+
+    /**
+     * Caching loaders / driver. This is to avoid
+     * getting an OutOfMemoryError when calling this task
+     * multiple times in a row; default: true
+     * @param $enable
+     */
+    public function setCaching($enable) {
+        $this->caching = $enable;
+    }
+
+    /**
+     * Sets the database connection URL; required.
+     * @param url The url to set
+     */
+    public function setUrl($url) {
+        $this->url = $url;
+    }
+
+    /**
+     * Set the Creole driver to be used.
+     *
+     * @param string $driver driver class name
+     */
+    public function setDriver($driver)
+    {
+        $this->driver = $driver;
+    }
+        
+    /**
+     * Sets the password; required.
+     * @param password The password to set
+     */
+    public function setPassword($password) {
+        $this->password = $password;
+    }
+
+    /**
+     * Auto commit flag for database connection;
+     * optional, default false.
+     * @param autocommit The autocommit to set
+     */
+    public function setAutocommit($autocommit) {
+        $this->autocommit = $autocommit;
+    }
+
+    /**
+     * Sets the version string, execute task only if 
+     * rdbms version match; optional.
+     * @param version The version to set
+     */
+    public function setVersion($version) {
+        $this->version = $version;
+    }
+       
+    protected function getLoaderMap() {
+        return self::$loaderMap;
+    }
+
+
+    /**
+     * Creates a new Connection as using the driver, url, userid and password specified.
+     * The calling method is responsible for closing the connection.
+     * @return Connection the newly created connection.
+     * @throws BuildException if the UserId/Password/Url is not set or there is no suitable driver or the driver fails to load.
+     */
+    protected function getConnection() {
+            
+        if ($this->url === null) {
+            throw new BuildException("Url attribute must be set!", $this->location);
+        }
+                
+        try {
+
+            $this->log("Connecting to " . $this->getUrl(), PROJECT_MSG_VERBOSE);
+            $info = new Properties();
+            
+            $dsn = Creole::parseDSN($this->url);
+            
+            if (!isset($dsn["username"]) && $this->userId === null) {
+                throw new BuildException("Username must be in URL or userid attribute must be set.", $this->location);                
+            }                        
+            
+            if ($this->userId) {
+                $dsn["username"] = $this->getUserId();
+            }
+            
+            if ($this->password) {
+                $dsn["password"] = $this->getPassword();
+            }
+            
+            if ($this->driver) {
+                Creole::registerDriver($dsn['phptype'], $this->driver);
+            }
+            
+            $conn = Creole::getConnection($dsn);
+            $conn->setAutoCommit($this->autocommit);
+            return $conn;
+            
+        } catch (SQLException $e) {
+            throw new BuildException($e->getMessage(), $this->location);
+        }
+
+    }
+
+    public function isCaching($value) {
+        $this->caching = $value;
+    }
+
+    /**
+     * Gets the autocommit.
+     * @return Returns a boolean
+     */
+    public function isAutocommit() {
+        return $this->autocommit;
+    }
+
+    /**
+     * Gets the url.
+     * @return Returns a String
+     */
+    public function getUrl() {
+        return $this->url;
+    }
+
+    /**
+     * Gets the userId.
+     * @return Returns a String
+     */
+    public function getUserId() {
+        return $this->userId;
+    }
+
+    /**
+     * Set the user name for the connection; required.
+     * @param userId The userId to set
+     */
+    public function setUserid($userId) {
+        $this->userId = $userId;
+    }
+
+    /**
+     * Gets the password.
+     * @return Returns a String
+     */
+    public function getPassword() {
+        return $this->password;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/CreoleTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ExtractBaseTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ExtractBaseTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ExtractBaseTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,183 @@
+<?php
+/*
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/system/MatchingTask.php';
+
+/**
+ * Base class for extracting tasks such as Unzip and Untar.
+ *
+ * @author    Joakim Bodin <joakim.bodin+phing en gmail.com>
+ * @version   $Revision: 1.0 $
+ * @package   phing.tasks.ext
+ * @since     2.2.0
+ */
+abstract class ExtractBaseTask extends MatchingTask {
+    /**
+     * @var PhingFile $file
+     */
+    protected $file;
+    /**
+     * @var PhingFile $todir
+     */
+    protected $todir;
+    protected $removepath;
+    protected $filesets = array(); // all fileset objects assigned to this task
+
+    /**
+     * Add a new fileset.
+     * @return FileSet
+     */
+    public function createFileSet() {
+        $this->fileset = new FileSet();
+        $this->filesets[] = $this->fileset;
+        return $this->fileset;
+    }
+
+    /**
+     * Set the name of the zip file to extract.
+     * @param PhingFile $file zip file to extract
+     */
+    public function setFile(PhingFile $file) {
+        $this->file = $file;
+    }
+
+    /**
+     * This is the base directory to look in for things to zip.
+     * @param PhingFile $baseDir
+     */
+    public function setToDir(PhingFile $todir) {
+        $this->todir = $todir;
+    }
+    
+    public function setRemovePath($removepath)
+    {
+    	$this->removepath = $removepath;
+    }
+
+    /**
+     * do the work
+     * @throws BuildException
+     */
+    public function main() {
+    
+        $this->validateAttributes();
+        
+        $filesToExtract = array();
+        if ($this->file !== null) {
+            if(!$this->isDestinationUpToDate($this->file)) {
+                $filesToExtract[] = $this->file;
+            } else {
+            	$this->log('Nothing to do: ' . $this->todir->getAbsolutePath() . ' is up to date for ' .  $this->file->getCanonicalPath(), PROJECT_MSG_INFO);
+            }
+        }
+        
+        foreach($this->filesets as $compressedArchiveFileset) {
+            $compressedArchiveDirScanner = $compressedArchiveFileset->getDirectoryScanner($this->project);
+            $compressedArchiveFiles = $compressedArchiveDirScanner->getIncludedFiles();
+            $compressedArchiveDir = $compressedArchiveFileset->getDir($this->project);
+            
+            foreach ($compressedArchiveFiles as $compressedArchiveFilePath) {
+                $compressedArchiveFile = new PhingFile($compressedArchiveDir, $compressedArchiveFilePath);
+                if($compressedArchiveFile->isDirectory())
+                {
+                    throw new BuildException($compressedArchiveFile->getAbsolutePath() . ' compressed archive cannot be a directory.');
+                }
+                
+            	if(!$this->isDestinationUpToDate($compressedArchiveFile)) {
+            	   $filesToExtract[] = $compressedArchiveFile;
+            	} else {
+            		$this->log('Nothing to do: ' . $this->todir->getAbsolutePath() . ' is up to date for ' .  $compressedArchiveFile->getCanonicalPath(), PROJECT_MSG_INFO);
+            	}
+            }
+        }
+        
+        foreach ($filesToExtract as $compressedArchiveFile) {
+            $this->extractArchive($compressedArchiveFile);
+        }
+    }
+    
+    abstract protected function extractArchive(PhingFile $compressedArchiveFile);
+    
+    /**
+     * @param array $files array of filenames
+     * @param PhingFile $dir
+     * @return boolean
+     */
+    protected function isDestinationUpToDate(PhingFile $compressedArchiveFile) {
+        if (!$compressedArchiveFile->exists()) {
+        	throw new BuildException("Could not find file " . $compressedArchiveFile->__toString() . " to extract.");
+        }
+        
+        $compressedArchiveContent = $this->listArchiveContent($compressedArchiveFile);
+        if(is_array($compressedArchiveContent)) {
+            
+            $fileSystem = FileSystem::getFileSystem();
+            foreach ($compressedArchiveContent as $compressArchivePathInfo) {
+                $compressArchiveFilename = $compressArchivePathInfo['filename'];
+                if(!empty($this->removepath) && strlen($compressArchiveFilename) >= strlen($this->removepath))
+                {
+                    $compressArchiveFilename = preg_replace('/^' . $this->removepath . '/','', $compressArchiveFilename);
+                }
+                $compressArchivePath = new PhingFile($this->todir, $compressArchiveFilename);
+                
+                if(!$compressArchivePath->exists() ||
+                    $fileSystem->compareMTimes($compressedArchiveFile->getCanonicalPath(), $compressArchivePath->getCanonicalPath()) == 1) {
+                    return false;
+                }
+            }
+            
+        }
+        
+        return true;
+    }
+    
+    abstract protected function listArchiveContent(PhingFile $compressedArchiveFile);
+    
+    /**
+     * Validates attributes coming in from XML
+     *
+     * @access  private
+     * @return  void
+     * @throws  BuildException
+     */
+    protected function validateAttributes() {
+    
+        if ($this->file === null && count($this->filesets) === 0) {
+            throw new BuildException("Specify at least one source compressed archive - a file or a fileset.");
+        }
+
+        if ($this->todir === null) {
+            throw new BuildException("todir must be set.");
+        }
+        
+        if ($this->todir !== null && $this->todir->exists() && !$this->todir->isDirectory()) {
+            throw new BuildException("todir must be a directory.");
+        }
+
+        if ($this->file !== null && $this->file->exists() && $this->file->isDirectory()) {
+            throw new BuildException("Compressed archive file cannot be a directory.");
+        }
+        
+        if ($this->file !== null && !$this->file->exists()) {
+        	throw new BuildException("Could not find compressed archive file " . $this->file->__toString() . " to extract.");
+        }
+    }
+    
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ExtractBaseTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/MailTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/MailTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/MailTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,77 @@
+<?php
+/*
+ *  $Id: MailTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+include_once 'phing/Task.php';
+
+/**
+ *  Send a message by mail() 
+ *
+ *  <mail to="user en example.org" subject="build complete">The build process is a success...</mail> 
+ * 
+ *  @author   Francois Harvey at SecuriWeb (http://www.securiweb.net)
+ *  @version  $Revision: 1.1 $
+ *  @package  phing.tasks.ext
+ */
+class MailTask extends Task {
+
+    protected $recipient;
+      
+    protected $subject;
+    
+    protected $msg;
+
+    function main() {
+        $this->log('Sending mail to ' . $this->recipient );    
+        mail($this->recipient, $this->subject, $this->msg);
+    }
+
+    /** setter for message */
+    function setMsg($msg) {
+        $this->setMessage($msg);
+    }
+
+    /** alias setter */
+    function setMessage($msg) {
+        $this->msg = (string) $msg;
+    }
+    
+    /** setter for subject **/
+    function setSubject($subject) {
+        $this->subject = (string) $subject;    
+    }
+
+    /** setter for recipient **/
+    function setRecipient($recipient) {
+        $this->recipient = (string) $recipient;
+    }
+
+    /** alias for recipient **/
+    function setTo($recipient) {
+        $this->recipient = (string) $recipient;
+    }
+        
+    /** Supporting the <mail>Message</mail> syntax. */
+    function addText($msg)
+    {
+        $this->msg = (string) $msg;
+    }
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/MailTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/PackageAsPathTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/PackageAsPathTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/PackageAsPathTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ *  $Id: PackageAsPathTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+require_once 'phing/Task.php';
+
+/**
+ * Convert dot-notation packages to relative paths.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.5 $
+ * @package   phing.tasks.ext
+ */
+class PackageAsPathTask extends Task {
+
+    /** The package to convert. */
+    protected $pckg;
+
+    /** The value to store the conversion in. */
+    protected $name;
+    
+    /**
+     * Executes the package to patch converstion and stores it
+     * in the user property <code>value</code>.
+     */
+    public function main()
+    {
+        $this->project->setUserProperty($this->name, strtr($this->pckg, '.', '/'));        
+    }
+
+    /**
+     * @param string $pckg the package to convert
+     */
+    public function setPackage($pckg)
+    {
+        $this->pckg = $pckg;
+    }
+
+    /**
+     * @param string $name the Ant variable to store the path in
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/PackageAsPathTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/PearPackageTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/PearPackageTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/PearPackageTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,421 @@
+<?php
+/*
+ *  $Id: PearPackageTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/system/MatchingTask.php';
+include_once 'phing/types/FileSet.php';
+
+/**
+ * A task to create PEAR package.xml file.
+ * 
+ * This class uses the PEAR_PackageFileMaintainer class to perform the work.
+ * 
+ * This class is designed to be very flexible -- i.e. account for changes to the package.xml w/o
+ * requiring changes to this class.  We've accomplished this by having generic <option> and <mapping>
+ * nested elements.  All options are set using PEAR_PackageFileMaintainer::setOptions().
+ * 
+ * The <option> tag is used to set a simple option value.
+ * <code>
+ * <option name="option_name" value="option_value"/> 
+ * or <option name="option_name">option_value</option>
+ * </code>
+ * 
+ * The <mapping> tag represents a complex data type.  You can use nested <element> (and nested <element> with
+ * <element> tags) to represent the full complexity of the structure.  Bear in mind that what you are creating
+ * will be mapped to an associative array that will be passed in via PEAR_PackageFileMaintainer::setOptions().
+ * <code>
+ * <mapping name="option_name">
+ *  <element key="key_name" value="key_val"/>
+ *  <element key="key_name" value="key_val"/>
+ * </mapping>
+ * </code>
+ * 
+ * Here's an over-simple example of how this could be used:
+ * <code>
+ * <pearpkg name="phing" dir="${build.src.dir}" destFile="${build.base.dir}/package.xml">
+ *  <fileset>
+ *   <include name="**"/>
+ *  </fileset>
+ *  <option name="notes">Sample release notes here.</option>
+ *  <option name="description">Package description</option>
+ *  <option name="summary">Short description</option>
+ *  <option name="version" value="2.0.0b1"/>
+ *  <option name="state" value="beta"/>
+ *  <mapping name="maintainers">
+ *   <element>
+ *    <element key="handle" value="hlellelid"/>
+ *    <element key="name" value="Hans"/>
+ *    <element key="email" value="hans en xmpl.org"/>
+ *    <element key="role" value="lead"/>
+ *   </element>
+ *  </mapping>
+ * </pearpkg>
+ * </code>
+ *
+ * Look at the build.xml in the Phing base directory (assuming you have the full distro / CVS version of Phing) to
+ * see a more complete example of how to call this script.
+ * 
+ * @author   Hans Lellelid <hans en xmpl.org>
+ * @package  phing.tasks.ext
+ * @version  $Revision: 1.9 $
+ */
+class PearPackageTask extends MatchingTask {
+    
+    /** */        
+    private $package;
+
+    /** Base directory for reading files. */
+    private $dir;
+    
+    /** Package file */
+    private $packageFile;
+    
+    /** @var array FileSet[] */
+    private $filesets = array();
+    
+    /** @var PEAR_PackageFileManager */
+    private $pkg;
+    
+    private $preparedOptions = array();
+    
+    /** @var array PearPkgOption[] */
+    private $options = array();
+    
+    /** Nested <mapping> (complex options) types. */
+    private $mappings = array();
+    
+    public function init() {
+        include_once 'PEAR/PackageFileManager.php';
+        if (!class_exists('PEAR_PackageFileManager')) {
+            throw new BuildException("You must have installed PEAR_PackageFileManager in order to create a PEAR package.xml file.");
+        }
+    }
+    
+    /**
+     * Sets PEAR package.xml options, based on class properties.
+     * @return void
+     */
+    private function setOptions() {
+    
+        // 1) first prepare/populate options        
+        $this->populateOptions();
+
+        // 2) make any final adjustments (this could move into populateOptions() also)
+        
+        // default PEAR basedir would be the name of the package (e.g."phing")
+        if (!isset($this->preparedOptions['baseinstalldir'])) {
+            $this->preparedOptions['baseinstalldir'] = $this->package;
+        }
+        
+        // unless filelistgenerator has been overridden, we use Phing FileSet generator
+        if (!isset($this->preparedOptions['filelistgenerator'])) {
+            if (empty($this->filesets)) {
+                throw new BuildException("You must use a <fileset> tag to specify the files to include in the package.xml");
+            }
+            $this->preparedOptions['filelistgenerator'] = 'Fileset';
+            $this->preparedOptions['usergeneratordir'] = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'pearpackage';
+            // Some PHING-specific options needed by our Fileset reader
+            $this->preparedOptions['phing_project'] = $this->project;
+            $this->preparedOptions['phing_filesets'] = $this->filesets;
+        } elseif ($this->preparedOptions['filelistgeneragor'] != 'Fileset' && !empty($this->filesets)) {
+            throw new BuildException("You cannot use <fileset> element if you have specified the \"filelistgenerator\" option.");
+        }                
+        
+        // 3) Set the options
+                
+        // No need for excessive validation here, since the  PEAR class will do its own 
+        // validation & return errors
+        $e = $this->pkg->setOptions($this->preparedOptions);
+            
+        if (PEAR::isError($e)) {
+            throw new BuildException("Unable to set options.", new Exception($e->getMessage()));
+        }
+    }
+    
+    /**
+     * Fixes the boolean in optional dependencies
+     */
+    private function fixDeps($deps)
+    {
+        foreach (array_keys($deps) as $dep)
+        {
+            if (isset($deps[$dep]['optional']) && $deps[$dep]['optional'])
+            {
+                $deps[$dep]['optional'] = "yes";
+            }
+        }
+        
+        return $deps;
+    }
+    
+    /**
+     * Adds the options that are set via attributes and the nested tags to the options array.
+     */
+    private function populateOptions() {
+        
+        // These values could be overridden if explicitly defined using nested tags    
+        $this->preparedOptions['package'] = $this->package;
+        $this->preparedOptions['packagedirectory'] = $this->dir->getAbsolutePath();
+        
+        if ($this->packageFile !== null) {
+            // create one w/ full path
+            $f = new PhingFile($this->packageFile->getAbsolutePath());
+            $this->preparedOptions['packagefile'] = $f->getName();
+            // must end in trailing slash
+            $this->preparedOptions['outputdirectory'] = $f->getParent() . DIRECTORY_SEPARATOR;
+            $this->log("Creating package file: " . $f->__toString(), PROJECT_MSG_INFO);
+        } else {
+            $this->log("Creating [default] package.xml file in base directory.", PROJECT_MSG_INFO);
+        }
+        
+        // converts option objects and mapping objects into 
+        // key => value options that can be passed to PEAR_PackageFileManager
+        
+        foreach($this->options as $opt) {
+            $this->preparedOptions[ $opt->getName() ] = $opt->getValue(); //no arrays yet. preg_split('/\s*,\s*/', $opt->getValue());
+        }
+        
+        foreach($this->mappings as $map) {
+            $value = $map->getValue(); // getValue returns complex value
+            
+            if ($map->getName() == 'deps')
+            {
+                $value = $this->fixDeps($value);
+            }
+            
+            $this->preparedOptions[ $map->getName() ] = $value;
+        }
+    }
+    
+    /**
+     * Main entry point.
+     * @return void
+     */
+    public function main() {        
+        
+        if ($this->dir === null) {
+            throw new BuildException("You must specify the \"dir\" attribute for PEAR package task.");
+        }
+        
+        if ($this->package === null) {
+            throw new BuildException("You must specify the \"name\" attribute for PEAR package task.");
+        }
+        
+        $this->pkg = new PEAR_PackageFileManager();                
+        
+        $this->setOptions();
+        
+        $e = $this->pkg->writePackageFile();
+        if (PEAR::isError($e)) {
+            throw new BuildException("Unable to write package file.", new Exception($e->getMessage()));
+        }
+        
+    }
+    
+    /**
+     * Used by the PEAR_PackageFileManager_PhingFileSet lister.
+     * @return array FileSet[]
+     */
+    public function getFileSets() {
+        return $this->filesets;
+    }
+    
+    // -------------------------------
+    // Set properties from XML
+    // -------------------------------
+
+    /**
+     * Nested creator, creates a FileSet for this task
+     *
+     * @return FileSet The created fileset object
+     */
+    function createFileSet() {
+        $num = array_push($this->filesets, new FileSet());
+        return $this->filesets[$num-1];
+    }
+    
+    /**
+     * Set "package" property from XML.
+     * @see setName()
+     * @param string $v
+     * @return void
+     */
+    public function setPackage($v) {
+        $this->package = $v;
+    }
+    
+    /**
+     * Sets "dir" property from XML.
+     * @param PhingFile $f
+     * @return void
+     */
+    public function setDir(PhingFile $f) {
+        $this->dir = $f;
+    }
+
+    /**
+     * Sets "name" property from XML.
+     * @param string $v
+     * @return void
+     */
+    public function setName($v) {
+        $this->package = $v;
+    }
+    
+    /**
+     * Sets the file to use for generated package.xml
+     */
+    public function setDestFile(PhingFile $f) {
+        $this->packageFile = $f;
+    }
+    
+    /**
+     * Handles nested generic <option> elements.
+     */
+    function createOption() {
+        $o = new PearPkgOption();
+        $this->options[] = $o;
+        return $o;
+    }
+    
+    /**
+     * Handles nested generic <option> elements.
+     */
+    function createMapping() {
+        $o = new PearPkgMapping();
+        $this->mappings[] = $o;
+        return $o;
+    }
+}
+
+
+
+/**
+ * Generic option class is used for non-complex options.
+ */
+class PearPkgOption {
+    
+    private    $name;
+    private $value;
+    
+    public function setName($v) { $this->name = $v; }
+    public function getName() { return $this->name; }
+    
+    public function setValue($v) { $this->value = $v; }
+    public function getValue() { return $this->value; }
+    public function addText($txt) { $this->value = trim($txt); }
+        
+}
+
+/**
+ * Handles complex options <mapping> elements which are hashes (assoc arrays).
+ */
+class PearPkgMapping {
+
+    private    $name;
+    private $elements = array();    
+    
+    public function setName($v) {
+        $this->name = $v;
+    }
+    
+    public function getName() { 
+        return $this->name;
+    }
+
+    public function createElement() { 
+        $e = new PearPkgMappingElement();
+        $this->elements[] = $e;
+        return $e;
+    }
+        
+    public function    getElements() {
+        return $this->elements;
+    }
+    
+    /**
+     * Returns the PHP hash or array of hashes (etc.) that this mapping represents.
+     * @return array
+     */
+    public function getValue() {
+        $value = array();
+        foreach($this->getElements() as $el) {
+            if ($el->getKey() !== null) {
+                $value[ $el->getKey() ] = $el->getValue();
+            } else {
+                $value[] = $el->getValue();
+            }
+        }
+        return $value;
+    }
+}
+
+/**
+ * Sub-element of <mapping>.
+ */
+class PearPkgMappingElement {
+
+    private    $key;
+    private $value;
+    private $elements = array();
+    
+    public function setKey($v) {
+        $this->key = $v;
+    }
+    
+    public function getKey() {
+        return $this->key;
+    }
+    
+    public function setValue($v) {
+        $this->value = $v;
+    }
+    
+    /**
+     * Returns either the simple value or
+     * the calculated value (array) of nested elements.
+     * @return mixed
+     */
+    public function getValue() {    
+        if (!empty($this->elements)) {
+            $value = array();
+            foreach($this->elements as $el) {
+                if ($el->getKey() !== null) {
+                    $value[ $el->getKey() ] = $el->getValue();
+                } else {
+                    $value[] = $el->getValue();
+                }
+            }            
+            return $value;
+        } else  {
+            return $this->value;        
+        }
+    }
+    
+    /**
+     * Handles nested <element> tags.
+     */
+    public function createElement() {
+        $e = new PearPkgMappingElement();
+        $this->elements[] = $e;
+        return $e;
+    }
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/PearPackageTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/PhpLintTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/PhpLintTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/PhpLintTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,82 @@
+<?php
+require_once 'phing/Task.php';
+
+/**
+ * A PHP lint task. Checking syntax of one or more PHP source file.
+ *
+ * @author   Knut Urdalen <knut.urdalen en telio.no>
+ * @package  phing.tasks.ext
+ */
+class PhpLintTask extends Task {
+
+  protected $file;  // the source file (from xml attribute)
+  protected $filesets = array(); // all fileset objects assigned to this task
+
+  /**
+   * File to be performed syntax check on
+   * @param PhingFile $file
+   */
+  public function setFile(PhingFile $file) {
+    $this->file = $file;
+  }
+  
+  /**
+   * Nested creator, creates a FileSet for this task
+   *
+   * @return FileSet The created fileset object
+   */
+  function createFileSet() {
+    $num = array_push($this->filesets, new FileSet());
+    return $this->filesets[$num-1];
+  }
+
+  /**
+   * Execute lint check against PhingFile or a FileSet
+   */
+  public function main() {
+    if(!isset($this->file) and count($this->filesets) == 0) {
+      throw new BuildException("Missing either a nested fileset or attribute 'file' set");
+    }
+
+    if($this->file instanceof PhingFile) {
+      $this->lint($this->file->getPath());
+    } else { // process filesets
+      $project = $this->getProject();
+      foreach($this->filesets as $fs) {
+	$ds = $fs->getDirectoryScanner($project);
+	$files = $ds->getIncludedFiles();
+	$dir = $fs->getDir($this->project)->getPath();
+	foreach($files as $file) {
+	  $this->lint($dir.DIRECTORY_SEPARATOR.$file);
+	}
+      }
+    }
+  }
+
+  /**
+   * Performs the actual syntax check
+   *
+   * @param string $file
+   * @return void
+   */
+  protected function lint($file) {
+    $command = 'php -l ';
+    if(file_exists($file)) {
+      if(is_readable($file)) {
+	$message = array();
+	exec($command.$file, $message);
+	if(!preg_match('/^No syntax errors detected/', $message[0])) {
+	  $this->log($message[1], PROJECT_MSG_ERR);
+	} else {
+	  $this->log($file.': No syntax errors detected', PROJECT_MSG_INFO);
+	}
+      } else {
+	throw new BuildException('Permission denied: '.$file);
+      }
+    } else {
+      throw new BuildException('File not found: '.$file);
+    }
+  }
+}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/PhpLintTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/SmartyTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/SmartyTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/SmartyTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,610 @@
+<?php
+
+/*
+ *  $Id: SmartyTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+ 
+require_once 'phing/Task.php';
+include_once 'phing/BuildException.php';
+include_once 'phing/util/StringHelper.php';
+
+/**
+ * A phing task for generating output by using Smarty.
+ *
+ * This is based on the TexenTask from Apache's Velocity engine.  This class
+ * was originally proted in order to provide a template compiling system for
+ * Torque.
+ *
+ * TODO:
+ *        - Add Path / useClasspath support?
+ *
+ * @author    Hans Lellelid <hans en xmpl.org> (SmartyTask)
+ * @author    Jason van Zyl <jvanzyl en apache.org> (TexenTask)
+ * @author    Robert Burrell Donkin <robertdonkin en mac.com>
+ * @version   $Id: SmartyTask.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package   phing.tasks.ext
+ */
+class SmartyTask extends Task {
+
+    /**
+     * Smarty template engine.
+     * @var Smarty
+     */
+    protected $context;
+    
+    /**
+     * Variables that are assigned to the context on parse/compile.
+     * @var array
+     */
+    protected $properties = array();
+    
+    /**
+     * This is the control template that governs the output.
+     * It may or may not invoke the services of worker
+     * templates.
+     * @var string
+     */
+    protected $controlTemplate;
+    
+    /**
+     * This is where Velocity will look for templates
+     * using the file template loader.
+     * @var string
+     */
+    protected $templatePath;
+    
+    /**
+     * This is where texen will place all the output
+     * that is a product of the generation process.
+     * @var string
+     */
+    protected $outputDirectory;
+    
+    /**
+     * This is the file where the generated text
+     * will be placed.
+     * @var string
+     */
+    protected $outputFile;
+
+    /**
+     * <p>
+     * These are properties that are fed into the
+     * initial context from a properties file. This
+     * is simply a convenient way to set some values
+     * that you wish to make available in the context.
+     * </p>
+     * <p>
+     * These values are not critical, like the template path
+     * or output path, but allow a convenient way to
+     * set a value that may be specific to a particular
+     * generation task.
+     * </p>
+     * <p>
+     * For example, if you are generating scripts to allow
+     * user to automatically create a database, then
+     * you might want the <code>$databaseName</code> 
+     * to be placed
+     * in the initial context so that it is available
+     * in a script that might look something like the
+     * following:
+     * <code><pre>
+     * #!bin/sh
+     * 
+     * echo y | mysqladmin create $databaseName
+     * </pre></code>
+     * The value of <code>$databaseName</code> isn't critical to
+     * output, and you obviously don't want to change
+     * the ant task to simply take a database name.
+     * So initial context values can be set with
+     * properties file.
+     *
+     * @var array
+     */
+    protected $contextProperties;
+        
+    /**
+     * Smarty compiles templates before parsing / replacing tokens in them.
+     * By default it will try ./templates_c, but you may wish to override this.
+     * @var string
+     */
+    protected $compilePath;
+    
+    /**
+     * Whether to force Smarty to recompile templates.
+     * Smarty does check file modification time, but you can set this
+     * to be *sure* that the template will be compiled (of course it will
+     * be slower if you do).
+     * @var boolean
+     */
+    protected $forceCompile = false;
+    
+    /**
+     * Smarty can use config files.
+     * This tells Smarty where to look for the config files.
+     * @var string
+     */
+    protected $configPath;
+    
+    /**
+     * Customize the left delimiter for Smarty tags.
+     * @var string
+     */
+    protected $leftDelimiter;
+
+    /**
+     * Customize the right delimiter for Smarty tags.
+     * @var string
+     */
+    protected $rightDelimiter;
+
+    // -----------------------------------------------------------------------
+    // The following getters & setters are used by phing to set properties
+    // specified in the XML for the smarty task.
+    // -----------------------------------------------------------------------
+    
+    public function init() {
+        include_once 'Smarty.class.php';
+        if (!class_exists('Smarty')) {
+            throw new BuildException("To use SmartyTask, you must have the path to Smarty.class.php on your include_path or your \$PHP_CLASSPATH environment variable.");
+        }
+    }
+    
+    /**
+     * [REQUIRED] Set the control template for the
+     * generating process.
+     * @param string $controlTemplate
+     * @return void
+     */
+    public function setControlTemplate ($controlTemplate) {
+        $this->controlTemplate = $controlTemplate;
+    }
+
+    /**
+     * Get the control template for the
+     * generating process.
+     * @return string
+     */
+    public function getControlTemplate() {
+        return $this->controlTemplate;
+    }
+
+    /**
+     * [REQUIRED] Set the path where Velocity will look
+     * for templates using the file template
+     * loader.
+     * @return void
+     * @throws Exception 
+     */
+    public function setTemplatePath($templatePath) {
+        $resolvedPath = "";        
+        $tok = strtok($templatePath, ",");
+        while ( $tok ) {            
+            // resolve relative path from basedir and leave
+            // absolute path untouched.
+            $fullPath = $this->project->resolveFile($tok);
+            $cpath = $fullPath->getCanonicalPath();
+            if ($cpath === false) {
+                $this->log("Template directory does not exist: " . $fullPath->getAbsolutePath());
+            } else {
+                $resolvedPath .= $cpath;
+            }
+            $tok = strtok(",");
+            if ( $tok ) {
+                $resolvedPath .= ",";
+            }
+        }
+        $this->templatePath = $resolvedPath;
+     }
+
+    /**
+     * Get the path where Velocity will look
+     * for templates using the file template
+     * loader.
+     * @return string
+     */
+    public function getTemplatePath() {
+        return $this->templatePath;
+    }        
+
+    /**
+     * [REQUIRED] Set the output directory. It will be
+     * created if it doesn't exist.
+     * @param PhingFile $outputDirectory
+     * @return void
+     * @throws Exception
+     */
+    public function setOutputDirectory(PhingFile $outputDirectory) {
+        try {            
+            if (!$outputDirectory->exists()) {
+                $this->log("Output directory does not exist, creating: " . $outputDirectory->getPath(),PROJECT_MSG_VERBOSE);
+                if (!$outputDirectory->mkdirs()) {
+                    throw new IOException("Unable to create Ouptut directory: " . $outputDirectory->getAbsolutePath());
+                }
+            }
+            $this->outputDirectory = $outputDirectory->getCanonicalPath();
+        } catch (IOException $ioe) {
+            throw new BuildException($ioe->getMessage());
+        }
+    }
+      
+    /**
+     * Get the output directory.
+     * @return string
+     */
+    public function getOutputDirectory() {
+        return $this->outputDirectory;
+    }        
+
+    /**
+     * [REQUIRED] Set the output file for the
+     * generation process.
+     * @return void
+     */
+    public function setOutputFile($outputFile) {
+        $this->outputFile = $outputFile;
+    }
+
+    /**
+     * Get the output file for the
+     * generation process.
+     * @return string
+     */
+    public function getOutputFile() {
+        return $this->outputFile;
+    }        
+
+    /**
+     * Set the path Smarty uses as a "cache" for compiled templates.
+     * @param string $compilePath
+     */
+    public function setCompilePath($compilePath) {
+        $this->compilePath = $compilePath;
+    }
+    
+    /**
+     * Get the path Smarty uses for compiling templates.
+     * @return string
+     */
+    public function getCompilePath() {
+        return $this->compilePath;
+    }
+    
+    /**
+     * Set whether Smarty should always recompile tempaltes.
+     * @param boolean $force
+     * @return void
+     */
+    public function setForceCompile($force) {
+        $this->forceCompile = (boolean) $force;
+    }
+    
+    /**
+     * Get whether Smarty should always recompile template.
+     * @return boolean
+     */
+    public function getForceCompile() {
+        return $this->forceCompile;
+    }
+    
+    /**
+     * Set where Smarty looks for config files.
+     * @param string $configPath
+     * @return void
+     */
+    public function setConfigPath($configPath) {
+        $this->configPath = $configPath;
+    }
+    
+    /**
+     * Get the path that Smarty uses for looking for config files.
+     * @return string
+     */
+    public function getConfigPath() {
+        return $this->configPath;
+    }
+    
+    /**
+     * Set Smarty template left delimiter.
+     * @param string $delim
+     * @return void
+     */
+    public function setLeftDelimiter($delim) {
+        $this->leftDelimiter = $delim;
+    }
+    
+    /**
+     * Get Smarty template right delimiter
+     * @return string
+     */
+    public function getLeftDelimiter() {
+        return $this->leftDelimiter;
+    }
+    
+    /**
+     * Set Smarty template right delimiter.
+     * @param string $delim
+     * @return void
+     */
+    public function setRightDelimiter($delim) {
+        $this->rightDelimiter = $delim;
+    }
+    
+    /**
+     * Get Smarty template right delimiter
+     * @return string
+     */
+    public function getRightDelimiter() {
+        return $this->rightDelimiter;
+    }
+    
+    
+    /**
+     * Set the context properties that will be
+     * fed into the initial context be the
+     * generating process starts.
+     * @param string $file
+     * @return void
+     */
+    public function setContextProperties($file) {
+    
+        $sources = explode(",", $file);
+        $this->contextProperties = new Properties();
+        
+        // Always try to get the context properties resource
+        // from a file first. Templates may be taken from a JAR
+        // file but the context properties resource may be a 
+        // resource in the filesystem. If this fails than attempt
+        // to get the context properties resource from the
+        // classpath.
+        for ($i=0, $sourcesLength=count($sources); $i < $sourcesLength; $i++) {
+            $source = new Properties();
+            
+            try {
+            
+                // resolve relative path from basedir and leave
+                // absolute path untouched.
+                $fullPath = $this->project->resolveFile($sources[$i]);
+                $this->log("Using contextProperties file: " . $fullPath->__toString());
+                $source->load($fullPath);
+                
+            } catch (Exception $e) {
+              
+              throw new BuildException("Context properties file " . $sources[$i] .
+                            " could not be found in the file system!");
+                     
+            }
+        
+            $keys = $source->keys();
+            
+            foreach ($keys as $key) {
+                $name = $key;
+                $value = $this->project->replaceProperties($source->getProperty($name));
+                $this->contextProperties->setProperty($name, $value);
+            }
+        }
+    }
+
+    /**
+     * Get the context properties that will be
+     * fed into the initial context be the
+     * generating process starts.
+     * @return Properties
+     */
+    public function getContextProperties() {
+        return $this->contextProperties;
+    }     
+
+    // ---------------------------------------------------------------
+    // End of XML setters & getters
+    // ---------------------------------------------------------------
+
+   
+    /**
+     * Creates a Smarty object.
+     *
+     * @return Smarty initialized (cleared) Smarty context.
+     * @throws Exception the execute method will catch 
+     *         and rethrow as a <code>BuildException</code>
+     */
+    public function initControlContext() {        
+        $this->context->clear_all_assign();        
+        return $this->context;
+    }
+    
+    /**
+     * Execute the input script with Velocity
+     *
+     * @throws BuildException  
+     * BuildExceptions are thrown when required attributes are missing.
+     * Exceptions thrown by Velocity are rethrown as BuildExceptions.
+     */
+    public function main() {
+    
+        // Make sure the template path is set.
+        if (empty($this->templatePath)) {
+            throw new BuildException("The template path needs to be defined!");
+        }            
+    
+        // Make sure the control template is set.
+        if ($this->controlTemplate === null) {
+            throw new BuildException("The control template needs to be defined!");
+        }            
+
+        // Make sure the output directory is set.
+        if ($this->outputDirectory === null) {
+            throw new BuildException("The output directory needs to be defined!");
+        }            
+        
+        // Make sure there is an output file.
+        if ($this->outputFile === null) {
+            throw new BuildException("The output file needs to be defined!");
+        }            
+        
+        // Setup Smarty runtime.
+        
+        // Smarty uses one object to store properties and to store
+        // the context for the template (unlike Velocity).  We setup this object, calling it
+        // $this->context, and then initControlContext simply zeros out
+        // any assigned variables.
+        $this->context = new Smarty();
+        
+        if ($this->compilePath !== null) {
+            $this->log("Using compilePath: " . $this->compilePath);
+            $this->context->compile_dir = $this->compilePath;
+        }
+        
+        if ($this->configPath !== null) {
+            $this->log("Using configPath: " . $this->configPath);
+            $this->context->config_dir = $this->configPath;
+        }        
+        
+        if ($this->forceCompile !== null) {
+            $this->context->force_compile = $this->forceCompile;
+        }
+        
+        if ($this->leftDelimiter !== null) {
+            $this->context->left_delimiter = $this->leftDelimiter;
+        }
+        
+        if ($this->rightDelimiter !== null) {
+            $this->context->right_delimiter = $this->rightDelimiter;
+        }
+        
+        if ($this->templatePath !== null) {
+            $this->log("Using templatePath: " . $this->templatePath);
+            $this->context->template_dir = $this->templatePath;
+        }                                                        
+        
+        $smartyCompilePath = new PhingFile($this->context->compile_dir);
+        if (!$smartyCompilePath->exists()) {
+            $this->log("Compile directory does not exist, creating: " . $smartyCompilePath->getPath(), PROJECT_MSG_VERBOSE);
+            if (!$smartyCompilePath->mkdirs()) {
+                throw new BuildException("Smarty needs a place to compile templates; specify a 'compilePath' or create ".$this->context->compile_dir);
+            }
+        }
+        
+        // Make sure the output directory exists, if it doesn't
+        // then create it.
+        $file = new PhingFile($this->outputDirectory);
+        if (!$file->exists()) {
+            $this->log("Output directory does not exist, creating: " . $file->getAbsolutePath());
+            $file->mkdirs();
+        }
+        
+        $path = $this->outputDirectory . DIRECTORY_SEPARATOR . $this->outputFile;
+        $this->log("Generating to file " . $path);
+        
+        $writer = new FileWriter($path);
+                
+        // The generator and the output path should
+        // be placed in the init context here and
+        // not in the generator class itself.
+        $c = $this->initControlContext();
+        
+        // Set any variables that need to always
+        // be loaded
+        $this->populateInitialContext($c);
+        
+        // Feed all the options into the initial
+        // control context so they are available
+        // in the control/worker templates.
+        if ($this->contextProperties !== null) {
+            
+            foreach($this->contextProperties->keys() as $property) {
+                    
+                $value = $this->contextProperties->getProperty($property);
+                
+                // Special exception (from Texen)
+                // for properties ending in file.contents:
+                // in that case we dump the contents of the file
+                // as the "value" for the Property.
+                if (StringHelper::endsWith("file.contents", $property)) {
+                    // pull in contents of file specified 
+                                            
+                    $property = substr($property, 0, strpos($property, "file.contents") - 1);
+                    
+                    // reset value, and then 
+                    // read in teh contents of the file into that var
+                    $value = "";
+                    $f = new PhingFile($project->resolveFile($value)->getCanonicalPath());                        
+                    if ($f->exists()) {
+                        try {
+                            $fr = new FileReader($f);
+                            $fr->readInto($value);
+                        } catch (Exception $e) {
+                            throw $e;
+                        }
+                    }    
+                                                                    
+                 } // if ends with file.contents
+                
+                    if (StringHelper::isBoolean($value)) {
+                        $value = StringHelper::booleanValue($value);
+                    }
+                                                        
+                 $c->assign($property, $value); 
+                 
+            } // foreach property
+                
+        } // if contextProperties !== null
+        
+        try {
+            //$c->display($this->controlTemplate);            
+            $writer->write($c->fetch($this->controlTemplate));
+            $writer->close();
+        } catch (IOException $ioe) {
+            $writer->close();
+            throw new BuildException("Cannot write parsed template.");
+        }        
+        
+        $this->cleanup();    
+    }
+
+    /**
+     * <p>Place useful objects into the initial context.</p>
+     *
+     * <p>TexenTask places <code>Date().toString()</code> into the
+     * context as <code>$now</code>.  Subclasses who want to vary the
+     * objects in the context should override this method.</p>
+     *
+     * <p><code>$generator</code> is not put into the context in this
+     * method.</p>
+     *
+     * @param context The context to populate, as retrieved from
+     * {@link #initControlContext()}.
+     * @return void
+     * @throws Exception Error while populating context.  The {@link
+     * #execute()} method will catch and rethrow as a
+     * <code>BuildException</code>.
+     */
+    protected function populateInitialContext(Smarty $context)  {       
+    }
+    
+    /**
+     * A hook method called at the end of {@link #execute()} which can
+     * be overridden to perform any necessary cleanup activities (such
+     * as the release of database connections, etc.).  By default,
+     * does nothing.
+     * @return void
+     * @throws Exception Problem cleaning up.
+     */
+    protected function cleanup() {
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/SmartyTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/TarTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/TarTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/TarTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,425 @@
+<?php
+/*
+ *  $Id: TarTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/system/MatchingTask.php';
+include_once 'phing/util/SourceFileScanner.php';
+include_once 'phing/mappers/MergeMapper.php';
+include_once 'phing/util/StringHelper.php';
+
+/**
+ * Creates a tar archive using PEAR Archive_Tar.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author    Stefano Mazzocchi <stefano en apache.org> (Ant)
+ * @author    Stefan Bodewig <stefan.bodewig en epost.de> (Ant)
+ * @author    Magesh Umasankar
+ * @version   $Revision: 1.10 $
+ * @package   phing.tasks.ext
+ */
+class TarTask extends MatchingTask {
+    
+    const TAR_NAMELEN = 100;
+    
+    const WARN = "warn";
+    const FAIL = "fail";   
+    const OMIT = "omit";    
+    
+    private $tarFile;
+    private $baseDir;
+	private $includeEmpty = true; // Whether to include empty dirs in the TAR
+	
+    private $longFileMode = "warn";
+
+    private $filesets = array();
+    private $fileSetFiles = array();
+
+    /**
+     * Indicates whether the user has been warned about long files already.
+     */
+    private $longWarningGiven = false;
+    
+    /**
+     * Compression mode.  Available options "gzip", "bzip2", "none" (null).
+     */
+    private $compression = null;
+    
+    /**
+     * Ensures that PEAR lib exists.
+     */
+    public function init() {
+        include_once 'Archive/Tar.php';
+        if (!class_exists('Archive_Tar')) {
+            throw new BuildException("You must have installed the PEAR Archive_Tar class in order to use TarTask.");
+        }
+    }
+    
+    /**
+     * Add a new fileset
+     * @return FileSet
+     */
+    public function createTarFileSet() {
+        $this->fileset = new TarFileSet();
+        $this->filesets[] = $this->fileset;
+        return $this->fileset;
+    }
+    
+    /**
+     * Add a new fileset.  Alias to createTarFileSet() for backwards compatibility.
+     * @return FileSet
+     * @see createTarFileSet()
+     */
+    public function createFileSet() {
+        $this->fileset = new TarFileSet();
+        $this->filesets[] = $this->fileset;
+        return $this->fileset;
+    }
+
+    /**
+     * Set is the name/location of where to create the tar file.
+     * @param PhingFile $destFile The output of the tar
+     */
+    public function setDestFile(PhingFile $destFile) {
+        $this->tarFile = $destFile;
+    }
+
+    /**
+     * This is the base directory to look in for things to tar.
+     * @param PhingFile $baseDir
+     */
+    public function setBasedir(PhingFile $baseDir) {
+        $this->baseDir = $baseDir;
+    }
+
+    /**
+     * Set the include empty dirs flag.
+     * @param  boolean  Flag if empty dirs should be tarred too
+     * @return void
+     * @access public
+     */
+    function setIncludeEmptyDirs($bool) {
+        $this->includeEmpty = (boolean) $bool;
+    }
+
+    /**
+     * Set how to handle long files, those with a path&gt;100 chars.
+     * Optional, default=warn.
+     * <p>
+     * Allowable values are
+     * <ul>
+     * <li>  truncate - paths are truncated to the maximum length
+     * <li>  fail - paths greater than the maximim cause a build exception
+     * <li>  warn - paths greater than the maximum cause a warning and GNU is used
+     * <li>  gnu - GNU extensions are used for any paths greater than the maximum.
+     * <li>  omit - paths greater than the maximum are omitted from the archive
+     * </ul>
+     */
+    public function setLongfile($mode) {
+        $this->longFileMode = $mode;
+    }
+
+    /**
+     * Set compression method.
+     * Allowable values are
+     * <ul>
+     * <li>  none - no compression
+     * <li>  gzip - Gzip compression
+     * <li>  bzip2 - Bzip2 compression
+     * </ul>
+     */
+    public function setCompression($mode) {        
+        switch($mode) {
+            case "gzip":
+                $this->compression = "gz";
+                break;
+            case "bzip2":
+                $this->compression = "bz2";
+                break;
+            case "none":
+                $this->compression = null;
+                break;
+            default:
+                $this->log("Ignoring unknown compression mode: ".$mode, PROJECT_MSG_WARN);
+                $this->compression = null;
+        }
+    }
+    
+    /**
+     * do the work
+     * @throws BuildException
+     */
+    public function main() {
+    
+        if ($this->tarFile === null) {
+            throw new BuildException("tarfile attribute must be set!", $this->getLocation());
+        }
+
+        if ($this->tarFile->exists() && $this->tarFile->isDirectory()) {
+            throw new BuildException("tarfile is a directory!", $this->getLocation());
+        }
+
+        if ($this->tarFile->exists() && !$this->tarFile->canWrite()) {
+            throw new BuildException("Can not write to the specified tarfile!", $this->getLocation());
+        }
+
+        // shouldn't need to clone, since the entries in filesets
+        // themselves won't be modified -- only elements will be added
+        $savedFileSets = $this->filesets;
+        
+        try {
+            if ($this->baseDir !== null) {
+                if (!$this->baseDir->exists()) {
+                    throw new BuildException("basedir does not exist!", $this->getLocation());
+                }
+				if (empty($this->filesets)) { // if there weren't any explicit filesets specivied, then
+	                						  // create a default, all-inclusive fileset using the specified basedir.
+	                $mainFileSet = new TarFileSet($this->fileset);
+	                $mainFileSet->setDir($this->baseDir);
+	                $this->filesets[] = $mainFileSet;
+	            }
+            }
+
+            if (empty($this->filesets)) {
+                throw new BuildException("You must supply either a basedir "
+                                         . "attribute or some nested filesets.",
+                                         $this->getLocation());
+            }                        
+            
+            // check if tar is out of date with respect to each fileset
+            if($this->tarFile->exists()) {
+	            $upToDate = true;
+	            foreach($this->filesets as $fs) {
+	                $files = $fs->getFiles($this->project, $this->includeEmpty);
+	                if (!$this->archiveIsUpToDate($files, $fs->getDir($this->project))) {
+	                    $upToDate = false;
+	                }
+	                for ($i=0, $fcount=count($files); $i < $fcount; $i++) {
+	                    if ($this->tarFile->equals(new PhingFile($fs->getDir($this->project), $files[$i]))) {
+	                        throw new BuildException("A tar file cannot include itself", $this->getLocation());
+	                    }
+	                }
+	            }
+	            if ($upToDate) {
+	                $this->log("Nothing to do: " . $this->tarFile->__toString() . " is up to date.", PROJECT_MSG_INFO);
+	                return;
+	            }
+			}
+			
+            $this->log("Building tar: " . $this->tarFile->__toString(), PROJECT_MSG_INFO);
+            
+            $tar = new Archive_Tar($this->tarFile->getAbsolutePath(), $this->compression);
+            
+            // print errors
+            $tar->setErrorHandling(PEAR_ERROR_PRINT);
+            
+            foreach($this->filesets as $fs) {                                
+                    $files = $fs->getFiles($this->project, $this->includeEmpty);
+                    if (count($files) > 1 && strlen($fs->getFullpath()) > 0) {
+                        throw new BuildException("fullpath attribute may only "
+                                                 . "be specified for "
+                                                 . "filesets that specify a "
+                                                 . "single file.");
+                    }
+                    $fsBasedir = $fs->getDir($this->project);
+                    $filesToTar = array();
+                    for ($i=0, $fcount=count($files); $i < $fcount; $i++) {
+                        $f = new PhingFile($fsBasedir, $files[$i]);
+                        $filesToTar[] = $f->getAbsolutePath();                        
+                    }                    
+                    $tar->addModify($filesToTar, '', $fsBasedir->getAbsolutePath());            
+            }
+                         
+                
+        } catch (IOException $ioe) {
+                $msg = "Problem creating TAR: " . $ioe->getMessage();
+                $this->filesets = $savedFileSets;
+                throw new BuildException($msg, $ioe, $this->getLocation());
+        }
+        
+        $this->filesets = $savedFileSets;
+    }
+           
+    /**
+     * @param array $files array of filenames
+     * @param PhingFile $dir
+     * @return boolean
+     */
+    protected function archiveIsUpToDate($files, $dir) {
+        $sfs = new SourceFileScanner($this);
+        $mm = new MergeMapper();
+        $mm->setTo($this->tarFile->getAbsolutePath());
+        return count($sfs->restrict($files, $dir, null, $mm)) == 0;
+    }
+   
+}
+
+
+/**
+ * This is a FileSet with the option to specify permissions.
+ * 
+ * Permissions are currently not implemented by PEAR Archive_Tar,
+ * but hopefully they will be in the future.
+ * 
+ */
+class TarFileSet extends FileSet {
+
+    private $files = null;
+
+    private $mode = 0100644;
+
+    private $userName = "";
+    private $groupName = "";
+    private $prefix = "";
+    private $fullpath = "";
+    private $preserveLeadingSlashes = false;
+
+    /**
+     *  Get a list of files and directories specified in the fileset.
+     *  @return array a list of file and directory names, relative to
+     *    the baseDir for the project.
+     */
+    public function getFiles(Project $p, $includeEmpty = true) {
+    
+        if ($this->files === null) {
+        
+            $ds = $this->getDirectoryScanner($p);
+            $this->files = $ds->getIncludedFiles();
+            
+            if ($includeEmpty) {
+            
+	            // first any empty directories that will not be implicitly added by any of the files
+				$implicitDirs = array();
+				foreach($this->files as $file) {
+					$implicitDirs[] = dirname($file);
+				} 
+				
+				$incDirs = $ds->getIncludedDirectories();
+				
+				// we'll need to add to that list of implicit dirs any directories
+				// that contain other *directories* (and not files), since otherwise
+				// we get duplicate directories in the resulting tar
+				foreach($incDirs as $dir) {
+					foreach($incDirs as $dircheck) {
+						if (!empty($dir) && $dir == dirname($dircheck)) {
+							$implicitDirs[] = $dir;
+						}
+					}
+				}
+				
+				$implicitDirs = array_unique($implicitDirs);
+				
+				// Now add any empty dirs (dirs not covered by the implicit dirs)
+				// to the files array. 
+				
+				foreach($incDirs as $dir) { // we cannot simply use array_diff() since we want to disregard empty/. dirs
+					if ($dir != "" && $dir != "." && !in_array($dir, $implicitDirs)) {
+						// it's an empty dir, so we'll add it.
+						$this->files[] = $dir;
+					}
+				}
+			} // if $includeEmpty
+			
+        } // if ($this->files===null)
+        
+        return $this->files;
+    }
+
+    /**
+     * A 3 digit octal string, specify the user, group and 
+     * other modes in the standard Unix fashion; 
+     * optional, default=0644
+     * @param string $octalString
+     */
+    public function setMode($octalString) {
+        $octal = (int) $octalString;
+        $this->mode = 0100000 | $octal;
+    }
+
+    public function getMode() {
+        return $this->mode;
+    }
+
+    /**
+     * The username for the tar entry 
+     * This is not the same as the UID, which is
+     * not currently set by the task.
+     */
+    public function setUserName($userName) {
+        $this->userName = $userName;
+    }
+
+    public function getUserName() {
+        return $this->userName;
+    }
+
+    /**
+     * The groupname for the tar entry; optional, default=""
+     * This is not the same as the GID, which is
+     * not currently set by the task.
+     */
+    public function setGroup($groupName) {
+        $this->groupName = $groupName;
+    }
+
+    public function getGroup() {
+        return $this->groupName;
+    }
+
+    /**
+     * If the prefix attribute is set, all files in the fileset
+     * are prefixed with that path in the archive.
+     * optional.
+     */
+    public function setPrefix($prefix) {
+        $this->prefix = $prefix;
+    }
+
+    public function getPrefix() {
+        return $this->prefix;
+    }
+
+    /**
+     * If the fullpath attribute is set, the file in the fileset
+     * is written with that path in the archive. The prefix attribute,
+     * if specified, is ignored. It is an error to have more than one file specified in
+     * such a fileset.
+     */
+    public function setFullpath($fullpath) {
+        $this->fullpath = $fullpath;
+    }
+
+    public function getFullpath() {
+        return $this->fullpath;
+    }
+
+    /**
+     * Flag to indicates whether leading `/'s should
+     * be preserved in the file names.
+     * Optional, default is <code>false</code>.
+     * @return void
+     */
+    public function setPreserveLeadingSlashes($b) {
+        $this->preserveLeadingSlashes = (boolean) $b;
+    }
+
+    public function getPreserveLeadingSlashes() {
+        return $this->preserveLeadingSlashes;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/TarTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/UntarTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/UntarTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/UntarTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,90 @@
+<?php
+/*
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/ext/ExtractBaseTask.php';
+
+/**
+ * Extracts one or several tar archives using PEAR Archive_Tar
+ *
+ * @author    Joakim Bodin <joakim.bodin+phing en gmail.com>
+ * @version   $Revision: 1.0 $
+ * @package   phing.tasks.ext
+ * @since     2.2.0
+ */
+class UntarTask extends ExtractBaseTask {
+    
+    /**
+     * Ensures that PEAR lib exists.
+     */
+    public function init() {
+        include_once 'Archive/Tar.php';
+        if (!class_exists('Archive_Tar')) {
+            throw new BuildException("You must have installed the PEAR Archive_Tar class in order to use UntarTask.");
+        }
+    }
+    
+    protected function extractArchive(PhingFile $tarfile)
+    {
+        $this->log("Extracting tar file: " . $tarfile->__toString() . ' to ' . $this->todir->__toString(), PROJECT_MSG_INFO);
+        
+    	try {
+        	$tar = $this->initTar($tarfile);
+        	if(!$tar->extractModify($this->todir->getAbsolutePath(), $this->removepath)) {
+        	    throw new BuildException('Failed to extract tar file: ' . $tarfile->getAbsolutePath());
+        	}
+        } catch (IOException $ioe) {
+            $msg = "Could not extract tar file: " . $ioe->getMessage();
+            throw new BuildException($msg, $ioe, $this->getLocation());
+        }
+    }
+    
+    protected function listArchiveContent(PhingFile $tarfile)
+    {
+        $tar = $this->initTar($tarfile);
+        return $tar->listContent();
+    }
+    
+    /**
+     * Init a Archive_Tar class with correct compression for the given file.
+     *
+     * @param PhingFile $tarfile
+     * @return Archive_Tar the tar class instance
+     */
+    private function initTar(PhingFile $tarfile)
+    {
+        $compression = null;
+        $tarfileName = $tarfile->getName();
+        $mode = substr($tarfileName, strrpos($tarfileName, '.'));
+        switch($mode) {
+            case '.gz':
+                $compression = 'gz';
+                break;
+            case '.bz2':
+                $compression = 'bz2';
+                break;
+            case '.tar':
+                break;
+            default:
+                $this->log('Ignoring unknown compression mode: ' . $mode, PROJECT_MSG_WARN);
+        }
+        
+    	return new Archive_Tar($tarfile->getAbsolutePath(), $compression);
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/UntarTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/UnzipTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/UnzipTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/UnzipTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,68 @@
+<?php
+/*
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/ext/ExtractBaseTask.php';
+require_once 'phing/system/io/FileSystem.php';
+require_once 'phing/lib/Zip.php';
+
+/**
+ * Extracts one or several zip archive using PEAR Archive_Zip (which is presently unreleased
+ * and included with Phing).
+ *
+ * @author    Joakim Bodin <joakim.bodin+phing en gmail.com>
+ * @version   $Revision: 1.0 $
+ * @package   phing.tasks.ext
+ * @since     2.2.0
+ */
+class UnzipTask extends ExtractBaseTask {
+    
+    protected function extractArchive(PhingFile $zipfile)
+    {
+        $extractParams = array('add_path' => $this->todir->getAbsolutePath());
+        if(!empty($this->removepath))
+        {
+            $extractParams['remove_path'] = $this->removepath;
+        }
+        
+        $this->log("Extracting zip: " . $zipfile->__toString() . ' to ' . $this->todir->__toString(), PROJECT_MSG_INFO);
+        
+    	try {
+        	$zip = new Archive_Zip($zipfile->getAbsolutePath());
+        	
+        	$extractResponse = $zip->extract($extractParams);
+        	if(is_array($extractResponse)) {
+        	    foreach ($extractResponse as $extractedPath) {
+        	    	$this->log('Extracted' . $extractedPath['stored_filename'] . ' to ' . $this->todir->__toString(), PROJECT_MSG_VERBOSE);
+        	    }
+        	} else if ($extractResponse === 0) {
+        	    throw new BuildException('Failed to extract zipfile: ' . $zip->errorInfo(true));
+        	}
+        } catch (IOException $ioe) {
+            $msg = "Could not extract ZIP: " . $ioe->getMessage();
+            throw new BuildException($msg, $ioe, $this->getLocation());
+        }
+    }
+    
+    protected function listArchiveContent(PhingFile $zipfile)
+    {
+        $zip = new Archive_Zip($zipfile->getAbsolutePath());
+        return $zip->listContent();
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/UnzipTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/XmlLintTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/XmlLintTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/XmlLintTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,116 @@
+<?php
+require_once 'phing/Task.php';
+
+/**
+ * A XML lint task. Checking syntax of one or more XML files against an XML Schema using the DOM extension.
+ *
+ * @author   Knut Urdalen <knut.urdalen en telio.no>
+ * @package  phing.tasks.ext
+ */
+class XmlLintTask extends Task {
+
+  protected $file;  // the source file (from xml attribute)
+  protected $schema; // the schema file (from xml attribute)
+  protected $filesets = array(); // all fileset objects assigned to this task
+
+  /**
+   * File to be performed syntax check on
+   *
+   * @param PhingFile $file
+   */
+  public function setFile(PhingFile $file) {
+    $this->file = $file;
+  }
+
+  /**
+   * XML Schema Description file to validate against
+   *
+   * @param PhingFile $schema
+   */
+  public function setSchema(PhingFile $schema) {
+    $this->schema = $schema;
+  }
+  
+  /**
+   * Nested creator, creates a FileSet for this task
+   *
+   * @return FileSet The created fileset object
+   */
+  function createFileSet() {
+    $num = array_push($this->filesets, new FileSet());
+    return $this->filesets[$num-1];
+  }
+
+  /**
+   * Execute lint check against PhingFile or a FileSet
+   */
+  public function main() {
+    if(!isset($this->schema)) {
+      throw new BuildException("Missing attribute 'schema'");
+    }
+    $schema = $this->schema->getPath();
+    if(!file_exists($schema)) {
+      throw new BuildException("File not found: ".$schema);
+    }
+    if(!isset($this->file) and count($this->filesets) == 0) {
+      throw new BuildException("Missing either a nested fileset or attribute 'file' set");
+    }
+
+    set_error_handler(array($this, 'errorHandler'));
+    if($this->file instanceof PhingFile) {
+      $this->lint($this->file->getPath());
+    } else { // process filesets
+      $project = $this->getProject();
+      foreach($this->filesets as $fs) {
+	$ds = $fs->getDirectoryScanner($project);
+	$files = $ds->getIncludedFiles();
+	$dir = $fs->getDir($this->project)->getPath();
+	foreach($files as $file) {
+	  $this->lint($dir.DIRECTORY_SEPARATOR.$file);
+	}
+      }
+    }
+    restore_error_handler();
+  }
+
+  /**
+   * Performs validation
+   *
+   * @param string $file
+   * @return void
+   */
+  protected function lint($file) {
+    if(file_exists($file)) {
+      if(is_readable($file)) {
+	$dom = new DOMDocument();
+	$dom->load($file);
+	if($dom->schemaValidate($this->schema->getPath())) {
+	  $this->log($file.' validated', PROJECT_MSG_INFO);
+	} else {
+	  $this->log($file.' fails to validate (See messages above)', PROJECT_MSG_ERR);
+	}
+      } else {
+	throw new BuildException('Permission denied: '.$file);
+      }
+    } else {
+      throw new BuildException('File not found: '.$file);
+    }
+  }
+
+  /**
+   * Local error handler to catch validation errors and log them through Phing
+   *
+   * @param int    $level
+   * @param string $message
+   * @param string $file
+   * @param int    $line
+   */
+  public function errorHandler($level, $message, $file, $line, $context) {
+    $matches = array();
+    preg_match('/^.*\(\): (.*)$/', $message, $matches);
+    $this->log($matches[1], PROJECT_MSG_ERR);
+  }
+
+}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/XmlLintTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ZendCodeAnalyzerTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ZendCodeAnalyzerTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ZendCodeAnalyzerTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,163 @@
+<?php
+require_once 'phing/Task.php';
+
+/**
+ * ZendCodeAnalyzerTask analyze PHP source code using the ZendCodeAnalyzer included in Zend Studio 5.1
+ * 
+ * Available warnings:
+ * <b>zend-error</b> - %s(line %d): %s
+ * <b>oneline-comment</b> - One-line comment ends with ?> tag.
+ * <b>bool-assign</b> - Assignment seen where boolean expression is expected. Did you mean '==' instead of '='?
+ * <b>bool-print</b> - Print statement used when boolean expression is expected.
+ * <b>bool-array</b> - Array used when boolean expression is expected.
+ * <b>bool-object</b> - Object used when boolean expression is expected.
+ * <b>call-time-ref</b> - Call-time reference is deprecated. Define function as accepting parameter by reference instead.
+ * <b>if-if-else</b> - In if-if-else construction else relates to the closest if. Use braces to make the code clearer.
+ * <b>define-params</b> - define() requires two or three parameters.
+ * <b>define-const</b> - First parameter for define() should be string. Maybe you forgot quotes?
+ * <b>break-var</b> - Break/continue with variable is dangerous - break level can be out of scope.
+ * <b>break-depth</b> - Break/continue with depth more than current nesting level.
+ * <b>var-once</b> - Variable '%s' encountered only once. May be a typo?
+ * <b>var-arg-unused</b> - Function argument '%s' is never used.
+ * <b>var-global-unused</b> - Global variable '%s' is defined but never used.
+ * <b>var-use-before-def</b> - Variable '%s' is used before it was assigned.
+ * <b>var-use-before-def-global</b> - Global variable '%s' is used without being assigned. You are probably relying on register_globals feature of PHP. Note that this feature is off by default.
+ * <b>var-no-global</b> - PHP global variable '%s' is used as local. Maybe you wanted to define '%s' as global?
+ * <b>var-value-unused</b> - Value assigned to variable '%s' is never used
+ * <b>var-ref-notmodified</b> - Function parameter '%s' is passed by reference but never modified. Consider passing by value.
+ * <b>return-empty-val</b> - Function '%s' has both empty return and return with value.
+ * <b>return-empty-used</b> - Function '%s' has empty return but return value is used.
+ * <b>return-noref</b> - Function '%s' returns reference but the value is not assigned by reference. Maybe you meant '=&' instead of '='?
+ * <b>return-end-used</b> - Control reaches the end of function '%s'(file %s, line %d) but return value is used.
+ * <b>sprintf-miss-args</b> - Missing arguments for sprintf: format reqires %d arguments but %d are supplied.
+ * <b>sprintf-extra-args</b> - Extra arguments for sprintf: format reqires %d arguments but %d are supplied.
+ * <b>unreach-code</b> - Unreachable code in function '%s'.
+ * <b>include-var</b> - include/require with user-accessible variable can be dangerous. Consider using constant instead.
+ * <b>non-object</b> - Variable '%s' used as object, but has different type.
+ * <b>bad-escape</b> - Bad escape sequence: \%c, did you mean \\%c?
+ * <b>empty-cond</b> - Condition without a body
+ * <b>expr-unused</b> - Expression result is never used
+ *
+ * @author   Knut Urdalen <knut.urdalen en telio.no>
+ * @package  phing.tasks.ext
+ */
+class ZendCodeAnalyzerTask extends Task {
+  
+  protected $analyzerPath = ""; // Path to ZendCodeAnalyzer binary
+  protected $file = "";  // the source file (from xml attribute)
+  protected $filesets = array(); // all fileset objects assigned to this task
+  protected $warnings = array();
+  protected $counter = 0;
+  protected $disable = array();
+  protected $enable = array();
+  
+  /**
+   * File to be analyzed
+   * 
+   * @param PhingFile $file
+   */
+  public function setFile(PhingFile $file) {
+    $this->file = $file;
+  }
+  
+  /**
+   * Path to ZendCodeAnalyzer binary
+   *
+   * @param string $analyzerPath
+   */
+  public function setAnalyzerPath($analyzerPath) {
+    $this->analyzerPath = $analyzerPath;
+  }
+  
+  /**
+   * Disable warning levels. Seperate warning levels with ','
+   *
+   * @param string $disable
+   */
+  public function setDisable($disable) {
+    $this->disable = explode(",", $disable);
+  }
+  
+  /**
+   * Enable warning levels. Seperate warning levels with ','
+   *
+   * @param string $enable
+   */
+  public function setEnable($enable) {
+    $this->enable = explode(",", $enable);
+  }
+  
+  /**
+   * Nested creator, creates a FileSet for this task
+   *
+   * @return FileSet The created fileset object
+   */
+  function createFileSet() {
+    $num = array_push($this->filesets, new FileSet());
+    return $this->filesets[$num-1];
+  }
+
+  /**
+   * Analyze against PhingFile or a FileSet
+   */
+  public function main() {
+    if(!isset($this->analyzerPath)) {
+      throw new BuildException("Missing attribute 'analyzerPath'");
+    }
+    if(!isset($this->file) and count($this->filesets) == 0) {
+      throw new BuildException("Missing either a nested fileset or attribute 'file' set");
+    }
+    
+    if($this->file instanceof PhingFile) {
+      $this->analyze($this->file->getPath());
+    } else { // process filesets
+      $project = $this->getProject();
+      foreach($this->filesets as $fs) {
+      	$ds = $fs->getDirectoryScanner($project);
+      	$files = $ds->getIncludedFiles();
+      	$dir = $fs->getDir($this->project)->getPath();
+      	foreach($files as $file) {
+	  $this->analyze($dir.DIRECTORY_SEPARATOR.$file);
+      	}
+      }
+    }
+    $this->log("Number of findings: ".$this->counter, PROJECT_MSG_INFO);
+  }
+
+  /**
+   * Analyze file
+   *
+   * @param string $file
+   * @return void
+   */
+  protected function analyze($file) {
+    if(file_exists($file)) {
+      if(is_readable($file)) {
+      	
+      	// Construct shell command
+      	$cmd = $this->analyzerPath." ";
+      	foreach($this->enable as $enable) { // Enable warning levels
+      		$cmd .= " --enable $enable ";
+      	}
+      	foreach($this->disable as $disable) { // Disable warning levels
+      		$cmd .= " --disable $disable ";
+      	}
+      	$cmd .= "$file 2>&1";
+      	
+      	// Execute command
+      	$result = shell_exec($cmd);
+      	$result = explode("\n", $result);
+      	for($i=2, $size=count($result); $i<($size-1); $i++) {
+	  $this->counter++;
+	  $this->log($result[$i], PROJECT_MSG_WARN);
+      	}
+      } else {
+      	throw new BuildException('Permission denied: '.$file);
+      }
+    } else {
+      throw new BuildException('File not found: '.$file);
+    }
+  }
+}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ZendCodeAnalyzerTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ZipTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ZipTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ZipTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,176 @@
+<?php
+/*
+ *  $Id: ZipTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/system/MatchingTask.php';
+include_once 'phing/util/SourceFileScanner.php';
+include_once 'phing/mappers/MergeMapper.php';
+include_once 'phing/util/StringHelper.php';
+include_once 'phing/lib/Zip.php';
+
+/**
+ * Creates a zip archive using PEAR Archive_Zip (which is presently unreleased
+ * and included with Phing).
+ *
+ * @author    Michiel Rook <michiel.rook en gmail.com>
+ * @version   $Revision: 1.2 $
+ * @package   phing.tasks.ext
+ * @since     2.1.0
+ */
+class ZipTask extends MatchingTask {
+    
+    private $zipFile;
+    private $baseDir;
+
+    private $filesets = array();
+    private $fileSetFiles = array();
+
+    /**
+     * Add a new fileset.
+     * @return FileSet
+     */
+    public function createFileSet() {
+        $this->fileset = new FileSet();
+        $this->filesets[] = $this->fileset;
+        return $this->fileset;
+    }
+
+    /**
+     * Set is the name/location of where to create the zip file.
+     * @param PhingFile $destFile The output of the zip
+     */
+    public function setDestFile(PhingFile $destFile) {
+        $this->zipFile = $destFile;
+    }
+
+    /**
+     * This is the base directory to look in for things to zip.
+     * @param PhingFile $baseDir
+     */
+    public function setBasedir(PhingFile $baseDir) {
+        $this->baseDir = $baseDir;
+    }
+
+    /**
+     * do the work
+     * @throws BuildException
+     */
+    public function main() {
+    
+        if ($this->zipFile === null) {
+            throw new BuildException("zipfile attribute must be set!", $this->getLocation());
+        }
+
+        if ($this->zipFile->exists() && $this->zipFile->isDirectory()) {
+            throw new BuildException("zipfile is a directory!", $this->getLocation());
+        }
+
+        if ($this->zipFile->exists() && !$this->zipFile->canWrite()) {
+            throw new BuildException("Can not write to the specified zipfile!", $this->getLocation());
+        }
+
+        // shouldn't need to clone, since the entries in filesets
+        // themselves won't be modified -- only elements will be added
+        $savedFileSets = $this->filesets;
+        
+        try {
+            if ($this->baseDir !== null) {
+                if (!$this->baseDir->exists()) {
+                    throw new BuildException("basedir does not exist!", $this->getLocation());
+                }
+
+                // add the main fileset to the list of filesets to process.
+                $mainFileSet = new FileSet($this->fileset);
+                $mainFileSet->setDir($this->baseDir);
+                $this->filesets[] = $mainFileSet;
+            }
+
+            if (empty($this->filesets)) {
+                throw new BuildException("You must supply either a basedir "
+                                         . "attribute or some nested filesets.",
+                                         $this->getLocation());
+            }                        
+            
+            // check if zip is out of date with respect to each
+            // fileset
+            $upToDate = true;
+            foreach($this->filesets as $fs) {
+            	$ds = $fs->getDirectoryScanner($this->project);
+            	$files = $ds->getIncludedFiles();
+                if (!$this->archiveIsUpToDate($files, $fs->getDir($this->project))) {
+                    $upToDate = false;
+                }
+                for ($i=0, $fcount=count($files); $i < $fcount; $i++) {
+                    if ($this->zipFile->equals(new PhingFile($fs->getDir($this->project), $files[$i]))) {
+                        throw new BuildException("A zip file cannot include itself", $this->getLocation());
+                    }
+                }
+            }
+            
+            if ($upToDate) {
+                $this->log("Nothing to do: " . $this->zipFile->__toString() . " is up to date.", PROJECT_MSG_INFO);
+                return;
+            }
+
+            $this->log("Building zip: " . $this->zipFile->__toString(), PROJECT_MSG_INFO);
+            
+            $zip = new Archive_Zip($this->zipFile->getAbsolutePath());
+            
+            foreach($this->filesets as $fs) {                                
+            	$ds = $fs->getDirectoryScanner($this->project);
+            	$files = $ds->getIncludedFiles();
+
+                // FIXME 
+                // Current model is only adding directories implicitly.  This
+                // won't add any empty directories.  Perhaps modify FileSet::getFiles()
+                // to also include empty directories.  Not high priority, since non-inclusion
+                // of empty dirs is probably not unexpected behavior for ZipTask.
+                $fsBasedir = $fs->getDir($this->project);
+                $filesToZip = array();
+                for ($i=0, $fcount=count($files); $i < $fcount; $i++) {
+                    $f = new PhingFile($fsBasedir, $files[$i]);
+                    $filesToZip[] = $f->getAbsolutePath();                        
+                }
+                $zip->add($filesToZip, array('remove_path' => $fsBasedir->getCanonicalPath()));
+            }
+                         
+                
+        } catch (IOException $ioe) {
+                $msg = "Problem creating ZIP: " . $ioe->getMessage();
+                $this->filesets = $savedFileSets;
+                throw new BuildException($msg, $ioe, $this->getLocation());
+        }
+        
+        $this->filesets = $savedFileSets;
+    }
+           
+    /**
+     * @param array $files array of filenames
+     * @param PhingFile $dir
+     * @return boolean
+     */
+    protected function archiveIsUpToDate($files, $dir) {
+        $sfs = new SourceFileScanner($this);
+        $mm = new MergeMapper();
+        $mm->setTo($this->zipFile->getAbsolutePath());
+        return count($sfs->restrict($files, $dir, null, $mm)) == 0;
+    }
+   
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ZipTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageMerger.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageMerger.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageMerger.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,127 @@
+<?php
+/**
+ * $Id: CoverageMerger.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/system/util/Properties.php';
+
+/**
+ * Saves coverage output of the test to a specified database
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: CoverageMerger.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.coverage
+ * @since 2.1.0
+ */
+class CoverageMerger
+{
+	private static function mergeCodeCoverage($left, $right)
+	{
+		$coverageMerged = array();
+
+		reset($left);
+		reset($right);
+
+		while (current($left) && current($right))
+		{
+			$linenr_left = key($left);
+			$linenr_right = key($right);
+
+			if ($linenr_left < $linenr_right)
+			{
+				$coverageMerged[$linenr_left] = current($left);
+
+				next($left);
+			}
+			else
+			if ($linenr_right < $linenr_left)
+			{
+				$coverageMerged[$linenr_right] = current($right);
+				next($right);
+			}
+			else
+			{
+				if (current($left) < 0)
+				{
+					$coverageMerged[$linenr_right] = current($right);
+				}
+				else
+				if (current($right) < 0)
+				{
+					$coverageMerged[$linenr_right] = current($left);
+				}
+				else
+				{
+					$coverageMerged[$linenr_right] = current($left) + current($right);
+				}
+				
+				next($left);
+				next($right);
+			}
+		}
+
+		while (current($left))
+		{
+			$coverageMerged[key($left)] = current($left);
+			next($left);
+		}
+
+		while (current($right))
+		{
+			$coverageMerged[key($right)] = current($right);
+			next($right);
+		}
+
+		return $coverageMerged;
+	}
+
+	static function merge($project, $codeCoverageInformation)
+	{
+		$database = new PhingFile($project->getProperty('coverage.database'));
+
+		$props = new Properties();
+		$props->load($database);
+		
+		$coverageTotal = $codeCoverageInformation;
+		
+		foreach ($coverageTotal as $coverage)
+		{
+			foreach ($coverage as $filename => $coverageFile)
+			{
+				$filename = strtolower($filename);
+				
+				if ($props->getProperty($filename) != null)
+				{
+					$file = unserialize($props->getProperty($filename));
+					$left = $file['coverage'];
+					$right = $coverageFile;
+					
+					$coverageMerged = CoverageMerger::mergeCodeCoverage($left, $right);
+					
+					$file['coverage'] = $coverageMerged;
+					
+					$props->setProperty($filename, serialize($file));
+				}
+			}
+		}
+
+		$props->store($database);
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageMerger.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageMergerTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageMergerTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageMergerTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,92 @@
+<?php
+/**
+ * $Id: CoverageMergerTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+require_once 'phing/system/io/PhingFile.php';
+require_once 'phing/system/io/Writer.php';
+require_once 'phing/system/util/Properties.php';
+require_once 'phing/tasks/ext/coverage/CoverageMerger.php';
+
+/**
+ * Merges code coverage snippets into a code coverage database
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: CoverageMergerTask.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.coverage
+ * @since 2.1.0
+ */
+class CoverageMergerTask extends Task
+{
+	/** the list of filesets containing the .php filename rules */
+	private $filesets = array();
+
+	/**
+	 * Add a new fileset containing the .php files to process
+	 *
+	 * @param FileSet the new fileset containing .php files
+	 */
+	function addFileSet(FileSet $fileset)
+	{
+		$this->filesets[] = $fileset;
+	}
+
+	/**
+	 * Iterate over all filesets and return all the filenames.
+	 *
+	 * @return array an array of filenames
+	 */
+	private function getFilenames()
+	{
+		$files = array();
+
+		foreach ($this->filesets as $fileset)
+		{
+			$ds = $fileset->getDirectoryScanner($this->project);
+			$ds->scan();
+
+			$includedFiles = $ds->getIncludedFiles();
+			
+			foreach ($includedFiles as $file)
+			{
+				$fs = new PhingFile(basename($ds->getBaseDir()), $file);
+					
+				$files[] = $fs->getAbsolutePath();
+			}
+		}
+
+		return $files;
+	}
+	
+	function main()
+	{
+		$files = $this->getFilenames();
+		
+		$this->log("Merging " . count($files) . " coverage files");
+
+		foreach ($files as $file)
+		{
+			$coverageInformation = unserialize(file_get_contents($file));
+			
+			CoverageMerger::merge($this->project, array($coverageInformation));
+		}
+	}
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageMergerTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageReportTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageReportTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageReportTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,407 @@
+<?php
+/**
+ * $Id: CoverageReportTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+require_once 'phing/system/io/PhingFile.php';
+require_once 'phing/system/io/Writer.php';
+require_once 'phing/system/util/Properties.php';
+require_once 'phing/tasks/ext/phpunit2/PHPUnit2Util.php';
+require_once 'phing/tasks/ext/coverage/CoverageReportTransformer.php';
+
+/**
+ * Transforms information in a code coverage database to XML
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: CoverageReportTask.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.coverage
+ * @since 2.1.0
+ */
+class CoverageReportTask extends Task
+{
+	private $outfile = "coverage.xml";
+
+	private $transformers = array();
+
+	/** the classpath to use (optional) */
+	private $classpath = NULL;
+	
+	/** the path to the GeSHi library (optional) */
+	private $geshipath = "";
+	
+	/** the path to the GeSHi language files (optional) */
+	private $geshilanguagespath = "";
+	
+	function setClasspath(Path $classpath)
+	{
+		if ($this->classpath === null)
+		{
+			$this->classpath = $classpath;
+		}
+		else
+		{
+			$this->classpath->append($classpath);
+		}
+	}
+
+	function createClasspath()
+	{
+		$this->classpath = new Path();
+		return $this->classpath;
+	}
+	
+	function setGeshiPath($path)
+	{
+		$this->geshipath = $path;
+	}
+
+	function setGeshiLanguagesPath($path)
+	{
+		$this->geshilanguagespath = $path;
+	}
+
+	function __construct()
+	{
+		$this->doc = new DOMDocument();
+		$this->doc->encoding = 'UTF-8';
+		$this->doc->formatOutput = true;
+		$this->doc->appendChild($this->doc->createElement('snapshot'));
+	}
+
+	function setOutfile($outfile)
+	{
+		$this->outfile = $outfile;
+	}
+
+	/**
+	 * Generate a report based on the XML created by this task
+	 */
+	function createReport()
+	{
+		$transformer = new CoverageReportTransformer($this);
+		$this->transformers[] = $transformer;
+		return $transformer;
+	}
+
+	protected function getPackageElement($packageName)
+	{
+		$packages = $this->doc->documentElement->getElementsByTagName('package');
+
+		foreach ($packages as $package)
+		{
+			if ($package->getAttribute('name') == $packageName)
+			{
+				return $package;
+			}
+		}
+
+		return NULL;
+	}
+
+	protected function addClassToPackage($classname, $element)
+	{
+		$packageName = PHPUnit2Util::getPackageName($classname);
+
+		$package = $this->getPackageElement($packageName);
+
+		if ($package === NULL)
+		{
+			$package = $this->doc->createElement('package');
+			$package->setAttribute('name', $packageName);
+			$this->doc->documentElement->appendChild($package);
+		}
+
+		$package->appendChild($element);
+	}
+
+	protected function stripDiv($source)
+	{
+		$openpos = strpos($source, "<div");
+		$closepos = strpos($source, ">", $openpos);
+
+		$line = substr($source, $closepos + 1);
+
+		$tagclosepos = strpos($line, "</div>");
+
+		$line = substr($line, 0, $tagclosepos);
+
+		return $line;
+	}
+
+	protected function highlightSourceFile($filename)
+	{
+		if ($this->geshipath)
+		{
+			require_once $this->geshipath . '/geshi.php';
+			
+			$source = file_get_contents($filename);
+
+			$geshi = new GeSHi($source, 'php', $this->geshilanguagespath);
+
+			$geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS);
+
+			$geshi->enable_strict_mode(true);
+
+			$geshi->enable_classes(true);
+
+			$geshi->set_url_for_keyword_group(3, ''); 
+
+			$html = $geshi->parse_code();
+
+			$lines = split("<li>|</li>", $html);
+
+			// skip first and last line
+			array_pop($lines);
+			array_shift($lines);
+
+			$lines = array_filter($lines);
+
+			$lines = array_map(array($this, 'stripDiv'), $lines);
+
+			return $lines;
+		}
+		else
+		{
+			$lines = file($filename);
+			
+			for ($i = 0; $i < count($lines); $i++)
+			{
+				$line = $lines[$i];
+				
+				$line = rtrim($line);
+
+				$lines[$i] = utf8_encode($line);
+			}
+			
+			return $lines;
+		}
+	}
+
+	protected function transformSourceFile($filename, $coverageInformation, $classStartLine = 1)
+	{
+		$sourceElement = $this->doc->createElement('sourcefile');
+		$sourceElement->setAttribute('name', basename($filename));
+
+		$filelines = $this->highlightSourceFile($filename);
+
+		$linenr = 1;
+
+		foreach ($filelines as $line)
+		{
+			$lineElement = $this->doc->createElement('sourceline');
+			$lineElement->setAttribute('coveredcount', (isset($coverageInformation[$linenr]) ? $coverageInformation[$linenr] : '0'));
+
+			if ($linenr == $classStartLine)
+			{
+				$lineElement->setAttribute('startclass', 1);
+			}
+
+			$textnode = $this->doc->createTextNode($line);
+			$lineElement->appendChild($textnode);
+
+			$sourceElement->appendChild($lineElement);
+
+			$linenr++;
+		}
+
+		return $sourceElement;
+	}
+	
+	protected function filterCovered($var)
+	{
+		return ($var >= 0);
+	}
+
+	protected function transformCoverageInformation($filename, $coverageInformation)
+	{
+		// Strip last line of coverage information
+		end($coverageInformation);
+		unset($coverageInformation[key($coverageInformation)]);
+		
+		$classes = PHPUnit2Util::getDefinedClasses($filename, $this->classpath);
+		
+		if (is_array($classes))
+		{
+			foreach ($classes as $classname)
+			{
+				$reflection = new ReflectionClass($classname);
+				
+				$methods = $reflection->getMethods();
+				
+				$classElement = $this->doc->createElement('class');
+				$classElement->setAttribute('name', $reflection->getName());
+				
+				$this->addClassToPackage($reflection->getName(), $classElement);
+
+				$classStartLine = $reflection->getStartLine();
+				
+				$methodscovered = 0;
+				$methodcount = 0;
+				
+				// Strange PHP5 reflection bug, classes without parent class or implemented interfaces seem to start one line off
+				if ($reflection->getParentClass() == NULL && count($reflection->getInterfaces()) == 0)
+				{
+					unset($coverageInformation[$classStartLine + 1]);
+				}
+				else
+				{
+					unset($coverageInformation[$classStartLine]);
+				}
+				
+				reset($coverageInformation);				
+				
+				foreach ($methods as $method)
+				{
+					// PHP5 reflection considers methods of a parent class to be part of a subclass, we don't
+					if ($method->getDeclaringClass()->getName() != $reflection->getName())
+					{
+						continue;
+					}
+
+					// small fix for XDEBUG_CC_UNUSED
+					if (isset($coverageInformation[$method->getStartLine()]))
+					{
+						unset($coverageInformation[$method->getStartLine()]);
+					}
+
+					if (isset($coverageInformation[$method->getEndLine()]))
+					{
+						unset($coverageInformation[$method->getEndLine()]);
+					}
+
+					if ($method->isAbstract())
+					{
+						continue;
+					}
+
+					$linenr = key($coverageInformation);
+
+					while ($linenr !== null && $linenr < $method->getStartLine())
+					{
+						next($coverageInformation);
+						$linenr = key($coverageInformation);
+					}
+
+					if (current($coverageInformation) > 0 && $method->getStartLine() <= $linenr && $linenr <= $method->getEndLine())
+					{
+						$methodscovered++;
+					}
+
+					$methodcount++;
+				}
+
+				$statementcount = count($coverageInformation);
+				$statementscovered = count(array_filter($coverageInformation, array($this, 'filterCovered')));
+
+				$classElement->appendChild($this->transformSourceFile($filename, $coverageInformation, $classStartLine));
+
+				$classElement->setAttribute('methodcount', $methodcount);
+				$classElement->setAttribute('methodscovered', $methodscovered);
+				$classElement->setAttribute('statementcount', $statementcount);
+				$classElement->setAttribute('statementscovered', $statementscovered);
+				$classElement->setAttribute('totalcount', $methodcount + $statementcount);
+				$classElement->setAttribute('totalcovered', $methodscovered + $statementscovered);
+			}
+		}
+	}
+
+	protected function calculateStatistics()
+	{
+		$packages = $this->doc->documentElement->getElementsByTagName('package');
+
+		$totalmethodcount = 0;
+		$totalmethodscovered = 0;
+
+		$totalstatementcount = 0;
+		$totalstatementscovered = 0;
+
+		foreach ($packages as $package)
+		{
+			$methodcount = 0;
+			$methodscovered = 0;
+
+			$statementcount = 0;
+			$statementscovered = 0;
+
+			$classes = $package->getElementsByTagName('class');
+
+			foreach ($classes as $class)
+			{
+				$methodcount += $class->getAttribute('methodcount');
+				$methodscovered += $class->getAttribute('methodscovered');
+
+				$statementcount += $class->getAttribute('statementcount');
+				$statementscovered += $class->getAttribute('statementscovered');
+			}
+
+			$package->setAttribute('methodcount', $methodcount);
+			$package->setAttribute('methodscovered', $methodscovered);
+
+			$package->setAttribute('statementcount', $statementcount);
+			$package->setAttribute('statementscovered', $statementscovered);
+
+			$package->setAttribute('totalcount', $methodcount + $statementcount);
+			$package->setAttribute('totalcovered', $methodscovered + $statementscovered);
+
+			$totalmethodcount += $methodcount;
+			$totalmethodscovered += $methodscovered;
+
+			$totalstatementcount += $statementcount;
+			$totalstatementscovered += $statementscovered;
+		}
+
+		$this->doc->documentElement->setAttribute('methodcount', $totalmethodcount);
+		$this->doc->documentElement->setAttribute('methodscovered', $totalmethodscovered);
+
+		$this->doc->documentElement->setAttribute('statementcount', $totalstatementcount);
+		$this->doc->documentElement->setAttribute('statementscovered', $totalstatementscovered);
+
+		$this->doc->documentElement->setAttribute('totalcount', $totalmethodcount + $totalstatementcount);
+		$this->doc->documentElement->setAttribute('totalcovered', $totalmethodscovered + $totalstatementscovered);
+	}
+
+	function main()
+	{
+		$this->log("Transforming coverage report");
+		
+		$database = new PhingFile($this->project->getProperty('coverage.database'));
+		
+		$props = new Properties();
+		$props->load($database);
+
+		foreach ($props->keys() as $filename)
+		{
+			$file = unserialize($props->getProperty($filename));
+
+			$this->transformCoverageInformation($file['fullname'], $file['coverage']);
+		}
+		
+		$this->calculateStatistics();
+
+		$this->doc->save($this->outfile);
+
+		foreach ($this->transformers as $transformer)
+		{
+			$transformer->setXmlDocument($this->doc);
+			$transformer->transform();
+		}
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageReportTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageReportTransformer.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageReportTransformer.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageReportTransformer.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,121 @@
+<?php
+/**
+ * $Id: CoverageReportTransformer.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+require_once 'phing/system/io/PhingFile.php';
+require_once 'phing/system/io/FileWriter.php';
+require_once 'phing/util/ExtendedFileStream.php';
+
+/**
+ * Transform a Phing/Xdebug code coverage xml report.
+ * The default transformation generates an html report in framed style.
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: CoverageReportTransformer.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.coverage
+ * @since 2.1.0
+ */
+class CoverageReportTransformer
+{
+	private $task = NULL;
+	private $styleDir = "";
+	private $toDir = "";
+	private $document = NULL;
+
+	function __construct(Task $task)
+	{
+		$this->task = $task;
+	}
+
+	function setStyleDir($styleDir)
+	{
+		$this->styleDir = $styleDir;
+	}
+
+	function setToDir($toDir)
+	{
+		$this->toDir = $toDir;
+	}
+
+	function setXmlDocument($document)
+	{
+		$this->document = $document;
+	}
+
+	function transform()
+	{
+        $dir = new PhingFile($this->toDir);
+
+        if (!$dir->exists())
+        {
+            throw new BuildException("Directory '" . $this->toDir . "' does not exist");
+        }
+
+		$xslfile = $this->getStyleSheet();
+
+		$xsl = new DOMDocument();
+		$xsl->load($xslfile->getAbsolutePath());
+
+		$proc = new XSLTProcessor();
+		$proc->importStyleSheet($xsl);
+
+		ExtendedFileStream::registerStream();
+
+		// no output for the framed report
+		// it's all done by extension...
+		$proc->setParameter('', 'output.dir', $dir->getAbsolutePath());
+		$proc->transformToXML($this->document);
+	}
+
+	private function getStyleSheet()
+	{
+		$xslname = "coverage-frames.xsl";
+
+		if ($this->styleDir)
+		{
+			$file = new PhingFile($this->styleDir, $xslname);
+		}
+		else
+		{
+			$path = Phing::getResourcePath("phing/etc/$xslname");
+			
+			if ($path === NULL)
+			{
+				$path = Phing::getResourcePath("etc/$xslname");
+
+				if ($path === NULL)
+				{
+					throw new BuildException("Could not find $xslname in resource path");
+				}
+			}
+			
+			$file = new PhingFile($path);
+		}
+
+		if (!$file->exists())
+		{
+			throw new BuildException("Could not find file " . $file->getPath());
+		}
+
+		return $file;
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageReportTransformer.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageSetupTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageSetupTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageSetupTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,163 @@
+<?php
+/**
+ * $Id: CoverageSetupTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+require_once 'phing/system/io/PhingFile.php';
+require_once 'phing/system/io/Writer.php';
+require_once 'phing/system/util/Properties.php';
+require_once 'phing/tasks/ext/coverage/CoverageMerger.php';
+
+/**
+ * Initializes a code coverage database
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: CoverageSetupTask.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.coverage
+ * @since 2.1.0
+ */
+class CoverageSetupTask extends Task
+{
+	/** the list of filesets containing the .php filename rules */
+	private $filesets = array();
+
+	/** the filename of the coverage database */
+	private $database = "coverage.db";
+
+	/** the classpath to use (optional) */
+	private $classpath = NULL;
+
+	/**
+	 * Add a new fileset containing the .php files to process
+	 *
+	 * @param FileSet the new fileset containing .php files
+	 */
+	function addFileSet(FileSet $fileset)
+	{
+		$this->filesets[] = $fileset;
+	}
+
+	/**
+	 * Sets the filename of the coverage database to use
+	 *
+	 * @param string the filename of the database
+	 */
+	function setDatabase($database)
+	{
+		$this->database = $database;
+	}
+
+	function setClasspath(Path $classpath)
+	{
+		if ($this->classpath === null)
+		{
+			$this->classpath = $classpath;
+		}
+		else
+		{
+			$this->classpath->append($classpath);
+		}
+	}
+
+	function createClasspath()
+	{
+		$this->classpath = new Path();
+		return $this->classpath;
+	}
+	
+	/**
+	 * Iterate over all filesets and return the filename of all files
+	 * that end with .php. This is to avoid loading an xml file
+	 * for example.
+	 *
+	 * @return array an array of (basedir, filenames) pairs
+	 */
+	private function getFilenames()
+	{
+		$files = array();
+
+		foreach ($this->filesets as $fileset)
+		{
+			$ds = $fileset->getDirectoryScanner($this->project);
+			$ds->scan();
+
+			$includedFiles = $ds->getIncludedFiles();
+
+			foreach ($includedFiles as $file)
+			{
+				if (strstr($file, ".php"))
+				{
+					$fs = new PhingFile(realpath($ds->getBaseDir()), $file);
+					
+					$files[] = array('key' => strtolower($fs->getAbsolutePath()), 'fullname' => $fs->getAbsolutePath());
+				}
+			}
+		}
+
+		return $files;
+	}
+	
+	function init()
+	{
+		include_once 'PHPUnit2/Framework/TestCase.php';
+		if (!class_exists('PHPUnit2_Framework_TestCase')) {
+			throw new Exception("PHPUnit2Task depends on PEAR PHPUnit2 package being installed.");
+		}
+	}
+
+	function main()
+	{
+		$files = $this->getFilenames();
+
+		$this->log("Setting up coverage database for " . count($files) . " files");
+
+		$props = new Properties();
+
+		foreach ($files as $file)
+		{
+			$fullname = $file['fullname'];
+			$filename = $file['key'];
+			
+			$props->setProperty($filename, serialize(array('fullname' => $fullname, 'coverage' => array())));
+		}
+
+		$dbfile = new PhingFile($this->database);
+
+		$props->store($dbfile);
+
+		$this->project->setProperty('coverage.database', $dbfile->getAbsolutePath());
+	
+		foreach ($files as $file)
+		{
+			$fullname = $file['fullname'];
+			
+			xdebug_start_code_coverage(XDEBUG_CC_UNUSED);
+			
+			Phing::__import($fullname, $this->classpath);
+			
+			$coverage = xdebug_get_code_coverage();
+			
+			xdebug_stop_code_coverage();
+			
+			CoverageMerger::merge($this->project, array($coverage));
+		}
+	}
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/coverage/CoverageSetupTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/IoncubeComment.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/IoncubeComment.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/IoncubeComment.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,44 @@
+<?php
+/**
+ * $Id: IoncubeComment.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ * Wrapper for comments for ionCube tasks
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: IoncubeComment.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.ioncube
+ * @since 2.2.0
+ */
+class IoncubeComment
+{
+	private $value = "";
+	
+	public function getValue()
+	{
+		return $this->value;
+	}
+	
+	public function addText($txt)
+	{
+		$this->value = trim($txt);
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/IoncubeComment.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/IoncubeEncoderTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/IoncubeEncoderTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/IoncubeEncoderTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,336 @@
+<?php
+/**
+ * $Id: IoncubeEncoderTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+require_once 'phing/tasks/ext/ioncube/IoncubeComment.php';
+
+/**
+ * Invokes the ionCube Encoder (PHP4 or PHP5)
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: IoncubeEncoderTask.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.ioncube
+ * @since 2.2.0
+ */
+class IoncubeEncoderTask extends Task
+{
+	private $phpVersion = "5";
+	private $ioncubePath = "/usr/local/ioncube";
+	private $encoderName = "ioncube_encoder";
+	
+	private $fromDir = "";
+	private $toDir = "";
+	
+	private $encrypt = "";
+	
+	private $targetOption = "";
+	private $binary = false;
+	private $optimize = "";
+	private $withoutRuntimeLoaderSupport = false;
+	
+	private $licensePath = "";
+	private $passPhrase = "";
+	
+	private $comments = array();
+
+	/**
+	 * Sets the path to the ionCube encoder
+	 */
+	function setIoncubePath($ioncubePath)
+	{
+		$this->ioncubePath = $ioncubePath;
+	}
+
+	/**
+	 * Returns the path to the ionCube encoder
+	 */
+	function getIoncubePath()
+	{
+		return $this->ioncubePath;
+	}
+
+	/**
+	 * Sets the version of PHP to use (defaults to 5)
+	 */
+	function setPhpVersion($phpVersion)
+	{
+		$this->phpVersion = $phpVersion;
+	}
+
+	/**
+	 * Returns the version of PHP to use (defaults to 5)
+	 */
+	function getPhpVersion()
+	{
+		return $this->phpVersion;
+	}
+	
+	/**
+	 * Sets the source directory
+	 */
+	function setFromDir($fromDir)
+	{
+		$this->fromDir = $fromDir;
+	}
+
+	/**
+	 * Returns the source directory
+	 */
+	function getFromDir($fromDir)
+	{
+		return $this->fromDir;
+	}
+	
+	/**
+	 * Sets the target directory
+	 */
+	function setToDir($toDir)
+	{
+		$this->toDir = $toDir;
+	}
+
+	/**
+	 * Returns the target directory
+	 */
+	function getToDir($toDir)
+	{
+		return $this->toDir;
+	}
+
+	/**
+	 * Sets regexps of additional files to encrypt (separated by space)
+	 */
+	function setEncrypt($encrypt)
+	{
+		$this->encrypt = $encrypt;
+	}
+	
+	/**
+	 * Returns regexps of additional files to encrypt (separated by space)
+	 */
+	function getEncrypt()
+	{
+		return $this->encrypt;
+	}
+	
+	/**
+	 * Sets the binary option
+	 */
+	function setBinary($binary)
+	{
+		$this->binary = $binary;
+	}
+	
+	/**
+	 * Returns the binary option
+	 */
+	function getBinary()
+	{
+		return $this->binary;
+	}
+
+	/**
+	 * Sets the optimize option
+	 */
+	function setOptimize($optimize)
+	{
+		$this->optimize = $optimize;
+	}
+	
+	/**
+	 * Returns the optimize option
+	 */
+	function getOptimize()
+	{
+		return $this->optimize;
+	}
+
+	/**
+	 * Sets the without-runtime-loader-support option
+	 */
+	function setWithoutRuntimeLoaderSupport($withoutRuntimeLoaderSupport)
+	{
+		$this->withoutRuntimeLoaderSupport = $withoutRuntimeLoaderSupport;
+	}
+	
+	/**
+	 * Returns the without-runtime-loader-support option
+	 */
+	function getWithoutRuntimeLoaderSupport()
+	{
+		return $this->withoutRuntimeLoaderSupport;
+	}
+	
+	/**
+	 * Sets the option to use when encoding target directory already exists (defaults to none)
+	 */
+	function setTargetOption($targetOption)
+	{
+		$this->targetOption = $targetOption;
+	}
+
+	/**
+	 * Returns he option to use when encoding target directory already exists (defaults to none)
+	 */
+	function getTargetOption()
+	{
+		return $this->targetOption;
+	}
+	
+	/**
+	 * Sets the path to the license file to use
+	 */
+	function setLicensePath($licensePath)
+	{
+		$this->licensePath = $licensePath;
+	}
+
+	/**
+	 * Returns the path to the license file to use
+	 */
+	function getLicensePath()
+	{
+		return $this->licensePath;
+	}
+
+	/**
+	 * Sets the passphrase to use when encoding files
+	 */
+	function setPassPhrase($passPhrase)
+	{
+		$this->passPhrase = $passPhrase;
+	}
+
+	/**
+	 * Returns the passphrase to use when encoding files
+	 */
+	function getPassPhrase()
+	{
+		return $this->passPhrase;
+	}
+
+	/**
+	 * Adds a comment to be used in encoded files
+	 */
+	function addComment(IoncubeComment $comment)
+	{
+		$this->comments[] = $comment;
+	}
+
+	/**
+	 * The main entry point
+	 *
+	 * @throws BuildException
+	 */
+	function main()
+	{
+		$arguments = $this->constructArguments();
+		
+		$encoder = new PhingFile($this->ioncubePath, $this->encoderName . ($this->phpVersion == 5 ? '5' : ''));
+		
+		$this->log("Running ionCube Encoder...");
+		
+		exec($encoder->__toString() . " " . $arguments . " 2>&1", $output, $return);
+		
+        if ($return != 0)
+        {
+			throw new BuildException("Could not execute ionCube Encoder: " . implode(' ', $output));
+        }       
+	}
+
+	/**
+	 * Constructs an argument string for the ionCube encoder
+	 */
+	private function constructArguments()
+	{
+		$arguments = "";
+		
+		if ($this->binary)
+		{
+			$arguments.= "--binary ";
+		}
+		
+		if (!empty($this->optimize))
+		{
+			$arguments.= "--optimize " . $this->optimize . " ";
+		}
+		
+		if ($this->withoutRuntimeLoaderSupport)
+		{
+			$arguments.= "--without-runtime-loader-support ";
+		}
+		
+		if (!empty($this->targetOption))
+		{
+			switch ($this->targetOption)
+			{
+				case "replace":
+				case "merge":
+				case "update":
+				case "rename":
+				{
+					$arguments.= "--" . $this->targetOption . "-target ";
+				} break;
+				
+				default:
+				{
+					throw new BuildException("Unknown target option '" . $this->targetOption . "'");
+				} break;
+			}
+		}
+		
+		if (!empty($this->encrypt))
+		{
+			foreach (explode(" ", $this->encrypt) as $encrypt)
+			{
+				$arguments.= "--encrypt '$encrypt' ";
+			}
+		}
+		
+		if (!empty($this->licensePath))
+		{
+			$arguments.= "--with-license '" . $this->licensePath . "' ";
+		}
+
+		if (!empty($this->passPhrase))
+		{
+			$arguments.= "--passphrase '" . $this->passPhrase . "' ";
+		}
+		
+		foreach ($this->comments as $comment)
+		{
+			$arguments.= "--add-comment '" . $comment->getValue() . "' ";
+		}
+		
+		if ($this->fromDir != "")
+		{
+			$arguments .= $this->fromDir . " ";
+		}
+
+		if ($this->toDir != "")
+		{
+			$arguments .= "-o " . $this->toDir . " ";
+		}
+
+		return $arguments;
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/IoncubeEncoderTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/IoncubeLicenseTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/IoncubeLicenseTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/IoncubeLicenseTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,144 @@
+<?php
+/**
+ * $Id: IoncubeLicenseTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+require_once 'phing/tasks/ext/ioncube/IoncubeComment.php';
+
+/**
+ * Invokes the ionCube "make_license" program
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: IoncubeLicenseTask.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.ioncube
+ * @since 2.2.0
+ */
+class IoncubeLicenseTask extends Task
+{
+	private $ioncubePath = "/usr/local/ioncube";
+	
+	private $licensePath = "";
+	private $passPhrase = "";
+	
+	private $comments = array();
+
+	/**
+	 * Sets the path to the ionCube encoder
+	 */
+	function setIoncubePath($ioncubePath)
+	{
+		$this->ioncubePath = $ioncubePath;
+	}
+
+	/**
+	 * Returns the path to the ionCube encoder
+	 */
+	function getIoncubePath()
+	{
+		return $this->ioncubePath;
+	}
+
+	/**
+	 * Sets the path to the license file to use
+	 */
+	function setLicensePath($licensePath)
+	{
+		$this->licensePath = $licensePath;
+	}
+
+	/**
+	 * Returns the path to the license file to use
+	 */
+	function getLicensePath()
+	{
+		return $this->licensePath;
+	}
+
+	/**
+	 * Sets the passphrase to use when encoding files
+	 */
+	function setPassPhrase($passPhrase)
+	{
+		$this->passPhrase = $passPhrase;
+	}
+
+	/**
+	 * Returns the passphrase to use when encoding files
+	 */
+	function getPassPhrase()
+	{
+		return $this->passPhrase;
+	}
+
+	/**
+	 * Adds a comment to be used in encoded files
+	 */
+	function addComment(IoncubeComment $comment)
+	{
+		$this->comments[] = $comment;
+	}
+
+	/**
+	 * The main entry point
+	 *
+	 * @throws BuildException
+	 */
+	function main()
+	{
+		$arguments = $this->constructArguments();
+		
+		$makelicense = new PhingFile($this->ioncubePath, 'make_license');
+		
+		$this->log("Running ionCube make_license...");
+		
+		exec($makelicense->__toString() . " " . $arguments . " 2>&1", $output, $return);
+		
+        if ($return != 0)
+        {
+			throw new BuildException("Could not execute ionCube make_license: " . implode(' ', $output));
+        }       
+	}
+
+	/**
+	 * Constructs an argument string for the ionCube make_license
+	 */
+	private function constructArguments()
+	{
+		$arguments = "";
+		
+		if (!empty($this->passPhrase))
+		{
+			$arguments.= "--passphrase '" . $this->passPhrase . "' ";
+		}
+		
+		foreach ($this->comments as $comment)
+		{
+			$arguments.= "--header-line '" . $comment->getValue() . "' ";
+		}
+		
+		if (!empty($this->licensePath))
+		{
+			$arguments.= "--o '" . $this->licensePath . "' ";
+		}
+
+		return $arguments;
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/ioncube/IoncubeLicenseTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/pearpackage/Fileset.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/pearpackage/Fileset.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/pearpackage/Fileset.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,231 @@
+<?php
+/*
+ *  $Id: Fileset.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/system/io/PhingFile.php';
+
+/**
+ * Builds list of files for PEAR_PackageFileManager using a Phing FileSet.
+ *
+ * Some code here is taken from PEAR_PackageFileManager_File -- getting results from flat
+ * array into the assoc array expected from getFileList().
+ * 
+ * @author   Greg Beaver 
+ * @author   Hans Lellelid <hans en xmpl.org>
+ * @package  phing.tasks.ext.pearpackage
+ * @version  $Revision: 1.7 $
+ */
+class PEAR_PackageFileManager_Fileset {
+
+    /**
+     * @access private
+     * @var PEAR_PackageFileManager
+     */
+    private $parent;
+    
+    /**
+     * Curent Phing Project.
+     * @var Project
+     */
+    private $project;
+    
+    /**
+     * FileSets to use.
+     * @var array FileSet[]
+     */
+    private $filesets = array();
+
+    /**
+     * Set up the FileSet filelist generator
+     *
+     * 'project' and 'filesets' are the only options that this class uses.
+     * 
+     * @param PEAR_PackageFileManager
+     * @param array
+     */
+    function __construct($parent, $options)
+    {
+        $this->parent = $parent;
+        $this->project = $options['phing_project'];
+        $this->filesets = $options['phing_filesets'];
+    }
+    
+    /**
+     * Generate the <filelist></filelist> section
+     * of the package file.
+     *
+     * This function performs the backend generation of the array
+     * containing all files in this package
+     * @return array structure of all files to include
+     */
+    function getFileList() {    
+
+        $allfiles = array();        
+        
+        foreach($this->filesets as $fs) {
+            $ds = $fs->getDirectoryScanner($this->project);
+            
+            $files = $ds->getIncludedFiles();
+            
+            // We need to store these files keyed by the basedir from DirectoryScanner
+            // so that we can resolve the fullpath of the file later.
+            if (isset($allfiles[$ds->getBasedir()]))
+            {
+                $allfiles[$ds->getBasedir()] = array_merge($allfiles[$ds->getBasedir()], $files);
+            }
+            else
+            {
+                $allfiles[$ds->getBasedir()] = $files;
+            }
+        }
+        
+        $struc = array();
+        
+        foreach($allfiles as $basedir => $files) {
+        
+            foreach($files as $file) {
+                            
+                // paths are relative to $basedir above
+                $path = strtr(dirname($file), DIRECTORY_SEPARATOR, '/');
+    
+                if (!$path || $path == '.') {
+                    $path = '/'; // for array index
+                }
+                
+				$parts = explode('.', basename($file));
+                $ext = array_pop($parts);
+                if (strlen($ext) == strlen($file)) {
+                    $ext = '';
+                }
+                
+                $f = new PhingFile($basedir, $file);
+                
+                $struc[$path][] = array('file' => basename($file),
+                                        'ext' => $ext,
+                                        'path' => (($path == '/') ? basename($file) : $path . '/' . basename($file)),
+                                        'fullpath' => $f->getAbsolutePath());        
+            }                                        
+        }
+                
+        uksort($struc,'strnatcasecmp');
+        foreach($struc as $key => $ind) {
+            usort($ind, array($this, 'sortfiles'));
+            $struc[$key] = $ind;
+        }
+
+        $tempstruc = $struc;
+        $struc = array('/' => $tempstruc['/']);
+        $bv = 0;
+        foreach($tempstruc as $key => $ind) {
+            $save = $key;
+            if ($key != '/') {
+                $struc['/'] = $this->setupDirs($struc['/'], explode('/', $key), $tempstruc[$key]);
+            }
+        }
+        uksort($struc['/'], array($this, 'mystrucsort'));
+
+        return $struc;
+    }
+
+    /**
+     * Recursively move contents of $struc into associative array
+     *
+     * The contents of $struc have many indexes like 'dir/subdir/subdir2'.
+     * This function converts them to
+     * array('dir' => array('subdir' => array('subdir2')))
+     * @param array struc is array('dir' => array of files in dir,
+     *              'dir/subdir' => array of files in dir/subdir,...)
+     * @param array array form of 'dir/subdir/subdir2' array('dir','subdir','subdir2')
+     * @return array same as struc but with array('dir' =>
+     *              array(file1,file2,'subdir' => array(file1,...)))
+     */
+    private function setupDirs($struc, $dir, $contents) {
+    
+        if (!count($dir)) {
+            foreach($contents as $dir => $files) {
+                if (is_string($dir)) {
+                    if (strpos($dir, '/')) {
+                        $test = true;
+                        $a = $contents[$dir];
+                        unset($contents[$dir]);
+                        $b = explode('/', $dir);
+                        $c = array_shift($b);
+                        if (isset($contents[$c])) {
+                            $contents[$c] = $this->setDir($contents[$c], $this->setupDirs(array(), $b, $a));
+                        } else {
+                            $contents[$c] = $this->setupDirs(array(), $b, $a);
+                        }
+                    }
+                }
+            }
+            return $contents;
+        }
+        $me = array_shift($dir);
+        if (!isset($struc[$me])) {
+            $struc[$me] = array();
+        }
+        $struc[$me] = $this->setupDirs($struc[$me], $dir, $contents);
+        return $struc;
+    }
+    
+    /**
+     * Recursively add all the subdirectories of $contents to $dir without erasing anything in
+     * $dir
+     * @param array
+     * @param array
+     * @return array processed $dir
+     */
+    function setDir($dir, $contents)
+    {
+        while(list($one,$two) = each($contents)) {
+            if (isset($dir[$one])) {
+                $dir[$one] = $this->setDir($dir[$one], $contents[$one]);
+            } else {
+                $dir[$one] = $two;
+            }
+        }
+        return $dir;
+    }
+    
+    /**
+     * Sorting functions for the file list
+     * @param string
+     * @param string
+     * @access private
+     */
+    function sortfiles($a, $b)
+    {
+        return strnatcasecmp($a['file'],$b['file']);
+    }
+    
+    function mystrucsort($a, $b)
+    {
+        if (is_numeric($a) && is_string($b)) return 1;
+        if (is_numeric($b) && is_string($a)) return -1;
+        if (is_numeric($a) && is_numeric($b))
+        {
+            if ($a > $b) return 1;
+            if ($a < $b) return -1;
+            if ($a == $b) return 0;
+        }
+        return strnatcasecmp($a,$b);
+    }
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/pearpackage/Fileset.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpdoc/PHPDocumentorTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpdoc/PHPDocumentorTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpdoc/PHPDocumentorTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,191 @@
+<?php
+
+/**
+ * $Id: PHPDocumentorTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+
+/**
+ * Task to run phpDocumentor.
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: PHPDocumentorTask.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.phpdoc
+ */	
+class PHPDocumentorTask extends Task
+{
+	/**
+	 * The path to the executable for phpDocumentor
+	 */
+	private $programPath = 'phpdoc';
+
+	private $title = "Default Title";
+
+	private $destdir = ".";
+
+	private $sourcepath = NULL;
+
+	private $output = "";
+
+	private $linksource = false;
+
+	private $parseprivate = false;
+
+	/**
+	 * Sets the path to the phpDocumentor executable
+	 */
+	function setProgramPath($programPath)
+	{
+		$this->programPath = $programPath;
+	}
+
+	/**
+	 * Returns the path to the phpDocumentor executable
+	 */
+	function getProgramPath()
+	{
+		return $this->programPath;
+	}
+
+	/**
+	 * Set the title for the generated documentation
+	 */
+	function setTitle($title)
+	{
+		$this->title = $title;
+	}
+
+	/**
+	 * Set the destination directory for the generated documentation
+	 */
+	function setDestdir($destdir)
+	{
+		$this->destdir = $destdir;
+	}
+
+	/**
+	 * Set the source path
+	 */
+	function setSourcepath(Path $sourcepath)
+	{
+		if ($this->sourcepath === NULL)
+		{
+			$this->sourcepath = $sourcepath;
+		}
+		else
+		{
+			$this->sourcepath->append($sourcepath);
+		}
+	}
+
+	/**
+	 * Set the output type
+	 */		
+	function setOutput($output)
+	{
+		$this->output = $output;
+	}
+
+	/**
+	 * Should sources be linked in the generated documentation
+	 */
+	function setLinksource($linksource)
+	{
+		$this->linksource = $linksource;
+	}
+
+	/**
+	 * Should private members/classes be documented
+	 */
+	function setParseprivate($parseprivate)
+	{
+		$this->parseprivate = $parseprivate;
+	}
+
+	/**
+	 * Main entrypoint of the task
+	 */
+	function main()
+	{
+		$arguments = $this->constructArguments();
+
+		$this->log("Running phpDocumentor...");
+
+		exec($this->programPath . " " . $arguments, $output, $return);
+
+		if ($return != 0)
+		{
+			throw new BuildException("Could not execute phpDocumentor: " . implode(' ', $output));
+		}
+		
+		foreach($output as $line)
+		{
+			if(strpos($line, 'ERROR') !== false)
+			{
+				$this->log($line, PROJECT_MSG_ERR);
+				continue;
+			}
+			
+			$this->log($line, PROJECT_MSG_VERBOSE);
+		}
+	}
+
+	/**
+	 * Constructs an argument string for phpDocumentor
+	 */
+	private function constructArguments()
+	{
+		$arguments = "-q on ";
+
+		if ($this->title)
+		{
+			$arguments.= "-ti \"" . $this->title . "\" ";
+		}
+
+		if ($this->destdir)
+		{
+			$arguments.= "-t \"" . $this->destdir . "\" ";
+		}
+
+		if ($this->sourcepath !== NULL)
+		{
+			$arguments.= "-d \"" . $this->sourcepath->__toString() . "\" ";
+		}
+
+		if ($this->output)
+		{
+			$arguments.= "-o " . $this->output . " ";
+		}
+
+		if ($this->linksource)
+		{
+			$arguments.= "-s on ";
+		}
+
+		if ($this->parseprivate)
+		{
+			$arguments.= "-pp on ";
+		}
+
+		return $arguments;
+	}
+};
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpdoc/PHPDocumentorTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/BatchTest.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/BatchTest.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/BatchTest.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,171 @@
+<?php
+/**
+ * $Id: BatchTest.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/types/FileSet.php';
+
+/**
+ * Scans a list of (.php) files given by the fileset attribute, extracts
+ * all subclasses of PHPUnit2_Framework_TestCase.
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: BatchTest.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.phpunit2
+ * @since 2.1.0
+ */
+class BatchTest
+{
+	/** the list of filesets containing the testcase filename rules */
+	private $filesets = array();
+
+	/** the reference to the project */
+	private $project = NULL;
+
+	/** the classpath to use with Phing::__import() calls */
+	private $classpath = NULL;
+	
+	/** names of classes to exclude */
+	private $excludeClasses = array();
+	
+	/**
+	 * Create a new batchtest instance
+	 *
+	 * @param Project the project it depends on.
+	 */
+	function __construct(Project $project)
+	{
+		$this->project = $project;
+	}
+	
+	/**
+	 * Sets the classes to exclude
+	 */
+	function setExclude($exclude)
+	{
+		$this->excludeClasses = explode(" ", $exclude);
+	}
+
+	/**
+	 * Sets the classpath
+	 */
+	function setClasspath(Path $classpath)
+	{
+		if ($this->classpath === null)
+		{
+			$this->classpath = $classpath;
+		}
+		else
+		{
+			$this->classpath->append($classpath);
+		}
+	}
+
+	/**
+	 * Creates a new Path object
+	 */
+	function createClasspath()
+	{
+		$this->classpath = new Path();
+		return $this->classpath;
+	}
+
+	/**
+	 * Returns the classpath
+	 */
+	function getClasspath()
+	{
+		return $this->classpath;
+	}
+
+	/**
+	 * Add a new fileset containing the XML results to aggregate
+	 *
+	 * @param FileSet the new fileset containing XML results.
+	 */
+	function addFileSet(FileSet $fileset)
+	{
+		$this->filesets[] = $fileset;
+	}
+
+	/**
+	 * Iterate over all filesets and return the filename of all files
+	 * that end with .php.
+	 *
+	 * @return array an array of filenames
+	 */
+	private function getFilenames()
+	{
+		$filenames = array();
+
+		foreach ($this->filesets as $fileset)
+		{
+			$ds = $fileset->getDirectoryScanner($this->project);
+			$ds->scan();
+
+			$files = $ds->getIncludedFiles();
+
+			foreach ($files as $file)
+			{
+				if (strstr($file, ".php"))
+				{
+					$filenames[] = $ds->getBaseDir() . "/" . $file;
+				}
+			}
+		}
+
+		return $filenames;
+	}
+	
+	/**
+	 * Filters an array of classes, removes all classes that are not subclasses of PHPUnit2_Framework_TestCase,
+	 * or classes that are declared abstract
+	 */
+	private function filterTests($input)
+	{
+		$reflect = new ReflectionClass($input);
+		
+		return is_subclass_of($input, 'PHPUnit2_Framework_TestCase') && (!$reflect->isAbstract());
+	}
+
+	/**
+	 * Returns an array of PHPUnit2_Framework_TestCase classes that are declared
+	 * by the files included by the filesets
+	 *
+	 * @return array an array of PHPUnit2_Framework_TestCase classes.
+	 */
+	function elements()
+	{
+		$filenames = $this->getFilenames();
+		
+		$declaredClasses = array();		
+
+		foreach ($filenames as $filename)
+		{
+			$definedClasses = PHPUnit2Util::getDefinedClasses($filename, $this->classpath);
+			
+			$declaredClasses = array_merge($declaredClasses, $definedClasses);
+		}
+		
+		$elements = array_filter($declaredClasses, array($this, "filterTests"));
+
+		return $elements;
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/BatchTest.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/FormatterElement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/FormatterElement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/FormatterElement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,120 @@
+<?php
+/**
+ * $Id: FormatterElement.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/ext/phpunit2/XMLPHPUnit2ResultFormatter.php';
+require_once 'phing/tasks/ext/phpunit2/PlainPHPUnit2ResultFormatter.php';
+require_once 'phing/system/io/PhingFile.php';
+
+/**
+ * A wrapper for the implementations of PHPUnit2ResultFormatter.
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: FormatterElement.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.phpunit2
+ * @since 2.1.0
+ */
+class FormatterElement
+{
+	protected $formatter = NULL;
+	
+	protected $type = "";
+	
+	protected $useFile = true;
+	
+	protected $toDir = ".";
+	
+	protected $outfile = "";
+
+	function setType($type)
+	{
+		$this->type = $type;
+
+		if ($this->type == "xml")
+		{
+			$destFile = new PhingFile($this->toDir, 'testsuites.xml');
+			$this->formatter = new XMLPHPUnit2ResultFormatter();
+		}
+		else
+		if ($this->type == "plain")
+		{
+			$this->formatter = new PlainPHPUnit2ResultFormatter();
+		}
+		else
+		{
+			throw new BuildException("Formatter '" . $this->type . "' not implemented");
+		}
+	}
+
+	function setClassName($className)
+	{
+		$classNameNoDot = Phing::import($className);
+
+		$this->formatter = new $classNameNoDot();
+	}
+
+	function setUseFile($useFile)
+	{
+		$this->useFile = $useFile;
+	}
+	
+	function getUseFile()
+	{
+		return $this->useFile;
+	}
+	
+	function setToDir($toDir)
+	{
+		$this->toDir = $toDir;
+	}
+	
+	function getToDir()
+	{
+		return $this->toDir;
+	}
+
+	function setOutfile($outfile)
+	{
+		$this->outfile = $outfile;
+	}
+	
+	function getOutfile()
+	{
+		if ($this->outfile)
+		{
+			return $this->outfile;
+		}
+		else
+		{
+			return $this->formatter->getPreferredOutfile() . $this->getExtension();
+		}
+	}
+	
+	function getExtension()
+	{
+		return $this->formatter->getExtension();
+	}
+
+	function getFormatter()
+	{
+		return $this->formatter;
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/FormatterElement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2ReportTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2ReportTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2ReportTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,187 @@
+<?php
+/**
+ * $Id: PHPUnit2ReportTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+require_once 'phing/system/io/PhingFile.php';
+require_once 'phing/system/io/FileWriter.php';
+require_once 'phing/util/ExtendedFileStream.php';
+
+/**
+ * Transform a PHPUnit2 xml report using XSLT.
+ * This transformation generates an html report in either framed or non-framed
+ * style. The non-framed style is convenient to have a concise report via mail, 
+ * the framed report is much more convenient if you want to browse into 
+ * different packages or testcases since it is a Javadoc like report.
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: PHPUnit2ReportTask.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.phpunit2
+ * @since 2.1.0
+ */
+class PHPUnit2ReportTask extends Task
+{
+	private $format = "noframes";
+	private $styleDir = "";
+	private $toDir = "";
+
+	/** the directory where the results XML can be found */
+	private $inFile = "testsuites.xml";
+
+	/**
+	 * Set the filename of the XML results file to use.
+	 */
+	function setInFile($inFile)
+	{
+		$this->inFile = $inFile;
+	}
+
+	/**
+	 * Set the format of the generated report. Must be noframes or frames.
+	 */
+	function setFormat($format)
+	{
+		$this->format = $format;
+	}
+
+	/**
+	 * Set the directory where the stylesheets are located.
+	 */
+	function setStyleDir($styleDir)
+	{
+		$this->styleDir = $styleDir;
+	}
+
+	/**
+	 * Set the directory where the files resulting from the 
+	 * transformation should be written to.
+	 */
+	function setToDir($toDir)
+	{
+		$this->toDir = $toDir;
+	}
+	
+	/**
+	 * Returns the path to the XSL stylesheet
+	 */
+	private function getStyleSheet()
+	{
+		$xslname = "phpunit2-" . $this->format . ".xsl";
+
+		if ($this->styleDir)
+		{
+			$file = new PhingFile($this->styleDir, $xslname);
+		}
+		else
+		{
+			$path = Phing::getResourcePath("phing/etc/$xslname");
+			
+			if ($path === NULL)
+			{
+				$path = Phing::getResourcePath("etc/$xslname");
+
+				if ($path === NULL)
+				{
+					throw new BuildException("Could not find $xslname in resource path");
+				}
+			}
+			
+			$file = new PhingFile($path);
+		}
+
+		if (!$file->exists())
+		{
+			throw new BuildException("Could not find file " . $file->getPath());
+		}
+
+		return $file;
+	}
+	
+	/**
+	 * Transforms the DOM document
+	 */
+	private function transform(DOMDocument $document)
+	{
+		$dir = new PhingFile($this->toDir);
+		
+		if (!$dir->exists())
+		{
+			throw new BuildException("Directory '" . $this->toDir . "' does not exist");
+		}
+		
+		$xslfile = $this->getStyleSheet();
+
+		$xsl = new DOMDocument();
+		$xsl->load($xslfile->getAbsolutePath());
+
+		$proc = new XSLTProcessor();
+		$proc->importStyleSheet($xsl);
+
+		if ($this->format == "noframes")
+		{
+			$writer = new FileWriter(new PhingFile($this->toDir, "phpunit2-noframes.html"));
+			$writer->write($proc->transformToXML($document));
+			$writer->close();
+		}
+		else
+		{
+			ExtendedFileStream::registerStream();
+
+			// no output for the framed report
+			// it's all done by extension...
+			$dir = new PhingFile($this->toDir);
+			$proc->setParameter('', 'output.dir', $dir->getAbsolutePath());
+			$proc->transformToXML($document);
+		}
+	}
+	
+	/**
+	 * Fixes 'testsuite' elements with no package attribute, adds
+	 * package="default" to those elements.
+	 */
+	private function fixPackages(DOMDocument $document)
+	{
+		$testsuites = $document->getElementsByTagName('testsuite');
+		
+		foreach ($testsuites as $testsuite)
+		{
+			if (!$testsuite->hasAttribute('package'))
+			{
+				$testsuite->setAttribute('package', 'default');
+			}
+		}
+	}
+
+	/**
+	 * The main entry point
+	 *
+	 * @throws BuildException
+	 */
+	public function main()
+	{
+		$testSuitesDoc = new DOMDocument();
+		$testSuitesDoc->load($this->inFile);
+		
+		$this->fixPackages($testSuitesDoc);
+		
+		$this->transform($testSuitesDoc);
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2ReportTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2ResultFormatter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2ResultFormatter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2ResultFormatter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,158 @@
+<?php
+/**
+ * $Id: PHPUnit2ResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'PHPUnit2/Framework/TestListener.php';
+
+require_once 'phing/system/io/Writer.php';
+
+/**
+ * This abstract class describes classes that format the results of a PHPUnit2 testrun.
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: PHPUnit2ResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.phpunit2
+ * @since 2.1.0
+ */
+abstract class PHPUnit2ResultFormatter implements PHPUnit2_Framework_TestListener
+{
+	protected $out = NULL;
+	
+	protected $project = NULL;
+	
+	private $timer = NULL;
+
+	private $runCount = 0;
+	
+	private $failureCount = 0;
+	
+	private $errorCount = 0;	
+	
+	/**
+	 * Sets the writer the formatter is supposed to write its results to.
+   	 */
+	function setOutput(Writer $out)
+	{
+		$this->out = $out;	
+	}
+
+	/**
+	 * Returns the extension used for this formatter
+	 *
+	 * @return string the extension
+	 */
+	function getExtension()
+	{
+		return "";
+	}
+
+	/**
+	 * Sets the project
+	 *
+	 * @param Project the project
+	 */
+	function setProject(Project $project)
+	{
+		$this->project = $project;
+	}
+	
+	function getPreferredOutfile()
+	{
+		return "";
+	}
+	
+	function startTestRun()
+	{
+	}
+	
+	function endTestRun()
+	{
+	}
+	
+	function startTestSuite(PHPUnit2_Framework_TestSuite $suite)
+	{
+		$this->runCount = 0;
+		$this->failureCount = 0;
+		$this->errorCount = 0;
+		
+		$this->timer = new Timer();
+		$this->timer->start();
+	}
+	
+	function endTestSuite(PHPUnit2_Framework_TestSuite $suite)
+	{
+		$this->timer->stop();
+	}
+
+	function startTest(PHPUnit2_Framework_Test $test)
+	{
+		$this->runCount++;
+	}
+
+	function endTest(PHPUnit2_Framework_Test $test)
+	{
+	}
+
+	function addError(PHPUnit2_Framework_Test $test, Exception $e)
+	{
+		$this->errorCount++;
+	}
+
+	function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $t)
+	{
+		$this->failureCount++;
+	}
+
+	function addIncompleteTest(PHPUnit2_Framework_Test $test, Exception $e)
+	{
+	}
+
+	function addSkippedTest(PHPUnit2_Framework_Test $test, Exception $e)
+	{
+	}
+	
+	function getRunCount()
+	{
+		return $this->runCount;
+	}
+	
+	function getFailureCount()
+	{
+		return $this->failureCount;
+	}
+	
+	function getErrorCount()
+	{
+		return $this->errorCount;
+	}
+	
+	function getElapsedTime()
+	{
+		if ($this->timer)
+		{
+			return $this->timer->getElapsedTime();
+		}
+		else
+		{
+			return 0;
+		}
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2ResultFormatter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2Task.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2Task.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2Task.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,239 @@
+<?php
+/**
+ * $Id: PHPUnit2Task.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+require_once 'phing/system/io/PhingFile.php';
+require_once 'phing/system/io/Writer.php';
+require_once 'phing/util/LogWriter.php';
+
+/**
+ * Runs PHPUnit2 tests.
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: PHPUnit2Task.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.phpunit2
+ * @see BatchTest
+ * @since 2.1.0
+ */
+class PHPUnit2Task extends Task
+{
+	private $batchtests = array();
+	private $formatters = array();
+	private $haltonerror = false;
+	private $haltonfailure = false;
+	private $failureproperty;
+	private $errorproperty;
+	private $printsummary = false;
+	private $testfailed = false;
+	private $codecoverage = false;
+
+	/**
+	 * Initialize Task.
+ 	 * This method includes any necessary PHPUnit2 libraries and triggers
+	 * appropriate error if they cannot be found.  This is not done in header
+	 * because we may want this class to be loaded w/o triggering an error.
+	 */
+	function init() {
+		include_once 'PHPUnit2/Util/Filter.php';
+		if (!class_exists('PHPUnit2_Util_Filter')) {
+			throw new BuildException("PHPUnit2Task depends on PEAR PHPUnit2 package being installed.", $this->getLocation());
+		}
+		
+		if (version_compare(PHP_VERSION, '5.0.3') < 0) {
+		    throw new BuildException("PHPUnit2Task requires PHP version >= 5.0.3.", $this->getLocation());
+		}
+
+		// other dependencies that should only be loaded when class is actually used.
+		require_once 'phing/tasks/ext/phpunit2/PHPUnit2TestRunner.php';
+		require_once 'phing/tasks/ext/phpunit2/BatchTest.php';
+		require_once 'phing/tasks/ext/phpunit2/FormatterElement.php';
+		require_once 'phing/tasks/ext/phpunit2/SummaryPHPUnit2ResultFormatter.php';
+
+		// add some defaults to the PHPUnit2 Filter
+		PHPUnit2_Util_Filter::addFileToFilter('PHPUnit2Task.php');
+		PHPUnit2_Util_Filter::addFileToFilter('PHPUnit2TestRunner.php');
+		PHPUnit2_Util_Filter::addFileToFilter('phing/Task.php');
+		PHPUnit2_Util_Filter::addFileToFilter('phing/Target.php');
+		PHPUnit2_Util_Filter::addFileToFilter('phing/Project.php');
+		PHPUnit2_Util_Filter::addFileToFilter('phing/Phing.php');
+		PHPUnit2_Util_Filter::addFileToFilter('phing.php');
+
+	}
+	
+	function setFailureproperty($value)
+	{
+		$this->failureproperty = $value;
+	}
+	
+	function setErrorproperty($value)
+	{
+		$this->errorproperty = $value;
+	}
+	
+	function setHaltonerror($value)
+	{
+		$this->haltonerror = $value;
+	}
+
+	function setHaltonfailure($value)
+	{
+		$this->haltonfailure = $value;
+	}
+
+	function setPrintsummary($printsummary)
+	{
+		$this->printsummary = $printsummary;
+	}
+	
+	function setCodecoverage($codecoverage)
+	{
+		$this->codecoverage = $codecoverage;
+	}
+
+	/**
+	 * Add a new formatter to all tests of this task.
+	 *
+	 * @param FormatterElement formatter element
+	 */
+	function addFormatter(FormatterElement $fe)
+	{
+		$this->formatters[] = $fe;
+	}
+
+	/**
+	 * The main entry point
+	 *
+	 * @throws BuildException
+	 */
+	function main()
+	{
+		$tests = array();
+		
+		if ($this->printsummary)
+		{
+			$fe = new FormatterElement();
+			$fe->setClassName('SummaryPHPUnit2ResultFormatter');
+			$fe->setUseFile(false);
+			$this->formatters[] = $fe;
+		}
+		
+		foreach ($this->batchtests as $batchtest)
+		{
+			$tests = array_merge($tests, $batchtest->elements());
+		}			
+		
+		foreach ($this->formatters as $fe)
+		{
+			$formatter = $fe->getFormatter();			
+			$formatter->setProject($this->getProject());
+
+			if ($fe->getUseFile())
+			{
+				$destFile = new PhingFile($fe->getToDir(), $fe->getOutfile());
+				
+				$writer = new FileWriter($destFile->getAbsolutePath());
+
+				$formatter->setOutput($writer);
+			}
+			else
+			{
+				$formatter->setOutput($this->getDefaultOutput());
+			}
+
+			$formatter->startTestRun();
+		}
+		
+		foreach ($tests as $test)
+		{
+			$this->execute(new PHPUnit2_Framework_TestSuite(new ReflectionClass($test)));
+		}
+
+		foreach ($this->formatters as $fe)
+		{
+			$formatter = $fe->getFormatter();
+			$formatter->endTestRun();
+		}
+		
+		if ($this->testfailed)
+		{
+			throw new BuildException("One or more tests failed");
+		}
+	}
+
+	/**
+	 * @throws BuildException
+	 */
+	private function execute($suite)
+	{
+		$runner = new PHPUnit2TestRunner($suite, $this->project);
+		
+		$runner->setCodecoverage($this->codecoverage);
+
+		foreach ($this->formatters as $fe)
+		{
+			$formatter = $fe->getFormatter();
+
+			$runner->addFormatter($formatter);
+		}
+
+		$runner->run();
+
+		$retcode = $runner->getRetCode();
+		
+		if ($retcode == PHPUnit2TestRunner::ERRORS) {
+		    if ($this->errorproperty) {
+				$this->project->setNewProperty($this->errorproperty, true);
+			}
+			if ($this->haltonerror) {
+			    $this->testfailed = true;
+			}
+		} elseif ($retcode == PHPUnit2TestRunner::FAILURES) {
+			if ($this->failureproperty) {
+				$this->project->setNewProperty($this->failureproperty, true);
+			}
+			
+			if ($this->haltonfailure) {
+				$this->testfailed = true;
+			}
+		}
+		
+	}
+
+	private function getDefaultOutput()
+	{
+		return new LogWriter($this);
+	}
+
+	/**
+	 * Adds a set of tests based on pattern matching.
+	 *
+	 * @return BatchTest a new instance of a batch test.
+	 */
+	function createBatchTest()
+	{
+		$batchtest = new BatchTest($this->getProject());
+
+		$this->batchtests[] = $batchtest;
+
+		return $batchtest;
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2Task.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2TestRunner.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2TestRunner.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2TestRunner.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,107 @@
+<?php
+/**
+ * $Id: PHPUnit2TestRunner.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'PHPUnit2/Framework/TestListener.php';
+require_once 'PHPUnit2/Framework/TestResult.php';
+require_once 'PHPUnit2/Framework/TestSuite.php';
+
+require_once 'phing/tasks/ext/coverage/CoverageMerger.php';
+
+require_once 'phing/system/util/Timer.php';
+
+/**
+ * Simple Testrunner for PHPUnit2 that runs all tests of a testsuite.
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: PHPUnit2TestRunner.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.phpunit2
+ * @since 2.1.0
+ */
+class PHPUnit2TestRunner
+{
+	const SUCCESS = 0;
+	const FAILURES = 1;
+	const ERRORS = 2;
+
+	private $test = NULL;
+	private $suite = NULL;
+	private $retCode = 0;
+	private $formatters = array();
+	
+	private $codecoverage = false;
+	
+	private $project = NULL;
+
+	function __construct(PHPUnit2_Framework_TestSuite $suite, Project $project)
+	{
+		$this->suite = $suite;
+		$this->project = $project;
+		$this->retCode = self::SUCCESS;
+	}
+	
+	function setCodecoverage($codecoverage)
+	{
+		$this->codecoverage = $codecoverage;
+	}
+
+	function addFormatter(PHPUnit2_Framework_TestListener $formatter)
+	{
+		$this->formatters[] = $formatter;
+	}
+
+	function run()
+	{
+		$res = new PHPUnit2_Framework_TestResult();
+
+		if ($this->codecoverage)
+		{
+			$res->collectCodeCoverageInformation(TRUE);
+		}
+
+		foreach ($this->formatters as $formatter)
+		{
+			$res->addListener($formatter);
+		}
+
+		$this->suite->run($res);
+		
+		if ($this->codecoverage)
+		{
+			CoverageMerger::merge($this->project, $res->getCodeCoverageInformation());
+		}
+		
+		if ($res->errorCount() != 0)
+		{
+			$this->retCode = self::ERRORS;
+		}
+
+		else if ($res->failureCount() != 0 || $res->notImplementedCount() != 0)
+		{
+			$this->retCode = self::FAILURES;
+		}
+	}
+
+	function getRetCode()
+	{
+		return $this->retCode;
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2TestRunner.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2Util.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2Util.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2Util.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,121 @@
+<?php
+/**
+ * $Id: PHPUnit2Util.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ * Various utility functions
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: PHPUnit2Util.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.phpunit2
+ * @since 2.1.0
+ */
+class PHPUnit2Util
+{
+	protected static $definedClasses = array();
+	
+	/**
+	 * Returns the package of a class as defined in the docblock of the class using @package
+	 *
+	 * @param string the name of the class
+	 * @return string the name of the package
+	 */
+	static function getPackageName($classname)
+	{
+		$reflect = new ReflectionClass($classname);
+
+		if (preg_match('/@package[\s]+([\.\w]+)/', $reflect->getDocComment(), $matches))
+		{
+			return $matches[1];
+		}
+		else
+		{
+			return "default";
+		}
+	}
+	
+	/**
+	 * Derives the classname from a filename.
+	 * Assumes that there is only one class defined in that particular file, and that
+	 * the naming follows the dot-path (Java) notation scheme.
+	 *
+	 * @param string the filename
+	 * @return string the name fo the class
+	 */
+	static function getClassFromFileName($filename)
+	{
+		$filename = basename($filename);
+		
+		$rpos = strrpos($filename, '.');
+		
+		if ($rpos != -1)
+		{
+			$filename = substr($filename, 0, $rpos);
+		}
+		
+		return $filename;
+	}
+
+	/**
+	 * @param string the filename
+	 * @param Path optional classpath
+	 * @return array list of classes defined in the file
+	 */
+	static function getDefinedClasses($filename, $classpath = NULL)
+	{
+		$filename = realpath($filename);
+		
+		if (!file_exists($filename))
+		{
+			throw new Exception("File '" . $filename . "' does not exist");
+		}
+		
+		if (isset(self::$definedClasses[$filename]))
+		{
+			return self::$definedClasses[$filename];
+		}
+		
+		Phing::__import($filename, $classpath);
+
+		$declaredClasses = get_declared_classes();
+		
+		foreach ($declaredClasses as $classname)
+		{
+			$reflect = new ReflectionClass($classname);
+			
+			self::$definedClasses[$reflect->getFilename()][] = $classname;
+			
+			if (is_array(self::$definedClasses[$reflect->getFilename()]))
+			{			
+				self::$definedClasses[$reflect->getFilename()] = array_unique(self::$definedClasses[$reflect->getFilename()]);
+			}
+		}
+		
+		if (isset(self::$definedClasses[$filename]))
+		{
+			return self::$definedClasses[$filename];
+		}
+		else
+		{
+			return array();
+		}
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PHPUnit2Util.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PlainPHPUnit2ResultFormatter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PlainPHPUnit2ResultFormatter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PlainPHPUnit2ResultFormatter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,117 @@
+<?php
+/**
+ * $Id: PlainPHPUnit2ResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'PHPUnit2/Framework/Test.php';
+require_once 'PHPUnit2/Util/Filter.php';
+
+require_once 'phing/tasks/ext/phpunit2/PHPUnit2ResultFormatter.php';
+
+/**
+ * Prints plain text output of the test to a specified Writer.
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: PlainPHPUnit2ResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.phpunit2
+ * @since 2.1.0
+ */
+class PlainPHPUnit2ResultFormatter extends PHPUnit2ResultFormatter
+{
+	private $inner = "";
+	
+	function getExtension()
+	{
+		return ".txt";
+	}
+	
+	function getPreferredOutfile()
+	{
+		return "testresults";
+	}
+
+	function startTestSuite(PHPUnit2_Framework_TestSuite $suite)
+	{
+		parent::startTestSuite($suite);
+		
+		$this->inner = "";
+	}
+	
+	function endTestSuite(PHPUnit2_Framework_TestSuite $suite)
+	{
+		parent::endTestSuite($suite);
+		
+		$sb = "Testsuite: " . $suite->getName() . "\n";
+		$sb.= "Tests run: " . $this->getRunCount();
+		$sb.= ", Failures: " . $this->getFailureCount();
+		$sb.= ", Errors: " . $this->getErrorCount();
+		$sb.= ", Time elapsed: " . $this->getElapsedTime();
+		$sb.= " sec\n";
+
+		if ($this->out != NULL)
+		{
+			$this->out->write($sb);
+			$this->out->write($this->inner);
+		}
+	}
+
+	function addError(PHPUnit2_Framework_Test $test, Exception $e)
+	{
+		parent::addError($test, $e);
+		
+		$this->formatError("ERROR", $test, $e);
+	}
+
+	function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $t)
+	{
+		parent::addFailure($test, $t);
+		
+		$this->formatError("FAILED", $test, $t);
+	}
+
+	function addIncompleteTest(PHPUnit2_Framework_Test $test, Exception $e)
+	{
+		parent::addIncompleteTest($test, $e);
+		
+		$this->formatError("INCOMPLETE", $test, $e);
+	}
+
+	private function formatError($type, PHPUnit2_Framework_Test $test, Exception $e)
+	{
+		if ($test != null)
+		{
+			$this->endTest($test);
+		}
+
+		$this->inner.= $test->getName() . " " . $type . "\n";
+		$this->inner.= $e->getMessage() . "\n";
+		$this->inner.= PHPUnit2_Util_Filter::getFilteredStackTrace($e) . "\n";
+	}
+	
+	function endTestRun()
+	{
+		parent::endTestRun();
+		
+		if ($this->out != NULL)
+		{
+			$this->out->close();
+		}
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/PlainPHPUnit2ResultFormatter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/SummaryPHPUnit2ResultFormatter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/SummaryPHPUnit2ResultFormatter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/SummaryPHPUnit2ResultFormatter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,58 @@
+<?php
+/**
+ * $Id: SummaryPHPUnit2ResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'PHPUnit2/Framework/Test.php';
+
+require_once 'phing/tasks/ext/phpunit2/PHPUnit2ResultFormatter.php';
+
+/**
+ * Prints short summary output of the test to Phing's logging system.
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: SummaryPHPUnit2ResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.phpunit2
+ * @since 2.1.0
+ */	
+class SummaryPHPUnit2ResultFormatter extends PHPUnit2ResultFormatter
+{
+	function endTestSuite(PHPUnit2_Framework_TestSuite $suite)
+	{
+		parent::endTestSuite($suite);
+		
+		$sb = "Tests run: " . $this->getRunCount();
+		$sb.= ", Failures: " . $this->getFailureCount();
+		$sb.= ", Errors: " . $this->getErrorCount();
+		$sb.= ", Time elapsed: " . $this->getElapsedTime();
+		$sb.= " sec\n";
+		
+		if ($this->out != NULL)
+		{
+			$this->out->write($sb);
+			$this->out->close();
+		}
+	}
+	
+	function getExtension()
+	{
+		return NULL;
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/SummaryPHPUnit2ResultFormatter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/XMLPHPUnit2ResultFormatter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/XMLPHPUnit2ResultFormatter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/XMLPHPUnit2ResultFormatter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,117 @@
+<?php
+/**
+ * $Id: XMLPHPUnit2ResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'PHPUnit2/Framework/Test.php';
+require_once 'PHPUnit2/Runner/Version.php';
+
+require_once 'PHPUnit2/Util/Log/XML.php';
+
+require_once 'phing/tasks/ext/phpunit2/PHPUnit2ResultFormatter.php';
+
+/**
+ * Prints XML output of the test to a specified Writer
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: XMLPHPUnit2ResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.phpunit2
+ * @since 2.1.0
+ */
+class XMLPHPUnit2ResultFormatter extends PHPUnit2ResultFormatter
+{
+	private $logger = NULL;
+	
+	function __construct()
+	{
+		$this->logger = new PHPUnit2_Util_Log_XML();
+		$this->logger->setWriteDocument(false);
+	}
+	
+	function getExtension()
+	{
+		return ".xml";
+	}
+	
+	function getPreferredOutfile()
+	{
+		return "testsuites";
+	}
+	
+	function startTestSuite(PHPUnit2_Framework_TestSuite $suite)
+	{
+		parent::startTestSuite($suite);
+		
+		$this->logger->startTestSuite($suite);
+	}
+	
+	function endTestSuite(PHPUnit2_Framework_TestSuite $suite)
+	{
+		parent::endTestSuite($suite);
+		
+		$this->logger->endTestSuite($suite);
+	}
+	
+	function startTest(PHPUnit2_Framework_Test $test)
+	{
+		parent::startTest($test);
+		
+		$this->logger->startTest($test);
+	}
+
+	function endTest(PHPUnit2_Framework_Test $test)
+	{
+		parent::endTest($test);
+		
+		$this->logger->endTest($test);
+	}
+	
+	function addError(PHPUnit2_Framework_Test $test, Exception $e)
+	{
+		parent::addError($test, $e);
+		
+		$this->logger->addError($test, $e);
+	}
+
+	function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $t)
+	{
+		parent::addFailure($test, $t);
+		
+		$this->logger->addFailure($test, $t);
+	}
+
+	function addIncompleteTest(PHPUnit2_Framework_Test $test, Exception $e)
+	{
+		parent::addIncompleteTest($test, $e);
+		
+		$this->logger->addIncompleteTest($test, $e);
+	}
+	
+	function endTestRun()
+	{
+		parent::endTestRun();
+		
+		if ($this->out)
+		{
+			$this->out->write($this->logger->getXML());
+			$this->out->close();
+		}
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/phpunit2/XMLPHPUnit2ResultFormatter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestCountResultFormatter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestCountResultFormatter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestCountResultFormatter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,52 @@
+<?php
+/**
+ * $Id: SimpleTestCountResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/ext/simpletest/SimpleTestResultFormatter.php';
+
+/**
+ * Dummy result formatter used to count SimpleTest results
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: SimpleTestCountResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.simpletest
+ * @since 2.2.0
+ */
+class SimpleTestCountResultFormatter extends SimpleTestResultFormatter
+{
+	const SUCCESS = 0;
+	const FAILURES = 1;
+	const ERRORS = 2;
+	
+	function getRetCode()
+	{
+		if ($this->getExceptionCount() != 0)
+		{
+			return self::ERRORS;
+		}
+		else if ($this->getFailCount() != 0)
+		{
+			return self::FAILURES;
+		}
+		
+		return self::SUCCESS;
+	}	
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestCountResultFormatter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestFormatterElement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestFormatterElement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestFormatterElement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,62 @@
+<?php
+/**
+ * $Id: SimpleTestFormatterElement.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/ext/simpletest/SimpleTestPlainResultFormatter.php';
+require_once 'phing/tasks/ext/simpletest/SimpleTestSummaryResultFormatter.php';
+require_once 'phing/tasks/ext/phpunit2/FormatterElement.php';
+
+/**
+ * Child class of "FormatterElement", overrides setType to provide other
+ * formatter classes for SimpleTest
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: SimpleTestFormatterElement.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.simpletest
+ * @since 2.2.0
+ */
+class SimpleTestFormatterElement extends FormatterElement
+{
+	function setType($type)
+	{
+		$this->type = $type;
+
+		if ($this->type == "xml")
+		{
+			$destFile = new PhingFile($this->toDir, 'testsuites.xml');
+			//$this->formatter = new SimpleTestXmlResultFormatter();
+		}
+		else
+		if ($this->type == "plain")
+		{
+			$this->formatter = new SimpleTestPlainResultFormatter();
+		}
+		else
+		if ($this->type == "summary")
+		{
+			$this->formatter = new SimpleTestSummaryResultFormatter();
+		}
+		else
+		{
+			throw new BuildException("Formatter '" . $this->type . "' not implemented");
+		}
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestFormatterElement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestPlainResultFormatter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestPlainResultFormatter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestPlainResultFormatter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,95 @@
+<?php
+/**
+ * $Id: SimpleTestPlainResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/ext/simpletest/SimpleTestResultFormatter.php';
+
+/**
+ * Prints plain text output of the test to a specified Writer.
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: SimpleTestPlainResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.simpletest
+ * @since 2.2.0
+ */
+class SimpleTestPlainResultFormatter extends SimpleTestResultFormatter
+{
+	private $inner = "";
+	
+	function getExtension()
+	{
+		return ".txt";
+	}
+	
+	function getPreferredOutfile()
+	{
+		return "testresults";
+	}
+
+	function paintCaseStart($test_name)
+	{
+		parent::paintCaseStart($test_name);
+		
+		$this->inner = "";
+	}
+	
+	function paintCaseEnd($test_name)
+	{
+		parent::paintCaseEnd($test_name);
+		
+		/* Only count suites where more than one test was run */
+		if ($this->getRunCount())
+		{
+			$sb.= "Testsuite: $test_name\n";
+			$sb.= "Tests run: " . $this->getRunCount();
+			$sb.= ", Failures: " . $this->getFailureCount();
+			$sb.= ", Errors: " . $this->getErrorCount();
+			$sb.= ", Time elapsed: " . $this->getElapsedTime();
+			$sb.= " sec\n";
+
+			if ($this->out != NULL)
+			{
+				$this->out->write($sb);
+				$this->out->write($this->inner);
+			}
+		}
+	}
+
+	function paintError($message)
+	{
+		parent::paintError($message);
+		
+		$this->formatError("ERROR", $message);
+	}
+
+	function paintFail($message)
+	{
+		parent::paintFail($message);
+		
+		$this->formatError("FAILED", $message);
+	}
+
+	private function formatError($type, $message)
+	{
+		$this->inner.= $this->getTestName() . " " . $type . "\n";
+		$this->inner.= $message . "\n";	
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestPlainResultFormatter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestResultFormatter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestResultFormatter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestResultFormatter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,162 @@
+<?php
+/**
+ * $Id: SimpleTestResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'simpletest/scorer.php';
+
+require_once 'phing/system/io/Writer.php';
+
+/**
+ * This abstract class describes classes that format the results of a SimpleTest testrun.
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: SimpleTestResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.phpunit2
+ * @since 2.2.0
+ */
+abstract class SimpleTestResultFormatter extends SimpleReporter
+{
+	protected $out = NULL;
+	
+	protected $project = NULL;
+	
+	private $timer = NULL;
+
+	private $runCount = 0;
+	
+	private $failureCount = 0;
+	
+	private $errorCount = 0;	
+
+	private $currentTest = "";
+	
+	/**
+	 * Sets the writer the formatter is supposed to write its results to.
+   	 */
+	function setOutput(Writer $out)
+	{
+		$this->out = $out;	
+	}
+
+	/**
+	 * Returns the extension used for this formatter
+	 *
+	 * @return string the extension
+	 */
+	function getExtension()
+	{
+		return "";
+	}
+
+	/**
+	 * Sets the project
+	 *
+	 * @param Project the project
+	 */
+	function setProject(Project $project)
+	{
+		$this->project = $project;
+	}
+	
+	function getPreferredOutfile()
+	{
+		return "";
+	}
+	
+	function paintMethodStart($test_name)
+	{
+		parent::paintMethodStart($test_name);
+		
+		$this->currentTest = $test_name;
+	}
+	
+	function paintMethodEnd($test_name)
+	{
+		parent::paintMethodEnd($test_name);
+		
+		$this->runCount++;
+	}
+	
+	function paintCaseStart($test_name)
+	{
+		parent::paintCaseStart($test_name);
+		
+		$this->runCount = 0;
+		$this->failureCount = 0;
+		$this->errorCount = 0;
+		
+		$this->timer = new Timer();
+		$this->timer->start();
+	}
+		
+	function paintCaseEnd($test_name)
+	{
+		parent::paintCaseEnd($test_name);
+		
+		$this->timer->stop();
+	}
+
+	function paintError($message)
+	{
+		parent::paintError($message);
+		
+		$this->errorCount++;
+	}
+
+	function paintFail($message)
+	{
+		parent::paintFail($message);
+		
+		$this->failureCount++;
+	}
+
+	function getRunCount()
+	{
+		return $this->runCount;
+	}
+	
+	function getFailureCount()
+	{
+		return $this->failureCount;
+	}
+	
+	function getErrorCount()
+	{
+		return $this->errorCount;
+	}
+	
+	function getTestName()
+	{
+		return $this->currentTest;
+	}
+	
+	function getElapsedTime()
+	{
+		if ($this->timer)
+		{
+			return $this->timer->getElapsedTime();
+		}
+		else
+		{
+			return 0;
+		}
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestResultFormatter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestSummaryResultFormatter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestSummaryResultFormatter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestSummaryResultFormatter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,54 @@
+<?php
+/**
+ * $Id: SimpleTestSummaryResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/ext/simpletest/SimpleTestResultFormatter.php';
+
+/**
+ * Prints short summary output of the test to Phing's logging system.
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: SimpleTestSummaryResultFormatter.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.simpletest
+ * @since 2.2.0
+ */
+class SimpleTestSummaryResultFormatter extends SimpleTestResultFormatter
+{
+	function paintCaseEnd($test_name)
+	{
+		parent::paintCaseEnd($test_name);
+		
+		/* Only count suites where more than one test was run */
+		if ($this->getRunCount())
+		{
+			$sb.= "Tests run: " . $this->getRunCount();
+			$sb.= ", Failures: " . $this->getFailureCount();
+			$sb.= ", Errors: " . $this->getErrorCount();
+			$sb.= ", Time elapsed: " . $this->getElapsedTime();
+			$sb.= " sec\n";
+
+			if ($this->out != NULL)
+			{
+				$this->out->write($sb);
+			}
+		}
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestSummaryResultFormatter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,238 @@
+<?php
+/**
+ * $Id: SimpleTestTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+require_once 'phing/system/io/PhingFile.php';
+require_once 'phing/system/io/Writer.php';
+require_once 'phing/util/LogWriter.php';
+
+/**
+ * Runs SimpleTest tests.
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: SimpleTestTask.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.simpletest
+ * @since 2.2.0
+ */
+class SimpleTestTask extends Task
+{
+	private $formatters = array();
+	private $haltonerror = false;
+	private $haltonfailure = false;
+	private $failureproperty;
+	private $errorproperty;
+	private $printsummary = false;
+	private $testfailed = false;
+
+	/**
+	 * Initialize Task.
+ 	 * This method includes any necessary SimpleTest libraries and triggers
+	 * appropriate error if they cannot be found.  This is not done in header
+	 * because we may want this class to be loaded w/o triggering an error.
+	 */
+	function init() {
+		@include_once 'simpletest/scorer.php';
+		
+		if (!class_exists('SimpleReporter')) {
+			throw new BuildException("SimpleTestTask depends on SimpleTest package being installed.", $this->getLocation());
+		}
+		
+		require_once 'simpletest/reporter.php';
+		require_once 'simpletest/xml.php';
+		require_once 'simpletest/test_case.php';
+		require_once 'phing/tasks/ext/simpletest/SimpleTestCountResultFormatter.php';
+		require_once 'phing/tasks/ext/simpletest/SimpleTestFormatterElement.php';
+	}
+	
+	function setFailureproperty($value)
+	{
+		$this->failureproperty = $value;
+	}
+	
+	function setErrorproperty($value)
+	{
+		$this->errorproperty = $value;
+	}
+	
+	function setHaltonerror($value)
+	{
+		$this->haltonerror = $value;
+	}
+
+	function setHaltonfailure($value)
+	{
+		$this->haltonfailure = $value;
+	}
+
+	function setPrintsummary($printsummary)
+	{
+		$this->printsummary = $printsummary;
+	}
+	
+	/**
+	 * Add a new formatter to all tests of this task.
+	 *
+	 * @param SimpleTestFormatterElement formatter element
+	 */
+	function addFormatter(SimpleTestFormatterElement $fe)
+	{
+		$this->formatters[] = $fe;
+	}
+
+	/**
+	 * Add a new fileset containing the XML results to aggregate
+	 *
+	 * @param FileSet the new fileset containing XML results.
+	 */
+	function addFileSet(FileSet $fileset)
+	{
+		$this->filesets[] = $fileset;
+	}
+
+	/**
+	 * Iterate over all filesets and return the filename of all files
+	 * that end with .php.
+	 *
+	 * @return array an array of filenames
+	 */
+	private function getFilenames()
+	{
+		$filenames = array();
+
+		foreach ($this->filesets as $fileset)
+		{
+			$ds = $fileset->getDirectoryScanner($this->project);
+			$ds->scan();
+
+			$files = $ds->getIncludedFiles();
+
+			foreach ($files as $file)
+			{
+				if (strstr($file, ".php"))
+				{
+					$filenames[] = $ds->getBaseDir() . "/" . $file;
+				}
+			}
+		}
+
+		return $filenames;
+	}
+
+	/**
+	 * The main entry point
+	 *
+	 * @throws BuildException
+	 */
+	function main()
+	{
+		$group = new GroupTest();
+		
+		$filenames = $this->getFilenames();
+		
+		foreach ($filenames as $testfile)
+		{
+			$group->addTestFile($testfile);
+		}
+		
+		if ($this->printsummary)
+		{
+			$fe = new SimpleTestFormatterElement();
+			$fe->setType('summary');
+			$fe->setUseFile(false);
+			$this->formatters[] = $fe;
+		}
+		
+		foreach ($this->formatters as $fe)
+		{
+			$formatter = $fe->getFormatter();
+			$formatter->setProject($this->getProject());
+
+			if ($fe->getUseFile())
+			{
+				$destFile = new PhingFile($fe->getToDir(), $fe->getOutfile());
+				
+				$writer = new FileWriter($destFile->getAbsolutePath());
+
+				$formatter->setOutput($writer);
+			}
+			else
+			{
+				$formatter->setOutput($this->getDefaultOutput());
+			}
+		}
+		
+		$this->execute($group);
+		
+		if ($this->testfailed)
+		{
+			throw new BuildException("One or more tests failed");
+		}
+	}
+	
+	private function execute($suite)
+	{
+		$counter = new SimpleTestCountResultFormatter();
+		$reporter = new MultipleReporter();
+		$reporter->attachReporter($counter);
+		
+		foreach ($this->formatters as $fe)
+		{
+			$formatter = $fe->getFormatter();
+
+			$reporter->attachReporter($formatter);
+		}		
+		
+		$suite->run($reporter);
+		
+		$retcode = $counter->getRetCode();
+		
+		if ($retcode == SimpleTestCountResultFormatter::ERRORS)
+		{
+		    if ($this->errorproperty)
+		    {
+				$this->project->setNewProperty($this->errorproperty, true);
+			}
+			
+			if ($this->haltonerror)
+			{
+			    $this->testfailed = true;
+			}
+		}
+		elseif ($retcode == SimpleTestCountResultFormatter::FAILURES)
+		{
+			if ($this->failureproperty)
+			{
+				$this->project->setNewProperty($this->failureproperty, true);
+			}
+			
+			if ($this->haltonfailure)
+			{
+				$this->testfailed = true;
+			}
+		}
+	}
+
+	private function getDefaultOutput()
+	{
+		return new LogWriter($this);
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/simpletest/SimpleTestTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/SvnBaseTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/SvnBaseTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/SvnBaseTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,180 @@
+<?php
+/*
+ *  $Id: SvnBaseTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+include_once 'phing/Task.php';
+
+/**
+ *  Send a message by mail() 
+ *
+ *  <mail to="user en example.org" subject="build complete">The build process is a success...</mail> 
+ * 
+ *  @author   Francois Harvey at SecuriWeb (http://www.securiweb.net)
+ *  @version  $Id: SvnBaseTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *  @package  phing.tasks.ext
+ */
+abstract class SvnBaseTask extends Task
+{
+	private $workingCopy = "";
+	
+	private $repositoryUrl = "";
+	
+	private $svnPath = "/usr/bin/svn";
+	
+	private $svn = NULL;
+	
+	private $mode = "";
+	
+	private $svnArgs = array();
+
+	/**
+	 * Initialize Task.
+ 	 * This method includes any necessary SVN libraries and triggers
+	 * appropriate error if they cannot be found.  This is not done in header
+	 * because we may want this class to be loaded w/o triggering an error.
+	 */
+	function init() {
+		include_once 'VersionControl/SVN.php';
+		if (!class_exists('VersionControl_SVN')) {
+			throw new Exception("SvnLastRevisionTask depends on PEAR VersionControl_SVN package being installed.");
+		}
+	}
+
+	/**
+	 * Sets the path to the workingcopy
+	 */
+	function setWorkingCopy($workingCopy)
+	{
+		$this->workingCopy = $workingCopy;
+	}
+
+	/**
+	 * Returns the path to the workingcopy
+	 */
+	function getWorkingCopy()
+	{
+		return $this->workingCopy;
+	}
+
+	/**
+	 * Sets the path/URI to the repository
+	 */
+	function setRepositoryUrl($repositoryUrl)
+	{
+		$this->repositoryUrl = $repositoryUrl;
+	}
+
+	/**
+	 * Returns the path/URI to the repository
+	 */
+	function getRepositoryUrl()
+	{
+		return $this->repositoryUrl;
+	}
+
+	/**
+	 * Sets the path to the SVN executable
+	 */
+	function setSvnPath($svnPath)
+	{
+		$this->svnPath = $svnPath;
+	}
+
+	/**
+	 * Returns the path to the SVN executable
+	 */
+	function getSvnPath()
+	{
+		return $this->svnPath;
+	}
+	
+	/**
+	 * Creates a VersionControl_SVN class based on $mode
+	 *
+	 * @param string The SVN mode to use (info, export, checkout, ...)
+	 * @throws BuildException
+	 */
+	protected function setup($mode)
+	{
+		$this->mode = $mode;
+		
+		// Set up runtime options. Will be passed to all
+		// subclasses.
+		$options = array('fetchmode' => VERSIONCONTROL_SVN_FETCHMODE_ASSOC, 'svn_path' => $this->getSvnPath());
+		
+		// Pass array of subcommands we need to factory
+		$this->svn = VersionControl_SVN::factory($mode, $options);
+
+		if (!empty($this->repositoryUrl))
+		{
+			$this->svnArgs = array($this->repositoryUrl);
+		}
+		else
+		if (!empty($this->workingCopy))
+		{
+			if (is_dir($this->workingCopy))
+			{
+				if (in_array(".svn", scandir($this->workingCopy)))
+				{
+					$this->svnArgs = array($this->workingCopy);
+				}
+				else
+				{
+					throw new BuildException("'".$this->workingCopy."' doesn't seem to be a working copy");
+				}
+			}
+			else
+			{
+				throw new BuildException("'".$this->workingCopy."' is not a directory");
+			}
+		}
+	}
+	
+	/**
+	 * Executes the constructed VersionControl_SVN instance
+	 *
+	 * @param array Additional arguments to pass to SVN.
+	 * @param array Switches to pass to SVN.
+	 * @return string Output generated by SVN.
+	 */
+	protected function run($args = array(), $switches = array())
+	{
+		$svnstack = PEAR_ErrorStack::singleton('VersionControl_SVN');
+		
+		$tempArgs = $this->svnArgs;
+		
+		$tempArgs = array_merge($tempArgs, $args);
+		
+		if ($output = $this->svn->run($tempArgs, $switches))
+		{
+			return $output;
+		}
+		else
+		{
+			if (count($errs = $svnstack->getErrors()))
+			{
+				$err = current($errs);
+
+				throw new BuildException("Failed to run the 'svn " . $this->mode . "' command: " . $err['message']);
+			}
+		}
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/SvnBaseTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/SvnExportTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/SvnExportTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/SvnExportTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,68 @@
+<?php
+/**
+ * $Id: SvnExportTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+require_once 'phing/tasks/ext/svn/SvnBaseTask.php';
+
+/**
+ * Exports/checks out a repository to a local directory
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: SvnExportTask.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.svn
+ * @see VersionControl_SVN
+ * @since 2.1.0
+ */
+class SvnExportTask extends SvnBaseTask
+{
+	private $toDir = "";
+
+	/**
+	 * Sets the path to export/checkout to
+	 */
+	function setToDir($toDir)
+	{
+		$this->toDir = $toDir;
+	}
+
+	/**
+	 * Returns the path to export/checkout to
+	 */
+	function getToDir()
+	{
+		return $this->toDir;
+	}
+
+	/**
+	 * The main entry point
+	 *
+	 * @throws BuildException
+	 */
+	function main()
+	{
+		$this->setup('export');
+		
+		$this->log("Exporting SVN repository to '" . $this->toDir . "'");
+		
+		$this->run(array($this->toDir));
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/SvnExportTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/SvnLastRevisionTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/SvnLastRevisionTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/SvnLastRevisionTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,75 @@
+<?php
+/**
+ * $Id: SvnLastRevisionTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+require_once 'phing/tasks/ext/svn/SvnBaseTask.php';
+
+/**
+ * Stores the number of the last revision of a workingcopy in a property
+ *
+ * @author Michiel Rook <michiel.rook en gmail.com>
+ * @version $Id: SvnLastRevisionTask.php 3076 2006-12-18 08:52:12Z fabien $
+ * @package phing.tasks.ext.svn
+ * @see VersionControl_SVN
+ * @since 2.1.0
+ */
+class SvnLastRevisionTask extends SvnBaseTask
+{
+	private $propertyName = "svn.lastrevision";
+
+	/**
+	 * Sets the name of the property to use
+	 */
+	function setPropertyName($propertyName)
+	{
+		$this->propertyName = $propertyName;
+	}
+
+	/**
+	 * Returns the name of the property to use
+	 */
+	function getPropertyName()
+	{
+		return $this->propertyName;
+	}
+
+	/**
+	 * The main entry point
+	 *
+	 * @throws BuildException
+	 */
+	function main()
+	{
+		$this->setup('info');
+		
+		$output = $this->run();
+		
+		if (preg_match('/Rev:[\s]+([\d]+)/', $output, $matches))
+		{
+			$this->project->setProperty($this->getPropertyName(), $matches[1]);
+		}
+		else
+		{
+			throw new BuildException("Failed to parse the output of 'svn info'.");
+		}
+	}
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/ext/svn/SvnLastRevisionTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AdhocTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AdhocTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AdhocTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,88 @@
+<?php
+/*
+ *  $Id: AdhocTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/Task.php';
+
+/**
+ * Abstract class for creating adhoc Phing components in buildfile.
+ *
+ * By itself this class can be used to declare a single class within your buildfile.
+ * You can then reference this class in any task that takes custom classes (selectors,
+ * mappers, filters, etc.)
+ * 
+ * Subclasses exist for conveniently declaring and registering tasks and types.
+ * 
+ * @author   Hans Lellelid <hans en xmpl.org>
+ * @version  $Revision: 1.6 $
+ * @package  phing.tasks.system
+ */
+class AdhocTask extends Task {
+            
+    /**
+     * The PHP script
+     * @var string
+     */
+    protected $script;
+    
+    protected $newClasses = array();
+    
+    /**
+     * Main entry point
+     */
+    public function main() {    
+        $this->execute();        
+        if ($this->newClasses) {
+            foreach($this->newClasses as $classname) {
+                $this->log("Added adhoc class " . $classname, PROJECT_MSG_VERBOSE);
+            }
+        } else {
+            $this->log("Adhoc task executed but did not result in any new classes.", PROJECT_MSG_VERBOSE);
+        }
+    }
+    
+    /**
+     * Get array of names of newly defined classes.
+     * @return array
+     */
+    protected function getNewClasses() {
+        return $this->newClasses;
+    }
+    
+    /**
+     * Load the adhoc class, and perform any core validation.
+     * @return string The classname of the ProjectComponent class.
+     * @throws BuildException - if more than one class is defined.
+     */
+    protected function execute() {
+        $classes = get_declared_classes();        
+        eval($this->script);        
+        $this->newClasses = array_diff(get_declared_classes(), $classes);        
+    }
+            
+    /**
+     * Set the script.
+     * @param string $script
+     */
+    public function addText($script) {
+        $this->script = $script;
+    }
+           
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AdhocTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AdhocTaskdefTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AdhocTaskdefTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AdhocTaskdefTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,90 @@
+<?php
+
+/*
+ * $Id: AdhocTaskdefTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/tasks/system/AdhocTask.php';
+
+/**
+ * A class for creating adhoc tasks in build file.
+ * 
+ * <target name="test-adhoc">
+ *        <adhoc-task name="foo"><![CDATA[
+ *
+ *            class FooTest extends Task {
+ *                private $bar;
+ *                
+ *                function setBar($bar) {
+ *                    $this->bar = $bar;
+ *                }
+ *                
+ *                function main() {
+ *                    $this->log("In FooTest: " . $this->bar);
+ *                }
+ *            }
+ *
+ *        ]]></adhoc-task>
+ * 
+ *      <foo bar="B.L.I.N.G"/>
+ * </target>
+ *  
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.5 $
+ * @package   phing.tasks.system
+ */
+class AdhocTaskdefTask extends AdhocTask {
+
+    /**
+     * The tag that refers to this task.
+     */
+    private $name;
+    
+    /**
+     * Set the tag that will represent this adhoc task/type.
+     * @param string $name
+     */       
+    public function setName($name) {
+        $this->name = $name;
+    }
+    
+    /** Main entry point */
+    public function main() {        
+        if ($this->name === null) {
+            throw new BuildException("The name attribute is required for adhoc task definition.",$this->location);
+        }
+        
+        $this->execute();
+        
+        $classes = $this->getNewClasses();
+        if (count($classes) !== 1) {
+            throw new BuildException("You must define one (and only one) class for AdhocTaskdefTask.");
+        }
+        $classname = array_shift($classes);
+        
+        // instantiate it to make sure it is an instance of Task
+        $t = new $classname();
+        if (!($t instanceof Task)) {
+            throw new BuildException("The adhoc class you defined must be an instance of phing.Task", $this->location);
+        }
+        
+        $this->log("Task " . $this->name . " will be handled by class " . $classname, PROJECT_MSG_VERBOSE);
+        $this->project->addTaskDefinition($this->name, $classname);        
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AdhocTaskdefTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AdhocTypedefTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AdhocTypedefTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AdhocTypedefTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,71 @@
+<?php
+
+/*
+ * $Id: AdhocTypedefTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/tasks/system/AdhocTask.php';
+
+/**
+ * A class for creating adhoc datatypes in build file.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.4 $
+ * @package   phing.tasks.system
+ */
+class AdhocTypedefTask extends AdhocTask {
+
+    /**
+     * The tag that refers to this task.
+     */
+    private $name;
+
+    /**
+     * Set the tag that will represent this adhoc task/type.
+     * @param string $name
+     */       
+    public function setName($name) {
+        $this->name = $name;
+    }
+        
+    /** Main entry point */
+    public function main() {
+    
+        if ($this->name === null) {
+            throw new BuildException("The name attribute is required for adhoc task definition.",$this->location);
+        }
+        
+        $this->execute();
+        
+        $classes = $this->getNewClasses();
+        if (count($classes) !== 1) {
+            throw new BuildException("You must define one (and only one) class for AdhocTypedefTask.");
+        }
+        $classname = array_shift($classes);
+        
+        // instantiate it to make sure it is an instance of ProjectComponent
+        $t = new $classname();
+        if (!($t instanceof ProjectComponent)) {
+            throw new BuildException("The adhoc class you defined must be an instance of phing.ProjectComponent", $this->location);
+        }
+        
+        $this->log("Datatype " . $this->name . " will be handled by class " . $classname, PROJECT_MSG_VERBOSE);
+        $this->project->addDataTypeDefinition($this->name, $classname);        
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AdhocTypedefTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AppendTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AppendTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AppendTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,240 @@
+<?php
+/*
+ *  $Id: AppendTask.php 3076 2006-12-18 08:52:12Z fabien $  
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+include_once 'phing/types/FileList.php';
+include_once 'phing/types/FileSet.php';
+
+/**
+ *  Appends text, contents of a file or set of files defined by a filelist to a destination file.
+ *
+ * <code>
+ * <append text="And another thing\n" destfile="badthings.log"/>
+ * </code>
+ * OR
+ * <code>
+ * <append file="header.html" destfile="fullpage.html"/>
+ * <append file="body.html" destfile="fullpage.html"/>
+ * <append file="footer.html" destfile="fullpage.html"/>
+ * </code>
+ * OR
+ * <code>
+ * <append destfile="${process.outputfile}">
+ *    <filterchain>
+ *        <xsltfilter style="${process.stylesheet}">
+ *            <param name="mode" expression="${process.xslt.mode}"/>
+ *            <param name="file_name" expression="%{task.append.current_file.basename}"/> <!-- Example of using a RegisterSlot variable -->
+ *        </xsltfilter>
+ *    </filterchain>
+ *     <filelist dir="book/" listfile="book/PhingGuide.book"/>            
+ * </append>
+ * </code>
+ * @package phing.tasks.system
+ * @version $Revision: 1.14 $
+ */
+class AppendTask extends Task {
+    
+    /** Append stuff to this file. */
+    private $to;
+    
+    /** Explicit file to append. */
+    private $file;
+    
+    /** Any filesets of files that should be appended. */
+    private $filesets = array();
+    
+    /** Any filelists of files that should be appended. */
+    private $filelists = array();
+    
+    /** Any filters to be applied before append happens. */
+    private $filterChains = array();
+    
+    /** Text to append. (cannot be used in conjunction w/ files or filesets) */
+    private $text;
+    
+    /** Sets specific file to append. */
+    function setFile(PhingFile $f) {        
+        $this->file = $f;
+    }
+    
+    /**
+     * Set target file to append to.
+     * @deprecated Will be removed with final release.
+     */
+    function setTo(PhingFile $f) {        
+        $this->log("The 'to' attribute is deprecated in favor of 'destFile'; please update your code.", PROJECT_MSG_WARN);
+        $this->to = $f;
+    }
+    
+    /**
+     * The more conventional naming for method to set destination file.
+     * @param PhingFile $f
+     */
+    function setDestFile(PhingFile $f) {        
+        $this->to = $f;
+    }
+    
+    /**
+     * Supports embedded <filelist> element.
+     * @return FileList
+     */
+    function createFileList() {
+        $num = array_push($this->filelists, new FileList());
+        return $this->filelists[$num-1];
+    }
+
+    /**
+     * Nested creator, adds a set of files (nested <fileset> attribute).
+     * This is for when you don't care what order files get appended.
+     * @return FileSet
+     */
+    function createFileSet() {
+        $num = array_push($this->filesets, new FileSet());
+        return $this->filesets[$num-1];
+    }
+    
+    /**
+     * Creates a filterchain
+     *
+     * @return FilterChain The created filterchain object
+     */
+    function createFilterChain() {
+        $num = array_push($this->filterChains, new FilterChain($this->project));
+        return $this->filterChains[$num-1];
+    }    
+    
+    /**
+     * Sets text to append.  (cannot be used in conjunction w/ files or filesets).
+     * @param string $txt
+     */
+    function setText($txt) {
+        $this->text = (string) $txt;
+    }
+
+    /**
+     * Sets text to append. Supports CDATA.
+     * @param string $txt
+     */
+    function addText($txt) {
+        $this->text = (string) $txt;
+    }
+
+    
+    /** Append the file(s). */
+    function main() {
+    
+        if ($this->to === null) {
+            throw new BuildException("You must specify the 'destFile' attribute");
+        }
+        
+        if ($this->file === null && empty($this->filelists) && empty($this->filesets) && $this->text === null) {
+            throw new BuildException("You must specify a file, use a filelist, or specify a text value.");
+        }
+        
+        if ($this->text !== null && ($this->file !== null || !empty($this->filelists))) {
+            throw new BuildException("Cannot use text attribute in conjunction with file or filelists.");
+        }
+        
+        // create a filwriter to append to "to" file.
+        $writer = new FileWriter($this->to, $append=true);
+        
+        if ($this->text !== null) {            
+            
+            // simply append the text
+            $this->log("Appending string to " . $this->to->getPath());
+            
+            // for debugging primarily, maybe comment
+            // out for better performance(?)
+            $lines = explode("\n", $this->text);
+            foreach($lines as $line) {
+                $this->log($line, PROJECT_MSG_VERBOSE);
+            }
+            
+            $writer->write($this->text);
+                        
+        } else {        
+            
+            // append explicitly-specified file
+            if ($this->file !== null) { 
+                try {
+                    $this->appendFile($writer, $this->file);
+                } catch (Exception $ioe) {
+                    $this->log("Unable to append contents of file " . $this->file->getAbsolutePath() . ": " . $ioe->getMessage(), PROJECT_MSG_WARN);
+                }                
+            }
+            
+            // append the files in the filelists
+            foreach($this->filelists as $fl) {
+                try {
+                    $files = $fl->getFiles($this->project);
+                    $this->appendFiles($writer, $files, $fl->getDir($this->project));
+                } catch (BuildException $be) {
+                    $this->log($be->getMessage(), PROJECT_MSG_WARN);
+                }
+            }
+            
+            // append any files in filesets
+            foreach($this->filesets as $fs) {
+                try {
+                    $files = $fs->getDirectoryScanner($this->project)->getIncludedFiles();
+                    $this->appendFiles($writer, $files, $fs->getDir($this->project));
+                } catch (BuildException $be) {
+                    $this->log($be->getMessage(), PROJECT_MSG_WARN);
+                }
+            }                        
+            
+        } // if ($text ) {} else {}
+        
+        $writer->close();
+    }
+    
+    /**
+     * Append an array of files in a directory.
+     * @param FileWriter $writer The FileWriter that is appending to target file.
+     * @param array $files array of files to delete; can be of zero length
+     * @param PhingFile $dir directory to work from
+     */
+    private function appendFiles(FileWriter $writer, $files, PhingFile $dir) {
+        if (!empty($files)) {
+            $this->log("Attempting to append " . count($files) . " files" .($dir !== null ? ", using basedir " . $dir->getPath(): ""));
+            $basenameSlot = Register::getSlot("task.append.current_file");
+            $pathSlot = Register::getSlot("task.append.current_file.path");
+            foreach($files as $filename) {
+                try {
+                    $f = new PhingFile($dir, $filename);
+                    $basenameSlot->setValue($filename);
+                    $pathSlot->setValue($f->getPath());
+                    $this->appendFile($writer, $f);
+                } catch (Exception $ioe) {
+                    $this->log("Unable to append contents of file " . $f->getAbsolutePath() . ": " . $ioe->getMessage(), PROJECT_MSG_WARN);
+                }
+            }
+        } // if !empty        
+    }
+    
+    private function appendFile(FileWriter $writer, PhingFile $f) {
+        $in = FileUtils::getChainedReader(new FileReader($f), $this->filterChains, $this->project);
+        while(-1 !== ($buffer = $in->read())) { // -1 indicates EOF
+            $writer->write($buffer);
+        }
+        $this->log("Appending contents of " . $f->getPath() . " to " . $this->to->getPath());    
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AppendTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AvailableTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AvailableTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AvailableTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,132 @@
+<?php
+/*
+ *  $Id: AvailableTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+include_once 'phing/tasks/system/condition/ConditionBase.php';
+
+/**
+ *  <available> task.
+ *
+ *  Note: implements condition interface (see condition/Condition.php)
+ *
+ *  @author    Andreas Aderhold <andi en binarycloud.com>
+ *  @copyright © 2001,2002 THYRELL. All rights reserved
+ *  @version   $Revision: 1.11 $
+ *  @package   phing.tasks.system
+ */
+class AvailableTask extends Task {
+
+    /** Property to check for. */
+    private $property;
+    
+    /** Value property should be set to. */
+    private $value = "true";
+    
+    /** Resource to check for */
+    private $resource;
+    
+    private $type = null;
+    private $filepath = null;
+
+    function setProperty($property) {
+        $this->property = (string) $property;
+    }
+
+    function setValue($value) {
+        $this->value = (string) $value;
+    }
+
+    function setFile(PhingFile $file) {
+        $this->file = $file;
+    }
+
+    function setResource($resource) {
+        $this->resource = (string) $resource;
+    }
+
+    function setType($type) {
+        $this->type = (string) strtolower($type);
+    }
+
+    function main() {
+        if ($this->property === null) {
+            throw new BuildException("property attribute is required", $this->location);
+        }
+        if ($this->evaluate()) {
+            $this->project->setProperty($this->property, $this->value);
+        }
+    }
+
+    function evaluate() {
+        if ($this->file === null && $this->resource === null) {
+            throw new BuildException("At least one of (file|resource) is required", $this->location);            
+        }
+
+        if ($this->type !== null && ($this->type !== "file" && $this->type !== "dir")) {
+            throw new BuildException("Type must be one of either dir or file", $this->location);
+        }
+        
+        if (($this->file !== null) && !$this->_checkFile()) {
+            $this->log("Unable to find " . $this->file->__toString() . " to set property " . $this->property, PROJECT_MSG_VERBOSE);
+            return false;
+        }
+
+        if (($this->resource !== null) && !$this->_checkResource($this->resource)) {
+            $this->log("Unable to load resource " . $this->resource . " to set property " . $this->property, PROJECT_MSG_VERBOSE);
+            return false;
+        }
+
+        return true;
+    }
+
+    // this is prepared for the path type
+    function _checkFile() {
+        if ($this->filepath === null) {
+            return $this->_checkFile1($this->file);
+        } else {
+            $paths = $this->filepath->listDir();
+            for($i=0,$pcnt=count($paths); $i < $pcnt; $i++) {
+                $this->log("Searching " . $paths[$i], PROJECT_MSG_VERBOSE);
+                $tmp = new PhingFile($paths[$i], $this->file->getName());
+                if($tmp->isFile()) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    function _checkFile1($file) {
+        if ($this->type !== null) {
+            if ($this->type === "dir") {
+                return $file->isDirectory();
+            } else if ($this->type === "file") {
+                return $file->isFile();
+            }
+        }
+        return $file->exists();
+    }
+
+    function _checkResource($resource) {
+        return $this->_checkFile1(new PhingFile(Phing::getResourcePath($resource)));
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/AvailableTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ChmodTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ChmodTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ChmodTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,177 @@
+<?php
+/*
+ *  $Id: ChmodTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+include_once 'phing/types/FileSet.php';
+
+/**
+ * Task that changes the permissions on a file/directory.
+ *
+ * @author    Manuel Holtgrewe <grin en gmx.net>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.12 $
+ * @package   phing.tasks.system
+ */
+class ChmodTask extends Task {
+
+    private $file;
+
+    private $mode;
+
+    private $filesets = array();
+
+    private $filesystem;
+	
+	private $quiet = false;	
+	private $failonerror = true;
+	
+	/**
+	 * This flag means 'note errors to the output, but keep going'
+	 * @see setQuiet()
+	 */
+    function setFailonerror($bool) {
+        $this->failonerror = $bool;
+    }	
+
+    /**
+     * Set quiet mode, which suppresses warnings if chmod() fails.
+	 * @see setFailonerror()
+     */
+    function setQuiet($bool) {
+        $this->quiet = $bool;
+        if ($this->quiet) {
+            $this->failonerror = false;
+        }
+    }
+	
+    /**
+     * Sets a single source file to touch.  If the file does not exist
+     * an empty file will be created.
+     */
+    function setFile(PhingFile $file) {        
+        $this->file = $file;
+    } 
+
+    function setMode($str) {
+        $this->mode = $str;
+    }
+
+    /**
+     * Nested creator, adds a set of files (nested fileset attribute).
+     */
+    function createFileSet() {
+        $num = array_push($this->filesets, new FileSet());
+        return $this->filesets[$num-1];
+    }
+
+    /**
+     * Execute the touch operation.
+     * @return void
+     */
+    function main() {
+        // Check Parameters
+        $this->checkParams();       
+        $this->chmod();
+    }
+    
+    /**
+     * Ensure that correct parameters were passed in.
+     * @return void
+     */
+    private function checkParams() {
+    
+        if ($this->file === null && empty($this->filesets)) {
+            throw new BuildException("Specify at least one source - a file or a fileset.");
+        }
+
+        if ($this->mode === null) {
+            throw new BuildException("You have to specify an octal mode for chmod.");
+        }
+
+        // check for mode to be in the correct format
+        if (!preg_match('/^([0-7]){3,4}$/', $this->mode)) {
+            throw new BuildException("You have specified an invalid mode.");
+        }
+     
+    }
+
+    /**
+     * Does the actual work.
+     * @return void
+     */
+    private function chmod() {
+    	
+		if (strlen($this->mode) === 4) {
+			$mode = octdec($this->mode);
+		} else {
+			// we need to prepend the 0 before converting
+			$mode = octdec("0". $this->mode);
+		}
+        
+        // one file
+        if ($this->file !== null) {
+            $this->chmodFile($this->file, $mode);
+        }
+
+        // filesets
+        foreach($this->filesets as $fs) {
+                    
+            $ds = $fs->getDirectoryScanner($this->project);
+            $fromDir = $fs->getDir($this->project);
+
+            $srcFiles = $ds->getIncludedFiles();
+            $srcDirs = $ds->getIncludedDirectories();
+
+            for ($j = 0, $filecount = count($srcFiles); $j < $filecount; $j++) {
+                $this->chmodFile(new PhingFile($fromDir, $srcFiles[$j]), $mode);
+            }
+
+            for ($j = 0, $dircount = count($srcDirs); $j <  $dircount; $j++) {
+                $this->chmodFile(new PhingFile($fromDir, $srcDirs[$j]), $mode);
+            }
+        }
+
+    }
+
+	/**
+	 * Actually change the mode for the file.
+	 * @param PhingFile $file
+	 * @param int $mode
+	 */
+    private function chmodFile(PhingFile $file, $mode) {
+        if ( !$file->exists() ) {
+            throw new BuildException("The file " . $file->__toString() . " does not exist");
+        }   
+		     
+		try {
+			$file->setMode($mode);
+			$this->log("Changed file mode on '" . $file->__toString() ."' to " . vsprintf("%o", $mode));
+		} catch (Exception $e) {
+			if($this->failonerror) {
+				throw $e;
+			} else {
+				$this->log($e->getMessage(), $this->quiet ? PROJECT_MSG_VERBOSE : PROJECT_MSG_WARN);
+			}
+		}
+    }
+	
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ChmodTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ConditionTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ConditionTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ConditionTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,74 @@
+<?php
+/*
+ *  $Id: ConditionTask.php 3076 2006-12-18 08:52:12Z fabien $  
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+require_once 'phing/tasks/system/condition/ConditionBase.php';
+
+/**
+ *  <condition> task as a generalization of <available>
+ *
+ *  <p>This task supports boolean logic as well as pluggable conditions
+ *  to decide, whether a property should be set.</p>
+ *
+ *  <p>This task does not extend Task to take advantage of
+ *  ConditionBase.</p>
+ *
+ *  @author    Andreas Aderhold <andi en binarycloud.com>
+ *  @copyright © 2001,2002 THYRELL. All rights reserved
+ *  @version   $Revision: 1.7 $ $Date$
+ *  @access    public
+ *  @package   phing.tasks.system
+ */
+class ConditionTask extends ConditionBase {
+
+    private $property;
+    private $value = "true";
+
+    /**
+     * The name of the property to set. Required.
+     */
+    function setProperty($p) {
+        $this->property = $p;
+    }
+
+    /**
+     * The value for the property to set. Defaults to "true".
+     */
+    function setValue($v) {
+        $this->value = $v;
+    }
+
+    /**
+     * See whether our nested condition holds and set the property.
+     */
+    function main() {
+
+        if ($this->countConditions() > 1) {
+            throw new BuildException("You must not nest more than one condition into <condition>");
+        }
+        if ($this->countConditions() < 1) {
+            throw new BuildException("You must nest a condition into <condition>");
+        }
+        $cs = $this->getIterator();        
+        if ($cs->current()->evaluate()) {
+            $this->project->setProperty($this->property, $this->value);
+        }
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ConditionTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/CopyTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/CopyTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/CopyTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,401 @@
+<?php
+/*
+ *  $Id: CopyTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/Task.php';
+include_once 'phing/system/io/PhingFile.php';
+include_once 'phing/util/FileUtils.php';
+include_once 'phing/util/SourceFileScanner.php';
+include_once 'phing/mappers/IdentityMapper.php';
+include_once 'phing/mappers/FlattenMapper.php';
+
+/**
+ * A phing copy task.  Copies a file or directory to a new file
+ * or directory.  Files are only copied if the source file is newer
+ * than the destination file, or when the destination file does not
+ * exist. It is possible to explictly overwrite existing files.
+ *
+ * @author   Andreas Aderhold, andi en binarycloud.com
+ * @version  $Revision: 1.16 $ $Date$
+ * @package  phing.tasks.system
+ */
+class CopyTask extends Task {
+    
+    protected $file          = null;   // the source file (from xml attribute)
+    protected $destFile      = null;   // the destiantion file (from xml attribute)
+    protected $destDir       = null;   // the destination dir (from xml attribute)
+    protected $overwrite     = false;  // overwrite destination (from xml attribute)
+    protected $preserveLMT   = true;   // sync timestamps (from xml attribute)
+    protected $includeEmpty  = true;   // include empty dirs? (from XML)
+    protected $flatten       = false;  // apply the FlattenMapper right way (from XML)
+    protected $mapperElement = null;
+
+    protected $fileCopyMap   = array(); // asoc array containing mapped file names
+    protected $dirCopyMap    = array(); // asoc array containing mapped file names
+    protected $fileUtils     = null;    // a instance of fileutils
+    protected $filesets      = array(); // all fileset objects assigned to this task
+    protected $filterChains  = array(); // all filterchains objects assigned to this task
+
+    protected $verbosity     = PROJECT_MSG_VERBOSE;
+
+    /**
+     * Sets up this object internal stuff. i.e. the Fileutils instance
+     *
+     * @return object   The CopyTask instnace
+     * @access public
+     */
+    function __construct() {
+        $this->fileUtils = new FileUtils();
+    }
+
+    /**
+     * Set the overwrite flag. IntrospectionHelper takes care of
+     * booleans in set* methods so we can assume that the right
+     * value (boolean primitive) is coming in here.
+     *
+     * @param  boolean  Overwrite the destination file(s) if it/they already exist
+     * @return void
+     * @access public
+     */
+    function setOverwrite($bool) {
+        $this->overwrite = (boolean) $bool;
+    }
+
+    /**
+     * Used to force listing of all names of copied files.
+     * @param boolean $verbosity
+     */
+    function setVerbose($verbosity) {
+        if ($verbosity) {
+            $this->verbosity = PROJECT_MSG_INFO;
+        } else {
+            $this->verbosity = PROJECT_MSG_VERBOSE;
+        }
+    }
+    
+    /**
+     * Set the preserve timestmap flag. IntrospectionHelper takes care of
+     * booleans in set* methods so we can assume that the right
+     * value (boolean primitive) is coming in here.
+     *
+     * @param  boolean  Preserve the timestamp on the destination file
+     * @return void
+     * @access public
+     */
+    function setTstamp($bool) {
+        $this->preserveLMT = (boolean) $bool;
+    }
+
+
+    /**
+     * Set the include empty dirs flag. IntrospectionHelper takes care of
+     * booleans in set* methods so we can assume that the right
+     * value (boolean primitive) is coming in here.
+     *
+     * @param  boolean  Flag if empty dirs should be cpoied too
+     * @return void
+     * @access public
+     */
+    function setIncludeEmptyDirs($bool) {
+        $this->includeEmpty = (boolean) $bool;
+    }
+
+
+    /**
+     * Set the file. We have to manually take care of the
+     * type that is coming due to limited type support in php
+     * in and convert it manually if neccessary.
+     *
+     * @param  string/object  The source file. Either a string or an PhingFile object
+     * @return void
+     * @access public
+     */
+    function setFile(PhingFile $file) {        
+        $this->file = $file;
+    }
+
+
+    /**
+     * Set the toFile. We have to manually take care of the
+     * type that is coming due to limited type support in php
+     * in and convert it manually if neccessary.
+     *
+     * @param  string/object  The dest file. Either a string or an PhingFile object
+     * @return void
+     * @access public
+     */
+    function setTofile(PhingFile $file) {       
+        $this->destFile = $file;
+    }
+
+
+    /**
+     * Set the toDir. We have to manually take care of the
+     * type that is coming due to limited type support in php
+     * in and convert it manually if neccessary.
+     *
+     * @param  string/object  The directory, either a string or an PhingFile object
+     * @return void
+     * @access public
+     */
+    function setTodir(PhingFile $dir) {        
+        $this->destDir = $dir;
+    }
+
+    /**
+     * Nested creator, creates a FileSet for this task
+     *
+     * @access  public
+     * @return  object  The created fileset object
+     */
+    function createFileSet() {
+        $num = array_push($this->filesets, new FileSet());
+        return $this->filesets[$num-1];
+    }
+
+    /**
+     * Creates a filterchain
+     *
+     * @access public
+     * @return  object  The created filterchain object
+     */
+    function createFilterChain() {
+        $num = array_push($this->filterChains, new FilterChain($this->project));
+        return $this->filterChains[$num-1];
+    }
+
+    /**
+     * Nested creator, creates one Mapper for this task
+     *
+     * @access  public
+     * @return  object  The created Mapper type object
+     * @throws  BuildException
+     */
+    function createMapper() {
+        if ($this->mapperElement !== null) {
+            throw new BuildException("Cannot define more than one mapper", $this->location);
+        }
+        $this->mapperElement = new Mapper($this->project);
+        return $this->mapperElement;
+    }
+
+    /**
+     * The main entry point where everything gets in motion.
+     *
+     * @access  public
+     * @return  true on success
+     * @throws  BuildException
+     */
+    function main() {
+    
+        $this->validateAttributes();
+
+        if ($this->file !== null) {
+            if ($this->file->exists()) {
+                if ($this->destFile === null) {
+                    $this->destFile = new PhingFile($this->destDir, (string) $this->file->getName());
+                }
+                if ($this->overwrite === true || ($this->file->lastModified() > $this->destFile->lastModified())) {
+                    $this->fileCopyMap[$this->file->getAbsolutePath()] = $this->destFile->getAbsolutePath();
+                } else {
+                    $this->log($this->file->getName()." omitted, is up to date");
+                }
+            } else {
+                // terminate build
+                throw new BuildException("Could not find file " . $this->file->__toString() . " to copy.");
+            }
+        }
+
+        $project = $this->getProject();
+
+        // process filesets
+        foreach($this->filesets as $fs) {
+            $ds = $fs->getDirectoryScanner($project);
+            $fromDir  = $fs->getDir($project);
+            $srcFiles = $ds->getIncludedFiles();
+            $srcDirs  = $ds->getIncludedDirectories();
+            $this->_scan($fromDir, $this->destDir, $srcFiles, $srcDirs);
+        }
+
+        // go and copy the stuff
+        $this->doWork();
+
+        if ($this->destFile !== null) {
+            $this->destDir = null;
+        }
+    }
+
+    /**
+     * Validates attributes coming in from XML
+     *
+     * @access  private
+     * @return  void
+     * @throws  BuildException
+     */
+    private function validateAttributes() {
+    
+        if ($this->file === null && count($this->filesets) === 0) {
+            throw new BuildException("CopyTask. Specify at least one source - a file or a fileset.");
+        }
+
+        if ($this->destFile !== null && $this->destDir !== null) {
+            throw new BuildException("Only one of destfile and destdir may be set.");
+        }
+
+        if ($this->destFile === null && $this->destDir === null) {
+            throw new BuildException("One of destfile or destdir must be set.");
+        }
+
+        if ($this->file !== null && $this->file->exists() && $this->file->isDirectory()) {
+            throw new BuildException("Use a fileset to copy directories.");
+        }
+
+        if ($this->destFile !== null && count($this->filesets) > 0) {
+            throw new BuildException("Cannot concatenate multple files into a single file.");
+        }
+
+        if ($this->destFile !== null) {
+            $this->destDir = new PhingFile($this->destFile->getParent());
+        }
+    }
+
+    /**
+     * Compares source files to destination files to see if they
+     * should be copied.
+     *
+     * @access  private
+     * @return  void
+     */
+    private function _scan(&$fromDir, &$toDir, &$files, &$dirs) {
+        /* mappers should be generic, so we get the mappers here and
+        pass them on to builMap. This method is not redundan like it seems */
+        $mapper = null;
+        if ($this->mapperElement !== null) {
+            $mapper = $this->mapperElement->getImplementation();
+        } else if ($this->flatten) {
+            $mapper = new FlattenMapper();
+        } else {
+            $mapper = new IdentityMapper();
+        }
+        $this->buildMap($fromDir, $toDir, $files, $mapper, $this->fileCopyMap);
+        $this->buildMap($fromDir, $toDir, $dirs, $mapper, $this->dirCopyMap);
+    }
+
+    /**
+     * Builds a map of filenames (from->to) that should be copied
+     *
+     * @access  private
+     * @return  void
+     */
+    private function buildMap(&$fromDir, &$toDir, &$names, &$mapper, &$map) {
+        $toCopy = null;
+        if ($this->overwrite) {
+            $v = array();
+            foreach($names as $name) {
+                $result = $mapper->main($name);
+                if ($result !== null) {
+                    $v[] = $name;
+                }
+            }
+            $toCopy = $v;
+        } else {
+            $ds = new SourceFileScanner($this);
+            $toCopy = $ds->restrict($names, $fromDir, $toDir, $mapper);
+        }
+
+        for ($i=0,$_i=count($toCopy); $i < $_i; $i++) {
+            $src  = new PhingFile($fromDir, $toCopy[$i]);
+            $mapped = $mapper->main($toCopy[$i]);
+            $dest = new PhingFile($toDir, $mapped[0]);
+            $map[$src->getAbsolutePath()] = $dest->getAbsolutePath();
+        }
+    }
+
+
+    /**
+     * Actually copies the files
+     *
+     * @access  private
+     * @return  void
+     * @throws  BuildException
+     */
+    private function doWork() {
+		
+		// These "slots" allow filters to retrieve information about the currently-being-process files		
+		$fromSlot = $this->getRegisterSlot("currentFromFile");
+		$fromBasenameSlot = $this->getRegisterSlot("currentFromFile.basename");	
+
+		$toSlot = $this->getRegisterSlot("currentToFile");
+		$toBasenameSlot = $this->getRegisterSlot("currentToFile.basename");	
+		
+        $mapSize = count($this->fileCopyMap);
+        $total = $mapSize;
+        if ($mapSize > 0) {
+            $this->log("Copying ".$mapSize." file".(($mapSize) === 1 ? '' : 's')." to ". $this->destDir->getAbsolutePath());
+            // walks the map and actually copies the files
+            $count=0;
+            foreach($this->fileCopyMap as $from => $to) {
+                if ($from === $to) {
+                    $this->log("Skipping self-copy of " . $from, $this->verbosity);
+                    $total--;
+                    continue;
+                }
+                $this->log("From ".$from." to ".$to, $this->verbosity);
+                try { // try to copy file
+				
+					$fromFile = new PhingFile($from);
+					$toFile = new PhingFile($to);
+					
+                    $fromSlot->setValue($fromFile->getPath());
+					$fromBasenameSlot->setValue($fromFile->getName());
+
+					$toSlot->setValue($toFile->getPath());
+					$toBasenameSlot->setValue($toFile->getName());
+					
+                    $this->fileUtils->copyFile($fromFile, $toFile, $this->overwrite, $this->preserveLMT, $this->filterChains, $this->getProject());
+			
+                    $count++;
+                } catch (IOException $ioe) {
+                    $this->log("Failed to copy " . $from . " to " . $to . ": " . $ioe->getMessage(), PROJECT_MSG_ERR);
+                }
+            }
+        }
+
+        // handle empty dirs if appropriate
+        if ($this->includeEmpty) {
+            $destdirs = array_values($this->dirCopyMap);
+            $count = 0;
+            foreach ($destdirs as $destdir) {
+                $d = new PhingFile((string) $destdir);
+                if (!$d->exists()) {
+                    if (!$d->mkdirs()) {
+                        $this->log("Unable to create directory " . $d->__toString(), PROJECT_MSG_ERR);
+                    } else {
+                        $count++;
+                    }
+                }
+            }
+            if ($count > 0) {
+                $this->log("Copied ".$count." empty director" . ($count == 1 ? "y" : "ies") . " to " . $this->destDir->getAbsolutePath());
+            }
+        }
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/CopyTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/CvsPassTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/CvsPassTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/CvsPassTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,173 @@
+<?php
+/*
+ *  $Id: CvsPassTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/Task.php';
+include_once 'phing/system/io/BufferedReader.php';
+include_once 'phing/system/io/BufferedWriter.php';
+include_once 'phing/util/StringHelper.php';
+
+/**
+ * Adds an new entry to a CVS password file.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Jeff Martin <jeff en custommonkey.org> (Ant)
+ * @version $Revision: 1.7 $
+ * @package phing.tasks.system
+ */
+class CVSPassTask extends Task {
+
+    /** CVS Root */
+    private $cvsRoot; 
+    /** Password file to add password to */
+    private $passFile;
+    /** Password to add to file */
+    private $password;
+
+    /** Array contain char conversion data */
+    private static $shifts = array(
+          0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
+         16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
+        114, 120,  53,  79,  96, 109,  72, 108,  70,  64,  76,  67, 116,  74,  68,  87,
+        111,  52,  75, 119,  49,  34,  82,  81,  95,  65, 112,  86, 118, 110, 122, 105,
+         41,  57,  83,  43,  46, 102,  40,  89,  38, 103,  45,  50,  42, 123,  91,  35,
+        125,  55,  54,  66, 124, 126,  59,  47,  92,  71, 115,  78,  88, 107, 106,  56,
+         36, 121, 117, 104, 101, 100,  69,  73,  99,  63,  94,  93,  39,  37,  61,  48,
+         58, 113,  32,  90,  44,  98,  60,  51,  33,  97,  62,  77,  84,  80,  85, 223,
+        225, 216, 187, 166, 229, 189, 222, 188, 141, 249, 148, 200, 184, 136, 248, 190,
+        199, 170, 181, 204, 138, 232, 218, 183, 255, 234, 220, 247, 213, 203, 226, 193,
+        174, 172, 228, 252, 217, 201, 131, 230, 197, 211, 145, 238, 161, 179, 160, 212,
+        207, 221, 254, 173, 202, 146, 224, 151, 140, 196, 205, 130, 135, 133, 143, 246,
+        192, 159, 244, 239, 185, 168, 215, 144, 139, 165, 180, 157, 147, 186, 214, 176,
+        227, 231, 219, 169, 175, 156, 206, 198, 129, 164, 150, 210, 154, 177, 134, 127,
+        182, 128, 158, 208, 162, 132, 167, 209, 149, 241, 153, 251, 237, 236, 171, 195,
+        243, 233, 253, 240, 194, 250, 191, 155, 142, 137, 245, 235, 163, 242, 178, 152 
+    );
+
+    /**
+     * Create a CVS task using the default cvspass file location.
+     */
+    public function __construct() {
+        $this->passFile = new PhingFile(
+            Phing::getProperty("cygwin.user.home",
+                Phing::getProperty("user.home"))
+            . DIRECTORY_SEPARATOR . ".cvspass");
+    }
+
+    /**
+     * Does the work.
+     *
+     * @throws BuildException if someting goes wrong with the build
+     */
+    public final function main() {
+        if ($this->cvsRoot === null) {
+            throw new BuildException("cvsroot is required");
+        }
+        if ($this->password === null) {
+            throw new BuildException("password is required");
+        }
+
+        $this->log("cvsRoot: " . $this->cvsRoot, PROJECT_MSG_DEBUG);
+        $this->log("password: " . $this->password, PROJECT_MSG_DEBUG);
+        $this->log("passFile: " . $this->passFile->__toString(), PROJECT_MSG_DEBUG);
+
+        $reader = null;
+        $writer = null;
+        
+        try {
+            $buf = "";
+
+            if ($this->passFile->exists()) {
+                $reader = new BufferedReader(new FileReader($this->passFile));
+                
+                $line = null;
+                while (($line = $reader->readLine()) !== null) {
+                    if (!StringHelper::startsWith($this->cvsRoot, $line)) {
+                        $buf .= $line . Phing::getProperty("line.separator");
+                    }
+                }
+            }
+
+            $pwdfile = $buf . $this->cvsRoot . " A" . $this->mangle($this->password);
+
+            $this->log("Writing -> " . $pwdfile , PROJECT_MSG_DEBUG);
+
+            $writer = new BufferedWriter(new FileWriter($this->passFile));
+            $writer->write($pwdfile);
+            $writer->newLine();
+            
+            $writer->close();
+            if ($reader) {
+                $reader->close();
+            }
+                        
+        } catch (IOException $e) {
+            if ($reader) {
+                try {
+                    $reader->close();
+                } catch (Exception $e) {}                
+            }
+            
+            if ($writer) {
+                try {
+                    $writer->close();
+                } catch (Exception $e) {}                
+            }
+            
+            throw new BuildException($e);
+        }
+    }
+    
+    /**
+     * "Encode" the password.
+     */
+    private final function mangle($password){
+        $buf = "";
+        for ($i = 0, $plen = strlen($password); $i < $plen; $i++) {
+            $buf .= chr(self::$shifts[ord($password{$i})]);
+        }
+        return $buf;
+    }
+
+    /**
+     * The CVS repository to add an entry for.
+     * @param string $cvsRoot
+     */
+    public function setCvsroot($cvsRoot) {
+        $this->cvsRoot = $cvsRoot;
+    }
+
+    /**
+     * Password file to add the entry to.
+     * @param PhingFile $passFile
+     */
+    public function setPassfile(PhingFile $passFile) {
+        $this->passFile = $passFile;
+    }
+
+    /**
+     * Password to be added to the password file.
+     * @param string $password
+     */
+    public function setPassword($password) {
+        $this->password = $password;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/CvsPassTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/CvsTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/CvsTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/CvsTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,540 @@
+<?php
+/*
+ *  $Id: CvsTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+include_once 'phing/tasks/system/ExecTask.php';
+include_once 'phing/types/Commandline.php';
+
+/**
+ * Task for performing CVS operations.
+ * 
+ *  NOTE: This implementation has been moved here from Cvs.java with
+ *  the addition of some accessors for extensibility.  Another task
+ *  can extend this with some customized output processing.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author costin en dnt.ro (Ant)
+ * @author stefano en apache.org (Ant)
+ * @author Wolfgang Werner <wwerner en picturesafe.de> (Ant)
+ * @author Kevin Ross <kevin.ross en bredex.com> (Ant)
+ * @version $Revision: 1.14 $
+ * @package phing.tasks.system
+ */
+class CvsTask extends Task {
+
+    /** 
+     * Default compression level to use, if compression is enabled via
+     * setCompression( true ). 
+     */
+    const DEFAULT_COMPRESSION_LEVEL = 3;
+
+    private $cmd;
+
+    /** 
+     * List of Commandline children 
+     * @var array Commandline[]
+     */
+    private $commandlines = array();
+
+    /**
+     * the CVSROOT variable.
+     */
+    private $cvsRoot;
+
+    /**
+     * the CVS_RSH variable.
+     */
+    private $cvsRsh;
+
+    /**
+     * the package/module to check out.
+     */
+    private $cvsModule;
+
+    /**
+     * the default command.
+     */
+    private static $default_command = "checkout";
+    
+    /**
+     * the CVS command to execute.
+     */
+    private $command = null;
+
+    /**
+     * suppress information messages.
+     */
+    private $quiet = false;
+
+    /**
+     * compression level to use.
+     */
+    private $compression = 0;
+
+    /**
+     * report only, don't change any files.
+     */
+    private $noexec = false;
+
+    /**
+     * CVS port
+     */
+    private $port = 0;
+
+    /**
+     * CVS password file
+     * @var File
+     */
+    private $passFile = null;
+
+    /**
+     * the directory where the checked out files should be placed.
+     * @var File
+     */
+    private $dest;
+   
+    private $error;
+    
+    private $output;
+   
+    /**
+     * If true it will stop the build if cvs exits with error.
+     * Default is false. (Iulian)
+     * @var boolean
+     */
+    private $failOnError = false;
+  
+    public function init() {
+        $this->cmd = new Commandline();
+    }
+    
+    /**
+     * Sets up the environment for toExecute and then runs it.
+     * @param Commandline $toExecute
+     * @throws BuildException
+     */
+    protected function runCommand(Commandline $toExecute) {
+    
+        // We are putting variables into the script's environment
+        // and not removing them (!)  This should be fine, but is 
+        // worth remembering and testing.
+            
+        if ($this->port > 0) {
+            putenv("CVS_CLIENT_PORT=".$this->port);
+        }
+        
+         // Need a better cross platform integration with <cvspass>, so
+         // use the same filename.
+
+        if ($this->passFile === null) {
+            $defaultPassFile = new PhingFile(Phing::getProperty("cygwin.user.home", Phing::getProperty("user.home")) 
+                . DIRECTORY_SEPARATOR . ".cvspass");
+            if($defaultPassFile->exists()) {
+                $this->setPassfile($defaultPassFile);
+            }
+        }
+
+        if ($this->passFile !== null) {
+            if ($this->passFile->isFile() && $this->passFile->canRead()) {            
+                putenv("CVS_PASSFILE=" . $this->passFile->__toString());
+                $this->log("Using cvs passfile: " . $this->passFile->__toString(), PROJECT_MSG_INFO);
+            } elseif (!$this->passFile->canRead()) {
+                $this->log("cvs passfile: " . $this->passFile->__toString() 
+                    . " ignored as it is not readable", PROJECT_MSG_WARN);
+            } else {
+                $this->log("cvs passfile: " . $this->passFile->__toString() 
+                    . " ignored as it is not a file",
+                    PROJECT_MSG_WARN);
+            }
+        }
+
+        if ($this->cvsRsh !== null) {
+            putenv("CVS_RSH=".$this->cvsRsh);
+        }
+
+        // Use the ExecTask to handle execution of the command        
+        $exe = new ExecTask($this->project);
+        $exe->setProject($this->project);
+        
+        //exe.setAntRun(project);
+        if ($this->dest === null) {
+            $this->dest = $this->project->getBaseDir();
+        }
+
+        if (!$this->dest->exists()) {
+            $this->dest->mkdirs();
+        }
+        
+        if ($this->output !== null) {
+            $exe->setOutput($this->output);
+        }
+
+        if ($this->error !== null) {
+            $exe->setError($this->error);
+        }
+        
+        $exe->setDir($this->dest);
+        
+        if (is_object($toExecute)) {
+            $toExecuteStr = $toExecute->__toString(); // unfortunately no more automagic for initial 5.0.0 release :(
+        }
+        
+        $exe->setCommand($toExecuteStr);
+        
+        try {
+            $actualCommandLine = $toExecuteStr; // we converted to string above
+            $this->log($actualCommandLine, PROJECT_MSG_INFO);
+            $retCode = $exe->execute();
+            $this->log("retCode=" . $retCode, PROJECT_MSG_DEBUG);
+            /*Throw an exception if cvs exited with error. (Iulian)*/
+            if ($this->failOnError && $retCode !== 0) {
+                throw new BuildException("cvs exited with error code "
+                                         . $retCode 
+                                         . Phing::getProperty("line.separator")
+                                         . "Command line was ["
+                                         . $toExecute->describeCommand() . "]", $this->getLocation());
+            }
+        } catch (IOException $e) {
+            if ($this->failOnError) {
+                throw new BuildException($e, $this->getLocation());
+            } else {
+                $this->log("Caught exception: " . $e, PROJECT_MSG_WARN);
+            }
+        } catch (BuildException $e) {
+            if ($this->failOnError) {
+                throw $e;
+            } else {
+                $t = $e->getCause();
+                if ($t === null) {
+                    $t = $e;
+                }
+                $this->log("Caught exception: " . $t, PROJECT_MSG_WARN);
+            }
+        } catch (Exception $e) {
+            if ($this->failOnError) {
+                throw new BuildException($e, $this->getLocation());
+            } else {
+                $this->log("Caught exception: " . $e, PROJECT_MSG_WARN);
+            }
+        }
+    }
+
+    /**
+     * 
+     * @return void
+     * @throws BuildException
+     */
+    public function main() {
+
+        $savedCommand = $this->getCommand();
+
+        if ($this->getCommand() === null && empty($this->commandlines)) {
+            // re-implement legacy behaviour:
+            $this->setCommand(self::$default_command);
+        }
+
+        $c = $this->getCommand();
+        $cloned = null;
+        if ($c !== null) {
+            $cloned = $this->cmd->__copy();
+            $cloned->createArgument(true)->setLine($c);
+            $this->addConfiguredCommandline($cloned, true);
+        }
+
+        try {
+            for ($i = 0, $vecsize=count($this->commandlines); $i < $vecsize; $i++) {
+                $this->runCommand($this->commandlines[$i]);
+            }
+            
+            // finally    {
+            if ($cloned !== null) {
+                $this->removeCommandline($cloned);
+            }
+            $this->setCommand($savedCommand);
+            
+        } catch (Exception $e) {
+            // finally {
+            if ($cloned !== null) {
+                $this->removeCommandline($cloned);
+            }
+            $this->setCommand($savedCommand);
+            throw $e;
+        }
+    }
+
+    /**
+     * The CVSROOT variable.
+     *
+     * @param string $root
+     */
+    public function setCvsRoot($root) {
+
+        // Check if not real cvsroot => set it to null
+        if ($root !== null) {
+            if (trim($root) == "") {
+                $root = null;
+            }
+        }
+
+        $this->cvsRoot = $root;
+    }
+
+    public function getCvsRoot() {
+        return $this->cvsRoot;
+    }
+
+    /**
+     * The CVS_RSH variable.
+     *
+     * @param rsh
+     */
+    public function setCvsRsh($rsh) {
+        // Check if not real cvsrsh => set it to null
+        if ($rsh !== null) {
+            if (trim($rsh) == "") {
+                $rsh = null;
+            }
+        }
+
+        $this->cvsRsh = $rsh;
+    }
+
+    public function getCvsRsh() {
+        return $this->cvsRsh;
+    }
+
+    /**
+     * Port used by CVS to communicate with the server.
+     *
+     * @param int $port
+     */
+    public function setPort($port){
+        $this->port = $port;
+    }
+
+    /**
+     * @return int
+     */
+    public function getPort() {
+        return $this->port;
+    }
+
+    /**
+     * Password file to read passwords from.
+     *
+     * @param passFile
+     */
+    public function setPassfile(PhingFile $passFile) {
+        $this->passFile = $passFile;
+    }
+    
+    /**
+     * @return File
+     */
+    public function getPassFile() {
+        return $this->passFile;
+    }
+
+    /**
+     * The directory where the checked out files should be placed.
+     *
+     * @param PhingFile $dest
+     */
+    public function setDest(PhingFile $dest) {
+        $this->dest = $dest;
+    }
+
+    public function getDest() {
+        return $this->dest;
+    }
+
+    /**
+     * The package/module to operate upon.
+     *
+     * @param string $p
+     */
+    public function setModule($m) {
+        $this->cvsModule = $m;
+    }
+
+    public function getModule(){
+        return $this->cvsModule;
+    }
+
+    /**
+     * The tag of the package/module to operate upon.
+     * @param string $p
+     */
+    public function setTag($p) {
+        // Check if not real tag => set it to null
+        if ($p !== null && trim($p) !== "") {
+            $this->appendCommandArgument("-r");
+            $this->appendCommandArgument($p);
+        }
+    }
+
+    /**
+     * This needs to be public to allow configuration
+     *      of commands externally.
+     */
+    public function appendCommandArgument($arg) {
+        $this->cmd->createArgument()->setValue($arg);
+    }
+
+    /**
+     * Use the most recent revision no later than the given date.
+     * @param p
+     */
+    public function setDate($p) {
+        if ($p !== null && trim($p) !== "") {
+            $this->appendCommandArgument("-D");
+            $this->appendCommandArgument($p);
+        }
+    }
+
+    /**
+     * The CVS command to execute.
+     * @param string $c
+     */
+    public function setCommand($c) {
+        $this->command = $c;
+    }
+    
+    public function getCommand() {
+        return $this->command;
+    }
+
+    /**
+     * If true, suppress informational messages.
+     * @param boolean $q
+     */
+    public function setQuiet($q) {
+        $this->quiet = $q;
+    }
+
+    /**
+     * If true, report only and don't change any files.
+     *
+     * @param boolean $ne
+     */
+    public function setNoexec($ne) {
+        $this->noexec = (boolean) $ne;
+    }
+
+    /**
+     * Stop the build process if the command exits with
+     * a return code other than 0.
+     * Defaults to false.
+     * @param boolean $failOnError
+     */
+    public function setFailOnError($failOnError) {
+        $this->failOnError = (boolean) $failOnError;
+    }
+
+    /**
+     * Configure a commandline element for things like cvsRoot, quiet, etc.
+     * @return string
+     */
+    protected function configureCommandline($c) {
+        if ($c === null) {
+            return;
+        }
+        $c->setExecutable("cvs");
+        
+        if ($this->cvsModule !== null) {
+            $c->createArgument()->setLine($this->cvsModule);
+        }
+        if ($this->compression > 0 && $this->compression < 10) {
+            $c->createArgument(true)->setValue("-z" . $this->compression);
+        }
+        if ($this->quiet) {
+            $c->createArgument(true)->setValue("-q");
+        }
+        if ($this->noexec) {
+            $c->createArgument(true)->setValue("-n");
+        }
+        if ($this->cvsRoot !== null) {
+            $c->createArgument(true)->setLine("-d" . $this->cvsRoot);
+        }
+    }
+
+    protected function removeCommandline(Commandline $c) {
+        $idx = array_search($c, $this->commandlines, true);
+        if ($idx === false) {
+            return false;
+        }
+        $this->commandlines = array_splice($this->commandlines, $idx, 1);
+        return true;
+    }
+
+    /**
+    * Configures and adds the given Commandline.
+    * @param insertAtStart If true, c is
+    */
+    public function addConfiguredCommandline(Commandline $c, $insertAtStart = false) {
+        if ($c === null) {
+            return; 
+        }
+        $this->configureCommandline($c);
+        if ($insertAtStart) {
+            array_unshift($this->commandlines, $c);
+        } else {
+            array_push($this->commandlines, $c);
+        }
+    }
+
+    /**
+    * If set to a value 1-9 it adds -zN to the cvs command line, else
+    * it disables compression.
+    * @param int $level
+    */
+    public function setCompressionLevel($level) {
+        $this->compression = $level;
+    }
+
+    /**
+     * If true, this is the same as compressionlevel="3".
+     *
+     * @param boolean $usecomp If true, turns on compression using default
+     * level, AbstractCvsTask.DEFAULT_COMPRESSION_LEVEL.
+     */
+    public function setCompression($usecomp) {
+        $this->setCompressionLevel($usecomp ? 
+                            self::DEFAULT_COMPRESSION_LEVEL : 0);
+    }
+
+    /**
+     * File to which output should be written.
+     * @param PhingFile $output
+     */
+    function setOutput(PhingFile $f) {
+        $this->output = $f;
+    }
+    
+    /**
+     * File to which error output should be written.
+     * @param PhingFile $output
+     */
+    function setError(PhingFile $f) {
+        $this->error = $f;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/CvsTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/DeleteTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/DeleteTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/DeleteTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,277 @@
+<?php
+/*
+ *  $Id: DeleteTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+
+/**
+ * Deletes a file or directory, or set of files defined by a fileset.
+ * 
+ * @version   $Revision: 1.13 $
+ * @package   phing.tasks.system
+ */
+class DeleteTask extends Task {
+
+    protected $file;
+    protected $dir;
+    protected $filesets = array();
+    protected $includeEmpty = false;
+
+    protected $quiet = false;
+    protected $failonerror = true;
+    protected $verbosity = PROJECT_MSG_VERBOSE;
+	
+	/** Any filelists of files that should be deleted. */
+    private $filelists = array();
+	
+    /** 
+     * Set the name of a single file to be removed.
+     * @param PhingFile $file
+     */
+    function setFile(PhingFile $file) {       
+        $this->file = $file;
+    }
+
+    /** 
+     * Set the directory from which files are to be deleted.
+     * @param PhingFile $dir
+     */
+    function setDir(PhingFile $dir) {
+        $this->dir = $dir;
+    }
+
+    /**
+     * Used to force listing of all names of deleted files.
+     * @param boolean $verbosity
+     */
+    function setVerbose($verbosity) {
+        if ($verbosity) {
+            $this->verbosity = PROJECT_MSG_INFO;
+        } else {
+            $this->verbosity = PROJECT_MSG_VERBOSE;
+        }
+    }
+
+    /**
+     * If the file does not exist, do not display a diagnostic
+     * message or modify the exit status to reflect an error.
+     * This means that if a file or directory cannot be deleted,
+     * then no error is reported. This setting emulates the
+     * -f option to the Unix rm command. Default is false
+    * meaning things are verbose
+     */
+    function setQuiet($bool) {
+        $this->quiet = $bool;
+        if ($this->quiet) {
+            $this->failonerror = false;
+        }
+    }
+
+    /** this flag means 'note errors to the output, but keep going' */
+    function setFailOnError($bool) {
+        $this->failonerror = $bool;
+    }
+
+
+    /** Used to delete empty directories.*/
+    function setIncludeEmptyDirs($includeEmpty) {
+        $this->includeEmpty = (boolean) $includeEmpty;
+    }
+
+    /** Nested creator, adds a set of files (nested fileset attribute). */
+    function createFileSet() {
+        $num = array_push($this->filesets, new FileSet());
+        return $this->filesets[$num-1];
+    }
+	
+	/** Nested creator, adds a set of files (nested fileset attribute). */
+    function createFileList() {
+        $num = array_push($this->filelists, new FileList());
+        return $this->filelists[$num-1];
+    }
+
+    /** Delete the file(s). */
+    function main() {
+        if ($this->file === null && $this->dir === null && count($this->filesets) === 0 && count($this->filelists) === 0) {
+            throw new BuildException("At least one of the file or dir attributes, or a fileset element, or a filelist element must be set.");
+        }
+
+        if ($this->quiet && $this->failonerror) {
+            throw new BuildException("quiet and failonerror cannot both be set to true", $this->location);
+        }
+
+        // delete a single file
+        if ($this->file !== null) {
+            if ($this->file->exists()) {
+                if ($this->file->isDirectory()) {
+                    $this->log("Directory " . $this->file->__toString() . " cannot be removed using the file attribute. Use dir instead.");
+                } else {
+                    $this->log("Deleting: " . $this->file->__toString());
+                    try {
+                        $this->file->delete();
+                    } catch(Exception $e) {
+                        $message = "Unable to delete file " . $this->file->__toString() .": " .$e->getMessage();
+                        if($this->failonerror) {
+                            throw new BuildException($message);
+                        } else {
+                            $this->log($message, $this->quiet ? PROJECT_MSG_VERBOSE : PROJECT_MSG_WARN);
+                        }                        
+                    }
+                }
+            } else {
+                $this->log("Could not find file " . $this->file->getAbsolutePath() . " to delete.",PROJECT_MSG_VERBOSE);
+            }
+        }
+
+        // delete the directory
+        if ($this->dir !== null && $this->dir->exists() && $this->dir->isDirectory()) {
+            if ($this->verbosity === PROJECT_MSG_VERBOSE) {
+                $this->log("Deleting directory " . $this->dir->__toString());
+            }
+            $this->removeDir($this->dir);
+        }
+		
+		// delete the files in the filelists
+		foreach($this->filelists as $fl) {
+			try {
+				$files = $fl->getFiles($this->project);
+				$this->removeFiles($fl->getDir($this->project), $files, $empty=array());
+			} catch (BuildException $be) {
+				// directory doesn't exist or is not readable
+					if ($this->failonerror) {
+					throw $be;
+				} else {
+					$this->log($be->getMessage(), $this->quiet ? PROJECT_MSG_VERBOSE : PROJECT_MSG_WARN);
+				}
+			}
+		}
+			
+        // delete the files in the filesets
+        foreach($this->filesets as $fs) {
+            try {
+                $ds = $fs->getDirectoryScanner($this->project);
+                $files = $ds->getIncludedFiles();
+                $dirs = $ds->getIncludedDirectories();
+                $this->removeFiles($fs->getDir($this->project), $files, $dirs);
+            } catch (BuildException $be) {
+                    // directory doesn't exist or is not readable
+                    if ($this->failonerror) {
+                        throw $be;
+                    } else {
+                        $this->log($be->getMessage(), $this->quiet ? PROJECT_MSG_VERBOSE : PROJECT_MSG_WARN);
+                    }
+                }
+        }
+    }
+    
+    /**
+     * Recursively removes a directory.
+     * @param PhingFile $d The directory to remove.
+     */
+    private function removeDir($d) {
+        $list = $d->listDir();
+        if ($list === null) {
+            $list = array();
+        }
+        
+        foreach($list as $s) {
+            $f = new PhingFile($d, $s);
+            if ($f->isDirectory()) {
+                $this->removeDir($f);
+            } else {
+                $this->log("Deleting " . $f->__toString(), $this->verbosity);
+                try {
+                    $f->delete();
+                } catch (Exception $e) {
+                    $message = "Unable to delete file " . $f->__toString() . ": " . $e->getMessage();
+                    if($this->failonerror) {
+                        throw new BuildException($message);
+                    } else {
+                        $this->log($message, $this->quiet ? PROJECT_MSG_VERBOSE : PROJECT_MSG_WARN);
+                    }
+                }               
+            }
+        }
+        $this->log("Deleting directory " . $d->getAbsolutePath(), $this->verbosity);
+        try {
+            $d->delete();
+        } catch (Exception $e) {
+            $message = "Unable to delete directory " . $d->__toString() . ": " . $e->getMessage();
+            if($this->failonerror) {
+              throw new BuildException($message);
+            } else {
+              $this->log($message, $this->quiet ? PROJECT_MSG_VERBOSE : PROJECT_MSG_WARN);
+            }
+        }               
+    }
+
+    /**
+     * remove an array of files in a directory, and a list of subdirectories
+     * which will only be deleted if 'includeEmpty' is true
+     * @param PhingFile $d directory to work from
+     * @param array &$files array of files to delete; can be of zero length
+     * @param array &$dirs array of directories to delete; can of zero length
+     */
+    private function removeFiles(PhingFile $d, &$files, &$dirs) {
+        if (count($files) > 0) {
+            $this->log("Deleting " . count($files) . " files from " . $d->__toString());
+            for ($j=0,$_j=count($files); $j < $_j; $j++) {
+                $f = new PhingFile($d, $files[$j]);
+                $this->log("Deleting " . $f->getAbsolutePath(), $this->verbosity);
+                try {
+                    $f->delete();
+                } catch (Exception $e) {
+                    $message = "Unable to delete file " . $f->__toString() . ": " . $e->getMessage();
+                    if($this->failonerror) {
+                        throw new BuildException($message);
+                    } else {
+                        $this->log($message, $this->quiet ? PROJECT_MSG_VERBOSE : PROJECT_MSG_WARN);
+                    }
+                }               
+
+            }
+        }
+
+        if (count($dirs) > 0 && $this->includeEmpty) {
+            $dirCount = 0;
+            for ($j=count($dirs)-1; $j>=0; --$j) {
+                $dir = new PhingFile($d, $dirs[$j]);
+                $dirFiles = $dir->listDir();
+                if ($dirFiles === null || count($dirFiles) === 0) {
+                    $this->log("Deleting " . $dir->__toString(), $this->verbosity);
+                    try {
+                        $dir->delete();
+                        $dirCount++;
+                    } catch (Exception $e) {
+                        $message="Unable to delete directory " + $dir;
+                        if($this->failonerror) {
+                            throw new BuildException($message);
+                        } else {
+                            $this->log($message, $this->quiet ? PROJECT_MSG_VERBOSE : PROJECT_MSG_WARN);
+                        }
+                    }
+                }
+            }
+            if ($dirCount > 0) {
+                $this->log("Deleted $dirCount director" . ($dirCount==1 ? "y" : "ies") . " from " . $d->__toString());
+            }
+        }
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/DeleteTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/EchoTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/EchoTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/EchoTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,107 @@
+<?php
+/*
+ *  $Id: EchoTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+include_once 'phing/Task.php';
+
+/**
+ *  Echos a message to the logging system or to a file
+ *
+ *  @author   Michiel Rook <michiel.rook en gmail.com>
+ *  @author   Andreas Aderhold, andi en binarycloud.com
+ *  @version  $Revision: 1.5 $ $Date$
+ *  @package  phing.tasks.system
+ */
+
+class EchoTask extends Task {
+	
+    protected $msg = "";
+    
+    protected $file = "";
+    
+    protected $append = false;
+    
+    protected $level = "info";
+
+    function main() {		
+		switch ($this->level)
+		{
+			case "error": $loglevel = PROJECT_MSG_ERR; break;
+			case "warning": $loglevel = PROJECT_MSG_WARN; break;
+			case "info": $loglevel = PROJECT_MSG_INFO; break;
+			case "verbose": $loglevel = PROJECT_MSG_VERBOSE; break;
+			case "debug": $loglevel = PROJECT_MSG_DEBUG; break;
+		}
+		
+		if (empty($this->file))
+		{
+        	$this->log($this->msg, $loglevel);
+		}
+		else
+		{
+			if ($this->append)
+			{
+				$handle = fopen($this->file, "a");
+			}
+			else
+			{
+				$handle = fopen($this->file, "w");
+			}
+			
+			fwrite($handle, $this->msg);
+			
+			fclose($handle);
+		}
+    }
+    
+    /** setter for file */
+    function setFile($file)
+    {
+		$this->file = (string) $file;
+	}
+
+    /** setter for level */
+    function setLevel($level)
+    {
+		$this->level = (string) $level;
+	}
+
+    /** setter for append */
+    function setAppend($append)
+    {
+		$this->append = $append;
+	}
+
+    /** setter for message */
+    function setMsg($msg) {
+        $this->setMessage($msg);
+    }
+
+    /** alias setter */
+    function setMessage($msg) {
+        $this->msg = (string) $msg;
+    }
+    
+    /** Supporting the <echo>Message</echo> syntax. */
+    function addText($msg)
+    {
+        $this->msg = (string) $msg;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/EchoTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ExecTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ExecTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ExecTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,248 @@
+<?php
+
+/*
+ *  $Id: ExecTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+
+/**
+ * Executes a command on the shell.
+ *
+ * @author   Andreas Aderhold <andi en binarycloud.com>
+ * @author   Hans Lellelid <hans en xmpl.org>
+ * @version  $Revision: 1.17 $
+ * @package  phing.tasks.system
+ */
+class ExecTask extends Task {
+
+    /**
+     * Command to execute.
+     * @var string
+     */
+    protected $command;
+    
+    /**
+     * Working directory.
+     * @var File
+     */
+    protected $dir;
+    
+    /**
+     * Operating system.
+     * @var string
+     */
+    protected $os;
+    
+    /**
+     * Whether to escape shell command using escapeshellcmd().
+     * @var boolean
+     */
+    protected $escape = false;
+    
+    /**
+     * Where to direct output.
+     * @var File
+     */
+    protected $output;
+    
+    /**
+     * Whether to passthru the output
+     * @var boolean
+     */
+    protected $passthru = false;
+    
+    /**
+     * Where to direct error output.
+     * @var File
+     */
+    protected $error;
+    
+	/**
+	 * If spawn is set then [unix] programs will redirect stdout and add '&'.
+	 * @var boolean
+	 */
+	protected $spawn = false;
+	
+    /**
+     * Whether to check the return code.
+     * @var boolean
+     */
+    protected $checkreturn = false;
+    
+    /**
+     * Main method: wraps execute() command.
+     * @return void
+     */
+    public function main() {
+        $this->execute();
+    }
+    
+    /**
+     * Executes a program and returns the return code.
+     * Output from command is logged at INFO level.
+     * @return int Return code from execution.
+     */
+    public function execute() {
+    
+         // test if os match
+        $myos = Phing::getProperty("os.name");
+        $this->log("Myos = " . $myos, PROJECT_MSG_VERBOSE);
+        if (($this->os !== null) && (strpos($os, $myos) === false)) {
+            // this command will be executed only on the specified OS
+            $this->log("Not found in " . $os, PROJECT_MSG_VERBOSE);
+            return 0;
+        }
+        
+         if ($this->dir !== null) {
+            if ($this->dir->isDirectory()) {
+                $currdir = getcwd();
+                @chdir($this->dir->getPath());
+            } else {
+                throw new BuildException("Can't chdir to:" . $this->dir->__toString());
+            }
+        }
+
+
+        if ($this->escape == true) {
+            // FIXME - figure out whether this is correct behavior
+            $this->command = escapeshellcmd($this->command);
+        }
+        
+        if ($this->error !== null) {
+            $this->command .= ' 2> ' . $this->error->getPath();
+            $this->log("Writing error output to: " . $this->error->getPath());
+        }
+        
+        if ($this->output !== null) {
+            $this->command .= ' 1> ' . $this->output->getPath();
+            $this->log("Writing standard output to: " . $this->output->getPath());
+        } elseif ($this->spawn) {
+			$this->command .= ' 1>/dev/null';
+			$this->log("Sending ouptut to /dev/null");
+		}
+        
+        // If neither output nor error are being written to file
+        // then we'll redirect error to stdout so that we can dump
+        // it to screen below.
+
+        if ($this->output === null && $this->error === null) {
+            $this->command .= ' 2>&1';
+        }
+        		
+		// we ignore the spawn boolean for windows
+		if ($this->spawn) {
+		    $this->command .= ' &';
+		}
+
+		$this->log("Executing command: " . $this->command);
+				
+        $output = array();
+        $return = null;
+        exec($this->command, $output, $return);
+
+        if ($this->dir !== null) {
+            @chdir($currdir);
+        }
+
+        foreach($output as $line) {
+            $this->log($line,  ($this->passthru ? PROJECT_MSG_INFO : PROJECT_MSG_VERBOSE));
+        }
+        
+        if($return != 0 && $this->checkreturn)
+        {
+          throw new BuildException("Task exited with code $return");
+        }
+        
+        return $return;
+    }
+
+    /**
+     * The command to use.
+     * @param mixed $command String or string-compatible (e.g. w/ __toString()).
+     */
+    function setCommand($command) {
+        $this->command = "" . $command;
+    }
+    
+    /**
+     * Whether to use escapeshellcmd() to escape command.
+     * @param boolean $escape
+     */
+    function setEscape($escape) {
+        $this->escape = (bool) $escape;
+    }
+    
+    /**
+     * Specify the working directory for executing this command.
+     * @param PhingFile $dir
+     */
+    function setDir(PhingFile $dir) {
+        $this->dir = $dir;
+    }
+    
+    /**
+     * Specify OS (or muliple OS) that must match in order to execute this command.
+     * @param string $os
+     */
+    function setOs($os) {
+        $this->os = (string) $os;
+    }
+    
+    /**
+     * File to which output should be written.
+     * @param PhingFile $output
+     */
+    function setOutput(PhingFile $f) {
+        $this->output = $f;
+    }
+    
+    /**
+     * File to which error output should be written.
+     * @param PhingFile $output
+     */
+    function setError(PhingFile $f) {
+        $this->error = $f;
+    }
+    
+    /**
+     * Whether to use passthru the output.
+     * @param boolean $passthru
+     */
+    function setPassthru($passthru) {
+        $this->passthru = (bool) $passthru;
+    }
+    
+	/**
+	 * Whether to suppress all output and run in the background.
+	 * @param boolean $spawn
+	 */
+	function setSpawn($spawn) {
+		$this->spawn  = (bool) $spawn;
+	}
+
+    /**
+     * Whether to check the return code.
+     * @param boolean $checkreturn
+     */
+    function setCheckreturn($checkreturn) {
+      $this->checkreturn = (bool) $checkreturn;
+    }
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ExecTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ExitTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ExitTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ExitTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,118 @@
+<?php
+/*
+ *  $Id: ExitTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/Task.php';
+
+/**
+ * Exits the active build, giving an additional message
+ * if available.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author    Nico Seessle <nico en seessle.de> (Ant)
+ * @version   $Revision: 1.7 $
+ * @package   phing.tasks.system
+ */
+class ExitTask extends Task { 
+
+    private $message;
+    private $ifCondition;
+    private $unlessCondition;
+
+    /**
+     * A message giving further information on why the build exited.
+     *
+     * @param string $value message to output
+     */
+    public function setMsg($value) {
+        $this->setMessage($value);
+    }
+
+    /**
+     * A message giving further information on why the build exited.
+     *
+     * @param value message to output
+     */
+    public function setMessage($value) {
+        $this->message = $value;
+    }
+
+    /**
+     * Only fail if a property of the given name exists in the current project.
+     * @param c property name
+     */
+    public function setIf($c) {
+        $this->ifCondition = $c;
+    }
+
+    /**
+     * Only fail if a property of the given name does not
+     * exist in the current project.
+     * @param c property name
+     */
+    public function setUnless($c) {
+        $this->unlessCondition = $c;
+    }
+
+    /**
+     * @throws BuildException
+     */
+    public function main()  {
+        if ($this->testIfCondition() && $this->testUnlessCondition()) {
+            if ($this->message !== null) { 
+                throw new BuildException($this->message);
+            } else {
+                throw new BuildException("No message");
+            }
+        }
+    }
+
+    /**
+     * Set a multiline message.
+     */
+    public function addText($msg) {
+        if ($this->message === null) {
+            $this->message = "";
+        }
+        $this->message .= $this->project->replaceProperties($msg);
+    }
+
+    /**
+     * @return boolean
+     */
+    private function testIfCondition() {
+        if ($this->ifCondition === null || $this->ifCondition === "") {
+            return true;
+        }
+        
+        return $this->project->getProperty($this->ifCondition) !== null;
+    }
+    
+    /**
+     * @return boolean
+     */
+    private function testUnlessCondition() {
+        if ($this->unlessCondition === null || $this->unlessCondition ===  "") {
+            return true;
+        }
+        return $this->project->getProperty($this->unlessCondition) === null;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ExitTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ForeachTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ForeachTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ForeachTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,138 @@
+<?php
+/*
+ *  $Id: ForeachTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+include_once 'phing/tasks/system/PhingTask.php';
+
+/**
+ * <foreach> task
+ *
+ * Task definition for the foreach task.  This task takes a list with
+ * delimited values, and executes a target with set param.
+ *
+ * Usage:
+ * <foreach list="values" target="targ" param="name" delimiter="|" />
+ *
+ * Attributes:
+ * list      --> The list of values to process, with the delimiter character,
+ *               indicated by the "delimiter" attribute, separating each value.
+ * target    --> The target to call for each token, passing the token as the
+ *               parameter with the name indicated by the "param" attribute.
+ * param     --> The name of the parameter to pass the tokens in as to the
+ *               target.
+ * delimiter --> The delimiter string that separates the values in the "list"
+ *               parameter.  The default is ",".
+ *
+ * @author    Jason Hines <jason en greenhell.com>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.9 $
+ * @package   phing.tasks.system
+ */
+class ForeachTask extends Task {
+    
+    /** Delimter-separated list of values to process. */
+    private $list;
+    
+    /** Name of parameter to pass to callee */
+    private $param;
+    
+    /** Delimter that separates items in $list */
+    private $delimiter = ',';
+    
+    /**
+     * PhingCallTask that will be invoked w/ calleeTarget.
+     * @var PhingCallTask
+     */
+    private $callee;
+    
+    /**
+     * Target to execute.
+     * @var string
+     */
+    private $calleeTarget;
+
+    function init() {
+        $this->callee = $this->project->createTask("phingcall");
+        $this->callee->setOwningTarget($this->getOwningTarget());
+        $this->callee->setTaskName($this->getTaskName());
+        $this->callee->setLocation($this->getLocation());
+        $this->callee->init();
+    }
+
+    /**
+     * This method does the work.
+     * @return void
+     */   
+    function main() {
+        if ($this->list === null) {
+            throw new BuildException("Missing list to iterate through");
+        }
+        if (trim($this->list) === '') {
+            return;
+        }
+        if ($this->param === null) {
+            throw new BuildException("You must supply a property name to set on each iteration in param");
+        }
+        if ($this->calleeTarget === null) {
+            throw new BuildException("You must supply a target to perform");
+        }
+
+        $callee = $this->callee;
+        $callee->setTarget($this->calleeTarget);
+        $callee->setInheritAll(true);
+        $callee->setInheritRefs(true);
+        
+        $arr = explode($this->delimiter, $this->list);
+        
+        foreach ($arr as $value) {
+            $this->log("Setting param '$this->param' to value '$value'", PROJECT_MSG_VERBOSE);
+            $prop = $callee->createProperty();
+            $prop->setOverride(true);
+            $prop->setName($this->param);
+            $prop->setValue($value);
+            $callee->main();
+        }
+    }
+
+    function setList($list) {
+        $this->list = (string) $list;
+    }
+
+    function setTarget($target) {
+        $this->calleeTarget = (string) $target;
+    }
+
+    function setParam($param) {
+        $this->param = (string) $param;
+    }
+
+    function setDelimiter($delimiter) {
+        $this->delimiter = (string) $delimiter;
+    }
+
+    /**
+     * @return Property
+     */
+    function createProperty() {
+        return $this->callee->createProperty();
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ForeachTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/IfTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/IfTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/IfTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,224 @@
+<?php
+
+/*
+ *  $Id: IfTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/tasks/system/condition/ConditionBase.php';
+require_once 'phing/tasks/system/SequentialTask.php';
+
+/**
+ * Perform some tasks based on whether a given condition holds true or
+ * not.
+ *
+ * <p>This task is heavily based on the Condition framework that can
+ * be found in Ant 1.4 and later, therefore it cannot be used in
+ * conjunction with versions of Ant prior to 1.4.</p>
+ *
+ * <p>This task doesn't have any attributes, the condition to test is
+ * specified by a nested element - see the documentation of your
+ * <code><condition&gt;</code> task (see
+ * <a href="http://jakarta.apache.org/ant/manual/CoreTasks/condition.html">the
+ * online documentation</a> for example) for a complete list of nested
+ * elements.</p>
+ *
+ * <p>Just like the <code><condition&gt;</code> task, only a single
+ * condition can be specified - you combine them using
+ * <code><and&gt;</code> or <code><or&gt;</code> conditions.</p>
+ *
+ * <p>In addition to the condition, you can specify three different
+ * child elements, <code><elseif&gt;</code>, <code><then&gt;</code> and
+ * <code><else&gt;</code>.  All three subelements are optional.
+ *
+ * Both <code><then&gt;</code> and <code><else&gt;</code> must not be
+ * used more than once inside the if task.  Both are
+ * containers for Ant tasks, just like Ant's
+ * <code><parallel&gt;</code> and <code><sequential&gt;</code>
+ * tasks - in fact they are implemented using the same class as Ant's
+ * <code><sequential&gt;</code> task.</p>
+ *
+ *  The <code><elseif&gt;</code> behaves exactly like an <code><if&gt;</code>
+ * except that it cannot contain the <code><else&gt;</code> element
+ * inside of it.  You may specify as may of these as you like, and the
+ * order they are specified is the order they are evaluated in.  If the
+ * condition on the <code><if&gt;</code> is false, then the first
+ * <code><elseif&gt;</code> who's conditional evaluates to true
+ * will be executed.  The <code><else&gt;</code> will be executed
+ * only if the <code><if&gt;</code> and all <code><elseif&gt;</code>
+ * conditions are false.
+ *
+ * <p>Use the following task to define the <code><if&gt;</code>
+ * task before you use it the first time:</p>
+ *
+ * <pre><code>
+ *   <taskdef name="if" classname="net.sf.antcontrib.logic.IfTask" /&gt;
+ * </code></pre>
+ *
+ * <h3>Crude Example</h3>
+ *
+ * <code>
+ * <if>
+ *  <equals arg1="${foo}" arg2="bar" />
+ *  <then>
+ *    <echo message="The value of property foo is bar" />
+ *  </then>
+ *  <else>
+ *    <echo message="The value of property foo is not bar" />
+ *  </else>
+ * </if>
+ * </code>
+ *
+ * <code>
+ * <if>
+ *  <equals arg1="${foo}" arg2="bar" /&gt;
+ *  <then>
+ *   <echo message="The value of property foo is 'bar'" />
+ *  </then>
+ *
+ *  <elseif>
+ *   <equals arg1="${foo}" arg2="foo" />
+ *   <then>
+ *    <echo message="The value of property foo is 'foo'" />
+ *   </then>
+ *  </elseif>
+ *
+ *  <else>
+ *   <echo message="The value of property foo is not 'foo' or 'bar'" />
+ *  </else>
+ * </if>
+ * </code>
+ *
+ * @author <a href="mailto:stefan.bodewig en freenet.de">Stefan Bodewig</a>
+ */
+class IfTask extends ConditionBase {
+
+
+    private $thenTasks = null;
+    private $elseIfTasks = array();
+    private $elseTasks = null;
+
+    /***
+     * A nested Else if task
+     */
+    public function addElseIf(ElseIfTask $ei)
+    {
+        $this->elseIfTasks[] = $ei;
+    }
+
+    /**
+     * A nested <then> element - a container of tasks that will
+     * be run if the condition holds true.
+     *
+     * <p>Not required.</p>
+     */
+    public function addThen(SequentialTask $t) {
+        if ($this->thenTasks != null) {
+            throw new BuildException("You must not nest more than one <then> into <if>");
+        }
+        $this->thenTasks = $t;
+    }
+
+    /**
+     * A nested <else> element - a container of tasks that will
+     * be run if the condition doesn't hold true.
+     *
+     * <p>Not required.</p>
+     */
+    public function addElse(SequentialTask $e) {
+        if ($this->elseTasks != null) {
+            throw new BuildException("You must not nest more than one <else> into <if>");
+        }
+        $this->elseTasks = $e;
+    }
+
+    public function main() {
+	
+        if ($this->countConditions() > 1) {
+            throw new BuildException("You must not nest more than one condition into <if>");
+        }
+        if ($this->countConditions() < 1) {
+            throw new BuildException("You must nest a condition into <if>");
+        }
+		$conditions = $this->getConditions();
+		$c = $conditions[0];
+		
+        if ($c->evaluate()) {
+            if ($this->thenTasks != null) {
+                $this->thenTasks->main();
+            }
+        } else {
+            $done = false;
+            $sz = count($this->elseIfTasks);
+			for($i=0; $i < $sz && !$done; $i++) {
+				$ei = $this->elseIfTasks[$i];
+                if ($ei->evaluate()) {
+                    $done = true;
+                    $ei->main();
+                }
+            }
+
+            if (!$done && $this->elseTasks != null) {
+                $this->elseTasks->main();
+            }
+        }
+    }
+}
+
+/**
+ * "Inner" class for IfTask.
+ * This class has same basic structure as the IfTask, although of course it doesn't support <else> tags.
+ */
+class ElseIfTask extends ConditionBase {
+
+        private $thenTasks = null;
+
+        public function addThen(SequentialTask $t) {
+            if ($this->thenTasks != null) {
+                throw new BuildException("You must not nest more than one <then> into <elseif>");
+            }
+            $this->thenTasks = $t;
+        }
+	
+		/**
+		 * @return boolean
+		 */
+        public function evaluate() {
+		
+            if ($this->countConditions() > 1) {
+                throw new BuildException("You must not nest more than one condition into <elseif>");
+            }
+            if ($this->countConditions() < 1) {
+                throw new BuildException("You must nest a condition into <elseif>");
+            }
+			
+			$conditions = $this->getConditions();
+			$c = $conditions[0];
+
+            return $c->evaluate();
+        }
+		
+		/**
+		 * 
+		 */
+        public function main() {
+            if ($this->thenTasks != null) {
+                $this->thenTasks->main();
+            }
+        }
+    }
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/IfTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/IncludePathTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/IncludePathTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/IncludePathTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,115 @@
+<?php
+
+/*
+ * $Id: IncludePathTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/Task.php';
+include_once 'phing/types/Path.php';
+
+/**
+ * Adds a normalized path to the PHP include_path.
+ * 
+ * This provides a way to alter the include_path without editing any global php.ini settings
+ * or PHP_CLASSPATH environment variable.
+ * 
+ * <code>
+ *   <includepath classpath="new/path/here"/>
+ * </code>
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.1 $
+ * @package   phing.tasks.system
+ */
+class IncludePathTask extends Task {
+   
+    /**
+     * Classname of task to register.
+     * This can be a dot-path -- relative to a location on PHP include_path.
+     * E.g. path.to.MyClass ->  path/to/MyClass.php
+     * @var string
+     */
+    private $classname;
+    
+    /**
+     * Path to add to PHP include_path to aid in finding specified class.
+     * @var Path
+     */
+    private $classpath;
+    
+    /**
+     * Refid to already defined classpath
+     */
+    private $classpathId;
+    
+    /**
+     * Set the classpath to be used when searching for component being defined
+     * 
+     * @param Path $classpath An Path object containing the classpath.
+     */
+    public function setClasspath(Path $classpath) {
+        if ($this->classpath === null) {
+            $this->classpath = $classpath;
+        } else {
+            $this->classpath->append($classpath);
+        }
+    }
+
+    /**
+     * Create the classpath to be used when searching for component being defined
+     */ 
+    public function createClasspath() {
+        if ($this->classpath === null) {
+            $this->classpath = new Path($this->project);
+        }
+        return $this->classpath->createPath();
+    }
+
+    /**
+     * Reference to a classpath to use when loading the files.
+     */
+    public function setClasspathRef(Reference $r) {
+        $this->classpathId = $r->getRefId();
+        $this->createClasspath()->setRefid($r);
+    }
+
+    
+    /** Main entry point */
+    public function main() {
+    
+        // Apparently casting to (string) no longer invokes __toString() automatically.
+        if (is_object($this->classpath)) {
+            $this->classpath = $this->classpath->__toString();
+        }
+        
+        if (empty($this->classpath)) {
+            throw new BuildException("Provided classpath was empty.");
+        }
+        
+        $curr_parts = explode(PATH_SEPARATOR, get_include_path());
+        $add_parts = explode(PATH_SEPARATOR, $this->classpath);
+        $new_parts = array_diff($add_parts, $curr_parts);
+        
+        if ($new_parts) {
+            $this->log("Prepending new include_path components: " . implode(PATH_SEPARATOR, $new_parts), PROJECT_MSG_VERBOSE);
+            set_include_path(implode(PATH_SEPARATOR, array_merge($new_parts, $curr_parts)));
+        }
+        
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/IncludePathTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/InputTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/InputTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/InputTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,146 @@
+<?php
+/*
+ *  $Id: InputTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+include_once 'phing/input/InputRequest.php';
+include_once 'phing/input/YesNoInputRequest.php';
+include_once 'phing/input/MultipleChoiceInputRequest.php';
+ 
+/**
+ * Reads input from the InputHandler.
+ * 
+ * @see       Project::getInputHandler()
+ * @author    Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author    Ulrich Schmidt <usch en usch.net> (Ant)
+ * @author    Stefan Bodewig <stefan.bodewig en epost.de> (Ant)
+ * @version   $Revision: 1.6 $
+ * @package   phing.tasks.system
+ */
+class InputTask extends Task {
+    
+    private $validargs;
+    private $message = ""; // required
+    private $propertyName; // required
+    private $defaultValue;
+    private $promptChar;
+    
+    /**
+     * Defines valid input parameters as comma separated strings. If set, input
+     * task will reject any input not defined as accepted and requires the user
+     * to reenter it. Validargs are case sensitive. If you want 'a' and 'A' to
+     * be accepted you need to define both values as accepted arguments.
+     *
+     * @param validargs A comma separated String defining valid input args.
+     */
+    public function setValidargs ($validargs) {
+        $this->validargs = $validargs;
+    }
+
+    /**
+     * Defines the name of a property to be set from input.
+     *
+     * @param string $name Name for the property to be set from input
+     */
+    public function setPropertyName($name) {
+        $this->propertyName = $name;
+    }
+
+    /**
+     * Sets the Message which gets displayed to the user during the build run.
+     * @param message The message to be displayed.
+     */
+    public function setMessage ($message) {
+        $this->message = $message;
+    }
+
+    /**
+     * Set a multiline message.
+     */
+    public function addText($msg) {
+        $this->message .= $this->project->replaceProperties($msg);
+    }
+    
+    /**
+     * Add a default value.
+     * @param string $v
+     */
+    public function setDefaultValue($v) {
+        $this->defaultValue = $v;
+    }
+    
+    /**
+     * Set the character/string to use for the prompt.
+     * @param string $c
+     */
+    public function setPromptChar($c) {
+        $this->promptChar = $c;
+    }
+    
+    /**
+     * Actual method executed by phing.
+     * @throws BuildException
+     */
+    public function main() {
+    
+        if ($this->propertyName === null) {
+            throw new BuildException("You must specify a value for propertyName attribute.");
+        }
+        
+        if ($this->validargs !== null) {
+            $accept = preg_split('/[\s,]+/', $this->validargs);
+            
+            // is it a boolean (yes/no) inputrequest?
+            $yesno = false;
+            if (count($accept) == 2) {
+                $yesno = true;
+                foreach($accept as $ans) {
+                    if(!StringHelper::isBoolean($ans)) {
+                        $yesno = false;
+                        break;
+                    }
+                }
+            }
+            if ($yesno) $request = new YesNoInputRequest($this->message, $accept);
+            else $request = new MultipleChoiceInputRequest($this->message, $accept);
+        } else {
+            $request = new InputRequest($this->message);
+        }
+        
+        // default default is curr prop value        
+        $request->setDefaultValue($this->project->getProperty($this->propertyName));
+        
+        $request->setPromptChar($this->promptChar);
+        
+        // unless overridden...
+        if ($this->defaultValue !== null) {
+            $request->setDefaultValue($this->defaultValue);
+        }
+        
+        $this->project->getInputHandler()->handleInput($request);
+
+        $value = $request->getInput();
+        
+        if ($value !== null) {
+            $this->project->setUserProperty($this->propertyName, $value);
+        }
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/InputTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/MatchingTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/MatchingTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/MatchingTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,361 @@
+<?php
+/*
+ *  $Id: MatchingTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+require_once 'phing/types/selectors/SelectorContainer.php';
+include_once 'phing/types/FileSet.php';
+include_once 'phing/types/PatternSet.php';
+include_once 'phing/util/DirectoryScanner.php';
+
+/**
+ * This is an abstract task that should be used by all those tasks that 
+ * require to include or exclude files based on pattern matching.
+ *
+ * This is very closely based on the ANT class of the same name.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author    Arnout J. Kuiper <ajkuiper en wxs.nl> (Ant)
+ * @author    Stefano Mazzocchi  <stefano en apache.org> (Ant)
+ * @author    Sam Ruby <rubys en us.ibm.com> (Ant)
+ * @author    Jon S. Stevens <jon en clearink.com> (Ant
+ * @author    Stefan Bodewig <stefan.bodewig en epost.de> (Ant)
+ * @author    Bruce Atherton <bruce en callenish.com> (Ant)
+ * @version   $Revision: 1.4 $
+ * @package   phing.tasks.system
+ */
+abstract class MatchingTask extends Task implements SelectorContainer {
+
+    /** @var boolean */
+    protected $useDefaultExcludes = true;
+    
+    /** @var FileSet */
+    protected $fileset;
+    
+    /**
+     * Create instance; set fileset to new FileSet.
+     */
+    public function __construct() {
+        $this->fileset = new FileSet();
+    }
+    
+    /**
+     * @see ProjectComponent::setProject()
+     */
+    public function setProject(Project $project) {
+        parent::setProject($project);
+        $this->fileset->setProject($project);
+    }
+
+    /**
+     * add a name entry on the include list
+     * @return PatternSetNameEntry
+     */
+    public function createInclude() {
+        return $this->fileset->createInclude();
+    }
+
+    /**
+     * add a name entry on the include files list
+     * @return PatternSetNameEntry
+     */
+    public function createIncludesFile() {
+        return $this->fileset->createIncludesFile();
+    }
+
+    /**
+     * add a name entry on the exclude list
+     * @return PatternSetNameEntry
+     */
+    public function createExclude() {
+        return $this->fileset->createExclude();
+    }
+
+    /**
+     * add a name entry on the include files list
+     * @return PatternSetNameEntry
+     */
+    public function createExcludesFile() {
+        return $this->fileset->createExcludesFile();
+    }
+
+    /**
+     * add a set of patterns
+     * @return PatternSet
+     */
+    public function createPatternSet() {
+        return $this->fileset->createPatternSet();
+    }
+
+    /**
+     * Sets the set of include patterns. Patterns may be separated by a comma
+     * or a space.
+     *
+     * @param string $includes the string containing the include patterns
+     * @return void
+     */
+    public function setIncludes($includes) {
+        $this->fileset->setIncludes($includes);
+    }    
+
+    /**
+     * Sets the set of exclude patterns. Patterns may be separated by a comma
+     * or a space.
+     *
+     * @param string $excludes the string containing the exclude patterns
+     */
+    public function setExcludes($excludes) {
+        $this->fileset->setExcludes($excludes);
+    }
+
+    
+    /**
+     * Sets whether default exclusions should be used or not.
+     *
+     * @param boolean $useDefaultExcludes "true"|"on"|"yes" when default exclusions
+     *                           should be used, "false"|"off"|"no" when they
+     *                           shouldn't be used.
+     */
+    public function setDefaultexcludes($useDefaultExcludes) {
+        $this->useDefaultExcludes = (boolean) $useDefaultExcludes;
+    }
+
+    /**
+     * Returns the directory scanner needed to access the files to process.
+     * @return DirectoryScanner
+     */
+    protected function getDirectoryScanner(PhingFile $baseDir) {
+        $this->fileset->setDir($baseDir);
+        $this->fileset->setDefaultexcludes($this->useDefaultExcludes);
+        return $this->fileset->getDirectoryScanner($this->project);
+    }
+
+    /**
+     * Sets the name of the file containing the includes patterns.
+     *
+     * @param PhingFile $includesfile A string containing the filename to fetch
+     * the include patterns from.
+     * @return void
+     */
+    public function setIncludesfile(PhingFile $includesfile) {
+        $this->fileset->setIncludesfile(includesfile);
+    }
+
+    /**
+     * Sets the name of the file containing the includes patterns.
+     *
+     * @param PhingFile $excludesfile A string containing the filename to fetch
+     * the include patterns from.
+     * @return void
+     */
+    public function setExcludesfile(PhingFile $excludesfile) {
+        $this->fileset->setExcludesfile($excludesfile);
+    }
+
+    /**
+     * Sets case sensitivity of the file system
+     *
+     * @param boolean $isCaseSensitive "true"|"on"|"yes" if file system is case
+     *                           sensitive, "false"|"off"|"no" when not.
+     * @return void
+     */
+    public function setCaseSensitive($isCaseSensitive) {
+        $this->fileset->setCaseSensitive($isCaseSensitive);
+    }
+
+    /**
+     * Sets whether or not symbolic links should be followed.
+     *
+     * @param boolean $followSymlinks whether or not symbolic links should be followed
+     * @return void
+     */
+    public function setFollowSymlinks($followSymlinks) {
+        $this->fileset->setFollowSymlinks($followSymlinks);
+    }
+
+    /**
+     * Indicates whether there are any selectors here.
+     *
+     * @return boolean Whether any selectors are in this container
+     */
+    public function hasSelectors() {
+        return $this->fileset->hasSelectors();
+    }
+
+    /**
+     * Gives the count of the number of selectors in this container
+     *
+     * @return int The number of selectors in this container
+     */
+    public function selectorCount() {
+        return $this->fileset->selectorCount();
+    }
+
+    /**
+     * Returns the set of selectors as an array.
+     *
+     * @return array FileSelector[] An array of selectors in this container
+     */
+    public function getSelectors(Project $p) {
+        return $this->fileset->getSelectors($p);
+    }
+
+    /**
+     * Returns an enumerator for accessing the set of selectors.
+     *
+     * @return an enumerator that goes through each of the selectors
+     */
+    public function selectorElements() {
+        return $this->fileset->selectorElements();
+    }
+
+    /**
+     * Add a new selector into this container.
+     *
+     * @param FileSelector $selector the new selector to add
+     * @return void
+     */
+    public function appendSelector(FileSelector $selector) {
+        $this->fileset->appendSelector($selector);
+    }
+
+    /* Methods below all add specific selectors */
+
+    /**
+     * add a "Select" selector entry on the selector list
+     * @return SelectSelector
+     */
+    public function createSelector() {
+        return $this->fileset->createSelector();
+    }
+
+    /**
+     * add an "And" selector entry on the selector list
+     * @return AndSelector
+     */
+    public function createAnd() {
+        return $this->fileset->createAnd();
+    }
+
+    /**
+     * add an "Or" selector entry on the selector list
+     * @return void
+     */
+    public function createOr() {
+        return $this->fileset->createOr();
+    }
+
+    /**
+     * add a "Not" selector entry on the selector list
+     * @return NotSelector
+     */
+    public function createNot() {
+        return $this->fileset->createNot();
+    }
+
+    /**
+     * add a "None" selector entry on the selector list
+     * @return NoneSelector
+     */
+    public function createNone() {
+        return $this->fileset->createNone();
+    }
+
+    /**
+     * add a majority selector entry on the selector list
+     * @return MajoritySelector
+     */
+    public function createMajority() {
+        return $this->fileset->createMajority();
+    }
+
+    /**
+     * add a selector date entry on the selector list
+     * @return DateSelector
+     */
+    public function createDate() {
+        return $this->fileset->addDate();
+    }
+
+    /**
+     * add a selector size entry on the selector list
+     * @return SizeSelector
+     */
+    public function createSize() {
+        return $this->fileset->createSize();
+    }
+
+    /**
+     * add a selector filename entry on the selector list
+     * @return FilenameSelector
+     */
+    public function createFilename() {
+        return $this->fileset->createFilename();
+    }
+
+    /**
+     * add an extended selector entry on the selector list
+     * @return ExtendSelector
+     */
+    public function createCustom() {
+        return $this->fileset->createCustom();
+    }
+
+    /**
+     * add a contains selector entry on the selector list
+     * @return ContainsSelector
+     */
+    public function createContains() {
+        return $this->fileset->createContains();
+    }
+
+    /**
+     * add a present selector entry on the selector list
+     * @return PresentSelector
+     */
+    public function createPresent() {
+        return $this->fileset->createPresent();
+    }
+
+    /**
+     * add a depth selector entry on the selector list
+     * @return DepthSelector
+     */
+    public function createDepth() {
+        return $this->fileset->createDepth();
+    }
+
+    /**
+     * add a depends selector entry on the selector list
+     * @return DependSelector
+     */
+    public function createDepend() {
+        return $this->fileset->createDepend();
+    }
+
+    /**
+     * Accessor for the implict fileset.
+     *
+     * @return FileSet
+     */
+    protected final function getImplicitFileSet() {
+        return $this->fileset;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/MatchingTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/MkdirTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/MkdirTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/MkdirTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,64 @@
+<?php
+/*
+ *  $Id: MkdirTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+include_once 'phing/system/io/PhingFile.php';
+
+/**
+ * Task to create a directory.
+ *
+ * @author   Andreas Aderhold, andi en binarycloud.com
+ * @version  $Revision: 1.8 $
+ * @package  phing.tasks.system
+ */
+class MkdirTask extends Task {
+
+    /** directory to create*/
+    private $dir;
+
+    /**
+     * create the directory and all parents
+     *
+     * @throws BuildException if dir is somehow invalid, or creation failed.
+     */
+    function main() {
+        if ($this->dir === null) {
+            throw new BuildException("dir attribute is required", $this->location);
+        }
+        if ($this->dir->isFile()) {
+            throw new BuildException("Unable to create directory as a file already exists with that name: " . $this->dir->getAbsolutePath());
+        }
+        if (!$this->dir->exists()) {
+            $result = $this->dir->mkdirs();
+            if (!$result) {
+                $msg = "Directory " . $this->dir->getAbsolutePath() . " creation was not successful for an unknown reason";
+                throw new BuildException($msg, $this->location);
+            }
+            $this->log("Created dir: " . $this->dir->getAbsolutePath());
+        }
+    }
+
+    /** the directory to create; required. */
+    function setDir(PhingFile $dir) {
+        $this->dir = $dir;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/MkdirTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/MoveTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/MoveTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/MoveTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,197 @@
+<?php
+/*
+ *  $Id: MoveTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/system/CopyTask.php';
+include_once 'phing/system/io/PhingFile.php';
+include_once 'phing/system/io/IOException.php';
+
+/**
+ * Moves a file or directory to a new file or directory.
+ * 
+ * By default, the destination file is overwritten if it
+ * already exists.  When overwrite is turned off, then files
+ * are only moved if the source file is newer than the
+ * destination file, or when the destination file does not
+ * exist.
+ *
+ * Source files and directories are only deleted when the file or
+ * directory has been copied to the destination successfully.
+ *
+ * @version $Revision: 1.8 $
+ * @package phing.tasks.system
+ */
+class MoveTask extends CopyTask {
+
+    function __construct() {
+        parent::__construct();
+        $this->forceOverwrite = true;
+    }
+    
+    protected function doWork() {
+    
+        $copyMapSize = count($this->fileCopyMap);
+        if ($copyMapSize > 0) {
+            // files to move
+            $this->log("Moving $copyMapSize files to " . $this->destDir->getAbsolutePath());
+
+            foreach($this->fileCopyMap as $from => $to) {
+                if ($from == $to) {
+                    $this->log("Skipping self-move of $from", $this->verbosity);
+                    continue;
+                }
+
+                $moved = false;
+                $f = new PhingFile($from);
+                $d = new PhingFile($to);
+                
+                $moved = false;
+                try { // try to rename                    
+                    $this->log("Attempting to rename $from to $to", $this->verbosity);
+                    $this->renameFile($f, $d, $this->forceOverwrite);
+                    $moved = true;
+                } catch (IOException $ioe) {
+                    $moved = false;
+                    $this->log("Failed to rename $from to $to: " . $ioe->getMessage(), $this->verbosity);
+                }
+
+                if (!$moved) {                    
+                    try { // try to move
+                        $this->log("Moving $from to $to", $this->verbosity);
+
+                        $this->fileUtils->copyFile($f, $d, $this->forceOverwrite, $this->preserveLMT, $this->filterChains, $this->getProject());                        
+
+                        $f = new PhingFile($fromFile);
+                        $f->delete();
+                    } catch (IOException $ioe) {
+                        $msg = "Failed to move $from to $to: " . $ioe->getMessage();
+                        throw new BuildException($msg, $this->location);
+                    }
+                } // if !moved
+            } // foreach fileCopyMap
+        } // if copyMapSize
+
+        // handle empty dirs if appropriate
+        if ($this->includeEmpty) {
+            $e = array_keys($this->dirCopyMap);
+            $count = 0;
+            foreach ($e as $dir) {
+                $d = new PhingFile((string) $dir);
+                if (!$d->exists()) {
+                    if (!$d->mkdirs()) {
+                        $this->log("Unable to create directory " . $d->getAbsolutePath(), PROJECT_MSG_ERR);
+                    } else {
+                        $count++;
+                    }
+                }
+            }
+            if ($count > 0) {
+                $this->log("moved $count empty director" . ($count == 1 ? "y" : "ies") . " to " . $this->destDir->getAbsolutePath());
+            }
+        }
+
+        if (count($this->filesets) > 0) {
+            // process filesets
+            foreach($this->filesets as $fs) {
+                $dir = $fs->getDir($this->project);
+                if ($this->okToDelete($dir)) {
+                    $this->deleteDir($dir);
+                }
+            }
+        }
+    }
+
+    /** Its only ok to delete a dir tree if there are no files in it. */
+    private function okToDelete($d) {
+        $list = $d->listDir();
+        if ($list === null) {
+            return false;     // maybe io error?
+        }
+        
+        foreach($list as $s) {
+            $f = new PhingFile($d, $s);
+            if ($f->isDirectory()) {
+                if (!$this->okToDelete($f)) {
+                    return false;
+                }
+            } else {
+                // found a file
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /** Go and delete the directory tree. */
+    private function deleteDir($d) {
+    
+        $list = $d->listDir();
+        if ($list === null) {
+            return;      // on an io error list() can return null
+        }
+        
+        foreach($list as $fname) {
+            $f = new PhingFile($d, $fname);
+            if ($f->isDirectory()) {
+                $this->deleteDir($f);
+            } else {
+                throw new BuildException("UNEXPECTED ERROR - The file " . $f->getAbsolutePath() . " should not exist!");
+            }
+        }
+
+        $this->log("Deleting directory " . $d->getPath(), $this->verbosity);
+        try {
+            $d->delete();
+        } catch (Exception $e) {
+            throw new BuildException("Unable to delete directory " . $d->__toString() . ": " . $e->getMessage());
+        }
+    }
+
+    /**
+     * Attempts to rename a file from a source to a destination.
+     * If overwrite is set to true, this method overwrites existing file
+     * even if the destination file is newer.
+     * Otherwise, the source f
+     * ile is renamed only if the destination file #
+     * is older than it.
+     */
+    private function renameFile(PhingFile $sourceFile, PhingFile $destFile, $overwrite) {
+        $renamed = true;
+
+        // ensure that parent dir of dest file exists!
+        $parent = $destFile->getParentFile();
+        if ($parent !== null) {
+            if (!$parent->exists()) {
+                $parent->mkdirs();
+            }
+        }
+        if ($destFile->exists()) {
+            try {
+                $destFile->delete();
+            } catch (Exception $e) {
+                throw new BuildException("Unable to remove existing file " . $destFile->__toString() . ": " . $e->getMessage());
+            }
+        }
+        $renamed = $sourceFile->renameTo($destFile);
+
+        return $renamed;
+    }
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/MoveTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PhingCallTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PhingCallTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PhingCallTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,139 @@
+<?php
+/*
+ *  $Id: PhingCallTask.php 3076 2006-12-18 08:52:12Z fabien $  
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+
+/**
+ * Call another target in the same project.
+ *
+ *   <pre>
+ *    <target name="foo">
+ *      <phingcall target="bar">
+ *        <property name="property1" value="aaaaa" />
+ *        <property name="foo" value="baz" />
+ *       </phingcall>
+ *    </target>
+ *
+ *    <target name="bar" depends="init">
+ *      <echo message="prop is ${property1} ${foo}" />
+ *    </target>
+ *  </pre>
+ *
+ * <p>This only works as expected if neither property1 nor foo are
+ *  defined in the project itself.
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @copyright 2001,2002 THYRELL. All rights reserved
+ * @version   $Revision: 1.9 $
+ * @access    public
+ * @package   phing.tasks.system
+ */
+class PhingCallTask extends Task {
+
+    private $callee;
+    private $subTarget;
+    // must match the default value of PhingTask#inheritAll
+    private $inheritAll = true;
+    // must match the default value of PhingTask#inheritRefs
+    private $inheritRefs = false;
+
+    /**
+     *  If true, pass all properties to the new Phing project.
+     *  Defaults to true. Future use.
+     *  @param boolean new value
+     */
+    function setInheritAll($inherit) {
+        $this->inheritAll = (boolean) $inherit;
+    }
+
+    /**
+     *  If true, pass all references to the new Phing project.
+     *  Defaults to false. Future use.
+    *
+     *  @param boolean new value
+     */
+    function setInheritRefs($inheritRefs) {
+        $this->inheritRefs = (boolean) $inheritRefs;
+    }
+
+    /**
+     *  init this task by creating new instance of the phing task and
+     *  configuring it's by calling its own init method.
+     */
+    function init() {
+        $this->callee = $this->project->createTask("phing");
+        $this->callee->setOwningTarget($this->getOwningTarget());
+        $this->callee->setTaskName($this->getTaskName());
+        $this->callee->setLocation($this->getLocation());
+        $this->callee->init();
+    }
+
+    /**
+     *  hand off the work to the phing task of ours, after setting it up
+     *  @throws BuildException on validation failure or if the target didn't
+     *  execute
+     */
+    function main() {        
+            
+        $this->log("Running PhingCallTask for target '" . $this->subTarget . "'", PROJECT_MSG_DEBUG);
+        if ($this->callee === null) {
+            $this->init();
+        }
+
+        if ($this->subTarget === null) {
+            throw new BuildException("Attribute target is required.", $this->location);
+        }
+        
+        $this->callee->setPhingfile($this->project->getProperty("phing.file"));
+        $this->callee->setTarget($this->subTarget);
+        $this->callee->setInheritAll($this->inheritAll);
+        $this->callee->setInheritRefs($this->inheritRefs);
+        $this->callee->main();
+    }
+
+    /**
+     * Alias for createProperty
+     * @see createProperty()
+     */
+    function createParam() {
+        if ($this->callee === null) {
+            $this->init();
+        }
+        return $this->callee->createProperty();
+    }
+    
+    /**
+     * Property to pass to the invoked target.
+     */
+    function createProperty() {
+        if ($this->callee === null) {
+            $this->init();
+        }
+        return $this->callee->createProperty();
+    }
+
+    /**
+     * Target to execute, required.
+     */
+    function setTarget($target) {
+        $this->subTarget = (string) $target;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PhingCallTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PhingTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PhingTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PhingTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,618 @@
+<?php
+
+/*
+ *  $Id: PhingTask.php 3076 2006-12-18 08:52:12Z fabien $  
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/Task.php';
+include_once 'phing/util/FileUtils.php';
+include_once 'phing/types/Reference.php';
+include_once 'phing/tasks/system/PropertyTask.php';
+
+/**
+ * Task that invokes phing on another build file.
+ * 
+ * Use this task, for example, if you have nested buildfiles in your project. Unlike
+ * AntTask, PhingTask can even support filesets:
+ * 
+ * <pre>
+ *   <phing>
+ *    <fileset dir="${srcdir}">
+ *      <include name="** /build.xml" /> <!-- space added after ** is there because of PHP comment syntax -->
+ *      <exclude name="build.xml" />
+ *    </fileset>
+ *   </phing>
+ * </pre>
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.20 $
+ * @package   phing.tasks.system
+ */
+class PhingTask extends Task {
+
+    /** the basedir where is executed the build file */
+    private $dir;
+    
+    /** build.xml (can be absolute) in this case dir will be ignored */
+    private $phingFile;
+    
+    /** the target to call if any */
+    protected $newTarget;
+    
+    /** should we inherit properties from the parent ? */
+    private $inheritAll = true;
+    
+    /** should we inherit references from the parent ? */
+    private $inheritRefs = false;
+
+    /** the properties to pass to the new project */
+    private $properties = array();
+
+    /** the references to pass to the new project */
+    private $references = array();
+
+    /** The filesets that contain the files PhingTask is to be run on. */
+    private $filesets = array();
+
+    /** the temporary project created to run the build file */
+    private $newProject;
+
+    /** Fail the build process when the called build fails? */
+    private $haltOnFailure = false;
+
+    /**
+     *  If true, abort the build process if there is a problem with or in the target build file.
+     *  Defaults to false.
+     *
+     *  @param boolean new value
+     */
+    public function setHaltOnFailure($hof) {
+        $this->haltOnFailure = (boolean) $hof;
+    }
+
+    /**
+     * Creates a Project instance for the project to call.
+     * @return void
+     */
+    public function init() {
+        $this->newProject = new Project();
+        $tdf = $this->project->getTaskDefinitions();
+        $this->newProject->addTaskDefinition("property", $tdf["property"]);
+    }
+
+    /**
+     * Called in execute or createProperty if newProject is null.
+     *
+     * <p>This can happen if the same instance of this task is run
+     * twice as newProject is set to null at the end of execute (to
+     * save memory and help the GC).</p>
+     *
+     * <p>Sets all properties that have been defined as nested
+     * property elements.</p>
+     */
+    private function reinit() {
+        $this->init();
+        $count = count($this->properties);
+        for ($i = 0; $i < $count; $i++) {
+            $p = $this->properties[$i];
+            $newP = $this->newProject->createTask("property");
+            $newP->setName($p->getName());
+            if ($p->getValue() !== null) {
+                $newP->setValue($p->getValue());
+            }
+            if ($p->getFile() !== null) {
+                $newP->setFile($p->getFile());
+            }            
+            if ($p->getPrefix() !== null) {
+                $newP->setPrefix($p->getPrefix());
+            }
+            if ($p->getRefid() !== null) {
+                $newP->setRefid($p->getRefid());
+            }
+            if ($p->getEnvironment() !== null) {
+                $newP->setEnvironment($p->getEnvironment());
+            }
+            if ($p->getUserProperty() !== null) {
+                $newP->setUserProperty($p->getUserProperty());
+            }
+            if ($p->getOverride() !== null) {
+                $newP->setOverride($p->getOverride());
+            }
+            $this->properties[$i] = $newP;
+        }
+    }
+
+    /**
+     * Main entry point for the task.
+     *
+     * @return void
+     */
+    public function main() {
+    
+        // Call Phing on the file set with the attribute "phingfile"
+        if ($this->phingFile !== null or $this->dir !== null) {
+            $this->processFile();
+        }
+
+        // if no filesets are given stop here; else process filesets
+        if (empty($this->filesets)) { 
+            return;
+        }
+        
+        // preserve old settings
+        $savedDir = $this->dir;
+        $savedPhingFile = $this->phingFile;
+        $savedTarget = $this->newTarget;
+        $buildFailed = false;
+
+        // set no specific target for files in filesets
+        // [HL] I'm commenting this out; I don't know why this should not be supported!
+        // $this->newTarget = null;
+        
+        foreach($this->filesets as $fs) {
+
+            $ds = $fs->getDirectoryScanner($this->project);
+
+            $fromDir  = $fs->getDir($this->project);
+            $srcFiles = $ds->getIncludedFiles();
+
+            foreach($srcFiles as $fname) {            
+                $f = new PhingFile($ds->getbasedir(), $fname);
+                $f = $f->getAbsoluteFile();
+                $this->phingFile = $f->getAbsolutePath();
+                $this->dir = $f->getParentFile();
+                $this->processFile();    // run Phing!
+            }
+        }        
+        
+        // side effect free programming ;-)
+        $this->dir = $savedDir;        
+        $this->phingFile = $savedPhingFile;
+        $this->newTarget = $savedTarget;
+        
+        // [HL] change back to correct dir
+        if ($this->dir !== null) {
+            chdir($this->dir->getAbsolutePath());
+        }
+        
+    }
+    
+    /**
+     * Execute phing file.
+     * 
+     * @return void
+     */
+    private function processFile()  {
+            
+        $savedDir = $this->dir;
+        $savedPhingFile = $this->phingFile;
+        $savedTarget = $this->newTarget;
+        
+		$savedBasedirAbsPath = null; // this is used to save the basedir *if* we change it
+        
+        try {
+        
+            if ($this->newProject === null) {
+                $this->reinit();
+            }
+
+            $this->initializeProject();
+            
+            if ($this->dir !== null) {
+            	
+            	$dirAbsPath = $this->dir->getAbsolutePath();
+            	
+            	// BE CAREFUL! -- when the basedir is changed for a project,
+            	// all calls to getAbsolutePath() on a relative-path dir will
+            	// be made relative to the project's basedir!  This means
+            	// that subsequent calls to $this->dir->getAbsolutePath() will be WRONG!
+            	
+            	// We need to save the current project's basedir first.
+            	$savedBasedirAbsPath = $this->getProject()->getBasedir()->getAbsolutePath();
+				 
+                $this->newProject->setBasedir($this->dir);
+                
+                // Now we must reset $this->dir so that it continues to resolve to the same
+                // path.
+                $this->dir = new PhingFile($dirAbsPath);
+                
+                if ($savedDir !== null) { // has been set explicitly
+                    $this->newProject->setInheritedProperty("project.basedir", $this->dir->getAbsolutePath());
+                }
+                
+            } else {
+            	
+            	// Since we're not changing the basedir here (for file resolution),
+            	// we don't need to worry about any side-effects in this scanrio.
+                $this->dir = $this->getProject()->getBasedir();   
+            }
+
+            $this->overrideProperties();
+            if ($this->phingFile === null) {
+                $this->phingFile = "build.xml";
+            }
+            
+            $fu = new FileUtils();
+            $file = $fu->resolveFile($this->dir, $this->phingFile);
+            $this->phingFile = $file->getAbsolutePath();
+            
+            $this->log("Calling Buildfile '" . $this->phingFile . "' with target '" . $this->newTarget . "'");
+                        
+            $this->newProject->setUserProperty("phing.file", $this->phingFile);
+                       
+            ProjectConfigurator::configureProject($this->newProject, new PhingFile($this->phingFile));
+
+            if ($this->newTarget === null) {
+                $this->newTarget = $this->newProject->getDefaultTarget();
+            }
+
+            // Are we trying to call the target in which we are defined?
+            if ($this->newProject->getBaseDir() == $this->project->getBaseDir() &&
+                $this->newProject->getProperty("phing.file") == $this->project->getProperty("phing.file") &&
+                $this->getOwningTarget() !== null &&
+                $this->newTarget == $this->getOwningTarget()->getName()) {
+
+                throw new BuildException("phing task calling its own parent target");
+            }
+
+            $this->addReferences();
+            $this->newProject->executeTarget($this->newTarget);
+            
+        } catch (Exception $e) {
+            $buildFailed = true;
+            $this->log($e->getMessage(), PROJECT_MSG_ERR);
+            
+            // important!!! continue on to perform cleanup tasks.    
+		}
+        
+        
+        // reset environment values to prevent side-effects.
+        
+        $this->newProject = null;
+        $pkeys = array_keys($this->properties);
+        foreach($pkeys as $k) {
+            $this->properties[$k]->setProject(null);
+        }
+        
+        $this->dir = $savedDir;        
+        $this->phingFile = $savedPhingFile;
+        $this->newTarget = $savedTarget;
+        
+        // If the basedir for any project was changed, we need to set that back here.
+        if ($savedBasedirAbsPath !== null) {
+            chdir($savedBasedirAbsPath);
+        }
+
+        if ($this->haltOnFailure && $buildFailed) {
+			throw new BuildException("Execution of the target buildfile failed. Aborting.");
+		}
+    }
+
+    /**
+     * Configure the Project, i.e. make intance, attach build listeners
+     * (copy from father project), add Task and Datatype definitions,
+     * copy properties and references from old project if these options
+     * are set via the attributes of the XML tag.
+     *
+     * Developer note:
+     * This function replaces the old methods "init", "_reinit" and 
+     * "_initializeProject".
+     *
+     * @access      protected
+     */
+    private function initializeProject() {
+        
+        $this->newProject->setInputHandler($this->project->getInputHandler());
+        
+        foreach($this->project->getBuildListeners() as $listener) {
+            $this->newProject->addBuildListener($listener);
+        }
+        
+        /* Copy things from old project. Datatypes and Tasks are always
+         * copied, properties and references only if specified so/not
+         * specified otherwise in the XML definition.
+         */
+        // Add Datatype definitions
+        foreach ($this->project->getDataTypeDefinitions() as $typeName => $typeClass) {
+            $this->newProject->addDataTypeDefinition($typeName, $typeClass);
+        }
+        
+        // Add Task definitions
+        foreach ($this->project->getTaskDefinitions() as $taskName => $taskClass) {
+            if ($taskClass == "propertytask") {
+                // we have already added this taskdef in init()
+                continue;
+            }
+            $this->newProject->addTaskDefinition($taskName, $taskClass);
+        }
+
+        // set user-defined properties
+        $this->project->copyUserProperties($this->newProject);
+
+        if (!$this->inheritAll) {
+           // set System built-in properties separately,
+           // b/c we won't inherit them.
+           $this->newProject->setSystemProperties();
+
+        } else {
+            // set all properties from calling project
+            $properties = $this->project->getProperties();
+            foreach ($properties as $name => $value) {                
+                if ($name == "basedir" || $name == "phing.file" || $name == "phing.version") {
+                    // basedir and phing.file get special treatment in main()
+                    continue;
+                }
+                   // don't re-set user properties, avoid the warning message
+                if ($this->newProject->getProperty($name) === null){
+                    // no user property
+                    $this->newProject->setNewProperty($name, $value);
+                }
+            }
+            
+        }
+    
+    }
+
+    /**
+     * Override the properties in the new project with the one
+     * explicitly defined as nested elements here.
+     * @return void
+     * @throws BuildException 
+     */
+    private function overrideProperties() {     
+        foreach(array_keys($this->properties) as $i) {
+            $p = $this->properties[$i];
+            $p->setProject($this->newProject);
+            $p->main();
+        }
+        $this->project->copyInheritedProperties($this->newProject);
+    }
+
+    /**
+     * Add the references explicitly defined as nested elements to the
+     * new project.  Also copy over all references that don't override
+     * existing references in the new project if inheritrefs has been
+     * requested.
+     * 
+     * @return void
+     * @throws BuildException 
+     */
+    private function addReferences() {
+    
+        // parent project references
+        $projReferences = $this->project->getReferences();
+        
+        $newReferences = $this->newProject->getReferences();
+        
+        $subprojRefKeys = array();
+        
+        if (count($this->references) > 0) {
+            for ($i=0, $count=count($this->references); $i < $count; $i++) {
+                $ref = $this->references[$i];            
+                $refid = $ref->getRefId();
+                
+                if ($refid === null) {
+                    throw new BuildException("the refid attribute is required"
+                                             . " for reference elements");
+                }
+                if (!isset($projReferences[$refid])) {
+                    $this->log("Parent project doesn't contain any reference '"
+                        . $refid . "'",
+                        PROJECT_MSG_WARN);
+                    continue;
+                }
+                
+                $subprojRefKeys[] = $refid;
+                //thisReferences.remove(refid);
+                $toRefid = $ref->getToRefid();
+                if ($toRefid === null) {
+                    $toRefid = $refid;
+                }
+                $this->copyReference($refid, $toRefid);
+            }
+        }
+
+        // Now add all references that are not defined in the
+        // subproject, if inheritRefs is true
+        if ($this->inheritRefs) {
+        
+            // get the keys that are were not used by the subproject
+            $unusedRefKeys = array_diff(array_keys($projReferences), $subprojRefKeys);
+            
+            foreach($unusedRefKeys as $key) {
+                if (isset($newReferences[$key])) {
+                    continue;
+                }
+                $this->copyReference($key, $key);
+            }
+        }
+    }
+
+    /**
+     * Try to clone and reconfigure the object referenced by oldkey in
+     * the parent project and add it to the new project with the key
+     * newkey.
+     *
+     * <p>If we cannot clone it, copy the referenced object itself and
+     * keep our fingers crossed.</p>
+     *
+     * @param string $oldKey
+     * @param string $newKey
+     * @return void
+     */
+    private function copyReference($oldKey, $newKey) {
+        $orig = $this->project->getReference($oldKey);
+        if ($orig === null) {
+            $this->log("No object referenced by " . $oldKey . ". Can't copy to " 
+                .$newKey, 
+                PROJECT_SG_WARN);
+            return;
+        }
+
+        $copy = clone $orig;
+
+        if ($copy instanceof ProjectComponent) {
+            $copy->setProject($this->newProject);
+        } elseif (in_array('setProject', get_class_methods(get_class($copy)))) {
+            $copy->setProject($this->newProject);
+		} elseif ($copy instanceof Project) {
+			// don't copy the old "Project" itself
+        } else {
+            $msg = "Error setting new project instance for "
+                . "reference with id " . $oldKey;
+            throw new BuildException($msg);
+        }
+        
+        $this->newProject->addReference($newKey, $copy);
+    }
+
+    /**
+     * If true, pass all properties to the new phing project.
+     * Defaults to true.
+     *
+     * @access      public
+     */
+    function setInheritAll($value) {
+        $this->inheritAll = (boolean) $value;
+    }
+
+    /**
+     * If true, pass all references to the new phing project.
+     * Defaults to false.
+     *
+     * @access      public
+     */
+    function setInheritRefs($value) {
+        $this->inheritRefs = (boolean)$value;
+    }
+
+    /**
+     * The directory to use as a base directory for the new phing project.
+     * Defaults to the current project's basedir, unless inheritall
+     * has been set to false, in which case it doesn't have a default
+     * value. This will override the basedir setting of the called project.
+     *
+     * @access      public
+     */
+    function setDir($d) {
+        if ( is_string($d) )
+            $this->dir = new PhingFile($d);
+        else
+            $this->dir = $d;
+    }
+
+    /**
+     * The build file to use.
+     * Defaults to "build.xml". This file is expected to be a filename relative
+     * to the dir attribute given.
+     *
+     * @access      public
+     */
+    function setPhingfile($s) {
+        // it is a string and not a file to handle relative/absolute
+        // otherwise a relative file will be resolved based on the current
+        // basedir.
+        $this->phingFile = $s;
+    }
+
+   /**
+    * Alias function for setPhingfile
+    *
+    * @access       public
+    */
+    function setBuildfile($s) {
+        $this->setPhingFile($s);
+    }
+
+    /**
+     * The target of the new Phing project to execute.
+     * Defaults to the new project's default target.
+     *
+     * @access      public
+     */
+    function setTarget($s) {
+        $this->newTarget = $s;
+    }
+
+    /**
+     * Support for filesets; This method returns a reference to an instance
+     * of a FileSet object.
+     *
+     * @return FileSet
+     */
+    function createFileSet() {
+        $num = array_push($this->filesets, new FileSet());
+        return $this->filesets[$num-1];
+    }
+
+    /**
+     * Property to pass to the new project.
+     * The property is passed as a 'user property'
+     *
+     * @access      public
+     */
+    function createProperty() {
+        $p = new PropertyTask();
+        $p->setFallback($this->newProject);
+        $p->setUserProperty(true);
+        $this->properties[] = $p;
+        return $p;
+    }
+
+    /**
+     * Reference element identifying a data type to carry
+     * over to the new project.
+     *
+     * @access      public
+     */
+    function createReference() {
+        $num = array_push($this->references, new PhingReference());
+        return $this->references[$num-1];
+    }
+
+}
+
+/**
+ * Helper class that implements the nested <reference>
+ * element of <phing> and <phingcall>.
+ */
+class PhingReference extends Reference {
+
+    private $targetid = null;
+
+    /**
+     * Set the id that this reference to be stored under in the
+     * new project.
+     *
+     * @param targetid the id under which this reference will be passed to
+     *        the new project */
+    public function setToRefid($targetid) {
+        $this->targetid = $targetid;
+    }
+
+    /**
+     * Get the id under which this reference will be stored in the new
+     * project
+     *
+     * @return the id of the reference in the new project.
+     */
+    public function getToRefid() {
+        return $this->targetid;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PhingTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PhpEvalTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PhpEvalTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PhpEvalTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,169 @@
+<?php
+/*
+ *  $Id: PhpEvalTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/Task.php';
+
+/**
+ * Executes PHP function or evaluates expression and sets return value to a property.
+ *
+ *    WARNING:
+ *        This task can, of course, be abused with devastating effects.  E.g. do not
+ *        modify internal Phing classes unless you know what you are doing.
+ *
+ * @author   Hans Lellelid <hans en xmpl.org>
+ * @version  $Revision: 1.7 $
+ * @package  phing.tasks.system
+ *
+ * @todo Add support for evaluating expressions
+ */
+class PhpEvalTask extends Task {
+        
+    protected $expression; // Expression to evaluate
+    protected $function; // Function to execute
+    protected $class; // Class containing function to execute
+    protected $returnProperty; // name of property to set to return value 
+    protected $params = array(); // parameters for function calls
+    
+    /** Main entry point. */
+    function main() {
+        
+        if ($this->function === null && $this->expression === null) {
+            throw new BuildException("You must specify a function to execute or PHP expression to evalute.", $this->location);
+        }
+        
+        if ($this->function !== null && $this->expression !== null) {
+            throw new BuildException("You can specify function or expression, but not both.", $this->location);
+        }
+        
+        if ($this->expression !== null && !empty($this->params)) {
+            throw new BuildException("You cannot use nested <param> tags when evaluationg a PHP expression.", $this->location);
+        }
+        
+        $retval = null;
+        if ($this->function !== null) {
+            $retval = $this->callFunction();                                    
+        } elseif ($this->expression !== null) {
+            $retval = $this->evalExpression();
+        }
+        
+        if ($this->returnProperty !== null) {
+            $this->project->setProperty($this->returnProperty, $retval);
+        }
+    }
+    
+    /**
+     * Calls function and returns results.
+     * @return mixed
+     */
+    protected function callFunction() {
+                        
+        if ($this->class !== null) {
+            // import the classname & unqualify it, if necessary
+            $this->class = Phing::import($this->class);
+                        
+            $user_func = array($this->class, $this->function);
+            $h_func = $this->class . '::' . $this->function; // human-readable (for log)
+        } else {
+            $user_func = $this->function;
+            $h_func = $user_func; // human-readable (for log)
+        }
+        
+        // put parameters into simple array
+        $params = array();
+        foreach($this->params as $p) {
+            $params[] = $p->getValue();
+        }
+        
+        $this->log("Calling PHP function: " . $h_func . "()");
+        foreach($params as $p) {
+            $this->log("  param: " . $p, PROJECT_MSG_VERBOSE);
+        } 
+        
+        $return = call_user_func_array($user_func, $params);
+        return $return;
+    }
+    
+    /**
+     * Evaluates expression and returns resulting value.
+     * @return mixed
+     */
+    protected function evalExpression() {
+        $this->log("Evaluating PHP expression: " . $this->expression);
+        if (!StringHelper::endsWith(';', trim($this->expression))) {
+            $this->expression .= ';';
+        }
+        $retval = null;
+        eval('$retval = ' . $this->expression);
+        return $retval;
+    }
+    
+    /** Set function to execute */
+    public function setFunction($f) {
+       $this->function = $f;
+    }
+
+    /** Set [static] class which contains function to execute */
+    public function setClass($c) {
+       $this->class = $c;
+    }
+    
+    /** Sets property name to set with return value of function or expression.*/
+    public function setReturnProperty($r) {
+       $this->returnProperty = $r;
+    }
+    
+    /** Set PHP expression to evaluate. */
+    public function addText($expression) {
+        $this->expression = $expression;
+    }
+
+    /** Set PHP expression to evaluate. */
+    public function setExpression($expression) {
+        $this->expression = $expression;
+    }
+    
+    /** Add a nested <param> tag. */
+    public function createParam() {
+        $p = new FunctionParam();
+        $this->params[] = $p;
+        return $p;
+    }        
+}
+
+/**
+ * Supports the <param> nested tag for PhpTask.
+ */
+class FunctionParam {
+
+    private $val;
+    
+    public function setValue($v) {
+        $this->val = $v;
+    }
+    
+    public function addText($v) {
+        $this->val = $v;
+    }
+    
+    public function getValue() {
+        return $this->val;
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PhpEvalTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PropertyPromptTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PropertyPromptTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PropertyPromptTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,201 @@
+<?php
+/*
+ *  $Id: PropertyPromptTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+include_once 'phing/system/io/ConsoleReader.php';
+
+/**
+ * Deprecated task that uses console to prompt user for property values.
+ * 
+ * This class is very slightly simpler than the InputTask, but lacks the ability
+ * to use a non-console input handler.  You should, therefore, use InputTask.  This
+ * class can serve as a reference, but will be removed in the future.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author    Anthony J. Young-Garner <ajyoung en alum.mit.edu> (Ant)
+ * @version   $Revision: 1.4 $
+ * @package   phing.tasks.system
+ * @deprecated - in favor of the more capable InputTask
+ */ 
+class PropertyPromptTask extends Task {
+
+    private $propertyName;        // required
+    private $defaultValue;
+    private $proposedValue;        // required
+    private $promptText;        // required
+    private $promptCharacter;
+    private $useExistingValue;
+
+    /**
+     * Sets the prompt text that will be presented to the user.
+     * @param string $prompt
+     * @return void
+     */
+    public function addText($prompt) {
+        $this->setPromptText($prompt);
+    }
+
+    /**
+     * Run the PropertyPrompt task.
+     * @throws BuildException
+     */
+    public function main() {
+        $this->proposedValue = $this->project->getProperty($this->propertyName);
+        $currentValue = $this->defaultValue;
+        if ($currentValue == "" && $this->proposedValue !== null) { $currentValue = $this->proposedValue; }
+        if (! (($this->useExistingValue === true) && ($this->proposedValue !== null))) {
+                        
+            $this->log("Prompting user for " . $this->propertyName . ". " . $this->getDefaultMessage(), PROJECT_MSG_VERBOSE);
+            
+            print "\n" . $this->promptText . " [" . $currentValue . "] " . $this->promptCharacter . " ";
+
+            /** future version should probably have hooks for validation of user input.*/
+            $reader = new ConsoleReader();
+            
+            try {
+                $this->proposedValue  = $reader->readLine();
+            } catch (IOException $e) {
+                $this->log("Prompt failed. Using default. (Failure reason: " . $e->getMessage().")");
+                $this->proposedValue = $this->defaultValue;
+            }
+            
+            if (empty($this->proposedValue)) {
+                $this->log("No value specified, using default.", PROJECT_MSG_VERBOSE);
+                $this->proposedValue = $this->defaultValue;
+            }
+            
+            if (!empty($this->proposedValue)) {                    
+                $this->project->setProperty($this->propertyName, $this->proposedValue);
+            }
+             
+        }    
+    }
+    
+    /**
+     * Returns a string to be inserted in the log message
+     * indicating whether a default response was specified
+     * in the build file.
+     */
+    private function getDefaultMessage() {
+        if ($this->defaultValue == "") {
+            return "No default response specified.";
+        } else return "Default response is " . $this->defaultValue . ".";
+    }
+    
+    /**
+     * Returns defaultValue specified 
+     * in this task for the Property
+     * being set.
+     * @return string
+     */
+    public function getDefaultValue() {
+        return $this->defaultValue;
+    }
+    
+    /**
+     * Returns the terminating character used to 
+     * punctuate the prompt text.
+     * @return string
+     */
+    public function getPromptCharacter() {
+        return $this->promptCharacter;
+    }
+    
+    /**
+     * Returns text of the prompt.
+     * @return java.lang.String
+     */
+    public function getPromptText() {
+        return $this->promptText;
+    }
+    
+    /**
+     * Returns name of the Ant Project Property
+     * being set by this task.
+     * @return string
+     */
+    public function getPropertyName() {
+        return $this->propertyName;
+    }
+    /**
+     * Initializes this task.
+     */
+    public function init() {
+        parent::init();
+        $this->defaultValue    = "";
+        $this->promptCharacter = "?";
+        $this->useExistingValue = false;
+    }
+        
+    /**
+     * Insert the method's description here.
+     * Creation date: (12/10/2001 8:16:16 AM)
+     * @return boolean
+     */
+    public function isUseExistingValue() {
+        return $this->useExistingValue;
+    }
+    
+    /**
+     * Sets defaultValue for the Property
+     * being set by this task.
+     * @param string $newDefaultvalue
+     */
+    public function setDefaultvalue($newDefaultvalue) {
+        $this->defaultValue = $newDefaultvalue;
+    }
+    
+    /**
+     * Sets the terminating character used to 
+     * punctuate the prompt text (default is "?").
+     * @param newPromptcharacter java.lang.String
+     */
+    public function setPromptCharacter($newPromptcharacter) {
+        $this->promptCharacter = $newPromptcharacter;
+    }
+    
+    /**
+     * Sets text of the prompt.
+     * @param newPrompttext java.lang.String
+     */
+    public function setPromptText($newPrompttext) {
+        $this->promptText = $newPrompttext;
+    }
+    
+    /**
+     * Specifies the Phing Project Property
+     * being set by this task.
+     * @param newPropertyname java.lang.String
+     */
+    public function setPropertyName($newPropertyname) {
+        $this->propertyName = $newPropertyname;
+    }
+    
+    /**
+     * 
+     * 
+     * @param boolean newUseExistingValue
+     */
+    public function setUseExistingValue($newUseExistingValue) {
+        $this->useExistingValue = $newUseExistingValue;
+    }
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PropertyPromptTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PropertyTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PropertyTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PropertyTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,438 @@
+<?php
+
+/*
+ *  $Id: PropertyTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/Task.php';
+include_once 'phing/system/util/Properties.php';
+
+/**
+ * Task for setting properties in buildfiles.
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision$
+ * @package   phing.tasks.system
+ */
+class PropertyTask extends Task {
+
+    /** name of the property */
+    protected $name; 
+    
+    /** value of the property */
+    protected $value;
+    
+    protected $reference;
+    protected $env;     // Environment
+    protected $file;
+    protected $ref;
+    protected $prefix;
+    protected $fallback;
+    
+    /** Whether to force overwrite of existing property. */
+    protected $override = false;
+    
+    /** Whether property should be treated as "user" property. */
+    protected $userProperty = false;
+
+    /**
+     * Sets a the name of current property component
+     */
+    function setName($name) {
+        $this->name = (string) $name;
+    }
+    
+    /** Get property component name. */
+    function getName() {
+        return $this->name;
+    }
+
+    /**
+     * Sets a the value of current property component.
+     * @param    mixed      Value of name, all scalars allowed
+     */
+    function setValue($value) {
+        $this->value = (string) $value;
+    }
+	
+	/**
+	 * Sets value of property to CDATA tag contents.
+	 * @param string $values
+	 * @since 2.2.0
+	 */
+	public function addText($value) {
+		$this->setValue($value);
+	}
+    
+    /** Get the value of current property component. */
+    function getValue() {
+        return $this->value;
+    }
+    
+    /** Set a file to use as the source for properties. */
+    function setFile($file) {
+        if (is_string($file)) {
+            $file = new PhingFile($file);
+        }
+        $this->file = $file;
+    }
+    
+    /** Get the PhingFile that is being used as property source. */
+    function getFile() {
+        return $this->file;
+    }
+
+    function setRefid(Reference $ref) {
+        $this->reference = $ref;
+    }
+    
+    function getRefid() {
+        return $this->reference;
+    }
+
+    /**
+     * Prefix to apply to properties loaded using <code>file</code>.
+     * A "." is appended to the prefix if not specified.
+     * @param string $prefix prefix string
+     * @return void
+     * @since 2.0
+     */
+    public function setPrefix($prefix) {
+        $this->prefix = $prefix;
+        if (!StringHelper::endsWith(".", $prefix)) {
+            $this->prefix .= ".";
+        }
+    }
+
+    /**
+     * @return string
+     * @since 2.0
+     */
+    public function getPrefix() {
+        return $this->prefix;
+    }
+
+    /**
+    * the prefix to use when retrieving environment variables.
+    * Thus if you specify environment="myenv"
+    * you will be able to access OS-specific
+    * environment variables via property names "myenv.PATH" or
+    * "myenv.TERM".
+    * <p>
+    * Note that if you supply a property name with a final
+    * "." it will not be doubled. ie environment="myenv." will still
+    * allow access of environment variables through "myenv.PATH" and
+    * "myenv.TERM". This functionality is currently only implemented
+    * on select platforms. Feel free to send patches to increase the number of platforms
+    * this functionality is supported on ;).<br>
+    * Note also that properties are case sensitive, even if the
+    * environment variables on your operating system are not, e.g. it
+    * will be ${env.Path} not ${env.PATH} on Windows 2000.
+    * @param env prefix
+    */
+    function setEnvironment($env) {
+        $this->env = (string) $env;
+    }
+
+    function getEnvironment() {
+        return $this->env;
+    }
+    
+    /**
+     * Set whether this is a user property (ro).
+     * This is deprecated in Ant 1.5, but the userProperty attribute
+     * of the class is still being set via constructor, so Phing will
+     * allow this method to function.
+     * @param boolean $v
+     */
+    function setUserProperty($v) {
+        $this->userProperty = (boolean) $v;
+    }
+    
+    function getUserProperty() {
+        return $this->userProperty;
+    }
+    
+    function setOverride($v) {
+        $this->override = (boolean) $v;
+    }
+    
+    function getOverride() {
+        return $this->override;
+    }
+    
+    function toString() {
+        return (string) $this->value;
+    }
+
+	/**
+	 * @param Project $p
+	 */
+    function setFallback($p) {
+        $this->fallback = $p;
+    }
+    
+    function getFallback() {
+        return $this->fallback;
+    }
+    /**
+     * set the property in the project to the value.
+     * if the task was give a file or env attribute
+     * here is where it is loaded
+     */
+    function main() {
+        if ($this->name !== null) {
+            if ($this->value === null && $this->ref === null) {
+                throw new BuildException("You must specify value or refid with the name attribute", $this->getLocation());
+            }
+        } else {
+            if ($this->file === null && $this->env === null ) {
+                throw new BuildException("You must specify file or environment when not using the name attribute", $this->getLocation());
+            }
+        }
+
+        if ($this->file === null && $this->prefix !== null) {
+            throw new BuildException("Prefix is only valid when loading from a file.", $this->getLocation());
+        }
+        
+        if (($this->name !== null) && ($this->value !== null)) {
+            $this->addProperty($this->name, $this->value);
+        }
+
+        if ($this->file !== null) {
+            $this->loadFile($this->file);
+        }
+
+        if ( $this->env !== null ) {
+            $this->loadEnvironment($this->env);
+        }
+
+        if (($this->name !== null) && ($this->ref !== null)) {
+            // get the refereced property
+            try {
+            $this->addProperty($this->name, $this->reference->getReferencedObject($this->project)->toString());
+            } catch (BuildException $be) {
+                if ($this->fallback !== null) {
+                     $this->addProperty($this->name, $this->reference->getReferencedObject($this->fallback)->toString());
+                } else {
+                    throw $be;
+                }
+            }
+        }
+    }
+    
+    /**
+     * load the environment values
+     * @param string $prefix prefix to place before them
+     */
+    protected function loadEnvironment($prefix) {
+
+        $props = new Properties();
+        if ( substr($prefix, strlen($prefix)-1) == '.' ) {
+            $prefix .= ".";
+        }
+        $this->log("Loading Environment $prefix", PROJECT_MSG_VERBOSE);
+        foreach($_ENV as $key => $value) {
+            $props->setProperty($prefix . '.' . $key, $value);
+        }
+        $this->addProperties($props);
+    }
+
+    /**
+     * iterate through a set of properties,
+     * resolve them then assign them
+     */
+    protected function addProperties($props) {
+        $this->resolveAllProperties($props);
+        foreach($props->keys() as $name) {        
+            $value = $props->getProperty($name);
+            $v = $this->project->replaceProperties($value);            
+            if ($this->prefix !== null) {
+                $name = $this->prefix . $name;
+            }
+            $this->addProperty($name, $v);
+        }
+    }
+
+    /**
+     * add a name value pair to the project property set
+     * @param string $name name of property
+     * @param string $value value to set
+     */
+    protected function addProperty($name, $value) {
+        if ($this->userProperty) {
+            if ($this->project->getUserProperty($name) === null || $this->override) {
+                $this->project->setInheritedProperty($name, $value);
+            } else {
+                $this->log("Override ignored for " . $name, PROJECT_MSG_VERBOSE);
+            }
+        } else {
+            if ($this->override) {
+                $this->project->setProperty($name, $value);
+            } else {
+                $this->project->setNewProperty($name, $value);
+            }
+        }
+    }
+
+    /**
+     * load properties from a file.
+     * @param PhingFile $file
+     */
+    protected function loadFile(PhingFile $file) {
+        $props = new Properties();
+        $this->log("Loading ". $file->getAbsolutePath(), PROJECT_MSG_INFO);
+        try { // try to load file
+            if ($file->exists()) {
+                $props->load($file);
+                $this->addProperties($props);
+            } else {
+                $this->log("Unable to find property file: ". $file->getAbsolutePath() ."... skipped", PROJECT_MSG_WARN);
+            }
+        } catch (IOException $ioe) {
+            throw new BuildException("Could not load properties from file.", $ioe);
+        }
+    }
+    
+    /**
+     * Given a Properties object, this method goes through and resolves
+     * any references to properties within the object.
+     * 
+     * @param Properties $props The collection of Properties that need to be resolved.
+     * @return void
+     */
+    protected function resolveAllProperties(Properties $props) {
+        
+        $keys = $props->keys();
+
+        while(count($keys)) {
+
+            // There may be a nice regex/callback way to handle this
+            // replacement, but at the moment it is pretty complex, and
+            // would probably be a lot uglier to work into a preg_replace_callback()
+            // system.  The biggest problem is the fact that a resolution may require
+            // multiple passes.
+            
+            $name     = array_shift($keys);
+            $value    = $props->getProperty($name);
+            $resolved = false;
+            
+            while(!$resolved) {
+            
+                $fragments = array();
+                $propertyRefs = array();
+
+                // [HL] this was ::parsePropertyString($this->value ...) ... this seems wrong
+                self::parsePropertyString($value, $fragments, $propertyRefs);
+
+                $resolved = true;
+                if (count($propertyRefs) !== 0) {
+
+                    $sb = "";
+
+                    $i = $fragments;
+                    $j = $propertyRefs;
+                    while(count($i)) {
+                        $fragment = array_shift($i);
+                        if ($fragment === null) {
+                            $propertyName = array_shift($j);
+
+                            if ($propertyName === $name) {
+                                // Should we maybe just log this as an error & move on?
+                                // $this->log("Property ".$name." was circularly defined.", PROJECT_MSG_ERR);
+                                throw new BuildException("Property ".$name." was circularly defined.");
+                            }
+
+                            $fragment = $this->getProject()->getProperty($propertyName);
+                            if ($fragment === null) {
+                                if ($props->containsKey($propertyName)) {
+                                    $fragment = $props->getProperty($propertyName);
+                                    $resolved = false; // parse again (could have been replaced w/ another var)
+                                } else {
+                                    $fragment = "\${".$propertyName."}";
+                                }
+                            }
+                        }
+                        $sb .= $fragment;
+                    }
+                    
+                    $this->log("Resolved Property \"$value\" to \"$sb\"", PROJECT_MSG_DEBUG);
+                    $value = $sb;                    
+                    $props->setProperty($name, $value);
+                                 
+                } // if (count($propertyRefs))
+                
+            } // while (!$resolved)
+            
+        } // while (count($keys)
+    }
+
+
+     /**
+     * This method will parse a string containing ${value} style
+     * property values into two lists. The first list is a collection
+     * of text fragments, while the other is a set of string property names
+     * null entries in the first list indicate a property reference from the
+     * second list.
+     *
+     * This is slower than regex, but useful for this class, which has to handle
+     * multiple parsing passes for properties.
+     *
+     * @param string $value The string to be scanned for property references
+     * @param array &$fragments The found fragments
+     * @param  array &$propertyRefs The found refs
+     */
+    protected function parsePropertyString($value, &$fragments, &$propertyRefs) {
+    
+        $prev = 0;
+        $pos  = 0;
+
+        while (($pos = strpos($value, '$', $prev)) !== false) {
+            
+            if ($pos > $prev) {
+                array_push($fragments, StringHelper::substring($value, $prev, $pos-1));
+            }
+            if ($pos === (strlen($value) - 1)) {
+                array_push($fragments, '$');
+                $prev = $pos + 1;
+            } elseif ($value{$pos+1} !== '{' ) {
+
+                // the string positions were changed to value-1 to correct
+                // a fatal error coming from function substring()
+                array_push($fragments, StringHelper::substring($value, $pos, $pos + 1));
+                $prev = $pos + 2;
+            } else {
+                $endName = strpos($value, '}', $pos);
+                if ($endName === false) {
+                    throw new BuildException("Syntax error in property: $value");
+                }
+                $propertyName = StringHelper::substring($value, $pos + 2, $endName-1);
+                array_push($fragments, null);
+                array_push($propertyRefs, $propertyName);
+                $prev = $endName + 1;
+            }
+        }
+
+        if ($prev < strlen($value)) {
+            array_push($fragments, StringHelper::substring($value, $prev));
+        }
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/PropertyTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ReflexiveTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ReflexiveTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ReflexiveTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,155 @@
+<?php
+/*
+ *  $Id: ReflexiveTask.php 3076 2006-12-18 08:52:12Z fabien $  
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+
+/**
+ * This task is for using filter chains to make changes to files and overwrite the original files.
+ * 
+ * This task was created to serve the need for "cleanup" tasks -- e.g. a ReplaceRegexp task or strip task
+ * being used to modify files and then overwrite the modified files.  In many (most?) cases you probably
+ * should just use a copy task  to preserve the original source files, but this task supports situations
+ * where there is no src vs. build directory, and modifying source files is actually desired.
+ * 
+ * <code>
+ *    <reflexive>
+ *        <fileset dir=".">
+ *            <include pattern="*.html">
+ *        </fileset>
+ *        <filterchain>
+ *            <replaceregexp>
+ *                <regexp pattern="\n\r" replace="\n"/>
+ *            </replaceregexp>
+ *        </filterchain> 
+ *    </reflexive>
+ * </code>
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.11 $
+ * @package   phing.tasks.system
+ */
+class ReflexiveTask extends Task {
+    
+    /** Single file to process. */
+    private $file;
+    
+    /** Any filesets that should be processed. */
+    private $filesets = array();
+    
+    /** Any filters to be applied before append happens. */
+    private $filterChains = array();
+        
+    /** Alias for setFrom() */
+    function setFile(PhingFile $f) {
+        $this->file = $f;
+    }
+    
+    /** Nested creator, adds a set of files (nested fileset attribute). */
+    function createFileSet() {
+        $num = array_push($this->filesets, new FileSet());
+        return $this->filesets[$num-1];
+    }
+
+    /**
+     * Creates a filterchain
+     *
+     * @return  object  The created filterchain object
+     */
+    function createFilterChain() {
+        $num = array_push($this->filterChains, new FilterChain($this->project));
+        return $this->filterChains[$num-1];
+    }                    
+    
+    /** Append the file(s). */
+    function main() {
+            
+        if ($this->file === null && empty($this->filesets)) {
+            throw new BuildException("You must specify a file or fileset(s) for the <reflexive> task.");
+        }
+        
+        // compile a list of all files to modify, both file attrib and fileset elements
+        // can be used.
+        
+        $files = array();
+        
+        if ($this->file !== null) {
+            $files[] = $this->file;
+        }
+        
+        if (!empty($this->filesets)) {
+            $filenames = array();
+            foreach($this->filesets as $fs) {
+                try {
+                    $ds = $fs->getDirectoryScanner($this->project);
+                    $filenames = $ds->getIncludedFiles(); // get included filenames
+                    $dir = $fs->getDir($this->project);
+                    foreach ($filenames as $fname) {
+                        $files[] = new PhingFile($dir, $fname);
+                    }
+                } catch (BuildException $be) {
+                    $this->log($be->getMessage(), PROJECT_MSG_WARN);
+                }
+            }                        
+        }
+        
+        $this->log("Applying reflexive processing to " . count($files) . " files.");
+
+		// These "slots" allow filters to retrieve information about the currently-being-process files		
+		$slot = $this->getRegisterSlot("currentFile");
+		$basenameSlot = $this->getRegisterSlot("currentFile.basename");	
+
+        
+        foreach($files as $file) {
+			// set the register slots
+			
+			$slot->setValue($file->getPath());
+			$basenameSlot->setValue($file->getName());
+			
+            // 1) read contents of file, pulling through any filters
+            $in = null;
+            try {                
+                $contents = "";
+                $in = FileUtils::getChainedReader(new FileReader($file), $this->filterChains, $this->project);
+                while(-1 !== ($buffer = $in->read())) {
+                    $contents .= $buffer;
+                }
+                $in->close();
+            } catch (Exception $e) {
+                if ($in) $in->close();
+                $this->log("Erorr reading file: " . $e->getMessage(), PROJECT_MSG_WARN);
+            }
+            
+            try {
+                // now create a FileWriter w/ the same file, and write to the file
+                $out = new FileWriter($file);
+                $out->write($contents);
+                $out->close();
+                $this->log("Applying reflexive processing to " . $file->getPath(), PROJECT_MSG_VERBOSE);
+            } catch (Exception $e) {
+                if ($out) $out->close();
+                $this->log("Error writing file back: " . $e->getMessage(), PROJECT_MSG_WARN);
+            }
+            
+        }
+                                
+    }   
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ReflexiveTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ResolvePathTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ResolvePathTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ResolvePathTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,122 @@
+<?php
+/*
+ *  $Id: ResolvePathTask.php 3076 2006-12-18 08:52:12Z fabien $  
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+
+/**
+ * Task for resolving relative paths and setting absolute path in property value.
+ * 
+ * This task was created to address a need for resolving absolute paths of files / directories.
+ * In many cases a relative directory (e.g. "./build") is specified, but it needs to be treated
+ * as an absolute path since other build files (e.g. in subdirs) should all be using the same
+ * path -- and not treating it as a relative path to their own directory.
+ * 
+ * <code>
+ * <property name="relative_path" value="./dirname"/>
+ * <resolvepath propertyName="absolute_path" file="${relative_path}"/>
+ * <echo>Resolved [absolute] path: ${absolute_path}</echo>
+ * </code>
+ * 
+ * TODO:
+ *      - Possibly integrate this with PackageAsPath, for handling/resolving dot-path paths.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.6 $
+ * @package   phing.tasks.system
+ */
+class ResolvePathTask extends Task {
+
+    /** Name of property to set. */
+    private $propertyName;
+    
+    /** The [possibly] relative file/path that needs to be resolved. */
+    private $file;
+    
+    /** Base directory used for resolution. */
+    private $dir;
+    
+    /**
+     * Set the name of the property to set.
+     * @param string $v Property name
+     * @return void
+     */
+    public function setPropertyName($v) {
+        $this->propertyName = $v;
+    }
+    
+    /**
+     * Sets a base dir to use for resolution.
+     * @param PhingFile $d
+     */
+    function setDir(PhingFile $d) {
+        $this->dir = $d;
+    }
+    
+    /**
+     * Sets a path (file or directory) that we want to resolve.
+     * This is the same as setFile() -- just more generic name so that it's
+     * clear that you can also use it to set directory.
+     * @param string $f
+     * @see setFile()
+     */
+    function setPath($f) {
+        $this->file = $f;
+    }
+    
+    /**
+     * Sets a file that we want to resolve.
+     * @param string $f
+     */
+    function setFile($f) {
+        $this->file = $f;
+    }
+
+    /**
+     * Perform the resolution & set property.
+     */
+    public function main() {        
+        
+        if (!$this->propertyName) {
+            throw new BuildException("You must specify the propertyName attribute", $this->getLocation());
+        }
+        
+        // Currently only files are supported
+        if ($this->file === null) {
+            throw new BuildException("You must specify a path to resolve", $this->getLocation());
+        }
+        
+		$fs = FileSystem::getFileSystem();
+		
+        // if dir attribute was specified then we should
+        // use that as basedir to which file was relative.
+		// -- unless the file specified is an absolute path
+        if ($this->dir !== null && !$fs->isAbsolute(new PhingFile($this->file))) {
+            $resolved = new PhingFile($this->dir->getPath(), $this->file);
+        } else {
+            // otherwise just resolve it relative to project basedir
+            $resolved = $this->project->resolveFile($this->file);
+        }
+        
+        $this->log("Resolved " . $this->file . " to " . $resolved->getAbsolutePath(), PROJECT_MSG_INFO);
+        $this->project->setProperty($this->propertyName, $resolved->getAbsolutePath());
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/ResolvePathTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/SequentialTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/SequentialTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/SequentialTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ *  $Id: SequentialTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+require_once 'phing/TaskContainer.php';
+
+/**
+ * Sequential is a container task that contains other Phing Task objects.
+ *
+ * The sequential task has no attributes and does not support any nested
+ * elements apart from Ant tasks. Any valid Ant task may be embedded within the
+ * sequential task.
+ *
+ * @since 2.1.2
+ */
+class SequentialTask extends Task implements TaskContainer {
+
+    /** Optional Vector holding the nested tasks */
+    private $nestedTasks = array();
+
+    /**
+     * Add a nested task to Sequential.
+     * @param Task $nestedTask  Nested task to execute Sequential
+     */
+    public function addTask(Task $nestedTask) {
+        $this->nestedTasks[] = $nestedTask;
+    }
+
+    /**
+     * Execute all nestedTasks.
+     * @throws BuildException if one of the nested tasks fails.
+     */
+    public function main() {
+		foreach($this->nestedTasks as $task) {
+			$task->perform();
+		}
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/SequentialTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TaskdefTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TaskdefTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TaskdefTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,127 @@
+<?php
+
+/*
+ * $Id: TaskdefTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/Task.php';
+
+/**
+ * Register a task for use within a buildfile.
+ * 
+ * This is for registering your own tasks -- or any non-core Task -- for use within a buildfile.
+ * If you find that you are using a particular class frequently, you may want to edit the 
+ * phing/tasks/defaults.properties file so that it is included by default. You may also
+ * want to submit it (if LGPL or compatible license) to be included in Phing distribution.
+ * 
+ * <pre>
+ *   <taskdef name="mytag" classname="path.to.MyHandlingClass"/>
+ *   .
+ *   .
+ *   <mytag param1="val1" param2="val2"/>
+ * </pre>
+ * 
+ * TODO:
+ *    -- possibly refactor since this is almost the same as TypeDefTask
+ *      (right now these are just too simple to really justify creating an abstract class)
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.11 $
+ * @package   phing.tasks.system
+ */
+class TaskdefTask extends Task {
+
+    /** Tag name for task that will be used in XML */
+    private $name;
+    
+    /**
+     * Classname of task to register.
+     * This can be a dot-path -- relative to a location on PHP include_path.
+     * E.g. path.to.MyClass ->  path/to/MyClass.php
+     * @var string
+     */
+    private $classname;
+    
+    /**
+     * Path to add to PHP include_path to aid in finding specified class.
+     * @var Path
+     */
+    private $classpath;
+    
+    /**
+     * Refid to already defined classpath
+     */
+    private $classpathId;
+    
+    /**
+     * Set the classpath to be used when searching for component being defined
+     * 
+     * @param Path $classpath An Path object containing the classpath.
+     */
+    public function setClasspath(Path $classpath) {
+        if ($this->classpath === null) {
+            $this->classpath = $classpath;
+        } else {
+            $this->classpath->append($classpath);
+        }
+    }
+
+    /**
+     * Create the classpath to be used when searching for component being defined
+     */ 
+    public function createClasspath() {
+        if ($this->classpath === null) {
+            $this->classpath = new Path($this->project);
+        }
+        return $this->classpath->createPath();
+    }
+
+    /**
+     * Reference to a classpath to use when loading the files.
+     */
+    public function setClasspathRef(Reference $r) {
+        $this->classpathId = $r->getRefId();
+        $this->createClasspath()->setRefid($r);
+    }
+
+    /**
+     * Sets the name that will be used in XML buildfile.
+     * @param string $name
+     */
+    public function setName($name)    {
+        $this->name = $name;
+    }
+    
+    /**
+     * Sets the class name / dotpath to use.
+     * @param string $class
+     */
+    public function setClassname($class) {
+        $this->classname = $class;
+    }
+    
+    /** Main entry point */
+    public function main() {
+        if ($this->name === null || $this->classname === null) {
+            throw new BuildException("You must specify name and class attributes for <taskdef>.");
+        }
+        $this->log("Task " . $this->name . " will be handled by class " . $this->classname, PROJECT_MSG_VERBOSE);
+        $this->project->addTaskDefinition($this->name, $this->classname, $this->classpath);
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TaskdefTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TouchTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TouchTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TouchTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,170 @@
+<?php
+/*
+ *  $Id: TouchTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+include_once 'phing/util/DirectoryScanner.php';
+include_once 'phing/types/FileSet.php';
+include_once 'phing/util/FileUtils.php';
+include_once 'phing/system/io/PhingFile.php';
+include_once 'phing/system/io/IOException.php';
+
+/**
+ * Touch a file and/or fileset(s); corresponds to the Unix touch command.
+ *
+ * If the file to touch doesn't exist, an empty one is created.
+ *
+ * @version $Revision: 1.12 $
+ * @package phing.tasks.system
+ */
+class TouchTask extends Task {
+
+    private $file;
+    private $millis    = -1;
+    private $dateTime;
+    private $filesets = array();
+    private $fileUtils;
+
+    function __construct() {
+        $this->fileUtils = new FileUtils();
+    }
+
+    /**
+     * Sets a single source file to touch.  If the file does not exist
+     * an empty file will be created.
+     */
+    function setFile(PhingFile $file) {        
+        $this->file = $file;
+    }
+
+    /**
+     * the new modification time of the file
+     * in milliseconds since midnight Jan 1 1970.
+     * Optional, default=now
+     */
+    function setMillis($millis) {
+        $this->millis = (int) $millis;
+    }
+
+    /**
+     * the new modification time of the file
+     * in the format MM/DD/YYYY HH:MM AM or PM;
+     * Optional, default=now
+     */
+    function setDatetime($dateTime) {
+        $this->dateTime = (string) $dateTime;
+    }
+
+    /**
+     * Nested creator, adds a set of files (nested fileset attribute).
+     * @return FileSet
+     */
+    function createFileSet() {
+        $num = array_push($this->filesets, new FileSet());
+        return $this->filesets[$num-1];
+    }
+
+    /**
+     * Execute the touch operation.
+     */
+    function main() {
+        $savedMillis = $this->millis;
+
+        if ($this->file === null && count($this->filesets) === 0) {
+            throw new BuildException("Specify at least one source - a file or a fileset.");
+        }
+
+        if ($this->file !== null && $this->file->exists() && $this->file->isDirectory()) {
+            throw new BuildException("Use a fileset to touch directories.");
+        }
+
+        try { // try to touch file
+            if ($this->dateTime !== null) {
+                $this->setMillis(strtotime($this->dateTime));
+                if ($this->millis < 0) {
+                    throw new BuildException("Date of {$this->dateTime} results in negative milliseconds value relative to epoch (January 1, 1970, 00:00:00 GMT).");
+                }
+            }
+            $this->_touch();
+        } catch (Exception $ex) {
+            throw new BuildException("Error touch()ing file", $ex, $this->location);
+        }
+        
+        $this->millis = $savedMillis;
+        
+    }
+
+    /**
+     * Does the actual work.
+     */
+    function _touch() {
+        if ($this->file !== null) {
+            if (!$this->file->exists()) {
+                $this->log("Creating " . $this->file->__toString(), PROJECT_MSG_INFO);
+                try { // try to create file
+                    $this->file->createNewFile();
+                } catch(IOException  $ioe) {
+                    throw new BuildException("Error creating new file " . $this->file->__toString(), $ioe, $this->location);
+                }
+            }
+        }
+
+        $resetMillis = false;
+        if ($this->millis < 0) {
+            $resetMillis = true;
+            $this->millis = Phing::currentTimeMillis();
+        }
+
+        if ($this->file !== null) {
+            $this->touchFile($this->file);
+        }
+
+        // deal with the filesets
+        foreach($this->filesets as $fs) {
+        
+            $ds = $fs->getDirectoryScanner($this->getProject());
+            $fromDir = $fs->getDir($this->getProject());
+
+            $srcFiles = $ds->getIncludedFiles();
+            $srcDirs = $ds->getIncludedDirectories();
+
+            for ($j=0,$_j=count($srcFiles); $j < $_j; $j++) {
+                $this->touchFile(new PhingFile($fromDir, (string) $srcFiles[$j]));
+            }
+            
+            for ($j=0,$_j=count($srcDirs); $j < $_j ; $j++) {
+                $this->touchFile(new PhingFile($fromDir, (string) $srcDirs[$j]));
+            }
+        }
+
+        if ($resetMillis) {
+            $this->millis = -1;
+        }
+    }
+
+    private function touchFile($file) {
+        if ( !$file->canWrite() ) {
+            throw new BuildException("Can not change modification date of read-only file " . $file->__toString());
+        }
+        $file->setLastModified($this->millis);
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TouchTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TstampTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TstampTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TstampTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,168 @@
+<?php
+/*
+ *  $Id: TstampTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/Task.php';
+
+/**
+ * Sets properties to the current time, or offsets from the current time.
+ * The default properties are TSTAMP, DSTAMP and TODAY;
+ *
+ * Based on Ant's Tstamp task.
+ * 
+ * @author   Michiel Rook <michiel.rook en gmail.com>
+ * @version  $Revision: 1.6 $
+ * @package  phing.tasks.system
+ * @since    2.2.0
+ */
+class TstampTask extends Task
+{
+	private $customFormats = array();
+	
+	private $prefix = "";
+	
+	/**
+	 * Set a prefix for the properties. If the prefix does not end with a "."
+	 * one is automatically added.
+	 * @param prefix the prefix to use.
+	 */
+	public function setPrefix($prefix)
+	{
+		$this->prefix = $prefix;
+		
+		if (!empty($this->prefix))
+		{
+			$this->prefix.= ".";
+		}
+	}
+	
+    /**
+     * Adds a custom format
+     *
+	 * @param TstampCustomFormat custom format
+     */
+	public function addFormat(TstampCustomFormat $cf)
+	{
+		$this->customFormats[] = $cf;
+	}
+
+    /**
+     * Create the timestamps. Custom ones are done before
+     * the standard ones.
+     *
+     * @throws BuildException
+     */
+    public function main()
+    {
+		foreach ($this->customFormats as $cf)
+		{
+			$cf->execute($this);
+		}
+		
+		$dstamp = strftime('%Y%m%d');
+		$this->prefixProperty('DSTAMP', $dstamp);
+		
+		$tstamp = strftime('%H%M');
+		$this->prefixProperty('TSTAMP', $tstamp);
+		
+		$today = strftime('%B %d %Y');
+		$this->prefixProperty('TODAY', $today);
+	}
+	
+    /**
+     * helper that encapsulates prefix logic and property setting
+     * policy (i.e. we use setNewProperty instead of setProperty).
+     */
+    public function prefixProperty($name, $value)
+    {
+        $this->getProject()->setNewProperty($this->prefix . $name, $value);
+    }
+}
+
+class TstampCustomFormat
+{
+	private $propertyName = "";
+	private $pattern = "";
+	private $locale = "";
+	
+	/**
+	 * The property to receive the date/time string in the given pattern
+	 *
+	 * @param propertyName the name of the property.
+	 */
+	public function setProperty($propertyName)
+	{
+		$this->propertyName = $propertyName;
+	}
+
+	/**
+	 * The date/time pattern to be used. The values are as
+	 * defined by the PHP strftime() function.
+	 *
+	 * @param pattern
+	 */
+	public function setPattern($pattern)
+	{
+		$this->pattern = $pattern;
+	}
+	
+	/**
+	 * The locale used to create date/time string.
+	 *
+	 * @param locale
+	 */
+	public function setLocale($locale)
+	{
+		$this->locale = $locale;
+	}
+	
+	/**
+	 * validate parameter and execute the format.
+	 *
+	 * @param TstampTask reference to task
+	 */
+	public function execute(TstampTask $tstamp)
+	{
+		if (empty($this->propertyName))
+		{
+			throw new BuildException("property attribute must be provided");
+		}
+
+		if (empty($this->pattern))
+		{
+			throw new BuildException("pattern attribute must be provided");
+		}
+		
+		if (!empty($this->locale))
+		{
+			setlocale(LC_ALL, $this->locale);
+		}
+		
+		$value = strftime($this->pattern);
+		$tstamp->prefixProperty($this->propertyName, $value);
+		
+		if (!empty($this->locale))
+		{
+			// reset locale
+			setlocale(LC_ALL, NULL);
+		}
+	}
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TstampTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TypedefTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TypedefTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TypedefTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,125 @@
+<?php
+/*
+ *  $Id: TypedefTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+
+/**
+ * Register a datatype for use within a buildfile.
+ * 
+ * This is for registering your own datatypes for use within a buildfile.
+ * 
+ * If you find that you are using a particular class frequently, you may want to edit the 
+ * phing/types/defaults.properties file so that it is included by default.  You may also
+ * want to submit it (if LGPL or compatible license) to be included in Phing distribution.
+ * 
+ * <pre>
+ *   <typedef name="mytype" classname="path.to.MyHandlingClass"/>
+ *   .
+ *   <sometask ...>
+ *     <mytype param1="val1" param2="val2"/>
+ *   </sometask>
+ * </pre>
+ * 
+ * TODO:
+ *    -- possibly refactor since this is almost the same as TaskDefTask
+ *      (right now these are just too simple to really justify creating an abstract class)
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version   $Revision: 1.7 $
+ * @package   phing.tasks.system
+ */
+class TypedefTask extends Task {
+    
+    /** Tag name for datatype that will be used in XML */
+    private $name;
+    
+    /**
+     * Classname of task to register.
+     * This can be a dot-path -- relative to a location on PHP include_path.
+     * E.g. path.to.MyClass ->  path/to/MyClass.php
+     * @var string
+     */
+    private $classname;
+    
+    /**
+     * Path to add to PHP include_path to aid in finding specified class.
+     * @var Path
+     */
+    private $classpath;
+    
+    /** Refid to already defined classpath */
+    private $classpathId;
+    
+    /**
+     * Set the classpath to be used when searching for component being defined
+     * 
+     * @param Path $classpath An Path object containing the classpath.
+     */
+    public function setClasspath(Path $classpath) {
+        if ($this->classpath === null) {
+            $this->classpath = $classpath;
+        } else {
+            $this->classpath->append($classpath);
+        }
+    }
+
+    /**
+     * Create the classpath to be used when searching for component being defined
+     */ 
+    public function createClasspath() {
+        if ($this->classpath === null) {
+            $this->classpath = new Path($this->project);
+        }
+        return $this->classpath->createPath();
+    }
+
+    /**
+     * Reference to a classpath to use when loading the files.
+     */
+    public function setClasspathRef(Reference $r) {
+        $this->classpathId = $r->getRefId();
+        $this->createClasspath()->setRefid($r);
+    }
+    
+    /** Main entry point */
+    public function main() {
+        if ($this->name === null || $this->classname === null) {
+            throw new BuildException("You must specify name and class attributes for <typedef>.");
+        }        
+        $this->project->addDataTypeDefinition($this->name, $this->classname, $this->classpath);
+    }
+    
+    /**
+     * Sets the name that will be used in XML buildfile.
+     * @param string $name
+     */
+    public function setName($name)    {
+        $this->name = $name;
+    }
+    
+    /**
+     * Sets the class name / dotpath to use.
+     * @param string $class
+     */
+    public function setClassname($class) {
+        $this->classname = $class;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/TypedefTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/UpToDateTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/UpToDateTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/UpToDateTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,217 @@
+<?php
+/*
+ * $Id: UpToDateTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+include_once 'phing/tasks/system/condition/Condition.php';
+include_once 'phing/util/DirectoryScanner.php';
+include_once 'phing/util/SourceFileScanner.php';
+include_once 'phing/mappers/MergeMapper.php';
+
+/**
+ * Sets the given property if the specified target has a timestamp
+ * greater than all of the source files.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author    William Ferguson <williamf en mincom.com> (Ant)
+ * @author    Hiroaki Nakamura <hnakamur en mc.neweb.ne.jp> (Ant)
+ * @author    Stefan Bodewig <stefan.bodewig en epost.de> (Ant)
+ * @version   $Revision: 1.6 $
+ * @package   phing.tasks.system
+ */
+class UpToDateTask extends Task implements Condition {
+
+    private $_property;
+    private $_value;
+    private $_sourceFile;
+    private $_targetFile;
+    private $sourceFileSets = array();
+
+    protected $mapperElement = null;
+
+    /**
+     * The property to set if the target file is more up-to-date than
+     * (each of) the source file(s).
+     *
+     * @param property the name of the property to set if Target is up-to-date.
+     */
+    public function setProperty($property) {
+        $this->_property = $property;
+    }
+
+    /**
+     * The value to set the named property to if the target file is more
+     * up-to-date than (each of) the source file(s). Defaults to 'true'.
+     *
+     * @param value the value to set the property to if Target is up-to-date
+     */
+    public function setValue($value) {
+        $this->_value = $value;
+    }
+
+    /**
+     * Returns the value, or "true" if a specific value wasn't provided.
+     */
+    private function getValue() {
+        return ($this->_value !== null) ? $this->_value : "true";
+    } 
+
+    /**
+     * The file which must be more up-to-date than (each of) the source file(s)
+     * if the property is to be set.
+     *
+     * @param file the file we are checking against.
+     */
+    public function setTargetFile($file) {
+        if (is_string($file)) {
+            $file = new PhingFile($file);
+        }
+        $this->_targetFile = $file;
+    }
+
+    /**
+     * The file that must be older than the target file
+     * if the property is to be set.
+     *
+     * @param file the file we are checking against the target file.
+     */
+    public function setSrcfile($file) {
+        if (is_string($file)) {
+            $file = new PhingFile($file);
+        }
+        $this->_sourceFile = $file;
+    }
+
+    /**
+     * Nested <srcfiles> element.
+     */
+    public function createSrcfiles() {
+        $fs = new FileSet();
+        $this->sourceFileSets[] = $fs;
+        return $fs;
+    }
+
+    /**
+     * Defines the FileNameMapper to use (nested mapper element).
+     */
+    public function createMapper() {
+        if ($this->mapperElement !== null) {
+            throw new BuildException("Cannot define more than one mapper",
+                                     $this->location);
+        }
+        $this->mapperElement = new Mapper($this->getProject());
+        return $this->mapperElement;
+    }
+
+    /**
+     * Evaluate (all) target and source file(s) to
+     * see if the target(s) is/are up-to-date.
+     * @return boolean
+     */
+    public function evaluate() {
+        if (count($this->sourceFileSets) === 0 && $this->_sourceFile === null) {
+            throw new BuildException("At least one srcfile or a nested "
+                                     . "<srcfiles> element must be set.");
+        }
+
+        if (count($this->sourceFileSets) > 0 && $this->_sourceFile !== null) {
+            throw new BuildException("Cannot specify both the srcfile "
+                                     . "attribute and a nested <srcfiles> "
+                                     . "element.");
+        }
+
+        if ($this->_targetFile === null && $this->mapperElement === null) {
+            throw new BuildException("The targetfile attribute or a nested "
+                                     . "mapper element must be set.");
+        }
+
+        // if the target file is not there, then it can't be up-to-date
+        if ($this->_targetFile !== null && !$this->_targetFile->exists()) {
+            return false;
+        } 
+
+        // if the source file isn't there, throw an exception
+        if ($this->_sourceFile !== null && !$this->_sourceFile->exists()) {
+            throw new BuildException($this->_sourceFile->getAbsolutePath() 
+                                     . " not found.");
+        }
+
+        $upToDate = true;
+        for($i=0,$size=count($this->sourceFileSets); $i < $size && $upToDate; $i++) {
+            $fs = $this->sourceFileSets[$i];
+            $ds = $fs->getDirectoryScanner($this->project);
+            $upToDate = $upToDate && $this->scanDir($fs->getDir($this->project),
+                                           $ds->getIncludedFiles());
+        }
+
+        if ($this->_sourceFile !== null) {
+            if ($this->mapperElement === null) {
+                $upToDate = $upToDate &&
+                    ($this->_targetFile->lastModified() >= $this->_sourceFile->lastModified());
+            } else {
+                $sfs = new SourceFileScanner($this);
+                $upToDate = $upToDate &&
+                    count($sfs->restrict($this->_sourceFile->getAbsolutePath(),
+                                  null, null, 
+                                  $this->mapperElement->getImplementation())) === 0;                   
+            }
+        }
+        return $upToDate;
+    }
+
+
+    /**
+     * Sets property to true if target file(s) have a more recent timestamp
+     * than (each of) the corresponding source file(s).
+     * @throws BuildException 
+     */
+    public function main() {
+        if ($this->_property === null) {
+            throw new BuildException("property attribute is required.", 
+                                     $this->location);
+        }
+        $upToDate = $this->evaluate();
+        if ($upToDate) {
+            $this->project->setNewProperty($this->_property, $this->getValue());
+            if ($this->mapperElement === null) {
+                $this->log("File \"" . $this->_targetFile->getAbsolutePath() 
+                    . "\" is up-to-date.", PROJECT_MSG_VERBOSE);
+            } else {
+                $this->log("All target files are up-to-date.",
+                    PROJECT_MSG_VERBOSE);
+            }
+        }
+    }
+
+    protected function scanDir(PhingFile $srcDir, $files) {
+        $sfs = new SourceFileScanner($this);
+        $mapper = null;
+        $dir = $srcDir;
+        if ($this->mapperElement === null) {
+            $mm = new MergeMapper();
+            $mm->setTo($this->_targetFile->getAbsolutePath());
+            $mapper = $mm;
+            $dir = null;
+        } else {
+            $mapper = $this->mapperElement->getImplementation();
+        }
+        return (count($sfs->restrict($files, $srcDir, $dir, $mapper)) === 0);
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/UpToDateTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/WarnTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/WarnTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/WarnTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+<?php
+/*
+ *  $Id: WarnTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/tasks/system/EchoTask.php';
+
+/**
+ * Simple task to echo a warning message (PROJECT_MSG_WARN) to all output devices.
+ *
+ * @author   Hans Lellelid <hans en xmpl.org>
+ * @version  $Revision: 1.1 $ $Date$
+ * @package  phing.tasks.system
+ */
+class WarnTask extends EchoTask {
+    function main() {
+        $this->log($this->msg, PROJECT_MSG_WARN);
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/WarnTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/XsltTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/XsltTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/XsltTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,81 @@
+<?php
+/*
+ *  $Id: XsltTask.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/system/CopyTask.php';
+include_once 'phing/system/io/FileReader.php';
+include_once 'phing/system/io/FileWriter.php';
+include_once 'phing/filters/XsltFilter.php';
+
+/**
+ * Implements an XSLT processing filter while copying files.
+ *
+ * This is a shortcut for calling the <copy> task with the XSLTFilter used
+ * in the <filterchains> section.
+ * 
+ * @author    Andreas Aderhold, andi en binarycloud.com
+ * @version   $Revision: 1.8 $
+ * @package   phing.tasks.system
+ */
+class XsltTask extends CopyTask {
+    
+    /** XSLTFilter object that we use to handle transformation. */
+    private $xsltFilter;
+    
+    /** Parameters to pass to XSLT procesor. */
+    private $parameters = array();
+    
+    /**
+     * Setup the filterchains w/ XSLTFilter that we will use while copying the files.
+     */
+    function init() {
+        $xf = new XsltFilter();
+        $chain = $this->createFilterChain($this->getProject());
+        $chain->addXsltFilter($xf);
+        $this->xsltFilter = $xf;        
+    }
+    
+    /**
+     * Set any XSLT Param and invoke CopyTask::main()
+     * @see CopyTask::main()
+     */
+    function main() {        
+        $this->log("Doing XSLT transformation using stylesheet " . $this->xsltFilter->getStyle(), PROJECT_MSG_VERBOSE);
+        $this->xsltFilter->setParams($this->parameters);
+        parent::main();
+    }
+    
+    /**
+     * Set the stylesheet to use.
+     * @param PhingFile $style
+     */
+    function setStyle(PhingFile $style) {
+        $this->xsltFilter->setStyle($style);
+    }
+    
+    /**
+     * Support nested <param> tags useing XSLTParam class.
+     * @return XSLTParam
+     */
+    function createParam() {
+        $num = array_push($this->parameters, new XSLTParam());
+        return $this->parameters[$num-1];
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/XsltTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/AndCondition.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/AndCondition.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/AndCondition.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,46 @@
+<?php
+/*
+ * $Id: AndCondition.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/system/condition/ConditionBase.php';
+
+/**
+ *  <and> condition container.
+ *
+ *  Iterates over all conditions and returns false as soon as one
+ *  evaluates to false.
+ * 
+ *  @author    Hans Lellelid <hans en xmpl.org>
+ *  @author    Andreas Aderhold <andi en binarycloud.com>
+ *  @copyright © 2001,2002 THYRELL. All rights reserved
+ *  @version   $Revision: 1.7 $
+ *  @package   phing.tasks.system.condition
+ */
+class AndCondition extends ConditionBase implements Condition {
+
+    public function evaluate() {
+        foreach($this as $c) { // ConditionBase implements IteratorAggregator
+              if (!$c->evaluate()) {
+                return false;
+            }
+        }
+        return true;       
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/AndCondition.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/Condition.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/Condition.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/Condition.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ *  $Id: Condition.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ * Condition interface specification:
+ *
+ * Each condition must implement a method applying to this prototye:
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 1.4 $
+ * @package phing.tasks.system.condition
+ */
+interface Condition {
+    /**
+     * @return boolean
+     * @throws BuildException
+     */
+    public function evaluate();
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/Condition.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/ConditionBase.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/ConditionBase.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/ConditionBase.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,195 @@
+<?php
+/*
+ *  $Id: ConditionBase.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/ProjectComponent.php';
+include_once 'phing/Project.php';
+include_once 'phing/tasks/system/AvailableTask.php';
+include_once 'phing/tasks/system/condition/Condition.php';
+
+/**
+ *  Abstract baseclass for the <condition> task as well as several
+ *  conditions - ensures that the types of conditions inside the task
+ *  and the "container" conditions are in sync.
+ * 
+ *    @author    Hans Lellelid <hans en xmpl.org>
+ *  @author    Andreas Aderhold <andi en binarycloud.com>
+ *  @copyright © 2001,2002 THYRELL. All rights reserved
+ *  @version   $Revision: 1.16 $
+ *  @package   phing.tasks.system.condition
+ */
+abstract class ConditionBase extends ProjectComponent implements IteratorAggregate {
+        
+    public $conditions = array(); // needs to be public for "inner" class access
+
+    function countConditions() {
+        return count($this->conditions);
+    }
+    
+    /**
+     * Required for IteratorAggregate
+     */
+    function getIterator() {
+        return new ConditionEnumeration($this);
+    }
+    
+    function getConditions() {
+        return $this->conditions;
+    }
+
+    /**
+     * @return void
+     */
+    function addAvailable(AvailableTask $a) {
+        $this->conditions[] = $a;
+    }
+
+    /**
+     * @return NotCondition
+     */
+    function createNot() {
+        include_once 'phing/tasks/system/condition/NotCondition.php';
+        $num = array_push($this->conditions, new NotCondition());
+        return $this->conditions[$num-1];        
+    }
+
+    /**
+     * @return AndCondition
+     */
+    function createAnd() {
+        include_once 'phing/tasks/system/condition/AndCondition.php';
+        $num = array_push($this->conditions, new AndCondition());
+        return $this->conditions[$num-1];
+    }
+    
+    /**
+     * @return OrCondition
+     */
+    function createOr() {
+        include_once 'phing/tasks/system/condition/OrCondition.php';
+        $num = array_push($this->conditions, new OrCondition());
+        return $this->conditions[$num-1];        
+    }
+
+    /**
+     * @return EqualsCondition
+     */
+    function createEquals() {
+        include_once 'phing/tasks/system/condition/EqualsCondition.php';  
+        $num = array_push($this->conditions, new EqualsCondition());
+        return $this->conditions[$num-1];
+    }
+
+    /**
+     * @return OsCondition
+     */
+    function createOs() {
+        include_once 'phing/tasks/system/condition/OsCondition.php';
+        $num = array_push($this->conditions, new OsCondition());
+        return $this->conditions[$num-1];
+    }
+   
+    /**
+     * @return IsFalseCondition
+     */
+    function createIsFalse() {
+        include_once 'phing/tasks/system/condition/IsFalseCondition.php';
+        $num = array_push($this->conditions, new IsFalseCondition());
+        return $this->conditions[$num-1];
+    }
+   
+    /**
+     * @return IsTrueCondition
+     */
+    function createIsTrue() {
+        include_once 'phing/tasks/system/condition/IsTrueCondition.php';
+        $num = array_push($this->conditions, new IsTrueCondition());
+        return $this->conditions[$num-1];
+    }
+   
+    /**
+     * @return ContainsCondition
+     */
+    function createContains() {
+        include_once 'phing/tasks/system/condition/ContainsCondition.php';
+        $num = array_push($this->conditions, new ContainsCondition());
+        return $this->conditions[$num-1];
+    }
+   
+    /**
+     * @return IsSetCondition
+     */
+    function createIsSet() {
+        include_once 'phing/tasks/system/condition/IsSetCondition.php';
+        $num = array_push($this->conditions, new IsSetCondition());
+        return $this->conditions[$num-1];
+    }
+
+    /**
+     * @return ReferenceExistsCondition
+     */
+    function createReferenceExists() {
+        include_once 'phing/tasks/system/condition/ReferenceExistsCondition.php';
+        $num = array_push($this->conditions, new ReferenceExistsCondition());
+        return $this->conditions[$num-1];
+    }
+
+}
+
+/**
+ * "Inner" class for handling enumerations.
+ * Uses build-in PHP5 iterator support.
+ */
+class ConditionEnumeration implements Iterator {
+    
+    /** Current element number */
+    private $num = 0;
+    
+    /** "Outer" ConditionBase class. */
+    private $outer;
+
+    function __construct(ConditionBase $outer) {
+        $this->outer = $outer;
+    }
+    
+    public function valid() {
+        return $this->outer->countConditions() > $this->num;
+    }
+
+    function current() {
+        $o = $this->outer->conditions[$this->num];
+        if ($o instanceof ProjectComponent) {
+            $o->setProject($this->outer->getProject());
+        }
+        return $o;
+    }
+    
+    function next() {
+        $this->num++;
+    }
+    
+    function key() {
+        return $this->num;
+    }
+    
+    function rewind() {
+        $this->num = 0;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/ConditionBase.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/ContainsCondition.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/ContainsCondition.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/ContainsCondition.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ *  $Id: ContainsCondition.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/tasks/system/condition/Condition.php';
+
+/**
+ * Is one string part of another string?
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Stefan Bodewig <stefan.bodewig en epost.de> (Ant)
+ * @version $Revision: 1.3 $
+ * @package phing.tasks.system.condition
+ */
+class ContainsCondition implements Condition {
+
+    private $string;
+    private $subString;
+    private $caseSensitive = true;
+
+    /**
+     * The string to search in.
+     * @param string $a1
+     */
+    public function setString($a1) {
+        $this->string = $a1;
+    }
+
+    /**
+     * The string to search for.
+     * @param string $a2
+     */
+    public function setSubstring($a2) {
+        $this->subString = $a2;
+    }
+
+    /**
+     * Whether to search ignoring case or not.
+     */
+    public function setCaseSensitive($b) {
+        $this->caseSensitive = (boolean) $b;
+    }
+
+    /** 
+     * Check whether string contains substring.
+     * @throws BuildException
+     */
+    public function evaluate()  {
+        if ($this->string === null || $this->subString === null) {
+            throw new BuildException("both string and substring are required "
+                                     . "in contains");
+        }
+
+        return $this->caseSensitive 
+            ? strpos($this->string, $this->subString) !== false
+            : substr(strtolower($this->string), strtolower($this->subString)) !== false;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/ContainsCondition.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/EqualsCondition.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/EqualsCondition.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/EqualsCondition.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,78 @@
+<?php
+/*
+ *  $Id: EqualsCondition.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/system/condition/Condition.php';
+
+/**
+ *  A simple string comparator.  Compares two strings for eqiality in a
+ *  binary safe manner. Implements the condition interface specification.
+ *
+ *  @author    Andreas Aderhold <andi en binarycloud.com>
+ *  @copyright © 2001,2002 THYRELL. All rights reserved
+ *  @version   $Revision: 1.7 $ $Date$
+ *  @access    public
+ *  @package   phing.tasks.system.condition
+ */
+class EqualsCondition implements Condition {
+
+    private $arg1;
+    private $arg2;
+    private $trim = false;
+    private $caseSensitive = true;
+    
+    public function setArg1($a1) {
+        $this->arg1 = $a1;
+    }
+
+    public function setArg2($a2) {
+        $this->arg2 = $a2;
+    }
+
+    /**
+     * Should we want to trim the arguments before comparing them?
+     * @param boolean $b
+     */
+    public function setTrim($b) {
+        $this->trim = (boolean) $b;
+    }
+
+    /**
+     * Should the comparison be case sensitive?
+     * @param boolean $b
+     */
+    public function setCaseSensitive($b) {
+        $this->caseSensitive = (boolean) $b;
+    } 
+    
+    public function evaluate() {
+        if ($this->arg1 === null || $this->arg2 === null) {
+            throw new BuildException("Both arg1 and arg2 are required in equals.");
+        }
+        
+        if ($this->trim) {
+            $this->arg1 = trim($this->arg1);
+            $this->arg2 = trim($this->arg2);
+        }
+        
+        //print("[comparison] Comparing '".$this->arg1."' and '".$this->arg2."'\n");
+        return $this->caseSensitive ? $this->arg1 === $this->arg2 : strtolower($this->arg1) === strtolower($this->arg2);
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/EqualsCondition.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/IsFalseCondition.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/IsFalseCondition.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/IsFalseCondition.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,60 @@
+<?php
+/*
+ *  $Id: IsFalseCondition.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/ProjectComponent.php';
+require_once 'phing/tasks/system/condition/Condition.php';
+
+/**
+ * Condition that tests whether a given string evals to false.
+ * 
+ * @author Hans Lellelid (Phing)
+ * @author Steve Loughran (Ant)
+ * @version $Revision: 1.4 $
+ * @package phing.tasks.system.condition
+ */
+class IsFalseCondition extends ProjectComponent implements Condition {
+    
+    /**  
+     * what we eval
+     */ 
+    private $value;
+
+    /**
+     * Set the value to be tested.
+     * @param boolean $value
+     */ 
+    public function setValue($value) {
+        $this->value = $value;
+    }
+
+    /**
+     * return the inverted value;
+     * @throws BuildException if someone forgot to spec a value
+     */ 
+    public function evaluate() {
+        if ($this->value === null) {
+            throw new BuildException("Nothing to test for falsehood");
+        }
+        return !$this->value;
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/IsFalseCondition.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/IsSetCondition.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/IsSetCondition.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/IsSetCondition.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,53 @@
+<?php
+/*
+ *  $Id: IsSetCondition.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/ProjectComponent.php';
+require_once 'phing/tasks/system/condition/Condition.php';
+
+/**
+ * Condition that tests whether a given property has been set.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Stefan Bodewig <stefan.bodewig en epost.de> (Ant)
+ * @version $Revision: 1.4 $
+ * @package phing.tasks.system.condition
+ */
+class IsSetCondition extends ProjectComponent implements Condition {
+    
+    private $property;
+
+    public function setProperty($p) {
+        $this->property = $p;
+    }
+
+    /**
+     * Check whether property is set.
+     * @throws BuildException
+     */
+    public function evaluate()  {
+        if ($this->property === null) {
+            throw new BuildException("No property specified for isset "
+                                     . "condition");
+        }        
+        return $this->project->getProperty($this->property) !== null;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/IsSetCondition.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/IsTrueCondition.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/IsTrueCondition.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/IsTrueCondition.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,59 @@
+<?php
+/*
+ *  $Id: IsTrueCondition.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/ProjectComponent.php';
+require_once 'phing/tasks/system/condition/Condition.php';
+
+/**
+ * Condition that tests whether a given string evals to true.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Steve Loughran (Ant)
+ * @package phing.tasks.system.condition
+ */
+class IsTrueCondition extends ProjectComponent implements Condition {
+
+    /**  
+     * what we eval
+     */ 
+    private $value;
+
+    /**
+     * Set the value to be tested.
+     * @param boolean $value
+     */ 
+    public function setValue($value) {
+        $this->value = $value;
+    }
+
+    /**
+     * return the inverted value;
+     * @throws BuildException if someone forgot to spec a value
+     */ 
+    public function evaluate() {
+        if ($this->value === null) {
+            throw new BuildException("Nothing to test for falsehood");
+        }
+        return $this->value;
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/IsTrueCondition.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/NotCondition.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/NotCondition.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/NotCondition.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,48 @@
+<?php
+/*
+ *  $Id: NotCondition.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/system/condition/ConditionBase.php';
+
+/**
+ *  <not> condition.
+ *
+ *  Evaluates to true if the single condition nested into it is false
+ *  and vice versa.
+ *
+ *  @author    Andreas Aderhold <andi en binarycloud.com>
+ *  @copyright © 2001,2002 THYRELL. All rights reserved
+ *  @version   $Revision: 1.6 $ $Date$
+ *  @access    public
+ *  @package   phing.tasks.system.condition
+ */
+class NotCondition extends ConditionBase implements Condition {
+
+    function evaluate() {
+        if ($this->countConditions() > 1) {
+            throw new BuildException("You must not nest more than one condition into <not>");
+        }
+        if ($this->countConditions() < 1) {
+            throw new BuildException("You must nest a condition into <not>");
+        }
+        $conds = $this->getIterator();
+        return !$conds->current()->evaluate();
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/NotCondition.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/OrCondition.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/OrCondition.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/OrCondition.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,46 @@
+<?php
+/*
+ *  $Id: OrCondition.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/system/condition/ConditionBase.php';
+
+/**
+ *  <or> condition container.
+ *
+ *  Iterates over all conditions and returns true as soon as one
+ *  evaluates to true.
+ *
+ *  @author    Andreas Aderhold <andi en binarycloud.com>
+ *  @copyright  2001,2002 THYRELL. All rights reserved
+ *  @version   $Revision: 1.8 $ $Date$
+ *  @access    public
+ *  @package   phing.tasks.system.condition
+ */
+class OrCondition extends ConditionBase implements Condition {
+
+    function evaluate() {
+        foreach($this as $c) { // ConditionBase implements IteratorAggregator
+              if ($c->evaluate()) {
+                return true;
+            }
+        }
+        return false;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/OrCondition.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/OsCondition.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/OsCondition.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/OsCondition.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,63 @@
+<?php
+/*
+ *  $Id: OsCondition.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/system/condition/ConditionBase.php';
+
+/**
+ *  Condition that tests the OS type.
+ *
+ *  @author    Andreas Aderhold <andi en binarycloud.com>
+ *  @copyright © 2001,2002 THYRELL. All rights reserved
+ *  @version   $Revision: 1.8 $ $Date$
+ *  @access    public
+ *  @package   phing.tasks.system.condition
+ */
+class OsCondition implements Condition {
+
+    private $family;
+
+    function setFamily($f) {
+        $this->family = strtolower($f);
+    }
+
+    function evaluate() {
+        $osName = strtolower(Phing::getProperty("os.name"));
+		
+        if ($this->family !== null) {
+            if ($this->family === "windows") {
+                return StringHelper::startsWith("win", $osName);
+            } elseif ($this->family === "mac") {
+                return (strpos($osName, "mac") !== false || strpos($osName, "darwin") !== false);
+            } elseif ($this->family === ("unix")) {
+				return (
+					StringHelper::endsWith("ix", $osName) ||
+					StringHelper::endsWith("ux", $osName) ||
+					StringHelper::endsWith("bsd", $osName) ||
+					StringHelper::startsWith("sunos", $osName) ||
+					StringHelper::startsWith("darwin", $osName)
+				);
+            }
+            throw new BuildException("Don't know how to detect os family '" . $this->family . "'");
+        }
+        return false;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/OsCondition.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/ReferenceExistsCondition.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/ReferenceExistsCondition.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/ReferenceExistsCondition.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,52 @@
+<?php
+/*
+ *  $Id: ReferenceExistsCondition.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/ProjectComponent.php'; require_once 'phing/tasks/system/condition/Condition.php';
+
+/**
+ * Condition that tests whether a given reference exists.
+ *
+ * @author Matthias Pigulla <mp en webfactory.de> (Phing)
+ * @version $Revision: 1.1 $
+ * @package phing.tasks.system.condition  */
+class ReferenceExistsCondition extends ProjectComponent implements Condition {
+    
+    private $refid;
+
+    public function setRef($id) {
+      $this->refid = (string) $id;
+    }
+
+    /**
+     * Check whether the reference exists.
+     * @throws BuildException
+     */
+    public function evaluate()  {
+        if ($this->refid === null) {
+            throw new BuildException("No ref attribute specified for reference-exists "
+                                     . "condition");
+        }        
+        $refs = $this->project->getReferences();
+        return isset($refs[$this->refid]);
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/tasks/system/condition/ReferenceExistsCondition.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/AbstractFileSet.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/AbstractFileSet.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/AbstractFileSet.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,570 @@
+<?php
+/*
+ *  $Id: AbstractFileSet.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+include_once 'phing/system/io/PhingFile.php';
+include_once 'phing/types/DataType.php';
+include_once 'phing/types/PatternSet.php';
+include_once 'phing/types/selectors/BaseSelector.php';
+include_once 'phing/types/selectors/SelectorContainer.php';
+include_once 'phing/types/selectors/BaseSelectorContainer.php';
+
+// Load all of the selectors (not really necessary but
+// helps reveal parse errors right away)
+
+include_once 'phing/types/selectors/AndSelector.php';
+include_once 'phing/types/selectors/ContainsSelector.php';
+include_once 'phing/types/selectors/ContainsRegexpSelector.php';
+include_once 'phing/types/selectors/DateSelector.php';
+include_once 'phing/types/selectors/DependSelector.php';
+include_once 'phing/types/selectors/DepthSelector.php';
+include_once 'phing/types/selectors/ExtendSelector.php';
+include_once 'phing/types/selectors/FilenameSelector.php';
+include_once 'phing/types/selectors/MajoritySelector.php';
+include_once 'phing/types/selectors/NoneSelector.php';
+include_once 'phing/types/selectors/NotSelector.php';
+include_once 'phing/types/selectors/OrSelector.php';
+include_once 'phing/types/selectors/PresentSelector.php';
+include_once 'phing/types/selectors/SizeSelector.php';
+include_once 'phing/types/selectors/TypeSelector.php';
+
+include_once 'phing/util/DirectoryScanner.php';
+
+/**
+ * The FileSet class provides methods and properties for accessing
+ * and managing filesets. It extends ProjectComponent and thus inherits
+ * all methods and properties (not explicitly declared). See ProjectComponent
+ * for further detail.
+ *
+ * TODO:
+ *   - merge this with patternsets: FileSet extends PatternSet !!!
+ *     requires additional mods to the parsing algo
+ *         [HL] .... not sure if that really makes so much sense.  I think
+ *            that perhaps they should use common utility class if there really
+ *            is that much shared functionality
+ *
+ * @author    Andreas Aderhold <andi en binarycloud.com>
+ * @author    Hans Lellelid <hans en xmpl.org>
+ * @version    $Revision: 1.15 $ $Date$
+ * @see        ProjectComponent
+ * @package    phing.types
+ */
+class AbstractFileSet extends DataType implements SelectorContainer {
+    
+    // These vars are public for cloning purposes
+    
+    /**
+     * @var boolean
+     */
+    public $useDefaultExcludes = true;
+    
+    /**
+     * @var PatternSet
+     */
+    public $defaultPatterns;
+    
+    public $additionalPatterns = array();
+    public $dir;
+    public $isCaseSensitive = true;    
+    public $selectors = array();
+    
+    function __construct($fileset = null) {
+        if ($fileset !== null && ($fileset instanceof FileSet)) {
+            $this->dir = $fileset->dir;
+            $this->defaultPatterns = $fileset->defaultPatterns;
+            $this->additionalPatterns = $fileset->additionalPatterns;
+            $this->useDefaultExcludes = $fileset->useDefaultExcludes;
+            $this->isCaseSensitive = $fileset->isCaseSensitive;
+            $this->selectors = $fileset->selectors;
+        }
+        $this->defaultPatterns = new PatternSet();
+    }
+
+
+    /**
+    * Makes this instance in effect a reference to another PatternSet
+    * instance.
+    * You must not set another attribute or nest elements inside
+    * this element if you make it a reference.
+    */
+    function setRefid(Reference $r) {
+        if ((isset($this->dir) && !is_null($this->dir)) || $this->defaultPatterns->hasPatterns()) {
+            throw $this->tooManyAttributes();
+        }
+        if (!empty($this->additionalPatterns)) {
+            throw $this->noChildrenAllowed();
+        }
+        if (!empty($this->selectors)) {
+            throw $this->noChildrenAllowed();
+        }
+        parent::setRefid($r);
+    }
+
+
+    function setDir($dir) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        if ($dir instanceof PhingFile) {
+            $dir = $dir->getPath();
+        }
+        $this->dir = new PhingFile((string) $dir);
+    }
+
+
+    function getDir(Project $p) {
+        if ($this->isReference()) {
+            return $this->getRef($p)->getDir($p);
+        }
+        return $this->dir;
+    }
+
+
+    function createPatternSet() {
+        if ($this->isReference()) {
+            throw $this->noChildrenAllowed();
+        }
+        $num = array_push($this->additionalPatterns, new PatternSet());
+        return $this->additionalPatterns[$num-1];
+    }
+
+    /**
+    * add a name entry on the include list
+    */
+    function createInclude() {
+        if ($this->isReference()) {
+            throw $this->noChildrenAllowed();
+        }
+        return $this->defaultPatterns->createInclude();
+    }
+
+    /**
+     * add a name entry on the include files list
+     */
+    function createIncludesFile() {
+        if ($this->isReference()) {
+            throw $this->noChildrenAllowed();
+        }
+        return $this->defaultPatterns->createIncludesFile();
+    }
+
+    /**
+     * add a name entry on the exclude list
+     */
+    function createExclude() {
+        if ($this->isReference()) {
+            throw $this->noChildrenAllowed();
+        }
+        return $this->defaultPatterns->createExclude();
+    }
+
+    /**
+     * add a name entry on the include files list
+     */
+    function createExcludesFile() {
+        if ($this->isReference()) {
+            throw $this->noChildrenAllowed();
+            return;
+        }
+        return $this->defaultPatterns->createExcludesFile();
+    }
+
+    /**
+     * Sets the set of include patterns. Patterns may be separated by a comma
+     * or a space.
+     */
+    function setIncludes($includes) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        $this->defaultPatterns->setIncludes($includes);
+    }
+
+    /**
+     * Sets the set of exclude patterns. Patterns may be separated by a comma
+     * or a space.
+     */
+    function setExcludes($excludes) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        $this->defaultPatterns->setExcludes($excludes);
+    }
+
+    /**
+     * Sets the name of the file containing the includes patterns.
+     *
+     * @param $incl The file to fetch the include patterns from.
+     * @throws BE
+     */
+    function setIncludesfile($incl) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        $this->defaultPatterns->setIncludesfile($incl);
+    }
+
+    /**
+     * Sets the name of the file containing the includes patterns.
+     *
+     * @param $excl The file to fetch the exclude patterns from.
+     * @throws BE
+     */
+    function setExcludesfile($excl) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        $this->defaultPatterns->setExcludesfile($excl);
+    }
+
+    /**
+     * Sets whether default exclusions should be used or not.
+     *
+     * @param $useDefaultExcludes "true"|"on"|"yes" when default exclusions
+     *                           should be used, "false"|"off"|"no" when they
+     *                           shouldn't be used.
+     */
+    function setDefaultexcludes($useDefaultExcludes) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        $this->useDefaultExcludes = $useDefaultExcludes;
+    }
+
+    /**
+     * Sets case sensitivity of the file system
+     */
+    function setCaseSensitive($isCaseSensitive) {
+        $this->isCaseSensitive = $isCaseSensitive;
+    }
+
+    /** returns a reference to the dirscanner object belonging to this fileset */
+    function getDirectoryScanner(Project $p) {
+        if ($this->isReference()) {
+            $o = $this->getRef($p);
+            return $o->getDirectoryScanner($p);
+        }
+
+        if ($this->dir === null) {
+            throw new BuildException("No directory specified for fileset.");
+        }
+        if (!$this->dir->exists()) {
+            throw new BuildException("Directory ".$this->dir->getAbsolutePath()." not found.");
+        }
+        if (!$this->dir->isDirectory()) {
+            throw new BuildException($this->dir->getAbsolutePath()." is not a directory.");
+        }
+        $ds = new DirectoryScanner();
+        $this->setupDirectoryScanner($ds, $p);
+        $ds->scan();
+        return $ds;
+    }
+
+    /** feed dirscanner with infos defined by this fileset */
+    protected function setupDirectoryScanner(DirectoryScanner $ds, Project $p) {
+        if ($ds === null) {
+            throw new Exception("DirectoryScanner cannot be null");
+        }
+        // FIXME - pass dir directly wehn dirscanner supports File
+        $ds->setBasedir($this->dir->getPath());
+        
+        foreach($this->additionalPatterns as $addPattern) {
+            $this->defaultPatterns->append($addPattern, $p);
+        }              
+
+        $ds->setIncludes($this->defaultPatterns->getIncludePatterns($p));
+        $ds->setExcludes($this->defaultPatterns->getExcludePatterns($p));
+
+        $p->log("FileSet: Setup file scanner in dir " . $this->dir->__toString() . " with " . $this->defaultPatterns->toString(), PROJECT_MSG_DEBUG);
+        
+        if ($ds instanceof SelectorScanner) {
+            $ds->setSelectors($this->getSelectors($p));
+        }
+        
+        if ($this->useDefaultExcludes) {
+            $ds->addDefaultExcludes();
+        }
+        $ds->setCaseSensitive($this->isCaseSensitive);
+    }
+
+
+    /**
+     * Performs the check for circular references and returns the
+     * referenced FileSet.
+     */
+    function getRef(Project $p) {
+        if (!$this->checked) {
+            $stk = array();
+            array_push($stk, $this);
+            $this->dieOnCircularReference($stk, $p);            
+        }
+
+        $o = $this->ref->getReferencedObject($p);
+        if (!($o instanceof FileSet)) {
+            $msg = $this->ref->getRefId()." doesn't denote a fileset";
+            throw new BuildException($msg);
+        } else {
+            return $o;
+        }
+    }
+    
+    // SelectorContainer methods
+
+    /**
+     * Indicates whether there are any selectors here.
+     *
+     * @return boolean Whether any selectors are in this container
+     */
+    public function hasSelectors() {
+        if ($this->isReference() && $this->getProject() !== null) {
+            return $this->getRef($this->getProject())->hasSelectors();
+        }
+        return !empty($this->selectors);
+    }
+
+    /**
+     * Indicates whether there are any patterns here.
+     *
+     * @return boolean Whether any patterns are in this container.
+     */
+    public function hasPatterns() {
+    
+        if ($this->isReference() && $this->getProject() !== null) {
+            return $this->getRef($this->getProject())->hasPatterns();            
+        }
+
+        if ($this->defaultPatterns->hasPatterns($this->getProject())) {
+            return true;
+        }
+
+        for($i=0,$size=count($this->additionalPatterns); $i < $size; $i++) {
+            $ps = $this->additionalPatterns[$i];
+            if ($ps->hasPatterns($this->getProject())) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+    
+    /**
+     * Gives the count of the number of selectors in this container
+     *
+     * @return int The number of selectors in this container
+     */
+    public function selectorCount() {
+        if ($this->isReference() && $this->getProject() !== null) {
+            try {
+                return $this->getRef($this->getProject())->selectorCount();
+            } catch (Exception $e) {
+                throw $e;
+            }
+        }
+        return count($this->selectors);
+    }
+
+    /**
+     * Returns the set of selectors as an array.
+     *
+     * @return an array of selectors in this container
+     */
+    public function getSelectors(Project $p) {
+        if ($this->isReference()) {
+            return $this->getRef($p)->getSelectors($p);            
+        } else {
+            // *copy* selectors
+            $result = array();
+            for($i=0,$size=count($this->selectors); $i < $size; $i++) {
+                $result[] = clone $this->selectors[$i];
+            }
+            return $result;
+        }
+    }
+
+    /**
+     * Returns an array for accessing the set of selectors.
+     *
+     * @return array The array of selectors
+     */
+    public function selectorElements() {
+        if ($this->isReference() && $this->getProject() !== null) {
+            return $this->getRef($this->getProject())->selectorElements();            
+        }
+        return $this->selectors;
+    }
+
+    /**
+     * Add a new selector into this container.
+     *
+     * @param selector the new selector to add
+     */
+    public function appendSelector(FileSelector $selector) {
+        if ($this->isReference()) {
+            throw $this->noChildrenAllowed();
+        }
+        $this->selectors[] = $selector;
+    }    
+
+    /* Methods below all add specific selectors */
+
+    /**
+     * add a "Select" selector entry on the selector list
+     */
+    public function createSelector() {
+        $o = new SelectSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add an "And" selector entry on the selector list
+     */
+    public function createAnd() {
+        $o = new AndSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add an "Or" selector entry on the selector list
+     */
+    public function createOr() {
+        $o = new OrSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a "Not" selector entry on the selector list
+     */
+    public function createNot() {
+        $o = new NotSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a "None" selector entry on the selector list
+     */
+    public function createNone() {
+        $o = new NoneSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a majority selector entry on the selector list
+     */
+    public function createMajority() {
+        $o = new MajoritySelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a selector date entry on the selector list
+     */
+    public function createDate() {
+        $o = new DateSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a selector size entry on the selector list
+     */
+    public function createSize() {
+        $o = new SizeSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a selector filename entry on the selector list
+     */
+    public function createFilename() {
+        $o = new FilenameSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add an extended selector entry on the selector list
+     */
+    public function createCustom() {
+        $o = new ExtendSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a contains selector entry on the selector list
+     */
+    public function createContains() {
+        $o = new ContainsSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a contains selector entry on the selector list
+     */
+    public function createContainsRegexp() {
+        $o = new ContainsRegexpSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a present selector entry on the selector list
+     */
+    public function createPresent() {
+        $o = new PresentSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a depth selector entry on the selector list
+     */
+    public function createDepth() {
+        $o = new DepthSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a depends selector entry on the selector list
+     */
+    public function createDepend() {        
+        $o = new DependSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+    
+    /**
+     * add a type selector entry on the selector list
+     */
+    public function createType() {
+        $o = new TypeSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/AbstractFileSet.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Commandline.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Commandline.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Commandline.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,467 @@
+<?php
+/*
+ *  $Id: Commandline.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+
+/**
+ * Commandline objects help handling command lines specifying processes to
+ * execute.
+ *
+ * The class can be used to define a command line as nested elements or as a
+ * helper to define a command line by an application.
+ * <p>
+ * <code>
+ * &lt;someelement&gt;<br>
+ * &nbsp;&nbsp;&lt;acommandline executable="/executable/to/run"&gt;<br>
+ * &nbsp;&nbsp;&nbsp;&nbsp;&lt;argument value="argument 1" /&gt;<br>
+ * &nbsp;&nbsp;&nbsp;&nbsp;&lt;argument line="argument_1 argument_2 argument_3" /&gt;<br>
+ * &nbsp;&nbsp;&nbsp;&nbsp;&lt;argument value="argument 4" /&gt;<br>
+ * &nbsp;&nbsp;&lt;/acommandline&gt;<br>
+ * &lt;/someelement&gt;<br>
+ * </code>
+ * The element <code>someelement</code> must provide a method
+ * <code>createAcommandline</code> which returns an instance of this class.
+ *
+ * @author thomas.haas en softwired-inc.com
+ * @author <a href="mailto:stefan.bodewig en epost.de">Stefan Bodewig</a>
+ */
+class Commandline {
+
+    /**
+     * @var array CommandlineArguments[]
+     */
+    public $arguments = array(); // public so "inner" class can access
+    
+    /**
+     * Full path (if not on %PATH% env var) to executable program.
+     * @var string
+     */
+    public $executable; // public so "inner" class can access
+
+    const DISCLAIMER = "The ' characters around the executable and arguments are not part of the command.";
+
+    public function __construct($to_process = null) {
+        if ($to_process !== null) {                 
+            $tmp = $this->translateCommandline($to_process);
+            if ($tmp) {
+                $this->setExecutable(array_shift($tmp)); // removes first el
+                foreach($tmp as $arg) { // iterate through remaining elements
+                    $this->createArgument()->setValue($arg);
+                }
+            }
+        }    
+    }
+
+
+    /**
+     * Creates an argument object and adds it to our list of args.
+     *
+     * <p>Each commandline object has at most one instance of the
+     * argument class.</p>
+     *
+     * @param boolean $insertAtStart if true, the argument is inserted at the
+     * beginning of the list of args, otherwise it is appended.
+     * @return CommandlineArgument
+     */
+    public function createArgument($insertAtStart = false) {
+        $argument = new CommandlineArgument($this);
+        if ($insertAtStart) {
+            array_unshift($this->arguments, $argument);
+        } else {
+            array_push($this->arguments, $argument);
+        }
+        return $argument;
+    }
+
+    /**
+     * Sets the executable to run.
+     */
+    public function setExecutable($executable) {
+        if (!$executable) {
+            return;
+        }
+        $this->executable = $executable;
+        $this->executable = strtr($this->executable, '/', DIRECTORY_SEPARATOR);
+        $this->executable = strtr($this->executable, '\\', DIRECTORY_SEPARATOR);
+    }
+
+    public function getExecutable() {
+        return $this->executable;
+    }
+
+    public function addArguments($line) {
+        foreach($line as $arg) {
+            $this->createArgument()->setValue($arg);
+        }
+    }
+
+    /**
+     * Returns the executable and all defined arguments.
+     * @return array
+     */
+    public function getCommandline() {
+        $args = $this->getArguments();
+        if ($this->executable === null) {
+            return $args;
+        }
+        return array_merge(array($this->executable), $args);
+    }
+
+
+    /**
+     * Returns all arguments defined by <code>addLine</code>,
+     * <code>addValue</code> or the argument object.
+     */
+    public function getArguments() {
+        $result = array();
+        foreach($this->arguments as $arg) {
+            $parts = $arg->getParts();
+            if ($parts !== null) {                           
+                foreach($parts as $part) {
+                    $result[] = $part;
+                }
+            }
+        }
+        return $result;
+    }
+
+    public function __toString() {
+        return self::toString($this->getCommandline());
+    }
+
+    /**
+     * Put quotes around the given String if necessary.
+     *
+     * <p>If the argument doesn't include spaces or quotes, return it
+     * as is. If it contains double quotes, use single quotes - else
+     * surround the argument by double quotes.</p>
+     *
+     * @exception BuildException if the argument contains both, single
+     *                           and double quotes.
+     */
+    public static function quoteArgument($argument) {
+        if (strpos($argument, "\"") !== false) {
+            if (strpos($argument, "'") !== false) {
+                throw new BuildException("Can't handle single and double quotes in same argument");
+            } else {
+                return escapeshellarg($argument);
+            }
+        } elseif (strpos($argument, "'") !== false || strpos($argument, " ") !== false) {
+            return escapeshellarg($argument);
+            //return '\"' . $argument . '\"';
+        } else {
+            return $argument;
+        }
+    }
+        
+    /**
+     * Quotes the parts of the given array in way that makes them
+     * usable as command line arguments.
+     */
+    public static function toString($lines) {
+        // empty path return empty string
+        if (!$lines) {
+            return "";
+        }
+
+        // path containing one or more elements
+        $result = "";
+        for ($i = 0, $len=count($lines); $i < $len; $i++) {
+            if ($i > 0) {
+                $result .= ' ';
+            }
+            $result .= self::quoteArgument($lines[$i]);
+        }
+        return $result;
+    }
+    
+    /**
+     *
+     * @param string $to_process
+     * @return array
+     */
+    public static function translateCommandline($to_process) {
+        
+        if (!$to_process) {
+            return array();
+        }
+            
+        // parse with a simple finite state machine
+
+        $normal = 0;
+        $inQuote = 1;
+        $inDoubleQuote = 2;
+        
+        $state = $normal;
+        $args = array();
+        $current = "";
+        $lastTokenHasBeenQuoted = false;
+        
+        $tok = strtok($to_process, "");
+        $tokens = preg_split('/(["\' ])/', $to_process, -1, PREG_SPLIT_DELIM_CAPTURE);
+        while(($nextTok = array_shift($tokens)) !== null) {
+            switch ($state) {
+            case $inQuote:
+                if ("'" == $nextTok) {
+                    $lastTokenHasBeenQuoted = true;
+                    $state = $normal;
+                } else {
+                    $current .= $nextTok;
+                }
+                break;
+            case $inDoubleQuote:
+                if ("\"" == $nextTok) {
+                    $lastTokenHasBeenQuoted = true;
+                    $state = $normal;
+                } else {
+                    $current .= $nextTok;
+                }
+                break;
+            default:
+                if ("'" == $nextTok) {
+                    $state = $inQuote;
+                } elseif ("\"" == $nextTok) {
+                    $state = $inDoubleQuote;
+                } elseif (" " == $nextTok) {
+                    if ($lastTokenHasBeenQuoted || strlen($current) != 0) {
+                        $args[] = $current;
+                        $current = "";
+                    }
+                } else {
+                    $current .= $nextTok;
+                }
+                $lastTokenHasBeenQuoted = false;
+                break;
+            }
+        }
+
+        if ($lastTokenHasBeenQuoted || strlen($current) != 0) {
+            $args[] = $current;
+        }
+
+        if ($state == $inQuote || $state == $inDoubleQuote) {
+            throw new BuildException("unbalanced quotes in " . $to_process);
+        }
+
+        return $args;
+    }
+
+    /**
+     * @return int Number of components in current commandline.
+     */
+    public function size() {
+        return count($this->getCommandline());
+    }
+
+    public function __copy() {
+        $c = new Commandline();
+        $c->setExecutable($this->executable);
+        $c->addArguments($this->getArguments());
+        return $c;
+    }
+
+    /**
+     * Clear out the whole command line.  */
+    public function clear() {
+        $this->executable = null;
+        $this->arguments->removeAllElements();
+    }
+
+    /**
+     * Clear out the arguments but leave the executable in place for
+     * another operation.
+     */
+    public function clearArgs() {
+        $this->arguments = array();
+    }
+
+    /**
+     * Return a marker.
+     *
+     * <p>This marker can be used to locate a position on the
+     * commandline - to insert something for example - when all
+     * parameters have been set.</p>
+     * @return CommandlineMarker
+     */
+    public function createMarker() {
+        return new CommandlineMarker($this, count($this->arguments));
+    }
+
+    /**
+     * Returns a String that describes the command and arguments
+     * suitable for verbose output before a call to
+     * <code>Runtime.exec(String[])<code>.
+     *
+     * <p>This method assumes that the first entry in the array is the
+     * executable to run.</p>
+     * @param array $args CommandlineArgument[] to use
+     * @return string
+     */
+    public function describeCommand($args = null) {
+       
+        if ($args === null) {
+            $args = $this->getCommandline();
+        }
+           
+        if (!$args) {
+            return "";
+        }
+        
+        $buf = "Executing '";
+        $buf .= $args[0];
+        $buf .= "'";
+        if (count($args) > 0) {
+            $buf .= " with ";
+            $buf .= $this->describeArguments($args, 1);
+        } else {
+            $buf .= self::DISCLAIMER;
+        }
+        return $buf;
+    }
+
+    /**
+     * Returns a String that describes the arguments suitable for
+     * verbose output before a call to
+     * <code>Runtime.exec(String[])<code>
+     * @param $args arguments to use (default is to use current class args)
+     * @param $offset ignore entries before this index
+     * @return string
+     */
+    protected function describeArguments($args = null, $offset = 0) {
+        if ($args === null) {
+            $args = $this->getArguments();
+        }                
+        
+        if ($args === null || count($args) <= $offset) {
+            return "";
+        }
+        
+        $buf = "argument";
+        if (count($args) > $offset) {
+            $buf .= "s";
+        }
+        $buf .= ":" . Phing::getProperty("line.separator");
+        for ($i = $offset, $alen=count($args); $i < $alen; $i++) {
+            $buf .= "'" . $args[$i] . "'" . Phing::getProperty("line.separator");
+        }
+        $buf .= self::DISCLAIMER;
+        return $buf;
+    }
+}
+
+
+/**
+ * "Inner" class used for nested xml command line definitions.
+ */
+class CommandlineArgument {
+
+    private $parts = array();
+    private $outer;
+    
+    public function __construct(Commandline $outer) {
+        $this->outer = $outer;
+    }
+    
+    /**
+     * Sets a single commandline argument.
+     *
+     * @param string $value a single commandline argument.
+     */
+    public function setValue($value) {
+        $this->parts = array($value);
+    }
+
+    /**
+     * Line to split into several commandline arguments.
+     *
+     * @param line line to split into several commandline arguments
+     */
+    public function setLine($line) {
+        if ($line === null) {
+            return;
+        }
+        $this->parts = $this->outer->translateCommandline($line);
+    }
+
+    /**
+     * Sets a single commandline argument and treats it like a
+     * PATH - ensures the right separator for the local platform
+     * is used.
+     *
+     * @param value a single commandline argument.
+     */
+    public function setPath($value) {
+        $this->parts = array( (string) $value );
+    }
+
+    /**
+     * Sets a single commandline argument to the absolute filename
+     * of the given file.
+     *
+     * @param value a single commandline argument.
+     */
+    public function setFile(PhingFile $value) {
+        $this->parts = array($value->getAbsolutePath());
+    }
+
+    /**
+     * Returns the parts this Argument consists of.
+     * @return array string[]
+     */
+    public function getParts() {
+        return $this->parts;
+    }
+}
+
+/**
+ * Class to keep track of the position of an Argument.
+ */
+// <p>This class is there to support the srcfile and targetfile
+// elements of &lt;execon&gt; and &lt;transform&gt; - don't know
+// whether there might be additional use cases.</p> --SB
+class CommandlineMarker {
+
+    private $position;
+    private $realPos = -1;
+    private $outer;
+    
+    public function __construct(Comandline $outer, $position) {
+        $this->outer = $outer;
+        $this->position = $position;
+    }
+
+    /**
+     * Return the number of arguments that preceeded this marker.
+     *
+     * <p>The name of the executable - if set - is counted as the
+     * very first argument.</p>
+     */
+    public function getPosition() {
+        if ($this->realPos == -1) {
+            $realPos = ($this->outer->executable === null ? 0 : 1);
+            for ($i = 0; $i < $position; $i++) {
+                $arg = $this->arguments[$i];
+                $realPos += count($arg->getParts());
+            }
+        }
+        return $this->realPos;
+    }
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Commandline.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/DataType.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/DataType.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/DataType.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,182 @@
+<?php
+/*
+ *  $Id: DataType.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+require_once 'phing/ProjectComponent.php';
+include_once 'phing/BuildException.php';
+
+/**
+ * Base class for those classes that can appear inside the build file
+ * as stand alone data types.
+ *
+ * This class handles the common description attribute and provides
+ * a default implementation for reference handling and checking for
+ * circular references that is appropriate for types that can not be
+ * nested inside elements of the same type (i.e. patternset but not path)
+ *
+ * @package   phing.types
+ */
+class DataType extends ProjectComponent {
+
+    /** The descriptin the user has set. */
+    public $description = null;
+
+    /** Value to the refid attribute. Type of Reference*/
+    public $ref = null;
+
+    /**
+     * Are we sure we don't hold circular references?
+     *
+     * Subclasses are responsible for setting this value to false
+     * if we'd need to investigate this condition (usually because a
+     * child element has been added that is a subclass of DataType).
+     * @var boolean
+     */
+    protected $checked = true;
+  
+    /**
+     * Sets a description of the current data type. It will be useful
+     * in commenting what we are doing.
+     */
+    function setDescription($desc) {
+        $this->description = (string) $desc;
+    }
+
+    /** Return the description for the current data type. */
+    function getDescription() {
+        return $this->description;
+    }
+
+    /** Has the refid attribute of this element been set? */
+    function isReference() {
+        return ($this->ref !== null);
+    }
+
+    /**
+     * Set the value of the refid attribute.
+     *
+     * Subclasses may need to check whether any other attributes
+     * have been set as well or child elements have been created and
+     * thus override this method. if they do they must call parent::setRefid()
+	 * 
+	 * @param Reference $r
+	 * @return void
+     */
+    function setRefid(Reference $r) {
+        $this->ref = $r;
+        $this->checked = false;
+    }
+
+    /**
+     * Check to see whether any DataType we hold references to is
+     * included in the Stack (which holds all DataType instances that
+     * directly or indirectly reference this instance, including this
+     * instance itself).
+     *
+     * If one is included, throw a BuildException created by circularReference
+     *
+     * This implementation is appropriate only for a DataType that
+     * cannot hold other DataTypes as children.
+     *
+     * The general contract of this method is that it shouldn't do
+     * anything if checked is true and set it to true on exit.
+     */
+    function dieOnCircularReference(&$stk, Project $p) {
+        if ($this->checked || !$this->isReference()) {
+            return;
+        }
+
+        $o = $this->ref->getReferencedObject($p);
+
+        if ($o instanceof DataType) {
+            
+            // TESTME - make sure that in_array() works just as well here
+            //
+            // check if reference is in stack
+            //$contains = false;
+            //for ($i=0, $size=count($stk); $i < $size; $i++) {
+            //    if ($stk[$i] === $o) {
+            //        $contains = true;
+            //        break;
+            //    }
+            //}
+
+            if (in_array($o, $stk, true)) {
+                // throw build exception
+                throw $this->circularReference();
+            } else {
+                array_push($stk, $o);
+                $o->dieOnCircularReference($stk, $p);
+                array_pop($stk);
+            }
+        }
+        $this->checked = true;
+    }
+
+    /** Performs the check for circular references and returns the referenced object. */
+    function getCheckedRef($requiredClass, $dataTypeName) {
+    
+        if (!$this->checked) {
+            // should be in stack
+            $stk = array();
+            $stk[] = $this;
+            $this->dieOnCircularReference($stk, $this->getProject());            
+        }
+
+        $o = $this->ref->getReferencedObject($this->getProject());
+        if (!($o instanceof $requiredClass) ) {
+            throw new BuildException($this->ref->getRefId()." doesn't denote a " . $dataTypeName);
+        } else {
+            return $o;
+        }
+    }
+
+    /**
+     * Creates an exception that indicates that refid has to be the
+     * only attribute if it is set.
+     */
+    function tooManyAttributes() {
+        return new BuildException( "You must not specify more than one attribute when using refid" );
+    }
+
+    /**
+     * Creates an exception that indicates that this XML element must
+     * not have child elements if the refid attribute is set.
+     */
+    function noChildrenAllowed() {
+        return new BuildException("You must not specify nested elements when using refid");
+    }
+
+    /**
+     * Creates an exception that indicates the user has generated a
+     * loop of data types referencing each other.
+     */
+    function circularReference() {
+        return new BuildException("This data type contains a circular reference.");
+    }
+    
+    /**
+     * Template method being called when the data type has been 
+     * parsed completely.
+     * @return void
+     */
+    function parsingComplete() {}
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/DataType.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Description.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Description.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Description.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ *  $Id: Description.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ * Description is used to provide a project-wide description element
+ * (that is, a description that applies to a buildfile as a whole).
+ * If present, the &lt;description&gt; element is printed out before the
+ * target descriptions.
+ * 
+ * Description has no attributes, only text.  There can only be one
+ * project description per project.  A second description element will
+ * overwrite the first.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Craeg Strong <cstrong en arielpartners.com> (Ant)
+ * @package phing.types
+ */
+class Description extends DataType {
+
+    /**
+     * Adds descriptive text to the project.
+     *
+     * @return void
+     */
+    public function addText($text) {
+        $currentDescription = $this->project->getDescription();
+        if ($currentDescription === null) {
+            $this->project->setDescription($text);
+        } else {
+            $this->project->setDescription($currentDescription . $text);
+        }
+    }
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Description.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/DirSet.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/DirSet.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/DirSet.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * $Id: DirSet.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+include_once 'phing/types/AbstractFileSet.php';
+
+/**
+ * Subclass as hint for supporting tasks that the included directories
+ * instead of files should be used.
+ *
+ * @package phing.types
+ */
+class DirSet extends AbstractFileSet {
+    
+    public function __construct($dirset = null) {
+        parent::__construct($dirset);
+    }    
+
+    /**
+     * Return a DirSet that has the same basedir and same patternsets
+     * as this one.
+     */
+    public function __clone() {
+        if ($this->isReference()) {
+            return new DirSet($this->getRef($this->getProject()));
+        } else {
+            return new DirSet($this);
+        }
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/DirSet.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/FileList.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/FileList.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/FileList.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,223 @@
+<?php
+/*
+ *  $Id: FileList.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+require_once 'phing/types/DataType.php';
+include_once 'phing/system/io/PhingFile.php';
+
+/**
+ * FileList represents an explicitly named list of files. FileLists
+ * are useful when you want to capture a list of files regardless of
+ * whether they currently exist.
+ *
+ * <filelist 
+ *    id="docfiles" 
+ *   dir="${phing.docs.dir}"
+ *   files="chapters/Installation.html,chapters/Setup.html"/> 
+ *
+ * OR 
+ * 
+ * <filelist
+ *         dir="${doc.src.dir}"
+ *         listfile="${phing.docs.dir}/PhingGuide.book"/>
+ * 
+ * (or a mixture of files="" and listfile="" can be used)
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 1.10 $
+ * @package phing.types
+ */
+class FileList extends DataType {
+        
+    // public for "cloning" purposes
+    
+    /** Array containing all filenames. */
+    public $filenames = array();
+    
+    /** Base directory for this file list. */
+    public $dir;
+    
+    /** PhingFile that contains a list of files (one per line). */
+    public $listfile;
+    
+    /**
+     * Construct a new FileList.
+     * @param array $filelist;
+     */
+    function __construct($filelist = null) {
+        if ($filelist !== null) {
+            $this->dir       = $filelist->dir;
+            $this->filenames = $filelist->filenames;
+            $this->listfile = $filelist->listfile;
+        }
+    }
+
+    /**
+     * Makes this instance in effect a reference to another FileList
+     * instance.
+     */
+    function setRefid(Reference $r) {
+        if ($this->dir !== null || count($this->filenames) !== 0) {
+            throw $this->tooManyAttributes();
+        }
+        parent::setRefid($r);
+    }
+
+    /**
+     * Base directory for files in list.
+     * @param PhingFile $dir
+     */
+    function setDir(PhingFile $dir) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        if (!($dir instanceof PhingFile)) {
+            $dir = new PhingFile($dir);
+        }
+        $this->dir = $dir;
+    }
+    
+    /**
+     * Get the basedir for files in list.
+     * @return PhingFile
+     */
+    function getDir(Project $p) {
+        if ($this->isReference()) {
+            $ref = $this->getRef($p);
+            return $ref->getDir($p);
+        }
+        return $this->dir;
+    }
+    
+    /**
+     * Set the array of files in list.
+     * @param array $filenames
+     */
+    function setFiles($filenames) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        if (!empty($filenames)) {
+            $tok = strtok($filenames, ", \t\n\r");            
+            while ($tok !== false) {
+                $fname = trim($tok);
+                if ($fname !== "") {
+                    $this->filenames[] = $tok;
+                }
+                $tok = strtok(", \t\n\r");
+            }
+        }
+    }
+    
+    /**
+     * Sets a source "list" file that contains filenames to add -- one per line.
+     * @param string $file
+     */
+    function setListFile($file) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        if (!($file instanceof PhingFile)) {
+            $file = new PhingFile($file);
+        }
+        $this->listfile = $file;
+    }
+    
+    /**
+     * Get the source "list" file that contains file names.
+     * @return PhingFile
+     */
+    function getListFile() {
+        if ($this->isReference()) {
+            $ref = $this->getRef($p);
+            return $ref->getListFile($p);
+        }
+        return $this->listfile;
+    }
+
+    /**
+     * Returns the list of files represented by this FileList.
+     * @param Project $p
+     * @return array
+     */
+    function getFiles(Project $p) {
+    
+        if ($this->isReference()) {
+            $ret = $this->getRef($p);
+            $ret = $ret->getFiles($p);
+            return $ret;
+        }
+        
+        if ($this->listfile !== null) {
+            $this->readListFile($p);
+        }
+        
+        return $this->filenames;
+    }
+
+
+    /**
+      * Performs the check for circular references and returns the
+      * referenced FileSet.
+      * @param Project $p
+      */
+    function getRef(Project $p) {
+        if (!$this->checked) {
+            $stk = array();
+            array_push($stk, $this);
+            $this->dieOnCircularReference($stk, $p);            
+        }
+
+        $o = $this->ref->getReferencedObject($p);
+        if (!($o instanceof FileList)) {
+            throw new BuildException($this->ref->getRefId()." doesn't denote a filelist");
+        } else {
+            return $o;
+        }
+    }
+
+    /**
+     * Reads file names from a file and adds them to the files array.
+     * @param Project $p
+     */
+    private function readListFile(Project $p) {
+        $listReader = null;
+        try {
+            // Get a FileReader
+            $listReader = new BufferedReader(new FileReader($this->listfile)); 
+        
+            $line = $listReader->readLine();
+            while ($line !== null) {
+                if (!empty($line)) {
+                    $line = $p->replaceProperties($line);
+                    $this->filenames[] = trim($line);
+                }
+                $line = $listReader->readLine();
+            }            
+        } catch (Exception $e)  {
+            if ($listReader) $listReader->close();            
+            throw new BuildException("An error occured while reading from list file " . $this->listfile->__toString() . ": " . $e->getMessage()); 
+        } 
+        
+        $listReader->close();        
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/FileList.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/FileSet.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/FileSet.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/FileSet.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ * $Id: FileSet.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/types/AbstractFileSet.php';
+
+/**
+ * Moved out of MatchingTask to make it a standalone object that could
+ * be referenced (by scripts for example).
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Arnout J. Kuiper <ajkuiper en wxs.nl> (Ant)
+ * @author Stefano Mazzocchi <stefano en apache.org> (Ant)
+ * @author Sam Ruby <rubys en us.ibm.com> (Ant)
+ * @author Jon S. Stevens <jon en clearink.com> (Ant)
+ * @author Stefan Bodewig <stefan.bodewig en epost.de> (Ant)
+ * @author Magesh Umasankar (Ant)
+ * @package phing.types
+ */
+class FileSet extends AbstractFileSet {
+    
+    function __construct($fileset = null) {
+        parent::__construct($fileset);
+    }
+
+    /**
+     * Return a FileSet that has the same basedir and same patternsets
+     * as this one.
+     */
+    public function __clone() {
+        if ($this->isReference()) {
+            return new FileSet($this->getRef($this->getProject()));
+        } else {
+            return new FileSet($this);
+        }
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/FileSet.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/FilterChain.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/FilterChain.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/FilterChain.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,164 @@
+<?php
+/*
+ *  $Id: FilterChain.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/types/DataType.php';
+include_once 'phing/filters/HeadFilter.php';
+include_once 'phing/filters/TailFilter.php';
+include_once 'phing/filters/LineContains.php';
+include_once 'phing/filters/LineContainsRegexp.php';
+include_once 'phing/filters/ExpandProperties.php';
+include_once 'phing/filters/PrefixLines.php';
+include_once 'phing/filters/ReplaceRegexp.php';
+include_once 'phing/filters/ReplaceTokens.php';
+include_once 'phing/filters/StripPhpComments.php';
+include_once 'phing/filters/StripLineBreaks.php';
+include_once 'phing/filters/StripLineComments.php';
+include_once 'phing/filters/TabToSpaces.php';
+include_once 'phing/filters/TidyFilter.php';
+include_once 'phing/filters/TranslateGettext.php';
+include_once 'phing/filters/XsltFilter.php';
+
+/*
+ * FilterChain may contain a chained set of filter readers.
+ *
+ * @author    Yannick Lecaillez <yl en seasonfive.com>
+ * @version   $Revision: 1.11 $
+ * @package   phing.types
+ */
+class FilterChain extends DataType {
+
+    private $filterReaders = array();
+
+    function __construct(Project $project) {
+        $this->project = $project;
+    }
+
+    function getFilterReaders() {
+        return $this->filterReaders;
+    }
+
+    function addExpandProperties(ExpandProperties $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;
+    }
+
+    function addGettext(TranslateGettext $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;
+    }
+    
+    function addHeadFilter(HeadFilter $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;
+    }
+    
+    function addTailFilter(TailFilter $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;
+    }
+    
+    function addLineContains(LineContains $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;
+    }
+    
+    function addLineContainsRegExp(LineContainsRegExp $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;
+    }
+    
+    function addPrefixLines(PrefixLines $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;
+    }
+    
+    function addReplaceTokens(ReplaceTokens $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;
+    }
+
+    function addReplaceRegexp(ReplaceRegexp $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;
+    }
+    
+    function addStripPhpComments(StripPhpComments $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;
+    }
+    
+    function addStripLineBreaks(StripLineBreaks $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;
+    }
+    
+    function addStripLineComments(StripLineComments $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;        
+    }
+    
+	function addTidyFilter(TidyFilter $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;
+    }
+	
+    function addTabToSpaces(TabToSpaces $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;
+    }
+    
+    function addXsltFilter(XsltFilter $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;
+    }
+    
+    function addFilterReader(PhingFilterReader $o) {
+        $o->setProject($this->project);
+        $this->filterReaders[] = $o;
+    }
+
+    /*
+     * Makes this instance in effect a reference to another FilterChain 
+     * instance.
+     *
+     * <p>You must not set another attribute or nest elements inside
+     * this element if you make it a reference.</p>
+     *
+     * @param r the reference to which this instance is associated
+     * @throw BuildException if this instance already has been configured.
+    */
+    function setRefid(Reference $r) {
+    
+        if ( count($this->filterReaders) === 0 ) {
+            throw $this->tooManyAttributes();
+        }
+
+        // change this to get the objects from the other reference
+        $o = $r->getReferencedObject($this->getProject());
+        if ( $o instanceof FilterChain ) {
+            $this->filterReaders = $o->getFilterReaders();
+        } else {
+            throw new BuildException($r->getRefId()." doesn't refer to a FilterChain");
+        }
+        parent::setRefid($r);
+    }
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/FilterChain.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Mapper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Mapper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Mapper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,207 @@
+<?php
+/*
+ *  $Id: Mapper.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+include_once 'phing/types/DataType.php';
+include_once 'phing/types/Path.php';
+
+/**
+ * Filename Mapper maps source file name(s) to target file name(s).
+ * 
+ * Built-in mappers can be accessed by specifying they "type" attribute:
+ * <code>
+ * <mapper type="glob" from="*.php" to="*.php.bak"/>
+ * </code>
+ * Custom mappers can be specified by providing a dot-path to a include_path-relative
+ * class:
+ * <code>
+ * <mapper classname="myapp.mappers.DevToProdMapper" from="*.php" to="*.php"/>
+ * <!-- maps all PHP files from development server to production server, for example -->
+ * </code>
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package phing.types
+ */
+class Mapper extends DataType {
+
+    protected $type;    
+    protected $classname;
+    protected $from;
+    protected $to;
+    protected $classpath;
+    protected $classpathId;
+
+    
+    function __construct(Project $project) {
+        $this->project = $project;
+    }
+    
+    /**
+     * Set the classpath to be used when searching for component being defined
+     * 
+     * @param Path $classpath An Path object containing the classpath.
+     */
+    public function setClasspath(Path $classpath) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        if ($this->classpath === null) {
+            $this->classpath = $classpath;
+        } else {
+            $this->classpath->append($classpath);
+        }
+    }
+
+    /**
+     * Create the classpath to be used when searching for component being defined
+     */ 
+    public function createClasspath() {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        if ($this->classpath === null) {
+            $this->classpath = new Path($this->project);
+        }
+        return $this->classpath->createPath();
+    }
+
+    /**
+     * Reference to a classpath to use when loading the files.
+     */
+    public function setClasspathRef(Reference $r) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        $this->classpathId = $r->getRefId();
+        $this->createClasspath()->setRefid($r);
+    }
+
+    /** Set the type of FileNameMapper to use. */
+    function setType($type) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        $this->type = $type;
+    }
+
+    /** Set the class name of the FileNameMapper to use. */
+    function setClassname($classname) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        $this->classname = $classname;
+    }
+
+    /**
+     * Set the argument to FileNameMapper.setFrom
+     */
+    function setFrom($from) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        $this->from = $from;
+    }
+
+    /**
+     * Set the argument to FileNameMapper.setTo
+     */
+    function setTo($to) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        $this->to = $to;
+    }
+
+    /**
+     * Make this Mapper instance a reference to another Mapper.
+     *
+     * You must not set any other attribute if you make it a reference.
+     */
+    function setRefid($r) {
+        if ($this->type !== null || $this->from !== null || $this->to !== null) {
+            throw DataType::tooManyAttributes();
+        }
+        parent::setRefid($r);
+    }
+
+    /** Factory, returns inmplementation of file name mapper as new instance */
+    function getImplementation() {
+        if ($this->isReference()) {
+            $tmp = $this->getRef();
+            return $tmp->getImplementation();
+        }
+
+        if ($this->type === null && $this->classname === null) {
+            throw new BuildException("either type or classname attribute must be set for <mapper>");
+        }
+        
+        if ($this->type !== null) {
+            switch($this->type) {
+            case 'identity':
+                $this->classname = 'phing.mappers.IdentityMapper';
+                break;
+            case 'flatten':
+                $this->classname = 'phing.mappers.FlattenMapper';
+                break;
+            case 'glob':
+                $this->classname = 'phing.mappers.GlobMapper';
+                break;
+            case 'regexp':
+            case 'regex':
+                $this->classname = 'phing.mappers.RegexpMapper';            
+                break;
+            case 'merge':
+                $this->classname = 'phing.mappers.MergeMapper';                
+                break;
+            default:
+                throw new BuildException("Mapper type {$this->type} not known");
+                break;
+            }
+        }
+
+        // get the implementing class
+        $cls = Phing::import($this->classname, $this->classpath);
+        
+        $m = new $cls;
+        $m->setFrom($this->from);
+        $m->setTo($this->to);
+        
+        return $m;
+    }
+
+    /** Performs the check for circular references and returns the referenced Mapper. */
+    private function getRef() {
+        if (!$this->checked) {
+            $stk = array();
+            $stk[] = $this;
+            $this->dieOnCircularReference($stk, $this->project);            
+        }
+
+        $o = $this->ref->getReferencedObject($this->project);
+        if (!($o instanceof Mapper)) {
+            $msg = $this->ref->getRefId()." doesn't denote a mapper";
+            throw new BuildException($msg);
+        } else {
+            return $o;
+        }
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Mapper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Parameter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Parameter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Parameter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,99 @@
+<?php
+/*
+ *  $Id: Parameter.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/types/DataType.php';
+
+/*
+ * A parameter is composed of a name, type and value. Nested
+ * Parameters are also possible, but the using task/type has
+ * to support them
+ *
+ * @author    Manuel Holtgrewe
+ * @author    <a href="mailto:yl en seasonfive.com">Yannick Lecaillez</a>
+ * @package   phing.types
+*/
+class Parameter extends DataType {
+
+    /** Parameter name */
+    protected $name;
+    
+    /** Paramter type */
+    protected $type;
+    
+    /** Parameter value */
+    protected $value;
+    
+    /** Nested parameters */
+    protected $parameters = array();
+
+    function setName($name) {
+        $this->name = (string) $name;
+    }
+    
+    function setType($type) {
+        $this->type = (string) $type;
+    }
+
+	/**
+     * Sets value to dynamic register slot.
+     * @param RegisterSlot $value
+     */
+    public function setListeningValue(RegisterSlot $value) {
+        $this->value = $value;
+    }
+	
+    function setValue($value) {
+        $this->value = (string) $value;
+    }
+
+    function getName() {
+        return $this->name;
+    }
+
+    function getType() {
+        return $this->type;
+    }
+
+    function getValue() {
+		if ($this->value instanceof RegisterSlot) {
+            return $this->value->getValue();
+        } else {
+            return $this->value;
+        }
+    }
+    
+    /**
+     * @return Parameter
+     */
+    function createParam() {
+        $num = array_push($this->parameters, new Parameter());
+        return $this->parameters[$num-1];
+    }
+
+    /**
+     * @return array Nested parameters.
+     */
+    function getParams() {
+        return $this->parameters;
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Parameter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Parameterizable.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Parameterizable.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Parameterizable.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * $Id: Parameterizable.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ * Parameterizable objects take genric key value pairs.
+ *
+ * @author Hans Lellelid, hans en xmpl.org (Phing)
+ * @author Magesh Umasankar (Ant)
+ * @package phing.types
+ */
+interface Parameterizable {
+    function setParameters($parameters);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Parameterizable.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Path.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Path.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Path.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,456 @@
+<?php
+/*
+ *  $Id: Path.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+require_once 'phing/types/DataType.php';
+include_once 'phing/util/PathTokenizer.php';
+include_once 'phing/types/FileSet.php';
+
+/**
+ * This object represents a path as used by include_path or PATH
+ * environment variable.
+ *
+ * This class has been adopted from the Java Ant equivalent.  The ability have
+ * path structures in Phing is important; however, because of how PHP classes interact
+ * the ability to specify CLASSPATHs makes less sense than Java.Rather than providing
+ * CLASSPATH for any tasks that take classes as parameters, perhaps a better
+ * solution in PHP is to have an IncludePath task, which prepends paths to PHP's include_path
+ * INI variable. This gets around the problem that simply using a path to load the initial
+ * PHP class is not enough (in most cases the loaded class may assume that it is on the global
+ * PHP include_path, and will try to load dependent classes accordingly).  The other option is
+ * to provide a way for this class to add paths to the include path, if desired -- or to create
+ * an IncludePath subclass.  Once added, though, when would a path be removed from the include path?
+ * 
+ * <p>
+ * <code>
+ * &lt;sometask&gt;<br>
+ * &nbsp;&nbsp;&lt;somepath&gt;<br>
+ * &nbsp;&nbsp;&nbsp;&nbsp;&lt;pathelement location="/path/to/file" /&gt;<br>
+ * &nbsp;&nbsp;&nbsp;&nbsp;&lt;pathelement path="/path/to/class2;/path/to/class3" /&gt;<br>
+ * &nbsp;&nbsp;&nbsp;&nbsp;&lt;pathelement location="/path/to/file3" /&gt;<br>
+ * &nbsp;&nbsp;&lt;/somepath&gt;<br>
+ * &lt;/sometask&gt;<br>
+ * </code>
+ * <p>
+ * The object implemention <code>sometask</code> must provide a method called
+ * <code>createSomepath</code> which returns an instance of <code>Path</code>.
+ * Nested path definitions are handled by the Path object and must be labeled
+ * <code>pathelement</code>.<p>
+ *
+ * The path element takes a parameter <code>path</code> which will be parsed
+ * and split into single elements. It will usually be used
+ * to define a path from an environment variable.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Thomas.Haas en softwired-inc.com (Ant)
+ * @author Stefan Bodewig <stefan.bodewig en epost.de> (Ant)
+ * @package phing.types
+ */
+class Path extends DataType {
+
+    private $elements = array();    
+    
+    /**
+     * Constructor for internally instantiated objects sets project.
+     * @param Project $project
+     * @param string $path (for use by IntrospectionHelper)
+     */
+    public function __construct($project = null, $path = null) {
+        if ($project !== null) {
+            $this->setProject($project);
+        }
+        if ($path !== null) {
+            $this->createPathElement()->setPath($path);
+        }        
+    }
+
+    /**
+     * Adds a element definition to the path.
+     * @param $location the location of the element to add (must not be
+     * <code>null</code> nor empty.
+     * @throws BuildException
+     */
+    public function setDir(PhingFile $location) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }        
+        $this->createPathElement()->setDir($location);
+    }
+
+    /**
+     * Parses a path definition and creates single PathElements.
+     * @param path the path definition.
+     * @throws BuildException
+     */
+    public function setPath($path) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        $this->createPathElement()->setPath($path);
+    }
+
+    /**
+     * Makes this instance in effect a reference to another Path instance.
+     *
+     * <p>You must not set another attribute or nest elements inside
+     * this element if you make it a reference.</p>
+     * @throws BuildException
+     */
+    public function setRefid(Reference $r)  {
+        if (!empty($this->elements)) {
+            throw $this->tooManyAttributes();
+        }
+        $this->elements[] = $r;
+        parent::setRefid($r);
+    }
+
+    /**
+     * Creates the nested <code>&lt;pathelement&gt;</code> element.
+     * @throws BuildException 
+     */
+    public function createPathElement() {
+        if ($this->isReference()) {
+            throw $this->noChildrenAllowed();
+        }
+        $pe = new PathElement($this);
+        $this->elements[] = $pe;
+        return $pe;
+    }
+
+    /**
+     * Adds a nested <code>&lt;fileset&gt;</code> element.
+     * @throws BuildException 
+     */
+    public function addFileset(FileSet $fs) {
+        if ($this->isReference()) {
+            throw $this->noChildrenAllowed();
+        }
+        $this->elements[] = $fs;
+        $this->checked = false;
+    }
+
+    /**
+     * Adds a nested <code>&lt;dirset&gt;</code> element.
+     * @throws BuildException 
+     */
+    public function addDirset(DirSet $dset) {
+        if ($this->isReference()) {
+            throw $this->noChildrenAllowed();
+        }
+        $this->elements[] = $dset;
+        $this->checked = false;
+    }
+
+    /**
+     * Creates a nested <code>&lt;path&gt;</code> element.
+     * @throws BuildException
+     */
+    public function createPath() {
+        if ($this->isReference()) {
+            throw $this->noChildrenAllowed();
+        }
+        $p = new Path($this->project);
+        $this->elements[] = $p;
+        $this->checked = false;
+        return $p;
+    }
+
+    /**
+     * Append the contents of the other Path instance to this.
+     */
+    public function append(Path $other) {
+        if ($other === null) {
+            return;
+        }
+        $l = $other->listPaths();
+        foreach($l as $path) {
+            if (!in_array($path, $this->elements, true)) {
+                $this->elements[] = $path;
+            }
+        }
+    }
+
+     /**
+     * Adds the components on the given path which exist to this
+     * Path. Components that don't exist, aren't added.
+     *
+     * @param Path $source - Source path whose components are examined for existence.
+     */
+    public function addExisting(Path $source) {
+        $list = $source->listPaths();
+        foreach($list as $el) {
+            $f = null;
+            if ($this->project !== null) {
+                $f = $this->project->resolveFile($el);
+            } else {
+                $f = new PhingFile($el);
+            }
+
+            if ($f->exists()) {
+                $this->setDir($f);
+            } else {
+                $this->log("dropping " . $f->__toString() . " from path as it doesn't exist", 
+                    PROJECT_MSG_VERBOSE);
+            }
+        }
+    }
+
+    /**
+     * Returns all path elements defined by this and nested path objects.
+     * @return array List of path elements.
+     */
+    public function listPaths() {
+        if (!$this->checked) {
+            // make sure we don't have a circular reference here
+            $stk = array();
+            array_push($stk, $this);
+            $this->dieOnCircularReference($stk, $this->project);
+        }
+
+        $result = array();
+        for ($i = 0, $elSize=count($this->elements); $i < $elSize; $i++) {
+            $o = $this->elements[$i];
+            if ($o instanceof Reference) {
+                $o = $o->getReferencedObject($this->project);
+                // we only support references to paths right now
+                if (!($o instanceof Path)) {
+                    $msg = $r->getRefId() . " doesn't denote a path";
+                    throw new BuildException($msg);
+                }
+            }
+            
+            if (is_string($o)) {
+                $result[] = $o;
+            } elseif ($o instanceof PathElement) {
+                $parts = $o->getParts();
+                if ($parts === null) {
+                    throw new BuildException("You must either set location or" 
+                        . " path on <pathelement>");
+                }
+                foreach($parts as $part) {
+                    $result[] = $part;
+                }
+            } elseif ($o instanceof Path) {
+                $p = $o;
+                if ($p->getProject() === null) {
+                    $p->setProject($this->getProject());
+                }
+                $parts = $p->listPaths();
+                foreach($parts as $part) {
+                    $result[] = $part;
+                }
+            } elseif ($o instanceof DirSet) {
+                $dset = $o;
+                $ds = $dset->getDirectoryScanner($this->project);
+                $dirstrs = $ds->getIncludedDirectories();
+                $dir = $dset->getDir($this->project);
+                $this->addUnlessPresent($result, $dir, $s);  
+                
+                foreach($dirstrs as $dstr) {
+                    $d = new PhingFile($dir, $dstr);
+                    $result[] = $d->getAbsolutePath();
+                }                
+                     
+            } elseif ($o instanceof FileList) {
+                $fl = $o;
+                $dirstrs = $fl->getFiles($this->project);
+                $dir = $fl->getDir($this->project);
+                foreach($dirstrs as $dstr) {
+                    $d = new PhingFile($dir, $dstr);
+                    $result[] = $d->getAbsolutePath();
+                }
+            }
+        }
+        
+        return array_unique($result);
+    }
+
+
+    /**
+     * Returns a textual representation of the path, which can be used as
+     * CLASSPATH or PATH environment variable definition.
+     * @return string A textual representation of the path.
+     */
+    public function __toString() {
+        
+        $list = $this->listPaths();
+
+        // empty path return empty string
+        if (empty($list)) {
+            return "";
+        }
+        
+        return implode(PATH_SEPARATOR, $list);
+    }
+
+    /**
+     * Splits a PATH (with : or ; as separators) into its parts.
+     * @param Project $project
+     * @param string $source
+     */
+    public static function translatePath(Project $project, $source) {
+        $result = array();
+        if ($source == null) {
+          return "";
+        }
+
+        $tok = new PathTokenizer($source);
+        $element = "";
+        while ($tok->hasMoreTokens()) {            
+            $pathElement = $tok->nextToken();
+            try {
+                $element .= self::resolveFile($project, $pathElement);
+            } catch (BuildException $e) {
+                $this->project->log("Dropping path element " . $pathElement 
+                    . " as it is not valid relative to the project", 
+                    PROJECT_MSG_VERBOSE);
+            }
+            
+            for ($i = 0, $_i=strlen($element); $i < $_i; $i++) {
+                self::translateFileSep($element, $i);
+            }
+            $result[] = $element;
+        }
+        
+        return $result;
+    }
+
+    /**
+     * Returns its argument with all file separator characters
+     * replaced so that they match the local OS conventions.  
+     */
+    public static function translateFile($source) {
+        if ($source == null) {
+          return "";
+        }
+
+        $result = $source;
+        for ($i = 0, $_i=strlen($source); $i < $_i; $i++) {
+            self::translateFileSep($result, $i);
+        }
+        
+        return $result;
+    }
+
+    /**
+     * Translates all occurrences of / or \ to correct separator of the
+     * current platform and returns whether it had to do any
+     * replacements.  
+     */
+    protected static function translateFileSep(&$buffer, $pos) {
+        if ($buffer{$pos} == '/' || $buffer{$pos} == '\\') {
+            $buffer{$pos} = DIRECTORY_SEPARATOR;
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * How many parts does this Path instance consist of.
+     * DEV NOTE: expensive call! list is generated, counted, and then
+     * discareded.
+     * @return int
+     */
+    public function size() {
+        return count($this->listPaths());
+    }
+
+    /**
+     * Return a Path that holds the same elements as this instance.
+     */
+    public function __clone() {
+        $p = new Path($this->project);
+        $p->append($this);
+        return $p;
+    }
+
+    /**
+     * Overrides the version of DataType to recurse on all DataType
+     * child elements that may have been added.  
+     * @throws BuildException
+     */
+    public function dieOnCircularReference(&$stk, Project $p) {
+
+        if ($this->checked) {
+            return;
+        }
+    
+        // elements can contain strings, FileSets, Reference, etc.
+        foreach($this->elements as $o) {
+            
+            if ($o instanceof Reference) {
+                $o = $o->getReferencedObject($p);
+            }
+
+            if ($o instanceof DataType) {
+                if (in_array($o, $stk, true)) {
+                    throw $this->circularReference();
+                } else {
+                    array_push($stk, $o);
+                    $o->dieOnCircularReference($stk, $p);
+                    array_pop($stk);
+                }
+            }
+        }
+        
+        $this->checked = true;
+    }
+
+    /**
+     * Resolve a filename with Project's help - if we know one that is.
+     *
+     * <p>Assume the filename is absolute if project is null.</p>
+     */
+    private static function resolveFile(Project $project, $relativeName) {
+        if ($project !== null) {
+            $f = $project->resolveFile($relativeName);
+            return $f->getAbsolutePath();
+        }
+        return $relativeName;
+    }    
+
+}
+
+
+/**
+ * Helper class, holds the nested <code>&lt;pathelement&gt;</code> values.
+ */
+class PathElement {
+
+    private $parts = array();
+    private $outer;
+    
+    public function __construct(Path $outer) {
+        $this->outer = $outer;
+    }
+    
+    public function setDir(PhingFile $loc) {
+        $this->parts = array(Path::translateFile($loc->getAbsolutePath()));
+    }
+
+    public function setPath($path) {
+        $this->parts = Path::translatePath($this->outer->getProject(), $path);
+    }
+
+    public function getParts() {
+        return $this->parts;
+    }
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Path.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/PatternSet.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/PatternSet.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/PatternSet.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,449 @@
+<?php
+/*
+ *  $Id: PatternSet.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+include_once 'phing/system/io/FileReader.php';
+include_once 'phing/types/DataType.php';
+
+/**
+ * The patternset storage component. Carries all necessary data and methods
+ * for the patternset stuff.
+ *
+ * @author   Andreas Aderhold, andi en binarycloud.com
+ * @version  $Revision: 1.8 $
+ * @package  phing.types
+ */
+class PatternSet extends DataType {
+
+    private $includeList = array();
+    private $excludeList = array();
+    private $includesFileList = array();
+    private $excludesFileList = array();
+
+    /**
+     * Makes this instance in effect a reference to another PatternSet
+     * instance.
+     * You must not set another attribute or nest elements inside
+     * this element if you make it a reference.
+     */
+    function setRefid(Reference $r) {
+        if (!empty($this->includeList) || !empty($this->excludeList)) {
+            throw $this->tooManyAttributes();
+        }
+        parent::setRefid($r);
+    }
+
+
+    /**
+    * Add a name entry on the include list
+    *
+    * @returns PatternSetNameEntry Reference to object
+    * @throws  BuildException
+    */
+    function createInclude() {
+        if ($this->isReference()) {
+            throw $this->noChildrenAllowed();
+        }
+        return $this->addPatternToList($this->includeList);
+    }
+
+
+    /**
+    * Add a name entry on the include files list
+    *
+    * @returns PatternSetNameEntry Reference to object
+    * @throws  BuildException
+    */
+    function createIncludesFile() {
+        if ($this->isReference()) {
+            throw $this->noChildrenAllowed();
+        }
+        return $this->addPatternToList($this->includesFileList);
+    }
+
+    /**
+    * Add a name entry on the exclude list
+    *
+    * @returns PatternSetNameEntry Reference to object
+    * @throws  BuildException
+    */
+    function createExclude() {
+        if ($this->isReference()) {
+            throw $this->noChildrenAllowed();
+        }
+        return $this->addPatternToList($this->excludeList);
+    }
+
+    /**
+     * add a name entry on the exclude files list
+    *
+    * @returns PatternSetNameEntry Reference to object
+    * @throws  BuildException
+     */
+
+    function createExcludesFile() {
+        if ($this->isReference()) {
+            throw $this->noChildrenAllowed();
+            return;
+        }
+        return $this->addPatternToList($this->excludesFileList);
+    }
+
+
+    /**
+     * Sets the set of include patterns. Patterns may be separated by a comma
+     * or a space.
+     *
+     * @param   string the string containing the include patterns
+     * @returns void
+     * @throws  BuildException
+     */
+    function setIncludes($includes) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        if ($includes !== null && strlen($includes) > 0) {
+            $tok = strtok($includes, ", ");
+            while ($tok !== false) {
+                $o = $this->createInclude();
+                $o->setName($tok);
+                $tok = strtok(", ");
+            }
+        }
+    }
+
+
+    /**
+     * Sets the set of exclude patterns. Patterns may be separated by a comma
+     * or a space.
+     *
+     * @param string the string containing the exclude patterns
+    * @returns void
+    * @throws  BuildException
+     */
+
+    function setExcludes($excludes) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        if ($excludes !== null && strlen($excludes) > 0) {
+            $tok = strtok($excludes, ", ");
+            while ($tok !== false) {
+                $o = $this->createExclude();
+                $o->setName($tok);
+                $tok = strtok(", ");
+            }
+        }
+    }
+
+    /**
+     * add a name entry to the given list
+     *
+     * @param array List onto which the nameentry should be added
+     * @returns PatternSetNameEntry  Reference to the created PsetNameEntry instance
+     */
+    private function addPatternToList(&$list) {
+        $num = array_push($list, new PatternSetNameEntry());
+        return $list[$num-1];
+    }
+
+    /**
+     * Sets the name of the file containing the includes patterns.
+     *
+     * @param includesFile The file to fetch the include patterns from.
+     */
+    function setIncludesFile($includesFile) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        if ($includesFile instanceof File) {
+            $includesFile = $includesFile->getPath();
+        }
+        $o = $this->createIncludesFile();
+        $o->setName($includesFile);
+    }
+
+    /**
+     * Sets the name of the file containing the excludes patterns.
+     *
+     * @param excludesFile The file to fetch the exclude patterns from.
+     */
+    function setExcludesFile($excludesFile) {
+        if ($this->isReference()) {
+            throw $this->tooManyAttributes();
+        }
+        if ($excludesFile instanceof File) {
+            $excludesFile = $excludesFile->getPath();
+        }        
+        $o = $this->createExcludesFile();
+        $o->setName($excludesFile);
+    }
+
+
+    /**
+     *  Reads path matching patterns from a file and adds them to the
+     *  includes or excludes list
+     */
+    private function readPatterns(PhingFile $patternfile, &$patternlist, Project $p) {
+        $patternReader = null;
+        try {
+            // Get a FileReader
+            $patternReader = new BufferedReader(new FileReader($patternfile)); 
+        
+            // Create one NameEntry in the appropriate pattern list for each 
+            // line in the file.
+            $line = $patternReader->readLine();
+            while ($line !== null) {
+                if (!empty($line)) {
+                    $line = $p->replaceProperties($line);
+                    $this->addPatternToList($patternlist)->setName($line);
+                }
+                $line = $patternReader->readLine();
+            }
+            
+        } catch (IOException $ioe)  {
+            $msg = "An error occured while reading from pattern file: " . $patternfile->__toString(); 
+            if($patternReader) $patternReader->close();            
+            throw new BuildException($msg, $ioe);
+        } 
+        
+        $patternReader->close();                
+    }
+
+
+    /** Adds the patterns of the other instance to this set. */
+    function append($other, $p) {
+        if ($this->isReference()) {
+            throw new BuildException("Cannot append to a reference");
+        }
+
+        $incl = $other->getIncludePatterns($p);
+        if ($incl !== null) {
+            foreach($incl as $incl_name) {
+                $o = $this->createInclude();
+                $o->setName($incl_name);
+            }
+        }
+
+        $excl = $other->getExcludePatterns($p);
+        if ($excl !== null) {
+            foreach($excl as $excl_name) {
+                $o = $this->createExclude();
+                $o->setName($excl_name);
+            }
+        }
+    }
+
+    /** Returns the filtered include patterns. */
+    function getIncludePatterns(Project $p) {
+        if ($this->isReference()) {
+            $o = $this->getRef($p);
+            return $o->getIncludePatterns($p);
+        } else {
+            $this->readFiles($p);
+            return $this->makeArray($this->includeList, $p);
+        }
+    }
+
+    /** Returns the filtered exclude patterns. */
+    function getExcludePatterns(Project $p) {
+        if ($this->isReference()) {
+            $o = $this->getRef($p);
+            return $o->getExcludePatterns($p);
+        } else {
+            $this->readFiles($p);
+            return $this->makeArray($this->excludeList, $p);
+        }
+    }
+
+    /** helper for FileSet. */
+    function hasPatterns() {
+        return (boolean) count($this->includesFileList) > 0 || count($this->excludesFileList) > 0
+               || count($this->includeList) > 0 || count($this->excludeList) > 0;
+    }
+
+    /**
+     * Performs the check for circular references and returns the
+     * referenced PatternSet.
+     */
+    function getRef(Project $p) {
+        if (!$this->checked) {
+            $stk = array();
+            array_push($stk, $this);
+            $this->dieOnCircularReference($stk, $p);
+        }
+        $o = $this->ref->getReferencedObject($p);
+        if (!($o instanceof PatternSet)) {
+            $msg = $this->ref->getRefId()." doesn't denote a patternset";
+            throw new BuildException($msg);
+        } else {
+            return $o;
+        }
+    }
+
+    /** Convert a array of PatternSetNameEntry elements into an array of Strings. */
+    private function makeArray(&$list, Project $p) {
+
+        if (count($list) === 0) {
+            return null;
+        }
+
+        $tmpNames = array();
+        foreach($list as $ne) {
+            $pattern = (string) $ne->evalName($p);
+            if ($pattern !== null && strlen($pattern) > 0) {
+                array_push($tmpNames, $pattern);
+            }
+        }
+        return $tmpNames;
+    }
+
+    /** Read includesfile or excludesfile if not already done so. */
+    private function readFiles(Project $p) {
+        if (!empty($this->includesFileList)) {
+            foreach($this->includesFileList as $ne) {
+                $fileName = (string) $ne->evalName($p);
+                if ($fileName !== null) {
+                    $inclFile = $p->resolveFile($fileName);
+                    if (!$inclFile->exists()) {
+                        throw new BuildException("Includesfile ".$inclFile->getAbsolutePath()." not found.");
+                    }
+                    $this->readPatterns($inclFile, $this->includeList, $p);
+                }
+            }
+            $this->includesFileList = array();
+        }
+
+        if (!empty($this->excludesFileList)) {
+            foreach($this->excludesFileList as $ne) {               
+                $fileName = (string) $ne->evalName($p);
+                if ($fileName !== null) {
+                    $exclFile = $p->resolveFile($fileName);
+                    if (!$exclFile->exists()) {
+                        throw new BuildException("Excludesfile ".$exclFile->getAbsolutePath()." not found.");
+                        return;
+                    }
+                    $this->readPatterns($exclFile, $this->excludeList, $p);
+                }
+            }
+            $this->excludesFileList = array();
+        }
+    }
+
+
+    function toString() {
+        
+        // We can't compile includeList into array because, toString() does
+        // not know about project:
+        //
+        // $includes = $this->makeArray($this->includeList, $this->project);
+        // $excludes = $this->makeArray($this->excludeList, $this->project);
+            
+        if (empty($this->includeList)) {
+            $includes = "empty";
+        } else {
+            $includes = "";
+            foreach($this->includeList as $ne) {
+                $includes .= $ne->toString() . ",";
+            }
+            $includes = rtrim($includes, ",");
+        }
+        
+        if (empty($this->excludeList)) {
+            $excludes = "empty";
+        } else {
+            $excludes = "";
+            foreach($this->excludeList as $ne) {
+                $excludes .= $ne->toString() . ",";
+            }
+            $excludes = rtrim($excludes, ",");
+        }
+               
+        return "patternSet{ includes: $includes  excludes: $excludes }";
+    }
+}
+
+
+/*
+ * Note, this class here should become a nested class to
+ * PatternSet (PatternSet:NameEntry) as it is only needed
+ * internally.
+ * This is not possible with php 4.x right now so we place
+ * this class (against good style) in this file.
+ */
+
+class PatternSetNameEntry {
+
+    private $name       = null;
+    private $ifCond     = null;
+    private $unlessCond = null;
+
+    function setName($name) {
+        $this->name = (string) $name;
+    }
+
+
+    function setIf($cond) {
+        $this->ifCond = (string) $cond;
+    }
+
+
+    function setUnless($cond) {
+        $this->unlessCond = (string) $cond;
+    }
+
+
+    function getName() {
+        return $this->name;
+    }
+
+
+    function evalName($project) {
+        return $this->valid($project) ? $this->name : null;
+    }
+
+
+    function valid($project) {
+        if ($this->ifCond !== null && $project->getProperty($this->ifCond) === null) {
+            return false;
+        } else if ($this->unlessCond !== null && $project->getProperty($this->unlessCond) !== null) {
+            return false;
+        }
+        return true;
+    }
+
+
+    function toString() {
+        $buf = $this->name;
+        if (($this->ifCond !== null) || ($this->unlessCond !== null)) {
+            $buf .= ":";
+            $connector = "";
+
+            if ($this->ifCond !== null) {
+                $buf .= "if->{$this->ifCond}";
+                $connector = ";";
+            }
+            if ($this->unlessCond !== null) {
+                $buf .= "$connector unless->{$this->unlessCond}";
+            }
+        }
+        return $buf;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/PatternSet.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/PhingFilterReader.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/PhingFilterReader.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/PhingFilterReader.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,136 @@
+<?php
+/*
+ *  $Id: PhingFilterReader.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/types/DataType.php';
+include_once 'phing/types/Parameter.php';
+
+/*
+ * A PhingFilterReader is a wrapper class that encloses the className
+ * and configuration of a Configurable FilterReader.
+ *
+ * @author    Yannick Lecaillez <yl en seasonfive.com>
+ * @version   $Revision: 1.9 $
+ * @see       FilterReader
+ * @package   phing.types
+*/
+class PhingFilterReader extends DataType {
+
+    private $className;
+    private $parameters = array();
+    private $classPath;
+
+    function setClassName($className) {
+        $this->className = $className;
+    }
+
+    function getClassName() {
+        return $this->className;
+    }
+
+    /**
+     * Set the classpath to load the FilterReader through (attribute).
+     * @param Path $classpath
+     */
+    function setClasspath(Path $classpath) {
+        if ( $this->isReference() ) {
+            throw $this->tooManyAttributes();
+        }
+        if ( $this->classPath === null ) {
+            $this->classPath = $classpath;
+        } else {
+            $this->classPath->append($classpath);
+        }
+    }
+
+    /*
+     * Set the classpath to load the FilterReader through (nested element).
+    */
+    function createClasspath() {
+        if ( $this->isReference() ) {
+            throw $this->noChildrenAllowed();
+        }        
+        if ( $this->classPath === null ) {
+            $this->classPath = new Path($this->project);
+        }
+        return $this->classPath->createPath();
+    }
+
+    function getClasspath() {
+        return $this->classPath;
+    }
+
+    function setClasspathRef(Reference $r) {
+        if ( $this->isReference() ) {
+            throw $this->tooManyAttributes();
+        }
+        $o = $this->createClasspath();
+        $o->setRefid($r);
+    }
+	
+	function addParam(Parameter $param) {
+		$this->parameters[] = $param;
+	}
+
+    function createParam() {
+        $num = array_push($this->parameters, new Parameter());
+        return $this->parameters[$num-1];
+    }
+		
+    function getParams() {
+        // We return a COPY
+        $ret = array();
+        for($i=0,$size=count($this->parameters); $i < $size; $i++) {
+            $ret[] = clone $this->parameters[$i];
+        }
+        return $ret;
+    }
+
+    /*
+     * Makes this instance in effect a reference to another PhingFilterReader 
+     * instance.
+     *
+     * <p>You must not set another attribute or nest elements inside
+     * this element if you make it a reference.</p>
+     *
+     * @param Reference $r the reference to which this instance is associated
+     * @exception BuildException if this instance already has been configured.
+    */
+    function setRefid(Reference $r) {
+        if ( (count($this->parameters) !== 0) || ($this->className !== null) ) {
+            throw $this->tooManyAttributes();
+        }
+        $o = $r->getReferencedObject($this->getProject());
+        if ( $o instanceof PhingFilterReader ) {
+            $this->setClassName($o->getClassName());
+            $this->setClasspath($o->getClassPath());
+            foreach($o->getParams() as $p) {
+                $this->addParam($p);
+            }
+        } else {
+            $msg = $r->getRefId()." doesn\'t refer to a PhingFilterReader";
+            throw new BuildException($msg);
+        }
+
+        parent::setRefid($r);
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/PhingFilterReader.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Reference.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Reference.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Reference.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,56 @@
+<?php
+/*
+ * $Id: Reference.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+/** Class to hold a reference to another object in the project.
+ * @package phing.types
+ */
+class Reference {
+
+    protected $refid;
+
+    function __construct($id = null) {
+        if ($id !== null) {
+            $this->setRefId($id);
+        }
+    }
+
+    function setRefId($id) {
+        $this->refid = (string) $id;
+    }
+
+    function getRefId() {
+        return $this->refid;
+    }
+
+    /** returns reference to object in references container of project */
+    function getReferencedObject($project) {    
+        if ($this->refid === null) {
+            throw new BuildException("No reference specified");
+        }
+        $refs = $project->getReferences();
+        $o = @$refs[$this->refid];
+        if (!is_object($o)) {       
+            throw new BuildException("Reference {$this->refid} not found.");
+        }
+        return $o;
+    }
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/Reference.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/RegularExpression.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/RegularExpression.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/RegularExpression.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,105 @@
+<?php
+/*
+ *  $Id: RegularExpression.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+include_once 'phing/types/DataType.php';
+include_once 'phing/Project.php';
+include_once 'phing/util/regexp/Regexp.php';
+
+/*
+ * A regular expression datatype.  Keeps an instance of the
+ * compiled expression for speed purposes.  This compiled
+ * expression is lazily evaluated (it is compiled the first
+ * time it is needed).  The syntax is the dependent on which
+ * regular expression type you are using.
+ *
+ * @author    <a href="mailto:yl en seasonfive.com">Yannick Lecaillez</a>
+ * @version   $Revision: 1.6 $ $Date$
+ * @access    public
+ * @see       phing.util.regex.RegexMatcher
+ * @package   phing.types
+*/
+class RegularExpression extends DataType {
+
+    private $regexp   = null;
+    private $ignoreCase = false;
+    
+    function __construct() {
+        $this->regexp  = new Regexp();
+    }
+
+    function setPattern($pattern) {
+        $this->regexp->setPattern($pattern);
+    }
+
+    function setReplace($replace) {
+        $this->regexp->setReplace($replace);
+    }
+    
+    function getPattern($p) {
+        if ( $this->isReference() ) {
+            $ref = $this->getRef($p);
+            return $ref->getPattern($p);
+        }
+        return $this->regexp->getPattern();
+    }
+
+    function getReplace($p) {
+        if ( $this->isReference() ) {
+            $ref = $this->getRef($p);
+            return $ref->getReplace($p);
+        }
+
+        return $this->regexp->getReplace();
+    }
+    
+    function setIgnoreCase($bit) {
+        $this->regexp->setIgnoreCase($bit);
+    }
+    
+    function getIgnoreCase() {
+        return $this->regexp->getIgnoreCase();
+    }
+    
+    function getRegexp(Project $p) {
+        if ( $this->isReference() ) {
+            $ref = $this->getRef($p);
+            return $ref->getRegexp($p);
+        }
+        return $this->regexp;
+    }
+
+    function getRef(Project $p) {
+        if ( !$this->checked ) {
+            $stk = array();
+            array_push($stk, $this);
+            $this->dieOnCircularReference($stk, $p);            
+        }
+
+        $o = $this->ref->getReferencedObject($p);
+        if ( !($o instanceof RegularExpression) ) {
+            throw new BuildException($this->ref->getRefId()." doesn't denote a RegularExpression");
+        } else {
+            return $o;
+        }
+    }
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/RegularExpression.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/TokenReader.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/TokenReader.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/TokenReader.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,66 @@
+<?php
+/*
+ *  $Id: TokenReader.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+// include_once 'phing/system/io/Reader.php'; // really this is unrelated to Reader
+include_once 'phing/system/io/IOException.php';
+include_once 'phing/filters/ReplaceTokens.php'; // For class Token
+
+/**
+ * Abstract class for TokenReaders.
+ * 
+ * @author    Manuel Holtgewe
+ * @version   $Revision: 1.5 $
+ * @package   phing.filters.util
+ */
+abstract class TokenReader {
+
+    /**
+     * Reference to the Project the TokenReader is used in.
+     * @var Project 
+     */
+    protected $project;
+
+    /**
+     * Constructor
+     * @param   object  Reference to the project the TokenReader is used in.
+     */
+    function __construct(Project $project) {
+        $this->project = $project;
+    }
+
+    /**
+     * Utility function for logging
+     */
+    function log($level, $msg) {
+        $this->project->log($level, $msg);
+    }
+
+    /**
+     * Reads the next token from the Reader
+     *
+     * @throws IOException - On error
+     * @return string
+     */
+    abstract public function readToken();
+    
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/TokenReader.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/TokenSource.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/TokenSource.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/TokenSource.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,157 @@
+<?php
+/*
+ *  $Id: TokenSource.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+*/
+
+require_once 'phing/types/DataType.php';
+include_once 'phing/util/StringHelper.php';
+
+/**
+ * A parameter is composed of a name, type and value.
+ *
+ * Example of usage:
+ *
+ * <replacetokens>
+ *   <tokensource classname="phing.filters.util.IniFileTokenReader">
+ *     <!-- all params for the TokenReader here -->
+ *     <param name="file" value="tokens.ini" />
+ *   </tokensource>
+ * </replacetokens>
+ *
+ * or:
+ * 
+ * <filterreader classname="phing.filters.ReplaceTokens">
+ *   <param type="tokensource>
+ *     <param name="classname" value="phing.filters.util.IniFileTokenReader" />
+ *     <param name="file" value="tokens.ini" />
+ *   </param>
+ * </filterreader>
+ *
+ * @author    <a href="mailto:yl en seasonfive.com">Yannick Lecaillez</a>
+ * @package   phing.types
+ */
+class TokenSource extends DataType {
+
+    /**
+     * String to hold the path to the TokenReader
+     * @var     string
+     */
+    protected $classname = null;
+
+    /**
+     * Array holding parameters for the wrapped TokenReader.
+     * @var array
+     */
+    protected $parameters = array();
+
+    /**
+     * Reference to the TokenReader used by this TokenSource
+     * @var TokenReader
+     */
+    protected $reader;
+
+    /**
+     * Array with key/value pairs of tokens
+     */
+    protected $tokens = array();
+
+    /**
+     * This method is called to load the sources from the reader
+     * into the buffer of the source.
+     */
+    function load() {
+        // Create new Reader
+        if ($this->classname === null) {
+            throw new BuildException("No Classname given to TokenSource.");
+        }
+        
+        $classname = Phing::import($this->classname);        
+        $this->reader = new $classname($this->project);
+
+        // Configure Reader
+        $this->configureTokenReader($this->reader);
+
+        // Load Tokens
+        try {
+            while ($token = $this->reader->readToken()) {
+                $this->tokens[] = $token;
+            }
+        } catch (BuildException $e) {
+            $this->log("Error reading TokenSource: " . $e->getMessage(), PROJECT_MSG_WARN);
+        } catch (IOException $e) {
+            $this->log("Error reading TokenSource: " . $e->getMessage(), PROJECT_MSG_WARN);
+        }
+    }
+
+    /**
+     * This function uses the wrapper to read the tokens and then
+     * returns them.
+     *
+     * @access  public
+     */
+    function getTokens() {
+        if ($this->tokens === null)
+            $this->Load();
+
+        return $this->tokens;
+    }
+
+    /**
+     * Configures a TokenReader with the parameters passed to the
+     * TokenSource.
+     * @param TokenReader $reader
+     */
+    private function configureTokenReader(TokenReader $reader) {
+        $count = count($this->parameters);
+        for ($i = 0; $i < $count; $i++) {
+            $method_name = "Set" . $this->parameters[$i]->getName();
+            $value = $this->parameters[$i]->getValue();
+            $reader->$method_name($value);
+        }
+    }
+    
+    /**
+     * Set the classname (dot-path) to use for handling token replacement.
+     * @param string $c
+     */
+    function setClassname($c) {
+        $this->classname = $c;
+    }
+    
+    /**
+     * Returns the qualified classname (dot-path) to use for handling token replacement.
+     * @return string
+     */
+    function getClassname() {
+        return $this->classname;
+    }
+
+    /**
+     * Create nested <param> tag.
+     * Uses standard name/value Parameter class.
+     * @return Parameter
+     */
+    function createParam() {
+        $num = array_push($this->parameters, new Parameter());
+        return $this->parameters[$num-1];
+    }
+}
+
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/TokenSource.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/defaults.properties
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/defaults.properties	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/defaults.properties	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,13 @@
+# phing default types
+commandline=phing.types.Commandline
+fileset=phing.types.FileSet
+dirset=phing.types.DirSet
+filelist=phing.types.FileList
+patternset=phing.types.PatternSet
+mapper=phing.types.Mapper
+filterchain=phing.types.FilterChain
+filterreader=phing.types.PhingFilterReader
+regexp=phing.types.RegularExpression
+param=phing.types.Parameter
+path=phing.types.Path
+selector=phing.types.selectors.SelectSelector
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/AndSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/AndSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/AndSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,67 @@
+<?php
+/*
+ * $Id: AndSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/types/selectors/BaseSelectorContainer.php';
+
+/**
+ * This selector has a collection of other selectors, all of which have to
+ * select a file in order for this selector to select it.
+ *
+ * @author Hans Lellelid, hans en xmpl.org (Phing)
+ * @author <a href="mailto:bruce en callenish.com">Bruce Atherton</a> (Ant)
+ * @package phing.types.selectors
+ */
+class AndSelector extends BaseSelectorContainer {
+
+    public function toString() {
+        $buf = "";
+        if ($this->hasSelectors()) {
+            $buf .= "{andselect: ";
+            $buf .= parent::toString();
+            $buf .= "}";
+        }
+        return $buf;
+    }
+
+    /**
+     * Returns true (the file is selected) only if all other selectors
+     * agree that the file should be selected.
+     *
+     * @param basedir the base directory the scan is being done from
+     * @param filename the name of the file to check
+     * @param file a PhingFile object for the filename that the selector
+     * can use
+     * @return whether the file should be selected or not
+     */
+    public function isSelected(PhingFile $basedir, $filename, PhingFile $file) {
+        $this->validate();
+        $selectors = $this->selectorElements();       
+           for($i=0,$size=count($selectors); $i < $size; $i++) {
+            $result = $selectors[$i]->isSelected($basedir, $filename, $file);
+            if (!$result) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/AndSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/BaseExtendSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/BaseExtendSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/BaseExtendSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * $Id: BaseExtendSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/types/selectors/ExtendFileSelector.php';
+require_once 'phing/types/selectors/BaseSelector.php';
+include_once 'phing/types/Parameter.php';
+
+/**
+ * Convenience base class for all selectors accessed through ExtendSelector.
+ * It provides support for gathering the parameters together as well as for
+ * assigning an error message and throwing a build exception if an error is
+ * detected.
+ *
+ * @author Hans Lellelid, hans en xmpl.org (Phing)
+ * @author Bruce Atherton, bruce en callenish.com (Ant)
+ * @package phing.types.selectors
+ */
+abstract class BaseExtendSelector extends BaseSelector implements ExtendFileSelector {
+
+    /** The passed in parameter array. */
+    protected $parameters = null;
+
+    /**
+     * Set all the Parameters for this custom selector, collected by
+     * the ExtendSelector class.
+     *
+     * @param parameters the complete set of parameters for this selector
+     */
+    public function setParameters($parameters) {
+        $this->parameters = $parameters;
+    }
+
+    /**
+     * Allows access to the parameters gathered and set within the
+     * &lt;custom&gt; tag.
+     *
+     * @return the set of parameters defined for this selector
+     */
+    protected function getParameters() {
+        return $this->parameters;
+    }
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/BaseExtendSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/BaseSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/BaseSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/BaseSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,84 @@
+<?php
+/*
+ * $Id: BaseSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/types/selectors/FileSelector.php';
+
+/**
+ * A convenience base class that you can subclass Selectors from. It
+ * provides some helpful common behaviour. Note that there is no need
+ * for Selectors to inherit from this class, it is only necessary that
+ * they implement FileSelector.
+ *
+ * @author <a href="mailto:bruce en callenish.com">Bruce Atherton</a>
+ * @package phing.types.selectors
+ */
+abstract class BaseSelector extends DataType implements FileSelector {
+
+    private $errmsg = null;
+
+    /**
+     * Allows all selectors to indicate a setup error. Note that only
+     * the first error message is recorded.
+     *
+     * @param msg The error message any BuildException should throw.
+     */
+    public function setError($msg) {
+        if ($this->errmsg === null) {
+            $this->errmsg = $msg;
+        }
+    }
+
+    /**
+     * Returns any error messages that have been set.
+     *
+     * @return the error condition
+     */
+    public function getError() {
+        return $this->errmsg;
+    }
+
+
+    /**
+     * <p>Subclasses can override this method to provide checking of their
+     * state. So long as they call validate() from isSelected(), this will
+     * be called automatically (unless they override validate()).</p>
+     * <p>Implementations should check for incorrect settings and call
+     * setError() as necessary.</p>
+     */
+    public function verifySettings() {
+    }
+
+    /**
+     * Subclasses can use this to throw the requisite exception
+     * in isSelected() in the case of an error condition.
+     */
+    public function validate() {
+        if ($this->getError() === null) {
+            $this->verifySettings();
+        }
+        if ($this->getError() !== null) {
+            throw new BuildException($this->errmsg);
+        }
+    }   
+
+}
+
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/BaseSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/BaseSelectorContainer.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/BaseSelectorContainer.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/BaseSelectorContainer.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,270 @@
+<?php
+
+/*
+ * $Id: BaseSelectorContainer.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/types/selectors/SelectorContainer.php';
+require_once 'phing/types/selectors/BaseSelector.php';
+
+/**
+ * This is the base class for selectors that can contain other selectors.
+ *
+ * @author <a href="mailto:bruce en callenish.com">Bruce Atherton</a> (Ant)
+ * @package phing.types.selectors
+ */
+abstract class BaseSelectorContainer extends BaseSelector implements SelectorContainer {
+
+    private $selectorsList = array();
+
+    /**
+     * Indicates whether there are any selectors here.
+     */
+    public function hasSelectors() {
+        return !(empty($this->selectorsList));
+    }
+
+    /**
+     * Gives the count of the number of selectors in this container
+     */
+    public function selectorCount() {
+        return count($this->selectorsList);
+    }
+
+    /**
+     * Returns a copy of the selectors as an array.
+     */
+    public function getSelectors(Project $p) {
+        $result = array();
+        for($i=0,$size=count($this->selectorsList); $i < $size; $i++) {
+            $result[] = clone $this->selectorsList[$i];
+        }
+        return $result;
+    }
+
+    /**
+     * Returns an array for accessing the set of selectors (not a copy).
+     */
+    public function selectorElements() {
+        return $this->selectorsList;
+    }
+
+    /**
+     * Convert the Selectors within this container to a string. This will
+     * just be a helper class for the subclasses that put their own name
+     * around the contents listed here.
+     *
+     * @return comma separated list of Selectors contained in this one
+     */
+    public function toString() {
+        $buf = "";
+        $arr = $this->selectorElements();
+        for($i=0,$size=count($arr); $i < $size; $i++) {
+            $buf .= $arr[$i]->toString() . (isset($arr[$i+1]) ? ', ' : '');
+        }
+        return $buf;
+    }
+
+    /**
+     * Add a new selector into this container.
+     *
+     * @param selector the new selector to add
+     * @return the selector that was added
+     */
+    public function appendSelector(FileSelector $selector) {
+        $this->selectorsList[] = $selector;
+    }
+
+    /**
+     * <p>This implementation validates the container by calling
+     * verifySettings() and then validates each contained selector
+     * provided that the selector implements the validate interface.
+     * </p>
+     * <p>Ordinarily, this will validate all the elements of a selector
+     * container even if the isSelected() method of some elements is
+     * never called. This has two effects:</p>
+     * <ul>
+     * <li>Validation will often occur twice.
+     * <li>Since it is not required that selectors derive from
+     * BaseSelector, there could be selectors in the container whose
+     * error conditions are not detected if their isSelected() call
+     * is never made.
+     * </ul>
+     */
+    public function validate() {
+        $this->verifySettings();
+        $errmsg = $this->getError();
+        if ($errmsg !== null) {
+            throw new BuildException($errmsg);
+        }
+        foreach($this->selectorsList as $o) {
+            if ($o instanceof BaseSelector) {
+                $o->validate();
+            }
+        }    
+    }
+
+    /* Methods below all add specific selectors */
+
+    /**
+     * add a "Select" selector entry on the selector list
+     */
+    public function createSelector() {
+        $o = new SelectSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add an "And" selector entry on the selector list
+     */
+    public function createAnd() {
+        $o = new AndSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add an "Or" selector entry on the selector list
+     */
+    public function createOr() {
+        $o = new OrSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a "Not" selector entry on the selector list
+     */
+    public function createNot() {
+        $o = new NotSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a "None" selector entry on the selector list
+     */
+    public function createNone() {
+        $o = new NoneSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a majority selector entry on the selector list
+     */
+    public function createMajority() {
+        $o = new MajoritySelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a selector date entry on the selector list
+     */
+    public function createDate() {
+        $o = new DateSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a selector size entry on the selector list
+     */
+    public function createSize() {
+        $o = new SizeSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a selector filename entry on the selector list
+     */
+    public function createFilename() {
+        $o = new FilenameSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add an extended selector entry on the selector list
+     */
+    public function createCustom() {
+        $o = new ExtendSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a contains selector entry on the selector list
+     */
+    public function createContains() {
+        $o = new ContainsSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a contains selector entry on the selector list
+     */
+    public function createContainsRegexp() {
+        $o = new ContainsRegexpSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a present selector entry on the selector list
+     */
+    public function createPresent() {
+        $o = new PresentSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a depth selector entry on the selector list
+     */
+    public function createDepth() {
+        $o = new DepthSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+
+    /**
+     * add a depends selector entry on the selector list
+     */
+    public function createDepend() {
+        $o = new DependSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+    
+    /**
+     * add a type selector entry on the selector list
+     */
+    public function createType() {
+        $o = new TypeSelector();
+        $this->appendSelector($o);
+        return $o;
+    }
+    
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/BaseSelectorContainer.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ContainsRegexpSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ContainsRegexpSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ContainsRegexpSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,164 @@
+<?php
+
+/*
+ * $Id: ContainsRegexpSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/types/selectors/BaseExtendSelector.php';
+include_once 'phing/types/RegularExpression.php';
+
+/**
+ * Selector that filters files based on whether they contain a
+ * particular string using regexp.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author    Bruce Atherton <bruce en callenish.com> (Ant)
+ * @version   $Revision: 1.3 $
+ * @package   phing.types.selectors
+ */
+class ContainsRegexpSelector extends BaseExtendSelector {
+
+    /** @var string The expression set from XML. */
+    private $userProvidedExpression;
+    
+    /** @var Regexp */
+    private $myExpression;
+     
+    private $casesensitive = true;
+    
+    /** @var RegularExpression */
+    private $myRegExp;
+    
+    const EXPRESSION_KEY = "expression";
+    
+    const CASE_KEY = "casesensitive";
+    
+    public function toString() {
+        $buf = "{containsregexpselector expression: ";
+        $buf .= $this->userProvidedExpression;
+        $buf .= " casesensitive: ";
+        if ($this->casesensitive) {
+            $buf .= "true";
+        } else {
+            $buf .= "false";
+        }
+        $buf .= "}";
+        return $buf;
+    }
+
+    /**
+     * The expression to match on within a file.
+     *
+     * @param string $exp the string that a file must contain to be selected.
+     */
+    public function setExpression($exp) {
+        $this->userProvidedExpression = $exp;
+    }
+
+    /**
+     * Whether to ignore case in the regex match.
+     *
+     * @param boolean $casesensitive whether to pay attention to case sensitivity
+     */
+    public function setCasesensitive($casesensitive) {
+        $this->casesensitive = $casesensitive;
+    }
+
+    /**
+     * When using this as a custom selector, this method will be called.
+     * It translates each parameter into the appropriate setXXX() call.
+     *
+     * @param array $parameters the complete set of parameters for this selector
+     */
+    public function setParameters($parameters) {
+        parent::setParameters($parameters);
+        if ($parameters !== null) {
+            for ($i=0,$size=count($parameters); $i < $size; $i++) {
+                $paramname = $parameters[$i]->getName();
+                switch(strtolower($paramname)) {
+                    case self::EXPRESSION_KEY:
+                        $this->setExpression($parameters[$i]->getValue());
+                        break;
+                    case self::CASE_KEY:
+                        $this->setCasesensitive($parameters[$i]->getValue());
+                        break;
+                    default:
+                        $this->setError("Invalid parameter " . $paramname);
+                }                
+            } // for each param
+        } // if params
+    }
+
+    /**
+     * Checks to make sure all settings are kosher. In this case, it
+     * means that the pattern attribute has been set.
+     *
+     */
+    public function verifySettings() {
+        if ($this->userProvidedExpression === null) {
+            $this->setError("The expression attribute is required");
+        }
+    }
+
+    /**
+     * The heart of the matter. This is where the selector gets to decide
+     * on the inclusion of a file in a particular fileset.
+     *
+     * @param basedir the base directory the scan is being done from
+     * @param filename is the name of the file to check
+     * @param file a PhingFile object the selector can use
+     * @return whether the file should be selected or not
+     */
+    public function isSelected(PhingFile $basedir, $filename, PhingFile $file) {
+
+        $this->validate();
+
+        if ($file->isDirectory()) {
+            return true;
+        }
+        
+        if ($this->myRegExp === null) {
+            $this->myRegExp = new RegularExpression();
+            $this->myRegExp->setPattern($this->userProvidedExpression);            
+            if (!$this->casesensitive) {
+                $this->myRegExp->setIgnoreCase(true);
+            }
+            $this->myExpression = $this->myRegExp->getRegexp($this->getProject());
+        }
+                        
+        $in = null;
+        try {
+            $in = new BufferedReader(new FileReader($file));        
+            $teststr = $in->readLine();
+            while ($teststr !== null) {
+                if ($this->myExpression->matches($teststr)) {
+                    return true;
+                }
+                $teststr = $in->readLine();
+            }
+            return false;
+        } catch (IOException $ioe) {
+            if ($in) $in->close();
+            throw new BuildException("Could not read file " . $filename);
+        }
+        $in->close();                
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ContainsRegexpSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ContainsSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ContainsSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ContainsSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,151 @@
+<?php
+
+/*
+ * $Id: ContainsSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/types/selectors/BaseExtendSelector.php';
+
+/**
+ * Selector that filters files based on whether they contain a
+ * particular string.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Bruce Atherton <bruce en callenish.com> (Ant)
+ * @package phing.types.selectors
+ */
+class ContainsSelector extends BaseExtendSelector {
+
+    private $contains = null;
+    private $casesensitive = true;
+    const CONTAINS_KEY = "text";
+    const CASE_KEY = "casesensitive";
+
+    public function toString() {
+        $buf = "{containsselector text: ";
+        $buf .= $this->contains;
+        $buf .= " casesensitive: ";
+        if ($this->casesensitive) {
+            $buf .= "true";
+        } else {
+            $buf .= "false";
+        }
+        $buf .= "}";
+        return $buf;
+    }
+
+    /**
+     * The string to search for within a file.
+     *
+     * @param string $contains the string that a file must contain to be selected.
+     */
+    public function setText($contains) {
+        $this->contains = $contains;
+    }
+
+    /**
+     * Whether to ignore case in the string being searched.
+     *
+     * @param boolean $casesensitive whether to pay attention to case sensitivity
+     */
+    public function setCasesensitive($casesensitive) {
+        $this->casesensitive = $casesensitive;
+    }
+
+    /**
+     * When using this as a custom selector, this method will be called.
+     * It translates each parameter into the appropriate setXXX() call.
+     *
+     * @param array $parameters the complete set of parameters for this selector
+     */
+    public function setParameters($parameters) {
+        parent::setParameters($parameters);
+        if ($parameters !== null) {
+            for ($i=0,$size=count($parameters); $i < $size; $i++) {
+                $paramname = $parameters[$i]->getName();
+                switch(strtolower($paramname)) {
+                    case self::CONTAINS_KEY:
+                        $this->setText($parameters[$i]->getValue());
+                        break;
+                    case self::CASE_KEY:
+                        $this->setCasesensitive($parameters[$i]->getValue());
+                        break;
+                    default:
+                        $this->setError("Invalid parameter " . $paramname);
+                }                
+            } // for each param
+        } // if params
+    }
+
+    /**
+     * Checks to make sure all settings are kosher. In this case, it
+     * means that the pattern attribute has been set.
+     *
+     */
+    public function verifySettings() {
+        if ($this->contains === null) {
+            $this->setError("The text attribute is required");
+        }
+    }
+
+    /**
+     * The heart of the matter. This is where the selector gets to decide
+     * on the inclusion of a file in a particular fileset.
+     *
+     * @param basedir the base directory the scan is being done from
+     * @param filename is the name of the file to check
+     * @param file a PhingFile object the selector can use
+     * @return whether the file should be selected or not
+     */
+    public function isSelected(PhingFile $basedir, $filename, PhingFile $file) {
+
+        $this->validate();
+
+        if ($file->isDirectory()) {
+            return true;
+        }
+
+        $userstr = $this->contains;
+        if (!$this->casesensitive) {
+            $userstr = strtolower($this->contains);
+        }
+        
+        $in = null;
+        try {
+            $in = new BufferedReader(new FileReader($file));        
+            $teststr = $in->readLine();
+            while ($teststr !== null) {
+                if (!$this->casesensitive) {
+                    $teststr = strtolower($teststr);
+                }
+                if (strpos($teststr, $userstr) !== false) {
+                    return true;
+                }
+                $teststr = $in->readLine();
+            }
+            return false;
+        } catch (IOException $ioe) {
+            if ($in) $in->close();
+            throw new BuildException("Could not read file " . $filename);
+        }
+        $in->close();                
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ContainsSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/DateSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/DateSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/DateSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,214 @@
+<?php
+
+/*
+ * $Id: DateSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/types/selectors/BaseExtendSelector.php';
+
+/**
+ * Selector that chooses files based on their last modified date. Ant uses
+ * millisecond precision (thanks to Java); PHP is forced to use only seconds
+ * precision.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author    Bruce Atherton <bruce en callenish.com> (Ant)
+ * @version   $Revision: 1.10 $
+ * @package   phing.types.selecctors
+ */
+class DateSelector extends BaseExtendSelector {
+
+    private $seconds = -1; // millis in Ant, but PHP doesn't support that level of precision
+    private $dateTime = null;
+    private $includeDirs = false;
+    private $granularity = 0;
+    private $cmp = 2;
+    const MILLIS_KEY = "millis";
+    const DATETIME_KEY = "datetime";
+    const CHECKDIRS_KEY = "checkdirs";
+    const GRANULARITY_KEY = "granularity";
+    const WHEN_KEY = "when";
+    private static $timeComparisons = array("before", "after", "equal");
+    
+    public function __construct() {
+        //if (Os.isFamily("dos")) {
+        //    granularity = 2000;
+        //}
+    }
+
+    public function toString() {
+        $buf = "{dateselector date: ";
+        $buf .= $this->dateTime;
+        $buf .= " compare: ";
+        if ($this->cmp === 0) {
+            $buf .= "before";
+        } elseif ($this->cmp === 1) {
+            $buf .= "after";
+        } else {
+            $buf .= "equal";
+        }
+        $buf .= " granularity: ";
+        $buf .= $this->granularity;
+        $buf .= "}";
+        return $buf;
+    }
+
+    /**
+     * For users that prefer to express time in seconds since 1970
+     *
+     * @param int $seconds the time to compare file's last modified date to,
+     *        expressed in milliseconds
+     */
+    public function setSeconds($seconds) {
+        $this->seconds = (int) $seconds;
+    }
+
+    /**
+     * Returns the seconds value the selector is set for.
+     */
+    public function getSeconds() {
+        return $this->seconds;
+    }
+
+    /**
+     * Sets the date. The user must supply it in MM/DD/YYYY HH:MM AM_PM
+     * format
+     *
+     * @param string $dateTime a string in MM/DD/YYYY HH:MM AM_PM format
+     */
+    public function setDatetime($dateTime) {        
+        $dt = strtotime($dateTime);
+        if ($dt == -1) {
+            $this->setError("Date of " . $dateTime
+                        . " Cannot be parsed correctly. It should be in"
+                        . " a format parsable by PHP's strtotime() function.");
+        } else {        
+            $this->dateTime = $dateTime;
+            $this->setSeconds($dt);
+        }
+    }
+
+    /**
+     * Should we be checking dates on directories?
+     *
+     * @param boolean $includeDirs whether to check the timestamp on directories
+     */
+    public function setCheckdirs($includeDirs) {
+        $this->includeDirs = (boolean) $includeDirs;
+    }
+
+    /**
+     * Sets the number of milliseconds leeway we will give before we consider
+     * a file not to have matched a date.
+     * @param int $granularity
+     */
+    public function setGranularity($granularity) {
+        $this->granularity = (int) $granularity;
+    }
+
+    /**
+     * Sets the type of comparison to be done on the file's last modified
+     * date.
+     *
+     * @param string $cmp The comparison to perform
+     */
+    public function setWhen($cmp) {
+        $idx = array_search($cmp, self::$timeComparisons, true);
+        if ($idx === null) {
+            $this->setError("Invalid value for ".WHEN_KEY.": ".$cmp);
+        } else {
+            $this->cmp = $idx;
+        }
+    }
+
+    /**
+     * When using this as a custom selector, this method will be called.
+     * It translates each parameter into the appropriate setXXX() call.
+     *
+     * @param array $parameters the complete set of parameters for this selector
+     */
+    public function setParameters($parameters) {
+        parent::setParameters($parameters);
+        if ($parameters !== null) {
+            for ($i=0,$size=count($parameters); $i < $size; $i++) {
+                $paramname = $parameters[$i]->getName();
+                switch(strtolower($paramname)) {
+                    case self::MILLIS_KEY:
+                        $this->setMillis($parameters[$i]->getValue());
+                        break;
+                    case self::DATETIME_KEY:
+                        $this->setDatetime($parameters[$i]->getValue());
+                        break;
+                    case self::CHECKDIRS_KEY:
+                        $this->setCheckdirs($parameters[$i]->getValue());
+                        break;                    
+                    case self::GRANULARITY_KEY:
+                        $this->setGranularity($parameters[$i]->getValue());
+                        break;
+                    case self::WHEN_KEY:
+                        $this->setWhen($parameters[$i]->getValue());
+                        break;
+                    default:
+                        $this->setError("Invalid parameter " . $paramname);
+                } // switch
+            }
+        }
+    }
+
+    /**
+     * This is a consistency check to ensure the selector's required
+     * values have been set.
+     */
+    public function verifySettings() {
+        if ($this->dateTime === null && $this->seconds < 0) {
+            $this->setError("You must provide a datetime or the number of "
+                . "seconds.");
+        } elseif ($this->seconds < 0) {
+            $this->setError("Date of " . $this->dateTime
+                . " results in negative seconds"
+                . " value relative to epoch (January 1, 1970, 00:00:00 GMT).");
+        }
+    }
+
+    /**
+     * The heart of the matter. This is where the selector gets to decide
+     * on the inclusion of a file in a particular fileset.
+     *
+     * @param PhingFile $basedir the base directory the scan is being done from
+     * @param string $filename is the name of the file to check
+     * @param PhingFile $file is a PhingFile object the selector can use
+     * @return boolean Whether the file should be selected or not
+     */
+    public function isSelected(PhingFile $basedir, $filename, PhingFile $file) {
+        $this->validate();
+        if ($file->isDirectory() && ($this->includeDirs === false)) {
+            return true;
+        }
+        if ($this->cmp === 0) {
+            return (($file->lastModified() - $this->granularity) < $this->seconds);
+        } elseif ($this->cmp === 1) {
+            return (($file->lastModified() . $this->granularity) > $this->seconds);
+        } else {
+            return (abs($file->lastModified() -  $this->seconds) <= $this->granularity);
+        }
+    }
+
+}
+
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/DateSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/DependSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/DependSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/DependSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,151 @@
+<?php
+
+/*
+ * $Id: DependSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/types/selectors/BaseSelector.php';
+ 
+/**
+ * Selector that filters files based on whether they are newer than
+ * a matching file in another directory tree. It can contain a mapper
+ * element, so isn't available as an ExtendSelector (since those
+ * parameters can't hold other elements).
+ *
+ * @author    Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author    Bruce Atherton <bruce en callenish.com> (Ant)
+ * @version   $Revision: 1.8 $
+ * @package   phing.types.selectors
+ */
+class DependSelector extends BaseSelector {
+
+    private $targetdir = null;
+    private $mapperElement = null;
+    private $map = null;
+    private $granularity = 0;
+
+    public function __construct() {
+        // not yet supported:
+        //if (Os.isFamily("dos")) {
+        //    $this->granularity = 2000;
+        //}
+    }
+
+    public function toString() {
+        $buf = "{dependselector targetdir: ";
+        if ($this->targetdir === null) {
+            $buf .= "NOT YET SET";
+        } else {
+            $buf .= $this->targetdir->getName();
+        }        
+        $buf .= " granularity: ";
+        $buf .= $this->granularity;
+        if ($this->map !== null) {
+            $buf .= " mapper: ";
+            $buf .= $this->map->toString();
+        } elseif ($this->mapperElement !== null) {
+            $buf .= " mapper: ";
+            $buf .= $this->mapperElement->toString();
+        }
+        $buf .= "}";
+        return $buf;
+    }
+
+    /**
+     * The name of the file or directory which is checked for out-of-date
+     * files.
+     *
+     * @param targetdir the directory to scan looking for files.
+     */
+    public function setTargetdir(PhingFile $targetdir) {
+        $this->targetdir = $targetdir;
+    }
+
+    /**
+     * Sets the number of milliseconds leeway we will give before we consider
+     * a file out of date.
+     */
+    public function setGranularity($granularity) {
+        $this->granularity = (int) granularity;
+    }
+
+    /**
+     * Defines the FileNameMapper to use (nested mapper element).
+     * @throws BuildException
+     */
+    public function createMapper() {
+        if ($this->mapperElement !== null) {
+            throw new BuildException("Cannot define more than one mapper");
+        }
+        $this->mapperElement = new Mapper($this->project);
+        return $this->mapperElement;
+    }
+
+
+    /**
+     * Checks to make sure all settings are kosher. In this case, it
+     * means that the dest attribute has been set and we have a mapper.
+     */
+    public function verifySettings() {
+        if ($this->targetdir === null) {
+            $this->setError("The targetdir attribute is required.");
+        }
+        if ($this->mapperElement === null) {
+            $this->map = new IdentityMapper();
+        } else {
+            $this->map = $this->mapperElement->getImplementation();
+        }
+        if ($this->map === null) {
+            $this->setError("Could not set <mapper> element.");
+        }
+    }
+
+    /**
+     * The heart of the matter. This is where the selector gets to decide
+     * on the inclusion of a file in a particular fileset.
+     *
+     * @param basedir the base directory the scan is being done from
+     * @param filename is the name of the file to check
+     * @param file is a PhingFile object the selector can use
+     * @return whether the file should be selected or not
+     */
+    public function isSelected(PhingFile $basedir, $filename, PhingFile $file) {
+
+        $this->validate();
+        
+        // Determine file whose out-of-dateness is to be checked
+        $destfiles = $this->map->main($filename);
+        
+        // If filename does not match the To attribute of the mapper
+        // then filter it out of the files we are considering
+        if ($destfiles === null) {
+            return false;
+        }
+        // Sanity check
+        if (count($destfiles) !== 1 || $destfiles[0] === null) {
+            throw new BuildException("Invalid destination file results for " . $this->targetdir . " with filename " . $filename);
+        }
+        $destname = $destfiles[0];
+        $destfile = new PhingFile($this->targetdir, $destname);
+
+        return SelectorUtils::isOutOfDate($file, $destfile, $this->granularity);
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/DependSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/DepthSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/DepthSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/DepthSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,158 @@
+<?php
+/*
+ * $Id: DepthSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/types/selectors/BaseExtendSelector.php';
+
+/**
+ * Selector that filters files based on the how deep in the directory
+ * tree they are.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author    Bruce Atherton <bruce en callenish.com> (Ant)
+ * @version   $Revision: 1.7 $
+ * @package   phing.types.selectors
+ */
+class DepthSelector extends BaseExtendSelector {
+
+    public $min = -1;
+    public $max = -1;
+    const MIN_KEY = "min";
+    const MAX_KEY = "max";
+
+    public function toString() {
+        $buf = "{depthselector min: ";
+        $buf .= $this->min;
+        $buf .= " max: ";
+        $buf .= $this->max;
+        $buf .= "}";
+        return $buf;
+    }
+
+    /**
+     * The minimum depth below the basedir before a file is selected.
+     *
+     * @param min minimum directory levels below basedir to go
+     */
+    public function setMin($min) {
+        $this->min = (int) $min;
+    }
+
+    /**
+     * The minimum depth below the basedir before a file is selected.
+     *
+     * @param min maximum directory levels below basedir to go
+     */
+    public function setMax($max) {
+        $this->max = (int) $max;
+    }
+
+    /**
+     * When using this as a custom selector, this method will be called.
+     * It translates each parameter into the appropriate setXXX() call.
+     *
+     * @param parameters the complete set of parameters for this selector
+     */
+    public function setParameters($parameters) {
+        parent::setParameters($parameters);
+        if ($parameters !== null) {
+            for ($i = 0, $size=count($parameters); $i < $size; $i++) {
+                $paramname = $parameters[$i]->getName();
+                switch(strtolower($paramname)) {
+                    case self::MIN_KEY:
+                        $this->setMin($parameters[$i]->getValue());
+                        break;
+                    case self::MAX_KEY:
+                        $this->setMax($parameters[$i]->getValue());
+                        break;
+                        
+                    default:
+                        $this->setError("Invalud parameter " . $paramname);
+                } // switch                
+            }
+        }
+    }
+
+    /**
+     * Checks to make sure all settings are kosher. In this case, it
+     * means that the max depth is not lower than the min depth.
+     */
+    public function verifySettings() {
+        if ($this->min < 0 && $this->max < 0) {
+            $this->setError("You must set at least one of the min or the " .
+                    "max levels.");
+        }
+        if ($this->max < $this->min && $this->max > -1) {
+            $this->setError("The maximum depth is lower than the minimum.");
+        }
+    }
+
+    /**
+     * The heart of the matter. This is where the selector gets to decide
+     * on the inclusion of a file in a particular fileset. Most of the work
+     * for this selector is offloaded into SelectorUtils, a static class
+     * that provides the same services for both FilenameSelector and
+     * DirectoryScanner.
+     *
+     * @param basedir the base directory the scan is being done from
+     * @param filename is the name of the file to check
+     * @param file is a PhingFile object the selector can use
+     * @return whether the file should be selected or not
+     */
+    public function isSelected(PhingFile $basedir, $filename, PhingFile $file) {
+
+        $this->validate();
+
+        $depth = -1;
+        // If you felt daring, you could cache the basedir absolute path
+        $abs_base = $basedir->getAbsolutePath();
+        $abs_file = $file->getAbsolutePath();
+        
+        $tok_base = explode(DIRECTORY_SEPARATOR, $abs_base);
+        $tok_file = explode(DIRECTORY_SEPARATOR, $abs_file);
+        
+        for($i=0,$size=count($tok_file); $i < $size; $i++) {
+            $filetoken = $tok_file[$i];
+            if (isset($tok_base[$i])) {
+                $basetoken = $tok_base[$i];
+                // Sanity check. Ditch it if you want faster performance
+                if ($basetoken !== $filetoken) {
+                    throw new BuildException("File " . $filename .
+                        " does not appear within " . $abs_base . "directory");
+                }
+            } else { // no more basepath tokens
+                $depth++;
+                if ($this->max > -1 && $depth > $this->max) {
+                    return false;
+                }
+            }
+        }
+        if (isset($tok_base[$i + 1])) {
+            throw new BuildException("File " . $filename .
+                " is outside of " . $abs_base . "directory tree");
+        }
+        if ($this->min > -1 && $depth < $this->min) {
+            return false;
+        }
+        return true;
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/DepthSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ExtendFileSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ExtendFileSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ExtendFileSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * $Id: ExtendFileSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/types/Parameterizable.php';
+require_once 'phing/types/selectors/FileSelector.php';
+
+/**
+ * This is the interface to be used by all custom selectors, those that are
+ * called through the &lt;custom&gt; tag. It is the amalgamation of two
+ * interfaces, the FileSelector and the Paramterizable interface. Note that
+ * you will almost certainly want the default behaviour for handling
+ * Parameters, so you probably want to use the BaseExtendSelector class
+ * as the base class for your custom selector rather than implementing
+ * this interface from scratch.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Bruce Atherton <bruce en callenish.com> (Ant)
+ * @package phing.types.selectors
+ */
+interface ExtendFileSelector extends Parameterizable, FileSelector {
+  // No further methods necessary. This is just an amalgamation of two other
+  // interfaces.
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ExtendFileSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ExtendSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ExtendSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ExtendSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,127 @@
+<?php
+
+/*
+ * $Id: ExtendSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/util/StringHelper.php';
+
+/**
+ * Selector that selects files by forwarding the request on to other classes.
+ *
+ * TODO:
+ *        Consider adding Path (org.apache.tools.ant.types.Path) support to this class
+ *         and to the Mappers class.  See Ant versions for implimentation details.
+ *
+ * @author <a href="mailto:bruce en callenish.com">Bruce Atherton</a>
+ * @package phing.types.selectors
+ */
+class ExtendSelector extends BaseSelector {
+
+    private $classname;
+    private $dynselector;
+    private $parameters = array();
+
+    /**
+     * Sets the classname of the custom selector.
+     *
+     * @param classname is the class which implements this selector
+     */
+    public function setClassname($classname) {
+        $this->classname = $classname;
+    }
+
+    /**
+     * Instantiates the identified custom selector class.
+     */
+    public function selectorCreate() {
+        if ($this->classname !== null && $this->classname !== "") {      
+            try {
+                // assume it's fully qualified, import it
+                $cls = Phing::import($this->classname);
+       
+                // make sure class exists
+                if (class_exists($cls)) {
+                    $this->dynselector = new $cls();
+                } else {
+                    $this->setError("Selector " . $this->classname . " not initialized, no such class");
+                }            
+            } catch (Exception $e) {
+                $this->setError("Selector " . $this->classname . " not initialized, could not create class: " . $e->getMessage());
+            }            
+        } else {
+            $this->setError("There is no classname specified");
+        }
+    }
+
+    /**
+     * Create new parameters to pass to custom selector.
+     *
+     * @param p The new Parameter object
+     */
+    public function addParam(Parameter $p) {
+        $this->parameters[] = $p;
+    }
+
+    /**
+     * These are errors specific to ExtendSelector only. If there are
+     * errors in the custom selector, it should throw a BuildException
+     * when isSelected() is called.
+     */
+    public function verifySettings() {
+        // Creation is done here rather than in isSelected() because some
+        // containers may do a validation pass before running isSelected(),
+        // but we need to check for the existence of the created class.
+        if ($this->dynselector === null) {
+            $this->selectorCreate();
+        }
+        
+        if (empty($this->classname)) {
+            $this->setError("The classname attribute is required");
+        } elseif ($this->dynselector === null) {
+            $this->setError("Internal Error: The custom selector was not created");
+        } elseif ( !($this->dynselector instanceof ExtendFileSelector) && (count($this->parameters) > 0)) {
+            $this->setError("Cannot set parameters on custom selector that does not "
+                   . "implement ExtendFileSelector.");
+        }
+    }
+
+
+    /**
+     * Allows the custom selector to choose whether to select a file. This
+     * is also where the Parameters are passed to the custom selector,
+     * since we know we must have them all by now. And since we must know
+     * both classpath and classname, creating the class is deferred to here
+     * as well.
+     *
+     * @throws BuildException
+     */
+    public function isSelected(PhingFile $basedir, $filename, PhingFile $file) {
+        
+        $this->validate();
+        
+        if (count($this->parameters) > 0 && $this->dynselector instanceof ExtendFileSelector) {            
+            // We know that dynselector must be non-null if no error message
+            $this->dynselector->setParameters($this->parameters);
+        }
+        return $this->dynselector->isSelected($basedir, $filename, $file);
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/ExtendSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/FileSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/FileSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/FileSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * $Id: FileSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ * This is the interface to be used by all selectors.
+ *
+ * @author Hans Lellelid, hans en xmpl.org (Phing)
+ * @author Bruce Atherton, bruce en callenish.com (Ant)
+ * @package phing.types.selectors
+ */
+interface FileSelector {
+
+    /**
+     * Method that each selector will implement to create their
+     * selection behaviour. If there is a problem with the setup
+     * of a selector, it can throw a BuildException to indicate
+     * the problem.
+     *
+     * @param basedir A PhingFile object for the base directory
+     * @param filename The name of the file to check
+     * @param file A PhingFile object for this filename
+     * @return whether the file should be selected or not
+     * @throws BuildException if the selector was not configured correctly
+     */
+    public function isSelected(PhingFile $basedir, $filename, PhingFile $file);
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/FileSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/FilenameSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/FilenameSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/FilenameSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,157 @@
+<?php
+
+/*
+ * $Id: FilenameSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+
+include_once 'phing/types/selectors/BaseExtendSelector.php';
+
+/**
+ * Selector that filters files based on the filename.
+ *
+ * @author Hans Lellelid, hans en xmpl.org (Phing)
+ * @author Bruce Atherton, bruce en callenish.com (Ant)
+ * @package phing.types.selectors
+ */
+class FilenameSelector extends BaseExtendSelector {
+
+    private $pattern = null;
+    private $casesensitive = true;
+    private $negated = false;
+    const NAME_KEY = "name";
+    const CASE_KEY = "casesensitive";
+    const NEGATE_KEY = "negate";
+
+    public function toString() {
+        $buf = "{filenameselector name: ";
+        $buf .= $this->pattern;
+        $buf .= " negate: ";
+        if ($this->negated) {
+            $buf .= "true";
+        } else {
+            $buf .= "false";
+        }
+        $buf .= " casesensitive: ";
+        if ($this->casesensitive) {
+            $buf .= "true";
+        } else {
+            $buf .= "false";
+        }
+        $buf .= "}";
+        return $buf;
+    }
+
+    /**
+     * The name of the file, or the pattern for the name, that
+     * should be used for selection.
+     *
+     * @param pattern the file pattern that any filename must match
+     *                against in order to be selected.
+     */
+    public function setName($pattern) {
+        $pattern = str_replace('\\', DIRECTORY_SEPARATOR, $pattern);
+        $pattern = str_replace('/', DIRECTORY_SEPARATOR, $pattern);
+                
+        if (StringHelper::endsWith(DIRECTORY_SEPARATOR, $pattern)) {
+            $pattern .= "**";
+        }
+        $this->pattern = $pattern;
+    }
+
+    /**
+     * Whether to ignore case when checking filenames.
+     *
+     * @param casesensitive whether to pay attention to case sensitivity
+     */
+    public function setCasesensitive($casesensitive) {
+        $this->casesensitive = $casesensitive;
+    }
+
+    /**
+     * You can optionally reverse the selection of this selector,
+     * thereby emulating an &lt;exclude&gt; tag, by setting the attribute
+     * negate to true. This is identical to surrounding the selector
+     * with &lt;not&gt;&lt;/not&gt;.
+     *
+     * @param negated whether to negate this selection
+     */
+    public function setNegate($negated) {
+        $this->negated = $negated;
+    }
+
+    /**
+     * When using this as a custom selector, this method will be called.
+     * It translates each parameter into the appropriate setXXX() call.
+     *
+     * @param array $parameters the complete set of parameters for this selector
+     */
+    public function setParameters($parameters) {
+        parent::setParameters($parameters);
+        if ($parameters !== null) {
+            for ($i=0, $len=count($parameters); $i < $len; $i++) {
+                $paramname = $parameters[$i]->getName();
+                switch(strtolower($paramname)) {
+                    case self::NAME_KEY:
+                        $this->setName($parameters[$i]->getValue());
+                        break;
+                    case self::CASE_KEY:
+                        $this->setCasesensitive($parameters[$i]->getValue());
+                        break;
+                    case self::NEGATE_KEY:
+                        $this->setNegate($parameters[$i]->getValue());
+                        break;
+                    default:
+                        $this->setError("Invalid parameter " . $paramname);
+                }
+            } // for each param
+        } // if params
+    }
+
+    /**
+     * Checks to make sure all settings are kosher. In this case, it
+     * means that the name attribute has been set.
+     *
+     */
+    public function verifySettings() {
+        if ($this->pattern === null) {
+            $this->setError("The name attribute is required");
+        }
+    }
+
+    /**
+     * The heart of the matter. This is where the selector gets to decide
+     * on the inclusion of a file in a particular fileset. Most of the work
+     * for this selector is offloaded into SelectorUtils, a static class
+     * that provides the same services for both FilenameSelector and
+     * DirectoryScanner.
+     *
+     * @param basedir the base directory the scan is being done from
+     * @param filename is the name of the file to check
+     * @param file is a PhingFile object the selector can use
+     * @return whether the file should be selected or not
+     */
+    public function isSelected(PhingFile $basedir, $filename, PhingFile $file) {
+        $this->validate();
+        return (SelectorUtils::matchPath($this->pattern, $filename, $this->casesensitive) 
+            === !($this->negated));
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/FilenameSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/MajoritySelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/MajoritySelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/MajoritySelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,92 @@
+<?php
+
+/*
+ * $Id: MajoritySelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+
+/**
+ * This selector is here just to shake up your thinking a bit. Don't get
+ * too caught up in boolean, there are other ways you can evaluate a
+ * collection of selectors. This one takes a vote of the selectors it
+ * contains, and majority wins. You could also have an "all-but-one"
+ * selector, a "weighted-average" selector, and so on. These are left
+ * as exercises for the reader (as are the usecases where this would
+ * be necessary).
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Bruce Atherton <bruce en callenish.com> (Ant)
+ * @package phing.types.selectors
+ */
+class MajoritySelector extends BaseSelectorContainer {
+
+    private $allowtie = true;
+
+    public function toString() {
+        $buf = "";
+        if ($this->hasSelectors()) {
+            $buf .= "{majorityselect: ";
+            $buf .= parent::toString();
+            $buf .= "}";
+        }
+        return $buf;
+    }
+
+    public function setAllowtie($tiebreaker) {
+        $this->allowtie = $tiebreaker;
+    }
+
+    /**
+     * Returns true (the file is selected) if most of the other selectors
+     * agree. In case of a tie, go by the allowtie setting. That defaults
+     * to true, meaning in case of a tie, the file is selected.
+     *
+     * @param basedir the base directory the scan is being done from
+     * @param filename is the name of the file to check
+     * @param file is a PhingFile object for the filename that the selector
+     * can use
+     * @return whether the file should be selected or not
+     */
+    public function isSelected(PhingFile $basedir, $filename, PhingFile $file) {
+        
+        $this->validate();
+        
+        $yesvotes = 0;
+        $novotes = 0;
+        
+        $selectors = $this->selectorElements();
+        for($i=0,$size=count($selectors); $i < $size; $i++) {
+            $result = $selectors[$i]->isSelected($basedir,$filename,$file);
+            if ($result) {
+                $yesvotes = $yesvotes + 1;
+            } else {
+                $novotes = $novotes + 1;
+            }
+        }
+        if ($yesvotes > $novotes) {
+            return true;
+        }
+        else if ($novotes > $yesvotes) {
+            return false;
+        }
+        // At this point, we know we have a tie.
+        return $this->allowtie;
+    }
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/MajoritySelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/NoneSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/NoneSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/NoneSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,71 @@
+<?php
+/*
+ * $Id: NoneSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+require_once 'phing/types/selectors/BaseSelectorContainer.php';
+
+/**
+ * This selector has a collection of other selectors. All of those selectors
+ * must refuse to select a file before the file is considered selected by
+ * this selector.
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @author Bruce Atherton <bruce en callenish.com> (Ant)
+ * @package phing.types.selectors
+ */
+class NoneSelector extends BaseSelectorContainer {
+
+    public function toString() {
+        $buf = "";
+        if ($this->hasSelectors()) {
+            $buf .= "{noneselect: ";
+            $buf .= parent::toString();
+            $buf .= "}";
+        }
+        return $buf;
+    }
+
+    /**
+     * Returns true (the file is selected) only if all other selectors
+     * agree that the file should not be selected.
+     *
+     * @param basedir the base directory the scan is being done from
+     * @param filename is the name of the file to check
+     * @param file is a java.io.File object for the filename that the selector
+     * can use
+     * @return whether the file should be selected or not
+     */
+    public function isSelected(PhingFile $basedir, $filename, PhingFile $file) {
+        
+        $this->validate();
+        
+        $selectors = $this->selectorElements();        
+
+        for($i=0,$size=count($selectors); $i < $size; $i++) {
+            $result = $selectors[$i]->isSelected($basedir, $filename, $file);
+            if ($result) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/NoneSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/NotSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/NotSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/NotSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * $Id: NotSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/types/selectors/NoneSelector.php';
+
+/**
+ * This selector has one other selectors whose meaning it inverts. It
+ * actually relies on NoneSelector for its implementation of the
+ * isSelected() method, but it adds a check to ensure there is only one
+ * other selector contained within.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Bruce Atherton <bruce en callenish.com> (Ant)
+ * @package phing.types.selectors
+ */
+class NotSelector extends NoneSelector {
+
+    public function toString() {
+        $buf = "";
+        if ($this->hasSelectors()) {
+            $buf .= "{notselect: ";
+            $buf .= parent::toString();
+            $buf .= "}";
+        }
+        return $buf;
+    }
+
+    /**
+     * Makes sure that there is only one entry, sets an error message if
+     * not.
+     */
+    public function verifySettings() {
+        if ($this->selectorCount() != 1) {
+            $this->setError("One and only one selector is allowed within the " .
+                    "<not> tag");
+        }
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/NotSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/OrSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/OrSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/OrSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,72 @@
+<?php
+/*
+ * $Id: OrSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/types/selectors/BaseSelectorContainer.php';
+ 
+/**
+ * This selector has a collection of other selectors, any of which have to
+ * select a file in order for this selector to select it.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Bruce Atherton <bruce en callenish.com> (Ant)
+ * @package phing.types.selectors
+ */
+class OrSelector extends BaseSelectorContainer {
+
+    public function toString() {
+        $buf = "";
+        if ($this->hasSelectors()) {
+            $buf .= "{orselect: ";
+            $buf .= parent::toString();
+            $buf .= "}";
+        }
+        return $buf;
+    }
+
+    /**
+     * Returns true (the file is selected) if any of the other selectors
+     * agree that the file should be selected.
+     *
+     * @param basedir the base directory the scan is being done from
+     * @param filename the name of the file to check
+     * @param file a PhingFile object for the filename that the selector
+     * can use
+     * @return boolean Whether the file should be selected or not
+     */
+    public function isSelected(PhingFile $basedir, $filename, PhingFile $file) {
+        
+        $this->validate();
+        
+        $selectors = $this->selectorElements();
+
+        // First, check that all elements are correctly configured
+        
+        for($i=0,$size=count($selectors); $i < $size; $i++) {
+            $result = $selectors[$i]->isSelected($basedir, $filename, $file);
+            if ($result) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/OrSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/PresentSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/PresentSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/PresentSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,154 @@
+<?php
+
+/*
+ * $Id: PresentSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+/**
+ * Selector that filters files based on whether they appear in another
+ * directory tree. It can contain a mapper element, so isn't available
+ * as an ExtendSelector (since those parameters can't hold other
+ * elements).
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Bruce Atherton <bruce en callenish.com> (Ant)
+ * @package phing.types.selectors
+ */
+class PresentSelector extends BaseSelector {
+
+    private $targetdir = null;
+    private $mapperElement = null;
+    private $map = null;
+    private $destmustexist = true;
+    private static $filePresence = array("srconly", "both");
+    
+    public function toString() {
+        $buf = "{presentselector targetdir: ";
+        if ($this->targetdir === null) {
+            $buf .= "NOT YET SET";
+        } else {
+            $buf .= $this->targetdir->getName();
+        }
+        $buf .= " present: ";
+        if ($this->destmustexist) {
+            $buf .= "both";
+        } else {
+            $buf .= "srconly";
+        }
+        if ($this->map !== null) {
+            $buf .= $this->map->toString();
+        } elseif ($this->mapperElement !== null) {
+            $buf .= $this->mapperElement->toString();
+        }
+        $buf .= "}";
+        return $buf;
+    }
+
+    /**
+     * The name of the file or directory which is checked for matching
+     * files.
+     *
+     * @param targetdir the directory to scan looking for matching files.
+     */
+    public function setTargetdir(PhingFile $targetdir) {
+        $this->targetdir = $targetdir;
+    }
+
+    /**
+     * Defines the FileNameMapper to use (nested mapper element).
+     * @throws BuildException 
+     */
+    public function createMapper() {
+        if ($this->mapperElement !== null) {
+            throw new BuildException("Cannot define more than one mapper");
+        }
+        $this->mapperElement = new Mapper($this->getProject());
+        return $this->mapperElement;
+    }
+
+
+    /**
+     * This sets whether to select a file if its dest file is present.
+     * It could be a <code>negate</code> boolean, but by doing things
+     * this way, we get some documentation on how the system works.
+     * A user looking at the documentation should clearly understand
+     * that the ONLY files whose presence is being tested are those
+     * that already exist in the source directory, hence the lack of
+     * a <code>destonly</code> option.
+     *
+     * @param string $fp An attribute set to either <code>srconly</code or
+     *           ><code>both</code>.
+     */
+    public function setPresent($fp) {
+        $idx = array_search($fp, self::$filePresence, true);
+        if ( $idx === 0 ) {
+            $this->destmustexist = false;
+        }
+    }
+
+    /**
+     * Checks to make sure all settings are kosher. In this case, it
+     * means that the targetdir attribute has been set and we have a mapper.
+     */
+    public function verifySettings() {
+        if ($this->targetdir === null) {
+            $this->setError("The targetdir attribute is required.");
+        }
+        if ($this->mapperElement === null) {
+            $this->map = new IdentityMapper();
+        } else {
+            $this->map = $this->mapperElement->getImplementation();
+        }
+        if ($this->map === null) {
+            $this->setError("Could not set <mapper> element.");
+        }
+    }
+
+    /**
+     * The heart of the matter. This is where the selector gets to decide
+     * on the inclusion of a file in a particular fileset.
+     *
+     * @param basedir the base directory the scan is being done from
+     * @param filename is the name of the file to check
+     * @param file is a PhingFile object the selector can use
+     * @return whether the file should be selected or not
+     */
+    public function isSelected(PhingFile $basedir, $filename, PhingFile $file) {
+
+        $this->validate();
+
+        // Determine file whose existence is to be checked
+        $destfiles = $this->map->main($filename);
+        // If filename does not match the To attribute of the mapper
+        // then filter it out of the files we are considering
+        if ($destfiles === null) {
+            return false;
+        }
+        // Sanity check
+        if (count($destfiles) !== 1 || $destfiles[0] === null) {
+            throw new BuildException("Invalid destination file results for "
+                . $this->targetdir . " with filename " . $filename);
+        }
+        $destname = $destfiles[0];
+        $destfile = new PhingFile($this->targetdir, $destname);
+        return $destfile->exists() === $this->destmustexist;
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/PresentSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,124 @@
+<?php
+
+/*
+ * $Id: SelectSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/types/selectors/AndSelector.php';
+
+/**
+ * This selector just holds one other selector and forwards all
+ * requests to it. It exists so that there is a single selector
+ * type that can exist outside of any targets, as an element of
+ * project. It overrides all of the reference stuff so that it
+ * works as expected. Note that this is the only selector you
+ * can reference.
+ *
+ * @author    Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author    Bruce Atherton <bruce en callenish.com> (Ant)
+ * @version   $Revision: 1.6 $
+ * @package   phing.types.selectors
+ */
+class SelectSelector extends AndSelector {
+         
+    public function toString() {
+        $buf = "";
+        if ($this->hasSelectors()) {
+            $buf .= "{select: ";
+            $buf .= parent::toString();
+            $buf .= "}";
+        }
+        return $buf;
+    }
+
+    /**
+     * Performs the check for circular references and returns the
+     * referenced Selector.
+     */
+    private function getRef() {
+        $o = $this->getCheckedRef(get_class($this), "SelectSelector");
+        return $o;
+    }
+
+    /**
+     * Indicates whether there are any selectors here.
+     */
+    public function hasSelectors() {
+        if ($this->isReference()) {
+            return $this->getRef()->hasSelectors();
+        }
+        return parent::hasSelectors();
+    }
+
+    /**
+     * Gives the count of the number of selectors in this container
+     */
+    public function selectorCount() {
+        if ($this->isReference()) {
+            return $this->getRef()->selectorCount();
+        }
+        return parent::selectorCount();
+    }
+
+    /**
+     * Returns the set of selectors as an array.
+     */
+    public function getSelectors(Project $p) {
+        if ($this->isReference()) {
+            return $this->getRef()->getSelectors($p);
+        }
+        return parent::getSelectors($p);
+    }
+
+    /**
+     * Returns an enumerator for accessing the set of selectors.
+     */
+    public function selectorElements() {
+        if ($this->isReference()) {
+            return $this->getRef()->selectorElements();
+        }
+        return parent::selectorElements();
+    }
+
+    /**
+     * Add a new selector into this container.
+     *
+     * @param selector the new selector to add
+     * @return the selector that was added
+     */
+    public function appendSelector(FileSelector $selector) {
+        if ($this->isReference()) {
+            throw $this->noChildrenAllowed();
+        }
+        parent::appendSelector($selector);
+    }
+
+    /**
+     * Makes sure that there is only one entry, sets an error message if
+     * not.
+     */
+    public function verifySettings() {
+        if ($this->selectorCount() != 1) {
+            $this->setError("One and only one selector is allowed within the "
+            . "<selector> tag");
+        }
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectorContainer.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectorContainer.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectorContainer.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,141 @@
+<?php
+
+/*
+ * $Id: SelectorContainer.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+
+/**
+ * This is the interface for selectors that can contain other selectors.
+ *
+ * @author <a href="mailto:bruce en callenish.com">Bruce Atherton</a>
+ * @package phing.types.selectors
+ */
+interface SelectorContainer {
+
+    /**
+     * Indicates whether there are any selectors here.
+     *
+     * @return whether any selectors are in this container
+     */
+    public function hasSelectors();
+
+    /**
+     * Gives the count of the number of selectors in this container
+     *
+     * @return the number of selectors in this container
+     */
+    public function selectorCount();
+
+    /**
+     * Returns a *copy* of the set of selectors as an array.
+     *
+     * @return an array of selectors in this container
+     */
+    public function getSelectors(Project $p);
+
+    /**
+     * Returns an array for accessing the set of selectors.
+     *
+     * @return an enumerator that goes through each of the selectors
+     */
+    public function selectorElements();
+
+    /**
+     * Add a new selector into this container.
+     *
+     * @param selector the new selector to add
+     * @return the selector that was added
+     */
+    public function appendSelector(FileSelector $selector);
+
+    /* Methods below all add specific selectors */
+
+    /**
+     * add a "Select" selector entry on the selector list
+     */
+    public function createSelector();
+
+    /**
+     * add an "And" selector entry on the selector list
+     */
+    public function createAnd();
+
+    /**
+     * add an "Or" selector entry on the selector list
+     */
+    public function createOr();
+
+    /**
+     * add a "Not" selector entry on the selector list
+     */
+    public function createNot();
+
+    /**
+     * add a "None" selector entry on the selector list
+     */
+    public function createNone();
+
+    /**
+     * add a majority selector entry on the selector list
+     */
+    public function createMajority();
+
+    /**
+     * add a selector date entry on the selector list
+     */
+    public function createDate();
+
+    /**
+     * add a selector size entry on the selector list
+     */
+    public function createSize();
+
+    /**
+     * add a selector filename entry on the selector list
+     */
+    public function createFilename();
+
+    /**
+     * add an extended selector entry on the selector list
+     */
+    public function createCustom();
+
+    /**
+     * add a contains selector entry on the selector list
+     */
+    public function createContains();
+
+    /**
+     * add a present selector entry on the selector list
+     */
+    public function createPresent();
+
+    /**
+     * add a depth selector entry on the selector list
+     */
+    public function createDepth();
+
+    /**
+     * add a depends selector entry on the selector list
+     */
+    public function createDepend();
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectorContainer.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectorScanner.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectorScanner.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectorScanner.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * $Id: SelectorScanner.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+
+/**
+ * An interface used to describe the actions required by any type of
+ * directory scanner that supports Selecters.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Bruce Atherton <bruce en callenish.com> (Ant)
+ * @package phing.types.selectors
+ */
+interface SelectorScanner {
+
+    /**
+     * Sets the selectors the scanner should use.
+     *
+     * @param selectors the list of selectors
+     */
+    public function setSelectors($selectors);
+
+    /**
+     * Directories which were selected out of a scan.
+     *
+     * @param selectors list selector objects
+     */
+    public function getDeselectedDirectories();
+
+    /**
+     * Files which were selected out of a scan.
+     *
+     * @param selectors list selector objects
+     */
+    public function getDeselectedFiles();
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectorScanner.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectorUtils.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectorUtils.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectorUtils.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,440 @@
+<?php
+
+/*
+ * $Id: SelectorUtils.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+ 
+include_once 'phing/util/StringHelper.php';
+
+/**
+ * <p>This is a utility class used by selectors and DirectoryScanner. The
+ * functionality more properly belongs just to selectors, but unfortunately
+ * DirectoryScanner exposed these as protected methods. Thus we have to
+ * support any subclasses of DirectoryScanner that may access these methods.
+ * </p>
+ * <p>This is a Singleton.</p>
+ *
+ * @author Hans Lellelid, hans en xmpl.org (Phing)
+ * @author Arnout J. Kuiper, ajkuiper en wxs.nl (Ant)
+ * @author Magesh Umasankar
+ * @author Bruce Atherton, bruce en callenish.com (Ant)
+ * @package phing.types.selectors
+ */
+class SelectorUtils {
+
+    private static $instance;
+
+     /**
+      * Retrieves the instance of the Singleton.
+      */
+    public static function getInstance() {
+        if (!isset(self::$instance)) {
+            self::$instance = new SelectorUtils();
+        }
+        return self::$instance;
+    }
+
+    /**
+     * Tests whether or not a given path matches the start of a given
+     * pattern up to the first "**".
+     * <p>
+     * This is not a general purpose test and should only be used if you
+     * can live with false positives. For example, <code>pattern=**\a</code>
+     * and <code>str=b</code> will yield <code>true</code>.
+     *
+     * @param pattern The pattern to match against. Must not be
+     *                <code>null</code>.
+     * @param str     The path to match, as a String. Must not be
+     *                <code>null</code>.
+     * @param isCaseSensitive Whether or not matching should be performed
+     *                        case sensitively.
+     *
+     * @return whether or not a given path matches the start of a given
+     * pattern up to the first "**".
+     */
+    public static function matchPatternStart($pattern, $str, $isCaseSensitive = true) {
+
+        // When str starts with a DIRECTORY_SEPARATOR, pattern has to start with a
+        // DIRECTORY_SEPARATOR.
+        // When pattern starts with a DIRECTORY_SEPARATOR, str has to start with a
+        // DIRECTORY_SEPARATOR.
+        if (StringHelper::startsWith(DIRECTORY_SEPARATOR, $str) !==
+            StringHelper::startsWith(DIRECTORY_SEPARATOR, $pattern)) {
+            return false;
+        }
+
+        $patDirs = explode(DIRECTORY_SEPARATOR, $pattern);
+        $strDirs = explode(DIRECTORY_SEPARATOR, $str);
+
+        $patIdxStart = 0;
+        $patIdxEnd   = count($patDirs)-1;
+        $strIdxStart = 0;
+        $strIdxEnd   = count($strDirs)-1;
+
+        // up to first '**'
+        while ($patIdxStart <= $patIdxEnd && $strIdxStart <= $strIdxEnd) {
+            $patDir = $patDirs[$patIdxStart];
+            if ($patDir == "**") {
+                break;
+            }
+            if (!self::match($patDir, $strDirs[$strIdxStart], $isCaseSensitive)) {
+                return false;
+            }
+            $patIdxStart++;
+            $strIdxStart++;
+        }
+
+        if ($strIdxStart > $strIdxEnd) {
+            // String is exhausted
+            return true;
+        } elseif ($patIdxStart > $patIdxEnd) {
+            // String not exhausted, but pattern is. Failure.
+            return false;
+        } else {
+            // pattern now holds ** while string is not exhausted
+            // this will generate false positives but we can live with that.
+            return true;
+        }
+    }
+    
+    /**
+     * Tests whether or not a given path matches a given pattern.
+     *
+     * @param pattern The pattern to match against. Must not be
+     *                <code>null</code>.
+     * @param str     The path to match, as a String. Must not be
+     *                <code>null</code>.
+     * @param isCaseSensitive Whether or not matching should be performed
+     *                        case sensitively.
+     *
+     * @return <code>true</code> if the pattern matches against the string,
+     *         or <code>false</code> otherwise.
+     */
+    public static function matchPath($pattern, $str, $isCaseSensitive = true) {
+    
+        // When str starts with a DIRECTORY_SEPARATOR, pattern has to start with a
+        // DIRECTORY_SEPARATOR.
+        // When pattern starts with a DIRECTORY_SEPARATOR, str has to start with a
+        // DIRECTORY_SEPARATOR.
+        if (StringHelper::startsWith(DIRECTORY_SEPARATOR, $str) !==
+            StringHelper::startsWith(DIRECTORY_SEPARATOR, $pattern)) {
+            return false;
+        }
+
+        $patDirs = explode(DIRECTORY_SEPARATOR, $pattern);
+        $strDirs = explode(DIRECTORY_SEPARATOR, $str);
+
+        $patIdxStart = 0;
+        $patIdxEnd   = count($patDirs)-1;
+        $strIdxStart = 0;
+        $strIdxEnd   = count($strDirs)-1;
+        
+        // up to first '**'
+        while ($patIdxStart <= $patIdxEnd && $strIdxStart <= $strIdxEnd) {
+            $patDir = $patDirs[$patIdxStart];
+            if ($patDir == "**") {
+                break;
+            }
+            if (!self::match($patDir, $strDirs[$strIdxStart], $isCaseSensitive)) {
+                return false;
+            }
+            $patIdxStart++;
+            $strIdxStart++;
+        }
+        if ($strIdxStart > $strIdxEnd) {
+            // String is exhausted
+            for ($i=$patIdxStart; $i <= $patIdxEnd; $i++) {
+                if ($patDirs[$i] != "**") {
+                    return false;
+                }
+            }
+            return true;
+        } elseif ($patIdxStart > $patIdxEnd) {
+            // String not exhausted, but pattern is. Failure.
+            return false;
+        }
+
+        // up to last '**'
+        while ($patIdxStart <= $patIdxEnd && $strIdxStart <= $strIdxEnd) {
+            $patDir = $patDirs[$patIdxEnd];
+            if ($patDir == "**") {
+                break;
+            }
+            if (!self::match($patDir, $strDirs[$strIdxEnd], $isCaseSensitive)) {
+                return false;
+            }
+            $patIdxEnd--;
+            $strIdxEnd--;
+        }
+        
+        if ($strIdxStart > $strIdxEnd) {
+            // String is exhausted
+            for ($i = $patIdxStart; $i <= $patIdxEnd; $i++) {
+                if ($patDirs[$i] != "**") {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        while ($patIdxStart != $patIdxEnd && $strIdxStart <= $strIdxEnd) {
+            $patIdxTmp = -1;
+            for ($i = $patIdxStart+1; $i <= $patIdxEnd; $i++) {
+                if ($patDirs[$i] == "**") {
+                    $patIdxTmp = $i;
+                    break;
+                }
+            }
+            if ($patIdxTmp == $patIdxStart+1) {
+                // '**/**' situation, so skip one
+                $patIdxStart++;
+                continue;
+            }
+            // Find the pattern between padIdxStart & padIdxTmp in str between
+            // strIdxStart & strIdxEnd
+            $patLength = ($patIdxTmp-$patIdxStart-1);
+            $strLength = ($strIdxEnd-$strIdxStart+1);
+            $foundIdx  = -1;
+
+            //strLoop:    (start of outer loop)
+            for ($i=0; $i <= $strLength - $patLength; $i++) {                
+                for ($j = 0; $j < $patLength; $j++) {
+                    $subPat = $patDirs[$patIdxStart+$j+1];
+                    $subStr = $strDirs[$strIdxStart+$i+$j];
+                    if (!self::match($subPat, $subStr, $isCaseSensitive)) {
+                        continue 2; // continue up two levels (to strLoop:)
+                    }
+                }                                
+                $foundIdx = $strIdxStart+$i; // only reached if all sub patterns matched
+                break;
+            }
+
+            if ($foundIdx == -1) {
+                return false;
+            }
+
+            $patIdxStart = $patIdxTmp;
+            $strIdxStart = $foundIdx + $patLength;
+        }
+
+        for ($i = $patIdxStart; $i <= $patIdxEnd; $i++) {
+            if ($patDirs[$i] != "**") {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Tests whether or not a string matches against a pattern.
+     * The pattern may contain two special characters:<br>
+     * '*' means zero or more characters<br>
+     * '?' means one and only one character
+     *
+     * @param pattern The pattern to match against.
+     *                Must not be <code>null</code>.
+     * @param str     The string which must be matched against the pattern.
+     *                Must not be <code>null</code>.
+     * @param isCaseSensitive Whether or not matching should be performed
+     *                        case sensitively.
+     *
+     *
+     * @return <code>true</code> if the string matches against the pattern,
+     *         or <code>false</code> otherwise.
+     */
+    public static function match($pattern, $str, $isCaseSensitive = true) {
+    
+        $patArr = StringHelper::toCharArray($pattern);
+        $strArr = StringHelper::toCharArray($str);
+        $patIdxStart = 0;
+        $patIdxEnd   = count($patArr)-1;
+        $strIdxStart = 0;
+        $strIdxEnd   = count($strArr)-1;
+        
+        $containsStar = false;
+        for ($i = 0, $size=count($patArr); $i < $size; $i++) {
+            if ($patArr[$i] == '*') {
+                $containsStar = true;
+                break;
+            }
+        }
+
+        if (!$containsStar) {
+            // No '*'s, so we make a shortcut
+            if ($patIdxEnd != $strIdxEnd) {
+                return false; // Pattern and string do not have the same size
+            }
+            for ($i = 0; $i <= $patIdxEnd; $i++) {
+                $ch = $patArr[$i];
+                if ($ch != '?') {
+                    if ($isCaseSensitive && $ch !== $strArr[$i]) {
+                        return false;// Character mismatch
+                    }
+                    if (!$isCaseSensitive && strtoupper($ch) !==
+                        strtoupper($strArr[$i])) {
+                        return false; // Character mismatch
+                    }
+                }
+            }
+            return true; // String matches against pattern
+        }
+
+        if ($patIdxEnd == 0) {
+            return true; // Pattern contains only '*', which matches anything
+        }
+
+        // Process characters before first star
+        while(($ch = $patArr[$patIdxStart]) != '*' && $strIdxStart <= $strIdxEnd) {
+            if ($ch != '?') {
+                if ($isCaseSensitive && $ch !== $strArr[$strIdxStart]) {
+                    return false;// Character mismatch
+                }
+                if (!$isCaseSensitive && strtoupper($ch) !==
+                    strtoupper($strArr[$strIdxStart])) {
+                    return false;// Character mismatch
+                }
+            }
+            $patIdxStart++;
+            $strIdxStart++;
+        }
+        
+        if ($strIdxStart > $strIdxEnd) {
+            // All characters in the string are used. Check if only '*'s are
+            // left in the pattern. If so, we succeeded. Otherwise failure.
+            for ($i = $patIdxStart; $i <= $patIdxEnd; $i++) {
+                if ($patArr[$i] != '*') {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        // Process characters after last star
+        while(($ch = $patArr[$patIdxEnd]) != '*' && $strIdxStart <= $strIdxEnd) {
+            if ($ch != '?') {
+                if ($isCaseSensitive && $ch !== $strArr[$strIdxEnd]) {
+                    return false;// Character mismatch
+                }
+                if (!$isCaseSensitive && strtoupper($ch) !==
+                    strtoupper($strArr[$strIdxEnd])) {
+                    return false;// Character mismatch
+                }
+            }
+            $patIdxEnd--;
+            $strIdxEnd--;
+        }
+        if ($strIdxStart > $strIdxEnd) {
+            // All characters in the string are used. Check if only '*'s are
+            // left in the pattern. If so, we succeeded. Otherwise failure.
+            for ($i = $patIdxStart; $i <= $patIdxEnd; $i++) {
+                if ($patArr[$i] != '*') {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        // process pattern between stars. padIdxStart and patIdxEnd point
+        // always to a '*'.
+        while ($patIdxStart !== $patIdxEnd && $strIdxStart <= $strIdxEnd) {
+            $patIdxTmp = -1;
+            for ($i = $patIdxStart+1; $i <= $patIdxEnd; $i++) {
+                if ($patArr[$i] == '*') {
+                    $patIdxTmp = $i;
+                    break;
+                }
+            }
+            if ($patIdxTmp === $patIdxStart + 1) {
+                // Two stars next to each other, skip the first one.
+                $patIdxStart++;
+                continue;
+            }
+            // Find the pattern between padIdxStart & padIdxTmp in str between
+            // strIdxStart & strIdxEnd
+            $patLength = ($patIdxTmp - $patIdxStart - 1);
+            $strLength = ($strIdxEnd - $strIdxStart + 1);
+            $foundIdx  = -1;
+            
+            //strLoop:
+            for ($i = 0; $i <= $strLength - $patLength; $i++) {
+                for ($j = 0; $j < $patLength; $j++) {
+                    $ch = $patArr[$patIdxStart+$j+1];
+                    if ($ch != '?') {
+                        if ($isCaseSensitive && $ch !== $strArr[$strIdxStart+$i+$j]) {
+                               continue 2; //continue to strLoop:
+                        }
+                        if (!$isCaseSensitive && strtoupper($ch) !==
+                            strtoupper($strArr[$strIdxStart+$i+$j])) {
+                               continue 2; //continue to strLoop:
+                        }
+                    }
+                }
+                // only reached if sub loop completed w/o invoking continue 2
+                $foundIdx = $strIdxStart + $i;
+                break;
+            }
+
+            if ($foundIdx == -1) {
+                return false;
+            }
+
+            $patIdxStart = $patIdxTmp;
+            $strIdxStart = $foundIdx + $patLength;
+        }
+
+        // All characters in the string are used. Check if only '*'s are left
+        // in the pattern. If so, we succeeded. Otherwise failure.
+        for ($i = $patIdxStart; $i <= $patIdxEnd; $i++) {
+            if ($patArr[$i] != '*') {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Returns dependency information on these two files. If src has been
+     * modified later than target, it returns true. If target doesn't exist,
+     * it likewise returns true. Otherwise, target is newer than src and
+     * is not out of date, thus the method returns false. It also returns
+     * false if the src file doesn't even exist, since how could the
+     * target then be out of date.
+     *
+     * @param PhingFile $src the original file
+     * @param PhingFile $target the file being compared against
+     * @param int $granularity the amount in seconds of slack we will give in
+     *        determining out of dateness
+     * @return whether the target is out of date
+     */
+    public static function isOutOfDate(PhingFile $src, PhingFile $target, $granularity) {
+        if (!$src->exists()) {
+            return false;
+        }
+        if (!$target->exists()) {
+            return true;
+        }
+        if (($src->lastModified() - $granularity) > $target->lastModified()) {
+            return true;
+        }
+        return false;
+    }
+
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SelectorUtils.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SizeSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SizeSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SizeSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,228 @@
+<?php
+
+/*
+ * $Id: SizeSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+
+/**
+ * Selector that filters files based on their size.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author Bruce Atherton <bruce en callenish.com> (Ant)
+ * @package phing.types.selectors
+ */
+class SizeSelector extends BaseExtendSelector {
+
+    private $size = -1;
+    private $multiplier = 1;
+    private $sizelimit = -1;
+    private $cmp = 2;
+    const SIZE_KEY = "value";
+    const UNITS_KEY = "units";
+    const WHEN_KEY = "when";
+
+    private static $sizeComparisons =  array("less", "more", "equal");
+    private static $byteUnits = array("K", "k", "kilo", "KILO",
+                                 "Ki", "KI", "ki", "kibi", "KIBI",
+                                 "M", "m", "mega", "MEGA",
+                                 "Mi", "MI", "mi", "mebi", "MEBI",
+                                 "G", "g", "giga", "GIGA",
+                                 "Gi", "GI", "gi", "gibi", "GIBI",
+                                 "T", "t", "tera", "TERA",
+            /* You wish! */      "Ti", "TI", "ti", "tebi", "TEBI"
+                                 );
+
+    public function toString() {
+        $buf = "{sizeselector value: ";
+        $buf .= $this->sizelimit;
+        $buf .= "compare: ";
+        if ($this->cmp === 0) {
+            $buf .= "less";
+        } elseif ($this->cmp === 1) {
+            $buf .= "more";
+        } else {
+            $buf .= "equal";
+        }
+        $buf .= "}";
+        return $buf;
+    }
+
+    /**
+     * A size selector needs to know what size to base its selecting on.
+     * This will be further modified by the multiplier to get an
+     * actual size limit.
+     *
+     * @param size the size to select against expressed in units
+     */
+    public function setValue($size) {
+        $this->size = $size;
+        if (($this->multiplier !== 0) && ($this->size > -1)) {
+            $this->sizelimit = $size * $this->multiplier;
+        }
+    }
+
+    /**
+     * Sets the units to use for the comparison. This is a little
+     * complicated because common usage has created standards that
+     * play havoc with capitalization rules. Thus, some people will
+     * use "K" for indicating 1000's, when the SI standard calls for
+     * "k". Others have tried to introduce "K" as a multiple of 1024,
+     * but that falls down when you reach "M", since "m" is already
+     * defined as 0.001.
+     * <p>
+     * To get around this complexity, a number of standards bodies
+     * have proposed the 2^10 standard, and at least one has adopted
+     * it. But we are still left with a populace that isn't clear on
+     * how capitalization should work.
+     * <p>
+     * We therefore ignore capitalization as much as possible.
+     * Completely mixed case is not possible, but all upper and lower
+     * forms are accepted for all long and short forms. Since we have
+     * no need to work with the 0.001 case, this practice works here.
+     * <p>
+     * This function translates all the long and short forms that a
+     * unit prefix can occur in and translates them into a single
+     * multiplier.
+     *
+     * @param $units The units to compare the size to.
+     * @return void
+     */
+    public function setUnits($units) {
+        $i = array_search($units, self::$byteUnits, true);
+        if ($i === false) $i = -1; // make it java-like
+        
+        $this->multiplier = 0;
+        if (($i > -1) && ($i < 4)) {
+            $this->multiplier = 1000;
+        } elseif (($i > 3) && ($i < 9)) {
+            $this->multiplier = 1024;
+        } elseif (($i > 8) && ($i < 13)) {
+            $this->multiplier = 1000000;
+        } elseif (($i > 12) && ($i < 18)) {
+            $this->multiplier = 1048576;
+        } elseif (($i > 17) && ($i < 22)) {
+            $this->multiplier = 1000000000;
+        } elseif (($i > 21) && ($i < 27)) {
+            $this->multiplier = 1073741824;
+        } elseif (($i > 26) && ($i < 31)) {
+            $this->multiplier = 1000000000000;
+        } elseif (($i > 30) && ($i < 36)) {
+            $this->multiplier = 1099511627776;
+        }
+        if (($this->multiplier > 0) && ($this->size > -1)) {
+            $this->sizelimit = $this->size * $this->multiplier;
+        }
+    }
+
+    /**
+     * This specifies when the file should be selected, whether it be
+     * when the file matches a particular size, when it is smaller,
+     * or whether it is larger.
+     *
+     * @param cmp The comparison to perform, an EnumeratedAttribute
+     */
+    public function setWhen($cmp) {
+        $c = array_search($cmp, self::$sizeComparisons, true);
+        if ($c !== false) {
+            $this->cmp = $c;
+        }
+    }
+
+    /**
+     * When using this as a custom selector, this method will be called.
+     * It translates each parameter into the appropriate setXXX() call.
+     *
+     * @param parameters the complete set of parameters for this selector
+     */
+    public function setParameters($parameters) {
+        parent::setParameters($parameters);
+        if ($parameters !== null) {
+            for ($i = 0, $size=count($parameters); $i < $size; $i++) {
+                $paramname = $parameters[$i]->getName();
+                switch(strtolower($paramname)) {
+                    case self::SIZE_KEY:
+                        try {
+                            $this->setValue($parameters[$i]->getValue());
+                           } catch (Exception $nfe) {
+                               $this->setError("Invalid size setting "
+                                . $parameters[$i]->getValue());
+                           }
+                        break;
+                    case self::UNITS_KEY:                                                
+                        $this->setUnits($parameters[$i]->getValue());
+                        break;
+                    case self::WHEN_KEY:
+                        $this->setWhen($parameters[$i]->getValue());
+                        break;
+                    default:    
+                        $this->setError("Invalid parameter " . $paramname);
+                }
+            }
+        }
+    }
+
+    /**
+     * <p>Checks to make sure all settings are kosher. In this case, it
+     * means that the size attribute has been set (to a positive value),
+     * that the multiplier has a valid setting, and that the size limit
+     * is valid. Since the latter is a calculated value, this can only
+     * fail due to a programming error.
+     * </p>
+     * <p>If a problem is detected, the setError() method is called.
+     * </p>
+     */
+    public function verifySettings() {
+        if ($this->size < 0) {
+            $this->setError("The value attribute is required, and must be positive");
+        } elseif ($this->multiplier < 1) {
+            $this->setError("Invalid Units supplied, must be K,Ki,M,Mi,G,Gi,T,or Ti");
+        } elseif ($this->sizelimit < 0) {
+            $this->setError("Internal error: Code is not setting sizelimit correctly");
+        }
+    }
+
+    /**
+     * The heart of the matter. This is where the selector gets to decide
+     * on the inclusion of a file in a particular fileset.
+     *
+     * @param basedir A PhingFile object for the base directory
+     * @param filename The name of the file to check
+     * @param file A PhingFile object for this filename
+     * @return whether the file should be selected or not
+     */
+    public function isSelected(PhingFile $basedir, $filename, PhingFile $file) {
+
+        $this->validate();
+
+        // Directory size never selected for
+        if ($file->isDirectory()) {
+            return true;
+        }
+        if ($this->cmp === 0) {
+            return ($file->length() < $this->sizelimit);
+        } elseif ($this->cmp === 1) {
+            return ($file->length() > $this->sizelimit);
+        } else {
+            return ($file->length() === $this->sizelimit);
+        }
+    }
+    
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/SizeSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/TypeSelector.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/TypeSelector.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/TypeSelector.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,113 @@
+<?php
+
+/*
+ * $Id: TypeSelector.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/types/selectors/BaseExtendSelector.php';
+
+/**
+ * Selector that selects a certain kind of file: directory or regular file.
+ * 
+ * @author    Hans Lellelid <hans en xmpl.org> (Phing)
+ * @author    Jeff Turner <jefft en apache.org> (Ant)
+ * @version   $Revision: 1.3 $
+ * @package   phing.types.selectors
+ */
+class TypeSelector extends BaseExtendSelector {
+
+    private $type;
+
+    /** Key to used for parameterized custom selector */
+    const TYPE_KEY = "type";
+    
+    /** Valid types */
+    private static $types = array('file', 'dir');
+    
+    /**
+     * @return string A string describing this object
+     */
+    public function toString() {
+        $buf = "{typeselector type: " . $this->type . "}";
+        return $buf;
+    }
+
+    /**
+     * Set the type of file to require.
+     * @param string $type The type of file - 'file' or 'dir'
+     */
+    public function setType($type) {       
+        $this->type = $type;
+    }
+
+    /**
+     * When using this as a custom selector, this method will be called.
+     * It translates each parameter into the appropriate setXXX() call.
+     *
+     * @param array $parameters the complete set of parameters for this selector
+     */
+    public function setParameters($parameters) {
+        parent::setParameters($parameters);
+        if ($parameters !== null) {
+            for ($i = 0, $size=count($parameters); $i < $size; $i++) {
+                $paramname = $parameters[$i]->getName();
+                if (self::TYPE_KEY == strtolower($paramname)) {
+                    $this->setType($parameters[$i]->getValue());
+                } else {
+                    $this->setError("Invalid parameter " . $paramname);
+                }
+            }
+        }
+    }
+
+    /**
+     * Checks to make sure all settings are kosher. In this case, it
+     * means that the pattern attribute has been set.
+     *
+     */
+    public function verifySettings() {
+        if ($this->type === null) {
+            $this->setError("The type attribute is required");
+        } elseif (!in_array($this->type, self::$types, true)) {
+            $this->setError("Invalid type specified; must be one of (" . implode(self::$types) . ")");
+        }
+    }
+
+    /**
+     * The heart of the matter. This is where the selector gets to decide
+     * on the inclusion of a file in a particular fileset.
+     *
+     * @param PhingFile $basedir the base directory the scan is being done from
+     * @param string $filename is the name of the file to check
+     * @param PhingFile $file is a PhingFile object the selector can use
+     * @return boolean Whether the file should be selected or not
+     */
+    public function isSelected(PhingFile $basedir, $filename, PhingFile $file) {
+
+        // throw BuildException on error
+        $this->validate();
+
+        if ($file->isDirectory()) {
+            return $this->type === 'dir';
+        } else {
+            return $this->type === 'file';
+        }
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/types/selectors/TypeSelector.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/DirectoryScanner.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/DirectoryScanner.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/DirectoryScanner.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,710 @@
+<?php
+/*
+ *  $Id: DirectoryScanner.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/types/selectors/SelectorScanner.php'; 
+include_once 'phing/util/StringHelper.php';
+include_once 'phing/types/selectors/SelectorUtils.php';
+
+/**
+ * Class for scanning a directory for files/directories that match a certain
+ * criteria.
+ *
+ * These criteria consist of a set of include and exclude patterns. With these
+ * patterns, you can select which files you want to have included, and which
+ * files you want to have excluded.
+ *
+ * The idea is simple. A given directory is recursively scanned for all files
+ * and directories. Each file/directory is matched against a set of include
+ * and exclude patterns. Only files/directories that match at least one
+ * pattern of the include pattern list, and don't match a pattern of the
+ * exclude pattern list will be placed in the list of files/directories found.
+ *
+ * When no list of include patterns is supplied, "**" will be used, which
+ * means that everything will be matched. When no list of exclude patterns is
+ * supplied, an empty list is used, such that nothing will be excluded.
+ *
+ * The pattern matching is done as follows:
+ * The name to be matched is split up in path segments. A path segment is the
+ * name of a directory or file, which is bounded by DIRECTORY_SEPARATOR
+ * ('/' under UNIX, '\' under Windows).
+ * E.g. "abc/def/ghi/xyz.php" is split up in the segments "abc", "def", "ghi"
+ * and "xyz.php".
+ * The same is done for the pattern against which should be matched.
+ *
+ * Then the segments of the name and the pattern will be matched against each
+ * other. When '**' is used for a path segment in the pattern, then it matches
+ * zero or more path segments of the name.
+ *
+ * There are special case regarding the use of DIRECTORY_SEPARATOR at
+ * the beginning of the pattern and the string to match:
+ * When a pattern starts with a DIRECTORY_SEPARATOR, the string
+ * to match must also start with a DIRECTORY_SEPARATOR.
+ * When a pattern does not start with a DIRECTORY_SEPARATOR, the
+ * string to match may not start with a DIRECTORY_SEPARATOR.
+ * When one of these rules is not obeyed, the string will not
+ * match.
+ *
+ * When a name path segment is matched against a pattern path segment, the
+ * following special characters can be used:
+ *   '*' matches zero or more characters,
+ *   '?' matches one character.
+ *
+ * Examples:
+ *
+ * "**\*.php" matches all .php files/dirs in a directory tree.
+ *
+ * "test\a??.php" matches all files/dirs which start with an 'a', then two
+ * more characters and then ".php", in a directory called test.
+ *
+ * "**" matches everything in a directory tree.
+ *
+ * "**\test\**\XYZ*" matches all files/dirs that start with "XYZ" and where
+ * there is a parent directory called test (e.g. "abc\test\def\ghi\XYZ123").
+ *
+ * Case sensitivity may be turned off if necessary.  By default, it is
+ * turned on.
+ *
+ * Example of usage:
+ *   $ds = new DirectroyScanner();
+ *   $includes = array("**\*.php");
+ *   $excludes = array("modules\*\**");
+ *   $ds->SetIncludes($includes);
+ *   $ds->SetExcludes($excludes);
+ *   $ds->SetBasedir("test");
+ *   $ds->SetCaseSensitive(true);
+ *   $ds->Scan();
+ *
+ *   print("FILES:");
+ *   $files = ds->GetIncludedFiles();
+ *   for ($i = 0; $i < count($files);$i++) {
+ *     println("$files[$i]\n");
+ *   }
+ *
+ * This will scan a directory called test for .php files, but excludes all
+ * .php files in all directories under a directory called "modules"
+ *
+ * This class is complete preg/ereg free port of the Java class
+ * org.apache.tools.ant.DirectoryScanner. Even functions that use preg/ereg
+ * internally (like split()) are not used. Only the _fast_ string functions
+ * and comparison operators (=== !=== etc) are used for matching and tokenizing.
+ *
+ *  @author   Arnout J. Kuiper, ajkuiper en wxs.nl
+ *  @author   Magesh Umasankar, umagesh en rediffmail.com
+ *  @author   Andreas Aderhold, andi en binarycloud.com
+ *
+ *  @version   $Revision: 1.15 $
+ *  @package   phing.util
+ */
+class DirectoryScanner implements SelectorScanner {
+
+    /** default set of excludes */
+    protected $DEFAULTEXCLUDES = array(
+        "**/*~",
+        "**/#*#",
+        "**/.#*",
+        "**/%*%",
+        "**/CVS",
+        "**/CVS/**",
+        "**/.cvsignore",
+        "**/SCCS",
+        "**/SCCS/**",
+        "**/vssver.scc",
+		"**/.svn",
+		"**/.svn/**",
+		"**/._*",
+		"**/.DS_Store",
+    );
+
+    /** The base directory which should be scanned. */
+    protected $basedir;
+
+    /** The patterns for the files that should be included. */
+    protected $includes = null;
+
+    /** The patterns for the files that should be excluded. */
+    protected $excludes = null;
+
+    /**
+     * The files that where found and matched at least one includes, and matched
+     * no excludes.
+     */
+    protected $filesIncluded;
+
+    /** The files that where found and did not match any includes. Trie */
+    protected $filesNotIncluded;
+
+    /**
+     * The files that where found and matched at least one includes, and also
+     * matched at least one excludes. Trie object.
+     */
+    protected $filesExcluded;
+
+    /**
+     * The directories that where found and matched at least one includes, and
+     * matched no excludes.
+     */
+    protected $dirsIncluded;
+
+    /** The directories that where found and did not match any includes. */
+    protected $dirsNotIncluded;
+
+    /**
+     * The files that where found and matched at least one includes, and also
+     * matched at least one excludes.
+     */
+    protected $dirsExcluded;
+
+    /** Have the vars holding our results been built by a slow scan? */
+    protected $haveSlowResults = false;
+
+    /** Should the file system be treated as a case sensitive one? */
+    protected $isCaseSensitive = true;
+
+    /** Selectors */
+    protected $selectors = null;
+    
+    protected $filesDeselected;
+    protected $dirsDeselected;
+    
+    /** if there are no deselected files */
+    protected $everythingIncluded = true;        
+
+    /**
+     * Does the path match the start of this pattern up to the first "**".
+     * This is a static mehtod and should always be called static
+     *
+     * This is not a general purpose test and should only be used if you
+     * can live with false positives.
+     *
+     * pattern=**\a and str=b will yield true.
+     *
+     * @param   pattern             the (non-null) pattern to match against
+     * @param   str                 the (non-null) string (path) to match
+     * @param   isCaseSensitive     must matches be case sensitive?
+     * @return  boolean             true if matches, otherwise false
+     */
+    function matchPatternStart($pattern, $str, $isCaseSensitive = true) {
+        return SelectorUtils::matchPatternStart($pattern, $str, $isCaseSensitive);
+    }
+
+    /**
+     * Matches a path against a pattern. Static
+     *
+     * @param pattern            the (non-null) pattern to match against
+     * @param str                the (non-null) string (path) to match
+     * @param isCaseSensitive    must a case sensitive match be done?
+     *
+     * @return true when the pattern matches against the string.
+     *         false otherwise.
+     */
+    function matchPath($pattern, $str, $isCaseSensitive = true) {
+        return SelectorUtils::matchPath($pattern, $str, $isCaseSensitive);
+    }
+
+    /**
+     * Matches a string against a pattern. The pattern contains two special
+     * characters:
+     * '*' which means zero or more characters,
+     * '?' which means one and only one character.
+     *
+     * @param  pattern the (non-null) pattern to match against
+     * @param  str     the (non-null) string that must be matched against the
+     *                 pattern
+     *
+     * @return boolean true when the string matches against the pattern,
+     *                 false otherwise.
+     * @access public
+     */
+    function match($pattern, $str, $isCaseSensitive = true) {
+        return SelectorUtils::match($pattern, $str, $isCaseSensitive);
+    }
+
+    /**
+     * Sets the basedir for scanning. This is the directory that is scanned
+     * recursively. All '/' and '\' characters are replaced by
+     * DIRECTORY_SEPARATOR
+     *
+     * @param basedir the (non-null) basedir for scanning
+     */
+    function setBasedir($_basedir) {
+        $_basedir = str_replace('\\', DIRECTORY_SEPARATOR, $_basedir);
+        $_basedir = str_replace('/', DIRECTORY_SEPARATOR, $_basedir);
+        $this->basedir = $_basedir;
+    }
+
+    /**
+     * Gets the basedir that is used for scanning. This is the directory that
+     * is scanned recursively.
+     *
+     * @return the basedir that is used for scanning
+     */
+    function getBasedir() {
+        return $this->basedir;
+    }
+
+    /**
+     * Sets the case sensitivity of the file system
+     *
+     * @param specifies if the filesystem is case sensitive
+     */
+    function setCaseSensitive($_isCaseSensitive) {
+        $this->isCaseSensitive = ($_isCaseSensitive) ? true : false;
+    }
+
+    /**
+     * Sets the set of include patterns to use. All '/' and '\' characters are
+     * replaced by DIRECTORY_SEPARATOR. So the separator used need
+     * not match DIRECTORY_SEPARATOR.
+     *
+     * When a pattern ends with a '/' or '\', "**" is appended.
+     *
+     * @param includes list of include patterns
+     */
+    function setIncludes($_includes = array()) {
+        if (empty($_includes) || is_null($_includes)) {
+            $this->includes = null;
+        } else {
+            for ($i = 0; $i < count($_includes); $i++) {
+                $pattern = null;
+                $pattern = str_replace('\\', DIRECTORY_SEPARATOR, $_includes[$i]);
+                $pattern = str_replace('/', DIRECTORY_SEPARATOR, $pattern);
+                if (StringHelper::endsWith(DIRECTORY_SEPARATOR, $pattern)) {
+                    $pattern .= "**";
+                }
+                $this->includes[] = $pattern;
+            }
+        }
+    }
+
+    /**
+     * Sets the set of exclude patterns to use. All '/' and '\' characters are
+     * replaced by <code>File.separatorChar</code>. So the separator used need
+     * not match <code>File.separatorChar</code>.
+     *
+     * When a pattern ends with a '/' or '\', "**" is appended.
+     *
+     * @param excludes list of exclude patterns
+     */
+
+    function setExcludes($_excludes = array()) {
+        if (empty($_excludes) || is_null($_excludes)) {
+            $this->excludes = null;
+        } else {
+            for ($i = 0; $i < count($_excludes); $i++) {
+                $pattern = null;
+                $pattern = str_replace('\\', DIRECTORY_SEPARATOR, $_excludes[$i]);
+                $pattern = str_replace('/', DIRECTORY_SEPARATOR, $pattern);
+                if (StringHelper::endsWith(DIRECTORY_SEPARATOR, $pattern)) {
+                    $pattern .= "**";
+                }
+                $this->excludes[] = $pattern;
+            }
+        }
+    }
+
+    /**
+     * Scans the base directory for files that match at least one include
+     * pattern, and don't match any exclude patterns.
+     *
+     */
+    function scan() {
+    
+        if ((empty($this->basedir)) || (!@is_dir($this->basedir))) {
+            return false;
+        }
+
+        if ($this->includes === null) {
+            // No includes supplied, so set it to 'matches all'
+            $this->includes = array("**");
+        }
+        if (is_null($this->excludes)) {
+            $this->excludes = array();
+        }
+
+        $this->filesIncluded = array();
+        $this->filesNotIncluded = array();
+        $this->filesExcluded = array();
+        $this->dirsIncluded = array();
+        $this->dirsNotIncluded = array();
+        $this->dirsExcluded = array();
+        $this->dirsDeselected = array();
+        $this->filesDeselected = array();
+        
+        if ($this->isIncluded("")) {
+            if (!$this->isExcluded("")) {
+                if ($this->isSelected("", $this->basedir)) {
+                    $this->dirsIncluded[] = "";
+                } else {
+                    $this->dirsDeselected[] = "";
+                }                
+            } else {
+                $this->dirsExcluded[] = "";
+            }
+        } else {
+            $this->dirsNotIncluded[] = "";
+        }
+
+        $this->scandir($this->basedir, "", true);
+        return true;
+    }
+
+    /**
+     * Toplevel invocation for the scan.
+     *
+     * Returns immediately if a slow scan has already been requested.
+     */
+    protected function slowScan() {
+
+        if ($this->haveSlowResults) {
+            return;
+        }
+
+        // copy trie object add CopyInto() method
+        $excl    = $this->dirsExcluded;
+        $notIncl = $this->dirsNotIncluded;
+
+        for ($i=0, $_i=count($excl); $i < $_i; $i++) {
+            if (!$this->couldHoldIncluded($excl[$i])) {
+                $this->scandir($this->basedir.$excl[$i], $excl[$i].DIRECTORY_SEPARATOR, false);
+            }
+        }
+
+        for ($i=0, $_i=count($notIncl); $i < $_i; $i++) {
+            if (!$this->couldHoldIncluded($notIncl[$i])) {
+                $this->scandir($this->basedir.$notIncl[$i], $notIncl[$i].DIRECTORY_SEPARATOR, false);
+            }
+        }
+
+        $this->haveSlowResults = true;
+    }
+
+    /**
+     * Lists contens of a given directory and returns array with entries
+     *
+     * @param   src String. Source path and name file to copy.
+     *
+     * @access  public
+     * @return  array  directory entries
+     * @author  Albert Lash, alash en plateauinnovation.com
+     */
+
+    function listDir($_dir) {
+        $d = dir($_dir);
+        $list = array();
+        while($entry = $d->read()) {
+            if ($entry != "." && $entry != "..") {
+                $list[] = $entry;
+            }
+        }
+        $d->close();
+        return $list;
+    }
+
+    /**
+     * Scans the passed dir for files and directories. Found files and
+     * directories are placed in their respective collections, based on the
+     * matching of includes and excludes. When a directory is found, it is
+     * scanned recursively.
+     *
+     * @param dir   the directory to scan
+     * @param vpath the path relative to the basedir (needed to prevent
+     *              problems with an absolute path when using dir)
+     *
+     * @access private
+     * @see #filesIncluded
+     * @see #filesNotIncluded
+     * @see #filesExcluded
+     * @see #dirsIncluded
+     * @see #dirsNotIncluded
+     * @see #dirsExcluded
+     */
+    private function scandir($_rootdir, $_vpath, $_fast) {
+        
+        if (!is_readable($_rootdir)) {
+            return;
+        }                                
+        
+        $newfiles = self::listDir($_rootdir);
+        
+        for ($i=0,$_i=count($newfiles); $i < $_i; $i++) {
+            
+            $file = $_rootdir . DIRECTORY_SEPARATOR . $newfiles[$i];
+            $name = $_vpath . $newfiles[$i];
+
+            if (@is_dir($file)) {
+                if ($this->isIncluded($name)) {
+                    if (!$this->isExcluded($name)) {
+                        if ($this->isSelected($name, $file)) {
+                            $this->dirsIncluded[] = $name;
+                            if ($_fast) {
+                                $this->scandir($file, $name.DIRECTORY_SEPARATOR, $_fast);
+                            }
+                        } else {
+                            $this->everythingIncluded = false;
+                            $this->dirsDeselected[] = $name;
+                            if ($_fast && $this->couldHoldIncluded($name)) {
+                                $this->scandir($file, $name.DIRECTORY_SEPARATOR, $_fast);
+                            }                            
+                        }                                                
+                    } else {
+                        $this->everythingIncluded = false;
+                        $this->dirsExcluded[] = $name;
+                        if ($_fast && $this->couldHoldIncluded($name)) {
+                            $this->scandir($file, $name.DIRECTORY_SEPARATOR, $_fast);
+                        }
+                    }
+                } else {
+                    $this->everythingIncluded = false;
+                    $this->dirsNotIncluded[] = $name;
+                    if ($_fast && $this->couldHoldIncluded($name)) {
+                        $this->scandir($file, $name.DIRECTORY_SEPARATOR, $_fast);
+                    }
+                }
+                
+                if (!$_fast) {
+                    $this->scandir($file, $name.DIRECTORY_SEPARATOR, $_fast);
+                }
+                
+            } elseif (@is_file($file)) {
+                if ($this->isIncluded($name)) {
+                    if (!$this->isExcluded($name)) {
+                        if ($this->isSelected($name, $file)) {
+                            $this->filesIncluded[] = $name;
+                        } else {
+                            $this->everythingIncluded = false;
+                            $this->filesDeselected[] = $name;
+                        }                        
+                    } else {
+                        $this->everythingIncluded = false;
+                        $this->filesExcluded[] = $name;
+                    }
+                } else {
+                    $this->everythingIncluded = false;
+                    $this->filesNotIncluded[] = $name;
+                }
+            }
+        }
+    }
+
+    /**
+     * Tests whether a name matches against at least one include pattern.
+     *
+     * @param name the name to match
+     * @return <code>true</code> when the name matches against at least one
+     *         include pattern, <code>false</code> otherwise.
+     */
+    protected function isIncluded($_name) {
+        for ($i=0, $_i=count($this->includes); $i < $_i; $i++) {
+            if (DirectoryScanner::matchPath($this->includes[$i], $_name, $this->isCaseSensitive)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Tests whether a name matches the start of at least one include pattern.
+     *
+     * @param name the name to match
+     * @return <code>true</code> when the name matches against at least one
+     *         include pattern, <code>false</code> otherwise.
+     */
+    protected function couldHoldIncluded($_name) {
+        for ($i = 0; $i < count($this->includes); $i++) {
+            if (DirectoryScanner::matchPatternStart($this->includes[$i], $_name, $this->isCaseSensitive)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Tests whether a name matches against at least one exclude pattern.
+     *
+     * @param name the name to match
+     * @return <code>true</code> when the name matches against at least one
+     *         exclude pattern, <code>false</code> otherwise.
+     */
+    protected function isExcluded($_name) {
+        for ($i = 0; $i < count($this->excludes); $i++) {
+            if (DirectoryScanner::matchPath($this->excludes[$i], $_name, $this->isCaseSensitive)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Get the names of the files that matched at least one of the include
+     * patterns, and matched none of the exclude patterns.
+     * The names are relative to the basedir.
+     *
+     * @return the names of the files
+     */
+    function getIncludedFiles() {
+        return $this->filesIncluded;        
+    }
+
+    /**
+     * Get the names of the files that matched at none of the include patterns.
+     * The names are relative to the basedir.
+     *
+     * @return the names of the files
+     */
+    function getNotIncludedFiles() {
+        $this->slowScan();
+        return $this->filesNotIncluded;
+    }
+
+    /**
+     * Get the names of the files that matched at least one of the include
+     * patterns, an matched also at least one of the exclude patterns.
+     * The names are relative to the basedir.
+     *
+     * @return the names of the files
+     */
+
+    function getExcludedFiles() {
+        $this->slowScan();
+        return $this->filesExcluded;
+    }
+
+    /**
+     * <p>Returns the names of the files which were selected out and
+     * therefore not ultimately included.</p>
+     *
+     * <p>The names are relative to the base directory. This involves
+     * performing a slow scan if one has not already been completed.</p>
+     *
+     * @return the names of the files which were deselected.
+     *
+     * @see #slowScan
+     */
+    public function getDeselectedFiles() {
+        $this->slowScan();        
+        return $this->filesDeselected;
+    }
+
+    /**
+     * Get the names of the directories that matched at least one of the include
+     * patterns, an matched none of the exclude patterns.
+     * The names are relative to the basedir.
+     *
+     * @return the names of the directories
+     */
+
+    function getIncludedDirectories() {
+        return $this->dirsIncluded;        
+    }
+
+    /**
+     * Get the names of the directories that matched at none of the include
+     * patterns.
+     * The names are relative to the basedir.
+     *
+     * @return the names of the directories
+     */
+    function getNotIncludedDirectories() {
+        $this->slowScan();
+        return $this->dirsNotIncluded;        
+    }
+
+    /**
+     * <p>Returns the names of the directories which were selected out and
+     * therefore not ultimately included.</p>
+     *
+     * <p>The names are relative to the base directory. This involves
+     * performing a slow scan if one has not already been completed.</p>
+     *
+     * @return the names of the directories which were deselected.
+     *
+     * @see #slowScan
+     */
+    public function getDeselectedDirectories() {
+        $this->slowScan();
+        return $this->dirsDeselected;
+    }
+    
+    /**
+     * Get the names of the directories that matched at least one of the include
+     * patterns, an matched also at least one of the exclude patterns.
+     * The names are relative to the basedir.
+     *
+     * @return the names of the directories
+     */
+    function getExcludedDirectories() {
+        $this->slowScan();
+        return $this->dirsExcluded;        
+    }
+
+    /**
+     * Adds the array with default exclusions to the current exclusions set.
+     *
+     */
+    function addDefaultExcludes() {
+        //$excludesLength = ($this->excludes == null) ? 0 : count($this->excludes);
+        foreach($this->DEFAULTEXCLUDES as $pattern) {
+            $pattern = str_replace('\\', DIRECTORY_SEPARATOR, $pattern);
+            $pattern = str_replace('/', DIRECTORY_SEPARATOR, $pattern);
+            $this->excludes[] = $pattern;
+        }
+    }
+    
+    /**
+     * Sets the selectors that will select the filelist.
+     *
+     * @param selectors specifies the selectors to be invoked on a scan
+     */
+    public function setSelectors($selectors) {
+        $this->selectors = $selectors;
+    }
+
+    /**
+     * Returns whether or not the scanner has included all the files or
+     * directories it has come across so far.
+     *
+     * @return <code>true</code> if all files and directories which have
+     *         been found so far have been included.
+     */
+    public function isEverythingIncluded() {
+        return $this->everythingIncluded;
+    }
+        
+    /**
+     * Tests whether a name should be selected.
+     *
+     * @param string $name The filename to check for selecting.
+     * @param string $file The full file path.
+     * @return boolean False when the selectors says that the file
+     *         should not be selected, True otherwise.
+     */
+    protected function isSelected($name, $file) {
+        if ($this->selectors !== null) {
+            for ($i=0,$size=count($this->selectors); $i < $size; $i++) {
+                if (($this->selectors[$i]->isSelected(new PhingFile($this->basedir), $name, new PhingFile($file))) === false) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/DirectoryScanner.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/ExtendedFileStream.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/ExtendedFileStream.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/ExtendedFileStream.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,133 @@
+<?php
+
+	include_once 'phing/system/io/PhingFile.php';
+
+	/**
+	 * $Id: ExtendedFileStream.php 3076 2006-12-18 08:52:12Z fabien $
+	 *
+	 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+	 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+	 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+	 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+	 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+	 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+	 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+	 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+	 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+	 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+	 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+	 *
+	 * This software consists of voluntary contributions made by many individuals
+	 * and is licensed under the LGPL. For more information please see
+	 * <http://phing.info>.
+	 */
+
+	/**
+	 * Extended file stream wrapper class which auto-creates directories
+	 *
+	 * @author Michiel Rook <michiel.rook en gmail.com>
+	 * @version $Id: ExtendedFileStream.php 3076 2006-12-18 08:52:12Z fabien $
+	 * @package phing.util
+	 */
+	class ExtendedFileStream
+	{
+		private $fp = NULL;
+		
+		static function registerStream()
+		{
+			if (!in_array("efile", stream_get_wrappers()))
+			{
+				stream_wrapper_register("efile", "ExtendedFileStream");
+			}
+		}
+		
+		private function createDirectories($path)
+		{
+			$f = new PhingFile($path);
+			if (!$f->exists()) {
+				$f->mkdirs();
+			}
+		}
+		
+		function stream_open($path, $mode, $options, &$opened_path)
+		{
+			/** Small fix for Windows */
+			if ($path[8] == DIRECTORY_SEPARATOR)
+			{
+				$filepath = substr($path, 7);
+			}
+			else
+			{
+				$filepath = substr($path, 8);
+			}
+			
+			$this->createDirectories(dirname($filepath));
+			
+			$this->fp = fopen($filepath, $mode);
+			
+			return true;
+		}
+		
+		function stream_close()
+		{
+			fclose($this->fp);
+			$this->fp = NULL;
+		}
+		
+		function stream_read($count)
+		{
+			return fread($this->fp, $count);
+		}
+		
+		function stream_write($data)
+		{
+			return fwrite($this->fp, $data);
+		}
+		
+		function stream_eof()
+		{
+			return feof($this->fp);
+		}
+		
+		function stream_tell()
+		{
+			return ftell($this->fp);
+		}
+		
+		function stream_seek($offset, $whence)
+		{
+			return fseek($this->fp, $offset, $whence);
+		}
+		
+		function stream_flush()
+		{
+			return fflush($this->fp);
+		}
+		
+		function stream_stat()
+		{
+			return fstat($this->fp);
+		}
+		
+		function unlink($path)
+		{
+			return FALSE;
+		}
+		
+		function rename($path_from, $path_to)
+		{
+			return FALSE;
+		}
+		
+		function mkdir($path, $mode, $options)
+		{
+			return FALSE;
+		}
+		
+		function rmdir($path, $options)
+		{
+			return FALSE;
+		}		
+	};
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/ExtendedFileStream.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/FileUtils.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/FileUtils.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/FileUtils.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,294 @@
+<?php
+/*
+ *  $Id: FileUtils.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+include_once 'phing/system/lang/Character.php';
+include_once 'phing/util/StringHelper.php';
+include_once 'phing/system/io/BufferedReader.php';
+include_once 'phing/system/io/BufferedWriter.php';
+include_once 'phing/filters/util/ChainReaderHelper.php';
+include_once 'phing/system/io/PhingFile.php';
+
+/**
+ * File utility class.
+ * - handles os independent stuff etc
+ * - mapper stuff
+ * - filter stuff
+ *
+ * @package  phing.util
+ * @version  $Revision: 1.10 $
+ */
+class FileUtils {
+        
+    /**
+     * Returns a new Reader with filterchains applied.  If filterchains are empty,
+     * simply returns passed reader.
+     * 
+     * @param Reader $in Reader to modify (if appropriate).
+     * @param array &$filterChains filter chains to apply.
+     * @param Project $project
+     * @return Reader Assembled Reader (w/ filter chains).
+     */
+    public static function getChainedReader(Reader $in, &$filterChains, Project $project) {
+        if (!empty($filterChains)) {
+            $crh = new ChainReaderHelper();
+            $crh->setBufferSize(65536); // 64k buffer, but isn't being used (yet?)
+            $crh->setPrimaryReader($in);
+            $crh->setFilterChains($filterChains);
+            $crh->setProject($project);
+            $rdr = $crh->getAssembledReader();
+            return $rdr;
+        } else {
+            return $in;
+        }
+    }
+    
+    /**
+     * Copies a file using filter chains.
+     * 
+     * @param PhingFile $sourceFile
+     * @param PhingFile $destFile
+     * @param boolean $overwrite
+     * @param boolean $preserveLastModified
+     * @param array $filterChains 
+     * @param Project $project
+     * @return void
+     */
+    function copyFile(PhingFile $sourceFile, PhingFile $destFile, $overwrite = false, $preserveLastModified = true, &$filterChains = null, Project $project) {
+       
+        if ($overwrite || !$destFile->exists() || $destFile->lastModified() < $sourceFile->lastModified()) {
+            if ($destFile->exists() && $destFile->isFile()) {
+                $destFile->delete();
+            }
+
+            // ensure that parent dir of dest file exists!
+            $parent = $destFile->getParentFile();
+            if ($parent !== null && !$parent->exists()) {
+                $parent->mkdirs();
+            }
+
+            if ((is_array($filterChains)) && (!empty($filterChains))) {
+                
+                $in = self::getChainedReader(new BufferedReader(new FileReader($sourceFile)), $filterChains, $project);
+                $out = new BufferedWriter(new FileWriter($destFile));                
+                
+                // New read() methods returns a big buffer.                
+                while(-1 !== ($buffer = $in->read())) { // -1 indicates EOF
+                    $out->write($buffer);
+                }
+                
+                if ( $in !== null )
+                    $in->close();
+                if ( $out !== null )
+                    $out->close();
+            } else {
+                // simple copy (no filtering)
+                $sourceFile->copyTo($destFile);
+            }
+
+            if ($preserveLastModified) {
+                $destFile->setLastModified($sourceFile->lastModified());
+            }
+
+        }
+    }
+
+    /**
+     * Interpret the filename as a file relative to the given file -
+     * unless the filename already represents an absolute filename.
+     *
+     * @param  $file the "reference" file for relative paths. This
+     *         instance must be an absolute file and must not contain
+     *         ./ or ../ sequences (same for \ instead of /).
+     * @param  $filename a file name
+     *
+     * @return PhingFile A PhingFile object pointing to an absolute file that doesn't contain ./ or ../ sequences
+     *         and uses the correct separator for the current platform.
+     */
+    function resolveFile($file, $filename) {
+        // remove this and use the static class constant File::seperator
+        // as soon as ZE2 is ready
+        $fs = FileSystem::getFileSystem();
+
+        $filename = str_replace('/', $fs->getSeparator(), str_replace('\\', $fs->getSeparator(), $filename));
+
+        // deal with absolute files
+        if (StringHelper::startsWith($fs->getSeparator(), $filename) ||
+                (strlen($filename) >= 2 && Character::isLetter($filename{0}) && $filename{1} === ':')) {
+            return new PhingFile($this->normalize($filename));
+        }
+
+        if (strlen($filename) >= 2 && Character::isLetter($filename{0}) && $filename{1} === ':') {
+            return new PhingFile($this->normalize($filename));
+        }
+
+        $helpFile = new PhingFile($file->getAbsolutePath());
+
+        $tok = strtok($filename, $fs->getSeparator());
+        while ($tok !== false) {
+            $part = $tok;
+            if ($part === '..') {
+                $parentFile = $helpFile->getParent();
+                if ($parentFile === null) {
+                    $msg = "The file or path you specified ($filename) is invalid relative to ".$file->getPath();
+                    throw new IOException($msg);
+                }
+                $helpFile = new PhingFile($parentFile);
+            } else if ($part === '.') {
+                // Do nothing here
+            } else {
+                $helpFile = new PhingFile($helpFile, $part);
+            }
+            $tok = strtok($fs->getSeparator());
+        }
+        return new PhingFile($helpFile->getAbsolutePath());
+    }
+
+    /**
+     * Normalize the given absolute path.
+     *
+     * This includes:
+     *   - Uppercase the drive letter if there is one.
+     *   - Remove redundant slashes after the drive spec.
+     *   - resolve all ./, .\, ../ and ..\ sequences.
+     *   - DOS style paths that start with a drive letter will have
+     *     \ as the separator.
+     * @param string $path Path to normalize.
+     * @return string
+     */
+    function normalize($path) {
+    
+        $path = (string) $path;
+        $orig = $path;
+
+        $path = str_replace('/', DIRECTORY_SEPARATOR, str_replace('\\', DIRECTORY_SEPARATOR, $path));
+
+        // make sure we are dealing with an absolute path
+        if (!StringHelper::startsWith(DIRECTORY_SEPARATOR, $path)
+                && !(strlen($path) >= 2 && Character::isLetter($path{0}) && $path{1} === ':')) {
+            throw new IOException("$path is not an absolute path");
+        }
+
+        $dosWithDrive = false;
+        $root = null;
+
+        // Eliminate consecutive slashes after the drive spec
+
+        if (strlen($path) >= 2 && Character::isLetter($path{0}) && $path{1} === ':') {
+            $dosWithDrive = true;
+
+            $ca = str_replace('/', '\\', $path);
+            $ca = StringHelper::toCharArray($ca);
+
+            $path = strtoupper($ca[0]).':';
+            
+            for ($i=2, $_i=count($ca); $i < $_i; $i++) {
+                if (($ca[$i] !== '\\') ||
+                        ($ca[$i] === '\\' && $ca[$i - 1] !== '\\')
+                   ) {
+                    $path .= $ca[$i];
+                }
+            }
+         
+            $path = str_replace('\\', DIRECTORY_SEPARATOR, $path);
+
+            if (strlen($path) == 2) {
+                $root = $path;
+                $path = "";
+            } else {
+                $root = substr($path, 0, 3);
+                $path = substr($path, 3);
+            }
+
+        } else {
+            if (strlen($path) == 1) {
+                $root = DIRECTORY_SEPARATOR;
+                $path = "";
+            } else if ($path{1} == DIRECTORY_SEPARATOR) {
+                // UNC drive
+                $root = DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR;
+                $path = substr($path, 2);
+            }
+            else {
+                $root = DIRECTORY_SEPARATOR;
+                $path = substr($path, 1);
+            }
+        }
+
+        $s = array();
+        array_push($s, $root);
+        $tok = strtok($path, DIRECTORY_SEPARATOR);
+        while ($tok !== false) {            
+            $thisToken = $tok;
+            if ("." === $thisToken) {
+                $tok = strtok(DIRECTORY_SEPARATOR);
+                continue;
+            } elseif (".." === $thisToken) {
+                if (count($s) < 2) {
+                    // using '..' in path that is too short
+                    throw new IOException("Cannot resolve path: $orig");
+                } else {
+                    array_pop($s);
+                }
+            } else { // plain component
+                array_push($s, $thisToken);
+            }
+            $tok = strtok(DIRECTORY_SEPARATOR);
+        }
+
+        $sb = "";
+        for ($i=0,$_i=count($s); $i < $_i; $i++) {
+            if ($i > 1) {
+                // not before the filesystem root and not after it, since root
+                // already contains one
+                $sb .= DIRECTORY_SEPARATOR;
+            }
+            $sb .= (string) $s[$i];
+        }
+
+
+        $path = (string) $sb;
+        if ($dosWithDrive === true) {
+            $path = str_replace('/', '\\', $path);
+        }
+        return $path;
+    }
+    
+    /**
+     * @return boolean Whether contents of two files is the same.
+     */
+    public function contentEquals(PhingFile $file1, PhingFile $file2) {
+        
+        if (!($file1->exists() || $file2->exists())) {
+            return false;
+        }
+
+        if (!($file1->canRead() || $file2->canRead())) {
+            return false;
+        }
+        
+        $c1 = file_get_contents($file1->getAbsolutePath());
+        $c2 = file_get_contents($file2->getAbsolutePath());
+        
+        return trim($c1) == trim($c2);    
+    }
+    
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/FileUtils.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/LogWriter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/LogWriter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/LogWriter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,96 @@
+<?php
+
+	/**
+	 * $Id: LogWriter.php 3076 2006-12-18 08:52:12Z fabien $
+	 *
+	 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+	 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+	 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+	 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+	 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+	 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+	 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+	 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+	 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+	 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+	 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+	 *
+	 * This software consists of voluntary contributions made by many individuals
+	 * and is licensed under the LGPL. For more information please see
+	 * <http://phing.info>.
+	 */
+	
+	require_once 'phing/system/io/Writer.php';
+	require_once 'phing/Task.php';
+
+	/**
+	 * Extends the Writer class to output messages to Phing's log
+	 *
+	 * @author Michiel Rook <michiel.rook en gmail.com>
+	 * @version $Id: LogWriter.php 3076 2006-12-18 08:52:12Z fabien $
+	 * @package phing.util
+	 */
+	class LogWriter extends Writer
+	{
+		private $task = NULL;
+		
+		private $level = NULL;
+		
+		/**
+		 * Constructs a new LogWriter object
+		 */
+		function __construct(Task $task, $level = PROJECT_MSG_INFO)
+		{
+			$this->task = $task;
+			$this->level = $level;
+		}
+		
+		/**
+		 * @see Writer::write()
+		 */
+		function write($buf, $off = null, $len = null)
+		{
+			$lines = explode("\n", $buf);
+			
+			foreach ($lines as $line)
+			{
+				if ($line == "")
+				{
+					continue;
+				}
+				
+				$this->task->log($line, $this->level);
+			}
+		}
+		
+		/**
+		 * @see Writer::reset()
+		 */
+		function reset()
+		{
+		}
+
+		/**
+		 * @see Writer::close()
+		 */
+		function close()
+		{
+		}
+		
+		/**
+		 * @see Writer::open()
+		 */
+		function open()
+		{
+		}
+		
+		/**
+		 * @see Writer::getResource()
+		 */
+		function getResource()
+		{
+			return $this->task;
+		}
+	}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/LogWriter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/PathTokenizer.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/PathTokenizer.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/PathTokenizer.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,245 @@
+<?php
+/*
+ *  $Id: PathTokenizer.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+
+
+include_once 'phing/util/StringHelper.php';
+
+
+
+/**
+
+ * A Path tokenizer takes a path and returns the components that make up
+
+ * that path.
+
+ *
+
+ * The path can use path separators of either ':' or ';' and file separators
+
+ * of either '/' or '\'.
+
+ *
+
+ * @author Hans Lellelid <hans en xmpl.org> (Phing)
+
+ * @author Conor MacNeill (Ant)
+
+ * @author Jeff Tulley <jtulley en novell.com>  (Ant)
+
+ * @pacakge phing.util
+
+ */ 
+
+class PathTokenizer {
+
+    
+
+    /**
+
+     * A array of tokens, created by preg_split().
+
+     */
+
+    private $tokens = array();
+
+    
+
+    /**
+
+     * A string which stores any path components which have been read ahead
+
+     * due to DOS filesystem compensation.
+
+     * @var string
+
+     */
+
+    private $lookahead;
+
+    
+
+    /**
+
+     * Flag to indicate whether or not we are running on a platform with a
+
+     * DOS style filesystem
+
+     * @var boolean
+
+     */
+
+    private $dosStyleFilesystem;
+
+
+
+    /**
+
+     * Constructs a path tokenizer for the specified path.
+
+     * 
+
+     * @param path The path to tokenize. Must not be <code>null</code>.
+
+     */
+
+    public function __construct($path) {
+
+        // on Windows and Unix, we can ignore delimiters and still have
+
+        // enough information to tokenize correctly.    
+
+        $this->tokens = preg_split("/[;:]/", $path, -1, PREG_SPLIT_NO_EMPTY);
+
+        $this->dosStyleFilesystem = ( PATH_SEPARATOR == ';');
+
+    }
+
+
+
+    /**
+
+     * Tests if there are more path elements available from this tokenizer's
+
+     * path. If this method returns <code>true</code>, then a subsequent call 
+
+     * to nextToken will successfully return a token.
+
+     * 
+
+     * @return <code>true</code> if and only if there is at least one token 
+
+     * in the string after the current position; <code>false</code> otherwise.
+
+     */
+
+    public function hasMoreTokens() {
+
+        if ($this->lookahead !== null) {
+
+            return true;
+
+        }        
+
+        return !empty($this->tokens);
+
+    }
+
+    
+
+    /**
+
+     * Returns the next path element from this tokenizer.
+
+     * 
+
+     * @return the next path element from this tokenizer.
+
+     * 
+
+     * @throws Exception if there are no more elements in this tokenizer's path.
+
+     */
+
+    public function nextToken() {
+
+            
+
+        if ($this->lookahead !== null) {
+
+            $token = $this->lookahead;
+
+            $this->lookahead = null;
+
+        } else {
+
+            $token = trim(array_shift($this->tokens));
+
+        }
+
+            
+
+
+
+        if (strlen($token) === 1 && Character::isLetter($token{0})
+
+                                && $this->dosStyleFilesystem
+
+                                && !empty($this->tokens)) {
+
+            // we are on a dos style system so this path could be a drive
+
+            // spec. We look at the next token
+
+            $nextToken = trim(array_shift($this->tokens));
+
+            if (StringHelper::startsWith('\\', $nextToken) || StringHelper::startsWith('/', $nextToken)) {
+
+                // we know we are on a DOS style platform and the next path
+
+                // starts with a slash or backslash, so we know this is a 
+
+                // drive spec
+
+                $token .= ':' . $nextToken;
+
+            } else {
+
+                // store the token just read for next time
+
+                $this->lookahead = $nextToken;
+
+            }
+
+        }
+
+        
+
+        return $token;
+
+    }
+
+
+
+    /**
+
+     * Non StringTokenizer function, that indicates whether the specified path is contained in loaded tokens.
+
+     * We can do this easily because in PHP implimentation we're using arrays.
+
+     * @param string $path path to search for.
+
+     * @return boolean
+
+     */
+
+    public function contains($path) {
+
+        return in_array($path, $this->tokens, true);        
+
+    }
+
+    
+
+}
+
+
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/PathTokenizer.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/SourceFileScanner.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/SourceFileScanner.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/SourceFileScanner.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,159 @@
+<?php
+/*
+ *  $Id: SourceFileScanner.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+/**
+ *  Utility class that collects the functionality of the various
+ *  scanDir methods that have been scattered in several tasks before.
+ *
+ *  The only method returns an array of source files. The array is a
+ *  subset of the files given as a parameter and holds only those that
+ *  are newer than their corresponding target files.
+ *  @package   phing.util
+ */
+class SourceFileScanner {
+
+    /** Instance of FileUtils */
+    private $fileUtils;
+    
+    /** Task this class is working for -- for logging purposes. */
+    private $task;
+
+    /**
+     * @param task The task we should log messages through
+     */
+    function __construct($task) {
+        $this->task = $task;
+        $this->fileUtils = new FileUtils();
+    }
+
+    /**
+     * Restrict the given set of files to those that are newer than
+     * their corresponding target files.
+     *
+     * @param files   the original set of files
+     * @param srcDir  all files are relative to this directory
+     * @param destDir target files live here. if null file names
+     *                returned by the mapper are assumed to be absolute.
+     * @param FilenameMapper  knows how to construct a target file names from
+     *                source file names.
+     * @param force   Boolean that determines if the files should be
+     *                forced to be copied.
+     */
+    function restrict(&$files, $srcDir, $destDir, $mapper, $force = false) {
+        $now = time();
+        $targetList = "";
+
+        /*
+          If we're on Windows, we have to munge the time up to 2 secs to
+          be able to check file modification times.
+          (Windows has a max resolution of two secs for modification times)
+        */
+        $osname = strtolower(Phing::getProperty('os.name'));
+
+        // indexOf()
+        $index = ((($res = strpos($osname, 'win')) === false) ? -1 : $res);
+        if ($index  >= 0 ) {
+            $now += 2000;
+        }
+
+        $v = array();
+
+        for ($i=0, $size=count($files); $i < $size; $i++) {
+        
+            $targets = $mapper->main($files[$i]);
+            if (empty($targets)) {
+                $this->task->log($files[$i]." skipped - don't know how to handle it", PROJECT_MSG_VERBOSE);
+                continue;
+            }
+
+            $src = null;
+            try {
+                if ($srcDir === null) {
+                    $src = new PhingFile($files[$i]);
+                } else {
+                    $src = $this->fileUtils->resolveFile($srcDir, $files[$i]);
+                }
+    
+                if ($src->lastModified() > $now) {
+                    $this->task->log("Warning: ".$files[$i]." modified in the future (".$src->lastModified()." > ".$now.")", PROJECT_MSG_WARN);
+                }
+            } catch (IOException $ioe) {
+                $this->task->log("Unable to read file ".$files[$i]." (skipping): " . $ioe->getMessage());
+                continue;
+            }
+            
+            $added = false;
+            $targetList = "";
+
+            for ($j=0,$_j=count($targets); (!$added && $j < $_j); $j++) {
+
+                $dest = null;
+                if ($destDir === null) {
+                    $dest = new PhingFile($targets[$j]);
+                } else {
+                    $dest = $this->fileUtils->resolveFile($destDir, $targets[$j]);
+                }
+
+                if (!$dest->exists()) {
+                    $this->task->log($files[$i]." added as " . $dest->__toString() . " doesn't exist.", PROJECT_MSG_VERBOSE);
+                    $v[] =$files[$i];
+                    $added = true;
+                } elseif ($src->lastModified() > $dest->lastModified()) {
+                    $this->task->log($files[$i]." added as " . $dest->__toString() . " is outdated.", PROJECT_MSG_VERBOSE );
+                    $v[]=$files[$i];
+                    $added = true;
+                } elseif ($force === true) {
+                    $this->task->log($files[$i]." added as " . $dest->__toString() . " is forced to be overwritten.", PROJECT_MSG_VERBOSE );
+                    $v[]=$files[$i];
+                    $added = true;
+                } else {
+                    if (strlen($targetList) > 0) {
+                        $targetList .= ", ";
+                    }
+                    $targetList .= $dest->getAbsolutePath();
+                }
+            }
+
+            if (!$added) {
+                $this->task->log($files[$i]." omitted as ".$targetList." ".(count($targets) === 1 ? " is " : " are ")."up to date.",  PROJECT_MSG_VERBOSE);
+            }
+
+        }
+        $result = array();
+        $result = $v;
+        return $result;
+    }
+
+    /**
+     * Convenience layer on top of restrict that returns the source
+     * files as PhingFile objects (containing absolute paths if srcDir is
+     * absolute).
+     */
+    function restrictAsFiles(&$files, &$srcDir, &$destDir, &$mapper) {
+        $res = $this->restrict($files, $srcDir, $destDir, $mapper);
+        $result = array();
+        for ($i=0; $i<count($res); $i++) {
+            $result[$i] = new PhingFile($srcDir, $res[$i]);
+        }
+        return $result;
+    }
+}
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/SourceFileScanner.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/StringHelper.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/StringHelper.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/StringHelper.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,209 @@
+<?php
+
+/**
+ * String helper utility class.
+ *
+ * This class includes some Java-like functions for parsing strings,
+ * as well as some functions for getting qualifiers / unqualifying phing-style
+ * classpaths.  (e.g. "phing.util.StringHelper").
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package phing.system.util
+ */
+class StringHelper {
+
+    private static $TRUE_VALUES = array("on", "true", "t", "yes");
+    private static $FALSE_VALUES = array("off", "false", "f", "no");
+    
+    /**
+     * Replaces identifier tokens with corresponding text values in passed string.
+     *
+     * @params array $strings Array of strings to multiply. (If string is passed, will convert to array)
+     * @params array $tokens The tokens to search for.
+     * @params array $replacements The values with which to replace found tokens.
+     * @return string
+     */
+    public static function multiply($strings, $tokens, $replacements) {
+        $strings = (array) $strings;
+        $results = array();
+        foreach ($strings as $string) {
+            $results[] = str_replace($tokens, $replacements, $string);
+        }        
+        return $results;
+    }
+
+    /**
+     * Remove qualification to name.
+     * E.g. eg.Cat -> Cat
+     * @param string $qualifiedName
+     * @param string $separator Character used to separate.
+     */
+    public static function unqualify($qualifiedName, $separator = '.') {
+        // if false, then will be 0
+        $pos = strrpos($qualifiedName, $separator);
+        if ($pos === false) { 
+            return $qualifiedName;  // there is no '.' in the qualifed name
+        } else {
+            return substr($qualifiedName, $pos + 1); // start just after '.'
+        }
+    }
+
+    /** 
+     * Converts a string to an indexed array of chars
+     * There's really no reason for this to be used in PHP, since strings
+     * are all accessible using the $string{0} notation.
+     * @param string $string
+     * @return array
+     * @deprecated
+     */
+    public static function toCharArray($str) {
+        $ret=array();
+        $len=strlen($str);
+        for ($i=0; $i < $len; $i++) {
+            $ret[] = $str{$i};
+        }
+        return $ret;
+    }
+    
+    /**
+     * Get the qualifier part of a qualified name.
+     * E.g. eg.Cat -> eg
+     * @return string
+     */    
+    public static function qualifier($qualifiedName, $seperator = '.') {
+        $pos = strrchr($qualifiedName, $seperator);
+        if ($pos === false) {
+            return '';
+        } else {
+            return substr($qualifiedName, 0, $pos);
+        }
+    }
+    
+    /**
+     * @param array $columns String[]
+     * @param string $prefix
+     * @return array String[]
+     */ 
+    public static function prefix( $columns, $prefix) {
+        if ($prefix == null) return $columns;
+        $qualified = array();
+        foreach($columns as $key => $column) {
+            $qualified[$key] = $prefix . $column;
+        }        
+        return $qualified;
+    }
+    
+    /**
+     *
+     * @return string
+     */ 
+    public static function root($qualifiedName, $separator = '.') {
+        $loc = strpos($qualifiedName, $separator);
+        return ($loc === false) ? $qualifiedName : substr($qualifiedName, 0, $loc);
+    }
+    
+    /**
+     * @return int
+     */
+    public static function hashCode($string) {
+        return crc32($string);
+    }
+    
+    /**
+     * @return boolean
+     */ 
+    public static function booleanValue($s) {
+        if (is_bool($s)) {
+            return $s; // it's already boolean (not a string)
+        }
+        // otherwise assume it's something like "true" or "t"
+        $trimmed = strtolower(trim($s));
+        return (boolean) in_array($trimmed, self::$TRUE_VALUES);
+    }
+
+    /** tests if a string is a representative of a boolean */
+    public static function isBoolean($s) {
+
+        if (is_bool($s)) {
+            return true; // it already is boolean
+        }
+        
+        if ($s === "" || $s === null || !is_string($s)) {
+            return false; // not a valid string for testing
+        }
+
+        $test = trim(strtolower($s));
+        return (boolean) in_array($test, array_merge(self::$FALSE_VALUES, self::$TRUE_VALUES));
+    }
+        
+    /**
+     * Creates a key based on any number of passed params.
+     * @return string
+     */
+    public static function key() {
+        $args = func_get_args();
+        return serialize($args);
+    }    
+    
+    /** tests if a string starts with a given string */
+    public static function startsWith($check, $string) {
+        if ($check === "" || $check === $string) {
+            return true;
+        } else {
+            return (strpos($string, $check) === 0) ? true : false;
+        }
+    }
+    
+    /** tests if a string ends with a given string */
+    public static function endsWith($check, $string) {
+        if ($check === "" || $check === $string) {
+            return true;
+        } else {
+            return (strpos(strrev($string), strrev($check)) === 0) ? true : false;
+        }
+    }            
+
+    /**
+     * a natural way of getting a subtring, php's circular string buffer and strange
+     * return values suck if you want to program strict as of C or friends 
+     */
+    public static function substring($string, $startpos, $endpos = -1) {
+        $len    = strlen($string);
+        $endpos = (int) (($endpos === -1) ? $len-1 : $endpos);
+        if ($startpos > $len-1 || $startpos < 0) {
+            trigger_error("substring(), Startindex out of bounds must be 0<n<$len", E_USER_ERROR);
+        }
+        if ($endpos > $len-1 || $endpos < $startpos) {
+            trigger_error("substring(), Endindex out of bounds must be $startpos<n<".($len-1), E_USER_ERROR);
+        }
+        if ($startpos === $endpos) {
+            return (string) $string{$startpos};
+        } else {
+            $len = $endpos-$startpos;
+        }
+        return substr($string, $startpos, $len+1);
+    }
+
+    /**
+     * Does the value correspond to a slot variable?
+     * @param string $value    
+     */
+    public static function isSlotVar($value) {
+        $value = trim($value);
+        if ($value === "") return false;
+        return preg_match('/^%\{([\w\.\-]+)\}$/', $value);
+    }
+    
+    /**
+     * Extracts the variable name for a slot var in the format %{task.current_file}
+     * @param string $var The var from build file.
+     * @return string Extracted name part.
+     */
+    public static function slotVar($var) {
+        return trim($var, '%{} ');
+    }
+    
+}
+
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/StringHelper.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/PregEngine.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/PregEngine.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/PregEngine.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,105 @@
+<?php
+/* 
+ *  $Id: PregEngine.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+require_once 'phing/util/regexp/RegexpEngine.php';
+
+/**
+ * PREG Regexp Engine.
+ * Implements a regexp engine using PHP's preg_match(), preg_match_all(), and preg_replace() functions.
+ * 
+ * @author hans lellelid, hans en velum.net
+ * @package phing.util.regex
+ */
+class PregEngine implements RegexpEngine {
+
+    /**
+     * @var boolean
+     */
+    private $ignoreCase = false;
+        
+    /**
+     * Sets whether or not regex operation is case sensitive.
+     * @param boolean $bit
+     * @return void
+     */
+    function setIgnoreCase($bit) {
+        $this->ignoreCase = (boolean) $bit;
+    }
+
+    /**
+     * Gets whether or not regex operation is case sensitive.
+     * @return boolean
+     */
+    function getIgnoreCase() {
+        return $this->ignoreCase;
+    }
+        
+    /**
+     * The pattern needs to be converted into PREG style -- which includes adding expression delims & any flags, etc.
+     * @param string $pattern
+     * @return string prepared pattern.
+     */
+    private function preparePattern($pattern)
+    {
+        return '/'.$pattern.'/'.($this->ignoreCase ? 'i' : '');
+    }
+    
+    /**
+     * Matches pattern against source string and sets the matches array.
+     * @param string $pattern The regex pattern to match.
+     * @param string $source The source string.
+     * @param array $matches The array in which to store matches.
+     * @return boolean Success of matching operation.
+     */
+    function match($pattern, $source, &$matches) { 
+        return preg_match($this->preparePattern($pattern), $source, $matches);
+    }
+
+    /**
+     * Matches all patterns in source string and sets the matches array.
+     * @param string $pattern The regex pattern to match.
+     * @param string $source The source string.
+     * @param array $matches The array in which to store matches.
+     * @return boolean Success of matching operation.
+     */        
+    function matchAll($pattern, $source, &$matches) {
+        return preg_match_all($this->preparePattern($pattern), $source, $matches);
+    }
+
+    /**
+     * Replaces $pattern with $replace in $source string.
+     * References to \1 group matches will be replaced with more preg-friendly
+     * $1.
+     * @param string $pattern The regex pattern to match.
+     * @param string $replace The string with which to replace matches.
+     * @param string $source The source string.
+     * @return string The replaced source string.
+     */        
+    function replace($pattern, $replace, $source) {
+        // convert \1 -> $1, because we want to use the more generic \1 in the XML
+        // but PREG prefers $1 syntax.
+        $replace = preg_replace('/[^\\\]\\\(\d+)/', '$1', $replace);
+        return preg_replace($this->preparePattern($pattern), $replace, $source);
+    }
+
+}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/PregEngine.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/Regexp.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/Regexp.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/Regexp.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,168 @@
+<?php
+/* 
+ *  $Id: Regexp.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+/**
+ * A factory class for regex functions.
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package  phing.util.regexp
+ * @version $Revision: 1.5 $
+ */
+class Regexp {
+
+    /**
+     * Matching groups found. 
+     * @var array
+     */
+    private $groups = array();
+     
+    /**
+     * Pattern to match.
+     * @var string
+     */
+    private $pattern;
+    
+    /**
+     * Replacement pattern.
+     * @var string
+     */
+    private $replace;
+    
+    /**
+     * The regex engine -- e.g. 'preg' or 'ereg';
+     * @var RegexpEngine
+     */
+    private $engine;
+    
+    /**
+     * Constructor sets the regex engine to use (preg by default).
+     * @param string $_engineType The regex engine to use.
+     */
+    function __construct($engineType='preg') {        
+        if ($engineType == 'preg') {
+            include_once 'phing/util/regexp/PregEngine.php';
+            $this->engine = new PregEngine();
+        } elseif ($engineType == 'ereg') {
+            include_once 'phing/util/regexp/EregEngine.php';
+            $this->engine = new EregEngine();
+        } else {
+            throw new BuildException("Invalid engine type for Regexp: " . $engineType);
+        }                
+    }
+
+    /**
+     * Sets pattern to use for matching.
+     * @param string $pat The pattern to match on.
+     * @return void
+     */
+    public function setPattern($pat) {
+        $this->pattern = (string) $pat;        
+    }
+    
+    
+    /**
+     * Gets pattern to use for matching.
+     * @return string The pattern to match on.
+     */
+    public function getPattern() {
+        return $this->pattern;
+    }
+    
+    /**
+     * Sets replacement string.
+     * @param string $rep The pattern to replace matches with.
+     * @return void
+     */
+    public function setReplace($rep) {
+        $this->replace = (string) $rep;
+    }
+    
+    /**
+     * Gets replacement string.
+     * @return string The pattern to replace matches with.
+     * @return void
+     */
+    public function getReplace() {
+        return $this->replace;
+    }
+    
+    /**
+     * Performs match of specified pattern against $subject.
+     * @param string $subject The subject, on which to perform matches.
+     * @return boolean Whether or not pattern matches subject string passed.
+     */
+    public function matches($subject) {
+        if($this->pattern === null) {            
+            throw new Exception("No pattern specified for regexp match().");
+        }
+        return $this->engine->match($this->pattern, $subject, $this->groups);
+    }
+    
+    /**
+     * Performs replacement of specified pattern and replacement strings.
+     * @param string $subject Text on which to perform replacement.
+     * @return string subject after replacement has been performed.
+     */
+    public function replace($subject) {
+        if ($this->pattern === null || $this->replace === null) {
+            throw new Exception("Missing pattern or replacement string regexp replace().");
+        }        
+        return $this->engine->replace($this->pattern, $this->replace, $subject);
+    }
+    
+    /**
+     * Get array of matched groups.
+     * @return array Matched groups
+     */ 
+    function getGroups() {
+        return $this->groups;
+    }
+
+    /**
+     * Get specific matched group. 
+     * @param integer $idx
+     * @return string specified group or NULL if group is not set.
+     */ 
+    function getGroup($idx) { 
+        if (!isset($this->groups[$idx])) {
+            return null;
+        }
+        return $this->groups[$idx];
+    }
+    
+    /**
+     * Sets whether the regexp matching is case insensitive.
+     * (default is false -- i.e. case sensisitive)
+     * @param boolean $bit
+     */ 
+    function setIgnoreCase($bit) {
+        $this->engine->setIgnoreCase($bit);
+    }
+    
+    /**
+     * Gets whether the regexp matching is case insensitive.
+     * @return boolean
+     */
+    function getIgnoreCase() {
+        return $this->engine->getIgnoreCase();
+    }
+} 
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/Regexp.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/RegexpEngine.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/RegexpEngine.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/RegexpEngine.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,74 @@
+<?php
+/* 
+ *  $Id: RegexpEngine.php 3076 2006-12-18 08:52:12Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>. 
+ */
+
+/**
+ * Contains some shared attributes and methods -- and some abstract methods with
+ * engine-specific implementations that sub-classes must override.
+ * 
+ * @author Hans Lellelid <hans en velum.net>
+ * @package phing.util.regex
+ * @version $Revision: 1.4 $
+ */
+interface RegexpEngine {
+    
+    /**
+     * Sets whether or not regex operation should ingore case.
+     * @param boolean $bit
+     * @return void
+     */
+    public function setIgnoreCase($bit);
+    
+    /**
+     * Returns status of ignore case flag.
+     * @return boolean
+     */
+    public function getIgnoreCase();
+    
+    /**
+     * Matches pattern against source string and sets the matches array.
+     * @param string $pattern The regex pattern to match.
+     * @param string $source The source string.
+     * @param array $matches The array in which to store matches.
+     * @return boolean Success of matching operation.
+     */
+    function match($pattern, $source, &$matches);
+    
+    /**
+     * Matches all patterns in source string and sets the matches array.
+     * @param string $pattern The regex pattern to match.
+     * @param string $source The source string.
+     * @param array $matches The array in which to store matches.
+     * @return boolean Success of matching operation.
+     */    
+    function matchAll($pattern, $source, &$matches);
+
+    /**
+     * Replaces $pattern with $replace in $source string.
+     * @param string $pattern The regex pattern to match.
+     * @param string $replace The string with which to replace matches.
+     * @param string $source The source string.
+     * @return string The replaced source string.
+     */        
+    function replace($pattern, $replace, $source);
+
+}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phing/util/regexp/RegexpEngine.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/class.phpmailer.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/class.phpmailer.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/class.phpmailer.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1501 @@
+<?php
+////////////////////////////////////////////////////
+// PHPMailer - PHP email class
+//
+// Class for sending email using either
+// sendmail, PHP mail(), or SMTP.  Methods are
+// based upon the standard AspEmail(tm) classes.
+//
+// Copyright (C) 2001 - 2003  Brent R. Matzelle
+//
+// License: LGPL, see LICENSE
+////////////////////////////////////////////////////
+
+/**
+ * PHPMailer - PHP email transport class
+ * @package PHPMailer
+ * @author Brent R. Matzelle
+ * @copyright 2001 - 2003 Brent R. Matzelle
+ */
+class PHPMailer
+{
+    /////////////////////////////////////////////////
+    // PUBLIC VARIABLES
+    /////////////////////////////////////////////////
+
+    /**
+     * Email priority (1 = High, 3 = Normal, 5 = low).
+     * @var int
+     */
+    public $Priority          = 3;
+
+    /**
+     * Sets the CharSet of the message.
+     * @var string
+     */
+    public $CharSet           = "iso-8859-1";
+
+    /**
+     * Sets the Content-type of the message.
+     * @var string
+     */
+    public $ContentType        = "text/plain";
+
+    /**
+     * Sets the Encoding of the message. Options for this are "8bit",
+     * "7bit", "binary", "base64", and "quoted-printable".
+     * @var string
+     */
+    public $Encoding          = "8bit";
+
+    /**
+     * Holds the most recent mailer error message.
+     * @var string
+     */
+    public $ErrorInfo         = "";
+
+    /**
+     * Sets the From email address for the message.
+     * @var string
+     */
+    public $From               = "root en localhost";
+
+    /**
+     * Sets the From name of the message.
+     * @var string
+     */
+    public $FromName           = "Root User";
+
+    /**
+     * Sets the Sender email (Return-Path) of the message.  If not empty,
+     * will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
+     * @var string
+     */
+    public $Sender            = "";
+
+    /**
+     * Sets the Subject of the message.
+     * @var string
+     */
+    public $Subject           = "";
+
+    /**
+     * Sets the Body of the message.  This can be either an HTML or text body.
+     * If HTML then run IsHTML(true).
+     * @var string
+     */
+    public $Body               = "";
+
+    /**
+     * Sets the text-only body of the message.  This automatically sets the
+     * email to multipart/alternative.  This body can be read by mail
+     * clients that do not have HTML email capability such as mutt. Clients
+     * that can read HTML will view the normal Body.
+     * @var string
+     */
+    public $AltBody           = "";
+
+    /**
+     * Sets word wrapping on the body of the message to a given number of 
+     * characters.
+     * @var int
+     */
+    public $WordWrap          = 0;
+
+    /**
+     * Method to send mail: ("mail", "sendmail", or "smtp").
+     * @var string
+     */
+    public $Mailer            = "mail";
+
+    /**
+     * Sets the path of the sendmail program.
+     * @var string
+     */
+    public $Sendmail          = "/usr/sbin/sendmail";
+    
+    /**
+     * Path to PHPMailer plugins.  This is now only useful if the SMTP class 
+     * is in a different directory than the PHP include path.  
+     * @var string
+     */
+    public $PluginDir         = "";
+
+    /**
+     *  Holds PHPMailer version.
+     *  @var string
+     */
+    public $Version           = "1.73";
+
+    /**
+     * Sets the email address that a reading confirmation will be sent.
+     * @var string
+     */
+    public $ConfirmReadingTo  = "";
+
+    /**
+     *  Sets the hostname to use in Message-Id and Received headers
+     *  and as default HELO string. If empty, the value returned
+     *  by SERVER_NAME is used or 'localhost.localdomain'.
+     *  @var string
+     */
+    public $Hostname          = "";
+
+    /////////////////////////////////////////////////
+    // SMTP VARIABLES
+    /////////////////////////////////////////////////
+
+    /**
+     *  Sets the SMTP hosts.  All hosts must be separated by a
+     *  semicolon.  You can also specify a different port
+     *  for each host by using this format: [hostname:port]
+     *  (e.g. "smtp1.example.com:25;smtp2.example.com").
+     *  Hosts will be tried in order.
+     *  @var string
+     */
+    public $Host        = "localhost";
+
+    /**
+     *  Sets the default SMTP server port.
+     *  @var int
+     */
+    public $Port        = 25;
+
+    /**
+     *  Sets the SMTP HELO of the message (Default is $Hostname).
+     *  @var string
+     */
+    public $Helo        = "";
+
+    /**
+     *  Sets SMTP authentication. Utilizes the Username and Password variables.
+     *  @var bool
+     */
+    public $SMTPAuth     = false;
+
+    /**
+     *  Sets SMTP username.
+     *  @var string
+     */
+    public $Username     = "";
+
+    /**
+     *  Sets SMTP password.
+     *  @var string
+     */
+    public $Password     = "";
+
+    /**
+     *  Sets the SMTP server timeout in seconds. This function will not 
+     *  work with the win32 version.
+     *  @var int
+     */
+    public $Timeout      = 10;
+
+    /**
+     *  Sets SMTP class debugging on or off.
+     *  @var bool
+     */
+    public $SMTPDebug    = false;
+
+    /**
+     * Prevents the SMTP connection from being closed after each mail 
+     * sending.  If this is set to true then to close the connection 
+     * requires an explicit call to SmtpClose(). 
+     * @var bool
+     */
+    public $SMTPKeepAlive = false;
+
+    /**#@+
+     * @access private
+     */
+    private $smtp            = NULL;
+    private $to              = array();
+    private $cc              = array();
+    private $bcc             = array();
+    private $ReplyTo         = array();
+    private $attachment      = array();
+    private $CustomHeader    = array();
+    private $message_type    = "";
+    private $boundary        = array();
+    private $language        = array();
+    private $error_count     = 0;
+    private $LE              = "\n";
+    /**#@-*/
+    
+    /////////////////////////////////////////////////
+    // VARIABLE METHODS
+    /////////////////////////////////////////////////
+
+    /**
+     * Sets message type to HTML.  
+     * @param bool $bool
+     * @return void
+     */
+    function IsHTML($bool) {
+        if($bool == true)
+            $this->ContentType = "text/html";
+        else
+            $this->ContentType = "text/plain";
+    }
+
+    /**
+     * Sets Mailer to send message using SMTP.
+     * @return void
+     */
+    function IsSMTP() {
+        $this->Mailer = "smtp";
+    }
+
+    /**
+     * Sets Mailer to send message using PHP mail() function.
+     * @return void
+     */
+    function IsMail() {
+        $this->Mailer = "mail";
+    }
+
+    /**
+     * Sets Mailer to send message using the $Sendmail program.
+     * @return void
+     */
+    function IsSendmail() {
+        $this->Mailer = "sendmail";
+    }
+
+    /**
+     * Sets Mailer to send message using the qmail MTA. 
+     * @return void
+     */
+    function IsQmail() {
+        $this->Sendmail = "/var/qmail/bin/sendmail";
+        $this->Mailer = "sendmail";
+    }
+
+
+    /////////////////////////////////////////////////
+    // RECIPIENT METHODS
+    /////////////////////////////////////////////////
+
+    /**
+     * Adds a "To" address.  
+     * @param string $address
+     * @param string $name
+     * @return void
+     */
+    function AddAddress($address, $name = "") {
+        $cur = count($this->to);
+        $this->to[$cur][0] = trim($address);
+        $this->to[$cur][1] = $name;
+    }
+
+    /**
+     * Adds a "Cc" address. Note: this function works
+     * with the SMTP mailer on win32, not with the "mail"
+     * mailer.  
+     * @param string $address
+     * @param string $name
+     * @return void
+    */
+    function AddCC($address, $name = "") {
+        $cur = count($this->cc);
+        $this->cc[$cur][0] = trim($address);
+        $this->cc[$cur][1] = $name;
+    }
+
+    /**
+     * Adds a "Bcc" address. Note: this function works
+     * with the SMTP mailer on win32, not with the "mail"
+     * mailer.  
+     * @param string $address
+     * @param string $name
+     * @return void
+     */
+    function AddBCC($address, $name = "") {
+        $cur = count($this->bcc);
+        $this->bcc[$cur][0] = trim($address);
+        $this->bcc[$cur][1] = $name;
+    }
+
+    /**
+     * Adds a "Reply-to" address.  
+     * @param string $address
+     * @param string $name
+     * @return void
+     */
+    function AddReplyTo($address, $name = "") {
+        $cur = count($this->ReplyTo);
+        $this->ReplyTo[$cur][0] = trim($address);
+        $this->ReplyTo[$cur][1] = $name;
+    }
+
+
+    /////////////////////////////////////////////////
+    // MAIL SENDING METHODS
+    /////////////////////////////////////////////////
+
+    /**
+     * Creates message and assigns Mailer. If the message is
+     * not sent successfully then it returns false.  Use the ErrorInfo
+     * variable to view description of the error.  
+     * @return bool
+     */
+    function Send() {
+        $header = "";
+        $body = "";
+        $result = true;
+
+        if((count($this->to) + count($this->cc) + count($this->bcc)) < 1)
+        {
+            $this->SetError($this->Lang("provide_address"));
+            return false;
+        }
+
+        // Set whether the message is multipart/alternative
+        if(!empty($this->AltBody))
+            $this->ContentType = "multipart/alternative";
+
+        $this->error_count = 0; // reset errors
+        $this->SetMessageType();
+        $header .= $this->CreateHeader();
+        $body = $this->CreateBody();
+
+        if($body == "") { return false; }
+
+        // Choose the mailer
+        switch($this->Mailer)
+        {
+            case "sendmail":
+                $result = $this->SendmailSend($header, $body);
+                break;
+            case "mail":
+                $result = $this->MailSend($header, $body);
+                break;
+            case "smtp":
+                $result = $this->SmtpSend($header, $body);
+                break;
+            default:
+            $this->SetError($this->Mailer . $this->Lang("mailer_not_supported"));
+                $result = false;
+                break;
+        }
+
+        return $result;
+    }
+    
+    /**
+     * Sends mail using the $Sendmail program.  
+     * @access private
+     * @return bool
+     */
+    function SendmailSend($header, $body) {
+        if ($this->Sender != "")
+            $sendmail = sprintf("%s -oi -f %s -t", $this->Sendmail, $this->Sender);
+        else
+            $sendmail = sprintf("%s -oi -t", $this->Sendmail);
+
+        if(!@$mail = popen($sendmail, "w"))
+        {
+            $this->SetError($this->Lang("execute") . $this->Sendmail);
+            return false;
+        }
+
+        fputs($mail, $header);
+        fputs($mail, $body);
+        
+        $result = pclose($mail) >> 8 & 0xFF;
+        if($result != 0)
+        {
+            $this->SetError($this->Lang("execute") . $this->Sendmail);
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Sends mail using the PHP mail() function.  
+     * @access private
+     * @return bool
+     */
+    function MailSend($header, $body) {
+        $to = "";
+        for($i = 0; $i < count($this->to); $i++)
+        {
+            if($i != 0) { $to .= ", "; }
+            $to .= $this->to[$i][0];
+        }
+
+        if ($this->Sender != "" && strlen(ini_get("safe_mode"))< 1)
+        {
+            $old_from = ini_get("sendmail_from");
+            ini_set("sendmail_from", $this->Sender);
+            $params = sprintf("-oi -f %s", $this->Sender);
+            $rt = @mail($to, $this->EncodeHeader($this->Subject), $body, 
+                        $header, $params);
+        }
+        else
+            $rt = @mail($to, $this->EncodeHeader($this->Subject), $body, $header);
+
+        if (isset($old_from))
+            ini_set("sendmail_from", $old_from);
+
+        if(!$rt)
+        {
+            $this->SetError($this->Lang("instantiate"));
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Sends mail via SMTP using PhpSMTP (Author:
+     * Chris Ryan).  Returns bool.  Returns false if there is a
+     * bad MAIL FROM, RCPT, or DATA input.
+     * @access private
+     * @return bool
+     */
+    function SmtpSend($header, $body) {
+        include_once($this->PluginDir . "class.smtp.php");
+        $error = "";
+        $bad_rcpt = array();
+
+        if(!$this->SmtpConnect())
+            return false;
+
+        $smtp_from = ($this->Sender == "") ? $this->From : $this->Sender;
+        if(!$this->smtp->Mail($smtp_from))
+        {
+            $error = $this->Lang("from_failed") . $smtp_from;
+            $this->SetError($error);
+            $this->smtp->Reset();
+            return false;
+        }
+
+        // Attempt to send attach all recipients
+        for($i = 0; $i < count($this->to); $i++)
+        {
+            if(!$this->smtp->Recipient($this->to[$i][0]))
+                $bad_rcpt[] = $this->to[$i][0];
+        }
+        for($i = 0; $i < count($this->cc); $i++)
+        {
+            if(!$this->smtp->Recipient($this->cc[$i][0]))
+                $bad_rcpt[] = $this->cc[$i][0];
+        }
+        for($i = 0; $i < count($this->bcc); $i++)
+        {
+            if(!$this->smtp->Recipient($this->bcc[$i][0]))
+                $bad_rcpt[] = $this->bcc[$i][0];
+        }
+
+        if(count($bad_rcpt) > 0) // Create error message
+        {
+            for($i = 0; $i < count($bad_rcpt); $i++)
+            {
+                if($i != 0) { $error .= ", "; }
+                $error .= $bad_rcpt[$i];
+            }
+            $error = $this->Lang("recipients_failed") . $error;
+            $this->SetError($error);
+            $this->smtp->Reset();
+            return false;
+        }
+
+        if(!$this->smtp->Data($header . $body))
+        {
+            $this->SetError($this->Lang("data_not_accepted"));
+            $this->smtp->Reset();
+            return false;
+        }
+        if($this->SMTPKeepAlive == true)
+            $this->smtp->Reset();
+        else
+            $this->SmtpClose();
+
+        return true;
+    }
+
+    /**
+     * Initiates a connection to an SMTP server.  Returns false if the 
+     * operation failed.
+     * @access private
+     * @return bool
+     */
+    function SmtpConnect() {
+        if($this->smtp == NULL) { $this->smtp = new SMTP(); }
+
+        $this->smtp->do_debug = $this->SMTPDebug;
+        $hosts = explode(";", $this->Host);
+        $index = 0;
+        $connection = ($this->smtp->Connected()); 
+
+        // Retry while there is no connection
+        while($index < count($hosts) && $connection == false)
+        {
+            if(strstr($hosts[$index], ":"))
+                list($host, $port) = explode(":", $hosts[$index]);
+            else
+            {
+                $host = $hosts[$index];
+                $port = $this->Port;
+            }
+
+            if($this->smtp->Connect($host, $port, $this->Timeout))
+            {
+                if ($this->Helo != '')
+                    $this->smtp->Hello($this->Helo);
+                else
+                    $this->smtp->Hello($this->ServerHostname());
+        
+                if($this->SMTPAuth)
+                {
+                    if(!$this->smtp->Authenticate($this->Username, 
+                                                  $this->Password))
+                    {
+                        $this->SetError($this->Lang("authenticate"));
+                        $this->smtp->Reset();
+                        $connection = false;
+                    }
+                }
+                $connection = true;
+            }
+            $index++;
+        }
+        if(!$connection)
+            $this->SetError($this->Lang("connect_host"));
+
+        return $connection;
+    }
+
+    /**
+     * Closes the active SMTP session if one exists.
+     * @return void
+     */
+    function SmtpClose() {
+        if($this->smtp != NULL)
+        {
+            if($this->smtp->Connected())
+            {
+                $this->smtp->Quit();
+                $this->smtp->Close();
+            }
+        }
+    }
+
+    /**
+     * Sets the language for all class error messages.  Returns false 
+     * if it cannot load the language file.  The default language type
+     * is English.
+     * @param string $lang_type Type of language (e.g. Portuguese: "br")
+     * @param string $lang_path Path to the language file directory
+     * @access public
+     * @return bool
+     */
+    function SetLanguage($lang_type, $lang_path = "language/") {
+        if($lang_path == "language/") {
+            $lang_path = dirname(__FILE__).DIRECTORY_SEPARATOR.$lang_path;
+        }
+
+        if(file_exists($lang_path.'phpmailer.lang-'.$lang_type.'.php'))
+            include($lang_path.'phpmailer.lang-'.$lang_type.'.php');
+        else if(file_exists($lang_path.'phpmailer.lang-en.php'))
+            include($lang_path.'phpmailer.lang-en.php');
+        else
+        {
+            $this->SetError("Could not load language file");
+            return false;
+        }
+        $this->language = $PHPMAILER_LANG;
+    
+        return true;
+    }
+
+    /////////////////////////////////////////////////
+    // MESSAGE CREATION METHODS
+    /////////////////////////////////////////////////
+
+    /**
+     * Creates recipient headers.  
+     * @access private
+     * @return string
+     */
+    function AddrAppend($type, $addr) {
+        $addr_str = $type . ": ";
+        $addr_str .= $this->AddrFormat($addr[0]);
+        if(count($addr) > 1)
+        {
+            for($i = 1; $i < count($addr); $i++)
+                $addr_str .= ", " . $this->AddrFormat($addr[$i]);
+        }
+        $addr_str .= $this->LE;
+
+        return $addr_str;
+    }
+    
+    /**
+     * Formats an address correctly. 
+     * @access private
+     * @return string
+     */
+    function AddrFormat($addr) {
+        if(empty($addr[1]))
+            $formatted = $addr[0];
+        else
+        {
+            $formatted = $this->EncodeHeader($addr[1], 'phrase') . " <" . 
+                         $addr[0] . ">";
+        }
+
+        return $formatted;
+    }
+
+    /**
+     * Wraps message for use with mailers that do not
+     * automatically perform wrapping and for quoted-printable.
+     * Original written by philippe.  
+     * @access private
+     * @return string
+     */
+    function WrapText($message, $length, $qp_mode = false) {
+        $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE;
+
+        $message = $this->FixEOL($message);
+        if (substr($message, -1) == $this->LE)
+            $message = substr($message, 0, -1);
+
+        $line = explode($this->LE, $message);
+        $message = "";
+        for ($i=0 ;$i < count($line); $i++)
+        {
+          $line_part = explode(" ", $line[$i]);
+          $buf = "";
+          for ($e = 0; $e<count($line_part); $e++)
+          {
+              $word = $line_part[$e];
+              if ($qp_mode and (strlen($word) > $length))
+              {
+                $space_left = $length - strlen($buf) - 1;
+                if ($e != 0)
+                {
+                    if ($space_left > 20)
+                    {
+                        $len = $space_left;
+                        if (substr($word, $len - 1, 1) == "=")
+                          $len--;
+                        elseif (substr($word, $len - 2, 1) == "=")
+                          $len -= 2;
+                        $part = substr($word, 0, $len);
+                        $word = substr($word, $len);
+                        $buf .= " " . $part;
+                        $message .= $buf . sprintf("=%s", $this->LE);
+                    }
+                    else
+                    {
+                        $message .= $buf . $soft_break;
+                    }
+                    $buf = "";
+                }
+                while (strlen($word) > 0)
+                {
+                    $len = $length;
+                    if (substr($word, $len - 1, 1) == "=")
+                        $len--;
+                    elseif (substr($word, $len - 2, 1) == "=")
+                        $len -= 2;
+                    $part = substr($word, 0, $len);
+                    $word = substr($word, $len);
+
+                    if (strlen($word) > 0)
+                        $message .= $part . sprintf("=%s", $this->LE);
+                    else
+                        $buf = $part;
+                }
+              }
+              else
+              {
+                $buf_o = $buf;
+                $buf .= ($e == 0) ? $word : (" " . $word); 
+
+                if (strlen($buf) > $length and $buf_o != "")
+                {
+                    $message .= $buf_o . $soft_break;
+                    $buf = $word;
+                }
+              }
+          }
+          $message .= $buf . $this->LE;
+        }
+
+        return $message;
+    }
+    
+    /**
+     * Set the body wrapping.
+     * @access private
+     * @return void
+     */
+    function SetWordWrap() {
+        if($this->WordWrap < 1)
+            return;
+            
+        switch($this->message_type)
+        {
+           case "alt":
+              // fall through
+           case "alt_attachments":
+              $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap);
+              break;
+           default:
+              $this->Body = $this->WrapText($this->Body, $this->WordWrap);
+              break;
+        }
+    }
+
+    /**
+     * Assembles message header.  
+     * @access private
+     * @return string
+     */
+    function CreateHeader() {
+        $result = "";
+        
+        // Set the boundaries
+        $uniq_id = md5(uniqid(time()));
+        $this->boundary[1] = "b1_" . $uniq_id;
+        $this->boundary[2] = "b2_" . $uniq_id;
+
+        $result .= $this->HeaderLine("Date", $this->RFCDate());
+        if($this->Sender == "")
+            $result .= $this->HeaderLine("Return-Path", trim($this->From));
+        else
+            $result .= $this->HeaderLine("Return-Path", trim($this->Sender));
+        
+        // To be created automatically by mail()
+        if($this->Mailer != "mail")
+        {
+            if(count($this->to) > 0)
+                $result .= $this->AddrAppend("To", $this->to);
+            else if (count($this->cc) == 0)
+                $result .= $this->HeaderLine("To", "undisclosed-recipients:;");
+            if(count($this->cc) > 0)
+                $result .= $this->AddrAppend("Cc", $this->cc);
+        }
+
+        $from = array();
+        $from[0][0] = trim($this->From);
+        $from[0][1] = $this->FromName;
+        $result .= $this->AddrAppend("From", $from); 
+
+        // sendmail and mail() extract Bcc from the header before sending
+        if((($this->Mailer == "sendmail") || ($this->Mailer == "mail")) && (count($this->bcc) > 0))
+            $result .= $this->AddrAppend("Bcc", $this->bcc);
+
+        if(count($this->ReplyTo) > 0)
+            $result .= $this->AddrAppend("Reply-to", $this->ReplyTo);
+
+        // mail() sets the subject itself
+        if($this->Mailer != "mail")
+            $result .= $this->HeaderLine("Subject", $this->EncodeHeader(trim($this->Subject)));
+
+        $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE);
+        $result .= $this->HeaderLine("X-Priority", $this->Priority);
+        $result .= $this->HeaderLine("X-Mailer", "PHPMailer [version " . $this->Version . "]");
+        
+        if($this->ConfirmReadingTo != "")
+        {
+            $result .= $this->HeaderLine("Disposition-Notification-To", 
+                       "<" . trim($this->ConfirmReadingTo) . ">");
+        }
+
+        // Add custom headers
+        for($index = 0; $index < count($this->CustomHeader); $index++)
+        {
+            $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), 
+                       $this->EncodeHeader(trim($this->CustomHeader[$index][1])));
+        }
+        $result .= $this->HeaderLine("MIME-Version", "1.0");
+
+        switch($this->message_type)
+        {
+            case "plain":
+                $result .= $this->HeaderLine("Content-Transfer-Encoding", $this->Encoding);
+                $result .= sprintf("Content-Type: %s; charset=\"%s\"",
+                                    $this->ContentType, $this->CharSet);
+                break;
+            case "attachments":
+                // fall through
+            case "alt_attachments":
+                if($this->InlineImageExists())
+                {
+                    $result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", 
+                                    "multipart/related", $this->LE, $this->LE, 
+                                    $this->boundary[1], $this->LE);
+                }
+                else
+                {
+                    $result .= $this->HeaderLine("Content-Type", "multipart/mixed;");
+                    $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');
+                }
+                break;
+            case "alt":
+                $result .= $this->HeaderLine("Content-Type", "multipart/alternative;");
+                $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');
+                break;
+        }
+
+        if($this->Mailer != "mail")
+            $result .= $this->LE.$this->LE;
+
+        return $result;
+    }
+
+    /**
+     * Assembles the message body.  Returns an empty string on failure.
+     * @access private
+     * @return string
+     */
+    function CreateBody() {
+        $result = "";
+
+        $this->SetWordWrap();
+
+        switch($this->message_type)
+        {
+            case "alt":
+                $result .= $this->GetBoundary($this->boundary[1], "", 
+                                              "text/plain", "");
+                $result .= $this->EncodeString($this->AltBody, $this->Encoding);
+                $result .= $this->LE.$this->LE;
+                $result .= $this->GetBoundary($this->boundary[1], "", 
+                                              "text/html", "");
+                
+                $result .= $this->EncodeString($this->Body, $this->Encoding);
+                $result .= $this->LE.$this->LE;
+    
+                $result .= $this->EndBoundary($this->boundary[1]);
+                break;
+            case "plain":
+                $result .= $this->EncodeString($this->Body, $this->Encoding);
+                break;
+            case "attachments":
+                $result .= $this->GetBoundary($this->boundary[1], "", "", "");
+                $result .= $this->EncodeString($this->Body, $this->Encoding);
+                $result .= $this->LE;
+     
+                $result .= $this->AttachAll();
+                break;
+            case "alt_attachments":
+                $result .= sprintf("--%s%s", $this->boundary[1], $this->LE);
+                $result .= sprintf("Content-Type: %s;%s" .
+                                   "\tboundary=\"%s\"%s",
+                                   "multipart/alternative", $this->LE, 
+                                   $this->boundary[2], $this->LE.$this->LE);
+    
+                // Create text body
+                $result .= $this->GetBoundary($this->boundary[2], "", 
+                                              "text/plain", "") . $this->LE;
+
+                $result .= $this->EncodeString($this->AltBody, $this->Encoding);
+                $result .= $this->LE.$this->LE;
+    
+                // Create the HTML body
+                $result .= $this->GetBoundary($this->boundary[2], "", 
+                                              "text/html", "") . $this->LE;
+    
+                $result .= $this->EncodeString($this->Body, $this->Encoding);
+                $result .= $this->LE.$this->LE;
+
+                $result .= $this->EndBoundary($this->boundary[2]);
+                
+                $result .= $this->AttachAll();
+                break;
+        }
+        if($this->IsError())
+            $result = "";
+
+        return $result;
+    }
+
+    /**
+     * Returns the start of a message boundary.
+     * @access private
+     */
+    function GetBoundary($boundary, $charSet, $contentType, $encoding) {
+        $result = "";
+        if($charSet == "") { $charSet = $this->CharSet; }
+        if($contentType == "") { $contentType = $this->ContentType; }
+        if($encoding == "") { $encoding = $this->Encoding; }
+
+        $result .= $this->TextLine("--" . $boundary);
+        $result .= sprintf("Content-Type: %s; charset = \"%s\"", 
+                            $contentType, $charSet);
+        $result .= $this->LE;
+        $result .= $this->HeaderLine("Content-Transfer-Encoding", $encoding);
+        $result .= $this->LE;
+       
+        return $result;
+    }
+    
+    /**
+     * Returns the end of a message boundary.
+     * @access private
+     */
+    function EndBoundary($boundary) {
+        return $this->LE . "--" . $boundary . "--" . $this->LE; 
+    }
+    
+    /**
+     * Sets the message type.
+     * @access private
+     * @return void
+     */
+    function SetMessageType() {
+        if(count($this->attachment) < 1 && strlen($this->AltBody) < 1)
+            $this->message_type = "plain";
+        else
+        {
+            if(count($this->attachment) > 0)
+                $this->message_type = "attachments";
+            if(strlen($this->AltBody) > 0 && count($this->attachment) < 1)
+                $this->message_type = "alt";
+            if(strlen($this->AltBody) > 0 && count($this->attachment) > 0)
+                $this->message_type = "alt_attachments";
+        }
+    }
+
+    /**
+     * Returns a formatted header line.
+     * @access private
+     * @return string
+     */
+    function HeaderLine($name, $value) {
+        return $name . ": " . $value . $this->LE;
+    }
+
+    /**
+     * Returns a formatted mail line.
+     * @access private
+     * @return string
+     */
+    function TextLine($value) {
+        return $value . $this->LE;
+    }
+
+    /////////////////////////////////////////////////
+    // ATTACHMENT METHODS
+    /////////////////////////////////////////////////
+
+    /**
+     * Adds an attachment from a path on the filesystem.
+     * Returns false if the file could not be found
+     * or accessed.
+     * @param string $path Path to the attachment.
+     * @param string $name Overrides the attachment name.
+     * @param string $encoding File encoding (see $Encoding).
+     * @param string $type File extension (MIME) type.
+     * @return bool
+     */
+    function AddAttachment($path, $name = "", $encoding = "base64", 
+                           $type = "application/octet-stream") {
+        if(!@is_file($path))
+        {
+            $this->SetError($this->Lang("file_access") . $path);
+            return false;
+        }
+
+        $filename = basename($path);
+        if($name == "")
+            $name = $filename;
+
+        $cur = count($this->attachment);
+        $this->attachment[$cur][0] = $path;
+        $this->attachment[$cur][1] = $filename;
+        $this->attachment[$cur][2] = $name;
+        $this->attachment[$cur][3] = $encoding;
+        $this->attachment[$cur][4] = $type;
+        $this->attachment[$cur][5] = false; // isStringAttachment
+        $this->attachment[$cur][6] = "attachment";
+        $this->attachment[$cur][7] = 0;
+
+        return true;
+    }
+
+    /**
+     * Attaches all fs, string, and binary attachments to the message.
+     * Returns an empty string on failure.
+     * @access private
+     * @return string
+     */
+    function AttachAll() {
+        // Return text of body
+        $mime = array();
+
+        // Add all attachments
+        for($i = 0; $i < count($this->attachment); $i++)
+        {
+            // Check for string attachment
+            $bString = $this->attachment[$i][5];
+            if ($bString)
+                $string = $this->attachment[$i][0];
+            else
+                $path = $this->attachment[$i][0];
+
+            $filename    = $this->attachment[$i][1];
+            $name        = $this->attachment[$i][2];
+            $encoding    = $this->attachment[$i][3];
+            $type        = $this->attachment[$i][4];
+            $disposition = $this->attachment[$i][6];
+            $cid         = $this->attachment[$i][7];
+            
+            $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE);
+            $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $name, $this->LE);
+            $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE);
+
+            if($disposition == "inline")
+                $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE);
+
+            $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", 
+                              $disposition, $name, $this->LE.$this->LE);
+
+            // Encode as string attachment
+            if($bString)
+            {
+                $mime[] = $this->EncodeString($string, $encoding);
+                if($this->IsError()) { return ""; }
+                $mime[] = $this->LE.$this->LE;
+            }
+            else
+            {
+                $mime[] = $this->EncodeFile($path, $encoding);                
+                if($this->IsError()) { return ""; }
+                $mime[] = $this->LE.$this->LE;
+            }
+        }
+
+        $mime[] = sprintf("--%s--%s", $this->boundary[1], $this->LE);
+
+        return join("", $mime);
+    }
+    
+    /**
+     * Encodes attachment in requested format.  Returns an
+     * empty string on failure.
+     * @access private
+     * @return string
+     */
+    function EncodeFile ($path, $encoding = "base64") {
+        if(!@$fd = fopen($path, "rb"))
+        {
+            $this->SetError($this->Lang("file_open") . $path);
+            return "";
+        }
+        $magic_quotes = get_magic_quotes_runtime();
+        set_magic_quotes_runtime(0);
+        $file_buffer = fread($fd, filesize($path));
+        $file_buffer = $this->EncodeString($file_buffer, $encoding);
+        fclose($fd);
+        set_magic_quotes_runtime($magic_quotes);
+
+        return $file_buffer;
+    }
+
+    /**
+     * Encodes string to requested format. Returns an
+     * empty string on failure.
+     * @access private
+     * @return string
+     */
+    function EncodeString ($str, $encoding = "base64") {
+        $encoded = "";
+        switch(strtolower($encoding)) {
+          case "base64":
+              // chunk_split is found in PHP >= 3.0.6
+              $encoded = chunk_split(base64_encode($str), 76, $this->LE);
+              break;
+          case "7bit":
+          case "8bit":
+              $encoded = $this->FixEOL($str);
+              if (substr($encoded, -(strlen($this->LE))) != $this->LE)
+                $encoded .= $this->LE;
+              break;
+          case "binary":
+              $encoded = $str;
+              break;
+          case "quoted-printable":
+              $encoded = $this->EncodeQP($str);
+              break;
+          default:
+              $this->SetError($this->Lang("encoding") . $encoding);
+              break;
+        }
+        return $encoded;
+    }
+
+    /**
+     * Encode a header string to best of Q, B, quoted or none.  
+     * @access private
+     * @return string
+     */
+    function EncodeHeader ($str, $position = 'text') {
+      $x = 0;
+      
+      switch (strtolower($position)) {
+        case 'phrase':
+          if (!preg_match('/[\200-\377]/', $str)) {
+            // Can't use addslashes as we don't know what value has magic_quotes_sybase.
+            $encoded = addcslashes($str, "\0..\37\177\\\"");
+
+            if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str))
+              return ($encoded);
+            else
+              return ("\"$encoded\"");
+          }
+          $x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
+          break;
+        case 'comment':
+          $x = preg_match_all('/[()"]/', $str, $matches);
+          // Fall-through
+        case 'text':
+        default:
+          $x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
+          break;
+      }
+
+      if ($x == 0)
+        return ($str);
+
+      $maxlen = 75 - 7 - strlen($this->CharSet);
+      // Try to select the encoding which should produce the shortest output
+      if (strlen($str)/3 < $x) {
+        $encoding = 'B';
+        $encoded = base64_encode($str);
+        $maxlen -= $maxlen % 4;
+        $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
+      } else {
+        $encoding = 'Q';
+        $encoded = $this->EncodeQ($str, $position);
+        $encoded = $this->WrapText($encoded, $maxlen, true);
+        $encoded = str_replace("=".$this->LE, "\n", trim($encoded));
+      }
+
+      $encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded);
+      $encoded = trim(str_replace("\n", $this->LE, $encoded));
+      
+      return $encoded;
+    }
+    
+    /**
+     * Encode string to quoted-printable.  
+     * @access private
+     * @return string
+     */
+    function EncodeQP ($str) {
+        $encoded = $this->FixEOL($str);
+        if (substr($encoded, -(strlen($this->LE))) != $this->LE)
+            $encoded .= $this->LE;
+
+        // Replace every high ascii, control and = characters
+        $encoded = preg_replace('/([\000-\010\013\014\016-\037\075\177-\377])/e',
+                  "'='.sprintf('%02X', ord('\\1'))", $encoded);
+        // Replace every spaces and tabs when it's the last character on a line
+        $encoded = preg_replace("/([\011\040])".$this->LE."/e",
+                  "'='.sprintf('%02X', ord('\\1')).'".$this->LE."'", $encoded);
+
+        // Maximum line length of 76 characters before CRLF (74 + space + '=')
+        $encoded = $this->WrapText($encoded, 74, true);
+
+        return $encoded;
+    }
+
+    /**
+     * Encode string to q encoding.  
+     * @access private
+     * @return string
+     */
+    function EncodeQ ($str, $position = "text") {
+        // There should not be any EOL in the string
+        $encoded = preg_replace("[\r\n]", "", $str);
+
+        switch (strtolower($position)) {
+          case "phrase":
+            $encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);
+            break;
+          case "comment":
+            $encoded = preg_replace("/([\(\)\"])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);
+          case "text":
+          default:
+            // Replace every high ascii, control =, ? and _ characters
+            $encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e',
+                  "'='.sprintf('%02X', ord('\\1'))", $encoded);
+            break;
+        }
+        
+        // Replace every spaces to _ (more readable than =20)
+        $encoded = str_replace(" ", "_", $encoded);
+
+        return $encoded;
+    }
+
+    /**
+     * Adds a string or binary attachment (non-filesystem) to the list.
+     * This method can be used to attach ascii or binary data,
+     * such as a BLOB record from a database.
+     * @param string $string String attachment data.
+     * @param string $filename Name of the attachment.
+     * @param string $encoding File encoding (see $Encoding).
+     * @param string $type File extension (MIME) type.
+     * @return void
+     */
+    function AddStringAttachment($string, $filename, $encoding = "base64", 
+                                 $type = "application/octet-stream") {
+        // Append to $attachment array
+        $cur = count($this->attachment);
+        $this->attachment[$cur][0] = $string;
+        $this->attachment[$cur][1] = $filename;
+        $this->attachment[$cur][2] = $filename;
+        $this->attachment[$cur][3] = $encoding;
+        $this->attachment[$cur][4] = $type;
+        $this->attachment[$cur][5] = true; // isString
+        $this->attachment[$cur][6] = "attachment";
+        $this->attachment[$cur][7] = 0;
+    }
+    
+    /**
+     * Adds an embedded attachment.  This can include images, sounds, and 
+     * just about any other document.  Make sure to set the $type to an 
+     * image type.  For JPEG images use "image/jpeg" and for GIF images 
+     * use "image/gif".
+     * @param string $path Path to the attachment.
+     * @param string $cid Content ID of the attachment.  Use this to identify 
+     *        the Id for accessing the image in an HTML form.
+     * @param string $name Overrides the attachment name.
+     * @param string $encoding File encoding (see $Encoding).
+     * @param string $type File extension (MIME) type.  
+     * @return bool
+     */
+    function AddEmbeddedImage($path, $cid, $name = "", $encoding = "base64", 
+                              $type = "application/octet-stream") {
+    
+        if(!@is_file($path))
+        {
+            $this->SetError($this->Lang("file_access") . $path);
+            return false;
+        }
+
+        $filename = basename($path);
+        if($name == "")
+            $name = $filename;
+
+        // Append to $attachment array
+        $cur = count($this->attachment);
+        $this->attachment[$cur][0] = $path;
+        $this->attachment[$cur][1] = $filename;
+        $this->attachment[$cur][2] = $name;
+        $this->attachment[$cur][3] = $encoding;
+        $this->attachment[$cur][4] = $type;
+        $this->attachment[$cur][5] = false; // isStringAttachment
+        $this->attachment[$cur][6] = "inline";
+        $this->attachment[$cur][7] = $cid;
+    
+        return true;
+    }
+    
+    /**
+     * Returns true if an inline attachment is present.
+     * @access private
+     * @return bool
+     */
+    function InlineImageExists() {
+        $result = false;
+        for($i = 0; $i < count($this->attachment); $i++)
+        {
+            if($this->attachment[$i][6] == "inline")
+            {
+                $result = true;
+                break;
+            }
+        }
+        
+        return $result;
+    }
+
+    /////////////////////////////////////////////////
+    // MESSAGE RESET METHODS
+    /////////////////////////////////////////////////
+
+    /**
+     * Clears all recipients assigned in the TO array.  Returns void.
+     * @return void
+     */
+    function ClearAddresses() {
+        $this->to = array();
+    }
+
+    /**
+     * Clears all recipients assigned in the CC array.  Returns void.
+     * @return void
+     */
+    function ClearCCs() {
+        $this->cc = array();
+    }
+
+    /**
+     * Clears all recipients assigned in the BCC array.  Returns void.
+     * @return void
+     */
+    function ClearBCCs() {
+        $this->bcc = array();
+    }
+
+    /**
+     * Clears all recipients assigned in the ReplyTo array.  Returns void.
+     * @return void
+     */
+    function ClearReplyTos() {
+        $this->ReplyTo = array();
+    }
+
+    /**
+     * Clears all recipients assigned in the TO, CC and BCC
+     * array.  Returns void.
+     * @return void
+     */
+    function ClearAllRecipients() {
+        $this->to = array();
+        $this->cc = array();
+        $this->bcc = array();
+    }
+
+    /**
+     * Clears all previously set filesystem, string, and binary
+     * attachments.  Returns void.
+     * @return void
+     */
+    function ClearAttachments() {
+        $this->attachment = array();
+    }
+
+    /**
+     * Clears all custom headers.  Returns void.
+     * @return void
+     */
+    function ClearCustomHeaders() {
+        $this->CustomHeader = array();
+    }
+
+
+    /////////////////////////////////////////////////
+    // MISCELLANEOUS METHODS
+    /////////////////////////////////////////////////
+
+    /**
+     * Adds the error message to the error container.
+     * Returns void.
+     * @access private
+     * @return void
+     */
+    function SetError($msg) {
+        $this->error_count++;
+        $this->ErrorInfo = $msg;
+    }
+
+    /**
+     * Returns the proper RFC 822 formatted date. 
+     * @access private
+     * @return string
+     */
+    function RFCDate() {
+        $tz = date("Z");
+        $tzs = ($tz < 0) ? "-" : "+";
+        $tz = abs($tz);
+        $tz = ($tz/3600)*100 + ($tz%3600)/60;
+        $result = sprintf("%s %s%04d", date("D, j M Y H:i:s"), $tzs, $tz);
+
+        return $result;
+    }
+    
+    /**
+     * Returns the appropriate server variable.  Should work with both 
+     * PHP 4.1.0+ as well as older versions.  Returns an empty string 
+     * if nothing is found.
+     * @access private
+     * @return mixed
+     */
+    function ServerVar($varName) {
+        global $HTTP_SERVER_VARS;
+        global $HTTP_ENV_VARS;
+
+        if(!isset($_SERVER))
+        {
+            $_SERVER = $HTTP_SERVER_VARS;
+            if(!isset($_SERVER["REMOTE_ADDR"]))
+                $_SERVER = $HTTP_ENV_VARS; // must be Apache
+        }
+        
+        if(isset($_SERVER[$varName]))
+            return $_SERVER[$varName];
+        else
+            return "";
+    }
+
+    /**
+     * Returns the server hostname or 'localhost.localdomain' if unknown.
+     * @access private
+     * @return string
+     */
+    function ServerHostname() {
+        if ($this->Hostname != "")
+            $result = $this->Hostname;
+        elseif ($this->ServerVar('SERVER_NAME') != "")
+            $result = $this->ServerVar('SERVER_NAME');
+        else
+            $result = "localhost.localdomain";
+
+        return $result;
+    }
+
+    /**
+     * Returns a message in the appropriate language.
+     * @access private
+     * @return string
+     */
+    function Lang($key) {
+        if(count($this->language) < 1)
+            $this->SetLanguage("en"); // set the default language
+    
+        if(isset($this->language[$key]))
+            return $this->language[$key];
+        else
+            return "Language string failed to load: " . $key;
+    }
+    
+    /**
+     * Returns true if an error occurred.
+     * @return bool
+     */
+    function IsError() {
+        return ($this->error_count > 0);
+    }
+
+    /**
+     * Changes every end of line from CR or LF to CRLF.  
+     * @access private
+     * @return string
+     */
+    function FixEOL($str) {
+        $str = str_replace("\r\n", "\n", $str);
+        $str = str_replace("\r", "\n", $str);
+        $str = str_replace("\n", $this->LE, $str);
+        return $str;
+    }
+
+    /**
+     * Adds a custom header. 
+     * @return void
+     */
+    function AddCustomHeader($custom_header) {
+        $this->CustomHeader[] = explode(":", $custom_header, 2);
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/class.phpmailer.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/class.smtp.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/class.smtp.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/class.smtp.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1045 @@
+<?php
+////////////////////////////////////////////////////
+// SMTP - PHP SMTP class
+//
+// Version 1.02
+//
+// Define an SMTP class that can be used to connect
+// and communicate with any SMTP server. It implements
+// all the SMTP functions defined in RFC821 except TURN.
+//
+// Author: Chris Ryan
+//
+// License: LGPL, see LICENSE
+////////////////////////////////////////////////////
+
+/**
+ * SMTP is rfc 821 compliant and implements all the rfc 821 SMTP
+ * commands except TURN which will always return a not implemented
+ * error. SMTP also provides some utility methods for sending mail
+ * to an SMTP server.
+ * @package PHPMailer
+ * @author Chris Ryan
+ */
+class SMTP
+{
+    /**
+     *  SMTP server port
+     *  @var int
+     */
+    public $SMTP_PORT = 25;
+    
+    /**
+     *  SMTP reply line ending
+     *  @var string
+     */
+    public  $CRLF = "\r\n";
+    
+    /**
+     *  Sets whether debugging is turned on
+     *  @var bool
+     */
+    public $do_debug;       # the level of debug to perform
+
+    /**#@+
+     * @access private
+     */
+    private $smtp_conn;      # the socket to the server
+    private $error;          # error if any on the last call
+    private $helo_rply;      # the reply the server sent to us for HELO
+    /**#@-*/
+
+    /**
+     * Initialize the class so that the data is in a known state.
+     * @access public
+     * @return void
+     */
+    function SMTP() {
+        $this->smtp_conn = 0;
+        $this->error = null;
+        $this->helo_rply = null;
+
+        $this->do_debug = 0;
+    }
+
+    /*************************************************************
+     *                    CONNECTION FUNCTIONS                  *
+     ***********************************************************/
+
+    /**
+     * Connect to the server specified on the port specified.
+     * If the port is not specified use the default SMTP_PORT.
+     * If tval is specified then a connection will try and be
+     * established with the server for that number of seconds.
+     * If tval is not specified the default is 30 seconds to
+     * try on the connection.
+     *
+     * SMTP CODE SUCCESS: 220
+     * SMTP CODE FAILURE: 421
+     * @access public
+     * @return bool
+     */
+    function Connect($host,$port=0,$tval=30) {
+        # set the error val to null so there is no confusion
+        $this->error = null;
+
+        # make sure we are __not__ connected
+        if($this->connected()) {
+            # ok we are connected! what should we do?
+            # for now we will just give an error saying we
+            # are already connected
+            $this->error =
+                array("error" => "Already connected to a server");
+            return false;
+        }
+
+        if(empty($port)) {
+            $port = $this->SMTP_PORT;
+        }
+
+        #connect to the smtp server
+        $this->smtp_conn = fsockopen($host,    # the host of the server
+                                     $port,    # the port to use
+                                     $errno,   # error number if any
+                                     $errstr,  # error message if any
+                                     $tval);   # give up after ? secs
+        # verify we connected properly
+        if(empty($this->smtp_conn)) {
+            $this->error = array("error" => "Failed to connect to server",
+                                 "errno" => $errno,
+                                 "errstr" => $errstr);
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": $errstr ($errno)" . $this->CRLF;
+            }
+            return false;
+        }
+
+        # sometimes the SMTP server takes a little longer to respond
+        # so we will give it a longer timeout for the first read
+        // Windows still does not have support for this timeout function
+        if(substr(PHP_OS, 0, 3) != "WIN")
+           socket_set_timeout($this->smtp_conn, $tval, 0);
+
+        # get any announcement stuff
+        $announce = $this->get_lines();
+
+        # set the timeout  of any socket functions at 1/10 of a second
+        //if(function_exists("socket_set_timeout"))
+        //   socket_set_timeout($this->smtp_conn, 0, 100000);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $announce;
+        }
+
+        return true;
+    }
+
+    /**
+     * Performs SMTP authentication.  Must be run after running the
+     * Hello() method.  Returns true if successfully authenticated.
+     * @access public
+     * @return bool
+     */
+    function Authenticate($username, $password) {
+        // Start authentication
+        fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($code != 334) {
+            $this->error =
+                array("error" => "AUTH not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        // Send encoded username
+        fputs($this->smtp_conn, base64_encode($username) . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($code != 334) {
+            $this->error =
+                array("error" => "Username not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        // Send encoded password
+        fputs($this->smtp_conn, base64_encode($password) . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($code != 235) {
+            $this->error =
+                array("error" => "Password not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Returns true if connected to a server otherwise false
+     * @access private
+     * @return bool
+     */
+    function Connected() {
+        if(!empty($this->smtp_conn)) {
+            $sock_status = socket_get_status($this->smtp_conn);
+            if($sock_status["eof"]) {
+                # hmm this is an odd situation... the socket is
+                # valid but we aren't connected anymore
+                if($this->do_debug >= 1) {
+                    echo "SMTP -> NOTICE:" . $this->CRLF .
+                         "EOF caught while checking if connected";
+                }
+                $this->Close();
+                return false;
+            }
+            return true; # everything looks good
+        }
+        return false;
+    }
+
+    /**
+     * Closes the socket and cleans up the state of the class.
+     * It is not considered good to use this function without
+     * first trying to use QUIT.
+     * @access public
+     * @return void
+     */
+    function Close() {
+        $this->error = null; # so there is no confusion
+        $this->helo_rply = null;
+        if(!empty($this->smtp_conn)) {
+            # close the connection and cleanup
+            fclose($this->smtp_conn);
+            $this->smtp_conn = 0;
+        }
+    }
+
+
+    /***************************************************************
+     *                        SMTP COMMANDS                       *
+     *************************************************************/
+
+    /**
+     * Issues a data command and sends the msg_data to the server
+     * finializing the mail transaction. $msg_data is the message
+     * that is to be send with the headers. Each header needs to be
+     * on a single line followed by a <CRLF> with the message headers
+     * and the message body being seperated by and additional <CRLF>.
+     *
+     * Implements rfc 821: DATA <CRLF>
+     *
+     * SMTP CODE INTERMEDIATE: 354
+     *     [data]
+     *     <CRLF>.<CRLF>
+     *     SMTP CODE SUCCESS: 250
+     *     SMTP CODE FAILURE: 552,554,451,452
+     * SMTP CODE FAILURE: 451,554
+     * SMTP CODE ERROR  : 500,501,503,421
+     * @access public
+     * @return bool
+     */
+    function Data($msg_data) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Data() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"DATA" . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 354) {
+            $this->error =
+                array("error" => "DATA command not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        # the server is ready to accept data!
+        # according to rfc 821 we should not send more than 1000
+        # including the CRLF
+        # characters on a single line so we will break the data up
+        # into lines by \r and/or \n then if needed we will break
+        # each of those into smaller lines to fit within the limit.
+        # in addition we will be looking for lines that start with
+        # a period '.' and append and additional period '.' to that
+        # line. NOTE: this does not count towards are limit.
+
+        # normalize the line breaks so we know the explode works
+        $msg_data = str_replace("\r\n","\n",$msg_data);
+        $msg_data = str_replace("\r","\n",$msg_data);
+        $lines = explode("\n",$msg_data);
+
+        # we need to find a good way to determine is headers are
+        # in the msg_data or if it is a straight msg body
+        # currently I'm assuming rfc 822 definitions of msg headers
+        # and if the first field of the first line (':' sperated)
+        # does not contain a space then it _should_ be a header
+        # and we can process all lines before a blank "" line as
+        # headers.
+        $field = substr($lines[0],0,strpos($lines[0],":"));
+        $in_headers = false;
+        if(!empty($field) && !strstr($field," ")) {
+            $in_headers = true;
+        }
+
+        $max_line_length = 998; # used below; set here for ease in change
+
+        while(list(,$line) = @each($lines)) {
+            $lines_out = null;
+            if($line == "" && $in_headers) {
+                $in_headers = false;
+            }
+            # ok we need to break this line up into several
+            # smaller lines
+            while(strlen($line) > $max_line_length) {
+                $pos = strrpos(substr($line,0,$max_line_length)," ");
+
+                # Patch to fix DOS attack
+                if(!$pos) {
+                    $pos = $max_line_length - 1;
+                }
+
+                $lines_out[] = substr($line,0,$pos);
+                $line = substr($line,$pos + 1);
+                # if we are processing headers we need to
+                # add a LWSP-char to the front of the new line
+                # rfc 822 on long msg headers
+                if($in_headers) {
+                    $line = "\t" . $line;
+                }
+            }
+            $lines_out[] = $line;
+
+            # now send the lines to the server
+            while(list(,$line_out) = @each($lines_out)) {
+                if(strlen($line_out) > 0)
+                {
+                    if(substr($line_out, 0, 1) == ".") {
+                        $line_out = "." . $line_out;
+                    }
+                }
+                fputs($this->smtp_conn,$line_out . $this->CRLF);
+            }
+        }
+
+        # ok all the message data has been sent so lets get this
+        # over with aleady
+        fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "DATA not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Expand takes the name and asks the server to list all the
+     * people who are members of the _list_. Expand will return
+     * back and array of the result or false if an error occurs.
+     * Each value in the array returned has the format of:
+     *     [ <full-name> <sp> ] <path>
+     * The definition of <path> is defined in rfc 821
+     *
+     * Implements rfc 821: EXPN <SP> <string> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE FAILURE: 550
+     * SMTP CODE ERROR  : 500,501,502,504,421
+     * @access public
+     * @return string array
+     */
+    function Expand($name) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Expand() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"EXPN " . $name . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "EXPN not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        # parse the reply and place in our array to return to user
+        $entries = explode($this->CRLF,$rply);
+        while(list(,$l) = @each($entries)) {
+            $list[] = substr($l,4);
+        }
+
+        return $list;
+    }
+
+    /**
+     * Sends the HELO command to the smtp server.
+     * This makes sure that we and the server are in
+     * the same known state.
+     *
+     * Implements from rfc 821: HELO <SP> <domain> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE ERROR  : 500, 501, 504, 421
+     * @access public
+     * @return bool
+     */
+    function Hello($host="") {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Hello() without being connected");
+            return false;
+        }
+
+        # if a hostname for the HELO wasn't specified determine
+        # a suitable one to send
+        if(empty($host)) {
+            # we need to determine some sort of appopiate default
+            # to send to the server
+            $host = "localhost";
+        }
+
+        // Send extended hello first (RFC 2821)
+        if(!$this->SendHello("EHLO", $host))
+        {
+            if(!$this->SendHello("HELO", $host))
+                return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Sends a HELO/EHLO command.
+     * @access private
+     * @return bool
+     */
+    function SendHello($hello, $host) {
+        fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER: " . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => $hello . " not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        $this->helo_rply = $rply;
+        
+        return true;
+    }
+
+    /**
+     * Gets help information on the keyword specified. If the keyword
+     * is not specified then returns generic help, ussually contianing
+     * A list of keywords that help is available on. This function
+     * returns the results back to the user. It is up to the user to
+     * handle the returned data. If an error occurs then false is
+     * returned with $this->error set appropiately.
+     *
+     * Implements rfc 821: HELP [ <SP> <string> ] <CRLF>
+     *
+     * SMTP CODE SUCCESS: 211,214
+     * SMTP CODE ERROR  : 500,501,502,504,421
+     * @access public
+     * @return string
+     */
+    function Help($keyword="") {
+        $this->error = null; # to avoid confusion
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Help() without being connected");
+            return false;
+        }
+
+        $extra = "";
+        if(!empty($keyword)) {
+            $extra = " " . $keyword;
+        }
+
+        fputs($this->smtp_conn,"HELP" . $extra . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 211 && $code != 214) {
+            $this->error =
+                array("error" => "HELP not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        return $rply;
+    }
+
+    /**
+     * Starts a mail transaction from the email address specified in
+     * $from. Returns true if successful or false otherwise. If True
+     * the mail transaction is started and then one or more Recipient
+     * commands may be called followed by a Data command.
+     *
+     * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE SUCCESS: 552,451,452
+     * SMTP CODE SUCCESS: 500,501,421
+     * @access public
+     * @return bool
+     */
+    function Mail($from) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Mail() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "MAIL not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Sends the command NOOP to the SMTP server.
+     *
+     * Implements from rfc 821: NOOP <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE ERROR  : 500, 421
+     * @access public
+     * @return bool
+     */
+    function Noop() {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Noop() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"NOOP" . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "NOOP not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Sends the quit command to the server and then closes the socket
+     * if there is no error or the $close_on_error argument is true.
+     *
+     * Implements from rfc 821: QUIT <CRLF>
+     *
+     * SMTP CODE SUCCESS: 221
+     * SMTP CODE ERROR  : 500
+     * @access public
+     * @return bool
+     */
+    function Quit($close_on_error=true) {
+        $this->error = null; # so there is no confusion
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Quit() without being connected");
+            return false;
+        }
+
+        # send the quit command to the server
+        fputs($this->smtp_conn,"quit" . $this->CRLF);
+
+        # get any good-bye messages
+        $byemsg = $this->get_lines();
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $byemsg;
+        }
+
+        $rval = true;
+        $e = null;
+
+        $code = substr($byemsg,0,3);
+        if($code != 221) {
+            # use e as a tmp var cause Close will overwrite $this->error
+            $e = array("error" => "SMTP server rejected quit command",
+                       "smtp_code" => $code,
+                       "smtp_rply" => substr($byemsg,4));
+            $rval = false;
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $e["error"] . ": " .
+                         $byemsg . $this->CRLF;
+            }
+        }
+
+        if(empty($e) || $close_on_error) {
+            $this->Close();
+        }
+
+        return $rval;
+    }
+
+    /**
+     * Sends the command RCPT to the SMTP server with the TO: argument of $to.
+     * Returns true if the recipient was accepted false if it was rejected.
+     *
+     * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250,251
+     * SMTP CODE FAILURE: 550,551,552,553,450,451,452
+     * SMTP CODE ERROR  : 500,501,503,421
+     * @access public
+     * @return bool
+     */
+    function Recipient($to) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Recipient() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250 && $code != 251) {
+            $this->error =
+                array("error" => "RCPT not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Sends the RSET command to abort and transaction that is
+     * currently in progress. Returns true if successful false
+     * otherwise.
+     *
+     * Implements rfc 821: RSET <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE ERROR  : 500,501,504,421
+     * @access public
+     * @return bool
+     */
+    function Reset() {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Reset() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"RSET" . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "RSET failed",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Starts a mail transaction from the email address specified in
+     * $from. Returns true if successful or false otherwise. If True
+     * the mail transaction is started and then one or more Recipient
+     * commands may be called followed by a Data command. This command
+     * will send the message to the users terminal if they are logged
+     * in.
+     *
+     * Implements rfc 821: SEND <SP> FROM:<reverse-path> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE SUCCESS: 552,451,452
+     * SMTP CODE SUCCESS: 500,501,502,421
+     * @access public
+     * @return bool
+     */
+    function Send($from) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Send() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"SEND FROM:" . $from . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "SEND not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Starts a mail transaction from the email address specified in
+     * $from. Returns true if successful or false otherwise. If True
+     * the mail transaction is started and then one or more Recipient
+     * commands may be called followed by a Data command. This command
+     * will send the message to the users terminal if they are logged
+     * in and send them an email.
+     *
+     * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE SUCCESS: 552,451,452
+     * SMTP CODE SUCCESS: 500,501,502,421
+     * @access public
+     * @return bool
+     */
+    function SendAndMail($from) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                "error" => "Called SendAndMail() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "SAML not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Starts a mail transaction from the email address specified in
+     * $from. Returns true if successful or false otherwise. If True
+     * the mail transaction is started and then one or more Recipient
+     * commands may be called followed by a Data command. This command
+     * will send the message to the users terminal if they are logged
+     * in or mail it to them if they are not.
+     *
+     * Implements rfc 821: SOML <SP> FROM:<reverse-path> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE SUCCESS: 552,451,452
+     * SMTP CODE SUCCESS: 500,501,502,421
+     * @access public
+     * @return bool
+     */
+    function SendOrMail($from) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                "error" => "Called SendOrMail() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"SOML FROM:" . $from . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250) {
+            $this->error =
+                array("error" => "SOML not accepted from server",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * This is an optional command for SMTP that this class does not
+     * support. This method is here to make the RFC821 Definition
+     * complete for this class and __may__ be implimented in the future
+     *
+     * Implements from rfc 821: TURN <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250
+     * SMTP CODE FAILURE: 502
+     * SMTP CODE ERROR  : 500, 503
+     * @access public
+     * @return bool
+     */
+    function Turn() {
+        $this->error = array("error" => "This method, TURN, of the SMTP ".
+                                        "is not implemented");
+        if($this->do_debug >= 1) {
+            echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF;
+        }
+        return false;
+    }
+
+    /**
+     * Verifies that the name is recognized by the server.
+     * Returns false if the name could not be verified otherwise
+     * the response from the server is returned.
+     *
+     * Implements rfc 821: VRFY <SP> <string> <CRLF>
+     *
+     * SMTP CODE SUCCESS: 250,251
+     * SMTP CODE FAILURE: 550,551,553
+     * SMTP CODE ERROR  : 500,501,502,421
+     * @access public
+     * @return int
+     */
+    function Verify($name) {
+        $this->error = null; # so no confusion is caused
+
+        if(!$this->connected()) {
+            $this->error = array(
+                    "error" => "Called Verify() without being connected");
+            return false;
+        }
+
+        fputs($this->smtp_conn,"VRFY " . $name . $this->CRLF);
+
+        $rply = $this->get_lines();
+        $code = substr($rply,0,3);
+
+        if($this->do_debug >= 2) {
+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+        }
+
+        if($code != 250 && $code != 251) {
+            $this->error =
+                array("error" => "VRFY failed on name '$name'",
+                      "smtp_code" => $code,
+                      "smtp_msg" => substr($rply,4));
+            if($this->do_debug >= 1) {
+                echo "SMTP -> ERROR: " . $this->error["error"] .
+                         ": " . $rply . $this->CRLF;
+            }
+            return false;
+        }
+        return $rply;
+    }
+
+    /*******************************************************************
+     *                       INTERNAL FUNCTIONS                       *
+     ******************************************************************/
+
+    /**
+     * Read in as many lines as possible
+     * either before eof or socket timeout occurs on the operation.
+     * With SMTP we can tell if we have more lines to read if the
+     * 4th character is '-' symbol. If it is a space then we don't
+     * need to read anything else.
+     * @access private
+     * @return string
+     */
+    function get_lines() {
+        $data = "";
+        while($str = fgets($this->smtp_conn,515)) {
+            if($this->do_debug >= 4) {
+                echo "SMTP -> get_lines(): \$data was \"$data\"" .
+                         $this->CRLF;
+                echo "SMTP -> get_lines(): \$str is \"$str\"" .
+                         $this->CRLF;
+            }
+            $data .= $str;
+            if($this->do_debug >= 4) {
+                echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF;
+            }
+            # if the 4th character is a space then we are done reading
+            # so just break the loop
+            if(substr($str,3,1) == " ") { break; }
+        }
+        return $data;
+    }
+
+}
+
+
+ ?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/class.smtp.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-br.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-br.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-br.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,20 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Portuguese Version
+ * By Paulo Henrique Garcia - paulo en controllerweb.com.br
+ */
+
+$PHPMAILER_LANG = array();
+$PHPMAILER_LANG["provide_address"] = 'Você deve fornecer pelo menos um endereço de destinatário de email.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer não suportado.';
+$PHPMAILER_LANG["execute"] = 'Não foi possível executar: ';
+$PHPMAILER_LANG["instantiate"] = 'Não foi possível instanciar a função mail.';
+$PHPMAILER_LANG["authenticate"] = 'Erro de SMTP: Não foi possível autenticar.';
+$PHPMAILER_LANG["from_failed"] = 'Os endereços de rementente a seguir falharam: ';
+$PHPMAILER_LANG["recipients_failed"] = 'Erro de SMTP: Os endereços de destinatário a seguir falharam: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'Erro de SMTP: Dados não aceitos.';
+$PHPMAILER_LANG["connect_host"] = 'Erro de SMTP: Não foi possível conectar com o servidor SMTP.';
+$PHPMAILER_LANG["file_access"] = 'Não foi possível acessar o arquivo: ';
+$PHPMAILER_LANG["file_open"] = 'Erro de Arquivo: Não foi possível abrir o arquivo: ';
+$PHPMAILER_LANG["encoding"] = 'Codificação desconhecida: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-br.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ca.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ca.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ca.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,21 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Catalan Version
+ * By Ivan: web AT microstudi DOT com
+ */
+
+$PHPMAILER_LANG = array(); 
+
+$PHPMAILER_LANG["provide_address"] = 'S\'ha de proveir almenys una adreça d\'email com a destinatari.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer no està suportat';
+$PHPMAILER_LANG["execute"] = 'No es pot executar: ';
+$PHPMAILER_LANG["instantiate"] = 'No s\'ha pogut crear una instància de la funció Mail.';
+$PHPMAILER_LANG["authenticate"] = 'Error SMTP: No s\'hapogut autenticar.';
+$PHPMAILER_LANG["from_failed"] = 'La(s) següent(s) adreces de remitent han fallat: ';
+$PHPMAILER_LANG["recipients_failed"] = 'Error SMTP: Els següents destinataris han fallat: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'Error SMTP: Dades no acceptades.';
+$PHPMAILER_LANG["connect_host"] = 'Error SMTP: No es pot connectar al servidor SMTP.';
+$PHPMAILER_LANG["file_access"] = 'No es pot accedir a l\'arxiu: ';
+$PHPMAILER_LANG["file_open"] = 'Error d\'Arxiu: No es pot obrir l\'arxiu: ';
+$PHPMAILER_LANG["encoding"] = 'Codificació desconeguda: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ca.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-cz.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-cz.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-cz.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,23 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Czech Version
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Musíte zadat alespoò jednu ' .
+                                     'emailovou adresu pøíjemce.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailový klient není podporován.';
+$PHPMAILER_LANG["execute"] = 'Nelze provést: ';
+$PHPMAILER_LANG["instantiate"] = 'Nelze vytvoøit instanci emailové funkce.';
+$PHPMAILER_LANG["authenticate"] = 'SMTP Error: Chyba autentikace.';
+$PHPMAILER_LANG["from_failed"] = 'Následující adresa From je nesprávná: ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP Error: Adresy pøíjemcù ' .
+                                       'nejsou správné ' .
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Error: Data nebyla pøijata';
+$PHPMAILER_LANG["connect_host"] = 'SMTP Error: Nelze navázat spojení se ' .
+                                  ' SMTP serverem.';
+$PHPMAILER_LANG["file_access"] = 'Soubor nenalezen: ';
+$PHPMAILER_LANG["file_open"] = 'File Error: Nelze otevøít soubor pro ètení: ';
+$PHPMAILER_LANG["encoding"] = 'Neznámé kódování: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-cz.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-de.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-de.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-de.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,22 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * German Version
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Bitte geben Sie mindestens eine ' .
+                                     'Empf&auml;nger Emailadresse an.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer wird nicht unterst&uuml;tzt.';
+$PHPMAILER_LANG["execute"] = 'Konnte folgenden Befehl nicht ausf&uuml;hren: ';
+$PHPMAILER_LANG["instantiate"] = 'Mail Funktion konnte nicht initialisiert werden.';
+$PHPMAILER_LANG["authenticate"] = 'SMTP Fehler: Authentifizierung fehlgeschlagen.';
+$PHPMAILER_LANG["from_failed"] = 'Die folgende Absenderadresse ist nicht korrekt: ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP Fehler: Die folgenden ' .
+                                       'Empf&auml;nger sind nicht korrekt: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Fehler: Daten werden nicht akzeptiert.';
+$PHPMAILER_LANG["connect_host"] = 'SMTP Fehler: Konnte keine Verbindung zum SMTP-Host herstellen.';
+$PHPMAILER_LANG["file_access"] = 'Zugriff auf folgende Datei fehlgeschlagen: ';
+$PHPMAILER_LANG["file_open"] = 'Datei Fehler: konnte folgende Datei nicht &ouml;ffnen: ';
+$PHPMAILER_LANG["encoding"] = 'Unbekanntes Encoding-Format: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-de.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-dk.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-dk.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-dk.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,23 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Danish Version
+ * Author: Mikael Stokkebro <info en stokkebro.dk>
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Du skal indtaste mindst en ' .
+                                     'modtagers emailadresse.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer understøttes ikke.';
+$PHPMAILER_LANG["execute"] = 'Kunne ikke køre: ';
+$PHPMAILER_LANG["instantiate"] = 'Kunne ikke initialisere email funktionen.';
+$PHPMAILER_LANG["authenticate"] = 'SMTP fejl: Kunne ikke logge på.';
+$PHPMAILER_LANG["from_failed"] = 'Følgende afsenderadresse er forkert: ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP fejl: Følgende' .
+                                       'modtagere er forkerte: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP fejl: Data kunne ikke accepteres.';
+$PHPMAILER_LANG["connect_host"] = 'SMTP fejl: Kunne ikke tilslutte SMTP serveren.';
+$PHPMAILER_LANG["file_access"] = 'Ingen adgang til fil: ';
+$PHPMAILER_LANG["file_open"] = 'Fil fejl: Kunne ikke åbne filen: ';
+$PHPMAILER_LANG["encoding"] = 'Ukendt encode-format: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-dk.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-en.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-en.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-en.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,22 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * English Version
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'You must provide at least one ' .
+                                     'recipient email address.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer is not supported.';
+$PHPMAILER_LANG["execute"] = 'Could not execute: ';
+$PHPMAILER_LANG["instantiate"] = 'Could not instantiate mail function.';
+$PHPMAILER_LANG["authenticate"] = 'SMTP Error: Could not authenticate.';
+$PHPMAILER_LANG["from_failed"] = 'The following From address failed: ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP Error: The following ' .
+                                       'recipients failed: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Error: Data not accepted.';
+$PHPMAILER_LANG["connect_host"] = 'SMTP Error: Could not connect to SMTP host.';
+$PHPMAILER_LANG["file_access"] = 'Could not access file: ';
+$PHPMAILER_LANG["file_open"] = 'File Error: Could not open file: ';
+$PHPMAILER_LANG["encoding"] = 'Unknown encoding: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-en.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-es.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-es.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-es.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,22 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Versión en español
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Debe proveer al menos una ' .
+                                     'dirección de email como destinatario.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer no está soportado.';
+$PHPMAILER_LANG["execute"] = 'No puedo ejecutar: ';
+$PHPMAILER_LANG["instantiate"] = 'No pude crear una instancia de la función Mail.';
+$PHPMAILER_LANG["authenticate"] = 'Error SMTP: No se pudo autentificar.';
+$PHPMAILER_LANG["from_failed"] = 'La(s) siguiente(s) direcciones de remitente fallaron: ';
+$PHPMAILER_LANG["recipients_failed"] = 'Error SMTP: Los siguientes ' .
+                                       'destinatarios fallaron: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'Error SMTP: Datos no aceptados.';
+$PHPMAILER_LANG["connect_host"] = 'Error SMTP: No puedo conectar al servidor SMTP.';
+$PHPMAILER_LANG["file_access"] = 'No puedo acceder al archivo: ';
+$PHPMAILER_LANG["file_open"] = 'Error de Archivo: No puede abrir el archivo: ';
+$PHPMAILER_LANG["encoding"] = 'Codificación desconocida: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-es.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-fi.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-fi.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-fi.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,22 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Finnish Version
+ * By Jyry Kuukanen
+ */
+
+$PHPMAILER_LANG = array(); 
+
+$PHPMAILER_LANG["provide_address"] = 'Aseta v&auml;hint&auml;&auml;n yksi vastaanottajan ' . 
+                                     's&auml;hk&ouml;postiosoite.'; 
+$PHPMAILER_LANG["mailer_not_supported"] = 'postiv&auml;litintyyppi&auml; ei tueta.'; 
+$PHPMAILER_LANG["execute"] = 'Suoritus ep&auml;onnistui: '; 
+$PHPMAILER_LANG["instantiate"] = 'mail-funktion luonti ep&auml;onnistui.'; 
+$PHPMAILER_LANG["authenticate"] = 'SMTP-virhe: k&auml;ytt&auml;j&auml;tunnistus ep&auml;onnistui.'; 
+$PHPMAILER_LANG["from_failed"] = 'Seuraava l&auml;hett&auml;j&auml;n osoite on virheellinen: '; 
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP-virhe: seuraava vastaanottaja osoite on virheellinen.'; 
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP-virhe: data on virheellinen.'; 
+$PHPMAILER_LANG["connect_host"] = 'SMTP-virhe: yhteys palvelimeen ei onnistu.'; 
+$PHPMAILER_LANG["file_access"] = 'Seuraavaan tiedostoon ei ole oikeuksia: '; 
+$PHPMAILER_LANG["file_open"] = 'Tiedostovirhe: Ei voida avata tiedostoa: '; 
+$PHPMAILER_LANG["encoding"] = 'Tuntematon koodaustyyppi: '; 
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-fi.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-fo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-fo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-fo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,24 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Faroese Version [language of the Faroe Islands, a Danish dominion]
+ * This file created: 11-06-2004
+ * Supplied by Dávur Sørensen [www.profo-webdesign.dk]
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Tú skal uppgeva minst ' .
+                                     'móttakara-emailadressu(r).';
+$PHPMAILER_LANG["mailer_not_supported"] = ' er ikki supporterað.';
+$PHPMAILER_LANG["execute"] = 'Kundi ikki útføra: ';
+$PHPMAILER_LANG["instantiate"] = 'Kuni ikki instantiera mail funktión.';
+$PHPMAILER_LANG["authenticate"] = 'SMTP feilur: Kundi ikki góðkenna.';
+$PHPMAILER_LANG["from_failed"] = 'fylgjandi Frá/From adressa miseydnaðist: ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP Feilur: Fylgjandi ' .
+                                       'móttakarar miseydnaðust: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP feilur: Data ikki góðkent.';
+$PHPMAILER_LANG["connect_host"] = 'SMTP feilur: Kundi ikki knýta samband við SMTP vert.';
+$PHPMAILER_LANG["file_access"] = 'Kundi ikki tilganga fílu: ';
+$PHPMAILER_LANG["file_open"] = 'Fílu feilur: Kundi ikki opna fílu: ';
+$PHPMAILER_LANG["encoding"] = 'Ókend encoding: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-fo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-fr.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-fr.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-fr.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,23 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * French Version
+ * bruno en ioda-net.ch 09.08.2003
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Vous devez fournir au moins ' .
+                                     'une adresse de destinataire.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer non supporté.';
+$PHPMAILER_LANG["execute"] = 'Ne peut pas lancer l\'exécution: ';
+$PHPMAILER_LANG["instantiate"] = 'Impossible d\'instancier la fonction mail.';
+$PHPMAILER_LANG["authenticate"] = 'SMTP Erreur: Echec de l\'authentification.';
+$PHPMAILER_LANG["from_failed"] = 'L\'adresse From suivante a échoué : ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP Erreur: Les destinataires ' .
+                                       'suivants sont en erreur : ';
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Erreur: Data non acceptée.';
+$PHPMAILER_LANG["connect_host"] = 'SMTP Erreur: Impossible de connecter le serveur SMTP .';
+$PHPMAILER_LANG["file_access"] = 'N\'arrive pas à accéder au fichier: ';
+$PHPMAILER_LANG["file_open"] = 'Erreur Fichier: ouverture impossible: ';
+$PHPMAILER_LANG["encoding"] = 'Encodage inconnu: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-fr.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-hu.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-hu.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-hu.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,22 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Hungarian Version
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Meg kell adnod legalább egy ' .
+                                     'címzett email címet.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' levelezõ nem támogatott.';
+$PHPMAILER_LANG["execute"] = 'Nem tudtam végrehajtani: ';
+$PHPMAILER_LANG["instantiate"] = 'Nem sikerült példányosítani a mail funkciót.';
+$PHPMAILER_LANG["authenticate"] = 'SMTP Hiba: Sikertelen autentikáció.';
+$PHPMAILER_LANG["from_failed"] = 'Az alábbi Feladó cím hibás: ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP Hiba: Az alábbi ' .
+                                       'címzettek hibásak: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Hiba: Nem elfogadható adat.';
+$PHPMAILER_LANG["connect_host"] = 'SMTP Hiba: Nem tudtam csatlakozni az SMTP host-hoz.';
+$PHPMAILER_LANG["file_access"] = 'Nem sikerült elérni a következõ fájlt: ';
+$PHPMAILER_LANG["file_open"] = 'Fájl Hiba: Nem sikerült megnyitni a következõ fájlt: ';
+$PHPMAILER_LANG["encoding"] = 'Ismeretlen kódolás: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-hu.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-it.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-it.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-it.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,27 @@
+<?php
+/**
+* PHPMailer language file.
+* Italian version
+* @package PHPMailer
+* @author Ilias Bartolini <brain79 en inwind.it>
+*/
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Deve essere fornito almeno un'.
+                                     ' indirizzo ricevente';
+$PHPMAILER_LANG["mailer_not_supported"] = 'Mailer non supportato';
+$PHPMAILER_LANG["execute"] = "Impossibile eseguire l'operazione: ";
+$PHPMAILER_LANG["instantiate"] = 'Impossibile istanziare la funzione mail';
+$PHPMAILER_LANG["authenticate"] = 'SMTP Error: Impossibile autenticarsi.';
+$PHPMAILER_LANG["from_failed"] = 'I seguenti indirizzi mittenti hanno'.
+                                 ' generato errore: ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP Error: I seguenti indirizzi'.
+                                       'destinatari hanno generato errore: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Error: Data non accettati dal'.
+                                       'server.';
+$PHPMAILER_LANG["connect_host"] = 'SMTP Error: Impossibile connettersi'.
+                                  ' all\'host SMTP.';
+$PHPMAILER_LANG["file_access"] = 'Impossibile accedere al file: ';
+$PHPMAILER_LANG["file_open"] = 'File Error: Impossibile aprire il file: ';
+$PHPMAILER_LANG["encoding"] = 'Encoding set dei caratteri sconosciuto: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-it.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ja.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ja.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ja.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,24 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Japanese Version
+ * By Mitsuhiro Yoshida - http://mitstek.com/
+ * This file is written in EUC-JP.
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = '¾¯¤Ê¤¯¤È¤â1¤Ä¥á¡¼¥ë¥¢¥É¥ì¥¹¤ò' .
+                                     '»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£';
+$PHPMAILER_LANG["mailer_not_supported"] = ' ¥á¡¼¥é¡¼¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£';
+$PHPMAILER_LANG["execute"] = '¼Â¹Ô¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿: ';
+$PHPMAILER_LANG["instantiate"] = '¥á¡¼¥ë´Ø¿ô¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¤Ç¤·¤¿¡£';
+$PHPMAILER_LANG["authenticate"] = 'SMTP¥¨¥é¡¼: ǧ¾Ú¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£';
+$PHPMAILER_LANG["from_failed"] = '¼¡¤ÎFrom¥¢¥É¥ì¥¹¤Ë´Ö°ã¤¤¤¬¤¢¤ê¤Þ¤¹: ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP¥¨¥é¡¼: ¼¡¤Î¼õ¿®¼Ô¥¢¥É¥ì¥¹¤Ë ' .
+                                       '´Ö°ã¤¤¤¬¤¢¤ê¤Þ¤¹: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP¥¨¥é¡¼: ¥Ç¡¼¥¿¤¬¼õ¤±ÉÕ¤±¤é¤ì¤Þ¤»¤ó¤Ç¤·¤¿¡£';
+$PHPMAILER_LANG["connect_host"] = 'SMTP¥¨¥é¡¼: SMTP¥Û¥¹¥È¤ËÀܳ¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£';
+$PHPMAILER_LANG["file_access"] = '¥Õ¥¡¥¤¥ë¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó: ';
+$PHPMAILER_LANG["file_open"] = '¥Õ¥¡¥¤¥ë¥¨¥é¡¼: ¥Õ¥¡¥¤¥ë¤ò³«¤±¤Þ¤»¤ó: ';
+$PHPMAILER_LANG["encoding"] = 'ÉÔÌÀ¤Ê¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ja.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-nl.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-nl.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-nl.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,22 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Dutch Version
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Er moet tenmiste &eacute;&eacute;n ' .
+                                     'ontvanger emailadres opgegeven worden.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer wordt niet ondersteund.';
+$PHPMAILER_LANG["execute"] = 'Kon niet uitvoeren: ';
+$PHPMAILER_LANG["instantiate"] = 'Kon mail functie niet initialiseren.';
+$PHPMAILER_LANG["authenticate"] = 'SMTP Fout: authenticatie mislukt.';
+$PHPMAILER_LANG["from_failed"] = 'De volgende afzender adressen zijn mislukt: ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP Fout: De volgende ' .
+                                       'ontvangers zijn mislukt: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Fout: Data niet geaccepteerd.';
+$PHPMAILER_LANG["connect_host"] = 'SMTP Fout: Kon niet verbinden met SMTP host.';
+$PHPMAILER_LANG["file_access"] = 'Kreeg geen toegang tot bestand: ';
+$PHPMAILER_LANG["file_open"] = 'Bestandsfout: Kon bestand niet openen: ';
+$PHPMAILER_LANG["encoding"] = 'Onbekende codering: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-nl.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-no.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-no.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-no.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,22 @@
+<?php
+/**
+ * PHPMailer language file.
+ * Norwegian Version
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Du må ha med minst en' .
+                                     'mottager adresse.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer er ikke supportert.';
+$PHPMAILER_LANG["execute"] = 'Kunne ikke utføre: ';
+$PHPMAILER_LANG["instantiate"] = 'Kunne ikke instantiate mail funksjonen.';
+$PHPMAILER_LANG["authenticate"] = 'SMTP Feil: Kunne ikke authentisere.';
+$PHPMAILER_LANG["from_failed"] = 'Følgende Fra feilet: ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP Feil: Følgende' .
+                                       'mottagere feilet: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Feil: Data ble ikke akseptert.';
+$PHPMAILER_LANG["connect_host"] = 'SMTP Feil: Kunne ikke koble til SMTP host.';
+$PHPMAILER_LANG["file_access"] = 'Kunne ikke få tilgang til filen: ';
+$PHPMAILER_LANG["file_open"] = 'Fil feil: Kunne ikke åpne filen: ';
+$PHPMAILER_LANG["encoding"] = 'Ukjent encoding: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-no.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-pl.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-pl.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-pl.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,22 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Polish Version, encoding: windows-1250
+ * translated from english lang file ver. 1.72
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Nale¿y podaæ prawid³owy adres email Odbiorcy.';
+$PHPMAILER_LANG["mailer_not_supported"] = 'Wybrana metoda wysy³ki wiadomoœci nie jest obs³ugiwana.';
+$PHPMAILER_LANG["execute"] = 'Nie mo¿na uruchomiæ: ';
+$PHPMAILER_LANG["instantiate"] = 'Nie mo¿na wywo³aæ funkcji mail(). SprawdŸ konfiguracjê serwera.';
+$PHPMAILER_LANG["authenticate"] = 'B³¹d SMTP: Nie mo¿na przeprowadziæ autentykacji.';
+$PHPMAILER_LANG["from_failed"] = 'Nastêpuj¹cy adres Nadawcy jest jest nieprawid³owy: ';
+$PHPMAILER_LANG["recipients_failed"] = 'B³¹d SMTP: Nastêpuj¹cy ' .
+                                       'odbiorcy s¹ nieprawid³owi: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'B³¹d SMTP: Dane nie zosta³y przyjête.';
+$PHPMAILER_LANG["connect_host"] = 'B³¹d SMTP: Nie mo¿na po³¹czyæ siê z wybranym hostem.';
+$PHPMAILER_LANG["file_access"] = 'Brak dostêpu do pliku: ';
+$PHPMAILER_LANG["file_open"] = 'Nie mo¿na otworzyæ pliku: ';
+$PHPMAILER_LANG["encoding"] = 'Nieznany sposób kodowania znaków: ';


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-pl.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ro.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ro.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ro.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,22 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Romanian Version
+ * @package PHPMailer
+ * @author Catalin Constantin <catalin en dazoot.ro>
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Trebuie sa adaugati cel putin un recipient (adresa de mail).';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer nu este suportat.';
+$PHPMAILER_LANG["execute"] = 'Nu pot executa:  ';
+$PHPMAILER_LANG["instantiate"] = 'Nu am putut instantia functia mail.';
+$PHPMAILER_LANG["authenticate"] = 'Eroare SMTP: Nu a functionat autentificarea.';
+$PHPMAILER_LANG["from_failed"] = 'Urmatoarele adrese From au dat eroare: ';
+$PHPMAILER_LANG["recipients_failed"] = 'Eroare SMTP: Urmatoarele adrese de mail au dat eroare: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'Eroare SMTP: Continutul mailului nu a fost acceptat.';
+$PHPMAILER_LANG["connect_host"] = 'Eroare SMTP: Nu m-am putut conecta la adresa SMTP.';
+$PHPMAILER_LANG["file_access"] = 'Nu pot accesa fisierul: ';
+$PHPMAILER_LANG["file_open"] = 'Eroare de fisier: Nu pot deschide fisierul: ';
+$PHPMAILER_LANG["encoding"] = 'Encodare necunoscuta: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ro.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ru.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ru.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ru.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,22 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Russian Version
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Ãîæàëóéñòà ââåäèòå ìèíèìóì îäèí Email' .
+                                     'ïîëó÷àòåëÿ.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer íå ïîääåðæèâàåòñÿ.';
+$PHPMAILER_LANG["execute"] = 'Ãåâîçìîæíî âûïîëíèòü ýòó êîìàíäó: ';
+$PHPMAILER_LANG["instantiate"] = 'Ãðîèçîøëà îøèáêà ïðè èíèöèàëèçàöèè Mail ôóíêöèè.';
+$PHPMAILER_LANG["authenticate"] = 'SMTP îøèáêà: îøèáêà àâòîðèçàöèè.';
+$PHPMAILER_LANG["from_failed"] = 'Ãåâåðíûé àäðåñ îòïðàâèòåëÿ: ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP îøèáêà: Ñëåäóþùèå ' .
+                                       'àäðåñà ïîëó÷àòåëåé íåâåðíû: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP îøèáêà: Äàííûå íå áûëè ïðèíÿòû.';
+$PHPMAILER_LANG["connect_host"] = 'SMTP îøèáêà: SMTP-Host íåäîñòóïåí.';
+$PHPMAILER_LANG["file_access"] = 'Â äîñòóïå ê ñëåäóþùåìó ôàéëó áûëî îòêàçàíî: ';
+$PHPMAILER_LANG["file_open"] = 'ÃÃ¥ ìîãó îòêðûòü ôàéë: ';
+$PHPMAILER_LANG["encoding"] = 'Ãåèçâåñòíûé ôîðìàò êîäèðîâêè: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-ru.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-se.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-se.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-se.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,23 @@
+<?php
+/**
+ * PHPMailer language file.  
+ * Swedish Version
+ * Author: Johan Linnér <johan en linner.biz>
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'Du måste ange minst en ' .
+                                     'mottagares e-postadress.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer stöds inte.';
+$PHPMAILER_LANG["execute"] = 'Kunde inte köra: ';
+$PHPMAILER_LANG["instantiate"] = 'Kunde inte initiera e-postfunktion.';
+$PHPMAILER_LANG["authenticate"] = 'SMTP fel: Kunde inte autentisera.';
+$PHPMAILER_LANG["from_failed"] = 'Följande avsändaradress är felaktig: ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP fel: Följande ' .
+                                       'mottagare är felaktig: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP fel: Data accepterades inte.';
+$PHPMAILER_LANG["connect_host"] = 'SMTP fel: Kunde inte ansluta till SMTP-server.';
+$PHPMAILER_LANG["file_access"] = 'Ingen åtkomst till fil: ';
+$PHPMAILER_LANG["file_open"] = 'Fil fel: Kunde inte öppna fil: ';
+$PHPMAILER_LANG["encoding"] = 'Okänt encode-format: ';
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-se.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-tr.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-tr.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-tr.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,23 @@
+<?php
+/**
+ * PHPMailer dil dosyasý.
+ * Türkçe Versiyonu
+ * ÝZYAZILIM - Elçin Özel - Can Yýlmaz - Mehmet Benlioðlu
+ */
+
+$PHPMAILER_LANG = array();
+
+$PHPMAILER_LANG["provide_address"] = 'En az bir tane mail adresi belirtmek zorundasýnýz ' .
+                                     'alýcýnýn email adresi.';
+$PHPMAILER_LANG["mailer_not_supported"] = ' mailler desteklenmemektedir.';
+$PHPMAILER_LANG["execute"] = 'Çalýþtýrýlamýyor: ';
+$PHPMAILER_LANG["instantiate"] = 'Örnek mail fonksiyonu yaratýlamadý.';
+$PHPMAILER_LANG["authenticate"] = 'SMTP Hatasý: Doðrulanamýyor.';
+$PHPMAILER_LANG["from_failed"] = 'Baþarýsýz olan gönderici adresi: ';
+$PHPMAILER_LANG["recipients_failed"] = 'SMTP Hatasý:  ' .
+                                       'alýcýlara ulaþmadý: ';
+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Hatasý: Veri kabul edilmedi.';
+$PHPMAILER_LANG["connect_host"] = 'SMTP Hatasý: SMTP hosta baðlanýlamýyor.';
+$PHPMAILER_LANG["file_access"] = 'Dosyaya eriþilemiyor: ';
+$PHPMAILER_LANG["file_open"] = 'Dosya Hatasý: Dosya açýlamýyor: ';
+$PHPMAILER_LANG["encoding"] = 'Bilinmeyen þifreleme: ';


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/phpmailer/language/phpmailer.lang-tr.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/Propel.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/Propel.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/Propel.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,581 @@
+<?php
+
+/*
+ *  $Id: Propel.php 110 2005-06-08 16:59:32Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+include_once 'propel/PropelException.php';
+include_once 'propel/adapter/DBAdapter.php';
+
+/**
+ * Propel's main resource pool and initialization & configuration class.
+ *
+ * This static class is used to handle Propel initialization and to maintain all of the
+ * open database connections and instantiated database maps.
+ *
+ * @author Hans Lellelid <hans en xmpl.rg> (Propel)
+ * @author Daniel Rall <dlr en finemaltcoding.com> (Torque)
+ * @author Magnús Þór Torfason <magnus en handtolvur.is> (Torque)
+ * @author Jason van Zyl <jvanzyl en apache.org> (Torque)
+ * @author Rafal Krzewski <Rafal.Krzewski en e-point.pl> (Torque)
+ * @author Martin Poeschl <mpoeschl en marmot.at> (Torque)
+ * @author Henning P. Schmiedehausen <hps en intermeta.de> (Torque)
+ * @author Kurt Schrader <kschrader en karmalab.org> (Torque)
+ * @version $Revision: 110 $
+ * @package propel
+ */
+class Propel {
+
+	/**
+	 * A constant for <code>default</code>.
+	 */
+	const DEFAULT_NAME = "default";
+
+	/**
+	 * A constant defining 'System is unusuable' logging level
+	 */
+	const LOG_EMERG = 0;
+
+	/**
+	 * A constant defining 'Immediate action required' logging level
+	 */
+	const LOG_ALERT = 1;
+
+	/**
+	 * A constant defining 'Critical conditions' logging level
+	 */
+	const LOG_CRIT = 2;
+
+	/**
+	 * A constant defining 'Error conditions' logging level
+	 */
+	const LOG_ERR = 3;
+
+	/**
+	 * A constant defining 'Warning conditions' logging level
+	 */
+	const LOG_WARNING = 4;
+
+	/**
+	 * A constant defining 'Normal but significant' logging level
+	 */
+	const LOG_NOTICE = 5;
+
+	/**
+	 * A constant defining 'Informational' logging level
+	 */
+	const LOG_INFO = 6;
+
+	/**
+	 * A constant defining 'Debug-level messages' logging level
+	 */
+	const LOG_DEBUG = 7;
+
+	/**
+	 * The db name that is specified as the default in the property file
+	 */
+	private static $defaultDBName;
+
+	/**
+	 * The global cache of database maps
+	 */
+	private static $dbMaps = array();
+
+	/**
+	 * The cache of DB adapter keys
+	 */
+	private static $adapterMap;
+
+	/**
+	 * The logging category.
+	 */
+	private static $category;
+
+	/**
+	 * Propel-specific configuration.
+	 */
+	private static $configuration;
+
+	/**
+	 * flag to set to true once this class has been initialized
+	 */
+	private static $isInit = false;
+
+	/**
+	 * @var Log
+	 */
+	private static $logger = null;
+
+	/**
+	 * Store mapbuilder classnames for peers that have been referenced prior
+	 * to Propel being initialized.  This can happen if the OM Peer classes are
+	 * included before the Propel::init() method has been called.
+	 */
+	private static $mapBuilders = array();
+
+	/**
+	 * Cache of established connections (to eliminate overhead).
+	 * @var array
+	 */
+	private static $connectionMap = array();
+
+	/**
+	 * initialize Propel
+	 * @return void
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function initialize() {
+
+		if (self::$configuration === null) {
+			throw new PropelException("Propel cannot be initialized without "
+					. "a valid configuration. Please check the log files "
+					. "for further details.");
+		}
+
+		self::configureLogging();
+
+		// Now that we have dealt with processing the log properties
+		// that may be contained in the configuration we will make the
+		// configuration consist only of the remaining propel-specific
+		// properties that are contained in the configuration. First
+		// look for properties that are in the "propel" namespace.
+		$originalConf = self::$configuration;
+		self::$configuration = isset(self::$configuration['propel']) ? self::$configuration['propel'] : null;
+
+		if (empty(self::$configuration)) {
+				// Assume the original configuration already had any
+				// prefixes stripped.
+				self::$configuration = $originalConf;
+		}
+		
+		// reset the connection map (this should enable runtime changes of connection params)
+		self::$connectionMap = array();
+		
+		self::initAdapters(self::$configuration);
+
+		self::$isInit = true;
+
+		// map builders may be registered w/ Propel before Propel has
+		// been initialized; in this case they are stored in a static
+		// var of this class & now can be propertly initialized.
+		foreach(self::$mapBuilders as $mbClass) {
+			BasePeer::getMapBuilder($mbClass);
+		}
+
+		// now that the pre-loaded map builders have been propertly initialized
+		// empty the array.
+		// any further mapBuilders will be build by the generated MapBuilder classes.
+		self::$mapBuilders = array();
+	}
+
+	/**
+	 * Setup the adapters needed.  An adapter must be defined for each database connection.
+	 * Generally the adapter will be the same as the PEAR phpname; e.g. for MySQL, use the
+	 * 'mysql' adapter.
+	 * @param array $configuration the Configuration representing the properties file
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	private static function initAdapters($configuration) {
+
+		self::$adapterMap = array();
+
+		$c = isset($configuration['datasources']) ? $configuration['datasources'] : null;
+
+		if (!empty($c)) {
+			try {
+				foreach($c as $handle => $properties) {
+					if (is_array($properties) && isset($properties['adapter'])) {
+						$db = DBAdapter::factory($properties['adapter']);
+						// register the adapter for this name
+						self::$adapterMap[$handle] = $db;
+					}
+				}
+			} catch (Exception $e) {
+				throw new PropelException("Unable to initialize adapters.", $e);
+			}
+		} else {
+			self::log("There were no adapters in the configuration.", self::LOG_WARNING);
+		}
+	}
+
+	/**
+	 * configure propel
+	 *
+	 * @param string $config Path (absolute or relative to include_path) to config file.
+	 * @return void
+	 * @throws PropelException If configuration file cannot be opened. (E_WARNING probably will also be raised in PHP)
+	 */
+	public static function configure($configFile)
+	{
+		self::$configuration = include($configFile);
+		if (self::$configuration === false) {
+			throw new PropelException("Unable to open configuration file: " . var_export($configFile, true));
+		}
+	}
+
+	/**
+	 * Initialization of Propel with a properties file.
+	 *
+	 * @param string $c The Propel configuration file path.
+	 * @return void
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function init($c)
+	{
+		self::configure($c);
+		self::initialize();
+	}
+
+	/**
+	 * Determine whether Propel has already been initialized.
+	 *
+	 * @return boolean True if Propel is already initialized.
+	 */
+	public static function isInit()
+	{
+		return self::$isInit;
+	}
+
+	/**
+	 * Sets the configuration for Propel and all dependencies.
+	 *
+	 * @param array $c the Configuration
+	 * @return void
+	 */
+	public static function setConfiguration($c)
+	{
+		self::$configuration = $c;
+	}
+
+	/**
+	 * Get the configuration for this component.
+	 *
+	 * @return the Configuration
+	 */
+	public static function getConfiguration()
+	{
+		return self::$configuration;
+	}
+
+	/**
+	 * Configure the logging for this subsystem.
+	 * The logging system is only configured if there is a 'log'
+	 * section in the passed-in runtime configuration.
+	 * @return void
+	 */
+	protected static function configureLogging() {
+		if (self::$logger === null) {
+			if (isset(self::$configuration['log']) && is_array(self::$configuration['log']) && count(self::$configuration['log'])) {
+				include_once 'Log.php'; // PEAR Log class
+				$c = self::$configuration['log'];
+				// array casting handles bug in PHP5b2 where the isset() checks
+				// below may return true if $c is not an array (e.g. is a string)
+
+				$type = isset($c['type']) ? $c['type'] : 'file';
+				$name = isset($c['name']) ? $c['name'] : './propel.log';
+				$ident = isset($c['ident']) ? $c['ident'] : 'propel';
+				$conf = isset($c['conf']) ? $c['conf'] : array();
+				$level = isset($c['level']) ? $c['level'] : PEAR_LOG_DEBUG;
+
+				self::$logger = Log::singleton($type, $name, $ident, $conf, $level);
+			} // if isset()
+		}
+	}
+
+	/**
+	 * Override the configured logger.
+	 *
+	 * This is primarily for things like unit tests / debugging where
+	 * you want to change the logger without altering the configuration file.
+	 *
+	 * You can use any logger class that implements the propel.logger.BasicLogger
+	 * interface.  This interface is based on PEAR::Log, so you can also simply pass
+	 * a PEAR::Log object to this method.
+	 *
+	 * @param object $logger The new logger to use. ([PEAR] Log or BasicLogger)
+	 * @return void
+	 */
+	public static function setLogger($logger)
+	{
+		self::$logger = $logger;
+	}
+
+	/**
+	 * Returns true if a logger, for example PEAR::Log, has been configured,
+	 * otherwise false.
+	 *
+	 * @return boolean True if Propel uses logging
+	 */
+	public static function hasLogger()
+	{
+		return self::$logger !== null;
+	}
+
+	/**
+	 * Get the configured logger.
+	 * @return object Configured log class ([PEAR] Log or BasicLogger).
+	 */
+	public static function logger()
+	{
+		return self::$logger;
+	}
+
+	/**
+	 * Logs a message
+	 * If a logger has been configured, the logger will be used, otherwrise the
+	 * logging message will be discarded without any further action
+	 *
+	 * @param string $message The message that will be logged.
+	 * @param string $level The logging level.
+	 * @return boolean True if the message was logged successfully or no logger was used.
+	 */
+	public static function log($message, $level = self::LOG_DEBUG)
+	{
+		if(self::hasLogger())
+		{
+			$logger = self::logger();
+			switch($level)
+			{
+				case self::LOG_EMERG:
+					return $logger->log($message, $level);
+				case self::LOG_ALERT:
+					return $logger->alert($message);
+				case self::LOG_CRIT:
+					return $logger->crit($message);
+				case self::LOG_ERR:
+					return $logger->err($message);
+				case self::LOG_WARNING:
+					return $logger->warning($message);
+				case self::LOG_NOTICE:
+					return $logger->notice($message);
+				case self::LOG_INFO:
+					return $logger->info($message);
+				default:
+					return $logger->debug($message);
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Returns the database map information. Name relates to the name
+	 * of the connection pool to associate with the map.
+	 *
+	 * The database maps are "registered" by the generated map builder classes.
+	 *
+	 * @param string $name The name of the database corresponding to the DatabaseMapto retrieve.
+	 * @return DatabaseMap The named <code>DatabaseMap</code>.
+	 * @throws PropelException - if database map is null or propel was not initialized properly.
+	 */
+	public static function getDatabaseMap($name = null) {
+
+		if ($name === null) {
+			$name = self::getDefaultDB();
+			if ($name === null) {
+				throw new PropelException("DatabaseMap name was null!");
+			}
+		}
+
+		// CACHEHOOK - this would be a good place
+		// to add shared memory caching options (database
+		// maps should be a pretty safe candidate for shared mem caching)
+
+		if (isset(self::$dbMaps[$name])) {
+		    $map = self::$dbMaps[$name];
+		} else {
+			$map = self::initDatabaseMap($name);
+		}
+
+		return $map;
+	}
+
+	/**
+	 * Creates and initializes the mape for the named database.
+	 *
+	 * The database maps are "registered" by the generated map builder classes
+	 * by calling this method and then adding the tables, etc. to teh DatabaseMap
+	 * object returned from this method.
+	 *
+	 * @param string $name The name of the database to map.
+	 * @return DatabaseMap The desired map.
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	private static function initDatabaseMap($name)
+	{
+		$map = new DatabaseMap($name);
+		self::$dbMaps[$name] = $map;
+		return $map;
+	}
+
+	/**
+	 * Register a MapBuilder
+	 *
+	 * @param string $className the MapBuilder
+	 */
+	public static function registerMapBuilder($className)
+	{
+		self::$mapBuilders[] = $className;
+	}
+
+	/**
+	 * Returns the specified property of the given database, or the empty
+	 * string if no value is set for the property.
+	 *
+	 * @param string $db   The name of the database whose property to get.
+	 * @param string $prop The name of the property to get.
+	 * @return mixed The property's value.
+	 */
+	private static function getDatabaseProperty($db, $prop)
+	{
+		return isset(self::$configuration['datasources'][$db][$prop]) ? self::$configuration['datasources'][$db][$prop] : null;
+	}
+
+	/**
+	 *
+	 * @param string $name The database name.
+	 * @return Connection A database connection
+	 * @throws PropelException - if no conneciton params, or SQLException caught when trying to connect.
+	 */
+	public static function getConnection($name = null) {
+
+		if ($name === null) {
+			$name = self::getDefaultDB();
+		}
+
+		$con = isset(self::$connectionMap[$name]) ? self::$connectionMap[$name] : null;
+
+		if ($con === null) {
+
+			$dsn = isset(self::$configuration['datasources'][$name]['connection']) ? self::$configuration['datasources'][$name]['connection'] : null;
+			if ($dsn === null) {
+				throw new PropelException("No connection params set for " . $name);
+			}
+
+			include_once 'creole/Creole.php';
+
+			// if specified, use custom driver
+			if (isset(self::$configuration['datasources'][$name]['driver'])) {
+				Creole::registerDriver($dsn['phptype'], self::$configuration['datasources'][$name]['driver']);
+			}
+
+			try {
+				$con = Creole::getConnection($dsn);
+			} catch (SQLException $e) {
+				throw new PropelException($e);
+			}
+			self::$connectionMap[$name] = $con;
+		}
+
+		return $con;
+	}
+
+	/**
+	 * Returns database adapter for a specific connection pool.
+	 *
+	 * @param string $name A database name.
+	 * @return DBAdapter The corresponding database adapter.
+	 * @throws PropelException - if unable to find DBdapter for specified db.
+	 */
+	public static function getDB($name = null)
+	{
+		if ($name === null) {
+			$name = self::getDefaultDB();
+		}
+		if (!isset(self::$adapterMap[$name])) {
+			throw new PropelException("Unable to load DBAdapter for database '" . var_export($name, true) . "' (check your runtime properties file!)");
+		}
+		return self::$adapterMap[$name];
+	}
+
+	/**
+	 * Returns the name of the default database.
+	 *
+	 * @return string Name of the default DB
+	 */
+	public static function getDefaultDB()
+	{
+		if (self::$configuration === null) {
+			return self::DEFAULT_NAME;
+		} elseif (self::$defaultDBName === null) {
+			// Determine default database name.
+			self::$defaultDBName = isset(self::$configuration['datasources']['default']) ? self::$configuration['datasources']['default'] : self::DEFAULT_NAME;
+		}
+		return self::$defaultDBName;
+	}
+
+	/**
+	 * Include once a file specified in DOT notation and reutrn unqualified clasname.
+	 *
+	 * Package notation is expected to be relative to a location
+	 * on the PHP include_path.  The dot-path classes are used as a way
+	 * to represent both classname and filesystem location; there is
+	 * an inherent assumption about filenaming.  To get around these
+	 * naming requirements you can include the class yourself
+	 * and then just use the classname instead of dot-path.
+	 *
+	 * @param string $class dot-path to clas (e.g. path.to.my.ClassName).
+	 * @return string unqualified classname
+	 */
+	public static function import($path) {
+
+		// extract classname
+		if (($pos = strrpos($path, '.')) === false) {
+			$class = $path;
+		} else {
+			$class = substr($path, $pos + 1);
+		}
+
+		// check if class exists
+		if (class_exists($class, false)) {
+			return $class;
+		}
+
+		// turn to filesystem path
+		$path = strtr($path, '.', DIRECTORY_SEPARATOR) . '.php';
+
+		// include class
+		$ret = include_once($path);
+		if ($ret === false) {
+			throw new PropelException("Unable to import class: " . $class . " from " . $path);
+		}
+
+		// return qualified name
+		return $class;
+	}
+
+	/**
+	 * Closes any associated resource handles.
+	 *
+	 * This method frees any database connection handles that have been
+	 * opened by the getConnection() method.
+	 *
+	 * @return void
+	 */
+	public static function close()
+	{
+		foreach(self::$connectionMap as $conn) {
+			$conn->close();
+		}
+	}
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/Propel.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/PropelException.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/PropelException.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/PropelException.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,61 @@
+<?php
+/*
+ *  $Id: PropelException.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+/**
+ * The base class of all exceptions thrown by Propel.
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 64 $
+ * @package propel
+ */
+class PropelException extends Exception {
+    
+    /** The nested "cause" exception. */
+    protected $cause;
+    
+    function __construct($p1, $p2 = null) {
+        
+        $cause = null;
+        
+        if ($p2 !== null) {
+            $msg = $p1;
+            $cause = $p2;
+        } else {
+            if ($p1 instanceof Exception) {
+                $msg = "";
+                $cause = $p1;
+            } else {
+                $msg = $p1;
+            }        
+        }
+        
+        parent::__construct($msg);
+        
+        if ($cause !== null) {
+            $this->cause = $cause;
+            $this->message .= " [wrapped: " . $cause->getMessage() ."]";
+        }
+    }
+    
+    function getCause() {
+        return $this->cause;
+    }
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/PropelException.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBAdapter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBAdapter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBAdapter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,184 @@
+<?php
+
+/*
+ *  $Id: DBAdapter.php 325 2006-01-17 19:12:40Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+include_once 'creole/Connection.php';
+
+/**
+ * DBAdapter</code> defines the interface for a Propel database adapter.  
+ * 
+ * <p>Support for new databases is added by subclassing
+ * <code>DBAdapter</code> and implementing its abstract interface, and by
+ * registering the new database adapter and corresponding Creole
+ * driver in the private adapters map (array) in this class.</p>
+ *
+ * <p>The Propel database adapters exist to present a uniform
+ * interface to database access across all available databases.  Once
+ * the necessary adapters have been written and configured,
+ * transparent swapping of databases is theoretically supported with
+ * <i>zero code change</i> and minimal configuration file
+ * modifications.</p>
+ * 
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Jon S. Stevens <jon en latchkey.com> (Torque)
+ * @author Brett McLaughlin <bmclaugh en algx.net> (Torque)
+ * @author Daniel Rall <dlr en finemaltcoding.com> (Torque)
+ * @version $Revision: 325 $
+ * @package propel.adapter
+ */
+abstract class DBAdapter {
+    
+    /**
+     * Creole driver to Propel adapter map.
+     * @var array
+     */
+    private static $adapters = array(
+                                    'mysql' => 'DBMySQL',
+									'mysqli' => 'DBMySQLi',
+                                    'mssql' => 'DBMSSQL',
+                                    'sybase' => 'DBSyabase',
+                                    'oracle' => 'DBOracle',
+                                    'pgsql' => 'DBPostgres',
+                                    'sqlite' => 'DBSQLite',
+                                    '' => 'DBNone',
+                                );
+
+    /**
+     * Creates a new instance of the database adapter associated
+     * with the specified Creole driver.
+     *
+     * @param string $driver The name of the Propel/Creole driver to
+     * create a new adapter instance for or a shorter form adapter key.
+     * @return DBAdapter An instance of a Propel database adapter.
+     * @throws PropelException if the adapter could not be instantiated.
+     */
+    public static function factory($driver) {        
+        $adapterClass = isset(self::$adapters[$driver]) ? self::$adapters[$driver] : null;
+        if ($adapterClass !== null) {
+            require_once 'propel/adapter/'.$adapterClass.'.php';
+            $a = new $adapterClass();
+            return $a;
+        } else {
+            throw new PropelException("Unsupported Propel driver: " . $driver . ": Check your configuration file");
+        }
+    }
+
+    /**
+     * This method is used to ignore case.
+     *
+     * @param in The string to transform to upper case.
+     * @return string The upper case string.
+     */
+    public abstract function toUpperCase($in);
+
+    /**
+     * Returns the character used to indicate the beginning and end of
+     * a piece of text used in a SQL statement (generally a single
+     * quote).
+     *
+     * @return string The text delimeter.
+     */
+    public function getStringDelimiter()
+    {
+        return '\'';
+    }
+    
+    /**
+     * Locks the specified table.
+     *
+     * @param Connection $con The Creole connection to use.
+     * @param string $table The name of the table to lock.
+     * @return void
+     * @throws SQLException No Statement could be created or executed.
+     */
+    public abstract function lockTable(Connection $con, $table);
+
+    /**
+     * Unlocks the specified table.
+     *
+     * @param Connection $con The Creole connection to use.
+     * @param string $table The name of the table to unlock.
+     * @return void
+     * @throws SQLException No Statement could be created or executed.
+     */
+    public abstract function unlockTable(Connection $con, $table);
+
+    /**
+     * This method is used to ignore case.
+     *
+     * @param string $in The string whose case to ignore.
+     * @return string The string in a case that can be ignored.
+     */
+    public abstract function ignoreCase($in);
+
+    /**
+     * This method is used to ignore case in an ORDER BY clause.
+     * Usually it is the same as ignoreCase, but some databases
+     * (Interbase for example) does not use the same SQL in ORDER BY
+     * and other clauses.
+     *
+     * @param string $in The string whose case to ignore.
+     * @return string The string in a case that can be ignored.
+     */
+    public function ignoreCaseInOrderBy($in)
+    {
+        return $this->ignoreCase($in);
+    }      
+
+    /**
+     * Returns SQL which concatenates the second string to the first.
+     *
+     * @param string String to concatenate.
+     * @param string String to append.
+     * @return string 
+     */
+    public abstract function concatString($s1, $s2);
+
+    /**
+     * Returns SQL which extracts a substring.
+     *
+     * @param string String to extract from.
+     * @param int Offset to start from.
+     * @param int Number of characters to extract.
+     * @return string 
+     */
+    public abstract function subString($s, $pos, $len);
+
+    /**
+     * Returns SQL which calculates the length (in chars) of a string.
+     *
+     * @param string String to calculate length of.
+     * @return string 
+     */
+    public abstract function strLength($s);
+	
+	
+	/**
+	 * Quotes database objec identifiers (table names, col names, sequences, etc.).
+	 * @param string $text The identifier to quote.
+	 * @return string The quoted identifier.
+	 */
+	public function quoteIdentifier($text)
+	{
+		return '"' . $text . '"';
+	}
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBAdapter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBMSSQL.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBMSSQL.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBMSSQL.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ *  $Id: DBMSSQL.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/adapter/DBSybase.php';
+
+/**
+ * This is used to connect to a MSSQL database.  For now, this class
+ * simply extends the adaptor for Sybase.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Gonzalo Diethelm <gonzalo.diethelm en sonda.com> (Torque)
+ * @version $Revision: 64 $
+ * @package propel.adapter
+ */
+class DBMSSQL extends DBSybase {
+    // no difference currently
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBMSSQL.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBMySQL.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBMySQL.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBMySQL.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,133 @@
+<?php
+
+/*
+ *  $Id: DBMySQL.php 286 2005-11-25 17:12:29Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/adapter/DBAdapter.php';
+
+/**
+ * This is used in order to connect to a MySQL database.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Jon S. Stevens <jon en clearink.com> (Torque)
+ * @author Brett McLaughlin <bmclaugh en algx.net> (Torque)
+ * @author Daniel Rall <dlr en finemaltcoding.com> (Torque)
+ * @version $Revision: 286 $
+ * @package propel.adapter
+ */
+class DBMySQL extends DBAdapter {  
+
+    /**
+     * This method is used to ignore case.
+     *
+     * @param in The string to transform to upper case.
+     * @return The upper case string.
+     */
+    public function toUpperCase($in)
+    {
+        return "UPPER(" . $in . ")";
+    }
+
+    /**
+     * This method is used to ignore case.
+     *
+     * @param in The string whose case to ignore.
+     * @return The string in a case that can be ignored.
+     */
+    public function ignoreCase($in)
+    {
+        return "UPPER(" . $in . ")";
+    }   
+
+    /**
+     * Returns SQL which concatenates the second string to the first.
+     *
+     * @param string String to concatenate.
+     * @param string String to append.
+     * @return string 
+     */
+    public function concatString($s1, $s2)
+    {
+        return "CONCAT($s1, $s2)";
+    }
+
+    /**
+     * Returns SQL which extracts a substring.
+     *
+     * @param string String to extract from.
+     * @param int Offset to start from.
+     * @param int Number of characters to extract.
+     * @return string 
+     */
+    public function subString($s, $pos, $len)
+    {
+        return "SUBSTRING($s, $pos, $len)";
+    }
+
+    /**
+     * Returns SQL which calculates the length (in chars) of a string.
+     *
+     * @param string String to calculate length of.
+     * @return string 
+     */
+    public function strLength($s)
+    {
+        return "CHAR_LENGTH($s)";
+    }
+ 
+
+    /**
+     * Locks the specified table.
+     *
+     * @param Connection $con The Creole connection to use.
+     * @param string $table The name of the table to lock.
+     * @throws SQLException No Statement could be created or
+     * executed.
+     */
+    public function lockTable(Connection $con, $table)
+    {
+        $statement = $con->createStatement();
+        $sql = "LOCK TABLE " . $table . " WRITE";
+        $statement->executeUpdate($sql);
+    }
+
+    /**
+     * Unlocks the specified table.
+     *
+     * @param Connection $con The Creole connection to use.
+     * @param string $table The name of the table to unlock.
+     * @throws SQLException No Statement could be created or
+     * executed.
+     */
+    public function unlockTable(Connection $con, $table)
+    {
+        $statement = $con->createStatement();
+        $statement->executeUpdate("UNLOCK TABLES");
+    }
+	
+	/**
+	 * @see DBAdapter::quoteIdentifier()
+	 */
+	public function quoteIdentifier($text)
+	{
+		return '`' . $text . '`';
+	}
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBMySQL.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBMySQLi.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBMySQLi.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBMySQLi.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ *  $Id: DBMySQLi.php 497 2006-01-22 13:07:47Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/adapter/DBMySQL.php';
+
+/**
+ * This is used in order to connect to a MySQL database using the new mysqli API.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @version $Revision$
+ * @package propel.adapter
+ */
+class DBMySQLi extends DBMySQL {
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBMySQLi.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBNone.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBNone.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBNone.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,131 @@
+<?php
+
+/*
+ *  $Id: DBNone.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+require_once 'propel/adapter/DBAdapter.php';
+
+/**
+ * This DatabaseHandler is used when you do not have a database
+ * installed.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Jon S. Stevens <jon en clearink.com> (Torque)
+ * @author Brett McLaughlin <bmclaugh en algx.net> (Torque)
+ * @version $Revision: 64 $
+ * @package propel.adapter
+ */
+class DBNone extends DBAdapter {
+
+    /**
+     * @return null
+     */
+    public function getConnection()
+    {
+        return null;
+    }
+
+    /**
+     * @see DBAdapter::init()
+     */
+    public function init($url, $username, $password)
+    {
+    }
+
+    /**
+     * This method is used to ignore case.
+     *
+     * @param in The string to transform to upper case.
+     * @return The upper case string.
+     */
+    public function toUpperCase($in)
+    {
+        return $in;
+    }
+
+    /**
+     * This method is used to ignore case.
+     *
+     * @param in The string whose case to ignore.
+     * @return The string in a case that can be ignored.
+     */
+    public function ignoreCase($in)
+    {
+        return $in;
+    }    
+
+    /**
+     * Returns SQL which concatenates the second string to the first.
+     *
+     * @param string String to concatenate.
+     * @param string String to append.
+     * @return string 
+     */
+    public function concatString($s1, $s2)
+    {
+        return ($s1 . $s2);
+    }
+
+    /**
+     * Returns SQL which extracts a substring.
+     *
+     * @param string String to extract from.
+     * @param int Offset to start from.
+     * @param int Number of characters to extract.
+     * @return string 
+     */
+    public function subString($s, $pos, $len)
+    {
+        return substr($s, $pos, $len);
+    }
+
+    /**
+     * Returns SQL which calculates the length (in chars) of a string.
+     *
+     * @param string String to calculate length of.
+     * @return string 
+     */
+    public function strLength($s)
+    {
+        return strlen($s);
+    }
+ 
+    /**
+     * Locks the specified table.
+     *
+     * @param Connection $con The Creole connection to use.
+     * @param string $table The name of the table to lock.
+     * @throws SQLException No Statement could be created or executed.
+     */
+    public function lockTable(Connection $con, $table)
+    {
+    }
+
+    /**
+     * Unlocks the specified table.
+     *
+     * @param Connection $con The Creole connection to use.
+     * @param string $table The name of the table to unlock.
+     * @throws SQLException No Statement could be created or executed.
+     */
+    public function unlockTable(Connection $con, $table)
+    {
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBNone.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBOracle.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBOracle.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBOracle.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,123 @@
+<?php
+
+/*
+ *  $Id: DBOracle.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+require_once 'propel/adapter/DBAdapter.php';
+
+/**
+ * Oracle adapter.
+ * 
+ * @author David Giffin <david en giffin.org> (Propel)
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Jon S. Stevens <jon en clearink.com> (Torque)
+ * @author Brett McLaughlin <bmclaugh en algx.net> (Torque)
+ * @author Bill Schneider <bschneider en vecna.com> (Torque)
+ * @author Daniel Rall <dlr en finemaltcoding.com> (Torque)
+ * @version $Revision: 64 $
+ * @package propel.adapter
+ */
+class DBOracle extends DBAdapter {
+
+    /**
+     * This method is used to ignore case.
+     *
+     * @param string $in The string to transform to upper case.
+     * @return string The upper case string.
+     */
+    public function toUpperCase($in)
+    {
+        return "UPPER(" . $in . ")";
+    }
+
+    /**
+     * This method is used to ignore case.
+     *
+     * @param string $in The string whose case to ignore.
+     * @return string The string in a case that can be ignored.
+     */
+    public function ignoreCase($in)
+    {
+        return "UPPER(" . $in . ")";
+    }
+
+    /**
+     * Returns SQL which concatenates the second string to the first.
+     *
+     * @param string String to concatenate.
+     * @param string String to append.
+     * @return string 
+     */
+    public function concatString($s1, $s2)
+    {
+        return "CONCAT($s1, $s2)";
+    }
+
+    /**
+     * Returns SQL which extracts a substring.
+     *
+     * @param string String to extract from.
+     * @param int Offset to start from.
+     * @param int Number of characters to extract.
+     * @return string 
+     */
+    public function subString($s, $pos, $len)
+    {
+        return "SUBSTR($s, $pos, $len)";
+    }
+
+    /**
+     * Returns SQL which calculates the length (in chars) of a string.
+     *
+     * @param string String to calculate length of.
+     * @return string 
+     */
+    public function strLength($s)
+    {
+        return "LENGTH($s)";
+    }
+     
+    /**
+     * Locks the specified table.
+     *
+     * @param Connection $con The Creole connection to use.
+     * @param string $table The name of the table to lock.
+     * @throws SQLException No Statement could be created or executed.
+     */
+    public function lockTable(Connection $con, $table)
+    {
+        $statement = $con->createStatement();
+        $statement->executeQuery("SELECT next_id FROM " . $table ." FOR UPDATE");
+    }
+
+    /**
+     * Unlocks the specified table.
+     *
+     * @param Connection $con The Creole connection to use.
+     * @param string $table The name of the table to unlock.
+     * @throws SQLException - No Statement could be created or executed.
+     */
+    public function unlockTable(Connection $con, $table)
+    {
+        // Tables in Oracle are unlocked when a commit is issued.  The
+        // user may have issued a commit but do it here to be sure.
+        $con->commit();
+    }    
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBOracle.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBPostgres.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBPostgres.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBPostgres.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,117 @@
+<?php
+
+/*
+ *  $Id: DBPostgres.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+require_once 'propel/adapter/DBAdapter.php';
+
+/**
+ * This is used to connect to PostgresQL databases.
+ *
+ * <a href="http://www.pgsql.org">http://www.pgsql.org</a>
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Hakan Tandogan <hakan42 en gmx.de> (Torque)
+ * @version $Revision: 64 $
+ * @package propel.adapter
+ */
+class DBPostgres extends DBAdapter {
+
+    /**
+     * This method is used to ignore case.
+     *
+     * @param string $in The string to transform to upper case.
+     * @return string The upper case string.
+     */
+    public function toUpperCase($in)
+    {
+        return "UPPER(" . $in . ")";
+    }
+
+    /**
+     * This method is used to ignore case.
+     *
+     * @param in The string whose case to ignore.
+     * @return The string in a case that can be ignored.
+     */
+    public function ignoreCase($in)
+    {
+        return "UPPER(" . $in . ")";
+    }
+
+    /**
+     * Returns SQL which concatenates the second string to the first.
+     *
+     * @param string String to concatenate.
+     * @param string String to append.
+     * @return string 
+     */
+    public function concatString($s1, $s2)
+    {
+        return "($s1 || $s2)";
+    }
+
+    /**
+     * Returns SQL which extracts a substring.
+     *
+     * @param string String to extract from.
+     * @param int Offset to start from.
+     * @param int Number of characters to extract.
+     * @return string 
+     */
+    public function subString($s, $pos, $len)
+    {
+        return "substring($s from $pos" . ($len > -1 ? "for $len" : "") . ")";
+    }
+
+    /**
+     * Returns SQL which calculates the length (in chars) of a string.
+     *
+     * @param string String to calculate length of.
+     * @return string 
+     */
+    public function strLength($s)
+    {
+        return "char_length($s)";
+    }
+     
+    /**
+     * Locks the specified table.
+     *
+     * @param Connection $con The Creole connection to use.
+     * @param string $table The name of the table to lock.
+     * @exception SQLException No Statement could be created or executed.
+     */
+    public function lockTable(Connection $con, $table)
+    {
+    }
+
+    /**
+     * Unlocks the specified table.
+     *
+     * @param Connection $con The Creole connection to use.
+     * @param string $table The name of the table to unlock.
+     * @exception SQLException No Statement could be created or executed.
+     */
+    public function unlockTable(Connection $con, $table)
+    {
+    }
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBPostgres.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBSQLite.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBSQLite.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBSQLite.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,124 @@
+<?php
+
+/*
+ *  $Id: DBSQLite.php 286 2005-11-25 17:12:29Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/adapter/DBAdapter.php';
+
+/**
+ * This is used in order to connect to a SQLite database.
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 286 $
+ * @package propel.adapter
+ */
+class DBSQLite extends DBAdapter {
+
+    /**
+     * This method is used to ignore case.
+     *
+     * @param in The string to transform to upper case.
+     * @return The upper case string.
+     */
+    public function toUpperCase($in)
+    {
+        return 'UPPER(' . $in . ')';
+    }
+
+    /**
+     * This method is used to ignore case.
+     *
+     * @param in The string whose case to ignore.
+     * @return The string in a case that can be ignored.
+     */
+    public function ignoreCase($in)
+    {
+        return 'UPPER(' . $in . ')';
+    }
+		
+    /**
+     * Returns SQL which concatenates the second string to the first.
+     *
+     * @param string String to concatenate.
+     * @param string String to append.
+     * @return string 
+     */
+    public function concatString($s1, $s2)
+    {
+        return "($s1 || $s2)";
+    }
+
+    /**
+     * Returns SQL which extracts a substring.
+     *
+     * @param string String to extract from.
+     * @param int Offset to start from.
+     * @param int Number of characters to extract.
+     * @return string 
+     */
+    public function subString($s, $pos, $len)
+    {
+        return "substr($s, $pos, $len)";
+    }
+
+    /**
+     * Returns SQL which calculates the length (in chars) of a string.
+     *
+     * @param string String to calculate length of.
+     * @return string 
+     */
+    public function strLength($s)
+    {
+        return "length($s)";
+    }
+ 
+    /**
+     * Locks the specified table.
+     *
+     * @param Connection $con The Creole connection to use.
+     * @param string $table The name of the table to lock.
+     * @throws SQLException No Statement could be created or
+     * executed.
+     */
+    public function lockTable(Connection $con, $table)
+    {        
+    }
+
+    /**
+     * Unlocks the specified table.
+     *
+     * @param Connection $con The Creole connection to use.
+     * @param string $table The name of the table to unlock.
+     * @throws SQLException No Statement could be created or
+     * executed.
+     */
+    public function unlockTable(Connection $con, $table)
+    {        
+    }
+	
+	/**
+	 * @see DBAdapter::quoteIdentifier()
+	 */
+	public function quoteIdentifier($text)
+	{
+		return '[' . $text . ']';
+	}
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBSQLite.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBSybase.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBSybase.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBSybase.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,133 @@
+<?php
+
+/*
+ *  $Id: DBSybase.php 286 2005-11-25 17:12:29Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/adapter/DBAdapter.php';
+
+/**
+ * This is used to connect to a Sybase database using Sybase's
+ * Creole driver.
+ *
+ * <B>NOTE:</B><I>Currently JConnect does not implement the required
+ * methods for ResultSetMetaData, and therefore the village API's may
+ * not function.  For connection pooling, everything works.</I>
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Jeff Brekke <ekkerbj en netscape.net> (Torque)
+ * @version $Revision: 286 $
+ * @package propel.adapter
+ */
+class DBSybase extends DBAdapter {
+
+    /**
+     * This method is used to ignore case.
+     *
+     * @param in The string to transform to upper case.
+     * @return The upper case string.
+     */
+    public function toUpperCase($in)
+    {
+        return "UPPER(" . $in . ")";
+    }
+
+    /**
+     * This method is used to ignore case.
+     *
+     * @param in The string whose case to ignore.
+     * @return The string in a case that can be ignored.
+     */
+    public function ignoreCase($in)
+    {
+        return "UPPER(" . $in . ")";
+    }
+
+    /**
+     * Returns SQL which concatenates the second string to the first.
+     *
+     * @param string String to concatenate.
+     * @param string String to append.
+     * @return string 
+     */
+    public function concatString($s1, $s2)
+    {
+        return "($s1 + $s2)";
+    }
+
+    /**
+     * Returns SQL which extracts a substring.
+     *
+     * @param string String to extract from.
+     * @param int Offset to start from.
+     * @param int Number of characters to extract.
+     * @return string 
+     */
+    public function subString($s, $pos, $len)
+    {
+        return "SUBSTRING($s, $pos, $len)";
+    }
+
+    /**
+     * Returns SQL which calculates the length (in chars) of a string.
+     *
+     * @param string String to calculate length of.
+     * @return string 
+     */
+    public function strLength($s)
+    {
+        return "LEN($s)";
+    }
+     
+    /**
+     * Locks the specified table.
+     *
+     * @param Connection $con The Creole connection to use.
+     * @param string $table The name of the table to lock.
+     * @throws SQLException No Statement could be created or executed.
+     */
+    public function lockTable(Connection $con, $table)
+    {
+        $statement = $con->createStatement();
+        $sql = "SELECT next_id FROM " . $table . " FOR UPDATE";
+        $statement->executeQuery($sql);
+    }
+
+    /**
+     * Unlocks the specified table.
+     *
+     * @param Connection $con The Creole connection to use.
+     * @param string $table The name of the table to unlock.
+     * @throws SQLException No Statement could be created or executed.
+     */
+    public function unlockTable(Connection $con, $table)
+    {
+        // Tables in Sybase are unlocked when a commit is issued.  The
+        // user may have issued a commit but do it here to be sure.
+        $con->commit();
+    }
+	
+	/**
+	 * @see DBAdapter::quoteIdentifier()
+	 */
+	public function quoteIdentifier($text)
+	{
+		return '[' . $text . ']';
+	}
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/adapter/DBSybase.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/logger/BasicLogger.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/logger/BasicLogger.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/logger/BasicLogger.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,103 @@
+<?php
+
+/*
+ *  $Id: BasicLogger.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+ 
+/**
+ * This is a minimalistic interface that any logging class must implement for Propel.
+ * 
+ * The API for this interface is based on the PEAR::Log interface.  It provides a simple
+ * API that can be used by Propel independently of Log backend.
+ * 
+ * PEAR::Log and perhaps the Log API was developed by Chuck Hagenbuch <chuck en horde.org> 
+ * and Jon Parise <jon en php.net>.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 64 $
+ * @package propel.logger
+ */
+interface BasicLogger {
+
+    /**
+     * A convenience function for logging an alert event.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     */
+    public function alert($message);
+
+    /**
+     * A convenience function for logging a critical event.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     */
+    public function crit($message);
+   
+    /**
+     * A convenience function for logging an error event.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     */
+    public function err($message);
+
+    /**
+     * A convenience function for logging a warning event.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     */
+    public function warning($message);
+    /**
+     * A convenience function for logging an critical event.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     */
+    public function notice($message);
+    /**
+     * A convenience function for logging an critical event.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     */
+    public function info($message);
+    
+    /**
+     * A convenience function for logging a debug event.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     */
+    public function debug($message);
+    
+    /**
+     * Primary method to handle logging.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     * @param   int     $severity   The numeric severity.  Defaults to null so that no
+     *                              assumptions are made about the logging backend.
+     */
+    public function log($message, $severity = null);
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/logger/BasicLogger.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/logger/MojaviLogAdapter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/logger/MojaviLogAdapter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/logger/MojaviLogAdapter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,176 @@
+<?php
+/*
+ *  $Id: MojaviLogAdapter.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+// include BasicLogger from include path
+require_once('propel/logger/BasicLogger.php');
+ 
+/**
+ * Mojavi logging adapter for propel
+ * 
+ * @author Brandon Keepers <brandon en opensoul.org>
+ * @version $Revision: 64 $
+ * @package propel.logger
+ */
+class MojaviLogAdapter implements BasicLogger {
+    
+    /**
+     * Instance of mojavi logger
+     */
+    private $logger = null;
+
+    /**
+     * constructor for setting up Mojavi log adapter
+     *
+     * @param   ErrorLog   $logger   instance of Mojavi error log obtained by
+     *                               calling LogManager::getLogger();
+     */
+    public function __construct($logger = null)
+    {
+        $this->logger = $logger;
+    }
+
+    /**
+     * A convenience function for logging an alert event.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     */
+    public function alert($message)
+    {
+        $this->log($message, 'alert');
+    }
+
+    /**
+     * A convenience function for logging a critical event.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     */
+    public function crit($message)
+    {
+        $this->log($message, 'crit');
+    }
+   
+    /**
+     * A convenience function for logging an error event.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     */
+    public function err($message)
+    {
+        $this->log($message, 'err');
+    }
+
+    /**
+     * A convenience function for logging a warning event.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     */
+    public function warning($message)
+    {
+        $this->log($message, 'warning');
+    }
+    
+    
+    /**
+     * A convenience function for logging an critical event.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     */
+    public function notice($message)
+    {
+        $this->log($message, 'notice');
+    }
+    /**
+     * A convenience function for logging an critical event.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     */
+    public function info($message)
+    {
+        $this->log($message, 'info');
+    }
+    
+    /**
+     * A convenience function for logging a debug event.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     */
+    public function debug($message)
+    {
+        $this->log($message, 'debug');
+    }
+    
+    /**
+     * Primary method to handle logging.
+     *
+     * @param   mixed   $message    String or Exception object containing the message
+     *                              to log.
+     * @param   int     $severity   The numeric severity.  Defaults to null so that no
+     *                              assumptions are made about the logging backend.
+     */
+    public function log($message, $severity = null)
+    {
+        if(is_null($this->logger))
+            $this->logger = LogManager::getLogger('propel');
+        
+        switch($severity)
+        {
+            case 'crit':
+                $method = 'fatal';
+                break;
+            case 'err':
+                $method = 'error';
+                break;
+            case 'alert':
+            case 'warning':
+                $method = 'warning';
+                break;
+            case 'notice':
+            case 'info':
+                $method = 'info';
+                break;
+            case 'debug':
+            default:
+                $method = 'debug';
+        }
+        
+        // get a backtrace to pass class, function, file, & line to Mojavi logger
+        $trace = debug_backtrace();
+
+        // call the appropriate Mojavi logger method
+        $this->logger->{$method} (
+            $message,
+            $trace[2]['class'],
+            $trace[2]['function'],
+            $trace[1]['file'],
+            $trace[1]['line']
+            );
+    }
+}
+
+
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/logger/MojaviLogAdapter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/ColumnMap.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/ColumnMap.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/ColumnMap.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,344 @@
+<?php
+
+/*
+ *  $Id: ColumnMap.php 272 2005-11-08 15:02:48Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+include_once 'propel/map/ValidatorMap.php';
+
+/**
+ * ColumnMap is used to model a column of a table in a database.
+ * 
+ * GENERAL NOTE
+ * ------------
+ * The propel.map classes are abstract building-block classes for modeling
+ * the database at runtime.  These classes are similar (a lite version) to the
+ * propel.engine.database.model classes, which are build-time modeling classes.
+ * These classes in themselves do not do any database metadata lookups, but instead 
+ * are used by the MapBuilder classes that were generated for your datamodel. The 
+ * MapBuilder that was created for your datamodel build a representation of your
+ * database by creating instances of the DatabaseMap, TableMap, ColumnMap, etc. 
+ * classes. See propel/templates/om/php5/MapBuilder.tpl and the classes generated
+ * by that template for your datamodel to further understand how these are put 
+ * together.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author John D. McNally <jmcnally en collab.net> (Torque)
+ * @version $Revision: 272 $
+ * @package propel.map
+ */
+class ColumnMap {
+
+    /** @var int Creole type for this column. */
+    private $creoleType;
+    
+    /** @var string Native PHP type of the column. */
+    private $type = null;
+
+    /** Size of the column. */
+    private $size = 0;
+
+    /** Is it a primary key? */
+    private $pk = false;
+
+    /** Is null value allowed ?*/
+    private $notNull = false;
+
+    /** Name of the table that this column is related to. */
+    private $relatedTableName = "";
+
+    /** Name of the column that this column is related to. */
+    private $relatedColumnName = "";
+
+    /** The TableMap for this column. */
+    private $table;
+
+    /** The name of the column. */
+    private $columnName;
+
+    /** The php name of the column. */
+    private $phpName;
+
+    /** validators for this column */
+    private $validators = array();
+	
+    /**
+     * Constructor.
+     *
+     * @param string $name The name of the column.
+     * @param TableMap containingTable TableMap of the table this column is in.
+     */
+    public function __construct($name, TableMap $containingTable)
+    {
+        $this->columnName = $name;
+        $this->table = $containingTable;
+    }
+
+    /**
+     * Get the name of a column.
+     *
+     * @return string A String with the column name.
+     */
+    public function getColumnName()
+    {
+        return $this->columnName;
+    }
+
+    /**
+     * Set the php anme of this column.
+     *
+     * @param string $phpName A string representing the PHP name.
+     * @return void
+     */
+    public function setPhpName($phpName)
+    {
+        $this->phpName = $phpName;
+    }
+
+    /**
+     * Get the name of a column.
+     *
+     * @return string A String with the column name.
+     */
+    public function getPhpName()
+    {
+        return $this->phpName;
+    }
+
+    /**
+     * Get the table name + column name.
+     *
+     * @return string A String with the full column name.
+     */
+    public function getFullyQualifiedName()
+    {
+        return $this->table->getName() . "." . $this->columnName;
+    }
+
+    /**
+     * Get the table map this column belongs to.
+     * @return TableMap
+     */
+    public function getTable()
+    {
+        return $this->table;
+    }
+
+    /**
+     * Get the name of the table this column is in.
+     *
+     * @return string A String with the table name.
+     */
+    public function getTableName()
+    {
+        return $this->table->getName();
+    }
+
+    /**
+     * Set the type of this column.
+     *
+     * @param string $type A string representing the PHP native type.
+     * @return void
+     */
+    public function setType($type)
+    {
+        $this->type = $type;
+    }
+
+     /**
+     * Set the Creole type of this column.
+     *
+     * @param int $type An int representing Creole type for this column.
+     * @return void
+     */
+    public function setCreoleType($type)
+    {
+        $this->creoleType = $type;
+    }
+    
+    /**
+     * Set the size of this column.
+     *
+     * @param int $size An int specifying the size.
+     * @return void
+     */
+    public function setSize($size)
+    {
+        $this->size = $size;
+    }
+
+    /**
+     * Set if this column is a primary key or not.
+     *
+     * @param boolean $pk True if column is a primary key.
+     * @return void
+     */
+    public function setPrimaryKey($pk)
+    {
+        $this->pk = $pk;
+    }
+
+    /**
+     * Set if this column may be null.
+     *
+     * @param boolean nn True if column may be null.
+     * @return void
+     */
+    public function setNotNull($nn)
+    {
+        $this->notNull = $nn;
+    }
+	
+	/**
+	 * Gets the default value for this column.
+	 * @return mixed String or NULL
+	 */
+	public function getDefaultValue()
+	{
+		return $this->defaultValue;
+	}
+	
+    /**
+     * Set the foreign key for this column.
+     *
+     * @param string tableName The name of the table that is foreign.
+     * @param string columnName The name of the column that is foreign.
+     * @return void
+     */
+    public function setForeignKey($tableName, $columnName)
+    {
+        if ($tableName && $columnName) {
+            $this->relatedTableName = $tableName;
+            $this->relatedColumnName = $columnName;
+        } else {
+            $this->relatedTableName = "";
+            $this->relatedColumnName = "";
+        }
+    }
+
+    public function addValidator($validator)
+    {
+      $this->validators[] = $validator;
+    }
+
+    public function hasValidators()
+    {
+      return count($this->validators) > 0;
+    }
+
+    public function getValidators()
+    {
+      return $this->validators;
+    }
+
+    
+    /**
+     * Get the native PHP type of this column.
+     *
+     * @return string A string specifying the native PHP type.
+     */
+    public function getType()
+    {
+        return $this->type;
+    }
+
+    /**
+     * Get the Creole type of this column.
+     *
+     * @return string A string specifying the native PHP type.
+     */
+    public function getCreoleType()
+    {
+        return $this->creoleType;
+    }
+
+    /**
+     * Get the size of this column.
+     *
+     * @return int An int specifying the size.
+     */
+    public function getSize()
+    {
+        return $this->size;
+    }
+
+    /**
+     * Is this column a primary key?
+     *
+     * @return boolean True if column is a primary key.
+     */
+    public function isPrimaryKey()
+    {
+        return $this->pk;
+    }
+
+    /**
+     * Is null value allowed ?
+     *
+     * @return boolean True if column may be null.
+     */
+    public function isNotNull()
+    {
+        return ($this->notNull || $this->isPrimaryKey());
+    }
+
+    /**
+     * Is this column a foreign key?
+     *
+     * @return boolean True if column is a foreign key.
+     */
+    public function isForeignKey()
+    {
+        if ($this->relatedTableName) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Get the table.column that this column is related to.
+     *
+     * @return string A String with the full name for the related column.
+     */
+    public function getRelatedName()
+    {
+        return $this->relatedTableName . "." . $this->relatedColumnName;
+    }
+
+    /**
+     * Get the table name that this column is related to.
+     *
+     * @return string A String with the name for the related table.
+     */
+    public function getRelatedTableName()
+    {
+        return $this->relatedTableName;
+    }
+
+    /**
+     * Get the column name that this column is related to.
+     *
+     * @return string A String with the name for the related column.
+     */
+    public function getRelatedColumnName()
+    {
+        return $this->relatedColumnName;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/ColumnMap.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/DatabaseMap.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/DatabaseMap.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/DatabaseMap.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,127 @@
+<?php
+
+/*
+ *  $Id: DatabaseMap.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+include_once 'propel/map/TableMap.php';
+
+/**
+ * DatabaseMap is used to model a database.
+ *
+ * GENERAL NOTE
+ * ------------
+ * The propel.map classes are abstract building-block classes for modeling
+ * the database at runtime.  These classes are similar (a lite version) to the
+ * propel.engine.database.model classes, which are build-time modeling classes.
+ * These classes in themselves do not do any database metadata lookups, but instead 
+ * are used by the MapBuilder classes that were generated for your datamodel. The 
+ * MapBuilder that was created for your datamodel build a representation of your
+ * database by creating instances of the DatabaseMap, TableMap, ColumnMap, etc. 
+ * classes. See propel/templates/om/php5/MapBuilder.tpl and the classes generated
+ * by that template for your datamodel to further understand how these are put 
+ * together.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author John D. McNally <jmcnally en collab.net> (Torque)
+ * @author Daniel Rall <dlr en collab.net> (Torque)
+ * @version $Revision: 64 $
+ * @package propel.map
+ */
+class DatabaseMap {
+
+    /** Name of the database. */
+    private $name;
+
+    /** Name of the tables in the database. */
+    private $tables;
+
+    /**
+     * Constructor.
+     *
+     * @param string $name Name of the database.
+     */
+    function __construct($name)
+    {
+        $this->name = $name;
+        $this->tables = array();
+    }
+
+    /**
+     * Does this database contain this specific table?
+     *
+     * @param string $name The String representation of the table.
+     * @return boolean True if the database contains the table.
+     */
+    public function containsTable($name)
+    {
+        if ( strpos($name, '.') > 0) {
+            $name = substr($name, 0, strpos($name, '.'));
+        }
+        return isset($this->tables[$name]);
+    }
+
+    /**
+     * Get the name of this database.
+     *
+     * @return string The name of the database.
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Get a TableMap for the table by name.
+     *
+     * @param string $name Name of the table.
+     * @return TableMap A TableMap
+     * @throws PropelException if the table is undefined
+     */
+    public function getTable($name)
+    {
+        if (!isset($this->tables[$name])) {
+            throw new PropelException("Cannot fetch TableMap for undefined table: " . $name);
+        }
+        return $this->tables[$name];
+    }
+
+    /**
+     * Get a TableMap[] of all of the tables in the database.
+     *
+     * @return array A TableMap[].
+     */
+    public function getTables()
+    {
+        return $this->tables;
+    }
+
+    /**
+     * Add a new table to the database by name.  It creates an empty
+     * TableMap that you need to populate.
+     *
+     * @param string $tableName The name of the table.
+   * @return TableMap The newly created TableMap.
+     */
+    public function addTable($tableName)
+    {
+        $this->tables[$tableName] = new TableMap($tableName, $this);
+    return $this->tables[$tableName];
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/DatabaseMap.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/MapBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/MapBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/MapBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ *  $Id: MapBuilder.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+/**
+ * MapBuilders are classes that construct a model of a database at runtime.
+ * 
+ * MapBuilders support a single database, so this class essentially serves as 
+ * a wrapper around the DatabaseMap class.  This interface can be used for any
+ * class that needs to construct a runtime database model; by default in Propel
+ * the MapBuilder.tpl generates a class for your datamodel that implements this 
+ * interface and re-creates your database using the DatabaseMap, TableMap, 
+ * ColumnMap, and ValidatorMap classes.
+ * 
+ * GENERAL NOTE
+ * ------------
+ * The propel.map classes are abstract building-block classes for modeling
+ * the database at runtime.  These classes are similar (a lite version) to the
+ * propel.engine.database.model classes, which are build-time modeling classes.
+ * These classes in themselves do not do any database metadata lookups, but instead 
+ * are used by the MapBuilder classes that were generated for your datamodel. The 
+ * MapBuilder that was created for your datamodel build a representation of your
+ * database by creating instances of the DatabaseMap, TableMap, ColumnMap, etc. 
+ * classes. See propel/templates/om/php5/MapBuilder.tpl and the classes generated
+ * by that template for your datamodel to further understand how these are put 
+ * together.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author John D. McNally <jmcnally en collab.net> (Torque)
+ * @author Hans Lellelid <hans en xmpl.org> (Torque)
+ * @version $Revision: 64 $
+ * @package propel.map
+ */
+interface MapBuilder {
+
+    /**
+     * Build up the database mapping.
+     * @return void
+     * @throws Exception Couldn't build mapping.
+     */
+    function doBuild();
+
+    /**
+     * Tells us if the database mapping is built so that we can avoid
+     * re-building it repeatedly.
+     *
+     * @return boolean Whether the DatabaseMap is built.
+     */
+    function isBuilt();
+
+    /**
+     * Gets the database mapping this map builder built.
+     *
+     * @return DatabaseMap A DatabaseMap.
+     */
+    function getDatabaseMap();
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/MapBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/TableMap.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/TableMap.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/TableMap.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,429 @@
+<?php
+/*
+ *  $Id: TableMap.php 273 2005-11-08 15:25:43Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+include_once 'propel/map/ColumnMap.php';
+include_once 'propel/map/ValidatorMap.php';
+
+/**
+ * TableMap is used to model a table in a database.
+ *
+ * GENERAL NOTE
+ * ------------
+ * The propel.map classes are abstract building-block classes for modeling
+ * the database at runtime.  These classes are similar (a lite version) to the
+ * propel.engine.database.model classes, which are build-time modeling classes.
+ * These classes in themselves do not do any database metadata lookups, but instead 
+ * are used by the MapBuilder classes that were generated for your datamodel. The 
+ * MapBuilder that was created for your datamodel build a representation of your
+ * database by creating instances of the DatabaseMap, TableMap, ColumnMap, etc. 
+ * classes. See propel/templates/om/php5/MapBuilder.tpl and the classes generated
+ * by that template for your datamodel to further understand how these are put 
+ * together.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author John D. McNally <jmcnally en collab.net> (Torque)
+ * @author Daniel Rall <dlr en finemaltcoding.com> (Torque)
+ * @version $Revision: 273 $
+ * @package propel.map
+ */
+class TableMap {
+
+    /** The columns in the table. */
+    private $columns;
+
+    /** The database this table belongs to. */
+    private $dbMap;
+
+    /** The name of the table. */
+    private $tableName;
+
+    /** The PHP name of the table. */
+    private $phpName;
+
+    /** The prefix on the table name. */
+    private $prefix;
+
+    /** Whether to use an id generator for pkey. */
+    private $useIdGenerator;
+
+    /**
+     * Object to store information that is needed if the
+     * for generating primary keys.
+     */
+    private $pkInfo;
+
+    /**
+     * Construct a new TableMap.
+     *
+     * @param string $tableName The name of the table.
+     * @param DatabaseMap $containingDB A DatabaseMap that this table belongs to.
+     */
+    public function __construct($tableName, DatabaseMap $containingDB)
+    {
+        $this->tableName = $tableName;
+        $this->dbMap = $containingDB;
+        $this->columns = array();
+    }
+    
+    /**
+     * Normalizes the column name, removing table prefix and uppercasing.
+     * @param string $name
+     * @return string Normalized column name.
+     */
+    private function normalizeColName($name) {
+        if (false !== ($pos = strpos($name, '.'))) {
+            $name = substr($name, $pos + 1);
+        }
+        $name = strtoupper($name);
+        return $name;
+    }
+    
+    /**
+     * Does this table contain the specified column?
+     *
+     * @param string $name name of the column
+     * @return boolean True if the table contains the column.
+     */
+    public function containsColumn($name)
+    {
+        if (!is_string($name)) {
+            $name = $name->getColumnName();
+        }        
+        return isset($this->columns[$this->normalizeColName($name)]);
+    }
+
+    /**
+     * Get the DatabaseMap containing this TableMap.
+     *
+     * @return DatabaseMap A DatabaseMap.
+     */
+    public function getDatabaseMap()
+    {
+        return $this->dbMap;
+    }
+
+    /**
+     * Get the name of the Table.
+     *
+     * @return string A String with the name of the table.
+     */
+    public function getName()
+    {
+        return $this->tableName;
+    }
+
+    /**
+     * Get the PHP name of the Table.
+     *
+     * @return string A String with the name of the table.
+     */
+    public function getPhpName()
+    {
+        return $this->phpName;
+    }
+
+    /**
+     * Set the PHP name of the Table.
+     *
+     * @param string $phpName The PHP Name for this table
+     */
+    public function setPhpName($phpName)
+    {
+        $this->phpName = $phpName;
+    }
+
+    /**
+     * Get table prefix name.
+     *
+     * @return string A String with the prefix.
+     */
+    public function getPrefix()
+    {
+        return $this->prefix;
+    }
+
+    /**
+     * Set table prefix name.
+     *
+     * @param string $prefix The prefix for the table name (ie: SCARAB for
+     * SCARAB_PROJECT).
+     * @return void
+     */
+    public function setPrefix($prefix)
+    {
+        $this->prefix = $prefix;
+    }
+
+    /**
+     * Whether to use Id generator for primary key.
+     * @return boolean
+     */
+    public function isUseIdGenerator() {
+        return $this->useIdGenerator;
+    }
+
+    /**
+     * Get the information used to generate a primary key
+     *
+     * @return An Object.
+     */
+    public function getPrimaryKeyMethodInfo()
+    {
+        return $this->pkInfo;
+    }
+
+    /**
+     * Get a ColumnMap[] of the columns in this table.
+     *
+     * @return array A ColumnMap[].
+     */
+    public function getColumns()
+    {
+        return $this->columns;
+    }
+
+    /**
+     * Get a ColumnMap for the named table.
+     *
+     * @param string $name A String with the name of the table.
+     * @return ColumnMap A ColumnMap.
+     * @throws PropelException if the column is undefined
+     */
+    public function getColumn($name)
+    {
+        $name = $this->normalizeColName($name);
+        if (!isset($this->columns[$name])) {
+            throw new PropelException("Cannot fetch ColumnMap for undefined column: " . $name);
+        }
+        return $this->columns[$name];
+    }
+
+    /**
+     * Add a primary key column to this Table.
+     *
+     * @param string $columnName A String with the column name.
+     * @param string $type A string specifying the PHP native type.
+     * @param int $creoleType The integer representing the Creole type.
+     * @param boolean $isNotNull Whether column does not allow NULL values.
+     * @param $size An int specifying the size.
+     * @return ColumnMap Newly added PrimaryKey column.
+     */
+    public function addPrimaryKey($columnName, $phpName, $type, $creoleType, $isNotNull = false, $size = null)
+    {
+        return $this->addColumn($columnName, $phpName, $type, $creoleType, $isNotNull, $size, true, null, null);
+    }
+
+    /**
+     * Add a foreign key column to the table.
+     *
+     * @param string $columnName A String with the column name.
+     * @param string $type A string specifying the PHP native type.
+     * @param int $creoleType The integer representing the Creole type.
+     * @param string $fkTable A String with the foreign key table name.
+     * @param string $fkColumn A String with the foreign key column name.
+     * @param boolean $isNotNull Whether column does not allow NULL values.
+     * @param int $size An int specifying the size.
+	 * @param string $defaultValue The default value for this column.
+     * @return ColumnMap Newly added ForeignKey column.
+     */
+    public function addForeignKey($columnName, $phpName, $type, $creoleType, $fkTable, $fkColumn, $isNotNull = false, $size = 0)
+    {
+        return $this->addColumn($columnName, $phpName, $type, $creoleType, $isNotNull, $size, false, $fkTable, $fkColumn);
+    }
+
+    /**
+     * Add a foreign primary key column to the table.
+     *
+     * @param string $columnName A String with the column name.
+     * @param string $type A string specifying the PHP native type.
+     * @param int $creoleType The integer representing the Creole type.
+     * @param string $fkTable A String with the foreign key table name.
+     * @param string $fkColumn A String with the foreign key column name.
+     * @param boolean $isNotNull Whether column does not allow NULL values.
+     * @param int $size An int specifying the size.
+	 * @param string $defaultValue The default value for this column.
+     * @return ColumnMap Newly created foreign pkey column.
+     */
+    public function addForeignPrimaryKey($columnName, $phpName, $type, $creoleType, $fkTable, $fkColumn, $isNotNull = false, $size = 0)
+    {
+        return $this->addColumn($columnName, $phpName, $type, $creoleType, $isNotNull, $size, true, $fkTable, $fkColumn);
+    }
+
+    /**
+     * Add a pre-created column to this table.  It will replace any
+     * existing column.
+     *
+     * @param ColumnMap $cmap A ColumnMap.
+     * @return ColumnMap The added column map.
+     */
+    public function addConfiguredColumn($cmap)
+    {
+        $this->columns[ $cmap->getColumnName() ] = $cmap;
+        return $cmap;
+    }
+
+    /**
+     * Add a column to the table.
+     *
+     * @param string name A String with the column name.
+     * @param string $type A string specifying the PHP native type.
+     * @param int $creoleType The integer representing the Creole type.
+     * @param boolean $isNotNull Whether column does not allow NULL values.
+     * @param int $size An int specifying the size.
+     * @param boolean $pk True if column is a primary key.
+     * @param string $fkTable A String with the foreign key table name.
+     * @param $fkColumn A String with the foreign key column name.
+	 * @param string $defaultValue The default value for this column.
+     * @return ColumnMap The newly created column.
+     */
+    public function addColumn($name, $phpName, $type, $creoleType, $isNotNull = false, $size = null, $pk = null, $fkTable = null, $fkColumn = null)
+    {
+
+        $col = new ColumnMap($name, $this);
+
+        if ($fkTable && $fkColumn) {
+            if (substr($fkColumn, '.') > 0 && substr($fkColumn, $fkTable) !== false) {
+                $fkColumn = substr($fkColumn, strlen($fkTable) + 1);
+            }
+            $col->setForeignKey($fkTable, $fkColumn);
+        }
+
+        $col->setType($type);
+        $col->setCreoleType($creoleType);
+        $col->setPrimaryKey($pk);
+        $col->setSize($size);
+        $col->setPhpName($phpName);
+        $col->setNotNull($isNotNull);
+		
+        $this->columns[$name] = $col;
+
+        return $this->columns[$name];
+    }
+
+    /**
+    * Add a validator to a table's column
+    *
+    * @param string $columnName The name of the validator's column
+    * @param string $name The rule name of this validator
+    * @param string $classname The dot-path name of class to use (e.g. myapp.propel.MyValidator)
+    * @param string $value
+    * @param string $message The error message which is returned on invalid values
+    * @return void
+    */
+    public function addValidator($columnName, $name, $classname, $value, $message)
+    {
+        if (false !== ($pos = strpos($columnName, '.'))) {
+            $columnName = substr($columnName, $pos + 1);
+        }
+        
+        $col = $this->getColumn($columnName);        
+        if ($col !== null) {
+            $validator = new ValidatorMap($col);
+            $validator->setName($name);
+            $validator->setClass($classname);
+            $validator->setValue($value);
+            $validator->setMessage($message);
+            $col->addValidator($validator);
+        }
+    }
+
+    /**
+     * Set whether or not to use Id generator for primary key.
+     * @param boolean $bit
+     */
+    public function setUseIdGenerator($bit) {
+        $this->useIdGenerator = $bit;
+    }
+
+    /**
+     * Sets the pk information needed to generate a key
+     *
+     * @param $pkInfo information needed to generate a key
+     */
+    public function setPrimaryKeyMethodInfo($pkInfo)
+    {
+        $this->pkInfo = $pkInfo;
+    }
+
+    //---Utility methods for doing intelligent lookup of table names
+
+    /**
+     * Tell me if i have PREFIX in my string.
+     *
+     * @param data A String.
+     * @return boolean True if prefix is contained in data.
+     */
+    private function hasPrefix($data)
+    {
+        return (substr($data, $this->getPrefix()) !== false);
+    }
+
+    /**
+     * Removes the PREFIX.
+     *
+     * @param string $data A String.
+     * @return string A String with data, but with prefix removed.
+     */
+    private function removePrefix($data)
+    {
+        return substr($data, strlen($this->getPrefix()));
+    }
+
+
+
+    /**
+     * Removes the PREFIX, removes the underscores and makes
+     * first letter caps.
+     *
+     * SCARAB_FOO_BAR becomes FooBar.
+     *
+     * @param data A String.
+     * @return string A String with data processed.
+     */
+    public final function removeUnderScores($data)
+    {
+        $tmp = null;
+        $out = "";
+        if ($this->hasPrefix($data)) {
+            $tmp = $this->removePrefix($data);
+        } else {
+            $tmp = $data;
+        }
+
+        $tok = strtok($tmp, "_");
+        while ($tok) {
+            $out .= ucfirst($tok);
+            $tok = strtok("_");
+        }
+        return $out;
+    }
+
+    /**
+     * Makes the first letter caps and the rest lowercase.
+     *
+     * @param string $data A String.
+     * @return string A String with data processed.
+     */
+    private function firstLetterCaps($data)
+    {
+        return(ucfirst(strtolower($data)));
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/TableMap.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/ValidatorMap.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/ValidatorMap.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/ValidatorMap.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,109 @@
+<?php
+/*
+ *  $Id: ValidatorMap.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+/**
+ * ValidatorMap is used to model a column validator.
+ * 
+ * GENERAL NOTE
+ * ------------
+ * The propel.map classes are abstract building-block classes for modeling
+ * the database at runtime.  These classes are similar (a lite version) to the
+ * propel.engine.database.model classes, which are build-time modeling classes.
+ * These classes in themselves do not do any database metadata lookups, but instead 
+ * are used by the MapBuilder classes that were generated for your datamodel. The 
+ * MapBuilder that was created for your datamodel build a representation of your
+ * database by creating instances of the DatabaseMap, TableMap, ColumnMap, etc. 
+ * classes. See propel/templates/om/php5/MapBuilder.tpl and the classes generated
+ * by that template for your datamodel to further understand how these are put 
+ * together.
+ * 
+ * @author Michael Aichler <aichler en mediacluster.de>
+ * @version $Revision: 64 $
+ * @package propel.map
+ */
+class ValidatorMap
+{
+    /** rule name of this validator */
+    private $name;
+    /** the dot-path to class to use for validator */
+    private $classname;
+    /** value to check against */
+    private $value;
+    /** execption message thrown on invalid input */
+    private $message;
+    /** related column */
+    private $column;
+    
+    public function __construct($containingColumn)
+    {
+        $this->column = $containingColumn;
+    }
+
+    public function getColumn()
+    {
+        return $this->column;
+    }
+
+    public function getColumnName()
+    {
+        return $this->column->getColumnName();
+    }
+    
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+    
+    public function setClass($classname)
+    {
+        $this->classname = $classname;
+    }
+    
+    public function setValue($value)
+    {
+        $this->value = $value;
+    }
+    
+    public function setMessage($message)
+    {
+        $this->message = $message;
+    }
+    
+    public function getName()
+    {
+        return $this->name;
+    }
+    
+    public function getClass()
+    {
+        return $this->classname;
+    }
+    
+    public function getValue()
+    {
+        return $this->value;
+    }
+    
+    public function getMessage()
+    {
+        return $this->message;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/map/ValidatorMap.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/BaseObject.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/BaseObject.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/BaseObject.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,187 @@
+<?php
+
+/*
+ *  $Id: BaseObject.php 316 2005-12-29 14:33:08Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */ 
+
+require_once 'propel/om/Persistent.php';
+
+/**
+ * This class contains attributes and methods that are used by all
+ * business objects within the system.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Frank Y. Kim <frank.kim en clearink.com> (Torque)
+ * @author John D. McNally <jmcnally en collab.net> (Torque)
+ * @version $Revision: 316 $
+ * @package propel.om
+ */
+abstract class BaseObject {
+
+    /**
+     * attribute to determine if this object has previously been saved.
+     * @var boolean
+     */
+    private $_new = true;
+    
+    /**
+     * attribute to determine whether this object has been deleted.
+     * @var boolean
+     */
+    private $_deleted = false;
+    
+    /**
+     * The columns that have been modified in current object.
+     * Tracking modified columns allows us to only update modified columns.
+     * @var array
+     */
+    protected $modifiedColumns = array();
+    
+    /**
+     * Returns whether the object has been modified.
+     *
+     * @return boolean True if the object has been modified.
+     */
+    public function isModified()
+    {
+        return !empty($this->modifiedColumns);
+    }
+    
+    /**
+     * Has specified column been modified?
+     * 
+     * @param string $col
+     * @return boolean True if $col has been modified.
+     */
+    public function isColumnModified($col)
+    {        
+        return in_array($col, $this->modifiedColumns);
+    }        
+    
+    /**
+     * Returns whether the object has ever been saved.  This will
+     * be false, if the object was retrieved from storage or was created
+     * and then saved.
+     *
+     * @return true, if the object has never been persisted.
+     */
+    public function isNew()
+    {
+        return $this->_new;
+    }
+
+    /**
+     * Setter for the isNew attribute.  This method will be called
+     * by Propel-generated children and Peers.
+     *
+     * @param boolean $b the state of the object.
+     */
+    public function setNew($b)
+    {
+        $this->_new = (boolean) $b;
+    }    
+    
+    /**
+     * Whether this object has been deleted.
+     * @return boolean The deleted state of this object.
+     */
+    public function isDeleted()
+    {
+        return $this->_deleted;
+    }
+    
+    /**
+     * Specify whether this object has been deleted.
+     * @param boolean $b The deleted state of this object.
+     * @return void
+     */
+    public function setDeleted($b)
+    {
+        $this->_deleted = (boolean) $b;
+    }
+    
+    /**
+     * Sets the modified state for the object to be false.
+     * @param string $col If supplied, only the specified column is reset.
+     * @return void
+     */
+    public function resetModified($col = null)
+    {
+        if ($col !== null)
+        {
+            while (($offset = array_search($col, $this->modifiedColumns)) !== false)
+                array_splice($this->modifiedColumns, $offset, 1);
+        }
+        else
+        {
+            $this->modifiedColumns = array();
+        }
+    }
+   
+    /**
+     * Compares this with another <code>BaseObject</code> instance.  If
+     * <code>obj</code> is an instance of <code>BaseObject</code>, delegates to
+     * <code>equals(BaseObject)</code>.  Otherwise, returns <code>false</code>.
+     *
+     * @param obj The object to compare to.
+     * @return    Whether equal to the object specified.
+     */
+    public function equals($obj)
+    {
+        if (is_object($obj)) {
+            if ($this === $obj) {
+                return true;
+            } elseif ($this->getPrimaryKey() === null || $obj->getPrimaryKey() === null)  {
+                return false;
+            } else {
+                return ($this->getPrimaryKey() === $obj->getPrimaryKey());
+            }
+        } else {
+            return false;
+        }
+    }    
+
+    /**
+     * If the primary key is not <code>null</code>, return the hashcode of the
+     * primary key.  Otherwise calls <code>Object.hashCode()</code>.
+     *
+     * @return int Hashcode
+     */
+    public function hashCode()
+    {
+        $ok = $this->getPrimaryKey();
+        if ($ok === null) {
+            return crc32(serialize($this));
+        }
+        return crc32(serialize($ok)); // serialize because it could be an array ("ComboKey")
+    }
+
+    /**
+     * Logs a message using Propel::log().
+     *
+     * @param string $msg
+     * @param int $priority One of the Propel::LOG_* logging levels
+     * @return boolean
+     */
+    protected function log($msg, $priority = Propel::LOG_INFO)
+    {
+        return Propel::log(get_class($this) . ': ' . $msg, $priority);
+    }
+    
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/BaseObject.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/Persistent.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/Persistent.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/Persistent.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,118 @@
+<?php
+/*
+ *  $Id: Persistent.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+/**
+ * This interface defines methods related to saving an object
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author John D. McNally <jmcnally en collab.net> (Torque)
+ * @author Fedor K. <fedor en apache.org> (Torque)
+ * @version $Revision: 64 $
+ * @package propel.om
+ */
+interface Persistent {
+
+    /**
+     * getter for the object primaryKey.
+     *
+     * @return ObjectKey the object primaryKey as an Object
+     */
+    public function getPrimaryKey();
+
+    /**
+     * Sets the PrimaryKey for the object.
+     *
+     * @param mixed $primaryKey The new PrimaryKey object or string (result of PrimaryKey.toString()).
+     * @return void
+     * @throws Exception, This method might throw an exceptions
+     */
+    public function setPrimaryKey($primaryKey);
+   
+
+    /**
+     * Returns whether the object has been modified, since it was
+     * last retrieved from storage.
+     *
+     * @return boolean True if the object has been modified.
+     */
+    public function isModified();
+
+    /**
+     * Has specified column been modified?
+     * 
+     * @param string $col
+     * @return boolean True if $col has been modified.
+     */
+    public function isColumnModified($col);
+
+    /**
+     * Returns whether the object has ever been saved.  This will
+     * be false, if the object was retrieved from storage or was created
+     * and then saved.
+     *
+     * @return boolean True, if the object has never been persisted.
+     */
+    public function isNew();
+
+    /**
+     * Setter for the isNew attribute.  This method will be called
+     * by Propel-generated children and Peers.
+     *
+     * @param boolean $b the state of the object.
+     */
+    public function setNew($b);
+
+    /**
+     * Resets (to false) the "modified" state for this object.
+     *
+     * @return void
+     */
+    public function resetModified();
+
+    /**
+     * Whether this object has been deleted.
+     * @return boolean The deleted state of this object.
+     */
+    public function isDeleted();
+    
+    /**
+     * Specify whether this object has been deleted.
+     * @param boolean $b The deleted state of this object.
+     * @return void
+     */
+    public function setDeleted($b);    
+
+    /**
+     * Deletes the object.
+     * @param Connection $con
+     * @return void
+     * @throws Exception
+     */
+    public function delete($con = null);
+
+    /**
+     * Saves the object.
+     * @param Connection $con
+     * @return void
+     * @throws Exception
+     */
+    public function save($con = null);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/Persistent.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/PreOrderNodeIterator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/PreOrderNodeIterator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/PreOrderNodeIterator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,92 @@
+<?php
+
+/*
+ *  $Id: PreOrderNodeIterator.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */ 
+
+/**
+ * Pre-order node iterator for Node objects.
+ *
+ * @author Dave Lawson <dlawson en masterytech.com>
+ * @version $Revision: 64 $
+ * @package propel.om
+ */
+class PreOrderNodeIterator implements Iterator
+{
+    private $topNode = null;
+    
+    private $curNode = null;
+ 
+    private $querydb = false;
+    
+    private $con = null;
+    
+    public function __construct($node, $opts) {
+        $this->topNode = $node;
+        $this->curNode = $node;
+        
+        if (isset($opts['con']))
+            $this->con = $opts['con'];
+            
+        if (isset($opts['querydb']))
+            $this->querydb = $opts['querydb'];
+    }
+    
+    public function rewind() {
+        $this->curNode = $this->topNode;
+    }
+    
+    public function valid() {
+        return ($this->curNode !== null);
+    }
+    
+    public function current() {
+        return $this->curNode;
+    }
+    
+    public function key() {
+        return $this->curNode->getNodePath();
+    }
+
+    public function next() {
+
+        if ($this->valid())
+        {
+            $nextNode = $this->curNode->getFirstChildNode($this->querydb, $this->con);
+
+            while ($nextNode === null)
+            {
+                if ($this->curNode === null || $this->curNode->equals($this->topNode))
+                    break;
+
+                $nextNode = $this->curNode->getSiblingNode(false, $this->querydb, $this->con);
+                
+                if ($nextNode === null)
+                    $this->curNode = $this->curNode->getParentNode($this->querydb, $this->con);
+            }
+            
+            $this->curNode = $nextNode;
+        }
+        
+        return $this->curNode;
+    }
+    
+}
+
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/om/PreOrderNodeIterator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/BasePeer.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/BasePeer.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/BasePeer.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,945 @@
+<?php
+/*
+ *  $Id: BasePeer.php 431 2006-08-21 14:06:10Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+include_once 'propel/adapter/DBAdapter.php';
+include_once 'propel/map/ColumnMap.php';
+include_once 'propel/map/DatabaseMap.php';
+include_once 'propel/map/MapBuilder.php';
+include_once 'propel/map/TableMap.php';
+include_once 'propel/map/ValidatorMap.php';
+include_once 'propel/validator/ValidationFailed.php';
+
+/**
+ * This is a utility class for all generated Peer classes in the system.
+ *
+ * Peer classes are responsible for isolating all of the database access
+ * for a specific business object.  They execute all of the SQL
+ * against the database.  Over time this class has grown to include
+ * utility methods which ease execution of cross-database queries and
+ * the implementation of concrete Peers.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Kaspars Jaudzems <kaspars.jaudzems en inbox.lv> (Propel)
+ * @author Frank Y. Kim <frank.kim en clearink.com> (Torque)
+ * @author John D. McNally <jmcnally en collab.net> (Torque)
+ * @author Brett McLaughlin <bmclaugh en algx.net> (Torque)
+ * @author Stephen Haberman <stephenh en chase3000.com> (Torque)
+ * @version $Revision: 431 $
+ * @package propel.util
+ */
+class BasePeer
+{
+
+	/** Array (hash) that contains the cached mapBuilders. */
+	private static $mapBuilders = array();
+
+	/** Array (hash) that contains cached validators */
+	private static $validatorMap = array();
+
+	/**
+	 * phpname type
+	 * e.g. 'AuthorId'
+	 */
+	const TYPE_PHPNAME = 'phpName';
+
+	/**
+	 * column (peer) name type
+	 * e.g. 'book.AUTHOR_ID'
+	 */
+	const TYPE_COLNAME = 'colName';
+
+	/**
+	 * column fieldname type
+	 * e.g. 'author_id'
+	 */
+	const TYPE_FIELDNAME = 'fieldName';
+
+	/**
+	 * num type
+	 * simply the numerical array index, e.g. 4
+	 */
+	const TYPE_NUM = 'num';
+
+	static public function getFieldnames ($classname, $type = self::TYPE_PHPNAME) {
+
+		// TODO we should take care of including the peer class here
+
+		$peerclass = 'Base' . $classname . 'Peer'; // TODO is this always true?
+		$callable = array($peerclass, 'getFieldnames');
+		$args = array($type);
+
+		return call_user_func_array($callable, $args);
+	}
+
+	static public function translateFieldname($classname, $fieldname, $fromType, $toType) {
+
+		// TODO we should take care of including the peer class here
+
+		$peerclass = 'Base' . $classname . 'Peer'; // TODO is this always true?
+		$callable = array($peerclass, 'translateFieldname');
+		$args = array($fieldname, $fromType, $toType);
+
+		return call_user_func_array($callable, $args);
+	}
+
+	/**
+	 * Method to perform deletes based on values and keys in a
+	 * Criteria.
+	 *
+	 * @param Criteria $criteria The criteria to use.
+	 * @param Connection $con A Connection.
+	 * @return int	The number of rows affected by last statement execution.  For most
+	 * 				uses there is only one delete statement executed, so this number
+	 * 				will correspond to the number of rows affected by the call to this
+	 * 				method.  Note that the return value does require that this information
+	 * 				is returned (supported) by the Creole db driver.
+	 * @throws PropelException
+	 */
+	public static function doDelete(Criteria $criteria, Connection $con)
+	{
+		$db = Propel::getDB($criteria->getDbName());
+		$dbMap = Propel::getDatabaseMap($criteria->getDbName());
+
+		// Set up a list of required tables (one DELETE statement will
+		// be executed per table)
+
+		$tables_keys = array();
+		foreach($criteria as $c) {
+			foreach($c->getAllTables() as $tableName) {
+				$tableName2 = $criteria->getTableForAlias($tableName);
+				if ($tableName2 !== null) {
+					$tables_keys[$tableName2 . ' ' . $tableName] = true;
+				} else {
+					$tables_keys[$tableName] = true;
+				}
+			}
+		} // foreach criteria->keys()
+
+		$affectedRows = 0; // initialize this in case the next loop has no iterations.
+
+		$tables = array_keys($tables_keys);
+
+		foreach($tables as $tableName) {
+
+			$whereClause = array();
+			$selectParams = array();
+			foreach($dbMap->getTable($tableName)->getColumns() as $colMap) {
+				$key = $tableName . '.' . $colMap->getColumnName();
+				if ($criteria->containsKey($key)) {
+					$sb = "";
+					$criteria->getCriterion($key)->appendPsTo($sb, $selectParams);
+					$whereClause[] = $sb;
+				}
+			}
+
+			if (empty($whereClause)) {
+				throw new PropelException("Cowardly refusing to delete from table $tableName with empty WHERE clause.");
+			}
+
+			// Execute the statement.
+			try {
+
+				$sqlSnippet = implode(" AND ", $whereClause);
+
+				if ($criteria->isSingleRecord()) {
+					$sql = "SELECT COUNT(*) FROM " . $tableName . " WHERE " . $sqlSnippet;
+					$stmt = $con->prepareStatement($sql);
+					self::populateStmtValues($stmt, $selectParams, $dbMap);
+					$rs = $stmt->executeQuery(ResultSet::FETCHMODE_NUM);
+					$rs->next();
+					if ($rs->getInt(1) > 1) {
+						$rs->close();
+						throw new PropelException("Expecting to delete 1 record, but criteria match multiple.");
+					}
+					$rs->close();
+				}
+
+				$sql = "DELETE FROM " . $tableName . " WHERE " .  $sqlSnippet;
+				Propel::log($sql, Propel::LOG_DEBUG);
+				$stmt = $con->prepareStatement($sql);
+				self::populateStmtValues($stmt, $selectParams, $dbMap);
+				$affectedRows = $stmt->executeUpdate();
+			} catch (Exception $e) {
+				Propel::log($e->getMessage(), Propel::LOG_ERR);
+				throw new PropelException("Unable to execute DELETE statement.",$e);
+			}
+
+		} // for each table
+
+		return $affectedRows;
+	}
+
+	/**
+	 * Method to deletes all contents of specified table.
+	 *
+	 * This method is invoked from generated Peer classes like this:
+	 * <code>
+	 * public static function doDeleteAll($con = null)
+	 * {
+	 *   if ($con === null) $con = Propel::getConnection(self::DATABASE_NAME);
+	 *   BasePeer::doDeleteAll(self::TABLE_NAME, $con);
+	 * }
+	 * </code>
+	 *
+	 * @param string $tableName The name of the table to empty.
+	 * @param Connection $con A Connection.
+	 * @return int	The number of rows affected by the statement.  Note
+	 * 				that the return value does require that this information
+	 * 				is returned (supported) by the Creole db driver.
+	 * @throws PropelException - wrapping SQLException caught from statement execution.
+	 */
+	public static function doDeleteAll($tableName, Connection $con)
+	{
+		try {
+			$sql = "DELETE FROM " . $tableName;
+			Propel::log($sql, Propel::LOG_DEBUG);
+			$stmt = $con->prepareStatement($sql);
+			return $stmt->executeUpdate();
+		} catch (Exception $e) {
+			Propel::log($e->getMessage(), Propel::LOG_ERR);
+			throw new PropelException("Unable to perform DELETE ALL operation.", $e);
+		}
+	}
+
+	/**
+	 * Method to perform inserts based on values and keys in a
+	 * Criteria.
+	 * <p>
+	 * If the primary key is auto incremented the data in Criteria
+	 * will be inserted and the auto increment value will be returned.
+	 * <p>
+	 * If the primary key is included in Criteria then that value will
+	 * be used to insert the row.
+	 * <p>
+	 * If no primary key is included in Criteria then we will try to
+	 * figure out the primary key from the database map and insert the
+	 * row with the next available id using util.db.IDBroker.
+	 * <p>
+	 * If no primary key is defined for the table the values will be
+	 * inserted as specified in Criteria and null will be returned.
+	 *
+	 * @param Criteria $criteria Object containing values to insert.
+	 * @param Connection $con A Connection.
+	 * @return mixed The primary key for the new row if (and only if!) the primary key
+	 *				is auto-generated.  Otherwise will return <code>null</code>.
+	 * @throws PropelException
+	 */
+	public static function doInsert(Criteria $criteria, Connection $con) {
+
+		// the primary key
+		$id = null;
+
+		// Get the table name and method for determining the primary
+		// key value.
+		$keys = $criteria->keys();
+		if (!empty($keys)) {
+			$tableName = $criteria->getTableName( $keys[0] );
+		} else {
+			throw new PropelException("Database insert attempted without anything specified to insert");
+		}
+
+		$dbMap = Propel::getDatabaseMap($criteria->getDbName());
+		$tableMap = $dbMap->getTable($tableName);
+		$keyInfo = $tableMap->getPrimaryKeyMethodInfo();
+		$useIdGen = $tableMap->isUseIdGenerator();
+		$keyGen = $con->getIdGenerator();
+
+		$pk = self::getPrimaryKey($criteria);
+
+		// only get a new key value if you need to
+		// the reason is that a primary key might be defined
+		// but you are still going to set its value. for example:
+		// a join table where both keys are primary and you are
+		// setting both columns with your own values
+
+		// pk will be null if there is no primary key defined for the table
+		// we're inserting into.
+		if ($pk !== null && $useIdGen && !$criteria->containsKey($pk->getFullyQualifiedName())) {
+
+			// If the keyMethod is SEQUENCE get the id before the insert.
+			if ($keyGen->isBeforeInsert()) {
+				try {
+					$id = $keyGen->getId($keyInfo);
+				} catch (Exception $e) {
+					throw new PropelException("Unable to get sequence id.", $e);
+				}
+				$criteria->add($pk->getFullyQualifiedName(), $id);
+			}
+		}
+
+		try {
+
+			$qualifiedCols = $criteria->keys(); // we need table.column cols when populating values
+			$columns = array(); // but just 'column' cols for the SQL
+			foreach($qualifiedCols as $qualifiedCol) {
+				$columns[] = substr($qualifiedCol, strpos($qualifiedCol, '.') + 1);
+			}
+
+			$sql = "INSERT INTO " . $tableName
+				. " (" . implode(",", $columns) . ")"
+				. " VALUES (" . substr(str_repeat("?,", count($columns)), 0, -1) . ")";
+
+			Propel::log($sql, Propel::LOG_DEBUG);
+
+			$stmt = $con->prepareStatement($sql);
+			self::populateStmtValues($stmt, self::buildParams($qualifiedCols, $criteria), $dbMap);
+			$stmt->executeUpdate();
+
+		} catch (Exception $e) {
+			Propel::log($e->getMessage(), Propel::LOG_ERR);
+			throw new PropelException("Unable to execute INSERT statement.", $e);
+		}
+
+		// If the primary key column is auto-incremented, get the id
+		// now.
+		if ($pk !== null && $useIdGen && $keyGen->isAfterInsert()) {
+			try {
+				$id = $keyGen->getId($keyInfo);
+			} catch (Exception $e) {
+				throw new PropelException("Unable to get autoincrement id.", $e);
+			}
+		}
+
+		return $id;
+	}
+
+	/**
+	 * Method used to update rows in the DB.  Rows are selected based
+	 * on selectCriteria and updated using values in updateValues.
+	 * <p>
+	 * Use this method for performing an update of the kind:
+	 * <p>
+	 * WHERE some_column = some value AND could_have_another_column =
+	 * another value AND so on.
+	 *
+	 * @param $selectCriteria A Criteria object containing values used in where
+	 *		clause.
+	 * @param $updateValues A Criteria object containing values used in set
+	 *		clause.
+	 * @param $con 	The Connection to use.
+	 * @return int	The number of rows affected by last update statement.  For most
+	 * 				uses there is only one update statement executed, so this number
+	 * 				will correspond to the number of rows affected by the call to this
+	 * 				method.  Note that the return value does require that this information
+	 * 				is returned (supported) by the Creole db driver.
+	 * @throws PropelException
+	 */
+	public static function doUpdate(Criteria $selectCriteria, Criteria $updateValues, Connection $con) {
+
+		$db = Propel::getDB($selectCriteria->getDbName());
+		$dbMap = Propel::getDatabaseMap($selectCriteria->getDbName());
+
+		// Get list of required tables, containing all columns
+		$tablesColumns = $selectCriteria->getTablesColumns();
+
+		// we also need the columns for the update SQL
+		$updateTablesColumns = $updateValues->getTablesColumns();
+
+		$affectedRows = 0; // initialize this in case the next loop has no iterations.
+
+		foreach($tablesColumns as $tableName => $columns) {
+
+			$whereClause = array();
+
+			$selectParams = array();
+			foreach($columns as $colName) {
+				$sb = "";
+				$selectCriteria->getCriterion($colName)->appendPsTo($sb, $selectParams);
+				$whereClause[] = $sb;
+			}
+
+			$rs = null;
+			$stmt = null;
+			try {
+
+				$sqlSnippet = implode(" AND ", $whereClause);
+
+				if ($selectCriteria->isSingleRecord()) {
+					// Get affected records.
+					$sql = "SELECT COUNT(*) FROM " . $tableName . " WHERE " . $sqlSnippet;
+					$stmt = $con->prepareStatement($sql);
+					self::populateStmtValues($stmt, $selectParams, $dbMap);
+					$rs = $stmt->executeQuery(ResultSet::FETCHMODE_NUM);
+					$rs->next();
+					if ($rs->getInt(1) > 1) {
+						$rs->close();
+						throw new PropelException("Expected to update 1 record, multiple matched.");
+					}
+					$rs->close();
+				}
+
+				$sql = "UPDATE " . $tableName . " SET ";
+				foreach($updateTablesColumns[$tableName] as $col) {
+					$sql .= substr($col, strpos($col, '.') + 1) . " = ?,";
+				}
+
+				$sql = substr($sql, 0, -1) . " WHERE " . $sqlSnippet;
+
+				Propel::log($sql, Propel::LOG_DEBUG);
+
+				$stmt = $con->prepareStatement($sql);
+
+				// Replace '?' with the actual values
+				self::populateStmtValues($stmt, array_merge(self::buildParams($updateTablesColumns[$tableName], $updateValues), $selectParams), $dbMap);
+
+				$affectedRows = $stmt->executeUpdate();
+				$stmt->close();
+
+			} catch (Exception $e) {
+				if ($rs) $rs->close();
+				if ($stmt) $stmt->close();
+				Propel::log($e->getMessage(), Propel::LOG_ERR);
+				throw new PropelException("Unable to execute UPDATE statement.", $e);
+			}
+
+		} // foreach table in the criteria
+
+		return $affectedRows;
+	}
+
+	/**
+	 * Executes query build by createSelectSql() and returns ResultSet.
+	 *
+	 * @param Criteria $criteria A Criteria.
+	 * @param Connection $con A connection to use.
+	 * @return ResultSet The resultset.
+	 * @throws PropelException
+	 * @see createSelectSql()
+	 */
+	public static function doSelect(Criteria $criteria, $con = null)
+	{
+		$dbMap = Propel::getDatabaseMap($criteria->getDbName());
+
+		if ($con === null)
+			$con = Propel::getConnection($criteria->getDbName());
+
+		$stmt = null;
+
+		try {
+
+			// Transaction support exists for (only?) Postgres, which must
+			// have SELECT statements that include bytea columns wrapped w/
+			// transactions.
+			if ($criteria->isUseTransaction()) $con->begin();
+
+			$params = array();
+			$sql = self::createSelectSql($criteria, $params);
+
+			$stmt = $con->prepareStatement($sql);
+			$stmt->setLimit($criteria->getLimit());
+			$stmt->setOffset($criteria->getOffset());
+
+			self::populateStmtValues($stmt, $params, $dbMap);
+
+			$rs = $stmt->executeQuery(ResultSet::FETCHMODE_NUM);
+			if ($criteria->isUseTransaction()) $con->commit();
+		} catch (Exception $e) {
+			if ($stmt) $stmt->close();
+			if ($criteria->isUseTransaction()) $con->rollback();
+			Propel::log($e->getMessage(), Propel::LOG_ERR);
+			throw new PropelException($e);
+		}
+
+		return $rs;
+	}
+
+	/**
+	 * Applies any validators that were defined in the schema to the specified columns.
+	 *
+	 * @param string $dbName The name of the database
+	 * @param string $tableName The name of the table
+	 * @param array $columns Array of column names as key and column values as value.
+	 */
+	public static function doValidate($dbName, $tableName, $columns)
+	{
+		$dbMap = Propel::getDatabaseMap($dbName);
+		$tableMap = $dbMap->getTable($tableName);
+		$failureMap = array(); // map of ValidationFailed objects
+		foreach($columns as $colName => $colValue) {
+			if ($tableMap->containsColumn($colName)) {
+				$col = $tableMap->getColumn($colName);
+				foreach($col->getValidators() as $validatorMap) {
+					$validator = BasePeer::getValidator($validatorMap->getClass());
+					if($validator && ($col->isNotNull() || $colValue !== null) && $validator->isValid($validatorMap, $colValue) === false) {
+						if (!isset($failureMap[$colName])) { // for now we do one ValidationFailed per column, not per rule
+							$failureMap[$colName] = new ValidationFailed($colName, $validatorMap->getMessage(), $validator);
+						}
+					}
+				}
+			}
+		}
+		return (!empty($failureMap) ? $failureMap : true);
+	}
+
+	/**
+	 * Helper method which returns the primary key contained
+	 * in the given Criteria object.
+	 *
+	 * @param Criteria $criteria A Criteria.
+	 * @return ColumnMap If the Criteria object contains a primary
+	 *		  key, or null if it doesn't.
+	 * @throws PropelException
+	 */
+	private static function getPrimaryKey(Criteria $criteria)
+	{
+		// Assume all the keys are for the same table.
+		$keys = $criteria->keys();
+		$key = $keys[0];
+		$table = $criteria->getTableName($key);
+
+		$pk = null;
+
+		if (!empty($table)) {
+
+			$dbMap = Propel::getDatabaseMap($criteria->getDbName());
+
+			if ($dbMap === null) {
+				throw new PropelException("\$dbMap is null");
+			}
+
+			if ($dbMap->getTable($table) === null) {
+				throw new PropelException("\$dbMap->getTable() is null");
+			}
+
+			$columns = $dbMap->getTable($table)->getColumns();
+			foreach(array_keys($columns) as $key) {
+				if ($columns[$key]->isPrimaryKey()) {
+					$pk = $columns[$key];
+					break;
+				}
+			}
+		}
+		return $pk;
+	}
+
+	/**
+	 * Method to create an SQL query based on values in a Criteria.
+	 *
+	 * This method creates only prepared statement SQL (using ? where values
+	 * will go).  The second parameter ($params) stores the values that need
+	 * to be set before the statement is executed.  The reason we do it this way
+	 * is to let the Creole layer handle all escaping & value formatting.
+	 *
+	 * @param Criteria $criteria Criteria for the SELECT query.
+	 * @param array &$params Parameters that are to be replaced in prepared statement.
+	 * @return string
+	 * @throws PropelException Trouble creating the query string.
+	 */
+	public static function createSelectSql(Criteria $criteria, &$params) {
+
+		$db = Propel::getDB($criteria->getDbName());
+		$dbMap = Propel::getDatabaseMap($criteria->getDbName());
+
+		// redundant definition $selectModifiers = array();
+		$selectClause = array();
+		$fromClause = array();
+		$joinClause = array();
+		$joinTables = array();
+		$whereClause = array();
+		$orderByClause = array();
+		// redundant definition $groupByClause = array();
+
+		$orderBy = $criteria->getOrderByColumns();
+		$groupBy = $criteria->getGroupByColumns();
+		$ignoreCase = $criteria->isIgnoreCase();
+		$select = $criteria->getSelectColumns();
+		$aliases = $criteria->getAsColumns();
+
+		// simple copy
+		$selectModifiers = $criteria->getSelectModifiers();
+
+		// get selected columns
+		foreach($select as $columnName) {
+
+			// expect every column to be of "table.column" formation
+			// it could be a function:  e.g. MAX(books.price)
+
+			$tableName = null;
+
+			$selectClause[] = $columnName; // the full column name: e.g. MAX(books.price)
+
+			$parenPos = strpos($columnName, '(');
+			$dotPos = strpos($columnName, '.');
+
+			// [HL] I think we really only want to worry about adding stuff to
+			// the fromClause if this function has a TABLE.COLUMN in it at all.
+			// e.g. COUNT(*) should not need this treatment -- or there needs to
+			// be special treatment for '*'
+			if ($dotPos !== false) {
+
+				if ($parenPos === false) { // table.column
+					$tableName = substr($columnName, 0, $dotPos);
+				} else { // FUNC(table.column)
+					$tableName = substr($columnName, $parenPos + 1, $dotPos - ($parenPos + 1));
+					// functions may contain qualifiers so only take the last
+					// word as the table name.
+					// COUNT(DISTINCT books.price)
+					$lastSpace = strpos($tableName, ' ');
+					if ($lastSpace !== false) { // COUNT(DISTINCT books.price)
+						$tableName = substr($tableName, $lastSpace + 1);
+					}
+				}
+				$tableName2 = $criteria->getTableForAlias($tableName);
+				if ($tableName2 !== null) {
+					$fromClause[] = $tableName2 . ' ' . $tableName;
+				} else {
+					$fromClause[] = $tableName;
+				}
+
+			} // if $dotPost !== null
+		}
+
+		// set the aliases
+		foreach($aliases as $alias => $col) {
+			$selectClause[] = $col . " AS " . $alias;
+		}
+
+		// add the criteria to WHERE clause
+		// this will also add the table names to the FROM clause if they are not already
+		// invluded via a LEFT JOIN
+		foreach($criteria->keys() as $key) {
+
+			$criterion = $criteria->getCriterion($key);
+			$someCriteria = $criterion->getAttachedCriterion();
+			$someCriteriaLength = count($someCriteria);
+			$table = null;
+			for ($i=0; $i < $someCriteriaLength; $i++) {
+				$tableName = $someCriteria[$i]->getTable();
+
+				$table = $criteria->getTableForAlias($tableName);
+				if ($table !== null) {
+					$fromClause[] = $table . ' ' . $tableName;
+				} else {
+					$fromClause[] = $tableName;
+					$table = $tableName;
+				}
+
+				$ignoreCase =
+					(($criteria->isIgnoreCase()
+						|| $someCriteria[$i]->isIgnoreCase())
+						&& ($dbMap->getTable($table)->getColumn($someCriteria[$i]->getColumn())->getType() == "string" )
+						 );
+
+				$someCriteria[$i]->setIgnoreCase($ignoreCase);
+			}
+
+			$criterion->setDB($db);
+
+			$sb = "";
+			$criterion->appendPsTo($sb, $params);
+			$whereClause[] = $sb;
+
+		}
+		
+		// handle RIGHT (straight) joins
+		// Loop through the joins, 
+		// joins with a null join type will be added to the FROM clause and the condition added to the WHERE clause.
+		// joins of a specified type: the LEFT side will be added to the fromClause and the RIGHT to the joinClause 
+		// New Code.
+		foreach ((array) $criteria->getJoins() as $join) { // we'll only loop if there's actually something here
+
+			// The join might have been established using an alias name
+
+			$leftTable = $join->getLeftTableName();
+			$leftTableAlias = '';
+			if ($realTable = $criteria->getTableForAlias($leftTable)) {
+				$leftTableAlias = " $leftTable";
+				$leftTable = $realTable;
+			}
+			
+			$rightTable = $join->getRightTableName();
+			$rightTableAlias = '';
+			if ($realTable = $criteria->getTableForAlias($rightTable)) {
+				$rightTableAlias = " $rightTable";
+				$rightTable = $realTable;
+			}
+					
+			// determine if casing is relevant.
+			if ($ignoreCase = $criteria->isIgnoreCase()) {
+				$leftColType = $dbMap->getTable($leftTable)->getColumn($join->getLeftColumnName())->getType();
+				$rightColType = $dbMap->getTable($rightTable)->getColumn($join->getRightColumnName())->getType();
+				$ignoreCase = ($leftColType == 'string' || $rightColType == 'string');
+			}
+
+			// build the condition
+			if ($ignoreCase) {
+				$condition = $db->ignoreCase($join->getLeftColumn()) . '=' . $db->ignoreCase($join->getRightColumn());
+			} else {
+				$condition = $join->getLeftColumn() . '=' . $join->getRightColumn();
+			}
+					
+			// add 'em to the queues..  
+			if ($joinType = $join->getJoinType()) { 
+				if (!$fromClause) {
+					$fromClause[] = $leftTable . $leftTableAlias;
+				}
+				$joinTables[] = $rightTable . $rightTableAlias;
+				$joinClause[] = $join->getJoinType() . ' ' . $rightTable . $rightTableAlias . " ON ($condition)";
+			} else { 
+				$fromClause[] = $leftTable . $leftTableAlias;
+				$fromClause[] = $rightTable . $rightTableAlias;
+				$whereClause[] = $condition;
+			}
+		}
+		
+		// Unique from clause elements
+		$fromClause = array_unique($fromClause);
+				
+		// tables should not exist in both the from and join clauses
+		if ($joinTables && $fromClause) {
+			foreach ($fromClause as $fi => $ftable) {
+				if (in_array($ftable, $joinTables)) {
+					unset($fromClause[$fi]);
+				}
+			}
+		}
+/*
+				// Old Code.
+				$joins =& $criteria->getJoins();
+				if (!empty($joins)) {
+					for ($i=0, $joinSize=count($joins); $i < $joinSize; $i++) {
+						$join =& $joins[$i];
+						$join1 = $join->getLeftColumn();
+						$join2 = $join->getRightColumn();
+
+						$tableName = substr($join1, 0, strpos($join1, '.'));
+						$table = $criteria->getTableForAlias($tableName);
+						if ($table !== null) {
+							$fromClause[] = $table . ' ' . $tableName;
+						} else {
+							$fromClause[] = $tableName;
+						}
+
+						$dot = strpos($join2, '.');
+						$tableName = substr($join2, 0, $dot);
+						$table = $criteria->getTableForAlias($tableName);
+						if ($table !== null) {
+							$fromClause[] = $table . ' ' . $tableName;
+						} else {
+							$fromClause[] = $tableName;
+							$table = $tableName;
+						}
+						$ignoreCase = ($criteria->isIgnoreCase() && ($dbMap->getTable($table)->getColumn(substr($join2, $dot + 1))->getType() == "string"));
+						if ($ignoreCase) {
+							$whereClause[] = $db->ignoreCase($join1) . '=' . $db->ignoreCase($join2);
+						} else {
+							$whereClause[] = $join1 . '=' . $join2;
+						}
+					if ($join->getJoinType()) {
+							$leftTable = $fromClause[count($fromClause) - 2];
+							$rightTable = $fromClause[count($fromClause) - 1];
+							$onClause = $whereClause[count($whereClause) - 1];
+							unset($whereClause[count($whereClause) - 1]);
+							$fromClause [] = $leftTable . ' ' . $join->getJoinType() . ' ' . $rightTable . ' ON ' . $onClause;
+
+							// remove all references to joinTables made by selectColumns, criteriaColumns
+							for ($i = 0, $fromClauseSize=count($fromClause); $i < $fromClauseSize; $i++) {
+								if ($fromClause[$i] == $leftTable || $fromClause[$i] == $rightTable) {
+									unset($fromClause[$i]);
+								}
+							}
+						} // If join type
+					} // Join for loop
+				} // If Joins
+*/
+		
+		// Add the GROUP BY columns
+		$groupByClause = $groupBy;
+
+		$having = $criteria->getHaving();
+		$havingString = null;
+		if ($having !== null) {
+			$sb = "";
+			$having->appendPsTo($sb, $params);
+			$havingString = $sb;
+		}
+
+		 if (!empty($orderBy)) {
+
+			foreach($orderBy as $orderByColumn) {
+				
+				// Add function expression as-is.
+				
+				if (strpos($orderByColumn, '(') !== false) {
+					$orderByClause[] = $orderByColumn;
+					continue;
+				}
+				
+				// Split orderByColumn (i.e. "table.column DESC")
+
+				$dotPos = strpos($orderByColumn, '.');
+
+				if ($dotPos !== false) {
+					$tableName = substr($orderByColumn, 0, $dotPos);
+					$columnName = substr($orderByColumn, $dotPos+1);
+				}
+				else {
+					$tableName = '';
+					$columnName = $orderByColumn;
+				}
+
+				$spacePos = strpos($columnName, ' ');
+
+				if ($spacePos !== false) {
+					$direction = substr($columnName, $spacePos);
+					$columnName = substr($columnName, 0, $spacePos);
+				}
+				else {
+					$direction = '';
+				}
+
+				$tableAlias = $tableName;
+				if ($aliasTableName = $criteria->getTableForAlias($tableName)) {
+					$tableName = $aliasTableName;
+				}
+
+				$columnAlias = $columnName;
+				if ($asColumnName = $criteria->getColumnForAs($columnName)) {
+					$columnName = $asColumnName;
+				}
+
+				$column = $tableName ? $dbMap->getTable($tableName)->getColumn($columnName) : null;
+
+				if ($column && $column->getType() == 'string') {
+					$orderByClause[] = $db->ignoreCaseInOrderBy("$tableAlias.$columnAlias") . $direction;
+					$selectClause[] = $db->ignoreCaseInOrderBy("$tableAlias.$columnAlias");
+				}
+				else {
+					$orderByClause[] = $orderByColumn;
+				}
+			}
+		}
+
+		// Build the SQL from the arrays we compiled
+		$sql =  "SELECT "
+				.($selectModifiers ? implode(" ", $selectModifiers) . " " : "")
+				.implode(", ", $selectClause)
+				." FROM ". ( (!empty($joinClause) && count($fromClause) > 1 && (substr(get_class($db), 0, 7) == 'DBMySQL')) ? "(" . implode(", ", $fromClause) . ")" : implode(", ", $fromClause) ) 
+								.($joinClause ? ' ' . implode(' ', $joinClause) : '')
+				.($whereClause ? " WHERE ".implode(" AND ", $whereClause) : "")
+				.($groupByClause ? " GROUP BY ".implode(",", $groupByClause) : "")
+				.($havingString ? " HAVING ".$havingString : "")
+				.($orderByClause ? " ORDER BY ".implode(",", $orderByClause) : "");
+
+		Propel::log($sql . ' [LIMIT: ' . $criteria->getLimit() . ', OFFSET: ' . $criteria->getOffset() . ']', Propel::LOG_DEBUG);
+
+		return $sql;
+
+	}
+
+	/**
+	 * Builds a params array, like the kind populated by Criterion::appendPsTo().
+	 * This is useful for building an array even when it is not using the appendPsTo() method.
+	 * @param array $columns
+	 * @param Criteria $values
+	 * @return array params array('column' => ..., 'table' => ..., 'value' => ...)
+	 */
+	private static function buildParams($columns, Criteria $values) {
+		$params = array();
+		foreach($columns as $key) {
+			if ($values->containsKey($key)) {
+				$crit = $values->getCriterion($key);
+				$params[] = array('column' => $crit->getColumn(), 'table' => $crit->getTable(), 'value' => $crit->getValue());
+			}
+		}
+		return $params;
+	}
+
+	/**
+	 * Populates values in a prepared statement.
+	 *
+	 * @param PreparedStatement $stmt
+	 * @param array $params array('column' => ..., 'table' => ..., 'value' => ...)
+	 * @param DatabaseMap $dbMap
+	 * @return int The number of params replaced.
+	 */
+	private static function populateStmtValues($stmt, $params, DatabaseMap $dbMap)
+	{
+		$i = 1;
+		foreach($params as $param) {
+			$tableName = $param['table'];
+			$columnName = $param['column'];
+			$value = $param['value'];
+
+			if ($value === null) {
+				$stmt->setNull($i++);
+			} else {
+				$cMap = $dbMap->getTable($tableName)->getColumn($columnName);
+				$setter = 'set' . CreoleTypes::getAffix($cMap->getCreoleType());
+				$stmt->$setter($i++, $value);
+			}
+		} // foreach
+	}
+
+	/**
+	* This function searches for the given validator $name under propel/validator/$name.php,
+	* imports and caches it.
+	*
+	* @param string $classname The dot-path name of class (e.g. myapp.propel.MyValidator)
+	* @return Validator object or null if not able to instantiate validator class (and error will be logged in this case)
+	*/
+	public static function getValidator($classname)
+	{
+		try {
+			$v = isset(self::$validatorMap[$classname]) ? self::$validatorMap[$classname] : null;
+			if ($v === null) {
+				$cls = Propel::import($classname);
+				$v = new $cls();
+				self::$validatorMap[$classname] = $v;
+			}
+			return $v;
+		} catch (Exception $e) {
+			Propel::log("BasePeer::getValidator(): failed trying to instantiate " . $classname . ": ".$e->getMessage(), Propel::LOG_ERR);
+		}
+	}
+
+	/**
+	 * This method returns the MapBuilder specified in the name
+	 * parameter.  You should pass in the full dot-path path to the class, ie:
+	 * myapp.propel.MyMapMapBuilder.  The MapBuilder instances are cached in
+	 * this class for speed.
+	 *
+	 * @param string $classname The dot-path name of class (e.g. myapp.propel.MyMapBuilder)
+	 * @return MapBuilder or null (and logs the error) if the MapBuilder was not found.
+	 * @todo -cBasePeer Consider adding app-level caching support for map builders.
+	 */
+	public static function getMapBuilder($classname)
+	{
+		try {
+			$mb = isset(self::$mapBuilders[$classname]) ? self::$mapBuilders[$classname] : null;
+			if ($mb === null) {
+				$cls = Propel::import($classname);
+				$mb = new $cls();
+				self::$mapBuilders[$classname] = $mb;
+			}
+			if (!$mb->isBuilt()) {
+				$mb->doBuild();
+			}
+			return $mb;
+		} catch (Exception $e) {
+			// Have to catch possible exceptions because method is
+			// used in initialization of Peers.  Log the exception and
+			// return null.
+			Propel::log("BasePeer::getMapBuilder() failed trying to instantiate " . $classname . ": " . $e->getMessage(), Propel::LOG_ERR);
+		}
+	}
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/BasePeer.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/Criteria.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/Criteria.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/Criteria.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1741 @@
+<?php
+/*
+ *  $Id: Criteria.php 338 2006-02-15 14:46:02Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+/**
+ * This is a utility class for holding criteria information for a query.
+ * 
+ * BasePeer constructs SQL statements based on the values in this class.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Kaspars Jaudzems <kaspars.jaudzems en inbox.lv> (Propel)
+ * @author Frank Y. Kim <frank.kim en clearink.com> (Torque)
+ * @author John D. McNally <jmcnally en collab.net> (Torque)
+ * @author Brett McLaughlin <bmclaugh en algx.net> (Torque)
+ * @author Eric Dobbs <eric en dobbse.net> (Torque)
+ * @author Henning P. Schmiedehausen <hps en intermeta.de> (Torque)
+ * @author Sam Joseph <sam en neurogrid.com> (Torque)
+ * @version $Revision: 338 $
+ * @package propel.util
+ */
+class Criteria implements IteratorAggregate {
+
+    /** Comparison type. */
+    const EQUAL = "=";
+
+    /** Comparison type. */
+    const NOT_EQUAL = "<>";
+
+    /** Comparison type. */
+    const ALT_NOT_EQUAL = "!=";
+
+    /** Comparison type. */
+    const GREATER_THAN = ">";
+
+    /** Comparison type. */
+    const LESS_THAN = "<";
+
+    /** Comparison type. */
+    const GREATER_EQUAL = ">=";
+
+    /** Comparison type. */
+    const LESS_EQUAL = "<=";
+
+    /** Comparison type. */
+    const LIKE = " LIKE ";
+
+    /** Comparison type. */
+    const NOT_LIKE = " NOT LIKE ";
+
+    /** PostgreSQL comparison type */
+    const ILIKE = " ILIKE ";
+    
+    /** PostgreSQL comparison type */
+    const NOT_ILIKE = " NOT ILIKE ";
+
+    /** Comparison type. */
+    const CUSTOM = "CUSTOM";
+
+    /** Comparison type. */
+    const DISTINCT = "DISTINCT ";
+
+    /** Comparison type. */
+    const IN = " IN ";
+
+    /** Comparison type. */
+    const NOT_IN = " NOT IN ";
+
+    /** Comparison type. */
+    const ALL = "ALL ";
+    
+    /** Comparison type. */
+    const JOIN = "JOIN";
+
+    /** Binary math operator: AND */
+    const BINARY_AND = "&";
+
+    /** Binary math operator: OR */
+    const BINARY_OR = "|";
+
+    /** "Order by" qualifier - ascending */
+    const ASC = "ASC";
+
+    /** "Order by" qualifier - descending */
+    const DESC = "DESC";
+
+    /** "IS NULL" null comparison */
+    const ISNULL = " IS NULL ";
+
+    /** "IS NOT NULL" null comparison */
+    const ISNOTNULL = " IS NOT NULL ";
+
+    /** "CURRENT_DATE" ANSI SQL function */
+    const CURRENT_DATE = "CURRENT_DATE";
+
+    /** "CURRENT_TIME" ANSI SQL function */
+    const CURRENT_TIME = "CURRENT_TIME";    
+    
+    /** "CURRENT_TIMESTAMP" ANSI SQL function */
+    const CURRENT_TIMESTAMP = "CURRENT_TIMESTAMP";
+	
+    /** "LEFT JOIN" SQL statement */
+    const LEFT_JOIN = "LEFT JOIN";
+
+    /** "RIGHT JOIN" SQL statement */
+    const RIGHT_JOIN = "RIGHT JOIN";
+
+    /** "INNER JOIN" SQL statement */
+    const INNER_JOIN = "INNER JOIN";
+    
+    private $ignoreCase = false;
+    private $singleRecord = false;
+    private $selectModifiers = array();
+    private $selectColumns = array();
+    private $orderByColumns = array();
+    private $groupByColumns = array();
+    private $having = null;
+    private $asColumns = array();
+    private $joins = array();
+
+    /** The name of the database. */
+    private $dbName;
+
+    /** The name of the database as given in the contructor. */
+    private $originalDbName;
+
+    /**
+     * To limit the number of rows to return.  <code>0</code> means return all
+     * rows.
+     */
+    private $limit = 0;
+
+    /** To start the results at a row other than the first one. */
+    private $offset = 0;
+
+    // flag to note that the criteria involves a blob.
+    private $blobFlag = null;
+
+    private $aliases = null;
+
+    private $useTransaction = false;
+
+    /**
+     * Primary storage of criteria data.
+     * @var array
+     */
+    private $map = array();
+    
+    /**
+     * Creates a new instance with the default capacity which corresponds to
+     * the specified database.
+     *
+     * @param dbName The dabase name.
+     */
+    public function __construct($dbName = null)
+    {
+        $this->setDbName($dbName);
+        $this->originalDbName = $dbName;
+    }
+    
+    /**
+     * Implementing SPL IteratorAggregate interface.  This allows
+     * you to foreach() over a Criteria object.
+     */
+    public function getIterator()
+		{
+        return new CriterionIterator($this);
+    }
+    
+		/**
+		 * Get the criteria map.
+		 * @return array
+		 */
+		public function getMap()
+		{
+			return $this->map;
+		}
+		
+    /**
+     * Brings this criteria back to its initial state, so that it
+     * can be reused as if it was new. Except if the criteria has grown in
+     * capacity, it is left at the current capacity.
+     * @return void
+     */
+    public function clear()
+	{
+        $this->map = array();
+        $this->ignoreCase = false;
+        $this->singleRecord = false;
+        $this->selectModifiers = array();
+        $this->selectColumns = array();
+        $this->orderByColumns = array();
+        $this->groupByColumns = array();
+        $this->having = null;
+        $this->asColumns = array();
+        $this->joins = array();
+        $this->dbName = $this->originalDbName;
+        $this->offset = 0;
+        $this->limit = -1;
+        $this->blobFlag = null;
+        $this->aliases = null;
+        $this->useTransaction = false;
+    }
+
+    /**
+     * Add an AS clause to the select columns. Usage:
+     * 
+     * <code>
+     * Criteria myCrit = new Criteria();
+     * myCrit->addAsColumn("alias", "ALIAS(".MyPeer::ID.")");
+     * </code>
+     *
+     * @param string $name Wanted Name of the column (alias).
+     * @param string $clause SQL clause to select from the table
+     *
+     * If the name already exists, it is replaced by the new clause.
+     *
+     * @return Criteria A modified Criteria object.
+     */
+    public function addAsColumn($name, $clause)
+    {
+        $this->asColumns[$name] = $clause;
+        return $this;
+    }
+
+    /**
+     * Get the column aliases.
+     *
+     * @return array An assoc array which map the column alias names
+     * to the alias clauses.
+     */
+    public function getAsColumns()
+    {
+        return $this->asColumns;
+    }
+
+		/**
+     * Returns the column name associated with an alias (AS-column).
+     *
+     * @param string $alias
+     * @return string $string
+     */
+    public function getColumnForAs($as)
+    {
+		if (isset($this->asColumns[$as])) {
+		    return $this->asColumns[$as];
+		}
+    }
+	
+    /**
+     * Allows one to specify an alias for a table that can
+     * be used in various parts of the SQL.
+     *
+     * @param string $alias
+     * @param string $table
+     * @return void
+     */
+    public function addAlias($alias, $table)
+    {
+        if ($this->aliases === null) {
+            $this->aliases = array();
+        }
+        $this->aliases[$alias] = $table;
+    }
+
+    /**
+     * Returns the table name associated with an alias.
+     *
+     * @param string $alias
+     * @return string $string
+     */
+    public function getTableForAlias($alias)
+    {
+        if (isset($this->aliases[$alias])) {
+            return $this->aliases[$alias];
+        }
+    }
+    
+    /**
+     * Get the keys for the criteria map.
+     * @return array
+     */
+    public function keys()
+    {
+        return array_keys($this->map);
+    }
+    
+    /**
+     * Does this Criteria object contain the specified key?
+     *
+     * @param string $column [table.]column
+     * @return boolean True if this Criteria object contain the specified key.
+     */
+    public function containsKey($column)
+    {
+        // must use array_key_exists() because the key could
+        // exist but have a NULL value (that'd be valid).
+        return array_key_exists($column, $this->map);
+    }
+
+    /**
+     * Will force the sql represented by this criteria to be executed within
+     * a transaction.  This is here primarily to support the oid type in
+     * postgresql.  Though it can be used to require any single sql statement
+     * to use a transaction.
+     * @return void
+     */
+    public function setUseTransaction($v)
+    {
+        $this->useTransaction = (boolean) $v;
+    }
+
+    /**
+     * called by BasePeer to determine whether the sql command specified by
+     * this criteria must be wrapped in a transaction.
+     *
+     * @return a <code>boolean</code> value
+     */
+    public function isUseTransaction()
+    {
+        return $this->useTransaction;
+    }
+
+    /**
+     * Method to return criteria related to columns in a table.
+     *
+		 * @param string $column Column name.
+     * @return A Criterion or null if $column is invalid.
+     */
+    public function getCriterion($column)
+    {
+			if (isset($this->map[$column])) {
+		    return $this->map[$column];
+			}
+    }
+
+    /**
+     * Method to return criterion that is not added automatically
+     * to this Criteria.  This can be used to chain the
+     * Criterions to form a more complex where clause.
+     *
+     * @param column String full name of column (for example TABLE.COLUMN).
+     * @param mixed $value
+     * @param string $comparison
+     * @return A Criterion.
+     */
+    public function getNewCriterion($column, $value, $comparison = null)
+    {
+        return new Criterion($this, $column, $value, $comparison);
+    }
+
+    /**
+     * Method to return a String table name.
+     *
+     * @param name A String with the name of the key.
+     * @return A String with the value of the object at key.
+     */
+    public function getColumnName($name)
+    {
+        $c = isset($this->map[$name]) ? $this->map[$name] : null;
+        $val = null;
+        if ($c !== null) {
+            $val = $c->getColumn();
+        }
+        return $val;
+    }
+
+    /**
+     * Shortcut method to get an array of columns indexed by table.
+     * @return array array(table => array(table.column1, table.column2))
+     */
+    function getTablesColumns()
+    {
+        $tables = array();
+        $keys = array_keys($this->map);
+        foreach($keys as $key) {
+            $t = substr($key, 0, strpos($key, '.'));
+            // this happens automatically, so if no notices
+            // are raised, then leave it out:
+            // if (!isset($tables[$t])) $tables[$t] = array();
+            $tables[$t][] = $key;
+        }
+        return $tables;
+    }
+    
+    /**
+     * Method to return a comparison String.
+     *
+     * @param string $key String name of the key.
+     * @return string A String with the value of the object at key.
+     */
+    public function getComparison($key)
+    {
+        $c = isset($this->map[$key]) ? $this->map[$key] : null;
+        $val = null;
+        if ($c !== null) {
+            $val = $c->getComparison();
+        }
+        return $val;
+    }
+    
+    /**
+     * Get the Database(Map) name.
+     *
+     * @return string A String with the Database(Map) name.
+     */
+    public function getDbName()
+    {
+        return $this->dbName;
+    }
+
+    /**
+     * Set the DatabaseMap name.  If <code>null</code> is supplied, uses value
+     * provided by <code>Propel::getDefaultDB()</code>.
+     *
+     * @param $dbName A String with the Database(Map) name.
+     * @return void
+     */
+    public function setDbName($dbName = null)
+    {
+        $this->dbName = ($dbName === null ? Propel::getDefaultDB() : $dbName);
+    }
+
+    /**
+     * Method to return a String table name.
+     *
+     * @param $name A String with the name of the key.
+     * @return string A String with the value of table for criterion at key.
+     */
+    public function getTableName($name)
+    {
+        $c = isset($this->map[$name]) ? $this->map[$name] : null;
+        $val = null;
+        if ($c !== null) {
+            $val = $c->getTable();
+        }
+        return $val;
+    }
+
+    /**
+     * Method to return the value that was added to Criteria.
+     *
+     * @param string $name A String with the name of the key.
+     * @return mixed The value of object at key.
+     */
+    public function getValue($name)
+    {
+        $c = isset($this->map[$name]) ? $this->map[$name] : null;
+        $val = null;
+        if ($c !== null) {
+            $val = $c->getValue();
+        }
+        return $val;
+    }     
+
+    /**
+     * An alias to getValue() -- exposing a Hashtable-like interface.
+     *
+     * @param string $key An Object.
+     * @return mixed The value within the Criterion (not the Criterion object).
+     */
+    public function get($key)
+    {
+        return $this->getValue($key);
+    }
+
+    /**
+     * Overrides Hashtable put, so that this object is returned
+     * instead of the value previously in the Criteria object.
+     * The reason is so that it more closely matches the behavior
+     * of the add() methods. If you want to get the previous value
+     * then you should first Criteria.get() it yourself. Note, if
+     * you attempt to pass in an Object that is not a String, it will
+     * throw a NPE. The reason for this is that none of the add()
+     * methods support adding anything other than a String as a key.
+     *
+     * @param string $key
+     * @param mixed $value
+     * @return Instance of self.
+     */
+    public function put($key, $value)
+    {        
+        return $this->add($key, $value);
+    }
+
+    /**
+     * Copies all of the mappings from the specified Map to this Criteria
+     * These mappings will replace any mappings that this Criteria had for any
+     * of the keys currently in the specified Map.
+     *
+     * if the map was another Criteria, its attributes are copied to this
+     * Criteria, overwriting previous settings.
+     *
+     * @param mixed $t Mappings to be stored in this map.
+     */
+    public function putAll($t)
+    {
+    
+        if (is_array($t)) {
+        
+            $keys = array_keys($t);
+            foreach ($keys as $key) {
+                $val = $t[$key];
+                if ($val instanceof Criterion) {
+                    $this->map[$key] = $val;
+                } else {
+                    // put throws an exception ... right?
+                    // otherwise there's no difference ... not sure why this is here
+                    // %%%
+                    $this->put($key, $val);
+                }
+            }
+            
+        } elseif ($t instanceof Criteria) {
+            $this->joins = $t->joins;
+        }       
+    }
+
+
+    /**
+     * This method adds a new criterion to the list of criterias.
+     * If a criterion for the requested column already exists, it is
+     * replaced. If is used as follow:
+     *
+     * <p>
+     * <code>
+     * $crit = new Criteria();
+     * $crit->add(&quot;column&quot;,
+     *                                      &quot;value&quot;
+     *                                      &quot;Criteria::GREATER_THAN&quot;);
+     * </code>
+     *
+     * Any comparison can be used.
+     *
+     * The name of the table must be used implicitly in the column name,
+     * so the Column name must be something like 'TABLE.id'. If you
+     * don't like this, you can use the add(table, column, value) method.
+     *
+     * @param string $critOrColumn The column to run the comparison on, or Criterion object.
+     * @param mixed $value
+     * @param string $comparison A String.
+     *
+     * @return A modified Criteria object.
+     */
+    public function add($p1, $value = null, $comparison = null)
+    {
+        if ($p1 instanceof Criterion) {
+            $c = $p1;
+            $this->map[$c->getTable() . '.' . $c->getColumn()] = $c;
+        } else {
+            $column = $p1;
+            $this->map[$column] = new Criterion($this, $column, $value, $comparison);
+        }        
+        return $this;
+    }
+
+    /**
+     * This is the way that you should add a straight (inner) join of two tables.  For
+     * example:
+     *
+     * <p>
+     * AND PROJECT.PROJECT_ID=FOO.PROJECT_ID
+     * <p>
+     *
+     * left = PROJECT.PROJECT_ID
+     * right = FOO.PROJECT_ID
+     *
+     * @param string $left A String with the left side of the join.
+     * @param string $right A String with the right side of the join.
+		 * @param string $operator A String with the join operator e.g. LEFT JOIN, ...
+     * @return Criteria A modified Criteria object.
+     */
+    public function addJoin($left, $right, $operator = null)
+    {
+        $this->joins [] = new Join($left, $right, $operator);
+
+        return $this;
+    }
+	
+    /**
+     * Get the array of Joins.  This method is meant to
+     * be called by BasePeer.
+     * @return an array which contains objects of type Join,
+     *         or an empty array if the criteria does not contains any joins
+     */
+    function & getJoins()
+    {
+        return $this->joins;
+    }
+    
+    /**
+     * get one side of the set of possible joins.  This method is meant to
+     * be called by BasePeer.
+     * @return array
+     * @deprecated This method is no longer used by BasePeer.
+     */
+    public function getJoinL()
+    {
+        throw new PropelException("getJoinL() in Criteria is no longer supported!");
+    }
+
+    /**
+     * get one side of the set of possible joins.  This method is meant to
+     * be called by BasePeer.
+     * @return array
+		 * @deprecated This method is no longer used by BasePeer.
+     */
+    public function getJoinR()
+    {
+        throw new PropelException("getJoinL() in Criteria is no longer supported!");
+    }    
+    
+    /**
+     * Adds "ALL " to the SQL statement.
+     * @return void
+     */
+    public function setAll()
+    {
+        $this->selectModifiers[] = self::ALL;
+    }
+
+    /**
+     * Adds "DISTINCT " to the SQL statement.
+     * @return void
+     */
+    public function setDistinct()
+    {
+        $this->selectModifiers[] = self::DISTINCT;
+    }
+
+    /**
+     * Sets ignore case.
+     *
+     * @param boolean $b True if case should be ignored.
+     * @return A modified Criteria object.
+     */
+    public function setIgnoreCase($b)
+    {
+        $this->ignoreCase = (boolean) $b;
+        return $this;
+    }
+
+    /**
+     * Is ignore case on or off?
+     *
+     * @return boolean True if case is ignored.
+     */
+    public function isIgnoreCase()
+    {
+        return $this->ignoreCase;
+    }
+
+    /**
+     * Set single record?  Set this to <code>true</code> if you expect the query
+     * to result in only a single result record (the default behaviour is to
+     * throw a PropelException if multiple records are returned when the query
+     * is executed).  This should be used in situations where returning multiple
+     * rows would indicate an error of some sort.  If your query might return
+     * multiple records but you are only interested in the first one then you
+     * should be using setLimit(1).
+     *
+     * @param b set to <code>true</code> if you expect the query to select just
+     * one record.
+     * @return A modified Criteria object.
+     */
+    public function setSingleRecord($b)
+    {
+        $this->singleRecord = (boolean) $b;
+        return $this;
+    }
+
+    /**
+     * Is single record?
+     *
+     * @return boolean True if a single record is being returned.
+     */
+    public function isSingleRecord()
+    {
+        return $this->singleRecord;
+    }
+    
+    /**
+     * Set limit.
+     *
+     * @param limit An int with the value for limit.
+     * @return A modified Criteria object.
+     */
+    public function setLimit($limit)
+    {
+        $this->limit = $limit;
+        return $this;
+    }
+
+    /**
+     * Get limit.
+     *
+     * @return int An int with the value for limit.
+     */
+    public function getLimit()
+    {
+        return $this->limit;
+    }
+
+    /**
+     * Set offset.
+     *
+     * @param int $offset An int with the value for offset.
+     * @return A modified Criteria object.
+     */
+    public function setOffset($offset)
+    {
+        $this->offset = $offset;
+        return $this;
+    }
+
+    /**
+     * Get offset.
+     *
+     * @return An int with the value for offset.
+     */
+    public function getOffset()
+    {
+        return $this->offset;
+    }
+
+    /**
+     * Add select column.
+     *
+     * @param name A String with the name of the select column.
+     * @return A modified Criteria object.
+     */
+    public function addSelectColumn($name)
+    {
+        $this->selectColumns[] = $name;
+        return $this;
+    }
+
+    /**
+     * Get select columns.
+     *
+     * @return array An array with the name of the select
+     * columns.
+     */
+    public function getSelectColumns()
+    {
+        return $this->selectColumns;
+    }
+    
+    /**
+     * Clears current select columns.
+     * 
+     * @return Criteria A modified Criteria object.
+     */
+    public function clearSelectColumns() {
+				$this->selectColumns = array();
+				$this->asColumns = array();
+        return $this;
+    }
+
+    /**
+     * Get select modifiers.
+     *
+     * @return An array with the select modifiers.
+     */
+    public function getSelectModifiers()
+    {
+        return $this->selectModifiers;
+    }
+    
+    /**
+     * Add group by column name.
+     *
+     * @param string $groupBy The name of the column to group by.
+     * @return A modified Criteria object.
+     */
+    public function addGroupByColumn($groupBy)
+    {
+        $this->groupByColumns[] = $groupBy;
+        return $this;
+    }
+
+    /**
+     * Add order by column name, explicitly specifying ascending.
+     *
+     * @param name The name of the column to order by.
+     * @return A modified Criteria object.
+     */
+    public function addAscendingOrderByColumn($name)
+    {
+        $this->orderByColumns[] = $name . ' ' . self::ASC;
+        return $this;
+    }
+
+    /**
+     * Add order by column name, explicitly specifying descending.
+     *
+     * @param string $name The name of the column to order by.
+     * @return Criteria The modified Criteria object.
+     */
+    public function addDescendingOrderByColumn($name)
+    {
+        $this->orderByColumns[] = $name . ' ' . self::DESC;
+        return $this;
+    }
+
+    /**
+     * Get order by columns.
+     *
+     * @return array An array with the name of the order columns.
+     */
+    public function getOrderByColumns()
+    {
+        return $this->orderByColumns;
+    }
+    
+    /**
+     * Clear the order-by columns.
+     * 
+     * @return Criteria 
+     */
+    public function clearOrderByColumns()
+    {
+        $this->orderByColumns = array();
+        return $this;
+    }
+    
+    /**
+     * Clear the group-by columns.
+     * 
+     * @return Criteria 
+     */
+    public function clearGroupByColumns()
+    {
+        $this->groupByColumns = array();
+        return $this;
+    }
+    
+    /**
+     * Get group by columns.
+     *
+     * @return array
+     */
+    public function getGroupByColumns()
+    {
+        return $this->groupByColumns;
+    }
+
+    /**
+     * Get Having Criterion.
+     *
+     * @return Criterion A Criterion object that is the having clause.
+     */
+    public function getHaving()
+    {
+        return $this->having;
+    }
+
+    /**
+     * Remove an object from the criteria.
+     *
+     * @param string $key A string with the key to be removed.
+     * @return mixed The removed value.
+     */
+    public function remove($key)
+    {
+        $c = isset($this->map[$key]) ? $this->map[$key] : null;
+        unset($this->map[$key]);
+        if ($c instanceof Criterion) {
+            return $c->getValue();
+        }
+        return $c;
+    }
+
+    /**
+     * Build a string representation of the Criteria.
+     *
+     * @return string A String with the representation of the Criteria.
+     */
+    public function toString()
+    {
+        $sb = "Criteria:: ";        
+
+        try {
+            
+            $sb .= "\nCurrent Query SQL (may not be complete or applicable): "
+              . BasePeer::createSelectSql($this, $params=array());
+             
+            $sb .= "\nParameters to replace: " . var_export($params, true);
+ 
+        } catch (Exception $exc) {
+            $sb .= "(Error: " . $exc->getMessage() . ")";
+        }
+
+        return $sb;
+    }
+
+    /**
+     * Returns the size (count) of this criteria.
+     * @return int
+     */
+    public function size()
+    {
+        return count($this->map);
+    }
+    
+    /**
+     * This method checks another Criteria to see if they contain
+     * the same attributes and hashtable entries.
+     * @return boolean
+     */
+    public function equals($crit)
+    {
+        $isEquiv = false;
+        if ($crit === null || !($crit instanceof Criteria)) {
+            $isEquiv = false;
+        } elseif ($this === $crit) {
+            $isEquiv = true;
+        } elseif ($this->size() === $crit->size()) {
+            
+            // Important: nested criterion objects are checked
+            
+            $criteria = $crit; // alias
+            if ($this->offset === $criteria->getOffset()
+                && $this->limit === $criteria->getLimit()
+                && $this->ignoreCase === $criteria->isIgnoreCase()
+                && $this->singleRecord === $criteria->isSingleRecord()
+                && $this->dbName === $criteria->getDbName()
+                && $this->selectModifiers === $criteria->getSelectModifiers()
+                && $this->selectColumns === $criteria->getSelectColumns()
+                && $this->orderByColumns === $criteria->getOrderByColumns()
+               )
+            {
+                $isEquiv = true;
+                foreach($criteria->keys() as $key) {
+                    if ($this->containsKey($key)) {
+                        $a = $this->getCriterion($key);
+                        $b = $criteria->getCriterion($key);
+                        if (!$a->equals($b)) {
+                            $isEquiv = false;
+                            break;
+                        }
+                    } else {
+                        $isEquiv = false;
+                        break;
+                    }
+                }
+            }
+        }
+        return $isEquiv;
+    }
+
+    /**
+     * This method adds a prepared Criterion object to the Criteria as a having clause.
+     * You can get a new, empty Criterion object with the
+     * getNewCriterion() method.
+     *
+     * <p>
+     * <code>
+     * $crit = new Criteria();
+     * $c = $crit->getNewCriterion(BasePeer::ID, 5, Criteria::LESS_THAN);
+     * $crit->addHaving($c);
+     * </code>
+     *
+     * @param having A Criterion object
+     *
+     * @return A modified Criteria object.
+     */
+    public function addHaving(Criterion $having)
+    {
+        $this->having = $having;
+        return $this;
+    }
+
+    /**
+     * This method adds a new criterion to the list of criterias.
+     * If a criterion for the requested column already exists, it is
+     * "AND"ed to the existing criterion.
+      *
+     * addAnd(column, value, comparison)
+     * <code>
+     * $crit = $orig_crit->addAnd(&quot;column&quot;,
+     *                                      &quot;value&quot;
+     *                                      &quot;Criterion::GREATER_THAN&quot;);
+     * </code>
+     *
+     * addAnd(column, value)
+     * <code>
+     * $crit = $orig_crit->addAnd(&quot;column&quot;, &quot;value&quot;);
+     * </code>
+     *
+     * addAnd(Criterion)
+     * <code>
+     * $crit = new Criteria();
+     * $c = $crit->getNewCriterion(BasePeer::ID, 5, Criteria::LESS_THAN);
+     * $crit->addAnd($c);
+     * </code>
+     *
+     * Any comparison can be used, of course.
+     *
+     *
+     * @return Criteria A modified Criteria object.
+     */
+    public function addAnd($p1, $p2 = null, $p3 = null)
+    {        
+        if ($p3 !== null) {            
+            // addAnd(column, value, comparison)
+            $oc = $this->getCriterion($p1);
+            $nc = new Criterion($this, $p1, $p2, $p3);
+            if ($oc === null) {
+                $this->map[$p1] = $nc;
+            } else {
+                $oc->addAnd($nc);
+            }
+        } elseif ($p2 !== null) {
+            // addAnd(column, value)
+            $this->addAnd($p1, $p2, self::EQUAL);
+        } elseif ($p1 instanceof Criterion) {
+            // addAnd(Criterion)
+            $c = $p1;
+            $oc = $this->getCriterion($c->getTable() . '.' . $c->getColumn());
+            if ($oc === null) {
+                $this->add($c);
+            } else {
+                $oc->addAnd($c);
+            }
+        } elseif ($p2 === null && $p3 === null) {
+            // client has not specified $p3 (comparison)
+            // which means Criteria::EQUAL but has also specified $p2 == null 
+            // which is a valid combination we should handle by creating "IS NULL"
+            $this->addAnd($p1, $p2, self::EQUAL);
+        }                                    
+        return $this;
+    }
+    
+    /**
+     * This method adds a new criterion to the list of criterias.
+     * If a criterion for the requested column already exists, it is
+     * "OR"ed to the existing criterion.
+     * 
+     * Any comparison can be used.
+     *
+     * Supports a number of different signatures:
+     * 
+     * addOr(column, value, comparison)
+     * <code>
+     * $crit = $orig_crit->addOr(&quot;column&quot;,
+     *                                      &quot;value&quot;
+     *                                      &quot;Criterion::GREATER_THAN&quot;);
+     * </code>
+     *
+     * addOr(column, value)
+     * <code>
+     * $crit = $orig_crit->addOr(&quot;column&quot;, &quot;value&quot;);
+     * </code>
+     * 
+     * addOr(Criterion)
+     * 
+     * @return Criteria A modified Criteria object.
+     */
+    public function addOr($p1, $p2 = null, $p3 = null)
+    {
+        if ($p3 !== null) {            
+            // addOr(column, value, comparison)
+            $oc = $this->getCriterion($p1);
+            $nc = new Criterion($this, $p1, $p2, $p3);
+            if ($oc === null) {
+                $this->map[$p1] = $nc;
+            } else {
+                $oc->addOr($nc);
+            }                        
+        } elseif ($p2 !== null) {
+            // addOr(column, value)
+            $this->addOr($p1, $p2, self::EQUAL);
+        } elseif ($p1 instanceof Criterion) {
+            // addOr(Criterion)
+            $c = $p1;
+            $oc = $this->getCriterion($c->getTable() . '.' . $c->getColumn());
+            if ($oc === null) {
+                $this->add($c);
+            } else {
+                $oc->addOr($c);
+            }
+        } elseif ($p2 === null && $p3 === null) {
+            // client has not specified $p3 (comparison)
+            // which means Criteria::EQUAL but has also specified $p2 == null 
+            // which is a valid combination we should handle by creating "IS NULL"
+            $this->addOr($p1, $p2, self::EQUAL);
+        }
+                                    
+        return $this;
+    }   
+}
+
+// --------------------------------------------------------------------
+// Criterion Iterator class -- allows foreach($criteria as $criterion)
+// --------------------------------------------------------------------
+
+/**
+ * Class that implements SPL Iterator interface.  This allows foreach() to 
+ * be used w/ Criteria objects.  Probably there is no performance advantage
+ * to doing it this way, but it makes sense -- and simpler code.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.util
+ */
+class CriterionIterator implements Iterator {
+
+    private $idx = 0;
+    private $criteria;
+    private $criteriaKeys;
+    private $criteriaSize;
+    
+    public function __construct($criteria) {
+        $this->criteria = $criteria;
+        $this->criteriaKeys = $criteria->keys();
+        $this->criteriaSize = count($this->criteriaKeys);
+    }
+
+    public function rewind() {
+        $this->idx = 0;
+    }
+    
+    public function valid() {
+        return $this->idx < $this->criteriaSize;
+    }
+    
+    public function key() {
+        return $this->criteriaKeys[$this->idx];
+    }
+    
+    public function current() {
+        return $this->criteria->getCriterion($this->criteriaKeys[$this->idx]);
+    }
+    
+    public function next() {
+        $this->idx++;
+    }
+
+}
+
+// --------------------------------------------------------------------
+// Criterion "inner" class
+// --------------------------------------------------------------------
+
+/**
+ * This is an "inner" class that describes an object in the criteria.
+ *
+ * In Torque this is an inner class of the Criteria class.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @package propel.util
+ */
+class Criterion  {
+
+    const UND = " AND ";
+    const ODER = " OR ";
+
+    /** Value of the CO. */
+    private $value;
+
+    /** Comparison value. 
+     * @var SqlEnum
+     */
+    private $comparison;
+
+    /** Table name. */
+    private $table;
+    
+    /** Real table name */
+    private $realtable;
+
+    /** Column name. */
+    private $column;
+
+    /** flag to ignore case in comparision */
+    private $ignoreStringCase = false;
+
+    /**
+     * The DBAdaptor which might be used to get db specific
+     * variations of sql.
+     */
+    private $db;
+
+    /**
+     * other connected criteria and their conjunctions.
+     */
+    private $clauses = array();
+    private $conjunctions = array();
+
+    /** "Parent" Criteria class */
+    private $parent;
+    
+    /**
+     * Create a new instance.
+     *
+     * @param Criteria $parent The outer class (this is an "inner" class).
+     * @param string $column TABLE.COLUMN format.
+     * @param mixed $value
+     * @param string $comparison
+     */
+    public function __construct(Criteria $outer, $column, $value, $comparison = null)
+    {              
+        list($this->table, $this->column) = explode('.', $column);        
+        $this->value = $value;
+        $this->comparison = ($comparison === null ? Criteria::EQUAL : $comparison);
+        $this->init($outer);
+    }
+        
+    /**
+    * Init some properties with the help of outer class
+    * @param Criteria $criteria The outer class
+    */
+    public function init(Criteria $criteria)
+    {
+        //init $this->db
+        try {
+            $db = Propel::getDB($criteria->getDbName());
+            $this->setDB($db);
+        } catch (Exception $e) {
+            // we are only doing this to allow easier debugging, so
+            // no need to throw up the exception, just make note of it.
+            Propel::log("Could not get a DBAdapter, so sql may be wrong", Propel::LOG_ERR);
+        }
+        
+        //init $this->realtable
+        $realtable = $criteria->getTableForAlias($this->table);
+        if(!$realtable) $realtable = $this->table;
+        $this->realtable = $realtable;                
+        
+    }
+    
+    /**
+     * Get the column name.
+     *
+     * @return string A String with the column name.
+     */
+    public function getColumn()
+    {
+        return $this->column;
+    }
+
+    /**
+     * Set the table name.
+     *
+     * @param name A String with the table name.
+     * @return void
+     */
+    public function setTable($name)
+    {
+        $this->table = $name;
+    }
+
+    /**
+     * Get the table name.
+     *
+     * @return string A String with the table name.
+     */
+    public function getTable()
+    {
+        return $this->table;
+    }
+
+    /**
+     * Get the comparison.
+     *
+     * @return string A String with the comparison.
+     */
+    public function getComparison()
+    {
+        return $this->comparison;
+    }
+
+    /**
+     * Get the value.
+     *
+     * @return mixed An Object with the value.
+     */
+    public function getValue()
+    {
+        return $this->value;
+    }
+
+    /**
+     * Get the value of db.
+     * The DBAdapter which might be used to get db specific
+     * variations of sql.
+     * @return DBAdapter value of db.
+     */
+    public function getDB()
+    {
+        return $this->db;
+    }
+
+    /**
+     * Set the value of db.
+     * The DBAdapter might be used to get db specific variations of sql.
+     * @param DBAdapter $v Value to assign to db.
+     * @return void
+     */
+    public function setDB(DBAdapter $v)
+    {
+        $this->db = $v;
+        for($i=0, $_i=count($this->clauses); $i < $_i; $i++) {
+            $this->clauses[$i]->setDB($v);
+        }
+    }
+
+    /**
+     * Sets ignore case.
+     *
+     * @param boolean $b True if case should be ignored.
+     * @return Criterion A modified Criterion object.
+     */
+    public function setIgnoreCase($b)
+    {
+        $this->ignoreStringCase = $b;
+        return $this;
+    }
+
+    /**
+     * Is ignore case on or off?
+     *
+     * @return boolean True if case is ignored.
+     */
+     public function isIgnoreCase()
+     {
+         return $this->ignoreStringCase;
+     }
+
+    /**
+     * Get the list of clauses in this Criterion.
+     * @return array
+     */
+    private function getClauses()
+    {
+        return $this->clauses;
+    }
+
+    /**
+     * Get the list of conjunctions in this Criterion
+     * @return array
+     */
+    private function getConjunctions()
+    {
+        return $this->conjunctions;
+    }
+
+    /**
+     * Append an AND Criterion onto this Criterion's list.
+     */
+    public function addAnd(Criterion $criterion)
+    {
+        $this->clauses[] = $criterion;
+        $this->conjunctions[] = self::UND;
+        return $this;
+    }
+
+    /**
+     * Append an OR Criterion onto this Criterion's list.
+     * @return Criterion
+     */
+    public function addOr(Criterion $criterion)
+    {
+        $this->clauses[] = $criterion;
+        $this->conjunctions[] = self::ODER;
+        return $this;
+    }    
+
+    /**
+     * Appends a Prepared Statement representation of the Criterion
+     * onto the buffer.
+     *
+     * @param string &$sb The stringbuffer that will receive the Prepared Statement
+     * @param array $params A list to which Prepared Statement parameters
+     * will be appended
+     * @return void
+     * @throws PropelException - if the expression builder cannot figure out how to turn a specified 
+     *                           expression into proper SQL.
+     */
+    public function appendPsTo(&$sb, &$params)
+    {
+        if ($this->column === null) {
+            return;
+        }
+
+        $db = $this->getDb();
+        $clausesLength = count($this->clauses);
+        for($j = 0; $j < $clausesLength; $j++) {
+            $sb .= '(';
+        }
+        
+        if (Criteria::CUSTOM === $this->comparison) {
+            if ($this->value !== "") {
+                $sb .= (string) $this->value;
+            }
+        } else {
+        
+            if  ($this->table === null) {
+                $field = $this->column;
+            } else {
+                $field = $this->table . '.' . $this->column;
+            }
+
+            // Check to see if table is an alias & store real name, if so
+            // (real table name is needed for the returned $params array)
+            $realtable = $this->realtable;
+            
+            // There are several different types of expressions that need individual handling:
+            // IN/NOT IN, LIKE/NOT LIKE, and traditional expressions.
+            
+            // OPTION 1:  table.column IN (?, ?) or table.column NOT IN (?, ?)
+            if ($this->comparison === Criteria::IN || $this->comparison === Criteria::NOT_IN) {
+			
+				$values = (array) $this->value;
+				$valuesLength = count($values);
+				if ($valuesLength == 0) {
+				    // a SQL error will result if we have COLUMN IN (), so replace it with an expression
+				    // that will always evaluate to FALSE for Criteria::IN and TRUE for Criteria::NOT_IN
+					$sb .= ($this->comparison === Criteria::IN) ? "1<>1" : "1=1";
+				} else {
+					$sb .= $field . $this->comparison;
+	                for ($i=0; $i < $valuesLength; $i++) {
+	                    $params[] = array('table' => $realtable, 'column' => $this->column, 'value' => $values[$i]);
+	                }
+	                $inString = '(' . substr(str_repeat("?,", $valuesLength), 0, -1) . ')';
+	                $sb .= $inString;
+				}
+            
+            // OPTION 2:  table.column LIKE ? or table.column NOT LIKE ?  (or ILIKE for Postgres)
+            } elseif ($this->comparison === Criteria::LIKE || $this->comparison === Criteria::NOT_LIKE 
+                || $this->comparison === Criteria::ILIKE || $this->comparison === Criteria::NOT_ILIKE) {
+                // Handle LIKE, NOT LIKE (and related ILIKE, NOT ILIKE for Postgres)
+                
+                // If selection is case insensitive use ILIKE for PostgreSQL or SQL 
+                // UPPER() function on column name for other databases.
+                if ($this->ignoreStringCase) {
+                    include_once 'propel/adapter/DBPostgres.php'; // for instanceof, since is_a() is not E_STRICT
+                    if ($db instanceof DBPostgres) { // use is_a() because instanceof needs class to have been loaded
+                        if ($this->comparison === Criteria::LIKE) {
+                            $this->comparison = Criteria::ILIKE; 
+                        } elseif ($this->comparison === Criteria::NOT_LIKE) {
+                            $this->comparison = Criteria::NOT_ILIKE; 
+                          }
+                    } else {
+                        $field = $db->ignoreCase($field);
+                    }
+                }
+                
+                $sb .= $field . $this->comparison;
+        
+                // If selection is case insensitive use SQL UPPER() function
+                // on criteria or, if Postgres we are using ILIKE, so not necessary.
+                if ($this->ignoreStringCase && !($db instanceof DBPostgres)) {
+                    $sb .= $db->ignoreCase('?');
+                } else {
+                    $sb .= '?';
+                }
+                
+                $params[] = array('table' => $realtable, 'column' => $this->column, 'value' => $this->value);
+            
+            // OPTION 3:  table.column = ? or table.column >= ? etc. (traditional expressions, the default)
+            } else {            
+            
+                // NULL VALUES need special treatment because the SQL syntax is different
+                // i.e. table.column IS NULL rather than table.column = null
+                if ($this->value !== null) {
+                
+                    // ANSI SQL functions get inserted right into SQL (not escaped, etc.)                    
+                    if ($this->value === Criteria::CURRENT_DATE || $this->value === Criteria::CURRENT_TIME || $this->value === Criteria::CURRENT_TIMESTAMP) {
+                        $sb .= $field . $this->comparison . $this->value;
+                    } else {
+                        // default case, it is a normal col = value expression; value
+                        // will be replaced w/ '?' and will be inserted later using native Creole functions
+                        if ($this->ignoreStringCase) {
+                            $sb .= $db->ignoreCase($field) . $this->comparison . $db->ignoreCase("?");
+                        } else {
+                            $sb .= $field . $this->comparison . "?";
+                        }
+                        // need to track the field in params, because
+                        // we'll need it to determine the correct setter
+                        // method later on (e.g. field 'review.DATE' => setDate());
+                        $params[] = array('table' => $realtable, 'column' => $this->column, 'value' => $this->value);                        
+                    }
+                } else {
+                    
+                    // value is null, which means it was either not specified or specifically
+                    // set to null.                    
+                    if ($this->comparison === Criteria::EQUAL || $this->comparison === Criteria::ISNULL) {
+                        $sb .= $field . Criteria::ISNULL;
+                    } elseif ($this->comparison === Criteria::NOT_EQUAL || $this->comparison === Criteria::ISNOTNULL) {
+                        $sb .= $field . Criteria::ISNOTNULL;
+                    } else {
+                        // for now throw an exception, because not sure how to interpret this
+                        throw new PropelException("Could not build SQL for expression: $field " . $this->comparison . " NULL");
+                    }
+                                        
+                }
+                
+            }
+        }
+        
+        for($i=0; $i < $clausesLength; $i++) {
+            $sb .= $this->conjunctions[$i];
+            $this->clauses[$i]->appendPsTo($sb, $params);
+            $sb .= ')';
+        }
+    }
+
+    /**
+     * This method checks another Criteria to see if they contain
+     * the same attributes and hashtable entries.
+     * @return boolean
+     */
+    public function equals($obj)
+    {
+        if ($this === $obj) {
+            return true;
+        }
+
+        if (($obj === null) || !($obj instanceof Criterion)) {
+            return false;
+        }
+
+        $crit = $obj;
+
+        $isEquiv = ( ( ($this->table === null && $crit->getTable() === null)
+            || ( $this->table !== null && $this->table === $crit->getTable() )
+                          )
+            && $this->column === $crit->getColumn()
+            && $this->comparison === $crit->getComparison());
+
+        // check chained criterion
+        
+        $clausesLength = count($this->clauses);
+        $isEquiv &= (count($crit->getClauses()) == $clausesLength);
+        $critConjunctions = $crit->getConjunctions();
+        $critClauses = $crit->getClauses();
+        for ($i=0; $i < $clausesLength && $isEquiv; $i++) {
+            $isEquiv &= ($this->conjunctions[$i] === $critConjunctions[$i]);
+            $isEquiv &= ($this->clauses[$i] === $critClauses[$i]);
+        }
+        
+		if ($isEquiv) {
+		    $isEquiv &= $this->value === $crit->getValue();
+		}
+		
+        return $isEquiv;
+    }
+
+    /**
+     * Returns a hash code value for the object.
+     */
+    public function hashCode()
+    {
+        $h = crc32(serialize($this->value)) ^ crc32($this->comparison);
+
+        if ($this->table !== null) {
+            $h ^= crc32($this->table);
+        }
+
+        if ($this->column !== null) {
+            $h ^= crc32($this->column);
+        }
+        
+        $clausesLength = count($this->clauses);
+        for($i=0; $i < $clausesLength; $i++) {
+            $this->clauses[$i]->appendPsTo($sb="", $params=array());
+            $h ^= crc32(serialize(array($sb, $params)));
+        }
+
+        return $h;
+    }
+
+    /**
+     * Get all tables from nested criterion objects
+     * @return array
+     */
+    public function getAllTables()
+    {
+        $tables = array();
+        $this->addCriterionTable($this, $tables);
+        return $tables;
+    }
+
+    /**
+     * method supporting recursion through all criterions to give
+     * us a string array of tables from each criterion
+     * @return void
+     */
+    private function addCriterionTable(Criterion $c, &$s)
+    {
+        $s[] = $c->getTable();
+        $clauses = $c->getClauses();
+        $clausesLength = count($clauses);
+        for($i = 0; $i < $clausesLength; $i++) {
+            $this->addCriterionTable($clauses[$i], $s);
+        }        
+    }
+
+    /**
+     * get an array of all criterion attached to this
+     * recursing through all sub criterion
+     * @return array Criterion[]
+     */
+    public function getAttachedCriterion()
+    {
+        $crits = array();
+        $this->traverseCriterion($this, $crits);
+        return $crits;        
+    }
+
+    /**
+     * method supporting recursion through all criterions to give
+     * us an array of them
+     * @param Criterion $c
+     * @param array &$a
+     * @return void
+     */
+    private function traverseCriterion(Criterion $c, &$a)
+    {        
+        $a[] = $c;
+        $clauses = $c->getClauses();
+        $clausesLength = count($clauses);
+        for($i=0; $i < $clausesLength; $i++) {
+            $this->traverseCriterion($clauses[$i], $a);
+        }        
+    }
+}
+
+/**
+* Data object to describe a join between two tables, for example
+* <pre>
+* table_a LEFT JOIN table_b ON table_a.id = table_b.a_id
+* </pre>
+*/
+class Join
+{
+    /** the left column of the join condition */
+    private $leftColumn = null;
+
+    /** the right column of the join condition */
+    private $rightColumn = null;
+
+    /** the type of the join (LEFT JOIN, ...), or null */
+    private $joinType = null;
+
+    /**
+     * Constructor
+     * @param leftColumn the left column of the join condition;
+     *        might contain an alias name
+     * @param rightColumn the right column of the join condition
+     *        might contain an alias name
+     * @param joinType the type of the join. Valid join types are
+     *        null (adding the join condition to the where clause),
+     *        Criteria::LEFT_JOIN(), Criteria::RIGHT_JOIN(), and Criteria::INNER_JOIN()
+     */
+    public function __construct($leftColumn, $rightColumn, $joinType = null)
+    {
+	    $this->leftColumn = $leftColumn;
+	    $this->rightColumn = $rightColumn;
+	    $this->joinType = $joinType;
+    }
+
+    /**
+     * @return the type of the join, i.e. Criteria::LEFT_JOIN(), ...,
+     *         or null for adding the join condition to the where Clause
+     */
+    public function getJoinType()
+    {
+	    return $this->joinType;
+    }
+
+    /**
+     * @return the left column of the join condition
+     */
+    public function getLeftColumn()
+    {
+	    return $this->leftColumn;
+    }
+
+		public function getLeftColumnName()
+		{
+			return substr($this->leftColumn, strpos($this->leftColumn, '.') + 1);
+		}
+		
+		public function getLeftTableName()
+		{
+			return substr($this->leftColumn, 0, strpos($this->leftColumn, '.'));
+		}
+		
+    /**
+     * @return the right column of the join condition
+     */
+    public function getRightColumn()
+    {
+	    return $this->rightColumn;
+    }
+		
+		public function getRightColumnName()
+		{
+			return substr($this->rightColumn, strpos($this->rightColumn, '.') + 1);
+		}
+		
+		public function getRightTableName()
+		{
+			return substr($this->rightColumn, 0, strpos($this->rightColumn, '.'));
+		}
+
+    /**
+     * returns a String representation of the class,
+     * mainly for debugging purposes
+     * @return a String representation of the class
+     */
+    public function toString()
+    {
+        $result = "";
+        if ($this->joinType != null)
+        {
+            $result .= $this->joinType . " : ";
+        }
+        $result .= $this->leftColumn . "=" . $this->rightColumn . " (ignoreCase not considered)";
+
+        return $result;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/Criteria.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/PeerInfo.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/PeerInfo.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/PeerInfo.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,190 @@
+<?php
+/*
+ *  $Id: PeerInfo.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+/**
+ * Peer Helper Class
+ *
+ * Handle Dynamic Peer Access. Trying to solve the problems associated
+ * with looking at constants, calling methods on static Peer Objects
+ *
+ * @author   David Giffin <david en giffin.org>
+ * @copyright Copyright (c) 2000-2003 David Giffin : LGPL - See LICENCE
+ * @package  propel.util
+ */
+class PeerInfo
+{
+    /** Propel Object Peers */
+    private static $peers = array();    
+
+    /** Reflection Objects of the Propel Peers */
+    private static $reflections = array();    
+
+    /** Table Maps of the Propel Peers */
+    private static $maps = array();    
+
+
+    /**
+     * Add a Peer to the list of Peers
+     * 
+     * @param string $peer The Propel Peer to add
+     */
+     private static function addPeer($peer)
+     {
+
+
+        $peers = array_keys(self::$peers);
+
+        if (!in_array($peer, $peers)) {
+
+            self::$peers[$peer]       = self::loadPeer($peer);
+            self::$reflections[$peer] = new reflectionClass($peer);
+            self::$maps[$peer]        = null;
+
+        }
+    }  
+
+
+    /**     
+     * Get a constant from the Peer Reflector
+     * 
+     * @param  String The name of the constant
+     * @return String The Constant String
+     */
+        public static function getPeerConstant($peer, $name)
+        {
+        self::addPeer($peer);
+                return self::$reflections[$peer]->getConstant($name);
+        }
+
+
+    /**
+     * Get a Peer from the Peer List
+     *
+     * @param string $peer The Propel Peer to add
+     */
+        public static function getPeer($peer) {
+        self::addPeer($peer);
+                return self::$peers[$peer];
+        }    
+
+
+    /**
+     * Load a Peer
+     *
+     * You may wat to override this method if your Peers
+     * are not in the include_path.
+     *
+     * @param string $peerName the name of the Peer
+     */
+    public static function loadPeer($peerName)
+    {
+        $peerFile = $peerName . ".php";
+        require_once($peerFile);
+        $peerObject = new $peerName();
+        return $peerObject;
+    }
+
+
+    /**
+     * Get a Column Constant from a Peer
+     *
+     * @param string The PhpName or DB_NAME for the constant
+     * @return string the Column Constant
+     */
+    public static function getColumnConstant($peer, $name)
+    {
+        self::addPeer($peer);
+        $map = self::getPeer($peer)->getPhpNameMap();
+        foreach ($map as $phpName => $dbName) {
+            if ($phpName == $name) {
+                return self::getPeerConstant($peer, $dbName);                
+            } else if ($dbName == $name) {
+                return self::getPeerConstant($peer, $dbName);
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * Get the Primary Key for this Peer
+     *
+     * @param string $peer   The name of the Peer
+     * @return string The name of the Primary Key
+     */
+    public static function getPrimaryKey($peer)
+    {
+        self::addPeer($peer);
+        $tableMap = self::getTableMap($peer);
+        $columns = $tableMap->getColumns();
+        foreach ($columns as $columnName => $column) {
+            if ($column->isPrimaryKey()) {
+                return $columnName;
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * Get the Table Map for a Peer
+     *
+     * @param string $peer   The name of the Peer
+     * @return TableMap The table map for this Peer
+     */
+    public static function getTableMap($peer)
+    {        
+        self::addPeer($peer);
+        if (!self::$maps[$peer]) {
+            $tableName = self::getTableName($peer);        
+            $dbMap     = self::getPeer($peer)->getMapBuilder()->getDatabaseMap();
+            self::$maps[$peer] = $dbMap->getTable($tableName);
+        }
+        return self::$maps[$peer];
+    }
+
+
+    public static function getTableName($peer)
+    {
+        self::addPeer($peer);
+        return self::getPeerConstant($peer, "TABLE_NAME");
+    }
+
+
+    /**
+     * Call a Method from the Static Peer Class
+     *
+     * @param string $peer   The name of the Peer
+     * @param string $method The name of the method to call
+     * @param array  $params The parameters to pass to the method
+     * @return mixed What ever the method returns
+     */
+        public static function callMethod($peer, $method, $params = null)
+        {
+                if ($params !== null) {
+                        return call_user_func_array(array($peer, $method), $params);
+                }  
+                return call_user_func(array($peer, $method));
+        }
+
+}
+
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/PeerInfo.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/PropelPager.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/PropelPager.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/PropelPager.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,544 @@
+<?php
+/*
+ *  $Id: PropelPager.php 308 2005-12-23 16:16:40Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+/**
+ *  PropelPager
+ *
+ *  Example Usage:
+ *
+ *  require_once 'propel/util/PropelPager.php';
+ *  require_once 'PEACH/Propel/Poem/poemPeer.php';
+ *
+ *  $c = new Criteria();
+ *  $c->addDescendingOrderByColumn(poemPeer::SID);
+ *
+ *  // with join
+ *  $pager = new PropelPager($c, 'poemPeer', 'doSelectJoinPoemUsers', 1, 50);
+ *
+ *  // without Join 
+ *
+ *  $pager = new PropelPager($c, 'poemPeer', 'doSelect', 1, 50);
+ *
+ * Some template:
+ *
+ * <p>
+ * Total Pages: <?=$pager->getTotalPages()?>  Total Records: <?=$pager->getTotalRecordCount()?>
+ * </p>
+ * <table>
+ * <tr>
+ * <td>
+ * <?if($link = $pager->getFirstPage):?>
+ * <a href="somescript?page=<?=$link?>"><?=$link?></a>|
+ * <?endif?>
+ * </td>
+ * <td>
+ * <?if($link = $pager->getPrev()):?>
+ * <a href="somescript?page=<?=$link?>">Previous</a>|
+ * <?endif?>
+ * </td>
+ * <td>
+ * <?foreach($pager->getPrevLinks() as $link):?>
+ * <a href="somescript?page=<?=$link?>"><?=$link?></a>|
+ * <?endforeach?>
+ * </td>
+ * <td><?=$pager->getPage()?></td>
+ * <td>
+ * <?foreach($pager->getNextLinks() as $link):?>
+ * | <a href="somescript?page=<?=$link?>"><?=$link?></a>
+ * <?endforeach?>
+ * </td>
+ * <td>
+ * <?if($link = $pager->getNext()):?>
+ * <a href="somescript?page=<?=$link?>">Last</a>|
+ * <?endif?>
+ * </td>
+ * <td>
+ * <?if($link = $pager->getLastPage()):?>
+ * <a href="somescript?page=<?=$link?>"><?=$link?></a>|
+ * <?endif?>
+ * </td>
+ * </tr>
+ * </table>
+ * <table id="latestPoems">
+ * <tr>
+ * <th>Title</th>
+ * <th>Auteur</th>
+ * <th>Date</th>
+ * <th>comments</th>
+ * </tr>
+ * <?foreach($pager->getResult() as $poem):?>
+ * <tr>
+ * <td><?=$poem->getTitle()?></td>
+ * <td><?=$poem->getPoemUsers()->getUname()?></td>
+ * <td><?=$poem->getTime()?></td>
+ * <td><?=$poem->getComments()?></td>
+ * </tr>
+ * <?endforeach?>
+ * </table>
+ *
+ * 
+ * @author	Rob Halff <info en rhalff.com>
+ * @version   $Revision: 308 $
+ * @copyright Copyright (c) 2004 Rob Halff: LGPL - See LICENCE
+ * @package   propel.util 
+ */
+class PropelPager {
+	
+	private $recordCount;
+	private $pages;
+	private $peerClass;
+	private $peerSelectMethod;
+	private $peerCountMethod;
+	private $criteria;
+	private $countCriteria;
+	private $page;
+	private $rs = null;
+	
+	/** @var int Start row (offset) */
+	protected $start = 0;
+	
+	/** @var int Max rows to return (0 means all) */
+	protected $max = 0;
+	
+	/**
+	 * Create a new Propel Pager.
+	 * @param Criteria $c
+	 * @param string $peerClass The name of the static Peer class.
+	 * @param string $peerSelectMethod The name of the static method for selecting content from the Peer class.
+	 * @param int $page The current page (1-based).
+	 * @param int $rowsPerPage The number of rows that should be displayed per page.
+	 */
+	public function __construct($c = null, $peerClass = null, $peerSelectMethod = null, $page = 1, $rowsPerPage = 25)
+	{
+        if(!isset($c)) {
+            $c = new Criteria();
+        }
+        $this->setCriteria($c);
+		$this->setPeerClass($peerClass);
+		$this->setPeerSelectMethod($peerSelectMethod);
+		$this->guessPeerCountMethod();
+		$this->setPage($page);
+		$this->setRowsPerPage($rowsPerPage);
+	}
+	
+	/**
+	 * Set the criteria for this pager.
+	 * @param Criteria $c
+	 * @return void
+	 */
+	public function setCriteria(Criteria $c)
+	{
+		$this->criteria = $c;
+	}
+	
+	/**
+	 * Return the Criteria object for this pager.
+	 * @return Criteria
+	 */
+	public function getCriteria()
+	{
+		return $this->criteria;
+	}
+	
+	/**
+	 * Set the Peer Classname
+	 * 
+	 * @param string $class
+	 * @return void
+	 */
+	public function setPeerClass($class)
+	{
+		$this->peerClass = $class;
+	}
+
+	/**
+	 * Return the Peer Classname.
+	 * @return string
+	 */
+	public function getPeerClass()
+	{
+		return $this->peerClass;
+	}
+	
+	/**
+	 * Set the Peer select method.
+	 * This exists for legacy support, please use setPeerSelectMethod().
+	 * @param string $method The name of the static method to call on the Peer class.
+	 * @return void
+	 * @see setPeerSelectMethod()
+	 * @deprecated
+	 */
+	public function setPeerMethod($method)
+	{
+		$this->setPeerSelectMethod($method);
+	}
+
+	/**
+	 * Return the Peer select method.
+	 * This exists for legacy support, please use getPeerSelectMethod().
+	 * @return string
+	 * @see getPeerSelectMethod()
+	 * @deprecated
+	 */
+	public function getPeerMethod()
+	{
+		return $this->getPeerSelectMethod();
+	}
+	
+	/**
+	 * Set the Peer select method.
+	 * 
+	 * @param string $method The name of the static method to call on the Peer class.
+	 * @return void
+	 */
+	public function setPeerSelectMethod($method)
+	{
+		$this->peerSelectMethod = $method;
+	}
+	
+	/**
+	 * Return the Peer select method.
+	 * @return string
+	 */
+	public function getPeerSelectMethod()
+	{
+		return $this->peerSelectMethod;
+	}
+	
+	/**
+	 * Sets the Count method.
+	 * This is set based on the Peer method, for example if Peer method is doSelectJoin*() then the 
+	 * count method will be doCountJoin*().
+	 * @param string $method The name of the static method to call on the Peer class.
+	 */
+	public function setPeerCountMethod($method)
+	{
+		$this->peerCountMethod = $method;
+	}
+	
+	/**
+	 * Return the Peer count method.
+	 */
+	public function getPeerCountMethod()
+	{
+		return $this->peerCountMethod;
+	}
+	
+	/**
+	 * Guesses the Peer count method based on the select method.
+	 */
+	private function guessPeerCountMethod()
+	{
+		$selectMethod = $this->getPeerSelectMethod();
+		if ($selectMethod == 'doSelect') {
+			$countMethod = 'doCount';
+		} elseif ( ($pos = stripos($selectMethod, 'doSelectJoin')) === 0) {
+			$countMethod = 'doCount' . substr($selectMethod, strlen('doSelect'));
+		} else {
+			// we will fall back to doCount() if we don't understand the join
+			// method; however, it probably won't be accurate.  Maybe triggering an error would 
+			// be appropriate ...
+			$countMethod = 'doCount';
+		}
+		$this->setPeerCountMethod($countMethod);
+	}
+	
+	/**
+	 * Get the paged resultset 
+	 * 
+	 * @return mixed $rs 
+	 */
+	public function getResult()
+	{
+		if(!isset($this->rs)) {
+			$this->doRs();
+		}
+
+		return $this->rs;
+	}
+	
+	/**
+	 * Get the paged resultset 
+	 * 
+	 * Main method which creates a paged result set based on the criteria 
+	 * and the requested peer select method.
+	 * 
+	 */
+	private function doRs()
+	{   
+		$this->criteria->setOffset($this->start);
+		$this->criteria->setLimit($this->max);
+		$this->rs = call_user_func(array($this->getPeerClass(), $this->getPeerSelectMethod()), $this->criteria);
+	}
+	
+	/**
+	 * Get the first page 
+	 * 
+	 * For now I can only think of returning 1 always.
+	 * It should probably return 0 if there are no pages
+	 * 
+	 * @return int 1 
+	 */
+	public function getFirstPage()
+	{
+		return '1';
+	}
+	
+	/**
+	 * Convenience method to indicate whether current page is the first page.
+	 * 
+	 * @return boolean
+	 */
+	public function atFirstPage()
+	{
+		return $this->getPage() == $this->getFirstPage();
+	}
+	
+	/**
+	 * Get last page 
+	 * 
+	 * @return int $lastPage 
+	 */
+	public function getLastPage()
+	{
+		$totalPages = $this->getTotalPages();
+		if ($totalPages == 0) {
+			return 1;
+		} else {
+			return $totalPages;
+		}
+	}
+	
+	/**
+	 * Convenience method to indicate whether current page is the last page.
+	 * 
+	 * @return boolean
+	 */
+	public function atLastPage()
+	{
+		return $this->getPage() == $this->getLastPage();
+	}
+	
+	/**
+	 * get total pages 
+	 * 
+	 * @return int $this->pages
+	 */
+	public function getTotalPages() {
+		if(!isset($this->pages)) {
+			$recordCount = $this->getTotalRecordCount();
+			if($this->max > 0) {
+					$this->pages = ceil($recordCount/$this->max);
+			} else {
+					$this->pages = 0;
+			}
+		}
+		return $this->pages;
+	}
+	
+	/**
+	 * get an array of previous id's  
+	 * 
+	 * @param int $range
+	 * @return array $links
+	 */
+	public function getPrevLinks($range = 5)
+	{
+		$total = $this->getTotalPages();
+		$start = $this->getPage() - 1;
+		$end = $this->getPage() - $range;
+		$first =  $this->getFirstPage();
+		$links = array();
+		for($i=$start; $i>$end; $i--) {
+			if($i < $first) {
+					break;
+			}
+			$links[] = $i;
+		}
+
+		return array_reverse($links);
+	}
+	
+	/**
+	 * get an array of next id's  
+	 * 
+	 * @param int $range
+	 * @return array $links
+	 */
+	public function getNextLinks($range = 5)
+	{
+		$total = $this->getTotalPages();
+		$start = $this->getPage() + 1;
+		$end = $this->getPage() + $range;
+		$last =  $this->getLastPage();
+		$links = array();
+		for($i=$start; $i<$end; $i++) {
+			if($i > $last) {
+					break;
+			}
+			$links[] = $i;
+		}
+
+		return $links;
+	}	
+	
+	/**
+	 * Returns whether last page is complete
+	 *
+	 * @return bool Last page complete or not
+	 */
+	public function isLastPageComplete()
+	{
+		return !($this->getTotalRecordCount() % $this->max);
+	}
+	
+	/**
+	 * get previous id  
+	 * 
+	 * @return mixed $prev
+	 */
+	public function getPrev() {
+		if($this->getPage() != $this->getFirstPage()) {
+				$prev = $this->getPage() - 1;
+		} else {
+				$prev = false;
+		}
+		return $prev;
+	}
+	
+	/**
+	 * get next id  
+	 * 
+	 * @return mixed $next
+	 */
+	public function getNext() {
+		if($this->getPage() != $this->getLastPage()) {
+				$next = $this->getPage() + 1;
+		} else {
+				$next = false;
+		}
+		return $next;
+	}
+	
+	/**
+	 * Set the current page number (First page is 1).
+	 * @param int $page
+	 * @return void
+	 */
+	public function setPage($page)
+	{
+		$this->page = $page;
+		// (re-)calculate start rec
+		$this->calculateStart();
+	}
+	
+	/**
+	 * Get current page.
+	 * @return int
+	 */
+	public function getPage()
+	{
+		return $this->page;
+	}
+	
+	/**
+	 * Set the number of rows per page.
+	 * @param int $r
+	 */
+	public function setRowsPerPage($r)
+	{
+		$this->max = $r;
+		// (re-)calculate start rec
+		$this->calculateStart();
+	}
+	
+	/**
+	 * Get number of rows per page.
+	 * @return int
+	 */
+	public function getRowsPerPage()
+	{
+		return $this->max;
+	}
+	
+	/**
+	 * Calculate startrow / max rows based on current page and rows-per-page.
+	 * @return void
+	 */
+	private function calculateStart()
+	{
+		$this->start = ( ($this->page - 1) * $this->max );
+	}
+	
+	/**
+	 * Gets the total number of (un-LIMITed) records.
+	 * 
+	 * This method will perform a query that executes un-LIMITed query. 
+	 *
+	 * @return int Total number of records - disregarding page, maxrows, etc.
+	 */
+	public function getTotalRecordCount()
+	{	
+
+                if(!isset($this->rs)) {
+                    $this->doRs();
+                }
+
+                if(empty($this->recordCount)) {
+                        $this->countCriteria = clone $this->criteria;
+                        $this->countCriteria->setLimit(0);
+                        $this->countCriteria->setOffset(0);
+
+                        $this->recordCount = call_user_func(
+                                        array(
+                                                $this->getPeerClass(),
+												$this->getPeerCountMethod()
+                                             ),
+                                        $this->countCriteria
+                                        );
+
+                }
+
+                return $this->recordCount;
+
+	}
+	
+	/**
+	 * Sets the start row or offset.
+	 * @param int $v
+	 */
+	public function setStart($v)
+	{
+		$this->start = $v;
+	}
+	
+	/**
+	 * Sets max rows (limit).
+	 * @param int $v
+	 * @return void
+	 */
+	public function setMax($v)
+	{
+		$this->max = $v;
+	}
+
+} 
+?>


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/PropelPager.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/Transaction.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/Transaction.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/Transaction.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,160 @@
+<?php
+/*
+ *  $Id: Transaction.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */ 
+ 
+/**
+ * Utility class to make it easier to begin, commit, and rollback transactions.
+ * 
+ * This can be used to handle cases where transaction support is optional.
+ * The second parameter of beginOptionalTransaction() will determine with a transaction 
+ * is used or not. If a transaction is not used, the commit and rollback methods
+ * do not have any effect. Instead it simply makes the logic easier to follow
+ * by cutting down on the if statements based solely on whether a transaction
+ * is needed or not.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org> (Propel) 
+ * @author Stephen Haberman <stephenh en chase3000.com> (Torque)
+ * @version $Revision: 64 $
+ * @package propel.util
+ */
+class Transaction {
+
+    /**
+     * Begin a transaction.  This method will fallback gracefully to
+     * return a normal connection, if the database being accessed does
+     * not support transactions.
+     *
+     * @param string $dbName Name of database.
+     * @return Connection The Connection for the transaction.
+     * @throws PropelException
+     */
+    public static function begin($dbName)
+    {
+        $con = Propel::getConnection($dbName);
+        try {
+            $con->setAutoCommit(false);
+        } catch (SQLException $e) {
+            throw new PropelException($e);
+        }
+        return $con;
+    }
+
+    /**
+     * Begin a transaction.  This method will fallback gracefully to
+     * return a normal connection, if the database being accessed does
+     * not support transactions.
+     *
+     * @param sring $dbName Name of database.
+     * @param boolean $useTransaction If false, a transaction won't be used.
+     * @return Connection The Connection for the transaction.
+     * @throws PropelException
+     */
+    public static function beginOptional($dbName, $useTransaction)
+    {
+        $con = Propel::getConnection($dbName);
+        try {
+            if ($useTransaction) {
+                $con->setAutoCommit(false);
+            }
+        } catch (SQLException $e) {
+            throw new PropelException($e);
+        }
+        return $con;
+    }
+
+    /**
+     * Commit a transaction.  This method takes care of releasing the
+     * connection after the commit.  In databases that do not support
+     * transactions, it only returns the connection.
+     *
+     * @param Connection $con The Connection for the transaction.
+     * @return void
+     * @throws PropelException
+     */
+    public static function commit($con)
+    {
+        if ($con === null) {
+            throw new PropelException(
+                    "Connection object was null. "
+                    . "This could be due to a misconfiguration. "
+                    . "Check the logs and Propel properties "
+                    . "to better determine the cause.");
+        }
+        try {
+            if ($con->getAutoCommit() === false) {
+                $con->commit();
+                $con->setAutoCommit(true);
+            }
+        } catch (SQLException $e) {
+            throw new PropelException($e);
+        }
+    }
+
+    /**
+     * Roll back a transaction in databases that support transactions.
+     * It also releases the connection. In databases that do not support
+     * transactions, this method will log the attempt and release the
+     * connection.
+     *
+     * @param Connection $con The Connection for the transaction.
+     * @return void
+     * @throws PropelException
+     */
+    public static function rollback($con)
+    {
+        if ($con === null) {
+            throw new PropelException(
+                    "Connection object was null. "
+                    . "This could be due to a misconfiguration. "
+                    . "Check the logs and Propel properties "
+                    . "to better determine the cause.");
+        }
+
+        try {
+            if ($con->getAutoCommit() === false) {
+                $con->rollback();
+                $con->setAutoCommit(true);
+            }
+        } catch (SQLException $e) {
+            Propel::log(
+                    "An attempt was made to rollback a transaction "
+                    . "but the database did not allow the operation to be "
+                    . "rolled back: " . $e->getMessage(), Propel::LOG_ERR);
+            throw new PropelException($e);
+        }
+    }
+    
+    /**
+     * Roll back a transaction without throwing errors if they occur.
+     * 
+     * @param Connection $con The Connection for the transaction.
+     * @return void
+     */
+    public static function safeRollback($con) 
+    {
+        try {
+            Transaction::rollback($con);
+        } catch (PropelException $e) {
+            Propel::log("An error occured during rollback: " . $e->getMessage(), Propel::LOG_ERR);
+        }
+    }
+
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/util/Transaction.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/BasicValidator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/BasicValidator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/BasicValidator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,46 @@
+<?php
+/*
+ *  $Id: BasicValidator.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+/**
+ * Basic Validator interface.  
+ * 
+ * BasicValidator objects perform validation without any knowledge of column/table
+ * context.  They are simply given an input and some value and asked whether the input
+ * is valid.
+ *
+ * @author Michael Aichler <aichler en mediacluster.de>
+ * @version $Revision: 64 $
+ * @package propel.validator
+ */
+interface BasicValidator
+{
+
+    /**
+     * Determine whether a value meets the criteria specified
+     *
+     * @param ValidatorMap $map A column map object for the column to be validated.
+     * @param string $str a <code>String</code> to be tested
+     *
+     * @return mixed TRUE if valid, error message otherwise
+     */
+    public function isValid(ValidatorMap $map, $str);
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/BasicValidator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MatchValidator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MatchValidator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MatchValidator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,81 @@
+<?php
+/*
+ *  $Id: MatchValidator.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/validator/BasicValidator.php';
+
+/**
+ * A validator for regular expressions.
+ *
+ * This validator will return true, when the passed value *matches* the
+ * regular expression.
+ *
+ * ## This class replaces the former class MaskValidator ##
+ *
+ * If you do want to test if the value does *not* match an expression,
+ * you can use the MatchValidator class instead.
+ *
+ * Below is an example usage for your Propel xml schema file.
+ *
+ * <code>
+ *   <column name="email" type="VARCHAR" size="128" required="true" />
+ *   <validator column="username">
+ *     <!-- allow strings that match the email adress pattern -->
+ *     <rule
+ *       name="match"
+ *       value="/^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9])+(\.[a-zA-Z0-9_-]+)+$/"
+ *       message="Please enter a valid email address." />
+ *   </validator>
+ * </code>
+ *
+ * @author Michael Aichler <aichler en mediacluster.de>
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 64 $
+ * @package propel.validator
+ */
+class MatchValidator implements BasicValidator
+{
+    /**
+     * Prepares the regular expression entered in the XML
+     * for use with preg_match().
+     * @param string $exp
+     * @return string Prepared regular expession.
+     */
+    private function prepareRegexp($exp)
+    {
+        // remove surrounding '/' marks so that they don't get escaped in next step
+        if ($exp{0} !== '/' || $exp{strlen($exp)-1} !== '/' ) {
+            $exp = '/' . $exp . '/';
+        }
+
+        // if they did not escape / chars; we do that for them
+        $exp = preg_replace('/([^\\\])\/([^$])/', '$1\/$2', $exp);
+
+        return $exp;
+    }
+
+    /**
+     * Whether the passed string matches regular expression.
+     */
+    public function isValid (ValidatorMap $map, $str)
+    {
+        return (preg_match($this->prepareRegexp($map->getValue()), $str) != 0);
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MatchValidator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MaxLengthValidator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MaxLengthValidator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MaxLengthValidator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,52 @@
+<?php
+/*
+ *  $Id: MaxLengthValidator.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/validator/BasicValidator.php';
+
+/**
+ * A validator for maximum string length.
+ *
+ * Below is an example usage for your Propel xml schema file.
+ *
+ * Note that if you have specified the size attribute in the column tag
+ * you do not have to specify it as value in the validator rule again as
+ * this is done automatically.
+ *
+ * <code>
+ *   <column name="username" type="VARCHAR" size="25" required="true" />
+ *
+ *   <validator column="username">
+ *     <rule name="maxLength" message="Passwort must be at least ${value} characters !" />
+ *   </validator>
+ * </code>
+ *
+ * @author Michael Aichler <aichler en mediacluster.de>
+ * @version $Revision: 64 $
+ * @package propel.validator
+ */
+class MaxLengthValidator implements BasicValidator
+{
+
+  public function isValid (ValidatorMap $map, $str)
+  {
+    return strlen($str) <= intval($map->getValue());
+  }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MaxLengthValidator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MaxValueValidator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MaxValueValidator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MaxValueValidator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,56 @@
+<?php
+/*
+ *  $Id: MaxValueValidator.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/validator/BasicValidator.php';
+
+/**
+ * A validator for maximum values.
+ *
+ * Below is an example usage for your Propel xml schema file.
+ *
+ * <code>
+ *   <column name="articles" type="INTEGER" required="true" />
+ *
+ *   <validator column="articles">
+ *     <rule name="minValue" value="1"  message="Minimum value for selected articles is ${value} !" />
+ *     <rule name="maxValue" value="10"  message="Maximum value for selected articles is ${value} !" />
+ *   </validator>
+ * </code>
+ *
+ * @author Michael Aichler <aichler en mediacluster.de>
+ * @version $Revision: 64 $
+ * @package propel.validator
+ */
+class MaxValueValidator implements BasicValidator
+{
+    
+    /**
+     * @see BasicValidator::isValid()
+     */
+    public function isValid (ValidatorMap $map, $value)
+    {
+        if(is_null($value) == false && is_numeric($value) == true) {
+            return intval($value) <= intval($map->getValue());
+        }
+
+        return false;
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MaxValueValidator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MinLengthValidator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MinLengthValidator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MinLengthValidator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,49 @@
+<?php
+/*
+ *  $Id: MinLengthValidator.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/validator/BasicValidator.php';
+
+/**
+ * A validator for minimum string length.
+ *
+ * <code>
+ *   <column name="password" type="VARCHAR" size="34" required="true" />
+ *
+ *   <validator column="password">
+ *     <rule name="minLength" value="5" message="Passwort must be at least ${value} characters !" />
+ *   </validator>
+ * </code>
+ *
+ * @author Michael Aichler <aichler en mediacluster.de>
+ * @version $Revision: 64 $
+ * @package propel.validator
+ */
+class MinLengthValidator implements BasicValidator
+{
+
+    /**
+     * @see BasicValidator::isValid()
+     */
+    public function isValid (ValidatorMap $map, $str)
+    {
+        return strlen($str) >= intval($map->getValue());
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MinLengthValidator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MinValueValidator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MinValueValidator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MinValueValidator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,56 @@
+<?php
+/*
+ *  $Id: MinValueValidator.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/validator/BasicValidator.php';
+
+/**
+ * A validator for minimum values.
+ *
+ * Below is an example usage for your Propel xml schema file.
+ *
+ * <code>
+ *   <column name="articles" type="INTEGER" required="true" />
+ *
+ *   <validator column="articles">
+ *     <rule name="minValue" value="1"  message="Minimum value for selected articles is ${value} !" />
+ *     <rule name="maxValue" value="10"  message="Maximum value for selected articles is ${value} !" />
+ *   </validator>
+ * </code>
+ *
+ * @author Michael Aichler <aichler en mediacluster.de>
+ * @version $Revision: 64 $
+ * @package propel.validator
+ */
+class MinValueValidator implements BasicValidator
+{
+    
+    /**
+     * @see BasicValidator::isValid()
+     */
+    public function isValid (ValidatorMap $map, $value)
+    {
+      if(is_null($value) == false && is_numeric($value)) {
+          return intval($value) >= intval($map->getValue());
+      }
+
+      return false;
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/MinValueValidator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/NotMatchValidator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/NotMatchValidator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/NotMatchValidator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,79 @@
+<?php
+/*
+ *  $Id: NotMatchValidator.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/validator/BasicValidator.php';
+
+/**
+ * A validator for regular expressions.
+ *
+ * This validator will return true, when the passed value does *not* match
+ * the regular expression.
+ *
+ * If you do want to test if the value *matches* an expression, you can use
+ * the MatchValidator class instead.
+ *
+ * Below is an example usage for your Propel xml schema file.
+ *
+ * <code>
+ *   <column name="ISBN" type="VARCHAR" size="20" required="true" />
+ *   <validator column="username">
+ *     <!-- disallow everything that's not a digit or minus -->
+ *     <rule
+ *       name="notMatch"
+ *       value="/[^\d-]+/"
+ *       message="Please enter a valid email adress." />
+ *   </validator>
+ * </code>
+ *
+ * @author Michael Aichler <aichler en mediacluster.de>
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 64 $
+ * @package propel.validator
+ */
+class NotMatchValidator implements BasicValidator
+{
+    /**
+     * Prepares the regular expression entered in the XML
+     * for use with preg_match().
+     * @param string $exp
+     * @return string Prepared regular expession.
+     */
+    private function prepareRegexp($exp)
+    {
+        // remove surrounding '/' marks so that they don't get escaped in next step
+        if ($exp{0} !== '/' || $exp{strlen($exp)-1} !== '/' ) {
+            $exp = '/' . $exp . '/';
+        }
+
+        // if they did not escape / chars; we do that for them
+        $exp = preg_replace('/([^\\\])\/([^$])/', '$1\/$2', $exp);
+
+        return $exp;
+    }
+
+    /**
+     * Whether the passed string matches regular expression.
+     */
+    public function isValid (ValidatorMap $map, $str)
+    {
+        return (preg_match($this->prepareRegexp($map->getValue()), $str) == 0);
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/NotMatchValidator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/RequiredValidator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/RequiredValidator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/RequiredValidator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,51 @@
+<?php
+/*
+ *  $Id: RequiredValidator.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/validator/BasicValidator.php';
+
+/**
+ * A validator for required fields.
+ *
+ * Below is an example usage for your Propel xml schema file.
+ *
+ * <code>
+ *   <column name="username" type="VARCHAR" size="25" required="true" />
+ *
+ *   <validator column="username">
+ *     <rule name="required" message="Username is required." />
+ *   </validator>
+ * </code>
+ *
+ * @author Michael Aichler <aichler en mediacluster.de>
+ * @version $Revision: 64 $
+ * @package propel.validator
+ */
+class RequiredValidator implements BasicValidator
+{
+
+    /**
+     * @see BasicValidator::isValid()
+     */
+    public function isValid (ValidatorMap $map, $str)
+    {
+        return ($str !== null && $str !== "");
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/RequiredValidator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/UniqueValidator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/UniqueValidator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/UniqueValidator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,66 @@
+<?php
+/*
+ *  $Id: UniqueValidator.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/validator/BasicValidator.php';
+
+/**
+ * A validator for unique column names.
+ *
+ * <code>
+ *   <column name="username" type="VARCHAR" size="25" required="true" />
+ *
+ *   <validator column="username">
+ *     <rule name="unique" message="Username already exists !" />
+ *   </validator>
+ * </code>
+ *
+ * @author Michael Aichler <aichler en mediacluster.de>
+ * @version $Revision: 64 $
+ * @package propel.validator
+ */
+class UniqueValidator implements BasicValidator
+{
+
+    /**
+     * @see BasicValidator::isValid()
+     */
+    public function isValid (ValidatorMap $map, $str)
+    {
+      $column = $map->getColumn();
+
+      $c = new Criteria();
+      $c->add($column->getFullyQualifiedName(), $str, Criteria::EQUAL);
+
+      $isValid = false;
+
+      try {
+
+          $table = $column->getTable()->getPhpName();
+          $cmd = sprintf('$isValid = %sPeer::doCount($c) == 0;', $table);
+          eval($cmd);
+
+      } catch(PropelException $e) {
+        /* what to do here ? */
+      }
+
+      return $isValid;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/UniqueValidator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/ValidValuesValidator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/ValidValuesValidator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/ValidValuesValidator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,46 @@
+<?php
+/*
+ *  $Id: ValidValuesValidator.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/validator/BasicValidator.php';
+
+/**
+ * A validator for valid values (e.g. for enum fields)
+ *
+ * <code>
+ *   <column name="address_type" type="VARCHAR" required="true" default="delivery" />
+ *
+ *   <validator column="address_type">
+ *     <rule name="validValues" value="account|delivery" message="Please select a valid address type." />
+ *   </validator>
+ * </code>
+ *
+ * @author Michael Aichler <aichler en mediacluster.de>
+ * @version $Revision: 64 $
+ * @package propel.validator
+ */
+class ValidValuesValidator implements BasicValidator
+{
+
+    public function isValid (ValidatorMap $map, $str)
+    {
+        return in_array($str, explode("|", $map->getValue()));
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/ValidValuesValidator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/ValidationFailed.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/ValidationFailed.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/ValidationFailed.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,126 @@
+<?php
+/*
+ *  $Id: ValidationFailed.php 282 2005-11-25 14:20:51Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+
+/**
+ * Simple class that serves as a container for any information about a failed validation.
+ * 
+ * Currently this class stores the qualified column name (e.g. tablename.COLUMN_NAME) and 
+ * the message that should be displayed to the user.
+ *
+ * An array of these objects will be returned by BasePeer::doValidate() if validation 
+ * failed.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 282 $
+ * @package propel.validator
+ * @see BasePeer::doValidate()
+ */
+class ValidationFailed {
+    
+    /** Column name in tablename.COLUMN_NAME format */
+    private $colname;
+    
+    /** Message to display to user. */
+    private $message;
+    
+	/** Validator object that caused this to fail. */
+	private $validator;
+	
+    /**
+     * Construct a new ValidationFailed object.
+     * @param string $colname Column name.
+     * @param string $message Message to display to user.
+	 * @param object $validator The Validator that caused this column to fail.
+     */
+    public function __construct($colname, $message, $validator = null)
+    {
+        $this->colname = $colname;
+        $this->message = $message;
+		$this->validator = $validator;
+    }
+    
+    /**
+     * Set the column name.
+     * @param string $v
+     */
+    public function setColumn($v)
+    {
+        $this->colname = $v;
+    }
+    
+    /**
+     * Gets the column name.
+     * @return string Qualified column name (tablename.COLUMN_NAME)
+     */
+    public function getColumn()
+    {
+        return $this->colname;
+    }
+
+    /**
+     * Set the message for the validation failure.
+     * @param string $v
+     */
+    public function setMessage($v)
+    {
+        $this->message = $v;
+    }
+    
+    /**
+     * Gets the message for the validation failure.
+     * @return string
+     */
+    public function getMessage()
+    {
+        return $this->message;
+    }
+    
+	/**
+     * Set the validator object that caused this to fail.
+     * @param object $v
+     */
+    public function setValidator($v)
+    {
+        $this->validator = $v;
+    }
+    
+    /**
+     * Gets the validator object that caused this to fail.
+     * @return object
+     */
+    public function getValidator()
+    {
+        return $this->validator;
+    }
+    
+    /**
+     * "magic" method to get string represenation of object.
+     * Maybe someday PHP5 will support the invoking this method automatically
+     * on (string) cast.  Until then it's pretty useless.
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getMessage();
+    }
+    
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel/validator/ValidationFailed.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/CHANGELOG
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/CHANGELOG	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/CHANGELOG	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,145 @@
+
+  P R O P E L    C H A N G E S
+  ============================
+
+ Feb ??, 2006 - 1.2.0
+
+  Breaking Changes:
+  *** New API for accessors and settors (see API docs).  The methods are the same
+  but the default indexing has changed.
+  *** New API for validators (see Wiki / docs).
+
+  Major Changes (for complete list see issue tracker at http://propel.phpdb.org):
+  - Propel now compatible w/ PHP >= 5.0.5 & 5.1.x
+  - New MySQLi driver for Propel (use 'mysqli' instead of 'mysql')
+  - Added propel-gen script to standard-installed versions of Propel also
+  - New XSD schema for validating the XML datamodel descriptions (schema.xml)
+  - Support for specifying vendor-specific info in the schema.xml
+  - Better support for sequences in reverse engineering PostgreSQL databases
+  - #146 Added 'size' attribute to <index-column> and <unique-column>
+  - New extensible OO builder classes for generating PHP5 classes and SQL DDL
+  - Identifier escaping in generated SQL (note: for Postgres this means columns
+    are case-sensitive)
+  - Numerous improvements to validation framework, including new, cleaner API
+  - Added doCountJoin*() methods to the generated Peer classes
+  - Obj->save() calls now return the number of affected rows (if supported by db)
+  - ... & numerous bug fixes which can be seen on the site issue tracker.
+
+ April 7, 2005 - 1.1.0
+
+  Big Changes:
+  *** Changed retrieveByPK() to return NULL instead of throw Exception if no row
+      was matched. (Dave Lawson)
+  *** New PHP runtime conf format has changed (must regenerate conf file).
+  *** Dropped support for deprecated ini-format runtime properties file. (Hans)
+  *** Cleanup of build properties files, removal of deprecated properties. (Hans)
+
+  New Features:
+  - Schema attributes are no longer case-sensitive.
+  - New <vendor> tag allows specifying vendor-specific attributes. (Pavel)
+  - MySQL identifiers escaping added to SQL generation templates. (Pavel)
+  - MySQL unique indexes SQL generation added. (Pavel)
+  - Added support for interface="" attribute of <table> tag; defaults to Persistent. (Hans)
+  - Added doSelectJoinAll() to generated peer classes. (Hans)
+  - Added doDeleteAll() method to remove all rows from specified table. (Hans)
+  - Added support for returning affected rows from update methods in peer classes. (Hans)
+  - Added PHPUnit2-based unit testing framework to replace old bookstore-test.php
+  - Added schema validation / error throwing to schema parser. (Pavel)
+  - Logging is now optional (no log section means no logger used).  (David Zülke)
+  - Added TIMESTAMP_BU, DATE_BU types for "before-unix" (pre 1970) dates. (Hans)
+
+  Bug Fixes:
+  - Fixed E_STRICT error in generated Peer doCount() method (Hans)
+  - Fixed bug when using doSelectJoin*() methods with tables that have lazyload columns. (Hans)
+  - Fixed logic bugs in doSelectJoinExcept*() method generation. (Hans)
+  - Fixed support for temporal (date/time) default values. (Hans)
+  - Fixed bug where setting only default values in object would result in no save. (Hans)
+  - Fixes to PropelSQLExecTask to handle non-typical queries (Dominik, Hans).
+  - Fixed bug in enumerated inheritance when using string coltype (Kaspars)
+  - Fixes to charset / encoding in schema creation. (Joe Cai, Pavel)
+  - Fixed nested external schema bug. (Pavel)
+  - Fixed unexpected results bug in NodePeer::buildFamilyCriteria(). (Dave Lawson)
+  - Fixed clearSelectColumns() to also clear $asColumns. (Fabien Potencier)
+
+  Oct. 24, 2004 - 1.0.0
+
+    Big Changes:
+  - Removed Transaction class, refactoring functionality into Creole
+    Connection classes (Dave Lawson)
+  - New NodePeer for handling hierarchies (Dave Lawson)
+  - Propel has a new default directory layout for projects.  All project
+      files are now located in one directory.
+
+    projects/
+         |- bookstore/
+         |   |- build/
+         |   |- schema.xml
+         |   |- runtime.properties  <-- deprecated
+         |   |- runtime-conf.xml    <-- new standard
+
+    - Added new default XML format for setting Propel's runtime properties.
+      (see dir layout above).
+
+    - Added new build.xml to wrap build-propel.xml.  New file is preferred
+      way to build projects, as it allows for inclusion of project-specific
+      build.properties files. Propel is finally fully multi-project friendly.
+
+  - Support for specifying "lazy-load" columns in schema XML.  Lazy load
+    columns will only be populated on demand.  This means that by default
+    object hyradtion will not include these columns (so smaller, faster
+    objects), but also that an additional query is executed when data is
+    needed.  (This is particularly useful for BLOB/CLOB columns.)
+
+    Minor Changes:
+    [Generated Classes]
+    - Peer::populateObject() method deprecated (will remove in Propel 1.1) in
+    favor of Object->hydrate()
+    - Removed Peer::buildCriteria() method in favor of Object->buildCriteria()
+    and Object->buildPkeyCriteria()
+    - Peer doSelect*() family of methods now [consistently] only takes
+    Criteria objects for parameter.
+    - No more support in generated Peer classes for using Criteria with
+    different DB name.
+    - Date/time setter methods now perform a strtotime() conversion on passed
+    data and throw a PropelException is such a conversion cannot be performed.
+  - New copy() method replaces non-working __clone() impl.  __clone() unused due
+    to desire to have a way to copy objects w/o necessarying copying rows.
+
+    [Default Properties]
+    - The schema include pattern changed to *schema.xml (instead of
+    *-schema.xml), for added flexibility in layout.
+
+  [SQL Generator]
+  - Updated model classes to recognize boolean values in case-insensitive
+    manner (allow "TRUE" & "true").
+  - Updated model classes to recognize Propel types in case-insensitive
+    manner (allow "integer" & "INTEGER").
+
+  June 8, 2003 - 1.0.0-beta1
+
+    Bug Fixes:
+    - Fixed 'creole' target to include database name in generated schema XML
+    - Fixed Propel to work correctly with tables that have pkey, but no
+    autoIncrement cols
+    - Fixed Criteria toString() method to work [for SELECT clauses only]
+    - TIMESTAMP defaults to DATETIME for MySQL
+    - Added support for COMMENT keyword (for descriptions from schema) in
+    MySQL table definitions
+    - Fixed Table->containsColumn() method in propel-generator
+    - Fixed insert-sql to work with multi-line & complex SQL statements (Dominik del Bondio)
+
+  May 2, 2004 - 1.0.0-alpha2
+
+  Bug Fixes:
+  - LONGVARCHAR no longer considered LOB column (HL)
+  - Added INDEX for MySQL/InnoDB foreign keys
+  - Removed old references to BOOLEANINT/BOOLEANCHAR from platform classes (HL)
+  - Allow missing autoIncrement column w/o requiring idMethod="none" (HL)
+  - Fixed parse errors in generated classes w/ multi-column primary key (HL)
+
+  New Features:
+  - Added column validator framework and validator suite (MA)
+  - Added doCount() method to generated peers (MA)
+
+
+--$Id: CHANGELOG,v 1.11 2005/04/07 22:25:52 hlellelid Exp $

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/INSTALL
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/INSTALL	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/INSTALL	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,176 @@
+
+  I N S T A L L I N G    P R O P E L
+  ==================================
+
+  This is a quick guide for installing Propel and building the provided sample
+  bookstore application.  For more information on installation / configuration
+  see the online user guide available from main site: http://propel.phpdb.org
+  
+  
+  Prerequisites
+  -------------
+
+  Before you can install and run Propel you will need to have the following:
+  
+    * PHP >= 5.0.0
+	  Propel will only work with PHP5.  Additionally, you must have a command-
+	  line version of PHP5 in order to use PHING to build the classes and SQL
+	  files for your data model.  PHP must also have compiled in XML (libxml2, xsl)
+	  support in order to take advantage of all build options.
+
+  	* PHING >= 2.0.0
+	  Propel uses the PHING build system to build the classes and SQL definition
+	  files for your data model.  PHING is an open-source project build system
+	  based on Apache ANT.  PHING 2 is the (development) version built for PHP5.
+	  See http://phing.tigris.org/ to learn how to install Phing (it's easy).
+	  
+    * Creole >- 1.0.0	  
+	  Creole is a Uniform DB API framework for PHP5. Creole is available as a PEAR 
+	  package or can be installed in a more traditional manner. See 
+	  http://creole.phpdb.org/ to get a copy of the Creole classes.
+	
+	* A supported RDBMS
+	  Creole currently supports MySQL, MS SQL Server, PostgreSQL, and SQLite.  We 
+	  are working on support for Oracle and the new MySQLi drivers but this should 
+	  be considered alpha, at best.
+
+  Quick Install (PEAR)
+  --------------------
+  
+  It is now possible to install both the Propel runtime and the generator classes as
+  PEAR packages.  This is the quickest way to get up and running with Propel, but may
+  not be quite as easy to configure as the traditional installation method.
+  
+  * Propel Generator:
+  
+    % pear install http://propel.phpdb.org/pear/propel_generator-current.tgz
+  
+  To use the generator to build sql, php classes, etc. simply use the propel-gen shell 
+  script:
+    
+	% propel-gen /path/to/my/projectdir
+	
+  (See the sample bookstore project directory in your PEAR data directory for a sample 
+  projectdir.)
+	
+  * Propel Runtime:
+  
+    %  pear install http://propel.phpdb.org/pear/propel_runtime-current.tgz
+  
+  It is recommended that you read over the traditional install guide also, so that you
+  understand the roles of some of the various files.  In the PEAR install these files
+  (e.g. the main build.properties and the sample bookstore project) are stored in the
+  PEAR data dir (e.g. /usr/local/lib/php/data, C:\PHP\PEAR\data).
+  
+  
+  Traditional Installation
+  ------------------------
+  
+  Installation of Propel involves a few steps because Propel is composed of a generator
+  and runtime classes which are (now) packaged separately.
+  
+  Begin installation of Propel by choosing a base directory and unpacking the archive. 
+  
+  For the sake of simplicity, we'll assume that you are installing from a package 
+  (instead of CVS) into /var/www/php/.
+
+    % cd /var/www/php
+    % tar zxf /path/to/propel-x.x.x.tar.gz
+    % ln -s propel-x.x.x propel  
+  
+  A. Propel Generator
+  
+  The Propel generator classes don't need any special setup.  The classes and Phing 
+  scripts are located in the propel-generator/ directory (which in our example is
+  /var/www/php/propel/generator).
+  
+  B. Runtime Classes 
+
+  The runtime classes were unpacked to the propel/ directory (in this example, 
+  /var/www/php/propel). In order to use these classes in runtime applications, you will 
+  need to make sure that they are on the PHP include_path.  In our example, the 
+  following directory would need to be added to your PHP include_path: 
+  /var/www/php/propel/classes.  You could also copy the 
+  /var/www/php/propel/classes/propel directory to a location that is already on your 
+  include_path, e.g. the directory where PEAR classes are located:
+  
+    % cp -r /var/www/php/propel/runtime/classes/propel /usr/local/lib/php/
+  
+  Another option on *nix systems is to create a symlink:
+  
+    % ln -s /var/www/php/propel/runtime/classes/propel /usr/local/lib/php/propel  
+  
+  
+  Quick Test
+  ----------
+  
+  If you want to quickly test & see whether your installation is working, you can use 
+  the default configuration which will build the example application using SQLite.
+  
+  Here is how to run the simple test on Unix (use corresponding commands for Windows).
+  If you  run into trouble, don't panic -- just continue reading the INSTALL guide and 
+  consult the  Installation chapter of the online user guide at http://propel.phpdb.org.
+  
+  Change to your propel-generator dir (e.g.)
+  $> cd /var/www/php/propel/generator
+  
+  If using Propel from CVS, copy/rename the build.properties-sample file:
+  $> cp build.properties-sample build.properties
+  
+  Run Phing to build the classes and SQL files, specifying the bookstore project
+  $> phing -Dproject=bookstore
+  
+  Run the 'insert-sql' target which will add the tables to the SQLite db
+  $> phing -Dproject=bookstore insert-sql
+  
+  Run the test script that uses the generated classes against the bookstore db:
+  $> cd test/
+  $> php -f bookstore-test.php
+  
+  You should see a bunch of output as it tests use cases.  Hopefully there aren't any 
+  "FAILED" messages. If you get a failed message immediately indicating that it can't 
+  find one of the tables make sure that you a) ran the 'insert'-sql' target and that 
+  you are running the bookstore-test.php script from the main propel directory *and* 
+  that you call PHP with the -qC options so that it won't chdir() into the scripts 
+  directory.  (The path for the bookstore.db is ./test/bookstore.db so you can see 
+  that you need to be in the main propel directory for that to work.)
+  
+    
+  Configure
+  ---------
+  
+  To get Propel to work with your own db setup, create a new project (easiest way is 
+  to use the bookstore project directory as a template). Create your datamodel schema, 
+  modify the build.properties for that project to specify database connection 
+  information, and set the db connection runtime properties in runtime-conf.xml.
+  
+  
+  Build
+  -----
+  
+  This assumes that you have already installed and configured a copy of PHING 2.
+
+    % cd /var/www/php/propel/generator  
+    % phing -Dproject=mykillerapp    
+
+  This will build the SQL files and the object & peer classes based on your datamodel 
+  schema XML file.
+
+  The resulting files will be placed in: 
+    /var/www/php/propel/generator/projects/mykillerapp/build
+
+  If you encounter any problems, try adding -verbose or -debug to get more output 
+  from the PHING build process.
+  
+
+  You're Done!
+  ------------
+  
+  At this point hopefully you have successfully built the classes and SQL definitions 
+  for the sample bookstore application.  If you encountered problems, please visit 
+  http://propel.phpdb.org to read additional documention, browse through the users 
+  mailing list, or add a bug report.
+  
+  Enjoy!
+  
+  --$Id: INSTALL,v 1.4 2005/03/24 00:24:07 hlellelid Exp $

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/LICENSE
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/LICENSE	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/LICENSE	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,506 @@
+	GNU LESSER GENERAL PUBLIC LICENSE
+	Version 2.1, February 1999
+
+	Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+	59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+	Everyone is permitted to copy and distribute verbatim copies
+	of this license document, but changing it is not allowed.
+
+	[This is the first released version of the Lesser GPL.  It also counts
+	as the successor of the GNU Library Public License, version 2, hence
+	the version number 2.1.]
+
+	Preamble
+
+	The licenses for most software are designed to take away your
+	freedom to share and change it.  By contrast, the GNU General Public
+	Licenses are intended to guarantee your freedom to share and change
+	free software--to make sure the software is free for all its users.
+
+	This license, the Lesser General Public License, applies to some
+	specially designated software packages--typically libraries--of the
+	Free Software Foundation and other authors who decide to use it.  You
+	can use it too, but we suggest you first think carefully about whether
+	this license or the ordinary General Public License is the better
+	strategy to use in any particular case, based on the explanations below.
+
+	When we speak of free software, we are referring to freedom of use,
+	not price.  Our General Public Licenses are designed to make sure that
+	you have the freedom to distribute copies of free software (and charge
+	for this service if you wish); that you receive source code or can get
+	it if you want it; that you can change the software and use pieces of
+	it in new free programs; and that you are informed that you can do
+	these things.
+
+	To protect your rights, we need to make restrictions that forbid
+	distributors to deny you these rights or to ask you to surrender these
+	rights.  These restrictions translate to certain responsibilities for
+	you if you distribute copies of the library or if you modify it.
+
+	For example, if you distribute copies of the library, whether gratis
+	or for a fee, you must give the recipients all the rights that we gave
+	you.  You must make sure that they, too, receive or can get the source
+	code.  If you link other code with the library, you must provide
+	complete object files to the recipients, so that they can relink them
+	with the library after making changes to the library and recompiling
+	it.  And you must show them these terms so they know their rights.
+
+	We protect your rights with a two-step method: (1) we copyright the
+	library, and (2) we offer you this license, which gives you legal
+	permission to copy, distribute and/or modify the library.
+
+	To protect each distributor, we want to make it very clear that
+	there is no warranty for the free library.  Also, if the library is
+	modified by someone else and passed on, the recipients should know
+	that what they have is not the original version, so that the original
+	author's reputation will not be affected by problems that might be
+	introduced by others.
+
+	Finally, software patents pose a constant threat to the existence of
+	any free program.  We wish to make sure that a company cannot
+	effectively restrict the users of a free program by obtaining a
+	restrictive license from a patent holder.  Therefore, we insist that
+	any patent license obtained for a version of the library must be
+	consistent with the full freedom of use specified in this license.
+
+	Most GNU software, including some libraries, is covered by the
+	ordinary GNU General Public License.  This license, the GNU Lesser
+	General Public License, applies to certain designated libraries, and
+	is quite different from the ordinary General Public License.  We use
+	this license for certain libraries in order to permit linking those
+	libraries into non-free programs.
+
+	When a program is linked with a library, whether statically or using
+	a shared library, the combination of the two is legally speaking a
+	combined work, a derivative of the original library.  The ordinary
+	General Public License therefore permits such linking only if the
+	entire combination fits its criteria of freedom.  The Lesser General
+	Public License permits more lax criteria for linking other code with
+	the library.
+
+	We call this license the "Lesser" General Public License because it
+	does Less to protect the user's freedom than the ordinary General
+	Public License.  It also provides other free software developers Less
+	of an advantage over competing non-free programs.  These disadvantages
+	are the reason we use the ordinary General Public License for many
+	libraries.  However, the Lesser license provides advantages in certain
+	special circumstances.
+
+	For example, on rare occasions, there may be a special need to
+	encourage the widest possible use of a certain library, so that it
+	becomes a de-facto standard.  To achieve this, non-free programs must be
+	allowed to use the library.  A more frequent case is that a free
+	library does the same job as widely used non-free libraries.  In this
+	case, there is little to gain by limiting the free library to free
+	software only, so we use the Lesser General Public License.
+
+	In other cases, permission to use a particular library in non-free
+	programs enables a greater number of people to use a large body of
+	free software.  For example, permission to use the GNU C Library in
+	non-free programs enables many more people to use the whole GNU
+	operating system, as well as its variant, the GNU/Linux operating
+	system.
+
+	Although the Lesser General Public License is Less protective of the
+	users' freedom, it does ensure that the user of a program that is
+	linked with the Library has the freedom and the wherewithal to run
+	that program using a modified version of the Library.
+
+	The precise terms and conditions for copying, distribution and
+	modification follow.  Pay close attention to the difference between a
+	"work based on the library" and a "work that uses the library".  The
+	former contains code derived from the library, whereas the latter must
+	be combined with the library in order to run.
+
+	GNU LESSER GENERAL PUBLIC LICENSE
+	TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+	0. This License Agreement applies to any software library or other
+	program which contains a notice placed by the copyright holder or
+	other authorized party saying it may be distributed under the terms of
+	this Lesser General Public License (also called "this License").
+	Each licensee is addressed as "you".
+
+	A "library" means a collection of software functions and/or data
+	prepared so as to be conveniently linked with application programs
+	(which use some of those functions and data) to form executables.
+
+	The "Library", below, refers to any such software library or work
+	which has been distributed under these terms.  A "work based on the
+	Library" means either the Library or any derivative work under
+	copyright law: that is to say, a work containing the Library or a
+	portion of it, either verbatim or with modifications and/or translated
+	straightforwardly into another language.  (Hereinafter, translation is
+	included without limitation in the term "modification".)
+
+	"Source code" for a work means the preferred form of the work for
+	making modifications to it.  For a library, complete source code means
+	all the source code for all modules it contains, plus any associated
+	interface definition files, plus the scripts used to control compilation
+	and installation of the library.
+
+	Activities other than copying, distribution and modification are not
+	covered by this License; they are outside its scope.  The act of
+	running a program using the Library is not restricted, and output from
+	such a program is covered only if its contents constitute a work based
+	on the Library (independent of the use of the Library in a tool for
+	writing it).  Whether that is true depends on what the Library does
+	and what the program that uses the Library does.
+
+	1. You may copy and distribute verbatim copies of the Library's
+	complete source code as you receive it, in any medium, provided that
+	you conspicuously and appropriately publish on each copy an
+	appropriate copyright notice and disclaimer of warranty; keep intact
+	all the notices that refer to this License and to the absence of any
+	warranty; and distribute a copy of this License along with the
+	Library.
+
+	You may charge a fee for the physical act of transferring a copy,
+	and you may at your option offer warranty protection in exchange for a
+	fee.
+
+	2. You may modify your copy or copies of the Library or any portion
+	of it, thus forming a work based on the Library, and copy and
+	distribute such modifications or work under the terms of Section 1
+	above, provided that you also meet all of these conditions:
+
+	a) The modified work must itself be a software library.
+
+	b) You must cause the files modified to carry prominent notices
+	stating that you changed the files and the date of any change.
+
+	c) You must cause the whole of the work to be licensed at no
+	charge to all third parties under the terms of this License.
+
+	d) If a facility in the modified Library refers to a function or a
+	table of data to be supplied by an application program that uses
+	the facility, other than as an argument passed when the facility
+	is invoked, then you must make a good faith effort to ensure that,
+	in the event an application does not supply such function or
+	table, the facility still operates, and performs whatever part of
+	its purpose remains meaningful.
+
+	(For example, a function in a library to compute square roots has
+	a purpose that is entirely well-defined independent of the
+	application.  Therefore, Subsection 2d requires that any
+	application-supplied function or table used by this function must
+	be optional: if the application does not supply it, the square
+	root function must still compute square roots.)
+
+	These requirements apply to the modified work as a whole.  If
+	identifiable sections of that work are not derived from the Library,
+	and can be reasonably considered independent and separate works in
+	themselves, then this License, and its terms, do not apply to those
+	sections when you distribute them as separate works.  But when you
+	distribute the same sections as part of a whole which is a work based
+	on the Library, the distribution of the whole must be on the terms of
+	this License, whose permissions for other licensees extend to the
+	entire whole, and thus to each and every part regardless of who wrote
+	it.
+
+	Thus, it is not the intent of this section to claim rights or contest
+	your rights to work written entirely by you; rather, the intent is to
+	exercise the right to control the distribution of derivative or
+	collective works based on the Library.
+
+	In addition, mere aggregation of another work not based on the Library
+	with the Library (or with a work based on the Library) on a volume of
+	a storage or distribution medium does not bring the other work under
+	the scope of this License.
+
+	3. You may opt to apply the terms of the ordinary GNU General Public
+	License instead of this License to a given copy of the Library.  To do
+	this, you must alter all the notices that refer to this License, so
+	that they refer to the ordinary GNU General Public License, version 2,
+	instead of to this License.  (If a newer version than version 2 of the
+	ordinary GNU General Public License has appeared, then you can specify
+	that version instead if you wish.)  Do not make any other change in
+	these notices.
+
+	Once this change is made in a given copy, it is irreversible for
+	that copy, so the ordinary GNU General Public License applies to all
+	subsequent copies and derivative works made from that copy.
+
+	This option is useful when you wish to copy part of the code of
+	the Library into a program that is not a library.
+
+	4. You may copy and distribute the Library (or a portion or
+	derivative of it, under Section 2) in object code or executable form
+	under the terms of Sections 1 and 2 above provided that you accompany
+	it with the complete corresponding machine-readable source code, which
+	must be distributed under the terms of Sections 1 and 2 above on a
+	medium customarily used for software interchange.
+
+	If distribution of object code is made by offering access to copy
+	from a designated place, then offering equivalent access to copy the
+	source code from the same place satisfies the requirement to
+	distribute the source code, even though third parties are not
+	compelled to copy the source along with the object code.
+
+	5. A program that contains no derivative of any portion of the
+	Library, but is designed to work with the Library by being compiled or
+	linked with it, is called a "work that uses the Library".  Such a
+	work, in isolation, is not a derivative work of the Library, and
+	therefore falls outside the scope of this License.
+
+	However, linking a "work that uses the Library" with the Library
+	creates an executable that is a derivative of the Library (because it
+	contains portions of the Library), rather than a "work that uses the
+	library".  The executable is therefore covered by this License.
+	Section 6 states terms for distribution of such executables.
+
+	When a "work that uses the Library" uses material from a header file
+	that is part of the Library, the object code for the work may be a
+	derivative work of the Library even though the source code is not.
+	Whether this is true is especially significant if the work can be
+	linked without the Library, or if the work is itself a library.  The
+	threshold for this to be true is not precisely defined by law.
+
+	If such an object file uses only numerical parameters, data
+	structure layouts and accessors, and small macros and small inline
+	functions (ten lines or less in length), then the use of the object
+	file is unrestricted, regardless of whether it is legally a derivative
+	work.  (Executables containing this object code plus portions of the
+	Library will still fall under Section 6.)
+
+	Otherwise, if the work is a derivative of the Library, you may
+	distribute the object code for the work under the terms of Section 6.
+	Any executables containing that work also fall under Section 6,
+	whether or not they are linked directly with the Library itself.
+
+	6. As an exception to the Sections above, you may also combine or
+	link a "work that uses the Library" with the Library to produce a
+	work containing portions of the Library, and distribute that work
+	under terms of your choice, provided that the terms permit
+	modification of the work for the customer's own use and reverse
+	engineering for debugging such modifications.
+
+	You must give prominent notice with each copy of the work that the
+	Library is used in it and that the Library and its use are covered by
+	this License.  You must supply a copy of this License.  If the work
+	during execution displays copyright notices, you must include the
+	copyright notice for the Library among them, as well as a reference
+	directing the user to the copy of this License.  Also, you must do one
+	of these things:
+
+	a) Accompany the work with the complete corresponding
+	machine-readable source code for the Library including whatever
+	changes were used in the work (which must be distributed under
+	Sections 1 and 2 above); and, if the work is an executable linked
+	with the Library, with the complete machine-readable "work that
+	uses the Library", as object code and/or source code, so that the
+	user can modify the Library and then relink to produce a modified
+	executable containing the modified Library.  (It is understood
+	that the user who changes the contents of definitions files in the
+	Library will not necessarily be able to recompile the application
+	to use the modified definitions.)
+
+	b) Use a suitable shared library mechanism for linking with the
+	Library.  A suitable mechanism is one that (1) uses at run time a
+	copy of the library already present on the user's computer system,
+	rather than copying library functions into the executable, and (2)
+	will operate properly with a modified version of the library, if
+	the user installs one, as long as the modified version is
+	interface-compatible with the version that the work was made with.
+
+	c) Accompany the work with a written offer, valid for at
+	least three years, to give the same user the materials
+	specified in Subsection 6a, above, for a charge no more
+	than the cost of performing this distribution.
+
+	d) If distribution of the work is made by offering access to copy
+	from a designated place, offer equivalent access to copy the above
+	specified materials from the same place.
+
+	e) Verify that the user has already received a copy of these
+	materials or that you have already sent this user a copy.
+
+	For an executable, the required form of the "work that uses the
+	Library" must include any data and utility programs needed for
+	reproducing the executable from it.  However, as a special exception,
+	the materials to be distributed need not include anything that is
+	normally distributed (in either source or binary form) with the major
+	components (compiler, kernel, and so on) of the operating system on
+	which the executable runs, unless that component itself accompanies
+	the executable.
+
+	It may happen that this requirement contradicts the license
+	restrictions of other proprietary libraries that do not normally
+	accompany the operating system.  Such a contradiction means you cannot
+	use both them and the Library together in an executable that you
+	distribute.
+
+	7. You may place library facilities that are a work based on the
+	Library side-by-side in a single library together with other library
+	facilities not covered by this License, and distribute such a combined
+	library, provided that the separate distribution of the work based on
+	the Library and of the other library facilities is otherwise
+	permitted, and provided that you do these two things:
+
+	a) Accompany the combined library with a copy of the same work
+	based on the Library, uncombined with any other library
+	facilities.  This must be distributed under the terms of the
+	Sections above.
+
+	b) Give prominent notice with the combined library of the fact
+	that part of it is a work based on the Library, and explaining
+	where to find the accompanying uncombined form of the same work.
+
+	8. You may not copy, modify, sublicense, link with, or distribute
+	the Library except as expressly provided under this License.  Any
+	attempt otherwise to copy, modify, sublicense, link with, or
+	distribute the Library is void, and will automatically terminate your
+	rights under this License.  However, parties who have received copies,
+	or rights, from you under this License will not have their licenses
+	terminated so long as such parties remain in full compliance.
+
+	9. You are not required to accept this License, since you have not
+	signed it.  However, nothing else grants you permission to modify or
+	distribute the Library or its derivative works.  These actions are
+	prohibited by law if you do not accept this License.  Therefore, by
+	modifying or distributing the Library (or any work based on the
+	Library), you indicate your acceptance of this License to do so, and
+	all its terms and conditions for copying, distributing or modifying
+	the Library or works based on it.
+
+	10. Each time you redistribute the Library (or any work based on the
+	Library), the recipient automatically receives a license from the
+	original licensor to copy, distribute, link with or modify the Library
+	subject to these terms and conditions.  You may not impose any further
+	restrictions on the recipients' exercise of the rights granted herein.
+	You are not responsible for enforcing compliance by third parties with
+	this License.
+
+	11. If, as a consequence of a court judgment or allegation of patent
+	infringement or for any other reason (not limited to patent issues),
+	conditions are imposed on you (whether by court order, agreement or
+	otherwise) that contradict the conditions of this License, they do not
+	excuse you from the conditions of this License.  If you cannot
+	distribute so as to satisfy simultaneously your obligations under this
+	License and any other pertinent obligations, then as a consequence you
+	may not distribute the Library at all.  For example, if a patent
+	license would not permit royalty-free redistribution of the Library by
+	all those who receive copies directly or indirectly through you, then
+	the only way you could satisfy both it and this License would be to
+	refrain entirely from distribution of the Library.
+
+	If any portion of this section is held invalid or unenforceable under any
+	particular circumstance, the balance of the section is intended to apply,
+	and the section as a whole is intended to apply in other circumstances.
+
+	It is not the purpose of this section to induce you to infringe any
+	patents or other property right claims or to contest validity of any
+	such claims; this section has the sole purpose of protecting the
+	integrity of the free software distribution system which is
+	implemented by public license practices.  Many people have made
+	generous contributions to the wide range of software distributed
+	through that system in reliance on consistent application of that
+	system; it is up to the author/donor to decide if he or she is willing
+	to distribute software through any other system and a licensee cannot
+	impose that choice.
+
+	This section is intended to make thoroughly clear what is believed to
+	be a consequence of the rest of this License.
+
+	12. If the distribution and/or use of the Library is restricted in
+	certain countries either by patents or by copyrighted interfaces, the
+	original copyright holder who places the Library under this License may
+	add an explicit geographical distribution limitation excluding those
+	countries, so that distribution is permitted only in or among countries
+	not thus excluded.  In such case, this License incorporates the
+	limitation as if written in the body of this License.
+
+	13. The Free Software Foundation may publish revised and/or new
+	versions of the Lesser General Public License from time to time.
+	Such new versions will be similar in spirit to the present version,
+	but may differ in detail to address new problems or concerns.
+
+	Each version is given a distinguishing version number.  If the Library
+	specifies a version number of this License which applies to it and
+	"any later version", you have the option of following the terms and
+	conditions either of that version or of any later version published by
+	the Free Software Foundation.  If the Library does not specify a
+	license version number, you may choose any version ever published by
+	the Free Software Foundation.
+
+	14. If you wish to incorporate parts of the Library into other free
+	programs whose distribution conditions are incompatible with these,
+	write to the author to ask for permission.  For software which is
+	copyrighted by the Free Software Foundation, write to the Free
+	Software Foundation; we sometimes make exceptions for this.  Our
+	decision will be guided by the two goals of preserving the free status
+	of all derivatives of our free software and of promoting the sharing
+	and reuse of software generally.
+
+	NO WARRANTY
+
+	15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+	WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+	EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+	OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+	KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+	PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+	LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+	THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+	16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+	WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+	AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+	FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+	CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+	LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+	RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+	FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+	SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+	DAMAGES.
+
+	END OF TERMS AND CONDITIONS
+
+	How to Apply These Terms to Your New Libraries
+
+	If you develop a new library, and you want it to be of the greatest
+	possible use to the public, we recommend making it free software that
+	everyone can redistribute and change.  You can do so by permitting
+	redistribution under these terms (or, alternatively, under the terms of the
+	ordinary General Public License).
+
+	To apply these terms, attach the following notices to the library.  It is
+	safest to attach them to the start of each source file to most effectively
+	convey the exclusion of warranty; and each file should have at least the
+	"copyright" line and a pointer to where the full notice is found.
+
+	<one line to give the library's name and a brief idea of what it does.>
+	Copyright (C) <year>  <name of author>
+
+	This library is free software; you can redistribute it and/or
+	modify it under the terms of the GNU Lesser General Public
+	License as published by the Free Software Foundation; either
+	version 2.1 of the License, or (at your option) any later version.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+	Lesser General Public License for more details.
+
+	You should have received a copy of the GNU Lesser General Public
+	License along with this library; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+	Also add information on how to contact you by electronic and paper mail.
+
+	You should also get your employer (if you work as a programmer) or your
+	school, if any, to sign a "copyright disclaimer" for the library, if
+	necessary.  Here is a sample; alter the names:
+
+	Yoyodyne, Inc., hereby disclaims all copyright interest in the
+	library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+	<signature of Ty Coon>, 1 April 1990
+	Ty Coon, President of Vice
+
+	That's all there is to it!
+
+  --$Id: LICENSE,v 1.1 2004/07/14 02:18:14 hlellelid Exp $
+
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/bin/propel-gen
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/bin/propel-gen	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/bin/propel-gen	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,67 @@
+#!/bin/sh
+# Shell wrapper for Propel generator
+# $Id$
+#
+# This script will do the following:
+# - check for PHING_COMMAND env, if found, use it.
+#   - if not found assume php is on the path
+# - check for PROPEL_GEN_HOME evn, if found use it
+#   - if not look for it
+
+if [ -z "$PROPEL_GEN_HOME" ] ; then
+
+  # echo "WARNING: PROPEL_GEN_HOME environment not set. Attempting to guess."
+
+  # try to find Propel
+  if [ -d /opt/propel/generator ] ; then 
+    PROPEL_GEN_HOME=/opt/propel/generator
+  fi
+
+  if [ -d "${HOME}/opt/propel/generator" ] ; then 
+    PROPEL_GEN_HOME="${HOME}/opt/propel/generator"
+  fi
+
+  if [ -d "/usr/local/propel/generator" ] ; then 
+    PROPEL_GEN_HOME="/usr/local/propel/generator"
+  fi
+
+  if [ -d "${HOME}/usr/propel/generator" ] ; then 
+    PROPEL_GEN_HOME="${HOME}/usr/propel/generator"
+  fi
+  
+  ## resolve links - $0 may be a link to phing's home
+  PRG="$0"
+  progname=`basename "$0"`
+  saveddir=`pwd`
+
+  # need this for relative symlinks
+  dirname_prg=`dirname "$PRG"`
+  cd "$dirname_prg"
+  
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+	PRG="$link"
+    else
+	PRG=`dirname "$PRG"`"/$link"
+    fi
+  done
+  
+  PROPEL_GEN_HOME=`dirname "$PRG"`/..
+
+  cd "$saveddir"
+
+  # make it fully qualified
+  PROPEL_GEN_HOME=`cd "$PROPEL_GEN_HOME" && pwd`
+  
+  # make it available in PHP via getenv("PROPEL_GEN_HOME")
+  export PROPEL_GEN_HOME
+fi
+
+if (test -z "$PHING_COMMAND") ; then
+	# echo "WARNING: PHING_COMMAND environment not set. (Assuming phing on PATH)"
+	export PHING_COMMAND="phing"
+fi
+
+$PHING_COMMAND -f $PROPEL_GEN_HOME/build.xml -Dusing.propel-gen=true -Dproject.dir=$*

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/bin/propel-gen.bat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/bin/propel-gen.bat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/bin/propel-gen.bat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,47 @@
+ en echo off
+
+rem *********************************************************************
+rem ** The Propel generator convenience script for Windows based systems
+rem ** $Id$
+rem *********************************************************************
+
+rem This script will do the following:
+rem - check for PHING_COMMAND env, if found, use it.
+rem   - if not found detect php, if found use it, otherwise err and terminate
+rem - check for PROPEL_GEN_HOME evn, if found use it
+rem   - if not found error and leave
+
+if "%OS%"=="Windows_NT" @setlocal
+
+rem %~dp0 is expanded pathname of the current script under NT
+set DEFAULT_PROPEL_GEN_HOME=%~dp0..
+
+goto init
+goto cleanup
+
+:init
+
+if "%PROPEL_GEN_HOME%" == "" set PROPEL_GEN_HOME=%DEFAULT_PROPEL_GEN_HOME%
+set DEFAULT_PROPEL_GEN_HOME=
+
+if "%PHING_COMMAND%" == "" goto no_phingcommand
+
+goto run
+goto cleanup
+
+:run
+%PHING_COMMAND% -f %PROPEL_GEN_HOME%\build.xml -Dusing.propel-gen=true -Dproject.dir=%*
+goto cleanup
+
+:no_phingcommand
+REM echo ------------------------------------------------------------------------
+REM echo WARNING: Set environment var PHING_COMMAND to the location of your phing
+REM echo          executable (e.g. C:\PHP\phing.bat). 
+REM echo Proceeding with assumption that phing.bat is on Path
+REM echo ------------------------------------------------------------------------
+set PHING_COMMAND=phing.bat
+goto init
+
+:cleanup
+if "%OS%"=="Windows_NT" @endlocal
+REM pause

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build-propel.xml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build-propel.xml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build-propel.xml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,532 @@
+<project name="propel" default="main" basedir=".">
+
+  <!--
+    Note - You should not have to edit this file.
+
+    Instead, if calling build-propel.xml directly, edit the build.properties
+    that is in the same directory. If calling build-propel.xml via another
+    build file, you can also use the build.properties in the same directory,
+    or set the property propel.contextProperties to the file
+    to use in place of build.properties (e.g. project.properties).
+  -->
+
+  <property name="build.properties" value="build.properties"/>
+  <property name="propel.contextProperties" value="./${build.properties}"/>
+  <property name="propel.home" value="."/>
+  <property file="${propel.home}/build.properties"/>
+
+  <!--
+    The default.properties file will map old properties to the new ones along
+    with setting the corret defaults.
+  -->
+  <property file="${propel.home}/default.properties"/>
+
+  <!--
+    Do forward declarations of all of our tasks to
+    centralize them and clean up the targets.
+  -->
+
+  <path id="propelclasses">
+    <pathelement dir="${propel.home}/classes/"/>
+  </path>
+
+  <taskdef
+    name="propel-data-model"
+    classname="propel.phing.PropelDataModelTask" classpathRef="propelclasses"/>
+  <taskdef
+    name="propel-old-om"
+    classname="propel.phing.PropelOldOMTask" classpathRef="propelclasses"/>
+  <taskdef
+    name="propel-om"
+    classname="propel.phing.PropelOMTask" classpathRef="propelclasses"/>
+  <taskdef
+    name="propel-data-dtd"
+    classname="propel.phing.PropelDataDTDTask" classpathRef="propelclasses"/>
+  <taskdef
+    name="propel-data-dump"
+    classname="propel.phing.PropelDataDumpTask" classpathRef="propelclasses"/>
+  <taskdef
+    name="propel-data-sql"
+    classname="propel.phing.PropelDataSQLTask" classpathRef="propelclasses"/>
+   <taskdef
+    name="propel-creole-transform"
+    classname="propel.phing.PropelCreoleTransformTask" classpathRef="propelclasses"/>
+  <taskdef
+    name="propel-sql"
+    classname="propel.phing.PropelSQLTask" classpathRef="propelclasses"/>
+  <taskdef
+    name="propel-old-sql"
+    classname="propel.phing.PropelOldSQLTask" classpathRef="propelclasses"/>
+  <taskdef
+    name="propel-sql-exec"
+    classname="propel.phing.PropelSQLExec" classpathRef="propelclasses"/>
+  <taskdef
+    name="propel-graphviz"
+    classname="propel.phing.PropelGraphvizTask" classpathRef="propelclasses"/>
+
+
+  <!-- ================================================================ -->
+  <!-- M A I N  T A R G E T                                             -->
+  <!-- ================================================================ -->
+  <!-- This default target will run all the targets that generate       -->
+  <!-- source. You will probably only run this target once then         -->
+  <!-- call individual targets as necessary to update your sources      -->
+  <!-- when you change your XML schema.                                 -->
+  <!-- ================================================================ -->
+
+  <target
+    name="main"
+    description="==> generates sql + om classes">
+
+    <phingcall target="sql"/>
+    <phingcall target="om"/>
+    <phingcall target="convert-props"/>
+  </target>
+
+  <target
+    name="old-build"
+    description="==> generates sql + [new] om classes">
+
+    <phingcall target="sql"/>
+    <phingcall target="old-om"/>
+    <phingcall target="convert-props"/>
+  </target>
+
+  <!-- ================================================================ -->
+  <!-- C H E C K  R U N  O N L Y  O N  S C H E M A  C H A N G E         -->
+  <!-- ================================================================ -->
+  <!-- Maps the propel.runOnlyOnSchemaChange to                         -->
+  <!-- propel.internal.runOnlyOnSchemaChange                            -->
+  <!-- ================================================================ -->
+
+  <target name="check-run-only-on-schema-change">
+    <condition property="propel.internal.runOnlyOnSchemaChange">
+      <equals arg1="${propel.runOnlyOnSchemaChange}" arg2="true"/>
+    </condition>
+  </target>
+
+  <!-- ================================================================ -->
+  <!-- G E N E R A T E  P R O J E C T  S Q L                            -->
+  <!-- ================================================================ -->
+  <!-- Generate the SQL for your project, These are in addition         -->
+  <!-- to the base Turbine tables! The tables you require for your      -->
+  <!-- project should be specified in project-schema.xml.               -->
+  <!-- ================================================================ -->
+
+  <target
+    name="sql-check"
+    depends="check-run-only-on-schema-change"
+    if="propel.internal.runOnlyOnSchemaChange">
+    <uptodate
+      property="propel.internal.sql.uptodate"
+      targetfile="${propel.sql.dir}/${propel.schema.default.basename}.sql">
+      <srcfiles dir="${propel.schema.dir}" includes="**/${propel.schema.default.basename}.xml" />
+    </uptodate>
+  </target>
+
+  <target
+    name="sql"
+    depends="sql-check"
+    unless="propel.internal.sql.uptodate"
+    description="==> generates the SQL for your project">
+
+    <echo message="+------------------------------------------+"/>
+    <echo message="|                                          |"/>
+    <echo message="| Generating SQL for YOUR Propel project!  |"/>
+    <echo message="|                                          |"/>
+    <echo message="+------------------------------------------+"/>
+
+    <phingcall target="sql-template"/>
+
+  </target>
+
+  <target name="sql-template">
+    <propel-sql
+	  validate="${propel.schema.validate}"
+	  xsd="${propel.schema.xsd.file}"
+	  xsl="${propel.schema.xsl.file}"
+      outputDirectory="${propel.sql.dir}"
+      sqldbmap="${propel.sql.dir}/sqldb.map"
+      targetDatabase="${propel.database}"
+      templatePath="${propel.templatePath}"
+      packageObjectModel="${propel.packageObjectModel}"
+      >
+      <mapper type="glob" from="${propel.sql.mapper.from}" to="${propel.sql.mapper.to}"/>
+      <schemafileset dir="${propel.schema.dir}"
+        includes="${propel.schema.sql.includes}"
+        excludes="${propel.schema.sql.excludes}"
+      />
+    </propel-sql>
+  </target>
+
+
+  <target
+    name="old-sql"
+    depends="sql-check"
+    unless="propel.internal.sql.uptodate"
+    description="==> generates the SQL for your project">
+
+    <echo message="+------------------------------------------+"/>
+    <echo message="|                                          |"/>
+    <echo message="| Generating SQL for YOUR Propel project!  |"/>
+    <echo message="| (using deprecated legacy SQL template)   |"/>
+	<echo message="|                                          |"/>
+    <echo message="+------------------------------------------+"/>
+
+    <phingcall target="old-sql-template"/>
+
+  </target>
+
+  <target name="old-sql-template">
+    <propel-old-sql
+	  validate="${propel.schema.validate}"
+	  xsd="${propel.schema.xsd.file}"
+	  xsl="${propel.schema.xsl.file}"
+      outputDirectory="${propel.sql.dir}"
+      sqldbmap="${propel.sql.dir}/sqldb.map"
+      targetDatabase="${propel.database}"
+      templatePath="${propel.templatePath}"
+      packageObjectModel="${propel.packageObjectModel}"
+      >
+      <mapper type="glob" from="${propel.sql.mapper.from}" to="${propel.sql.mapper.to}"/>
+      <schemafileset dir="${propel.schema.dir}"
+        includes="${propel.schema.sql.includes}"
+        excludes="${propel.schema.sql.excludes}"
+      />
+    </propel-old-sql>
+  </target>
+
+  <!-- ================================================================ -->
+  <!-- C R E A T E  T A R G E T  D A T A B A S E                        -->
+  <!-- ================================================================ -->
+  <!-- Create the target database by executing a generated script       -->
+  <!-- that is capable of performing the task.                          -->
+  <!-- ================================================================ -->
+
+  <target name="create-db-check">
+    <condition property="propel.internal.manualCreation">
+      <equals arg1="${propel.database.manualCreation}" arg2="true"/>
+    </condition>
+  </target>
+
+  <target
+    name="create-db"
+    unless="propel.internal.manualCreation"
+    depends="create-db-check"
+    description="==> generates the target database">
+
+    <propel-data-model
+	  validate="${propel.schema.validate}"
+	  xsd="${propel.schema.xsd.file}"
+	  xsl="${propel.schema.xsl.file}"
+      controlTemplate="${propel.template.sqlDbInit}"
+      outputDirectory="${propel.sql.dir}"
+      outputFile="create-db.sql"
+      targetDatabase="${propel.database}"
+      dbEncoding="${propel.database.encoding}"
+      templatePath="${propel.templatePath}"
+      packageObjectModel="${propel.packageObjectModel}"
+      >
+      <schemafileset dir="${propel.schema.dir}"
+        includes="${propel.schema.create-db.includes}"
+        excludes="${propel.schema.create-db.excludes}"
+      />
+    </propel-data-model>
+
+    <echo message="Executing the create-db.sql script ..."/>
+
+    <sql
+      autocommit="true"
+      driver="${propel.database.driver}"
+      onerror="continue"
+      src="${propel.sql.dir}/create-db.sql"
+      url="${propel.database.createUrl}"
+    />
+  </target>
+
+  <!-- ================================================================ -->
+  <!-- I N S E R T  S I N G L E  S Q L  F I L E S                       -->
+  <!-- ================================================================ -->
+
+  <target
+    name="insert-sql"
+    description="==> inserts the generated sql ">
+
+    <propel-sql-exec
+      autocommit="true"
+      driver="${propel.database.driver}"
+      onerror="continue"
+      sqldbmap="${propel.sql.dir}/sqldb.map"
+      srcDir="${propel.sql.dir}"
+      url="${propel.database.buildUrl}"
+    />
+  </target>
+
+  <!-- ================================================================ -->
+  <!-- C R E O L E  TO  X M L                                               -->
+  <!-- ================================================================ -->
+
+  <target
+    name="creole"
+    description="==> generate xml schema from Creole metadata">
+
+    <echo message="+-----------------------------------------------+"/>
+    <echo message="|                                               |"/>
+    <echo message="| Generating XML from Creole connection !       |"/>
+    <echo message="|                                               |"/>
+    <echo message="+-----------------------------------------------+"/>
+
+    <propel-creole-transform
+      dbDriver="${propel.database.driver}"
+      dbSchema="${propel.database.schema}"
+      dbEncoding="${propel.database.encoding}"
+      dbUrl="${propel.database.url}"
+      outputFile="${propel.schema.dir}/${propel.default.schema.basename}.xml"
+      samePhpName="${propel.samePhpName}"
+      addVendorInfo="${propel.addVendorInfo}"
+      addValidators="${propel.addValidators}"
+    />
+  </target>
+
+  <!-- ================================================================ -->
+  <!-- Generate SQL from XML data file                                  -->
+  <!-- ================================================================ -->
+
+  <target
+    name="datasql"
+    description="==> generates sql from data xml">
+
+    <echo message="+-----------------------------------------------+"/>
+    <echo message="|                                               |"/>
+    <echo message="| Generating SQL from data XML !                |"/>
+    <echo message="|                                               |"/>
+    <echo message="+-----------------------------------------------+"/>
+
+    <propel-data-sql
+	  validate="${propel.schema.validate}"
+	  xsd="${propel.schema.xsd.file}"
+	  xsl="${propel.schema.xsl.file}"
+      outputDirectory="${propel.sql.dir}"
+      sqldbmap="${propel.sql.dir}/sqldb.map"
+      dbEncoding="${propel.database.encoding}"
+      targetDatabase="${propel.database}"
+      templatePath="${propel.templatePath}"
+      datadbmap="${propel.schema.dir}/datadb.map"
+      srcDir="${propel.schema.dir}"
+      >
+      <mapper type="glob" from="${propel.datasql.mapper.from}" to="${propel.datasql.mapper.to}"/>
+      <schemafileset dir="${propel.schema.dir}"
+        includes="${propel.schema.datadtd.includes}"
+        excludes="${propel.schema.datadtd.excludes}"
+      />
+    </propel-data-sql>
+  </target>
+
+  <!-- ================================================================ -->
+  <!-- Dump data from database into xml file                            -->
+  <!-- ================================================================ -->
+
+  <target
+    name="datadump"
+    description="==> dump data from database into xml file">
+
+    <echo message="+-----------------------------------------------+"/>
+    <echo message="|                                               |"/>
+    <echo message="| Dumping the data from database into XML       |"/>
+    <echo message="|                                               |"/>
+    <echo message="+-----------------------------------------------+"/>
+
+    <propel-data-dump
+	  validate="${propel.schema.validate}"
+	  xsd="${propel.schema.xsd.file}"
+	  xsl="${propel.schema.xsl.file}"
+      targetDatabase="${propel.database}"
+      datadbmap="${propel.schema.dir}/datadb.map"
+      databaseDriver="${propel.database.driver}"
+      dbEncoding="${propel.database.encoding}"
+      databaseUrl="${propel.database.url}"
+      outputDirectory="${propel.schema.dir}"
+      templatePath="${propel.templatePath}">
+      <mapper type="glob" from="${propel.datadump.mapper.from}" to="${propel.datadump.mapper.to}"/>
+      <schemafileset dir="${propel.schema.dir}"
+        includes="${propel.schema.datadtd.includes}"
+        excludes="${propel.schema.datadtd.excludes}"
+      />
+     </propel-data-dump>
+  </target>
+
+  <!-- ================================================================ -->
+  <!-- G E N E R A T E  P R O J E C T  D A T A  D T D                   -->
+  <!-- ================================================================ -->
+  <!-- Generate the DATA DTD for your project                           -->
+  <!-- ================================================================ -->
+
+  <target
+    name="datadtd"
+    description="==> generates the DATA DTD for your project">
+
+    <echo message="+-----------------------------------------------+"/>
+    <echo message="|                                               |"/>
+    <echo message="| Generating Data DTD for YOUR Propel project!  |"/>
+    <echo message="|                                               |"/>
+    <echo message="+-----------------------------------------------+"/>
+
+    <propel-data-dtd
+	  validate="${propel.schema.validate}"
+	  xsd="${propel.schema.xsd.file}"
+	  xsl="${propel.schema.xsl.file}"
+      targetDatabase="${propel.database}"
+      outputDirectory="${propel.output.dir}"
+      templatePath="${propel.templatePath}">
+      <!-- TODO: add properties for the mapper type, from, and to -->
+      <mapper type="glob" from="${propel.datadtd.mapper.from}" to="${propel.datadtd.mapper.to}"/>
+      <schemafileset dir="${propel.schema.dir}"
+        includes="${propel.schema.datadtd.includes}"
+        excludes="${propel.schema.datadtd.excludes}"
+      />
+    </propel-data-dtd>
+  </target>
+
+  <!-- ================================================================ -->
+  <!-- G E N E R A T E  P R O J E C T  P E E R  B A S E D  O M          -->
+  <!-- ================================================================ -->
+  <!-- Generate the Peer-based object model for your project.           -->
+  <!-- These are in addition to the base Propel OM!                     -->
+  <!-- ================================================================ -->
+
+  <target
+    name="om-check"
+    depends="check-run-only-on-schema-change"
+    if="propel.internal.runOnlyOnSchemaChange">
+    <uptodate
+      property="propel.internal.om.uptodate"
+      targetfile="${propel.php.dir}/report.${propel.project}.om.generation">
+      <srcfiles dir="${propel.schema.dir}" includes="**/${propel.schema.om.includes}.xml" />
+    </uptodate>
+  </target>
+
+  <target
+    name="om"
+    depends="om-check"
+    unless="propel.internal.om.uptodate"
+    description="==> generates the Peer-based object model for your project">
+
+    <echo message="+------------------------------------------+"/>
+    <echo message="|                                          |"/>
+    <echo message="| Generating Peer-based Object Model for   |"/>
+    <echo message="| YOUR Propel project! (NEW OM BUILDERS)!  |"/>
+    <echo message="|                                          |"/>
+    <echo message="+------------------------------------------+"/>
+
+    <phingcall target="om-template"/>
+    <!--<phingcall target="om-tar"/>-->
+  </target>
+
+  <target name="om-template">
+    <propel-om
+	  validate="${propel.schema.validate}"
+	  xsd="${propel.schema.xsd.file}"
+	  xsl="${propel.schema.xsl.file}"
+      outputDirectory="${propel.php.dir}"
+      targetDatabase="${propel.database}"
+      targetPackage="${propel.targetPackage}"
+      templatePath="${propel.templatePath}"
+      targetPlatform="${propel.targetPlatform}"
+      packageObjectModel="${propel.packageObjectModel}"
+      >
+      <schemafileset dir="${propel.schema.dir}"
+        includes="${propel.schema.om.includes}"
+        excludes="${propel.schema.om.excludes}"
+      />
+    </propel-om>
+  </target>
+
+  <!-- the new OM tasks -->
+
+  <target
+    name="old-om"
+    depends="om-check"
+    unless="propel.internal.om.uptodate"
+    description="==> generates the OLD Peer-based object model for your project">
+
+    <echo message="+------------------------------------------+"/>
+    <echo message="|                                          |"/>
+    <echo message="| Generating Peer-based Object Model for   |"/>
+    <echo message="| YOUR Propel project (OLD OM TEMPLATES).  |"/>
+    <echo message="|                                          |"/>
+    <echo message="+------------------------------------------+"/>
+
+    <phingcall target="old-om-template"/>
+    <!--<phingcall target="om-tar"/>-->
+  </target>
+
+  <target name="old-om-template">
+    <propel-old-om
+	  validate="${propel.schema.validate}"
+	  xsd="${propel.schema.xsd.file}"
+	  xsl="${propel.schema.xsl.file}"
+      outputDirectory="${propel.php.dir}"
+      targetDatabase="${propel.database}"
+      targetPackage="${propel.targetPackage}"
+      templatePath="${propel.templatePath}"
+      targetPlatform="${propel.targetPlatform}">
+      <schemafileset dir="${propel.schema.dir}"
+        includes="${propel.schema.om.includes}"
+        excludes="${propel.schema.om.excludes}"
+      />
+    </propel-old-om>
+  </target>
+
+
+  <!-- ================================================================== -->
+  <!-- P R O P S   T O   P H P   A R R A Y                                -->
+  <!-- ================================================================== -->
+
+  <target
+    name="convert-props"
+    description="==> converts properties file to PHP array">
+
+    <echo message="+------------------------------------------+"/>
+    <echo message="|                                          |"/>
+    <echo message="| Converting project properties file to an |"/>
+    <echo message="| array dump for run-time performance.     |"/>
+    <echo message="|                                          |"/>
+    <echo message="+------------------------------------------+"/>
+
+    <capsule
+      templatePath="${propel.templatePath}"
+      controlTemplate="${propel.template.conf}"
+      outputDirectory="${propel.phpconf.dir}"
+      outputFile="${propel.runtime.phpconf.file}">
+      <assign name="propertiesFile" value="${propel.conf.dir}/${propel.runtime.conf.file}"/>
+     </capsule>
+
+  </target>
+
+  <target
+    name="graphviz"
+    depends="sql-check"
+    description="==> generates Graphviz file for your project">
+
+    <echo message="+------------------------------------------+"/>
+    <echo message="|                                          |"/>
+    <echo message="| Generating Graphiz for YOUR Propel       |"/>
+    <echo message="| project!                                 |"/>
+    <echo message="|                                          |"/>
+    <echo message="+------------------------------------------+"/>
+
+    <propel-graphviz
+      outputDirectory="${propel.graph.dir}"
+      targetDatabase="${propel.database}"
+      sqldbmap="${propel.sql.dir}/sqldb.map"
+      packageObjectModel="${propel.packageObjectModel}">
+      <mapper type="glob" from="${propel.sql.mapper.from}" to="${propel.sql.mapper.to}"/>
+      <schemafileset dir="${propel.schema.dir}"
+        includes="${propel.schema.sql.includes}"
+        excludes="${propel.schema.sql.excludes}"
+      />
+    </propel-graphviz>
+  </target>
+
+
+</project>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build.properties-sample
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build.properties-sample	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build.properties-sample	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,190 @@
+# -------------------------------------------------------------------
+#
+# P R O P E L  C O N F I G U R A T I O N  F I L E
+#
+# -------------------------------------------------------------------
+# This file contains some example properties.  Ideally properties
+# should be specified in the project-specific build.properties file;
+# however, this file can be used to specify non-default properties 
+# that you would like to use accross all of your Propel projects.
+# -------------------------------------------------------------------
+#
+
+propel.home = .
+
+# -------------------------------------------------------------------
+#
+#  P R O J E C T
+#
+# -------------------------------------------------------------------
+# This is the name of your Propel project. The name of your Propel
+# project is used (by default) to determine where the generator will
+# find needed configuration files and will place resuilting build
+# files. E.g. if your project is named 'killerapp', Propel will 
+# look here for schema.xml and runtime-conf.xml files:
+# 
+#   projects/killerapp/
+#
+# -------------------------------------------------------------------
+
+# You can set this here, but it's preferrable to set this in a 
+# project-specific build.properties file.
+#
+# propel.project = bookstore
+
+# -------------------------------------------------------------------
+#
+#  T A R G E T  D A T A B A S E
+#
+# -------------------------------------------------------------------
+# This is the target database, only considered when generating
+# the SQL for your Propel project. Your possible choices are:
+#
+#   mssql, mysql, oracle, pgsql, sqlite
+# -------------------------------------------------------------------
+
+# You can set this here, but it's preferrable to set this in a 
+# project-specific build.properties file.
+#
+# propel.database = mysql
+
+# -------------------------------------------------------------------
+#
+#  O B J E C T  M O D E L  I N F O R M A T I O N
+#
+# -------------------------------------------------------------------
+# These settings will allow you to customize the way your
+# Peer-based object model is created.
+# -------------------------------------------------------------------
+# addGenericAccessors
+#   If true, Propel adds methods to get database fields by name/position.
+#
+# addGenericMutators
+#   If true, Propel adds methods to set database fields by name/position.
+#
+# addSaveMethod
+#   If true, Propel adds tracking code to determine how to save objects.
+#
+# addTimeStamp
+#   If true, Propel true puts time stamps in phpdoc of generated om files.
+#
+# basePrefix
+#   A string to pre-pend to the file names of base data and peer objects.
+#
+# complexObjectModel
+#   If true, Propel generates data objects with collection support and 
+#   methods to easily retreive foreign key relationships.
+#
+# targetPackage
+#   Sets the PHP "package" the om files will generated to, e.g. 
+#   "com.company.project.om".
+#
+# targetPlatform
+#   Sets whether Propel is building classes for php5 (default) 
+#   or php4 (experimental).
+#
+# packageObjectModel
+#   Sets whether Propel is packaging ObjectModel fro several 
+#   [package].schema.xml files. The <database package="packageName">
+#   attribute has to be set then. (warning: this is experimental!)
+#
+# -------------------------------------------------------------------
+
+# classes will be put in (and  included from) this directory
+# e.g. if package is "bookstore" then om will expect include('bookstore/Book.php'); to work.
+# use dot-path notation -- e.g. my.bookstore -> my/bookstore.
+#
+propel.targetPackage = ${propel.project}
+
+propel.addGenericAccessors = false
+propel.addGenericMutators = false
+propel.addSaveMethod = true
+propel.addTimeStamp = true
+propel.basePrefix = Base
+propel.complexObjectModel = true
+propel.targetPlatform = php5
+propel.packageObjectModel = false
+
+# -------------------------------------------------------------------
+#
+#  D B   C O N N E C T I O N   S E T T I N G S
+#
+# -------------------------------------------------------------------
+# Creole connection settings. These connection settings are used by
+# build tagets that perform database operations (e.g. 'insert-sql',
+# 'creole').
+#
+# You can set them here, but it's preferrable to set these properties
+# in a project-specific build.properties file.
+#
+
+# If you want to use a custom driver, specify it below, otherwise
+# leave it blank or comment it out to use Creole stock driver.
+#
+# propel.database.driver = creole.drivers.sqlite.SQLiteConnection
+
+# Note that if you do not wish to specify the database (e.g. if you
+# are using multiple databses) you can use the @DB@ token which
+# will be replaced with a database at runtime.
+#
+# propel.database.url = mysql://root@localhost/bookstore
+
+# Use the URL below to specify a DSN to used to create the database.
+# Note that this URL should not contain the database name, as you will
+# get an error if the database does not exist.
+# (This does not apply to SQLite since the databse is automatically created
+# when the connection is made -- if it does not already exist.)
+#
+# propel.database.createUrl = mysql://root@localhost/
+
+
+# -------------------------------------------------------------------
+#
+# C R E O L E  TO  X M L
+#
+# -------------------------------------------------------------------
+# These settings only applies to the 'creole' target.  
+# -------------------------------------------------------------------
+#
+# samePhpName 
+#   If true, the Creole task will set the phpName attribute for the 
+#   tables and columns to be the same as SQL name.
+#
+# addVendorInfo 
+#   If true, the Creole task will add vendor specific information 
+#   to the database schema
+#
+# addValidators 
+#   Bitfield like option to turn on/off addition of Validator and 
+#   Rule tags to the schema. Uses a boolean syntax like in php.ini.
+#   Allowed tokens are: 
+#      none       add no validators)
+#      all        add all validators)
+#      maxlength  add maxlengths for string type columns)
+#      maxvalue   add maxvalue for numeric columns)
+#      type       add notmatch validators for numeric columns)
+#      required   add required validators for required columns)
+#      unique     add unique validators for unique indexes)
+#   Allowed operators are: 
+#      &          bitwise AND 
+#      |          bitwise OR
+#      ~          bitwise NOT
+#
+# -------------------------------------------------------------------
+
+# propel.samePhpName = false
+# propel.addVendorInfo=true
+# propel.addValidators=none
+
+
+# -------------------------------------------------------------------
+#
+#  D A T A B A S E   B U I L D   C O N F I G
+#
+# -------------------------------------------------------------------
+# Some databases provide some configuration options that can be set
+# in this script.  
+#
+# === MySQL
+# propel.mysql.tableType
+#   Use this property to set the table type of generated tables (e.g. InnoDB, MyISAM).

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build.xml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build.xml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build.xml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,177 @@
+<!--
+    Use this file to faciliate easy per-project building.
+    
+    Simply create a build.properties file in your project directory,
+    for example ./projects/bookstore/build.properties, that contains
+    any needed (i.e. to override) values for that project.
+    
+    Call this build script and specify the name of the project and
+    (optionally) the name of the target you wish to execute (default is
+    'main' target) of build-propel.xml.
+
+    Normal use:
+    $> phing   -Dproject=bookstore
+    
+    Specific target: 
+    $> phing -Dproject=bookstore -Dtarget=insert-sql
+
+-->
+<project name="propel-project-builder" default="main" basedir=".">
+
+<!-- in case ${project.dir} was specified on command line, we set the project.dir
+     property here.  If it wasn't set, then this will be bogus, but it will
+     be overridden by the "set-project-dir" target. -->    
+<property name="propel.project.dir" value="${project.dir}"/>
+<resolvepath propertyName="propel.project.dir" file="${propel.project.dir}" dir="${application.startdir}"/>
+
+<!-- set a default target if none provided -->
+<property name="target" value="main"/>
+
+<!-- Set a default name for the build.properties file.
+		This allows for overriding the name of the build.properties file; however,
+		Propel still expects to find the file in the ${propel.project.dir}.
+ -->
+<property name="build.properties" value="build.properties"/>
+	
+<target name="check-buildprops-exists">
+  <available file="${propel.project.dir}/${build.properties}" property="projBuildPopertiesExists"/>  
+</target>
+
+<target name="check-buildprops" unless="projBuildPopertiesExists" depends="check-buildprops-exists">
+		<echo message="====================================================="/>
+		<echo message="Could not open ${build.properties} file:"/>
+		<echo message="		${propel.project.dir}/${build.properties}"/>
+		<echo message=" "/>
+		<echo message="Make sure that '${propel.project.dir}' is a valid path"/>
+		<echo message="and that it contains a ${build.properties} file."/>
+		<echo message="====================================================="/>	
+		
+		<fail message="Missing configuration file (see description above)."/>
+</target>
+
+<target name="check-project-or-dir-set">
+  <condition property="projectOrDirSet">
+  		<or>
+			<isset property="project"/>
+			<isset property="project.dir"/>
+		</or>
+  </condition>
+</target>
+
+<target name="check-buildprops-for-propel-gen" if="using.propel-gen" unless="projBuildPopertiesExists" depends="check-buildprops-exists">
+	<echo message="=========================================================="/>
+	<echo message="Could not open ${build.properties} file:"/>
+	<echo message="		${propel.project.dir}/${build.properties}"/>
+	<echo message=" "/>
+	<echo message="Project directory not specified or invalid. You must "/>
+	<echo message="specify the path to your project directory and your "/>
+	<echo message="project directory must contain your ${build.properties} "/>
+	<echo message="and schema.xml files.                                "/>
+	<echo message=" "/>
+	<echo message="Usage: "/>
+	<echo message=" "/>
+	<echo message="$&gt; propel-gen /path/to/projectdir [target]"/>
+	<echo message=" "/>
+	<echo message="=========================================================="/>	
+	<fail message="No project directory specified."/>
+</target>
+
+<target name="check-project-set" unless="projectOrDirSet" depends="check-project-or-dir-set">
+		<echo message="====================================================="/>
+		<echo message="Project not specified. You must enter a project name. "/>
+		<echo message="In the future you can enter it on the command line: "/>
+		<echo message=" "/>
+		<echo message="-Dproject=bookstore"/>
+		<echo message=" "/>
+		<echo message="This will attempt to find your project directory in"/>
+		<echo message="the default directory (./projects/bookstore)."/>
+		<echo message=" "/>
+		<echo message="You can also avoid this message and specicfy a custom "/>
+		<echo message="directory, using the project.dir property:"/>
+		<echo message=" "/>
+		<echo message="-Dproject.dir=/path/to/bookstore"/>
+		<echo message="====================================================="/>	
+		<input propertyname="project" promptChar=":">Project name</input>
+		<property name="propel.project" value="${project}" override="true"/>
+</target>
+
+<target name="set-project-dir" unless="project.dir" depends="check-project-set">
+	<echo>No project.dir was specified, using default path: ./projects/${project}</echo>
+	<property name="propel.project.dir" value="./projects/${project}" override="true"/>
+</target>
+
+<target name="configure" depends="set-project-dir,check-buildprops-for-propel-gen,check-buildprops">
+	<echo msg="Loading project-specific props from ${propel.project.dir}/${build.properties}"/>
+	<property file="${propel.project.dir}/${build.properties}"/>
+</target>
+
+<target name="main" depends="configure" description="The main target. Includes project-specific build.properties and calls the build-propel.xml script">
+
+ <phing phingfile="./build-propel.xml" target="${target}"/>
+ 
+</target>
+
+<!-- 
+ Convenience mappings to build-propel.xml main targets 
+ 
+ This makes it possible to use this buildfile w/o needing to specify
+ target as a property, e.g.:
+ 
+ $> phing -Dproject=bookstore insert-sql
+ 
+ The main reason for this is just consistency w/ old build-propel.xml file
+ (primarily for documentation & user confusion avoidance reasons).  There are relatively
+ few & infrequently changing main targets of build-propel.xml, so it's a non-
+ issue as far as maintenance is concerned.
+-->
+
+<target name="convert-props" depends="configure">
+	<phing phingfile="build-propel.xml" target="convert-props"/>
+</target>
+
+<target name="create-db" depends="configure">
+	<phing phingfile="build-propel.xml" target="create-db"/>
+</target>
+
+<target name="creole" depends="configure">
+	<phing phingfile="build-propel.xml" target="creole"/>
+</target>
+
+<target name="datadtd" depends="configure">
+	<phing phingfile="build-propel.xml" target="datadtd"/>
+</target>
+
+<target name="datadump" depends="configure">
+	<phing phingfile="build-propel.xml" target="datadump"/>
+</target>
+
+<target name="datasql" depends="configure">
+	<phing phingfile="build-propel.xml" target="datasql"/>
+</target>
+
+<target name="insert-sql" depends="configure">
+	<phing phingfile="build-propel.xml" target="insert-sql"/>
+</target>
+
+<target name="om" depends="configure">
+	<phing phingfile="build-propel.xml" target="om"/>
+</target>
+
+<target name="new-om" depends="configure">
+	<phing phingfile="build-propel.xml" target="new-om"/>
+</target>
+
+<target name="sql" depends="configure">
+	<phing phingfile="build-propel.xml" target="sql"/>
+</target>
+
+<target name="old-sql" depends="configure">
+	<phing phingfile="build-propel.xml" target="old-sql"/>
+</target>
+
+<target name="graphviz" depends="configure">
+	<phing phingfile="build-propel.xml" target="graphviz"/>
+</target>
+
+
+</project>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build.xml-local
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build.xml-local	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/build.xml-local	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,124 @@
+<!--
+    Use this file to faciliate easy per-project building.
+    
+    Simply create a build.properties file in this directory,
+    that contains any needed (i.e. to override) values for this project.
+    
+    Call this build script and specify the name of the project and
+    (optionally) the name of the target you wish to execute (default is
+    'main' target) of build-propel.xml.
+
+    Normal use:
+    $> phing
+    
+    Specific target: 
+    $> phing -Dtarget=insert-sql
+
+-->
+<project name="propel-project-builder" default="main" basedir=".">
+
+<!-- set to this dir -->    
+<property name="project.dir" value="."/>
+
+<!-- set a default target if none provided -->
+<property name="target" value="main"/>
+
+<target name="buildpropescheck">
+  <available file="./build.properties" property="projBuildPopertiesExists"/>  
+</target>
+
+<target name="init">
+	<echo msg="Loading project-specific props from ./build.properties"/>
+	<property file="./build.properties"/>
+</target>
+
+<target name="checkproject" unless="propel.project">
+    <fail msg="Build failed. Please make sure that propel.project is set to your project-name in local build.properties"/>
+</target>
+<target name="checkhome" unless="propel.home">
+    <fail msg="Build failed. Please make sure that propel.home is set to the propel-generator-dir in local build.properties"/>
+</target>
+<target name="checkschemadir" unless="propel.schema.dir">
+    <fail msg="Build failed. Please make sure that propel.schema.dir is set to '.' in local build.properties"/>
+</target>
+<target name="checkconfdir" unless="propel.conf.dir">
+    <fail msg="Build failed. Please make sure that propel.conf.dir is set to '.' in local build.properties"/>
+</target>
+<target name="checkoutputdir" unless="propel.output.dir">
+    <fail msg="Build failed. Please make sure that propel.output.dir is set to a directory of your choice (e.g. './build/') local build.properties"/>
+</target>
+<target name="configure" depends="init,checkproject,checkhome,checkschemadir,checkconfdir,checkoutputdir">
+    <property name="project" value="{$propel.project}"/>
+</target>
+
+<target name="main" depends="configure" 
+  description="The main target. Includes project-specific build.properties and calls the build-propel.xml script">	
+
+ <phing phingfile="${propel.home}/build-propel.xml" target="${target}"/>
+ 
+</target>
+
+<!-- 
+ Convenience mappings to build-propel.xml main targets 
+ 
+ This makes it possible to use this buildfile w/o needing to specify
+ target as a property, e.g.:
+ 
+ $> phing -Dproject=bookstore insert-sql
+ 
+ The main reason for this is just consistency w/ old build-propel.xml file
+ (primarily for documentation & user confusion avoidance reasons).  There are relatively
+ few & infrequently changing main targets of build-propel.xml, so it's a non-
+ issue as far as maintenance is concerned.
+-->
+
+<target name="convert-props" depends="configure">
+	<phing phingfile="${propel.home}/build-propel.xml" target="convert-props"/>
+</target>
+
+<target name="create-db" depends="configure">
+	<phing phingfile="${propel.home}/build-propel.xml" target="create-db"/>
+</target>
+
+<target name="creole" depends="configure">
+	<phing phingfile="${propel.home}/build-propel.xml" target="creole"/>
+</target>
+
+<target name="datadtd" depends="configure">
+	<phing phingfile="${propel.home}/build-propel.xml" target="datadtd"/>
+</target>
+
+<target name="datadump" depends="configure">
+	<phing phingfile="${propel.home}/build-propel.xml" target="datadump"/>
+</target>
+
+<target name="datasql" depends="configure">
+	<phing phingfile="${propel.home}/build-propel.xml" target="datasql"/>
+</target>
+
+<target name="insert-sql" depends="configure">
+	<phing phingfile="${propel.home}/build-propel.xml" target="insert-sql"/>
+</target>
+
+<target name="om" depends="configure">
+	<phing phingfile="${propel.home}/build-propel.xml" target="om"/>
+</target>
+
+<target name="new-om" depends="configure">
+	<phing phingfile="${propel.home}/build-propel.xml" target="new-om"/>
+</target>
+
+<target name="sql" depends="configure">
+	<phing phingfile="${propel.home}/build-propel.xml" target="sql"/>
+</target>
+
+<target name="old-sql" depends="configure">
+	<phing phingfile="${propel.home}/build-propel.xml" target="old-sql"/>
+</target>
+
+<target name="graphviz" depends="configure">
+	<phing phingfile="${propel.home}/build-propel.xml" target="graphviz"/>
+</target>
+
+
+</project>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/EngineException.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/EngineException.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/EngineException.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,33 @@
+<?php
+/*
+ *  $Id: EngineException.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+require_once 'phing/BuildException.php';
+
+/**
+ * The base class of all exceptions thrown by the engine.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Daniel Rall <dlr en collab.net> (Torque)
+ * @author Jason van Zyl <jvz en apache.org> (Torque)
+ * @version $Revision: 64 $
+ * @package propel.engine
+ */
+class EngineException extends BuildException {}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/EngineException.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/DataModelBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/DataModelBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/DataModelBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,221 @@
+<?php
+
+/*
+ *  $Id: DataModelBuilder.php 351 2006-03-15 18:42:34Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+
+/**
+ * This is the base class for any builder class that is using the data model.
+ *
+ * This could be extended by classes that build SQL DDL, PHP classes, configuration
+ * files, input forms, etc.
+ *
+ * This class has a static method to return the correct builder subclass identified by
+ * a given key.  Note that in order for this factory method to work, the properties have to have
+ * been loaded first.  Usage should look something like this (from within a AbstractProelDataModelTask subclass):
+ *
+ * <code>
+ * DataModelBuilder::setBuildProperties($this->getPropelProperties());
+ * $builder = DataModelBuilder::builderFactory($table, 'peer');
+ * // $builder (by default) instanceof PHP5ComplexPeerBuilder
+ * </code>
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder
+ */
+abstract class DataModelBuilder {
+
+	// --------------------------------------------------------------
+	// Static properties & methods
+	// --------------------------------------------------------------
+
+	/**
+	 * Build properties (after they've been transformed from "propel.some.name" => "someName").
+	 * @var array string[]
+	 */
+	private static $buildProperties = array();
+
+	/**
+	 * Sets the [name transformed] build properties to use.
+	 * @param array Property values keyed by [transformed] prop names.
+	 */
+	public static function setBuildProperties($props)
+	{
+		self::$buildProperties = $props;
+	}
+
+	/**
+	 * Get a specific [name transformed] build property.
+	 * @param string $name
+	 * @return string
+	 */
+	public static function getBuildProperty($name)
+	{
+		return isset(self::$buildProperties[$name]) ? self::$buildProperties[$name] : null;
+	}
+
+	/**
+	 * Imports and returns the classname of the builder class for specified 'type'.
+	 * @param $type The "key" for class to load.
+	 * @return string The unqualified classname.
+	 */
+	public static function getBuilderClass($type)
+	{
+		if (empty(self::$buildProperties)) {
+		    throw new BuildException("Cannot determine builder class when no build properties have been loaded (hint: Did you call DataModelBuilder::setBuildProperties(\$props) first?)");
+		}
+		$propname = 'builder' . ucfirst(strtolower($type)) . 'Class';
+		$classpath = self::getBuildProperty($propname);
+
+		if (empty($classpath)) {
+			throw new BuildException("Unable to find class path for '$propname' property.");
+		}
+
+		// This is a slight hack to workaround camel case inconsistencies for the DDL classes.
+		// Basically, we want to turn ?.?.?.sqliteDDLBuilder into ?.?.?.SqliteDDLBuilder
+		$lastdotpos = strrpos($classpath, '.');
+		if ($lastdotpos) $classpath{$lastdotpos+1} = strtoupper($classpath{$lastdotpos+1});
+		else ucfirst($classpath);
+
+		return Phing::import($classpath);
+	}
+
+	/**
+	 * Factory method to load a new builder instance based on specified type.
+	 * @param Table $table
+	 * @param $type The "key" for class to load.
+	 * @throws BuildException if specified class cannot be found / loaded.
+	 */
+	public static function builderFactory(Table $table, $type)
+	{
+		$classname = self::getBuilderClass($type);
+		return new $classname($table);
+	}
+
+	/**
+     * Utility function to build a path for use in include()/require() statement.
+     *
+     * Supports two function signatures:
+     * (1) getFilePath($dotPathClass);
+     * (2) getFilePath($dotPathPrefix, $className);
+     *
+     * @param string $path dot-path to class or to package prefix.
+     * @param string $classname class name
+     * @return string
+     */
+    public static function getFilePath($path, $classname = null, $extension = '.php')
+    {
+        $path = strtr(ltrim($path, '.'), '.', '/');
+        if ($classname !== null) {
+            if ($path !== "") { $path .= '/'; }
+            return $path . $classname . $extension;
+        } else {
+            return $path . $extension;
+        }
+    }
+
+	// --------------------------------------------------------------
+	// Non-static properties & methods inherited by subclasses
+	// --------------------------------------------------------------
+
+	/**
+	 * The current table.
+	 * @var Table
+	 */
+	private $table;
+
+	/**
+	 * An array of warning messages that can be retrieved for display (e.g. as part of phing build process).
+	 * @var array string[]
+	 */
+	private $warnings = array();
+
+	/**
+	 * Creates new instance of DataModelBuilder subclass.
+	 * @param Table $table The Table which we are using to build [OM, DDL, etc.].
+	 */
+	public function __construct(Table $table)
+	{
+		$this->table = $table;
+	}
+
+	/**
+	 * Returns the Platform class for this table (database).
+	 * @return Platform
+	 */
+	protected function getPlatform()
+	{
+		return $this->getTable()->getDatabase()->getPlatform();
+	}
+
+	/**
+	 * Returns the database for current table.
+	 * @return Database
+	 */
+	protected function getDatabase()
+	{
+		return $this->getTable()->getDatabase();
+	}
+
+	/**
+	 * Returns the current Table object.
+	 * @return Table
+	 */
+	protected function getTable()
+	{
+		return $this->table;
+	}
+
+	/**
+	 * Pushes a message onto the stack of warnings.
+	 * @param string $msg The warning message.
+	 */
+	protected function warn($msg)
+	{
+		$this->warnings[] = $msg;
+	}
+
+	/**
+	 * Gets array of warning messages.
+	 * @return array string[]
+	 */
+	public function getWarnings()
+	{
+		return $this->warnings;
+	}
+
+	/**
+	 * Wraps call to Platform->quoteIdentifier() with a check to see whether quoting is enabled.
+	 *
+	 * All subclasses should call this quoteIdentifier() method rather than calling the Platform
+	 * method directly.  This method is used by both DataSQLBuilder and DDLBuilder, and potentially
+	 * in the OM builders also, which is why it is defined in this class.
+	 *
+	 * @param string $text The text to quote.
+	 * @return string Quoted text.
+	 */
+	public function quoteIdentifier($text)
+	{
+		if (!self::getBuildProperty('disableIdentifierQuoting')) {
+			return $this->getPlatform()->quoteIdentifier($text);
+		}
+		return $text;
+	}
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/DataModelBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/ClassTools.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/ClassTools.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/ClassTools.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,107 @@
+<?php
+/*
+ *  $Id: ClassTools.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+ 
+ /**
+  * Tools to support class & package inclusion and referencing.
+  * 
+  * @author Hans Lellelid <hans en xmpl.org>
+  * @version $Revision: 64 $
+  * @package propel.engine.builder.om
+  */
+class ClassTools {
+    
+    /**
+     * Gets just classname, given a dot-path to class.
+     * @param string $qualifiedName
+     * @return string
+     */
+    public static function classname($qualifiedName)
+    {
+        $pos = strrpos($qualifiedName, '.');
+        if ($pos === false) { 
+            return $qualifiedName;  // there is no '.' in the qualifed name
+        } else {
+            return substr($qualifiedName, $pos + 1); // start just after '.'
+        }
+    }
+    
+    /**
+     * Gets the path to be used in include()/require() statement.
+     * 
+     * Supports two function signatures:
+     * (1) getFilePath($dotPathClass);
+     * (2) getFilePath($dotPathPrefix, $className);
+     * 
+     * @param string $path dot-path to class or to package prefix.
+     * @param string $classname class name
+     * @return string
+     */
+    public static function getFilePath($path, $classname = null, $extension = '.php')
+    {
+        $path = strtr(ltrim($path, '.'), '.', '/');
+        if ($classname !== null) {
+            if ($path !== "") { $path .= '/'; }
+            return $path . $classname . $extension;
+        } else {
+            return $path . $extension;
+        }
+    }
+    
+    /**
+     * Gets the basePeer path if specified for table/db.  
+     * If not, will return 'propel.util.BasePeer'
+     * @return string
+     */
+    public static function getBasePeer(Table $table) {
+        $class = $table->getBasePeer();
+        if ($class === null) {
+            $class = "propel.util.BasePeer";
+        }
+        return $class;
+    }
+    
+    /**
+     * Gets the baseClass path if specified for table/db.  
+     * If not, will return 'propel.om.BaseObject'
+     * @return string
+     */
+    public static function getBaseClass(Table $table) {
+        $class = $table->getBaseClass();
+        if ($class === null) {
+            $class = "propel.om.BaseObject";
+        }
+        return $class;
+    }
+        
+    /**
+     * Gets the interface path if specified for table.
+     * If not, will return 'propel.om.Persistent'.
+     * @return string
+     */
+    public static function getInterface(Table $table) {
+        $interface = $table->getInterface();
+        if ($interface === null && !$table->isReadOnly()) {
+            $interface = "propel.om.Persistent";
+        }
+        return $interface;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/ClassTools.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/OMBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/OMBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/OMBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,409 @@
+<?php
+
+/*
+ *  $Id: OMBuilder.php 186 2005-09-08 13:33:09Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/DataModelBuilder.php';
+
+/**
+ * Baseclass for OM-building classes.
+ * 
+ * OM-building classes are those that build a PHP (or other) class to service
+ * a single table.  This includes Peer classes, Entity classes, Map classes, 
+ * Node classes, etc.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.om
+ */
+abstract class OMBuilder extends DataModelBuilder {	
+	
+	/**
+	 * Peer builder class for current table.
+	 * @var DataModelBuilder
+	 */
+	private $peerBuilder;
+	
+	/**
+	 * Stub Peer builder class for current table.
+	 * @var DataModelBuilder
+	 */
+	private $stubPeerBuilder;
+	
+	/**
+	 * Object builder class for current table.
+	 * @var DataModelBuilder
+	 */
+	private $objectBuilder;
+
+	/**
+	 * Stub Object builder class for current table.
+	 * @var DataModelBuilder
+	 */
+	private $stubObjectBuilder;
+	
+	/**
+	 * MapBuilder builder class for current table.
+	 * @var DataModelBuilder
+	 */
+	private $mapBuilderBuilder;
+	
+	/**
+	 * Stub Interface builder class for current table.
+	 * @var DataModelBuilder
+	 */
+	private $interfaceBuilder;
+	
+	/**
+	 * Stub child object for current table.
+	 * @var DataModelBuilder
+	 */
+	private $multiExtendObjectBuilder;
+	
+	/**
+	 * Node object builder for current table.
+	 * @var DataModelBuilder
+	 */
+	private $nodeBuilder;
+	
+	/**
+	 * Node peer builder for current table.
+	 * @var DataModelBuilder
+	 */
+	private $nodePeerBuilder;
+	
+	/**
+	 * Stub node object builder for current table.
+	 * @var DataModelBuilder
+	 */
+	private $stubNodeBuilder;
+
+	/**
+	 * Stub node peer builder for current table.
+	 * @var DataModelBuilder
+	 */
+	private $stubNodePeerBuilder;
+	
+	
+	/**
+	 * Returns new or existing Peer builder class for this table.
+	 * @return DataModelBuilder
+	 */
+	public function getPeerBuilder()
+	{
+		if (!isset($this->peerBuilder)) {
+			$this->peerBuilder = DataModelBuilder::builderFactory($this->getTable(), 'peer');
+		}
+		return $this->peerBuilder;
+	}
+	
+	/**
+	 * Returns new or existing stub Peer builder class for this table.
+	 * @return DataModelBuilder
+	 */
+	public function getStubPeerBuilder()
+	{
+		if (!isset($this->stubPeerBuilder)) {
+			$this->stubPeerBuilder = DataModelBuilder::builderFactory($this->getTable(), 'peerstub');
+		}
+		return $this->stubPeerBuilder;	
+	}
+	
+	/**
+	 * Returns new or existing Object builder class for this table.
+	 * @return DataModelBuilder
+	 */
+	public function getObjectBuilder()
+	{
+		if (!isset($this->objectBuilder)) {
+			$this->objectBuilder = DataModelBuilder::builderFactory($this->getTable(), 'object');
+		}
+		return $this->objectBuilder;
+	
+	}
+	
+	/**
+	 * Returns new or existing stub Object builder class for this table.
+	 * @return DataModelBuilder
+	 */
+	public function getStubObjectBuilder()
+	{
+		if (!isset($this->stubObjectBuilder)) {
+			$this->stubObjectBuilder = DataModelBuilder::builderFactory($this->getTable(), 'objectstub');
+		}
+		return $this->stubObjectBuilder;	
+	}
+	
+	/**
+	 * Returns new or existing MapBuilder builder class for this table.
+	 * @return DataModelBuilder
+	 */
+	public function getMapBuilderBuilder()
+	{
+		if (!isset($this->mapBuilderBuilder)) {
+			$this->mapBuilderBuilder = DataModelBuilder::builderFactory($this->getTable(), 'mapbuilder');
+		}
+		return $this->mapBuilderBuilder;	
+	}
+	
+	/**
+	 * Returns new or existing stub Interface builder class for this table.
+	 * @return DataModelBuilder
+	 */
+	public function getInterfaceBuilder()
+	{
+		if (!isset($this->interfaceBuilder)) {
+			$this->interfaceBuilder = DataModelBuilder::builderFactory($this->getTable(), 'interface');
+		}
+		return $this->interfaceBuilder;	
+	}
+	
+	/**
+	 * Returns new or existing stub child object builder class for this table.
+	 * @return DataModelBuilder
+	 */
+	public function getMultiExtendObjectBuilder()
+	{
+		if (!isset($this->multiExtendObjectBuilder)) {
+			$this->multiExtendObjectBuilder = DataModelBuilder::builderFactory($this->getTable(), 'objectmultiextend');
+		}
+		return $this->multiExtendObjectBuilder;	
+	}
+	
+	/**
+	 * Returns new or existing node Object builder class for this table.
+	 * @return DataModelBuilder
+	 */
+	public function getNodeBuilder()
+	{
+		if (!isset($this->nodeBuilder)) {
+			$this->nodeBuilder = DataModelBuilder::builderFactory($this->getTable(), 'node');
+		}
+		return $this->nodeBuilder;	
+	}
+	
+	/**
+	 * Returns new or existing node Peer builder class for this table.
+	 * @return DataModelBuilder
+	 */
+	public function getNodePeerBuilder()
+	{
+		if (!isset($this->nodePeerBuilder)) {
+			$this->nodePeerBuilder = DataModelBuilder::builderFactory($this->getTable(), 'nodepeer');
+		}
+		return $this->nodePeerBuilder;	
+	}
+	
+	/**
+	 * Returns new or existing stub node Object builder class for this table.
+	 * @return DataModelBuilder
+	 */
+	public function getStubNodeBuilder()
+	{
+		if (!isset($this->stubNodeBuilder)) {
+			$this->stubNodeBuilder = DataModelBuilder::builderFactory($this->getTable(), 'nodestub');
+		}
+		return $this->stubNodeBuilder;	
+	}
+
+	/**
+	 * Returns new or existing stub node Peer builder class for this table.
+	 * @return DataModelBuilder
+	 */
+	public function getStubNodePeerBuilder()
+	{
+		if (!isset($this->stubNodePeerBuilder)) {
+			$this->stubNodePeerBuilder = DataModelBuilder::builderFactory($this->getTable(), 'nodepeerstub');
+		}
+		return $this->stubNodePeerBuilder;	
+	}
+	
+	/**
+	 * Convenience method to return a NEW Peer class builder instance.
+	 * This is used very frequently from the peer and object builders to get
+	 * a peer builder for a RELATED table.
+	 * @param Table $table
+	 * @return PeerBuilder
+	 */
+	public static function getNewPeerBuilder(Table $table)
+	{
+		return DataModelBuilder::builderFactory($table, 'peer');
+	}
+	
+	/**
+	 * Convenience method to return a NEW Object class builder instance.
+	 * This is used very frequently from the peer and object builders to get
+	 * an object builder for a RELATED table.
+	 * @param Table $table
+	 * @return ObjectBuilder
+	 */
+	public static function getNewObjectBuilder(Table $table)
+	{
+		return DataModelBuilder::builderFactory($table, 'object');
+	}
+	
+	/**
+	 * Builds the PHP source for current class and returns it as a string.
+	 * 
+	 * This is the main entry point and defines a basic structure that classes should follow. 
+	 * In most cases this method will not need to be overridden by subclasses.  This method 
+	 * does assume that the output language is PHP code, so it will need to be overridden if 
+	 * this is not the case.
+	 * 
+	 * @return string The resulting PHP sourcecode.
+	 */
+	public function build()
+	{
+		$script = "<" . "?php\n"; // intentional concatenation		
+		$this->addIncludes($script);
+		$this->addClassOpen($script);
+		$this->addClassBody($script);	
+		$this->addClassClose($script);
+		return $script;
+	}
+	
+	/**
+	 * Returns the name of the current class being built.
+	 * @return string
+	 */
+	abstract public function getClassname();
+	
+	/**
+	 * Gets the dot-path representation of current class being built.
+	 * @return string
+	 */
+	public function getClasspath()
+	{
+		if ($this->getPackage()) {
+		    $path = $this->getPackage() . '.' . $this->getClassname();
+		} else {
+			$path = $this->getClassname();
+		}
+		return $path;
+	}
+	
+	/**
+	 * Gets the full path to the file for the current class.
+	 * @return string
+	 */
+	public function getClassFilePath()
+	{
+		return parent::getFilePath($this->getPackage(), $this->getClassname());
+	}
+
+	/**
+	 * Gets package name for this table.
+	 * This is overridden by child classes that have different packages.
+	 * @return string
+	 */
+	public function getPackage()
+	{
+		$pkg = ($this->getTable()->getPackage() ? $this->getTable()->getPackage() : $this->getDatabase()->getPackage());
+		if (!$pkg) {
+		    $pkg = $this->getBuildProperty('targetPackage');
+		}
+		return $pkg;
+	}
+	
+	/**
+	 * Returns filesystem path for current package.
+	 * @return string
+	 */
+	public function getPackagePath()
+	{
+		return strtr($this->getPackage(), '.', '/');
+	}
+	
+	/**
+	 * Shortcut method to return the [stub] peer classname for current table.
+	 * This is the classname that is used whenever object or peer classes want
+	 * to invoke methods of the peer classes.
+	 * @return string (e.g. 'MyPeer')
+	 * @see StubPeerBuilder::getClassname()
+	 */
+	public function getPeerClassname() {
+		return $this->getStubPeerBuilder()->getClassname();
+	}
+		
+	/**
+	 * Returns the object classname for current table.
+	 * This is the classname that is used whenever object or peer classes want
+	 * to invoke methods of the object classes.
+	 * @return string (e.g. 'My')
+	 * @see StubPeerBuilder::getClassname()
+	 */
+	public function getObjectClassname() {
+		return $this->getStubObjectBuilder()->getClassname();
+	}
+	
+	/** 
+	 * Get the column constant name (e.g. PeerName::COLUMN_NAME).
+     * 
+     * @param Column $col The column we need a name for.
+     * @param string $phpName The PHP Name of the peer class. The 'Peer' is appended automatically.
+     * 
+     * @return string If $phpName is provided, then will return {$phpName}Peer::COLUMN_NAME; if not, then uses current table COLUMN_NAME.
+     */
+    public function getColumnConstant($col, $phpName = null)
+	{	
+		if ($col === null) {
+		    $e = new Exception("No col specified.");
+			print $e;
+			throw $e;
+		}
+		$classname = $this->getPeerClassname($phpName);
+		
+        // was it overridden in schema.xml ?
+        if ($col->getPeerName()) {
+            $const = strtoupper($col->getPeerName());
+        } else {
+            $const = strtoupper($col->getName());
+        }
+		return $classname.'::'.$const;
+    }
+	
+	/**
+     * Gets just classname, given a dot-path to class.
+     * @param string $qualifiedName
+     * @return string
+     */
+    public function classname($qualifiedName)
+    {
+        $pos = strrpos($qualifiedName, '.');
+        if ($pos === false) { 
+            return $qualifiedName;  // there is no '.' in the qualifed name
+        } else {
+            return substr($qualifiedName, $pos + 1); // start just after '.'
+        }
+    }
+	
+	/**
+     * Gets the basePeer path if specified for table/db.  
+     * If not, will return 'propel.util.BasePeer'
+     * @return string
+     */
+    public function getBasePeer(Table $table) {
+        $class = $table->getBasePeer();
+        if ($class === null) {
+            $class = "propel.util.BasePeer";
+        }
+        return $class;
+    }	
+	
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/OMBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/ObjectBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/ObjectBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/ObjectBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,148 @@
+<?php
+
+/*
+ *  $Id: ObjectBuilder.php 106 2005-06-07 03:18:28Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/om/OMBuilder.php';
+
+/**
+ * Base class for Peer-building classes.
+ * 
+ * This class is designed so that it can be extended by a PHP4PeerBuilder in addition
+ * to the "standard" PHP5PeerBuilder and PHP5ComplexOMPeerBuilder.  Hence, this class
+ * should not have any actual template code in it -- simply basic logic & utility 
+ * methods.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ */
+abstract class ObjectBuilder extends OMBuilder {
+	
+	/**
+	 * Constructs a new PeerBuilder subclass.
+	 */
+	public function __construct(Table $table) {
+		parent::__construct($table);
+	}
+		
+	/**
+	 * This method adds the contents of the generated class to the script.
+	 * 
+	 * This method is abstract and should be overridden by the subclasses.
+	 * 
+	 * Hint: Override this method in your subclass if you want to reorganize or
+	 * drastically change the contents of the generated peer class.
+	 * 
+	 * @param string &$script The script will be modified in this method.
+	 */
+	abstract protected function addClassBody(&$script);
+	
+	/**
+	 * Adds the getter methods for the column values.
+	 * This is here because it is probably generic enough to apply to templates being generated
+	 * in different langauges (e.g. PHP4 and PHP5).
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addColumnAccessorMethods(&$script)
+	{
+		$table = $this->getTable();
+		
+		foreach ($table->getColumns() as $col) {
+			
+			if ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) { 
+				$this->addTemporalAccessor($script, $col);
+			} else {
+				$this->addGenericAccessor($script, $col);
+			}
+			if ($col->isLazyLoad()) {
+			    $this->addLazyLoader($script, $col);
+			}
+		}
+	}
+	
+	/**
+	 * Adds the mutator (setter) methods for setting column values.
+	 * This is here because it is probably generic enough to apply to templates being generated
+	 * in different langauges (e.g. PHP4 and PHP5).
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addColumnMutatorMethods(&$script)
+	{
+		foreach ($this->getTable()->getColumns() as $col) {
+			
+			if ($col->isLob()) {
+				$this->addLobMutator($script, $col);
+			} elseif ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) {
+				$this->addTemporalMutator($script, $col);
+			} else {
+				$this->addDefaultMutator($script, $col);
+			}
+		}
+	}
+	
+	
+	/**
+     * Gets the baseClass path if specified for table/db.  
+     * If not, will return 'propel.om.BaseObject'
+     * @return string
+     */
+    protected function getBaseClass() {
+        $class = $this->getTable()->getBaseClass();
+        if ($class === null) {
+            $class = "propel.om.BaseObject";
+        }
+        return $class;
+    }
+	
+	/**
+     * Gets the interface path if specified for current table.
+     * If not, will return 'propel.om.Persistent'.
+     * @return string
+     */
+    protected function getInterface() {
+        $interface = $this->getTable()->getInterface();
+        if ($interface === null && !$this->getTable()->isReadOnly()) {
+            $interface = "propel.om.Persistent";
+        }
+        return $interface;
+    }
+	
+	/**
+	 * Whether to add the generic mutator methods (setByName(), setByPosition(), fromArray()).
+	 * This is based on the build property propel.addGenericMutators, and also whether the
+	 * table is read-only or an alias.
+	 */
+	protected function isAddGenericMutators()
+	{
+		$table = $this->getTable();		
+		return (!$table->isAlias() && $this->getBuildProperty('addGenericMutators') && !$table->isReadOnly());
+	}
+	
+	/**
+	 * Whether to add the generic accessor methods (getByName(), getByPosition(), toArray()).
+	 * This is based on the build property propel.addGenericAccessors, and also whether the
+	 * table is an alias.
+	 */
+	protected function isAddGenericAccessors()
+	{
+		$table = $this->getTable();		
+		return (!$table->isAlias() && $this->getBuildProperty('addGenericAccessors'));
+	}
+	
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/ObjectBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/PeerBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/PeerBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/PeerBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,269 @@
+<?php
+
+/*
+ *  $Id: PeerBuilder.php 228 2005-10-15 10:28:42Z david $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/om/OMBuilder.php';
+
+/**
+ * Base class for Peer-building classes.
+ *
+ * This class is designed so that it can be extended by a PHP4PeerBuilder in addition
+ * to the "standard" PHP5PeerBuilder and PHP5ComplexOMPeerBuilder.  Hence, this class
+ * should not have any actual template code in it -- simply basic logic & utility
+ * methods.
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ */
+abstract class PeerBuilder extends OMBuilder {
+
+	protected $basePeerClass;
+	protected $basePeerClassname;
+
+	/**
+	 * Constructs a new PeerBuilder subclass.
+	 */
+	public function __construct(Table $table) {
+		parent::__construct($table);
+		$this->basePeerClass = $this->getBasePeer($table);
+		$this->basePeerClassname = $this->classname($this->basePeerClass);
+	}
+
+	/**
+	 * Adds the addSelectColumns(), doCount(), etc. methods.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addSelectMethods(&$script)
+	{
+		$this->addAddSelectColumns($script);
+
+		$this->addCountConstants($script);
+		$this->addDoCount($script);
+
+		// consider refactoring the doSelect stuff
+		// into a top-level method
+		$this->addDoSelectOne($script);
+		$this->addDoSelect($script);
+		$this->addDoSelectRS($script);	 // <-- there's Creole code in here
+		$this->addPopulateObjects($script); // <-- there's Creole code in here
+
+	}
+
+	/**
+	 * Adds the correct getOMClass() method, depending on whether this table uses inheritance.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addGetOMClassMethod(&$script)
+	{
+		$table = $this->getTable();
+		if ($table->getChildrenColumn()) {
+			if ($table->isAbstract()) {
+			    $this->addGetOMClass_Inheritance_Abstract($script);
+			} else {
+				$this->addGetOMClass_Inheritance($script);
+			}
+		} else {
+			if ($table->isAbstract()) {
+			    $this->addGetOMClass_NoInheritance_Abstract($script);
+			} else {
+				$this->addGetOMClass_NoInheritance($script);
+			}
+		}
+	}
+
+	/**
+	 * Adds the doInsert(), doUpdate(), doDeleteAll(), doValidate(), etc. methods.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addUpdateMethods(&$script)
+	{
+		$this->addDoInsert($script);
+		$this->addDoUpdate($script);
+		$this->addDoDeleteAll($script);
+		$this->addDoDelete($script);
+		if ($this->isDeleteCascadeEmulationNeeded()) {
+			$this->addDoOnDeleteCascade($script);
+		}
+		if ($this->isDeleteSetNullEmulationNeeded()) {
+			$this->addDoOnDeleteSetNull($script);
+		}
+		$this->addDoValidate($script);
+	}
+
+	/**
+	 * Adds the retrieveByPK() (and possibly retrieveByPKs()) method(s) appropriate for this class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addRetrieveByPKMethods(&$script)
+	{
+	    if (count($this->getTable()->getPrimaryKey()) === 1) {
+			$this->addRetrieveByPK_SinglePK($script);
+	        $this->addRetrieveByPKs_SinglePK($script);
+	    } else {
+			$this->addRetrieveByPK_MultiPK($script);
+		}
+	}
+
+	/**
+	 * This method adds the contents of the generated class to the script.
+	 *
+	 * This method contains the high-level logic that determines which methods
+	 * get generated.
+	 *
+	 * Hint: Override this method in your subclass if you want to reorganize or
+	 * drastically change the contents of the generated peer class.
+	 *
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addClassBody(&$script)
+	{
+
+		$table = $this->getTable();
+
+		if (!$table->isAlias()) {
+			$this->addConstantsAndAttributes($script);
+		}
+
+		$this->addGetMapBuilder($script);
+		$this->addGetPhpNameMap($script);
+
+		$this->addTranslateFieldName($script);
+		$this->addGetFieldNames($script);
+
+		if (!$table->isAlias()) {
+			$this->addAlias($script); // alias() utility method (deprecated?)
+			$this->addSelectMethods($script);
+			$this->addGetTableMap($script);
+		}
+
+		$this->addGetOMClassMethod($script);
+
+		// add the insert, update, delete, validate etc. methods
+		if (!$table->isAlias() && !$table->isReadOnly()) {
+			$this->addUpdateMethods($script);
+		}
+
+		if (count($table->getPrimaryKey()) > 0) {
+			$this->addRetrieveByPKMethods($script);
+		}
+	}
+
+	/**
+	 * Whether the platform in use requires ON DELETE CASCADE emulation and whether there are references to this table.
+	 * @return boolean
+	 */
+	protected function isDeleteCascadeEmulationNeeded()
+	{
+		$table = $this->getTable();
+		if ((!$this->getPlatform()->supportsNativeDeleteTrigger() || $this->getBuildProperty('emulateForeignKeyConstraints')) && count($table->getReferrers()) > 0) {
+			foreach ($table->getReferrers() as $fk) {
+				if ($fk->getOnDelete() == ForeignKey::CASCADE) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Whether the platform in use requires ON DELETE SETNULL emulation and whether there are references to this table.
+	 * @return boolean
+	 */
+	protected function isDeleteSetNullEmulationNeeded()
+	{
+		$table = $this->getTable();
+		if ((!$this->getPlatform()->supportsNativeDeleteTrigger() || $this->getBuildProperty('emulateForeignKeyConstraints')) && count($table->getReferrers()) > 0) {
+			foreach ($table->getReferrers() as $fk) {
+				if ($fk->getOnDelete() == ForeignKey::SETNULL) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Whether to add the generic mutator methods (setByName(), setByPosition(), fromArray()).
+	 * This is based on the build property propel.addGenericMutators, and also whether the
+	 * table is read-only or an alias.
+	 * @return boolean
+	 */
+	protected function isAddGenericMutators()
+	{
+		$table = $this->getTable();
+		return (!$table->isAlias() && $this->getBuildProperty('addGenericMutators') && !$table->isReadOnly());
+	}
+
+	/**
+	 * Whether to add the generic accessor methods (getByName(), getByPosition(), toArray()).
+	 * This is based on the build property propel.addGenericAccessors, and also whether the
+	 * table is an alias.
+	 * @return boolean
+	 */
+	protected function isAddGenericAccessors()
+	{
+		$table = $this->getTable();
+		return (!$table->isAlias() && $this->getBuildProperty('addGenericAccessors'));
+	}
+
+	/**
+	 * Returns the retrieveByPK method name to use for this table.
+	 * If the table is an alias then the method name looks like "retrieveTablenameByPK"
+	 * otherwise simply "retrieveByPK".
+	 * @return string
+	 */
+	public function getRetrieveMethodName()
+	{
+		if ($this->getTable()->isAlias()) {
+			$retrieveMethod = "retrieve" . $this->getTable()->getPhpName() . "ByPK";
+		} else {
+			$retrieveMethod = "retrieveByPK";
+		}
+		return $retrieveMethod;
+	}
+
+
+	/**
+     * COMPATIBILITY: Get the column constant name (e.g. PeerName::COLUMN_NAME).
+	 *
+     * This method exists simply because it belonged to the 'PeerBuilder' that this
+	 * class is replacing (because of name conflict more than actual functionality overlap).
+	 * When the new builder model is finished this method will be removed.
+	 *
+     * @param Column $col The column we need a name for.
+     * @param string $phpName The PHP Name of the peer class. The 'Peer' is appended automatically.
+     *
+     * @return string If $phpName is provided, then will return {$phpName}Peer::COLUMN_NAME; if not, just COLUMN_NAME.
+	 * @deprecated
+     */
+    public static function getColumnName(Column $col, $phpName = null) {
+        // was it overridden in schema.xml ?
+        if ($col->getPeerName()) {
+            $const = strtoupper($col->getPeerName());
+        } else {
+            $const = strtoupper($col->getName());
+        }
+        if ($phpName !== null) {
+            return $phpName . 'Peer::' . $const;
+        } else {
+            return $const;
+        }
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/PeerBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicObjectBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicObjectBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicObjectBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1392 @@
+<?php
+
+/*
+ *  $Id: PHP5BasicObjectBuilder.php 298 2005-12-09 13:47:25Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/om/ObjectBuilder.php';
+
+/**
+ * Generates a PHP5 base Object class for user object model (OM).
+ *
+ * This class produces the base object class (e.g. BaseMyTable) which contains all
+ * the custom-built accessor and setter methods.
+ *
+ * This class replaces the Object.tpl, with the intent of being easier for users
+ * to customize (through extending & overriding).
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.om.php5
+ */
+class PHP5BasicObjectBuilder extends ObjectBuilder {
+
+	/**
+	 * Gets the package for the [base] object classes.
+	 * @return string
+	 */
+	public function getPackage()
+	{
+		return parent::getPackage() . ".om";
+	}
+
+	/**
+	 * Returns the name of the current class being built.
+	 * @return string
+	 */
+	public function getClassname()
+	{
+		return $this->getBuildProperty('basePrefix') . $this->getStubObjectBuilder()->getClassname();
+	}
+
+	/**
+	 * Adds the include() statements for files that this class depends on or utilizes.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addIncludes(&$script)
+	{
+
+		$table = $this->getTable();
+		$package = $this->getPackage();
+		$parentClass = $this->getBaseClass();
+		$interface = $this->getInterface();
+
+		$script .= "
+require_once '".$this->getFilePath($parentClass)."';
+";
+
+
+
+		if (!empty($interface)) {
+			$script .= "
+require_once '".$this->getFilePath($interface)."';
+";
+		}
+
+
+		if (!$table->isAlias()) {
+
+			// If any columns in table are BLOB or CLOB then we need to make
+			// sure those classes are included so we can do things like
+			// if ($v instanceof Lob) etc.
+
+			$includes_lobs = false;
+			foreach ($table->getColumns() as $col) {
+				if ($col->isLob()) {
+					$includes_lobs = true;
+					break;
+				}
+			}
+
+			if($includes_lobs) {
+				$script .= "
+include_once 'creole/util/Clob.php';
+include_once 'creole/util/Blob.php';
+";
+			}
+		} // if table is not alias
+
+		$script .= "
+
+include_once 'propel/util/Criteria.php';
+";
+
+		$script .= "
+include_once '".$this->getStubPeerBuilder()->getClassFilePath()."';
+";
+	} // addIncludes()
+
+	/**
+	 * Adds class phpdoc comment and openning of class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addClassOpen(&$script)
+	{
+
+		$table = $this->getTable();
+		$tableName = $table->getName();
+		$tableDesc = $table->getDescription();
+		$interface = $this->getInterface();
+
+		$script .= "
+/**
+ * Base class that represents a row from the '$tableName' table.
+ *
+ * $tableDesc
+ *";
+		if ($this->getBuildProperty('addTimeStamp')) {
+			$now = strftime('%c');
+			$script .= "
+ * This class was autogenerated by Propel on:
+ *
+ * $now
+ *";
+		}
+		$script .= "
+ * @package ".$this->getPackage()."
+ */
+abstract class ".$this->getClassname()." extends ".ClassTools::classname($this->getBaseClass())." ";
+
+		$interface = ClassTools::getInterface($table);
+		if ($interface) {
+		    $script .= " implements " . ClassTools::classname($interface);
+		}
+
+		$script .= " {
+
+";
+	}
+
+	/**
+	 * Specifies the methods that are added as part of the basic OM class.
+	 * This can be overridden by subclasses that wish to add more methods.
+	 * @see ObjectBuilder::addClassBody()
+	 */
+	protected function addClassBody(&$script)
+	{
+		$table = $this->getTable();
+		if (!$table->isAlias()) {
+			$this->addConstants($script);
+			$this->addAttributes($script);
+		}
+
+		$this->addColumnAccessorMethods($script);
+		$this->addColumnMutatorMethods($script);
+
+		$this->addHydrate($script);
+
+		$this->addManipulationMethods($script);
+		$this->addValidationMethods($script);
+		
+		if ($this->isAddGenericAccessors()) {
+			$this->addGetByName($script);
+			$this->addGetByPosition($script);
+			$this->addToArray($script);
+		}
+
+		if ($this->isAddGenericMutators()) {
+		    $this->addSetByName($script);
+			$this->addSetByPosition($script);
+			$this->addFromArray($script);
+		}
+
+		$this->addBuildCriteria($script);
+		$this->addBuildPkeyCriteria($script);
+		$this->addGetPrimaryKey($script);
+		$this->addSetPrimaryKey($script);
+
+		$this->addCopy($script);
+
+		if (!$table->isAlias()) {
+			$this->addGetPeer($script);
+		}
+	}
+
+	/**
+	 * Closes class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addClassClose(&$script)
+	{
+		$script .= "
+} // " . $this->getClassname() . "
+";
+	}
+
+	/**
+	 * Adds any constants to the class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addConstants(&$script)
+	{
+		// nothing to do here any more
+		// fieldnameTypeConstants have been moved to class BasePeer [sv]
+	}
+
+	/**
+	 * Adds class attributes.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addAttributes(&$script)
+	{
+		$script .= "
+	/**
+	 * The Peer class.
+	 * Instance provides a convenient way of calling static methods on a class
+	 * that calling code may not be able to identify.
+	 * @var ".$this->getPeerClassname()."
+	 */
+	protected static \$peer;
+";
+		if (!$this->getTable()->isAlias()) {
+		    $this->addColumnAttributes($script);
+		}
+	}
+
+	/**
+	 * Adds variables that store column values.
+	 * @param string &$script The script will be modified in this method.
+	 * @see addColumnNameConstants()
+	 */
+	protected function addColumnAttributes(&$script) {
+
+		$table = $this->getTable();
+
+		foreach ($table->getColumns() as $col) {
+
+			$cptype = $col->getPhpNative();
+			$clo=strtolower($col->getName());
+			$defVal = "";
+			if (($val = $col->getPhpDefaultValue()) !== null) {
+				settype($val, $cptype);
+				$defaultValue = var_export($val, true);
+				$defVal = " = " . $defaultValue;
+			}
+
+			$script .= "
+
+	/**
+	 * The value for the $clo field.
+	 * @var $cptype
+	 */
+	protected \$" . $clo . $defVal . ";
+";
+
+			if ($col->isLazyLoad()) {
+				$script .= "
+	/**
+	 * Whether the lazy-loaded $clo value has been loaded from database.
+	 * This is necessary to avoid repeated lookups if $clo column is NULL in the db.
+	 * @var boolean
+	 */
+	protected \$".$clo."_isLoaded = false;
+";
+			}
+
+		}  // foreach col
+
+	} // addColumnAttributes()
+
+	/**
+	 * Adds the getPeer() method.
+	 * This is a convenient, non introspective way of getting the Peer class for a particular object.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addGetPeer(&$script)
+	{
+		$script .= "
+	/**
+	 * Returns a peer instance associated with this om.
+	 *
+	 * Since Peer classes are not to have any instance attributes, this method returns the
+	 * same instance for all member of this class. The method could therefore
+	 * be static, but this would prevent one from overriding the behavior.
+	 *
+	 * @return ".$this->getPeerClassname()."
+	 */
+	public function getPeer()
+	{
+		if (self::\$peer === null) {
+			self::\$peer = new ".$this->getPeerClassname()."();
+		}
+		return self::\$peer;
+	}
+";
+	}
+
+	// --------------------------------------------------------------
+	//
+	// A C C E S S O R    M E T H O D S
+	//
+	// --------------------------------------------------------------
+
+	/**
+	 * Adds a date/time/timestamp getter method.
+	 * @param string &$script The script will be modified in this method.
+	 * @param Column $col The current column.
+	 * @see parent::addColumnAccessors()
+	 */
+	protected function addTemporalAccessor(&$script, $col)
+	{
+		$cfc=$col->getPhpName();
+		$clo=strtolower($col->getName());
+
+		// these default values are based on the Creole defaults
+		// the date and time default formats are locale-sensitive
+		if ($col->getType() === PropelTypes::DATE) {
+			$defaultfmt = $this->getBuildProperty('defaultDateFormat');
+		} elseif ($col->getType() === PropelTypes::TIME) {
+			$defaultfmt = $this->getBuildProperty('defaultTimeFormat');
+		} elseif ($col->getType() === PropelTypes::TIMESTAMP) {
+			$defaultfmt = $this->getBuildProperty('defaultTimeStampFormat');
+		}
+		
+		// if the default format property was an empty string, then we'll set it
+		// to NULL, which will return the "native" integer timestamp
+		if (empty($defaultfmt)) { $defaultfmt = null; }
+
+		$script .= "
+	/**
+	 * Get the [optionally formatted] [$clo] column value.
+	 * ".$col->getDescription()."
+	 * @param string \$format The date/time format string (either date()-style or strftime()-style).
+	 *							If format is NULL, then the integer unix timestamp will be returned.
+	 * @return mixed Formatted date/time value as string or integer unix timestamp (if format is NULL).
+	 * @throws PropelException - if unable to convert the date/time to timestamp.
+	 */
+	public function get$cfc(\$format = ".var_export($defaultfmt, true)."";
+		if ($col->isLazyLoad()) $script .= ", \$con = null";
+		$script .= ")
+	{
+";
+		if ($col->isLazyLoad()) {
+			$script .= "
+		if (!\$this->".$clo."_isLoaded && \$this->$clo === null && !\$this->isNew()) {
+			\$this->load$cfc(\$con);
+		}
+";
+		}
+		$script .= "
+		if (\$this->$clo === null || \$this->$clo === '') {
+			return null;
+		} elseif (!is_int(\$this->$clo)) {
+			// a non-timestamp value was set externally, so we convert it
+			\$ts = strtotime(\$this->$clo);
+			if (\$ts === -1 || \$ts === false) { // in PHP 5.1 return value changes to FALSE
+				throw new PropelException(\"Unable to parse value of [$clo] as date/time value: \" . var_export(\$this->$clo, true));
+			}
+		} else {
+			\$ts = \$this->$clo;
+		}
+		if (\$format === null) {
+			return \$ts;
+		} elseif (strpos(\$format, '%') !== false) {
+			return strftime(\$format, \$ts);
+		} else {
+			return date(\$format, \$ts);
+		}
+	}
+";
+	} // addTemporalAccessor
+
+	/**
+	 * Adds a normal (non-temporal) getter method.
+	 * @param string &$script The script will be modified in this method.
+	 * @param Column $col The current column.
+	 * @see parent::addColumnAccessors()
+	 */
+	protected function addGenericAccessor(&$script, $col)
+	{
+		$cfc=$col->getPhpName();
+		$clo=strtolower($col->getName());
+
+		$script .= "
+	/**
+	 * Get the [$clo] column value.
+	 * ".$col->getDescription()."
+	 * @return ".$col->getPhpNative()."
+	 */
+	public function get$cfc(";
+		if ($col->isLazyLoad()) $script .= "\$con = null";
+		$script .= ")
+	{
+";
+		if ($col->isLazyLoad()) {
+			$script .= "
+		if (!\$this->".$clo."_isLoaded && \$this->$clo === null && !\$this->isNew()) {
+			\$this->load$cfc(\$con);
+		}
+";
+		}
+		$script .= "
+		return \$this->$clo;
+	}
+";
+	}
+
+	/**
+	 * Adds the lazy loader method.
+	 * @param string &$script The script will be modified in this method.
+	 * @param Column $col The current column.
+	 * @see parent::addColumnAccessors()
+	 */
+	protected function addLazyLoader(&$script, $col)
+	{
+		$cfc=$col->getPhpName();
+		$clo=strtolower($col->getName());
+
+		$script .= "
+	/**
+	 * Load the value for the lazy-loaded [$clo] column.
+	 *
+	 * This method performs an additional query to return the value for
+	 * the [$clo] column, since it is not populated by
+	 * the hydrate() method.
+	 *
+	 * @param \$con Connection
+	 * @return void
+	 * @throws PropelException - any underlying error will be wrapped and re-thrown.
+	 */
+	protected function load$cfc(\$con = null)
+	{
+		\$c = \$this->buildPkeyCriteria();
+		\$c->addSelectColumn(".$this->getColumnConstant($col).");
+		try {
+			\$rs = ".$this->getPeerClassname()."::doSelectRS(\$c, \$con);
+			\$rs->next();
+";
+		$affix = CreoleTypes::getAffix(CreoleTypes::getCreoleCode($col->getType()));
+		$clo = strtolower($col->getName());
+		switch($col->getType()) {
+			 case PropelTypes::DATE:
+			 case PropelTypes::TIME:
+			 case PropelTypes::TIMESTAMP:
+			 	$script .= "
+			\$this->$clo = \$rs->get$affix(1, null);
+";
+				break;
+			default:
+				$script .= "
+			\$this->$clo = \$rs->get$affix(1);
+";
+		} // switch
+		$script .= "
+			\$this->".$clo."_isLoaded = true;
+		} catch (Exception \$e) {
+			throw new PropelException(\"Error loading value for [$clo] column on demand.\", \$e);
+		}
+	}
+";
+
+	} // addLazyLoader()
+
+
+
+	// --------------------------------------------------------------
+	//
+	// M U T A T O R    M E T H O D S
+	//
+	// --------------------------------------------------------------
+
+	/**
+	 * Adds the open of the mutator (setter) method for a column.
+	 * @param string &$script The script will be modified in this method.
+	 * @param Column $col The current column.
+	 */
+	protected function addMutatorOpen(&$script, Column $col)
+	{
+		$cfc=$col->getPhpName();
+		$clo=strtolower($col->getName());
+
+		$script .= "
+	/**
+	 * Set the value of [$clo] column.
+	 * ".$col->getDescription()."
+	 * @param ".$col->getPhpNative()." \$v new value
+	 * @return void
+	 */
+	public function set$cfc(\$v)
+	{
+";
+		if ($col->isLazyLoad()) {
+			$script .= "
+		// explicitly set the is-loaded flag to true for this lazy load col;
+		// it doesn't matter if the value is actually set or not (logic below) as
+		// any attempt to set the value means that no db lookup should be performed
+		// when the get$cfc() method is called.
+		\$this->".$clo."_isLoaded = true;
+";
+		}
+
+	}
+
+	/**
+	 * Adds the close of the mutator (setter) method for a column.
+	 * This can be overridden (e.g. by PHP5ComplexObjectBuilder) if additional functionality is needed.
+	 * @param string &$script The script will be modified in this method.
+	 * @param Column $col The current column.
+	 */
+	protected function addMutatorClose(&$script, Column $col)
+	{
+				$script .= "
+	} // set".$col->getPhpName()."()
+";
+	}
+
+	/**
+	 * Adds a setter for date/time/timestamp columns.
+	 * @param string &$script The script will be modified in this method.
+	 * @param Column $col The current column.
+	 * @see parent::addColumnMutators()
+	 */
+	protected function addLobMutator(&$script, Column $col)
+	{
+		$this->addMutatorOpen($script, $col);
+		$clo = strtolower($col->getName());
+		// Setting of LOB columns gets some special handling
+
+		if ($col->getPropelType() === PropelTypes::BLOB || $col->getPropelType() === PropelTypes::LONGVARBINARY ) {
+			$lobClass = 'Blob';
+		} else {
+			$lobClass = 'Clob';
+		}
+		$script .= "
+		// if the passed in parameter is the *same* object that
+		// is stored internally then we use the Lob->isModified()
+		// method to know whether contents changed.
+		if (\$v instanceof Lob && \$v === \$this->$clo) {
+			\$changed = \$v->isModified();
+		} else {
+			\$changed = (\$this->$clo !== \$v);
+		}
+		if (\$changed) {
+			if ( !(\$v instanceof Lob) ) {
+				\$obj = new $lobClass();
+				\$obj->setContents(\$v);
+			} else {
+				\$obj = \$v;
+			}
+			\$this->$clo = \$obj;
+			\$this->modifiedColumns[] = ".$this->getColumnConstant($col).";
+		}
+";
+		$this->addMutatorClose($script, $col);
+
+	} // addLobMutatorSnippet
+
+
+	/**
+	 * Adds a setter method for date/time/timestamp columns.
+	 * @param string &$script The script will be modified in this method.
+	 * @param Column $col The current column.
+	 * @see parent::addColumnMutators()
+	 */
+	protected function addTemporalMutator(&$script, Column $col)
+	{
+		$clo = strtolower($col->getName());
+
+		$defaultValue = null;
+		if (($val = $col->getPhpDefaultValue()) !== null) {
+			settype($val, $col->getPhpNative());
+			$defaultValue = var_export($val, true);
+		}
+
+		$this->addMutatorOpen($script, $col);
+
+		$script .= "
+		if (\$v !== null && !is_int(\$v)) {
+			\$ts = strtotime(\$v);
+			if (\$ts === -1 || \$ts === false) { // in PHP 5.1 return value changes to FALSE
+				throw new PropelException(\"Unable to parse date/time value for [$clo] from input: \" . var_export(\$v, true));
+			}
+		} else {
+			\$ts = \$v;
+		}
+		if (\$this->$clo !== \$ts";
+		if ($defaultValue !== null) {
+			$script .= " || \$ts === $defaultValue";
+		}
+		$script .= ") {
+			\$this->$clo = \$ts;
+			\$this->modifiedColumns[] = ".$this->getColumnConstant($col).";
+		}
+";
+		$this->addMutatorClose($script, $col);
+	}
+
+	/**
+	 * Adds setter method for "normal" columns.
+	 * @param string &$script The script will be modified in this method.
+	 * @param Column $col The current column.
+	 * @see parent::addColumnMutators()
+	 */
+	protected function addDefaultMutator(&$script, Column $col)
+	{
+		$clo = strtolower($col->getName());
+
+		// FIXME: refactor this
+		$defaultValue = null;
+		if (($val = $col->getPhpDefaultValue()) !== null) {
+			settype($val, $col->getPhpNative());
+			$defaultValue = var_export($val, true);
+		}
+
+		$this->addMutatorOpen($script, $col);
+		$script .= "
+		if (\$this->$clo !== \$v";
+		if ($defaultValue !== null) {
+			$script .= " || \$v === $defaultValue";
+		}
+		$script .= ") {
+			\$this->$clo = \$v;
+			\$this->modifiedColumns[] = ".$this->getColumnConstant($col).";
+		}
+";
+		$this->addMutatorClose($script, $col);
+	}
+
+	/**
+	 * Adds the hydrate() method, which sets attributes of the object based on a ResultSet.
+	 */
+	protected function addHydrate(&$script)
+	{
+		$table = $this->getTable();
+
+		$script .= "
+	/**
+	 * Hydrates (populates) the object variables with values from the database resultset.
+	 *
+	 * An offset (1-based \"start column\") is specified so that objects can be hydrated
+	 * with a subset of the columns in the resultset rows.  This is needed, for example,
+	 * for results of JOIN queries where the resultset row includes columns from two or
+	 * more tables.
+	 *
+	 * @param ResultSet \$rs The ResultSet class with cursor advanced to desired record pos.
+	 * @param int \$startcol 1-based offset column which indicates which restultset column to start with.
+	 * @return int next starting column
+	 * @throws PropelException  - Any caught Exception will be rewrapped as a PropelException.
+	 */
+	public function hydrate(ResultSet \$rs, \$startcol = 1)
+	{
+		try {
+";
+			$n = 0;
+			foreach($table->getColumns() as $col) {
+				if(!$col->isLazyLoad()) {
+					$affix = CreoleTypes::getAffix(CreoleTypes::getCreoleCode($col->getType()));
+					$clo = strtolower($col->getName());
+					switch($col->getType()) {
+
+						case PropelTypes::DATE:
+						case PropelTypes::TIME:
+						case PropelTypes::TIMESTAMP:
+							$script .= "
+			\$this->$clo = \$rs->get$affix(\$startcol + $n, null);
+";
+							break;
+						default:
+							$script .= "
+			\$this->$clo = \$rs->get$affix(\$startcol + $n);
+";
+					}
+					$n++;
+				} // if col->isLazyLoad()
+			} /* foreach */
+
+			if ($this->getBuildProperty("addSaveMethod")) {
+				$script .= "
+			\$this->resetModified();
+";
+			}
+
+			$script .= "
+			\$this->setNew(false);
+
+			// FIXME - using NUM_COLUMNS may be clearer.
+			return \$startcol + $n; // $n = ".$this->getPeerClassname()."::NUM_COLUMNS - ".$this->getPeerClassname()."::NUM_LAZY_LOAD_COLUMNS).
+
+		} catch (Exception \$e) {
+			throw new PropelException(\"Error populating ".$table->getPhpName()." object\", \$e);
+		}
+	}
+";
+
+	} // addHydrate()
+
+
+	/**
+	 *
+	 */
+	protected function addBuildPkeyCriteria(&$script) {
+
+
+		$script .= "
+	/**
+	 * Builds a Criteria object containing the primary key for this object.
+	 *
+	 * Unlike buildCriteria() this method includes the primary key values regardless
+	 * of whether or not they have been modified.
+	 *
+	 * @return Criteria The Criteria object containing value(s) for primary key(s).
+	 */
+	public function buildPkeyCriteria()
+	{
+		\$criteria = new Criteria(".$this->getPeerClassname()."::DATABASE_NAME);
+";
+		foreach ($this->getTable()->getColumns() as $col) {
+			$clo = strtolower($col->getName());
+			if ($col->isPrimaryKey()) {
+				$script .= "
+		\$criteria->add(".$this->getColumnConstant($col).", \$this->$clo);";
+			}
+		}
+
+		$script .= "
+
+		return \$criteria;
+	}
+";
+
+	}
+
+	/**
+	 *
+	 */
+	protected function addBuildCriteria(&$script)
+	{
+		$script .= "
+	/**
+	 * Build a Criteria object containing the values of all modified columns in this object.
+	 *
+	 * @return Criteria The Criteria object containing all modified values.
+	 */
+	public function buildCriteria()
+	{
+		\$criteria = new Criteria(".$this->getPeerClassname()."::DATABASE_NAME);
+";
+		foreach ($this->getTable()->getColumns() as $col) {
+			$clo = strtolower($col->getName());
+			$script .= "
+		if (\$this->isColumnModified(".$this->getColumnConstant($col).")) \$criteria->add(".$this->getColumnConstant($col).", \$this->$clo);";
+		}
+		$script .= "
+
+		return \$criteria;
+	}
+";
+	} // addBuildCriteria()
+
+	protected function addToArray(&$script)
+	{
+		$script .= "
+	/**
+	 * Exports the object as an array.
+	 *
+	 * You can specify the key type of the array by passing one of the class
+	 * type constants.
+	 *
+	 * @param string \$keyType One of the class type constants TYPE_PHPNAME,
+	 *                        TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM
+	 * @return an associative array containing the field names (as keys) and field values
+	 */
+	public function toArray(\$keyType = BasePeer::TYPE_PHPNAME)
+	{
+		\$keys = ".$this->getPeerClassname()."::getFieldNames(\$keyType);
+		\$result = array(";
+		foreach ($this->getTable()->getColumns() as $num => $col) {
+			$script .= "
+			\$keys[$num] => \$this->get".$col->getPhpName()."(),";
+		}
+		$script .= "
+		);
+		return \$result;
+	}
+";
+	} // addToArray()
+
+	protected function addGetByName(&$script)
+	{
+		$script .= "
+	/**
+	 * Retrieves a field from the object by name passed in as a string.
+	 *
+	 * @param string \$name name
+	 * @param string \$type The type of fieldname the \$name is of:
+	 *                     one of the class type constants TYPE_PHPNAME,
+	 *                     TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM
+	 * @return mixed Value of field.
+	 */
+	public function getByName(\$name, \$type = BasePeer::TYPE_PHPNAME)
+	{
+		\$pos = ".$this->getPeerClassname()."::translateFieldName(\$name, \$type, BasePeer::TYPE_NUM);
+		return \$this->getByPosition(\$pos);
+	}
+";
+	}
+
+	protected function addGetByPosition(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * Retrieves a field from the object by Position as specified in the xml schema.
+	 * Zero-based.
+	 *
+	 * @param int \$pos position in xml schema
+	 * @return mixed Value of field at \$pos
+	 */
+	public function getByPosition(\$pos)
+	{
+		switch(\$pos) {";
+	$i = 0;
+	foreach ($table->getColumns() as $col) {
+		$cfc = $col->getPhpName();
+		$cptype = $col->getPhpNative();// not safe to use it because some methods may return objects (Blob)
+$script .= "
+			case $i:
+				return \$this->get$cfc();
+				break;";
+		$i++;
+	} /* foreach */
+$script .= "
+			default:
+				return null;
+				break;
+		} // switch()
+	}
+";
+	}
+
+	protected function addSetByName(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * Sets a field from the object by name passed in as a string.
+	 *
+	 * @param string \$name peer name
+	 * @param mixed \$value field value
+	 * @param string \$type The type of fieldname the \$name is of:
+	 *                     one of the class type constants TYPE_PHPNAME,
+	 *                     TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM
+	 * @return void
+	 */
+	public function setByName(\$name, \$value, \$type = BasePeer::TYPE_PHPNAME)
+	{
+		\$pos = ".$this->getPeerClassname()."::translateFieldName(\$name, \$type, BasePeer::TYPE_NUM);
+		return \$this->setByPosition(\$pos, \$value);
+	}
+";
+	}
+
+	protected function addSetByPosition(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * Sets a field from the object by Position as specified in the xml schema.
+	 * Zero-based.
+	 *
+	 * @param int \$pos position in xml schema
+	 * @param mixed \$value field value
+	 * @return void
+	 */
+	public function setByPosition(\$pos, \$value)
+	{
+		switch(\$pos) {";
+		$i = 0;
+		foreach ($table->getColumns() as $col) {
+			$cfc = $col->getPhpName();
+			$cptype = $col->getPhpNative();
+			$script .= "
+			case $i:
+				\$this->set$cfc(\$value);
+				break;";
+			$i++;
+		} /* foreach */
+		$script .= "
+		} // switch()
+	}
+";
+	} // addSetByPosition()
+
+	protected function addFromArray(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * Populates the object using an array.
+	 *
+	 * This is particularly useful when populating an object from one of the
+	 * request arrays (e.g. \$_POST).  This method goes through the column
+	 * names, checking to see whether a matching key exists in populated
+	 * array. If so the setByName() method is called for that column.
+	 *
+	 * You can specify the key type of the array by additionally passing one
+	 * of the class type constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME,
+	 * TYPE_NUM. The default key type is the column's phpname (e.g. 'authorId')
+	 *
+	 * @param array  \$arr     An array to populate the object from.
+	 * @param string \$keyType The type of keys the array uses.
+	 * @return void
+	 */
+	public function fromArray(\$arr, \$keyType = BasePeer::TYPE_PHPNAME)
+	{
+		\$keys = ".$this->getPeerClassname()."::getFieldNames(\$keyType);
+";
+		foreach ($table->getColumns() as $num => $col) {
+			$cfc = $col->getPhpName();
+			$cptype = $col->getPhpNative();
+			$script .= "
+		if (array_key_exists(\$keys[$num], \$arr)) \$this->set$cfc(\$arr[\$keys[$num]]);";
+		} /* foreach */
+		$script .= "
+	}
+";
+	} // addFromArray
+
+
+
+	protected function addDelete(&$script)
+	{
+		$script .= "
+	/**
+	 * Removes this object from datastore and sets delete attribute.
+	 *
+	 * @param Connection \$con
+	 * @return void
+	 * @throws PropelException
+	 * @see BaseObject::setDeleted()
+	 * @see BaseObject::isDeleted()
+	 */
+	public function delete(\$con = null)
+	{
+		if (\$this->isDeleted()) {
+			throw new PropelException(\"This object has already been deleted.\");
+		}
+
+		if (\$con === null) {
+			\$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME);
+		}
+
+		try {
+			\$con->begin();
+			".$this->getPeerClassname()."::doDelete(\$this, \$con);
+			\$this->setDeleted(true);
+			\$con->commit();
+		} catch (PropelException \$e) {
+			\$con->rollback();
+			throw \$e;
+		}
+	}
+";
+	} // addDelete()
+
+	/**
+	 * Adds the methods related to saving and deleting the object.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addManipulationMethods(&$script)
+	{
+		$this->addDelete($script);
+		$this->addSave($script);
+	}
+	
+	/**
+	 * Adds the methods related to validationg the object.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addValidationMethods(&$script)
+	{
+		$this->addValidationFailuresAttribute($script);
+		$this->addGetValidationFailures($script);
+		$this->addValidate($script);
+	}
+	
+	/**
+	 * Adds the save() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addSave(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * Stores the object in the database.
+	 *
+	 * If the object is new, it inserts it; otherwise an update is performed.
+	 *
+	 * @param Connection \$con
+	 * @return int The number of rows affected by this insert/update operation (for non-complex OM this will be at most 1).
+	 * @throws PropelException
+	 */
+	public function save(\$con = null)
+	{
+		\$affectedRows = 0; // initialize var to track total num of affected rows
+
+		// If this object has been modified, then save it to the database.
+		if (\$this->isModified()) {
+			if (\$this->isNew()) {
+				\$pk = ".$this->getPeerClassname()."::doInsert(\$this, \$con);
+				\$affectedRows += 1; // we are assuming that there is only 1 row per doInsert() which
+									 // should always be true here (even though technically
+									 // BasePeer::doInsert() can insert multiple rows).
+";
+		if ($table->getIdMethod() != "none") {
+			if (count($pks = $table->getPrimaryKey())) {
+				foreach ($pks as $pk) {
+					if ($pk->isAutoIncrement()) {
+						$script .= "
+					\$this->set".$pk->getPhpName()."(\$pk);  //[IMV] update autoincrement primary key
+";
+					}
+				}
+			}
+		}
+		$script .= "
+					\$this->setNew(false);
+			} else {
+					\$affectedRows += ".$this->getPeerClassname()."::doUpdate(\$this, \$con);
+			}
+				\$this->resetModified(); // [HL] After being saved an object is no longer 'modified'
+		} // if \$this->isModified()
+
+		return \$affectedRows;
+	} // save()
+";
+
+	} // addSave()
+
+	/**
+	 * Adds the $validationFailures attribute to store ValidationFailed objects.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addValidationFailuresAttribute(&$script)
+	{
+		$script .= "
+	/**
+	 * Array of ValidationFailed objects.
+	 * @var array ValidationFailed[]
+	 */
+	protected \$validationFailures = array();
+";
+	}
+
+	/**
+	 * Adds the validate() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addValidate(&$script)
+	{
+		$script .= "
+	/**
+	 * Validates the objects modified field values.
+	 *
+	 * If \$columns is either a column name or an array of column names
+	 * only those columns are validated.
+	 *
+	 * @param mixed \$columns Column name or an array of column names.
+	 *
+	 * @return mixed <code>true</code> if all columns pass validation
+	 *			  or an array of <code>ValidationFailed</code> objects for columns that fail.
+	 */
+	public function validate(\$columns = null)
+	{
+		if (\$columns) {
+			return ".$this->getPeerClassname()."::doValidate(\$this, \$columns);
+		}
+		return ".$this->getPeerClassname()."::doValidate(\$this);
+	}
+";
+
+	} // addValidate()
+
+	/**
+	 * Adds the getValidationFailures() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addGetValidationFailures(&$script)
+	{
+		$script .= "
+	/**
+	 * Gets any ValidationFailed objects that resulted from last call to validate().
+	 *
+	 *
+	 * @return array ValidationFailed[]
+	 * @see validate()
+	 */
+	public function getValidationFailures()
+	{
+		return \$this->validationFailures;
+	}
+";
+	} // addGetValidationFailures()
+
+	/**
+	 * Adds the correct getPrimaryKey() method for this object.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addGetPrimaryKey(&$script)
+	{
+		$pkeys = $this->getTable()->getPrimaryKey();
+		if (count($pkeys) == 1) {
+		    $this->addGetPrimaryKey_SinglePK($script);
+		} elseif (count($pkeys) > 1) {
+			$this->addGetPrimaryKey_MultiPK($script);
+		} else {
+			// no primary key -- this is deprecated, since we don't *need* this method anymore
+			$this->addGetPrimaryKey_NoPK($script);
+		}
+	}
+
+	/**
+	 * Adds the getPrimaryKey() method for tables that contain a single-column primary key.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addGetPrimaryKey_SinglePK(&$script)
+	{
+		$table = $this->getTable();
+		$pkeys = $table->getPrimaryKey();
+		$cptype = $pkeys[0]->getPhpType();
+
+		$script .= "
+	/**
+	 * Returns the primary key for this object (row).
+	 * @return $cptype
+	 */
+	public function getPrimaryKey()
+	{
+		return \$this->get".$pkeys[0]->getPhpName()."();
+	}
+";
+	} // addetPrimaryKey_SingleFK
+
+	/**
+	 * Adds the setPrimaryKey() method for tables that contain a multi-column primary key.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addGetPrimaryKey_MultiPK(&$script)
+	{
+
+		$script .= "
+	/**
+	 * Returns the composite primary key for this object.
+	 * The array elements will be in same order as specified in XML.
+	 * @return array
+	 */
+	public function getPrimaryKey()
+	{
+		\$pks = array();
+";
+		$i = 0;
+		foreach ($this->getTable()->getPrimaryKey() as $pk) {
+			$script .= "
+		\$pks[$i] = \$this->get".$pk->getPhpName()."();
+";
+			$i++;
+		} /* foreach */
+		$script .= "
+		return \$pks;
+	}
+";
+	} // addGetPrimaryKey_MultiFK()
+
+	/**
+	 * Adds the getPrimaryKey() method for objects that have no primary key.
+	 * This "feature" is dreprecated, since the getPrimaryKey() method is not required
+	 * by the Persistent interface (or used by the templates).  Hence, this method is also
+	 * deprecated.
+	 * @param string &$script The script will be modified in this method.
+	 * @deprecated
+	 */
+	protected function addGetPrimaryKey_NoPK(&$script)
+	{
+		$script .= "
+	/**
+	 * Returns NULL since this table doesn't have a primary key.
+	 * This method exists only for BC and is deprecated!
+	 * @return null
+	 */
+	public function getPrimaryKey()
+	{
+		return null;
+	}
+";
+	}
+	/**
+	 * Adds the correct setPrimaryKey() method for this object.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addSetPrimaryKey(&$script)
+	{
+		$pkeys = $this->getTable()->getPrimaryKey();
+		if (count($pkeys) == 1) {
+		    $this->addSetPrimaryKey_SinglePK($script);
+		} elseif (count($pkeys) > 1) {
+			$this->addSetPrimaryKey_MultiPK($script);
+		} else {
+			// no primary key -- this is deprecated, since we don't *need* this method anymore
+			$this->addSetPrimaryKey_NoPK($script);
+		}
+	}
+
+	/**
+	 * Adds the setPrimaryKey() method for tables that contain a single-column primary key.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addSetPrimaryKey_SinglePK(&$script)
+	{
+
+		$pkeys = $this->getTable()->getPrimaryKey();
+		$col = $pkeys[0];
+		$clo=strtolower($col->getName());
+		$ctype = $col->getPhpNative();
+
+		$script .= "
+	/**
+	 * Generic method to set the primary key ($clo column).
+	 *
+	 * @param $ctype \$key Primary key.
+	 * @return void
+	 */
+	public function setPrimaryKey(\$key)
+	{
+		\$this->set".$col->getPhpName()."(\$key);
+	}
+";
+	} // addSetPrimaryKey_SinglePK
+
+	/**
+	 * Adds the setPrimaryKey() method for tables that contain a multi-columnprimary key.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addSetPrimaryKey_MultiPK(&$script)
+	{
+
+		$script .="
+	/**
+	 * Set the [composite] primary key.
+	 *
+	 * @param array \$keys The elements of the composite key (order must match the order in XML file).
+	 * @return void
+	 */
+	public function setPrimaryKey(\$keys)
+	{
+";
+			$i = 0;
+			foreach ($this->getTable()->getPrimaryKey() as $pk) {
+				$pktype = $pk->getPhpNative();
+				$script .= "
+		\$this->set".$pk->getPhpName()."(\$keys[$i]);
+";
+				$i++;
+			} /* foreach ($table->getPrimaryKey() */
+			$script .= "
+	}
+";
+	} // addSetPrimaryKey_MultiPK
+
+	/**
+	 * Adds the setPrimaryKey() method for objects that have no primary key.
+	 * This "feature" is dreprecated, since the setPrimaryKey() method is not required
+	 * by the Persistent interface (or used by the templates).  Hence, this method is also
+	 * deprecated.
+	 * @param string &$script The script will be modified in this method.
+	 * @deprecated
+	 */
+	protected function addSetPrimaryKey_NoPK(&$script)
+	{
+		$script .="
+	/**
+	 * Dummy primary key setter.
+	 *
+	 * This function only exists to preserve backwards compatibility.  It is no longer
+	 * needed or required by the Persistent interface.  It will be removed in next BC-breaking
+	 * release of Propel.
+	 *
+	 * @deprecated
+	 */
+	 public function setPrimaryKey(\$pk)
+	 {
+		 // do nothing, because this object doesn't have any primary keys
+	 }
+";
+	}
+
+	/**
+	 * Adds the copy() method, which (in complex OM) includes the $deepCopy param for making copies of related objects.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addCopy(&$script)
+	{
+		$this->addCopyInto($script);
+
+		$table = $this->getTable();
+
+		$script .= "
+	/**
+	 * Makes a copy of this object that will be inserted as a new row in table when saved.
+	 * It creates a new object filling in the simple attributes, but skipping any primary
+	 * keys that are defined for the table.
+	 *
+	 * @return ".$table->getPhpName()." Clone of current object.
+	 * @throws PropelException
+	 */
+	public function copy()
+	{
+		// we use get_class(), because this might be a subclass
+		\$clazz = get_class(\$this);
+		\$copyObj = new \$clazz();
+		\$this->copyInto(\$copyObj);
+		return \$copyObj;
+	}
+";
+	} // addCopy()
+
+	/**
+	 * Adds the copy() method.
+	 */
+	protected function addCopyInto(&$script)
+	{
+		$table = $this->getTable();
+
+		$script .= "
+	/**
+	 * Sets contents of passed object to values from current object.
+	 *
+	 * @param object \$copyObj An object of ".$table->getPhpName()." (or compatible) type.
+	 * @return ".$table->getPhpName()." Clone of current object.
+	 * @throws PropelException
+	 */
+	public function copyInto(\$copyObj)
+	{
+";
+
+		$pkcols = array();
+		foreach ($table->getColumns() as $pkcol) {
+			if ($pkcol->isPrimaryKey()) {
+				$pkcols[] = $pkcol->getName();
+			}
+		}
+
+		foreach ($table->getColumns() as $col) {
+			if (!in_array($col->getName(), $pkcols)) {
+				$script .= "
+		\$copyObj->set<?php echo $col->getPhpName()?>(\$this-><?php echo strtolower($col->getName()) ?>);";
+			}
+		} // foreach
+
+		$script .= "
+
+		\$copyObj->setNew(true);";
+
+		foreach ($table->getColumns() as $col) {
+			if ($col->isPrimaryKey()) {
+				$coldefval = $col->getPhpDefaultValue();
+				$coldefval = var_export($coldefval, true);
+				$script .= "
+		\$copyObj->set".$col->getPhpName() ."($coldefval); // this is a pkey column, so set to default value";
+			} // if col->isPrimaryKey
+		} // foreach
+		$script .= "
+		return \$copyObj;
+	}
+";
+	} // addCopy()
+
+} // PHP5BasicObjectBuilder


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicObjectBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicPeerBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicPeerBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicPeerBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1472 @@
+<?php
+
+/*
+ *  $Id: PHP5BasicPeerBuilder.php 358 2006-04-18 17:40:40Z oliver $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/om/PeerBuilder.php';
+
+/**
+ * Generates a PHP5 base Peer class for user object model (OM).
+ *
+ * This class produces the base peer class (e.g. BaseMyPeer) which contains all
+ * the custom-built query and manipulator methods.
+ *
+ * This class replaces the Peer.tpl, with the intent of being easier for users
+ * to customize (through extending & overriding).
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.om.php5
+ */
+class PHP5BasicPeerBuilder extends PeerBuilder {
+
+	/**
+	 * Returns the name of the current class being built.
+	 * @return string
+	 */
+	public function getClassname()
+	{
+		return $this->getBuildProperty('basePrefix') . $this->getStubPeerBuilder()->getClassname();
+	}
+
+	/**
+	 * Gets the package for the [base] peer classes.
+	 * @return string
+	 */
+	public function getPackage()
+	{
+		return parent::getPackage() . ".om";
+	}
+
+	/**
+	 * Adds the include() statements for files that this class depends on or utilizes.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addIncludes(&$script) {
+
+		$table = $this->getTable();
+
+		$basePeerFile = $this->getFilePath($this->basePeerClass);
+		$objectFile = $this->getStubObjectBuilder()->getClassFilePath();
+
+		$script .= "
+require_once '$basePeerFile';
+// The object class -- needed for instanceof checks in this class.
+// actual class may be a subclass -- as returned by ".$this->getPeerClassname()."::getOMClass()
+include_once '$objectFile';";
+
+		$script .= "
+";
+
+	} // addIncludes()
+
+	/**
+	 * Adds class phpdoc comment and openning of class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addClassOpen(&$script) {
+
+		$tableName = $this->getTable()->getName();
+		$tableDesc = $this->getTable()->getDescription();
+
+		$script .= "
+/**
+ * Base static class for performing query and update operations on the '$tableName' table.
+ *
+ * $tableDesc
+ *";
+		if ($this->getBuildProperty('addTimeStamp')) {
+			$now = strftime('%c');
+			$script .= "
+ * This class was autogenerated by Propel on:
+ *
+ * $now
+ *";
+		}
+		$script .= "
+ * @package ".$this->getPackage()."
+ */
+abstract class ".$this->getClassname()." {
+";
+	}
+
+	/**
+	 * Closes class.
+	 * Adds closing brace at end of class and the static map builder registration code.
+	 * @param string &$script The script will be modified in this method.
+	 * @see addStaticMapBuilderRegistration()
+	 */
+	protected function addClassClose(&$script)
+	{
+		$script .= "
+} // " . $this->getClassname() . "
+";
+		$this->addStaticMapBuilderRegistration($script);
+	}
+
+	/**
+	 * Adds the static map builder registraction code.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addStaticMapBuilderRegistration(&$script)
+	{
+		$table = $this->getTable();
+		$mapBuilderFile = $this->getMapBuilderBuilder()->getClassFilePath();
+
+		$script .= "
+// static code to register the map builder for this Peer with the main Propel class
+if (Propel::isInit()) {
+	// the MapBuilder classes register themselves with Propel during initialization
+	// so we need to load them here.
+	try {
+		".$this->getClassname()."::getMapBuilder();
+	} catch (Exception \$e) {
+		Propel::log('Could not initialize Peer: ' . \$e->getMessage(), Propel::LOG_ERR);
+	}
+} else {
+	// even if Propel is not yet initialized, the map builder class can be registered
+	// now and then it will be loaded when Propel initializes.
+	require_once '$mapBuilderFile';
+	Propel::registerMapBuilder('".$this->getMapBuilderBuilder()->getClasspath()."');
+}
+";
+	}
+
+	/**
+	 * Adds constant and variable declarations that go at the top of the class.
+	 * @param string &$script The script will be modified in this method.
+	 * @see addColumnNameConstants()
+	 */
+	protected function addConstantsAndAttributes(&$script)
+	{
+		$tableName = $this->getTable()->getName();
+		$dbName = $this->getDatabase()->getName();
+		$script .= "
+	/** the default database name for this class */
+	const DATABASE_NAME = '$dbName';
+
+	/** the table name for this class */
+	const TABLE_NAME = '$tableName';
+
+	/** A class that can be returned by this peer. */
+	const CLASS_DEFAULT = '".$this->getStubObjectBuilder()->getClasspath()."';
+
+	/** The total number of columns. */
+	const NUM_COLUMNS = ".$this->getTable()->getNumColumns().";
+
+	/** The number of lazy-loaded columns. */
+	const NUM_LAZY_LOAD_COLUMNS = ".$this->getTable()->getNumLazyLoadColumns().";
+
+";
+		$this->addColumnNameConstants($script);
+		$this->addInheritanceColumnConstants($script);
+
+		$script .= "
+	/** The PHP to DB Name Mapping */
+	private static \$phpNameMap = null;
+
+";
+
+		$this->addFieldNamesAttribute($script);
+		$this->addFieldKeysAttribute($script);
+		
+	}
+
+	/**
+	 * Adds the COLUMN_NAME contants to the class definition.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addColumnNameConstants(&$script)
+	{
+		foreach ($this->getTable()->getColumns() as $col) {
+
+			$script .= "
+	/** the column name for the ".strtoupper($col->getName()) ." field */
+	const ".$this->getColumnName($col) ." = '".$this->getTable()->getName().".".strtoupper($col->getName())."';
+";
+		} // foreach
+	}
+
+	protected function addFieldNamesAttribute(&$script)
+	{
+		$table = $this->getTable();
+
+		$tableColumns = $table->getColumns();
+		$tablePhpname = $table->getPhpName();
+
+		$script .= "
+	/**
+	 * holds an array of fieldnames
+	 *
+	 * first dimension keys are the type constants
+	 * e.g. self::\$fieldNames[self::TYPE_PHPNAME][0] = 'Id'
+	 */
+	private static \$fieldNames = array (
+		BasePeer::TYPE_PHPNAME => array (";
+		foreach ($tableColumns as $col) {
+			$script .= "'".$col->getPhpName()."', ";
+		}
+		$script .= "),
+		BasePeer::TYPE_COLNAME => array (";
+		foreach ($tableColumns as $col) {
+			$script .= $this->getColumnConstant($col).", ";
+		}
+		$script .= "),
+		BasePeer::TYPE_FIELDNAME => array (";
+		foreach ($tableColumns as $col) {
+			$script .= "'".$col->getName()."', ";
+		}
+		$script .= "),
+		BasePeer::TYPE_NUM => array (";
+		foreach ($tableColumns as $num => $col) {
+			$script .= "$num, ";
+		}
+		$script .= ")
+	);
+";
+	}
+
+	protected function addFieldKeysAttribute(&$script)
+	{
+		$table = $this->getTable();
+
+		$tableColumns = $table->getColumns();
+		$tablePhpname = $table->getPhpName();
+
+		$script .= "
+	/**
+	 * holds an array of keys for quick access to the fieldnames array
+	 *
+	 * first dimension keys are the type constants
+	 * e.g. self::\$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0
+	 */
+	private static \$fieldKeys = array (
+		BasePeer::TYPE_PHPNAME => array (";
+		foreach ($tableColumns as $num => $col) {
+			$script .= "'".$col->getPhpName()."' => $num, ";
+		}
+		$script .= "),
+		BasePeer::TYPE_COLNAME => array (";
+		foreach ($tableColumns as $num => $col) {
+			$script .= $this->getColumnConstant($col)." => $num, ";
+		}
+		$script .= "),
+		BasePeer::TYPE_FIELDNAME => array (";
+		foreach ($tableColumns as $num => $col) {
+			$script .= "'".$col->getName()."' => $num, ";
+		}
+		$script .= "),
+		BasePeer::TYPE_NUM => array (";
+		foreach ($tableColumns as $num => $col) {
+			$script .= "$num, ";
+		}
+		$script .= ")
+	);
+";
+	} // addFielKeysAttribute
+
+
+	protected function addGetFieldNames(&$script)
+	{
+		$script .= "
+	/**
+	 * Returns an array of of field names.
+	 *
+	 * @param  string \$type The type of fieldnames to return:
+	 *                      One of the class type constants TYPE_PHPNAME,
+	 *                      TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM
+	 * @return array A list of field names
+	 */
+
+	static public function getFieldNames(\$type = BasePeer::TYPE_PHPNAME)
+	{
+		if (!array_key_exists(\$type, self::\$fieldNames)) {
+			throw new PropelException('Method getFieldNames() expects the parameter \$type to be one of the class constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM. ' . \$type . ' was given.');
+		}
+		return self::\$fieldNames[\$type];
+	}
+";
+
+	} // addGetFieldNames()
+
+	protected function addTranslateFieldName(&$script)
+	{
+		$script .= "
+	/**
+	 * Translates a fieldname to another type
+	 *
+	 * @param string \$name field name
+	 * @param string \$fromType One of the class type constants TYPE_PHPNAME,
+	 *                         TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM
+	 * @param string \$toType   One of the class type constants
+	 * @return string translated name of the field.
+	 */
+	static public function translateFieldName(\$name, \$fromType, \$toType)
+	{
+		\$toNames = self::getFieldNames(\$toType);
+		\$key = isset(self::\$fieldKeys[\$fromType][\$name]) ? self::\$fieldKeys[\$fromType][\$name] : null;
+		if (\$key === null) {
+			throw new PropelException(\"'\$name' could not be found in the field names of type '\$fromType'. These are: \" . print_r(self::\$fieldKeys[\$fromType], true));
+		}
+		return \$toNames[\$key];
+	}
+";
+	} // addTranslateFieldName()
+
+	/**
+	 * Adds the getMapBuilder() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addGetMapBuilder(&$script)
+	{
+		$script .= "
+	/**
+	 * @return MapBuilder the map builder for this peer
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function getMapBuilder()
+	{
+		include_once '" . $this->getMapBuilderBuilder()->getClassFilePath()."';
+		return ".$this->basePeerClassname."::getMapBuilder('". $this->getMapBuilderBuilder()->getClasspath() ."');
+	}";
+	}
+
+	/**
+	 * Adds the getPhpNameMap() method.
+	 * @param string &$script The script will be modified in this method.
+	 * @todo Replace with static version (this can be built at build-time).
+	 */
+	protected function addGetPhpNameMap(&$script)
+	{
+		$script .= "
+	/**
+	 * Gets a map (hash) of PHP names to DB column names.
+	 *
+	 * @return array The PHP to DB name map for this peer
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 * @deprecated Use the getFieldNames() and translateFieldName() methods instead of this.
+	 */
+	public static function getPhpNameMap()
+	{
+		if (self::\$phpNameMap === null) {
+			\$map = ".$this->getTable()->getPhpName()."Peer::getTableMap();
+			\$columns = \$map->getColumns();
+			\$nameMap = array();
+			foreach (\$columns as \$column) {
+				\$nameMap[\$column->getPhpName()] = \$column->getColumnName();
+			}
+			self::\$phpNameMap = \$nameMap;
+		}
+		return self::\$phpNameMap;
+	}";
+	}
+
+	/**
+	 * Adds the CLASSKEY_* and CLASSNAME_* constants used for inheritance.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	public function addInheritanceColumnConstants(&$script)
+	{
+		if ($this->getTable()->getChildrenColumn()) {
+
+			$col = $this->getTable()->getChildrenColumn();
+			$tfc = $this->getTable()->getPhpName();
+			$cfc = $col->getPhpName();
+
+			if ($col->isEnumeratedClasses()) {
+
+				if ($col->isPrimitiveNumeric()) $quote = "";
+				else $quote = '"';
+
+				foreach ($col->getChildren() as $child) {
+					$childBuilder = $this->getMultiExtendObjectBuilder();
+					$childBuilder->setChild($child);
+
+					$script .= "
+	/** A key representing a particular subclass */
+	const CLASSKEY_".strtoupper($child->getKey())." = '" . $child->getKey() . "';
+
+        /** A key representing a particular subclass */
+        const CLASSKEY_".strtoupper($child->getClassName())." = '" . $child->getKey() . "';
+
+	/** A class that can be returned by this peer. */
+	const CLASSNAME_".strtoupper($child->getKey())." = '". $childBuilder->getClasspath() . "';
+";
+				} /* foreach children */
+			} /* if col->isenumerated...() */
+		} /* if table->getchildrencolumn() */
+
+	} //
+
+
+
+	/**
+	 * Adds the alias() utility method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addAlias(&$script)
+	{
+		$script .= "
+	/**
+	 * Convenience method which changes table.column to alias.column.
+	 *
+	 * Using this method you can maintain SQL abstraction while using column aliases.
+	 * <code>
+	 *		\$c->addAlias(\"alias1\", TablePeer::TABLE_NAME);
+	 *		\$c->addJoin(TablePeer::alias(\"alias1\", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN);
+	 * </code>
+	 * @param string \$alias The alias for the current table.
+	 * @param string \$column The column name for current table. (i.e. ".$this->getTable()->getPhpName()."Peer::COLUMN_NAME).
+	 * @return string
+	 */
+	public static function alias(\$alias, \$column)
+	{
+		return str_replace(".$this->getPeerClassname()."::TABLE_NAME.'.', \$alias.'.', \$column);
+	}
+";
+	} // addAliasMethod
+
+	/**
+	 * Adds the addSelectColumns() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addAddSelectColumns(&$script)
+	{
+		$script .= "
+	/**
+	 * Add all the columns needed to create a new object.
+	 *
+	 * Note: any columns that were marked with lazyLoad=\"true\" in the
+	 * XML schema will not be added to the select list and only loaded
+	 * on demand.
+	 *
+	 * @param criteria object containing the columns to add.
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function addSelectColumns(Criteria \$criteria)
+	{
+";
+		foreach ($this->getTable()->getColumns() as $col) {
+			if (!$col->isLazyLoad()) {
+				$script .= "
+		\$criteria->addSelectColumn(".$this->getPeerClassname()."::".$this->getColumnName($col).");
+";
+			} // if !col->isLazyLoad
+		} // foreach
+		$script .="
+	}
+";
+	} // addAddSelectColumns()
+
+
+
+	/**
+	 * Adds the COUNT constants.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addCountConstants(&$script)
+	{
+		$table = $this->getTable();
+		$count_col = "*";
+		/*
+		* FIXME
+		* (HL) wanted to remove this because AFAIK count(*) is generally
+		* optimized in databases, and furthermore the code below isn't correct
+		* (multi-pkey needs to be accounted for)....
+		*/
+		if ($table->hasPrimaryKey()) {
+			$pk = $table->getPrimaryKey();
+			$count_col = $table->getName().".".strtoupper($pk[0]->getName());
+		}
+
+		$script .= "
+	const COUNT = 'COUNT($count_col)';
+	const COUNT_DISTINCT = 'COUNT(DISTINCT $count_col)';
+";
+	}
+
+	/**
+	 * Adds the doCount() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoCount(&$script)
+	{
+		$script .= "
+	/**
+	 * Returns the number of rows matching criteria.
+	 *
+	 * @param Criteria \$criteria
+	 * @param boolean \$distinct Whether to select only distinct columns (You can also set DISTINCT modifier in Criteria).
+	 * @param Connection \$con
+	 * @return int Number of matching rows.
+	 */
+	public static function doCount(Criteria \$criteria, \$distinct = false, \$con = null)
+	{
+		// we're going to modify criteria, so copy it first
+		\$criteria = clone \$criteria;
+
+		// clear out anything that might confuse the ORDER BY clause
+		\$criteria->clearSelectColumns()->clearOrderByColumns();
+		if (\$distinct || in_array(Criteria::DISTINCT, \$criteria->getSelectModifiers())) {
+			\$criteria->addSelectColumn(".$this->getPeerClassname()."::COUNT_DISTINCT);
+		} else {
+			\$criteria->addSelectColumn(".$this->getPeerClassname()."::COUNT);
+		}
+
+		// just in case we're grouping: add those columns to the select statement
+		foreach(\$criteria->getGroupByColumns() as \$column)
+		{
+			\$criteria->addSelectColumn(\$column);
+		}
+
+		\$rs = ".$this->getPeerClassname()."::doSelectRS(\$criteria, \$con);
+		if (\$rs->next()) {
+			return \$rs->getInt(1);
+		} else {
+			// no rows returned; we infer that means 0 matches.
+			return 0;
+		}
+	}";
+	}
+
+	/**
+	 * Adds the doSelectOne() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoSelectOne(&$script)
+	{
+		$script .= "
+	/**
+	 * Method to select one object from the DB.
+	 *
+	 * @param Criteria \$criteria object used to create the SELECT statement.
+	 * @param Connection \$con
+	 * @return ".$this->getTable()->getPhpName()."
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function doSelectOne(Criteria \$criteria, \$con = null)
+	{
+		\$critcopy = clone \$criteria;
+		\$critcopy->setLimit(1);
+		\$objects = ".$this->getPeerClassname()."::doSelect(\$critcopy, \$con);
+		if (\$objects) {
+			return \$objects[0];
+		}
+		return null;
+	}";
+	}
+
+	/**
+	 * Adds the doSelect() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoSelect(&$script)
+	{
+		$script .= "
+	/**
+	 * Method to do selects.
+	 *
+	 * @param Criteria \$criteria The Criteria object used to build the SELECT statement.
+	 * @param Connection \$con
+	 * @return array Array of selected Objects
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function doSelect(Criteria \$criteria, \$con = null)
+	{
+		return ".$this->getPeerClassname()."::populateObjects(".$this->getPeerClassname()."::doSelectRS(\$criteria, \$con));
+	}";
+	}
+
+	/**
+	 * Adds the doSelectRS() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoSelectRS(&$script)
+	{
+
+		$script .= "
+	/**
+	 * Prepares the Criteria object and uses the parent doSelect()
+	 * method to get a ResultSet.
+	 *
+	 * Use this method directly if you want to just get the resultset
+	 * (instead of an array of objects).
+	 *
+	 * @param Criteria \$criteria The Criteria object used to build the SELECT statement.
+	 * @param Connection \$con the connection to use
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 * @return ResultSet The resultset object with numerically-indexed fields.
+	 * @see ".$this->basePeerClassname."::doSelect()
+	 */
+	public static function doSelectRS(Criteria \$criteria, \$con = null)
+	{
+		if (\$con === null) {
+			\$con = Propel::getConnection(self::DATABASE_NAME);
+		}
+
+		if (!\$criteria->getSelectColumns()) {
+			\$criteria = clone \$criteria;
+			".$this->getPeerClassname()."::addSelectColumns(\$criteria);
+		}
+
+		// Set the correct dbName
+		\$criteria->setDbName(self::DATABASE_NAME);
+
+		// BasePeer returns a Creole ResultSet, set to return
+		// rows indexed numerically.
+		return ".$this->basePeerClassname."::doSelect(\$criteria, \$con);
+	}";
+	}
+
+	/**
+	 * Adds the populateObjects() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addPopulateObjects(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * The returned array will contain objects of the default type or
+	 * objects that inherit from the default.
+	 *
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function populateObjects(ResultSet \$rs)
+	{
+		\$results = array();
+	";
+		if (!$table->getChildrenColumn()) {
+			$script .= "
+		// set the class once to avoid overhead in the loop
+		\$cls = ".$this->getPeerClassname()."::getOMClass();
+		\$cls = Propel::import(\$cls);";
+		}
+
+		$script .= "
+		// populate the object(s)
+		while(\$rs->next()) {
+		";
+		if ($table->getChildrenColumn()) {
+			$script .= "
+			// class must be set each time from the record row
+			\$cls = Propel::import(".$this->getPeerClassname()."::getOMClass(\$rs, 1));
+			\$obj = new \$cls();
+			\$obj->hydrate(\$rs);
+			\$results[] = \$obj;
+			";
+		} else {
+			$script .= "
+			\$obj = new \$cls();
+			\$obj->hydrate(\$rs);
+			\$results[] = \$obj;
+			";
+		}
+		$script .= "
+		}
+		return \$results;
+	}";
+	}
+
+	/**
+	 * Adds a getOMClass() for non-abstract tables that have inheritance.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addGetOMClass_Inheritance(&$script)
+	{
+		$col = $this->getTable()->getChildrenColumn();
+		$script .= "
+	/**
+	 * The returned Class will contain objects of the default type or
+	 * objects that inherit from the default.
+	 *
+	 * @param ResultSet \$rs ResultSet with pointer to record containing om class.
+	 * @param int \$colnum Column to examine for OM class information (first is 1).
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function getOMClass(ResultSet \$rs, \$colnum)
+	{
+		try {
+";
+		if ($col->isEnumeratedClasses()) {
+			$script .= "
+			\$omClass = null;
+			\$classKey = \$rs->getString(\$colnum - 1 + " . $col->getPosition() . ");
+
+			switch(\$classKey) {
+";
+			foreach ($col->getChildren() as $child) {
+				$script .= "
+				case self::CLASSKEY_".$child->getKey().":
+					\$omClass = self::CLASSNAME_".strtoupper($child->getKey()).";
+					break;
+";
+			} /* foreach */
+			$script .= "
+				default:
+					\$omClass = self::CLASS_DEFAULT;
+";
+			$script .= "
+			} // switch
+";
+		} else { /* if not enumerated */
+			$script .= "
+			\$omClass = Propel::import(\$rs->getString(\$colnum - 1 + ".$col->getPosition()."));
+";
+		}
+		$script .= "
+		} catch (Exception \$e) {
+			throw new PropelException('Unable to get OM class.', \$e);
+		}
+		return \$omClass;
+	}
+";
+	}
+
+	/**
+	 * Adds a getOMClass() signature for abstract tables that have inheritance.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addGetOMClass_Inheritance_Abstract(&$script)
+	{
+		$script .= "
+	/**
+	 * The returned Class will contain objects of the default type or
+	 * objects that inherit from the default.
+	 *
+	 * This method must be overridden by the stub subclass, because
+	 * ".$this->getTable()->getPhpName()." is declared abstract in the schema.
+	 *
+	 * @param ResultSet \$rs ResultSet with pointer to record containing om class.
+	 * @param int \$colnum Column to examine for OM class information (first is 1).
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	abstract public static function getOMClass();
+";
+	}
+
+	/**
+	 * Adds a getOMClass() for non-abstract tables that do note use inheritance.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addGetOMClass_NoInheritance(&$script)
+	{
+		$script .= "
+	/**
+	 * The class that the Peer will make instances of.
+	 *
+	 * This uses a dot-path notation which is tranalted into a path
+	 * relative to a location on the PHP include_path.
+	 * (e.g. path.to.MyClass -> 'path/to/MyClass.php')
+	 *
+	 * @return string path.to.ClassName
+	 */
+	public static function getOMClass()
+	{
+		return ".$this->getPeerClassname()."::CLASS_DEFAULT;
+	}
+";
+	}
+
+	/**
+	 * Adds a getOMClass() signature for abstract tables that do not have inheritance.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addGetOMClass_NoInheritance_Abstract(&$script)
+	{
+		$script .= "
+	/**
+	 * The class that the Peer will make instances of.
+	 *
+	 * This method must be overridden by the stub subclass, because
+	 * ".$this->getTable()->getPhpName()." is declared abstract in the schema.
+	 */
+	abstract public static function getOMClass();
+";
+	}
+
+	/**
+	 * Adds the doInsert() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoInsert(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * Method perform an INSERT on the database, given a ".$table->getPhpName()." or Criteria object.
+	 *
+	 * @param mixed \$values Criteria or ".$table->getPhpName()." object containing data that is used to create the INSERT statement.
+	 * @param Connection \$con the connection to use
+	 * @return mixed The new primary key.
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function doInsert(\$values, \$con = null)
+	{
+		if (\$con === null) {
+			\$con = Propel::getConnection(self::DATABASE_NAME);
+		}
+
+		if (\$values instanceof Criteria) {
+			\$criteria = clone \$values; // rename for clarity
+		} else {
+			\$criteria = \$values->buildCriteria(); // build Criteria from ".$table->getPhpName()." object
+		}
+";
+
+		foreach ($table->getColumns() as $col) {
+			$cfc = $col->getPhpName();
+			if ($col->isPrimaryKey() && $col->isAutoIncrement() && $table->getIdMethod() != "none") {
+				$script .= "
+		\$criteria->remove(".$this->getColumnConstant($col)."); // remove pkey col since this table uses auto-increment
+";
+			}
+		}
+		$script .= "
+
+		// Set the correct dbName
+		\$criteria->setDbName(self::DATABASE_NAME);
+
+		try {
+			// use transaction because \$criteria could contain info
+			// for more than one table (I guess, conceivably)
+			\$con->begin();
+			\$pk = ".$this->basePeerClassname."::doInsert(\$criteria, \$con);
+			\$con->commit();
+		} catch(PropelException \$e) {
+			\$con->rollback();
+			throw \$e;
+		}
+
+		return \$pk;
+	}
+";
+	}
+
+	/**
+	 * Adds the doUpdate() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoUpdate(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * Method perform an UPDATE on the database, given a ".$table->getPhpName()." or Criteria object.
+	 *
+	 * @param mixed \$values Criteria or ".$table->getPhpName()." object containing data that is used to create the UPDATE statement.
+	 * @param Connection \$con The connection to use (specify Connection object to exert more control over transactions).
+	 * @return int The number of affected rows (if supported by underlying database driver).
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function doUpdate(\$values, \$con = null)
+	{
+		if (\$con === null) {
+			\$con = Propel::getConnection(self::DATABASE_NAME);
+		}
+
+		\$selectCriteria = new Criteria(self::DATABASE_NAME);
+
+		if (\$values instanceof Criteria) {
+			\$criteria = clone \$values; // rename for clarity
+";
+		foreach ($table->getColumns() as $col) {
+			if($col->isPrimaryKey()) {
+				$script .= "
+			\$comparison = \$criteria->getComparison(".$this->getColumnConstant($col).");
+			\$selectCriteria->add(".$this->getColumnConstant($col).", \$criteria->remove(".$this->getColumnConstant($col)."), \$comparison);
+";
+			}  /* if col is prim key */
+	 	} /* foreach */
+
+		$script .= "
+		} else { // \$values is ".$table->getPhpName()." object
+			\$criteria = \$values->buildCriteria(); // gets full criteria
+			\$selectCriteria = \$values->buildPkeyCriteria(); // gets criteria w/ primary key(s)
+		}
+
+		// set the correct dbName
+		\$criteria->setDbName(self::DATABASE_NAME);
+
+		return {$this->basePeerClassname}::doUpdate(\$selectCriteria, \$criteria, \$con);
+	}
+";
+	}
+
+	/**
+	 * Adds the doDeleteAll() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoDeleteAll(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * Method to DELETE all rows from the ".$table->getName()." table.
+	 *
+	 * @return int The number of affected rows (if supported by underlying database driver).
+	 */
+	public static function doDeleteAll(\$con = null)
+	{
+		if (\$con === null) {
+			\$con = Propel::getConnection(self::DATABASE_NAME);
+		}
+		\$affectedRows = 0; // initialize var to track total num of affected rows
+		try {
+			// use transaction because \$criteria could contain info
+			// for more than one table or we could emulating ON DELETE CASCADE, etc.
+			\$con->begin();
+			";
+			if ($this->isDeleteCascadeEmulationNeeded()) {
+			    $script .="\$affectedRows += ".$this->getPeerClassname()."::doOnDeleteCascade(new Criteria(), \$con);
+			";
+			}
+			if ($this->isDeleteSetNullEmulationNeeded()) {
+				$script .= $this->getPeerClassname() . "::doOnDeleteSetNull(new Criteria(), \$con);
+			";
+			}
+			$script .= "\$affectedRows += BasePeer::doDeleteAll(".$this->getPeerClassname()."::TABLE_NAME, \$con);
+			\$con->commit();
+			return \$affectedRows;
+		} catch (PropelException \$e) {
+			\$con->rollback();
+			throw \$e;
+		}
+	}
+";
+	}
+
+	/**
+	 * Adds the doDelete() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoDelete(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * Method perform a DELETE on the database, given a ".$table->getPhpName()." or Criteria object OR a primary key value.
+	 *
+	 * @param mixed \$values Criteria or ".$table->getPhpName()." object or primary key or array of primary keys
+	 *              which is used to create the DELETE statement
+	 * @param Connection \$con the connection to use
+	 * @return int 	The number of affected rows (if supported by underlying database driver).  This includes CASCADE-related rows
+	 *				if supported by native driver or if emulated using Propel.
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	 public static function doDelete(\$values, \$con = null)
+	 {
+		if (\$con === null) {
+			\$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME);
+		}
+
+		if (\$values instanceof Criteria) {
+			\$criteria = clone \$values; // rename for clarity
+		} elseif (\$values instanceof ".$table->getPhpName().") {
+";
+		if (count($table->getPrimaryKey()) > 0) {
+			$script .= "
+			\$criteria = \$values->buildPkeyCriteria();";
+		} else {
+			$script .= "
+			\$criteria = \$values->buildCriteria();";
+		}
+
+		$script .= "
+		} else {
+			// it must be the primary key
+			\$criteria = new Criteria(self::DATABASE_NAME);";
+
+		if (count($table->getPrimaryKey()) === 1) {
+			$pkey = $table->getPrimaryKey();
+			$col = array_shift($pkey);
+			$script .= "
+			\$criteria->add(".$this->getColumnConstant($col).", (array) \$values, Criteria::IN);";
+		} else {
+			$script .= "
+			// primary key is composite; we therefore, expect
+			// the primary key passed to be an array of pkey
+			// values
+			if(count(\$values) == count(\$values, COUNT_RECURSIVE))
+			{
+				// array is not multi-dimensional
+				\$values = array(\$values);
+			}
+			\$vals = array();
+			foreach(\$values as \$value)
+			{
+";
+			$i=0;
+			foreach($table->getPrimaryKey() as $col) {
+				$script .= "
+				\$vals[$i][] = \$value[$i];";
+				$i++;
+			}
+			$script .= "
+			}
+";
+			$i=0;
+			foreach($table->getPrimaryKey() as $col) {
+				$script .= "
+			\$criteria->add(".$this->getColumnConstant($col).", \$vals[$i], Criteria::IN);";
+				$i++;
+			}
+		} /* if count(table->getPrimaryKeys()) */
+
+		$script .= "
+		}
+
+		// Set the correct dbName
+		\$criteria->setDbName(self::DATABASE_NAME);
+
+		\$affectedRows = 0; // initialize var to track total num of affected rows
+
+		try {
+			// use transaction because \$criteria could contain info
+			// for more than one table or we could emulating ON DELETE CASCADE, etc.
+			\$con->begin();
+			";
+
+		if ($this->isDeleteCascadeEmulationNeeded()) {
+		    $script .= "\$affectedRows += ".$this->getPeerClassname()."::doOnDeleteCascade(\$criteria, \$con);";
+		}
+		if ($this->isDeleteSetNullEmulationNeeded()) {
+			$script .= $this->getPeerClassname() . "::doOnDeleteSetNull(\$criteria, \$con);";
+		}
+
+		$script .= "
+			\$affectedRows += {$this->basePeerClassname}::doDelete(\$criteria, \$con);
+			\$con->commit();
+			return \$affectedRows;
+		} catch (PropelException \$e) {
+			\$con->rollback();
+			throw \$e;
+		}
+	}
+";
+	}
+
+	/**
+	 * Adds the doOnDeleteCascade() method, which provides ON DELETE CASCADE emulation.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoOnDeleteCascade(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * This is a method for emulating ON DELETE CASCADE for DBs that don't support this
+	 * feature (like MySQL or SQLite).
+	 *
+	 * This method is not very speedy because it must perform a query first to get
+	 * the implicated records and then perform the deletes by calling those Peer classes.
+	 *
+	 * This method should be used within a transaction if possible.
+	 *
+	 * @param Criteria \$criteria
+	 * @param Connection \$con
+	 * @return int The number of affected rows (if supported by underlying database driver).
+	 */
+	protected static function doOnDeleteCascade(Criteria \$criteria, Connection \$con)
+	{
+		// initialize var to track total num of affected rows
+		\$affectedRows = 0;
+
+		// first find the objects that are implicated by the \$criteria
+		\$objects = ".$this->getPeerClassname()."::doSelect(\$criteria, \$con);
+		foreach(\$objects as \$obj) {
+";
+
+		foreach ($table->getReferrers() as $fk) {
+
+			// $fk is the foreign key in the other table, so localTableName will
+			// actually be the table name of other table
+			$tblFK = $fk->getTable();
+
+			$joinedTablePeerBuilder = OMBuilder::getNewPeerBuilder($tblFK);
+			$tblFKPackage = $joinedTablePeerBuilder->getStubPeerBuilder()->getPackage();
+
+			if (!$tblFK->isForReferenceOnly()) {
+				// we can't perform operations on tables that are
+				// not within the schema (i.e. that we have no map for, etc.)
+
+				$fkClassName = $tblFK->getPhpName();
+
+				// i'm not sure whether we can allow delete cascade for foreign keys
+				// within the same table?  perhaps we can?
+				if ( $fk->getOnDelete() == ForeignKey::CASCADE && $tblFK->getName() != $table->getName()) {
+
+					// backwards on purpose
+					$columnNamesF = $fk->getLocalColumns();
+					$columnNamesL = $fk->getForeignColumns();
+
+					$script .= "
+
+			include_once '".$this->getFilePath($tblFKPackage, $tblFK->getPhpName())."';
+
+			// delete related $fkClassName objects
+			\$c = new Criteria();
+			";
+					for($x=0,$xlen=count($columnNamesF); $x < $xlen; $x++) {
+						$columnFK = $tblFK->getColumn($columnNamesF[$x]);
+						$columnL = $table->getColumn($columnNamesL[$x]);
+
+						$script .= "
+			\$c->add(".$joinedTablePeerBuilder->getColumnConstant($columnFK) .", \$obj->get".$columnL->getPhpName()."());";
+					}
+
+					$script .= "
+			\$affectedRows += ".$joinedTablePeerBuilder->getPeerClassname()."::doDelete(\$c, \$con);";
+
+				} // if cascade && fkey table name != curr table name
+
+			} // if not for ref only
+		} // foreach foreign keys
+			$script .= "
+		}
+		return \$affectedRows;
+	}
+";
+	} // end addDoOnDeleteCascade
+
+	/**
+	 * Adds the doOnDeleteSetNull() method, which provides ON DELETE SET NULL emulation.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoOnDeleteSetNull(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * This is a method for emulating ON DELETE SET NULL DBs that don't support this
+	 * feature (like MySQL or SQLite).
+	 *
+	 * This method is not very speedy because it must perform a query first to get
+	 * the implicated records and then perform the deletes by calling those Peer classes.
+	 *
+	 * This method should be used within a transaction if possible.
+	 *
+	 * @param Criteria \$criteria
+	 * @param Connection \$con
+	 * @return void
+	 */
+	protected static function doOnDeleteSetNull(Criteria \$criteria, Connection \$con)
+	{
+
+		// first find the objects that are implicated by the \$criteria
+		\$objects = ".$this->getPeerClassname()."::doSelect(\$criteria, \$con);
+		foreach(\$objects as \$obj) {
+";
+
+		// This logic is almost exactly the same as that in doOnDeleteCascade()
+		// it may make sense to refactor this, provided that thigns don't
+		// get too complicated.
+
+		foreach ($table->getReferrers() as $fk) {
+
+			// $fk is the foreign key in the other table, so localTableName will
+			// actually be the table name of other table
+			$tblFK = $fk->getTable();
+			$refTablePeerBuilder = OMBuilder::getNewPeerBuilder($tblFK);
+
+			if (!$tblFK->isForReferenceOnly()) {
+				// we can't perform operations on tables that are
+				// not within the schema (i.e. that we have no map for, etc.)
+
+				$fkClassName = $tblFK->getPhpName();
+
+				// i'm not sure whether we can allow delete setnull for foreign keys
+				// within the same table?  perhaps we can?
+				if ( $fk->getOnDelete() == ForeignKey::SETNULL &&
+						$fk->getTable()->getName() != $table->getName()) {
+
+							// backwards on purpose
+							$columnNamesF = $fk->getLocalColumns();
+							$columnNamesL = $fk->getForeignColumns(); // should be same num as foreign
+					$script .= "
+			// set fkey col in related $fkClassName rows to NULL
+			\$selectCriteria = new Criteria(".$this->getPeerClassname()."::DATABASE_NAME);
+			\$updateValues = new Criteria(".$this->getPeerClassname()."::DATABASE_NAME);";
+
+					for ($x=0,$xlen=count($columnNamesF); $x < $xlen; $x++) {
+						$columnFK = $tblFK->getColumn($columnNamesF[$x]);
+						$columnL = $table->getColumn($columnNamesL[$x]);
+						$script .= "
+			\$selectCriteria->add(".$refTablePeerBuilder->getColumnConstant($columnFK).", \$obj->get".$columnL->getPhpName()."());
+			\$updateValues->add(".$refTablePeerBuilder->getColumnConstant($columnFK).", null);
+";
+					}
+
+					$script .= "
+			{$this->basePeerClassname}::doUpdate(\$selectCriteria, \$updateValues, \$con); // use BasePeer because generated Peer doUpdate() methods only update using pkey
+";
+				} // if setnull && fkey table name != curr table name
+			} // if not for ref only
+		} // foreach foreign keys
+
+		$script .= "
+		}
+	}
+";
+	}
+
+	/**
+	 * Adds the doValidate() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoValidate(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * Validates all modified columns of given ".$table->getPhpName()." object.
+	 * If parameter \$columns is either a single column name or an array of column names
+	 * than only those columns are validated.
+	 *
+	 * NOTICE: This does not apply to primary or foreign keys for now.
+	 *
+	 * @param ".$table->getPhpName()." \$obj The object to validate.
+	 * @param mixed \$cols Column name or array of column names.
+	 *
+	 * @return mixed TRUE if all columns are valid or the error message of the first invalid column.
+	 */
+	public static function doValidate(".$table->getPhpName()." \$obj, \$cols = null)
+	{
+		\$columns = array();
+
+		if (\$cols) {
+			\$dbMap = Propel::getDatabaseMap(".$this->getPeerClassname()."::DATABASE_NAME);
+			\$tableMap = \$dbMap->getTable(".$this->getPeerClassname()."::TABLE_NAME);
+
+			if (! is_array(\$cols)) {
+				\$cols = array(\$cols);
+			}
+
+			foreach(\$cols as \$colName) {
+				if (\$tableMap->containsColumn(\$colName)) {
+					\$get = 'get' . \$tableMap->getColumn(\$colName)->getPhpName();
+					\$columns[\$colName] = \$obj->\$get();
+				}
+			}
+		} else {
+";
+		foreach ($table->getValidators() as $val) {
+			$col = $val->getColumn();
+			if (!$col->isAutoIncrement()) {
+				$script .= "
+		if (\$obj->isNew() || \$obj->isColumnModified(".$this->getColumnConstant($col)."))
+			\$columns[".$this->getColumnConstant($col)."] = \$obj->get".$col->getPhpName()."();
+";
+			} // if
+  		} // foreach
+
+  		$script .= "
+		}
+
+		return {$this->basePeerClassname}::doValidate(".$this->getPeerClassname()."::DATABASE_NAME, ".$this->getPeerClassname()."::TABLE_NAME, \$columns);
+	}
+";
+	} // end addDoValidate()
+
+	/**
+	 * Adds the retrieveByPK method for tables with single-column primary key.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addRetrieveByPK_SinglePK(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * Retrieve a single object by pkey.
+	 *
+	 * @param mixed \$pk the primary key.
+	 * @param Connection \$con the connection to use
+	 * @return " . $table->getPhpName() . "
+	 */
+	public static function ".$this->getRetrieveMethodName()."(\$pk, \$con = null)
+	{
+		if (\$con === null) {
+			\$con = Propel::getConnection(self::DATABASE_NAME);
+		}
+
+		\$criteria = new Criteria(".$this->getPeerClassname()."::DATABASE_NAME);
+";
+		if (count($table->getPrimaryKey()) === 1) {
+			$pkey = $table->getPrimaryKey();
+			$col = array_shift($pkey);
+			$script .= "
+		\$criteria->add(".$this->getColumnConstant($col).", \$pk);
+";
+		} else {
+			// primary key is composite; we therefore, expect
+			// the primary key passed to be an array of pkey
+			// values
+			$i=0;
+			foreach($table->getPrimaryKey() as $col) {
+	   			$script .= "
+		\$criteria->add(".$this->getColumnConstant($col).", \$pk[$i]);";
+				$i++;
+			}
+		} /* if count(table.PrimaryKeys) */
+		$script .= "
+
+		\$v = ".$this->getPeerClassname()."::doSelect(\$criteria, \$con);
+
+		return !empty(\$v) > 0 ? \$v[0] : null;
+	}
+";
+	}
+
+	/**
+	 * Adds the retrieveByPKs method for tables with single-column primary key.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addRetrieveByPKs_SinglePK(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * Retrieve multiple objects by pkey.
+	 *
+	 * @param array \$pks List of primary keys
+	 * @param Connection \$con the connection to use
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function ".$this->getRetrieveMethodName()."s(\$pks, \$con = null)
+	{
+		if (\$con === null) {
+			\$con = Propel::getConnection(self::DATABASE_NAME);
+		}
+
+		\$objs = null;
+		if (empty(\$pks)) {
+			\$objs = array();
+		} else {
+			\$criteria = new Criteria();";
+		if (count($table->getPrimaryKey()) == 1) {
+			$k1 = $table->getPrimaryKey();
+			$script .= "
+			\$criteria->add(".$this->getColumnConstant($k1[0]).", \$pks, Criteria::IN);";
+		} else {
+			$script .= "
+			foreach(\$pks as \$pk) {";
+			$i = 0;
+			foreach($table->getPrimaryKey() as $col) {
+				$script .= "
+				\$c{$i} = \$criteria->getNewCriterion(".$this->getPeerClassname($col).", \$pk[$i], Criteria::EQUAL);";
+				$j = $i - 1;
+				if ($i > 0) {
+					$script .= "
+				\$c{$j}->addAnd(\$c{$i});";
+				} /* if $i > 0 */
+				$i++;
+			} /* foreach */
+
+			$script .= "
+
+				\$criteria->addOr(\$c0);
+			}";
+		} /* if count prim keys == 1 */
+		$script .= "
+			\$objs = ".$this->getPeerClassname()."::doSelect(\$criteria, \$con);
+		}
+		return \$objs;
+	}
+";
+	}
+
+	/**
+	 * Adds the retrieveByPK method for tables with multi-column primary key.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addRetrieveByPK_MultiPK(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+	/**
+	 * Retrieve object using using composite pkey values.
+	 * ";
+		foreach ($table->getPrimaryKey() as $col) {
+			$clo = strtolower($col->getName());
+			$cptype = $col->getPhpNative();
+			$script .= "@param $cptype $".$clo."
+	   ";
+	   }
+	   $script .= "
+	 * @param Connection \$con
+	 * @return ".$table->getPhpName()."
+	 */
+	public static function ".$this->getRetrieveMethodName()."(";
+		$co = 0;
+		foreach ($table->getPrimaryKey() as $col) {
+			$clo = strtolower($col->getName());
+			$script .= ($co++ ? "," : "") . " $".$clo;
+		} /* foreach */
+		$script .= ", \$con = null) {
+		if (\$con === null) {
+			\$con = Propel::getConnection(self::DATABASE_NAME);
+		}
+		\$criteria = new Criteria();";
+		foreach ($table->getPrimaryKey() as $col) {
+			$clo = strtolower($col->getName());
+			$script .= "
+		\$criteria->add(".$this->getColumnConstant($col).", $".$clo.");";
+		}
+		$script .= "
+		\$v = ".$this->getPeerClassname()."::doSelect(\$criteria, \$con);
+
+		return !empty(\$v) ? \$v[0] : null;
+	}";
+	}
+
+	/**
+	 * Adds the getTableMap() method which is a convenience method for apps to get DB metadata.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addGetTableMap(&$script)
+	{
+		$script .= "
+	/**
+	 * Returns the TableMap related to this peer.
+	 * This method is not needed for general use but a specific application could have a need.
+	 * @return TableMap
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function getTableMap()
+	{
+		return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME);
+	}
+";
+
+	}
+} // PHP5BasicPeerBuilder


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicPeerBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexObjectBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexObjectBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexObjectBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1273 @@
+<?php
+
+/*
+ *  $Id: PHP5ComplexObjectBuilder.php 378 2006-05-27 01:14:41Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/om/php5/PHP5BasicObjectBuilder.php';
+
+/**
+ * Generates a PHP5 base Object class with complex object model methods.
+ *
+ * This class adds on to the PHP5BasicObjectBuilder class by adding more complex
+ * logic related to relationships to methods like the setters, and save method. Also,
+ * new get*Join*() methods are added to fetch related rows.
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.om.php5
+ */
+class PHP5ComplexObjectBuilder extends PHP5BasicObjectBuilder {
+
+	/**
+	 * Adds additional attributes used for complex object model.
+	 * @param string &$script The script will be modified in this method.
+	 * @see addFKAttributes()
+	 * @see addRefFKAttributes()
+	 * @see addAlreadyInSaveAttribute()
+	 * @see addAlreadyInValidationAttribute()
+	 */
+	protected function addAttributes(&$script)
+	{
+		$table = $this->getTable();
+		parent::addAttributes($script);
+
+		foreach ($table->getForeignKeys() as $fk) {
+			$this->addFKAttributes($script, $fk);
+		}
+
+		foreach($table->getReferrers() as $refFK) {
+			// if ($refFK->getTable()->getName() != $table->getName()) {
+				$this->addRefFKAttributes($script, $refFK);
+			// }
+		}
+
+		$this->addAlreadyInSaveAttribute($script);
+		$this->addAlreadyInValidationAttribute($script);
+	}
+
+	/**
+	 * Specifies the methods that are added as part of the basic OM class.
+	 * This can be overridden by subclasses that wish to add more methods.
+	 * @param string &$script The script will be modified in this method.
+	 * @see PHP5BasicObjectBuilder::addClassBody()
+	 */
+	protected function addClassBody(&$script)
+	{
+		$table = $this->getTable();
+		parent::addClassBody($script);
+
+
+		$this->addFKMethods($script);
+		$this->addRefFKMethods($script);
+
+	}
+
+	/**
+	 * Adds the close of mutator (setter) method for a column.
+	 * This method overrides the method from PHP5BasicObjectBuilder in order to
+	 * account for updating related objects.
+	 * @param string &$script The script will be modified in this method.
+	 * @param Column $col The current column.
+	 * @see PHP5BasicObjectBuilder::addMutatorClose()
+	 */
+	protected function addMutatorClose(&$script, Column $col)
+	{
+		$table = $this->getTable();
+		$cfc=$col->getPhpName();
+		$clo=strtolower($col->getName());
+
+		if ($col->isForeignKey()) {
+
+			$tblFK = $table->getDatabase()->getTable($col->getRelatedTableName());
+			$colFK = $tblFK->getColumn($col->getRelatedColumnName());
+
+			$varName = $this->getFKVarName($col->getForeignKey());
+
+			$script .= "
+		if (\$this->$varName !== null && \$this->".$varName."->get".$colFK->getPhpName()."() !== \$v) {
+			\$this->$varName = null;
+		}
+";
+		} /* if col is foreign key */
+
+		foreach ($col->getReferrers() as $fk) {
+
+			$tblFK = $this->getDatabase()->getTable($fk->getForeignTableName());
+
+			if ( $tblFK->getName() != $table->getName() ) {
+
+				$collName = $this->getRefFKCollVarName($fk);
+
+				$tblFK = $table->getDatabase()->getTable($col->getRelatedTableName());
+				$colFK = $tblFK->getColumn($col->getRelatedColumnName());
+
+				$script .= "
+
+		// update associated ".$tblFK->getPhpName()."
+		if (\$this->$collName !== null) {
+			foreach(\$this->$collName as \$referrerObject) {
+				  \$referrerObject->set".$colFK->getPhpName()."(\$v);
+			  }
+		  }
+";
+			} // if
+		} // foreach
+
+		$script .= "
+	} // set$cfc()
+";
+	} // addMutatorClose()
+
+	/**
+	 * Adds the methods related to validating, saving and deleting the object.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addManipulationMethods(&$script)
+	{
+		$this->addDelete($script);
+		$this->addSave($script);
+		$this->addDoSave($script);
+	}
+
+	/**
+	 * Adds the methods related to validationg the object.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addValidationMethods(&$script)
+	{
+		parent::addValidationMethods($script);
+		$this->addDoValidate($script);
+	}
+
+	/**
+	 * Convenience method to get the foreign Table object for an fkey.
+	 * @return Table
+	 */
+	protected function getForeignTable(ForeignKey $fk)
+	{
+		return $this->getTable()->getDatabase()->getTable($fk->getForeignTableName());
+	}
+
+	/**
+	 * Gets the PHP method name affix to be used for fkeys for the current table (not referrers to this table).
+	 *
+	 * The difference between this method and the getRefFKPhpNameAffix() method is that in this method the
+	 * classname in the affix is the foreign table classname.
+	 *
+	 * @param ForeignKey $fk The local FK that we need a name for.
+	 * @param boolean $plural Whether the php name should be plural (e.g. initRelatedObjs() vs. addRelatedObj()
+	 * @return string
+	 */
+	public function getFKPhpNameAffix(ForeignKey $fk, $plural = false)
+	{
+		$className = $this->getForeignTable($fk)->getPhpName();
+		return $className . ($plural ? 's' : '') . $this->getRelatedBySuffix($fk);
+	}
+
+	/**
+	 * Gets the PHP method name affix to be used for referencing foreign key methods and variable names (e.g. set????(), $coll???).
+	 *
+	 * The difference between this method and the getFKPhpNameAffix() method is that in this method the
+	 * classname in the affix is the classname of the local fkey table.
+	 *
+	 * @param ForeignKey $fk The referrer FK that we need a name for.
+	 * @param boolean $plural Whether the php name should be plural (e.g. initRelatedObjs() vs. addRelatedObj()
+	 * @return string
+	 */
+	public function getRefFKPhpNameAffix(ForeignKey $fk, $plural = false)
+	{
+		$className = $fk->getTable()->getPhpName();
+		return $className . ($plural ? 's' : '') . $this->getRelatedBySuffix($fk);
+	}
+
+	/**
+	 * Gets the "RelatedBy*" suffix (if needed) that is attached to method and variable names.
+	 *
+	 * The related by suffix is based on the local columns of the foreign key.  If there is more than
+	 * one column in a table that points to the same foreign table, then a 'RelatedByLocalColName' suffix
+	 * will be appended.
+	 *
+	 * @return string
+	 */
+	protected function getRelatedBySuffix(ForeignKey $fk)
+	{
+		$relCol = "";
+		foreach ($fk->getLocalColumns() as $columnName) {
+			$column = $fk->getTable()->getColumn($columnName);
+			if (!$column) {
+			    $e = new Exception("Could not fetch column: $columnName in table " . $fk->getTable()->getName());
+				print $e;
+				throw $e;
+			}
+			if ($column->isMultipleFK() || $fk->getForeignTableName() == $fk->getTable()->getName()) {
+				// if there are seeral foreign keys that point to the same table
+				// then we need to generate methods like getAuthorRelatedByColName()
+				// instead of just getAuthor().  Currently we are doing the same
+				// for self-referential foreign keys, to avoid confusion.
+				$relCol .= $column->getPhpName();
+			}
+		}
+
+		if ($relCol != "") {
+			$relCol = "RelatedBy" . $relCol;
+		}
+
+		return $relCol;
+	}
+
+	protected function getFKVarName(ForeignKey $fk)
+	{
+		return 'a' . $this->getFKPhpNameAffix($fk, $plural = false);
+	}
+
+	protected function getRefFKCollVarName(ForeignKey $fk)
+	{
+		return 'coll' . $this->getRefFKPhpNameAffix($fk, $plural = true);
+	}
+
+	protected function getRefFKLastCriteriaVarName(ForeignKey $fk)
+	{
+		return 'last' . $this->getRefFKPhpNameAffix($fk, $plural = false) . 'Criteria';
+	}
+
+	// ----------------------------------------------------------------
+	//
+	// F K    M E T H O D S
+	//
+	// ----------------------------------------------------------------
+
+	/**
+	 * Adds the methods that get & set objects related by foreign key to the current object.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addFKMethods(&$script)
+	{
+		foreach ($this->getTable()->getForeignKeys() as $fk) {
+			$this->addFKMutator($script, $fk);
+			$this->addFKAccessor($script, $fk);
+		} // foreach fk
+	}
+
+	/**
+	 * Adds the class attributes that are needed to store fkey related objects.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addFKAttributes(&$script, ForeignKey $fk)
+	{
+		$className = $this->getForeignTable($fk)->getPhpName();
+		$varName = $this->getFKVarName($fk);
+
+		$script .= "
+	/**
+	 * @var $className
+	 */
+	protected $".$varName.";
+";
+	}
+
+	/**
+	 * Adds the mutator (setter) method for setting an fkey related object.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addFKMutator(&$script, ForeignKey $fk)
+	{
+		$table = $this->getTable();
+		$tblFK = $this->getForeignTable($fk);
+		$className = $this->getForeignTable($fk)->getPhpName();
+		$varName = $this->getFKVarName($fk);
+
+		$script .= "
+	/**
+	 * Declares an association between this object and a $className object.
+	 *
+	 * @param $className \$v
+	 * @return void
+	 * @throws PropelException
+	 */
+	public function set".$this->getFKPhpNameAffix($fk, $plural = false)."(\$v)
+	{
+";
+			foreach ($fk->getLocalColumns() as $columnName) {
+				$column = $table->getColumn($columnName);
+				$lfmap = $fk->getLocalForeignMapping();
+				$colFKName = $lfmap[$columnName];
+				$colFK = $tblFK->getColumn($colFKName);
+				$script .= "
+
+		if (\$v === null) {
+			\$this->set".$column->getPhpName()."(".var_export($column->getDefaultValue(), true).");
+		} else {
+			\$this->set".$column->getPhpName()."(\$v->get".$colFK->getPhpName()."());
+		}
+";
+
+			} /* foreach local col */
+
+			$script .= "
+
+		\$this->$varName = \$v;
+	}
+";
+	}
+
+	/**
+	 * Adds the accessor (getter) method for getting an fkey related object.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addFKAccessor(&$script, ForeignKey $fk)
+	{
+		$table = $this->getTable();
+
+		$className = $this->getForeignTable($fk)->getPhpName();
+		$varName = $this->getFKVarName($fk);
+
+		$and = "";
+		$comma = "";
+		$conditional = "";
+		$arglist = "";
+		$argsize = 0;
+		foreach ($fk->getLocalColumns() as $columnName) {
+			$column = $table->getColumn($columnName);
+			$cptype = $column->getPhpNative();
+			$clo = strtolower($column->getName());
+
+			// FIXME: is this correct? what about negative numbers?
+			if ($cptype == "integer" || $cptype == "float" || $cptype == "double") {
+				$conditional .= $and . "\$this->". $clo ." > 0";
+			} elseif($cptype == "string") {
+				$conditional .= $and . "(\$this->" . $clo ." !== \"\" && \$this->".$clo." !== null)";
+			} else {
+				$conditional .= $and . "\$this->" . $clo ." !== null";
+			}
+			$arglist .= $comma . "\$this->" . $clo;
+			$and = " && ";
+			$comma = ", ";
+			$argsize = $argsize + 1;
+		}
+
+		$pCollName = $this->getFKPhpNameAffix($fk, $plural = true);
+
+		$fkPeerBuilder = OMBuilder::getNewPeerBuilder($this->getForeignTable($fk));
+
+		$script .= "
+
+	/**
+	 * Get the associated $className object
+	 *
+	 * @param Connection Optional Connection object.
+	 * @return $className The associated $className object.
+	 * @throws PropelException
+	 */
+	public function get".$this->getFKPhpNameAffix($fk, $plural = false)."(\$con = null)
+	{
+		// include the related Peer class
+		include_once '".$fkPeerBuilder->getClassFilePath()."';
+
+		if (\$this->$varName === null && ($conditional)) {
+";
+		$script .= "
+			\$this->$varName = ".$fkPeerBuilder->getPeerClassname()."::".$fkPeerBuilder->getRetrieveMethodName()."($arglist, \$con);
+
+			/* The following can be used instead of the line above to
+			   guarantee the related object contains a reference
+			   to this object, but this level of coupling
+			   may be undesirable in many circumstances.
+			   As it can lead to a db query with many results that may
+			   never be used.
+			   \$obj = ".$fkPeerBuilder->getPeerClassname()."::retrieveByPK($arglist, \$con);
+			   \$obj->add$pCollName(\$this);
+			 */
+		}
+		return \$this->$varName;
+	}
+";
+
+	} // addFKAccessor
+
+	/**
+	 * Adds a convenience method for setting a related object by specifying the primary key.
+	 * This can be used in conjunction with the getPrimaryKey() for systems where nothing is known
+	 * about the actual objects being related.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addFKByKeyMutator(&$script, ForeignKey $fk)
+	{
+		$table = $this->getTable();
+
+		#$className = $this->getForeignTable($fk)->getPhpName();
+		$methodAffix = $this->getFKPhpNameAffix($fk);
+		#$varName = $this->getFKVarName($fk);
+
+		$script .= "
+	/**
+	 * Provides convenient way to set a relationship based on a
+	 * key.  e.g.
+	 * <code>\$bar->setFooKey(\$foo->getPrimaryKey())</code>
+	 *";
+		if (count($fk->getLocalColumns()) > 1) {
+			$script .= "
+	 * Note: It is important that the xml schema used to create this class
+	 * maintains consistency in the order of related columns between
+	 * ".$table->getName()." and ". $tblFK->getName().".
+	 * If for some reason this is impossible, this method should be
+	 * overridden in <code>".$table->getPhpName()."</code>.";
+		}
+		$script .= "
+	 * @return void
+	 * @throws PropelException
+	 */
+	public function set".$methodAffix."Key(\$key)
+	{
+";
+		if (count($fk->getLocalColumns()) > 1) {
+			$i = 0;
+			foreach ($fk->getLocalColumns() as $colName) {
+				$col = $table->getColumn($colName);
+				$fktype = $col->getPhpNative();
+				$script .= "
+			\$this->set".$col->getPhpName()."( ($fktype) \$key[$i] );
+";
+				$i++;
+			} /* foreach */
+		} else {
+			$lcols = $fk->getLocalColumns();
+			$colName = $lcols[0];
+			$col = $table->getColumn($colName);
+			$fktype = $col->getPhpNative();
+			$script .= "
+		\$this->set".$col->getPhpName()."( ($fktype) \$key);
+";
+		}
+		$script .= "
+	}
+";
+	} // addFKByKeyMutator()
+
+	/**
+	 * Adds the method that fetches fkey-related (referencing) objects but also joins in data from another table.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addRefFKGetJoinMethods(&$script, ForeignKey $refFK)
+	{
+		$table = $this->getTable();
+		$tblFK = $refFK->getTable();
+
+		$relCol = $this->getRefFKPhpNameAffix($refFK, $plural=true);
+		$collName = $this->getRefFKCollVarName($refFK);
+		$lastCriteriaName = $this->getRefFKLastCriteriaVarName($refFK);
+
+		$fkPeerBuilder = OMBuilder::getNewPeerBuilder($tblFK);
+
+		$lastTable = "";
+		foreach ($tblFK->getForeignKeys() as $fk2) {
+
+			// Add join methods if the fk2 table is not this table or
+			// the fk2 table references this table multiple times.
+
+			$doJoinGet = true;
+
+			if ( $fk2->getForeignTableName() == $table->getName() ) {
+				$doJoinGet = false;
+			}
+
+			foreach ($fk2->getLocalColumns() as $columnName) {
+				$column = $tblFK->getColumn($columnName);
+				if ($column->isMultipleFK()) {
+					$doJoinGet = true;
+				}
+			}
+
+			$tblFK2 = $this->getForeignTable($fk2);
+			$doJoinGet = !$tblFK2->isForReferenceOnly();
+
+			// it doesn't make sense to join in rows from the curent table, since we are fetching
+			// objects related to *this* table (i.e. the joined rows will all be the same row as current object)
+			if ($this->getTable()->getPhpName() == $tblFK2->getPhpName()) {
+				$doJoinGet = false;
+			}
+
+			$relCol2 = $this->getFKPhpNameAffix($fk2, $plural = false);
+
+			if ( $this->getRelatedBySuffix($refFK) != "" &&
+							($this->getRelatedBySuffix($refFK) == $this->getRelatedBySuffix($fk2))) {
+				$doJoinGet = false;
+			}
+
+			if ($doJoinGet) {
+				$script .= "
+
+	/**
+	 * If this collection has already been initialized with
+	 * an identical criteria, it returns the collection.
+	 * Otherwise if this ".$table->getPhpName()." is new, it will return
+	 * an empty collection; or if this ".$table->getPhpName()." has previously
+	 * been saved, it will retrieve related $relCol from storage.
+	 *
+	 * This method is protected by default in order to keep the public
+	 * api reasonable.  You can provide public methods for those you
+	 * actually need in ".$table->getPhpName().".
+	 */
+	public function get".$relCol."Join".$relCol2."(\$criteria = null, \$con = null)
+	{
+		// include the Peer class
+		include_once '".$fkPeerBuilder->getClassFilePath()."';
+		if (\$criteria === null) {
+			\$criteria = new Criteria();
+		}
+		elseif (\$criteria instanceof Criteria)
+		{
+			\$criteria = clone \$criteria;
+		}
+
+		if (\$this->$collName === null) {
+			if (\$this->isNew()) {
+				\$this->$collName = array();
+			} else {
+";
+				foreach ($refFK->getForeignColumns() as $columnName) {
+					$column = $table->getColumn($columnName);
+					$flMap = $refFK->getForeignLocalMapping();
+					$colFKName = $flMap[$columnName];
+					$colFK = $tblFK->getColumn($colFKName);
+					if ($colFK === null) {
+					    $e = new Exception("Column $colFKName not found in " . $tblFK->getName());
+						print $e;
+						throw $e;
+					}
+					$script .= "
+				\$criteria->add(".$fkPeerBuilder->getColumnConstant($colFK).", \$this->get".$column->getPhpName()."());
+";
+				} // end foreach ($fk->getForeignColumns()
+
+				$script .= "
+				\$this->$collName = ".$fkPeerBuilder->getPeerClassname()."::doSelectJoin$relCol2(\$criteria, \$con);
+			}
+		} else {
+			// the following code is to determine if a new query is
+			// called for.  If the criteria is the same as the last
+			// one, just return the collection.
+";
+				foreach ($refFK->getForeignColumns() as $columnName) {
+					$column = $table->getColumn($columnName);
+					$flMap = $refFK->getForeignLocalMapping();
+					$colFKName = $flMap[$columnName];
+					$colFK = $tblFK->getColumn($colFKName);
+					$script .= "
+			\$criteria->add(".$fkPeerBuilder->getColumnConstant($colFK).", \$this->get".$column->getPhpName()."());
+";
+				} /* end foreach ($fk->getForeignColumns() */
+
+				$script .= "
+			if (!isset(\$this->$lastCriteriaName) || !\$this->".$lastCriteriaName."->equals(\$criteria)) {
+				\$this->$collName = ".$fkPeerBuilder->getPeerClassname()."::doSelectJoin$relCol2(\$criteria, \$con);
+			}
+		}
+		\$this->$lastCriteriaName = \$criteria;
+
+		return \$this->$collName;
+	}
+";
+			} /* end if($doJoinGet) */
+
+		} /* end foreach ($tblFK->getForeignKeys() as $fk2) { */
+
+	} // function
+
+
+	// ----------------------------------------------------------------
+	//
+	// R E F E R R E R    F K    M E T H O D S
+	//
+	// ----------------------------------------------------------------
+
+	/**
+	 * Adds the attributes used to store objects that have referrer fkey relationships to this object.
+	 * <code>protected collVarName;</code>
+	 * <code>private lastVarNameCriteria = null;</code>
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addRefFKAttributes(&$script, ForeignKey $refFK)
+	{
+		$collName = $this->getRefFKCollVarName($refFK);
+		$lastCriteriaName = $this->getRefFKLastCriteriaVarName($refFK);
+
+		$script .= "
+	/**
+	 * Collection to store aggregation of $collName.
+	 * @var array
+	 */
+	protected $".$collName.";
+
+	/**
+	 * The criteria used to select the current contents of $collName.
+	 * @var Criteria
+	 */
+	protected \$".$lastCriteriaName." = null;
+";
+	}
+
+	/**
+	 * Adds the methods for retrieving, initializing, adding objects that are related to this one by foreign keys.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addRefFKMethods(&$script)
+	{
+		foreach($this->getTable()->getReferrers() as $refFK) {
+			// if ( $refFK->getTable()->getName() != $this->getTable()->getName() ) {
+				$this->addRefFKInit($script, $refFK);
+				$this->addRefFKGet($script, $refFK);
+				$this->addRefFKCount($script, $refFK);
+				$this->addRefFKAdd($script, $refFK);
+				$this->addRefFKGetJoinMethods($script, $refFK);
+			// }
+		}
+	}
+
+	/**
+	 * Adds the method that initializes the referrer fkey collection.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addRefFKInit(&$script, ForeignKey $refFK) {
+
+		$relCol = $this->getRefFKPhpNameAffix($refFK, $plural = true);
+		$collName = $this->getRefFKCollVarName($refFK);
+
+		$script .= "
+	/**
+	 * Temporary storage of $collName to save a possible db hit in
+	 * the event objects are add to the collection, but the
+	 * complete collection is never requested.
+	 * @return void
+	 */
+	public function init$relCol()
+	{
+		if (\$this->$collName === null) {
+			\$this->$collName = array();
+		}
+	}
+";
+	} // addRefererInit()
+
+	/**
+	 * Adds the method that adds an object into the referrer fkey collection.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addRefFKAdd(&$script, ForeignKey $refFK)
+	{
+		$tblFK = $refFK->getTable();
+		$className = $refFK->getTable()->getPhpName();
+
+		$joinedTableObjectBuilder = OMBuilder::getNewObjectBuilder($refFK->getTable());
+
+		$script .= "
+	/**
+	 * Method called to associate a ".$tblFK->getPhpName()." object to this object
+	 * through the $className foreign key attribute
+	 *
+	 * @param $className \$l $className
+	 * @return void
+	 * @throws PropelException
+	 */
+	public function add".$this->getRefFKPhpNameAffix($refFK, $plural = false)."($className \$l)
+	{
+		\$this->coll".$this->getRefFKPhpNameAffix($refFK, $plural = true)."[] = \$l;
+		\$l->set".$this->getFKPhpNameAffix($refFK, $plural = false)."(\$this);
+	}
+";
+	} // addRefererAdd
+
+	/**
+	 * Adds the method that returns the size of the referrer fkey collection.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addRefFKCount(&$script, ForeignKey $refFK)
+	{
+		$relCol = $this->getRefFKPhpNameAffix($refFK, $plural = true);
+
+		$fkPeerBuilder = OMBuilder::getNewPeerBuilder($refFK->getTable());
+
+		$script .= "
+	/**
+	 * Returns the number of related $relCol.
+	 *
+	 * @param Criteria \$criteria
+	 * @param boolean \$distinct
+	 * @param Connection \$con
+	 * @throws PropelException
+	 */
+	public function count$relCol(\$criteria = null, \$distinct = false, \$con = null)
+	{
+		// include the Peer class
+		include_once '".$fkPeerBuilder->getClassFilePath()."';
+		if (\$criteria === null) {
+			\$criteria = new Criteria();
+		}
+		elseif (\$criteria instanceof Criteria)
+		{
+			\$criteria = clone \$criteria;
+		}
+";
+		foreach ($refFK->getForeignColumns() as $columnName) {
+			$column = $this->getTable()->getColumn($columnName);
+			$flmap = $refFK->getForeignLocalMapping();
+			$colFKName = $flmap[$columnName];
+			$colFK = $refFK->getTable()->getColumn($colFKName);
+			$script .= "
+		\$criteria->add(".$fkPeerBuilder->getColumnConstant($colFK).", \$this->get".$column->getPhpName()."());
+";
+		} // end foreach ($fk->getForeignColumns()
+		$script .="
+		return ".$fkPeerBuilder->getPeerClassname()."::doCount(\$criteria, \$distinct, \$con);
+	}
+";
+	} // addRefererCount
+
+	/**
+	 * Adds the method that returns the referrer fkey collection.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addRefFKGet(&$script, ForeignKey $refFK)
+	{
+		$table = $this->getTable();
+		$tblFK = $refFK->getTable();
+
+		$fkPeerBuilder = OMBuilder::getNewPeerBuilder($refFK->getTable());
+		$relCol = $this->getRefFKPhpNameAffix($refFK, $plural = true);
+
+		$collName = $this->getRefFKCollVarName($refFK);
+		$lastCriteriaName = $this->getRefFKLastCriteriaVarName($refFK);
+
+		$script .= "
+	/**
+	 * If this collection has already been initialized with
+	 * an identical criteria, it returns the collection.
+	 * Otherwise if this ".$table->getPhpName()." has previously
+	 * been saved, it will retrieve related $relCol from storage.
+	 * If this ".$table->getPhpName()." is new, it will return
+	 * an empty collection or the current collection, the criteria
+	 * is ignored on a new object.
+	 *
+	 * @param Connection \$con
+	 * @param Criteria \$criteria
+	 * @throws PropelException
+	 */
+	public function get$relCol(\$criteria = null, \$con = null)
+	{
+		// include the Peer class
+		include_once '".$fkPeerBuilder->getClassFilePath()."';
+		if (\$criteria === null) {
+			\$criteria = new Criteria();
+		}
+		elseif (\$criteria instanceof Criteria)
+		{
+			\$criteria = clone \$criteria;
+		}
+
+		if (\$this->$collName === null) {
+			if (\$this->isNew()) {
+			   \$this->$collName = array();
+			} else {
+";
+		foreach ($refFK->getLocalColumns() as $colFKName) {
+			// $colFKName is local to the referring table (i.e. foreign to this table)
+			$lfmap = $refFK->getLocalForeignMapping();
+			$localColumn = $this->getTable()->getColumn($lfmap[$colFKName]);
+			$colFK = $refFK->getTable()->getColumn($colFKName);
+
+			$script .= "
+				\$criteria->add(".$fkPeerBuilder->getColumnConstant($colFK).", \$this->get".$localColumn->getPhpName()."());
+";
+		} // end foreach ($fk->getForeignColumns()
+
+		$script .= "
+				".$fkPeerBuilder->getPeerClassname()."::addSelectColumns(\$criteria);
+				\$this->$collName = ".$fkPeerBuilder->getPeerClassname()."::doSelect(\$criteria, \$con);
+			}
+		} else {
+			// criteria has no effect for a new object
+			if (!\$this->isNew()) {
+				// the following code is to determine if a new query is
+				// called for.  If the criteria is the same as the last
+				// one, just return the collection.
+";
+		foreach ($refFK->getLocalColumns() as $colFKName) {
+			// $colFKName is local to the referring table (i.e. foreign to this table)
+			$lfmap = $refFK->getLocalForeignMapping();
+			$localColumn = $this->getTable()->getColumn($lfmap[$colFKName]);
+			$colFK = $refFK->getTable()->getColumn($colFKName);
+			$script .= "
+
+				\$criteria->add(".$fkPeerBuilder->getColumnConstant($colFK).", \$this->get".$localColumn->getPhpName()."());
+";
+	} // foreach ($fk->getForeignColumns()
+$script .= "
+				".$fkPeerBuilder->getPeerClassname()."::addSelectColumns(\$criteria);
+				if (!isset(\$this->$lastCriteriaName) || !\$this->".$lastCriteriaName."->equals(\$criteria)) {
+					\$this->$collName = ".$fkPeerBuilder->getPeerClassname()."::doSelect(\$criteria, \$con);
+				}
+			}
+		}
+		\$this->$lastCriteriaName = \$criteria;
+		return \$this->$collName;
+	}
+";
+	} // addRefererGet()
+
+
+
+	// ----------------------------------------------------------------
+	//
+	// M A N I P U L A T I O N    M E T H O D S
+	//
+	// ----------------------------------------------------------------
+
+	/**
+	 * Adds the workhourse doSave() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoSave(&$script)
+	{
+		$table = $this->getTable();
+
+		$script .= "
+	/**
+	 * Stores the object in the database.
+	 *
+	 * If the object is new, it inserts it; otherwise an update is performed.
+	 * All related objects are also updated in this method.
+	 *
+	 * @param Connection \$con
+	 * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations.
+	 * @throws PropelException
+	 * @see save()
+	 */
+	protected function doSave(\$con)
+	{
+		\$affectedRows = 0; // initialize var to track total num of affected rows
+		if (!\$this->alreadyInSave) {
+			\$this->alreadyInSave = true;
+";
+
+		if (count($table->getForeignKeys())) {
+
+			$script .= "
+
+			// We call the save method on the following object(s) if they
+			// were passed to this object by their coresponding set
+			// method.  This object relates to these object(s) by a
+			// foreign key reference.
+";
+
+			foreach($table->getForeignKeys() as $fk)
+			{
+				$aVarName = $this->getFKVarName($fk);
+				$script .= "
+			if (\$this->$aVarName !== null) {
+				if (\$this->".$aVarName."->isModified()) {
+					\$affectedRows += \$this->".$aVarName."->save(\$con);
+				}
+				\$this->set".$this->getFKPhpNameAffix($fk, $plural = false)."(\$this->$aVarName);
+			}
+";
+			} // foreach foreign k
+		} // if (count(foreign keys))
+
+		$script .= "
+
+			// If this object has been modified, then save it to the database.
+			if (\$this->isModified()";
+
+		/*
+		FIXME: this doesn't work right now because the BasePeer::doInsert() method
+		expects to be passed a Criteria object that contains columns (which tell BasePeer
+		which table is being updated)
+		if ($table->hasAutoIncrementPrimaryKey()) {
+			$script .= " || \$this->isNew()";
+		}
+		*/
+
+		$script .= ") {
+				if (\$this->isNew()) {
+					\$pk = ".$this->getPeerClassname()."::doInsert(\$this, \$con);
+					\$affectedRows += 1; // we are assuming that there is only 1 row per doInsert() which
+										 // should always be true here (even though technically
+										 // BasePeer::doInsert() can insert multiple rows).
+";
+		if ($table->getIdMethod() != IDMethod::NO_ID_METHOD) {
+
+			if (count($pks = $table->getPrimaryKey())) {
+				foreach ($pks as $pk) {
+					if ($pk->isAutoIncrement()) {
+						$script .= "
+					\$this->set".$pk->getPhpName()."(\$pk);  //[IMV] update autoincrement primary key
+";
+					}
+				}
+			}
+		} // if (id method != "none")
+
+		$script .= "
+					\$this->setNew(false);
+				} else {
+					\$affectedRows += ".$this->getPeerClassname()."::doUpdate(\$this, \$con);
+				}
+				\$this->resetModified(); // [HL] After being saved an object is no longer 'modified'
+			}
+";
+
+		foreach ($table->getReferrers() as $fk) {
+			$collName = $this->getRefFKCollVarName($fk);
+			//HL: commenting out self-referrential check below
+			//		it seems to work as expected and is desireable since we are also enabling the copy()ing of these related rows
+			//if ( $fk->getTable()->getName() != $table->getName() ) {
+				$script .= "
+			if (\$this->$collName !== null) {
+				foreach(\$this->$collName as \$referrerFK) {
+					if (!\$referrerFK->isDeleted()) {
+						\$affectedRows += \$referrerFK->save(\$con);
+					}
+				}
+			}
+";
+			//HL: commenting out close of self-referrential check
+			//} /* if tableFK != table */
+		} /* foreach getReferrers() */
+		$script .= "
+			\$this->alreadyInSave = false;
+		}
+		return \$affectedRows;
+	} // doSave()
+";
+
+	}
+
+	/**
+	 * Adds the $alreadyInSave attribute, which prevents attempting to re-save the same object.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addAlreadyInSaveAttribute(&$script)
+	{
+		$script .= "
+	/**
+	 * Flag to prevent endless save loop, if this object is referenced
+	 * by another object which falls in this transaction.
+	 * @var boolean
+	 */
+	protected \$alreadyInSave = false;
+";
+	}
+
+	/**
+	 * Adds the save() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addSave(&$script)
+	{
+		$script .= "
+	/**
+	 * Stores the object in the database.  If the object is new,
+	 * it inserts it; otherwise an update is performed.  This method
+	 * wraps the doSave() worker method in a transaction.
+	 *
+	 * @param Connection \$con
+	 * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations.
+	 * @throws PropelException
+	 * @see doSave()
+	 */
+	public function save(\$con = null)
+	{
+		if (\$this->isDeleted()) {
+			throw new PropelException(\"You cannot save an object that has been deleted.\");
+		}
+
+		if (\$con === null) {
+			\$con = Propel::getConnection(".$this->getPeerClassname()."::DATABASE_NAME);
+		}
+
+		try {
+			\$con->begin();
+			\$affectedRows = \$this->doSave(\$con);
+			\$con->commit();
+			return \$affectedRows;
+		} catch (PropelException \$e) {
+			\$con->rollback();
+			throw \$e;
+		}
+	}
+";
+
+	}
+
+	/**
+	 * Adds the $alreadyInValidation attribute, which prevents attempting to re-validate the same object.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addAlreadyInValidationAttribute(&$script)
+	{
+		$script .= "
+	/**
+	 * Flag to prevent endless validation loop, if this object is referenced
+	 * by another object which falls in this transaction.
+	 * @var boolean
+	 */
+	protected \$alreadyInValidation = false;
+";
+	}
+
+	/**
+	 * Adds the validate() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addValidate(&$script)
+	{
+		$script .= "
+	/**
+	 * Validates the objects modified field values and all objects related to this table.
+	 *
+	 * If \$columns is either a column name or an array of column names
+	 * only those columns are validated.
+	 *
+	 * @param mixed \$columns Column name or an array of column names.
+	 * @return boolean Whether all columns pass validation.
+	 * @see doValidate()
+	 * @see getValidationFailures()
+	 */
+	public function validate(\$columns = null)
+	{
+		\$res = \$this->doValidate(\$columns);
+		if (\$res === true) {
+			\$this->validationFailures = array();
+			return true;
+		} else {
+			\$this->validationFailures = \$res;
+			return false;
+		}
+	}
+";
+	} // addValidate()
+
+	/**
+	 * Adds the workhourse doValidate() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoValidate(&$script)
+	{
+		$table = $this->getTable();
+
+		$script .= "
+	/**
+	 * This function performs the validation work for complex object models.
+	 *
+	 * In addition to checking the current object, all related objects will
+	 * also be validated.  If all pass then <code>true</code> is returned; otherwise
+	 * an aggreagated array of ValidationFailed objects will be returned.
+	 *
+	 * @param array \$columns Array of column names to validate.
+	 * @return mixed <code>true</code> if all validations pass; array of <code>ValidationFailed</code> objets otherwise.
+	 */
+	protected function doValidate(\$columns = null)
+	{
+		if (!\$this->alreadyInValidation) {
+			\$this->alreadyInValidation = true;
+			\$retval = null;
+
+			\$failureMap = array();
+";
+		if (count($table->getForeignKeys()) != 0) {
+			$script .= "
+
+			// We call the validate method on the following object(s) if they
+			// were passed to this object by their coresponding set
+			// method.  This object relates to these object(s) by a
+			// foreign key reference.
+";
+			foreach($table->getForeignKeys() as $fk) {
+				$aVarName = $this->getFKVarName($fk);
+				$script .= "
+			if (\$this->".$aVarName." !== null) {
+				if (!\$this->".$aVarName."->validate(\$columns)) {
+					\$failureMap = array_merge(\$failureMap, \$this->".$aVarName."->getValidationFailures());
+				}
+			}
+";
+			} /* for() */
+		} /* if count(fkeys) */
+
+		$script .= "
+
+			if ((\$retval = ".$this->getPeerClassname()."::doValidate(\$this, \$columns)) !== true) {
+				\$failureMap = array_merge(\$failureMap, \$retval);
+			}
+
+";
+
+		foreach ($table->getReferrers() as $fk) {
+			$tblFK = $fk->getTable();
+			if ( $tblFK->getName() != $table->getName() ) {
+				$collName = $this->getRefFKCollVarName($fk);
+				$script .= "
+				if (\$this->$collName !== null) {
+					foreach(\$this->$collName as \$referrerFK) {
+						if (!\$referrerFK->validate(\$columns)) {
+							\$failureMap = array_merge(\$failureMap, \$referrerFK->getValidationFailures());
+						}
+					}
+				}
+";
+			} /* if tableFK !+ table */
+		} /* foreach getReferrers() */
+
+		$script .= "
+
+			\$this->alreadyInValidation = false;
+		}
+
+		return (!empty(\$failureMap) ? \$failureMap : true);
+	}
+";
+	} // addDoValidate()
+
+	/**
+	 * Adds the copy() method, which (in complex OM) includes the $deepCopy param for making copies of related objects.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addCopy(&$script)
+	{
+		$this->addCopyInto($script);
+
+		$table = $this->getTable();
+
+		$script .= "
+	/**
+	 * Makes a copy of this object that will be inserted as a new row in table when saved.
+	 * It creates a new object filling in the simple attributes, but skipping any primary
+	 * keys that are defined for the table.
+	 *
+	 * If desired, this method can also make copies of all associated (fkey referrers)
+	 * objects.
+	 *
+	 * @param boolean \$deepCopy Whether to also copy all rows that refer (by fkey) to the current row.
+	 * @return ".$table->getPhpName()." Clone of current object.
+	 * @throws PropelException
+	 */
+	public function copy(\$deepCopy = false)
+	{
+		// we use get_class(), because this might be a subclass
+		\$clazz = get_class(\$this);
+		\$copyObj = new \$clazz();
+		\$this->copyInto(\$copyObj, \$deepCopy);
+		return \$copyObj;
+	}
+";
+	} // addCopy()
+
+	/**
+	 * Adds the copyInto() method, which takes an object and sets contents to match current object.
+	 * In complex OM this method includes the $deepCopy param for making copies of related objects.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addCopyInto(&$script)
+	{
+		$table = $this->getTable();
+
+		$script .= "
+	/**
+	 * Sets contents of passed object to values from current object.
+	 *
+	 * If desired, this method can also make copies of all associated (fkey referrers)
+	 * objects.
+	 *
+	 * @param object \$copyObj An object of ".$table->getPhpName()." (or compatible) type.
+	 * @param boolean \$deepCopy Whether to also copy all rows that refer (by fkey) to the current row.
+	 * @throws PropelException
+	 */
+	public function copyInto(\$copyObj, \$deepCopy = false)
+	{
+";
+
+		$pkcols = array();
+		foreach ($table->getColumns() as $pkcol) {
+			if ($pkcol->isPrimaryKey()) {
+				$pkcols[] = $pkcol->getName();
+			}
+		}
+
+		foreach ($table->getColumns() as $col) {
+			if (!in_array($col->getName(), $pkcols)) {
+				$script .= "
+		\$copyObj->set".$col->getPhpName()."(\$this->".strtolower($col->getName()).");
+";
+			}
+		} // foreach
+
+		// Avoid useless code by checking to see if there are any referrers
+		// to this table:
+		if (count($table->getReferrers()) > 0) {
+			$script .= "
+
+		if (\$deepCopy) {
+			// important: temporarily setNew(false) because this affects the behavior of
+			// the getter/setter methods for fkey referrer objects.
+			\$copyObj->setNew(false);
+";
+			foreach ($table->getReferrers() as $fk) {
+				// Continue if $this and $copyObj are the same class and have the same primary key
+				// to avoid endless loops
+				$script .= "
+			foreach(\$this->get".$this->getRefFKPhpNameAffix($fk, true)."() as \$relObj) {";
+				if ($table->getName() === $fk->getTableName()) {
+					$script .= "
+				if(\$this->getPrimaryKey() === \$relObj->getPrimaryKey()) {
+						continue;
+				}
+";
+				}
+				$script .= "
+				\$copyObj->add".$this->getRefFKPhpNameAffix($fk)."(\$relObj->copy(\$deepCopy));
+			}
+";
+				// HL: commenting out close of self-referential check
+				// } /* if tblFK != table */
+			} /* foreach */
+			$script .= "
+		} // if (\$deepCopy)
+";
+		} /* if (count referrers > 0 ) */
+
+		$script .= "
+
+		\$copyObj->setNew(true);
+";
+
+
+		foreach ($table->getColumns() as $col) {
+			if ($col->isPrimaryKey()) {
+				$coldefval = $col->getPhpDefaultValue();
+				$coldefval = var_export($coldefval, true);
+				$script .= "
+		\$copyObj->set".$col->getPhpName() ."($coldefval); // this is a pkey column, so set to default value
+";
+			} // if col->isPrimaryKey
+		} // foreach
+		$script .= "
+	}
+";
+	} // addCopyInto()
+
+} // PHP5ComplexObjectBuilder


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexObjectBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexPeerBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexPeerBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexPeerBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,866 @@
+<?php
+
+/*
+ *  $Id: PHP5ComplexPeerBuilder.php 227 2005-10-09 14:00:40Z david $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/om/php5/PHP5BasicPeerBuilder.php';
+
+/**
+ * Generates a PHP5 base Peer class with complex object model methods.
+ * 
+ * This class extends the basic peer builder by adding on the doSelectJoin*()
+ * methods and other complex object model methods.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.om.php5
+ */
+class PHP5ComplexPeerBuilder extends PHP5BasicPeerBuilder {		
+
+	/**
+	 * Adds the complex OM methods to the base addSelectMethods() function.
+	 * @param string &$script The script will be modified in this method.
+	 * @see PeerBuilder::addSelectMethods()
+	 */
+	protected function addSelectMethods(&$script)
+	{
+		$table = $this->getTable();
+		
+		parent::addSelectMethods($script);
+
+		$this->addDoCountJoin($script);
+		$this->addDoSelectJoin($script);
+		
+		$countFK = count($table->getForeignKeys());
+		
+		$includeJoinAll = true;
+		
+		foreach ($this->getTable()->getForeignKeys() as $fk) {
+			$tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+			if ($tblFK->isForReferenceOnly()) {
+			   $includeJoinAll = false;
+			}
+		}
+
+		if ($includeJoinAll) {
+			if($countFK > 0) {
+				$this->addDoCountJoinAll($script);
+				$this->addDoSelectJoinAll($script);
+			}
+			if ($countFK > 1) {
+				$this->addDoCountJoinAllExcept($script);
+				$this->addDoSelectJoinAllExcept($script);
+			}
+		}
+		
+	}
+	
+	/**
+	 * Adds the doSelectJoin*() methods.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoSelectJoin(&$script)
+	{
+		$table = $this->getTable();
+		$className = $table->getPhpName();
+		$countFK = count($table->getForeignKeys());
+		
+		if ($countFK >= 1) {
+		
+			foreach ($table->getForeignKeys() as $fk) {
+			
+				$joinTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+				
+				if (!$joinTable->isForReferenceOnly()) {
+				
+					// FIXME - look into removing this next condition; it may not
+					// be necessary:
+					// --- IT is necessary because there needs to be a system for 
+					// aliasing the table if it is the same table.
+					if ( $fk->getForeignTableName() != $table->getName() ) {
+						
+						/*
+						REPLACED BY USING THE ObjectBuilder objects below
+						
+						// check to see if we need to add something to the method name.
+						// For example if there are multiple columns that reference the same
+						// table, then we have to have a methd name like doSelectJoinBooksByBookId
+						$partJoinName = "";
+						foreach ($fk->getLocalColumns() as $columnName ) {
+							$column = $table->getColumn($columnName);
+								//							this second part is not currently ever true (right?)
+							if ($column->isMultipleFK() || $fk->getForeignTableName() == $table->getName()) {
+								$partJoinName = $partJoinName . $column->getPhpName();
+							}
+						}
+						
+						
+						$joinClassName = $joinTable->getPhpName();
+						
+						if ($joinTable->getInterface()) {
+						   $interfaceName = $joinTable->getInterface();
+						} else {
+							$interfaceName = $joinTable->getPhpName();
+						}
+		
+						if ($partJoinName == "") {
+							$joinColumnId = $joinClassName;
+							$joinInterface = $interfaceName;
+							$collThisTable = $className . "s";
+							$collThisTableMs = $className;
+						} else {
+							$joinColumnId = $joinClassName . "RelatedBy" . $partJoinName;
+							$joinInterface = $interfaceName . "RelatedBy" . $partJoinName;
+							$collThisTable = $className . "sRelatedBy" . $partJoinName;
+							$collThisTableMs = $className . "RelatedBy" . $partJoinName;
+						}
+						*/
+						
+						$joinClassName = $joinTable->getPhpName();
+						
+						$thisTableObjectBuilder = OMBuilder::getNewObjectBuilder($table);
+						$joinedTableObjectBuilder = OMBuilder::getNewObjectBuilder($joinTable);
+						$joinedTablePeerBuilder = OMBuilder::getNewPeerBuilder($joinTable);
+						
+						$script .= "
+
+	/**
+	 * Selects a collection of $className objects pre-filled with their $joinClassName objects.
+	 *
+	 * @return array Array of $className objects.
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function doSelectJoin".$thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false)."(Criteria \$c, \$con = null)
+	{
+		\$c = clone \$c;
+
+		// Set the correct dbName if it has not been overridden
+		if (\$c->getDbName() == Propel::getDefaultDB()) {
+			\$c->setDbName(self::DATABASE_NAME);
+		}
+
+		".$this->getPeerClassname()."::addSelectColumns(\$c);
+		\$startcol = (".$this->getPeerClassname()."::NUM_COLUMNS - ".$this->getPeerClassname()."::NUM_LAZY_LOAD_COLUMNS) + 1;
+		".$joinedTablePeerBuilder->getPeerClassname()."::addSelectColumns(\$c);
+";
+		
+						$lfMap = $fk->getLocalForeignMapping();
+						foreach ($fk->getLocalColumns() as $columnName ) {
+							$column = $table->getColumn($columnName);
+							$columnFk = $joinTable->getColumn( $lfMap[$columnName] );
+							$script .= "
+		\$c->addJoin(".$this->getColumnConstant($column).", ".$joinedTablePeerBuilder->getColumnConstant($columnFk).");"; //CHECKME
+						}
+						$script .= "
+		\$rs = ".$this->basePeerClassname."::doSelect(\$c, \$con);
+		\$results = array();
+
+		while(\$rs->next()) {
+";
+						if ($table->getChildrenColumn()) {
+							$script .= "
+			\$omClass = ".$this->getPeerClassname()."::getOMClass(\$rs, 1);
+";
+						} else {
+							$script .= "
+			\$omClass = ".$this->getPeerClassname()."::getOMClass();
+";
+						} 
+						$script .= "
+			\$cls = Propel::import(\$omClass);
+			\$obj1 = new \$cls();
+			\$obj1->hydrate(\$rs);
+";
+						if ($joinTable->getChildrenColumn()) {
+							$script .= "
+			\$omClass = ".$joinedTablePeerBuilder->getPeerClassname()."::getOMClass(\$rs, \$startcol);
+";
+						} else { 
+							$script .= "
+			\$omClass = ".$joinedTablePeerBuilder->getPeerClassname()."::getOMClass();
+";
+						}
+						
+						$script .= "
+			\$cls = Propel::import(\$omClass);
+			\$obj2 = new \$cls();
+			\$obj2->hydrate(\$rs, \$startcol);
+
+			\$newObject = true;
+			foreach(\$results as \$temp_obj1) {
+				\$temp_obj2 = \$temp_obj1->get".$thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false)."(); //CHECKME
+				if (\$temp_obj2->getPrimaryKey() === \$obj2->getPrimaryKey()) {
+					\$newObject = false;
+					// e.g. \$author->addBookRelatedByBookId()
+					\$temp_obj2->add".$joinedTableObjectBuilder->getRefFKPhpNameAffix($fk, $plural = false)."(\$obj1); //CHECKME
+					break;
+				}
+			}
+			if (\$newObject) {
+				\$obj2->init".$joinedTableObjectBuilder->getRefFKPhpNameAffix($fk, $plural = true)."();
+				\$obj2->add".$joinedTableObjectBuilder->getRefFKPhpNameAffix($fk, $plural = false)."(\$obj1); //CHECKME
+			}
+			\$results[] = \$obj1;
+		}
+		return \$results;
+	}
+";
+					} // if fk table name != this table name
+				} // if ! is reference only
+			} // foreach column
+		} // if count(fk) > 1
+		
+	} // addDoSelectJoin()
+	
+	/**
+	 * Adds the doCountJoin*() methods.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoCountJoin(&$script)
+	{
+		$table = $this->getTable();
+		$className = $table->getPhpName();
+		$countFK = count($table->getForeignKeys());
+		
+		if ($countFK >= 1) {
+		
+			foreach ($table->getForeignKeys() as $fk) {
+			
+				$joinTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+				
+				if (!$joinTable->isForReferenceOnly()) {
+				
+					if ( $fk->getForeignTableName() != $table->getName() ) {
+						
+						$joinClassName = $joinTable->getPhpName();
+						
+						$thisTableObjectBuilder = OMBuilder::getNewObjectBuilder($table);
+						$joinedTableObjectBuilder = OMBuilder::getNewObjectBuilder($joinTable);
+						$joinedTablePeerBuilder = OMBuilder::getNewPeerBuilder($joinTable);
+						
+						$script .= "
+
+	/**
+	 * Returns the number of rows matching criteria, joining the related ".$thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false)." table
+	 *
+	 * @param Criteria \$c
+	 * @param boolean \$distinct Whether to select only distinct columns (You can also set DISTINCT modifier in Criteria).
+	 * @param Connection \$con
+	 * @return int Number of matching rows.
+	 */
+	public static function doCountJoin".$thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false)."(Criteria \$criteria, \$distinct = false, \$con = null)
+	{
+		// we're going to modify criteria, so copy it first
+		\$criteria = clone \$criteria;
+		
+		// clear out anything that might confuse the ORDER BY clause
+		\$criteria->clearSelectColumns()->clearOrderByColumns();
+		if (\$distinct || in_array(Criteria::DISTINCT, \$criteria->getSelectModifiers())) {
+			\$criteria->addSelectColumn(".$this->getPeerClassname()."::COUNT_DISTINCT);
+		} else {
+			\$criteria->addSelectColumn(".$this->getPeerClassname()."::COUNT);
+		}
+		
+		// just in case we're grouping: add those columns to the select statement
+		foreach(\$criteria->getGroupByColumns() as \$column)
+		{
+			\$criteria->addSelectColumn(\$column);
+		}
+";
+						$lfMap = $fk->getLocalForeignMapping();
+						foreach ($fk->getLocalColumns() as $columnName ) {
+							$column = $table->getColumn($columnName);
+							$columnFk = $joinTable->getColumn( $lfMap[$columnName] );
+							$script .= "
+		\$criteria->addJoin(".$this->getColumnConstant($column).", ".$joinedTablePeerBuilder->getColumnConstant($columnFk).");
+";
+						}
+						$script .= "
+		\$rs = ".$this->getPeerClassname()."::doSelectRS(\$criteria, \$con);
+		if (\$rs->next()) {
+			return \$rs->getInt(1);
+		} else {
+			// no rows returned; we infer that means 0 matches.
+			return 0;
+		}
+	}
+";
+					} // if fk table name != this table name
+				} // if ! is reference only
+			} // foreach column
+		} // if count(fk) > 1
+		
+	} // addDoCountJoin()
+	
+	/**
+	 * Adds the doSelectJoinAll() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoSelectJoinAll(&$script)
+	{
+		$table = $this->getTable();
+		$className = $table->getPhpName();
+		
+		$script .= "
+
+	/**
+	 * Selects a collection of $className objects pre-filled with all related objects.
+	 *
+	 * @return array Array of $className objects.
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function doSelectJoinAll(Criteria \$c, \$con = null)
+	{
+		\$c = clone \$c;
+
+		// Set the correct dbName if it has not been overridden
+		if (\$c->getDbName() == Propel::getDefaultDB()) {
+			\$c->setDbName(self::DATABASE_NAME);
+		}
+
+		".$this->getPeerClassname()."::addSelectColumns(\$c);
+		\$startcol2 = (".$this->getPeerClassname()."::NUM_COLUMNS - ".$this->getPeerClassname()."::NUM_LAZY_LOAD_COLUMNS) + 1;
+";
+		$index = 2;
+		foreach ($table->getForeignKeys() as $fk) {
+			// want to cover this case, but the code is not there yet.
+			// FIXME: why "is the code not there yet" ?
+			if ( $fk->getForeignTableName() != $table->getName() ) {
+				$joinTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+				$joinClassName = $joinTable->getPhpName();
+				$new_index = $index + 1;
+				
+				$joinedTablePeerBuilder = OMBuilder::getNewPeerBuilder($joinTable);
+						
+				$script .= "
+		".$joinedTablePeerBuilder->getPeerClassname()."::addSelectColumns(\$c);
+		\$startcol$new_index = \$startcol$index + ".$joinedTablePeerBuilder->getPeerClassname()."::NUM_COLUMNS;
+";
+			$index = $new_index;
+			
+			} // if fk->getForeignTableName != table->getName		
+		} // foreach [sub] foreign keys
+
+
+		foreach ($table->getForeignKeys() as $fk) {
+			// want to cover this case, but the code is not there yet.
+			if ( $fk->getForeignTableName() != $table->getName() ) {
+				$joinTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+				$joinedTablePeerBuilder = OMBuilder::getNewPeerBuilder($joinTable);
+				
+				$joinClassName = $joinTable->getPhpName();
+				$lfMap = $fk->getLocalForeignMapping();
+				foreach ($fk->getLocalColumns() as $columnName ) {
+					$column = $table->getColumn($columnName);
+					$columnFk = $joinTable->getColumn( $lfMap[$columnName]);
+					$script .= "
+		\$c->addJoin(".$this->getColumnConstant($column).", ".$joinedTablePeerBuilder->getColumnConstant($columnFk).");
+";
+	  			} 
+			} 
+		}
+		
+		$script .= "
+		\$rs = ".$this->basePeerClassname."::doSelect(\$c, \$con);
+		\$results = array();
+		
+		while(\$rs->next()) {
+";
+
+		if ($table->getChildrenColumn()) { 
+			$script .= "
+			\$omClass = ".$this->getPeerClassname()."::getOMClass(\$rs, 1);
+";
+		} else {
+			$script .= "
+			\$omClass = ".$this->getPeerClassname()."::getOMClass();
+";
+		}
+	
+		$script .= "
+			
+			\$cls = Propel::import(\$omClass);
+			\$obj1 = new \$cls();
+			\$obj1->hydrate(\$rs);
+";
+
+		$index = 1;
+		foreach ($table->getForeignKeys() as $fk ) {
+			
+			// want to cover this case, but the code is not there yet.
+			// FIXME -- why not? -because we'd have to alias the tables in the JOIN
+			if ( $fk->getForeignTableName() != $table->getName() ) {
+				
+				$joinTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+				$joinClassName = $joinTable->getPhpName();
+				$interfaceName = $joinTable->getPhpName();
+				if($joinTable->getInterface()) {
+					$interfaceName = $joinTable->getInterface();
+				}
+				
+				/*
+				$partJoinName = "";
+				foreach ($fk->getLocalColumns() as $columnName ) {
+					$column = $table->getColumn($columnName);
+					if ($column->isMultipleFK()) {
+						$partJoinName .= $column->getPhpName();
+					}
+				}
+				
+				if ($partJoinName == "") {
+					$joinString = $interfaceName;
+					$collThisTable = "${className}s";
+					$collThisTableMs = $className;
+				} else {
+					$joinString= $interfaceName."RelatedBy" . $partJoinName;
+					$collThisTable= $className . "sRelatedBy" . $partJoinName;
+					$collThisTableMs= $className . "RelatedBy" . $partJoinName;
+				}
+				*/
+				
+				$thisTableObjectBuilder = OMBuilder::getNewObjectBuilder($table);
+				$joinedTableObjectBuilder = OMBuilder::getNewObjectBuilder($joinTable);
+				$joinedTablePeerBuilder = OMBuilder::getNewPeerBuilder($joinTable);
+				
+				
+				$index++;
+				
+				$script .= "
+				
+				// Add objects for joined $joinClassName rows
+	";
+				if ($joinTable->getChildrenColumn()) {
+					$script .= "
+			\$omClass = ".$joinedTablePeerBuilder->getPeerClassname()."::getOMClass(\$rs, \$startcol$index);
+";
+				} else {
+					$script .= "
+			\$omClass = ".$joinedTablePeerBuilder->getPeerClassname()."::getOMClass();
+";
+				} /* $joinTable->getChildrenColumn() */
+			
+				$script .= "
+	
+			\$cls = Propel::import(\$omClass);
+			\$obj".$index." = new \$cls();
+			\$obj".$index."->hydrate(\$rs, \$startcol$index);
+			
+			\$newObject = true;
+			for (\$j=0, \$resCount=count(\$results); \$j < \$resCount; \$j++) {
+				\$temp_obj1 = \$results[\$j];
+				\$temp_obj$index = \$temp_obj1->get".$thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false)."(); // CHECKME
+				if (\$temp_obj".$index."->getPrimaryKey() === \$obj".$index."->getPrimaryKey()) {
+					\$newObject = false;
+					\$temp_obj".$index."->add".$joinedTableObjectBuilder->getRefFKPhpNameAffix($fk, $plural = false)."(\$obj1); // CHECKME
+					break;
+				}
+			}
+			
+			if (\$newObject) {
+				\$obj".$index."->init".$joinedTableObjectBuilder->getRefFKPhpNameAffix($fk, $plural = true)."();
+				\$obj".$index."->add".$joinedTableObjectBuilder->getRefFKPhpNameAffix($fk, $plural = false)."(\$obj1);
+			}
+";
+
+			} // $fk->getForeignTableName() != $table->getName()
+		} //foreach foreign key
+		
+		$script .= "
+			\$results[] = \$obj1;
+		}
+		return \$results;
+	}
+";
+	
+	} // end addDoSelectJoinAll()
+	
+	/**
+	 * Adds the doCountJoinAll() method.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoCountJoinAll(&$script)
+	{
+		$table = $this->getTable();
+		$className = $table->getPhpName();
+		
+		$script .= "
+
+	/**
+	 * Returns the number of rows matching criteria, joining all related tables
+	 *
+	 * @param Criteria \$c
+	 * @param boolean \$distinct Whether to select only distinct columns (You can also set DISTINCT modifier in Criteria).
+	 * @param Connection \$con
+	 * @return int Number of matching rows.
+	 */
+	public static function doCountJoinAll(Criteria \$criteria, \$distinct = false, \$con = null)
+	{
+		\$criteria = clone \$criteria;
+
+		// clear out anything that might confuse the ORDER BY clause
+		\$criteria->clearSelectColumns()->clearOrderByColumns();
+		if (\$distinct || in_array(Criteria::DISTINCT, \$criteria->getSelectModifiers())) {
+			\$criteria->addSelectColumn(".$this->getPeerClassname()."::COUNT_DISTINCT);
+		} else {
+			\$criteria->addSelectColumn(".$this->getPeerClassname()."::COUNT);
+		}
+		
+		// just in case we're grouping: add those columns to the select statement
+		foreach(\$criteria->getGroupByColumns() as \$column)
+		{
+			\$criteria->addSelectColumn(\$column);
+		}
+";
+
+		foreach ($table->getForeignKeys() as $fk) {
+			// want to cover this case, but the code is not there yet.
+			if ( $fk->getForeignTableName() != $table->getName() ) {
+				$joinTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+				$joinedTablePeerBuilder = OMBuilder::getNewPeerBuilder($joinTable);
+				
+				$joinClassName = $joinTable->getPhpName();
+				$lfMap = $fk->getLocalForeignMapping();
+				foreach ($fk->getLocalColumns() as $columnName ) {
+					$column = $table->getColumn($columnName);
+					$columnFk = $joinTable->getColumn( $lfMap[$columnName]);
+					$script .= "
+		\$criteria->addJoin(".$this->getColumnConstant($column).", ".$joinedTablePeerBuilder->getColumnConstant($columnFk).");
+";
+				}
+			} // if fk->getForeignTableName != table->getName		
+		} // foreach [sub] foreign keys
+
+		$script .= "
+		\$rs = ".$this->getPeerClassname()."::doSelectRS(\$criteria, \$con);
+		if (\$rs->next()) {
+			return \$rs->getInt(1);
+		} else {
+			// no rows returned; we infer that means 0 matches.
+			return 0;
+		}
+	}
+";
+	} // end addDoCountJoinAll()
+	
+	/**
+	 * Adds the doSelectJoinAllExcept*() methods.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoSelectJoinAllExcept(&$script)
+	{
+		$table = $this->getTable();
+		
+		// ------------------------------------------------------------------------
+		// doSelectJoinAllExcept*()
+		// ------------------------------------------------------------------------
+		
+		// 2) create a bunch of doSelectJoinAllExcept*() methods
+		// -- these were existing in original Torque, so we should keep them for compatibility
+		
+		$fkeys = $table->getForeignKeys();  // this sep assignment is necessary otherwise sub-loops over 
+											// getForeignKeys() will cause this to only execute one time.
+		foreach ($fkeys as $fk ) {
+			
+			$tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+
+			$excludedTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+			$excludedClassName = $excludedTable->getPhpName();
+			
+			/*
+			$relatedByCol = "";
+			foreach ($fk->getLocalColumns() as $columnName) {
+				$column = $table->getColumn($columnName);
+				if ($column->isMultipleFK()) {
+					$relatedByCol .= $column->getPhpName();
+				}
+			}
+			
+			if ($relatedByCol == "") {
+				$excludeString = $excludedClassName;
+				$collThisTable = "${className}s";
+				$collThisTableMs = $className;
+			} else {
+				$excludeString = $excludedClassName . "RelatedBy" . $relatedByCol;
+				$collThisTable = $className . "sRelatedBy" . $relatedByCol;
+				$collThisTableMs = $className . "RelatedBy" . $relatedByCol;
+			}
+			*/
+			
+			$thisTableObjectBuilder = OMBuilder::getNewObjectBuilder($table);
+			$excludedTableObjectBuilder = OMBuilder::getNewObjectBuilder($excludedTable);
+			$excludedTablePeerBuilder = OMBuilder::getNewPeerBuilder($excludedTable);
+				
+		$script .= "
+
+	/**
+	 * Selects a collection of ".$table->getPhpName()." objects pre-filled with all related objects except ".$thisTableObjectBuilder->getFKPhpNameAffix($fk).".
+	 *
+	 * @return array Array of ".$table->getPhpName()." objects.
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function doSelectJoinAllExcept".$thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false)."(Criteria \$c, \$con = null)
+	{
+		\$c = clone \$c;
+
+		// Set the correct dbName if it has not been overridden
+		// \$c->getDbName() will return the same object if not set to another value
+		// so == check is okay and faster
+		if (\$c->getDbName() == Propel::getDefaultDB()) {
+			\$c->setDbName(self::DATABASE_NAME);
+		}
+
+		".$this->getPeerClassname()."::addSelectColumns(\$c);
+		\$startcol2 = (".$this->getPeerClassname()."::NUM_COLUMNS - ".$this->getPeerClassname()."::NUM_LAZY_LOAD_COLUMNS) + 1;
+";	
+			$index = 2;
+			foreach ($table->getForeignKeys() as $subfk) {
+				// want to cover this case, but the code is not there yet.
+				// FIXME - why not?
+				if ( !($subfk->getForeignTableName() == $table->getName())) {
+					$joinTable = $table->getDatabase()->getTable($subfk->getForeignTableName());
+					$joinClassName = $joinTable->getPhpName();
+					$joinTablePeerBuilder = OMBuilder::getNewPeerBuilder($joinTable);
+		
+					if ($joinClassName != $excludedClassName) {
+						$new_index = $index + 1;
+						$script .= "
+		".$joinTablePeerBuilder->getPeerClassname()."::addSelectColumns(\$c);
+		\$startcol$new_index = \$startcol$index + ".$joinTablePeerBuilder->getPeerClassname()."::NUM_COLUMNS;
+";
+					$index = $new_index;
+					} // if joinClassName not excludeClassName 
+				} // if subfk is not curr table
+			} // foreach [sub] foreign keys
+				
+			foreach ($table->getForeignKeys() as $subfk) {
+				// want to cover this case, but the code is not there yet.
+				if ( $subfk->getForeignTableName() != $table->getName() ) {
+					$joinTable = $table->getDatabase()->getTable($subfk->getForeignTableName());
+					$joinClassName = $joinTable->getPhpName();
+					$joinTablePeerBuilder = OMBuilder::getNewPeerBuilder($joinTable);
+
+					if($joinClassName != $excludedClassName)
+					{
+						$lfMap = $subfk->getLocalForeignMapping();
+						foreach ($subfk->getLocalColumns() as $columnName ) {
+							$column = $table->getColumn($columnName);
+							$columnFk = $joinTable->getColumn( $lfMap[$columnName]);
+							$script .= "
+		\$c->addJoin(".$this->getColumnConstant($column).", ".$joinTablePeerBuilder->getColumnConstant($columnFk).");
+";
+						}
+					} 
+				}
+			} // foreach fkeys 
+			$script .= "
+
+		\$rs = ".$this->basePeerClassname ."::doSelect(\$c, \$con);
+		\$results = array();
+		
+		while(\$rs->next()) {
+";
+			if ($table->getChildrenColumn()) {
+				$script .= "
+			\$omClass = ".$this->getPeerClassname()."::getOMClass(\$rs, 1);
+";
+			} else {
+				$script .= "
+			\$omClass = ".$this->getPeerClassname()."::getOMClass();
+";
+			}
+			
+			$script .= "
+			\$cls = Propel::import(\$omClass);
+			\$obj1 = new \$cls();
+			\$obj1->hydrate(\$rs);		
+";
+	
+		$index = 1;
+		foreach ($table->getForeignKeys() as $subfk ) {
+		  // want to cover this case, but the code is not there yet.
+		  if ( $subfk->getForeignTableName() != $table->getName() ) {
+		  
+				$joinTable = $table->getDatabase()->getTable($subfk->getForeignTableName());
+				$joinClassName = $joinTable->getPhpName();
+				$interfaceName = $joinTable->getPhpName();
+				if($joinTable->getInterface()) {
+					$interfaceName = $joinTable->getInterface();
+				}
+	
+				if ($joinClassName != $excludedClassName) {
+					
+					/*
+					$partJoinName = "";
+					foreach ($subfk->getLocalColumns() as $columnName ) {
+						$column = $table->getColumn($columnName);
+						if ($column->isMultipleFK()) {
+							$partJoinName .= $column->getPhpName();
+						}
+					}
+	
+					if ($partJoinName == "") {
+						$joinString = $interfaceName;
+						$collThisTable = "${className}s";
+						$collThisTableMs = $className;
+					} else {
+						$joinString= $interfaceName."RelatedBy" . $partJoinName;
+						$collThisTable= $className . "sRelatedBy" . $partJoinName;
+						$collThisTableMs= $className . "RelatedBy" . $partJoinName;
+					}
+					*/
+					
+					$joinedTableObjectBuilder = OMBuilder::getNewObjectBuilder($joinTable);
+					$joinedTablePeerBuilder = OMBuilder::getNewPeerBuilder($joinTable);
+					
+					$index++;
+				
+					if ($joinTable->getChildrenColumn()) {
+						$script .= "
+			\$omClass = ".$joinedTablePeerBuilder->getPeerClassname()."::getOMClass(\$rs, \$startcol$index);
+";
+					} else {
+						$script .= "
+			\$omClass = ".$joinedTablePeerBuilder->getPeerClassname()."::getOMClass();
+";
+					} /* $joinTable->getChildrenColumn() */
+	
+					$script .= "
+	
+			\$cls = Propel::import(\$omClass);
+			\$obj$index  = new \$cls();
+			\$obj".$index."->hydrate(\$rs, \$startcol$index);
+			
+			\$newObject = true;
+			for (\$j=0, \$resCount=count(\$results); \$j < \$resCount; \$j++) {
+				\$temp_obj1 = \$results[\$j];
+				\$temp_obj$index = \$temp_obj1->get".$thisTableObjectBuilder->getFKPhpNameAffix($subfk, $plural=false)."(); //CHECKME
+				if (\$temp_obj".$index."->getPrimaryKey() === \$obj".$index."->getPrimaryKey()) {
+					\$newObject = false;
+					\$temp_obj".$index."->add".$joinedTableObjectBuilder->getRefFKPhpNameAffix($subfk, $plural=false)."(\$obj1);
+					break;
+				}
+			}
+			
+			if (\$newObject) {
+				\$obj".$index."->init".$joinedTableObjectBuilder->getRefFKPhpNameAffix($subfk, $plural=true)."();
+				\$obj".$index."->add".$joinedTableObjectBuilder->getRefFKPhpNameAffix($subfk, $plural=false)."(\$obj1);
+			}
+";
+					} // if ($joinClassName != $excludedClassName) {
+			} // $subfk->getForeignTableName() != $table->getName()
+		} // foreach  
+		$script .= "
+			\$results[] = \$obj1;
+		}
+		return \$results;
+	}
+";
+		} // foreach fk
+
+	} // addDoSelectJoinAllExcept
+	
+	/**
+	 * Adds the doCountJoinAllExcept*() methods.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addDoCountJoinAllExcept(&$script)
+	{
+		$table = $this->getTable();
+		
+		$fkeys = $table->getForeignKeys();  // this sep assignment is necessary otherwise sub-loops over 
+											// getForeignKeys() will cause this to only execute one time.
+		foreach ($fkeys as $fk ) {
+
+			$tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+
+			$excludedTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+			$excludedClassName = $excludedTable->getPhpName();
+
+			$thisTableObjectBuilder = OMBuilder::getNewObjectBuilder($table);
+			$excludedTableObjectBuilder = OMBuilder::getNewObjectBuilder($excludedTable);
+			$excludedTablePeerBuilder = OMBuilder::getNewPeerBuilder($excludedTable);
+				
+		$script .= "
+
+	/**
+	 * Returns the number of rows matching criteria, joining the related ".$thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false)." table
+	 *
+	 * @param Criteria \$c
+	 * @param boolean \$distinct Whether to select only distinct columns (You can also set DISTINCT modifier in Criteria).
+	 * @param Connection \$con
+	 * @return int Number of matching rows.
+	 */
+	public static function doCountJoinAllExcept".$thisTableObjectBuilder->getFKPhpNameAffix($fk, $plural = false)."(Criteria \$criteria, \$distinct = false, \$con = null)
+	{
+		// we're going to modify criteria, so copy it first
+		\$criteria = clone \$criteria;
+		
+		// clear out anything that might confuse the ORDER BY clause
+		\$criteria->clearSelectColumns()->clearOrderByColumns();
+		if (\$distinct || in_array(Criteria::DISTINCT, \$criteria->getSelectModifiers())) {
+			\$criteria->addSelectColumn(".$this->getPeerClassname()."::COUNT_DISTINCT);
+		} else {
+			\$criteria->addSelectColumn(".$this->getPeerClassname()."::COUNT);
+		}
+		
+		// just in case we're grouping: add those columns to the select statement
+		foreach(\$criteria->getGroupByColumns() as \$column)
+		{
+			\$criteria->addSelectColumn(\$column);
+		}
+";	
+
+			foreach ($table->getForeignKeys() as $subfk) {
+				// want to cover this case, but the code is not there yet.
+				if ( $subfk->getForeignTableName() != $table->getName() ) {
+					$joinTable = $table->getDatabase()->getTable($subfk->getForeignTableName());
+					$joinClassName = $joinTable->getPhpName();
+					$joinTablePeerBuilder = OMBuilder::getNewPeerBuilder($joinTable);
+
+					if($joinClassName != $excludedClassName)
+					{
+						$lfMap = $subfk->getLocalForeignMapping();
+						foreach ($subfk->getLocalColumns() as $columnName ) {
+							$column = $table->getColumn($columnName);
+							$columnFk = $joinTable->getColumn( $lfMap[$columnName]);
+							$script .= "
+		\$criteria->addJoin(".$this->getColumnConstant($column).", ".$joinTablePeerBuilder->getColumnConstant($columnFk).");
+";
+						}
+					} 
+				}
+			} // foreach fkeys 
+			$script .= "
+		\$rs = ".$this->getPeerClassname()."::doSelectRS(\$criteria, \$con);
+		if (\$rs->next()) {
+			return \$rs->getInt(1);
+		} else {
+			// no rows returned; we infer that means 0 matches.
+			return 0;
+		}
+	}
+";
+		} // foreach fk
+
+	} // addDoCountJoinAllExcept
+	
+} // PHP5ComplexPeerBuilder


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexPeerBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodeBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodeBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodeBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,124 @@
+<?php
+
+/*
+ *  $Id: PHP5BasicObjectBuilder.php 120 2005-06-17 02:18:41Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/om/ObjectBuilder.php';
+
+/**
+ * Generates the empty PHP5 stub node object class for user object model (OM).
+ * 
+ * This class produces the empty stub class that can be customized with application
+ * business logic, custom behavior, etc.
+ * 
+ * This class replaces the ExtensionNode.tpl, with the intent of being easier for users
+ * to customize (through extending & overriding).
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.om.php5
+ */
+class PHP5ExtensionNodeBuilder extends ObjectBuilder {		
+	
+	/**
+	 * Returns the name of the current class being built.
+	 * @return string
+	 */
+	public function getClassname()
+	{
+		return $this->getTable()->getPhpName() . 'Node';
+	}
+	
+	/**
+	 * Adds the include() statements for files that this class depends on or utilizes.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addIncludes(&$script)
+	{
+	
+		$script .= "
+require_once '".$this->getNodeBuilder()->getClassFilePath()."';
+";
+		
+	} // addIncludes()
+	
+	/**
+	 * Adds class phpdoc comment and openning of class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addClassOpen(&$script)
+	{
+		
+		$table = $this->getTable();
+		$tableName = $table->getName();
+		$tableDesc = $table->getDescription();
+		
+		$baseClassname = $this->getNodeBuilder()->getClassname();
+		
+		$script .= "
+
+/**
+ * Skeleton subclass for representing a node from the '$tableName' table.
+ *
+ * $tableDesc
+ *";
+		if ($this->getBuildProperty('addTimeStamp')) {
+			$now = strftime('%c');
+			$script .= "
+ * This class was autogenerated by Propel on:
+ *
+ * $now
+ *";
+		}
+		$script .= "
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ *
+ * @package ".$this->getPackage()."
+ */	
+class ".$this->getClassname()." extends $baseClassname {
+";
+	}
+	
+	/**
+	 * Specifies the methods that are added as part of the stub object class.
+	 * 
+	 * By default there are no methods for the empty stub classes; override this method
+	 * if you want to change that behavior.
+	 * 
+	 * @see ObjectBuilder::addClassBody()
+	 */
+	protected function addClassBody(&$script)
+	{
+		// there is no class body
+	}
+	
+	/**
+	 * Closes class.
+	 * @param string &$script The script will be modified in this method.
+	 */	
+	protected function addClassClose(&$script)
+	{
+		$script .= "
+} // " . $this->getClassname() . "
+";
+	}
+	
+} // PHP5ExtensionObjectBuilder


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodeBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodePeerBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodePeerBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodePeerBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,127 @@
+<?php
+
+/*
+ *  $Id: PHP5BasicObjectBuilder.php 120 2005-06-17 02:18:41Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/om/PeerBuilder.php';
+
+/**
+ * Generates the empty PHP5 stub node peer class for user object model (OM).
+ * 
+ * This class produces the empty stub class that can be customized with application
+ * business logic, custom behavior, etc.
+ * 
+ * This class replaces the ExtensionNodePeer.tpl, with the intent of being easier for users
+ * to customize (through extending & overriding).
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.om.php5
+ */
+class PHP5ExtensionNodePeerBuilder extends PeerBuilder {
+	
+	/**
+	 * Returns the name of the current class being built.
+	 * @return string
+	 */
+	public function getClassname()
+	{
+		return $this->getStubNodeBuilder()->getClassname() . 'Peer';
+	}
+
+	/**
+	 * Adds the include() statements for files that this class depends on or utilizes.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addIncludes(&$script)
+	{
+		$script .= "
+  // include base nodepeer class
+  require_once '".$this->getNodePeerBuilder()->getClassFilePath()."';
+  
+  // include node class
+  include_once '".$this->getStubNodeBuilder()->getClassFilePath()."';
+";
+	} // addIncludes()
+	
+	/**
+	 * Adds class phpdoc comment and openning of class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addClassOpen(&$script)
+	{
+		
+		$table = $this->getTable();
+		$tableName = $table->getName();
+		$tableDesc = $table->getDescription();
+		
+		$baseClassname = $this->getNodePeerBuilder()->getClassname();
+		
+		$script .= "
+
+/**
+ * Skeleton subclass for performing query and update operations on nodes of the '$tableName' table.
+ *
+ * $tableDesc
+ *";
+		if ($this->getBuildProperty('addTimeStamp')) {
+			$now = strftime('%c');
+			$script .= "
+ * This class was autogenerated by Propel on:
+ *
+ * $now
+ *";
+		}
+		$script .= "
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ *
+ * @package ".$this->getPackage()."
+ */	
+class ".$this->getClassname()." extends $baseClassname {
+";
+	}
+	
+		/**
+	 * Specifies the methods that are added as part of the stub peer class.
+	 * 
+	 * By default there are no methods for the empty stub classes; override this method
+	 * if you want to change that behavior.
+	 * 
+	 * @see ObjectBuilder::addClassBody()
+	 */
+
+	protected function addClassBody(&$script)
+	{
+		// there is no class body
+	}
+	
+	/**
+	 * Closes class.
+	 * @param string &$script The script will be modified in this method.
+	 */	
+	protected function addClassClose(&$script)
+	{
+		$script .= "
+} // " . $this->getClassname() . "
+";
+	}
+	
+} // PHP5ExtensionPeerBuilder


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodePeerBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionObjectBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionObjectBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionObjectBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,123 @@
+<?php
+
+/*
+ *  $Id: PHP5BasicObjectBuilder.php 120 2005-06-17 02:18:41Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/om/ObjectBuilder.php';
+
+/**
+ * Generates the empty PHP5 stub object class for user object model (OM).
+ * 
+ * This class produces the empty stub class that can be customized with application
+ * business logic, custom behavior, etc.
+ * 
+ * This class replaces the ExtensionObject.tpl, with the intent of being easier for users
+ * to customize (through extending & overriding).
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.om.php5
+ */
+class PHP5ExtensionObjectBuilder extends ObjectBuilder {		
+	
+	/**
+	 * Returns the name of the current class being built.
+	 * @return string
+	 */
+	public function getClassname()
+	{
+		return $this->getTable()->getPhpName();
+	}
+	
+	/**
+	 * Adds the include() statements for files that this class depends on or utilizes.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addIncludes(&$script)
+	{
+		$script .= "
+require_once '".$this->getObjectBuilder()->getClassFilePath()."';
+";
+		
+	} // addIncludes()
+	
+	/**
+	 * Adds class phpdoc comment and openning of class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addClassOpen(&$script)
+	{
+		
+		$table = $this->getTable();
+		$tableName = $table->getName();
+		$tableDesc = $table->getDescription();
+		
+		$baseClassname = $this->getObjectBuilder()->getClassname();
+		
+		$script .= "
+
+/**
+ * Skeleton subclass for representing a row from the '$tableName' table.
+ *
+ * $tableDesc
+ *";
+		if ($this->getBuildProperty('addTimeStamp')) {
+			$now = strftime('%c');
+			$script .= "
+ * This class was autogenerated by Propel on:
+ *
+ * $now
+ *";
+		}
+		$script .= "
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ *
+ * @package ".$this->getPackage()."
+ */	
+class ".$this->getClassname()." extends $baseClassname {
+";
+	}
+	
+	/**
+	 * Specifies the methods that are added as part of the stub object class.
+	 * 
+	 * By default there are no methods for the empty stub classes; override this method
+	 * if you want to change that behavior.
+	 * 
+	 * @see ObjectBuilder::addClassBody()
+	 */
+	protected function addClassBody(&$script)
+	{
+		// there is no class body
+	}
+	
+	/**
+	 * Closes class.
+	 * @param string &$script The script will be modified in this method.
+	 */	
+	protected function addClassClose(&$script)
+	{
+		$script .= "
+} // " . $this->getClassname() . "
+";
+	}
+	
+} // PHP5ExtensionObjectBuilder


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionObjectBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionPeerBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionPeerBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionPeerBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,127 @@
+<?php
+
+/*
+ *  $Id: PHP5BasicObjectBuilder.php 120 2005-06-17 02:18:41Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/om/PeerBuilder.php';
+
+/**
+ * Generates the empty PHP5 stub peer class for user object model (OM).
+ * 
+ * This class produces the empty stub class that can be customized with application
+ * business logic, custom behavior, etc.
+ * 
+ * This class replaces the ExtensionPeer.tpl, with the intent of being easier for users
+ * to customize (through extending & overriding).
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.om.php5
+ */
+class PHP5ExtensionPeerBuilder extends PeerBuilder {
+	
+	/**
+	 * Returns the name of the current class being built.
+	 * @return string
+	 */
+	public function getClassname()
+	{
+		return $this->getStubObjectBuilder()->getClassname() . 'Peer';
+	}
+
+	/**
+	 * Adds the include() statements for files that this class depends on or utilizes.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addIncludes(&$script)
+	{
+		$script .= "
+  // include base peer class
+  require_once '".$this->getPeerBuilder()->getClassFilePath()."';
+  
+  // include object class
+  include_once '".$this->getStubObjectBuilder()->getClassFilePath()."';
+";
+	} // addIncludes()
+	
+	/**
+	 * Adds class phpdoc comment and openning of class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addClassOpen(&$script)
+	{
+		
+		$table = $this->getTable();
+		$tableName = $table->getName();
+		$tableDesc = $table->getDescription();
+		
+		$baseClassname = $this->getPeerBuilder()->getClassname();
+		
+		$script .= "
+
+/**
+ * Skeleton subclass for performing query and update operations on the '$tableName' table.
+ *
+ * $tableDesc
+ *";
+		if ($this->getBuildProperty('addTimeStamp')) {
+			$now = strftime('%c');
+			$script .= "
+ * This class was autogenerated by Propel on:
+ *
+ * $now
+ *";
+		}
+		$script .= "
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ *
+ * @package ".$this->getPackage()."
+ */	
+class ".$this->getClassname()." extends $baseClassname {
+";
+	}
+	
+		/**
+	 * Specifies the methods that are added as part of the stub peer class.
+	 * 
+	 * By default there are no methods for the empty stub classes; override this method
+	 * if you want to change that behavior.
+	 * 
+	 * @see ObjectBuilder::addClassBody()
+	 */
+
+	protected function addClassBody(&$script)
+	{
+		// there is no class body
+	}
+	
+	/**
+	 * Closes class.
+	 * @param string &$script The script will be modified in this method.
+	 */	
+	protected function addClassClose(&$script)
+	{
+		$script .= "
+} // " . $this->getClassname() . "
+";
+	}
+	
+} // PHP5ExtensionPeerBuilder


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionPeerBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5InterfaceBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5InterfaceBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5InterfaceBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,119 @@
+<?php
+
+/*
+ *  $Id: PHP5BasicObjectBuilder.php 120 2005-06-17 02:18:41Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/om/ObjectBuilder.php';
+
+/**
+ * Generates the empty PHP5 stub interface for user object model (OM).
+ * 
+ * This class produces the empty stub interface when the interface="" attribute is used
+ * in the the schema xml.
+ * 
+ * This class replaces the Interface.tpl, with the intent of being easier for users
+ * to customize (through extending & overriding).
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.om.php5
+ */
+class PHP5InterfaceBuilder extends ObjectBuilder {		
+	
+	/**
+	 * Returns the name of the current class being built.
+	 * @return string
+	 */
+	public function getClassname()
+	{	
+		return ClassTools::classname($this->getInterface());
+	}
+	
+	/**
+	 * Adds the include() statements for files that this class depends on or utilizes.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addIncludes(&$script)
+	{
+		
+	} // addIncludes()
+	
+	/**
+	 * Adds class phpdoc comment and openning of class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addClassOpen(&$script)
+	{
+		
+		$table = $this->getTable();
+		$tableName = $table->getName();
+		$tableDesc = $table->getDescription();
+		
+		$baseClassname = $this->getObjectBuilder()->getClassname();
+		
+		$script .= "
+/**
+ * This is an interface that should be filled with the public api of the $tableName objects.  
+ *
+ * $tableDesc
+ *";
+		if ($this->getBuildProperty('addTimeStamp')) {
+			$now = strftime('%c');
+			$script .= "
+ * This class was autogenerated by Propel on:
+ *
+ * $now
+ *";
+		}
+		$script .= "
+ * You should add additional method declarations to this interface to meet the
+ * application requirements.  This interface will only be generated as
+ * long as it does not already exist in the output directory.
+ *
+ * @package ".$this->getPackage()."
+ */	
+interface ".$this->getClassname()." {
+";
+	}
+	
+	/**
+	 * Specifies the methods that are added as part of the stub object class.
+	 * 
+	 * By default there are no methods for the empty stub classes; override this method
+	 * if you want to change that behavior.
+	 * 
+	 * @see ObjectBuilder::addClassBody()
+	 */
+	protected function addClassBody(&$script)
+	{
+		// there is no class body
+	}
+	
+	/**
+	 * Closes class.
+	 * @param string &$script The script will be modified in this method.
+	 */	
+	protected function addClassClose(&$script)
+	{
+		$script .= "
+} // " . $this->getClassname() . "
+";
+	}
+	
+} // PHP5ExtensionObjectBuilder


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5InterfaceBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5MapBuilderBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5MapBuilderBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5MapBuilderBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,300 @@
+<?php
+
+/*
+ *  $Id: PHP5BasicObjectBuilder.php 120 2005-06-17 02:18:41Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/om/OMBuilder.php';
+
+/**
+ * Generates the PHP5 map builder class for user object model (OM).
+ * 
+ * This class replaces the MapBuilder.tpl, with the intent of being easier for users
+ * to customize (through extending & overriding).
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.om.php5
+ */
+class PHP5MapBuilderBuilder extends OMBuilder {
+
+	/**
+	 * Gets the package for the map builder classes.
+	 * @return string
+	 */
+	public function getPackage()
+	{
+		return parent::getPackage() . '.map';
+	}
+	
+	/**
+	 * Returns the name of the current class being built.
+	 * @return string
+	 */
+	public function getClassname()
+	{
+		return $this->getTable()->getPhpName() . 'MapBuilder';
+	}
+
+	/**
+	 * Adds the include() statements for files that this class depends on or utilizes.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addIncludes(&$script)
+	{		
+		$script .= "		
+require_once 'propel/map/MapBuilder.php';
+include_once 'creole/CreoleTypes.php';
+";
+		
+		
+	} // addIncludes()
+	
+	/**
+	 * Adds class phpdoc comment and openning of class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addClassOpen(&$script)
+	{
+		$table = $this->getTable();		
+		$script .= "
+
+/**
+ * This class adds structure of '".$table->getName()."' table to '".$table->getDatabase()->getName()."' DatabaseMap object.
+ *
+ *";
+		if ($this->getBuildProperty('addTimeStamp')) {
+			$now = strftime('%c');
+			$script .= "
+ * This class was autogenerated by Propel on:
+ *
+ * $now
+ *";
+		}
+		$script .= "
+ *
+ * These statically-built map classes are used by Propel to do runtime db structure discovery.
+ * For example, the createSelectSql() method checks the type of a given column used in an 
+ * ORDER BY clause to know whether it needs to apply SQL to make the ORDER BY case-insensitive 
+ * (i.e. if it's a text column type).
+ *
+ * @package ".$this->getPackage()."
+ */	
+class ".$this->getClassname()." {
+";
+	}
+	
+	/**
+	 * Specifies the methods that are added as part of the map builder class.
+	 * This can be overridden by subclasses that wish to add more methods.
+	 * @see ObjectBuilder::addClassBody()
+	 */
+	protected function addClassBody(&$script)
+	{
+		$this->addConstants($script);
+		$this->addAttributes($script);
+		
+		$this->addIsBuilt($script);
+		$this->addGetDatabaseMap($script);
+		$this->addDoBuild($script);
+	}
+	
+	/**
+	 * Adds any constants needed for this MapBuilder class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addConstants(&$script)
+	{
+		$script .= "
+	/**
+	 * The (dot-path) name of this class
+	 */
+	const CLASS_NAME = '".$this->getClasspath()."';	
+";
+	}
+	
+	/**
+	 * Adds any attributes needed for this MapBuilder class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addAttributes(&$script)
+	{
+		$script .= "
+    /**
+     * The database map.
+     */
+    private \$dbMap;
+";
+	}
+	
+	/**
+	 * Closes class.
+	 * @param string &$script The script will be modified in this method.
+	 */	
+	protected function addClassClose(&$script)
+	{
+		$script .= "
+} // " . $this->getClassname() . "
+";
+	}
+	
+	/**
+	 * Adds the method that indicates whether this map has already been built.
+	 * @param string &$script The script will be modified in this method.
+	 */	
+	protected function addIsBuilt(&$script)
+	{
+		$script .= "
+	/**
+     * Tells us if this DatabaseMapBuilder is built so that we
+     * don't have to re-build it every time.
+     *
+     * @return boolean true if this DatabaseMapBuilder is built, false otherwise.
+     */
+    public function isBuilt()
+    {
+        return (\$this->dbMap !== null);
+    }
+";
+	}
+	
+	/**
+	 * Adds the DatabaseMap accessor method.
+	 * @param string &$script The script will be modified in this method.
+	 */	
+	protected function addGetDatabaseMap(&$script)
+	{
+		$script .= "
+	/**
+     * Gets the databasemap this map builder built.
+     *
+     * @return the databasemap
+     */
+    public function getDatabaseMap()
+    {
+        return \$this->dbMap;
+    }
+";
+	}
+	
+	/**
+	 * Adds the main doBuild() method to the map builder class.
+	 * @param string &$script The script will be modified in this method.
+	 */	
+	protected function addDoBuild(&$script)
+	{
+	
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+		
+		$script .= "
+    /**
+     * The doBuild() method builds the DatabaseMap
+     *
+	 * @return void
+     * @throws PropelException
+     */
+    public function doBuild()
+    {
+		\$this->dbMap = Propel::getDatabaseMap('".$table->getDatabase()->getName()."');
+		
+		\$tMap = \$this->dbMap->addTable('".$table->getName()."');
+		\$tMap->setPhpName('".$table->getPhpName()."');
+";
+		if ($table->getIdMethod() == "native") { 
+			$script .= "
+		\$tMap->setUseIdGenerator(true);
+";
+		} else { 
+			$script .= "
+		\$tMap->setUseIdGenerator(false);
+";
+		}
+
+		if ($table->getIdMethodParameters()) {
+			$params = $table->getIdMethodParameters();
+			$imp = $params[0];
+			$script .= "
+		\$tMap->setPrimaryKeyMethodInfo('".$imp->getValue()."');
+";
+		} elseif ($table->getIdMethod() == "native" && ($platform->getNativeIdMethod() == Platform::SEQUENCE)) {
+			$script .= " 
+		\$tMap->setPrimaryKeyMethodInfo('".$table->getSequenceName()."');
+";
+		} elseif ($table->getIdMethod() == "native" && ($platform->getNativeIdMethod() == Platform::SEQUENCE)) {
+			$script .= " 
+		\$tMap->setPrimaryKeyMethodInfo('".$table->getName()."');
+";
+		}
+		
+		// Add columns to map
+		foreach ($table->getColumns() as $col) {
+			$tfc=$table->getPhpName();
+			$cfc=$col->getPhpName();
+			$cup=strtoupper($col->getName());
+			if (!$col->getSize()) {
+				$size = "null";
+			} else {
+				$size = $col->getSize();
+			}
+			if($col->isPrimaryKey()) {
+				if($col->isForeignKey()) {
+					$script .= "
+		\$tMap->addForeignPrimaryKey('$cup', '$cfc', '".$col->getPhpType()."' , CreoleTypes::".$col->getType().", '".$col->getRelatedTableName()."', '".strtoupper($col->getRelatedColumnName())."', ".($col->isNotNull() ? 'true' : 'false').", ".$size.");
+";
+				} else {
+					$script .= "
+		\$tMap->addPrimaryKey('$cup', '$cfc', '".$col->getPhpType()."', CreoleTypes::".$col->getType().", ".var_export($col->isNotNull(), true).", ".$size.");
+";
+				} 
+			} else {
+				if($col->isForeignKey()) {
+					$script .= "
+		\$tMap->addForeignKey('$cup', '$cfc', '".$col->getPhpType()."', CreoleTypes::".$col->getType().", '".$col->getRelatedTableName()."', '".strtoupper($col->getRelatedColumnName())."', ".($col->isNotNull() ? 'true' : 'false').", ".$size.");
+";
+            } else { 
+					$script .= "
+		\$tMap->addColumn('$cup', '$cfc', '".$col->getPhpType()."', CreoleTypes::".$col->getType().", ".var_export($col->isNotNull(), true).");
+";
+				} 
+			} // if col-is prim key
+		} // foreach
+		
+		foreach($table->getValidators() as $val) {
+			$col = $val->getColumn();
+			$cup = strtoupper($col->getName());
+			foreach($val->getRules() as $rule) {
+				if ($val->getTranslate() !== Validator::TRANSLATE_NONE) {
+					$script .= "
+		\$tMap->addValidator('$cup', '".$rule->getName()."', '".$rule->getClass()."', '".$rule->getValue()."', ".$val->getTranslate()."('".str_replace("'", "\'", $rule->getMessage())."'));
+";
+				} else {
+					$script .= "
+		\$tMap->addValidator('$cup', '".$rule->getName()."', '".$rule->getClass()."', '".$rule->getValue()."', '".str_replace("'", "\'", $rule->getMessage())."');
+";
+				} // if ($rule->getTranslation() ...
+  			} // foreach rule
+		}  // foreach validator
+		
+		$script .= "				
+    } // doBuild()
+";
+
+	}
+	
+} // PHP5ExtensionPeerBuilder


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5MapBuilderBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5MultiExtendObjectBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5MultiExtendObjectBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5MultiExtendObjectBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,209 @@
+<?php
+
+/*
+ *  $Id: PHP5BasicObjectBuilder.php 120 2005-06-17 02:18:41Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/om/ObjectBuilder.php';
+
+/**
+ * Generates the empty PHP5 stub object class for use with inheritance in the user object model (OM).
+ * 
+ * This class produces the empty stub class that can be customized with application
+ * business logic, custom behavior, etc.
+ * 
+ * This class replaces the MultiExtendObject.tpl, with the intent of being easier for users
+ * to customize (through extending & overriding).
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.om.php5
+ */
+class PHP5MultiExtendObjectBuilder extends ObjectBuilder {
+	
+	/**
+	 * The current child "object" we are operating on.
+	 */
+	private $child;
+	
+	/**
+	 * Returns the name of the current class being built.
+	 * @return string
+	 */
+	public function getClassname()
+	{
+		return $this->getChild()->getClassName();
+	}
+	
+	/**
+	 * Override method to return child package, if specified.
+	 * @return string
+	 */
+	public function getPackage()
+	{
+		return ($this->child->getPackage() ? $this->child->getPackage() : parent::getPackage());
+	}
+	
+	/**
+	 * Set the child object that we're operating on currrently.
+	 * @param $child Inheritance
+	 */
+	public function setChild(Inheritance $child)
+	{
+		$this->child = $child;
+	}
+	
+	/**
+	 * Returns the child object we're operating on currently.
+	 * @return Inheritance
+	 * @throws BuildException - if child was not set.
+	 */
+	public function getChild()
+	{
+		if (!$this->child) {
+			throw new BuildException("The PHP5MultiExtendObjectBuilder needs to be told which child class to build (via setChild() method) before it can build the stub class.");
+		}
+		return $this->child;
+	}
+	
+	/**
+	 * Returns classpath to parent class.
+	 * @return string
+	 */
+	protected function getParentClasspath()
+	{
+		if ($this->getChild()->getAncestor()) {
+		    return $this->getChild()->getAncestor();
+		} else {
+			return $this->getObjectBuilder()->getClasspath();
+		}
+	}
+	
+	/**
+	 * Returns classname of parent class.
+	 * @return string
+	 */
+	protected function getParentClassname()
+	{
+		return ClassTools::classname($this->getParentClasspath());
+	}
+	
+	/**
+	 * Gets the file path to the parent class.
+	 * @return string
+	 */
+	protected function getParentClassFilePath()
+	{
+		return $this->getFilePath($this->getParentClasspath());
+	}
+	
+	/**
+	 * Adds the include() statements for files that this class depends on or utilizes.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addIncludes(&$script)
+	{
+		$script .= "
+require_once '".$this->getParentClassFilePath()."';
+";
+		$script .= "
+require_once '".$this->getObjectBuilder()->getClassFilePath()."';
+";
+	} // addIncludes()
+	
+	/**
+	 * Adds class phpdoc comment and openning of class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addClassOpen(&$script)
+	{
+		
+		$table = $this->getTable();
+		$tableName = $table->getName();
+		$tableDesc = $table->getDescription();
+		
+		$baseClassname = $this->getObjectBuilder()->getClassname();
+		
+		$script .= "
+
+/**
+ * Skeleton subclass for representing a row from one of the subclasses of the '$tableName' table.
+ *
+ * $tableDesc
+ *";
+		if ($this->getBuildProperty('addTimeStamp')) {
+			$now = strftime('%c');
+			$script .= "
+ * This class was autogenerated by Propel on:
+ *
+ * $now
+ *";
+		}
+		$script .= "
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ *
+ * @package ".$this->getPackage()."
+ */	
+class ".$this->getClassname()." extends ".$this->getParentClassname()." {
+";
+	}
+	
+	/**
+	 * Specifies the methods that are added as part of the stub object class.
+	 * 
+	 * By default there are no methods for the empty stub classes; override this method
+	 * if you want to change that behavior.
+	 * 
+	 * @see ObjectBuilder::addClassBody()
+	 */
+	protected function addClassBody(&$script)
+	{
+		$child = $this->getChild();
+        $col = $child->getColumn();
+        $cfc = $col->getPhpName();
+		
+		$const = "CLASSKEY_".strtoupper($child->getKey());
+		
+		$script .= "
+	/**
+	 * Constructs a new ".$this->getChild()->getClassName()." class, setting the ".$col->getName()." column to ".$this->getPeerClassname()."::$const.
+	 */
+	public function __construct()
+	{
+";
+		
+		$script .= "
+        \$this->set$cfc(".$this->getPeerClassname()."::CLASSKEY_".strtoupper($child->getKey()).");
+    }
+";
+	}
+	
+	/**
+	 * Closes class.
+	 * @param string &$script The script will be modified in this method.
+	 */	
+	protected function addClassClose(&$script)
+	{
+		$script .= "
+} // " . $this->getClassname() . "
+";
+	}
+	
+} // PHP5ExtensionObjectBuilder


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5MultiExtendObjectBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodeBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodeBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodeBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1115 @@
+<?php
+
+/*
+ *  $Id: PHP5BasicObjectBuilder.php 157 2005-08-10 19:16:22Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/om/ObjectBuilder.php';
+
+/**
+ * Generates a PHP5 tree node Object class for user object model (OM).
+ * 
+ * This class produces the base tree node object class (e.g. BaseMyTable) which contains all
+ * the custom-built accessor and setter methods.
+ * 
+ * This class replaces the Node.tpl, with the intent of being easier for users
+ * to customize (through extending & overriding).
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.om.php5
+ */
+class PHP5NodeBuilder extends ObjectBuilder {		
+	
+	/**
+	 * Gets the package for the [base] object classes.
+	 * @return string
+	 */
+	public function getPackage()
+	{
+		return parent::getPackage() . ".om";
+	}
+	
+	/**
+	 * Returns the name of the current class being built.
+	 * @return string
+	 */
+	public function getClassname()
+	{
+		return $this->getBuildProperty('basePrefix') . $this->getStubNodeBuilder()->getClassname();
+	}
+	
+	/**
+	 * Adds the include() statements for files that this class depends on or utilizes.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addIncludes(&$script)
+	{
+		$script .= "
+require_once '".$this->getStubNodePeerBuilder()->getClassFilePath()."';
+";
+	} // addIncludes()
+	
+	/**
+	 * Adds class phpdoc comment and openning of class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addClassOpen(&$script)
+	{
+		
+		$table = $this->getTable();
+		$tableName = $table->getName();
+		$tableDesc = $table->getDescription();
+		
+		$script .= "
+/**
+ * Base class that represents a row from the '$tableName' table.
+ *
+ * $tableDesc
+ *";
+		if ($this->getBuildProperty('addTimeStamp')) {
+			$now = strftime('%c');
+			$script .= "
+ * This class was autogenerated by Propel on:
+ *
+ * $now
+ *";
+		}
+		$script .= "
+ * @package ".$this->getPackage()."
+ */	
+abstract class ".$this->getClassname()." implements IteratorAggregate {
+";
+	}
+	
+	/**
+	 * Specifies the methods that are added as part of the basic OM class.
+	 * This can be overridden by subclasses that wish to add more methods.
+	 * @see ObjectBuilder::addClassBody()
+	 */
+	protected function addClassBody(&$script)
+	{
+		$table = $this->getTable();
+		
+		$this->addAttributes($script);
+				
+		$this->addConstructor($script);
+		
+		$this->addCallOverload($script);
+		$this->addSetIteratorOptions($script);
+		$this->addGetIterator($script);
+		
+		$this->addGetNodeObj($script);
+		$this->addGetNodePath($script);
+		$this->addGetNodeIndex($script);
+		$this->addGetNodeLevel($script);
+		
+		$this->addHasChildNode($script);
+		$this->addGetChildNodeAt($script);
+		$this->addGetFirstChildNode($script);
+		$this->addGetLastChildNode($script);
+		$this->addGetSiblingNode($script);
+		
+		$this->addGetParentNode($script);
+		$this->addGetAncestors($script);
+		$this->addIsRootNode($script);
+		
+		$this->addSetNew($script);
+		$this->addSetDeleted($script);
+		$this->addAddChildNode($script);
+		$this->addMoveChildNode($script);
+		$this->addSave($script);
+		
+		$this->addDelete($script);
+		$this->addEquals($script);
+		
+		$this->addAttachParentNode($script);
+		$this->addAttachChildNode($script);
+		$this->addDetachParentNode($script);
+		$this->addDetachChildNode($script);
+		$this->addShiftChildNodes($script);
+		$this->addInsertNewChildNode($script);
+		
+		$this->addAdjustStatus($script);
+		$this->addAdjustNodePath($script);
+		
+	}
+	
+	/**
+	 * Closes class.
+	 * @param string &$script The script will be modified in this method.
+	 */	
+	protected function addClassClose(&$script)
+	{
+		$script .= "
+} // " . $this->getClassname() . "
+";
+	}
+	
+	
+	/**
+	 * Adds class attributes.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addAttributes(&$script)
+	{
+		$script .= "
+	/**
+	 * @var ".$this->getStubObjectBuilder()->getClassname()." object wrapped by this node.
+	 */
+	protected \$obj = null;
+	
+	/**
+	 * The parent node for this node.
+	 * @var ".$this->getStubNodeBuilder()->getClassname()."
+	 */
+	protected \$parentNode = null;
+
+	/**
+	 * Array of child nodes for this node. Nodes indexes are one-based.
+	 * @var array
+	 */
+	protected \$childNodes = array();
+";	
+	}
+	
+	/**
+	 * Adds the constructor.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addConstructor(&$script)
+	{
+		$script .= "
+	/**
+	 * Constructor.
+	 *
+	 * @param ".$this->getStubObjectBuilder()->getClassname()." \$obj Object wrapped by this node.
+	 */
+	public function __construct(\$obj = null) 
+	{
+		if (\$obj !== null) {
+			\$this->obj = \$obj;
+		} else {
+			\$setNodePath = 'set' . ".$this->getStubNodePeerBuilder()->getClassname()."::NPATH_PHPNAME;
+			\$this->obj = new ".$this->getStubObjectBuilder()->getClassname()."();
+			\$this->obj->\$setNodePath('0');
+		}
+	}
+";
+	}
+
+	
+	
+	protected function addCallOverload(&$script)
+	{
+		$script .= "
+	/**
+	 * Convenience overload for wrapped object methods.
+	 *
+	 * @param string Method name to call on wrapped object.
+	 * @param mixed Parameter accepted by wrapped object set method.
+	 * @return mixed Return value of wrapped object method.
+	 * @throws PropelException Fails if method is not defined for wrapped object.
+	 */
+	public function __call(\$name, \$parms)
+	{
+		if (method_exists(\$this->obj, \$name))
+			return call_user_func_array(array(\$this->obj, \$name), \$parms);
+		else
+			throw new PropelException('get method not defined: \$name');
+	}
+";
+	}
+	
+	protected function addSetIteratorOptions(&$script)
+	{
+		$script .= "
+	
+	/**
+	 * Sets the default options for iterators created from this object.
+	 * The options are specified in map format. The following options 
+	 * are supported by all iterators. Some iterators may support other
+	 * options:
+	 *
+	 *   \"querydb\" - True if nodes should be retrieved from database.
+	 *   \"con\" - Connection to use if retrieving from database.
+	 *
+	 * @param string Type of iterator to use (\"pre\", \"post\", \"level\").
+	 * @param array Map of option name => value.
+	 * @return void
+	 * @todo Implement other iterator types (i.e. post-order, level, etc.)
+	 */ 
+	public function setIteratorOptions(\$type, \$opts)
+	{
+		\$this->itType = \$type;
+		\$this->itOpts = \$opts;
+	}
+";
+	}
+	
+	protected function addGetIterator(&$script)
+	{
+		$script .= "
+	/**
+	 * Returns a pre-order iterator for this node and its children.
+	 *
+	 * @param string Type of iterator to use (\"pre\", \"post\", \"level\")
+	 * @param array Map of option name => value.
+	 * @return NodeIterator
+	 */
+	public function getIterator(\$type = null, \$opts = null)
+	{
+		if (\$type === null)
+			\$type = (isset(\$this->itType) ? \$this->itType : 'Pre');
+				
+		if (\$opts === null)
+			\$opts = (isset(\$this->itOpts) ? \$this->itOpts : array());
+			
+		\$itclass = ucfirst(strtolower(\$type)) . 'OrderNodeIterator';
+		
+		require_once('propel/om/' . \$itclass . '.php');
+		return new \$itclass(\$this, \$opts);
+	}
+";
+	}
+	
+	protected function addGetNodeObj(&$script)
+	{
+		$script .= "
+	/**
+	 * Returns the object wrapped by this class.
+	 * @return ".$this->getStubObjectBuilder()->getClassname()."
+	 */
+	public function getNodeObj()
+	{
+		return \$this->obj;
+	}
+";
+	}
+	
+	protected function addGetNodePath(&$script)
+	{
+		$script .= "
+	/**
+	 * Convenience method for retrieving nodepath.
+	 * @return string
+	 */
+	public function getNodePath()
+	{
+		\$getNodePath = 'get' . ".$this->getStubNodePeerBuilder()->getClassname()."::NPATH_PHPNAME;
+		return \$this->obj->\$getNodePath();
+	}
+";
+	}
+
+	protected function addGetNodeIndex(&$script)
+	{
+		$script .= "
+	/**
+	 * Returns one-based node index among siblings.
+	 * @return int
+	 */
+	public function getNodeIndex()
+	{
+		\$npath =& \$this->getNodePath();
+		\$sep = strrpos(\$npath, ".$this->getStubNodePeerBuilder()->getClassname()."::NPATH_SEP);
+		return (int) (\$sep !== false ? substr(\$npath, \$sep+1) : \$npath);
+	}
+";
+	}
+	
+	protected function addGetNodeLevel(&$script)
+	{
+		$script .= "
+	/**
+	 * Returns one-based node level within tree (root node is level 1).
+	 * @return int
+	 */
+	public function getNodeLevel()
+	{
+		return (substr_count(\$this->getNodePath(), ".$this->getStubNodePeerBuilder()->getClassname()."::NPATH_SEP) + 1);
+	}
+";
+	}
+	
+	protected function addHasChildNode(&$script)
+	{
+		$script .= "
+	/** 
+	 * Returns true if specified node is a child of this node. If recurse is
+	 * true, checks if specified node is a descendant of this node.
+	 *
+	 * @param ".$this->getStubNodeBuilder()->getClassname()." Node to look for.
+	 * @param boolean True if strict comparison should be used.
+	 * @param boolean True if all descendants should be checked.
+	 * @return boolean
+	 */
+	public function hasChildNode(\$node, \$strict = false, \$recurse = false)
+	{
+		foreach (\$this->childNodes as \$childNode)
+		{
+			if (\$childNode->equals(\$node, \$strict))
+				return true;
+				
+			if (\$recurse && \$childNode->hasChildNode(\$node, \$recurse))
+				return true;
+		}
+		
+		return false;
+	}
+";
+	}
+	
+	protected function addGetChildNodeAt(&$script)
+	{
+		$script .= "
+	/**
+	 * Returns child node at one-based index. Retrieves from database if not 
+	 * loaded yet.
+	 *
+	 * @param int One-based child node index.
+	 * @param boolean True if child should be retrieved from database.
+	 * @param Connection Connection to use if retrieving from database.
+	 * @return ".$this->getStubNodeBuilder()->getClassname()."
+	 */
+	public function getChildNodeAt(\$i, \$querydb = false, \$con = null)
+	{
+		if (\$querydb && 
+			!\$this->obj->isNew() && 
+			!\$this->obj->isDeleted() && 
+			!isset(\$this->childNodes[\$i]))
+		{
+			\$criteria = new Criteria(".$this->getStubPeerBuilder()->getClassname()."::DATABASE_NAME);
+			\$criteria->add(".$this->getStubNodePeerBuilder()->getClassname()."::NPATH_COLNAME, \$this->getNodePath() . ".$this->getStubNodePeerBuilder()->getClassname()."::NPATH_SEP . \$i, Criteria::EQUAL);
+
+			if (\$childObj = ".$this->getStubPeerBuilder()->getClassname()."::doSelectOne(\$criteria, \$con))
+				\$this->attachChildNode(new ".$this->getStubNodeBuilder()->getClassname()."(\$childObj));
+		}
+
+		return (isset(\$this->childNodes[\$i]) ? \$this->childNodes[\$i] : null);
+	}
+";
+	}
+	
+	protected function addGetFirstChildNode(&$script)
+	{
+		$script .= "
+	/**
+	 * Returns first child node (if any). Retrieves from database if not loaded yet.
+	 *
+	 * @param boolean True if child should be retrieved from database.
+	 * @param Connection Connection to use if retrieving from database.
+	 * @return ".$this->getStubNodeBuilder()->getClassname()."
+	 */
+	public function getFirstChildNode(\$querydb = false, \$con = null)
+	{
+		return \$this->getChildNodeAt(1, \$querydb, \$con);
+	}
+";
+	}
+	
+	protected function addGetLastChildNode(&$script)
+	{
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		
+		$script .= "
+	/**
+	 * Returns last child node (if any). 
+	 *
+	 * @param boolean True if child should be retrieved from database.
+	 * @param Connection Connection to use if retrieving from database.
+	 */
+	public function getLastChildNode(\$querydb = false, \$con = null)
+	{
+		\$lastNode = null;
+
+		if (\$this->obj->isNew() || \$this->obj->isDeleted())
+		{
+			end(\$this->childNodes);
+			\$lastNode = (count(\$this->childNodes) ? current(\$this->childNodes) : null);
+		}
+		else if (\$querydb)
+		{
+			\$db = Propel::getDb($peerClassname::DATABASE_NAME);
+			\$criteria = new Criteria($peerClassname::DATABASE_NAME);
+			\$criteria->add($nodePeerClassname::NPATH_COLNAME, \$this->getNodePath() . $nodePeerClassname::NPATH_SEP . '%', Criteria::LIKE);
+			\$criteria->addAnd($nodePeerClassname::NPATH_COLNAME, \$this->getNodePath() . $nodePeerClassname::NPATH_SEP . '%' . $nodePeerClassname::NPATH_SEP . '%', Criteria::NOT_LIKE);
+			\$criteria->addAsColumn('npathlen', \$db->strLength($nodePeerClassname::NPATH_COLNAME));
+			\$criteria->addDescendingOrderByColumn('npathlen');
+			\$criteria->addDescendingOrderByColumn($nodePeerClassname::NPATH_COLNAME);
+		  
+			\$lastObj = $peerClassname::doSelectOne(\$criteria, \$con);
+			
+			if (\$lastObj !== null)
+			{
+				\$lastNode = new ".$this->getStubNodeBuilder()->getClassname()."(\$lastObj);
+				
+				end(\$this->childNodes);
+				\$endNode = (count(\$this->childNodes) ? current(\$this->childNodes) : null);
+				
+				if (\$endNode)
+				{
+					if (\$endNode->getNodePath() > \$lastNode->getNodePath())
+						throw new PropelException('Cached child node inconsistent with database.');
+					else if (\$endNode->getNodePath() == \$lastNode->getNodePath())
+						\$lastNode = \$endNode;
+					else
+						\$this->attachChildNode(\$lastNode);
+				}
+				else
+				{
+					\$this->attachChildNode(\$lastNode);
+				}
+			}
+		}
+
+		return \$lastNode;
+	}
+";
+	}
+	
+	protected function addGetSiblingNode(&$script)
+	{
+		$script .= "	
+	/**
+	 * Returns next (or previous) sibling node or null. Retrieves from database if 
+	 * not loaded yet.
+	 *
+	 * @param boolean True if previous sibling should be returned.
+	 * @param boolean True if sibling should be retrieved from database.
+	 * @param Connection Connection to use if retrieving from database.
+	 * @return ".$this->getStubNodeBuilder()->getClassname()."
+	 */
+	public function getSiblingNode(\$prev = false, \$querydb = false, \$con = null)
+	{
+		\$nidx = \$this->getNodeIndex();
+		
+		if (\$this->isRootNode())
+		{
+			return null;
+		}
+		else if (\$prev)
+		{
+			if (\$nidx > 1 && (\$parentNode = \$this->getParentNode(\$querydb, \$con)))
+				return \$parentNode->getChildNodeAt(\$nidx-1, \$querydb, \$con);
+			else
+				return null;
+		}
+		else
+		{
+			if (\$parentNode = \$this->getParentNode(\$querydb, \$con))
+				return \$parentNode->getChildNodeAt(\$nidx+1, \$querydb, \$con);
+			else
+				return null;
+		}
+	}
+";
+	}
+
+	protected function addGetParentNode(&$script)
+	{
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+
+		$script .= "
+	/**
+	 * Returns parent node. Loads from database if not cached yet.
+	 *
+	 * @param boolean True if parent should be retrieved from database.
+	 * @param Connection Connection to use if retrieving from database.
+	 * @return ".$this->getStubNodeBuilder()->getClassname()."
+	 */
+	public function getParentNode(\$querydb = true, \$con = null)
+	{
+		if (\$querydb &&
+			\$this->parentNode === null && 
+			!\$this->isRootNode() &&
+			!\$this->obj->isNew() && 
+			!\$this->obj->isDeleted())
+		{
+			\$npath =& \$this->getNodePath();
+			\$sep = strrpos(\$npath, $nodePeerClassname::NPATH_SEP);
+			\$ppath = substr(\$npath, 0, \$sep);
+			
+			\$criteria = new Criteria($peerClassname::DATABASE_NAME);
+			\$criteria->add($nodePeerClassname::NPATH_COLNAME, \$ppath, Criteria::EQUAL);
+			
+			if (\$parentObj = $peerClassname::doSelectOne(\$criteria, \$con))
+			{
+				\$parentNode = new ".$this->getStubNodeBuilder()->getClassname()."(\$parentObj);
+				\$parentNode->attachChildNode(\$this);
+			}
+		}
+		
+		return \$this->parentNode;
+	}
+";
+	}
+	
+	protected function addGetAncestors(&$script)
+	{
+		$script .= "
+	/** 
+	 * Returns an array of all ancestor nodes, starting with the root node 
+	 * first.
+	 *
+	 * @param boolean True if ancestors should be retrieved from database.
+	 * @param Connection Connection to use if retrieving from database.
+	 * @return array
+	 */
+	public function getAncestors(\$querydb = false, \$con = null)
+	{
+		\$ancestors = array();
+		\$parentNode = \$this;
+		
+		while (\$parentNode = \$parentNode->getParentNode(\$querydb, \$con))
+			array_unshift(\$ancestors, \$parentNode);
+		
+		return \$ancestors;
+	}
+";
+	}
+	
+	protected function addIsRootNode(&$script)
+	{
+		$script .= "
+	/**
+	 * Returns true if node is the root node of the tree.
+	 * @return boolean
+	 */
+	public function isRootNode()
+	{
+		return (\$this->getNodePath() === '1');
+	}
+";
+	}
+
+	protected function addSetNew(&$script)
+	{
+		$script .= "
+	/**
+	 * Changes the state of the object and its descendants to 'new'.
+	 * Also changes the node path to '0' to indicate that it is not a 
+	 * stored node.
+	 *
+	 * @param boolean
+	 * @return void
+	 */
+	public function setNew(\$b)
+	{
+		\$this->adjustStatus('new', \$b);
+		\$this->adjustNodePath(\$this->getNodePath(), '0');
+	}
+";
+	}
+
+	protected function addSetDeleted(&$script)
+	{
+		$script .= "	
+	/**
+	 * Changes the state of the object and its descendants to 'deleted'.
+	 *
+	 * @param boolean
+	 * @return void
+	 */
+	public function setDeleted(\$b)
+	{
+		\$this->adjustStatus('deleted', \$b);
+	}
+";
+	}
+	
+	protected function addAddChildNode(&$script)
+	{
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		
+		$script .= "
+	/**
+	 * Adds the specified node (and its children) as a child to this node. If a
+	 * valid \$beforeNode is specified, the node will be inserted in front of 
+	 * \$beforeNode. If \$beforeNode is not specified the node will be appended to
+	 * the end of the child nodes.
+	 *
+	 * @param ".$this->getStubNodeBuilder()->getClassname()." Node to add.
+	 * @param ".$this->getStubNodeBuilder()->getClassname()." Node to insert before.
+	 * @param Connection Connection to use.
+	 */
+	public function addChildNode(\$node, \$beforeNode = null, \$con = null)
+	{
+		if (\$this->obj->isNew() && !\$node->obj->isNew())
+			throw new PropelException('Cannot add stored nodes to a new node.');
+			
+		if (\$this->obj->isDeleted() || \$node->obj->isDeleted())
+			throw new PropelException('Cannot add children in a deleted state.');
+		
+		if (\$this->hasChildNode(\$node))
+			throw new PropelException('Node is already a child of this node.');
+
+		if (\$beforeNode && !\$this->hasChildNode(\$beforeNode))
+			throw new PropelException('Invalid beforeNode.');
+			
+		if (\$con === null)
+			\$con = Propel::getConnection($peerClassname::DATABASE_NAME);
+			
+		try {
+				
+			if (!\$this->obj->isNew()) \$con->begin();
+				
+			if (\$beforeNode)
+			{
+				// Inserting before a node.
+				\$childIdx = \$beforeNode->getNodeIndex();
+				\$this->shiftChildNodes(1, \$beforeNode->getNodeIndex(), \$con);
+			}
+			else
+			{
+				// Appending child node.
+				if (\$lastNode = \$this->getLastChildNode(true, \$con))
+					\$childIdx = \$lastNode->getNodeIndex()+1;
+				else
+					\$childIdx = 1;
+			}
+
+			// Add the child (and its children) at the specified index.
+
+			if (!\$this->obj->isNew() && \$node->obj->isNew())
+			{
+				\$this->insertNewChildNode(\$node, \$childIdx, \$con);
+			}
+			else
+			{
+				// \$this->isNew() && \$node->isNew() ||
+				// !\$this->isNew() && !node->isNew()
+				
+				\$srcPath = \$node->getNodePath();
+				\$dstPath = \$this->getNodePath() . $nodePeerClassname::NPATH_SEP . \$childIdx;
+				
+				if (!\$node->obj->isNew())
+				{
+					$nodePeerClassname::moveNodeSubTree(\$srcPath, \$dstPath, \$con);
+					\$parentNode = \$node->getParentNode(true, \$con);
+				}
+				else
+				{
+					\$parentNode = \$node->getParentNode();
+				}
+				
+				if (\$parentNode)
+				{
+					\$parentNode->detachChildNode(\$node);
+					\$parentNode->shiftChildNodes(-1, \$node->getNodeIndex()+1, \$con);
+				}
+			
+				\$node->adjustNodePath(\$srcPath, \$dstPath);
+			}
+
+			if (!\$this->obj->isNew()) \$con->commit();
+
+			\$this->attachChildNode(\$node);
+
+		} catch (SQLException \$e) {
+			if (!\$this->obj->isNew()) \$con->rollback();
+			throw new PropelException(\$e);
+		}
+	}
+";
+	}
+	
+	protected function addMoveChildNode(&$script)
+	{
+		$script .= "
+	/**
+	 * Moves the specified child node in the specified direction.
+	 *
+	 * @param ".$this->getStubNodeBuilder()->getClassname()." Node to move.
+	 * @param int Number of spaces to move among siblings (may be negative).
+	 * @param Connection Connection to use.
+	 * @throws PropelException
+	 */
+	public function moveChildNode(\$node, \$direction, \$con = null)
+	{
+		throw new PropelException('moveChildNode() not implemented yet.');
+	}
+";
+	}
+	
+	
+	protected function addSave(&$script)
+	{
+
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		$script .= "
+	/**
+	 * Saves modified object data to the datastore.
+	 *
+	 * @param boolean If true, descendants will be saved as well.
+	 * @param Connection Connection to use.
+	 */
+	public function save(\$recurse = false, \$con = null)
+	{
+		if (\$this->obj->isDeleted())
+			throw new PropelException('Cannot save deleted node.');
+			
+		if (substr(\$this->getNodePath(), 0, 1) == '0')
+			throw new PropelException('Cannot save unattached node.');
+
+		if (\$this->obj->isColumnModified($nodePeerClassname::NPATH_COLNAME))
+			throw new PropelException('Cannot save manually modified node path.');
+		
+		\$this->obj->save(\$con);
+		
+		if (\$recurse)
+		{
+			foreach (\$this->childNodes as \$childNode)
+				\$childNode->save(\$recurse, \$con);
+		}
+	}
+";
+	}
+	
+	
+	protected function addDelete(&$script)
+	{
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		$script .= "
+	/**
+	 * Removes this object and all descendants from datastore.
+	 *
+	 * @param Connection Connection to use.
+	 * @return void
+	 * @throws PropelException
+	 */
+	public function delete(\$con = null)
+	{
+		if (\$this->obj->isDeleted())
+			throw new PropelException('This node has already been deleted.');
+
+		if (!\$this->obj->isNew())
+		{
+			$nodePeerClassname::deleteNodeSubTree(\$this->getNodePath(), \$con);
+		}
+		
+		if (\$parentNode = \$this->getParentNode(true, \$con))
+		{
+			\$parentNode->detachChildNode(\$this);
+			\$parentNode->shiftChildNodes(-1, \$this->getNodeIndex()+1, \$con);
+		}
+		
+		\$this->setDeleted(true);
+	}
+";
+	}
+
+	protected function addEquals(&$script)
+	{
+		$nodeClassname = $this->getStubNodeBuilder()->getClassname();
+		$script .= "
+	/**
+	 * Compares the object wrapped by this node with that of another node. Use 
+	 * this instead of equality operators to prevent recursive dependency 
+	 * errors.
+	 *
+	 * @param $nodeClassname Node to compare.
+	 * @param boolean True if strict comparison should be used.
+	 * @return boolean
+	 */
+	public function equals(\$node, \$strict = false)
+	{
+		if (\$strict) {
+			return (\$this->obj === \$node->obj);
+		} else {
+			return (\$this->obj == \$node->obj);
+		}
+	}
+";
+	}
+	
+	protected function addAttachParentNode(&$script)
+	{
+		$nodeClassname = $this->getStubNodeBuilder()->getClassname();
+		$script .= "
+	/**
+	 * This method is used internally when constructing the tree structure 
+	 * from the database. To set the parent of a node, you should call 
+	 * addChildNode() on the parent.
+	 *
+	 * @param $nodeClassname Parent node to attach.
+	 * @return void
+	 * @throws PropelException
+	 */
+	public function attachParentNode(\$node)
+	{
+		if (!\$node->hasChildNode(\$this, true)) 
+			throw new PropelException('Failed to attach parent node for non-child.');
+
+		\$this->parentNode = \$node;
+	}
+";
+	}
+	
+	
+	protected function addAttachChildNode(&$script)
+	{
+		$nodeClassname = $this->getStubNodeBuilder()->getClassname();
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		$script .= "
+	/**
+	 * This method is used internally when constructing the tree structure 
+	 * from the database. To add a child to a node you should call the 
+	 * addChildNode() method instead. 
+	 *
+	 * @param $nodeClassname Child node to attach.
+	 * @return void
+	 * @throws PropelException
+	 */
+	public function attachChildNode(\$node)
+	{
+		if (\$this->hasChildNode(\$node))
+			throw new PropelException('Failed to attach child node. Node already exists.');
+		
+		if (\$this->obj->isDeleted() || \$node->obj->isDeleted())
+			throw new PropelException('Failed to attach node in deleted state.');
+			
+		if (\$this->obj->isNew() && !\$node->obj->isNew())
+			throw new PropelException('Failed to attach non-new child to new node.');
+
+		if (!\$this->obj->isNew() && \$node->obj->isNew())
+			throw new PropelException('Failed to attach new child to non-new node.');
+
+		if (\$this->getNodePath() . $nodePeerClassname::NPATH_SEP . \$node->getNodeIndex() != \$node->getNodePath())
+			throw new PropelException('Failed to attach child node. Node path mismatch.');
+		
+		\$this->childNodes[\$node->getNodeIndex()] = \$node;
+		ksort(\$this->childNodes);
+		
+		\$node->attachParentNode(\$this);
+	}
+";
+	}
+	
+	protected function addDetachParentNode(&$script)
+	{
+		$nodeClassname = $this->getStubNodeBuilder()->getClassname();
+		$script .= "
+	/**
+	 * This method is used internally when deleting nodes. It is used to break
+	 * the link to this node's parent.
+	 * @param $nodeClassname Parent node to detach from.
+	 * @return void
+	 * @throws PropelException
+	 */
+	public function detachParentNode(\$node)
+	{
+		if (!\$node->hasChildNode(\$this, true))
+			throw new PropelException('Failed to detach parent node from non-child.');
+
+		unset(\$node->childNodes[\$this->getNodeIndex()]);
+		\$this->parentNode = null;
+	}
+";
+	}
+	
+	protected function addDetachChildNode(&$script)
+	{
+		$script .= "
+	/**
+	 * This method is used internally when deleting nodes. It is used to break
+	 * the link to this between this node and the specified child.
+	 * @param ".$this->getStubNodeBuilder()->getClassname()." Child node to detach.
+	 * @return void
+	 * @throws PropelException
+	 */
+	public function detachChildNode(\$node)
+	{
+		if (!\$this->hasChildNode(\$node, true))
+			throw new PropelException('Failed to detach non-existent child node.');
+		
+		unset(\$this->childNodes[\$node->getNodeIndex()]);
+		\$node->parentNode = null;
+	}
+";
+	}
+	
+	protected function addShiftChildNodes(&$script)
+	{
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		
+		$script .= "
+	/**
+	 * Shifts child nodes in the specified direction and offset index. This 
+	 * method assumes that there is already space available in the 
+	 * direction/offset indicated. 
+	 *
+	 * @param int Direction/# spaces to shift. 1=leftshift, 1=rightshift
+	 * @param int Node index to start shift at.
+	 * @param Connection The connection to be used.
+	 * @return void
+	 * @throws PropelException
+	 */
+	protected function shiftChildNodes(\$direction, \$offsetIdx, \$con)
+	{
+		if (\$this->obj->isDeleted())
+			throw new PropelException('Cannot shift nodes for deleted object');
+					
+		\$lastNode = \$this->getLastChildNode(true, \$con);
+		\$lastIdx = (\$lastNode !== null ? \$lastNode->getNodeIndex() : 0);
+
+		if (\$lastNode === null || \$offsetIdx > \$lastIdx)
+			return;
+
+		if (\$con === null)
+			\$con = Propel::getConnection($peerClassname::DATABASE_NAME);
+			
+		if (!\$this->obj->isNew())
+		{
+			// Shift nodes in database.
+			
+			try {
+				
+				\$con->begin();
+				 
+				\$n = \$lastIdx - \$offsetIdx + 1;
+				\$i = \$direction < 1 ? \$offsetIdx : \$lastIdx;
+				
+				while (\$n--)
+				{
+					\$srcPath = \$this->getNodePath() . $nodePeerClassname::NPATH_SEP . \$i;			  // 1.2.2
+					\$dstPath = \$this->getNodePath() . $nodePeerClassname::NPATH_SEP . (\$i+\$direction); // 1.2.3
+
+					$nodePeerClassname::moveNodeSubTree(\$srcPath, \$dstPath, \$con);
+					
+					\$i -= \$direction;
+				}
+				
+				\$con->commit();
+				
+			} catch (SQLException \$e) {
+				\$con->rollback();
+				throw new PropelException(\$e);
+			}
+		}
+		
+		// Shift the in-memory objects.
+		
+		\$n = \$lastIdx - \$offsetIdx + 1;
+		\$i = \$direction < 1 ? \$offsetIdx : \$lastIdx;
+
+		while (\$n--)
+		{
+			if (isset(\$this->childNodes[\$i]))
+			{
+				\$srcPath = \$this->getNodePath() . $nodePeerClassname::NPATH_SEP . \$i;			  // 1.2.2
+				\$dstPath = \$this->getNodePath() . $nodePeerClassname::NPATH_SEP . (\$i+\$direction); // 1.2.3
+				
+				\$this->childNodes[\$i+\$direction] = \$this->childNodes[\$i];
+				\$this->childNodes[\$i+\$direction]->adjustNodePath(\$srcPath, \$dstPath);
+
+				unset(\$this->childNodes[\$i]);
+			}
+			
+			\$i -= \$direction;
+		}
+		
+		ksort(\$this->childNodes);
+	}
+";
+	}
+	
+	protected function addInsertNewChildNode(&$script)
+	{
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		$nodeClassname = $this->getStubNodePeerBuilder()->getClassname();
+		
+		$script .= "
+	/**
+	 * Inserts the node and its children at the specified childIdx.
+	 *
+	 * @param $nodeClassname Node to insert.
+	 * @param int One-based child index to insert at.
+	 * @param Connection Connection to use.
+	 * @param void
+	 */
+	protected function insertNewChildNode(\$node, \$childIdx, \$con)
+	{
+		if (!\$node->obj->isNew())
+			throw new PropelException('Failed to insert non-new node.');
+
+		\$setNodePath = 'set' . $nodePeerClassname::NPATH_PHPNAME;
+
+		\$node->obj->\$setNodePath(\$this->getNodePath() . $nodePeerClassname::NPATH_SEP . \$childIdx);
+		\$node->obj->save(\$con);
+		
+		\$i = 1;
+		foreach (\$node->childNodes as \$childNode)
+			\$node->insertNewChildNode(\$childNode, \$i++, \$con);		
+	}
+";
+	}
+	
+	protected function addAdjustStatus(&$script)
+	{		
+		$script .= "
+	/**
+	 * Adjust new/deleted status of node and all children. 
+	 *
+	 * @param string Status to change ('New' or 'Deleted')
+	 * @param boolean Value for status.
+	 * @return void
+	 */
+	protected function adjustStatus(\$status, \$b)
+	{
+		\$setStatus = 'set' . \$status;
+		
+		\$this->obj->\$setStatus(\$b);
+		
+		foreach (\$this->childNodes as \$childNode)
+			\$childNode->obj->\$setStatus(\$b);			
+	}
+";
+	}
+	
+	protected function addAdjustNodePath(&$script)
+	{
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		$script .= "
+	/**
+	 * Adjust path of node and all children. This is used internally when 
+	 * inserting/moving nodes.
+	 *
+	 * @param string Section of old path to change.
+	 * @param string New section to replace old path with.
+	 * @return void
+	 */
+	protected function adjustNodePath(\$oldBasePath, \$newBasePath)
+	{
+		\$setNodePath = 'set' . $nodePeerClassname::NPATH_PHPNAME;
+		
+		\$this->obj->\$setNodePath(\$newBasePath .  substr(\$this->getNodePath(), strlen(\$oldBasePath)));
+		\$this->obj->resetModified($nodePeerClassname::NPATH_COLNAME);
+
+		foreach (\$this->childNodes as \$childNode)
+			\$childNode->adjustNodePath(\$oldBasePath, \$newBasePath);
+	}
+";
+	}
+	
+} // PHP5NodeObjectBuilder


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodeBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodePeerBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodePeerBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodePeerBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,774 @@
+<?php
+
+/*
+ *  $Id: PHP5BasicObjectBuilder.php 157 2005-08-10 19:16:22Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/om/PeerBuilder.php';
+
+/**
+ * Generates a PHP5 tree node Peer class for user object model (OM).
+ * 
+ * This class produces the base tree node object class (e.g. BaseMyTable) which contains all
+ * the custom-built accessor and setter methods.
+ * 
+ * This class replaces the Node.tpl, with the intent of being easier for users
+ * to customize (through extending & overriding).
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.om.php5
+ */
+class PHP5NodePeerBuilder extends PeerBuilder {		
+	
+	/**
+	 * Gets the package for the [base] object classes.
+	 * @return string
+	 */
+	public function getPackage()
+	{
+		return parent::getPackage() . ".om";
+	}
+	
+	/**
+	 * Returns the name of the current class being built.
+	 * @return string
+	 */
+	public function getClassname()
+	{
+		return $this->getBuildProperty('basePrefix') . $this->getStubNodePeerBuilder()->getClassname();
+	}
+	
+	/**
+	 * Adds the include() statements for files that this class depends on or utilizes.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addIncludes(&$script)
+	{
+		$script .= "
+require_once '".$this->getStubObjectBuilder()->getClassFilePath()."';
+require_once '".$this->getStubNodeBuilder()->getClassFilePath()."';
+";
+	} // addIncludes()
+	
+	/**
+	 * Adds class phpdoc comment and openning of class.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	protected function addClassOpen(&$script)
+	{
+		
+		$table = $this->getTable();
+		$tableName = $table->getName();
+		$tableDesc = $table->getDescription();
+		
+		$script .= "
+/**
+ * Base  static class for performing query operations on the tree contained by the '$tableName' table.
+ *
+ * $tableDesc
+ *";
+		if ($this->getBuildProperty('addTimeStamp')) {
+			$now = strftime('%c');
+			$script .= "
+ * This class was autogenerated by Propel on:
+ *
+ * $now
+ *";
+		}
+		$script .= "
+ * @package ".$this->getPackage()."
+ */	
+abstract class ".$this->getClassname()." {
+";
+	}
+	
+	/**
+	 * Specifies the methods that are added as part of the basic OM class.
+	 * This can be overridden by subclasses that wish to add more methods.
+	 * @see ObjectBuilder::addClassBody()
+	 */
+	protected function addClassBody(&$script)
+	{
+		$table = $this->getTable();
+		
+		// FIXME
+		// - Probably the build needs to be customized for supporting
+		// tables that are "aliases".  -- definitely a fringe usecase, though.
+						
+		$this->addConstants($script);
+		
+		$this->addIsCodeBase($script);
+				
+		$this->addRetrieveMethods($script);
+		
+		$this->addCreateNewRootNode($script);
+		$this->addInsertNewRootNode($script);
+		$this->addMoveNodeSubTree($script);
+		$this->addDeleteNodeSubTree($script);
+		
+		$this->addBuildFamilyCriteria($script);
+		$this->addBuildTree($script);
+		
+		$this->addPopulateNodes($script);
+		
+	}
+		
+	/**
+	 * Closes class.
+	 * @param string &$script The script will be modified in this method.
+	 */	
+	protected function addClassClose(&$script)
+	{
+		$script .= "
+} // " . $this->getClassname() . "
+";
+	}
+	
+	protected function addConstants(&$script)
+	{
+		$table = $this->getTable();
+		
+		$npath_colname = '';
+		$npath_phpname = '';
+		$npath_len = 0;
+		$npath_sep = '';
+		foreach ($table->getColumns() as $col) {
+			if ($col->isNodeKey()) {
+				$npath_colname = $table->getName() . '.' . strtoupper($col->getName());
+				$npath_phpname = $col->getPhpName();
+				$npath_len = $col->getSize();
+				$npath_sep = $col->getNodeKeySep();
+				break;
+			}
+		}
+		$script .= "
+	const NPATH_COLNAME = '$npath_colname';
+	const NPATH_PHPNAME = '$npath_phpname';
+	const NPATH_SEP		= '$npath_sep';
+	const NPATH_LEN		= $npath_len;
+";
+	}
+	
+	
+	protected function addIsCodeBase(&$script)
+	{
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		
+		$script .= "
+    /** 
+     * Temp function for CodeBase hacks that will go away.
+     */
+    public static function isCodeBase(\$con = null)
+    {
+        if (\$con === null)
+            \$con = Propel::getConnection($peerClassname::DATABASE_NAME);
+            
+        return (get_class(\$con) == 'ODBCConnection' && 
+                get_class(\$con->getAdapter()) == 'CodeBaseAdapter');
+    }
+";
+	}
+	
+	
+	protected function addCreateNewRootNode(&$script)
+	{
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$objectClassname = $this->getStubObjectBuilder()->getClassname();
+		
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		$nodeObjectClassname = $this->getStubNodeBuilder()->getClassname();
+		
+		$script .= "
+	/**
+     * Create a new Node at the top of tree. This method will destroy any 
+     * existing root node (along with its children). 
+     *
+     * Use at your own risk!
+     *
+     * @param $objectClassname Object wrapped by new node.
+     * @param Connection Connection to use.
+     * @return $nodeObjectClassname
+     * @throws PropelException
+     */
+    public static function createNewRootNode(\$obj, \$con = null)
+    {
+        if (\$con === null)
+            \$con = Propel::getConnection($peerClassname::DATABASE_NAME);
+        
+        try {
+
+            \$con->begin();
+
+            self::deleteNodeSubTree('1', \$con);
+            
+            \$setNodePath = 'set' . self::NPATH_PHPNAME;
+
+            \$obj->\$setNodePath('1');
+            \$obj->save(\$con);
+
+            \$con->commit();
+            
+        } catch (PropelException \$e) {
+            \$con->rollback();
+            throw \$e;
+        }            
+
+        return new $nodeObjectClassname(\$obj);
+    }
+";
+	}
+	
+	protected function addInsertNewRootNode(&$script)
+	{
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$objectClassname = $this->getStubObjectBuilder()->getClassname();
+		
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		$nodeObjectClassname = $this->getStubNodeBuilder()->getClassname();
+		
+		$script .= "
+	/**
+     * Inserts a new Node at the top of tree. Any existing root node (along with
+     * its children) will be made a child of the new root node. This is a 
+     * safer alternative to createNewRootNode().
+     *
+     * @param $objectClassname Object wrapped by new node.
+     * @param Connection Connection to use.
+     * @return $nodeObjectClassname
+     * @throws PropelException
+     */
+    public static function insertNewRootNode(\$obj, \$con = null)
+    {
+        if (\$con === null)
+            \$con = Propel::getConnection($peerClassname::DATABASE_NAME);
+        
+        try {
+            
+            \$con->begin();
+            
+            // Move root tree to an invalid node path.
+            $nodePeerClassname::moveNodeSubTree('1', '0', \$con);
+
+            \$setNodePath = 'set' . self::NPATH_PHPNAME;
+            
+            // Insert the new root node.
+            \$obj->\$setNodePath('1');
+            \$obj->save(\$con);
+
+            // Move the old root tree as a child of the new root.
+            $nodePeerClassname::moveNodeSubTree('0', '1' . self::NPATH_SEP . '1', \$con);
+            
+            \$con->commit();
+                        
+        } catch (PropelException \$e) {
+            \$con->rollback();
+            throw \$e;
+        }            
+        
+        return new $nodeObjectClassname(\$obj);
+    }
+";
+	}
+	
+	/**
+	 * Adds the methods for retrieving nodes.
+	 */	
+	protected function addRetrieveMethods(&$script)
+	{
+		$this->addRetrieveNodes($script);
+		$this->addRetrieveNodeByPK($script);
+		$this->addRetrieveNodeByNP($script);
+		$this->addRetrieveRootNode($script);
+	
+	}
+	
+	protected function addRetrieveNodes(&$script)
+	{
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		
+		$script .= "
+	/**
+     * Retrieves an array of tree nodes based on specified criteria. Optionally 
+     * includes all parent and/or child nodes of the matching nodes.
+     *
+     * @param Criteria Criteria to use.
+     * @param boolean True if ancestors should also be retrieved.
+     * @param boolean True if descendants should also be retrieved.
+     * @param Connection Connection to use.
+     * @return array Array of root nodes.
+     */
+    public static function retrieveNodes(\$criteria, \$ancestors = false, \$descendants = false, \$con = null)
+    {
+        \$criteria = $nodePeerClassname::buildFamilyCriteria(\$criteria, \$ancestors, \$descendants);
+        \$rs = ".$this->getStubPeerBuilder()->getClassname()."::doSelectRS(\$criteria, \$con);
+        return self::populateNodes(\$rs, \$criteria);
+    }
+";
+	}
+	
+	protected function addRetrieveNodeByPK(&$script)
+	{
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$objectClassname = $this->getStubObjectBuilder()->getClassname();
+		
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		$nodeObjectClassname = $this->getStubNodeBuilder()->getClassname();
+		
+		$script .= "
+	/**
+     * Retrieves a tree node based on a primary key. Optionally includes all 
+     * parent and/or child nodes of the matching node.
+     *
+     * @param mixed $objectClassname primary key (array for composite keys)
+     * @param boolean True if ancestors should also be retrieved.
+     * @param boolean True if descendants should also be retrieved.
+     * @param Connection Connection to use.
+     * @return $nodeObjectClassname
+     */
+    public static function retrieveNodeByPK(\$pk, \$ancestors = false, \$descendants = false, \$con = null)
+    {
+        throw new PropelException('retrieveNodeByPK() not implemented yet.');
+    }
+";
+	}
+	
+	protected function addRetrieveNodeByNP(&$script)
+	{
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$objectClassname = $this->getStubObjectBuilder()->getClassname();
+		
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		$nodeObjectClassname = $this->getStubNodeBuilder()->getClassname();
+		
+		$script .= "
+	/**
+     * Retrieves a tree node based on a node path. Optionally includes all 
+     * parent and/or child nodes of the matching node.
+     *
+     * @param string Node path to retrieve.
+     * @param boolean True if ancestors should also be retrieved.
+     * @param boolean True if descendants should also be retrieved.
+     * @param Connection Connection to use.
+     * @return $objectClassname
+     */
+    public static function retrieveNodeByNP(\$np, \$ancestors = false, \$descendants = false, \$con = null)
+    {
+        \$criteria = new Criteria($peerClassname::DATABASE_NAME);
+        \$criteria->add(self::NPATH_COLNAME, \$np, Criteria::EQUAL);
+        \$criteria = self::buildFamilyCriteria(\$criteria, \$ancestors, \$descendants);
+        \$rs = $peerClassname::doSelectRS(\$criteria, \$con);
+        \$nodes = self::populateNodes(\$rs, \$criteria);
+        return (count(\$nodes) == 1 ? \$nodes[0] : null);
+    }
+";
+	}
+	
+	protected function addRetrieveRootNode(&$script)
+	{		
+		$script .= "
+	/**
+     * Retrieves the root node.
+     *
+     * @param string Node path to retrieve.
+     * @param boolean True if descendants should also be retrieved.
+     * @param Connection Connection to use.
+     * @return ".$this->getStubNodeBuilder()->getClassname()."
+     */ 
+    public static function retrieveRootNode(\$descendants = false, \$con = null)
+    {
+        return self::retrieveNodeByNP('1', false, \$descendants, \$con);
+    }
+";
+	}
+	
+	protected function addMoveNodeSubTree(&$script)
+	{
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$objectClassname = $this->getStubObjectBuilder()->getClassname();
+		
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		$nodeObjectClassname = $this->getStubNodeBuilder()->getClassname();
+
+		$script .= "
+	/**
+     * Moves the node subtree at srcpath to the dstpath. This method is intended
+     * for internal use by the BaseNode object. Note that it does not check for 
+     * preexisting nodes at the dstpath. It also does not update the  node path 
+     * of any Node objects that might currently be in memory. 
+     *
+     * Use at your own risk!
+     *
+     * @param string Source node path to move (root of the src subtree).
+     * @param string Destination node path to move to (root of the dst subtree).
+     * @param Connection Connection to use.
+     * @return void
+     * @throws PropelException
+     * @todo This is currently broken for simulated 'onCascadeDelete's. 
+     * @todo Need to abstract the SQL better. The CONCAT sql function doesn't 
+     *       seem to be standardized (i.e. mssql), so maybe it needs to be moved
+     *       to DBAdapter.
+     */    
+    public static function moveNodeSubTree(\$srcPath, \$dstPath, \$con = null)
+    {
+        if (substr(\$dstPath, 0, strlen(\$srcPath)) == \$srcPath)
+            throw new PropelException('Cannot move a node subtree within itself.');
+    
+        if (\$con === null)
+            \$con = Propel::getConnection($peerClassname::DATABASE_NAME);
+
+        /**
+         * Example:
+         * UPDATE table 
+         * SET npath = CONCAT('1.3', SUBSTRING(npath, 6, 74)) 
+         * WHERE npath = '1.2.2' OR npath LIKE '1.2.2.%'
+         */
+         
+        \$npath = $nodePeerClassname::NPATH_COLNAME;
+		//the following dot isn`t mean`t a nodeKeySeperator
+        \$setcol = substr(\$npath, strpos(\$npath, '.')+1);
+        \$setcollen = $nodePeerClassname::NPATH_LEN;
+        \$db = Propel::getDb($peerClassname::DATABASE_NAME);
+        
+        // <hack> 
+        if ($nodePeerClassname::isCodeBase(\$con))
+        {
+            // This is a hack to get CodeBase working. It will eventually be removed.
+            // It is a workaround for the following CodeBase bug:
+            //   -Prepared statement parameters cannot be embedded in SQL functions (i.e. CONCAT)
+            \$sql = \"UPDATE \" . $peerClassname::TABLE_NAME . \" \" .
+                   \"SET \$setcol=\" . \$db->concatString(\"'\$dstPath'\", \$db->subString(\$npath, strlen(\$srcPath)+1, \$setcollen)) . \" \" . 
+                   \"WHERE \$npath = '\$srcPath' OR \$npath LIKE '\" . \$srcPath . $nodePeerClassname::NPATH_SEP . \"%'\";
+
+            \$con->executeUpdate(\$sql);
+        }
+        else
+        {
+        // </hack>
+            \$sql = \"UPDATE \" . $peerClassname::TABLE_NAME . \" \" .
+                   \"SET \$setcol=\" . \$db->concatString('?', \$db->subString(\$npath, '?', '?')) . \" \" . 
+                   \"WHERE \$npath = ? OR \$npath LIKE ?\";
+
+            \$stmt = \$con->prepareStatement(\$sql);
+            \$stmt->setString(1, \$dstPath);
+            \$stmt->setInt(2, strlen(\$srcPath)+1);
+            \$stmt->setInt(3, \$setcollen);
+            \$stmt->setString(4, \$srcPath);
+            \$stmt->setString(5, \$srcPath . $nodePeerClassname::NPATH_SEP . '%');
+            \$stmt->executeUpdate();
+        // <hack>
+        }
+        // </hack>
+    }
+";
+	}
+	
+	protected function addDeleteNodeSubTree(&$script)
+	{
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$objectClassname = $this->getStubObjectBuilder()->getClassname();
+		
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		$nodeObjectClassname = $this->getStubNodeBuilder()->getClassname();
+		
+		$script .= "
+	/**
+     * Deletes the node subtree at the specified node path from the database.
+     *
+     * @param string Node path to delete
+     * @param Connection Connection to use.
+     * @return void
+     * @throws PropelException
+     * @todo This is currently broken for simulated 'onCascadeDelete's. 
+     */
+    public static function deleteNodeSubTree(\$nodePath, \$con = null)
+    {
+        if (\$con === null)
+            \$con = Propel::getConnection($peerClassname::DATABASE_NAME);
+
+        /**
+         * DELETE FROM table
+         * WHERE npath = '1.2.2' OR npath LIKE '1.2.2.%'
+         */
+        
+        \$criteria = new Criteria($peerClassname::DATABASE_NAME);
+        \$criteria->add($nodePeerClassname::NPATH_COLNAME, \$nodePath, Criteria::EQUAL);
+        \$criteria->addOr($nodePeerClassname::NPATH_COLNAME, \$nodePath . self::NPATH_SEP . '%', Criteria::LIKE);
+// For now, we call BasePeer directly since $peerClassname tries to 
+// do a cascade delete.
+//          $peerClassname::doDelete(\$criteria, \$con);
+        BasePeer::doDelete(\$criteria, \$con);
+    }
+";
+	}
+	
+	protected function addBuildFamilyCriteria(&$script)
+	{
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$objectClassname = $this->getStubObjectBuilder()->getClassname();
+		
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		$nodeObjectClassname = $this->getStubNodeBuilder()->getClassname();
+	
+		$script .= "
+	/** 
+     * Builds the criteria needed to retrieve node ancestors and/or descendants.
+     *
+     * @param Criteria Criteria to start with
+     * @param boolean True if ancestors should be retrieved.
+     * @param boolean True if descendants should be retrieved.
+     * @return Criteria
+     */
+    public static function buildFamilyCriteria(\$criteria, \$ancestors = false, \$descendants = false)
+    {
+        /*
+            Example SQL to retrieve nodepath '1.2.3' with both ancestors and descendants:
+            
+            SELECT L.NPATH, L.LABEL, test.NPATH, UCASE(L.NPATH) 
+            FROM test L, test 
+            WHERE test.NPATH='1.2.3' AND 
+                 (L.NPATH=SUBSTRING(test.NPATH, 1, LENGTH(L.NPATH)) OR 
+                  test.NPATH=SUBSTRING(L.NPATH, 1, LENGTH(test.NPATH))) 
+            ORDER BY UCASE(L.NPATH) ASC
+        */
+
+        if (\$criteria === null)
+            \$criteria = new Criteria($peerClassname::DATABASE_NAME);
+
+        if (!\$criteria->getSelectColumns())
+            $peerClassname::addSelectColumns(\$criteria);
+
+        \$db = Propel::getDb(\$criteria->getDbName());
+
+        if ((\$ancestors || \$descendants) && \$criteria->size())
+        {
+            // If we are retrieving ancestors/descendants, we need to do a 
+            // self-join to locate them. The exception to this is if no search
+            // criteria is specified. In this case we're retrieving all nodes 
+            // anyway, so there is no need to do a self-join. 
+            
+            // The left-side of the self-join will contain the columns we'll
+            // use to build node objects (target node records along with their
+            // ancestors and/or descendants). The right-side of the join will
+            // contain the target node records specified by the initial criteria.
+            // These are used to match the appropriate ancestor/descendant on
+            // the left. 
+
+            // Specify an alias for the left-side table to use.
+            \$criteria->addAlias('L', $peerClassname::TABLE_NAME);
+            
+            // Make sure we have select columns to begin with.
+            if (!\$criteria->getSelectColumns())
+                $peerClassname::addSelectColumns(\$criteria);
+            
+            // Replace any existing columns for the right-side table with the 
+            // left-side alias.
+            \$selectColumns = \$criteria->getSelectColumns();
+            \$criteria->clearSelectColumns();
+            foreach (\$selectColumns as \$colName)
+                \$criteria->addSelectColumn(str_replace($peerClassname::TABLE_NAME, 'L', \$colName));
+
+            \$a = null;
+            \$d = null;
+            
+            \$npathL = $peerClassname::alias('L', $nodePeerClassname::NPATH_COLNAME);
+            \$npathR = $nodePeerClassname::NPATH_COLNAME;
+            \$npath_len = $nodePeerClassname::NPATH_LEN;
+            
+            if (\$ancestors)
+            {
+                // For ancestors, match left-side node paths which are contained 
+                // by right-side node paths.
+                \$a = \$criteria->getNewCriterion(\$npathL, 
+                                                \"\$npathL=\" . \$db->subString(\$npathR, 1, \$db->strLength(\$npathL), \$npath_len),
+                                                Criteria::CUSTOM);                                                        
+            }
+            
+            if (\$descendants)
+            {
+                // For descendants, match left-side node paths which contain 
+                // right-side node paths.
+                \$d = \$criteria->getNewCriterion(\$npathR,
+                                                \"\$npathR=\" . \$db->subString(\$npathL, 1, \$db->strLength(\$npathR), \$npath_len),
+                                                Criteria::CUSTOM);
+            }
+
+            if (\$a)
+            {
+                if (\$d) \$a->addOr(\$d);
+                \$criteria->addAnd(\$a);
+            }
+            else if (\$d)
+            {
+                \$criteria->addAnd(\$d);
+            }
+            
+            // Add the target node path column. This is used by populateNodes().
+            \$criteria->addSelectColumn(\$npathR);
+            
+            // Sort by node path to speed up tree construction in populateNodes()
+            \$criteria->addAsColumn('npathlen', \$db->strLength(\$npathL));
+            \$criteria->addAscendingOrderByColumn('npathlen');
+            \$criteria->addAscendingOrderByColumn(\$npathL);
+        }
+        else
+        {
+            // Add the target node path column. This is used by populateNodes().
+            \$criteria->addSelectColumn($nodePeerClassname::NPATH_COLNAME);
+
+            // Sort by node path to speed up tree construction in populateNodes()
+            \$criteria->addAsColumn('npathlen', \$db->strLength($nodePeerClassname::NPATH_COLNAME));
+            \$criteria->addAscendingOrderByColumn('npathlen');
+            \$criteria->addAscendingOrderByColumn($nodePeerClassname::NPATH_COLNAME);
+        }
+        
+        return \$criteria;
+    }
+";
+	}
+	
+	protected function addBuildTree(&$script)
+	{
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$objectClassname = $this->getStubObjectBuilder()->getClassname();
+		
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		$nodeObjectClassname = $this->getStubNodeBuilder()->getClassname();
+	
+		$script .= "
+	/**
+     * This method reconstructs as much of the tree structure as possible from
+     * the given array of objects. Depending on how you execute your query, it 
+     * is possible for the ResultSet to contain multiple tree fragments (i.e.
+     * subtrees). The array returned by this method will contain one entry
+     * for each subtree root node it finds. The remaining subtree nodes are
+     * accessible from the $nodeObjectClassname methods of the 
+     * subtree root nodes.
+     *
+     * @param array Array of $nodeObjectClassname objects
+     * @return array Array of $nodeObjectClassname objects
+     */
+    public static function buildTree(\$nodes)
+    {
+        // Subtree root nodes to return
+        \$rootNodes = array();
+
+        // Build the tree relations
+        foreach (\$nodes as \$node)
+        {
+            \$sep = strrpos(\$node->getNodePath(), $nodePeerClassname::NPATH_SEP);
+            \$parentPath = (\$sep !== false ? substr(\$node->getNodePath(), 0, \$sep) : '');
+            \$parentNode = null;
+
+            // Scan other nodes for parent.
+            foreach (\$nodes as \$pnode)
+            {
+                if (\$pnode->getNodePath() === \$parentPath)
+                {
+                    \$parentNode = \$pnode;
+                    break;
+                }
+            }
+
+            // If parent was found, attach as child, otherwise its a subtree root
+            if (\$parentNode)
+                \$parentNode->attachChildNode(\$node);
+            else
+                \$rootNodes[] = \$node;
+        }
+
+        return \$rootNodes;
+    }
+";
+	}
+	
+	protected function addPopulateNodes(&$script)
+	{
+		$table = $this->getTable();
+		
+		$peerClassname = $this->getStubPeerBuilder()->getClassname();
+		$objectClassname = $this->getStubObjectBuilder()->getClassname();
+		
+		$nodePeerClassname = $this->getStubNodePeerBuilder()->getClassname();
+		$nodeObjectClassname = $this->getStubNodeBuilder()->getClassname();
+	
+		$script .= "
+	/**
+     * Populates the $objectClassname objects from the 
+     * specified ResultSet, wraps them in $nodeObjectClassname
+     * objects and build the appropriate node relationships.
+     * The array returned by this method will only include the initial targets 
+     * of the query, even if ancestors/descendants were also requested. 
+     * The ancestors/descendants will be cached in memory and are accessible via
+     * the getNode() methods. 
+     *
+     * @param ResultSet 
+     * @param Criteria
+     * @return array Array of $nodeObjectClassname objects.
+     */
+    public static function populateNodes(\$rs, \$criteria)
+    {
+        \$nodes = array();
+        \$targets = array();
+        \$targetfld = count(\$criteria->getSelectColumns());
+";
+
+		if (!$table->getChildrenColumn()) {
+			$script .= "
+        // set the class once to avoid overhead in the loop
+        \$cls = Propel::import($peerClassname::getOMClass());
+";
+		}
+        
+		$script .= "
+        // populate the object(s)
+        while(\$rs->next()) 
+        {
+            if (!isset(\$nodes[\$rs->getString(1)]))
+            {
+";
+		if ($table->getChildrenColumn()) {
+			$script .= "
+				// class must be set each time from the record row
+				$cls = Propel::import($peerClassname::getOMClass($rs, 1));
+";
+		}
+		
+		$script .= "
+				\$obj = new \$cls();
+				\$obj->hydrate(\$rs);
+
+                \$nodes[\$rs->getString(1)] = new $nodeObjectClassname(\$obj);
+            }
+
+            \$node = \$nodes[\$rs->getString(1)];
+            
+            if (\$node->getNodePath() === \$rs->getString(\$targetfld))
+                \$targets[\$node->getNodePath()] = \$node;
+        }
+
+        $nodePeerClassname::buildTree(\$nodes);
+        
+        return array_values(\$targets);
+    }
+";
+	}
+	
+} // PHP5NodePeerBuilder


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodePeerBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/DDLBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/DDLBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/DDLBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,131 @@
+<?php
+
+/*
+ *  $Id: DDLBuilder.php 1310 2006-05-04 07:36:54Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/DataModelBuilder.php';
+
+/**
+ * Baseclass for SQL DDL-building classes.
+ *
+ * DDL-building classes are those that build all the SQL DDL for a single table.
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.sql
+ */
+abstract class DDLBuilder extends DataModelBuilder {
+
+	/**
+	 * Builds the SQL for current table and returns it as a string.
+	 *
+	 * This is the main entry point and defines a basic structure that classes should follow.
+	 * In most cases this method will not need to be overridden by subclasses.
+	 *
+	 * @return string The resulting SQL DDL.
+	 */
+	public function build()
+	{
+		$script = "";
+		$this->addTable($script);
+		$this->addIndices($script);
+		$this->addForeignKeys($script);
+		return $script;
+	}
+
+	/**
+	 * Builds the DDL SQL for a Column object.
+	 * @return string
+	 */
+	public function getColumnDDL(Column $col)
+	{
+		$platform = $this->getPlatform();
+		$domain = $col->getDomain();
+
+		$sb = "";
+		$sb .= $this->quoteIdentifier($col->getName()) . " ";
+		$sb .= $domain->getSqlType();
+		if ($platform->hasSize($domain->getSqlType())) {
+			$sb .= $domain->printSize();
+		}
+		$sb .= " ";
+		$sb .= $col->getDefaultSetting() . " ";
+		$sb .= $col->getNotNullString() . " ";
+		$sb .= $col->getAutoIncrementString();
+
+		return trim($sb);
+	}
+
+	/**
+	 * Creates a delimiter-delimited string list of column names, quoted using quoteIdentifier().
+	 * @param array Column[] or string[]
+	 * @param string $delim The delimiter to use in separating the column names.
+	 * @return string
+	 */
+	public function getColumnList($columns, $delim=',')
+	{
+		$list = array();
+		foreach($columns as $col) {
+			if ($col instanceof Column) {
+				$col = $col->getName();
+			}
+			$list[] = $this->quoteIdentifier($col);
+		}
+		return implode($delim, $list);
+	}
+
+	/**
+	 * This function adds any _database_ start/initialization SQL.
+	 * This is designed to be called for a database, not a specific table, hence it is static.
+	 * @return string The DDL is returned as astring.
+	 */
+	public static function getDatabaseStartDDL()
+	{
+		return '';
+	}
+
+	/**
+	 * This function adds any _database_ end/cleanup SQL.
+	 * This is designed to be called for a database, not a specific table, hence it is static.
+	 * @return string The DDL is returned as astring.
+	 */
+	public static function getDatabaseEndDDL()
+	{
+		return '';
+	}
+
+	/**
+	 * Adds table definition.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	abstract protected function addTable(&$script);
+
+	/**
+	 * Adds index definitions.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	abstract protected function addIndices(&$script);
+
+	/**
+	 * Adds foreign key constraint definitions.
+	 * @param string &$script The script will be modified in this method.
+	 */
+	abstract protected function addForeignKeys(&$script);
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/DDLBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/DataSQLBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/DataSQLBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/DataSQLBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,215 @@
+<?php
+
+/*
+ *  $Id: DataSQLBuilder.php 1310 2006-05-04 07:36:54Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/DataModelBuilder.php';
+
+/**
+ * Baseclass for SQL data dump SQL building classes.
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.sql
+ */
+abstract class DataSQLBuilder extends DataModelBuilder {
+
+	/**
+	 * The main method in this class, returns the SQL for INSERTing data into a row.
+	 * @param DataRow $row The row to process.
+	 * @return string
+	 */
+	public function buildRowSql(DataRow $row)
+	{
+		$sql = "";
+		$platform = $this->getPlatform();
+		$table = $this->getTable();
+
+		$sql .= "INSERT INTO ".$this->quoteIdentifier($this->getTable()->getName())." (";
+
+		// add column names to SQL
+		$colNames = array();
+		foreach ($row->getColumnValues() as $colValue) {
+			$colNames[] = $this->quoteIdentifier($colValue->getColumn()->getName());
+		}
+
+		$sql .= implode(',', $colNames);
+
+		$sql .= ") VALUES (";
+
+		$colVals = array();
+		foreach ($row->getColumnValues() as $colValue) {
+			$colVals[] = $this->getColumnValueSql($colValue);
+		}
+
+		$sql .= implode(',', $colVals);
+		$sql .= ");
+";
+
+		return $sql;
+	}
+
+	/**
+	 * Gets the propertly escaped (and quoted) value for a column.
+	 * @param ColumnValue $colValue
+	 * @return mixed The proper value to be added to the string.
+	 */
+	protected function getColumnValueSql(ColumnValue $colValue)
+	{
+		$column = $colValue->getColumn();
+		$creoleTypeString = PropelTypes::getCreoleType($column->getPropelType());
+		$creoleTypeCode = CreoleTypes::getCreoleCode($creoleTypeString);
+		$method = 'get' . CreoleTypes::getAffix($creoleTypeCode) . 'Sql';
+		return $this->$method($colValue->getValue());
+	}
+
+
+
+	/**
+     * Gets a representation of a binary value suitable for use in a SQL statement.
+     * Default behavior is true = 1, false = 0.
+     * @param boolean $value
+     * @return int
+     */
+    protected function getBooleanSql($value)
+    {
+		return (int) $value;
+    }
+
+
+    /**
+     * Gets a representation of a BLOB/LONGVARBINARY value suitable for use in a SQL statement.
+	 * @param mixed $blob Blob object or string data.
+	 * @return string
+     */
+    protected function getBlobSql($blob)
+    {
+        // they took magic __toString() out of PHP5.0.0; this sucks
+		if (is_object($blob)) {
+			return "'" . $this->escape($blob->__toString()) . "'";
+		} else {
+			return "'" . $this->escape($blob) . "'";
+		}
+    }
+
+    /**
+     * Gets a representation of a CLOB/LONGVARCHAR value suitable for use in a SQL statement.
+	 * @param mixed $clob Clob object or string data.
+	 * @return string
+     */
+    protected function getClobSql($clob)
+    {
+		// they took magic __toString() out of PHP5.0.0; this sucks
+		if (is_object($clob)) {
+			return "'" . $this->escape($clob->__toString()) . "'";
+		} else {
+			return "'" . $this->escape($clob) . "'";
+		}
+    }
+
+    /**
+     * Gets a representation of a date value suitable for use in a SQL statement.
+     * @param string $value
+     * @return string
+     */
+    protected function getDateSql($value)
+    {
+        return "'" . date('Y-m-d', strtotime($value)) . "'";
+    }
+
+    /**
+     * Gets a representation of a decimal value suitable for use in a SQL statement.
+     * @param double $value
+     * @return float
+     */
+    protected function getDecimalSql($value)
+    {
+        return (float) $value;
+    }
+
+    /**
+     * Gets a representation of a double value suitable for use in a SQL statement.
+     * @param double $value
+     * @return double
+     */
+    protected function getDoubleSql($value)
+    {
+        return (double) $value;
+    }
+
+    /**
+     * Gets a representation of a float value suitable for use in a SQL statement.
+     * @param float $value
+     * @return float
+     */
+    protected function getFloatSql($value)
+    {
+        return (float) $value;
+    }
+
+    /**
+     * Gets a representation of an integer value suitable for use in a SQL statement.
+     * @param int $value
+     * @return int
+     */
+    protected function getIntSql($value)
+    {
+		return (int) $value;
+    }
+
+    /**
+     * Gets a representation of a NULL value suitable for use in a SQL statement.
+     * @return null
+     */
+    protected function getNullSql()
+    {
+        return 'NULL';
+    }
+
+    /**
+     * Gets a representation of a string value suitable for use in a SQL statement.
+	 * @param string $value
+     * @return string
+     */
+    protected function getStringSql($value)
+    {
+		return "'" . $this->getPlatform()->escapeText($value) . "'";
+    }
+
+    /**
+     * Gets a representation of a time value suitable for use in a SQL statement.
+     * @param string $value
+     * @return string
+     */
+    protected function getTimeSql($paramIndex, $value)
+    {
+		return "'" . date('H:i:s', strtotime($value)) . "'";
+    }
+
+    /**
+     * Gets a representation of a timestamp value suitable for use in a SQL statement.
+     * @param string $value
+     * @return string
+     */
+    function getTimestampSql($value)
+    {
+		return "'" . date('Y-m-d H:i:s', strtotime($value)) . "'";
+    }
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/DataSQLBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDDLBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDDLBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDDLBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,185 @@
+<?php
+
+/*
+ *  $Id: MssqlDDLBuilder.php 1310 2006-05-04 07:36:54Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/sql/DDLBuilder.php';
+
+/**
+ * The SQL DDL-building class for MS SQL Server.
+ *
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.sql.pgsql
+ */
+class MssqlDDLBuilder extends DDLBuilder {
+
+	private static $dropCount = 0;
+
+	/**
+	 *
+	 * @see parent::addDropStatement()
+	 */
+	protected function addDropStatements(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		foreach ($table->getForeignKeys() as $fk) {
+			$script .= "
+IF EXISTS (SELECT 1 FROM sysobjects WHERE type ='RI' AND name='".$fk->getName()."')
+    ALTER TABLE ".$this->quoteIdentifier($table->getName())." DROP CONSTRAINT ".$this->quoteIdentifier($fk->getName()).";
+";
+		}
+
+
+		self::$dropCount++;
+
+		$script .= "
+IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name = '".$table->getName()."')
+BEGIN
+     DECLARE @reftable_".self::$dropCount." nvarchar(60), @constraintname_".self::$dropCount." nvarchar(60)
+     DECLARE refcursor CURSOR FOR
+     select reftables.name tablename, cons.name constraintname
+      from sysobjects tables,
+           sysobjects reftables,
+           sysobjects cons,
+           sysreferences ref
+       where tables.id = ref.rkeyid
+         and cons.id = ref.constid
+         and reftables.id = ref.fkeyid
+         and tables.name = '".$table->getName()."'
+     OPEN refcursor
+     FETCH NEXT from refcursor into @reftable_".self::$dropCount.", @constraintname_".self::$dropCount."
+     while @@FETCH_STATUS = 0
+     BEGIN
+       exec ('alter table '+ en reftable_".self::$dropCount."+' drop constraint '+ en constraintname_".self::$dropCount.")
+       FETCH NEXT from refcursor into @reftable_".self::$dropCount.", @constraintname_".self::$dropCount."
+     END
+     CLOSE refcursor
+     DEALLOCATE refcursor
+     DROP TABLE ".$this->quoteIdentifier($table->getName())."
+END
+";
+	}
+
+	/**
+	 * @see parent::addColumns()
+	 */
+	protected function addTable(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		$script .= "
+/* ---------------------------------------------------------------------- */
+/* ".$table->getName()."											*/
+/* ---------------------------------------------------------------------- */
+
+";
+
+		$this->addDropStatements($script);
+
+		$script .= "
+
+CREATE TABLE ".$this->quoteIdentifier($table->getName())."
+(
+	";
+
+		$lines = array();
+
+		foreach ($table->getColumns() as $col) {
+			$lines[] = $this->getColumnDDL($col);
+		}
+
+		if ($table->hasPrimaryKey()) {
+			$lines[] = "CONSTRAINT ".$this->quoteIdentifier($table->getName())."_PK PRIMARY KEY (".$this->getColumnList($table->getPrimaryKey()).")";
+		}
+
+		foreach ($table->getUnices() as $unique ) {
+			$lines[] = "UNIQUE (".$this->getColumnList($unique->getColumns()).")";
+    	}
+
+		$sep = ",
+	";
+		$script .= implode($sep, $lines);
+		$script .= "
+);
+";
+	}
+
+	/**
+	 * Adds CREATE INDEX statements for this table.
+	 * @see parent::addIndices()
+	 */
+	protected function addIndices(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		foreach ($table->getIndices() as $index) {
+			$script .= "
+CREATE ";
+			if($index->getIsUnique()) {
+				$script .= "UNIQUE";
+			}
+			$script .= "INDEX ".$this->quoteIdentifier($index->getName())." ON ".$this->quoteIdentifier($table->getName())." (".$this->getColumnList($index->getColumns()).");
+";
+		}
+	}
+
+	/**
+	 *
+	 * @see parent::addForeignKeys()
+	 */
+	protected function addForeignKeys(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		foreach ($table->getForeignKeys() as $fk) {
+			$script .= "
+BEGIN
+ALTER TABLE ".$this->quoteIdentifier($table->getName())." ADD CONSTRAINT ".$this->quoteIdentifier($fk->getName())." FOREIGN KEY (".$this->getColumnList($fk->getLocalColumns()) .") REFERENCES ".$this->quoteIdentifier($fk->getForeignTableName())." (".$this->getColumnList($fk->getForeignColumns()).")";
+			if ($fk->hasOnUpdate()) {
+				if ($fk->getOnUpdate() == ForeignKey::SETNULL) { // there may be others that also won't work
+				    // we have to skip this because it's unsupported.
+					$this->warn("MSSQL doesn't support the 'SET NULL' option for ON UPDATE (ignoring for ".$this->getColumnList($fk->getLocalColumns())." fk).");
+				} else {
+					$script .= " ON UPDATE ".$fk->getOnUpdate();
+				}
+
+			}
+			if ($fk->hasOnDelete()) {
+				if ($fk->getOnDelete() == ForeignKey::SETNULL) { // there may be others that also won't work
+				    // we have to skip this because it's unsupported.
+					$this->warn("MSSQL doesn't support the 'SET NULL' option for ON DELETE (ignoring for ".$this->getColumnList($fk->getLocalColumns())." fk).");
+				} else {
+					$script .= " ON DELETE ".$fk->getOnDelete();
+				}
+			}
+			$script .= "
+END
+;
+";
+		}
+	}
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDDLBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDataSQLBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDataSQLBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDataSQLBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ *  $Id: MssqlDataSQLBuilder.php 137 2005-11-17 14:11:19Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/sql/DataSQLBuilder.php';
+
+/**
+ * MS SQL Server class for building data dump SQL.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.sql.mssql
+ */
+class MssqlDataSQLBuilder extends DataSQLBuilder {
+
+    /**
+     * 
+     * @param mixed $blob Blob object or string containing data.
+     * @return string
+     */
+    protected function getBlobSql($blob) 
+    {
+		// they took magic __toString() out of PHP5.0.0; this sucks
+		if (is_object($blob)) {
+		    $blob = $blob->__toString();
+		}            
+		$data = unpack("H*hex", $blob);
+		return '0x'.$data['hex']; // no surrounding quotes!        
+    }
+	
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDataSQLBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDDLBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDDLBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDDLBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,299 @@
+<?php
+
+/*
+ *  $Id: MysqlDDLBuilder.php 1310 2006-05-04 07:36:54Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/sql/DDLBuilder.php';
+
+/**
+ * DDL Builder class for MySQL.
+ *
+ * @author David Zülke
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.sql.mysql
+ */
+class MysqlDDLBuilder extends DDLBuilder {
+
+	/**
+	 * Returns some header SQL that disables foreign key checking.
+	 * @return string DDL
+	 */
+	public static function getDatabaseStartDDL()
+	{
+		$ddl = "
+# This is a fix for InnoDB in MySQL >= 4.1.x
+# It \"suspends judgement\" for fkey relationships until are tables are set.
+SET FOREIGN_KEY_CHECKS = 0;
+";
+		return $ddl;
+	}
+
+	/**
+	 * Returns some footer SQL that re-enables foreign key checking.
+	 * @return string DDL
+	 */
+	public static function getDatabaseEndDDL()
+	{
+		$ddl = "
+# This restores the fkey checks, after having unset them earlier
+SET FOREIGN_KEY_CHECKS = 1;
+";
+		return $ddl;
+	}
+
+
+	/**
+	 *
+	 * @see parent::addDropStatement()
+	 */
+	protected function addDropStatements(&$script)
+	{
+		$script .= "
+DROP TABLE IF EXISTS ".$this->quoteIdentifier($this->getTable()->getName()).";
+";
+	}
+
+	/**
+	 * Builds the SQL for current table and returns it as a string.
+	 *
+	 * This is the main entry point and defines a basic structure that classes should follow.
+	 * In most cases this method will not need to be overridden by subclasses.
+	 *
+	 * @return string The resulting SQL DDL.
+	 */
+	public function build()
+	{
+		$script = "";
+		$this->addTable($script);
+		return $script;
+	}
+
+	/**
+	 *
+	 * @see parent::addColumns()
+	 */
+	protected function addTable(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		$script .= "
+#-----------------------------------------------------------------------------
+#-- ".$table->getName()."
+#-----------------------------------------------------------------------------
+";
+
+		$this->addDropStatements($script);
+
+		$script .= "
+
+CREATE TABLE ".$this->quoteIdentifier($table->getName())."
+(
+	";
+
+		$lines = array();
+
+		foreach ($table->getColumns() as $col) {
+			$entry = $this->getColumnDDL($col);
+			if ($col->getDescription()) {
+				$entry .= " COMMENT '".$platform->escapeText($col->getDescription())."'";
+			}
+			$lines[] = $entry;
+		}
+
+		if ($table->hasPrimaryKey()) {
+			$lines[] = "PRIMARY KEY (".$this->getColumnList($table->getPrimaryKey()).")";
+		}
+
+		$this->addIndicesLines($lines);
+		$this->addForeignKeysLines($lines);
+
+		$sep = ",
+	";
+		$script .= implode($sep, $lines);
+
+		$script .= "
+)";
+
+		$mysqlTableType = $this->getBuildProperty("mysqlTableType");
+		if (!$mysqlTableType) {
+			$vendorSpecific = $table->getVendorSpecificInfo();
+			if(isset($vendorSpecific['Type'])) {
+				$mysqlTableType = $vendorSpecific['Type'];
+			} else {
+				$mysqlTableType = 'MyISAM';
+			}
+		}
+
+		$script .= "Type=$mysqlTableType";
+		if($table->getDescription()) {
+			$script .= " COMMENT='".$platform->escapeText($table->getDescription())."'";
+		}
+		$script .= ";
+";
+	}
+
+	/**
+	 * Creates a comma-separated list of column names for the index.
+	 * For MySQL unique indexes there is the option of specifying size, so we cannot simply use
+	 * the getColumnsList() method.
+	 * @param Index $index
+	 * @return string
+	 */
+	private function getIndexColumnList(Index $index)
+	{
+		$platform = $this->getPlatform();
+
+		$cols = $index->getColumns();
+		$list = array();
+		foreach($cols as $col) {
+			$list[] = $this->quoteIdentifier($col) . ($index->hasColumnSize($col) ? '(' . $index->getColumnSize($col) . ')' : '');
+		}
+		return implode(', ', $list);
+	}
+
+	/**
+	 * Adds indexes
+	 */
+	protected function addIndicesLines(&$lines)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		foreach ($table->getUnices() as $unique) {
+			$lines[] = "UNIQUE KEY ".$this->quoteIdentifier($unique->getName())." (".$this->getIndexColumnList($unique).")";
+		}
+
+		foreach ($table->getIndices() as $index ) {
+			$vendor = $index->getVendorSpecificInfo();
+			$lines[] .= (($vendor && $vendor['Index_type'] == 'FULLTEXT') ? 'FULLTEXT ' : '') . "KEY " . $this->quoteIdentifier($index->getName()) . "(" . $this->getIndexColumnList($index) . ")";
+		}
+
+	}
+
+	/**
+	 * Adds foreign key declarations & necessary indexes for mysql (if they don't exist already).
+	 * @see parent::addForeignKeys()
+	 */
+	protected function addForeignKeysLines(&$lines)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+
+		$_indices = array();
+		$_previousColumns = array();
+
+		// we're building an array of indices here which is smart about multi-column indices.
+		// for example, if we have to indices foo(ColA) and bar(ColB, ColC), we have actually three indices already defined:
+		// ColA, ColB+ColC, and ColB (but not ColC!). This is because of the way SQL multi-column indices work.
+		// we will later match found, defined foreign key and referenced column definitions against this array to know
+		// whether we should create a new index for mysql or not
+		foreach($table->getPrimaryKey() as $_primaryKeyColumn) {
+			// do the above for primary keys
+			$_previousColumns[] = $this->quoteIdentifier($_primaryKeyColumn->getName());
+			$_indices[] = implode(',', $_previousColumns);
+		}
+
+		$_tableIndices = array_merge($table->getIndices(), $table->getUnices());
+		foreach($_tableIndices as $_index) {
+			// same procedure, this time for unices and indices
+			$_previousColumns = array();
+			$_indexColumns = $_index->getColumns();
+			foreach($_indexColumns as $_indexColumn) {
+				$_previousColumns[] = $this->quoteIdentifier($_indexColumn);
+				$_indices[] = implode(',', $_previousColumns);
+			}
+		}
+
+		// we're determining which tables have foreign keys that point to this table, since MySQL needs an index on
+		// any column that is referenced by another table (yep, MySQL _is_ a PITA)
+		$counter = 0;
+		$allTables = $table->getDatabase()->getTables();
+		foreach($allTables as $_table) {
+			foreach($_table->getForeignKeys() as $_foreignKey) {
+				if($_foreignKey->getForeignTableName() == $table->getName()) {
+					if(!in_array($this->getColumnList($_foreignKey->getForeignColumns()), $_indices)) {
+						// no matching index defined in the schema, so we have to create one
+						$lines[] = "INDEX ".$this->quoteIdentifier("I_referenced_".$_foreignKey->getName()."_".(++$counter))." (" .$this->getColumnList($_foreignKey->getForeignColumns()).")";
+					}
+				}
+			}
+		}
+
+		foreach ($table->getForeignKeys() as $fk) {
+
+			$indexName = $this->quoteIdentifier(substr_replace($fk->getName(), 'FI_',  strrpos($fk->getName(), 'FK_'), 3));
+
+			if(!in_array($this->getColumnList($fk->getLocalColumns()), $_indices)) {
+				// no matching index defined in the schema, so we have to create one. MySQL needs indices on any columns that serve as foreign keys. these are not auto-created prior to 4.1.2
+				$lines[] = "INDEX $indexName (".$this->getColumnList($fk->getLocalColumns()).")";
+			}
+			$str = "CONSTRAINT ".$this->quoteIdentifier($fk->getName())."
+		FOREIGN KEY (".$this->getColumnList($fk->getLocalColumns()).")
+		REFERENCES ".$this->quoteIdentifier($fk->getForeignTableName()) . " (".$this->getColumnList($fk->getForeignColumns()).")";
+			if ($fk->hasOnUpdate()) {
+				$str .= "
+		ON UPDATE ".$fk->getOnUpdate();
+			}
+			if ($fk->hasOnDelete()) {
+				$str .= "
+		ON DELETE ".$fk->getOnDelete();
+			}
+			$lines[] = $str;
+		}
+
+	}
+
+	/**
+	 * Checks whether passed-in array of Column objects contains a column with specified name.
+	 * @param array Column[] or string[]
+	 * @param string $searchcol Column name to search for
+	 */
+	private function containsColname($columns, $searchcol)
+	{
+		foreach($columns as $col) {
+			if ($col instanceof Column) {
+				$col = $col->getName();
+			}
+			if ($col == $searchcol) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Not used for MySQL since foreign keys are declared inside table declaration.
+	 * @see addForeignKeysLines()
+	 */
+	protected function addForeignKeys(&$script)
+	{
+	}
+
+	/**
+	 * Not used for MySQL since indexes are declared inside table declaration.
+	 * @see addIndicesLines()
+	 */
+	protected function addIndices(&$script)
+	{
+	}
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDDLBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDataSQLBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDataSQLBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDataSQLBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ *  $Id: MysqlDataSQLBuilder.php 137 2005-11-17 14:11:19Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/sql/DataSQLBuilder.php';
+
+/**
+ * MySQL class for building data dump SQL.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.sql.mysql
+ */
+class MysqlDataSQLBuilder extends DataSQLBuilder {
+	
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDataSQLBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDDLBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDDLBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDDLBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ *  $Id: MysqliDDLBuilder.php 497 2006-01-22 13:07:47Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/sql/mysql/MysqlDDLBuilder.php';
+
+/**
+ * DDL Builder class for MySQL, specifically using new mysqli API.
+ * 
+ * @author Hans Lellelid
+ * @package propel.engine.builder.sql.mysql
+ */
+class MysqliDDLBuilder extends MysqlDDLBuilder {
+	
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDDLBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDataSQLBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDataSQLBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDataSQLBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ *  $Id: MysqliDataSQLBuilder.php 497 2006-01-22 13:07:47Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/sql/DataSQLBuilder.php';
+
+/**
+ * MySQL class for building data dump SQL.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.sql.mysql
+ */
+class MysqliDataSQLBuilder extends DataSQLBuilder {
+	
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDataSQLBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDDLBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDDLBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDDLBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,177 @@
+<?php
+
+/*
+ *  $Id: OracleDDLBuilder.php 1310 2006-05-04 07:36:54Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/sql/DDLBuilder.php';
+
+/**
+ * The SQL DDL-building class for Oracle.
+ *
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.sql.pgsql
+ */
+class OracleDDLBuilder extends DDLBuilder {
+
+	/**
+	 *
+	 * @see parent::addDropStatement()
+	 */
+	protected function addDropStatements(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+		$script .= "
+DROP TABLE ".$this->quoteIdentifier($table->getName())." CASCADE CONSTRAINTS;
+";
+		if ($table->getIdMethod() == "native") {
+			$script .= "
+DROP SEQUENCE ".$this->quoteIdentifier($table->getSequenceName()).";
+";
+		}
+	}
+
+	/**
+	 *
+	 * @see parent::addColumns()
+	 */
+	protected function addTable(&$script)
+	{
+		$table = $this->getTable();
+		$script .= "
+
+/* -----------------------------------------------------------------------
+   ".$table->getName()."
+   ----------------------------------------------------------------------- */
+";
+
+		$this->addDropStatements($script);
+
+		$script .= "
+
+CREATE TABLE ".$table->getName()."
+(
+	";
+
+		$lines = array();
+
+		foreach ($table->getColumns() as $col) {
+			$lines[] = $this->getColumnDDL($col);
+		}
+
+		$sep = ",
+	";
+		$script .= implode($sep, $lines);
+		$script .= "
+);
+";
+		$this->addPrimaryKey($script);
+		$this->addIndices($script);
+		$this->addSequences($script);
+
+	}
+
+	/**
+	 *
+	 *
+	 */
+	protected function addPrimaryKey(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+		$tableName = $table->getName();
+		$length = strlen($tableName);
+		if ($length > 27) {
+			$length = 27;
+		}
+		if ( is_array($table->getPrimaryKey()) && count($table->getPrimaryKey()) ) {
+			$script .= "
+	ALTER TABLE ".$this->quoteIdentifier($table->getName())."
+	    ADD CONSTRAINT ".substr($tableName,0,$length)."_PK
+	PRIMARY KEY (";
+			$delim = "";
+			foreach ($table->getPrimaryKey() as $col) {
+				echo $delim . $col->getName();
+				$delim = ",";
+			}
+	$script .= ");
+";
+		}
+	}
+
+	/**
+	 * Adds CREATE SEQUENCE statements for this table.
+	 *
+	 */
+	protected function addSequences(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+		if ($table->getIdMethod() == "native") {
+			$script .= "CREATE SEQUENCE ".$this->quoteIdentifier($table->getSequenceName())." INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE NOCACHE ORDER;
+";
+		}
+	}
+
+
+	/**
+	 * Adds CREATE INDEX statements for this table.
+	 * @see parent::addIndices()
+	 */
+	protected function addIndices(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+		foreach ($table->getIndices() as $index) {
+			$script .= "CREATE ";
+			if($index->getIsUnique()) {
+				$script .= "UNIQUE";
+			}
+			$script .= "INDEX ".$this->quoteIdentifier($index->getName()) ." ON ".$this->quoteIdentifier($table->getName())." (".$this->getColumnList($index->getColumns()).");
+";
+		}
+	}
+
+	/**
+	 *
+	 * @see parent::addForeignKeys()
+	 */
+	protected function addForeignKeys(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+		foreach ($table->getForeignKeys() as $fk) {
+			$script .= "
+ALTER TABLE ".$this->quoteIdentifier($table->getName())." ADD CONSTRAINT ".$this->quoteIdentifier($fk->getName())." FOREIGN KEY (".$this->getColumnList($fk->getLocalColumns()) .") REFERENCES ".$this->quoteIdentifier($fk->getForeignTableName())." (".$this->getColumnList($fk->getForeignColumns()).")";
+			if ($fk->hasOnUpdate()) {
+				$this->warn("ON UPDATE not yet implemented for Oracle builder.(ignoring for ".$this->getColumnList($fk->getLocalColumns())." fk).");
+				//$script .= " ON UPDATE ".$fk->getOnUpdate();
+			}
+			if ($fk->hasOnDelete()) {
+				$script .= " ON DELETE ".$fk->getOnDelete();
+			}
+			$script .= ";
+";
+		}
+	}
+
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDDLBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDataSQLBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDataSQLBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDataSQLBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ *  $Id: OracleDataSQLBuilder.php 137 2005-11-17 14:11:19Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/sql/DataSQLBuilder.php';
+
+/**
+ * Oracle class for building data dump SQL.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.sql.oracle
+ */
+class OracleDataSQLBuilder extends DataSQLBuilder {
+	
+	
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDataSQLBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDDLBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDDLBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDDLBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,248 @@
+<?php
+
+/*
+ *  $Id: PgsqlDDLBuilder.php 1310 2006-05-04 07:36:54Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/sql/DDLBuilder.php';
+
+/**
+ * The SQL DDL-building class for PostgreSQL.
+ *
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.sql.pgsql
+ */
+class PgsqlDDLBuilder extends DDLBuilder {
+
+
+    /**
+     * Array that keeps track of already
+     * added schema names
+     *
+     * @var Array of schema names
+     */
+    protected static $addedSchemas = array();
+
+    /**
+     * Get the schema for the current table
+     *
+     * @author Markus Lervik <markus.lervik en necora.fi>
+     * @access protected
+     * @return schema name if table has one, else
+     *         null
+     **/
+    protected function getSchema()
+    {
+
+        $table = $this->getTable();
+        $schema = $table->getVendorSpecificInfo();
+        if (!empty($schema) && isset($schema['schema'])) {
+            return $schema['schema'];
+        }
+
+        return null;
+
+    }
+
+    /**
+     * Add a schema to the generated SQL script
+     *
+     * @author Markus Lervik <markus.lervik en necora.fi>
+     * @access protected
+     * @return string with CREATE SCHEMA statement if
+     *         applicable, else empty string
+     **/
+    protected function addSchema()
+    {
+
+        $schemaName = $this->getSchema();
+
+        if ($schemaName !== null) {
+
+            if (!in_array($schemaName, self::$addedSchemas)) {
+		$platform = $this->getPlatform();
+                self::$addedSchemas[] = $schemaName;
+		return "\nCREATE SCHEMA " . $this->quoteIdentifier($schemaName) . ";\n";
+            }
+        }
+
+        return '';
+
+    }
+
+	/**
+	 *
+	 * @see parent::addDropStatement()
+	 */
+	protected function addDropStatements(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		$script .= "
+DROP TABLE ".$this->quoteIdentifier($table->getName())." CASCADE;
+";
+		if ($table->getIdMethod() == "native") {
+			$script .= "
+DROP SEQUENCE ".$this->quoteIdentifier(strtolower($table->getSequenceName())).";
+";
+		}
+	}
+
+	/**
+	 *
+	 * @see parent::addColumns()
+	 */
+	protected function addTable(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		$script .= "
+-----------------------------------------------------------------------------
+-- ".$table->getName()."
+-----------------------------------------------------------------------------
+";
+
+        $script .= $this->addSchema();
+
+        $schemaName = $this->getSchema();
+        if ($schemaName !== null) {
+            $script .= "\nSET search_path TO " . $this->quoteIdentifier($schemaName) . ";\n";
+        }
+
+		$this->addDropStatements($script);
+		$this->addSequences($script);
+
+        $script .= "
+
+CREATE TABLE ".$this->quoteIdentifier($table->getName())."
+(
+	";
+
+		$lines = array();
+
+		foreach ($table->getColumns() as $col) {
+			$lines[] = $this->getColumnDDL($col);
+		}
+
+		if ($table->hasPrimaryKey()) {
+			$lines[] = "PRIMARY KEY (".$this->getColumnList($table->getPrimaryKey()).")";
+		}
+
+		foreach ($table->getUnices() as $unique ) {
+			$lines[] = "CONSTRAINT ".$this->quoteIdentifier($unique->getName())." UNIQUE (".$this->getColumnList($unique->getColumns()).")";
+    	}
+
+		$sep = ",
+	";
+		$script .= implode($sep, $lines);
+		$script .= "
+);
+
+COMMENT ON TABLE ".$this->quoteIdentifier($table->getName())." IS '" . $platform->escapeText($table->getDescription())."';
+
+";
+
+		$this->addColumnComments($script);
+
+        $script .= "\nSET search_path TO public;";
+
+	}
+
+	/**
+	 * Adds comments for the columns.
+	 *
+	 */
+	protected function addColumnComments(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		foreach ($this->getTable()->getColumns() as $col) {
+    		if( $col->getDescription() != '' ) {
+				$script .= "
+COMMENT ON COLUMN ".$this->quoteIdentifier($table->getName()).".".$this->quoteIdentifier($col->getName())." IS '".$platform->escapeText($col->getDescription()) ."';
+";
+			}
+		}
+	}
+
+	/**
+	 * Adds CREATE SEQUENCE statements for this table.
+	 *
+	 */
+	protected function addSequences(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		if ($table->getIdMethod() == "native") {
+			$script .= "
+CREATE SEQUENCE ".$this->quoteIdentifier(strtolower($table->getSequenceName())).";
+";
+		}
+	}
+
+
+	/**
+	 * Adds CREATE INDEX statements for this table.
+	 * @see parent::addIndices()
+	 */
+	protected function addIndices(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		foreach ($table->getIndices() as $index) {
+			$script .= "
+CREATE ";
+			if($index->getIsUnique()) {
+				$script .= "UNIQUE";
+			}
+			$script .= "INDEX ".$this->quoteIdentifier($index->getName())." ON ".$this->quoteIdentifier($table->getName())." (".$this->getColumnList($index->getColumns()).");
+";
+		}
+	}
+
+	/**
+	 *
+	 * @see parent::addForeignKeys()
+	 */
+	protected function addForeignKeys(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		foreach ($table->getForeignKeys() as $fk) {
+			$script .= "
+ALTER TABLE ".$this->quoteIdentifier($table->getName())." ADD CONSTRAINT ".$this->quoteIdentifier($fk->getName())." FOREIGN KEY (".$this->getColumnList($fk->getLocalColumns()) .") REFERENCES ".$this->quoteIdentifier($fk->getForeignTableName())." (".$this->getColumnList($fk->getForeignColumns()).")";
+			if ($fk->hasOnUpdate()) {
+				$script .= " ON UPDATE ".$fk->getOnUpdate();
+			}
+			if ($fk->hasOnDelete()) {
+				$script .= " ON DELETE ".$fk->getOnDelete();
+			}
+			$script .= ";
+";
+		}
+	}
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDDLBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDataSQLBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDataSQLBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDataSQLBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ *  $Id: PgsqlDataSQLBuilder.php 497 2006-01-22 13:07:47Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/sql/DataSQLBuilder.php';
+
+/**
+ * PostgreSQL class for building data dump SQL.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.sql.pgsql
+ */
+class PgsqlDataSQLBuilder extends DataSQLBuilder {
+	
+	/**
+     * Get SQL value to insert for Postgres BOOLEAN column.
+     * @param boolean $value
+     * @return string The representation of boolean for Postgres ('t' or 'f').
+     */
+    protected function getBooleanSql($value) 
+    {
+		return ($value ? "'t'" : "'f'");
+    }
+
+    /**
+     * 
+     * @param mixed $blob Blob object or string containing data.
+     * @return string
+     */
+    protected function getBlobSql($blob) 
+    {    
+		// they took magic __toString() out of PHP5.0.0; this sucks
+		if (is_object($blob)) {
+		    $blob = $blob->__toString();
+		}            
+		return "'" . pg_escape_bytea($blob) . "'";
+    }
+	
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDataSQLBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDDLBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDDLBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDDLBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,126 @@
+<?php
+
+/*
+ *  $Id: SqliteDDLBuilder.php 1310 2006-05-04 07:36:54Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/sql/DDLBuilder.php';
+
+/**
+ * The SQL DDL-building class for SQLite.
+ *
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.sql.pgsql
+ */
+class SqliteDDLBuilder extends DDLBuilder {
+
+	/**
+	 *
+	 * @see parent::addDropStatement()
+	 */
+	protected function addDropStatements(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		$script .= "
+DROP TABLE ".$this->quoteIdentifier($table->getName()).";
+";
+	}
+
+	/**
+	 *
+	 * @see parent::addColumns()
+	 */
+	protected function addTable(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		$script .= "
+-----------------------------------------------------------------------------
+-- ".$table->getName()."
+-----------------------------------------------------------------------------
+";
+
+		$this->addDropStatements($script);
+
+		$script .= "
+
+CREATE TABLE ".$this->quoteIdentifier($table->getName())."
+(
+	";
+
+		$lines = array();
+
+		foreach ($table->getColumns() as $col) {
+			$lines[] = $this->getColumnDDL($col);
+		}
+
+		foreach ($table->getUnices() as $unique ) {
+			$lines[] = "UNIQUE (".$this->getColumnList($unique->getColumns()).")";
+    	}
+
+		$sep = ",
+	";
+		$script .= implode($sep, $lines);
+		$script .= "
+);
+";
+	}
+
+	/**
+	 * Adds CREATE INDEX statements for this table.
+	 * @see parent::addIndices()
+	 */
+	protected function addIndices(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		foreach ($table->getIndices() as $index) {
+			$script .= "
+CREATE ";
+			if($index->getIsUnique()) {
+				$script .= "UNIQUE";
+			}
+			$script .= "INDEX ".$this->quoteIdentifier($index->getName())." ON ".$this->quoteIdentifier($table->getName())." (".$this->getColumnList($index->getColumns()).");
+";
+		}
+	}
+
+	/**
+	 *
+	 * @see parent::addForeignKeys()
+	 */
+	protected function addForeignKeys(&$script)
+	{
+		$table = $this->getTable();
+		$platform = $this->getPlatform();
+
+		foreach ($table->getForeignKeys() as $fk) {
+			$script .= "
+-- SQLite does not support foreign keys; this is just for reference
+-- FOREIGN KEY (".$this->getColumnList($fk->getLocalColumns()).") REFERENCES ".$fk->getForeignTableName()." (".$this->getColumnList($fk->getForeignColumns()).")
+";
+		}
+	}
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDDLBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDataSQLBuilder.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDataSQLBuilder.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDataSQLBuilder.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ *  $Id: SqliteDataSQLBuilder.php 137 2005-11-17 14:11:19Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/builder/sql/DataSQLBuilder.php';
+
+/**
+ * SQLite class for building data dump SQL.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.engine.builder.sql.sqlite
+ */
+class SqliteDataSQLBuilder extends DataSQLBuilder {
+	
+	/**
+     * Returns string processed by sqlite_udf_encode_binary() to ensure that binary contents will be handled correctly by sqlite.
+	 * @param mixed $blob Blob or string
+	 * @return string encoded text
+     */
+    protected function getBlobSql($blob) 
+    {    
+		// they took magic __toString() out of PHP5.0.0; this sucks
+		if (is_object($blob)) {
+		    $blob = $blob->__toString();
+		}
+		return "'" . sqlite_udf_encode_binary($blob) . "'";
+    }
+	
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDataSQLBuilder.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/AppData.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/AppData.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/AppData.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,206 @@
+<?php
+/*
+ *  $Id: AppData.php 258 2005-11-07 16:12:09Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+include_once 'propel/engine/EngineException.php';
+include_once 'propel/engine/database/model/Database.php';
+
+/**
+ * A class for holding application data structures.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Leon Messerschmidt <leon en opticode.co.za> (Torque)
+ * @author John McNally <jmcnally en collab.net> (Torque)
+ * @author Daniel Rall <dlr en finemaltcoding.com> (Torque)
+ * @version $Revision: 258 $
+ * @package propel.engine.database.model
+ */
+class AppData {
+
+    /**
+     * The list of databases for this application.
+     * @var array Database[]
+     */
+    private $dbList = array();
+
+    /**
+     * The platform class for our database(s).
+     * @var string
+     */
+    private $platform;
+
+    /**
+     * Name of the database. Only one database definition
+     * is allowed in one XML descriptor.
+     */
+    private $name;
+
+    /**
+     * Flag to ensure that initialization is performed only once.
+     * @var boolean
+     */
+    private $isInitialized = false;
+
+    /**
+     * Creates a new instance for the specified database type.
+     *
+     * @param Platform $platform The platform class to use for any databases added to this application model.
+     */
+    public function __construct(Platform $platform)
+    {
+        $this->platform = $platform;
+    }
+
+    /**
+     * Set the name of the database.
+     *
+     * @param name of the database.
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * Get the name of the database.
+     *
+     * @return String name
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Get the short name of the database (without the '-schema' postfix).
+     *
+     * @return String name
+     */
+    public function getShortName()
+    {
+        return str_replace("-schema", "", $this->name);
+    }
+
+    /**
+     * Return an array of all databases
+     *
+     * @return Array of Database objects
+     */
+    public function getDatabases($doFinalInit = true)
+    {
+		// this is temporary until we'll have a clean solution
+		// for packaging datamodels/requiring schemas
+        if ($doFinalInit) {
+        	$this->doFinalInitialization();
+		}
+        return $this->dbList;
+    }
+
+    /**
+     * Returns whether this application has multiple databases.
+     *
+     * @return boolean True if the application has multiple databases
+     */
+    public function hasMultipleDatabases()
+    {
+        return (count($this->dbList) > 1);
+    }
+
+    /**
+     * Return the database with the specified name.
+     *
+     * @param name database name
+     * @return A Database object.  If it does not exist it returns null
+     */
+    public function getDatabase($name = null, $doFinalInit = true)
+    {
+		// this is temporary until we'll have a clean solution
+		// for packaging datamodels/requiring schemas
+        if ($doFinalInit) {
+        	$this->doFinalInitialization();
+		}
+
+        if ($name === null) {
+            return $this->dbList[0];
+        }
+
+        for($i=0,$size=count($this->dbList); $i < $size; $i++) {
+            $db = $this->dbList[$i];
+            if ($db->getName() === $name) {
+                return $db;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Add a database to the list and sets the AppData property to this
+     * AppData
+     *
+     * @param db the database to add
+     */
+    public function addDatabase($db)
+    {
+        if ($db instanceof Database) {
+            $db->setAppData($this);
+            if ($db->getPlatform() === null) {
+                $db->setPlatform($this->platform);
+            }
+            $this->dbList[] = $db;
+            return $db;
+        } else {
+            // XML attributes array / hash
+            $d = new Database();
+            $d->loadFromXML($db);
+            return $this->addDatabase($d); // calls self w/ different param type
+        }
+
+    }
+
+    /**
+     *
+     * @return void
+     */
+    private function doFinalInitialization()
+    {
+        if (!$this->isInitialized) {
+            for($i=0, $size=count($this->dbList); $i < $size; $i++) {
+                $this->dbList[$i]->doFinalInitialization();
+            }
+            $this->isInitialized = true;
+        }
+    }
+
+    /**
+     * Creats a string representation of this AppData.
+     * The representation is given in xml format.
+     *
+     * @return string Representation in xml format
+     */
+    public function toString()
+    {
+        $result = "<app-data>\n";
+        for ($i=0,$size=count($this->dbList); $i < $size; $i++) {
+            $result .= $this->dbList[$i]->toString();
+        }
+        $result .= "</app-data>";
+        return $result;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/AppData.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Column.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Column.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Column.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,921 @@
+<?php
+/*
+ *  $Id: Column.php 351 2006-03-15 18:42:34Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/database/model/XMLElement.php';
+include_once 'propel/engine/EngineException.php';
+include_once 'propel/engine/database/model/PropelTypes.php';
+include_once 'propel/engine/database/model/Inheritance.php';
+include_once 'propel/engine/database/model/Domain.php';
+
+/**
+ * A Class for holding data about a column used in an Application.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Leon Messerschmidt <leon en opticode.co.za> (Torque)
+ * @author Jason van Zyl <jvanzyl en apache.org> (Torque)
+ * @author Jon S. Stevens <jon en latchkey.com> (Torque)
+ * @author Daniel Rall <dlr en finemaltcoding.com> (Torque)
+ * @author Byron Foster <byron_foster en yahoo.com> (Torque)
+ * @version $Revision: 351 $
+ * @package propel.engine.database.model
+ */
+class Column extends XMLElement {
+
+	const DEFAULT_TYPE = "VARCHAR";
+
+	private $name;
+	private $description;
+	private $phpName = null;
+	private $phpNamingMethod;
+	private $isNotNull = false;
+	private $size;
+
+	/**
+	 * The name to use for the Peer constant that identifies this column.
+	 * (Will be converted to all-uppercase in the templates.)
+	 * @var string
+	 */
+	private $peerName;
+
+	/**
+	 * Type as defined in schema.xml
+	 * @var string
+	 */
+	private $propelType;
+
+	/**
+	 * Type corresponding to Creole type
+	 * @var int
+	 */
+	private $creoleType;
+
+	/**
+	 * Native PHP type
+	 * @var string "string", "boolean", "int", "double"
+	 */
+	private $phpType;
+	private $parentTable;
+	private $position;
+	private $isPrimaryKey = false;
+	private $isNodeKey = false;
+	private $nodeKeySep;
+	private $isUnique = false;
+	private $isAutoIncrement = false;
+	private $isLazyLoad = false;
+	private $defaultValue;
+	private $referrers;
+	// only one type is supported currently, which assumes the
+	// column either contains the classnames or a key to
+	// classnames specified in the schema.  Others may be
+	// supported later.
+	private $inheritanceType;
+	private $isInheritance;
+	private $isEnumeratedClasses;
+	private $inheritanceList;
+	private $needsTransactionInPostgres; //maybe this can be retrieved from vendorSpecificInfo
+
+	/** class name to do input validation on this column */
+	private $inputValidator = null;
+
+	private $domain;
+
+	/**
+	 * Creates a new column and set the name
+	 *
+	 * @param name column name
+	 */
+	public function __construct($name = null)
+	{
+		$this->name = $name;
+	}
+
+	/**
+	 * Return a comma delimited string listing the specified columns.
+	 *
+	 * @param columns Either a list of <code>Column</code> objects, or
+	 * a list of <code>String</code> objects with column names.
+	 * @deprecated Use the DDLBuilder->getColumnList() method instead; this will be removed in 1.3
+	 */
+	public static function makeList($columns, Platform $platform)
+	{
+		$list = array();
+		foreach($columns as $col) {
+			if ($col instanceof Column) {
+				$col = $col->getName();
+			}
+			$list[] = $platform->quoteIdentifier($col);
+		}
+		return implode(", ", $list);
+	}
+
+	/**
+	 * Sets up the Column object based on the attributes that were passed to loadFromXML().
+	 * @see parent::loadFromXML()
+	 */
+	protected function setupObject()
+	{
+		try {
+			$dom = $this->getAttribute("domain");
+			if ($dom)  {
+				$this->domain = new Domain();
+				$this->domain->copy($this->getTable()->getDatabase()->getDomain($dom));
+			} else {
+				$this->domain = new Domain();
+				$this->domain->copy($this->getPlatform()->getDomainForType(self::DEFAULT_TYPE));
+				$this->setType(strtoupper($this->getAttribute("type")));
+			}
+
+			//Name
+			$this->name = $this->getAttribute("name");
+
+			$this->phpName = $this->getAttribute("phpName");
+			$this->phpType = $this->getAttribute("phpType");
+			$this->peerName = $this->getAttribute("peerName");
+
+			if (empty($this->phpType)) {
+				$this->phpType = null;
+			}
+
+			// retrieves the method for converting from specified name to
+			// a PHP name.
+			$this->phpNamingMethod = $this->getAttribute("phpNamingMethod", $this->parentTable->getDatabase()->getDefaultPhpNamingMethod());
+
+			$this->isPrimaryKey = $this->booleanValue($this->getAttribute("primaryKey"));
+
+			$this->isNodeKey = $this->booleanValue($this->getAttribute("nodeKey"));
+			$this->nodeKeySep = $this->getAttribute("nodeKeySep", ".");
+
+			$this->isNotNull = $this->booleanValue($this->getAttribute("required"), false);
+
+			// Regardless of above, if this column is a primary key then it can't be null.
+			if ($this->isPrimaryKey) {
+				$this->isNotNull = true;
+			}
+
+			//AutoIncrement/Sequences
+			$this->isAutoIncrement = $this->booleanValue($this->getAttribute("autoIncrement"));
+			$this->isLazyLoad = $this->booleanValue($this->getAttribute("lazyLoad"));
+
+			//Default column value.
+			$this->domain->replaceDefaultValue($this->getAttribute("default"));
+			$this->domain->replaceSize($this->getAttribute("size"));
+			$this->domain->replaceScale($this->getAttribute("scale"));
+
+			$this->inheritanceType = $this->getAttribute("inheritance");
+			$this->isInheritance = ($this->inheritanceType !== null
+					&& $this->inheritanceType !== "false"); // here we are only checking for 'false', so don't
+															// use boleanValue()
+
+			$this->inputValidator = $this->getAttribute("inputValidator");
+			$this->description = $this->getAttribute("description");
+		} catch (Exception $e) {
+			throw new EngineException("Error setting up column " . var_export($this->getAttribute("name"), true) . ": " . $e->getMessage());
+		}
+	}
+
+	/**
+	 * Gets domain for this column.
+	 * @return Domain
+	 */
+	public function getDomain()
+	{
+		return $this->domain;
+	}
+
+	/**
+	 * Returns table.column
+	 */
+	public function getFullyQualifiedName()
+	{
+		return ($this->parentTable->getName() . '.' . name);
+	}
+
+	/**
+	 * Get the name of the column
+	 */
+	public function getName()
+	{
+		return $this->name;
+	}
+
+	/**
+	 * Set the name of the column
+	 */
+	public function setName($newName)
+	{
+		$this->name = $newName;
+	}
+
+	/**
+	 * Get the description for the Table
+	 */
+	public function getDescription()
+	{
+		return $this->description;
+	}
+
+	/**
+	 * Set the description for the Table
+	 *
+	 * @param newDescription description for the Table
+	 */
+	public function setDescription($newDescription)
+	{
+		$this->description = $newDescription;
+	}
+
+	/**
+	 * Get name to use in PHP sources
+	 * @return string
+	 */
+	public function getPhpName()
+	{
+		if ($this->phpName === null) {
+			$inputs = array();
+			$inputs[] = $this->name;
+			$inputs[] = $this->phpNamingMethod;
+			try {
+				$this->phpName = NameFactory::generateName(NameFactory::PHP_GENERATOR, $inputs);
+			} catch (EngineException $e) {
+				print $e->getMessage() . "\n";
+				print $e->getTraceAsString();
+			}
+		}
+		return $this->phpName;
+	}
+
+	/**
+	 * Set name to use in PHP sources
+	 */
+	public function setPhpName($phpName)
+	{
+		$this->phpName = $phpName;
+	}
+
+	/**
+	 * Get the Peer constant name that will identify this column.
+	 * @return string
+	 */
+	public function getPeerName() {
+		return $this->peerName;
+	}
+
+	/**
+	 * Set the Peer constant name that will identify this column.
+	 * @param $name string
+	 */
+	public function setPeerName($name) {
+		$this->peerName = $name;
+	}
+
+	/**
+	 * Get type to use in PHP sources.
+	 * If no type has been specified, then uses results
+	 * of getPhpNative().
+	 *
+	 * The distinction between getPhpType() and getPhpNative()
+	 * is not as salient in PHP as it is in Java, but we'd like to leave open the
+	 * option of specifying complex types (objects) in the schema.  While we can
+	 * always cast to PHP native types, we can't cast objects (in PHP) -- hence the
+	 * importance of maintaining this distinction.
+	 *
+	 * @return string The type name.
+	 * @see getPhpNative()
+	 */
+	public function getPhpType()
+	{
+		if ($this->phpType !== null) {
+			return $this->phpType;
+		}
+		return $this->getPhpNative();
+	}
+
+	/**
+	 * Get the location of this column within the table (one-based).
+	 * @return int value of position.
+	 */
+	public function getPosition()
+	{
+		return $this->position;
+	}
+
+	/**
+	 * Get the location of this column within the table (one-based).
+	 * @param int $v Value to assign to position.
+	 */
+	public function setPosition($v)
+	{
+		$this->position = $v;
+	}
+
+	/**
+	 * Set the parent Table of the column
+	 */
+	public function setTable(Table $parent)
+	{
+		$this->parentTable = $parent;
+	}
+
+	/**
+	 * Get the parent Table of the column
+	 */
+	public function getTable()
+	{
+		return $this->parentTable;
+	}
+
+	/**
+	 * Returns the Name of the table the column is in
+	 */
+	public function getTableName()
+	{
+		return $this->parentTable->getName();
+	}
+
+	/**
+	 * Adds a new inheritance definition to the inheritance list and set the
+	 * parent column of the inheritance to the current column
+	 * @param mixed $inhdata Inheritance or XML data.
+	 */
+	public function addInheritance($inhdata)
+	{
+		if ($inhdata instanceof Inheritance) {
+			$inh = $inhdata;
+			$inh->setColumn($this);
+			if ($this->inheritanceList === null) {
+				$this->inheritanceList = array();
+				$this->isEnumeratedClasses = true;
+			}
+			$this->inheritanceList[] = $inh;
+			return $inh;
+		} else {
+			$inh = new Inheritance();
+			$inh->loadFromXML($inhdata);
+			return $this->addInheritance($inh);
+		}
+	}
+
+	/**
+	 * Get the inheritance definitions.
+	 */
+	public function getChildren()
+	{
+		return $this->inheritanceList;
+	}
+
+	/**
+	 * Determine if this column is a normal property or specifies a
+	 * the classes that are represented in the table containing this column.
+	 */
+	public function isInheritance()
+	{
+		return $this->isInheritance;
+	}
+
+	/**
+	 * Determine if possible classes have been enumerated in the xml file.
+	 */
+	public function isEnumeratedClasses()
+	{
+		return $this->isEnumeratedClasses;
+	}
+
+	/**
+	 * Return the isNotNull property of the column
+	 */
+	public function isNotNull()
+	{
+		return $this->isNotNull;
+	}
+
+	/**
+	 * Set the isNotNull property of the column
+	 */
+	public function setNotNull($status)
+	{
+		$this->isNotNull = (boolean) $status;
+	}
+
+	 /**
+	  * Return NOT NULL String for this column
+	  *
+	  * @return "NOT NULL" if null values are not allowed or an empty string.
+	  */
+	public function getNotNullString()
+	{
+		return $this->getTable()->getDatabase()->getPlatform()->getNullString($this->isNotNull());
+	}
+
+	/**
+	 * Set if the column is a primary key or not
+	 */
+	public function setPrimaryKey($pk)
+	{
+		$this->isPrimaryKey = (boolean) $pk;
+	}
+
+	/**
+	 * Return true if the column is a primary key
+	 */
+	public function isPrimaryKey()
+	{
+		return $this->isPrimaryKey;
+	}
+
+	/**
+	 * Set if the column is the node key of a tree
+	 */
+	public function setNodeKey($nk)
+	{
+		$this->isNodeKey = (boolean) $nk;
+	}
+
+	/**
+	 * Return true if the column is a node key of a tree
+	 */
+	public function isNodeKey()
+	{
+		return $this->isNodeKey;
+	}
+
+	/**
+	 * Set if the column is the node key of a tree
+	 */
+	public function setNodeKeySep($sep)
+	{
+		$this->nodeKeySep = (string) $sep;
+	}
+
+	/**
+	 * Return true if the column is a node key of a tree
+	 */
+	public function getNodeKeySep()
+	{
+		return $this->nodeKeySep;
+	}
+
+	/**
+	 * Set true if the column is UNIQUE
+	 */
+	public function setUnique($u)
+	{
+		$this->isUnique = $u;
+	}
+
+	/**
+	 * Get the UNIQUE property
+	 */
+	public function isUnique()
+	{
+		return $this->isUnique;
+	}
+
+	/**
+	 * Return true if the column requires a transaction in Postgres
+	 */
+	public function requiresTransactionInPostgres()
+	{
+		return $this->needsTransactionInPostgres;
+	}
+
+	/**
+	 * Utility method to determine if this column is a foreign key.
+	 */
+	public function isForeignKey()
+	{
+		return ($this->getForeignKey() !== null);
+	}
+
+	/**
+	 * Determine if this column is a foreign key that refers to the
+	 * same table as another foreign key column in this table.
+	 */
+	public function isMultipleFK()
+	{
+		$fk = $this->getForeignKey();
+		if ($fk !== null) {
+			$fks = $this->parentTable->getForeignKeys();
+			for ($i=0, $len=count($fks); $i < $len; $i++) {
+				if ($fks[$i]->getForeignTableName() === $fk->getForeignTableName()
+				&& !in_array($this->name, $fks[$i]->getLocalColumns()) ) {
+					return true;
+				}
+			}
+		}
+
+		// No multiple foreign keys.
+		return false;
+	}
+
+	/**
+	 * get the foreign key object for this column
+	 * if it is a foreign key or part of a foreign key
+	 */
+	public function getForeignKey()
+	{
+		return $this->parentTable->getForeignKey($this->name);
+	}
+
+	/**
+	 * Utility method to get the related table of this column if it is a foreign
+	 * key or part of a foreign key
+	 */
+	public function getRelatedTableName()
+	{
+		$fk = $this->getForeignKey();
+		return ($fk === null ? null : $fk->getForeignTableName());
+	}
+
+
+	/**
+	 * Utility method to get the related column of this local column if this
+	 * column is a foreign key or part of a foreign key.
+	 */
+	public function getRelatedColumnName()
+	{
+		$fk = $this->getForeignKey();
+		if ($fk === null) {
+			return null;
+		} else {
+			$m = $fk->getLocalForeignMapping();
+			$c = @$m[$this->name];
+			if ($c === null) {
+				return null;
+			} else {
+				return $c;
+			}
+		}
+	}
+
+	/**
+	 * Adds the foreign key from another table that refers to this column.
+	 */
+	public function addReferrer(ForeignKey $fk)
+	{
+		if ($this->referrers === null) {
+			$this->referrers = array();
+		}
+		$this->referrers[] = $fk;
+	}
+
+	/**
+	 * Get list of references to this column.
+	 */
+	public function getReferrers()
+	{
+		if ($this->referrers === null) {
+			$this->referrers = array();
+		}
+		return $this->referrers;
+	}
+
+	/**
+	 * Returns the colunm type
+	 */
+	public function setType($propelType)
+	{
+		$this->domain = new Domain();
+		$this->domain->copy($this->getPlatform()->getDomainForType($propelType));
+
+		$this->propelType = $propelType;
+		if ($propelType == PropelTypes::VARBINARY|| $propelType == PropelTypes::LONGVARBINARY || $propelType == PropelTypes::BLOB) {
+			$this->needsTransactionInPostgres = true;
+		}
+	}
+
+	/**
+	 * Returns the column Creole type as a string.
+	 * @return string The constant representing Creole type: e.g. "VARCHAR".
+	 */
+	public function getType()
+	{
+		return PropelTypes::getCreoleType($this->propelType);
+	}
+
+	/**
+	 * Returns the column type as given in the schema as an object
+	 */
+	public function getPropelType()
+	{
+		return $this->propelType;
+	}
+
+	/**
+	 * Utility method to know whether column needs Blob/Lob handling.
+	 * @return boolean
+	 */
+	public function isLob()
+	{
+		return PropelTypes::isLobType($this->propelType);
+	}
+
+	/**
+	 * Utility method to see if the column is a string
+	 */
+	public function isString()
+	{
+		return PropelTypes::isTextxType($this->propelType);
+	}
+
+	/**
+	 * String representation of the column. This is an xml representation.
+	 */
+	public function toString()
+	{
+		$result = "	<column name=\"" . $this->name . '"';
+		if ($this->phpName !== null) {
+			$result .= " phpName=\"" . $this->phpName . '"';
+		}
+		if ($this->isPrimaryKey) {
+			$result .= " primaryKey=\"" . ($this->isPrimaryKey ? "true" : "false"). '"';
+		}
+
+		if ($this->isNotNull) {
+			$result .= " required=\"true\"";
+		} else {
+			$result .= " required=\"false\"";
+		}
+
+		$result .= " type=\"" . $this->propelType . '"';
+
+		if ($this->domain->getSize() !== null) {
+			$result .= " size=\"" . $this->domain->getSize() . '"';
+		}
+
+		if ($this->domain->getScale() !== null) {
+			$result .= " scale=\"" . $this->domain->getScale() . '"';
+		}
+
+		if ($this->domain->getDefaultValue() !== null) {
+			$result .= " default=\"" . $this->domain->getDefaultValue() . '"';
+		}
+
+		if ($this->isInheritance()) {
+			$result .= " inheritance=\"" . $this->inheritanceType
+				. '"';
+		}
+
+        if ($this->isNodeKey()) {
+                $result .= " nodeKey=\"true\"";
+                if ($this->getNodeKeySep() !== null) {
+                        $result .= " nodeKeySep=\"" . $this->nodeKeySep . '"';
+                }
+        }
+
+		// Close the column.
+		$result .= " />\n";
+
+		return $result;
+	}
+
+	/**
+	 * Returns the size of the column
+	 * @return string
+	 */
+	public function getSize()
+	{
+		return $this->domain->getSize();
+	}
+
+	/**
+	 * Set the size of the column
+	 * @param string $newSize
+	 */
+	public function setSize($newSize)
+	{
+		$this->domain->setSize($newSize);
+	}
+
+	/**
+	 * Returns the scale of the column
+	 * @return string
+	 */
+	public function getScale()
+	{
+		return $this->domain->getScale();
+	}
+
+	/**
+	 * Set the scale of the column
+	 * @param string $newScale
+	 */
+	public function setScale($newScale)
+	{
+		$this->domain->setScale($newScale);
+	}
+
+	/**
+	 * Return the size in brackets for use in an sql
+	 * schema if the type is String.  Otherwise return an empty string
+	 */
+	public function printSize()
+	{
+		return $this->domain->printSize();
+	}
+
+	/**
+	 * Return a string that will give this column a default value.
+	 * @return string
+	 */
+	 public function getDefaultSetting()
+	 {
+		$dflt = "";
+		if ($this->getDefaultValue() !== null) {
+			$dflt .= "default ";
+			if (PropelTypes::isTextType($this->getType())) {
+				$dflt .= '\'' . $this->getPlatform()->escapeText($this->getDefaultValue()) . '\'';
+			} elseif ($this->getType() == PropelTypes::BOOLEAN) {
+				$dflt .= $this->getPlatform()->getBooleanString($this->getDefaultValue());
+			} else {
+				$dflt .= $this->getDefaultValue();
+			}
+		}
+		return $dflt;
+	 }
+
+	/**
+	 * Set a string that will give this column a default value.
+	 */
+	public function setDefaultValue($def)
+	{
+		$this->domain->setDefaultValue($def);
+	}
+
+	/**
+	 * Get the raw string that will give this column a default value.
+	 * @return string
+	 * @see Domain::getDefaultValue()
+	 */
+	public function getDefaultValue()
+	{
+		return $this->domain->getDefaultValue();
+	}
+
+	/**
+	 * Get the default value suitable for use in PHP.
+	 * @return mixed
+	 * @see Domain::getPhpDefaultValue()
+	 */
+	public function getPhpDefaultValue()
+	{
+		return $this->domain->getPhpDefaultValue();
+	}
+
+	/**
+	 * Returns the class name to do input validation
+	 */
+	public function getInputValidator()
+	{
+	   return $this->inputValidator;
+	}
+
+	/**
+	 * Return auto increment/sequence string for the target database. We need to
+	 * pass in the props for the target database!
+	 */
+	public function isAutoIncrement()
+	{
+		return $this->isAutoIncrement;
+	}
+
+	/**
+	 * Return auto increment/sequence string for the target database. We need to
+	 * pass in the props for the target database!
+	 */
+	public function isLazyLoad()
+	{
+		return $this->isLazyLoad;
+	}
+
+	/**
+	 * Gets the auto-increment string.
+	 * @return string
+	 */
+	public function getAutoIncrementString()
+	{
+		if ($this->isAutoIncrement()&& IDMethod::NATIVE === $this->getTable()->getIdMethod()) {
+			return $this->getPlatform()->getAutoIncrement();
+		} elseif ($this->isAutoIncrement()) {
+			throw new EngineException("You have specified autoIncrement for column '" . $this->name . "' but you have not specified idMethod=\"native\" for table '" . $this->getTable()->getName() . "'.");
+		}
+		return "";
+	}
+
+	/**
+	 * Set the auto increment value.
+	 * Use isAutoIncrement() to find out if it is set or not.
+	 */
+	public function setAutoIncrement($value)
+	{
+		$this->isAutoIncrement = (boolean) $value;
+	}
+
+	/**
+	 * Set the column type from a string property
+	 * (normally a string from an sql input file)
+	 */
+	public function setTypeFromString($typeName, $size)
+	{
+		$tn = strtoupper($typeName);
+		$this->setType($tn);
+
+		if ($size !== null) {
+			$this->size = $size;
+		}
+
+		if (strpos($tn, "CHAR") !== false) {
+			$this->domain->setType(PropelTypes::VARCHAR);
+		} elseif (strpos($tn, "INT") !== false) {
+			$this->domain->setType(PropelTypes::INTEGER);
+		} elseif (strpos($tn, "FLOAT") !== false) {
+			$this->domain->setType(PropelTypes::FLOAT);
+		} elseif (strpos($tn, "DATE") !== false) {
+			$this->domain->setType(PropelTypes::DATE);
+		} elseif (strpos($tn, "TIME") !== false) {
+			$this->domain->setType(PropelTypes::TIMESTAMP);
+		} else if (strpos($tn, "BINARY") !== false) {
+			$this->domain->setType(PropelTypes::LONGVARBINARY);
+		} else {
+			$this->domain->setType(PropelTypes::VARCHAR);
+		}
+	}
+
+	/**
+	 * Return a string representation of the native PHP type which corresponds
+	 * to the Creole type of this column. Use in the generation of Base objects.
+	 *
+	 * @return string PHP datatype used by propel.
+	 */
+	public function getPhpNative()
+	{
+		return PropelTypes::getPHPNative($this->propelType);
+	}
+
+	/**
+	 * Returns true if the column's PHP native type is an
+	 * boolean, int, long, float, double, string
+	 */
+	public function isPrimitive()
+	{
+		$t = $this->getPhpNative();
+		return in_array($t, array("boolean", "int", "double", "string"));
+	}
+
+  /**
+   * Return true if column's PHP native type is an
+   * boolean, int, long, float, double
+   */
+  public function isPrimitiveNumeric()
+  {
+	$t = $this->getPhpNative();
+	return in_array($t, array("boolean", "int", "double"));
+  }
+
+	/**
+	 * Get the platform/adapter impl.
+	 *
+	 * @return Platform
+	 */
+	public function getPlatform()
+	{
+		return $this->getTable()->getDatabase()->getPlatform();
+	}
+
+	/**
+	 *
+	 * @return string
+	 * @deprecated Use DDLBuilder->getColumnDDL() instead; this will be removed in 1.3
+	 */
+	public function getSqlString()
+	{
+		$sb = "";
+		$sb .= $this->getPlatform()->quoteIdentifier($this->getName()) . " ";
+		$sb .= $this->getDomain()->getSqlType();
+		if ($this->getPlatform()->hasSize($this->getDomain()->getSqlType())) {
+			$sb .= $this->getDomain()->printSize();
+		}
+		$sb .= " ";
+		$sb .= $this->getDefaultSetting() . " ";
+		$sb .= $this->getNotNullString() . " ";
+		$sb .= $this->getAutoIncrementString();
+		return trim($sb);
+	}
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Column.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/ConstraintNameGenerator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/ConstraintNameGenerator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/ConstraintNameGenerator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ *  $Id: ConstraintNameGenerator.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+ 
+/**
+ * A <code>NameGenerator</code> implementation for table-specific
+ * constraints.  Conforms to the maximum column name length for the
+ * type of database in use.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Daniel Rall <dlr en finemaltcoding.com> (Torque)
+ * @version $Revision: 64 $
+ * @package propel.engine.database.model
+ */
+class ConstraintNameGenerator implements NameGenerator {
+    /**
+     * Conditional compilation flag.
+     */
+    const DEBUG = false;
+
+    /**
+     * First element of <code>inputs</code> should be of type {@link Database}, second
+     * should be a table name, third is the type identifier (spared if
+     * trimming is necessary due to database type length constraints),
+     * and the fourth is a <code>Integer</code> indicating the number
+     * of this contraint.
+     *
+     * @see NameGenerator
+     * @throws EngineException
+     */
+    public function generateName($inputs) 
+    {
+
+        $db = $inputs[0];
+        $name = $inputs[1];
+        $namePostfix = $inputs[2];
+        $constraintNbr = (string) $inputs[3];
+
+        // Calculate maximum RDBMS-specific column character limit.
+        $maxBodyLength = -1;
+        try {
+            $maxColumnNameLength = (int) $db->getPlatform()->getMaxColumnNameLength();
+            $maxBodyLength = ($maxColumnNameLength - strlen($namePostfix)
+                    - strlen($constraintNbr) - 2);
+
+            if (self::DEBUG) {
+                print("maxColumnNameLength=" . $maxColumnNameLength
+                        . " maxBodyLength=" . $maxBodyLength . "\n");
+            }
+        } catch (EngineException $e) {                
+            echo $e;            
+            throw $e;
+        }
+
+        // Do any necessary trimming.
+        if ($maxBodyLength !== -1 && strlen($name) > $maxBodyLength) {
+            $name = substr($name, 0, $maxBodyLength);
+        }
+
+        $name .= self::STD_SEPARATOR_CHAR . $namePostfix
+            . self::STD_SEPARATOR_CHAR . $constraintNbr;
+
+        return $name;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/ConstraintNameGenerator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Database.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Database.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Database.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,460 @@
+<?php
+
+/*
+ *  $Id: Database.php 315 2005-12-24 20:48:31Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+require_once 'propel/engine/database/model/XMLElement.php';
+include_once 'propel/engine/database/model/IDMethod.php';
+include_once 'propel/engine/database/model/NameGenerator.php';
+include_once 'propel/engine/database/model/Table.php';
+
+/**
+ * A class for holding application data structures.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Leon Messerschmidt <leon en opticode.co.za> (Torque)
+ * @author John McNally<jmcnally en collab.net> (Torque)
+ * @author Martin Poeschl<mpoeschl en marmot.at> (Torque)
+ * @author Daniel Rall<dlr en collab.net> (Torque)
+ * @author Byron Foster <byron_foster en yahoo.com> (Torque)
+ * @version $Revision: 315 $
+ * @package propel.engine.database.model
+ */
+class Database extends XMLElement {
+
+	private $platform;
+    private $tableList = array();
+    private $curColumn;
+    private $name;
+    private $pkg;
+    private $baseClass;
+    private $basePeer;
+    private $defaultIdMethod;
+    private $defaultPhpType;
+    private $defaultPhpNamingMethod;
+    private $defaultTranslateMethod;
+    private $dbParent;
+    private $tablesByName = array();
+    private $tablesByPhpName = array();
+    private $heavyIndexing;
+
+    private $domainMap = array();
+
+    /**
+     * Sets up the Database object based on the attributes that were passed to loadFromXML().
+	 * @see parent::loadFromXML()
+     */
+    protected function setupObject()
+    {
+        $this->name = $this->getAttribute("name");
+        $this->pkg = $this->getAttribute("package");
+        $this->baseClass = $this->getAttribute("baseClass");
+        $this->basePeer = $this->getAttribute("basePeer");
+        $this->defaultPhpType = $this->getAttribute("defaultPhpType");
+        $this->defaultIdMethod = $this->getAttribute("defaultIdMethod");
+        $this->defaultPhpNamingMethod = $this->getAttribute("defaultPhpNamingMethod", NameGenerator::CONV_METHOD_UNDERSCORE);
+        $this->defaultTranslateMethod = $this->getAttribute("defaultTranslateMethod", Validator::TRANSLATE_NONE);
+        $this->heavyIndexing = $this->booleanValue($this->getAttribute("heavyIndexing"));
+    }
+
+    /**
+     * Returns the Platform implementation for this database.
+     *
+     * @return Platform a Platform implementation
+     */
+    public function getPlatform()
+    {
+        return $this->platform;
+    }
+
+    /**
+     * Sets the Platform implementation for this database.
+     *
+     * @param Platform $platform A Platform implementation
+     */
+    public function setPlatform($platform)
+    {
+        $this->platform = $platform;
+    }
+
+    /**
+     * Get the name of the Database
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Set the name of the Database
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * Get the value of package.
+     * @return value of package.
+     */
+    public function getPackage()
+    {
+        return $this->pkg;
+    }
+
+    /**
+     * Set the value of package.
+     * @param v  Value to assign to package.
+     */
+    public function setPackage($v)
+    {
+        $this->pkg = $v;
+    }
+
+    /**
+     * Get the value of baseClass.
+     * @return value of baseClass.
+     */
+    public function getBaseClass()
+    {
+        return $this->baseClass;
+    }
+
+    /**
+     * Set the value of baseClass.
+     * @param v  Value to assign to baseClass.
+     */
+    public function setBaseClass($v)
+    {
+        $this->baseClass = $v;
+    }
+
+    /**
+     * Get the value of basePeer.
+     * @return value of basePeer.
+     */
+    public function getBasePeer()
+    {
+        return $this->basePeer;
+    }
+
+    /**
+     * Set the value of basePeer.
+     * @param v Value to assign to basePeer.
+     */
+    public function setBasePeer($v)
+    {
+        $this->basePeer = $v;
+    }
+
+    /**
+     * Get the value of defaultIdMethod.
+     * @return value of defaultIdMethod.
+     */
+    public function getDefaultIdMethod()
+    {
+        return $this->defaultIdMethod;
+    }
+
+    /**
+     * Set the value of defaultIdMethod.
+     * @param v Value to assign to defaultIdMethod.
+     */
+    public function setDefaultIdMethod($v)
+    {
+        $this->defaultIdMethod = $v;
+    }
+
+    /**
+     * Get the value of defaultPHPNamingMethod which specifies the
+     * method for converting schema names for table and column to PHP names.
+     * @return string The default naming conversion used by this database.
+     */
+    public function getDefaultPhpNamingMethod()
+    {
+        return $this->defaultPhpNamingMethod;
+    }
+
+    /**
+     * Set the value of defaultPHPNamingMethod.
+     * @param string $v The default naming conversion for this database to use.
+     */
+    public function setDefaultPhpNamingMethod($v)
+    {
+        $this->defaultPhpNamingMethod = $v;
+    }
+
+    /**
+     * Get the value of defaultTranslateMethod which specifies the
+     * method for translate validator error messages.
+     * @return string The default translate method.
+     */
+    public function getDefaultTranslateMethod()
+    {
+        return $this->defaultTranslateMethod;
+    }
+
+    /**
+     * Set the value of defaultTranslateMethod.
+     * @param string $v The default translate method to use.
+     */
+    public function setDefaultTranslateMethod($v)
+    {
+        $this->defaultTranslateMethod = $v;
+    }
+
+    /**
+     * Get the value of heavyIndexing.
+     * @return boolean Value of heavyIndexing.
+     */
+    public function isHeavyIndexing()
+    {
+        return $this->heavyIndexing;
+    }
+
+    /**
+     * Set the value of heavyIndexing.
+     * @param boolean $v  Value to assign to heavyIndexing.
+     */
+    public function setHeavyIndexing($v)
+    {
+        $this->heavyIndexing = (boolean) $v;
+    }
+
+    /**
+     * Return an array of all tables
+     */
+    public function getTables()
+    {
+        return $this->tableList;
+    }
+
+    /**
+     * Return the table with the specified name.
+	 * @param string $name The name of the table (e.g. 'my_table')
+     * @return Table a Table object or null if it doesn't exist
+     */
+    public function getTable($name)
+    {
+		if (isset($this->tablesByName[$name])) {
+		    return $this->tablesByName[$name];
+		}
+		return null; // just to be explicit
+    }
+
+    /**
+     * Return the table with the specified phpName.
+	 * @param string $phpName the PHP Name of the table (e.g. 'MyTable')
+     * @return Table a Table object or null if it doesn't exist
+     */
+    public function getTableByPhpName($phpName)
+    {
+		if (isset($this->tablesByPhpName[$phpName])) {
+		    return $this->tablesByPhpName[$phpName];
+		}
+        return null; // just to be explicit
+    }
+
+    /**
+     * An utility method to add a new table from an xml attribute.
+     */
+    public function addTable($data)
+    {
+        if ($data instanceof Table) {
+            $tbl = $data; // alias
+            $tbl->setDatabase($this);
+            $this->tableList[] = $tbl;
+            $this->tablesByName[ $tbl->getName() ] = $tbl;
+            $this->tablesByPhpName[ $tbl->getPhpName() ] = $tbl;
+            if ($tbl->getPackage() === null) {
+                $tbl->setPackage($this->getPackage());
+            }
+            return $tbl;
+        } else {
+            $tbl = new Table();
+            $tbl->setDatabase($this);
+            $tbl->loadFromXML($data);
+            return $this->addTable($tbl); // call self w/ different param
+        }
+    }
+
+    /**
+     * Set the parent of the database
+     */
+    public function setAppData(AppData $parent)
+    {
+        $this->dbParent = $parent;
+    }
+
+    /**
+     * Get the parent of the table
+     */
+    public function getAppData()
+    {
+        return $this->dbParent;
+    }
+	
+	/**
+	 * Adds Domain object from <domain> tag.
+	 * @param mixed XML attributes (array) or Domain object.
+	 */
+    public function addDomain($data) {
+	
+		if ($data instanceof Domain) {
+            $domain = $data; // alias
+            $domain->setDatabase($this);
+            $this->domainMap[ $domain->getName() ] = $domain;
+            return $domain;
+        } else {
+            $domain = new Table();
+            $domain->setDatabase($this);
+            $domain->loadFromXML($data);
+            return $this->addDomain($domain); // call self w/ different param
+        }
+    }
+	
+	/**
+	 * Get already configured Domain object by name.
+	 * @return Domain
+	 */
+    public function getDomain($domainName) {
+        if (!isset($this->domainMap[$domainName])) {
+            return null;
+        }
+        return $this->domainMap[$domainName];
+    }
+
+    public function doFinalInitialization()
+    {
+        $tables = $this->getTables();
+
+        for($i=0,$size=count($tables); $i < $size; $i++) {
+            $currTable = $tables[$i];
+
+            // check schema integrity
+            // if idMethod="autoincrement", make sure a column is
+            // specified as autoIncrement="true"
+            // FIXME: Handle idMethod="native" via DB adapter.
+            /*
+
+             --- REMOVING THIS BECAUSE IT'S ANNOYING
+
+            if ($currTable->getIdMethod() == IDMethod::NATIVE ) {
+                $columns = $currTable->getColumns();
+                $foundOne = false;
+                for ($j=0, $cLen=count($columns); $j < $cLen && !$foundOne; $j++) {
+                    $foundOne = $columns[$j]->isAutoIncrement();
+                }
+
+                if (!$foundOne) {
+                    $errorMessage = "Table '" . $currTable->getName()
+                            . "' is set to use native id generation, but it does not "
+                            . "have a column which declared as the one to "
+                            . "auto increment (i.e. autoIncrement=\"true\")";
+
+                    throw new BuildException($errorMessage);
+                }
+            }
+            */
+
+            $currTable->doFinalInitialization();
+
+            // setup reverse fk relations
+            $fks = $currTable->getForeignKeys();
+            for ($j=0, $fksLen=count($fks); $j < $fksLen; $j++) {
+                $currFK = $fks[$j];
+                $foreignTable = $this->getTable($currFK->getForeignTableName());
+                if ($foreignTable === null) {
+                    throw new BuildException("ERROR!! Attempt to set foreign"
+                            . " key to nonexistent table, "
+                            . $currFK->getForeignTableName() . "!");
+                }
+
+                $referrers = $foreignTable->getReferrers();
+                if ($referrers === null || ! in_array($currFK,$referrers) ) {
+                    $foreignTable->addReferrer($currFK);
+                }
+
+                // local column references
+                $localColumnNames = $currFK->getLocalColumns();
+
+                for($k=0,$lcnLen=count($localColumnNames); $k < $lcnLen; $k++) {
+
+                    $local = $currTable->getColumn($localColumnNames[$k]);
+
+                    // give notice of a schema inconsistency.
+                    // note we do not prevent the npe as there is nothing
+                    // that we can do, if it is to occur.
+                    if ($local === null) {
+                        throw new BuildException("ERROR!! Attempt to define foreign"
+                                . " key with nonexistent column, "
+                                . $localColumnNames[$k] . ", in table, "
+                                . $currTable->getName() . "!");
+                    }
+
+                    //check for foreign pk's
+                    if ($local->isPrimaryKey()) {
+                        $currTable->setContainsForeignPK(true);
+                    }
+
+                } // for each local col name
+
+                // foreign column references
+                $foreignColumnNames = $currFK->getForeignColumns();
+                for($k=0,$fcnLen=count($localColumnNames); $k < $fcnLen; $k++) {
+                    $foreign = $foreignTable->getColumn($foreignColumnNames[$k]);
+                    // if the foreign column does not exist, we may have an
+                    // external reference or a misspelling
+                    if ($foreign === null) {
+                        throw new BuildException("ERROR!! Attempt to set foreign"
+                                . " key to nonexistent column, "
+                                . $foreignColumnNames[$k] . ", in table, "
+                                . $foreignTable->getName() . "!");
+                    } else {
+                        $foreign->addReferrer($currFK);
+                    }
+                } // for each foreign col ref
+            }
+        }
+    }
+
+    /**
+     * Creats a string representation of this Database.
+     * The representation is given in xml format.
+     */
+    public function toString()
+    {
+        $result = "<database name=\"" . $this->getName() . '"'
+            . " package=\"" . $this->getPackage() . '"'
+            . " defaultIdMethod=\"" . $this->getDefaultIdMethod()
+            . '"'
+            . " baseClass=\"" . $this->getBaseClass() . '"'
+            . " basePeer=\"" . $this->getBasePeer() . '"'
+            . ">\n";
+
+        for ($i=0, $size=count($this->tableList); $i < $size; $i++) {
+            $result .= $this->tableList[$i]->toString();
+        }
+
+        $result .= "</database>";
+
+        return $result;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Database.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Domain.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Domain.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Domain.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,313 @@
+<?php
+/*
+ *  $Id: Domain.php 289 2005-11-27 19:13:01Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/database/model/XMLElement.php';
+ 
+/**
+ * A Class for holding data about a column used in an Application.
+ *
+ * @author  Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author  Martin Poeschl <mpoeschl en marmot.at> (Torque)
+ * @version $Revision: 289 $
+ * @package propel.engine.database.model
+ */
+class Domain extends XMLElement {
+
+    private $name;
+    private $description;
+    private $size;
+    private $scale;
+    
+    /** type as defined in schema.xml */
+    private $propelType;
+    private $sqlType;
+    private $defaultValue;          
+    
+	/** Database object -- in the event this Domain is specified in the XML. */
+	private $database;
+	
+    /**
+     * Creates a new Domain object.
+     * If this domain needs a name, it must be specified manually.
+     * 
+     * @param string $type Propel type.
+     * @param string $sqlType SQL type.
+     * @param string $size
+     * @param string $scale
+     */
+    public function __construct($type = null, $sqlType = null, $size = null, $scale = null)
+    {
+        $this->propelType = $type;
+        $this->sqlType = ($sqlType !== null) ? $sqlType : $type;
+        $this->size = $size;
+        $this->scale = $scale;
+    }
+
+    public function copy(Domain $domain)
+    {
+        $this->defaultValue = $domain->getDefaultValue();
+        $this->description = $domain->getDescription();
+        $this->name = $domain->getName();
+        $this->scale = $domain->getScale();
+        $this->size = $domain->getSize();
+        $this->sqlType = $domain->getSqlType();
+        $this->propelType = $domain->getType();
+    }
+       
+   /**
+     * Sets up the Domain object based on the attributes that were passed to loadFromXML().
+	 * @see parent::loadFromXML()
+     */
+    protected function setupObject()
+    {    
+        $schemaType = strtoupper($this->getAttribute("type"));
+        $this->copy($this->getDatabase()->getPlatform()->getDomainForType($schemaType));
+        
+        //Name
+        $this->name = $this->getAttribute("name");
+        
+        //Default column value.
+        $this->defaultValue = $this->getAttribute("default"); // may need to adjust -- e.g. for boolean values        
+        
+        $this->size = $this->getAttribute("size");
+        $this->scale = $this->getAttribute("scale");
+        $this->description = $this->getAttribute("description");
+    }
+	
+	/**
+	 * Sets the owning database object (if this domain is being setup via XML).
+	 */
+	public function setDatabase(Database $database) {
+		$this->database = $database;
+	}
+	
+	/**
+	 * Gets the owning database object (if this domain was setup via XML).
+	 */
+	public function getDatabase() {
+		return $this->database;
+	}
+
+    /**
+     * @return Returns the description.
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+
+    /**
+     * @param description The description to set.
+     */
+    public function setDescription($description)
+    {
+        $this->description = $description;
+    }
+
+    /**
+     * @return Returns the name.
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * @param name The name to set.
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * @return Returns the scale.
+     */
+    public function getScale()
+    {
+        return $this->scale;
+    }
+
+    /**
+     * @param scale The scale to set.
+     */
+    public function setScale($scale)
+    {
+        $this->scale = $scale;
+    }
+    
+    /**
+     * Replaces the size if the new value is not null.
+     * 
+     * @param value The size to set.
+     */
+    public function replaceScale($value)
+    {
+        if ($value !== null) {
+            $this->scale = $value;
+        }
+    }
+
+    /**
+     * @return Returns the size.
+     */
+    public function getSize()
+    {
+        return $this->size;
+    }
+
+    /**
+     * @param size The size to set.
+     */
+    public function setSize($size)
+    {
+        $this->size = $size;
+    }
+    
+    /**
+     * Replaces the size if the new value is not null.
+     * 
+     * @param value The size to set.
+     */
+    public function replaceSize($value)
+    {
+        if ($value !== null) {
+            $this->size = $value;
+        }
+    }
+
+    /**
+     * @return string Returns the propelType.
+     */
+    public function getType()
+    {
+        return $this->propelType;
+    }
+
+    /**
+     * @param string $propelType The PropelTypes type to set.
+     */
+    public function setType($propelType)
+    {
+        $this->propelType = $propelType;
+    }  
+    
+    /**
+     * Replaces the default value if the new value is not null.
+     * 
+     * @param value The defaultValue to set.
+     */
+    public function replaceType($value)
+    {
+        if ($value !== null) {
+            $this->propelType = $value;
+        }       
+    }
+    
+    /**
+	 * Gets the "raw" default value, suitable for use in SQL.
+     * @return string Returns the defaultValue.
+     */
+    public function getDefaultValue()
+    {
+		if ($this->defaultValue !== null) {
+			return $this->defaultValue;
+		}
+    }
+    
+	/**
+	 * Gets the default value, type-casted for use in PHP OM.
+	 * @return mixed
+	 * @see getDefaultValue()
+	 */
+	public function getPhpDefaultValue()
+	{
+		if ($this->defaultValue === null) {
+			return null;
+		} elseif ($this->propelType === PropelTypes::BOOLEAN) {
+			// convert "true" => TRUE
+            return $this->booleanValue($this->defaultValue);
+		} elseif ($this->propelType === PropelTypes::DATE || $this->propelType === PropelTypes::TIME || $this->propelType === PropelTypes::TIMESTAMP) {
+			// DATE/TIME vals need to be converted to integer timestamp
+			$ts = strtotime($this->defaultValue);
+			if ($ts === -1 || $ts === false) { // in PHP 5.1 return value changes to FALSE
+				throw new EngineException("Unable to parse default value as date/time value: " . var_export($this->defaultValue, true));
+			}
+			return $ts;
+		} else {
+			return $this->defaultValue;
+		}
+	}
+	
+    /**
+     * @param defaultValue The defaultValue to set.
+     */
+    public function setDefaultValue($defaultValue)
+    {
+        $this->defaultValue = $defaultValue;
+    }
+    
+    /**
+     * Replaces the default value if the new value is not null.
+     * 
+     * @param string $value The defaultValue to set.
+     */
+    public function replaceDefaultValue($value)
+    {
+        if ($value !== null) {
+            $this->defaultValue = $value;
+        }         
+    }
+
+    /**
+     * @return Returns the sqlType.
+     */
+    public function getSqlType() 
+    {
+        return $this->sqlType;
+    }
+
+    /**
+     * @param string $sqlType The sqlType to set.
+     */
+    public function setSqlType($sqlType) 
+    {
+        $this->sqlType = $sqlType;
+    }
+
+    /**
+     * Return the size and scale in brackets for use in an sql schema.
+     * 
+     * @return size and scale or an empty String if there are no values 
+     *         available.
+     */
+    public function printSize()
+    {
+        if ($this->size !== null && $this->scale !== null)  {
+            return '(' . $this->size . ',' . $this->scale . ')';
+        } elseif ($this->size !== null) {
+            return '(' . $this->size . ')';
+        } else {
+            return "";
+        }
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Domain.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/ForeignKey.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/ForeignKey.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/ForeignKey.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,279 @@
+<?php
+/*
+ *  $Id: ForeignKey.php 351 2006-03-15 18:42:34Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/database/model/XMLElement.php';
+
+/**
+ * A Class for information about foreign keys of a table.
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @author Fedor <fedor.karpelevitch en home.com>
+ * @author Daniel Rall <dlr en finemaltcoding.com>
+ * @version $Revision: 351 $
+ * @package propel.engine.database.model
+ */
+class ForeignKey extends XMLElement {
+
+    private $foreignTableName;
+    private $name;
+    private $onUpdate;
+    private $onDelete;
+    private $parentTable;
+    private $localColumns = array();
+    private $foreignColumns = array();
+
+    // the uppercase equivalent of the onDelete/onUpdate values in the dtd
+    const NONE     = "";            // No "ON [ DELETE | UPDATE]" behaviour specified.
+    const NOACTION  = "NO ACTION";
+    const CASCADE  = "CASCADE";
+    const RESTRICT = "RESTRICT";
+    const SETDEFAULT  = "SET DEFAULT";
+    const SETNULL  = "SET NULL";
+
+    /**
+     * Sets up the ForeignKey object based on the attributes that were passed to loadFromXML().
+	 * @see parent::loadFromXML()
+     */
+    protected function setupObject()
+    {
+        $this->foreignTableName = $this->getAttribute("foreignTable");
+        $this->name = $this->getAttribute("name");
+        $this->onUpdate = $this->normalizeFKey($this->getAttribute("onUpdate"));
+        $this->onDelete = $this->normalizeFKey($this->getAttribute("onDelete"));
+    }
+
+    /**
+     * normalizes the input of onDelete, onUpdate attributes
+     */
+    private function normalizeFKey($attrib)
+    {
+        if ($attrib === null  || strtoupper($attrib) == "NONE") {
+            $attrib = self::NONE;
+        }
+        $attrib = strtoupper($attrib);
+        if ($attrib == "SETNULL") {
+            $attrib =  self::SETNULL;
+        }
+        return $attrib;
+    }
+
+    /**
+     * returns whether or not the onUpdate attribute is set
+     */
+    public function hasOnUpdate()
+    {
+       return ($this->onUpdate !== self::NONE);
+    }
+
+    /**
+     * returns whether or not the onDelete attribute is set
+     */
+    public function hasOnDelete()
+    {
+       return ($this->onDelete !== self::NONE);
+    }
+
+    /**
+     * returns the onUpdate attribute
+     */
+    public function getOnUpdate()
+    {
+       return $this->onUpdate;
+    }
+
+    /**
+     * returns the onDelete attribute
+     */
+    public function getOnDelete()
+    {
+       return $this->onDelete;
+    }
+
+    /**
+     * sets the onDelete attribute
+     */
+    public function setOnDelete($value)
+    {
+       $this->onDelete = $this->normalizeFKey($value);
+    }
+
+    /**
+     * sets the onUpdate attribute
+     */
+    public function setOnUpdate($value)
+    {
+       $this->onUpdate = $this->normalizeFKey($value);
+    }
+
+    /**
+     * Returns the name attribute.
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Sets the name attribute.
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * Get the foreignTableName of the FK
+     */
+    public function getForeignTableName()
+    {
+        return $this->foreignTableName;
+    }
+
+    /**
+     * Set the foreignTableName of the FK
+     */
+    public function setForeignTableName($tableName)
+    {
+        $this->foreignTableName = $tableName;
+    }
+
+    /**
+     * Set the parent Table of the foreign key
+     */
+    public function setTable(Table $parent)
+    {
+        $this->parentTable = $parent;
+    }
+
+    /**
+     * Get the parent Table of the foreign key
+     */
+    public function getTable()
+    {
+        return $this->parentTable;
+    }
+
+    /**
+     * Returns the Name of the table the foreign key is in
+     */
+    public function getTableName()
+    {
+        return $this->parentTable->getName();
+    }
+
+    /**
+     * adds a new reference entry to the foreign key
+     */
+    public function addReference($p1, $p2 = null)
+    {
+        if (is_array($p1)) {
+            $this->addReference(@$p1["local"], @$p1["foreign"]);
+        } else {
+            $this->localColumns[] = $p1;
+            $this->foreignColumns[] = $p2;
+        }
+    }
+
+    /**
+     * Return a comma delimited string of local column names
+     * @deprecated because Column::makeList() is deprecated; use the array-returning getLocalColumns() and DDLBuilder->getColumnList() instead instead.
+     */
+    public function getLocalColumnNames()
+    {
+        return Column::makeList($this->getLocalColumns(), $this->getTable()->getDatabase()->getPlatform());
+    }
+
+    /**
+     * Return a comma delimited string of foreign column names
+     * @deprecated because Column::makeList() is deprecated; use the array-returning getForeignColumns() and DDLBuilder->getColumnList() instead instead.
+     */
+    public function getForeignColumnNames()
+    {
+        return Column::makeList($this->getForeignColumns(), $this->getTable()->getDatabase()->getPlatform());
+    }
+
+    /**
+     * Return an array of local column names.
+     * @return array string[]
+     */
+    public function getLocalColumns()
+    {
+        return $this->localColumns;
+    }
+
+    /**
+     * Utility method to get local column to foreign column
+     * mapping for this foreign key.
+     */
+    public function getLocalForeignMapping()
+    {
+        $h = array();
+        for ($i=0, $size=count($this->localColumns); $i < $size; $i++) {
+            $h[$this->localColumns[$i]] = $this->foreignColumns[$i];
+        }
+        return $h;
+    }
+
+    /**
+     * Return an array of foreign column names.
+     * @return array string[]
+     */
+    public function getForeignColumns()
+    {
+        return $this->foreignColumns;
+    }
+
+    /**
+     * Utility method to get local column to foreign column
+     * mapping for this foreign key.
+     */
+    public function getForeignLocalMapping()
+    {
+        $h = array();
+        for ($i=0, $size=count($this->localColumns); $i < $size; $i++) {
+            $h[ $this->foreignColumns[$i] ] = $this->localColumns[$i];
+        }
+        return $h;
+    }
+
+    /**
+     * String representation of the foreign key. This is an xml representation.
+     */
+    public function toString()
+    {
+        $result = "    <foreign-key foreignTable=\""
+            . $this->getForeignTableName()
+            . "\" name=\""
+            . $this->getName()
+            . "\">\n";
+
+        for ($i=0, $size=count($this->localColumns); $i < $size; $i++) {
+            $result .= "        <reference local=\""
+                . $this->localColumns[$i]
+                . "\" foreign=\""
+                . $this->foreignColumns[$i]
+                . "\"/>\n";
+        }
+        $result .= "    </foreign-key>\n";
+        return $result;
+    }
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/ForeignKey.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/IDMethod.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/IDMethod.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/IDMethod.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ *  $Id: IDMethod.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+/**
+ * Interface for various ID retrieval method types
+ * (i.e. auto-increment, sequence, ID broker, etc.).
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Daniel Rall <dlr en collab.net> (Torque)
+ * @version $Revision: 64 $
+ * @package propel.engine.database.model
+ */
+interface IDMethod {
+
+    /**
+     * Key generation via database-specific ID method
+     * (i.e. auto-increment for MySQL, sequence for Oracle, etc.).
+     */
+    const NATIVE = "native";
+    
+    /**
+     * No RDBMS key generation (keys may be generated by the
+     * application).
+     */
+    const NO_ID_METHOD = "none";
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/IDMethod.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/IdMethodParameter.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/IdMethodParameter.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/IdMethodParameter.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,125 @@
+<?php
+
+/*
+ *  $Id: IdMethodParameter.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+require_once 'propel/engine/database/model/XMLElement.php';
+
+/**
+ * Information related to an ID method.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author John McNally <jmcnally en collab.net> (Torque)
+ * @author Daniel Rall <dlr en collab.net> (Torque)
+ * @version $Revision: 64 $
+ * @package propel.engine.database.model
+ */
+class IdMethodParameter extends XMLElement {
+
+    private $name;
+    private $value;
+    private $parentTable;
+
+   /**
+     * Sets up the IdMethodParameter object based on the attributes that were passed to loadFromXML().
+	 * @see parent::loadFromXML()
+     */
+    protected function setupObject()
+    {
+        $this->name = $this->getAttribute("name");
+        $this->value = $this->getAttribute("value");
+    }
+
+    /**
+     * Get the parameter name
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Set the parameter name
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * Get the parameter value
+     */
+    public function getValue()
+    {
+        return $this->value;
+    }
+
+    /**
+     * Set the parameter value
+     */
+    public function setValue($value)
+    {
+        $this->value = $value;
+    }
+
+    /**
+     * Set the parent Table of the id method
+     */
+    public function setTable(Table $parent)
+    {
+        $this->parentTable = $parent;
+    }
+
+    /**
+     * Get the parent Table of the id method
+     */
+    public function getTable()
+    {
+        return $this->parentTable;
+    }
+
+    /**
+     * Returns the Name of the table the id method is in
+     */
+    public function getTableName()
+    {
+        return $this->parentTable->getName();
+    }
+
+    /**
+     * XML representation of the foreign key.
+     */
+    public function toString()
+    {
+        $result = " <id-method-parameter";
+        
+        if ($this->getName() !== null) {
+            $result .= " name=\""
+                  . $this->getName()
+                  . '"';
+        } 
+        
+        $result .= " value=\""
+              . $this->getValue()
+              .  "\">\n";
+              
+        return $result;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/IdMethodParameter.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Index.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Index.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Index.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,276 @@
+<?php
+
+/*
+ *  $Id: Index.php 351 2006-03-15 18:42:34Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/database/model/XMLElement.php';
+include_once 'propel/engine/EngineException.php';
+
+/**
+ * Information about indices of a table.
+ *
+ * @author Jason van Zyl <vanzyl en apache.org>
+ * @author Daniel Rall <dlr en finemaltcoding.com>
+ * @version $Revision: 351 $
+ * @package propel.engine.database.model
+ */
+class Index extends XMLElement {
+
+    /** enables debug output */
+    const DEBUG = false;
+
+    private $indexName;
+    private $parentTable;
+
+    /** @var array string[] */
+    private $indexColumns;
+
+	/** @var array  */
+	private $indexColumnSizes = array();
+
+    /**
+     * Creates a new instance with default characteristics (no name or
+     * parent table, small column list size allocation, non-unique).
+     *
+     * @param Table $table
+     * @param array $indexColumns
+     */
+    public function __construct(Table $table, $indexColumns = array())
+    {
+        $this->indexColumns = $indexColumns;
+        $this->setTable($table);
+        if (!empty($indexColumns)) {
+
+            $this->createName();
+
+            if (self::DEBUG) {
+                print("Created Index named " . $this->getName()
+                        . " with " . count($indexColumns) . " columns\n");
+            }
+        }
+    }
+
+    private function createName()
+    {
+        $table = $this->getTable();
+        $inputs = array();
+        $inputs[] = $table->getDatabase();
+        $inputs[] = $table->getName();
+        if ($this->isUnique()) {
+            $inputs[] = "U";
+        } else {
+            $inputs[] = "I";
+        }
+        // ASSUMPTION: This Index not yet added to the list.
+        if ($this->isUnique()) {
+            $inputs[] = count($table->getUnices()) + 1;
+        } else {
+            $inputs[] = count($table->getIndices()) + 1;
+        }
+
+        $this->indexName = NameFactory::generateName(
+                NameFactory::CONSTRAINT_GENERATOR, $inputs);
+    }
+
+    /**
+     * Sets up the Index object based on the attributes that were passed to loadFromXML().
+	 * @see parent::loadFromXML()
+     */
+    protected function setupObject()
+    {
+        $this->indexName = $this->getAttribute("name");
+    }
+
+    /**
+     * @see #isUnique()
+     * @deprecated Use isUnique() instead.
+     */
+    public function getIsUnique()
+    {
+        return $this->isUnique();
+    }
+
+    /**
+     * Returns the uniqueness of this index.
+     */
+    public function isUnique()
+    {
+        return false;
+    }
+
+    /**
+     * @see #getName()
+     * @deprecated Use getName() instead.
+     */
+    public function getIndexName()
+    {
+        return $this->getName();
+    }
+
+    /**
+     * Gets the name of this index.
+     */
+    public function getName()
+    {
+        if ($this->indexName === null) {
+            try {
+                // generate an index name if we don't have a supplied one
+                $this->createName();
+            } catch (EngineException $e) {
+                // still no name
+            }
+        }
+        return $this->indexName;
+    }
+
+    /**
+     * @see #setName(String name)
+     * @deprecated Use setName(String name) instead.
+     */
+    public function setIndexName($name)
+    {
+        $this->setName($name);
+    }
+
+    /**
+     * Set the name of this index.
+     */
+    public function setName($name)
+    {
+        $this->indexName = $name;
+    }
+
+    /**
+     * Set the parent Table of the index
+     */
+    public function setTable(Table $parent)
+    {
+        $this->parentTable = $parent;
+    }
+
+    /**
+     * Get the parent Table of the index
+     */
+    public function getTable()
+    {
+        return $this->parentTable;
+    }
+
+    /**
+     * Returns the Name of the table the index is in
+     */
+    public function getTableName()
+    {
+        return $this->parentTable->getName();
+    }
+
+    /**
+     * Adds a new column to an index.
+	 * @param array $attrib The attribute array from XML parser.
+     */
+    public function addColumn($attrib)
+    {
+		$name = $attrib["name"];
+        $this->indexColumns[] = $name;
+		if (isset($attrib["size"])) {
+			$this->indexColumnSizes[$name] = $attrib["size"];
+		}
+    }
+
+	/**
+	 * Whether there is a size for the specified column.
+	 * @param string $name
+	 * @return boolean
+	 */
+	public function hasColumnSize($name)
+	{
+		return isset($this->indexColumnSizes[$name]);
+	}
+
+	/**
+	 * Returns the size for the specified column, if given.
+	 * @param string $name
+	 * @return numeric The size or NULL
+	 */
+	public function getColumnSize($name)
+	{
+		if (isset($this->indexColumnSizes[$name])) {
+		    return $this->indexColumnSizes[$name];
+		}
+		return null; // just to be explicit
+	}
+
+    /**
+     * @see #getColumnList()
+     * @deprecated Use getColumnList() instead (which is not deprecated too!)
+     */
+    public function getIndexColumnList()
+    {
+        return $this->getColumnList();
+    }
+
+    /**
+     * Return a comma delimited string of the columns which compose this index.
+     * @deprecated because Column::makeList() is deprecated; use the array-returning getColumns() and DDLBuilder->getColumnList() instead instead.
+     */
+    public function getColumnList()
+    {
+        return Column::makeList($this->getColumns(), $this->getTable()->getDatabase()->getPlatform());
+    }
+
+    /**
+     * @see #getColumns()
+     * @deprecated Use getColumns() instead.
+     */
+    public function getIndexColumns()
+    {
+        return $this->getColumns();
+    }
+
+    /**
+     * Return the list of local columns. You should not edit this list.
+	 * @return array string[]
+     */
+    public function getColumns()
+    {
+        return $this->indexColumns;
+    }
+
+    /**
+     * String representation of the index. This is an xml representation.
+     */
+    public function toString()
+    {
+
+        $result = " <index name=\""
+              . $this->getName()
+              .'"';
+
+        $result .= ">\n";
+
+        for ($i=0, $size=count($this->indexColumns); $i < $size; $i++) {
+            $result .= "  <index-column name=\""
+                . $this->indexColumns[$i]
+                . "\"/>\n";
+        }
+        $result .= " </index>\n";
+        return $result;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Index.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Inheritance.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Inheritance.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Inheritance.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,164 @@
+<?php
+
+/*
+ *  $Id: Inheritance.php 118 2005-06-15 13:14:48Z kaspars $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+require_once 'propel/engine/database/model/XMLElement.php';
+ 
+/**
+ * A Class for information regarding possible objects representing a table
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author John McNally <jmcnally en collab.net> (Torque)
+ * @version $Revision: 118 $
+ * @package propel.engine.database.model
+ */
+class Inheritance extends XMLElement {
+
+    private $key;
+    private $className;
+	private $pkg;
+    private $ancestor;
+    private $parent;
+
+    /**
+     * Sets up the Inheritance object based on the attributes that were passed to loadFromXML().
+	 * @see parent::loadFromXML()
+     */
+    protected function setupObject()
+    {
+        $this->key = $this->getAttribute("key");
+        $this->className = $this->getAttribute("class");
+		$this->pkg = $this->getAttribute("package");
+        $this->ancestor = $this->getAttribute("extends");
+    }
+
+    /**
+     * Get the value of key.
+     * @return value of key.
+     */
+    public function getKey()
+    {
+        return $this->key;
+    }
+
+    /**
+     * Set the value of key.
+     * @param v  Value to assign to key.
+     */
+    public function setKey($v)
+    {
+        $this->key = $v;
+    }
+
+    /**
+     * Get the value of parent.
+     * @return value of parent.
+     */
+    public function getColumn()
+    {
+        return $this->parent;
+    }
+
+    /**
+     * Set the value of parent.
+     * @param v  Value to assign to parent.
+     */
+    public function setColumn(Column  $v)
+    {
+        $this->parent = $v;
+    }
+
+    /**
+     * Get the value of className.
+     * @return value of className.
+     */
+    public function getClassName()
+    {
+        return $this->className;
+    }
+
+    /**
+     * Set the value of className.
+     * @param v  Value to assign to className.
+     */
+    public function setClassName($v)
+    {
+        $this->className = $v;
+    }
+
+    /**
+     * Get the value of package.
+     * @return value of package.
+     */
+    public function getPackage()
+    {
+        return $this->pkg;
+    }
+
+    /**
+     * Set the value of package.
+     * @param v  Value to assign to package.
+     */
+    public function setPackage($v)
+    {
+        $this->pkg = $v;
+    }
+
+    /**
+     * Get the value of ancestor.
+     * @return value of ancestor.
+     */
+    public function getAncestor()
+    {
+        return $this->ancestor;
+    }
+
+    /**
+     * Set the value of ancestor.
+     * @param v  Value to assign to ancestor.
+     */
+    public function setAncestor($v)
+    {
+        $this->ancestor = $v;
+    }
+
+    /**
+     * String representation of the foreign key. This is an xml representation.
+     */
+    public function toString()
+    {
+        $result = " <inheritance key=\""
+              . $this->key
+              . "\" class=\""
+              . $this->className
+              . '"';
+
+        if ($this->ancestor !== null) {
+            $result .= " extends=\""
+                  . $this->ancestor
+                  . '"';
+        }
+
+        $result .= "/>";
+
+        return $result;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Inheritance.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/NameFactory.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/NameFactory.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/NameFactory.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,116 @@
+<?php
+
+/*
+ *  $Id: NameFactory.php 366 2006-05-23 13:00:30Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+include_once 'propel/engine/EngineException.php';
+include_once 'propel/engine/database/model/NameGenerator.php';
+
+/**
+ * A name generation factory.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Daniel Rall <dlr en finemaltcoding.com> (Torque)
+ * @version $Revision: 366 $
+ * @package propel.engine.database.model
+ */
+class NameFactory {
+
+    /**
+     * The class name of the PHP name generator.
+     */
+    const PHP_GENERATOR = 'PhpNameGenerator';
+
+    /**
+     * The fully qualified class name of the constraint name generator.
+     */
+    const CONSTRAINT_GENERATOR = 'ConstraintNameGenerator';
+
+    /**
+     * The single instance of this class.
+     */
+    private static $instance;
+
+    /**
+     * The cache of <code>NameGenerator</code> algorithms in use for
+     * name generation, keyed by fully qualified class name.
+     */
+    private $algorithms;
+
+    /**
+     * Creates a new instance with storage for algorithm implementations.
+     */
+    protected function __construct()
+    {
+        $this->algorithms = array();
+    }
+
+    private static function instance()
+    {
+        if (self::$instance === null) {
+            self::$instance = new NameFactory();            
+        }
+        return self::$instance;
+    }
+    
+    /**
+     * Factory method which retrieves an instance of the named generator.
+     *
+     * @param name The fully qualified class name of the name
+     * generation algorithm to retrieve.
+     */
+    protected function getAlgorithm($name)
+    {
+        $algorithm = isset($this->algorithms[$name]) ? $this->algorithms[$name] : null;
+        if ($algorithm === null) {
+            try {
+                include_once 'propel/engine/database/model/' . $name . '.php';
+                if (!class_exists($name)) {
+                    throw new Exception("Unable to instantiate class " . $name
+                        . ": Make sure it's in your include_path");
+                }                
+                $algorithm = new $name();
+            } catch (BuildException $e) {
+                print $e->getMessage() . "\n";
+                print $e->getTraceAsString();
+            }
+            $this->algorithms[$name] = $algorithm;
+        }
+        return $algorithm;
+        
+    }
+
+    /**
+     * Given a list of <code>String</code> objects, implements an
+     * algorithm which produces a name.
+     *
+     * @param algorithmName The fully qualified class name of the
+     * {@link NameGenerator}
+     * implementation to use to generate names.
+     * @param array $inputs Inputs used to generate a name.
+     * @return The generated name.
+     * @throws EngineException
+     */
+    public static function generateName($algorithmName, $inputs)
+    {
+        $algorithm = self::instance()->getAlgorithm($algorithmName);
+        return $algorithm->generateName($inputs);
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/NameFactory.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/NameGenerator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/NameGenerator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/NameGenerator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ *  $Id: NameGenerator.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+/**
+ * The generic interface to a name generation algorithm.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Daniel Rall <dlr en finemaltcoding.com> (Torque)
+ * @author Byron Foster <byron_foster en yahoo.com> (Torque)
+ * @version $Revision: 64 $
+ * @package propel.engine.database.model
+ */
+interface NameGenerator {
+    /**
+     * The character used by most implementations as the separator
+     * between name elements.
+     */
+    const STD_SEPARATOR_CHAR = '_';
+
+    /**
+     * Traditional method for converting schema table and column names
+     * to PHP names.  The <code>CONV_METHOD_XXX</code> constants
+     * define how names for columns and tables in the database schema
+     * will be converted to PHP source names.
+     *
+     * @see PhpNameGenerator::underscoreMethod()
+     */
+    const CONV_METHOD_UNDERSCORE = "underscore";
+
+    /**
+     * Similar to {@link #CONV_METHOD_UNDERSCORE} except nothing is
+     * converted to lowercase.
+     *
+     * @see PhpNameGenerator::phpnameMethod()
+     */
+    const CONV_METHOD_PHPNAME = "phpname";
+
+    /**
+     * Specifies no modification when converting from a schema column
+     * or table name to a PHP name.
+     */
+    const CONV_METHOD_NOCHANGE = "nochange";
+
+    /**
+     * Given a list of <code>String</code> objects, implements an
+     * algorithm which produces a name.
+     *
+     * @param inputs Inputs used to generate a name.
+     * @return The generated name.
+     * @throws EngineException
+     */
+    public function generateName($inputs);
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/NameGenerator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/PhpNameGenerator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/PhpNameGenerator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/PhpNameGenerator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,131 @@
+<?php
+/*
+ *  $Id: PhpNameGenerator.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+include_once 'propel/engine/database/model/NameGenerator.php';
+
+/**
+ * A <code>NameGenerator</code> implementation for PHP-esque names.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Daniel Rall <dlr en finemaltcoding.com> (Torque)
+ * @author Byron Foster <byron_foster en yahoo.com> (Torque)
+ * @version $Revision: 64 $
+ * @package propel.engine.database.model
+ */
+class PhpNameGenerator implements NameGenerator {
+
+    /**
+     * <code>inputs</code> should consist of two elements, the
+     * original name of the database element and the method for
+     * generating the name.  There are currently three methods:
+     * <code>CONV_METHOD_NOCHANGE</code> - xml names are converted
+     * directly to php names without modification.
+     * <code>CONV_METHOD_UNDERSCORE</code> will capitalize the first
+     * letter, remove underscores, and capitalize each letter before
+     * an underscore.  All other letters are lowercased. "phpname"
+     * works the same as the <code>CONV_METHOD_PHPNAME</code> method
+     * but will not lowercase any characters.
+     *
+     * @param inputs list expected to contain two parameters, element
+     * 0 contains name to convert, element 1 contains method for conversion.
+     * @return The generated name.
+     * @see NameGenerator
+     */
+    public function generateName($inputs)
+    {
+        $schemaName = $inputs[0];
+        $method = $inputs[1];
+        $phpName = null;
+
+        if ($method == self::CONV_METHOD_UNDERSCORE) {
+            $phpName = $this->underscoreMethod($schemaName);
+        } elseif ($method == self::CONV_METHOD_PHPNAME) {
+            $phpName = $this->phpnameMethod($schemaName);
+        } else if ($method == self::CONV_METHOD_NOCHANGE) {
+            $phpName = $this->nochangeMethod($schemaName);
+        } else {
+            // if for some reason nothing is defined then we default
+            // to the traditional method.
+            $phpName = $this->underscoreMethod($schemaName);
+        }
+
+        return $phpName;
+    }
+
+    /**
+     * Converts a database schema name to php object name.  Removes
+     * <code>STD_SEPARATOR_CHAR</code>, capitilizes first letter of
+     * name and each letter after the <code>STD_SEPERATOR</code>,
+     * converts the rest of the letters to lowercase.
+     *
+     * my_CLASS_name -> MyClassName
+     *
+     * @param string $schemaName name to be converted.
+     * @return string Converted name.
+     * @see NameGenerator
+     * @see #underscoreMethod()
+     */
+    protected function underscoreMethod($schemaName)
+    {
+        $name = "";
+        $tok = strtok($schemaName, self::STD_SEPARATOR_CHAR);
+        while($tok) {            
+            $name .= ucfirst(strtolower($tok));
+            $tok = strtok(self::STD_SEPARATOR_CHAR);
+        }
+        return $name;
+    }
+
+    /**
+     * Converts a database schema name to php object name.  Operates
+     * same as underscoreMethod but does not convert anything to
+     * lowercase.
+     * 
+     * my_CLASS_name -> MyCLASSName
+     * 
+     * @param string $schemaName name to be converted.
+     * @return string Converted name.
+     * @see NameGenerator
+     * @see #underscoreMethod(String)
+     */
+    protected function phpnameMethod($schemaName)
+    {
+        $name = "";
+        $tok = strtok($schemaName, self::STD_SEPARATOR_CHAR);
+        while($tok) {            
+            $name .= ucfirst($tok);
+            $tok = strtok(self::STD_SEPARATOR_CHAR);
+        }
+        return $name;
+    }
+
+    /**
+     * Converts a database schema name to PHP object name.  In this
+     * case no conversion is made.
+     *
+     * @param string $name name to be converted.
+     * @return string The <code>name</code> parameter, unchanged.
+     */
+    protected function nochangeMethod($name)
+    {
+        return $name;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/PhpNameGenerator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/PropelTypes.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/PropelTypes.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/PropelTypes.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,290 @@
+<?php
+/*
+ *  $Id: PropelTypes.php 216 2005-09-28 13:16:42Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+require_once 'creole/CreoleTypes.php';
+
+/**
+ * A class that maps PropelTypes to CreoleTypes and to native PHP types.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Jason van Zyl <jvanzyl en apache.org> (Torque)
+ * @version $Revision: 216 $
+ * @package propel.engine.database.model
+ */
+class PropelTypes {
+
+    const CHAR = "CHAR";
+    const VARCHAR = "VARCHAR";
+    const LONGVARCHAR = "LONGVARCHAR";
+    const CLOB = "CLOB";
+    const NUMERIC = "NUMERIC";
+    const DECIMAL = "DECIMAL";
+    const TINYINT = "TINYINT";
+    const SMALLINT = "SMALLINT";
+    const INTEGER = "INTEGER";
+    const BIGINT = "BIGINT";
+    const REAL = "REAL";
+    const FLOAT = "FLOAT";
+    const DOUBLE = "DOUBLE";
+    const BINARY = "BINARY";
+    const VARBINARY = "VARBINARY";
+    const LONGVARBINARY = "LONGVARBINARY";
+    const BLOB = "BLOB";
+    const DATE = "DATE";
+    const TIME = "TIME";
+    const TIMESTAMP = "TIMESTAMP";
+	
+	const BU_DATE = "BU_DATE";
+	const BU_TIMESTAMP = "BU_TIMESTAMP";
+	
+    const BOOLEAN = "BOOLEAN";
+    
+    private static $TEXT_TYPES = null;
+    
+    private static $LOB_TYPES = null;
+    
+    const CHAR_NATIVE_TYPE = "string";
+    const VARCHAR_NATIVE_TYPE = "string";
+    const LONGVARCHAR_NATIVE_TYPE = "string";
+    const CLOB_NATIVE_TYPE = "string"; // Clob
+    const NUMERIC_NATIVE_TYPE = "double";
+    const DECIMAL_NATIVE_TYPE = "double";
+    const BOOLEAN_NATIVE_TYPE = "boolean";
+    const TINYINT_NATIVE_TYPE = "int";
+    const SMALLINT_NATIVE_TYPE = "int";
+    const INTEGER_NATIVE_TYPE = "int";
+    const BIGINT_NATIVE_TYPE = "string";
+    const REAL_NATIVE_TYPE = "double";
+    const FLOAT_NATIVE_TYPE = "double";
+    const DOUBLE_NATIVE_TYPE = "double";
+    const BINARY_NATIVE_TYPE = "string";
+    const VARBINARY_NATIVE_TYPE = "string";
+    const LONGVARBINARY_NATIVE_TYPE = "string";
+    const BLOB_NATIVE_TYPE = "string";
+	const BU_DATE_NATIVE_TYPE = "string";
+    const DATE_NATIVE_TYPE = "int";
+    const TIME_NATIVE_TYPE = "int";
+    const TIMESTAMP_NATIVE_TYPE = "int";
+	const BU_TIMESTAMP_NATIVE_TYPE = "string";
+	
+    private static $propelToPHPNativeMap = null;
+    private static $propelTypeToCreoleTypeMap = null;
+    private static $creoleToPropelTypeMap = null;
+    
+    private static $isInitialized = false;
+
+    /**
+     * Initializes the SQL to PHP map so that it
+     * can be used by client code.
+     */
+    public static function initialize()
+    {
+        if (self::$isInitialized === false) {
+        
+            self::$TEXT_TYPES = array (
+                        self::CHAR, self::VARCHAR, self::LONGVARCHAR, self::CLOB, self::DATE, self::TIME, self::TIMESTAMP, self::BU_DATE, self::BU_TIMESTAMP
+                    );
+        
+            self::$LOB_TYPES = array (
+                        self::VARBINARY, self::LONGVARBINARY, self::CLOB, self::BLOB
+                    );
+            
+            /*
+             * Create Creole -> native PHP type mappings.
+             */
+             
+            self::$propelToPHPNativeMap = array();
+
+            self::$propelToPHPNativeMap[self::CHAR] = self::CHAR_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::VARCHAR] = self::VARCHAR_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::LONGVARCHAR] = self::LONGVARCHAR_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::CLOB] = self::CLOB_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::NUMERIC] = self::NUMERIC_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::DECIMAL] = self::DECIMAL_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::TINYINT] = self::TINYINT_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::SMALLINT] = self::SMALLINT_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::INTEGER] = self::INTEGER_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::BIGINT] = self::BIGINT_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::REAL] = self::REAL_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::FLOAT] = self::FLOAT_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::DOUBLE] = self::DOUBLE_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::BINARY] = self::BINARY_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::VARBINARY] = self::VARBINARY_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::LONGVARBINARY] = self::LONGVARBINARY_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::BLOB] = self::BLOB_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::DATE] = self::DATE_NATIVE_TYPE;
+			self::$propelToPHPNativeMap[self::BU_DATE] = self::BU_DATE_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::TIME] = self::TIME_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::TIMESTAMP] = self::TIMESTAMP_NATIVE_TYPE;
+			self::$propelToPHPNativeMap[self::BU_TIMESTAMP] = self::BU_TIMESTAMP_NATIVE_TYPE;
+            self::$propelToPHPNativeMap[self::BOOLEAN] = self::BOOLEAN_NATIVE_TYPE;
+
+            /*
+             * Create Propel -> Creole _name_ mappings (not CreoleType:: mappings).
+             * (this is now pretty useless since we've designed them to be the same!)
+             */
+            self::$propelTypeToCreoleTypeMap = array();
+            self::$propelTypeToCreoleTypeMap[self::CHAR] = self::CHAR;
+            self::$propelTypeToCreoleTypeMap[self::VARCHAR] = self::VARCHAR;
+            self::$propelTypeToCreoleTypeMap[self::LONGVARCHAR] = self::LONGVARCHAR;
+            self::$propelTypeToCreoleTypeMap[self::CLOB] = self::CLOB;
+            self::$propelTypeToCreoleTypeMap[self::NUMERIC] = self::NUMERIC;
+            self::$propelTypeToCreoleTypeMap[self::DECIMAL] = self::DECIMAL;
+            self::$propelTypeToCreoleTypeMap[self::TINYINT] = self::TINYINT;
+            self::$propelTypeToCreoleTypeMap[self::SMALLINT] = self::SMALLINT;
+            self::$propelTypeToCreoleTypeMap[self::INTEGER] = self::INTEGER;
+            self::$propelTypeToCreoleTypeMap[self::BIGINT] = self::BIGINT;
+            self::$propelTypeToCreoleTypeMap[self::REAL] = self::REAL;
+            self::$propelTypeToCreoleTypeMap[self::FLOAT] = self::FLOAT;
+            self::$propelTypeToCreoleTypeMap[self::DOUBLE] = self::DOUBLE;
+            self::$propelTypeToCreoleTypeMap[self::BINARY] = self::BINARY;
+            self::$propelTypeToCreoleTypeMap[self::VARBINARY] = self::VARBINARY;
+            self::$propelTypeToCreoleTypeMap[self::LONGVARBINARY] = self::LONGVARBINARY;
+            self::$propelTypeToCreoleTypeMap[self::BLOB] = self::BLOB;
+            self::$propelTypeToCreoleTypeMap[self::DATE] = self::DATE;
+            self::$propelTypeToCreoleTypeMap[self::TIME] = self::TIME;
+            self::$propelTypeToCreoleTypeMap[self::TIMESTAMP] = self::TIMESTAMP;
+            self::$propelTypeToCreoleTypeMap[self::BOOLEAN] = self::BOOLEAN;
+			
+			// These are pre-epoch dates, which we need to map to String type
+			// since they cannot be properly handled using strtotime() -- or even numeric
+			// timestamps on Windows.
+			self::$propelTypeToCreoleTypeMap[self::BU_DATE] = self::VARCHAR;
+			self::$propelTypeToCreoleTypeMap[self::BU_TIMESTAMP] = self::VARCHAR;
+			
+
+            /*
+             * Create Creole type code to Propel type map.
+             */
+            self::$creoleToPropelTypeMap = array();
+
+            self::$creoleToPropelTypeMap[CreoleTypes::CHAR] = self::CHAR;
+            self::$creoleToPropelTypeMap[CreoleTypes::VARCHAR] = self::VARCHAR;
+            self::$creoleToPropelTypeMap[CreoleTypes::LONGVARCHAR] = self::LONGVARCHAR;
+            self::$creoleToPropelTypeMap[CreoleTypes::CLOB] = self::CLOB;
+            self::$creoleToPropelTypeMap[CreoleTypes::NUMERIC] = self::NUMERIC;
+            self::$creoleToPropelTypeMap[CreoleTypes::DECIMAL] = self::DECIMAL;
+            self::$creoleToPropelTypeMap[CreoleTypes::TINYINT] = self::TINYINT;
+            self::$creoleToPropelTypeMap[CreoleTypes::SMALLINT] = self::SMALLINT;
+            self::$creoleToPropelTypeMap[CreoleTypes::INTEGER] = self::INTEGER;
+            self::$creoleToPropelTypeMap[CreoleTypes::BIGINT] = self::BIGINT;
+            self::$creoleToPropelTypeMap[CreoleTypes::REAL] = self::REAL;
+            self::$creoleToPropelTypeMap[CreoleTypes::FLOAT] = self::FLOAT;
+            self::$creoleToPropelTypeMap[CreoleTypes::DOUBLE] = self::DOUBLE;
+            self::$creoleToPropelTypeMap[CreoleTypes::BINARY] = self::BINARY;
+            self::$creoleToPropelTypeMap[CreoleTypes::VARBINARY] = self::VARBINARY;
+            self::$creoleToPropelTypeMap[CreoleTypes::LONGVARBINARY] = self::LONGVARBINARY;
+            self::$creoleToPropelTypeMap[CreoleTypes::BLOB] = self::BLOB;
+            self::$creoleToPropelTypeMap[CreoleTypes::DATE] = self::DATE;
+            self::$creoleToPropelTypeMap[CreoleTypes::TIME] = self::TIME;
+            self::$creoleToPropelTypeMap[CreoleTypes::TIMESTAMP] = self::TIMESTAMP;
+            self::$creoleToPropelTypeMap[CreoleTypes::BOOLEAN] = self::BOOLEAN;
+            self::$creoleToPropelTypeMap[CreoleTypes::YEAR] = self::INTEGER;
+            
+            self::$isInitialized = true;
+        }
+    }
+
+    /**
+     * Report whether this object has been initialized.
+     *
+     * @return true if this object has been initialized
+     */
+    public static function isInitialized()
+    {
+        return self::$isInitialized;
+    }
+
+    /**
+     * Return native PHP type which corresponds to the
+     * Creole type provided. Use in the base object class generation.
+     *
+     * @param $propelType The Propel type name.
+     * @return string Name of the native PHP type
+     */
+    public static function getPhpNative($propelType)
+    {
+        return self::$propelToPHPNativeMap[$propelType];
+    }            
+    
+    /**
+     * Returns the correct Creole type _name_ for propel added types
+     *
+     * @param $type the propel added type.
+     * @return string Name of the the correct Creole type (e.g. "VARCHAR").
+     */
+    public static function getCreoleType($type)
+    {
+        return  self::$propelTypeToCreoleTypeMap[$type];
+    }
+
+    /**
+     * Returns Propel type constant corresponding to Creole type code.
+     * Used but Propel Creole task.
+     *
+     * @param int $sqlType The Creole SQL type constant.
+     * @return string The Propel type to use or NULL if none found.
+     */
+    public static function getPropelType($sqlType)
+    {
+        if (isset(self::$creoleToPropelTypeMap[$sqlType])) {
+            return self::$creoleToPropelTypeMap[$sqlType];
+        }
+    }
+    
+    /**
+     * Get array of Propel types.
+     * 
+     * @return array string[]
+     */
+    public static function getPropelTypes()
+    {
+        return array_keys(self::$propelTypeToCreoleTypeMap);
+    }
+    
+    /**
+     * Returns true if values for the type need to be quoted.
+     *
+     * @param string $type The Propel type to check.
+     * @return true if values for the type need to be quoted.
+     */
+    public static function isTextType($type)
+    {
+        // Make sure the we are initialized.
+        if (self::$isInitialized === false) {
+            self::initialize();
+        }
+        return in_array($type, self::$TEXT_TYPES);
+    }
+    
+    /**
+     * Returns true if type is a LOB type (i.e. would be handled by Blob/Clob class).
+     * @param string $type Propel type to check.
+     * @return boolean
+     */
+    public static function isLobType($type)
+    {
+        return in_array($type, self::$LOB_TYPES);
+    }
+}
+
+// static
+PropelTypes::initialize();


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/PropelTypes.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Rule.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Rule.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Rule.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,203 @@
+<?php
+/*
+ *  $Id: Rule.php 92 2005-05-21 21:11:28Z rhalff $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/database/model/XMLElement.php';
+
+/**
+ * Data about a validation rule used in an application.
+ *
+ * @author Michael Aichler <aichler en mediacluster.de> (Propel)
+ * @author John McNally <jmcnally en collab.net> (Intake)
+ * @version $Revision: 92 $
+ * @package propel.engine.database.model
+ */
+class Rule extends XMLElement {
+    
+    private $name;
+    private $value;
+    private $message;
+    private $validator;
+    private $classname;    
+    
+    /**
+     * Sets up the Rule object based on the attributes that were passed to loadFromXML().
+	 * @see parent::loadFromXML()
+     */
+    protected function setupObject()
+    {
+        $this->name = $this->getAttribute("name");
+        $this->value = $this->getAttribute("value");
+        $this->classname = $this->getAttribute("class");
+        
+        /*
+        * Set some default values if they are not specified.
+        * This is escpecially useful for maxLength; the size
+        * is already known by the column and this way it is
+        * not necessary to manage the same size two times.
+        * 
+        * Currently there is only one such supported default:
+        *   - maxLength value = column max length
+        *   (this default cannot be easily set at runtime w/o changing
+        *   design of class system in undesired ways)
+        */
+        if ($this->value === null) {
+            switch($this->name) {
+                case 'maxLength':
+                    $this->value = $this->validator->getColumn()->getSize();
+                    break;      
+            }        
+        }                
+        
+        $this->message = $this->getAttribute("message");
+    }        
+    
+    /**
+     * Sets the owning validator for this rule.
+     * @param Validator $validator
+     * @see Validator::addRule()
+     */
+    public function setValidator(Validator $validator)
+    {
+        $this->validator = $validator;
+    }
+    
+    /**
+     * Gets the owning validator for this rule.
+     * @return Validator
+     */
+    public function getValidator()
+    {
+        return $this->validator;
+    }
+    
+    /**
+     * Sets the dot-path name of class to use for rule.
+     * If no class is specified in XML, then a classname will
+     * be built based on the 'name' attrib.
+     * @param string $classname dot-path classname (e.g. myapp.propel.MyValidator)
+     */
+    public function setClass($classname)
+    {
+        $this->classname = $classname;   
+    }
+    
+    /**
+     * Gets the dot-path name of class to use for rule.
+     * If no class was specified, this method will build a default classname
+     * based on the 'name' attribute.  E.g. 'maxLength' -> 'propel.validator.MaxLengthValidator'
+     * @return string dot-path classname (e.g. myapp.propel.MyValidator)
+     */
+    public function getClass()
+    {
+        if ($this->classname === null && $this->name !== null) {
+            return "propel.validator." . ucfirst($this->name) . "Validator";
+        }
+        return $this->classname;
+    }
+    
+    /**
+     * Sets the name of the validator for this rule.
+     * This name is used to build the classname if none was specified.
+     * @param string $name Validator name for this rule (e.g. "maxLength", "required").
+     * @see getClass()
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+    
+    /**
+     * Gets the name of the validator for this rule.
+     * @return string Validator name for this rule (e.g. "maxLength", "required").
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+    
+    /**
+     * Sets the value parameter for this validator rule.
+     * Note: not all validators need a value parameter (e.g. 'required' validator
+     * does not).
+     * @param string $value
+     */
+    public function setValue($value)
+    {
+        $this->value = $value;
+    }
+    
+    /**
+     * Gets the value parameter for this validator rule.
+     * @return string
+     */
+    public function getValue()
+    {
+        return $this->value;
+    }
+    
+    /**
+     * Sets the message that will be displayed to the user if validation fails.
+     * This message may be a Gettext msgid (if translation="gettext") or some other
+     * id for an alternative not-yet-supported translation system.  It may also
+     * be a simple, single-language string.
+     * @param string $message
+     * @see setTranslation()
+     */
+    public function setMessage($message)
+    {
+        $this->message = $message;
+    }
+    
+    /**
+     * Gets the message that will be displayed to the user if validation fails.
+     * This message may be a Gettext msgid (if translation="gettext") or some other
+     * id for an alternative not-yet-supported translation system.  It may also
+     * be a simple, single-language string.
+     * @return string
+     * @see setTranslation()
+     */
+    public function getMessage()
+    {
+      $message = str_replace('${value}', $this->getValue(), $this->message);
+      return $message;
+    }
+        
+    /**
+     * Create XML (string) representation of this object.
+     * @return string
+     */
+    public function toString()
+    {
+      $result = "<rule name=\"" . $this->getName() . "\" ";
+
+      if ($this->getValue() !== null) {
+        $result .= "value=\"" . $this->getValue(). "\" ";
+      }
+      if ($this->getClass() !== null) {
+          $result .= "class=\"".$this->getClass()."\" ";
+      }
+      $result .= "message=\"" . $this->getMessage() . "\" ";
+      $result .= "/>\n";
+
+      return $result;
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Rule.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Table.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Table.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Table.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1151 @@
+<?php
+
+/*
+ *  $Id: Table.php 351 2006-03-15 18:42:34Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/database/model/XMLElement.php';
+include_once 'propel/engine/EngineException.php';
+include_once 'propel/engine/database/model/IDMethod.php';
+include_once 'propel/engine/database/model/NameFactory.php';
+include_once 'propel/engine/database/model/Column.php';
+include_once 'propel/engine/database/model/Unique.php';
+include_once 'propel/engine/database/model/ForeignKey.php';
+include_once 'propel/engine/database/model/IdMethodParameter.php';
+include_once 'propel/engine/database/model/Validator.php';
+
+/**
+ * Data about a table used in an application.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Leon Messerschmidt <leon en opticode.co.za> (Torque)
+ * @author Jason van Zyl <jvanzyl en apache.org> (Torque)
+ * @author Martin Poeschl <mpoeschl en marmot.at> (Torque)
+ * @author John McNally <jmcnally en collab.net> (Torque)
+ * @author Daniel Rall <dlr en collab.net> (Torque)
+ * @author Byron Foster <byron_foster en yahoo.com> (Torque)
+ * @version $Revision: 351 $
+ * @package propel.engine.database.model
+ */
+class Table extends XMLElement implements IDMethod {
+
+    /** enables debug output */
+    const DEBUG = false;
+
+    //private attributes;
+    private $columnList;
+    private $validatorList;
+    private $foreignKeys;
+    private $indices;
+    private $unices;
+    private $idMethodParameters;
+    private $name;
+    private $description;
+    private $phpName;
+    private $idMethod;
+    private $phpNamingMethod;
+    private $tableParent;
+    private $referrers = array();
+    private $foreignTableNames;
+    private $containsForeignPK;
+    private $inheritanceColumn;
+    private $skipSql;
+    private $readOnly;
+    private $abstractValue;
+    private $alias;
+    private $enterface;
+    private $pkg;
+    private $baseClass;
+    private $basePeer;
+    private $columnsByName;
+    private $columnsByPhpName;
+    private $needsTransactionInPostgres;//maybe this can be retrieved from vendorSpecificInfo?
+    private $heavyIndexing;
+    private $forReferenceOnly;
+    private $isTree;
+
+    /**
+     * Constructs a table object with a name
+     *
+     * @param string $name table name
+     */
+    public function __construct($name = null)
+    {
+        $this->name = $name;
+        $this->columnList = array();
+        $this->validatorList = array();
+        $this->foreignKeys = array();
+        $this->indices = array();
+        $this->unices = array();
+        $this->columnsByName = array();
+        $this->columnsByPhpName = array();
+        $this->vendorSpecificInfo = array();
+    }
+
+   /**
+     * Sets up the Rule object based on the attributes that were passed to loadFromXML().
+	 * @see parent::loadFromXML()
+     */
+    public function setupObject()
+    {
+        $this->name = $this->getAttribute("name");
+        $this->phpName = $this->getAttribute("phpName");
+        $this->idMethod = $this->getAttribute("idMethod", $this->getDatabase()->getDefaultIdMethod());
+
+        // retrieves the method for converting from specified name to a PHP name.
+        $this->phpNamingMethod = $this->getAttribute("phpNamingMethod", $this->getDatabase()->getDefaultPhpNamingMethod());
+
+        $this->skipSql = $this->booleanValue($this->getAttribute("skipSql"));
+        $this->readOnly = $this->booleanValue($this->getAttribute("readOnly"));
+
+        $this->pkg = $this->getAttribute("package");
+        $this->abstractValue = $this->booleanValue($this->getAttribute("abstract"));
+        $this->baseClass = $this->getAttribute("baseClass");
+        $this->basePeer = $this->getAttribute("basePeer");
+        $this->alias = $this->getAttribute("alias");
+
+        $this->heavyIndexing = ( $this->booleanValue($this->getAttribute("heavyIndexing"))
+                || ("false" !== $this->getAttribute("heavyIndexing")
+                		&& $this->getDatabase()->isHeavyIndexing() ) );
+        $this->description = $this->getAttribute("description");
+        $this->enterface = $this->getAttribute("interface"); // sic ('interface' is reserved word)
+        $this->isTree = $this->booleanValue($this->getAttribute("isTree"));
+    }
+
+    /**
+     * <p>A hook for the SAX XML parser to call when this table has
+     * been fully loaded from the XML, and all nested elements have
+     * been processed.</p>
+     *
+     * <p>Performs heavy indexing and naming of elements which weren't
+     * provided with a name.</p>
+     */
+    public function doFinalInitialization()
+    {
+        // Heavy indexing must wait until after all columns composing
+        // a table's primary key have been parsed.
+        if ($this->heavyIndexing) {
+            $this->doHeavyIndexing();
+        }
+
+        // Name any indices which are missing a name using the
+        // appropriate algorithm.
+        $this->doNaming();
+
+        // if idMethod is "native" and in fact there are no autoIncrement
+        // columns in the table, then change it to "none"
+        if ($this->getIdMethod() === IDMethod::NATIVE) {
+            $anyAutoInc = false;
+            foreach($this->getColumns() as $col) {
+                if ($col->isAutoIncrement()) {
+                    $anyAutoInc = true;
+                    break;
+                }
+            }
+            if (!$anyAutoInc) {
+                $this->setIdMethod(IDMethod::NO_ID_METHOD);
+            }
+        }
+    }
+
+    /**
+     * <p>Adds extra indices for multi-part primary key columns.</p>
+     *
+     * <p>For databases like MySQL, values in a where clause much
+     * match key part order from the left to right.  So, in the key
+     * definition <code>PRIMARY KEY (FOO_ID, BAR_ID)</code>,
+     * <code>FOO_ID</code> <i>must</i> be the first element used in
+     * the <code>where</code> clause of the SQL query used against
+     * this table for the primary key index to be used.  This feature
+     * could cause problems under MySQL with heavily indexed tables,
+     * as MySQL currently only supports 16 indices per table (i.e. it
+     * might cause too many indices to be created).</p>
+     *
+     * <p>See <a href="http://www.mysql.com/doc/E/X/EXPLAIN.html">the
+     * manual</a> for a better description of why heavy indexing is
+     * useful for quickly searchable database tables.</p>
+     */
+    private function doHeavyIndexing()
+    {
+        if (self::DEBUG) {
+            print("doHeavyIndex() called on table " . $this->name."\n");
+        }
+
+        $pk = $this->getPrimaryKey();
+        $size = count($pk);
+
+        try {
+            // We start at an offset of 1 because the entire column
+            // list is generally implicitly indexed by the fact that
+            // it's a primary key.
+            for ($i=1; $i < $size; $i++) {
+                $this->addIndex(new Index($this, array_slice($pk, $i, $size)));
+            }
+        } catch (EngineException $e) {
+            print $e->getMessage() . "\n";
+            print $e->getTraceAsString();
+        }
+    }
+
+    /**
+     * Names composing objects which haven't yet been named.  This
+     * currently consists of foreign-key and index entities.
+     */
+    private function doNaming() {
+
+        // Assure names are unique across all databases.
+        try {
+            for ($i=0, $size = count($this->foreignKeys); $i < $size; $i++) {
+                $fk = $this->foreignKeys[$i];
+                $name = $fk->getName();
+                if (empty($name)) {
+                    $name = $this->acquireConstraintName("FK", $i + 1);
+                    $fk->setName($name);
+                }
+            }
+
+            for ($i = 0, $size = count($this->indices); $i < $size; $i++) {
+                $index = $this->indices[$i];
+                $name = $index->getName();
+                if (empty($name)) {
+                    $name = $this->acquireConstraintName("I", $i + 1);
+                    $index->setName($name);
+                }
+            }
+
+            for ($i = 0, $size = count($this->unices); $i < $size; $i++) {
+                $index = $this->unices[$i];
+                $name = $index->getName();
+                if (empty($name)) {
+                    $name = $this->acquireConstraintName("U", $i + 1);
+                    $index->setName($name);
+                }
+            }
+
+            // NOTE: Most RDBMSes can apparently name unique column
+            // constraints/indices themselves (using MySQL and Oracle
+            // as test cases), so we'll assume that we needn't add an
+            // entry to the system name list for these.
+        } catch (EngineException $nameAlreadyInUse) {
+            print $nameAlreadyInUse->getMessage() . "\n";
+            print $nameAlreadyInUse->getTraceAsString();
+        }
+    }
+
+    /**
+     * Macro to a constraint name.
+     *
+     * @param nameType constraint type
+     * @param nbr unique number for this constraint type
+     * @return unique name for constraint
+     * @throws EngineException
+     */
+    private function acquireConstraintName($nameType, $nbr)
+    {
+        $inputs = array();
+        $inputs[] = $this->getDatabase();
+        $inputs[] = $this->getName();
+        $inputs[] = $nameType;
+        $inputs[] = $nbr;
+        return NameFactory::generateName(NameFactory::CONSTRAINT_GENERATOR, $inputs);
+    }
+
+    /**
+     * Gets the value of base class for classes produced from this table.
+     *
+     * @return The base class for classes produced from this table.
+     */
+    public function getBaseClass()
+    {
+        if ($this->isAlias() && $this->baseClass === null) {
+            return $this->alias;
+        } elseif ($this->baseClass === null) {
+            return $this->getDatabase()->getBaseClass();
+        } else {
+            return $this->baseClass;
+        }
+    }
+
+    /**
+     * Set the value of baseClass.
+     * @param v  Value to assign to baseClass.
+     */
+    public function setBaseClass($v)
+    {
+        $this->baseClass = $v;
+    }
+
+    /**
+     * Get the value of basePeer.
+     * @return value of basePeer.
+     */
+    public function getBasePeer()
+    {
+        if ($this->isAlias() && $this->basePeer === null) {
+            return $this->alias . "Peer";
+        } elseif ($this->basePeer === null) {
+            return $this->getDatabase()->getBasePeer();
+        } else {
+            return $this->basePeer;
+        }
+    }
+
+    /**
+     * Set the value of basePeer.
+     * @param v  Value to assign to basePeer.
+     */
+    public function setBasePeer($v)
+    {
+        $this->basePeer = $v;
+    }
+
+    /**
+     * A utility function to create a new column from attrib and add it to this
+     * table.
+     *
+     * @param $coldata xml attributes or Column class for the column to add
+     * @return the added column
+     */
+    public function addColumn($data)
+    {
+        if ($data instanceof Column) {
+            $col = $data; // alias
+            $col->setTable($this);
+            if ($col->isInheritance()) {
+                $this->inheritanceColumn = $col;
+            }
+            $this->columnList[] = $col;
+            $this->columnsByName[$col->getName()] = $col;
+            $this->columnsByPhpName[$col->getPhpName()] = $col;
+            $col->setPosition(count($this->columnList));
+            $this->needsTransactionInPostgres |= $col->requiresTransactionInPostgres();
+            return $col;
+        } else {
+            $col = new Column();
+            $col->setTable($this);
+            $col->loadFromXML($data);
+            return $this->addColumn($col); // call self w/ different param
+        }
+    }
+
+   /**
+    * Add a validator to this table.
+    *
+    * Supports two signatures:
+    * - addValidator(Validator $validator)
+    * - addValidator(array $attribs)
+    *
+    * @param mixed $data Validator object or XML attribs (array) from <validator /> element.
+    * @return Validator The added Validator.
+    * @throws EngineException
+    */
+   public function addValidator($data)
+   {
+     if ($data instanceof Validator)
+     {
+      $validator = $data;
+      $col = $this->getColumn($validator->getColumnName());
+      if($col == null) {
+        throw new EngineException("Failed adding validator to table '" . $this->getName() .
+          "': column '" . $validator->getColumnName() . "' does not exist !");
+      }
+      $validator->setColumn($col);
+	  $validator->setTable($this);
+      $this->validatorList[] = $validator;
+      return $validator;
+     }
+     else
+     {
+      $validator = new Validator();
+	  $validator->setTable($this);
+      $validator->loadFromXML($data);
+      return $this->addValidator($validator);
+     }
+   }
+
+    /**
+     * A utility function to create a new foreign key
+     * from attrib and add it to this table.
+     */
+    public function addForeignKey($fkdata)
+    {
+        if ($fkdata instanceof ForeignKey) {
+            $fk = $fkdata;
+            $fk->setTable($this);
+            $this->foreignKeys[] = $fk;
+
+            if ($this->foreignTableNames === null) {
+                $this->foreignTableNames = array();
+            }
+            if (!in_array($fk->getForeignTableName(), $this->foreignTableNames)) {
+                $this->foreignTableNames[] = $fk->getForeignTableName();
+            }
+            return $fk;
+        } else {
+            $fk = new ForeignKey();
+            $fk->loadFromXML($fkdata);
+            return $this->addForeignKey($fk);
+        }
+    }
+
+    /**
+     * Gets the column that subclasses of the class representing this
+     * table can be produced from.
+     * @return string
+     */
+    public function getChildrenColumn()
+    {
+        return $this->inheritanceColumn;
+    }
+
+    /**
+     * Get the subclasses that can be created from this table.
+     * @return array string[] Class names
+     */
+    public function getChildrenNames()
+    {
+        if ($this->inheritanceColumn === null
+                || !$this->inheritanceColumn->isEnumeratedClasses()) {
+            return null;
+        }
+        $children = $this->inheritanceColumn->getChildren();
+        $names = array();
+        for ($i = 0, $size=count($children); $i < $size; $i++) {
+            $names[] = get_class($children[$i]);
+        }
+        return $names;
+    }
+
+    /**
+     * Adds the foreign key from another table that refers to this table.
+     */
+    public function addReferrer(ForeignKey $fk)
+    {
+        if ($this->referrers === null) {
+            $this->referrers = array();
+        }
+        $this->referrers[] = $fk;
+    }
+
+    /**
+     * Get list of references to this table.
+     */
+    public function getReferrers()
+    {
+        return $this->referrers;
+    }
+
+    /**
+     * Set whether this table contains a foreign PK
+     */
+    public function setContainsForeignPK($b)
+    {
+        $this->containsForeignPK = (boolean) $b;
+    }
+
+    /**
+     * Determine if this table contains a foreign PK
+     */
+    public function getContainsForeignPK()
+    {
+        return $this->containsForeignPK;
+    }
+
+    /**
+     * A list of tables referenced by foreign keys in this table
+     */
+    public function getForeignTableNames()
+    {
+        if ($this->foreignTableNames === null) {
+            $this->foreignTableNames = array();
+        }
+        return $this->foreignTableNames;
+    }
+
+    /**
+     * Return true if the column requires a transaction in Postgres
+     */
+    public function requiresTransactionInPostgres()
+    {
+        return $this->needsTransactionInPostgres;
+    }
+
+    /**
+     * A utility function to create a new id method parameter
+     * from attrib or object and add it to this table.
+     */
+    public function addIdMethodParameter($impdata)
+    {
+        if ($impdata instanceof IdMethodParameter) {
+            $imp = $impdata;
+            $imp->setTable($this);
+            if ($this->idMethodParameters === null) {
+                $this->idMethodParameters = array();
+            }
+            $this->idMethodParameters[] = $imp;
+            return $imp;
+        } else {
+            $imp = new IdMethodParameter();
+            $imp->loadFromXML($impdata);
+            return $this->addIdMethodParameter($imp); // call self w/ diff param
+        }
+    }
+
+    /**
+     * Adds a new index to the index list and set the
+     * parent table of the column to the current table
+     */
+    public function addIndex($idxdata)
+    {
+        if ($idxdata instanceof Index) {
+            $index = $idxdata;
+            $index->setTable($this);
+            $index->getName(); // we call this method so that the name is created now if it doesn't already exist.
+            $this->indices[] = $index;
+            return $index;
+        } else {
+            $index = new Index($this);
+            $index->loadFromXML($idxdata);
+            return $this->addIndex($index);
+        }
+    }
+
+    /**
+     * Adds a new Unique to the Unique list and set the
+     * parent table of the column to the current table
+     */
+    public function addUnique($unqdata)
+    {
+        if ($unqdata instanceof Unique) {
+            $unique = $unqdata;
+            $unique->setTable($this);
+            $unique->getName(); // we call this method so that the name is created now if it doesn't already exist.
+            $this->unices[] = $unique;
+            return $unique;
+        } else {
+            $unique = new Unique($this);
+            $unique->loadFromXML($unqdata);
+            return $this->addUnique($unique);
+        }
+    }
+
+    /**
+     * Get the name of the Table
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Set the name of the Table
+     */
+    public function setName($newName)
+    {
+        $this->name = $newName;
+    }
+
+    /**
+     * Get the description for the Table
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+
+    /**
+     * Set the description for the Table
+     *
+     * @param newDescription description for the Table
+     */
+    public function setDescription($newDescription)
+    {
+        $this->description = $newDescription;
+    }
+
+    /**
+     * Get name to use in PHP sources
+     * @return string
+     */
+    public function getPhpName()
+    {
+        if ($this->phpName === null) {
+            $inputs = array();
+            $inputs[] = $this->name;
+            $inputs[] = $this->phpNamingMethod;
+            try {
+                $this->phpName = NameFactory::generateName(NameFactory::PHP_GENERATOR, $inputs);
+            } catch (EngineException $e) {
+                print $e->getMessage() . "\n";
+                print $e->getTraceAsString();
+            }
+        }
+        return $this->phpName;
+    }
+
+    /**
+     * Set name to use in PHP sources
+     * @param string $phpName
+     */
+    public function setPhpName($phpName)
+    {
+        $this->phpName = $phpName;
+    }
+
+    /**
+     * Get the method for generating pk's
+     * [HL] changing behavior so that Database default
+     *        method is returned if no method has been specified
+     *        for the table.
+     * @return string
+     */
+    public function getIdMethod()
+    {
+        if ($this->idMethod === null) {
+            return IDMethod::NO_ID_METHOD;
+        } else {
+            return $this->idMethod;
+        }
+    }
+
+    /**
+     * Set the method for generating pk's
+     */
+    public function setIdMethod($idMethod)
+    {
+        $this->idMethod = $idMethod;
+    }
+
+    /**
+     * Skip generating sql for this table (in the event it should
+     * not be created from scratch).
+     * @return boolean Value of skipSql.
+     */
+    public function isSkipSql()
+    {
+        return ($this->skipSql || $this->isAlias() || $this->isForReferenceOnly());
+    }
+
+    /**
+     * Is table read-only, in which case only accessors (and relationship setters)
+     * will be created.
+     * @return boolan Value of readOnly.
+     */
+    public function isReadOnly()
+    {
+        return $this->readOnly;
+    }
+
+    /**
+     * Set whether this table should have its creation sql generated.
+     * @param boolean $v Value to assign to skipSql.
+     */
+    public function setSkipSql($v)
+    {
+        $this->skipSql = $v;
+    }
+
+    /**
+     * PhpName of om object this entry references.
+     * @return value of external.
+     */
+    public function getAlias()
+    {
+        return $this->alias;
+    }
+
+    /**
+     * Is this table specified in the schema or is there just
+     * a foreign key reference to it.
+     * @return value of external.
+     */
+    public function isAlias()
+    {
+        return ($this->alias !== null);
+    }
+
+    /**
+     * Set whether this table specified in the schema or is there just
+     * a foreign key reference to it.
+     * @param v  Value to assign to alias.
+     */
+    public function setAlias($v)
+    {
+        $this->alias = $v;
+    }
+
+
+    /**
+     * Interface which objects for this table will implement
+     * @return value of interface.
+     */
+    public function getInterface()
+    {
+        return $this->enterface;
+    }
+
+    /**
+     * Interface which objects for this table will implement
+     * @param v  Value to assign to interface.
+     */
+    public function setInterface($v)
+    {
+        $this->enterface = $v;
+    }
+
+    /**
+     * When a table is abstract, it marks the business object class that is
+     * generated as being abstract. If you have a table called "FOO", then the
+     * Foo BO will be <code>public abstract class Foo</code>
+     * This helps support class hierarchies
+     *
+     * @return value of abstractValue.
+     */
+    public function isAbstract()
+    {
+        return $this->abstractValue;
+    }
+
+    /**
+     * When a table is abstract, it marks the business object
+     * class that is generated as being abstract. If you have a
+     * table called "FOO", then the Foo BO will be
+     * <code>public abstract class Foo</code>
+     * This helps support class hierarchies
+     *
+     * @param v  Value to assign to abstractValue.
+     */
+    public function setAbstract($v)
+    {
+        $this->abstractValue = (boolean) $v;
+    }
+
+    /**
+     * Get the value of package.
+     * @return value of package.
+     */
+    public function getPackage()
+    {
+        return $this->pkg;
+    }
+
+    /**
+     * Set the value of package.
+     * @param v  Value to assign to package.
+     */
+    public function setPackage($v)
+    {
+        $this->pkg = $v;
+    }
+
+    /**
+     * Returns an Array containing all the columns in the table
+     */
+    public function getColumns()
+    {
+        return $this->columnList;
+    }
+
+    /**
+     * Utility method to get the number of columns in this table
+     */
+    public function getNumColumns()
+    {
+        return count($this->columnList);
+    }
+
+    /**
+     * Utility method to get the number of columns in this table
+     */
+    public function getNumLazyLoadColumns()
+    {
+        $count = 0;
+        foreach($this->columnList as $col) {
+            if ($col->isLazyLoad()) {
+                $count++;
+            }
+        }
+        return $count;
+    }
+
+    /**
+     * Returns an Array containing all the validators in the table
+     */
+    public function getValidators()
+    {
+      return $this->validatorList;
+    }
+
+    /**
+     * Returns an Array containing all the FKs in the table
+     */
+    public function getForeignKeys()
+    {
+        return $this->foreignKeys;
+    }
+
+    /**
+     * Returns a Collection of parameters relevant for the chosen
+     * id generation method.
+     */
+    public function getIdMethodParameters()
+    {
+        return $this->idMethodParameters;
+    }
+
+    /**
+     * A name to use for creating a sequence if one is not specified.
+     */
+    public function getSequenceName()
+    {
+        static $longNamesMap = array();
+        $result = null;
+        if ($this->getIdMethod() == self::NATIVE) {
+            $idMethodParams = $this->getIdMethodParameters();
+            if ($idMethodParams === null) {
+                $maxIdentifierLength = $this->getDatabase()->getPlatform()->getMaxColumnNameLength();
+                if(strlen($this->getName() . "_SEQ") > $maxIdentifierLength)
+                {
+                  if(!isset($longNamesMap[$this->getName()]))
+                  {
+                    $longNamesMap[$this->getName()] = strval(count($longNamesMap) + 1);
+                  }
+                  $result = substr($this->getName(), 0, $maxIdentifierLength - strlen("_SEQ_" . $longNamesMap[$this->getName()])) . "_SEQ_" . $longNamesMap[$this->getName()];
+                }
+                else
+                {
+                  $result = $this->getName() . "_SEQ";
+                }
+            } else {
+                $result = $idMethodParams[0]->getValue();
+            }
+        }
+        return $result;
+    }
+
+    /**
+     * Returns an Array containing all the FKs in the table
+     */
+    public function getIndices()
+    {
+        return $this->indices;
+    }
+
+    /**
+     * Returns an Array containing all the UKs in the table
+     */
+    public function getUnices()
+    {
+        return $this->unices;
+    }
+
+    /**
+     * Returns a specified column.
+     * @return Return a Column object or null if it does not exist.
+     */
+    public function getColumn($name)
+    {
+        return @$this->columnsByName[$name];
+    }
+
+    /**
+     * Returns a specified column.
+     * @return Return a Column object or null if it does not exist.
+     */
+    public function getColumnByPhpName($phpName)
+    {
+        return @$this->columnsByPhpName[$phpName];
+    }
+
+    /**
+     * Return the first foreign key that includes col in it's list
+     * of local columns.  Eg. Foreign key (a,b,c) refrences tbl(x,y,z)
+     * will be returned of col is either a,b or c.
+     * @param string $col
+     * @return Return a Column object or null if it does not exist.
+     */
+    public function getForeignKey($col)
+    {
+        $firstFK = null;
+        for($i=0,$size=count($this->foreignKeys); $i < $size; $i++) {
+            $key = $this->foreignKeys[$i];
+            if (in_array($col, $key->getLocalColumns())) {
+                if ($firstFK === null) {
+                    $firstFK = $key;
+                } else {
+                    throw new EngineException($col . " has ben declared as a foreign key multiple times.  This is not"
+                                       . " being handled properly. (Try moving foreign key declarations to the foreign table.)");
+                }
+            }
+        }
+        return $firstFK;
+    }
+
+    /**
+     * Returns true if the table contains a specified column
+     * @param mixed $col Column or column name.
+     */
+    public function containsColumn($col)
+    {
+        if ($col instanceof Column) {
+            return in_array($col, $this->columnList);
+        } else {
+            return ($this->getColumn($col) !== null);
+        }
+    }
+
+    /**
+     * Set the parent of the table
+     *
+     * @param parent the parant database
+     */
+    public function setDatabase($parent)
+    {
+        $this->tableParent = $parent;
+    }
+
+    /**
+     * Get the parent of the table
+     *
+     * @return the parant database
+     */
+    public function getDatabase()
+    {
+        return $this->tableParent;
+    }
+
+    /**
+     * Flag to determine if code/sql gets created for this table.
+     * Table will be skipped, if return true.
+     * @return value of forReferenceOnly.
+     */
+    public function isForReferenceOnly()
+    {
+        return $this->forReferenceOnly;
+    }
+
+    /**
+     * Flag to determine if code/sql gets created for this table.
+     * Table will be skipped, if set to true.
+     * @param v  Value to assign to forReferenceOnly.
+     */
+    public function setForReferenceOnly($v)
+    {
+        $this->forReferenceOnly = (boolean) $v;
+    }
+
+   /**
+     * Flag to determine if tree node class should be generated for this table.
+     * @return valur of isTree
+    */
+   public function isTree()
+   {
+        return $this->isTree;
+   }
+
+    /**
+     * Flag to determine if tree node class should be generated for this table.
+     * @param v  Value to assign to isTree.
+     */
+    public function setIsTree($v)
+    {
+        $this->isTree = (boolean) $v;
+    }
+
+    /**
+     * Returns a XML representation of this table.
+     *
+     * @return XML representation of this table
+     */
+    public function toString() {
+
+        $result = "<table name=\"" . $this->name . "\"";
+
+        if ($this->phpName !== null) {
+            $result .= " phpName=\""
+                  . $this->phpName
+                  . '"';
+        }
+
+        if ($this->idMethod !== null) {
+            $result .= " idMethod=\""
+                  . $this->idMethod
+                  . '"';
+        }
+
+        if ($this->skipSql) {
+            $result .= " skipSql=\""
+                  . ($this->skipSql ? "true" : "false")
+                  . '"';
+        }
+
+        if ($this->readOnly) {
+            $result .= " readOnly=\""
+                  . ($this->readOnly ? "true" : "false")
+                  . '"';
+        }
+
+        if ($this->isTree) {
+            $result .= " isTree=\""
+                  . ($this->isTree ? "true" : "false")
+                  . '"';
+        }
+
+        if ($this->forReferenceOnly) {
+            $result .= " forReferenceOnly=\""
+                  . ($this->forReferenceOnly ? "true" : "false")
+                  . '"';
+        }
+
+        if ($this->abstractValue) {
+            $result .= " abstract=\""
+                  . ($this->abstractValue ? "true" : "false")
+                  . '"';
+        }
+
+        if ($this->enterface !== null) {
+            $result .= " interface=\""
+                  . $this->enterface
+                  . '"';
+        }
+
+        if ($this->description !== null) {
+            $result .= " description=\""
+                  . $this->description
+                  . '"';
+        }
+
+        if ($this->baseClass !== null) {
+            $result .= " baseClass=\""
+                  . $this->baseClass
+                  . '"';
+        }
+
+        if ($this->basePeer !== null) {
+            $result .= " basePeer=\""
+                  . $this->basePeer
+                  . '"';
+        }
+
+        $result .= ">\n";
+
+        if ($this->columnList !== null) {
+            for($i=0,$_i=count($this->columnList); $i < $_i; $i++) {
+                $result .= $this->columnList[$i]->toString();
+            }
+        }
+
+        if ($this->validatorList !== null) {
+            for($i=0,$_i=count($this->validatorList); $i < $_i; $i++) {
+                $result .= $this->validatorList[$i]->toString();
+            }
+        }
+
+        if ($this->foreignKeys !== null) {
+            for($i=0,$_i=count($this->foreignKeys); $i < $_i; $i++) {
+                $result .= $this->foreignKeys[$i]->toString();
+            }
+        }
+
+        if ($this->idMethodParameters !== null) {
+            for($i=0,$_i=count($this->idMethodParameters); $i < $_i; $i++) {
+                $result .= $this->idMethodParameters[$i]->toString();
+            }
+        }
+
+        $result .= "</table>\n";
+
+        return $result;
+    }
+
+    /**
+     * Returns the collection of Columns which make up the single primary
+     * key for this table.
+     *
+     * @return array A list of the primary key parts.
+     */
+    public function getPrimaryKey()
+    {
+        $pk = array();
+        for($i=0,$_i=count($this->columnList); $i < $_i; $i++) {
+            $col = $this->columnList[$i];
+            if ($col->isPrimaryKey()) {
+                $pk[] = $col;
+            }
+        }
+        return $pk;
+    }
+
+    /**
+     * Determine whether this table has a primary key.
+     *
+     * @return boolean Whether this table has any primary key parts.
+     */
+    public function hasPrimaryKey()
+    {
+        return (count($this->getPrimaryKey()) > 0);
+    }
+
+	/**
+	 * Determine whether this table has any auto-increment primary key(s).
+	 *
+	 * @return boolean Whether this table has a non-"none" id method and has a primary key column that is auto-increment.
+	 */
+	public function hasAutoIncrementPrimaryKey()
+	{
+		if ($this->getIdMethod() != IDMethod::NO_ID_METHOD) {
+			$pks =$this->getPrimaryKey();
+			foreach ($pks as $pk) {
+				if ($pk->isAutoIncrement()) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+    /**
+     * Returns all parts of the primary key, separated by commas.
+     *
+     * @return A CSV list of primary key parts.
+     * @deprecated Use the DDLBuilder->getColumnList() with the #getPrimaryKey() method.
+     */
+    public function printPrimaryKey()
+    {
+        return $this->printList($this->columnList);
+    }
+
+    /**
+     * Returns the elements of the list, separated by commas.
+     * @param array $list
+     * @return A CSV list.
+     * @deprecated Use the DDLBuilder->getColumnList() with the #getPrimaryKey() method.
+     */
+    private function printList($list){
+        $result = "";
+        $comma = 0;
+        for($i=0,$_i=count($list); $i < $_i; $i++) {
+            $col = $list[$i];
+            if ($col->isPrimaryKey()) {
+                $result .= ($comma++ ? ',' : '') . $this->getDatabase()->getPlatform()->quoteIdentifier($col->getName());
+            }
+        }
+        return $result;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Table.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Unique.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Unique.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Unique.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,69 @@
+<?php
+/*
+ *  $Id: Unique.php 105 2005-06-04 23:21:07Z david $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+include_once 'propel/engine/database/model/Index.php';
+
+/**
+ * Information about unique columns of a table.  This class assumes
+ * that in the underlying RDBMS, unique constraints and unique indices
+ * are roughly equivalent.  For example, adding a unique constraint to
+ * a column also creates an index on that column (this is known to be
+ * true for MySQL and Oracle).
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Jason van Zyl <jvanzyl en apache.org> (Torque)
+ * @author Daniel Rall <dlr en collab.net> (Torque)
+ * @version $Revision: 105 $
+ * @package propel.engine.database.model
+ */
+class Unique extends Index {
+
+    /**
+     * Default constructor.
+     */
+    public function __construct(Table $table, $indexColumns = array())
+    {
+    }
+
+    /**
+     * Returns <code>true</code>.
+     */
+    public function isUnique()
+    {
+        return true;
+    }
+
+    /**
+     * String representation of the index. This is an xml representation.
+     */
+    public function toString()
+    {
+        $result = " <unique name=\"" . $this->getName() . "\">\n";        
+        $columns = $this->getColumns();
+        for ($i=0, $size=count($columns); $i < $size; $i++) {
+            $result .= "  <unique-column name=\""
+                . $columns[$i]
+                . "\"/>\n";
+        }
+        $result .= " </unique>\n";
+        return $result;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Unique.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Validator.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Validator.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Validator.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,186 @@
+<?php
+/*
+ *  $Id: Validator.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/database/model/XMLElement.php';
+include_once 'propel/engine/EngineException.php';
+include_once 'propel/engine/database/model/PropelTypes.php';
+include_once 'propel/engine/database/model/Rule.php';
+
+/**
+ * Validator.
+ *
+ * @author Michael Aichler <aichler en mediacluster.de> (Propel)
+ * @version $Revision: 64 $
+ * @package propel.engine.database.model
+ */
+class Validator extends XMLElement {
+
+    const TRANSLATE_NONE = "none";
+    const TRANSLATE_GETTEXT = "gettext";
+
+    private $columnName;
+    private $column;
+    private $ruleList;
+    private $translate;
+    private $table;
+	
+    /**
+     * Creates a new column and set the name
+     *
+     * @param name validator name
+     */
+    public function __construct()
+    {
+        $this->ruleList = array();
+    }
+
+    /**
+     * Sets up the Validator object based on the attributes that were passed to loadFromXML().
+	 * @see parent::loadFromXML()
+     */
+    protected function setupObject()
+    {
+        $this->columnName = $this->getAttribute("column");
+        $this->translate = $this->getAttribute("translate", $this->getTable()->getDatabase()->getDefaultTranslateMethod());;
+    }
+    
+    /**
+     * Add a Rule to this validator.
+     * Supports two signatures:
+     * - addRule(Rule $rule)
+     * - addRule(array $attribs)
+     * @param mixed $data Rule object or XML attribs (array) from <rule/> element.
+     * @return Rule The added Rule.
+     */
+    public function addRule($data)
+    {
+        if ($data instanceof Rule) {
+            $rule = $data; // alias
+            $rule->setValidator($this);
+            $this->ruleList[] = $rule;
+            return $rule;
+        }
+        else {
+            $rule = new Rule();
+            $rule->setValidator($this);
+            $rule->loadFromXML($data);
+            return $this->addRule($rule); // call self w/ different param
+        }
+    }
+    
+    /**
+     * Gets an array of all added rules for this validator.
+     * @return array Rule[]
+     */
+    public function getRules()
+    {
+        return $this->ruleList;
+    }
+    
+    /**
+     * Gets the name of the column that this Validator applies to.
+     * @return string
+     */
+    public function getColumnName()
+    {
+        return $this->columnName;
+    }
+    
+    /**
+     * Sets the Column object that this validator applies to.
+     * @param Column $column
+     * @see Table::addValidator()
+     */
+    public function setColumn(Column $column)
+    {
+        $this->column = $column;
+    }
+    
+    /**
+     * Gets the Column object that this validator applies to.
+     * @return Column
+     */
+    public function getColumn()
+    {
+        return $this->column;
+    }
+	
+	/**
+	 * Set the owning Table.
+	 * @param Table $table
+	 */
+	public function setTable(Table $table)
+	{
+		$this->table = $table;
+	}
+	
+	/**
+	 * Get the owning Table.
+	 * @return Table
+	 */
+	public function getTable()
+	{
+		return $this->table;
+	}
+
+    /**
+     * Set the translation mode to use for the message.
+     * Currently only "gettext" and "none" are supported.  The default is "none".
+     * @param string $method Translation method ("gettext", "none").
+     */
+    public function setTranslate($method)
+    {
+        $this->translate = $method;
+    }
+    
+    /**
+     * Get the translation mode to use for the message.
+     * Currently only "gettext" and "none" are supported.  The default is "none".
+     * @return string Translation method ("gettext", "none").
+     */
+    public function getTranslate()
+    {
+        return $this->translate;
+    }
+    
+    /**
+     * Gets XML (string) representation of this Validator.
+     * @return string
+     */
+    public function toString()
+    {
+        $result = "<validator column=\"" . $this->columnName . "\"";
+        if ($this->translate !== null) {
+            $result .= " translate=\"".$this->translate."\"";
+        }
+        $result .= ">\n";
+        
+        if ($this->ruleList !== null) {
+            for($i=0,$_i=count($this->ruleList); $i < $_i; $i++) {
+                $result .= $this->ruleList[$i]->toString();
+            }
+        }
+        
+        $result .= "</validator>\n";
+        
+        return $result;
+    }
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/Validator.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/XMLElement.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/XMLElement.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/XMLElement.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,141 @@
+<?php
+/*
+ *  $Id: XMLElement.php 315 2005-12-24 20:48:31Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+/**
+ * An abstract class for elements represented by XML tags (e.g. Column, Table).
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 315 $
+ * @package propel.engine.database.model
+ */
+abstract class XMLElement {
+	
+	protected $attributes = array();
+	
+	protected $vendorSpecificInfo = array();
+	 
+	/**
+	 * Replaces the old loadFromXML() so that we can use loadFromXML() to load the attribs into the class.
+	 */
+	abstract protected function setupObject();
+	
+	/**
+	 * This is the entry point method for loading data from XML.
+	 * It calls a setupObject() method that must be implemented by the child class.
+	 * @param array $attributes The attributes for the XML tag.
+	 */
+	public function loadFromXML($attributes) {
+		$this->attributes = array_change_key_case($attributes, CASE_LOWER);
+		$this->setupObject();
+	}
+	
+	/**
+	 * Returns the assoc array of attributes.
+	 * All attribute names (keys) are lowercase.
+	 * @return array
+	 */
+	public function getAttributes() {
+		return $this->attributes;
+	}
+	
+	/**
+	 * Gets a particular attribute by [case-insensitive] name.
+	 * If attribute is not set then the $defaultValue is returned.
+	 * @param string $name The [case-insensitive] name of the attribute to lookup.
+	 * @param mixed $defaultValue The default value to use in case the attribute is not set.
+	 * @return mixed The value of the attribute or $defaultValue if not set.
+	 */
+	public function getAttribute($name, $defaultValue = null) {
+		$name = strtolower($name);
+		if (isset($this->attributes[$name])) {
+			return $this->attributes[$name];
+		} else {
+			return $defaultValue;
+		}
+	}
+	
+	/**
+     * Converts value specified in XML to a boolean value.
+     * This is to support the default value when used w/ a boolean column.
+     * @return value
+     */
+    protected function booleanValue($val) {
+        if (is_numeric($val)) {
+            return (bool) $val;
+        } else {
+            return (in_array(strtolower($val), array('true', 't', 'y', 'yes'), true) ? true : false);
+        }
+    }
+	
+	/**
+     * Sets vendor specific parameter that applies to this object.
+	 * @param string $name
+	 * @param string $value
+     */
+    public function setVendorParameter($name, $value)
+    {
+        $this->vendorSpecificInfo[$name] = $value;
+    }
+	
+	/**
+     * Whether specified vendor specific information is set.
+	 * @param string $name
+	 * @return boolean
+     */
+    public function hasVendorParameter($name)
+    {
+        return isset($this->vendorSpecificInfo[$name]);
+    }
+	
+	/**
+     * Returns specified vendor specific information is set.
+	 * @param string $name
+	 * @return string
+     */
+    public function getVendorParameter($name)
+    {
+		if (isset($this->vendorSpecificInfo[$name])) {
+		    return $this->vendorSpecificInfo[$name];
+		}
+        return null; // just to be explicit
+    }
+	
+    /**
+     * Sets vendor specific information for this object.
+	 * @param array $info
+     */
+    public function setVendorSpecificInfo($info)
+    {
+        $this->vendorSpecificInfo = $info;
+    }
+
+    /**
+     * Retrieves vendor specific information for this object.
+	 * @return array
+     */
+    public function getVendorSpecificInfo()
+    {
+        return $this->vendorSpecificInfo;
+    }
+	
+	
+
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/model/XMLElement.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/transform/XmlToAppData.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/transform/XmlToAppData.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/transform/XmlToAppData.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,420 @@
+<?php
+
+/*
+ *  $Id: XmlToAppData.php 337 2006-02-15 14:41:54Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+include_once 'propel/engine/database/model/AppData.php';
+
+// Phing dependencies
+require_once 'phing/parser/AbstractHandler.php';
+include_once 'phing/system/io/FileReader.php';
+
+/**
+ * A class that is used to parse an input xml schema file and creates an AppData
+ * PHP object.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Leon Messerschmidt <leon en opticode.co.za> (Torque)
+ * @author Jason van Zyl <jvanzyl en apache.org> (Torque)
+ * @author Martin Poeschl <mpoeschl en marmot.at> (Torque)
+ * @author Daniel Rall <dlr en collab.net> (Torque)
+ * @version $Revision: 337 $
+ * @package propel.engine.database.transform
+ */
+class XmlToAppData extends AbstractHandler {
+
+	/** enables debug output */
+	const DEBUG = false;
+
+	private $app;
+	private $platform;
+	private $currDB;
+	private $currTable;
+	private $currColumn;
+	private $currFK;
+	private $currIndex;
+	private $currUnique;
+	private $currValidator;
+	private $currVendorObject;
+
+	private $isForReferenceOnly;
+	private $currentPackage;
+	private $currentXmlFile;
+	private $defaultPackage;
+
+	private $encoding;
+
+	/** two-dimensional array,
+		first dimension is for schemas(key is the path to the schema file),
+		second is for tags within the schema */
+	private $schemasTagsStack = array();
+
+	public $parser;
+
+	/**
+	 * Creates a new instance for the specified database type.
+	 *
+	 * @param Platform $platform The type of database for the application.
+	 * @param string $defaultPackage the default PHP package used for the om
+	 * @param string $encoding The database encoding.
+	 */
+	public function __construct(Platform $platform, $defaultPackage, $encoding = 'iso-8859-1')
+	{
+		$this->app = new AppData($platform);
+		$this->platform = $platform;
+		$this->defaultPackage = $defaultPackage;
+		$this->firstPass = true;
+		$this->encoding = $encoding;
+	}
+	
+	/**
+	 * Parses a XML input file and returns a newly created and
+	 * populated AppData structure.
+	 *
+	 * @param string $xmlFile The input file to parse.
+	 * @return AppData populated by <code>xmlFile</code>.
+	 */
+	public function parseFile($xmlFile)
+	{
+		// we don't want infinite recursion
+		if($this->isAlreadyParsed($xmlFile)) {
+			return;
+		}
+
+		$domDocument = new DomDocument('1.0', 'UTF-8');
+		$domDocument->load($xmlFile);
+
+		// store current schema file path
+		$this->schemasTagsStack[$xmlFile] = array();
+
+		$this->currentXmlFile = $xmlFile;		
+
+		try {
+			$fr = new FileReader($xmlFile);
+		} catch (Exception $e) {
+			$f = new PhingFile($xmlFile);
+			throw new Exception("XML File not found: " . $f->getAbsolutePath());
+		}
+
+		$br = new BufferedReader($fr);
+
+		$this->parser = new ExpatParser($br);
+		$this->parser->parserSetOption(XML_OPTION_CASE_FOLDING, 0);
+		$this->parser->setHandler($this);
+
+		try {
+			$this->parser->parse();
+		} catch (Exception $e) {
+			$br->close();
+			throw $e;
+		}
+		$br->close();
+
+		array_pop($this->schemasTagsStack);
+
+		return $this->app;
+	}
+
+	/**
+	 * Handles opening elements of the xml file.
+	 *
+	 * @param string $uri
+	 * @param string $localName The local name (without prefix), or the empty string if
+	 *		 Namespace processing is not being performed.
+	 * @param string $rawName The qualified name (with prefix), or the empty string if
+	 *		 qualified names are not available.
+	 * @param string $attributes The specified or defaulted attributes
+	 */
+	public function startElement($name, $attributes) {
+
+		try {
+
+	  $parentTag = $this->peekCurrentSchemaTag();
+
+	  if ($parentTag === false) {
+
+				switch($name) {
+					case "database":
+						if ($this->isExternalSchema()) {
+							$this->currentPackage = @$attributes["package"];
+							if ($this->currentPackage === null) {
+								$this->currentPackage = $this->defaultPackage;
+							}
+						} else {
+							$this->currDB = $this->app->addDatabase($attributes);
+						}
+					break;
+
+					default:
+						$this->_throwInvalidTagException($name);
+				}
+
+			} elseif  ($parentTag == "database") {
+
+				switch($name) {
+
+					case "external-schema":
+						$xmlFile = @$attributes["filename"];
+
+						//"referenceOnly" attribute is valid in the main schema XML file only,
+						//and it's ingnored in the nested external-schemas
+						if(!$this->isExternalSchema()) {
+							$isForRefOnly = @$attributes["referenceOnly"];
+							$this->isForReferenceOnly = ($isForRefOnly !== null ? (strtolower($isForRefOnly) === "true") : true); // defaults to TRUE
+						}
+
+						if ($xmlFile{0} != '/') {
+							$f = new PhingFile($this->currentXmlFile);
+							$xf = new PhingFile($f->getParent(), $xmlFile);
+							$xmlFile = $xf->getPath();
+						}
+
+						$this->parseFile($xmlFile);
+					break;
+
+		  case "domain":
+					  $this->currDB->addDomain($attributes);
+				  break;
+
+					case "table":
+						$this->currTable = $this->currDB->addTable($attributes);
+						if ($this->isExternalSchema()) {
+							$this->currTable->setForReferenceOnly($this->isForReferenceOnly);
+							$this->currTable->setPackage($this->currentPackage);
+						}
+					break;
+
+					case "vendor":
+						$this->currVendorObject = new ObjectWithVendorSpecificData($this->currDB, $attributes['type']);
+					break;
+
+					default:
+						$this->_throwInvalidTagException($name);
+				}
+
+			} elseif  ($parentTag == "table") {
+
+				switch($name) {
+					case "column":
+						$this->currColumn = $this->currTable->addColumn($attributes);
+					break;
+
+					case "foreign-key":
+						$this->currFK = $this->currTable->addForeignKey($attributes);
+					break;
+
+					case "index":
+						$this->currIndex = $this->currTable->addIndex($attributes);
+					break;
+
+					case "unique":
+						$this->currUnique = $this->currTable->addUnique($attributes);
+					break;
+
+					case "vendor":
+						$this->currVendorObject = new ObjectWithVendorSpecificData($this->currTable, $attributes['type']);
+					break;
+
+		  case "validator":
+					  $this->currValidator = $this->currTable->addValidator($attributes);
+		  break;
+
+		  case "id-method-parameter":
+			$this->currTable->addIdMethodParameter($attributes);
+					break;
+
+					default:
+						$this->_throwInvalidTagException($name);
+				}
+
+			} elseif  ($parentTag == "column") {
+
+				switch($name) {
+					case "inheritance":
+						$this->currColumn->addInheritance($attributes);
+					break;
+
+					case "vendor":
+						$this->currVendorObject = new ObjectWithVendorSpecificData($this->currColumn, $attributes['type']);
+					break;
+
+					default:
+						$this->_throwInvalidTagException($name);
+				}
+
+			} elseif ($parentTag == "foreign-key") {
+
+				switch($name) {
+					case "reference":
+						$this->currFK->addReference($attributes);
+					break;
+
+					case "vendor":
+						$this->currVendorObject = new ObjectWithVendorSpecificData($this->currFK, $attributes['type']);
+					break;
+
+					default:
+						$this->_throwInvalidTagException($name);
+				}
+
+			} elseif  ($parentTag == "index") {
+
+				switch($name) {
+					case "index-column":
+						$this->currIndex->addColumn($attributes);
+					break;
+
+					case "vendor":
+						$this->currVendorObject = new ObjectWithVendorSpecificData($this->currIndex, $attributes['type']);
+					break;
+
+					default:
+						$this->_throwInvalidTagException($name);
+				}
+
+			} elseif ($parentTag == "unique") {
+
+				switch($name) {
+					case "unique-column":
+						$this->currUnique->addColumn($attributes);
+					break;
+
+					case "vendor":
+						$this->currVendorObject = new ObjectWithVendorSpecificData($this->currUnique, $attributes['type']);
+					break;
+
+					default:
+						$this->_throwInvalidTagException($name);
+				}
+	  } elseif ($parentTag == "validator") {
+		switch($name) {
+		  case "rule":
+					  $this->currValidator->addRule($attributes);
+		  break;
+		  default:
+			$this->_throwInvalidTagException($name);
+		}
+			} elseif ($parentTag == "vendor") {
+
+				switch($name) {
+					case "parameter":
+						if($this->currVendorObject->isCompatible($this->platform->getDatabaseType())) {
+							$this->currVendorObject->setVendorParameter($attributes['name'], iconv('utf-8',$this->encoding, $attributes['value']));
+						}
+					break;
+
+					default:
+						$this->_throwInvalidTagException($name);
+				}
+
+			} else {
+				// it must be an invalid tag
+		$this->_throwInvalidTagException($name);
+	  }
+
+			$this->pushCurrentSchemaTag($name);
+
+		} catch (BuildException $e) {
+			throw $e;
+		} catch (Exception $e) {
+			echo $e;
+			echo "\n";
+			throw $e;
+		}
+	}
+
+	function _throwInvalidTagException($tag_name)
+	{
+		throw new BuildException("Unexpected tag <" . $tag_name . ">", $this->parser->getLocation());
+	}
+
+	/**
+	 * Handles closing elements of the xml file.
+	 *
+	 * @param uri
+	 * @param localName The local name (without prefix), or the empty string if
+	 *		 Namespace processing is not being performed.
+	 * @param rawName The qualified name (with prefix), or the empty string if
+	 *		 qualified names are not available.
+	 */
+	public function endElement($name)
+	{
+		if (self::DEBUG) {
+			print("endElement(" . $name . ") called\n");
+		}
+
+		$this->popCurrentSchemaTag();
+	}
+
+	protected function peekCurrentSchemaTag()
+	{
+				$keys = array_keys($this->schemasTagsStack);
+		return end($this->schemasTagsStack[end($keys)]);
+	}
+
+	protected function popCurrentSchemaTag()
+	{
+				$keys = array_keys($this->schemasTagsStack);
+		array_pop($this->schemasTagsStack[end($keys)]);
+	}
+
+	protected function pushCurrentSchemaTag($tag)
+	{
+				$keys = array_keys($this->schemasTagsStack);
+		$this->schemasTagsStack[end($keys)][] = $tag;
+	}
+
+	protected function isExternalSchema()
+	{
+		return (sizeof($this->schemasTagsStack) > 1);
+	}
+
+	protected function isAlreadyParsed($filePath)
+	{
+		return isset($this->schemasTagsStack[$filePath]);
+	}
+}
+
+/**
+ * Utility class used for objects with vendor data.
+ *
+ * @package propel.engine.database.transform
+ */
+class ObjectWithVendorSpecificData
+{
+	protected $object;
+	protected $vendorType;
+
+	public function __construct($object, $vendorType)
+	{
+		$this->object = $object;
+		$this->vendorType = $vendorType;
+	}
+
+	public function isCompatible($type)
+	{
+		return ($this->vendorType == $type);
+	}
+
+	public function setVendorParameter($name, $value)
+	{
+		$this->object->setVendorParameter($name, $value);
+	}
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/transform/XmlToAppData.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/transform/XmlToData.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/transform/XmlToData.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/transform/XmlToData.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,189 @@
+<?php
+
+/*
+ *  $Id: XmlToData.php 262 2005-11-07 20:19:14Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'phing/parser/AbstractHandler.php';
+
+/**
+ * A Class that is used to parse an input xml schema file and creates an
+ * AppData object.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Leon Messerschmidt <leon en opticode.co.za> (Torque)
+ * @author Jason van Zyl <jvanzyl en apache.org> (Torque)
+ * @author Martin Poeschl <mpoeschl en marmot.at> (Torque)
+ * @author Fedor Karpelevitch <fedor.karpelevitch en home.com> (Torque)
+ * @version $Revision: 262 $
+ * @package propel.engine.database.transform
+ */
+class XmlToData extends AbstractHandler {
+
+    private $database;
+    private $data;
+
+    private $encoding;
+
+    public $parser;
+
+    const DEBUG = false;
+
+    /**
+     * Construct new XmlToData class.
+     *
+     * This class is passed the Database object so that it knows what to expect from
+     * the XML file.
+     *
+     * @param Database $database
+     */
+    public function __construct(Database $database, $encoding = 'iso-8859-1')
+    {
+        $this->database = $database;
+        $this->encoding = $encoding;
+    }
+
+    /**
+     *
+     */
+    public function parseFile($xmlFile)
+    {
+        try {
+
+            $this->data = array();
+			
+            try {
+                $fr = new FileReader($xmlFile);
+            } catch (Exception $e) {
+                $f = new PhingFile($xmlFile);
+                throw new BuildException("XML File not found: " . $f->getAbsolutePath());
+            }
+
+            $br = new BufferedReader($fr);
+
+            $this->parser = new ExpatParser($br);
+            $this->parser->parserSetOption(XML_OPTION_CASE_FOLDING, 0);
+            $this->parser->setHandler($this);
+
+            try {
+                $this->parser->parse();
+            } catch (Exception $e) {
+                print $e->getMessage() . "\n";
+                $br->close();
+            }
+            $br->close();
+        } catch (Exception $e) {
+            print $e->getMessage() . "\n";
+            print $e->getTraceAsString();
+        }
+
+        return $this->data;
+    }
+
+    /**
+     * Handles opening elements of the xml file.
+     */
+    public function startElement($name, $attributes)
+    {
+        try {
+            if ($name == "dataset") {
+                // we don't do anything w/ <dataset> tag right now.
+            } else {
+                $table = $this->database->getTableByPhpName($name);
+
+                $this->columnValues = array();
+                foreach($attributes as $name => $value) {
+                    $col = $table->getColumnByPhpName($name);
+                    $this->columnValues[] = new ColumnValue($col, iconv('utf-8',$this->encoding, $value));
+                }
+                $this->data[] = new DataRow($table, $this->columnValues);
+            }
+        } catch (Exception $e) {
+            print $e;
+            throw $e;
+        }
+    }
+
+
+    /**
+     * Handles closing elements of the xml file.
+     *
+     * @param $name The local name (without prefix), or the empty string if
+     *         Namespace processing is not being performed.
+     */
+    public function endElement($name)
+    {
+        if (self::DEBUG) {
+            print("endElement(" . $name . ") called\n");
+        }
+    }
+
+} // XmlToData
+
+    /**
+     * "inner class"
+     * @package propel.engine.database.transform
+     */
+    class DataRow
+    {
+        private $table;
+        private $columnValues;
+
+        public function __construct(Table $table, $columnValues)
+        {
+            $this->table = $table;
+            $this->columnValues = $columnValues;
+        }
+
+        public function getTable()
+        {
+            return $this->table;
+        }
+
+        public function getColumnValues()
+        {
+            return $this->columnValues;
+        }
+    }
+
+    /**
+     * "inner" class
+     * @package propel.engine.database.transform
+     */
+    class ColumnValue {
+
+        private $col;
+        private $val;
+
+        public function __construct(Column $col, $val)
+        {
+            $this->col = $col;
+            $this->val = $val;
+        }
+
+        public function getColumn()
+        {
+            return $this->col;
+        }
+
+        public function getValue()
+        {
+            return $this->val;
+        }
+    }


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/database/transform/XmlToData.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/DefaultPlatform.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/DefaultPlatform.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/DefaultPlatform.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,169 @@
+<?php
+/*
+ *  $Id: DefaultPlatform.php 137 2005-11-17 14:11:19Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+require_once 'propel/engine/platform/Platform.php';
+include_once 'propel/engine/database/model/Domain.php';
+
+/**
+ * Default implementation for the Platform interface.
+ *
+ * @author Martin Poeschl <mpoeschl en marmot.at> (Torque)
+ * @version $Revision: 258 $
+ * @package propel.engine.platform
+ */
+class DefaultPlatform implements Platform {
+
+    private $schemaDomainMap;
+    
+    /**
+     * Default constructor.
+     */
+    public function __construct() 
+    {
+        $this->initialize();
+    }
+    
+    protected function initialize()
+    {
+        $this->schemaDomainMap = array();
+        foreach(PropelTypes::getPropelTypes() as $type) {
+            $this->schemaDomainMap[$type] = new Domain($type);
+        }
+		$this->schemaDomainMap[PropelTypes::BU_DATE] = new Domain("DATE");
+		$this->schemaDomainMap[PropelTypes::BU_TIMESTAMP] = new Domain("TIMESTAMP");
+        $this->schemaDomainMap[PropelTypes::BOOLEAN] = new Domain("INTEGER");
+    }
+    
+    protected function setSchemaDomainMapping(Domain $domain) 
+    {
+        $this->schemaDomainMap[$domain->getType()] = $domain;
+    }
+    
+	/**
+	 * Returns the short name of the database type that this platform represents.
+	 * For example MysqlPlatform->getDatabaseType() returns 'mysql'.
+	 * @return string
+	 */
+	public function getDatabaseType()
+	{
+		$clazz = get_class($this);
+		$pos = strpos($clazz, 'Platform');
+		return strtolower(substr($clazz,0,$pos));
+	}
+	
+    /**
+     * @see Platform::getMaxColumnNameLength()
+     */
+    public function getMaxColumnNameLength()
+    {
+        return 64;
+    }
+
+    /**
+     * @see Platform::getNativeIdMethod()
+     */
+    public function getNativeIdMethod()
+    {
+        return Platform::IDENTITY;
+    }
+
+    /**
+     * @see Platform::getDomainForType()
+     */
+    public function getDomainForType($propelType) 
+    {
+		if (!isset($this->schemaDomainMap[$propelType])) {
+			throw new EngineException("Cannot map unknown Propel type " . var_export($propelType, true) . " to native database type.");
+		}
+        return $this->schemaDomainMap[$propelType];
+    }
+
+    /**
+     * @return Only produces a SQL fragment if null values are
+     * disallowed.
+     * @see Platform::getNullString(boolean)
+     */
+    public function getNullString($notNull)
+    {
+        // TODO: Check whether this is true for all DBs.  Also verify
+        // the old Sybase templates.
+        return ($notNull ? "NOT NULL" : "");
+    }
+
+    /**
+     * @see Platform::getAutoIncrement()
+     */
+    public function getAutoIncrement()
+    {
+        return "IDENTITY";
+    }
+
+    /**
+     * @see Platform::hasScale(String)
+     * TODO collect info for all platforms
+     */
+    public function hasScale($sqlType)
+    {
+        return true;
+    }
+
+    /**
+     * @see Platform::hasSize(String)
+     * TODO collect info for all platforms
+     */
+    public function hasSize($sqlType)
+    {
+        return true;
+    }
+
+    /**
+     * @see Platform::escapeText()
+     */ 
+    public function escapeText($text)
+    {
+        return str_replace("'", "''", $text);
+    }
+    
+	/**
+	 * @see Platform::quoteIdentifier()
+	 */
+	public function quoteIdentifier($text)
+	{
+		return '"' . $text . '"';
+	}
+	
+    /**
+     * @see Platform::supportsNativeDeleteTrigger()
+     */
+    public function supportsNativeDeleteTrigger()
+    {
+        return false;
+    }
+    
+    /**
+     * @see Platform::getBooleanString()
+     */
+    public function getBooleanString($b)
+    {
+        $b = ($b === true || strtolower($b) === 'true' || $b === 1 || $b === '1' || strtolower($b) === 'y' || strtolower($b) === 'yes');
+        return ($b ? '1' : '0');
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/DefaultPlatform.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/MssqlPlatform.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/MssqlPlatform.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/MssqlPlatform.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,99 @@
+<?php
+/*
+ *  $Id: MssqlPlatform.php 137 2005-11-17 14:11:19Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+require_once 'propel/engine/platform/DefaultPlatform.php';
+include_once 'propel/engine/database/model/Domain.php';
+
+/**
+ * MS SQL Platform implementation.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Martin Poeschl <mpoeschl en marmot.at> (Torque)
+ * @version $Revision: 256 $
+ * @package propel.engine.platform
+ */
+class MssqlPlatform extends DefaultPlatform {    
+
+    /**
+     * Initializes db specific domain mapping.
+     */
+    protected function initialize()
+    {
+        parent::initialize();
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::INTEGER, "INT"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BOOLEAN, "INT"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::DOUBLE, "FLOAT"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARCHAR, "TEXT"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::CLOB, "TEXT"));  
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::DATE, "DATETIME"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BU_DATE, "DATETIME"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::TIME, "DATETIME"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::TIMESTAMP, "DATETIME"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BU_TIMESTAMP, "DATETIME"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BINARY, "BINARY(7132)"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::VARBINARY, "IMAGE"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARBINARY, "IMAGE"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BLOB, "IMAGE"));
+    }
+    
+    /**
+     * @see Platform#getMaxColumnNameLength()
+     */
+    public function getMaxColumnNameLength()
+    {
+        return 128;
+    }
+    
+    /**
+     * @return Explicitly returns <code>NULL</code> if null values are
+     * allowed (as recomended by Microsoft).
+     * @see Platform#getNullString(boolean)
+     */
+    public function getNullString($notNull) 
+    {
+        return ($notNull ? "NOT NULL" : "NULL");
+    }
+    
+    /**
+     * @see Platform::supportsNativeDeleteTrigger()
+     */
+    public function supportsNativeDeleteTrigger()
+    {
+        return true;
+    }
+	
+	/**
+     * @see Platform::hasSize(String)
+     */
+    public function hasSize($sqlType)
+    {
+        return !("INT" == $sqlType || "TEXT" == $sqlType);
+    }
+	
+	/**
+	 * @see Platform::quoteIdentifier()
+	 */
+	public function quoteIdentifier($text)
+	{
+		return '[' . $text . ']';
+	}
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/MssqlPlatform.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/MysqlPlatform.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/MysqlPlatform.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/MysqlPlatform.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,105 @@
+<?php
+/*
+ *  $Id: MysqlPlatform.php 137 2005-11-17 14:11:19Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/platform/DefaultPlatform.php';
+
+/**
+ * MySql Platform implementation.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Martin Poeschl <mpoeschl en marmot.at> (Torque)
+ * @version $Revision: 256 $
+ * @package propel.engine.platform
+ */
+class MysqlPlatform extends DefaultPlatform {
+
+    /**
+     * Initializes db specific domain mapping.
+     */
+    protected function initialize()
+    {
+        parent::initialize();
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::NUMERIC, "DECIMAL"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARCHAR, "TEXT"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::TIMESTAMP, "DATETIME"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BU_TIMESTAMP, "DATETIME"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BINARY, "BLOB"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::VARBINARY, "MEDIUMBLOB"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARBINARY, "LONGBLOB"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BLOB, "LONGBLOB"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::CLOB, "LONGTEXT"));
+    }
+
+    /**
+     * @see Platform#getAutoIncrement()
+     */
+    public function getAutoIncrement()
+    {
+        return "AUTO_INCREMENT";
+    }
+
+    /**
+     * @see Platform#getMaxColumnNameLength()
+     */
+    public function getMaxColumnNameLength()
+    {
+        return 64;
+    }
+    
+    /**
+     * @see Platform::supportsNativeDeleteTrigger()
+     */
+    public function supportsNativeDeleteTrigger()
+    {
+        $usingInnoDB = false;
+        if(class_exists('DataModelBuilder', false))
+        {
+            $usingInnoDB = strtolower(DataModelBuilder::getBuildProperty('mysqlTableType')) == 'innodb';
+        }
+        return $usingInnoDB || false;
+    }
+    
+    /**
+     * @see Platform#hasSize(String)
+     */
+    public function hasSize($sqlType) {
+        return !("MEDIUMTEXT" == $sqlType || "LONGTEXT" == $sqlType
+                || "BLOB" == $sqlType || "MEDIUMBLOB" == $sqlType
+                || "LONGBLOB" == $sqlType);
+    }
+
+    /**
+     * Escape the string for RDBMS.
+     * @param string $text
+     * @return string
+     */
+    public function escapeText($text) {
+        return mysql_escape_string($text);
+    }
+	
+	/**
+	 * @see Platform::quoteIdentifier()
+	 */
+	public function quoteIdentifier($text)
+	{
+		return '`' . $text . '`';
+	}
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/MysqlPlatform.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/MysqliPlatform.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/MysqliPlatform.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/MysqliPlatform.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,58 @@
+<?php
+/*
+ *  $Id: MysqliPlatform.php 1724 2006-08-21 19:03:51Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/platform/MysqlPlatform.php';
+
+/**
+ * MySql Platform implementation, using new mysqli API.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @version $Revision$
+ * @package propel.engine.platform
+ */
+class MysqliPlatform extends MysqlPlatform {
+
+    /**
+     * Initializes db specific domain mapping.
+     */
+    protected function initialize()
+    {
+        parent::initialize();
+        
+		// HL -- commenting these out, as it turns out that while the date format is fixed
+		// there is still a special meaning to TIMESTAMP in MySQL 4.1+ 
+        // $this->setSchemaDomainMapping(new Domain(PropelTypes::TIMESTAMP, "TIMESTAMP"));
+        // $this->setSchemaDomainMapping(new Domain(PropelTypes::BU_TIMESTAMP, "TIMESTAMP"));
+    }
+
+    /**
+     * Escape the string for MySQL.
+	 * 
+     * @param string $text
+     * @return string
+     */
+    public function escapeText($text) {
+		// Because mysqli requires open connection, we are using addslashes() here.
+		// This needs to be fixed in a better way ...
+        return addslashes($text);
+    }
+	
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/MysqliPlatform.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/OraclePlatform.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/OraclePlatform.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/OraclePlatform.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,89 @@
+<?php
+/*
+ *  $Id: OraclePlatform.php 137 2005-11-17 14:11:19Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+require_once 'propel/engine/platform/DefaultPlatform.php';
+
+/**
+ * Oracle Platform implementation.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Martin Poeschl <mpoeschl en marmot.at> (Torque)
+ * @version $Revision: 256 $
+ * @package propel.engine.platform
+ */
+class OraclePlatform extends DefaultPlatform {
+
+    /**
+     * Initializes db specific domain mapping.
+     */
+    protected function initialize()
+    {
+        parent::initialize();
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BOOLEAN, "NUMBER", "1", "0"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::TINYINT, "NUMBER", "3", "0"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::SMALLINT, "NUMBER", "5", "0"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::INTEGER, "NUMBER"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BIGINT, "NUMBER", "20", "0"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::REAL, "NUMBER"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::DOUBLE, "FLOAT"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::DECIMAL, "NUMBER"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::NUMERIC, "NUMBER"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::VARCHAR, "VARCHAR2"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARCHAR, "VARCHAR2", "2000"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::TIME, "DATE"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::TIMESTAMP, "DATE"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BINARY, "LONG RAW"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::VARBINARY, "BLOB"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARBINARY, "LONG RAW"));
+    }
+    
+    /**
+     * @see Platform#getMaxColumnNameLength()
+     */
+    public function getMaxColumnNameLength()
+    {
+        return 30;
+    }
+
+    /**
+     * @see Platform#getNativeIdMethod()
+     */
+    public function getNativeIdMethod()
+    {
+        return Platform::SEQUENCE;
+    }
+
+    /**
+     * @see Platform#getAutoIncrement()
+     */
+    public function getAutoIncrement()
+    {
+        return "";
+    }
+    
+    /**
+     * @see Platform::supportsNativeDeleteTrigger()
+     */
+    public function supportsNativeDeleteTrigger()
+    {
+        return true;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/OraclePlatform.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/PgsqlPlatform.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/PgsqlPlatform.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/PgsqlPlatform.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,114 @@
+<?php
+/*
+ *  $Id: PgsqlPlatform.php 137 2005-11-17 14:11:19Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+require_once 'propel/engine/platform/DefaultPlatform.php';
+
+/**
+ * Postgresql Platform implementation.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Martin Poeschl <mpoeschl en marmot.at> (Torque)
+ * @version $Revision: 256 $
+ * @package propel.engine.platform
+ */
+class PgsqlPlatform extends DefaultPlatform {
+
+    /**
+     * Initializes db specific domain mapping.
+     */
+    protected function initialize()
+    {
+        parent::initialize();
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BOOLEAN, "BOOLEAN"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::TINYINT, "INT2"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::SMALLINT, "INT2"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BIGINT, "INT8"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::REAL, "FLOAT"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::DOUBLE, "DOUBLE PRECISION"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARCHAR, "TEXT"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BINARY, "BYTEA"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::VARBINARY, "BYTEA"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARBINARY, "BYTEA"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BLOB, "BYTEA"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::CLOB, "TEXT"));
+    }
+    
+    /**
+     * @see Platform#getNativeIdMethod()
+     */
+    public function getNativeIdMethod()
+    {
+        return Platform::SEQUENCE;
+    }
+
+    /**
+     * @see Platform#getAutoIncrement()
+     */
+    public function getAutoIncrement()
+    {
+        return "";
+    }
+    
+    /**
+     * @see Platform#getMaxColumnNameLength()
+     */
+    public function getMaxColumnNameLength()
+    {
+        return 32;
+    }
+    
+    /**
+     * Escape the string for RDBMS.
+     * @param string $text
+     * @return string
+     */ 
+    public function escapeText($text) {
+        return pg_escape_string($text);
+    }
+    
+    /**
+     * @see Platform::getBooleanString()
+     */
+    public function getBooleanString($b)
+    {
+        // parent method does the checking for allowes tring
+        // representations & returns integer
+        $b = parent::getBooleanString($b);
+        return ($b ? "'t'" : "'f'");
+    }
+    
+    /**
+     * @see Platform::supportsNativeDeleteTrigger()
+     */
+    public function supportsNativeDeleteTrigger()
+    {
+        return true;
+    }
+	
+	/**
+     * @see Platform::hasSize(String)
+     * TODO collect info for all platforms
+     */
+    public function hasSize($sqlType)
+    {
+		return !("BYTEA" == $sqlType || "TEXT" == $sqlType);
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/PgsqlPlatform.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/Platform.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/Platform.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/Platform.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,128 @@
+<?php
+/*
+ *  $Id: Platform.php 258 2005-11-07 16:12:09Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+/**
+ * Interface for RDBMS platform specific behaviour.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Martin Poeschl <mpoeschl en marmot.at> (Torque)
+ * @version $Revision: 258 $
+ * @package propel.engine.platform
+ */
+interface Platform {
+
+    /** constant for native id method */
+    const IDENTITY = "identity";
+    
+    /** constant for native id method */
+    const SEQUENCE = "sequence";
+    
+	/**
+	 * Returns the short name of the database type that this platform represents.
+	 * For example MysqlPlatform->getDatabaseType() returns 'mysql'.
+	 * @return string
+	 */
+	public function getDatabaseType();
+	
+    /**
+     * Returns the native IdMethod (sequence|identity)
+     *
+     * @return string The native IdMethod (Platform:IDENTITY, Platform::SEQUENCE).
+     */
+    public function getNativeIdMethod();
+
+    /**
+     * Returns the max column length supported by the db.
+     *
+     * @return int The max column length
+     */
+    public function getMaxColumnNameLength();
+
+    /**
+     * Returns the db specific domain for a jdbcType.
+     *
+     * @param string $creoleType the creole type name.
+     * @return Domain The db specific domain.
+     */
+    public function getDomainForType($creoleType);
+    
+    /**
+     * @return string The RDBMS-specific SQL fragment for <code>NULL</code>
+     * or <code>NOT NULL</code>.
+     */
+    public function getNullString($notNull);
+
+    /**
+     * @return The RDBMS-specific SQL fragment for autoincrement.
+     */
+    public function getAutoIncrement();
+    
+    /**
+     * Returns if the RDBMS-specific SQL type has a size attribute.
+     * 
+     * @param string $sqlType the SQL type
+     * @return boolean True if the type has a size attribute
+     */
+    public function hasSize($sqlType);
+    
+    /**
+     * Returns if the RDBMS-specific SQL type has a scale attribute.
+     * 
+     * @param string $sqlType the SQL type
+     * @return boolean True if the type has a scale attribute
+     */
+    public function hasScale($sqlType);
+    
+    /**
+     * Escape the string for RDBMS.
+     * @param string $text
+     * @return string
+     */ 
+    public function escapeText($text);
+    
+	/**
+	 * Quotes identifiers used in database SQL.
+	 * @param string $text
+	 * @return string Quoted identifier.
+	 */
+	public function quoteIdentifier($text);
+	
+    /**
+     * Whether RDBMS supports native ON DELETE triggers (e.g. ON DELETE CASCADE).
+     * @return boolean
+     */
+    public function supportsNativeDeleteTrigger();
+    
+    /**
+     * Returns the boolean value for the RDBMS.
+     * 
+     * This value should match the boolean value that is set
+     * when using Creole's PreparedStatement::setBoolean().
+     * 
+     * This function is used to set default column values when building
+     * SQL.
+     * 
+     * @param mixed $tf A boolean or string representation of boolean ('y', 'true').
+     * @return mixed
+     */
+    public function getBooleanString($tf);
+    
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/Platform.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/SqlitePlatform.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/SqlitePlatform.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/SqlitePlatform.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,92 @@
+<?php
+/*
+ *  $Id: SqlitePlatform.php 137 2005-11-17 14:11:19Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/engine/platform/DefaultPlatform.php';
+
+/**
+ * SQLite Platform implementation.
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 268 $
+ * @package propel.engine.platform
+ */
+class SqlitePlatform extends DefaultPlatform {
+
+    /**
+     * Initializes db specific domain mapping.
+     */
+    protected function initialize()
+    {
+        parent::initialize();
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::NUMERIC, "DECIMAL"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARCHAR, "MEDIUMTEXT"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::DATE, "DATETIME"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BINARY, "BLOB"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::VARBINARY, "MEDIUMBLOB"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::LONGVARBINARY, "LONGBLOB"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::BLOB, "LONGBLOB"));
+        $this->setSchemaDomainMapping(new Domain(PropelTypes::CLOB, "LONGTEXT"));
+    }
+
+    /**
+	 * @see Platform#getAutoIncrement()
+	 * @link http://www.sqlite.org/autoinc.html
+     */
+    public function getAutoIncrement()
+    {
+		
+        return "PRIMARY KEY";
+    }
+
+    /**
+     * @see Platform#getMaxColumnNameLength()
+     */
+    public function getMaxColumnNameLength()
+    {
+        return 1024;
+    }
+    
+    /**
+     * @see Platform#hasSize(String)
+     */
+    public function hasSize($sqlType) {
+        return !("MEDIUMTEXT" == $sqlType || "LONGTEXT" == $sqlType
+                || "BLOB" == $sqlType || "MEDIUMBLOB" == $sqlType
+                || "LONGBLOB" == $sqlType);
+    }
+    
+    /**
+     * Escape the string for RDBMS.
+     * @param string $text
+     * @return string
+     */ 
+    public function escapeText($text) {
+        return sqlite_escape_string($text);
+    }
+
+	/**
+	 * @see Platform::quoteIdentifier()
+	 */
+	public function quoteIdentifier($text)
+	{
+		return '[' . $text . ']';
+	}
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/engine/platform/SqlitePlatform.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/AbstractPropelDataModelTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/AbstractPropelDataModelTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/AbstractPropelDataModelTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,635 @@
+<?php
+
+/*
+ *  $Id: AbstractPropelDataModelTask.php 337 2006-02-15 14:41:54Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+//include_once 'phing/tasks/ext/CapsuleTask.php';
+require_once 'phing/Task.php';
+include_once 'propel/engine/database/model/AppData.php';
+include_once 'propel/engine/database/model/Database.php';
+include_once 'propel/engine/database/transform/XmlToAppData.php';
+
+/**
+ * An abstract base Propel task to perform work related to the XML schema file.
+ *
+ * The subclasses invoke templates to do the actual writing of the resulting files.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Jason van Zyl <jvanzyl en zenplex.com> (Torque)
+ * @author Daniel Rall <dlr en finemaltcoding.com> (Torque)
+ * @package propel.phing
+ */
+abstract class AbstractPropelDataModelTask extends Task {
+
+    /**
+     * Fileset of XML schemas which represent our data models.
+     * @var array Fileset[]
+     */
+    protected $schemaFilesets = array();
+
+    /**
+     * Data models that we collect. One from each XML schema file.
+     */
+    protected $dataModels = array();
+
+    /**
+     * Have datamodels been initialized?
+     * @var boolean
+     */
+    private $dataModelsLoaded = false;
+
+    /**
+     * Map of data model name to database name.
+     * Should probably stick to the convention
+     * of them being the same but I know right now
+     * in a lot of cases they won't be.
+     */
+    protected $dataModelDbMap;
+
+    /**
+     * Hashtable containing the names of all the databases
+     * in our collection of schemas.
+     */
+    protected $databaseNames; // doesn't seem to be used anywhere
+
+    /**
+     * The target database(s) we are generating SQL
+     * for. Right now we can only deal with a single
+     * target, but we will support multiple targets
+     * soon.
+     */
+    protected $targetDatabase;
+
+    /**
+     * DB encoding to use for XmlToAppData object
+     */
+    protected $dbEncoding = 'iso-8859-1';
+
+    /**
+     * Target PHP package to place the generated files in.
+     */
+    protected $targetPackage;
+
+    /**
+     * @var Mapper
+     */
+    protected $mapperElement;
+
+    /**
+     * Destination directory for results of template scripts.
+     * @var PhingFile
+     */
+    protected $outputDirectory;
+
+    /**
+     * Path where Capsule looks for templates.
+     * @var PhingFile
+     */
+    protected $templatePath;
+
+    /**
+     * Whether to package the datamodels or not
+     * @var PhingFile
+     */
+    protected $packageObjectModel;
+	
+	/**
+	 * Whether to perform validation (XSD) on the schema.xml file(s).
+	 * @var boolean
+	 */
+	protected $validate;
+	
+	/**
+	 * The XSD schema file to use for validation.
+	 * @var PhingFile
+	 */
+	protected $xsdFile;
+	
+	/**
+	 * XSL file to use to normalize (or otherwise transform) schema before validation.
+	 * @var PhingFile
+	 */
+	protected $xslFile;
+	
+    /**
+     * Return the data models that have been
+     * processed.
+     *
+     * @return List data models
+     */
+    public function getDataModels()
+    {
+        if (!$this->dataModelsLoaded) $this->loadDataModels();
+        return $this->dataModels;
+    }
+
+    /**
+     * Return the data model to database name map.
+     *
+     * @return Hashtable data model name to database name map.
+     */
+    public function getDataModelDbMap()
+    {
+        if (!$this->dataModelsLoaded) $this->loadDataModels();
+        return $this->dataModelDbMap;
+    }
+
+    /**
+     * Adds a set of xml schema files (nested fileset attribute).
+     *
+     * @param set a Set of xml schema files
+     */
+    public function addSchemaFileset(Fileset $set)
+    {
+        $this->schemaFilesets[] = $set;
+    }
+
+    /**
+     * Get the current target database.
+     *
+     * @return String target database(s)
+     */
+    public function getTargetDatabase()
+    {
+        return $this->targetDatabase;
+    }
+
+    /**
+     * Set the current target database. (e.g. mysql, oracle, ..)
+     *
+     * @param v target database(s)
+     */
+    public function setTargetDatabase($v)
+    {
+        $this->targetDatabase = $v;
+    }
+
+    /**
+     * Get the current target package.
+     *
+     * @return string target PHP package.
+     */
+    public function getTargetPackage()
+    {
+        return $this->targetPackage;
+    }
+
+    /**
+     * Set the current target package. This is where generated PHP classes will
+     * live.
+     *
+     * @param string $v target PHP package.
+     */
+    public function setTargetPackage($v)
+    {
+        $this->targetPackage = $v;
+    }
+
+    /**
+     * Set the packageObjectModel switch on/off
+     *
+     * @param string $v The build.property packageObjectModel
+     */
+    public function setPackageObjectModel($v)
+    {
+        $this->packageObjectModel = ($v === '1' ? true : false);
+    }
+	
+	/**
+	 * Set whether to perform validation on the datamodel schema.xml file(s).
+	 * @param boolean $v
+	 */
+	public function setValidate($v)
+	{
+		$this->validate = $v;
+	}
+	
+	/**
+	 * Set the XSD schema to use for validation of any datamodel schema.xml file(s).
+	 * @param $v PhingFile
+	 */
+	public function setXsd(PhingFile $v)
+	{
+		$this->xsdFile = $v;
+	}
+	
+	/**
+	 * Set the normalization XSLT to use to transform datamodel schema.xml file(s) before validation and parsing.
+	 * @param $v PhingFile
+	 */
+	public function setXsl(PhingFile $v)
+	{
+		$this->xslFile = $v;
+	}
+	
+    /**
+     * [REQUIRED] Set the path where Capsule will look
+     * for templates using the file template
+     * loader.
+     * @return void
+     * @throws Exception
+     */
+    public function setTemplatePath($templatePath) {
+        $resolvedPath = "";
+        $tok = strtok($templatePath, ",");
+        while ( $tok ) {
+            // resolve relative path from basedir and leave
+            // absolute path untouched.
+            $fullPath = $this->project->resolveFile($tok);
+            $cpath = $fullPath->getCanonicalPath();
+            if ($cpath === false) {
+                $this->log("Template directory does not exist: " . $fullPath->getAbsolutePath());
+            } else {
+                $resolvedPath .= $cpath;
+            }
+            $tok = strtok(",");
+            if ( $tok ) {
+                $resolvedPath .= ",";
+            }
+        }
+        $this->templatePath = $resolvedPath;
+     }
+
+    /**
+     * Get the path where Velocity will look
+     * for templates using the file template
+     * loader.
+     * @return string
+     */
+    public function getTemplatePath() {
+        return $this->templatePath;
+    }
+
+    /**
+     * [REQUIRED] Set the output directory. It will be
+     * created if it doesn't exist.
+     * @param PhingFile $outputDirectory
+     * @return void
+     * @throws Exception
+     */
+    public function setOutputDirectory(PhingFile $outputDirectory) {
+        try {
+            if (!$outputDirectory->exists()) {
+                $this->log("Output directory does not exist, creating: " . $outputDirectory->getPath(),PROJECT_MSG_VERBOSE);
+                if (!$outputDirectory->mkdirs()) {
+                    throw new IOException("Unable to create Ouptut directory: " . $outputDirectory->getAbsolutePath());
+                }
+            }
+            $this->outputDirectory = $outputDirectory->getCanonicalPath();
+        } catch (IOException $ioe) {
+            throw new BuildException($ioe);
+        }
+    }
+
+    /**
+     * Set the current target database encoding.
+     *
+     * @param v target database encoding
+     */
+    public function setDbEncoding($v)
+    {
+       $this->dbEncoding = $v;
+    }
+
+    /**
+     * Get the output directory.
+     * @return string
+     */
+    public function getOutputDirectory() {
+        return $this->outputDirectory;
+    }
+
+    /**
+     * Nested creator, creates one Mapper for this task.
+     *
+     * @return  Mapper  The created Mapper type object.
+     * @throws  BuildException
+     */
+    public function createMapper() {
+        if ($this->mapperElement !== null) {
+            throw new BuildException("Cannot define more than one mapper.", $this->location);
+        }
+        $this->mapperElement = new Mapper($this->project);
+        return $this->mapperElement;
+    }
+
+    /**
+     * Maps the passed in name to a new filename & returns resolved File object.
+     * @param string $from
+     * @return PhingFile Resolved File object.
+     * @throws BuilException    - if no Mapper element se
+     *                          - if unable to map new filename.
+     */
+    protected function getMappedFile($from)
+    {
+        if(!$this->mapperElement) {
+            throw new BuildException("This task requires you to use a <mapper/> element to describe how filename changes should be handled.");
+        }
+
+        $mapper = $this->mapperElement->getImplementation();
+        $mapped = $mapper->main($from);
+        if (!$mapped) {
+            throw new BuildException("Cannot create new filename based on: " . $from);
+        }
+        // Mappers always return arrays since it's possible for some mappers to map to multiple names.
+        $outFilename = array_shift($mapped);
+        $outFile = new PhingFile($this->getOutputDirectory(), $outFilename);
+        return $outFile;
+    }
+	
+	/**
+	 * Get the Platform class based on the target database type.
+	 * @return Platform Class that implements the Platform interface.
+	 */
+	protected function getPlatformForTargetDatabase()
+	{
+	
+		$classpath = $this->getPropelProperty("platformClass");
+		if (empty($classpath)) {
+			throw new BuildException("Unable to find class path for '$propname' property.");
+		}
+		
+		// This is a slight hack to workaround camel case inconsistencies for the DDL classes.
+		// Basically, we want to turn ?.?.?.sqliteDDLBuilder into ?.?.?.SqliteDDLBuilder
+		$lastdotpos = strrpos($classpath, '.');
+		if ($lastdotpos) $classpath{$lastdotpos+1} = strtoupper($classpath{$lastdotpos+1});
+		else ucfirst($classpath);
+		
+		if (empty($classpath)) {
+			throw new BuildException("Unable to find class path for '$propname' property.");
+		}
+		
+		$clazz = Phing::import($classpath);
+		return new $clazz();
+	}
+	
+    /**
+     * Gets all matching XML schema files and loads them into data models for class.
+     * @return void
+     */
+    protected function loadDataModels()
+    {
+		$ads = array();
+		
+        // Get all matched files from schemaFilesets
+        foreach($this->schemaFilesets as $fs) {
+            $ds = $fs->getDirectoryScanner($this->project);
+            $srcDir = $fs->getDir($this->project);
+
+            $dataModelFiles = $ds->getIncludedFiles();
+			
+			$platform = $this->getPlatformForTargetDatabase();
+			
+            // Make a transaction for each file
+            foreach($dataModelFiles as $dmFilename) {
+			
+                $this->log("Processing: ".$dmFilename);
+                $xmlFile = new PhingFile($srcDir, $dmFilename);
+				
+				$dom = new DomDocument('1.0', 'UTF-8');
+				$dom->load($xmlFile->getAbsolutePath());
+
+				// normalize (or transform) the XML document using XSLT
+				if ($this->xslFile) {
+					$this->log("Transforming " . $xmlFile->getPath() . " using stylesheet " . $this->xslFile->getPath(), PROJECT_MSG_VERBOSE);
+					if (!class_exists('XSLTProcessor')) {
+						$this->log("Could not perform XLST transformation.  Make sure PHP has been compiled/configured to support XSLT.", PROJECT_MSG_ERR);
+        			} else {						
+						// normalize the document using normalizer stylesheet
+						
+						$xsl = new XsltProcessor();
+						$xsl->importStyleSheet(DomDocument::load($this->xslFile->getAbsolutePath()));
+						$transformed = $xsl->transformToDoc($dom);
+						$newXmlFilename = substr($xmlFile->getName(), 0, strrpos($xmlFile->getName(), '.')) . '-transformed.xml';
+						
+						// now overwrite previous vars to point to newly transformed file
+						$xmlFile = new PhingFile($srcDir, $newXmlFilename);
+						$transformed->save($xmlFile->getAbsolutePath());
+						$this->log("\t- Using new (post-transformation) XML file: " . $xmlFile->getPath(), PROJECT_MSG_VERBOSE);										
+						
+						$dom = new DomDocument('1.0', 'UTF-8');
+						$dom->load($xmlFile->getAbsolutePath());		
+					}
+				}
+				
+				// validate the XML document using XSD schema
+				if ($this->validate && $this->xsdFile) {
+					$this->log("Validating XML doc (".$xmlFile->getPath().") using schema file " . $this->xsdFile->getPath(), PROJECT_MSG_VERBOSE);
+					if (!$dom->schemaValidate($this->xsdFile->getAbsolutePath())) {
+						throw new BuildException("XML schema file (".$xmlFile->getPath().") does not validate.  See warnings above for reasons validation failed (make sure error_reporting is set to show E_WARNING if you don't see any).");		throw new EngineException("XML schema does not validate (using schema file $xsdFile).  See warnings above for reasons validation failed (make sure error_reporting is set to show E_WARNING if you don't see any).", $this->getLocation());
+					}
+				}
+				
+				$xmlParser = new XmlToAppData($platform, $this->getTargetPackage(), $this->dbEncoding);
+                $ad = $xmlParser->parseFile($xmlFile->getAbsolutePath());
+                $ad->setName($dmFilename); // <-- Important: use the original name, not the -transformed name.
+                $ads[] = $ad;
+            }
+        }
+		
+		if (empty($ads)) {
+		    throw new BuildException("No schema files were found (matching your schema fileset definition).");
+		}
+		
+		if (!$this->packageObjectModel) {
+
+			$this->dataModels = $ads;
+			$this->databaseNames = array(); // doesn't seem to be used anywhere
+			$this->dataModelDbMap = array();
+
+			// Different datamodels may state the same database
+			// names, we just want the unique names of databases.
+			foreach($this->dataModels as $dm) {
+				$database = $dm->getDatabase();
+				$this->dataModelDbMap[$dm->getName()] = $database->getName();
+				$this->databaseNames[$database->getName()] = $database->getName(); // making list of *unique* dbnames.
+			}
+		} else {
+
+			$this->joinDatamodels($ads);
+			$this->dataModels[0]->getDatabases(); // calls doFinalInitialization()
+		}
+
+        $this->dataModelsLoaded = true;
+    }
+
+    /**
+     * Joins the datamodels collected from schema.xml files into one big datamodel
+     *
+     * This applies only when the the packageObjectModel option is set. We need to
+     * join the datamodels in this case to allow for foreign keys that point to
+     * tables in different packages.
+     *
+     * @param array $ads The datamodels to join
+     */
+    protected function joinDatamodels($ads) {
+
+		foreach($ads as $ad) {
+			$db = $ad->getDatabase(null, false);
+			$this->dataModelDbMap[$ad->getName()] = $db->getName();
+		}
+
+		foreach ($ads as $addAd) {
+
+			$ad = &$this->dataModels[0];
+			if (!isset($ad)) {
+				$addAd->setName('JoinedDataModel');
+				$ad = $addAd;
+				continue;
+			}
+			foreach ($addAd->getDatabases(false) as $addDb) {
+				$addDbName = $addDb->getName();
+				if (!$package = $addDb->getPackage()) {
+					throw new BuildException('No package found for database "' . $addDbName . '" in ' . $addAd->getName() . '. The propel.packageObjectModel property requires the package attribute to be set for each database.');
+				}
+				$db = $ad->getDatabase($addDbName, false);
+				if (!$db) {
+					$ad->addDatabase($addDb);
+					continue;
+				}
+				foreach ($addDb->getTables() as $addTable) {
+					$table = $db->getTable($addTable->getName());
+					if ($table) {
+						throw new BuildException('Duplicate table found: ' . $addDbName . '.');
+					}
+					$db->addTable($addTable);
+				}
+			}
+		}
+	}
+
+    /**
+     * Creates a new Capsule context with some basic properties set.
+     * (Capsule is a simple PHP encapsulation system -- aka a php "template" class.)
+     * @return Capsule
+     */
+    protected function createContext() {
+
+        $context = new Capsule();
+
+        // Make sure the output directory exists, if it doesn't
+        // then create it.
+        $outputDir = new PhingFile($this->outputDirectory);
+        if (!$outputDir->exists()) {
+            $this->log("Output directory does not exist, creating: " . $outputDir->getAbsolutePath());
+            $outputDir->mkdirs();
+        }
+
+        // Place our set of data models into the context along
+        // with the names of the databases as a convenience for now.
+        $context->put("targetDatabase", $this->targetDatabase);
+        $context->put("targetPackage", $this->targetPackage);
+        $context->put("now", strftime("%c"));
+
+        $this->log("Target database type: " . $this->targetDatabase);
+        $this->log("Target package: " . $this->targetPackage);
+        $this->log("Using template path: " . $this->templatePath);
+        $this->log("Output directory: " . $this->outputDirectory);
+
+        $context->setTemplatePath($this->templatePath);
+        $context->setOutputDirectory($this->outputDirectory);
+
+        $this->populateContextProperties($context);
+
+        return $context;
+    }
+
+	/**
+	 * Fetches the propel.xxx properties from project, renaming the propel.xxx properties to just xxx.
+	 *
+	 * Also, renames any xxx.yyy properties to xxxYyy as PHP doesn't like the xxx.yyy syntax.
+	 *
+	 * @return array Assoc array of properties.
+	 */
+	protected function getPropelProperties()
+	{
+		$allProps = $this->getProject()->getProperties();
+		$renamedPropelProps = array();
+		foreach ($allProps as $key => $propValue) {
+			if (strpos($key, "propel.") === 0) {
+				$newKey = substr($key, strlen("propel."));
+				$j = strpos($newKey, '.');
+				while ($j !== false) {
+					$newKey =  substr($newKey, 0, $j) . ucfirst(substr($newKey, $j + 1));
+					$j = strpos($newKey, '.');
+				}
+				$renamedPropelProps[$newKey] = $propValue;
+			}
+		}
+		return $renamedPropelProps;
+	}
+	
+	/**
+	 * Fetches a single propel.xxx property from project, using "converted" property names.
+	 * @see getPropelProperties()
+	 * @param string $name Name of property to fetch (in converted CamelCase)
+	 * @return string The value of the property (or NULL if not set)
+	 */
+	protected function getPropelProperty($name)
+	{
+		$props = $this->getPropelProperties();
+		if (isset($props[$name])) {
+		    return $props[$name];
+		}
+		return null; // just to be explicit
+	}
+
+    /**
+     * Adds the propel.xxx properties to the passed Capsule context, changing names to just xxx.
+     *
+     * Also, move xxx.yyy properties to xxxYyy as PHP doesn't like the xxx.yyy syntax.
+     *
+     * @param Capsule $context
+	 * @see getPropelProperties()
+     */
+    public function populateContextProperties(Capsule $context)
+    {
+		foreach ($this->getPropelProperties() as $key => $propValue) {
+			$this->log('Adding property ${' . $key . '} to context', PROJECT_MSG_DEBUG);
+			$context->put($key, $propValue);
+        }
+    }
+
+  /**
+   * Checks this class against Basic requrements of any propel datamodel task.
+   *
+   * @throws BuildException 	- if schema fileset was not defined
+   * 							- if no output directory was specified
+   */
+    protected function validate()
+    {
+        if (empty($this->schemaFilesets)) {
+            throw new BuildException("You must specify a fileset of XML schemas.", $this->getLocation());
+        }
+
+        // Make sure the output directory is set.
+        if ($this->outputDirectory === null) {
+            throw new BuildException("The output directory needs to be defined!", $this->getLocation());
+        }
+		
+		if ($this->validate) {
+			if (!$this->xsdFile) {
+				throw new BuildException("'validate' set to TRUE, but no XSD specified (use 'xsd' attribute).", $this->getLocation());
+			}
+		}
+
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/AbstractPropelDataModelTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelCreoleTransformTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelCreoleTransformTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelCreoleTransformTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,778 @@
+<?php
+
+/*
+ *  $Id: PropelCreoleTransformTask.php 321 2006-01-03 17:44:56Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+include_once 'creole/Connection.php';
+require_once 'phing/Task.php';
+
+/**
+ * This class generates an XML schema of an existing database from
+ * Creole metadata.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Jason van Zyl <jvanzyl en periapt.com> (Torque)
+ * @author Fedor Karpelevitch <fedor.karpelevitch en barra.com> (Torque)
+ * @version $Revision: 321 $
+ * @package propel.phing
+ */
+class PropelCreoleTransformTask extends Task {
+
+    /** Name of XML database schema produced. */
+    protected $xmlSchema;
+
+    /** Creole URL. */
+    protected $dbUrl;
+
+    /** Creole driver. */
+    protected $dbDriver;
+
+    /** Creole user name. */
+    protected $dbUser;
+
+    /** Creole password. */
+    protected $dbPassword;
+
+    /** DB encoding to use */
+    protected $dbEncoding = 'iso-8859-1';
+
+    /** DB schema to use. */
+    protected $dbSchema;
+
+    /** parsed DB DSN */
+    protected $dsn;
+
+    /** DOM document produced. */
+    protected $doc;
+
+    /** The document root element. */
+    protected $databaseNode;
+
+    /** Hashtable of columns that have primary keys. */
+    protected $primaryKeys;
+
+    /** Hashtable to track what table a column belongs to. */
+    // doesn't seem to be used
+    // protected $columnTableMap;
+
+    /** whether to use same name for phpName or not */
+    protected $samePhpName;
+
+    /** whether to add vendor info or not */
+	protected $addVendorInfo;
+
+    /**
+     * Bitfield to switch on/off which validators will be created.
+     *
+     * @var int
+     */
+    protected $validatorBits;
+
+    /**
+     * Collect validatorInfos to create validators.
+     *
+     * @var int
+     */
+    protected $validatorInfos;
+
+    /**
+     * Zero bit for no validators
+     */
+	const VALIDATORS_NONE = 0;
+
+    /**
+     * Bit for maxLength validator
+     */
+	const VALIDATORS_MAXLENGTH = 1;
+
+    /**
+     * Bit for maxValue validator
+     */
+	const VALIDATORS_MAXVALUE = 2;
+
+    /**
+     * Bit for type validator
+     */
+	const VALIDATORS_TYPE = 4;
+
+    /**
+     * Bit for required validator
+     */
+	const VALIDATORS_REQUIRED = 8;
+
+    /**
+     * Bit for unique validator
+     */
+	const VALIDATORS_UNIQUE = 16;
+
+    /**
+     * Bit for all validators
+     */
+	const VALIDATORS_ALL = 255;
+
+    /**
+     * Maps validator type tokens to bits
+     *
+     * The tokens are used in the propel.addValidators property to define
+     * which validators are to be added
+     *
+     * @static
+     * @var array
+     */
+	static protected $validatorBitMap = array (
+		'none' => PropelCreoleTransformTask::VALIDATORS_NONE,
+		'maxlength' => PropelCreoleTransformTask::VALIDATORS_MAXLENGTH,
+		'maxvalue' => PropelCreoleTransformTask::VALIDATORS_MAXVALUE,
+		'type' => PropelCreoleTransformTask::VALIDATORS_TYPE,
+		'required' => PropelCreoleTransformTask::VALIDATORS_REQUIRED,
+		'unique' => PropelCreoleTransformTask::VALIDATORS_UNIQUE,
+		'all' => PropelCreoleTransformTask::VALIDATORS_ALL,
+	);
+
+    /**
+     * Defines messages that are added to validators
+     *
+     * @static
+     * @var array
+     */
+	static protected $validatorMessages = array (
+		'maxlength' => array (
+			'msg' => 'The field %s must be not longer than %s characters.',
+			'var' => array('colName', 'value')
+		),
+		'maxvalue' => array (
+			'msg' => 'The field %s must be not greater than %s.',
+			'var' => array('colName', 'value')
+		),
+		'type' => array (
+			'msg' => 'The field %s is not a valid value.',
+			'var' => array('colName')
+		),
+		'required' => array (
+			'msg' => 'The field %s is required.',
+			'var' => array('colName')
+		),
+		'unique' => array (
+			'msg' => 'This %s already exists in table %s.',
+			'var' => array('colName', 'tableName')
+		),
+	);
+
+    public function getDbSchema()
+    {
+        return $this->dbSchema;
+    }
+
+    public function setDbSchema($dbSchema)
+    {
+        $this->dbSchema = $dbSchema;
+    }
+
+    public function setDbUrl($v)
+    {
+        $this->dbUrl = $v;
+    }
+
+    public function setDbDriver($v)
+    {
+        $this->dbDriver = $v;
+    }
+
+    public function setDbUser($v)
+    {
+        $this->dbUser = $v;
+    }
+
+    public function setDbPassword($v)
+    {
+        $this->dbPassword = $v;
+    }
+
+    public function setDbEncoding($v)
+    {
+       $this->dbEncoding = $v;
+    }
+
+    public function setOutputFile($v)
+    {
+        $this->xmlSchema = $v;
+    }
+
+    public function setSamePhpName($v)
+    {
+        $this->samePhpName = $v;
+    }
+
+    public function setAddVendorInfo($v)
+    {
+        $this->addVendorInfo = (boolean) $v;
+    }
+
+    /**
+     * Sets set validator bitfield from propel.addValidators property
+     *
+     * @param string $v The propel.addValidators property
+     * @return void
+     */
+    public function setAddValidators($v)
+    {
+		// lowercase input
+		$v = strtolower($v);
+		// make it a bit expression
+		$v = str_replace(
+			array_keys(self::$validatorBitMap), self::$validatorBitMap, $v);
+		// check if it's a valid boolean expression
+		if (!preg_match('/[^\d|&~ ]/', $v)) {
+			// eval the expression
+			eval("\$v = $v;");
+		} else {
+            $this->log("\n\nERROR: NO VALIDATORS ADDED!\n\nThere is an error in propel.addValidators build property.\n\nAllowed tokens are: " . implode(', ', array_keys(self::$validatorBitMap)) . "\n\nAllowed operators are (like in php.ini):\n\n|    bitwise OR\n&    bitwise AND\n~    bitwise NOT\n\n", PROJECT_MSG_ERR);
+            $v = self::VALIDATORS_NONE;
+		}
+        $this->validatorBits = $v;
+    }
+
+    public function isSamePhpName()
+    {
+        return $this->samePhpName;
+    }
+
+    /**
+     * Default constructor.
+     * @return void
+     * @throws BuildException
+     */
+    public function main()
+    {
+        $this->log("Propel - CreoleToXMLSchema starting");
+        $this->log("Your DB settings are:");
+        $this->log("driver : " . ($this->dbDriver ? $this->dbDriver : "(default)"));
+        $this->log("URL : " . $this->dbUrl);
+
+        //(not yet supported) $this->log("schema : " . $this->dbSchema);
+        //DocumentTypeImpl docType = new DocumentTypeImpl(null, "database", null,
+        //	   "http://jakarta.apache.org/turbine/dtd/database.dtd");
+
+        $this->doc = new DOMDocument('1.0', 'utf-8');
+        $this->doc->formatOutput = true; // pretty printing
+
+        $this->doc->appendChild($this->doc->createComment("Autogenerated by CreoleToXMLSchema!"));
+
+        try {
+            $this->generateXML();
+            $this->log("Writing XML to file: " . $this->xmlSchema);
+            $outFile = new PhingFile($this->xmlSchema);
+            $out = new FileWriter($outFile);
+            $xmlstr = $this->doc->saveXML();
+            $out->write($xmlstr);
+            $out->close();
+        } catch (Exception $e) {
+            $this->log("There was an error building XML from metadata: " . $e->getMessage(), PROJECT_MSG_ERR);
+        }
+        $this->log("Propel - CreoleToXMLSchema finished");
+    }
+
+    /**
+     * Generates an XML database schema from Creole metadata.
+     *
+     * @return void
+     * @throws Exception a generic exception.
+     */
+    public function generateXML()
+    {
+		// Establish db connection
+		$con = $this->getConnection();
+
+        // Get the database Metadata.
+        $dbInfo = $con->getDatabaseInfo();
+
+		// create and add the database node
+        $databaseNode = $this->createDatabaseNode($dbInfo);
+        $this->doc->appendChild($databaseNode);
+    }
+
+    /**
+     * Establishes a Creole database connection
+     *
+     * @return object The connection
+     */
+    protected function getConnection() {
+
+        // Attemtp to connect to a database.
+        $this->dsn = Creole::parseDSN($this->dbUrl);
+        if($this->dbUser) {
+            $this->dsn["username"] = $this->dbUser;
+        }
+        if ($this->dbPassword) {
+            $this->dsn["password"] = $this->dbPassword;
+        }
+        if ($this->dbDriver) {
+            Creole::registerDriver($this->dsn['phptype'], $this->dbDriver);
+        }
+        $con = Creole::getConnection($this->dsn);
+        $this->log("DB connection established");
+
+        return $con;
+	}
+
+    /**
+     * Creates a database node
+     *
+     * @param object $dbInfo The dbInfo for this db
+     * @return object The database node instance
+     */
+	protected function createDatabaseNode($dbInfo) {
+
+        $this->log("Processing database");
+
+        $node = $this->doc->createElement("database");
+        $node->setAttribute("name", $dbInfo->getName());
+
+        if ($vendorNode = $this->createVendorInfoNode($dbInfo->getVendorSpecificInfo())) {
+        	$node->appendChild($vendorNode);
+		}
+
+        // create and add table nodes
+        foreach($dbInfo->getTables() as $table) {
+			$tableNode = $this->createTableNode($table);
+			$node->appendChild($tableNode);
+        }
+
+        return $node;
+	}
+
+    /**
+     * Creates a table node
+     *
+     * @param object $table The table
+     * @return object The table node instance
+     */
+	protected function createTableNode($table) {
+
+		$this->log("Processing table: " . $table->toString());
+
+		$node = $this->doc->createElement("table");
+		$node->setAttribute("name", $table->getName());
+		if ($this->isSamePhpName()) {
+			$node->setAttribute("phpName", $table->getName());
+		}
+        if ($vendorNode = $this->createVendorInfoNode($table->getVendorSpecificInfo())) {
+        	$node->appendChild($vendorNode);
+		}
+
+		// Create and add column nodes, register column validators
+		$columns = $table->getColumns();
+		foreach($columns as $column) {
+			$columnNode = $this->createColumnNode($column);
+			$node->appendChild($columnNode);
+			$this->registerValidatorsForColumn($column);
+			if ($column->isAutoIncrement()) {
+				$idMethod = 'native';
+			}
+		}
+		if (isset($idMethod)) {
+			$node->setAttribute("idMethod", $idMethod);
+		}
+
+		// Create and add foreign key nodes.
+		$foreignKeys = $table->getForeignKeys();
+		foreach($foreignKeys as $foreignKey) {
+			$foreignKeyNode = $this->createForeignKeyNode($foreignKey);
+			$node->appendChild($foreignKeyNode);
+		}
+
+		// Create and add index nodes.
+		$indices =  $table->getIndices();
+		foreach($indices as $index) {
+			$indexNode = $this->createIndexNode($index);
+			$node->appendChild($indexNode);
+		}
+		
+		// add an id-method-parameter if we have a sequence that matches table_colname_seq
+		// 
+		// 
+		$pkey = $table->getPrimaryKey();
+		if ($pkey) {
+		    $cols = $pkey->getColumns();
+			if (count($cols) === 1) {
+				$col = array_shift($cols);
+				if ($col->isAutoIncrement()) {
+					$seq_name = $table->getName().'_'.$col->getName().'_seq';					
+					if ($table->getDatabase()->isSequence($seq_name)) {
+						$idMethodParameterNode = $this->doc->createElement("id-method-parameter");
+						$idMethodParameterNode->setAttribute("value", $seq_name);
+						$node->appendChild($idMethodParameterNode);
+					}
+				}
+			}
+		}
+		
+
+		// Create and add validator and rule nodes.
+		$nodes = array();
+		$tableName = $table->getName();
+		if (isset($this->validatorInfos[$tableName])) {
+			foreach ($this->validatorInfos[$tableName] as $colName => $rules) {
+				$column = $table->getColumn($colName);
+				$colName = $column->getName();
+				foreach ($rules as $rule) {
+					if (!isset($nodes[$colName])) {
+						$nodes[$colName] = $this->createValidator($column, $rule['type']);
+						$node->appendChild($nodes[$colName]);
+					}
+					$ruleNode = $this->createRuleNode($column, $rule);
+					$nodes[$colName]->appendChild($ruleNode);
+				}
+			}
+		}
+
+		return $node;
+	}
+
+    /**
+     * Creates an column node
+     *
+     * @param object $column The Creole column
+     * @return object The column node instance
+     */
+	protected function createColumnNode($column) {
+
+		$node = $this->doc->createElement("column");
+
+		$table = $column->getTable();
+		$colName = $column->getName();
+		$colType = $column->getType();
+		$colSize = $column->getSize();
+		$colScale = $column->getScale();
+
+		if ($colType === CreoleTypes::OTHER) {
+			$this->log("Column [" . $table->getName() . "." . $colName . "] has a column type (".$column->getNativeType().") that Propel does not support.", PROJECT_MSG_WARN);
+		}
+
+		$node->setAttribute("name", $colName);
+
+		if ($this->isSamePhpName()) {
+			$node->setAttribute("phpName", $colName);
+		}
+
+		$node->setAttribute("type", PropelTypes::getPropelType($colType));
+
+		if ($colSize > 0 && (
+				   $colType == CreoleTypes::CHAR
+				|| $colType == CreoleTypes::VARCHAR
+				|| $colType == CreoleTypes::LONGVARCHAR
+				|| $colType == CreoleTypes::DECIMAL
+				|| $colType == CreoleTypes::FLOAT
+				|| $colType == CreoleTypes::NUMERIC)) {
+			$node->setAttribute("size", (string) $colSize);
+		}
+
+		if ($colScale > 0 && (
+			       $colType == CreoleTypes::DECIMAL
+				|| $colType == CreoleTypes::FLOAT
+				|| $colType == CreoleTypes::NUMERIC)) {
+			$node->setAttribute("scale", (string) $colScale);
+		}
+
+		if (!$column->isNullable()) {
+			$node->setAttribute("required", "true");
+		}
+
+		if ($column->isAutoIncrement()) {
+			$node->setAttribute("autoIncrement", "true");
+		}
+
+		if (in_array($colName, $this->getTablePkCols($table))) {
+			$node->setAttribute("primaryKey", "true");
+		}
+
+		if (($defValue = $column->getDefaultValue()) !== null) {
+			$node->setAttribute("default", iconv($this->dbEncoding, 'utf-8', $defValue));
+		}
+
+        if ($vendorNode = $this->createVendorInfoNode($column->getVendorSpecificInfo())) {
+        	$node->appendChild($vendorNode);
+		}
+
+		return $node;
+	}
+
+    /**
+     * Returns the primary key columns for a table
+     *
+     * @param object $table The table
+     * @return array The primary keys
+     */
+	protected function getTablePkCols($table) {
+
+		static $columns = array();
+
+		$tableName = $table->getName();
+		if (!isset($columns[$tableName])) {
+			$columns[$tableName] = array();
+			$primaryKey = $table->getPrimaryKey();
+			if ($primaryKey) {
+				foreach($primaryKey->getColumns() as $colObject) {
+					$columns[$tableName][] = $colObject->getName();
+				}
+			}
+		}
+		return $columns[$tableName];
+	}
+
+    /**
+     * Creates an foreign key node
+     *
+     * @param object $foreignKey The foreign key
+     * @return object The foreign key node instance
+     */
+	protected function createForeignKeyNode($foreignKey) {
+
+		$node = $this->doc->createElement("foreign-key");
+        if ($vendorNode = $this->createVendorInfoNode($foreignKey->getVendorSpecificInfo())) {
+        	$node->appendChild($vendorNode);
+		}
+
+		$refs = $foreignKey->getReferences();
+		// all references must be to same table, so we can grab table from the first, foreign column
+		$node->setAttribute("foreignTable", $refs[0][1]->getTable()->getName());
+		$node->setAttribute("onDelete", $refs[0][2]);
+		$node->setAttribute("onUpdate", $refs[0][3]);
+		for($m = 0, $size = count($refs); $m < $size; $m++) {
+			$refNode = $this->doc->createElement("reference");
+			$refData = $refs[$m];
+			$refNode->setAttribute("local", $refData[0]->getName());
+			$refNode->setAttribute("foreign", $refData[1]->getName());
+			$node->appendChild($refNode);
+		}
+
+		return $node;
+	}
+
+    /**
+     * Creates an index node
+     *
+     * @param object $index The index
+     * @return object The index node instance
+     */
+	protected function createIndexNode($index) {
+
+		$indexType = $index->isUnique() ?  'unique' : 'index';
+
+		$node = $this->doc->createElement($indexType);
+		$node->setAttribute("name", $index->getName());
+
+		$columns = $index->getColumns();
+		foreach ($columns as $column) {
+			$tableName = $column->getTable()->getName();
+			$colName = $column->getName();
+			$columnNode = $this->doc->createElement("{$indexType}-column");
+			$columnNode->setAttribute("name", $colName);
+			$node->appendChild($columnNode);
+			if ($indexType == 'unique' && $this->isValidatorRequired('unique')) {
+				$this->validatorInfos[$tableName][$colName][] = array('type' => 'unique');
+			}
+		}
+
+        if ($vendorNode = $this->createVendorInfoNode($index->getVendorSpecificInfo())) {
+        	$node->appendChild($vendorNode);
+		}
+
+		return $node;
+	}
+
+    /**
+     * Checks whether to add validators of specified type or not
+	 *
+     * @param string $type The validator type
+     * @return boolean
+     */
+    protected function isValidatorRequired($type) {
+		$type = strtolower($type);
+		return ($this->validatorBits & self::$validatorBitMap[$type] ? true : false);
+	}
+
+    /**
+     * Registers column type specific validators if necessary
+     *
+     * We'll first collect the validators/rule infos and add them later on to
+     * have them appended to the table tag as a block.
+     *
+	 * CreoleTypes are:
+	 *
+	 * 		BOOLEAN
+	 * 		BIGINT, SMALLINT, TINYINT, INTEGER
+	 * 		FLOAT, DOUBLE, NUMERIC, DECIMAL, REAL
+	 * 		BIGINT, SMALLINT, TINYINT, INTEGER
+	 * 		TEXT
+	 * 		BLOB, CLOB, BINARY, VARBINARY, LONGVARBINARY
+	 * 		DATE, YEAR, TIME
+	 * 		TIMESTAMP
+	 *
+	 * We will add the following type specific validators:
+	 *
+	 *      for notNull columns: required validator
+	 *      for unique indexes: unique validator
+	 * 		for varchar types: maxLength validators (CHAR, VARCHAR, LONGVARCHAR)
+	 * 		for numeric types: maxValue validators (BIGINT, SMALLINT, TINYINT, INTEGER, FLOAT, DOUBLE, NUMERIC, DECIMAL, REAL)
+	 * 		for integer and timestamp types: notMatch validator with [^\d]+ (BIGINT, SMALLINT, TINYINT, INTEGER, TIMESTAMP)
+	 * 		for float types: notMatch validator with [^\d\.]+ (FLOAT, DOUBLE, NUMERIC, DECIMAL, REAL)
+     *
+     * @param object $column The Creole column
+     * @return void
+     * @todo find out how to evaluate the appropriate size and adjust maxValue rule values appropriate
+     * @todo find out if float type column values must always notMatch('[^\d\.]+'), i.e. digits and point for any db vendor, language etc.
+     */
+	protected function registerValidatorsForColumn($column) {
+
+		$table = $column->getTable();
+		$tableName = $table->getName();
+
+		$colName = $column->getName();
+		$colType = $column->getType();
+		$colSize = $column->getSize();
+
+		if ($this->isValidatorRequired('required')) {
+			$ruleInfo = array('type' => 'required');
+			$this->validatorInfos[$tableName][$colName][] = $ruleInfo;
+		}
+		$isPrimarykeyCol = in_array($colName, $this->getTablePkCols($table));
+		if ($this->isValidatorRequired('unique') && $isPrimarykeyCol) {
+			$ruleInfo = array('type' => 'unique');
+			$this->validatorInfos[$tableName][$colName][] = $ruleInfo;
+		}
+		if ($this->isValidatorRequired('maxLength') &&
+				$colSize > 0 && in_array($colType, array(
+					CreoleTypes::CHAR,
+					CreoleTypes::VARCHAR,
+					CreoleTypes::LONGVARCHAR))) {
+			$ruleInfo = array('type' => 'maxLength', 'value' => $colSize);
+			$this->validatorInfos[$tableName][$colName][] = $ruleInfo;
+		}
+		if ($this->isValidatorRequired('maxValue') &&
+				$colSize > 0 && in_array($colType, array(
+					CreoleTypes::SMALLINT,
+					CreoleTypes::TINYINT,
+					CreoleTypes::INTEGER,
+					CreoleTypes::BIGINT,
+					CreoleTypes::FLOAT,
+					CreoleTypes::DOUBLE,
+					CreoleTypes::NUMERIC,
+					CreoleTypes::DECIMAL,
+					CreoleTypes::REAL))) {
+
+			// TODO: how to evaluate the appropriate size??
+            $this->log("WARNING: maxValue validator added for column $colName. You will have to adjust the size value manually.", PROJECT_MSG_WARN);
+			$ruleInfo = array('type' => 'maxValue', 'value' => $colSize);
+			$this->validatorInfos[$tableName][$colName][] = $ruleInfo;
+		}
+		if ($this->isValidatorRequired('type') &&
+				$colSize > 0 && in_array($colType, array(
+					CreoleTypes::SMALLINT,
+					CreoleTypes::TINYINT,
+					CreoleTypes::INTEGER,
+					CreoleTypes::TIMESTAMP))) {
+			$ruleInfo = array('type' => 'type', 'value' => '[^\d]+');
+			$this->validatorInfos[$tableName][$colName][] = $ruleInfo;
+		}
+		if ($this->isValidatorRequired('type') &&
+				$colSize > 0 && in_array($colType, array(
+					CreoleTypes::FLOAT,
+					CreoleTypes::DOUBLE,
+					CreoleTypes::NUMERIC,
+					CreoleTypes::DECIMAL,
+					CreoleTypes::REAL))) {
+			// TODO: is this always true??
+			$ruleInfo = array('type' => 'type', 'value' => '[^\d\.]+');
+			$this->validatorInfos[$tableName][$colName][] = $ruleInfo;
+		}
+	}
+
+    /**
+     * Creates a validator node
+     *
+     * @param object  $column    The Creole column
+     * @param integer $type      The validator type
+     * @return object The validator node instance
+     */
+    protected function createValidator($column, $type) {
+
+		$node = $this->doc->createElement('validator');
+		$node->setAttribute('column', $column->getName());
+
+		return $node;
+	}
+
+    /**
+     * Creates a rule node
+     *
+     * @param object  $column The Creole column
+     * @param array   $rule   The rule info
+     * @return object The rule node instance
+     */
+    protected function createRuleNode($column, $rule) {
+
+		extract($rule);
+
+		// create message
+		$colName = $column->getName();
+		$tableName = $column->getTable()->getName();
+		$msg = self::$validatorMessages[strtolower($type)];
+		array_unshift($tmp = compact($msg['var']), $msg['msg']);
+		$msg = call_user_func_array('sprintf', $tmp);
+
+		// add node
+		$node = $this->doc->createElement('rule');
+		$node->setAttribute('name', $type == 'type' ? 'notMatch' : $type);
+		$node->setAttribute('message', $msg);
+
+		return $node;
+	}
+
+    /**
+     * Creates a vendor info node
+     *
+     * returns false if no vendor info can or has to be added
+     *
+     * @param array   $vendorInfo The validator info
+     * @return object|boolean The vendor info instance or false
+     */
+    protected function createVendorInfoNode($vendorInfo)
+    {
+        if(!$vendorInfo OR !$this->addVendorInfo) {
+            return false;
+        }
+
+        $vendorNode = $this->doc->createElement("vendor");
+        $vendorNode->setAttribute("type", $this->dsn["phptype"]);
+
+        foreach($vendorInfo as $key => $value) {
+            $parameterNode = $this->doc->createElement("parameter");
+            $value = iconv($this->dbEncoding, "utf-8", $value);
+            $parameterNode->setAttribute("name", $key);
+            $parameterNode->setAttribute("value", $value);
+            $vendorNode->appendChild($parameterNode);
+        }
+
+        return $vendorNode;
+    }
+
+}
+?>
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelCreoleTransformTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataDTDTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataDTDTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataDTDTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,80 @@
+<?php
+
+/*
+ *  $Id: PropelDataDTDTask.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+require_once 'propel/phing/AbstractPropelDataModelTask.php';
+include_once 'propel/engine/builder/om/ClassTools.php';
+
+/**
+ * This Task creates the OM classes based on the XML schema file.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.phing
+ */
+class PropelDataDTDTask extends AbstractPropelDataModelTask {
+
+    
+    public function main() {
+        
+        // check to make sure task received all correct params
+        $this->validate();        
+        
+        if(!$this->mapperElement) {
+            throw new BuildException("You must use a <mapper/> element to describe how names should be transformed.");
+        }
+        
+        $basepath = $this->getOutputDirectory();        
+        
+        // Get new Capsule context
+        $generator = $this->createContext();
+        $generator->put("basepath", $basepath); // make available to other templates
+                        
+        // we need some values that were loaded into the template context
+        $basePrefix = $generator->get('basePrefix');
+        $project = $generator->get('project');
+        
+        foreach ($this->getDataModels() as $dataModel) {
+        
+            $this->log("Processing Datamodel : " . $dataModel->getName());
+            
+            foreach ($dataModel->getDatabases() as $database) {
+            
+                $outFile = $this->getMappedFile($dataModel->getName());
+                            
+                $generator->put("tables", $database->getTables());
+                $generator->parse("data/dtd/dataset.tpl", $outFile->getAbsolutePath());			
+                
+                $this->log("Generating DTD for database: " . $database->getName());
+                $this->log("Creating DTD file: " . $outFile->getPath());                                
+                
+                foreach ($database->getTables() as $tbl) {
+                    $this->log("\t + " . $tbl->getName());
+                    $generator->put("table", $tbl);
+                    $generator->parse("data/dtd/table.tpl", $outFile->getAbsolutePath(), true);
+                }
+        
+            } // foreach database
+        
+        } // foreach dataModel
+
+    
+    } // main()
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataDTDTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataDumpTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataDumpTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataDumpTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,383 @@
+<?php
+
+/*
+ *  $Id: PropelDataDumpTask.php 352 2006-03-16 12:46:14Z gamr $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+include_once 'creole/Creole.php';
+
+/**
+ * Dumps the contenst of selected databases to XML data dump file.
+ *
+ * The generated XML files can have corresponding DTD files generated using the
+ * PropelDataDTDTask.  The results of the data dump can be converted to SQL using
+ * the PropelDataSQLTask class.
+ *
+ * The database may be specified (via 'databaseName' attribute) if you only want to dump
+ * the contents of one database.  Otherwise it is assumed that all databases described
+ * by datamodel schema file(s) will be dumped.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Fedor Karpelevitch <fedor.karpelevitch en home.com> (Torque)
+ * @author Jason van Zyl <jvanzyl en zenplex.com> (Torque)
+ * @author Daniel Rall <dlr en finemaltcoding.com> (Torque)
+ * @version $Revision: 352 $
+ * @package propel.phing
+ */
+class PropelDataDumpTask extends AbstractPropelDataModelTask {
+
+    /**
+     * Database name.
+     * The database name may be optionally specified in the XML if you only want
+     * to dump the contents of one database.
+     */
+    private $databaseName;
+
+    /**
+     * Database URL used for Creole connection.
+     * This is a PEAR-compatible (loosely) DSN URL.
+     */
+    private $databaseUrl;
+
+    /**
+     * Database driver used for Creole connection.
+     * This should normally be left blank so that default (Creole built-in) driver for database type is used.
+     */
+    private $databaseDriver;
+
+    /**
+     * Database user used for Creole connection.
+     * @deprecated Put username in databaseUrl.
+     */
+    private $databaseUser;
+
+    /**
+     * Database password used for Creole connection.
+     * @deprecated Put password in databaseUrl.
+     */
+    private $databasePassword;
+
+    /**
+     * Properties file that maps a data XML file to a particular database.
+     * @var PhingFile
+     */
+    private $datadbmap;
+
+    /**
+     * The database connection used to retrieve the data to dump.
+     * Needs to be public so that the TableInfo class can access it.
+     */
+    public $conn;
+
+    /**
+     * The statement used to acquire the data to dump.
+     */
+    private $stmt;
+
+    /**
+     * Set the file that maps between data XML files and databases.
+     *
+     * @param PhingFile $sqldbmap the db map
+     * @return void
+     */
+    public function setDataDbMap(PhingFile $datadbmap)
+    {
+        $this->datadbmap = $datadbmap;
+    }
+
+    /**
+     * Get the file that maps between data XML files and databases.
+     *
+     * @return PhingFile $datadbmap.
+     */
+    public function getDataDbMap()
+    {
+        return $this->datadbmap;
+    }
+
+    /**
+     * Get the database name to dump
+     *
+     * @return  The DatabaseName value
+     */
+    public function getDatabaseName()
+    {
+        return $this->databaseName;
+    }
+
+    /**
+     * Set the database name
+     *
+     * @param  v The new DatabaseName value
+     */
+    public function setDatabaseName($v)
+    {
+        $this->databaseName = $v;
+    }
+
+    /**
+     * Get the database url
+     *
+     * @return  The DatabaseUrl value
+     */
+    public function getDatabaseUrl()
+    {
+        return $this->databaseUrl;
+    }
+
+    /**
+     * Set the database url
+     *
+     * @param string $v The PEAR-compatible database DSN URL.
+     */
+    public function setDatabaseUrl($v)
+    {
+        $this->databaseUrl = $v;
+    }
+
+    /**
+     * Get the database user
+     *
+     * @return string database user
+     * @deprecated
+     */
+    public function getDatabaseUser()
+    {
+        return $this->databaseUser;
+    }
+
+    /**
+     * Set the database user
+     *
+     * @param string $v The new DatabaseUser value
+     * @deprecated Specify user in DSN URL.
+     */
+    public function setDatabaseUser($v)
+    {
+        $this->databaseUser = $v;
+    }
+
+    /**
+     * Get the database password
+     *
+     * @return string database password
+     */
+    public function getDatabasePassword()
+    {
+        return $this->databasePassword;
+    }
+
+    /**
+     * Set the database password
+     *
+     * @param string $v The new DatabasePassword value
+     * @deprecated Specify database password in DSN URL.
+     */
+    public function setDatabasePassword($v)
+    {
+        $this->databasePassword = $v;
+    }
+
+    /**
+     * Get the database driver name
+     *
+     * @return string database driver name
+     */
+    public function getDatabaseDriver()
+    {
+        return $this->databaseDriver;
+    }
+
+    /**
+     * Set the database driver name
+     *
+     * @param string $v The new DatabaseDriver value
+     */
+    public function setDatabaseDriver($v)
+    {
+        $this->databaseDriver = $v;
+    }
+
+    /**
+     * Create the data XML -> database map.
+     *
+     * This is necessary because there is currently no other method of knowing which
+     * data XML files correspond to which database.  This map allows us to convert multiple
+     * data XML files into SQL.
+     *
+     * @throws IOException - if unable to store properties
+     */
+    private function createDataDbMap()
+    {
+        if ($this->getDataDbMap() === null) {
+            return;
+        }
+
+        // Produce the sql -> database map
+        $datadbmap = new Properties();
+
+        // Check to see if the sqldbmap has already been created.
+        if ($this->getDataDbMap()->exists()) {
+            $datadbmap->load($this->getDataDbMap());
+        }
+
+        foreach ($this->getDataModels() as $dataModel) {            // there is really one 1 db per datamodel
+            foreach ($dataModel->getDatabases() as $database) {
+
+                // if database name is specified, then we only want to dump that one db.
+                if (empty($this->databaseName) || ($this->databaseName && $database->getName() == $this->databaseName)) {
+                    $outFile = $this->getMappedFile($dataModel->getName());
+                    $datadbmap->setProperty($outFile->getName(), $database->getName());
+                }
+            }
+        }
+
+        try {
+            $datadbmap->store($this->getDataDbMap(), "Data XML file -> Database map");
+        } catch (IOException $e) {
+            throw new IOException("Unable to store properties: ". $e->getMessage());
+        }
+    }
+
+    /**
+     * Iterates through each datamodel/database, dumps the contents of all tables and creates a DOM XML doc.
+     *
+     * @return void
+     * @throws BuildException
+     */
+    public function main()
+    {
+        $this->validate();
+
+        $buf = "Database settings:\n"
+            . " driver: " . ($this->databaseDriver ? $this->databaseDriver : "(default)" ). "\n"
+            . " URL: " . $this->databaseUrl . "\n"
+            . ($this->databaseUser ? " user: " . $this->databaseUser . "\n" : "") // deprecated
+            . ($this->databasePassword ? " password: " . $this->databasePassword . "\n" : ""); // deprecated
+
+        $this->log($buf, PROJECT_MSG_VERBOSE);
+
+        // 1) First create the Data XML -> database name map.
+        $this->createDataDbMap();
+
+        // 2) Now go create the XML files from teh database(s)
+        foreach ($this->getDataModels() as $dataModel) {            // there is really one 1 db per datamodel
+            foreach ($dataModel->getDatabases() as $database) {
+
+                // if database name is specified, then we only want to dump that one db.
+                if (empty($this->databaseName) || ($this->databaseName && $database->getName() == $this->databaseName)) {
+
+                    $outFile = $this->getMappedFile($dataModel->getName());
+
+                    $this->log("Dumping data to XML for database: " . $database->getName());
+                    $this->log("Writing to XML file: " . $outFile->getName());
+
+                    try {
+
+                        $url = str_replace("@DB@", $database->getName(), $this->databaseUrl);
+
+                        $buf = "Database settings:\n"
+                        . " driver: " . ($this->databaseDriver ? $this->databaseDriver : "(default)" ). "\n"
+                        . " URL: " . $url . "\n"
+                        . ($this->databaseUser ? " user: " . $this->databaseUser . "\n" : "")
+                        . ($this->databasePassword ? " password: " . $this->databasePassword . "\n" : "");
+
+                        $this->log($buf, PROJECT_MSG_VERBOSE);
+
+                        $dsn = Creole::parseDSN($url);
+
+                        // deprecated, but here for BC
+                        if ($this->databaseUser) {
+                            $dsn['username'] = $this->databaseUser;
+                        }
+
+                        if ($this->databasePassword) {
+                            $dsn['password'] = $this->databasePassword;
+                        }
+
+                        if ($this->databaseName) {
+                            $dsn['database'] = $this->databaseName;
+                        }
+
+                        if ($this->databaseDriver) {
+                            Creole::registerDriver($dsn['phptype'], $this->databaseDriver);
+                        }
+
+                        $this->conn = Creole::getConnection($dsn);
+
+                        $doc = $this->createXMLDoc($database);
+                        $doc->save($outFile->getAbsolutePath());
+
+                    } catch (SQLException $se) {
+                        $this->log("SQLException while connecting to DB: ". $se->getMessage(), PROJECT_MSG_ERR);
+                        throw new BuildException($se);
+                    }
+                } // if databaseName && database->getName == databaseName
+            } // foreach database
+        } // foreach datamodel
+    }
+
+    /**
+     * Gets ResultSet of query to fetch all data from a table.
+     * @param string $tableName
+     * @return ResultSet
+     */
+    private function getTableDataRS($tableName) {
+        // Set Statement object in associated PropelDataDump
+        // instance.
+        return $this->conn->createStatement()->executeQuery("SELECT * FROM " . $this->getPlatformForTargetDatabase()->quoteIdentifier ( $tableName ) );
+    }
+
+    /**
+     * Creates a DOM document containing data for specified database.
+     * @param Database $database
+     * @return DOMDocument
+     */
+    private function createXMLDoc(Database $database) {
+
+        $doc = new DOMDocument('1.0', 'utf-8');
+        $doc->formatOutput = true; // pretty printing
+        $doc->appendChild($doc->createComment("Created by data/dump/Control.tpl template."));
+
+        $dsNode = $doc->createElement("dataset");
+        $dsNode->setAttribute("name", "all");
+        $doc->appendChild($dsNode);
+
+        $this->log("Building DOM tree containing data from tables:");
+
+        foreach ($database->getTables() as $tbl) {
+            $this->log("\t+ " . $tbl->getName());
+            $rs = $this->getTableDataRS($tbl->getName());
+            while ($rs->next()) {
+                $rowNode = $doc->createElement($tbl->getPhpName());
+                foreach ($tbl->getColumns() as $col) {
+                    $cval = $rs->get($col->getName());
+                    if ($cval !== null) {
+                        $rowNode->setAttribute($col->getPhpName(), iconv($this->dbEncoding, 'utf-8', $cval));
+                    }
+                }
+                $dsNode->appendChild($rowNode);
+                unset($rowNode);
+            }
+            $rs->close();
+        }
+
+        return $doc;
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataDumpTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataModelTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataModelTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataModelTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,131 @@
+<?php
+
+/*
+ *  $Id: PropelDataModelTask.php 64 2005-05-13 02:43:56Z root $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+require_once 'propel/phing/AbstractPropelDataModelTask.php';
+include_once 'propel/engine/database/model/AppData.php';
+include_once 'propel/engine/database/model/Database.php';
+include_once 'propel/engine/database/transform/XmlToAppData.php';
+
+/**
+ * A generic class that simply loads the data model and parses a control template.
+ * 
+ * This class exists largely for compatibility with early Propel where this was
+ * a CapsuleTask subclass.  This class also makes it easy to quickly add some custom
+ * datamodel-based transformations (by allowing you to put the logic in the templates).
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.phing
+ * @version $Revision: 64 $
+ */
+class PropelDataModelTask extends AbstractPropelDataModelTask {
+    
+    /**
+     * This is the file where the generated text
+     * will be placed.
+     * @var string
+     */
+    protected $outputFile;
+    
+    /**
+     * This is the control template that governs the output.
+     * It may or may not invoke the services of worker
+     * templates.
+     * @var string
+     */
+    protected $controlTemplate;    
+    
+            
+    /**
+     * [REQUIRED] Set the output file for the
+     * generation process.
+     * @param string $outputFile (TODO: change this to File)
+     * @return void
+     */
+    public function setOutputFile($outputFile) {
+        $this->outputFile = $outputFile;
+    }
+
+    /**
+     * Get the output file for the
+     * generation process.
+     * @return string
+     */
+    public function getOutputFile() {
+        return $this->outputFile;
+    }        
+
+    /**
+     * [REQUIRED] Set the control template for the
+     * generating process.
+     * @param string $controlTemplate
+     * @return void
+     */
+    public function setControlTemplate ($controlTemplate) {
+        $this->controlTemplate = $controlTemplate;
+    }
+
+    /**
+     * Get the control template for the
+     * generating process.
+     * @return string
+     */
+    public function getControlTemplate() {
+        return $this->controlTemplate;
+    }
+ 
+    protected function validate()
+    {
+        parent::validate();
+        
+        // Make sure the control template is set.
+        if ($this->controlTemplate === null) {
+            throw new BuildException("The control template needs to be defined!");
+        }            
+        // Make sure there is an output file.
+        if ($this->outputFile === null) {
+            throw new BuildException("The output file needs to be defined!");
+        }            
+    
+    }
+    
+    /**
+     * Creates Capsule context and parses control template.
+     * @return void
+     */
+    public function main()
+    {
+        $this->validate();        
+        $context = $this->createContext();        
+        
+        $context->put("dataModels", $this->getDataModels());
+        
+        $path = $this->outputDirectory . DIRECTORY_SEPARATOR . $this->outputFile;
+        $this->log("Generating to file " . $path);
+        
+        try {
+            $this->log("Parsing control template: " . $this->controlTemplate);
+            $context->parse($this->controlTemplate, $path);
+        } catch (Exception $ioe) {
+            throw new BuildException("Cannot write parsed template: ". $ioe->getMessage());
+        }
+    }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataModelTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataSQLTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataSQLTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataSQLTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,219 @@
+<?php
+
+/*
+ *  $Id: PropelDataSQLTask.php 265 2005-11-07 21:05:18Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+include_once 'propel/engine/database/model/AppData.php';
+include_once 'propel/engine/database/model/Database.php';
+include_once 'propel/engine/database/transform/XmlToAppData.php';
+include_once 'propel/engine/database/transform/XmlToData.php';
+
+/**
+ * Task that transforms XML datadump files into files containing SQL INSERT statements.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author  Jason van Zyl  <jvanzyl en periapt.com> (Torque)
+ * @author  John McNally  <jmcnally en collab.net> (Torque)
+ * @author  Fedor Karpelevitch  <fedor.karpelevitch en home.com> (Torque)
+ * @version $Revision: 265 $
+ * @package propel.phing
+ */
+class PropelDataSQLTask extends AbstractPropelDataModelTask {
+
+    /**
+     * Properties file that maps an SQL file to a particular database.
+     * @var PhingFile
+     */
+    private $sqldbmap;
+
+    /**
+     * Properties file that maps a data XML file to a particular database.
+     * @var PhingFile
+     */
+    private $datadbmap;
+
+    /**
+     * The base directory in which to find data XML files.
+     * @var PhingFile
+     */
+    private $srcDir;
+
+    /**
+     * Set the file that maps between SQL files and databases.
+     *
+     * @param PhingFile $sqldbmap the sql -> db map.
+     * @return void
+     */
+    public function setSqlDbMap(PhingFile $sqldbmap)
+    {
+        $this->sqldbmap = $sqldbmap;
+    }
+
+    /**
+     * Get the file that maps between SQL files and databases.
+     *
+     * @return PhingFile sqldbmap.
+     */
+    public function getSqlDbMap()
+    {
+        return $this->sqldbmap;
+    }
+
+    /**
+     * Set the file that maps between data XML files and databases.
+     *
+     * @param PhingFile $sqldbmap the db map
+     * @return void
+     */
+    public function setDataDbMap(PhingFile $datadbmap)
+    {
+        $this->datadbmap = $datadbmap;
+    }
+
+    /**
+     * Get the file that maps between data XML files and databases.
+     *
+     * @return PhingFile $datadbmap.
+     */
+    public function getDataDbMap()
+    {
+        return $this->datadbmap;
+    }
+
+    /**
+     * Set the src directory for the data xml files listed in the datadbmap file.
+     * @param PhingFile $srcDir data xml source directory
+     */
+    public function setSrcDir(PhingFile $srcDir)
+    {
+        $this->srcDir = $srcDir;
+    }
+
+    /**
+     * Get the src directory for the data xml files listed in the datadbmap file.
+     *
+     * @return PhingFile data xml source directory
+     */
+    public function getSrcDir()
+    {
+        return $this->srcDir;
+    }
+
+    /**
+     * Search through all data models looking for matching database.
+     * @return Database or NULL if none found.
+     */
+    private function getDatabase($name)
+    {
+        foreach($this->getDataModels() as $dm) {
+            foreach($dm->getDatabases() as $db) {
+                if ($db->getName() == $name) {
+                    return $db;
+                }
+            }
+        }
+    }
+
+    /**
+     * Main method parses the XML files and creates SQL files.
+     *
+     * @return void
+     * @throws Exception If there is an error parsing the data xml.
+     */
+    public function main()
+    {
+        $this->validate();
+
+        $targetDatabase = $this->getTargetDatabase();
+		
+		$platform = $this->getPlatformForTargetDatabase();
+		
+        // Load the Data XML -> DB Name properties
+        $map = new Properties();
+        try {
+            $map->load($this->getDataDbMap());
+        } catch (IOException $ioe) {
+            throw new BuildException("Cannot open and process the datadbmap!", $ioe);
+        }
+
+		DataModelBuilder::setBuildProperties($this->getPropelProperties());
+		
+        // Parse each file in teh data -> db map
+
+        foreach($map->keys() as $dataXMLFilename) {
+
+            $dataXMLFile = new PhingFile($this->srcDir, $dataXMLFilename);
+
+            // if file exists then proceed
+            if ($dataXMLFile->exists()) {
+
+                $dbname = $map->get($dataXMLFilename);
+
+                $db = $this->getDatabase($dbname);
+				
+                if (!$db) {
+                    throw new BuildException("Cannot find instantiated Database for name '$dbname' from datadbmap file.");
+                }
+				
+				$db->setPlatform($platform);
+				
+                $outFile = $this->getMappedFile($dataXMLFilename);
+
+                $this->log("Creating SQL from XML data dump file: " . $dataXMLFile->getAbsolutePath());
+
+                try {
+                    $dataXmlParser = new XmlToData($db, $this->dbEncoding);
+                    $data = $dataXmlParser->parseFile($dataXMLFile->getAbsolutePath());
+                } catch (Exception $e) {
+                    throw new Exception("Exception parsing data XML: " . $e->getMessage());
+                }
+				
+				$fp = fopen($outFile->getAbsolutePath(), 'w');
+				
+				$currTable = null;
+                foreach ($data as $dataRow) {
+					if ($currTable !== $dataRow->getTable()) {
+					    $currTable = $dataRow->getTable();
+						$builder = DataModelBuilder::builderFactory($currTable, 'datasql');
+					}
+					$sql = $builder->buildRowSql($dataRow);
+					fwrite($fp, $sql);
+                }
+				
+				fclose($fp);
+				
+				// Place the generated SQL file(s)
+	            $p = new Properties();
+	            if ($this->getSqlDbMap()->exists()) {
+	                $p->load($this->getSqlDbMap());
+	            }
+	
+	            $p->setProperty($outFile->getName(), $db->getName());
+	            $p->store($this->getSqlDbMap(), "Sqlfile -> Database map");
+				
+            } else {
+                $this->log("File '" . $dataXMLFile->getAbsolutePath()
+                        . "' in datadbmap does not exist, so skipping it.", PROJECT_MSG_WARN);
+            }            
+
+        } // foreach data xml file
+
+    } // main()
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelDataSQLTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelGraphvizTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelGraphvizTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelGraphvizTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,177 @@
+<?php
+
+/*
+ *  $Id: PropelGraphvizTask.php 350 2006-03-15 17:24:56Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+include_once 'propel/engine/database/model/AppData.php';
+//require_once 'phing/Task.php';
+
+/**
+ * A task to generate Graphviz png images from propel datamodel.
+ *
+ * @author Mark Kimsal
+ * @version $Revision: 350 $
+ * @package propel.phing
+ */
+class PropelGraphvizTask extends AbstractPropelDataModelTask {
+
+    /**
+     * The properties file that maps an SQL file to a particular database.
+     * @var PhingFile
+     */
+    private $sqldbmap;
+
+    /**
+     * Name of the database.
+     */
+    private $database;
+
+    /**
+     * Name of the output directory.
+     */
+    private $outDir;
+
+
+    /**
+     * Set the sqldbmap.
+     * @param PhingFile $sqldbmap The db map.
+     */
+    public function setOutputDirectory(PhingFile $out)
+    {
+		if (!$out->exists()) {
+			$out->mkdirs();
+		}
+        $this->outDir = $out;
+    }
+
+
+    /**
+     * Set the sqldbmap.
+     * @param PhingFile $sqldbmap The db map.
+     */
+    public function setSqlDbMap(PhingFile $sqldbmap)
+    {
+        $this->sqldbmap = $sqldbmap;
+    }
+
+    /**
+     * Get the sqldbmap.
+     * @return PhingFile $sqldbmap.
+     */
+    public function getSqlDbMap()
+    {
+        return $this->sqldbmap;
+    }
+
+    /**
+     * Set the database name.
+     * @param string $database
+     */
+    public function setDatabase($database)
+    {
+        $this->database = $database;
+    }
+
+    /**
+     * Get the database name.
+     * @return string
+     */
+    public function getDatabase()
+    {
+        return $this->database;
+    }
+
+
+    public function main()
+    {
+
+		$count = 0;
+
+        $dotSyntax = '';
+
+        // file we are going to create
+
+        $dbMaps = $this->getDataModelDbMap();
+
+        foreach ($this->getDataModels() as $dataModel) {
+
+            $dotSyntax .= "digraph G {\n";
+            foreach ($dataModel->getDatabases() as $database) {
+
+				$this->log("db: " . $database->getName());
+
+                //print the tables
+                foreach($database->getTables() as $tbl) {
+
+					$this->log("\t+ " . $tbl->getName());
+
+                    ++$count;
+                    $dotSyntax .= 'node'.$tbl->getName().' [label="{<table>'.$tbl->getName().'|<cols>';
+
+                    foreach ($tbl->getColumns() as $col) {
+                        $dotSyntax .= $col->getName() . ' (' . $col->getType()  . ')';
+                        if ($col->getForeignKey() != null ) {
+                            $dotSyntax .= ' [FK]';
+                        } elseif ($col->isPrimaryKey()) {
+                            $dotSyntax .= ' [PK]';
+                        }
+                        $dotSyntax .= '\l';
+                    }
+                    $dotSyntax .= '}", shape=record];';
+                    $dotSyntax .= "\n";
+                }
+
+                //print the relations
+
+                $count = 0;
+                $dotSyntax .= "\n";
+                foreach($database->getTables() as $tbl) {
+                    ++$count;
+
+                    foreach ($tbl->getColumns() as $col) {
+                        $fk = $col->getForeignKey();
+                        if ( $fk == null ) continue;
+                        $dotSyntax .= 'node'.$tbl->getName() .':cols -> node'.$fk->getForeignTableName() . ':table [label="' . $col->getName() . '=' . implode(',', $fk->getForeignColumns()) . ' "];';
+                        $dotSyntax .= "\n";
+                    }
+                }
+
+
+
+            } // foreach database
+            $dotSyntax .= "}\n";
+
+            $this->writeDot($dotSyntax,$this->outDir);
+
+        } //foreach datamodels
+
+    } // main()
+
+
+    /**
+     * probably insecure
+     */
+    function writeDot($dotSyntax, PhingFile $outputDir) {
+		$file = new PhingFile($outputDir, 'schema.dot');
+		$this->log("Writing dot file to " . $file->getAbsolutePath());
+        file_put_contents($file->getAbsolutePath(), $dotSyntax);
+    }
+
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelGraphvizTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelOMTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelOMTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelOMTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,212 @@
+<?php
+
+/*
+ *  $Id: PropelOMTask.php 258 2005-11-07 16:12:09Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+ 
+require_once 'propel/phing/AbstractPropelDataModelTask.php';
+include_once 'propel/engine/builder/om/ClassTools.php';
+require_once 'propel/engine/builder/om/OMBuilder.php';
+
+/**
+ * This Task creates the OM classes based on the XML schema file.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.phing
+ */
+class PropelOMTask extends AbstractPropelDataModelTask {
+
+	/**
+	 * The platform (php4, php5, etc.) for which the om is being built.
+	 * @var string
+	 */
+	private $targetPlatform;
+	
+	/**
+	 * Sets the platform (php4, php5, etc.) for which the om is being built.
+	 * @param string $v
+	 */
+	public function setTargetPlatform($v) {
+		$this->targetPlatform = $v;
+	}
+	
+	/**
+	 * Gets the platform (php4, php5, etc.) for which the om is being built.
+	 * @return string
+	 */
+	public function getTargetPlatform() {
+		return $this->targetPlatform;
+	}
+	
+	/**
+	 * Utility method to create directory for package if it doesn't already exist.
+	 * @param string $path The [relative] package path.
+	 * @throws BuildException - if there is an error creating directories
+	 */
+	protected function ensureDirExists($path)
+	{
+		$f = new PhingFile($this->getOutputDirectory(), $path);
+		if (!$f->exists()) {
+			if (!$f->mkdirs()) {
+				throw new BuildException("Error creating directories: ". $f->getPath());
+			}
+		}
+	}
+	
+	/**
+	 * Uses a builder class to create the output class.
+	 * This method assumes that the DataModelBuilder class has been initialized with the build properties.
+	 * @param OMBuilder $builder
+	 * @param boolean $overwrite Whether to overwrite existing files with te new ones (default is YES).
+	 * @todo -cPropelOMTask Consider refactoring build() method into AbstractPropelDataModelTask (would need to be more generic).
+	 */
+	protected function build(OMBuilder $builder, $overwrite = true)
+	{
+		
+		$path = $builder->getClassFilePath();
+		$this->ensureDirExists(dirname($path));
+		
+		$_f = new PhingFile($this->getOutputDirectory(), $path);
+		if ($overwrite || !$_f->exists()) {
+			$this->log("\t\t-> " . $builder->getClassname() . " [builder: " . get_class($builder) . "]");
+			$script = $builder->build();
+			file_put_contents($_f->getAbsolutePath(), $script);
+			foreach($builder->getWarnings() as $warning) {
+				$this->log($warning, PROJECT_MSG_WARN);
+			}
+		} else {
+			$this->log("\t\t-> (exists) " . $builder->getClassname());
+		}
+		
+	}
+	
+	/**
+	 * Main method builds all the targets for a typical propel project.
+	 */
+	public function main()
+	{		
+		// check to make sure task received all correct params
+		$this->validate();		
+		
+		$basepath = $this->getOutputDirectory();		
+		
+		// Get new Capsule context
+		$generator = $this->createContext();
+		$generator->put("basepath", $basepath); // make available to other templates
+		
+		$targetPlatform = $this->getTargetPlatform(); // convenience for embedding in strings below
+				
+		// we need some values that were loaded into the template context
+		$basePrefix = $generator->get('basePrefix');
+		$project = $generator->get('project');
+		
+		DataModelBuilder::setBuildProperties($this->getPropelProperties());
+		
+		foreach ($this->getDataModels() as $dataModel) {
+			$this->log("Processing Datamodel : " . $dataModel->getName());
+			
+			foreach ($dataModel->getDatabases() as $database) {
+				
+				$this->log("  - processing database : " . $database->getName());
+				$generator->put("platform", $database->getPlatform());
+				
+							
+				foreach ($database->getTables() as $table) {					
+				
+					if (!$table->isForReferenceOnly()) {
+						
+						$this->log("\t+ " . $table->getName());
+						
+						// -----------------------------------------------------------------------------------------
+						// Create Peer, Object, and MapBuilder classes
+						// -----------------------------------------------------------------------------------------
+						
+						// these files are always created / overwrite any existing files
+						foreach(array('peer', 'object', 'mapbuilder') as $target) {
+							$builder = DataModelBuilder::builderFactory($table, $target);
+							$this->build($builder);
+						}
+						
+						// -----------------------------------------------------------------------------------------
+						// Create [empty] stub Peer and Object classes if they don't exist
+						// -----------------------------------------------------------------------------------------
+						
+						// these classes are only generated if they don't already exist
+						foreach(array('peerstub', 'objectstub') as $target) {
+							$builder = DataModelBuilder::builderFactory($table, $target);
+							$this->build($builder, $overwrite=false);
+						}
+						
+						// -----------------------------------------------------------------------------------------
+						// Create [empty] stub child Object classes if they don't exist
+						// -----------------------------------------------------------------------------------------
+						
+						// If table has enumerated children (uses inheritance) then create the empty child stub classes if they don't already exist.
+						if ($table->getChildrenColumn()) {
+							$col = $table->getChildrenColumn();
+							if ($col->isEnumeratedClasses()) {
+								foreach ($col->getChildren() as $child) {
+									$builder = DataModelBuilder::builderFactory($table, 'objectmultiextend');
+									$builder->setChild($child);
+									$this->build($builder, $overwrite=false);
+								} // foreach
+							} // if col->is enumerated
+						} // if tbl->getChildrenCol
+						
+						
+						// -----------------------------------------------------------------------------------------
+						// Create [empty] Interface if it doesn't exist
+						// -----------------------------------------------------------------------------------------
+						
+						// Create [empty] interface if it does not already exist
+						if ($table->getInterface()) {
+							$builder = DataModelBuilder::builderFactory($table, 'interface');
+							$this->build($builder, $overwrite=false);
+						}
+						
+						// -----------------------------------------------------------------------------------------
+						// Create tree Node classes
+						// -----------------------------------------------------------------------------------------
+						
+						if ($table->isTree()) {
+							
+							foreach(array('nodepeer', 'node') as $target) {							
+								$builder = DataModelBuilder::builderFactory($table, $target);
+								$this->build($builder);							
+							}
+							
+							foreach(array('nodepeerstub', 'nodestub') as $target) {
+								$builder = DataModelBuilder::builderFactory($table, $target);
+								$this->build($builder, $overwrite=false);							
+							}
+							
+						} // if Table->isTree()
+						
+						
+					} // if !$table->isForReferenceOnly()										
+					
+				} // foreach table	
+		
+			} // foreach database
+		
+		} // foreach dataModel
+
+	
+	} // main()
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelOMTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelOldOMTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelOldOMTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelOldOMTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,236 @@
+<?php
+
+/*
+ *  $Id: PropelOldOMTask.php 176 2005-08-24 15:44:58Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'propel/phing/AbstractPropelDataModelTask.php';
+include_once 'propel/engine/builder/om/ClassTools.php';
+
+/**
+ * This Task creates the OM classes based on the XML schema file using the legacy templates.
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.phing
+ * @deprecated
+ */
+class PropelOldOMTask extends AbstractPropelDataModelTask {
+
+    /**
+     * The platform (php4, php5, etc.) for which the om is being built.
+     * @var string
+     */
+    private $targetPlatform;
+
+    /**
+     * Sets the platform (php4, php5, etc.) for which the om is being built.
+     * @param string $v
+     */
+    public function setTargetPlatform($v) {
+        $this->targetPlatform = $v;
+    }
+
+    /**
+     * Gets the platform (php4, php5, etc.) for which the om is being built.
+     * @return string
+     */
+    public function getTargetPlatform() {
+        return $this->targetPlatform;
+    }
+
+    public function main() {
+
+        // check to make sure task received all correct params
+        $this->validate();
+
+        $basepath = $this->getOutputDirectory();
+
+        // Get new Capsule context
+        $generator = $this->createContext();
+        $generator->put("basepath", $basepath); // make available to other templates
+
+        $targetPlatform = $this->getTargetPlatform(); // convenience for embedding in strings below
+
+        // we need some values that were loaded into the template context
+        $basePrefix = $generator->get('basePrefix');
+        $project = $generator->get('project');
+
+        foreach ($this->getDataModels() as $dataModel) {
+            $this->log("Processing Datamodel : " . $dataModel->getName());
+
+            foreach ($dataModel->getDatabases() as $database) {
+
+                $this->log("  - processing database : " . $database->getName());
+                $generator->put("platform", $database->getPlatform());
+
+
+                foreach ($database->getTables() as $table) {
+
+                    if (!$table->isForReferenceOnly()) {
+                        if ($table->getPackage()) {
+                            $package = $table->getPackage();
+                        } else {
+                            $package = $this->targetPackage;
+                        }
+
+                        $pkbase = "$package.om";
+                        $pkpeer = "$package";
+                        $pkmap = "$package.map";
+
+                        // make these available
+                        $generator->put("package", $package);
+                        $generator->put("pkbase", $pkbase);
+                        //$generator->put("pkpeer", $pkpeer); -- we're not using this yet
+                        $generator->put("pkmap", $pkmap);
+
+                        foreach(array($pkpeer, $pkmap, $pkbase) as $pk) {
+                            $path = strtr($pk, '.', '/');
+                            $f = new PhingFile($this->getOutputDirectory(), $path);
+                            if (!$f->exists()) {
+                                if (!$f->mkdirs()) {
+                                    throw new Exception("Error creating directories: ". $f->getPath());
+                                }
+                            }
+                        } // for each package
+
+
+                        $this->log("\t+ " . $table->getName());
+
+                        $generator->put("table", $table);
+
+                        // Create the Base Peer class
+                        $this->log("\t\t-> " . $basePrefix . $table->getPhpName() . "Peer");
+                        $path = ClassTools::getFilePath($pkbase, $basePrefix . $table->getPhpName() . "Peer");
+                        $generator->parse("om/$targetPlatform/Peer.tpl", $path);
+
+                        // Create the Base object class
+                        $this->log("\t\t-> " . $basePrefix . $table->getPhpName());
+                        $path = ClassTools::getFilePath($pkbase, $basePrefix . $table->getPhpName());
+                        $generator->parse("om/$targetPlatform/Object.tpl", $path);
+
+                        if ($table->isTree()) {
+                            // Create the Base NodePeer class
+                            $this->log("\t\t-> " . $basePrefix . $table->getPhpName() . "NodePeer");
+                            $path = ClassTools::getFilePath($pkbase, $basePrefix . $table->getPhpName() . "NodePeer");
+                            $generator->parse("om/$targetPlatform/NodePeer.tpl", $path);
+
+                            // Create the Base Node class if the table is a tree
+                            $this->log("\t\t-> " . $basePrefix . $table->getPhpName() . "Node");
+                            $path = ClassTools::getFilePath($pkbase, $basePrefix . $table->getPhpName() . "Node");
+                            $generator->parse("om/$targetPlatform/Node.tpl", $path);
+                        }
+
+                        // Create MapBuilder class if this table is not an alias
+                        if (!$table->isAlias()) {
+                            $this->log("\t\t-> " . $table->getPhpName() . "MapBuilder");
+                            $path = ClassTools::getFilePath($pkmap, $table->getPhpName() . "MapBuilder");
+                            $generator->parse("om/$targetPlatform/MapBuilder.tpl", $path);
+                        } // if !$table->isAlias()
+
+                        // Create [empty] stub Peer class if it does not already exist
+                        $path = ClassTools::getFilePath($package, $table->getPhpName() . "Peer");
+                        $_f = new PhingFile($basepath, $path);
+                        if (!$_f->exists()) {
+                            $this->log("\t\t-> " . $table->getPhpName() . "Peer");
+                            $generator->parse("om/$targetPlatform/ExtensionPeer.tpl", $path);
+                        } else {
+                            $this->log("\t\t-> (exists) " . $table->getPhpName() . "Peer");
+                        }
+
+                        // Create [empty] stub object class if it does not already exist
+                        $path = ClassTools::getFilePath($package, $table->getPhpName());
+                        $_f = new PhingFile($basepath, $path);
+                        if (!$_f->exists()) {
+                            $this->log("\t\t-> " . $table->getPhpName());
+                            $generator->parse("om/$targetPlatform/ExtensionObject.tpl", $path);
+                        } else {
+                            $this->log("\t\t-> (exists) " . $table->getPhpName());
+                        }
+
+                        if ($table->isTree()) {
+                            // Create [empty] stub Node Peer class if it does not already exist
+                            $path = ClassTools::getFilePath($package, $table->getPhpName() . "NodePeer");
+                            $_f = new PhingFile($basepath, $path);
+                            if (!$_f->exists()) {
+                                $this->log("\t\t-> " . $table->getPhpName() . "NodePeer");
+                                $generator->parse("om/$targetPlatform/ExtensionNodePeer.tpl", $path);
+                            } else {
+                                $this->log("\t\t-> (exists) " . $table->getPhpName() . "NodePeer");
+                            }
+
+                            // Create [empty] stub Node class if it does not already exist
+                            $path = ClassTools::getFilePath($package, $table->getPhpName() . "Node");
+                            $_f = new PhingFile($basepath, $path);
+                            if (!$_f->exists()) {
+                                $this->log("\t\t-> " . $table->getPhpName() . "Node");
+                                $generator->parse("om/$targetPlatform/ExtensionNode.tpl", $path);
+                            } else {
+                                $this->log("\t\t-> (exists) " . $table->getPhpName() . "Node");
+                            }
+                        }
+
+                        // Create [empty] interface if it does not already exist
+                        if ($table->getInterface()) {
+                            $path = ClassTools::getFilePath($table->getInterface());
+                            $_f = new PhingFile($basepath, $path);
+                            if (!$_f->exists()) {
+							
+								$_dir = new PhingFile(dirname($_f->getAbsolutePath()));
+								$_dir->mkdirs();
+								
+                                $this->log("\t\t-> " . $table->getInterface());
+                                $generator->parse("om/$targetPlatform/Interface.tpl", $path);
+								
+                            } else {
+                                $this->log("\t\t-> (exists) " . $table->getInterface());
+                            }
+                        }
+
+                        // If table has enumerated children (uses inheritance) then create the empty child stub classes
+                        // if they don't already exist.
+                        if ($table->getChildrenColumn()) {
+                            $col = $table->getChildrenColumn();
+                            if ($col->isEnumeratedClasses()) {
+                                foreach ($col->getChildren() as $child) {
+									$childpkg = ($child->getPackage() ? $child->getPackage() : $package);
+                                    $generator->put("child", $child);
+									$generator->put("package", $childpkg);
+                                    $path = ClassTools::getFilePath($childpkg, $child->getClassName());
+                                    $_f = new PhingFile($basepath, $path);
+                                    if (!$_f->exists()) {
+                                        $this->log("\t\t-> " . $child->getClassName());
+                                        $generator->parse("om/$targetPlatform/MultiExtendObject.tpl", $path);
+                                    } else {
+                                        $this->log("\t\t-> (exists) " . $child->getClassName());
+                                    }
+                                } // foreach
+                            } // if col->is enumerated
+                        } // if tbl->getChildrenCol
+
+                    } // if !$table->isForReferenceOnly()
+
+                } // foreach table
+
+            } // foreach database
+
+        } // foreach dataModel
+
+
+    } // main()
+}
\ No newline at end of file


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelOldOMTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelOldSQLTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelOldSQLTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelOldSQLTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,287 @@
+<?php
+
+/*
+ *  $Id: PropelOldSQLTask.php 497 2006-01-22 13:07:47Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+include_once 'propel/engine/database/model/AppData.php';
+
+/**
+ * An extended Capsule task used for generating SQL source from an XML schema describing a database structure.
+ * 
+ * This is deprecated; the new PropelSQLTask should be used instead.
+ *
+ * @author Hans Lellelid <hans en xmpl.org> (Propel)
+ * @author Jason van Zyl <jvanzyl en periapt.com> (Torque)
+ * @author John McNally <jmcnally en collab.net> (Torque)
+ * @version $Revision: 277 $
+ * @package propel.phing
+ * @deprecated
+ */
+class PropelOldSQLTask extends AbstractPropelDataModelTask {
+
+    /**
+     * The properties file that maps an SQL file to a particular database.
+     * @var PhingFile
+     */
+    private $sqldbmap;
+
+    /**
+     * Name of the database.
+     */
+    private $database;
+
+    /**
+     * Set the sqldbmap.
+     * @param PhingFile $sqldbmap The db map.
+     */
+    public function setSqlDbMap(PhingFile $sqldbmap)
+    {
+        $this->sqldbmap = $sqldbmap;
+    }
+
+    /**
+     * Get the sqldbmap.
+     * @return PhingFile $sqldbmap.
+     */
+    public function getSqlDbMap()
+    {
+        return $this->sqldbmap;
+    }
+
+    /**
+     * Set the database name.
+     * @param string $database
+     */
+    public function setDatabase($database)
+    {
+        $this->database = $database;
+    }
+
+    /**
+     * Get the database name.
+     * @return string
+     */
+    public function getDatabase()
+    {
+        return $this->database;
+    }
+
+    /**
+     * Create the sql -> database map.
+     *
+     * @throws IOException - if unable to store properties
+     */
+    private function createSqlDbMap()
+    {
+        if ($this->getSqlDbMap() === null) {
+            return;
+        }
+
+        // Produce the sql -> database map
+        $sqldbmap = new Properties();
+
+        // Check to see if the sqldbmap has already been created.
+        if ($this->getSqlDbMap()->exists()) {
+            $sqldbmap->load($this->getSqlDbMap());
+        }
+
+		if ($this->packageObjectModel) {
+			// in this case we'll get the sql file name from the package attribute
+			$dataModels = $this->packageDataModels();
+			foreach ($dataModels as $package => $dataModel) {
+				foreach ($dataModel->getDatabases() as $database) {
+					$name = ($package ? $package . '.' : '') . 'schema.xml';
+                	$sqlFile = $this->getMappedFile($name);
+					$sqldbmap->setProperty($sqlFile->getName(), $database->getName());
+				}
+			}
+		} else {
+			// the traditional way is to map the schema.xml filenames
+			$dmMap = $this->getDataModelDbMap();
+			foreach(array_keys($dmMap) as $dataModelName) {
+				$sqlFile = $this->getMappedFile($dataModelName);
+				if ($this->getDatabase() === null) {
+					$databaseName = $dmMap[$dataModelName];
+				} else {
+					$databaseName = $this->getDatabase();
+				}
+				$sqldbmap->setProperty($sqlFile->getName(), $databaseName);
+			}
+		}
+
+        try {
+            $sqldbmap->store($this->getSqlDbMap(), "Sqlfile -> Database map");
+        } catch (IOException $e) {
+            throw new IOException("Unable to store properties: ". $e->getMessage());
+        }
+    }
+
+    public function main() {
+
+        $this->validate();
+
+        if(!$this->mapperElement) {
+            throw new BuildException("You must use a <mapper/> element to describe how names should be transformed.");
+        }
+
+		if ($this->packageObjectModel) {
+			$dataModels = $this->packageDataModels();
+		} else {
+			$dataModels = $this->getDataModels();
+		}
+
+        // 1) first create a map of filenames to databases; this is used by other tasks like
+        // the SQLExec task.
+        $this->createSqlDbMap();
+
+        // 2) Now actually create the DDL based on the datamodel(s) from XML schema file.
+        $targetDatabase = $this->getTargetDatabase();
+
+        $basepath = "sql/base/$targetDatabase";
+
+        $generator = $this->createContext();
+    	$generator->put("basepath", $basepath); // make available to sub-templates
+
+
+    	$fname = "sql/base/$targetDatabase/table.tpl" ;
+    	// $generator->put("fname", $fname); // make available to sub-templates
+
+    	$fnamekeys= "sql/base/$targetDatabase/tablefk.tpl";
+	    //$generator->put("fnamekeys", $fnamekeys); // make available to sub-templates
+
+        $ddlStartFile = new PhingFile($this->getTemplatePath(), "sql/base/$targetDatabase/database-start.tpl");
+        $ddlEndFile = new PhingFile($this->getTemplatePath(), "sql/base/$targetDatabase/database-end.tpl");
+
+	    foreach ($dataModels as $package => $dataModel) {
+
+            foreach ($dataModel->getDatabases() as $database) {
+
+                // file we are going to create
+				if (!$this->packageObjectModel) {
+                	$name = $dataModel->getName();
+				} else {
+					$name = ($package ? $package . '.' : '') . 'schema.xml';
+				}
+                $outFile = $this->getMappedFile($name);
+
+                $generator->put("database", $database); // make available to sub-templates
+                $generator->put("platform", $database->getPlatform());
+
+                $this->log("Generating SQL tables for database: " . $database->getName());
+
+                $this->log("Writing to SQL file: " . $outFile->getPath());
+
+
+                // this variable helps us overwrite the first time we write to file
+                // and then append thereafter
+                $append=false;
+
+                // First check to see if there is a "header" SQL file
+                if ($ddlStartFile->exists()) {
+                    $generator->parse($ddlStartFile->getAbsolutePath(), $outFile->getAbsolutePath(), false);
+                    $append = true;
+                }
+
+                foreach($database->getTables() as $tbl) {
+                    if (!$tbl->isSkipSql()) {
+                        $this->log("\t + " . $tbl->getName());
+                        $generator->put("table", $tbl);
+                        $generator->parse($fname, $outFile->getAbsolutePath(), $append);
+                        if ($append === false) $append = true;
+                    } else {
+                        $this->log("\t + (skipping) " . $tbl->getName());
+                    }
+                } // foreach database->getTables()
+
+                foreach ($database->getTables() as $tbl) {
+                    if (!$tbl->isSkipSql()) {
+                        $generator->put("tablefk", $tbl);
+                        $generator->parse($fnamekeys, $outFile->getAbsolutePath(), true); // always append
+                    }
+                }
+
+                // Finally check to see if there is a "footer" SQL file
+                if ($ddlEndFile->exists()) {
+                    $generator->parse($ddlEndFile->getAbsolutePath(), $outFile->getAbsolutePath(), true);
+                }
+
+            } // foreach database
+        } //foreach datamodels
+
+    } // main()
+
+    /**
+     * Packages the datamodels to one datamodel per package
+     *
+     * This applies only when the the packageObjectModel option is set. We need to
+     * re-package the datamodels to allow the database package attribute to control
+     * which tables go into which SQL file.
+     *
+     * @return array The packaged datamodels
+     */
+    protected function packageDataModels() {
+
+		static $packagedDataModels;
+
+		if (is_null($packagedDataModels)) {
+
+			$dataModels = $this->getDataModels();
+			$dataModel = array_shift($dataModels);
+			$packagedDataModels = array();
+			
+			$platform = $this->getPlatformForTargetDatabase();
+			
+			foreach ($dataModel->getDatabases() as $db) {
+				foreach ($db->getTables() as $table) {
+					$package = $table->getPackage();
+					if (!isset($packagedDataModels[$package])) {
+						$dbClone = $this->cloneDatabase($db);
+						$dbClone->setPackage($package);
+						$ad = new AppData($platform);
+						$ad->setName($dataModel->getName());
+						$ad->addDatabase($dbClone);
+						$packagedDataModels[$package] = $ad;
+					}
+					$packagedDataModels[$package]->getDatabase($db->getName())->addTable($table);
+				}
+			}
+		}
+
+		return $packagedDataModels;
+	}
+
+	protected function cloneDatabase($db) {
+
+		$attributes = array (
+			'name' => $db->getName(),
+			'baseClass' => $db->getBaseClass(),
+			'basePeer' => $db->getBasePeer(),
+			//'defaultPhpType' => $db->getDefaultPhpType(),
+			'defaultIdMethod' => $db->getDefaultIdMethod(),
+			'defaultPhpNamingMethod' => $db->getDefaultPhpNamingMethod(),
+			'defaultTranslateMethod' => $db->getDefaultTranslateMethod(),
+			//'heavyIndexing' => $db->getHeavyIndexing(),
+		);
+
+		$clone = new Database();
+		$clone->loadFromXML($attributes);
+		return $clone;
+	}
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelOldSQLTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelSQLExec.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelSQLExec.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelSQLExec.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,682 @@
+<?php
+
+/*
+ *  $Id: PropelSQLExec.php 137 2005-07-14 00:46:58Z hans $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+require_once 'phing/Task.php';
+include_once 'creole/Connection.php';
+
+/**
+ * Executes all SQL files referenced in the sqldbmap file against their mapped databases.
+ * 
+ * This task uses an SQL -> Database map in the form of a properties
+ * file to insert each SQL file listed into its designated database.
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @author Dominik del Bondio
+ * @author Jeff Martin <jeff en custommonkey.org> (Torque)
+ * @author Michael McCallum <gholam en xtra.co.nz> (Torque)
+ * @author Tim Stephenson <tim.stephenson en sybase.com> (Torque)
+ * @author Jason van Zyl <jvanzyl en apache.org> (Torque)
+ * @author Martin Poeschl <mpoeschl en marmot.at> (Torque)
+ * @version $Revision: 137 $
+ * @package propel.phing
+ */
+class PropelSQLExec extends Task {
+
+    private $goodSql = 0;
+    private $totalSql = 0;
+
+    const DELIM_ROW = "row";
+    const DELIM_NORMAL = "normal";
+
+    /**
+     * The delimiter type indicating whether the delimiter will
+     * only be recognized on a line by itself
+     */
+    private $delimiterType = "normal"; // can't use constant just defined
+        
+    //private static $delimiterTypes = array(DELIM_NORMAL, DELIM_ROW);
+    //private static $errorActions = array("continue", "stop", "abort");
+    
+    /** Database connection */
+    private $conn = null;
+
+    /** Autocommit flag. Default value is false */
+    private $autocommit = false;
+
+    /** SQL statement */
+    private $statement = null;
+
+    /** DB driver. */
+    private $driver = null;
+
+    /** DB url. */
+    private $url = null;
+
+    /** User name. */
+    private $userId = null;
+
+    /** Password */
+    private $password = null;
+
+    /** SQL input command */
+    private $sqlCommand = "";
+
+    /** SQL transactions to perform */
+    private $transactions = array();
+
+    /** SQL Statement delimiter */
+    private $delimiter = ";";
+
+    /** Print SQL results. */
+    private $print = false;
+
+    /** Print header columns. */
+    private $showheaders = true;
+
+    /** Results Output file. */
+    private $output = null;
+
+    /** RDBMS Product needed for this SQL. */
+    private $rdbms = null;
+
+    /** RDBMS Version needed for this SQL. */
+    private $version = null;
+
+    /** Action to perform if an error is found */
+    private $onError = "abort";
+
+    /** Encoding to use when reading SQL statements from a file */
+    private $encoding = null;
+
+    /** Src directory for the files listed in the sqldbmap. */
+    private $srcDir;
+
+    /** Properties file that maps an individual SQL file to a database. */
+    private $sqldbmap;
+
+    /**
+     * Set the sqldbmap properties file.
+     *
+     * @param sqldbmap filename for the sqldbmap
+     */
+    public function setSqlDbMap($sqldbmap)
+    {
+        $this->sqldbmap = $this->project->resolveFile($sqldbmap);
+    }
+
+    /**
+     * Get the sqldbmap properties file.
+     *
+     * @return filename for the sqldbmap
+     */
+    public function getSqlDbMap()
+    {
+        return $this->sqldbmap;
+    }
+
+    /**
+     * Set the src directory for the sql files listed in the sqldbmap file.
+     * 
+     * @param PhingFile $srcDir sql source directory
+     */
+    public function setSrcDir(PhingFile $srcDir)
+    {
+        $this->srcDir = $srcDir;
+    }
+
+    /**
+     * Get the src directory for the sql files listed in the sqldbmap file.
+     *
+     * @return PhingFile SQL Source directory
+     */
+    public function getSrcDir()
+    {
+        return $this->srcDir;
+    }
+    
+    /**
+     * Set the sql command to execute
+     *
+     * @param sql sql command to execute
+     */
+    public function addText($sql)
+    {
+        $this->sqlCommand .= $sql;
+    }
+
+    /**
+     * Set the Creole driver to be used.
+     *
+     * @param string $driver driver class name
+     */
+    public function setDriver($driver)
+    {
+        $this->driver = $driver;
+    }
+
+    /**
+     * Set the DB connection url.
+     *
+     * @param string $url connection url
+     */
+    public function setUrl($url)
+    {
+        $this->url = $url;
+    }
+
+    /**
+     * Set the user name for the DB connection.
+     *
+     * @param string $userId database user
+     * @deprecated Specify userid in the DSN URL.
+     */
+    public function setUserid($userId)
+    {
+        $this->userId = $userId;
+    }   
+
+    /**
+     * Set the password for the DB connection.
+     *
+     * @param string $password database password
+     * @deprecated Specify password in the DSN URL.
+     */
+    public function setPassword($password)
+    {
+        $this->password = $password;
+    }
+
+    /**
+     * Set the autocommit flag for the DB connection.
+     *
+     * @param boolean $autocommit the autocommit flag
+     */
+    public function setAutoCommit($autocommit)
+    {
+        $this->autocommit = (boolean) $autocommit;
+    }
+
+    /**
+     * Set the statement delimiter.
+     *
+     * <p>For example, set this to "go" and delimitertype to "ROW" for
+     * Sybase ASE or MS SQL Server.</p>
+     *
+     * @param string $delimiter
+     */
+    public function setDelimiter($delimiter)
+    {
+        $this->delimiter = $delimiter;
+    }
+
+    /**
+     * Set the Delimiter type for this sql task. The delimiter type takes two
+     * values - normal and row. Normal means that any occurence of the delimiter
+     * terminate the SQL command whereas with row, only a line containing just
+     * the delimiter is recognized as the end of the command.
+     *
+     * @param string $delimiterType
+     */
+    public function setDelimiterType($delimiterType)
+    {
+        $this->delimiterType = $delimiterType;
+    }
+
+    /**
+     * Set the print flag.
+     *
+     * @param boolean $print
+     */
+    public function setPrint($print)
+    {
+        $this->print = (boolean) $print;
+    }
+
+    /**
+     * Set the showheaders flag.
+     *
+     * @param boolean $showheaders
+     */
+    public function setShowheaders($showheaders)
+    {
+        $this->showheaders = (boolean) $showheaders;
+    }
+
+    /**
+     * Set the output file.
+     *
+     * @param PhingFile $output
+     */
+    public function setOutput(PhingFile $output)
+    {
+        $this->output = $output;
+    }   
+
+    /**
+     * Set the action to perform onerror
+     *
+     * @param string $action
+     */
+    public function setOnerror($action)
+    {
+        $this->onError = $action;
+    }
+
+    /**
+     * Load the sql file and then execute it
+     *
+     * @throws BuildException
+     */
+    public function main()
+    {
+        $this->sqlCommand = trim($this->sqlCommand);
+
+        if ($this->sqldbmap === null || $this->getSqlDbMap()->exists() === false) {
+            throw new BuildException("You haven't provided an sqldbmap, or "
+                    . "the one you specified doesn't exist: " . $this->sqldbmap->getPath());
+        }
+             
+        if ($this->url === null) {
+            throw new BuildException("DSN url attribute must be set!");
+        }                                  
+        
+        $map = new Properties();
+
+        try {
+            $map->load($this->getSqlDbMap());            
+        } catch (IOException $ioe) {
+            throw new BuildException("Cannot open and process the sqldbmap!");
+        }
+
+        $databases = array();
+
+        foreach($map->keys() as $sqlfile) {
+        
+            $database = $map->getProperty($sqlfile);
+            
+            // Q: already there?
+            if (!isset($databases[$database])) {
+            // A: No.
+                $databases[$database] = array();
+            }
+
+            // We want to make sure that the base schemas
+            // are inserted first.
+            if (strpos($sqlfile, "schema.sql") !== false) {
+                // add to the beginning of the array
+                array_unshift($databases[$database], $sqlfile);
+            } else {
+                array_push($databases[$database], $sqlfile);
+            }
+        }
+    
+        foreach($databases as $db => $files) {        
+            $transactions = array();
+            
+            foreach($files as $fileName) {
+
+                $file = new PhingFile($this->srcDir, $fileName);
+
+                if ($file->exists()) {
+                    $this->log("Executing statements in file: " . $file->__toString());
+                    $transaction = new PropelSQLExecTransaction($this);
+                    $transaction->setSrc($file);
+                    $transactions[] = $transaction;
+                } else {
+                    $this->log("File '" . $file->__toString()
+                            . "' in sqldbmap does not exist, so skipping it.");
+                }
+            }
+            $this->insertDatabaseSqlFiles($this->url, $db, $transactions);
+        }
+    }
+
+    /**
+     * Take the base url, the target database and insert a set of SQL
+     * files into the target database.
+     *
+     * @param string $url
+     * @param string $database
+     * @param array $transactions
+     */
+    private function insertDatabaseSqlFiles($url, $database, $transactions)
+    {
+        $url = str_replace("@DB@", $database, $url);
+        $this->log("Our new url -> " . $url);
+        
+        try {        
+            
+            $buf = "Database settings:\n"
+            . " driver: " . ($this->driver ? $this->driver : "(default)" ). "\n"
+            . " URL: " . $url . "\n"
+            . ($this->userId ? " user: " . $this->userId . "\n" : "")
+            . ($this->password ? " password: " . $this->password . "\n" : "");
+            
+            $this->log($buf, PROJECT_MSG_VERBOSE);
+            
+            $dsn = Creole::parseDSN($url);
+            
+            if($this->userId) {
+                $dsn["username"] = $this->userId;
+            }
+            if ($this->password) {
+                $dsn["password"] = $this->password;
+            }                        
+            if ($this->driver) {
+                Creole::registerDriver($dsn['phptype'], $this->driver);
+            }
+            
+            $this->conn = Creole::getConnection($dsn);
+
+            $this->conn->setAutoCommit($this->autocommit);
+            $this->statement = $this->conn->createStatement();
+            
+            $out = null;
+            
+            try {
+                if ($this->output !== null) {
+                    $this->log("Opening PrintStream to output file " . $this->output->__toString(), PROJECT_MSG_VERBOSE);
+                    $out = new FileWriter($this->output);
+                }
+
+                // Process all transactions
+                for ($i=0,$size=count($transactions); $i < $size; $i++) {
+                    $transactions[$i]->runTransaction($out);
+                    if (!$this->autocommit) {
+                        $this->log("Commiting transaction", PROJECT_MSG_VERBOSE);
+                        $this->conn->commit();
+                    }
+                }
+            } catch (Exception $e) {
+                if ($out) $out->close();
+            }
+            
+        } catch (IOException $e) {
+        
+            if (!$this->autocommit && $this->conn !== null && $this->onError == "abort") {
+                try {
+                    $this->conn->rollback();
+                } catch (SQLException $ex) {
+                    // do nothing.
+                    System::println("Rollback failed.");
+                }
+            }
+            if ($this->statement) $this->statement->close();
+            throw new BuildException($e);
+        } catch (SQLException $e) {
+            if (!$this->autocommit && $this->conn !== null && $this->onError == "abort") {
+                try {
+                    $this->conn->rollback();
+                } catch (SQLException $ex) {
+                    // do nothing.
+                    System::println("Rollback failed");
+                }
+            }
+            if ($this->statement) $this->statement->close();
+            throw new BuildException($e);
+        }
+       
+           $this->statement->close();
+
+        $this->log($this->goodSql . " of " . $this->totalSql
+                . " SQL statements executed successfully");
+    }
+
+    /**
+     * Read the statements from the .sql file and execute them.
+     * Lines starting with '//', '--' or 'REM ' are ignored.
+     *
+     * Developer note:  must be public in order to be called from 
+     * sudo-"inner" class PropelSQLExecTransaction.
+     *
+     * @param Reader $reader
+     * @param $out Optional output stream.
+     * @throws SQLException
+     * @throws IOException
+     */
+    public function runStatements(Reader $reader, $out = null)            
+    {
+        $sql = "";
+        $line = "";
+        $sqlBacklog = "";
+        $hasQuery = false;
+
+        $in = new BufferedReader($reader);
+
+        try {
+            while (($line = $in->readLine()) !== null) {
+                $line = trim($line);
+                $line = ProjectConfigurator::replaceProperties($this->project, $line,
+                        $this->project->getProperties());
+                
+                if (StringHelper::startsWith("//", $line) || 
+                    StringHelper::startsWith("--", $line) ||
+                    StringHelper::startsWith("#", $line)) {
+                    continue;
+                }
+                
+                if (strlen($line) > 4
+                        && strtoupper(substr($line,0, 4)) == "REM ") {
+                    continue;
+                }
+
+                if($sqlBacklog !== "")
+                {
+                    $sql = $sqlBacklog;
+                    $sqlBacklog = "";
+                }
+
+                $sql .= " " . $line . "\n";
+
+                // SQL defines "--" as a comment to EOL
+                // and in Oracle it may contain a hint
+                // so we cannot just remove it, instead we must end it
+                if (strpos($line, "--") !== false) {
+                    $sql .= "\n";
+                }
+
+                // DELIM_ROW doesn't need this (as far as i can tell)
+                if($this->delimiterType == self::DELIM_NORMAL) {
+                
+                    $reg = "#((?:\"(?:\\\\.|[^\"])*\"?)+|'(?:\\\\.|[^'])*'?|" . preg_quote($this->delimiter) . ")#";
+
+                    $sqlParts = preg_split($reg, $sql, 0, PREG_SPLIT_DELIM_CAPTURE);
+                    $sqlBacklog = "";
+                    foreach($sqlParts as $sqlPart) {
+                        // we always want to append, even if it's a delim (which will be stripped off later)
+                        $sqlBacklog .= $sqlPart; 
+
+                        // we found a single (not enclosed by ' or ") delimiter, so we can use all stuff before the delim as the actual query
+                        if($sqlPart === $this->delimiter) {
+                            $sql = $sqlBacklog;
+                            $sqlBacklog = "";
+                            $hasQuery = true;
+                        }
+                    }
+                }
+
+                if ($hasQuery || ($this->delimiterType == self::DELIM_ROW && $line == $this->delimiter)) {
+                    // this assumes there is always a delimter on the end of the SQL statement.
+                    $sql = StringHelper::substring($sql, 0, strlen($sql) - 1 - strlen($this->delimiter));
+                    $this->log("SQL: " . $sql, PROJECT_MSG_VERBOSE);
+                    $this->execSQL($sql, $out);
+                    $sql = "";
+                    $hasQuery = false;
+                }
+            }
+
+            // Catch any statements not followed by ;
+            if ($sql !== "") {
+                $this->execSQL($sql, $out);
+            }
+        } catch (SQLException $e) {
+            throw $e;
+        }
+    }
+
+    /**
+     * Exec the sql statement.
+     *
+     * @param sql
+     * @param out
+     * @throws SQLException
+     */
+    protected function execSQL($sql, $out = null)
+    {
+        // Check and ignore empty statements
+        if (trim($sql) == "") {
+            return;
+        }
+
+        try {
+            $this->totalSql++;
+            if (!$this->statement->execute($sql)) {
+                $this->log($this->statement->getUpdateCount() . " rows affected",
+                        PROJECT_MSG_VERBOSE);
+            } else {
+                if ($this->print) {
+                    $this->printResults($out);
+                }
+            }
+
+            $this->goodSql++;
+            
+        } catch (SQLException $e) {
+            $this->log("Failed to execute: " . $sql, PROJECT_MSG_ERR);
+            if ($this->onError != "continue") {
+                throw $e;
+            }
+            $this->log($e->getMessage(), PROJECT_MSG_ERR);
+        }
+    }
+
+    /**
+     * print any results in the statement.
+     *
+     * @param out
+     * @throws SQLException
+     */
+    protected function printResults($out = null)
+    {
+        $rs = null;
+        
+        do {
+            $rs = $this->statement->getResultSet();
+            
+            if ($rs !== null) {
+            
+                $this->log("Processing new result set.", PROJECT_MSG_VERBOSE);            
+    
+                $line = "";
+
+                $colsprinted = false;
+                
+                while ($rs->next()) {
+                
+                    if (!$colsprinted && $this->showheaders) {
+                        $first = true;                        
+                        foreach($this->fields as $fieldName => $ignore) {
+                            if ($first) $first = false; else $line .= ",";
+                            $line .= $fieldName;
+                        }
+                    } // if show headers
+                    
+                    $first = true;
+                    foreach($rs->fields as $columnValue) {
+                        
+                        if ($columnValue != null) {
+                            $columnValue = trim($columnValue);
+                        }
+
+                        if ($first) {
+                            $first = false;
+                        } else {
+                            $line .= ",";
+                        }
+                        $line .= $columnValue;
+                    }
+                    
+                    if ($out !== null) {
+                        $out->write($line);
+                        $out->newLine();
+                    }
+                    
+                    System::println($line);
+                    $line = "";
+                } // while rs->next()
+            }
+        } while ($this->statement->getMoreResults());
+        System::println();
+        if ($out !== null) $out->newLine();
+    }
+
+}
+
+/**
+ * "Inner" class that contains the definition of a new transaction element.
+ * Transactions allow several files or blocks of statements
+ * to be executed using the same Creole connection and commit
+ * operation in between.
+ * @package propel.phing
+ */
+class PropelSQLExecTransaction {
+
+    private $tSrcFile = null;
+    private $tSqlCommand = "";
+    private $parent;
+    
+    function __construct($parent)
+    {
+        // Parent is required so that we can log things ...
+        $this->parent = $parent;
+    }
+    
+    public function setSrc(PhingFile $src)
+    {
+        $this->tSrcFile = $src;
+    }
+
+    public function addText($sql)
+    {
+        $this->tSqlCommand .= $sql;
+    }
+
+    /**
+     * @throws IOException, SQLException
+     */
+    public function runTransaction($out = null)
+    {
+        if (!empty($this->tSqlCommand)) {
+            $this->parent->log("Executing commands", PROJECT_MSG_INFO);
+            $this->parent->runStatements($this->tSqlCommand, $out);
+        }
+
+        if ($this->tSrcFile !== null) {
+            $this->parent->log("Executing file: " . $this->tSrcFile->getAbsolutePath(),
+                PROJECT_MSG_INFO);
+            $reader = new FileReader($this->tSrcFile);
+            $this->parent->runStatements($reader, $out);
+            $reader->close();
+        }
+    }
+}
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelSQLExec.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelSQLTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelSQLTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelSQLTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,258 @@
+<?php
+
+/*
+ *  $Id: PropelSQLTask.php 180 2005-08-30 09:04:00Z david $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://propel.phpdb.org>.
+ */
+
+include_once 'propel/engine/database/model/AppData.php';
+
+/**
+ * The task for building SQL DDL based on the XML datamodel.
+ * 
+ * This class uses the new DDLBuilder classes instead of the Capsule PHP templates.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @package propel.phing
+ */
+class PropelSQLTask extends AbstractPropelDataModelTask {
+
+    /**
+     * The properties file that maps an SQL file to a particular database.
+     * @var PhingFile
+     */
+    private $sqldbmap;
+
+    /**
+     * Name of the database.
+     */
+    private $database;
+
+    /**
+     * Set the sqldbmap.
+     * @param PhingFile $sqldbmap The db map.
+     */
+    public function setSqlDbMap(PhingFile $sqldbmap)
+    {
+        $this->sqldbmap = $sqldbmap;
+    }
+
+    /**
+     * Get the sqldbmap.
+     * @return PhingFile $sqldbmap.
+     */
+    public function getSqlDbMap()
+    {
+        return $this->sqldbmap;
+    }
+
+    /**
+     * Set the database name.
+     * @param string $database
+     */
+    public function setDatabase($database)
+    {
+        $this->database = $database;
+    }
+
+    /**
+     * Get the database name.
+     * @return string
+     */
+    public function getDatabase()
+    {
+        return $this->database;
+    }
+
+    /**
+     * Create the sql -> database map.
+     *
+     * @throws IOException - if unable to store properties
+     */
+    private function createSqlDbMap()
+    {
+        if ($this->getSqlDbMap() === null) {
+            return;
+        }
+
+        // Produce the sql -> database map
+        $sqldbmap = new Properties();
+
+        // Check to see if the sqldbmap has already been created.
+        if ($this->getSqlDbMap()->exists()) {
+            $sqldbmap->load($this->getSqlDbMap());
+        }
+
+		if ($this->packageObjectModel) {
+			// in this case we'll get the sql file name from the package attribute
+			$dataModels = $this->packageDataModels();
+			foreach ($dataModels as $package => $dataModel) {
+				foreach ($dataModel->getDatabases() as $database) {
+					$name = ($package ? $package . '.' : '') . 'schema.xml';
+                	$sqlFile = $this->getMappedFile($name);
+					$sqldbmap->setProperty($sqlFile->getName(), $database->getName());
+				}
+			}
+		} else {
+			// the traditional way is to map the schema.xml filenames
+			$dmMap = $this->getDataModelDbMap();
+			foreach(array_keys($dmMap) as $dataModelName) {
+				$sqlFile = $this->getMappedFile($dataModelName);
+				if ($this->getDatabase() === null) {
+					$databaseName = $dmMap[$dataModelName];
+				} else {
+					$databaseName = $this->getDatabase();
+				}
+				$sqldbmap->setProperty($sqlFile->getName(), $databaseName);
+			}
+		}
+
+        try {
+            $sqldbmap->store($this->getSqlDbMap(), "Sqlfile -> Database map");
+        } catch (IOException $e) {
+            throw new IOException("Unable to store properties: ". $e->getMessage());
+        }
+    }
+
+    public function main() {
+
+        $this->validate();
+
+        if(!$this->mapperElement) {
+            throw new BuildException("You must use a <mapper/> element to describe how names should be transformed.");
+        }
+
+		if ($this->packageObjectModel) {
+			$dataModels = $this->packageDataModels();
+		} else {
+			$dataModels = $this->getDataModels();
+		}
+
+        // 1) first create a map of filenames to databases; this is used by other tasks like
+        // the SQLExec task.
+        $this->createSqlDbMap();
+
+        // 2) Now actually create the DDL based on the datamodel(s) from XML schema file.
+        $targetDatabase = $this->getTargetDatabase();
+
+		DataModelBuilder::setBuildProperties($this->getPropelProperties());
+		$builderClazz = DataModelBuilder::getBuilderClass('ddl');
+		
+	    foreach ($dataModels as $package => $dataModel) {
+
+            foreach ($dataModel->getDatabases() as $database) {
+
+                // file we are going to create
+				if (!$this->packageObjectModel) {
+                	$name = $dataModel->getName();
+				} else {
+					$name = ($package ? $package . '.' : '') . 'schema.xml';
+				}
+
+                $outFile = $this->getMappedFile($name);
+
+                $this->log("Writing to SQL file: " . $outFile->getPath());
+
+                // First add any "header" SQL
+				$ddl = call_user_func(array($builderClazz, 'getDatabaseStartDDL'));
+					
+                foreach($database->getTables() as $table) {
+				
+                    if (!$table->isSkipSql()) {
+						$builder = DataModelBuilder::builderFactory($table, 'ddl');
+						$this->log("\t+ " . $table->getName() . " [builder: " . get_class($builder) . "]");
+						$ddl .= $builder->build();
+						foreach($builder->getWarnings() as $warning) {
+							$this->log($warning, PROJECT_MSG_WARN);
+						}
+                    } else {
+                        $this->log("\t + (skipping) " . $table->getName());
+                    }
+					
+                } // foreach database->getTables()
+
+                // Finally check to see if there is any "footer" SQL
+                $ddl .= call_user_func(array($builderClazz, 'getDatabaseEndDDL'));
+				
+				
+				// Now we're done.  Write the file!
+				file_put_contents($outFile->getAbsolutePath(), $ddl);
+				
+            } // foreach database
+        } //foreach datamodels
+
+    } // main()
+
+    /**
+     * Packages the datamodels to one datamodel per package
+     *
+     * This applies only when the the packageObjectModel option is set. We need to
+     * re-package the datamodels to allow the database package attribute to control
+     * which tables go into which SQL file.
+     *
+     * @return array The packaged datamodels
+     */
+    protected function packageDataModels() {
+
+		static $packagedDataModels;
+
+		if (is_null($packagedDataModels)) {
+
+			$dataModels = $this->getDataModels();
+			$dataModel = array_shift($dataModels);
+			$packagedDataModels = array();
+			
+			$platform = $this->getPlatformForTargetDatabase();
+			
+			foreach ($dataModel->getDatabases() as $db) {
+				foreach ($db->getTables() as $table) {
+					$package = $table->getPackage();
+					if (!isset($packagedDataModels[$package])) {
+						$dbClone = $this->cloneDatabase($db);
+						$dbClone->setPackage($package);
+						$ad = new AppData($platform);
+						$ad->setName($dataModel->getName());
+						$ad->addDatabase($dbClone);
+						$packagedDataModels[$package] = $ad;
+					}
+					$packagedDataModels[$package]->getDatabase($db->getName())->addTable($table);
+				}
+			}
+		}
+
+		return $packagedDataModels;
+	}
+
+	protected function cloneDatabase($db) {
+
+		$attributes = array (
+			'name' => $db->getName(),
+			'baseClass' => $db->getBaseClass(),
+			'basePeer' => $db->getBasePeer(),
+			//'defaultPhpType' => $db->getDefaultPhpType(),
+			'defaultIdMethod' => $db->getDefaultIdMethod(),
+			'defaultPhpNamingMethod' => $db->getDefaultPhpNamingMethod(),
+			'defaultTranslateMethod' => $db->getDefaultTranslateMethod(),
+			//'heavyIndexing' => $db->getHeavyIndexing(),
+		);
+
+		$clone = new Database();
+		$clone->loadFromXML($attributes);
+		return $clone;
+	}
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/classes/propel/phing/PropelSQLTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/default.properties
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/default.properties	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/default.properties	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,219 @@
+# -------------------------------------------------------------------
+#
+#  D E F A U L T   P R O P E R T I E S
+#
+# -------------------------------------------------------------------
+# This file sets default properties.  You can override any of these
+# by specifying your new value in the build.properties file for your
+# project or a top-level build.properties file. Either way, you
+# should not need to edit this file.
+# -------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------
+#
+#  B A S I C   P R O P E R T I E S
+#
+# -------------------------------------------------------------------
+
+propel.home = .
+
+propel.project =
+propel.database =
+propel.targetPackage = ${propel.project}
+propel.runOnlyOnSchemaChange = false
+propel.targetPlatform = php5
+
+propel.packageObjectModel = false
+
+propel.schema.validate = true
+
+# -------------------------------------------------------------------
+#
+#  D A T A B A S E   S E T T I N G S
+#
+# -------------------------------------------------------------------
+
+propel.database.url =
+propel.database.buildUrl = ${propel.database.url}
+propel.database.createUrl = ${propel.database.buildUrl}
+
+# by default leave the databaseDriver blank, so that bundled driver is used by Creole
+propel.database.driver =
+
+propel.database.schema =
+propel.database.encoding =
+propel.database.manualCreation = false
+
+# -------------------------------------------------------------------
+#
+#  C R E O L E  TO  X M L  S E T T I N G S
+#
+# -------------------------------------------------------------------
+
+propel.samePhpName = false
+propel.addVendorInfo = true
+propel.addValidators = none
+
+# -------------------------------------------------------------------
+#
+#  T E M P L A T E   V A R I A B L E S
+#
+# -------------------------------------------------------------------
+
+propel.addGenericAccessors = false
+propel.addGenericMutators = false
+propel.addSaveMethod = true
+propel.addTimeStamp = true
+propel.basePrefix = Base
+propel.complexObjectModel = true
+propel.saveException = PropelException
+propel.emulateForeignKeyConstraints = false
+
+# Identifier quoting is only implemented at the DDL layer at this point.
+# Since this may result in undesired behavior (especially in Postgres),
+# it can be disabled by setting this property to true in your build.properties file.
+propel.disableIdentifierQuoting = false
+
+# These are the default formats that will be used when fetching values
+# from temporal columns in Propel.  You can always specify these when
+# calling the methods directly, but for methods like getByName()
+# it is nice to change the defaults.
+
+propel.defaultTimeStampFormat = Y-m-d H:i:s
+propel.defaultTimeFormat = H:i:s
+propel.defaultDateFormat = Y-m-d
+
+propel.omtar.src.base = false
+propel.omtar.src.extension = false
+propel.omtar.bin.base = false
+propel.omtar.bin.extension = false
+propel.omtar.deleteFiles = false
+
+
+# -------------------------------------------------------------------
+#
+#  C O N T R O L   T E M P L A T E S
+#
+# -------------------------------------------------------------------
+#
+# This is a deprecated idea, that will almost certainly be completely
+# removed in Propel 1.2 and/or 2.0.
+#
+
+propel.template.conf = ${propel.home}/templates/conf/Control.tpl
+propel.template.sql = ${propel.home}/templates/sql/base/Control.tpl
+propel.template.sqlDbInit = ${propel.home}/templates/sql/db-init/Control.tpl
+
+
+# -------------------------------------------------------------------
+#
+#  D I R E C T O R I E S
+#
+# -------------------------------------------------------------------
+
+propel.project.dir = ${propel.home}/projects/${propel.project}
+
+propel.output.dir = ${propel.project.dir}/build
+propel.schema.dir = ${propel.project.dir}
+propel.templatePath = ${propel.home}/templates
+propel.conf.dir = ${propel.project.dir}
+
+propel.doc.dir = ${propel.output.dir}/doc
+propel.php.dir = ${propel.output.dir}/classes
+propel.phpconf.dir = ${propel.output.dir}/conf
+propel.phpdoc.dir = ${propel.output.dir}/phpdoc
+propel.sql.dir = ${propel.output.dir}/sql
+propel.graph.dir = ${propel.output.dir}/graph
+propel.omtar.dir = ${propel.output.dir}
+
+
+# -------------------------------------------------------------------
+#
+#  D E F A U L T   F I L E   N A M ES
+#
+# -------------------------------------------------------------------
+
+# propel.sqlfile
+
+propel.runtime.conf.file = runtime-conf.xml
+propel.runtime.phpconf.file = ${propel.project}-conf.php
+propel.default.schema.basename = schema
+
+# Can't use because of inconsistencies in where the files
+# are named (some from build-propel.xml, but some from within templates)
+# propel.default.data.basename = ${propel.project}-data
+
+propel.schema.xsd.file = ${propel.home}/resources/xsd/database.xsd
+propel.schema.xsl.file = ${propel.home}/resources/xsl/database.xsl
+
+# -------------------------------------------------------------------
+#
+#  I N C L U D E   A N D   E X C L U D E   S E T T I N G S
+#
+# -------------------------------------------------------------------
+
+propel.schema.sql.includes = *schema.xml
+propel.schema.sql.excludes =
+propel.schema.doc.includes = *schema.xml
+propel.schema.doc.excludes =
+propel.schema.create-db.includes = *schema.xml
+propel.schema.create-db.excludes =
+propel.schema.init-sql.includes = *schema.xml
+propel.schema.init-sql.excludes = id-table-schema.xml
+propel.schema.om.includes = *schema.xml
+propel.schema.om.excludes = id-table-schema.xml
+propel.schema.datadtd.includes = *schema.xml
+propel.schema.datadtd.excludes = id-table-schema.xml
+
+# -------------------------------------------------------------------
+#
+#  M A P P E R   S E T T I N G S
+#
+# -------------------------------------------------------------------
+
+# (note: data xml files are selected based on datadbmap file)
+propel.datasql.mapper.from = *.xml
+propel.datasql.mapper.to = *.sql
+
+propel.datadump.mapper.from = *schema.xml
+propel.datadump.mapper.to = *data.xml
+
+propel.datadtd.mapper.from = *.xml
+propel.datadtd.mapper.to = *.dtd
+
+propel.sql.mapper.from = *.xml
+propel.sql.mapper.to = *.sql
+
+
+# -------------------------------------------------------------------
+#
+#  B U I L D E R    S E T T I N G S
+#
+# -------------------------------------------------------------------
+
+# Object Model builders
+propel.builder.peer.class = propel.engine.builder.om.php5.PHP5ComplexPeerBuilder
+propel.builder.object.class = propel.engine.builder.om.php5.PHP5ComplexObjectBuilder
+propel.builder.objectstub.class = propel.engine.builder.om.php5.PHP5ExtensionObjectBuilder
+propel.builder.peerstub.class = propel.engine.builder.om.php5.PHP5ExtensionPeerBuilder
+
+propel.builder.objectmultiextend.class = propel.engine.builder.om.php5.PHP5MultiExtendObjectBuilder
+
+propel.builder.mapbuilder.class = propel.engine.builder.om.php5.PHP5MapBuilderBuilder
+
+propel.builder.interface.class = propel.engine.builder.om.php5.PHP5InterfaceBuilder
+
+propel.builder.node.class = propel.engine.builder.om.php5.PHP5NodeBuilder
+propel.builder.nodepeer.class = propel.engine.builder.om.php5.PHP5NodePeerBuilder
+propel.builder.nodestub.class = propel.engine.builder.om.php5.PHP5ExtensionNodeBuilder
+propel.builder.nodepeerstub.class = propel.engine.builder.om.php5.PHP5ExtensionNodePeerBuilder
+
+# SQL builders
+
+propel.builder.ddl.class = propel.engine.builder.sql.${propel.database}.${propel.database}DDLBuilder
+propel.builder.datasql.class = propel.engine.builder.sql.${propel.database}.${propel.database}DataSQLBuilder
+
+# Platform classes
+
+propel.platform.class = propel.engine.platform.${propel.database}Platform
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/BuildPropelGenPEARPackageTask.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/BuildPropelGenPEARPackageTask.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/BuildPropelGenPEARPackageTask.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,270 @@
+<?php
+/*
+ *  $Id: BuildPropelGenPEARPackageTask.php 1310 2006-05-04 07:36:54Z fabien $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/tasks/system/MatchingTask.php';
+include_once 'phing/types/FileSet.php';
+include_once 'phing/tasks/ext/pearpackage/Fileset.php';
+
+/**
+ *
+ * @author   Hans Lellelid <hans en xmpl.org>
+ * @package  phing.tasks.ext
+ * @version  $Revision$
+ */
+class BuildPropelGenPEARPackageTask extends MatchingTask {
+
+    /** Base directory for reading files. */
+    private $dir;
+
+	private $version;
+	private $state = 'stable';
+	private $notes;
+
+	private $filesets = array();
+
+    /** Package file */
+    private $packageFile;
+
+    public function init() {
+        include_once 'PEAR/PackageFileManager2.php';
+        if (!class_exists('PEAR_PackageFileManager2')) {
+            throw new BuildException("You must have installed PEAR_PackageFileManager2 (PEAR_PackageFileManager >= 1.6.0) in order to create a PEAR package.xml file.");
+        }
+    }
+
+    private function setOptions($pkg){
+
+		$options['baseinstalldir'] = 'propel';
+        $options['packagedirectory'] = $this->dir->getAbsolutePath();
+
+        if (empty($this->filesets)) {
+			throw new BuildException("You must use a <fileset> tag to specify the files to include in the package.xml");
+		}
+
+		$options['filelistgenerator'] = 'Fileset';
+
+		// Some PHING-specific options needed by our Fileset reader
+		$options['phing_project'] = $this->getProject();
+		$options['phing_filesets'] = $this->filesets;
+
+		if ($this->packageFile !== null) {
+            // create one w/ full path
+            $f = new PhingFile($this->packageFile->getAbsolutePath());
+            $options['packagefile'] = $f->getName();
+            // must end in trailing slash
+            $options['outputdirectory'] = $f->getParent() . DIRECTORY_SEPARATOR;
+            $this->log("Creating package file: " . $f->getPath(), PROJECT_MSG_INFO);
+        } else {
+            $this->log("Creating [default] package.xml file in base directory.", PROJECT_MSG_INFO);
+        }
+
+		// add install exceptions
+		$options['installexceptions'] = array(	'pear/pear-propel-gen' => '/',
+												'pear/pear-propel-gen.bat' => '/',
+												'pear/pear-build.xml' => '/',
+												'pear/build.properties' => '/',
+												);
+
+		$options['dir_roles'] = array(	'projects' => 'data',
+										'test' => 'test',
+										'templates' => 'data',
+										'resources' => 'data');
+
+		$options['exceptions'] = array(	'pear/pear-propel-gen.bat' => 'script',
+										'pear/pear-propel-gen' => 'script',
+										'pear/pear-build.xml' => 'data',
+										'build.xml' => 'data',
+										'build-propel.xml' => 'data',
+									);
+
+		$pkg->setOptions($options);
+
+    }
+
+    /**
+     * Main entry point.
+     * @return void
+     */
+    public function main() {
+
+        if ($this->dir === null) {
+            throw new BuildException("You must specify the \"dir\" attribute for PEAR package task.");
+        }
+
+		if ($this->version === null) {
+            throw new BuildException("You must specify the \"version\" attribute for PEAR package task.");
+        }
+
+		$package = new PEAR_PackageFileManager2();
+
+		$this->setOptions($package);
+
+		// the hard-coded stuff
+		$package->setPackage('propel_generator');
+		$package->setSummary('Generator component of the Propel PHP object persistence layer');
+		$package->setDescription('Propel is an object persistence layer for PHP5 based on Apache Torque. This package provides the generator engine that builds PHP classes and SQL DDL based on an XML representation of your data model.');
+		$package->setChannel('pear.phpdb.org');
+		$package->setPackageType('php');
+
+		$package->setReleaseVersion($this->version);
+		$package->setAPIVersion($this->version);
+
+		$package->setReleaseStability($this->state);
+		$package->setAPIStability($this->state);
+
+		$package->setNotes($this->notes);
+
+		$package->setLicense('LGPL', 'http://www.gnu.org/licenses/lgpl.html');
+
+		// Add package maintainers
+		$package->addMaintainer('lead', 'hans', 'Hans Lellelid', 'hans en xmpl.org');
+		$package->addMaintainer('lead', 'david', 'David Zuelke', 'dz en bitxtender.com');
+
+
+
+		// (wow ... this is a poor design ...)
+		//
+		// note that the order of the method calls below is creating
+		// sub-"release" sections which have specific rules.  This replaces
+		// the platformexceptions system in the older version of PEAR's package.xml
+		//
+		// Programmatically, I feel the need to re-iterate that this API for PEAR_PackageFileManager
+		// seems really wrong.  Sub-sections should be encapsulated in objects instead of having
+		// a "flat" API that does not represent the structure being created....
+
+
+		// creating a sub-section for 'windows'
+			$package->addRelease();
+			$package->setOSInstallCondition('windows');
+			$package->addInstallAs('pear/pear-propel-gen.bat', 'propel-gen.bat');
+			$package->addIgnoreToRelease('pear/pear-propel-gen');
+
+		// creating a sub-section for non-windows
+			$package->addRelease();
+			$package->addInstallAs('pear/pear-propel-gen', 'propel-gen');
+			$package->addIgnoreToRelease('pear/pear-propel-gen.bat');
+
+
+		// "core" dependencies
+		$package->setPhpDep('5.0.0');
+		$package->setPearinstallerDep('1.4.0');
+
+		// "package" dependencies
+		$package->addPackageDepWithChannel( 'required', 'phing', 'pear.phing.info', '2.2.0RC1');
+		$package->addPackageDepWithChannel( 'required', 'creole', 'pear.phpdb.org', '1.1.0RC1');
+
+		// now add the replacements ....
+		$package->addReplacement('Phing.php', 'pear-config', '@DATA-DIR@', 'data_dir');
+		$package->addReplacement('pear/pear-propel-gen.bat', 'pear-config', '@PHP-BIN@', 'php_bin');
+		$package->addReplacement('pear/pear-propel-gen.bat', 'pear-config', '@BIN-DIR@', 'bin_dir');
+		$package->addReplacement('pear/pear-propel-gen.bat', 'pear-config', '@PEAR-DIR@', 'php_dir');
+		$package->addReplacement('pear/pear-propel-gen.bat', 'pear-config', '@DATA-DIR@', 'data_dir');
+
+		$package->addReplacement('pear/pear-propel-gen', 'pear-config', '@PHP-BIN@', 'php_bin');
+		$package->addReplacement('pear/pear-propel-gen', 'pear-config', '@BIN-DIR@', 'bin_dir');
+		$package->addReplacement('pear/pear-propel-gen', 'pear-config', '@PEAR-DIR@', 'php_dir');
+		$package->addReplacement('pear/pear-propel-gen', 'pear-config', '@DATA-DIR@', 'data_dir');
+
+		$package->addReplacement('pear/pear-build.xml', 'pear-config', '@PHP-BIN@', 'php_bin');
+		$package->addReplacement('pear/pear-build.xml', 'pear-config', '@BIN-DIR@', 'bin_dir');
+		$package->addReplacement('pear/pear-build.xml', 'pear-config', '@PEAR-DIR@', 'php_dir');
+		$package->addReplacement('pear/pear-build.xml', 'pear-config', '@DATA-DIR@', 'data_dir');
+
+
+		// now we run this weird generateContents() method that apparently
+		// is necessary before we can add replacements ... ?
+		$package->generateContents();
+
+        $e = $package->writePackageFile();
+
+        if (PEAR::isError($e)) {
+            throw new BuildException("Unable to write package file.", new Exception($e->getMessage()));
+        }
+
+    }
+
+    /**
+     * Used by the PEAR_PackageFileManager_PhingFileSet lister.
+     * @return array FileSet[]
+     */
+    public function getFileSets() {
+        return $this->filesets;
+    }
+
+    // -------------------------------
+    // Set properties from XML
+    // -------------------------------
+
+    /**
+     * Nested creator, creates a FileSet for this task
+     *
+     * @return FileSet The created fileset object
+     */
+    function createFileSet() {
+        $num = array_push($this->filesets, new FileSet());
+        return $this->filesets[$num-1];
+    }
+
+	/**
+     * Set the version we are building.
+     * @param string $v
+     * @return void
+     */
+	public function setVersion($v){
+		$this->version = $v;
+	}
+
+	/**
+     * Set the state we are building.
+     * @param string $v
+     * @return void
+     */
+	public function setState($v) {
+		$this->state = $v;
+	}
+
+	/**
+	 * Sets release notes field.
+	 * @param string $v
+	 * @return void
+	 */
+	public function setNotes($v) {
+		$this->notes = $v;
+	}
+    /**
+     * Sets "dir" property from XML.
+     * @param PhingFile $f
+     * @return void
+     */
+    public function setDir(PhingFile $f) {
+        $this->dir = $f;
+    }
+
+    /**
+     * Sets the file to use for generated package.xml
+     */
+    public function setDestFile(PhingFile $f) {
+        $this->packageFile = $f;
+    }
+
+}
+
+


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/BuildPropelGenPEARPackageTask.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/build-pear-package.xml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/build-pear-package.xml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/build-pear-package.xml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,144 @@
+<?xml version="1.0"?>
+
+<!--
+	This build file creates a minimal package of propel-generator files,
+	builds a package.xml for installation using PEAR and creates the necessary TGZ file.
+
+	It's pretty easy to build the PEAR package:
+
+	$> cd /path/to/propel-generator
+	$> phing -Dversion=1.0.0RC1 -f pear\build-pear-package.xml
+
+-->
+
+<project name="propel_generator" basedir="." default="main">
+
+	<property name="propelgen.home" value=".."/>
+	<property name="build.base.dir" value="build"/>
+	<property name="pkgname" value="${phing.project.name}-${version}"/>
+	<property name="build.src.dir" value="${build.base.dir}/${pkgname}"/>
+
+	<!-- some default properties -->
+	<property name="notes">This is the latest snapshot of the Propel Generator.</property>
+	<property name="state" value="devel"/>
+
+	<taskdef
+    name="pear-package"
+    classname="BuildPropelGenPEARPackageTask" classpath="."/>
+
+	<fileset dir="${propelgen.home}/classes/propel" id="classes">
+		<include name="**"/>
+	</fileset>
+
+	<fileset dir="${propelgen.home}" id="data">
+		<!--<include name="build.xml"/>-->
+		<include name="build-propel.xml"/>
+		<include name="projects/bookstore/*"/>
+		<include name="projects/treetest/*"/>
+		<include name="pear/pear-build.xml"/>
+		<include name="pear/pear-propel*"/>
+		<include name="pear/build.properties"/>
+		<include name="default.properties"/>
+		<include name="templates/**"/>
+		<include name="resources/**"/>
+	</fileset>
+
+	<!--
+		==============================================
+		Main entry point
+		==============================================
+	-->
+	<target name="main" if="version" depends="versioncheck">
+		<phingcall target="build"/>
+		<phingcall target="pear-package"/>
+		<phingcall target="tar"/>
+	</target>
+
+	<!--
+	 ===================================================================
+	 Target: checks if language was given, otherwise fail
+	 ===================================================================
+	-->
+	<target name="versioncheck" unless="version">
+		<echo message="====================================================="/>
+		<echo message="Version not specified. You must enter a version. In"/>
+		<echo message="the future you can add this to build.properties or"/>
+		<echo message="enter it on the command line: "/>
+		<echo message=" "/>
+		<echo message="-Dversion=1.0.0"/>
+		<echo message="====================================================="/>
+		<input propertyname="version" promptChar=":">Propel version for package</input>
+
+		<property name="pkgname" value="${phing.project.name}-${version}" override="true"/>
+		<property name="build.src.dir" value="${build.base.dir}/${pkgname}" override="true"/>
+
+	</target>
+
+	<!--
+		==============================================
+		Copy the desired files into the build/ dir
+		making sure to put them in the directory
+		structure that will be needed for PEAR install
+		==============================================
+	-->
+	<target name="build">
+		<echo>-----------------------------</echo>
+		<echo>| Creating directory layout |</echo>
+		<echo>-----------------------------</echo>
+
+		<delete dir="${build.base.dir}"/>
+		<mkdir dir="${build.base.dir}"/>
+
+		<copy todir="${build.src.dir}">
+			<fileset refid="classes"/>
+			<fileset refid="data"/>
+		</copy>
+
+		<!-- some files need to be manually moved here to save headache when
+		doing the pear package.xml creation -->
+		<move file="${build.src.dir}/pear/build.properties" todir="${build.src.dir}"/>
+		<move file="${build.src.dir}/pear/pear-build.xml" todir="${build.src.dir}"/>
+
+		<chmod file="${build.src.dir}/pear/pear-propel-gen" mode="755"/>
+
+	</target>
+
+	<!--
+		==============================================
+		Create a PEAR package.xml which will guide the
+		installation.
+		==============================================
+	-->
+	<target name="pear-package">
+
+		<echo>-----------------------------</echo>
+		<echo>| Creating PEAR package.xml |</echo>
+		<echo>-----------------------------</echo>
+		<echo></echo>
+
+		<pear-package dir="${build.src.dir}" destFile="${build.base.dir}/package.xml" version="${version}" state="${state}" notes="${notes}">
+
+			<fileset dir="${build.src.dir}">
+				<include name="**"/>
+			</fileset>
+
+		</pear-package>
+
+	</target>
+
+	<!--
+		==============================================
+		Create a tar.gz of the files, which will be
+		installed by pear package manager.
+		==============================================
+	-->
+	<target name="tar">
+		<echo>-----------------------------</echo>
+		<echo>| Creating tar.gz package   |</echo>
+		<echo>-----------------------------</echo>
+		<property name="tarfile" value="${build.base.dir}/${pkgname}.tgz"/>
+		<delete	file="${tarfile}"/>
+		<tar destFile="${tarfile}" basedir="${build.base.dir}" />
+	</target>
+
+</project>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/build.properties
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/build.properties	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/build.properties	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,5 @@
+# In this file you can define any properties taht you want to affect
+# all projects built using the propel-gen script on this system
+#
+# See http://propel.phpdb.org/trac/wiki/Users/Documentation/BuildProperties for a
+# list of available properties.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/pear-build.xml
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/pear-build.xml	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/pear-build.xml	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,114 @@
+<!--
+    Use this file to faciliate easy per-project building using 
+	PEAR-installed Propel-generator.
+
+	This Phing script is invoked via the shell script propel-gen (.bat
+	for Windows).  Normally you should not need to edit this script or
+	be aware of it in any way.
+	
+    Normal use:
+    $> propel-gen /path/to/my/project
+    
+    Specific target: 
+    $> propel-gen insert-sql /path/to/my/project 
+
+-->
+<project name="propel-project-builder" default="main" basedir=".">
+
+<!-- set a default target if none provided -->
+<property name="target" value="main"/>
+
+<property name="propel.project.dir" value="${project.dir}"/>
+<resolvepath propertyName="propel.project.dir" file="${propel.project.dir}" dir="${application.startdir}"/>
+
+<target name="projdircheckExists">
+  <condition property="projDirExists">
+  	<and>
+		<not>
+			<equals arg1="${propel.project.dir}" arg2="" trim="true"/>
+		</not>
+		<available file="${propel.project.dir}/build.properties"/>
+	</and>
+  </condition>
+</target>
+
+<target name="projdircheck" depends="projdircheckExists" unless="projDirExists">
+	<echo message="====================================================="/>
+	<echo message="Project directory not specified or invalid. You must "/>
+	<echo message="specify the path to your project directory and your "/>
+	<echo message="project directory must contain your build.properties "/>
+	<echo message="and schema.xml files.                                "/>
+	<echo message=" "/>
+	<echo message="Usage: "/>
+	<echo message=" "/>
+	<echo message="$&gt; propel-gen /path/to/projectdir [target]"/>
+	<echo message=" "/>
+	<echo message="====================================================="/>	
+	<fail message="No project directory specified."/>
+</target>
+
+<target name="configure" depends="projdircheck">
+	<echo msg="Loading project-specific props from ${project.dir}/build.properties"/>
+	<property file="${propel.project.dir}/build.properties"/>
+</target>
+
+<target name="main" depends="configure" 
+  description="The main target. Includes project-specific build.properties and calls the build-propel.xml script">	
+
+ <!--<property file="${project.dir}/build.properties"/>-->
+ <phing phingfile="build-propel.xml" target="${target}"/>
+ 
+</target>
+
+
+<!-- 
+ Convenience mappings to build-propel.xml main targets 
+ 
+ This makes it possible to use this buildfile w/o needing to specify
+ target as a property, e.g.:
+ 
+ $> phing -Dproject=bookstore insert-sql
+ 
+ The main reason for this is just consistency w/ old build-propel.xml file
+ (primarily for documentation & user confusion avoidance reasons).  There are relatively
+ few & infrequently changing main targets of build-propel.xml, so it's a non-
+ issue as far as maintenance is concerned.
+-->
+
+<target name="convert-props" depends="configure">
+	<phing phingfile="build-propel.xml" target="convert-props"/>
+</target>
+
+<target name="create-db" depends="configure">
+	<phing phingfile="build-propel.xml" target="create-db"/>
+</target>
+
+<target name="creole" depends="configure">
+	<phing phingfile="build-propel.xml" target="creole"/>
+</target>
+
+<target name="datadtd" depends="configure">
+	<phing phingfile="build-propel.xml" target="datadtd"/>
+</target>
+
+<target name="datadump" depends="configure">
+	<phing phingfile="build-propel.xml" target="datadump"/>
+</target>
+
+<target name="datasql" depends="configure">
+	<phing phingfile="build-propel.xml" target="datasql"/>
+</target>
+
+<target name="insert-sql" depends="configure">
+	<phing phingfile="build-propel.xml" target="insert-sql"/>
+</target>
+
+<target name="om" depends="configure">
+	<phing phingfile="build-propel.xml" target="om"/>
+</target>
+
+<target name="sql" depends="configure">
+	<phing phingfile="build-propel.xml" target="sql"/>
+</target>
+
+</project>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/pear-propel-gen
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/pear-propel-gen	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/pear-propel-gen	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+# ------------------------------------------------------------------------
+# The phing build script for Unix based systems
+# $Id: pear-propel-gen,v 1.2 2004/10/17 13:24:09 hlellelid Exp $
+# ------------------------------------------------------------------------
+
+# Change this to reflect your environment if the default value doesn't work
+export PHING_COMMAND="phing"
+
+# -------------------------------------------------------------------------
+# Do not change anything below this line unless you know what you're doing.
+# -------------------------------------------------------------------------
+
+# (currently this is not reached)
+if (test -z "$PHING_COMMAND") ; then
+	echo "WARNING: PHP_COMMAND environment not set. (Assuming phing on PATH)"
+	export PHING_COMMAND=php
+fi
+
+$PHING_COMMAND -f @DATA-DIR@/propel_generator/pear-build.xml -Dproject.dir=$*

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/pear-propel-gen.bat
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/pear-propel-gen.bat	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/pear/pear-propel-gen.bat	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,24 @@
+ en ECHO OFF
+
+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:: The propel-gen build script for Windows based systems
+:: $Id: pear-propel-gen.bat,v 1.2 2004/10/17 13:24:09 hlellelid Exp $
+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+::----------------------------------------------------------------------------------
+:: Please set following to the "phing" script.  By default this is expected to be
+:: on your path.  (You don't need to modify this file if that is the case.)
+  
+  SET phingScript=phing
+
+::---------------------------------------------------------------------------------
+::---------------------------------------------------------------------------------
+:: Do not modify below this line!! (Unless you know what your doing :)
+::---------------------------------------------------------------------------------
+::---------------------------------------------------------------------------------
+
+"%phingScript%" -f @DATA-DIR@\propel_generator\pear-build.xml -Dproject.dir=%*
+GOTO :EOF
+
+:PAUSE_END
+PAUSE
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/dtd/database.dtd
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/dtd/database.dtd	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/dtd/database.dtd	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,164 @@
+<!--
+    Propel XML database schema DTD
+    $Id: database.dtd,v 1.7 2005/03/30 11:38:18 hlellelid Exp $
+
+    This is based very closely on the schema DTD for Torque, but
+    some differences do exist.
+-->
+
+<!--
+
+defaultPhpNamingMethod determines how a table or column name,
+from the name attribute in the xml database file, is converted to a
+PHP class or method name.
+
+     nochange   - indicates not change is performed.
+     underscore - Underscores are removed, First letter is
+              capitalized, first letter after an underscore
+              is capitalized, the rest of the letters are
+              converted to lowercase.
+     phpname   - same as underscore, but no letters are converted
+              to lowercase.
+-->
+
+<!ELEMENT database (external-schema*, table+)>
+<!ATTLIST database
+  name CDATA #IMPLIED
+  defaultIdMethod (native|none) "none"
+  defaultTranslateMethode CDATA #IMPLIED
+  package CDATA #IMPLIED
+  baseClass CDATA #IMPLIED
+  basePeer CDATA #IMPLIED
+  defaultPhpNamingMethod (nochange|underscore|phpname) "underscore"
+  heavyIndexing (true|false) "false"
+>
+
+<!ELEMENT external-schema EMPTY>
+<!ATTLIST external-schema
+  filename CDATA #REQUIRED
+>
+
+<!--
+     note: the interface="true", requires that useManagers=true in the
+     properties file.
+-->
+<!ELEMENT table (column+,(foreign-key|index|unique|id-method-parameter|validator|vendor)*)>
+<!ATTLIST table
+  name CDATA #REQUIRED
+  phpName CDATA #IMPLIED
+  idMethod (native|autoincrement|sequence|none|null) "null"
+  skipSql (true|false) "false"
+  readOnly (true|false) "false"
+  abstract (true|false) "false"
+  isTree (true|false) "false"
+  package CDATA #IMPLIED
+  baseClass CDATA #IMPLIED
+  basePeer CDATA #IMPLIED
+  alias CDATA #IMPLIED
+  interface CDATA #IMPLIED
+  phpNamingMethod (nochange|underscore|phpname) #IMPLIED
+  heavyIndexing (true|false) #IMPLIED
+  description CDATA #IMPLIED
+>
+
+<!ELEMENT id-method-parameter EMPTY>
+<!ATTLIST id-method-parameter
+  name CDATA "default"
+  value CDATA #REQUIRED
+>
+
+<!ELEMENT column ((inheritance|vendor)*)>
+<!ATTLIST column
+  name CDATA #REQUIRED
+  phpName CDATA #IMPLIED
+  peerName CDATA #IMPLIED
+  primaryKey (true|false) "false"
+  required (true|false) "false"
+  type
+    (
+          BIT  | TINYINT | SMALLINT    | INTEGER    | BIGINT    | FLOAT
+        | REAL | NUMERIC | DECIMAL     | CHAR       | VARCHAR   | LONGVARCHAR
+        | DATE | TIME    | TIMESTAMP   | BINARY     | VARBINARY | LONGVARBINARY
+        | NULL | OTHER   | PHP_OBJECT  | DISTINCT   | STRUCT    | ARRAY
+        | BLOB | CLOB    | REF         | BOOLEANINT | BOOLEANCHAR
+        | DOUBLE | BOOLEAN
+    ) "VARCHAR"
+  phpType (object|primitive) #IMPLIED
+  size CDATA #IMPLIED
+  scale CDATA #IMPLIED
+  default CDATA #IMPLIED
+  autoIncrement (true|false) "false"
+  inheritance (single|false) "false"
+  inputValidator CDATA #IMPLIED
+  phpNamingMethod (nochange|underscore|phpname) #IMPLIED
+  description CDATA #IMPLIED
+  lazyLoad (true|false) "false"
+>
+
+<!ELEMENT inheritance EMPTY>
+<!ATTLIST inheritance
+  key CDATA #REQUIRED
+  class CDATA #REQUIRED
+  package CDATA #IMPLIED
+  extends CDATA #IMPLIED
+>
+
+<!ELEMENT foreign-key (reference+, vendor*)>
+<!ATTLIST foreign-key
+  foreignTable CDATA #REQUIRED
+  name CDATA #IMPLIED
+  onUpdate (CASCADE|cascade|SETNULL|setnull|RESTRICT|restrict|NONE|none) "none"
+  onDelete (CASCADE|cascade|SETNULL|setnull|RESTRICT|restrict|NONE|none) "none"
+>
+
+<!ELEMENT reference EMPTY>
+<!ATTLIST reference
+  local CDATA #REQUIRED
+  foreign CDATA #REQUIRED
+>
+
+<!ELEMENT index (index-column+)>
+<!ATTLIST index
+  name CDATA #IMPLIED
+>
+
+<!ELEMENT index-column (vendor*)>
+<!ATTLIST index-column
+  name CDATA #REQUIRED
+  size CDATA #IMPLIED
+>
+
+<!ELEMENT unique (unique-column+)>
+<!ATTLIST unique
+  name CDATA #IMPLIED
+>
+
+<!ELEMENT unique-column (vendor*)>
+<!ATTLIST unique-column
+  name CDATA #REQUIRED
+>
+
+<!ELEMENT validator (rule+)>
+<!ATTLIST validator
+  column CDATA #REQUIRED
+  translate CDATA #IMPLIED
+>
+
+<!ELEMENT rule EMPTY>
+<!ATTLIST rule
+  name (mask|maxLength|maxValue|minLength|minValue|required|unique|validValues) #REQUIRED
+  value CDATA #IMPLIED
+  size ID #IMPLIED
+  message CDATA #IMPLIED
+>
+
+<!ELEMENT vendor (parameter+)>
+<!ATTLIST validator
+  type CDATA #REQUIRED
+>
+
+<!ELEMENT parameter EMPTY>
+<!ATTLIST parameter
+  name CDATA #REQUIRED
+  value CDATA #REQUIRED
+>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/xsd/custom_datatypes.xsd
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/xsd/custom_datatypes.xsd	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/xsd/custom_datatypes.xsd	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+	<xs:simpleType name='custom_datatypes'>
+		<xs:restriction base='xs:string'>
+		</xs:restriction>
+	</xs:simpleType>
+</xs:schema>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/xsd/database.xsd
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/xsd/database.xsd	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/xsd/database.xsd	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,346 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+	<!-- XML Schema for the Propel schema file
+		  This is just the first draft derived from the existing DTD
+		  and some additional restrictions have been included
+
+		  Comments are a quite rare, I guess most things are pretty
+		  readable. An additional xml schema: custom_datatypes.xsd is
+		  also included. For now this file is unused, but that will
+		  change; don't worry.
+
+		  Ron -->
+
+	<xs:include schemaLocation="custom_datatypes.xsd"/>
+
+	<xs:element name="database" type="database"/>
+	<xs:element name="vendor" type="vendor"/>
+
+	<xs:simpleType name="file">
+		<xs:restriction base="xs:string">
+			<!-- Match any relative or absolute path and file containing letters, numbers and _ -->
+			<xs:pattern value="((\.{1,2}|[\w_]*)/)*([\w_]*\.?)+"/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="default_datatypes">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="BIT"/>
+			<xs:enumeration value="TINYINT"/>
+			<xs:enumeration value="SMALLINT"/>
+			<xs:enumeration value="INTEGER"/>
+			<xs:enumeration value="BIGINT"/>
+			<xs:enumeration value="FLOAT"/>
+			<xs:enumeration value="REAL"/>
+			<xs:enumeration value="NUMERIC"/>
+			<xs:enumeration value="DECIMAL"/>
+			<xs:enumeration value="CHAR"/>
+			<xs:enumeration value="VARCHAR"/>
+			<xs:enumeration value="LONGVARCHAR"/>
+			<xs:enumeration value="DATE"/>
+			<xs:enumeration value="TIME"/>
+			<xs:enumeration value="TIMESTAMP"/>
+			<xs:enumeration value="BINARY"/>
+			<xs:enumeration value="VARBINARY"/>
+			<xs:enumeration value="LONGVARBINARY"/>
+			<xs:enumeration value="NULL"/>
+			<xs:enumeration value="OTHER"/>
+			<xs:enumeration value="PHP_OBJECT"/>
+			<xs:enumeration value="DISTINCT"/>
+			<xs:enumeration value="STRUCT"/>
+			<xs:enumeration value="ARRAY"/>
+			<xs:enumeration value="BLOB"/>
+			<xs:enumeration value="CLOB"/>
+			<xs:enumeration value="REF"/>
+			<xs:enumeration value="BOOLEANINT"/>
+			<xs:enumeration value="BOOLEANCHAR"/>
+			<xs:enumeration value="DOUBLE"/>
+			<xs:enumeration value="BOOLEAN"/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="datatype">
+		<xs:union memberTypes="default_datatypes custom_datatypes"/>
+	</xs:simpleType>
+
+	<xs:simpleType name="dbidmethod">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="native"/>
+			<xs:enumeration value="none"/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="tbidmethod">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="autoincrement"/>
+			<xs:enumeration value="sequence"/>
+			<xs:enumeration value="null"/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="idmethod">
+		<xs:union memberTypes="dbidmethod tbidmethod"/>
+	</xs:simpleType>
+
+	<xs:simpleType name="phpnamingmethod">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="nochange"/>
+			<xs:enumeration value="underscore"/>
+			<xs:enumeration value="phpname"/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="delete">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="cascade"/>
+			<xs:enumeration value="set null"/>
+			<xs:enumeration value="setnull"/>
+			<xs:enumeration value="restrict"/>
+			<xs:enumeration value="none"/>
+			<xs:enumeration value=""/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="update">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="cascade"/>
+			<xs:enumeration value="setnull"/>
+			<xs:enumeration value="set null"/>
+			<xs:enumeration value="restrict"/>
+			<xs:enumeration value="none"/>
+			<xs:enumeration value=""/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="rulename">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="mask"/>
+			<xs:enumeration value="maxLength"/>
+			<xs:enumeration value="maxValue"/>
+			<xs:enumeration value="minLength"/>
+			<xs:enumeration value="minValue"/>
+			<xs:enumeration value="required"/>
+			<xs:enumeration value="unique"/>
+			<xs:enumeration value="validValues"/>
+			<xs:enumeration value="notMatch"/>
+			<xs:enumeration value="match"/>
+			<xs:enumeration value="class"/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="inh_option">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="single"/>
+			<xs:enumeration value="false"/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="php_type">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="primitive"/>
+			<xs:enumeration value="object"/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<!-- Restrict column name to letters (upper- and lowercase), numbers and the _ -->
+	<xs:simpleType name="column_name">
+		<xs:restriction base="xs:string">
+			<xs:pattern value="[\w_]+"/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<!-- Restrict php name to letters (upper- and lowercase), numbers and the _ -->
+	<xs:simpleType name="php_name">
+		<xs:restriction base="xs:string">
+			<xs:pattern value="[\w_]+"/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<!-- Restrict php class name to letters (upper- and lowercase), numbers and the _. Dot seperated -->
+	<xs:simpleType name="php_class">
+		<xs:restriction base="xs:string">
+			<xs:pattern value="([\w_]+.?)+"/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<!-- Restrict table name to letters (upper- and lowercase), numbers and the _ -->
+	<xs:simpleType name="table_name">
+		<xs:restriction base="xs:string">
+			<xs:pattern value="[\w_]+"/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<!-- Restrict index name to letters (upper- and lowercase), numbers and the _ -->
+	<xs:simpleType name="index_name">
+		<xs:restriction base="xs:string">
+			<xs:pattern value="[\w_]+"/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<!-- Restrict foreign column name to letters (upper- and lowercase), numbers and the _ -->
+	<xs:simpleType name="foreign_name">
+		<xs:restriction base="xs:string">
+			<xs:pattern value="[\w_]+"/>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:complexType name="parameter">
+		<xs:attribute name="name" type="xs:string" use="required"/>
+		<xs:attribute name="value" type="xs:string" use="required"/>
+	</xs:complexType>
+
+	<xs:complexType name="validator">
+		<xs:sequence>
+			<xs:element name="rule" type="rule" maxOccurs="unbounded"/>
+		</xs:sequence>
+		<xs:attribute name="column" type="column_name" use="required"/>
+		<xs:attribute name="translate" type="xs:string" use="optional"/>
+	</xs:complexType>
+
+	<xs:complexType name="vendor">
+		<xs:sequence>
+			<xs:element name="parameter" type="parameter" maxOccurs="unbounded"/>
+		</xs:sequence>
+		<xs:attribute name="type" use="required"/>
+	</xs:complexType>
+
+	<xs:complexType name="rule">
+		<xs:attribute name="name" type="rulename" use="required"/>
+		<xs:attribute name="value" type="xs:string" use="optional"/>
+		<xs:attribute name="size" type="xs:positiveInteger" use="optional"/>
+		<xs:attribute name="message" type="xs:string" use="optional"/>
+		<xs:attribute name="class" type="xs:string" use="optional"/>
+	</xs:complexType>
+
+	<xs:complexType name="id-method-parameter">
+		<xs:attribute name="name" type="xs:string" use="optional"/>
+		<xs:attribute name="value" type="xs:string" use="required"/>
+	</xs:complexType>
+
+	<xs:complexType name="index">
+		<xs:choice maxOccurs="unbounded">
+			<xs:element name="index-column" type="index-column" minOccurs="1" maxOccurs="unbounded"/>
+			<xs:element ref="vendor" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:choice>
+		<xs:attribute name="name" type="index_name" use="optional"/>
+	</xs:complexType>
+
+	<xs:complexType name="unique">
+		<xs:choice maxOccurs="unbounded">
+			<xs:element name="unique-column" type="unique-column" minOccurs="1" maxOccurs="unbounded"/>
+			<xs:element ref="vendor" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:choice>
+		<xs:attribute name="name" type="index_name" use="optional"/>
+	</xs:complexType>
+
+	<xs:complexType name="index-column">
+		<xs:sequence>
+			<xs:element ref="vendor" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+		<xs:attribute name="name" type="column_name" use="required"/>
+		<xs:attribute name="size" type="xs:positiveInteger" use="optional"/>
+	</xs:complexType>
+
+	<xs:complexType name="unique-column">
+		<xs:sequence>
+			<xs:element ref="vendor" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+		<xs:attribute name="name" type="column_name" use="required"/>
+		<xs:attribute name="size" type="xs:positiveInteger" use="optional"/>
+	</xs:complexType>
+
+	<xs:complexType name="inheritance">
+		<xs:attribute name="key" type="xs:string" use="required"/>
+		<xs:attribute name="class" type="xs:string" use="required"/>
+		<xs:attribute name="package" type="xs:string" use="optional"/>
+		<xs:attribute name="extends" type="xs:string" use="optional"/>
+	</xs:complexType>
+
+	<xs:complexType name="reference">
+		<xs:attribute name="local" type="column_name" use="required"/>
+		<xs:attribute name="foreign" type="column_name" use="required"/>
+	</xs:complexType>
+
+	<xs:complexType name="column">
+		<xs:choice maxOccurs="unbounded">
+			<xs:element name="inheritance" type="inheritance" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="vendor" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:choice>
+		<xs:attribute name="name" type="column_name" use="required"/>
+		<xs:attribute name="phpName" type="php_name" use="optional"/>
+		<xs:attribute name="peerName" type="php_class" use="optional"/>
+		<xs:attribute name="primaryKey" type="xs:boolean" default="false"/>
+		<xs:attribute name="required" type="xs:boolean" default="false"/>
+		<xs:attribute name="type" type="datatype" default="VARCHAR"/>
+		<xs:attribute name="phpType" type="php_type" use="optional"/>
+		<xs:attribute name="size" type="xs:nonNegativeInteger" use="optional"/>
+		<xs:attribute name="scale" type="xs:nonNegativeInteger" use="optional"/>
+		<xs:attribute name="default" type="xs:string" use="optional"/>
+		<xs:attribute name="autoIncrement" type="xs:boolean" default="false"/>
+		<xs:attribute name="inheritance" type="inh_option" default="false"/>
+		<xs:attribute name="inputValidator" type="xs:string" use="optional"/>
+		<xs:attribute name="phpNamingMethod" type="phpnamingmethod" use="optional"/>
+		<xs:attribute name="description" type="xs:string" use="optional"/>
+		<xs:attribute name="lazyLoad" type="xs:boolean" default="false"/>
+		<xs:attribute name="nodeKeySep" type="xs:string" use="optional"/> <!-- missing in the old DTD, but required to keep the treetest example working -->
+		<xs:attribute name="nodeKey" type="xs:string" use="optional"/> <!-- missing in the old DTD, but required to keep the treetest example working -->
+		<xs:attribute name="require" type="xs:string" use="optional"/>
+	</xs:complexType>
+
+	<xs:complexType name="foreign-key">
+		<xs:choice maxOccurs="unbounded">
+			<xs:element name="reference" type="reference" minOccurs="1" maxOccurs="unbounded"/>
+			<xs:element ref="vendor" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:choice>
+		<xs:attribute name="foreignTable" type="table_name" use="required"/>
+		<xs:attribute name="name" type="foreign_name" use="optional"/>
+		<xs:attribute name="onDelete" type="delete" default="none"/>
+		<xs:attribute name="onUpdate" type="update" default="none"/>
+	</xs:complexType>
+
+	<xs:complexType name="external-schema">
+		<xs:attribute name="filename" type="file" use="required"/>
+	</xs:complexType>
+
+	<xs:complexType name="table">
+		<xs:choice maxOccurs="unbounded">
+			<xs:element name="column" type="column" maxOccurs="unbounded"/>
+			<xs:element name="foreign-key" type="foreign-key" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="index" type="index" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="unique" type="unique" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="id-method-parameter" type="id-method-parameter" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="validator" type="validator" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="vendor" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:choice>
+		<xs:attribute name="name" type="table_name" use="required"/>
+		<xs:attribute name="phpName" type="php_class" use="optional"/>
+		<xs:attribute name="idMethod" type="idmethod" use='optional'/>
+		<xs:attribute name="skipSql" type="xs:boolean" default="false"/>
+		<xs:attribute name="readOnly" type="xs:boolean" default="false"/>
+		<xs:attribute name="abstract" type="xs:boolean" default="false"/>
+		<xs:attribute name="baseClass" type="php_class" use="optional"/>
+		<xs:attribute name="basePeer" type="php_class" use="optional"/>
+		<xs:attribute name="alias" type="table_name" use="optional"/>
+		<xs:attribute name="package" type="xs:string" use="optional"/>
+		<xs:attribute name="interface" type="xs:string" use="optional"/>
+		<xs:attribute name="phpNamingMethod" type="phpnamingmethod" use='optional'/>
+		<xs:attribute name="heavyIndexing" type="xs:boolean" use="optional"/>
+		<xs:attribute name="description" type="xs:string"/>
+		<xs:attribute name="isTree" type="xs:boolean" use="optional"/> <!-- missing in the old DTD, but required to keep the treetest example working -->
+	</xs:complexType>
+
+	<xs:complexType name="database">
+		<xs:choice maxOccurs="unbounded">
+			<xs:element name="external-schema" type="external-schema" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="table" type="table" minOccurs="1" maxOccurs="unbounded"/>
+		</xs:choice>
+		<xs:attribute name="name" type="xs:string" use="optional"/>
+		<xs:attribute name="defaultIdMethod" type="dbidmethod" default="none"/>
+		<xs:attribute name="defaultTranslateMethod" type="xs:string" use="optional"/>
+		<xs:attribute name="package" type="php_class" use="optional"/>
+		<xs:attribute name="baseClass" type="php_class" use="optional"/>
+		<xs:attribute name="basePeer" type="php_class" use="optional"/>
+		<xs:attribute name="defaultPhpNamingMethod" type="phpnamingmethod" default="underscore"/>
+		<xs:attribute name="heavyIndexing" type="xs:boolean" default="false"/>
+	</xs:complexType>
+</xs:schema>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/xsl/database.xsl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/xsl/database.xsl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/resources/xsl/database.xsl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE xsl:stylesheet [<!ENTITY nbsp "&#160;">]>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+	<xsl:output method="xml" indent="yes" encoding="UTF-8" />
+
+	<xsl:template match="/">
+		<xsl:apply-templates select='database'/>
+	</xsl:template>
+
+	<xsl:template match='database'>
+		<database>
+			<xsl:if test='not(boolean(@defaultIdMethod))'>
+				<xsl:attribute name='defaultIdMethod'>none</xsl:attribute>
+			</xsl:if>
+			<xsl:if test='not(boolean(@defaultPhpNamingMethod))'>
+				<xsl:attribute name='defaultPhpNamingMethod'>underscore</xsl:attribute>
+			</xsl:if>
+			<xsl:if test='not(boolean(@heavyIndexing))'>
+				<xsl:attribute name='heavyIndexing'>false</xsl:attribute>
+			</xsl:if>
+			<xsl:apply-templates select='@*'/>
+			<xsl:apply-templates select='external-schema'/>
+			<xsl:apply-templates select='table'/>
+		</database>
+	</xsl:template>
+
+	<xsl:template match='@defaultPhPNamingMethod'>
+		<xsl:attribute name='defaultPhPNamingMethod'><xsl:value-of select='translate(., "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")'/></xsl:attribute>
+	</xsl:template>
+
+	<xsl:template match='@onDelete'>
+		<xsl:choose>
+			<xsl:when test='.=""'>
+				<xsl:attribute name='onDelete'>none</xsl:attribute>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:attribute name='onDelete'><xsl:value-of select='translate(., "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")'/></xsl:attribute>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template match='@OnDelete'>
+		<xsl:choose>
+			<xsl:when test='.=""'>
+				<xsl:attribute name='onDelete'>none</xsl:attribute>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:attribute name='onDelete'><xsl:value-of select='translate(., "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")'/></xsl:attribute>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template match='@onUpdate'>
+		<xsl:choose>
+			<xsl:when test='.=""'>
+				<xsl:attribute name='onUpdate'>none</xsl:attribute>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:attribute name='onUpdate'><xsl:value-of select='translate(., "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")'/></xsl:attribute>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template match='@OnUpdate'>
+		<xsl:choose>
+			<xsl:when test='.=""'>
+				<xsl:attribute name='onUpdate'>none</xsl:attribute>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:attribute name='onUpdate'><xsl:value-of select='translate(., "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")'/></xsl:attribute>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template match='@IdMethod'>
+		<xsl:attribute name='idMethod'><xsl:value-of select='.'/></xsl:attribute>
+	</xsl:template>
+
+	<xsl:template match='@*' priority='-1'>
+		<xsl:copy-of select='.'/>
+	</xsl:template>
+
+	<xsl:template match='external-schema'>
+		<external-schema>
+			<xsl:apply-templates select='@*'/>
+		</external-schema>
+	</xsl:template>
+
+	<xsl:template match='table'>
+		<table>
+			<xsl:if test='not(boolean(@skipSql))'>
+				<xsl:attribute name='skipSql'>false</xsl:attribute>
+			</xsl:if>
+			<xsl:if test='not(boolean(@abstract))'>
+				<xsl:attribute name='abstract'>false</xsl:attribute>
+			</xsl:if>
+			<xsl:apply-templates select='@*'/>
+			<xsl:apply-templates select='column'/>
+			<xsl:apply-templates select='foreign-key'/>
+			<xsl:apply-templates select='index'/>
+			<xsl:apply-templates select='unique'/>
+			<xsl:apply-templates select='id-method-parameter'/>
+			<xsl:apply-templates select='validator'/>
+			<xsl:apply-templates select='vendor'/>
+		</table>
+	</xsl:template>
+
+	<xsl:template match='foreign-key'>
+		<foreign-key>
+			<xsl:if test='not(boolean(@onDelete)) and not(boolean(@OnDelete))'>
+				<xsl:attribute name='onDelete'>none</xsl:attribute>
+			</xsl:if>
+			<xsl:if test='not(boolean(@onUpdate)) and not(boolean(@OnUpdate))'>
+				<xsl:attribute name='onUpdate'>none</xsl:attribute>
+			</xsl:if>
+			<xsl:apply-templates select='@*'/>
+			<xsl:apply-templates select='reference'/>
+			<xsl:apply-templates select='vendor'/>
+		</foreign-key>
+	</xsl:template>
+
+	<xsl:template match='index'>
+		<index>
+			<xsl:apply-templates select='@*'/>
+			<xsl:apply-templates select='index-column'/>
+		</index>
+	</xsl:template>
+
+	<xsl:template match='unique'>
+		<unique>
+			<xsl:apply-templates select='@*'/>
+			<xsl:apply-templates select='unique-column'/>
+		</unique>
+	</xsl:template>
+
+	<xsl:template match='unique-column'>
+		<unique-column>
+			<xsl:apply-templates select='@*'/>
+			<xsl:apply-templates select='vendor'/>
+		</unique-column>
+	</xsl:template>
+
+	<xsl:template match='index-column'>
+		<index-column>
+			<xsl:apply-templates select='@*'/>
+			<xsl:apply-templates select='vendor'/>
+		</index-column>
+	</xsl:template>
+
+	<xsl:template match='id-method-parameter'>
+		<id-method-parameter>
+			<xsl:if test='not(boolean(@name))'>
+				<xsl:attribute name='name'>default</xsl:attribute>
+			</xsl:if>
+			<xsl:apply-templates select='@*'/>
+		</id-method-parameter>
+	</xsl:template>
+
+	<xsl:template match='validator'>
+		<validator>
+			<xsl:apply-templates select='@*'/>
+			<xsl:apply-templates select='rule'/>
+		</validator>
+	</xsl:template>
+
+	<xsl:template match='rule'>
+		<rule>
+			<xsl:if test='not(boolean(@name))'>
+				<xsl:attribute name='name'>class</xsl:attribute>
+			</xsl:if>
+			<xsl:apply-templates select='@*'/>
+		</rule>
+	</xsl:template>
+
+	<xsl:template match='parameter'>
+		<parameter>
+			<xsl:apply-templates select='@*'/>
+		</parameter>
+	</xsl:template>
+
+	<xsl:template match='vendor'>
+		<vendor>
+			<xsl:apply-templates select='@*'/>
+			<xsl:apply-templates select='parameter'/>
+		</vendor>
+	</xsl:template>
+
+	<xsl:template match='inheritance'>
+		<inheritance>
+			<xsl:apply-templates select='@*'/>
+		</inheritance>
+	</xsl:template>
+
+	<xsl:template match='column'>
+		<column>
+			<xsl:if test='not(boolean(@primaryKey))'>
+				<xsl:attribute name='primaryKey'>false</xsl:attribute>
+			</xsl:if>
+			<xsl:if test='not(boolean(@required))'>
+				<xsl:attribute name='required'>false</xsl:attribute>
+			</xsl:if>
+			<xsl:if test='not(boolean(@type))'>
+				<xsl:attribute name='type'>VARCHAR</xsl:attribute>
+			</xsl:if>
+			<xsl:if test='not(boolean(@autoIncrement))'>
+				<xsl:attribute name='autoIncrement'>false</xsl:attribute>
+			</xsl:if>
+			<xsl:if test='not(boolean(@lazyLoad))'>
+				<xsl:attribute name='lazyLoad'>false</xsl:attribute>
+			</xsl:if>
+			<xsl:apply-templates select='@*'/>
+			<xsl:apply-templates select='inheritance'/>
+			<xsl:apply-templates select='vendor'/>
+		</column>
+	</xsl:template>
+
+	<xsl:template match='reference'>
+		<reference>
+			<xsl:apply-templates select='@*'/>
+		</reference>
+	</xsl:template>
+
+</xsl:stylesheet>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/README
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/README	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/README	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,5 @@
+This directory contains PHP templates which are used to build SQL files and object 
+model (OM) classes.  The PHP templates are called from the 
+propel.phing.PropelDataModelTask class.  The templates are managed by the Capsule 
+engine, which simply provides a mechanism for placing values in the template context 
+and buffering output, etc.
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/conf/Control.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/conf/Control.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/conf/Control.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * Control script which converts a properties file (in XML or INI-style .properties) into PHP array.
+ *
+ * This conversion exists for performance reasons only.
+ * 
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 1.2 $
+ */
+ 
+ // we expect to have:
+ //		$propertiesFile - path to xml/ini file.
+
+
+$pfile = new PhingFile($propertiesFile);
+if (!$pfile->exists()) {	
+    throw new BuildException("Property file does not exist: $propertiesFile");
+}
+
+$pfileName = explode('.', $pfile->getName());
+$format = array_pop($pfileName);
+
+switch($format) {
+    case 'xml':
+        include 'xml.tpl';
+        break;        
+    default:
+        throw new BuildException("Propel now only supports the XML runtime conf format (expected to find a runtime file with .xml extension).");
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/conf/xml.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/conf/xml.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/conf/xml.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,83 @@
+<?php
+
+/**
+ * Template that converts XML files into PHP arrays.
+ *
+ * See the provided projects/bookstore/runtime-conf.xml file for an example.
+ *
+ * @author Hans Lellelid <hans en xmpl.org>
+ * @version $Revision: 1.2 $
+ */
+ 
+ // --------------------------------------------------------------------------------
+
+// Added function_exists check for ticket:244, allowing multiple calls to convert-props
+if (!function_exists('simplexml_to_array')) {
+/**
+ * Converts simplexml object into array, turning attributes into child elements.
+ *
+ * From a helpful php.net comment.
+ * @author Christophe VG
+ */ 
+function &simplexml_to_array( $xml ) {
+	$ar = array();
+
+	foreach( $xml->children() as $k => $v ) {		
+		
+		// recurse the child
+		$child = simplexml_to_array( $v );
+		
+		//print "Recursed down and found: " . var_export($child, true) . "\n";
+		
+		// if it's not an array, then it was empty, thus a value/string
+		if( count($child) == 0 ) {			
+			$child = (string)$v;
+		}
+	
+		// add the childs attributes as if they where children
+		foreach( $v->attributes() as $ak => $av ) {
+			
+			// if the child is not an array, transform it into one
+			if( !is_array( $child ) ) {
+				$child = array( "value" => $child );
+			}
+
+			if ($ak == 'id') {
+				// special exception: if there is a key named 'id'
+				// then we will name the current key after that id
+			    $k = (string) $av;
+			} else {
+				// otherwise, just add the attribute like a child element
+				$child[$ak] = (string) $av;
+			}
+		}
+		
+		 // if the $k is already in our children list, we need to transform
+		 // it into an array, else we add it as a value
+		 if( !in_array( $k, array_keys($ar) ) ) {
+			 $ar[$k] = $child;
+		 } else {
+			 // if the $ar[$k] element is not already an array, then we need to make it one
+			 if ( !is_array( $ar[$k] ) ) { $ar[$k] = array( $ar[$k] ); }
+			 $ar[$k][] = $child;
+		 }
+	
+	}
+	return $ar;
+}
+} // if (!function_exists...)
+ 
+ // we expect to have:
+ //		$propertiesFile - path to properties file.
+
+ $xmlDom = new DOMDocument();
+ 
+ $xmlDom->load($propertiesFile);
+ $xml = simplexml_load_string($xmlDom->saveXML());
+ 
+ echo '<' . '?' . "php\n";
+ echo "// This file generated by Propel convert-props target on " . strftime("%c") . "\n";
+ echo "// from XML runtime conf file " . $pfile->getPath() . "\n";
+ echo "return ";
+ var_export(simplexml_to_array( $xml ));
+ echo ";"; 

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dtd/dataset.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dtd/dataset.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dtd/dataset.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,13 @@
+<!ELEMENT dataset (
+    <?php
+	$vc = 0;
+	foreach($tables as $tbl) {
+		if($vc++) {
+			echo ",";
+		}
+		echo $tbl->getPhpName() ?>*<?php } ?> 
+)>
+<!ATTLIST dataset
+    name CDATA #REQUIRED
+>
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dtd/table.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dtd/table.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dtd/table.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,6 @@
+<!ELEMENT <?php echo $table->getPhpName() ?> EMPTY>
+<!ATTLIST <?php echo $table->getPhpName() ?>
+<?php foreach ($table->getColumns() as $col) { ?> 
+	<?php echo $col->getPhpName() ?> CDATA <?php if($col->isNotNull()) { ?>#REQUIRED<?php } else { ?>IMPLIED<?php } ?><?php } ?>
+>
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dump/bottom.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dump/bottom.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dump/bottom.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+</dataset>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dump/row.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dump/row.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dump/row.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,2 @@
+    <?php echo $row ?>
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dump/top.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dump/top.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/data/dump/top.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,3 @@
+<?php echo '<' /* in case short_tags=On */ ?>?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?>
+<!DOCTYPE dataset SYSTEM "file://<?php echo $project ?>-data.dtd">
+<dataset name="<?php echo $dataset ?>">

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionNode.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionNode.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionNode.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+<?php
+
+// Create empty stub node class which extends the BaseNode class created in Node.tpl.
+//
+// $Id: ExtensionNode.tpl,v 1.2 2004/12/12 10:40:23 micha Exp $
+
+echo '<' . '?' . 'php';
+
+$db = $table->getDatabase();
+if($table->getPackage()) {
+    $package = $table->getPackage();
+} else {
+    $package = $targetPackage;
+}
+
+?>
+
+
+require_once '<?php echo ClassTools::getFilePath($pkbase, $basePrefix . $table->getPhpName() . 'Node') ?>';
+
+/** 
+ * The skeleton for this class was autogenerated by Propel <?php if ($addTimeStamp) { ?> on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ *
+ * @package <?php echo $package ?> 
+ */
+class <?php echo $table->getPhpName() ?>Node extends <?php echo $basePrefix . $table->getPhpName() . 'Node' ?> {
+
+}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionNodePeer.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionNodePeer.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionNodePeer.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+<?php
+
+// Create empty stub node peer class which extends the BaseNodePeer class created in NodePeer.tpl.
+//
+// $Id: ExtensionNodePeer.tpl,v 1.2 2004/12/12 10:40:23 micha Exp $
+
+echo '<' . '?' . 'php';
+
+$db = $table->getDatabase();
+if($table->getPackage()) {
+    $package = $table->getPackage();
+} else {
+    $package = $targetPackage;
+}
+
+?>
+
+
+require_once '<?php echo ClassTools::getFilePath($pkbase, $basePrefix . $table->getPhpName() . 'NodePeer') ?>';
+
+/** 
+ * The skeleton for this class was autogenerated by Propel <?php if ($addTimeStamp) { ?> on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ *
+ * @package <?php echo $package ?> 
+ */
+class <?php echo $table->getPhpName() ?>NodePeer extends <?php echo $basePrefix . $table->getPhpName() . 'NodePeer' ?> {
+
+}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionObject.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionObject.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionObject.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,36 @@
+<?php
+// Create empty stub object class which extends the Base class created in Object.tpl.
+//
+// $Id: ExtensionObject.tpl,v 1.2 2004/10/30 17:53:47 micha Exp $
+
+echo '<' . '?' . 'php';
+
+$db = $table->getDatabase();
+if ($db->getPackage()) {
+    $package = $db->getPackage();
+} else {
+    $package = $targetPackage;
+}
+
+?>
+
+require_once 'propel/om/Persistent.php';
+require_once '<?php echo ClassTools::getFilePath($pkbase, $basePrefix . $table->getPhpName()) ?>';
+
+/**
+ * The skeleton for this class was autogenerated by Propel <?php if ($addTimeStamp) { ?> on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ *
+ * @package <?php echo $package ?>
+ */
+class <?php echo $table->getPhpName() ?> extends <?php echo $basePrefix . $table->getPhpName()
+?>
+{
+
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionPeer.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionPeer.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/ExtensionPeer.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,36 @@
+<?php
+//  Create empty stub Peer class which extends the Base class created in Peer.tpl.
+//
+// $Id: ExtensionPeer.tpl,v 1.2 2004/10/31 10:24:41 micha Exp $
+
+echo '<' . '?' . 'php';
+
+$db = $table->getDatabase();
+if ($table->getPackage()) {
+    $package = $table->getPackage();
+} else {
+    $package = $targetPackage;
+}
+
+$thisClass = $table->getPhpName() . 'Peer';
+$baseClass = $basePrefix . $thisClass;
+?>
+
+require_once '<?php echo ClassTools::getFilePath($pkbase, $basePrefix . $table->getPhpName() . 'Peer') ?>';
+include_once '<?php echo ClassTools::getFilePath($package, $table->getPhpName()) ?>';
+
+/**
+ * The skeleton for this class was autogenerated by Propel <?php if ($addTimeStamp) { ?>on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ *  You should add additional methods to this class to meet the
+ *  application requirements.  This class will only be generated as
+ *  long as it does not already exist in the output directory.
+ *
+ * @package <?php echo $package ?>
+ */
+class <?php echo $table->getPhpName()?>Peer extends <?php echo $basePrefix . $table->getPhpName() ?>Peer
+{
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Interface.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Interface.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Interface.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,30 @@
+<?php
+// Create an empty interface.
+//
+// $Id: Interface.tpl,v 1.3 2004/10/31 10:16:09 micha Exp $
+
+echo '<' . '?' . 'php';
+$db = $table->getDatabase();
+if ($table->getPackage()) {
+    $package = $table->getPackage();
+} else {
+    $package = $targetPackage;
+}
+?>
+
+
+/**
+ * This is an interface that should be filled with the public api of the
+ * <?php echo $table->getPhpName()?> objects.
+ * The skeleton for this class was autogenerated by Propel <?php if ($addTimeStamp) { ?>on:
+ *
+ * [<?php echo $now ?>]
+ * <?php } ?>
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ * @package <?php echo $package ?>
+ */
+class <?php echo $table->getInterface() ?>
+{
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/MapBuilder.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/MapBuilder.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/MapBuilder.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,135 @@
+<?php
+
+// Create a MapBuilder class for describing the current database at runtime.
+//
+// $Id: MapBuilder.tpl,v 1.3 2004/12/04 14:32:45 micha Exp $
+
+echo '<' . '?' . 'php';
+
+?>
+
+require_once 'propel/map/MapBuilder.php';
+include_once 'creole/CreoleTypes.php';
+
+/**
+ * This class adds structure of '<?php echo $table->getName() ?>' table to '<?php echo $table->getDatabase()->getName() ?>' DatabaseMap object.
+ *
+ * These statically-built map classes are used by Propel to do runtime db structure discovery.
+ * For example, the createSelectSql() method checks the type of a given column used in an 
+ * ORDER BY clause to know whether it needs to apply SQL to make the ORDER BY case-insensitive 
+ * (i.e. if it's a text column type).
+ *
+<?php if ($addTimeStamp) { ?>
+ *  This class was autogenerated by Propel on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * @see BasePeer
+ * @see DatabaseMap
+ * @package <?php echo $package ?>.map;
+ */
+class <?php echo $table->getPhpName() ?>MapBuilder extends MapBuilder
+{
+  /**
+  * Returns the name of this class.
+  */
+  function CLASS_NAME() { return ("<?php echo $pkmap . '.' . $table->getPhpName() ?>MapBuilder"); }
+
+  /**
+  * The database map.
+  */
+  var $dbMap = null;
+
+  /**
+  * Tells us if this DatabaseMapBuilder is built so that we
+  * don't have to re-build it every time.
+  *
+  * @return boolean TRUE if this DatabaseMapBuilder is built
+  */
+  function isBuilt()
+  {
+    return ($this->dbMap !== null);
+  }
+
+  /**
+  * Gets the databasemap this map builder built.
+  *
+  * @return DatabaseMap This database map.
+  */
+  function & getDatabaseMap()
+  {
+      return $this->dbMap;
+  }
+
+  /**
+  * The doBuild() method builds the DatabaseMap
+  *
+  * @return void
+  * @throws PropelException
+  */
+  function doBuild()
+  {
+    $this->dbMap =& Propel::getDatabaseMap("<?php echo $table->getDatabase()->getName() ?>");
+
+    $tMap =& $this->dbMap->addTable("<?php echo $table->getName()?>");
+    $tMap->setPhpName("<?php echo $table->getPhpName()?>");
+
+<?php if ($table->getIdMethod() == "native") { ?>
+    $tMap->setUseIdGenerator(true);
+<?php } else { ?>
+    $tMap->setUseIdGenerator(false);
+<?php } ?>
+
+    <?php if ($table->getIdMethodParameters()) {
+    $params = $table->getIdMethodParameters();
+    $imp = $params[0]; ?>
+    $tMap->setPrimaryKeyMethodInfo("<?php echo $imp->getValue() ?>");
+    <?php } elseif ($table->getIdMethod() == "native" && ($platform->getNativeIdMethod() == Platform::SEQUENCE)) { ?>
+    $tMap->setPrimaryKeyMethodInfo("<?php echo $table->getSequenceName() ?>");
+    <?php } elseif ($table->getIdMethod() == "native" && ($platform->getNativeIdMethod() == Platform::SEQUENCE)) { ?>
+    $tMap->setPrimaryKeyMethodInfo("<?php echo $table->getName() ?>");
+    <?php } ?>
+    // Add columns to map
+<?php foreach ($table->getColumns() as $col) {
+    $tfc=$table->getPhpName();
+    $cfc=$col->getPhpName();
+    $cup=strtoupper($col->getName());
+    if($col->isPrimaryKey()) {
+      if($col->isForeignKey()) { ?>
+    $tMap->addForeignPrimaryKey("<?php echo $cup ?>", "<?php echo $cfc?>", "<?php echo $col->getPhpType() ?>" , CreoleTypes::<?php echo $col->getType() ?>(), "<?php echo $col->getRelatedTableName()?>" , "<?php echo strtoupper($col->getRelatedColumnName()) ?>", <?php echo $col->isNotNull() ? 'true' : 'false' ?>);
+<?php        } else { ?>
+    $tMap->addPrimaryKey("<?php echo $cup ?>", "<?php echo $cfc?>", "<?php echo $col->getPhpType() ?>", CreoleTypes::<?php echo $col->getType() ?>(), <?php echo $col->isNotNull() ? 'true' : 'false' ?>);
+<?php }
+
+        } else {
+                if($col->isForeignKey()) { ?>
+    $tMap->addForeignKey("<?php echo $cup ?>", "<?php echo $cfc?>", "<?php echo $col->getPhpType()?>", CreoleTypes::<?php echo $col->getType() ?>(), "<?php echo $col->getRelatedTableName() ?>" , "<?php echo strtoupper($col->getRelatedColumnName()) ?>", <?php echo $col->isNotNull() ? 'true' : 'false' ?>);
+<?php        } else {
+                if (!$col->getSize()) {
+                        $size = "null";
+                } else {
+                        $size = $col->getSize();
+                }
+                ?>
+    $tMap->addColumn("<?php echo $cup ?>", "<?php echo $cfc?>", "<?php echo $col->getPhpType()?>", CreoleTypes::<?php echo $col->getType() ?>(), <?php echo $col->isNotNull() ? 'true' : 'false' ?>, <?php echo $size ?>);
+<?php         }
+        } // if col-is prim key
+} // foreach
+
+foreach($table->getValidators() as $val) {
+  $col = $val->getColumn();
+  $cup = strtoupper($col->getName());
+  foreach($val->getRules() as $rule) {
+    if ($val->getTranslate() !== Validator::TRANSLATE_NONE) {
+?>
+    $tMap->addValidator("<?php echo $cup ?>", "<?php echo $rule->getName() ?>", "<?php echo $rule->getClass() ?>", "<?php echo $rule->getValue()?>", <?php echo $val->getTranslate() ?>("<?php echo str_replace('"', '\"', $rule->getMessage()) ?>"));
+<?php } else { ?>
+    $tMap->addValidator("<?php echo $cup ?>", "<?php echo $rule->getName() ?>", "<?php echo $rule->getClass() ?>", "<?php echo $rule->getValue()?>", "<?php echo str_replace('"', '\"', $rule->getMessage()) ?>");
+<?php
+    } // if ($rule->getTranslation() ...
+  } // foreach validator
+}
+?>
+    }
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/MultiExtendObject.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/MultiExtendObject.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/MultiExtendObject.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,63 @@
+<?php
+
+// Create empty stub subclass which extends the parent stub om class created in ExtensionObject.tpl.
+//
+// $Id: MultiExtendObject.tpl,v 1.2 2004/12/12 10:40:23 micha Exp $
+
+echo '<' . '?' . 'php';
+
+$db = $table->getDatabase();
+if ($table->getPackage()) {
+  $package = $table->getPackage();
+} else {
+  $package = $targetPackage;
+}
+
+$packagePath = strtr($package, '.', '/');
+if ($packagePath != "") $packagePath .= '/';
+
+if ($child->getAncestor()) {
+    $parent = $child->getAncestor();
+?> 
+
+require_once '<?php echo strtr($parent, '.', '/') ?>.php';
+
+<?php
+  $parts = explode('.', $parent);
+  $parentClass = array_pop($parts);
+} else {
+  $parentClass = $table->getPhpName();
+?> 
+
+require_once '<?php echo $packagePath . $parentClass ?>.php';
+<?php
+}
+?>
+
+/** 
+<?php if ($addTimeStamp) { ?>
+
+ * The skeleton for this class was autogenerated by Propel on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ */
+class <?php echo $child->getClassName()?> extends <?php echo $parentClass ?> 
+{
+
+  function <?php echo $child->getClassName()?>()
+  {
+<?php
+  $col = $child->getColumn();
+  $cfc = $col->getPhpName();
+  $table = $col->getTable();
+?>
+    $this->set<?php echo $cfc ?>(<?php echo $table->getPhpName() ?>Peer::CLASSKEY_<?php echo strtoupper($child->getKey()) ?>());
+  }
+
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Node.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Node.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Node.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,871 @@
+<?php
+
+// Template for creating base node class on tree table.
+//
+// $Id: Node.tpl,v 1.8 2005/04/04 11:02:40 dlawson_mi Exp $
+
+
+require_once 'propel/engine/builder/om/ClassTools.php';
+
+$db = $table->getDatabase();
+if($table->getPackage()) {
+    $package = $table->getPackage();
+} else {
+    $package = $targetPackage;
+}
+
+$CLASS = $table->getPhpName() . 'NodePeer';
+echo '<' . '?' . 'php';
+
+?>
+
+
+require_once '<?php echo ClassTools::getFilePath($package, $table->getPhpName() . 'NodePeer') ?>';
+
+/**
+ * Base tree node class for manipulating a tree of <?php echo $table->getPhpName() ?> objects.
+ * This class will wrap these objects within a "node" interface. It provides a
+ * method overload mechanism which allows you to use a <?php echo $table->getPhpName() ?>Node
+ * object just like a <?php $table->getPhpName() ?> object.
+ * 
+ * To avoid tree corruption, you should always use this class to make changes to
+ * the tree and objects within it rather than using the <?php echo $table->getPhpName() ?> 
+ * class directly.
+ *
+<?php if ($addTimeStamp) { ?>
+ * This class was autogenerated by Propel on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * @package <?php echo $package ?> 
+ *
+ */
+class <?php echo $basePrefix . $table->getPhpName() ?>Node /*implements IteratorAggregate*/
+{
+    /**
+     * @var <?php echo $table->getPhpName() ?> Object wrapped by this node.
+     */
+    var $obj = null;
+    
+    /**
+     * The parent node for this node.
+     * @var <?php echo $table->getPhpName() ?>Node
+     */
+    var $parentNode = null;
+
+    /**
+     * Array of child nodes for this node. Nodes indexes are one-based.
+     * @var array
+     */
+    var $childNodes = array();
+
+    /**
+     * Constructor.
+     *
+     * @param <?php echo $table->getPhpName() ?> Object wrapped by this node.
+     */
+    function <?php echo $table->getPhpName() ?>Node($obj = null)
+    {
+        Propel::assertParam($obj, '<?php echo $CLASS; ?>', '<?php echo $table->getPhpName() ?>Node', 1);
+        $obj =& Param::get($obj);
+        
+        if ($obj !== null)
+        {
+            $this->obj =& $obj;
+        }
+        else
+        {
+            $setNodePath = "set" . <?php echo $table->getPhpName() ?>NodePeer::NPATH_PHPNAME();
+            $this->obj =& new <?php echo $table->getPhpName() ?>();
+            $this->obj->$setNodePath('0');
+        }
+    }
+
+    /**
+     * Convenience overload for wrapped object methods.
+     *
+     * @param string Method name to call on wrapped object.
+     * @param mixed Parameter accepted by wrapped object set method.
+     * @return mixed Return value of wrapped object method.
+     * @throws PropelException Fails if method is not defined for wrapped object.
+     */
+    function & callObjMethod($name, $parms = null)
+    {
+		$params =& Param::get($parms);
+        if (method_exists($this->obj, $name)) {
+			if (is_array($params)) {
+				$implode = array();
+				$keys = array_keys($params);
+				foreach($keys as $key)
+					$implode [] = "\$params['{$key}']";
+				eval('$result =& $this->obj->$name(' . implode(',', $implode) . ');');
+			}
+			else {
+				$result =& $this->obj->$name($params);
+			}
+			return $result;
+		}
+        else
+            return new PropelException(PROPEL_ERROR, "get method not defined: $name");
+    }
+
+    /**
+     * Sets the default options for iterators created from this object.
+     * The options are specified in map format. The following options 
+     * are supported by all iterators. Some iterators may support other
+     * options:
+     *
+     *   "querydb" - True if nodes should be retrieved from database.
+     *   "con" - Connection to use if retrieving from database.
+     *
+     * @param string Type of iterator to use ("pre", "post", "level").
+     * @param array Map of option name => value.
+     * @return void
+     * @todo Implement other iterator types (i.e. post-order, level, etc.)
+     */ 
+    function setIteratorOptions($type, $opts)
+    {
+        $this->itType = $type;
+        $this->itOpts = $opts;
+    }
+    
+    /**
+     * Returns a pre-order iterator for this node and its children.
+     *
+     * @param string Type of iterator to use ("pre", "post", "level")
+     * @param array Map of option name => value.
+     * @return NodeIterator
+     */
+    function & getIterator($type = null, $opts = null)
+    {
+        if ($type === null)
+            $type = (isset($this->itType) ? $this->itType : 'Pre');
+
+        if ($opts === null)
+            $opts = (isset($this->itOpts) ? $this->itOpts : array());
+            
+        $itclass = ucfirst(strtolower($type)) . 'OrderNodeIterator';
+        
+        require_once('propel/om/' . $itclass . '.php');
+        return new $itclass($this, $opts);
+    }
+        
+    /**
+     * Returns the object wrapped by this class.
+     * @return <?php echo $table->getPhpName() . "\n" ?>
+     */
+    function & getNodeObj()
+    {
+        return $this->obj;
+    }
+        
+    /**
+     * Convenience method for retrieving nodepath.
+     * @return string
+     */
+    function getNodePath()
+    {
+        $getNodePath = 'get' . <?php echo $table->getPhpName() ?>NodePeer::NPATH_PHPNAME();
+        return $this->obj->$getNodePath();
+    }
+
+    /**
+     * Returns one-based node index among siblings.
+     * @return int
+     */
+    function getNodeIndex()
+    {
+        $npath = $this->getNodePath();
+		//strrpos fix
+		$sep = 0;
+        while(false !== ($last = strpos($npath, <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP(), $sep))) {
+			$sep = $last + strlen(<?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP());
+		}
+        return (int) ($sep != 0 ? substr($npath, $sep) : $npath);
+    }
+    
+    /**
+     * Returns one-based node level within tree (root node is level 1).
+     * @return int
+     */
+    function getNodeLevel()
+    {
+        return (substr_count($this->getNodePath(), <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP()) + 1);
+    }
+    
+    /** 
+     * Returns true if specified node is a child of this node. If recurse is
+     * true, checks if specified node is a descendant of this node.
+     *
+     * @param <?php echo $table->getPhpName() ?>Node Node to look for.
+     * @param boolean True if strict comparison should be used.
+     * @param boolean True if all descendants should be checked.
+     * @return boolean
+     */
+    function hasChildNode(&$node, $strict = false, $recurse = false)
+    {
+        foreach ($this->childNodes as $key => $childNode)
+        {
+            if ($this->childNodes[$key]->equals($node, $strict))
+                return true;
+                
+            if ($recurse && $this->childNodes[$key]->hasChildNode($node, $recurse))
+                return true;
+        }
+        
+        return false;
+    }
+
+    /**
+     * Returns child node at one-based index. Retrieves from database if not 
+     * loaded yet.
+     *
+     * @param int One-based child node index.
+     * @param boolean True if child should be retrieved from database.
+     * @param Connection Connection to use if retrieving from database.
+     * @return <?php echo $table->getPhpName() ?>Node
+     */
+    function & getChildNodeAt($i, $querydb = false, $con = null)
+    {
+		Propel::assertParam($con, '<?php echo $CLASS; ?>', 'getChildNodeAt', 3);
+    	$con =& Param::get($con);
+    	
+        if ($querydb && 
+            !$this->obj->isNew() && 
+            !$this->obj->isDeleted() && 
+            !isset($this->childNodes[$i]))
+        {
+            $criteria =& new Criteria(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+            $criteria->add(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME(),
+				$this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP() . $i,
+				Criteria::EQUAL());
+
+            if ($childObj =& <?php echo $table->getPhpName() ?>Peer::doSelectOne($criteria, Param::set($con)))
+                $this->attachChildNode(new <?php echo $table->getPhpName() ?>Node(Param::set($childObj)));
+        }
+
+        return (isset($this->childNodes[$i]) ? $this->childNodes[$i] : null);
+    }
+
+    /**
+     * Returns first child node (if any). Retrieves from database if not loaded yet.
+     *
+     * @param boolean True if child should be retrieved from database.
+     * @param Connection Connection to use if retrieving from database.
+     * @return <?php echo $table->getPhpName() ?>Node
+     */
+    function & getFirstChildNode($querydb = false, $con = null)
+    {
+		Propel::assertParam($con, '<?php echo $CLASS; ?>', 'getFirstChildNode', 2);
+    	$con =& Param::get($con);
+        return $this->getChildNodeAt(1, $querydb, Param::set($con));
+    }
+        
+    /**
+     * Returns last child node (if any). 
+     *
+     * @param boolean True if child should be retrieved from database.
+     * @param Connection Connection to use if retrieving from database.
+     */
+    function & getLastChildNode($querydb = false, $con = null)
+    {
+		Propel::assertParam($con, '<?php echo $CLASS; ?>', 'getLastChildNode', 2);
+		$con =& Param::get($con);
+        $lastNode = null;
+
+        if ($this->obj->isNew() || $this->obj->isDeleted())
+        {
+			if (count($this->childNodes)) {
+				end($this->childNodes);
+                $lastNode =& $this->childNodes[key($this->childNodes)];
+			}
+        }
+        else if ($querydb)
+        {
+            $db =& Propel::getDb(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+            $criteria =& new Criteria(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+            $criteria->add(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME(),
+                $this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP() . '%',
+                Criteria::LIKE());
+            $criteria->addAnd(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME(),
+                $this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP() . '%' . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP() . '%',
+                Criteria::NOT_LIKE());
+            $criteria->addAsColumn('npathlen', $db->strLength(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME()));
+            $criteria->addDescendingOrderByColumn('npathlen');
+            $criteria->addDescendingOrderByColumn(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME());
+
+            $lastObj =& <?php echo $table->getPhpName() ?>Peer::doSelectOne($criteria, Param::set($con));
+
+            if ($lastObj !== null)
+            {
+                $lastNode =& new <?php echo $table->getPhpName() ?>Node(Param::set($lastObj));
+				$endNode = null;
+
+				if (count($this->childNodes)) {
+					end($this->childNodes);
+                	$endNode =& $this->childNodes[key($this->childNodes)];
+				}
+                
+                if ($endNode)
+                {
+                    if ($endNode->getNodePath() > $lastNode->getNodePath())
+                        return new PropelException(PROPEL_ERROR, 'Cached child node inconsistent with database.');
+                    else if ($endNode->getNodePath() == $lastNode->getNodePath())
+                        $lastNode =& $endNode;
+                    else
+                        $this->attachChildNode($lastNode);
+                }
+                else
+                {
+                    $this->attachChildNode($lastNode);
+                }
+            }
+        }
+
+        return $lastNode;
+    }
+
+    /**
+     * Returns next (or previous) sibling node or null. Retrieves from database if 
+     * not loaded yet.
+     *
+     * @param boolean True if previous sibling should be returned.
+     * @param boolean True if sibling should be retrieved from database.
+     * @param Connection Connection to use if retrieving from database.
+     * @return <?php echo $table->getPhpName() ?>Node
+     */
+    function & getSiblingNode($prev = false, $querydb = false, $con = null)
+    {
+		Propel::assertParam($con, '<?php echo $CLASS; ?>', 'getSiblingNode', 3);
+    	$con =& Param::get($con);
+        $nidx = $this->getNodeIndex();
+        
+        if ($this->isRootNode())
+        {
+            return null;
+        }
+        else if ($prev)
+        {
+            if ($nidx > 1 && ($parentNode =& $this->getParentNode($querydb, Param::set($con))))
+                return $parentNode->getChildNodeAt($nidx-1, $querydb, Param::set($con));
+            else
+                return null;
+        }
+        else
+        {
+            if ($parentNode =& $this->getParentNode($querydb, Param::set($con)))
+                return $parentNode->getChildNodeAt($nidx+1, $querydb, Param::set($con));
+            else
+                return null;
+        }
+    }
+
+    /**
+     * Returns parent node. Loads from database if not cached yet.
+     *
+     * @param boolean True if parent should be retrieved from database.
+     * @param Connection Connection to use if retrieving from database.
+     * @return <?php echo $table->getPhpName() ?>Node
+     */
+    function & getParentNode($querydb = true, $con = null)
+    {
+		Propel::assertParam($con, '<?php echo $CLASS; ?>', 'getParentNode', 2);
+    	$con =& Param::get($con);
+		
+        if ($querydb &&
+            $this->parentNode === null && 
+            !$this->isRootNode() &&
+            !$this->obj->isNew() && 
+            !$this->obj->isDeleted())
+        {
+            $npath =& $this->getNodePath();
+			//strrpos fix
+			$sep = 0;
+			while(false !== ($last = strpos($npath, <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP(), $sep))) {
+				$sep = $last + strlen(<?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP());
+			}
+            $ppath = substr($npath, 0, $sep - strlen(<?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP()));
+
+            $criteria =& new Criteria(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+            $criteria->add(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME(), $ppath, Criteria::EQUAL());
+
+            if ($parentObj =& <?php echo $table->getPhpName() ?>Peer::doSelectOne($criteria, Param::set($con)))
+            {
+                $parentNode =& new <?php echo $table->getPhpName() ?>Node(Param::set($parentObj));
+                $parentNode->attachChildNode($this);
+            }
+        }
+        
+        return $this->parentNode;
+    }
+
+    /** 
+     * Returns an array of all ancestor nodes, starting with the root node 
+     * first.
+     *
+     * @param boolean True if ancestors should be retrieved from database.
+     * @param Connection Connection to use if retrieving from database.
+     * @return array
+     */
+    function & getAncestors($querydb = false, $con = null)
+    {
+		Propel::assertParam($con, '<?php echo $CLASS; ?>', 'getAncestors', 2);
+    	$con =& Param::get($con);
+		
+        $ancestors = array();
+        $parentNode = $this;
+        
+        while ($parentNode =& $parentNode->getParentNode($querydb, Param::set($con)))
+            array_unshift($ancestors, $parentNode);
+        
+        return $ancestors;
+    }
+    
+    /**
+     * Returns true if node is the root node of the tree.
+     * @return boolean
+     */
+    function isRootNode()
+    {
+        return ($this->getNodePath() === '1');
+    }
+
+    /**
+     * Changes the state of the object and its descendants to 'new'.
+     * Also changes the node path to '0' to indicate that it is not a 
+     * stored node.
+     *
+     * @param boolean
+     * @return void
+     */
+    function setNew($b)
+    {
+        $this->adjustStatus('new', $b);
+        $this->adjustNodePath($this->getNodePath(), '0');
+    }
+    
+    /**
+     * Changes the state of the object and its descendants to 'deleted'.
+     *
+     * @param boolean
+     * @return void
+     */
+    function setDeleted($b)
+    {
+        $this->adjustStatus('deleted', $b);
+    }
+     
+    /**
+     * Adds the specified node (and its children) as a child to this node. If a
+     * valid $beforeNode is specified, the node will be inserted in front of 
+     * $beforeNode. If $beforeNode is not specified the node will be appended to
+     * the end of the child nodes.
+     *
+     * @param <?php echo $table->getPhpName() ?>Node Node to add.
+     * @param <?php echo $table->getPhpName() ?>Node Node to insert before.
+     * @param Connection Connection to use.
+     */
+    function addChildNode(&$node, $beforeNode = null, $con = null)
+    {
+		Propel::assertParam($beforeNode, '<?php echo $CLASS; ?>', 'addChildNode', 2);
+		Propel::assertParam($con, '<?php echo $CLASS; ?>', 'addChildNode', 3);
+    	$beforeNode =& Param::get($beforeNode);
+    	$con =& Param::get($con);
+
+        if ($this->obj->isNew() && !$node->obj->isNew())
+            return new PropelException(PROPEL_ERROR, 'Cannot add stored nodes to a new node.');
+            
+        if ($this->obj->isDeleted() || $node->obj->isDeleted())
+            return new PropelException(PROPEL_ERROR, 'Cannot add children in a deleted state.');
+        
+        if ($this->hasChildNode($node))
+            return new PropelException(PROPEL_ERROR, 'Node is already a child of this node.');
+
+        if ($beforeNode && !$this->hasChildNode($beforeNode))
+            return new PropelException(PROPEL_ERROR, 'Invalid beforeNode.');
+            
+        if ($con === null)
+            $con =& Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+            
+        if (Propel::isError($con))
+            return $con;
+
+        if (!$this->obj->isNew()) {
+          $e = $con->begin();
+          if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+        }
+
+        if ($beforeNode)
+        {
+            // Inserting before a node.
+            $childIdx = $beforeNode->getNodeIndex();
+            $e = $this->shiftChildNodes(1, $beforeNode->getNodeIndex(), $con);
+            if (Propel::isError($e)) { $con->rollback(); return $e; }
+        }
+        else
+        {
+            // Appending child node.
+            if ($lastNode =& $this->getLastChildNode(true, Param::set($con)))
+                $childIdx = $lastNode->getNodeIndex()+1;
+            else
+                $childIdx = 1;
+        }
+
+        // Add the child (and its children) at the specified index.
+
+        if (!$this->obj->isNew() && $node->obj->isNew())
+        {
+            $e = $this->insertNewChildNode($node, $childIdx, $con);
+            if (Propel::isError($e)) { $con->rollback(); return $e; }
+        }
+        else
+        {
+            // $this->isNew() && $node->isNew() ||
+            // !$this->isNew() && !node->isNew()
+                
+            $srcPath = $node->getNodePath();
+            $dstPath = $this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP() . $childIdx;
+                
+            if (!$node->obj->isNew())
+            {
+                $e = <?php echo $table->getPhpName() ?>NodePeer::moveNodeSubTree($srcPath, $dstPath, Param::set($con));
+                if (Propel::isError($e)) { $con->rollback(); return $e; }
+
+                $parentNode =& $node->getParentNode(true, Param::set($con));
+            }
+            else
+            {
+                $parentNode =& $node->getParentNode();
+            }
+
+            if ($parentNode)
+            {
+                $parentNode->detachChildNode($node);
+                $e = $parentNode->shiftChildNodes(-1, $node->getNodeIndex()+1, $con);
+                if (Propel::isError($e)) { $con->rollback(); return $e; }
+            }
+            
+            $node->adjustNodePath($srcPath, $dstPath);
+        }
+
+        if (!$this->obj->isNew()) {
+            $e = $con->commit();
+            if (Creole::isError($e)) { return new PropelException(PROPEL_ERROR_DB, $e); }
+        }
+
+        $this->attachChildNode($node);
+    }
+
+    /**
+     * Moves the specified child node in the specified direction.
+     *
+     * @param <?php $table->getPhpName() ?>Node Node to move.
+     * @param int Number of spaces to move among siblings (may be negative).
+     * @param Connection Connection to use.
+     * @throws PropelException
+     */
+    function moveChildNode(&$node, $direction, $con = null)
+    {
+		Propel::assertParam($con, '<?php echo $CLASS; ?>', 'moveChildNode', 3);
+		$con =& Param::get($con);
+        return new PropelException(PROPEL_ERROR, 'moveChildNode() not implemented yet.');
+    }
+    
+    /**
+     * Saves modified object data to the datastore.
+     *
+     * @param boolean If true, descendants will be saved as well.
+     * @param Connection Connection to use.
+     */
+    function save($recurse = false, $con = null)
+    {
+		Propel::assertParam($con, '<?php echo $CLASS; ?>', 'save', 2);
+		$con =& Param::get($con);
+
+        if ($this->obj->isDeleted())
+            return new PropelException(PROPEL_ERROR, 'Cannot save deleted node.');
+            
+        if (substr($this->getNodePath(), 0, 1) == '0')
+            return new PropelException(PROPEL_ERROR, 'Cannot save unattached node.');
+
+        if ($this->obj->isColumnModified(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME()))
+            return new PropelException(PROPEL_ERROR, 'Cannot save manually modified node path.');
+        
+        $this->obj->save(Param::set($con));
+        
+        if ($recurse)
+        {
+            foreach ($this->childNodes as $key => $childNode)
+                $this->childNodes[$key]->save($recurse, Param::set($con));
+        }
+    }
+    
+    /**
+     * Removes this object and all descendants from datastore.
+     *
+     * @param Connection Connection to use.
+     * @return void
+     * @throws PropelException
+     */
+    function delete($con = null)
+    {
+		Propel::assertParam($con, '<?php echo $CLASS; ?>', 'delete', 1);
+		$con =& Param::get($con);
+
+        if ($this->obj->isDeleted())
+            return new PropelException(PROPEL_ERROR, 'This node has already been deleted.');
+
+        if (!$this->obj->isNew())
+        {
+            <?php echo $table->getPhpName() ?>NodePeer::deleteNodeSubTree($this->getNodePath(), Param::set($con));
+        }
+        
+        if ($parentNode =& $this->getParentNode(true, Param::set($con)))
+        {
+            $parentNode->detachChildNode($this);
+            $parentNode->shiftChildNodes(-1, $this->getNodeIndex()+1, $con);
+        }
+        
+        $this->setDeleted(true);
+    }
+
+    /**
+     * Compares the object wrapped by this node with that of another node. Use 
+     * this instead of equality operators to prevent recursive dependency 
+     * errors.
+     *
+     * @param <?php echo $table->getPhpName() ?>Node Node to compare.
+     * @param boolean True if strict comparison should be used.
+     * @return boolean
+     */
+    function equals(&$node, $strict = false)
+    {
+        if ($strict)
+            return ($this->obj === $node->obj);
+        else
+            return ($this->obj == $node->obj);
+    }
+
+    /**
+     * This method is used internally when constructing the tree structure 
+     * from the database. To set the parent of a node, you should call 
+     * addChildNode() on the parent.
+     * @param <?php echo $table->getPhpName() ?>Node Parent node to attach.
+     * @return void
+     * @throws PropelException
+     */
+    function attachParentNode(&$node)
+    {
+        if (!$node->hasChildNode($this, true))
+            return new PropelException(PROPEL_ERROR, 'Failed to attach parent node for non-child.');
+
+        $this->parentNode =& $node;
+    }
+
+    /**
+     * This method is used internally when constructing the tree structure 
+     * from the database. To add a child to a node you should call the 
+     * addChildNode() method instead. 
+     *
+     * @param <?php echo $table->getPhpName() ?>Node Child node to attach.
+     * @return void
+     * @throws PropelException
+     */
+    function attachChildNode(&$node)
+    {
+        if ($this->hasChildNode($node))
+            return new PropelException(PROPEL_ERROR, 'Failed to attach child node. Node already exists.');
+        
+        if ($this->obj->isDeleted() || $node->obj->isDeleted())
+            return new PropelException(PROPEL_ERROR, 'Failed to attach node in deleted state.');
+            
+        if ($this->obj->isNew() && !$node->obj->isNew())
+            return new PropelException(PROPEL_ERROR, 'Failed to attach non-new child to new node.');
+
+        if (!$this->obj->isNew() && $node->obj->isNew())
+            return new PropelException(PROPEL_ERROR, 'Failed to attach new child to non-new node.');
+
+        if ($this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP() . $node->getNodeIndex() != $node->getNodePath())
+            return new PropelException(PROPEL_ERROR, 'Failed to attach child node. Node path mismatch.');
+        
+        $this->childNodes[$node->getNodeIndex()] =& $node;
+        ksort($this->childNodes);
+        
+        $node->attachParentNode($this);
+    }
+
+    /**
+     * This method is used internally when deleting nodes. It is used to break
+     * the link to this node's parent.
+     * @param <?php echo $table->getPhpName() ?>Node Parent node to detach from.
+     * @return void
+     * @throws PropelException
+     */
+    function detachParentNode(&$node)
+    {
+        if (!$node->hasChildNode($this, true))
+            return new PropelException(PROPEL_ERROR, 'Failed to detach parent node from non-child.');
+
+        unset($node->childNodes[$this->getNodeIndex()]);
+        $this->parentNode = null;
+    }
+    
+    /**
+     * This method is used internally when deleting nodes. It is used to break
+     * the link to this between this node and the specified child.
+     * @param <?php echo $table->getPhpName() ?>Node Child node to detach.
+     * @return void
+     * @throws PropelException
+     */
+    function detachChildNode(&$node)
+    {
+        if (!$this->hasChildNode($node, true))
+            return new PropelException(PROPEL_ERROR, 'Failed to detach non-existent child node.');
+
+        $this->childNodes[$node->getNodeIndex()] = & Propel::null();
+        unset($this->childNodes[$node->getNodeIndex()]);
+        $node->parentNode =& Propel::null();
+    }
+    
+    /**
+     * Shifts child nodes in the specified direction and offset index. This 
+     * method assumes that there is already space available in the 
+     * direction/offset indicated. 
+     *
+     * @param int Direction/# spaces to shift. 1=leftshift, 1=rightshift
+     * @param int Node index to start shift at.
+     * @param Connection The connection to be used.
+     * @return void
+     * @throws PropelException
+     */
+    function shiftChildNodes($direction, $offsetIdx, &$con)
+    {
+        if ($this->obj->isDeleted())
+            return new PropelException(PROPEL_ERROR, 'Cannot shift nodes for deleted object');
+
+        $lastNode =& $this->getLastChildNode(true, Param::set($con));
+        $lastIdx = ($lastNode !== null ? $lastNode->getNodeIndex() : 0);
+
+        if ($lastNode === null || $offsetIdx > $lastIdx)
+            return;
+
+        if ($con === null)
+            $con =& Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+
+        if (Propel::isError($con)) {
+                return $con;
+        }
+
+        if (!$this->obj->isNew())
+        {
+            // Shift nodes in database.
+
+            $e = $con->begin();
+            if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+
+            $n = $lastIdx - $offsetIdx + 1;
+            $i = $direction < 1 ? $offsetIdx : $lastIdx;
+
+            while ($n--)
+            {
+                $srcPath = $this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP() . $i;              // 1.2.2
+                $dstPath = $this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP() . ($i+$direction); // 1.2.3
+
+                $e = <?php echo $table->getPhpName() ?>NodePeer::moveNodeSubTree($srcPath, $dstPath, Param::set($con));
+                if (Propel::isError($e)) { $con->rollback(); return $e; }
+
+                $i -= $direction;
+            }
+
+            $e = $con->commit();
+            if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+        }
+        
+        // Shift the in-memory objects.
+        
+        $n = $lastIdx - $offsetIdx + 1;
+        $i = $direction < 1 ? $offsetIdx : $lastIdx;
+
+        while ($n--)
+        {
+            if (isset($this->childNodes[$i]))
+            {
+                $srcPath = $this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP() . $i;              // 1.2.2
+                $dstPath = $this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP() . ($i+$direction); // 1.2.3
+                
+                $this->childNodes[$i+$direction] =& $this->childNodes[$i];
+                $this->childNodes[$i+$direction]->adjustNodePath($srcPath, $dstPath);
+
+                unset($this->childNodes[$i]);
+            }
+            
+            $i -= $direction;
+        }
+        
+        ksort($this->childNodes);
+    }
+    
+    /**
+     * Inserts the node and its children at the specified childIdx.
+     *
+     * @param <?php echo $table->getPhpName() ?>Node Node to insert.
+     * @param int One-based child index to insert at.
+     * @param Connection Connection to use.
+     * @param void
+     */
+    function insertNewChildNode(&$node, $childIdx, &$con)
+    {
+        if (!$node->obj->isNew())
+            return new PropelException(PROPEL_ERROR, 'Failed to insert non-new node.');
+
+        $setNodePath = "set" . <?php echo $table->getPhpName() ?>NodePeer::NPATH_PHPNAME();
+
+        $node->obj->$setNodePath($this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP() . $childIdx);
+        $node->obj->save(Param::set($con));
+        
+        $i = 1;
+        foreach($node->childNodes as $key => $childNode)
+            $node->insertNewChildNode($node->childNodes[$key], $i++, $con);
+    }
+
+    /**
+     * Adjust new/deleted status of node and all children. 
+     *
+     * @param string Status to change ('New' or 'Deleted')
+     * @param boolean Value for status.
+     * @return void
+     */
+    function adjustStatus($status, $b)
+    {
+        $setStatus = 'set' . $status;
+        
+        $this->obj->$setStatus($b);
+        
+        foreach ($this->childNodes as $key => $childNode)
+            $this->childNodes[$key]->obj->$setStatus($b);
+    }
+    
+    /**
+     * Adjust path of node and all children. This is used internally when 
+     * inserting/moving nodes.
+     *
+     * @param string Section of old path to change.
+     * @param string New section to replace old path with.
+     * @return void
+     */
+    function adjustNodePath($oldBasePath, $newBasePath)
+    {
+        $setNodePath = "set" . <?php echo $table->getPhpName() ?>NodePeer::NPATH_PHPNAME();
+        
+        $this->obj->$setNodePath($newBasePath . 
+                                 substr($this->getNodePath(), strlen($oldBasePath)));
+        $this->obj->resetModified(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME());
+
+        foreach ($this->childNodes as $key => $childNode)
+            $this->childNodes[$key]->adjustNodePath($oldBasePath, $newBasePath);
+    }
+
+}
+
+?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/NodePeer.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/NodePeer.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/NodePeer.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,563 @@
+<?php
+
+// Template for creating base node Peer class on tree table.
+//
+// $Id: NodePeer.tpl,v 1.10 2005/02/13 12:23:52 micha Exp $
+
+require_once 'propel/engine/builder/om/ClassTools.php';
+require_once 'propel/engine/builder/om/PeerBuilder.php';
+
+$npath_colname = '';
+$npath_phpname = '';
+$npath_len = 0;
+$npath_sep = '';
+
+foreach ($table->getColumns() as $col) {
+    if ($col->isNodeKey()) {
+        $npath_colname = $table->getName() . '.' . strtoupper($col->getName());
+        $npath_phpname = $col->getPhpName();
+        $npath_len = $col->getSize();
+		$npath_sep = $col->getNodeKeySep();
+        break;
+    }
+}
+
+$db = $table->getDatabase();
+if($table->getPackage()) {
+    $package = $table->getPackage();
+} else {
+    $package = $targetPackage;
+}
+
+$CLASS = $table->getPhpName() . 'NodePeer';
+echo '<' . '?' . 'php';
+
+?>
+
+
+require_once '<?php echo ClassTools::getFilePath($package, $table->getPhpName()) ?>';
+require_once '<?php echo ClassTools::getFilePath($package, $table->getPhpName() . 'Node') ?>';
+
+
+/**
+ * Base static class for performing query operations on the tree contained by the 
+ * '<?php echo $table->getPhpName() ?>' table.
+ *
+<?php if ($addTimeStamp) { ?>
+ * This class was autogenerated by Propel on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * @package <?php echo $package ?> 
+ */
+class <?php echo $basePrefix . $table->getPhpName() ?>NodePeer
+{
+    function NPATH_COLNAME() { return '<?php echo $npath_colname ?>'; }
+    function NPATH_PHPNAME() { return '<?php echo $npath_phpname ?>'; }
+	function NPATH_SEP() { return '<?php echo $npath_sep ?>'; }
+
+    /** 
+     * Temp function for CodeBase hacks that will go away.
+     */
+    function isCodeBase($con = null)
+    {
+        Propel::assertParam($con, '<?php echo $CLASS; ?>', 'isCodeBase', 1);
+		$con =& Param::get($con);
+		
+		if ($con === null)
+	        $con =& Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+            
+        return (get_class($con) == 'ODBCConnection' && 
+                get_class($con->getAdapter()) == 'CodeBaseAdapter');
+    }
+    
+    /**
+     * Create a new Node at the top of tree. This method will destroy any 
+     * existing root node (along with its children). 
+     *
+     * Use at your own risk!
+     *
+     * @param <?php echo $table->getPhpName() ?> Object wrapped by new node.
+     * @param Connection Connection to use.
+     * @return <?php echo $table->getPhpName() ?>Node
+     * @throws PropelException
+     */
+    function & createNewRootNode(&$obj, $con = null)
+    {
+        Propel::assertParam($con, '<?php echo $CLASS; ?>', 'createNewRootNode', 2);
+	    $con =& Param::get($con);
+	    
+        if ($con === null)
+            $con =& Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+  
+        if (Propel::isError($con)) {
+            return $con;
+        }
+
+        $e = $con->begin();
+        if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+
+        $e = <?php echo $table->getPhpName() ?>NodePeer::deleteNodeSubTree('1', Param::set($con));
+        if (Propel::isError($e)) { $con->rollback(); return $e; }
+
+        $setNodePath = 'set' . <?php echo $table->getPhpName() ?>NodePeer::NPATH_PHPNAME();
+        $obj->$setNodePath('1');
+
+        $e = $obj->save(Param::set($con));
+        if (Propel::isError($e)) { $con->rollback(); return $e; }
+
+        $e = $con->commit();
+        if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+
+        return new <?php echo $table->getPhpName() ?>Node(Param::set($obj));
+    }
+    
+    /**
+     * Inserts a new Node at the top of tree. Any existing root node (along with
+     * its children) will be made a child of the new root node. This is a 
+     * safer alternative to createNewRootNode().
+     *
+     * @param <?php echo $table->getPhpName() ?> Object wrapped by new node.
+     * @param Connection Connection to use.
+     * @return <?php echo $table->getPhpName() ?>Node
+     * @throws PropelException
+     */
+    function & insertNewRootNode(&$obj, $con = null)
+    {
+        Propel::assertParam($con, '<?php echo $CLASS; ?>', 'insertNewRootNode', 2);
+	    $con =& Param::get($con);
+	    
+		if ($con === null)
+            $con =& Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+        
+        $e = $con->begin();
+        if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+
+        // Move root tree to an invalid node path.
+        $e = <?php echo $table->getPhpName() ?>NodePeer::moveNodeSubTree('1', '0', Param::set($con));
+        if (Propel::isError($e)) { $con->rollback(); return $e; }
+
+        $setNodePath = 'set' . <?php echo $table->getPhpName() ?>NodePeer::NPATH_PHPNAME();
+        
+        // Insert the new root node.
+        $obj->$setNodePath('1');
+
+        $e = $obj->save(Param::set($con));        
+        if (Propel::isError($e)) { $con->rollback(); return $e; }
+
+        // Move the old root tree as a child of the new root.
+        $e = <?php echo $table->getPhpName() ?>NodePeer::moveNodeSubTree('0', '1' . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP() . '1', Param::set($con));
+        if (Propel::isError($e)) { $con->rollback(); return $e; }
+
+        $e = $con->commit();
+        if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+        
+        return new <?php echo $table->getPhpName() ?>Node(Param::set($obj));
+    }
+
+    /**
+     * Retrieves an array of tree nodes based on specified criteria. Optionally 
+     * includes all parent and/or child nodes of the matching nodes.
+     *
+     * @param Criteria Criteria to use.
+     * @param boolean True if ancestors should also be retrieved.
+     * @param boolean True if descendants should also be retrieved.
+     * @param Connection Connection to use.
+     * @return array Array of root nodes.
+     */
+    function & retrieveNodes(&$criteria, $ancestors = false, $descendants = false, $con = null)
+    {
+        Propel::assertParam($con, '<?php echo $CLASS; ?>', 'retrieveNodes', 4);
+	    $con =& Param::get($con);
+        $criteria =& <?php echo $table->getPhpName() ?>NodePeer::buildFamilyCriteria($criteria, $ancestors, $descendants);
+        $rs =& <?php echo $table->getPhpName() ?>Peer::doSelectRS($criteria, Param::set($con));
+        return <?php echo $table->getPhpName() ?>NodePeer::populateNodes($rs, $criteria);
+    }
+
+    /**
+     * Retrieves a tree node based on a primary key. Optionally includes all 
+     * parent and/or child nodes of the matching node.
+     *
+     * @param mixed <?php echo $table->getPhpName() ?> primary key (array for composite keys)
+     * @param boolean True if ancestors should also be retrieved.
+     * @param boolean True if descendants should also be retrieved.
+     * @param Connection Connection to use.
+     * @return <?php echo $table->getPhpName() ?>Node
+     */
+    function & retrieveNodeByPK($pk, $ancestors = false, $descendants = false, $con = null)
+    {
+        Propel::assertParam($con, '<?php echo $CLASS; ?>', 'retrieveNodeByPK', 4);
+	    $con =& Param::get($con);
+        return new PropelException(PROPEL_ERROR, 'retrieveNodeByPK() not implemented yet.');
+    }
+
+    /**
+     * Retrieves a tree node based on a node path. Optionally includes all 
+     * parent and/or child nodes of the matching node.
+     *
+     * @param string Node path to retrieve.
+     * @param boolean True if ancestors should also be retrieved.
+     * @param boolean True if descendants should also be retrieved.
+     * @param Connection Connection to use.
+     * @return <?php echo $table->getPhpName() ?>Node
+     */
+    function & retrieveNodeByNP($np, $ancestors = false, $descendants = false, $con = null)
+    {
+        Propel::assertParam($con, '<?php echo $CLASS; ?>', 'retrieveNodeByNP', 4);
+	    $con =& Param::get($con);
+        $criteria =& new Criteria(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+        $criteria->add(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME(), $np, Criteria::EQUAL());
+        $criteria =& <?php echo $table->getPhpName() ?>NodePeer::buildFamilyCriteria($criteria, $ancestors, $descendants);
+        $rs =& <?php echo $table->getPhpName() ?>Peer::doSelectRS($criteria, Param::set($con));
+        $nodes =& <?php echo $table->getPhpName() ?>NodePeer::populateNodes($rs, $criteria);
+        return (count($nodes) == 1 ? $nodes[0] : null);
+    }
+
+    /**
+     * Retrieves the root node.
+     *
+     * @param string Node path to retrieve.
+     * @param boolean True if descendants should also be retrieved.
+     * @param Connection Connection to use.
+     * @return <?php echo $table->getPhpName() ?>Node
+     */ 
+    function & retrieveRootNode($descendants = false, $con = null)
+    {
+        Propel::assertParam($con, '<?php echo $CLASS; ?>', 'retrieveRootNode', 2);
+	    $con =& Param::get($con);
+        return <?php echo $table->getPhpName() ?>NodePeer::retrieveNodeByNP('1', false, $descendants, Param::set($con));
+    }
+
+    /**
+     * Moves the node subtree at srcpath to the dstpath. This method is intended
+     * for internal use by the BaseNode object. Note that it does not check for 
+     * preexisting nodes at the dstpath. It also does not update the  node path 
+     * of any Node objects that might currently be in memory. 
+     *
+     * Use at your own risk!
+     *
+     * @param string Source node path to move (root of the src subtree).
+     * @param string Destination node path to move to (root of the dst subtree).
+     * @param Connection Connection to use.
+     * @return void
+     * @throws PropelException
+     * @todo This is currently broken for simulated "onCascadeDelete"s. 
+     * @todo Need to abstract the SQL better. The CONCAT sql function doesn't 
+     *       seem to be standardized (i.e. mssql), so maybe it needs to be moved
+     *       to DBAdapter.
+     */    
+    function moveNodeSubTree($srcPath, $dstPath, $con = null)
+    {
+        Propel::assertParam($con, '<?php echo $CLASS; ?>', 'moveNodeSubTree', 3);
+	    $con =& Param::get($con);
+
+        if (substr($dstPath, 0, strlen($srcPath)) == $srcPath)
+            return new PropelException(PROPEL_ERROR, 'Cannot move a node subtree within itself.');
+        
+		if ($con === null)
+            $con =& Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+
+        /**
+         * Example:
+         * UPDATE table 
+         * SET npath = CONCAT('1.3', SUBSTRING(npath, 6, 74)) 
+         * WHERE npath = '1.2.2' OR npath LIKE '1.2.2.%'
+         */
+         
+        $npath = <?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME();
+		//the following dot isn`t mean`t a nodeKeySeperator
+        $setcol = substr($npath, strpos($npath, '.')+1);
+        $setcollen = <?php echo $npath_len ?>;
+        $db = Propel::getDb(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+        
+        // <hack> 
+        if (<?php echo $table->getPhpName() ?>NodePeer::isCodeBase(Param::set($con)))
+        {
+            // This is a hack to get CodeBase working. It will eventually be removed.
+            // It is a workaround for the following CodeBase bug:
+            //   -Prepared statement parameters cannot be embedded in SQL functions (i.e. CONCAT)
+            $sql = "UPDATE " . <?php echo $table->getPhpName() ?>Peer::TABLE_NAME() . " " .
+                   "SET $setcol=" . $db->concatString("'$dstPath'", $db->subString($npath, strlen($srcPath)+1, $setcollen)) . " " . 
+                   "WHERE $npath = '$srcPath' OR $npath LIKE '$srcPath" . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP() . "%'";
+
+            $con->executeUpdate($sql);
+        }
+        else
+        {
+        // </hack>
+            $sql = "UPDATE " . <?php echo $table->getPhpName() ?>Peer::TABLE_NAME() . " " .
+                   "SET $setcol=" . $db->concatString('?', $db->subString($npath, '?', '?')) . " " . 
+                   "WHERE $npath = ? OR $npath LIKE ?";
+
+            $stmt =& $con->prepareStatement($sql);
+            $stmt->setString(1, $dstPath);
+            $stmt->setInt(2, strlen($srcPath)+1);
+            $stmt->setInt(3, $setcollen);
+            $stmt->setString(4, $srcPath);
+            $stmt->setString(5, $srcPath . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP() . '%');
+            $stmt->executeUpdate();
+        // <hack>
+        }
+        // </hack>
+    }
+
+    /**
+     * Deletes the node subtree at the specified node path from the database.
+     *
+     * @param string Node path to delete
+     * @param Connection Connection to use.
+     * @return void
+     * @throws PropelException
+     * @todo This is currently broken for simulated "onCascadeDelete"s. 
+     */
+    function deleteNodeSubTree($nodePath, $con = null)
+    {
+        Propel::assertParam($con, '<?php echo $CLASS; ?>', 'deleteNodeSubTree', 2);
+	    $con =& Param::get($con);
+
+		if ($con === null)
+            $con =& Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+
+        /**
+         * DELETE FROM table
+         * WHERE npath = '1.2.2' OR npath LIKE '1.2.2.%'
+         */
+        
+        $criteria =& new Criteria(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+        $criteria->add(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME(), $nodePath, Criteria::EQUAL());
+        $criteria->addOr(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME(), $nodePath . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP() . '%', Criteria::LIKE());
+        // For now, we call BasePeer directly since <?php echo $table->getPhpName() ?>Peer tries to 
+        // do a cascade delete.
+        //          <?php echo $table->getPhpName() ?>Peer::doDelete($criteria, Param::set($con));
+        BasePeer::doDelete($criteria, $con);
+    }
+      
+    /** 
+     * Builds the criteria needed to retrieve node ancestors and/or descendants.
+     *
+     * @param Criteria Criteria to start with
+     * @param boolean True if ancestors should be retrieved.
+     * @param boolean True if descendants should be retrieved.
+     * @return Criteria
+     */
+    function & buildFamilyCriteria(&$criteria, $ancestors = false, $descendants = false)
+    {
+        /*
+            Example SQL to retrieve nodepath '1.2.3' with both ancestors and descendants:
+            
+            SELECT L.NPATH, L.LABEL, test.NPATH, UCASE(L.NPATH) 
+            FROM test L, test 
+            WHERE test.NPATH='1.2.3' AND 
+                 (L.NPATH=SUBSTRING(test.NPATH, 1, LENGTH(L.NPATH)) OR 
+                  test.NPATH=SUBSTRING(L.NPATH, 1, LENGTH(test.NPATH))) 
+            ORDER BY UCASE(L.NPATH) ASC
+        */
+
+        if ($criteria === null)
+            $criteria =& new Criteria(<?php echo $table->getPhpName() ?>::DATABASE_NAME());
+
+        if (!$criteria->getSelectColumns())
+            <?php echo $table->getPhpName() ?>Peer::addSelectColumns($criteria);
+
+        $db =& Propel::getDb($criteria->getDbName());
+
+        if (($ancestors || $descendants) && $criteria->size())
+        {
+            // If we are retrieving ancestors/descendants, we need to do a 
+            // self-join to locate them. The exception to this is if no search
+            // criteria is specified. In this case we're retrieving all nodes 
+            // anyway, so there is no need to do a self-join. 
+            
+            // The left-side of the self-join will contain the columns we'll
+            // use to build node objects (target node records along with their
+            // ancestors and/or descendants). The right-side of the join will
+            // contain the target node records specified by the initial criteria.
+            // These are used to match the appropriate ancestor/descendant on
+            // the left. 
+
+            // Specify an alias for the left-side table to use.
+            $criteria->addAlias('L', <?php echo $table->getPhpName() ?>Peer::TABLE_NAME());
+            
+            // Make sure we have select columns to begin with.
+            if (!$criteria->getSelectColumns())
+                <?php echo $table->getPhpName() ?>Peer::addSelectColumns($criteria);
+            
+            // Replace any existing columns for the right-side table with the 
+            // left-side alias.
+            $selectColumns = $criteria->getSelectColumns();
+            $criteria->clearSelectColumns();
+            foreach ($selectColumns as $colName)
+                $criteria->addSelectColumn(str_replace(<?php echo $table->getPhpName() ?>Peer::TABLE_NAME(), 'L', $colName));
+
+            $a = null;
+            $d = null;
+            
+            $npathL = <?php echo $table->getPhpName() ?>Peer::alias('L', <?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME());
+            $npathR = <?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME();
+            $npath_len = <?php echo $npath_len ?>;
+            
+            if ($ancestors)
+            {
+                // For ancestors, match left-side node paths which are contained 
+                // by right-side node paths.
+                $a =& $criteria->getNewCriterion($npathL, 
+                                                "$npathL=" . $db->subString($npathR, 1, $db->strLength($npathL), $npath_len),
+                                                Criteria::CUSTOM());                                                        
+            }
+            
+            if ($descendants)
+            {
+                // For descendants, match left-side node paths which contain 
+                // right-side node paths.
+                $d =& $criteria->getNewCriterion($npathR,
+                                                "$npathR=" . $db->subString($npathL, 1, $db->strLength($npathR), $npath_len),
+                                                Criteria::CUSTOM());
+            }
+
+            if ($a)
+            {
+                if ($d) $a->addOr($d);
+                $criteria->addAnd($a);
+            }
+            else if ($d)
+            {
+                $criteria->addAnd($d);
+            }
+            
+            // Add the target node path column. This is used by populateNodes().
+            $criteria->addSelectColumn($npathR);
+            
+            // Sort by node path to speed up tree construction in populateNodes()
+            $criteria->addAsColumn('npathlen', $db->strLength($npathL));
+            $criteria->addAscendingOrderByColumn('npathlen');
+            $criteria->addAscendingOrderByColumn($npathL);
+        }
+        else
+        {
+            // Add the target node path column. This is used by populateNodes().
+            $criteria->addSelectColumn(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME());
+
+            // Sort by node path to speed up tree construction in populateNodes()
+            $criteria->addAsColumn('npathlen', $db->strLength(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME()));
+            $criteria->addAscendingOrderByColumn('npathlen');
+            $criteria->addAscendingOrderByColumn(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME());
+        }
+        
+        return $criteria;
+    }    
+    
+    /**
+     * This method reconstructs as much of the tree structure as possible from
+     * the given array of objects. Depending on how you execute your query, it 
+     * is possible for the ResultSet to contain multiple tree fragments (i.e.
+     * subtrees). The array returned by this method will contain one entry
+     * for each subtree root node it finds. The remaining subtree nodes are
+     * accessible from the <?php echo $table->getPhpName() ?>Node methods of the 
+     * subtree root nodes.
+     *
+     * @param array Array of <?php echo $table->getPhpName() ?>Node objects
+     * @return array Array of <?php echo $table->getPhpName() ?>Node objects
+     */
+    function & buildTree(&$nodes)
+    {
+        // Subtree root nodes to return
+        $rootNodes = array();
+        $copy = $nodes;
+
+        // Build the tree relations
+        foreach ($nodes as $key1 => $node)
+        {
+			//strrpos fix
+			$sep = 0;
+			while(false !== ($last = strpos($node->getNodePath(), <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP(), $sep))) {
+				$sep = $last + strlen(<?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP());
+			}
+            $parentPath = ($sep != 0 ? substr($node->getNodePath(), 0, $sep - strlen(<?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP())) : '');
+            $parentNode =& Propel::null();
+
+            // Scan other nodes for parent.
+            foreach ($copy as $key2 => $pnode)
+            {
+                if ($pnode->getNodePath() == $parentPath)
+                {
+                    $parentNode =& $nodes[$key2];
+                    break;
+                }
+            }
+
+            // If parent was found, attach as child, otherwise its a subtree root
+            if ($parentNode)
+                $parentNode->attachChildNode($nodes[$key1]);
+            else
+                $rootNodes[] =& $nodes[$key1];
+        }
+
+        return $rootNodes;
+    }
+
+    /**
+     * Populates the <?php echo $table->getPhpName() ?> objects from the 
+     * specified ResultSet, wraps them in <?php echo $table->getPhpName() ?>Node 
+     * objects and build the appropriate node relationships.
+     * The array returned by this method will only include the initial targets 
+     * of the query, even if ancestors/descendants were also requested. 
+     * The ancestors/descendants will be cached in memory and are accessible via
+     * the getNode() methods. 
+     *
+     * @param ResultSet 
+     * @param Criteria
+     * @return array Array of <?php $table->getPhpName() ?>Node objects.
+     */
+    function & populateNodes(&$rs, &$criteria)
+    {
+        $nodes = array();
+        $targets = array();
+        $values = array();
+		$targetfld = count($criteria->getSelectColumns());
+        
+<?php if (!$table->getChildrenColumn()) { ?>
+		// set the class once to avoid overhead in the loop
+		$cls = <?php echo $table->getPhpName() ?>Peer::getOMClass();
+		if (Propel::isError($cls =& Propel::import($cls))) {
+		  return $cls;
+		}
+<?php } ?>
+        
+        // populate the object(s)
+        while($rs->next()) 
+        {
+            if (!isset($nodes[$rs->getString(1)]))
+            {
+<?php if ($table->getChildrenColumn()) { ?>
+				// class must be set each time from the record row
+				$cls =& Propel::import(<?php echo $table->getPhpName() ?>Peer::getOMClass($rs, 1));
+				if (Propel::isError($cls)) {
+					return $cls;
+				}
+<?php } ?>
+				$obj =& new $cls();
+				
+				if (Propel::isError($e =& $obj->hydrate($rs))) {
+					return $e;
+				}
+
+                $nodes[$rs->getString(1)] =& new <?php echo $table->getPhpName() ?>Node(Param::set($obj));
+			}
+            $node =& $nodes[$rs->getString(1)];
+            
+            if ($node->getNodePath() == $rs->getString($targetfld))
+                $targets[$node->getNodePath()] =& $node;
+        }
+
+        <?php echo $table->getPhpName() ?>NodePeer::buildTree($nodes);
+        
+        foreach($targets as $key => $value)
+                $values[] =& $targets[$key];
+                
+        return $values;
+    }
+
+}
+
+?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Object.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Object.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Object.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1938 @@
+<?php
+
+// Template for creating an object class.
+//
+// This is based on the Torque Object.vm Velocity template.  A number of changes
+// have, of course, been made to make this PHP.
+//
+// $Id: Object.tpl,v 1.21 2005/03/19 13:34:59 micha Exp $
+
+// helper class
+include_once 'propel/engine/builder/om/PeerBuilder.php';
+include_once 'propel/engine/builder/om/ClassTools.php';
+
+echo '<' . '?' . 'php';
+
+$db = $table->getDatabase();
+if ($table->getPackage()) {
+  $package = $table->getPackage();
+} else {
+  $package = $targetPackage;
+}
+
+$parentClass = ClassTools::getBaseClass($table); 
+?>
+
+require_once '<?php echo ClassTools::getFilePath($parentClass) ?>';
+
+<?php
+if (! $table->isAlias()) 
+{
+  // If any columns in table are BLOB or CLOB then we need to make
+  // sure those classes are included so we can do things like
+  // if ($v instanceof Lob) etc.
+  $includes_lobs = false;
+
+  foreach ($table->getColumns() as $col) {
+    if ($col->isLob()) {
+      $includes_lobs = true;
+      break;
+    }
+  }
+
+  if($includes_lobs) 
+  { 
+?>
+include_once 'creole/util/Clob.php';
+include_once 'creole/util/Blob.php';
+<?php
+  }
+}
+?>
+
+include_once 'propel/util/Criteria.php';
+<?php
+foreach ($table->getForeignKeys() as $fk) 
+{
+  $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+  $className = $tblFK->getPhpName();
+  if ($tblFK->getInterface()) {
+    $className = $tblFK->getInterface();
+  }
+
+  $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package);
+  $tblFKPackagePath = strtr($tblFKPackage, '.', '/');
+  if ($tblFKPackagePath != "") {
+    $tblFKPackagePath .= '/';
+  } 
+?>
+
+// (on-demand) include_once '<?php echo ClassTools::getFilePath($tblFKPackage, $className) ?>';
+// (on-demand) include_once '<?php echo ClassTools::getFilePath($tblFKPackage, $tblFK->getPhpName() . 'Peer') ?>';
+<?php 
+} /* ($table->getForeignKeys() as $fk) */ 
+?>
+
+include_once '<?php echo ClassTools::getFilePath($package, $table->getPhpName() . 'Peer') ?>';
+
+/**
+ * Base class that represents a row from the '<?php echo $table->getName() ?>' table.
+ *
+ * <?php echo $table->getDescription() ?> 
+ *
+<?php if ($addTimeStamp) { ?>
+ * This class was autogenerated by Propel on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * You should not use this class directly.  It should not even be
+ * extended; all references should be to <?php echo $table->getPhpName() ?> class.
+ *
+ * @package <?php echo $package ?> 
+ */
+class <?php echo $basePrefix . $table->getPhpName() ?> extends <?php echo ClassTools::classname($parentClass) ?> 
+{
+  /**
+  * The Peer class.
+  * Instance provides a convenient way of calling static methods on a class
+  * that calling code may not be able to identify.
+  * @var <?php echo $table->getPhpName() ?>Peer
+  */
+  var $peer;
+
+<?php
+if (! $table->isAlias()) 
+{
+  foreach ($table->getColumns() as $col) 
+  {
+    $cptype = $col->getPhpNative();
+    $clo=strtolower($col->getName());
+    $defVal = "";
+    if (($val = $col->getPhpDefaultValue()) !== null) {
+      settype($val, $cptype);
+      $defaultValue = var_export($val, true);
+      $defVal = " = " . $defaultValue;
+    }
+?>
+  /**
+  * The value for the <?php echo $clo ?> field.
+  * @var <?php echo $cptype ?> 
+  */
+  var $<?php echo $clo . $defVal ?>;
+
+<?php 
+    if ($col->isLazyLoad()) { 
+?>
+  /**
+   * Whether the lazy-loaded <?php echo $clo ?> value has been loaded from database.
+   * This is necessary to avoid repeated lookups if <?php echo $clo ?> column is NULL.
+   * @var boolean
+   */
+   var $<?php echo $clo ?>_isLoaded = false;
+
+<?php 
+    } /* if ($col->isLazyLoad()) */
+  } /* foreach ($table->getColumns() as $col) */
+ 
+  foreach ($table->getColumns() as $col) 
+  {
+    $cfc=$col->getPhpName();
+    $clo=strtolower($col->getName());
+    $cptype = $col->getPhpNative();
+
+    $defaultValue = null;
+    if (($val = $col->getPhpDefaultValue()) !== null) {
+      settype($val, $cptype);
+      $defaultValue = var_export($val, true);
+    }
+    
+    if ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP)
+    {
+      // these default values are based on the Creole defaults
+      // the date and time default formats are locale-sensitive
+      if ($col->getType() === PropelTypes::DATE) {
+        $defaultfmt = '%x';
+      } elseif ($col->getType() === PropelTypes::TIME) {
+        $defaultfmt = '%X';
+      } elseif ($col->getType() === PropelTypes::TIMESTAMP) {
+        $defaultfmt = 'Y-m-d H:i:s';
+      }
+?>
+  /**
+  * Get the [optionally formatted] `<?php echo $cfc ?>` value.
+  * <?php echo $col->getDescription() ?> 
+  *
+  * @param string $format The date/time format string (either date()-style or strftime()-style).
+  *              If format is NULL, then the integer unix timestamp will be returned.
+  * @return mixed Formatted date/time value as string or integer unix timestamp (if format is NULL) on success,
+  *               PropelException, if unable to convert the date/time to timestamp.
+  */
+  function get<?php echo $cfc ?>($format = '<?php echo $defaultfmt ?>')
+  {
+<?php 
+      if ($col->isLazyLoad()) { 
+?>
+    if (! $this-><?php echo $clo ?>_isLoaded && $this-><?php echo $clo ?> === null && !$this->isNew()) {
+      if (($e = $this->load<?php echo $cfc ?>()) !== true) {
+        return $e;
+      }
+    }
+<?php
+      } /* if ($col->isLazyLoad) */ 
+?>
+    if ($this-><?php echo $clo ?> === null || $this-><?php echo $clo?> === '') {
+      return null;
+    } elseif (!is_int($this-><?php echo $clo ?>)) {
+      // a non-timestamp value was set externally, so we convert it
+      $ts = strtotime($this-><?php echo $clo ?>);
+      if ($ts === -1) {
+        return new PropelException(PROPEL_ERROR_INVALID, "Unable to parse value of <?php echo $clo ?> as date/time value: " . $this-><?php echo $clo ?>);
+      }
+    } else {
+      $ts = $this-><?php echo $clo ?>;
+    }
+    if ($format === null) {
+      return $ts;
+    } elseif (strpos($format, '%') !== false) {
+      return strftime($format, $ts);
+    } else {
+      return date($format, $ts);
+    }
+  }
+
+<?php 
+    } else { /* $col->getType() != DATE | TIME | TIMESTAMP */ 
+?>
+  /**
+  * Get the <?php echo $cfc ?> column value.
+  * <?php echo $col->getDescription() ?> 
+  *
+  * @return <?php echo $cptype ?> 
+  */
+  function get<?php echo $cfc ?>()
+  {
+<?php 
+      if ($col->isLazyLoad()) 
+      { 
+?>
+    if (! $this-><?php echo $clo ?>_isLoaded && $this-><?php echo $clo ?> === null && !$this->isNew()) {
+      if (($e = $this->load<?php echo $cfc ?>()) !== true) {
+        return $e;
+      }
+    }
+
+<?php 
+      } /* if $col->isLazyLoad */
+?>
+    return $this-><?php echo $clo ?>;
+  }
+<?php 
+    } /* $col->getType() != DATE | TIME | TIMESTAMP */
+?>
+
+<?php 
+    if ($col->isLazyLoad()) 
+    { 
+?>
+  /**
+  * Load the value for the [lazy-load] `<?php echo $clo ?>` column.
+  *
+  * This method performs an additional query to return the value for
+  * the `<?php echo $clo ?>` column, since it is not populated by
+  * the hydrate() method.
+  *
+  * @return void
+  * @returns mixed boolean TRUE on success, PropelException - any underlying error will be wrapped and re-thrown.
+  */
+  function load<?php echo $cfc ?>()
+  {
+    $c = $this->buildPkeyCriteria();
+    $c->addSelectColumn(<?php echo PeerBuilder::getColumnName($col, $table->getPhpName()) ?>());
+
+    $rs =& <?php echo $table->getPhpName()?>Peer::doSelectRS($c);
+
+    if (Propel::isError($e =& $rs) || Propel::isError($e = $rs->next())) {
+      return new PropelException(PROPEL_ERROR, "Error loading value for `<?php echo $clo ?>` column on demand.", $e);
+    }
+
+<?php
+      $affix = CreoleTypes::getAffix(CreoleTypes::getCreoleCode($col->getType()));                                    
+      $clo = strtolower($col->getName());
+      switch($col->getType()) 
+      {
+        case PropelTypes::DATE:                    
+        case PropelTypes::TIME:
+        case PropelTypes::TIMESTAMP:
+?>
+    $this-><?php echo $clo ?> = $rs->get<?php echo $affix ?>(1, null);
+<?php
+          break;
+        default:
+?>
+    $this-><?php echo $clo?> = $rs->get<?php echo $affix ?>(1);
+<?php   
+      } /* switch $col->getType */ 
+?>
+    if (Propel::isError($this-><?php echo $clo?>)) {
+      return new PropelException(PROPEL_ERROR, "Error loading value for `<?php echo $clo ?>` column on demand.", $this-><?php echo $clo?>);
+    }
+      
+    $this-><?php echo $clo ?>_isLoaded = true;
+
+    return true;
+  }
+
+<?php 
+    } /* if $col->isLazyLoad */ 
+
+    if (! $table->isReadOnly())
+    {
+      $throwsClause = "";
+      if ($complexObjectModel) 
+      {
+        if ($col->isForeignKey()) {
+          $throwsClause = "@throws PropelException";
+        }
+        if (count($col->getReferrers()) > 0 ) {
+          if ($throwsClause == "") {
+              $throwsClause = "@throws PropelException";
+          }
+        }
+      }
+      if ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) {
+        $throwsClause = "@throws PropelException - If passed [not-null] date/time is in an invalid format.";
+      }
+?>
+  /**
+  * Set the value of `<?php echo $cfc ?>`
+  * <?php echo $col->getDescription() ?> 
+  *
+  * @param <?php echo $cptype  ?> $v new value
+  * @return void
+  * <?php echo $throwsClause ?> 
+  */
+  function set<?php echo $cfc ?>($v)
+  {
+<?php 
+      if ($col->isLazyLoad()) 
+      { 
+?>
+    // explicitly set the is-loaded flag to true for this lazy load col; 
+    // it doesn't matter if the value is actually set or not (logic below) as
+    // any attempt to set the value means that no db lookup should be performed
+    // when the get<?php echo $cfc ?>() method is called. 
+    $this-><?php echo $clo ?>_isLoaded = true;
+<?php 
+      } /* if $col->isLazyLoad */ 
+  
+      if ($addSaveMethod) 
+      {
+        if ($col->isLob()) 
+        {
+          // Setting of LOB columns gets some special handling
+          if ($col->getPropelType() === PropelTypes::BLOB || $col->getPropelType() === PropelTypes::LONGVARBINARY ) {
+            $lobClass = "Blob";
+          } else {
+            $lobClass = "Clob";
+          }
+?>
+    // if the passed in parameter is the *same* object that
+    // is stored internally then we use the Lob->isModified()
+    // method to know whether contents changed.
+    if (is_a($v, 'Lob') && $v === $this-><?php echo $clo ?>) {
+      $changed = $v->isModified();
+    } else {
+      $changed = ($this-><?php echo $clo ?> !== $v);
+    }
+    if ($changed) {
+      if ( ! is_a($v, 'Lob') ) {
+        $obj = new <?php echo $lobClass ?>();
+        $obj->setContents($v);
+      } else {
+        $obj =& $v;
+      }
+      $this-><?php echo $clo ?> = $obj;
+      $this->modifiedColumns[] = <?php echo PeerBuilder::getColumnName($col, $table->getPhpName()) ?>();
+    }
+<?php
+        } 
+        elseif ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) 
+        {
+        // Setting a DATE/TIME value gets some special handling.
+?>
+    if ($v !== null && !is_int($v)) {
+      $ts = strtotime($v);
+      if ($ts === -1) {
+        return new PropelException(PROPEL_ERROR_INVALID, "Unable to parse date/time value for <?php echo $clo ?> from input: " . var_export($v, true));
+      }
+    } else {
+      $ts = $v;
+    }
+
+    if ($this-><?php echo $clo ?> !== $ts<?php if ($defaultValue !== null) { ?> || $ts === <?php echo $defaultValue ?><?php } ?>) {
+      $this-><?php echo $clo ?> = $ts;
+      $this->modifiedColumns[] = <?php echo PeerBuilder::getColumnName($col, $table->getPhpName()) ?>();
+    }
+<?php
+        } 
+        else 
+        { 
+          // NORMAL column
+?>
+    if ($this-><?php echo $clo ?> !== $v<?php if ($defaultValue !== null) { ?> || $v === <?php echo $defaultValue ?><?php } ?>) {
+      $this-><?php echo $clo ?> = $v;
+      $this->modifiedColumns[] = <?php echo PeerBuilder::getColumnName($col, $table->getPhpName()) ?>();
+    }
+
+<?php 
+        } /* end normal column */
+      } /* end $addSaveMethod */ 
+      else 
+      {
+?>
+      $this-><?php echo $clo ?> =& $v;
+
+<?php
+      } // if (addSaveMethod)
+  
+      if ($complexObjectModel) 
+      {
+        if ($col->isForeignKey()) 
+        {
+          $tblFK = $table->getDatabase()->getTable($col->getRelatedTableName());
+          $colFK = $tblFK->getColumn($col->getRelatedColumnName());
+          if ($col->isMultipleFK() || $col->getRelatedTableName() == $table->getName()) {
+            $relCol = "";
+            foreach ($col->getForeignKey()->getLocalColumns() as $columnName) {
+                $column = $table->getColumn($columnName);
+                $relCol .= $column->getPhpName();
+            }
+            if ($relCol != "") {
+                $relCol = "RelatedBy".$relCol;
+            }
+            $varName = "a".$tblFK->getPhpName() . $relCol;
+          } else {
+            $varName = "a".$tblFK->getPhpName();
+          }
+?>
+    if ($this-><?php echo $varName ?> !== null && $this-><?php echo $varName ?>->get<?php echo $colFK->getPhpName() ?>() !== $v) {
+      /*
+      * Save a reference to null instead of null directly as this would
+      * overwrite a previous stored <?php echo $tblFK->getPhpName() ?> object.
+      */
+      $this-><?php echo $varName ?> =& Propel::null();
+    }
+<?php
+        } /* if ($col->isForeignKey) */
+  
+        foreach ($col->getReferrers() as $fk) 
+        {
+          // used to be getLocalForeignMapping() which did not work.
+          $flmap = $fk->getForeignLocalMapping();
+          $fkColName = $flmap[$col->getName()];
+          $tblFK = $fk->getTable();
+          if ( $tblFK->getName() != $table->getName() ) 
+          {
+            $colFK = $tblFK->getColumn($fkColName);
+            if ($colFK->isMultipleFK()) {
+              $collName = "coll" . $tblFK->getPhpName() . "sRelatedBy" . $colFK->getPhpName();
+            } else {
+              $collName = "coll" . $tblFK->getPhpName() . "s";
+            }
+?>
+
+      // update associated <?php echo $tblFK->getPhpName() ?>
+
+      if ($this-><?php echo $collName ?> !== null) {
+          for ($i=0,$size=count($this-><?php echo $collName ?>); $i < $size; $i++) {
+              $this-><?php echo $collName ?>[$i]->set<?php echo $colFK->getPhpName()?>($v);
+          }
+      }
+<?php     
+          } /* if  $tblFk != $table */
+        } /* foreach referrers */
+      } /* if complex object model */ 
+?>
+  }
+
+<?php
+    } /* if ! $table->isReadOnly() */ 
+  } /* foreach ($table->getColumns() as $col) */ 
+?>
+  /**
+  * Hydrates (populates) the object variables with values from the database resultset.
+  *
+  * An offset (1-based "start column") is specified so that objects can be hydrated
+  * with a subset of the columns in the resultset rows.  This is needed, for example,
+  * for results of JOIN queries where the resultset row includes columns from two or
+  * more tables.
+  *
+  * @param ResultSet $rs The ResultSet class with cursor advanced to desired record pos.
+  * @param int $startcol 1-based offset column which indicates which restultset column to start with.
+  * @return int next starting column
+  * @throws PropelException  - Any caught Exception will be rewrapped as a PropelException.
+  */
+  function hydrate(&$rs, $startcol = 1)
+  {
+    assert('is_a($rs, "ResultSet")');
+
+<?php 
+  $n = 0;
+  foreach($table->getColumns() as $col) 
+  {
+    if (! $col->isLazyLoad())
+    {
+      $affix = CreoleTypes::getAffix(CreoleTypes::getCreoleCode($col->getType()));                                    
+      $clo = strtolower($col->getName());
+      switch($col->getType()) 
+      {
+        case PropelTypes::DATE:                    
+        case PropelTypes::TIME:
+        case PropelTypes::TIMESTAMP:
+?>
+    if (Creole::isError($value = $rs->get<?php echo $affix ?>($startcol + <?php echo $n ?>, null))) {
+      return new PropelException(PROPEL_ERROR_DB, "Error populating <?php echo $table->getPhpName()?> object", $value);
+    }
+    
+    $this-><?php echo $clo ?> = $value;
+<?php
+          break;
+        default:
+?>
+    if (Creole::isError($value = $rs->get<?php echo $affix ?>($startcol + <?php echo $n ?>))) {
+      return new PropelException(PROPEL_ERROR_DB, "Error populating object", $value);
+    }
+
+    $this-><?php echo $clo?> = $value;
+<?php
+      } /* switch */
+      $n++;
+    } /* if ! $col->isLazyLoad() */
+  } /* foreach ($table->getColumns() as $col) */
+
+  if ($addSaveMethod) 
+  { 
+?>
+    $this->resetModified();
+<?php 
+  } /* if ($addSaveMethod) */
+?>
+    $this->setNew(false);
+    return $startcol + <?php echo $n; ?>;
+  }
+    
+  /**
+  * Builds a Criteria object containing the primary key for this object.
+  *
+  * Unlike buildCriteria() this method includes the primary key values regardless
+  * of whether or not they have been modified.
+  * 
+  * @return Criteria The Criteria object containing value(s) for primary key(s).
+  */
+  function &buildPkeyCriteria()
+  {        
+    $criteria = new Criteria(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+<?php
+  foreach ($table->getColumns() as $col) 
+  {
+    $clo = strtolower($col->getName());
+    if ($col->isPrimaryKey()) 
+    { 
+?>
+    $criteria->add(<?php echo PeerBuilder::getColumnName($col, $table->getPhpName()) ?>(), $this-><?php echo $clo ?>);
+<?php
+    } /* if $col->isPrimaryKey */
+  } /* foreach ($table->getColumns() as $col) */
+?>
+    return $criteria;
+  }
+    
+  /**
+  * Build a Criteria object containing the values of all modified columns in this object.
+  *
+  * @return Criteria The Criteria object containing all modified values.
+  */
+  function &buildCriteria()
+  {        
+    $criteria = new Criteria(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+
+<?php
+  foreach ($table->getColumns() as $col) 
+  {
+    $clo = strtolower($col->getName());
+?>
+    if ($this->isColumnModified(<?php echo PeerBuilder::getColumnName($col, $table->getPhpName()) ?>())) { 
+      $criteria->add(<?php echo PeerBuilder::getColumnName($col, $table->getPhpName()) ?>(), $this-><?php echo $clo ?>);
+    }
+
+<?php
+  } /* foreach */
+?>
+    return $criteria;
+  }
+    
+<?php 
+} /* if !table->isAlias */ 
+
+// association code
+if ($complexObjectModel) 
+{
+  $pVars = array();  // Array of object set method names for later reference.
+  $aVars = array();  // Array of object field names for later reference.
+
+  foreach ($table->getForeignKeys() as $fk)
+  {
+    $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+    $className = $tblFK->getPhpName();
+
+    $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package);
+    $tblFKPackagePath = strtr($tblFKPackage, '.', '/');
+    if ($tblFKPackagePath != "") {
+        $tblFKPackagePath .= '/';
+    }
+
+    $relCol = "";
+    foreach ($fk->getLocalColumns() as $columnName) {
+      $column = $table->getColumn($columnName);
+      if ($column->isMultipleFK() || $fk->getForeignTableName() == $table->getName()) {
+        $relCol .= $column->getPhpName();
+      }
+    }
+
+    if ($relCol != "") {
+      $relCol = "RelatedBy" . $relCol;
+    }
+
+    $pVarName = $className . $relCol;
+    $varName = "a" . $pVarName;
+    $retVal = ($pVars[] = $pVarName);
+    $retVal = ($aVars[] = $varName);
+?>
+  /**
+  * @var <?php echo $className ?>
+  */
+  var $<?php echo $varName ?>;
+
+  /**
+  * Declares an association between this object and a <?php echo $className ?> object
+  *
+  * @param <?php echo $className ?> $v
+  * @return void
+  * @throws PropelException
+  */
+  function set<?php echo $pVarName ?>(&$v)
+  {
+<?php
+    foreach ($fk->getLocalColumns() as $columnName) 
+    {
+      $column = $table->getColumn($columnName);
+      $lfmap = $fk->getLocalForeignMapping();
+      $colFKName = $lfmap[$columnName];
+      $colFK = $tblFK->getColumn($colFKName);
+?>
+    if ($v === null) {
+      $this->set<?php echo $column->getPhpName() ?>(<?php echo var_export($column->getPhpDefaultValue()) ?>);
+    } else {
+      $this->set<?php echo $column->getPhpName() ?>($v->get<?php echo $colFK->getPhpName() ?>());
+    }
+
+<?php 
+    } /* foreach local col */ 
+?>
+    $this-><?php echo $varName ?> =& $v;
+  }
+
+<?php
+    $and = "";
+    $comma = "";
+    $conditional = "";
+    $arglist = "";
+    $argsize = 0;
+    foreach ($fk->getLocalColumns() as $columnName) 
+    {
+      $column = $table->getColumn($columnName);
+      $cptype = $column->getPhpNative();
+      $clo = strtolower($column->getName());
+      if ($cptype == "integer" || $cptype == "float" || $cptype == "double") {
+        $conditional .= $and . "\$this->". $clo ." > 0";
+      } elseif($cptype == "string") {
+        $conditional .= $and . "(\$this->" . $clo ." !== \"\" && \$this->".$clo." !== null)";
+      } else {
+        $conditional .= $and . "\$this->" . $clo ." !== null";
+      }
+      $arglist .= $comma . "\$this->" . $clo;
+      $and = " && ";
+      $comma = ", ";
+      $argsize = $argsize + 1;
+    }
+
+    $pCollName = $table->getPhpName() . 's' . $relCol;
+?>
+  /**
+  * Get the associated <?php echo $className ?> object
+  *
+  * @return <?php echo $className ?> The associated <?php echo $className ?> object.
+  * @throws PropelException
+  */
+  function & get<?php echo $pVarName ?>()
+  {
+    // include the Peer class
+    include_once '<?php echo $tblFKPackagePath . $className ?>Peer.php';
+
+    if ($this-><?php echo $varName ?> === null && (<?php echo $conditional ?>))
+    {
+<?php
+    if ($tblFK->isAlias()) 
+    {
+      if ($argsize > 1) {
+?>
+      $<?php echo $varName ?> =& <?php echo $className ?>Peer::retrieve<?php echo $className ?>ByPK(<?php echo $arglist ?>);
+<?php
+      } else { 
+?>
+      $<?php echo $varName ?> =& <?php echo $className ?>Peer::retrieve<?php echo $className ?>ByPK(<?php echo $arglist ?>);
+<?php    
+      } /* if ($argsize > 1) */
+    } 
+    else 
+    {
+      if ($argsize > 1) {
+?>
+      $<?php echo $varName ?> =& <?php echo $className ?>Peer::retrieveByPK(<?php echo $arglist ?>);
+<?php
+      } else { 
+?>
+      $<?php echo $varName ?> =& <?php echo $className ?>Peer::retrieveByPK(<?php echo $arglist ?>);
+<?php 
+      }
+    } // if tblFK->isAlias
+?>
+      if (Propel::isError($<?php echo $varName ?>)) { return $<?php echo $varName ?>; }
+
+      $this-><?php echo $varName ?> =& $<?php echo $varName ?>;
+
+      /* The following can be used instead of the line above to
+         guarantee the related object contains a reference
+         to this object, but this level of coupling
+         may be undesirable in many circumstances.
+         As it can lead to a db query with many results that may
+         never be used.
+         $obj = <?php echo $className ?>Peer::retrieveByPK(<?php echo $arglist ?>);
+         $obj->add<?php echo $pCollName ?>($this);
+       */
+    }
+
+    return $this-><?php echo $varName ?>;
+  }
+
+  /**
+  * Provides convenient way to set a relationship based on a
+  * key.  e.g.
+  * <code>$bar->setFooKey($foo->getPrimaryKey())</code>
+  *
+<?php 
+    if (count($fk->getLocalColumns()) > 1) { 
+?>
+  * Note: It is important that the xml schema used to create this class
+  * maintains consistency in the order of related columns between
+  * <?php echo $table->getName() ?> and <?php echo $tblFK->getName() ?>.
+  * If for some reason this is impossible, this method should be
+  * overridden in <code><?php echo $table->getPhpName() ?></code>.
+<?php 
+    } 
+?>
+  * @return void
+  * @throws PropelException
+  */
+  function set<?php echo $pVarName ?>Key($key)
+  {
+<?php 
+    if (count($fk->getLocalColumns()) > 1) 
+    {
+      $i = 0;
+      foreach ($fk->getLocalColumns() as $colName) 
+      {
+        $col = $table->getColumn($colName);
+        $fktype = $col->getPhpNative();
+?>
+    $this->set<?php echo $col->getPhpName() ?>( (<?php echo $fktype ?>) $key[<?php echo $i ?>] );
+<?php
+        $i++;
+      } /* foreach */
+    } else {
+      $lcols = $fk->getLocalColumns();
+      $colName = $lcols[0];
+      $col = $table->getColumn($colName);
+      $fktype = $col->getPhpNative();
+?>
+    $this->set<?php echo $col->getPhpName() ?>( (<?php echo $fktype ?>) $key);
+<?php 
+    } 
+?>
+  }
+
+<?php 
+  } /*  end of foreach loop over foreign keys */
+
+  //
+  // setup foreign key associations
+  //
+  foreach ($table->getReferrers() as $fk) 
+  {
+    $tblFK = $fk->getTable();
+    $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package);
+    $tblFKPackagePath = strtr($tblFKPackage, '.', '/');
+    if ($tblFKPackagePath != "") {
+        $tblFKPackagePath .= '/';
+    }
+
+    $className = $tblFK->getPhpName();
+    $relatedByCol = "";
+    foreach ($fk->getLocalColumns() as $columnName) {
+      $column = $tblFK->getColumn($columnName);
+      if ($column->isMultipleFK() || $tblFK->getName() == $table->getName()) {
+        // if there are seeral foreign keys that point to the same table
+        // then we need to generate methods like getAuthorRelatedByColName()
+        // instead of just getAuthor().  Currently we are doing the same
+        // for self-referential foreign keys, to avoid confusion.
+        $relatedByCol .= $column->getPhpName();
+      }
+    }
+
+    if ($relatedByCol == "") {
+      $suffix = "";
+      $relCol = $className . "s";
+      $relColMs = $className;
+    } else {
+      $suffix = "RelatedBy" . $relatedByCol;
+      $relCol= $className . "sRelatedBy" . $relatedByCol;
+      $relColMs= $className . "RelatedBy" . $relatedByCol;
+    }
+    $collName = "coll" . $relCol;
+?>
+  /**
+  * Collection to store aggregation of <?php echo $collName ?>
+  * @var array
+  */
+  var $<?php echo $collName ?>;
+
+  /**
+  * Temporary storage of <?php echo $collName ?> to save a possible db hit in
+  * the event objects are add to the collection, but the
+  * complete collection is never requested.
+  * @return void
+  */
+  function init<?php echo $relCol ?>()
+  {
+    if ($this-><?php echo $collName ?> === null) {
+      $this-><?php echo $collName ?> = array();
+    }
+  }
+
+  /**
+  * Method called to associate a <?php echo $tblFK->getPhpName() ?> object to this object
+  * through the <?php echo $className ?> foreign key attribute
+  *
+  * @param <?php echo $className ?> $l $className
+  * @return void
+  * @throws PropelException
+  */
+  function add<?php echo $relColMs ?>(/*<?php echo $className ?>*/ &$l)
+  {
+    $this-><?php echo $collName ?>[] =& $l;
+    $l->set<?php echo $table->getPhpName() . $suffix ?>($this);
+  }
+
+  /**
+  * The criteria used to select the current contents of <?php echo $collName ?>.
+  * @var Criteria
+  */
+  var $last<?php echo $relCol ?>Criteria = null;
+
+	/**
+	 * Returns the number of related <?php echo $relCol ?>
+	 *
+	 * @param Criteria $criteria
+	 * @param boolean $distinct
+	 * @throws PropelException
+	 */
+	function count<?php echo $relCol ?>($criteria = null, $distinct = false)
+	{
+		// include the Peer class
+		include_once '<?php echo $tblFKPackagePath . $className ?>Peer.php';
+		if ($criteria === null) {
+			$criteria = new Criteria();
+		}
+<?php
+	foreach ($fk->getForeignColumns() as $columnName) {
+		$column = $table->getColumn($columnName);
+		// used to be getLocalForeignMapping() but that didn't seem to work
+		// (maybe a problem in translation of HashTable code to PHP).
+		$flmap = $fk->getForeignLocalMapping();
+		$colFKName = $flmap[$columnName];
+		$colFK = $tblFK->getColumn($colFKName);
+?>
+		$criteria->add(<?php echo PeerBuilder::getColumnName($colFK, $className) ?>(), $this->get<?php echo $column->getPhpName() ?>() );
+<?php
+	} // end foreach ($fk->getForeignColumns()
+?>
+		return <?php echo $className ?>Peer::doCount($criteria, $distinct);
+	}
+
+  /**
+  * If this collection has already been initialized with
+  * an identical criteria, it returns the collection.
+  * Otherwise if this <?php echo $table->getPhpName() ?> has previously
+  * been saved, it will retrieve related ${relCol} from storage.
+  * If this <?php echo $table->getPhpName() ?> is new, it will return
+  * an empty collection or the current collection, the criteria
+  * is ignored on a new object.
+  *
+  * @param Criteria $criteria
+  * @throws PropelException
+  */
+  function & get<?php echo $relCol ?>($criteria = null)
+  {
+    // include the Peer class
+    include_once '<?php echo $tblFKPackagePath . $className ?>Peer.php';
+
+    if ($criteria === null) {
+      $criteria = new Criteria();
+    }
+
+    if ($this-><?php echo $collName ?> === null)
+    {
+      if ($this->isNew()) {
+        $this-><?php echo $collName ?> = array();
+      } else {
+<?php
+    foreach ($fk->getForeignColumns() as $columnName)
+    {
+      $column = $table->getColumn($columnName);
+      // used to be getLocalForeignMapping() but that didn't seem to work
+      // (maybe a problem in translation of HashTable code to PHP).
+      $flmap = $fk->getForeignLocalMapping();
+      $colFKName = $flmap[$columnName];
+      $colFK = $tblFK->getColumn($colFKName);
+?>
+        $criteria->add(<?php echo PeerBuilder::getColumnName($colFK, $className) ?>(), $this->get<?php echo $column->getPhpName() ?>() );
+<?php 
+    } /* end foreach ($fk->getForeignColumns()) */
+?>
+
+        $<?php echo $collName ?> =& <?php echo $className ?>Peer::doSelect($criteria);
+        if (Propel::isError($<?php echo $collName ?>)) { return $<?php echo $collName ?>; }
+
+        $this-><?php echo $collName ?> =& $<?php echo $collName ?>;
+      }
+    } else {
+      // criteria has no effect for a new object
+      if (!$this->isNew())
+      {
+        // the following code is to determine if a new query is
+        // called for.  If the criteria is the same as the last
+        // one, just return the collection.
+<?php
+    foreach ($fk->getForeignColumns() as $columnName)
+    {
+      $column = $table->getColumn($columnName);
+      $flmap = $fk->getForeignLocalMapping();
+      $colFKName = $flmap[$columnName];
+      $colFK = $tblFK->getColumn($colFKName);
+?>
+        $criteria->add(<?php echo PeerBuilder::getColumnName($colFK, $className) ?>(), $this->get<?php echo $column->getPhpName() ?>());
+
+<?php 
+    } /* end foreach ($fk->getForeignColumns()) */
+?>
+        if (!isset($this->last<?php echo $relCol ?>Criteria) || !$this->last<?php echo $relCol ?>Criteria->equals($criteria))
+        {
+          $<?php echo $collName ?> =& <?php echo $className ?>Peer::doSelect($criteria);
+          if (Propel::isError($<?php echo $collName ?>)) { return $<?php echo $collName ?>; }
+
+          $this-><?php echo $collName ?> =& $<?php echo $collName ?>;
+        }
+      }
+    }
+
+    $this->last<?php echo $relCol ?>Criteria = $criteria;
+
+    return $this-><?php echo $collName ?>;
+  }
+
+<?php
+    $countFK = 0;
+    foreach ($tblFK->getForeignKeys() as $dummyFK) {
+      $countFK = $countFK + 1;
+    }
+
+// ------------------------------------------------------------
+//
+    if ($countFK >= 1)
+    {
+      $lastTable = "";
+      foreach ($tblFK->getForeignKeys() as $fk2)
+      {
+        // Add join methods if the fk2 table is not this table or
+        // the fk2 table references this table multiple times.
+
+        $doJoinGet = true;
+        if ( $fk2->getForeignTableName() == $table->getName() ) {
+          $doJoinGet = false;
+        }
+
+        foreach ($fk2->getLocalColumns() as $columnName) {
+          $column = $tblFK->getColumn($columnName);
+          if ($column->isMultipleFK()) {
+            $doJoinGet = true;
+          }
+        }
+
+        $tblFK2 = $table->getDatabase()->getTable($fk2->getForeignTableName());
+        $doJoinGet = !$tblFK2->isForReferenceOnly();
+        $relatedByCol2 = "";
+        foreach ($fk2->getLocalColumns() as $columnName) {
+          $column = $tblFK->getColumn($columnName);
+          if ($column->isMultipleFK()) {
+            $relatedByCol2 .= $column->getPhpName();
+          }
+        }
+
+        $fkClassName = $tblFK2->getPhpName();
+
+        // do not generate code for self-referencing fk's, it would be
+        // good to do, but it is just not implemented yet.
+        if ($className == $fkClassName) {
+          // $doJoinGet = false;  -- SELF REFERENCING FKs UNDER TESTING
+        }
+
+        if ($relatedByCol2 == "") {
+          $relCol2 = $fkClassName;
+        } else {
+          $relCol2 = $fkClassName . "RelatedBy". $relatedByCol2;
+        }
+
+        if ( $relatedByCol == "") {
+          // nothing?
+        } else {
+          if ( $relatedByCol == $relatedByCol2 ) {
+            $doJoinGet = false;
+          }
+        }
+
+        if ($doJoinGet)
+        {
+?>
+  /**
+  * If this collection has already been initialized with
+  * an identical criteria, it returns the collection.
+  * Otherwise if this <?php echo $table->getPhpName() ?> is new, it will return
+  * an empty collection; or if this <?php echo $table->getPhpName() ?> has previously
+  * been saved, it will retrieve related <?php echo $relCol ?> from storage.
+  *
+  * This method is protected by default in order to keep the public
+  * api reasonable.  You can provide public methods for those you
+  * actually need in <?php echo $table->getPhpName() ?>.
+  */
+  function & get<?php echo $relCol ?>Join<?php echo $relCol2 ?>($criteria = null)
+  {
+    // include the Peer class
+    include_once '<?php echo $tblFKPackagePath . $className ?>Peer.php';
+
+    if ($criteria === null) {
+      $criteria = new Criteria();
+    }
+    
+    if ($this-><?php echo $collName ?> === null) {
+      if ($this->isNew()) {
+         $this-><?php echo $collName ?> = array();
+      } else {
+<?php 
+          foreach ($fk->getForeignColumns() as $columnName)
+          {
+            $column = $table->getColumn($columnName);
+            $flMap = $fk->getForeignLocalMapping();
+            $colFKName = $flMap[$columnName];
+            $colFK = $tblFK->getColumn($colFKName);
+?>
+        $criteria->add(<?php echo PeerBuilder::getColumnName($colFK, $className) ?>(), $this->get<?php echo $column->getPhpName() ?>());
+<?php 
+          } /* end foreach ($fk->getForeignColumns()) */
+?>
+
+        $<?php echo $collName ?> =& <?php echo $className ?>Peer::doSelectJoin<?php echo $relCol2 ?>($criteria);
+        if (Propel::isError($<?php echo $collName ?>)) { return $<?php echo $collName ?>; }
+
+        $this-><?php echo $collName ?> =& $<?php echo $collName ?>;
+      }
+    } else {
+      // the following code is to determine if a new query is
+      // called for.  If the criteria is the same as the last
+      // one, just return the collection.
+<?php
+          foreach ($fk->getForeignColumns() as $columnName)
+          {
+            $column = $table->getColumn($columnName);
+            $flMap = $fk->getForeignLocalMapping();
+            $colFKName = $flMap[$columnName];
+            $colFK = $tblFK->getColumn($colFKName);
+?>
+      $criteria->add(<?php echo PeerBuilder::getColumnName($colFK, $className) ?>(), $this->get<?php echo $column->getPhpName() ?>());
+
+<?php 
+          } /* end foreach ($fk->getForeignColumns()) */
+?>
+      if (!isset($this->last<?php echo $relCol ?>Criteria) || !$this->last<?php echo $relCol ?>Criteria->equals($criteria))
+      {
+        $<?php echo $collName ?> =& <?php echo $className ?>Peer::doSelectJoin<?php echo $relCol2 ?>($criteria);
+        if (Propel::isError($<?php echo $collName ?>)) { return $<?php echo $collName ?>; }
+
+        $this-><?php echo $collName ?> =& $<?php echo $collName ?>;
+      }
+    }
+    $this->last<?php echo $relCol ?>Criteria = $criteria;
+
+    return $this-><?php echo $collName ?>;
+  }
+  
+<?php 
+        } /* end if($doJoinGet) */
+      } /* end foreach ($tblFK->getForeignKeys() as $fk2) {*/
+    } /* if countFK >= 1 */
+  } /*ends foreach over table->getReferrers() */
+} /* the if(complexObjectModel) */
+
+//
+// add GenericAccessors or GenericMutators?
+//
+if (!$table->isAlias() && ($addGenericAccessors || ($addGenericMutators && !$table->isReadOnly())))
+{
+	$tableColumns = $table->getColumns();
+	$tablePhpname = $table->getPhpName();
+?>
+  /**
+   * Generate a list of field names.
+   *
+   * @return array A list of field names
+   */
+  function & getFieldNames($type = TYPE_FIELDNAME)
+  {
+    static $fieldNames = array(
+      TYPE_PHPNAME => array (<?php foreach ($tableColumns as $col) { ?>'<?php echo $col->getPhpName(); ?>', <?php } ?>),
+      TYPE_COLNAME => array (<?php foreach ($tableColumns as $col) { ?>'<?php echo $table->getName() . '.' . strtoupper($col->getName()) ?>', <?php } ?>),
+      TYPE_FIELDNAME => array (<?php foreach ($tableColumns as $col) { ?>'<?php echo $col->getName(); ?>', <?php } ?>),
+      TYPE_NUM => array (<?php foreach ($tableColumns as $num => $col) { echo $num; ?>, <?php } ?>)
+    );
+	
+    if (!isset($fieldNames[$type])) {
+      return new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM. ' . $type . ' was given.');
+    }
+	
+    return $fieldNames[$type];
+  }
+  
+  /**
+   * Translates a fieldname to another type
+   *
+   * @param string $name field name
+   * @param string $fromType One of the class type constants TYPE_PHPNAME,
+   *                         TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM
+   * @param string $toType   One of the class type constants
+   * @return string translated name of the field.
+   */
+  function translateFieldName($name, $fromType, $toType)
+  {
+    static $fieldKeys = array (
+      TYPE_PHPNAME => array (<?php foreach ($tableColumns as $num => $col) { ?>'<?php echo $col->getPhpName(); ?>' => <?php echo $num; ?>, <?php } ?>),
+      TYPE_COLNAME => array (<?php foreach ($tableColumns as $num => $col) { ?>'<?php echo $table->getName() . '.' . strtoupper($col->getName()) ?>' => <?php echo $num; ?>, <?php } ?>),
+      TYPE_FIELDNAME => array (<?php foreach ($tableColumns as $num => $col) { ?>'<?php echo $col->getName(); ?>' => <?php echo $num; ?>, <?php } ?>),
+      TYPE_NUM => array (<?php foreach ($tableColumns as $num => $col) { echo $num; ?>, <?php } ?>)
+    );
+
+    $toNames =& $this->getFieldNames($toType);
+    $key = $fieldKeys[$fromType][$name];
+	
+    if ($key === false) {
+      return new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r($fromNames, true));
+    }
+	
+    return $toNames[$key];
+  }
+<?php if ($addGenericAccessors) { ?>
+
+  /**
+   * Retrieves a field from the object by name passed in as a string.
+   *
+   * @param string $name name
+   * @param string $type The type of fieldname the $name is of:
+   *                     one of the class type constants TYPE_PHPNAME,
+   *                     TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM
+   * @return mixed Value of field.
+   */
+  function & getByName($name, $type = TYPE_COLNAME)
+  {
+    $pos = $this->translateFieldName($name, $type, TYPE_NUM);
+    return $this->getByPosition($pos);
+  }
+
+  /**
+   * Retrieves a field from the object by Position as specified
+   * in the xml schema.  Zero-based.
+   *
+   * @param int $pos position in xml schema
+   * @return mixed Value of field at $pos
+   */
+  function & getByPosition($pos)
+  {
+    switch($pos) 
+    {
+<?php
+      $i = 0;
+      foreach ($table->getColumns() as $col) 
+      {
+        $cfc = $col->getPhpName();
+        $cptype = $col->getPhpNative();// not safe to use it because some methods may return objects (Blob)
+?>
+      case <?php echo $i ?>:
+        return $this->get<?php echo $cfc ?>();
+        break;
+<?php
+        $i++;
+      } /* foreach */
+?>
+      default:
+        return null;
+    } // switch()
+  }
+
+  /**
+   * Exports the object as an array.
+   *
+   * You can specify the key type of the array by passing one of the class
+   * type constants.
+   *
+   * @param string $keyType One of the class type constants TYPE_PHPNAME,
+   *                        TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM
+   * @return an associative array containing the field names (as keys) and field values
+   */
+  function & toArray($keyType = TYPE_PHPNAME)
+  {
+    $keys =& $this->getFieldNames($keyType);
+    $result = array(
+<?php
+	  foreach ($table->getColumns() as $num => $col) {
+?>
+      $keys[<?php echo $num ?>] => $this->get<?php echo $col->getPhpName() ?>(),
+<?php
+	  } /* foreach */
+?>
+    );
+    return $result;
+  }
+
+<?php } /* ends the if($addGenericAccessors) */ ?>
+
+
+<?php if ($addGenericMutators && !$table->isReadOnly()) { ?>
+
+  /**
+   * Sets a field value from the object by name passed in as a string.
+   *
+   * @param string $name peer name
+   * @param mixed $value field value
+   * @param string $type The type of fieldname the $name is of:
+   *                     one of the class type constants TYPE_PHPNAME,
+   *                     TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM
+   * @return void
+   */
+  function setByName($name, &$value, $type = TYPE_COLNAME)
+  {
+    $names =& $this->getFieldnames($type);
+    $pos = array_search($name, $names);
+    return $this->setByPosition($pos, $value);
+  }
+  
+  /**
+   * Sets a field from the object by Position as specified
+   * in the xml schema.  Zero-based.
+   *
+   * @param int $pos position in xml schema
+   * @param mixed $value field value
+   * @return void
+   */
+  function setByPosition($pos, &$value)
+  {
+    switch($pos) 
+    {
+<?php
+    $i = 0;
+    foreach ($table->getColumns() as $col) 
+    {
+      $cfc = $col->getPhpName();
+      $cptype = $col->getPhpNative();
+?>
+      case <?php echo $i ?>:
+          $this->set<?php echo $cfc ?>($value);
+          break;
+<?php
+      $i++;
+    } /* foreach */
+?>
+    } // switch()
+  }
+
+  /**
+   * Populates the object using an array.
+   *
+   * This is particularly useful when populating an object from one of the
+   * request arrays (e.g. $_POST).  This method goes through the column
+   * names, checking to see whether a matching key exists in populated
+   * array. If so the setByName() method is called for that column.
+   *
+   * You can specify the key type of the array by additionally passing one
+   * of the class type constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME,
+   * TYPE_NUM. The default key type is the (peer) column name (e.g.
+   * 'book.AUTHOR_ID')
+   *
+   * @param array  $arr     An array to populate the object from.
+   * @param string $keyType The type of keys the array uses.
+   * @return void
+   */
+  function fromArray(&$arr, $keyType = TYPE_COLNAME)
+  {
+    $keys =& $this->getFieldNames($keyType);
+<?php
+    foreach ($table->getColumns() as $num => $col) {
+	  $cfc = $col->getPhpName();
+	  $cptype = $col->getPhpNative();
+?>
+    if (array_key_exists($keys[<?php echo $num ?>], $arr)) $this->set<?php echo $cfc ?>($arr[$keys[<?php echo $num ?>]]);
+<?php
+    } /* foreach */
+?>
+  }
+
+<?php } /* ends the if($addGenericMutators) */
+    } /* ends the if($addGenericAccessors || $addGenericMutators) */
+?>
+
+<?php if (! $table->isAlias() && isset($addSaveMethod) && $addSaveMethod && ! $table->isReadOnly()) { ?>
+
+  /**
+  * Removes this object from datastore and sets delete attribute.
+  *
+  * @return mixed TRUE on success, PropelException on failure.
+  * @throws PropelException
+  * @see BaseObject::setDeleted()
+  * @see BaseObject::isDeleted()
+  */
+  function delete()
+  {
+    if ($this->isDeleted()) {
+      return new PropelException(PROPEL_ERROR, "This object has already been deleted.");
+    }
+
+    $con =& Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+    if (Propel::isError($con)) { return $con; }
+
+    $e = $con->begin();
+    if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+
+    $e = <?php echo $table->getPhpName() ?>Peer::doDelete($this, Param::set($con));
+    if (Propel::isError($e)) { $con->rollback(); return $e; }
+
+    $this->setDeleted(true);
+
+    $e = $con->commit();
+    if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+
+    return true;
+  }
+
+<?php
+  if ($complexObjectModel) 
+  { 
+?>
+
+  /**
+  * flag to prevent endless save loop, if this object is referenced
+  * by another object which falls in this transaction.
+  * @var boolean
+  */
+  var $alreadyInSave = false;
+
+  /**
+  * Stores the object in the database.  If the object is new,
+  * it inserts it; otherwise an update is performed.  This method
+  * wraps the doSave() worker method in a transaction.
+  *
+  * @return mixed TRUE on success, PropelException on failure.
+  */
+  function save()
+  {
+    if ($this->isDeleted()) {
+      return new PropelException(PROPEL_ERROR, "You cannot save an object that has been deleted.");
+    }
+
+    $con =& Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+    if (Propel::isError($con)) { return $con; }
+
+    $e = $con->begin();
+    if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+
+    $e = $this->doSave(Param::set($con));
+    if (Propel::isError($e)) { $con->rollback(); return $e; }
+
+    $e = $con->commit();
+    if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+
+    return true;
+  }
+<?php 
+  } /* if($complexObjectModel) */ 
+?>
+
+  /**
+  * Stores the object in the database.  If the object is new,
+  * it inserts it; otherwise an update is performed.
+  *
+  * @return void
+  * @throws PropelException
+  */
+<?php 
+  if ($complexObjectModel) 
+  { 
+?>
+  function doSave($con = null)
+<?php 
+  } else { 
+?>
+  function save()
+<?php 
+  }
+?>
+  {
+<?php 
+  if(! $complexObjectModel) 
+  { 
+?>    if ($this->isDeleted()) {
+      return new PropelException(PROPEL_ERROR, "You cannot save an object that has been deleted.");
+    }
+
+    $con =& Propel::getConnection(<?php echo $basePrefix . $table->getPhpName() ?>Peer::DATABASE_NAME());
+    if (Propel::isError($con)) { return $con; }
+
+<?php 
+  }
+
+  if ($complexObjectModel) 
+  { 
+?>
+    /* [MA] temporarily check */
+    Propel::assertParam($con, '<?php echo $table->getPhpName(); ?>', 'save', 1);
+
+    if (! $this->alreadyInSave) {
+      $this->alreadyInSave = true;
+
+<?php 
+    if ( ! empty($pVars)) 
+    { 
+?>
+      // We call the save method on the following object(s) if they
+      // were passed to this object by their coresponding set
+      // method.  This object relates to these object(s) by a
+      // foreign key reference.
+<?php
+      for($i=0,$_i=count($aVars); $i < $_i; $i++) 
+      {
+        $aVarName = $aVars[$i];
+?>
+      if ($this-><?php echo $aVarName ?> !== null) {
+        if ($this-><?php echo $aVarName ?>->isModified()) {
+          if (Propel::isError($e = $this-><?php echo $aVarName ?>->save())) {
+              return $e;
+          }
+        }
+        $this->set<?php echo $pVars[$i] ?>($this-><?php echo $aVarName ?>);
+      }
+
+<?php 
+      } /* foreach */ 
+    } /* if count(pVars) */ 
+  } /* if complexObjectMode */ 
+?>
+      // If this object has been modified, then save it to the database.
+      if ($this->isModified()) {
+        if ($this->isNew()) {
+          $pk = <?php echo $table->getPhpName() ?>Peer::doInsert($this, <?php if($complexObjectModel) {?>$con<?php } else { ?>Param::set($con)<?php } ?>);
+          if (Propel::isError($pk)) { return $pk; }
+<?php 
+  if ($table->getIdMethod() != "none") {
+    if (count($pks = $table->getPrimaryKey())) {
+      foreach ($pks as $pk) {
+        if ($pk->isAutoIncrement()) {
+?>
+          $this->set<?php echo $pk->getPhpName();?>( $pk );  //[IMV] update autoincrement primary key
+<?php
+        }
+      }
+    }
+  }
+?>
+          $this->setNew(false);
+        }
+        else {
+          $e = <?php echo $table->getPhpName() ?>Peer::doUpdate($this, <?php if($complexObjectModel) {?>$con<?php } else { ?>Param::set($con)<?php } ?>);
+          if (Propel::isError($e)) { return $e; }
+        }
+        $this->resetModified(); // [HL] After being saved an object is no longer 'modified'
+      }
+
+<?php
+  if ($complexObjectModel) 
+  {
+    foreach ($table->getReferrers() as $fk) 
+    {
+      $tblFK = $fk->getTable();
+      if ( $tblFK->getName() != $table->getName() ) 
+      {
+        $className = $tblFK->getPhpName();
+        $relCol = "";
+        foreach ($fk->getLocalColumns() as $columnName) {
+          $column = $tblFK->getColumn($columnName);
+          if ($column->isMultipleFK()) {
+            $relCol .= $column->getPhpName();
+          }
+        }
+  
+        if ($relCol == "") {
+          $relCol = $className . "s";
+        } else {
+          $relCol = $className . "sRelatedBy" . $relCol;
+        }
+  
+        $collName = "coll" . $relCol;
+?>
+      if ($this-><?php echo $collName ?> !== null) {
+        for ($i=0,$size=count($this-><?php echo $collName ?>); $i < $size; $i++) {
+          if (Propel::isError($e = $this-><?php echo $collName ?>[$i]->save())) {
+            return $e;
+          }
+        }
+      }
+
+<?php
+      } /* if tableFK !+ table */
+    } /* foreach getReferrers() */
+  } /* if complexObjectModel */
+
+  if ($complexObjectModel) 
+  { 
+?>
+      $this->alreadyInSave = false;
+    }
+
+<?php 
+  } /* if ($complexObjectModel) */
+?>
+    return true;
+  }
+
+<?php 
+} /* if !table->isAlias && isset .... */ 
+
+if (! $table->isAlias() && ! $table->isReadOnly()) 
+{ 
+?>
+  /**
+  * Validates the objects modified field values.
+<?php 
+  if ($complexObjectModel) 
+  {
+?>
+  * This includes all objects related to this table.
+<?php 
+  } /* if ($complexObjectModel) */
+?>
+  *
+  * If $columns is either a column name or an array of column names
+  * only those columns are validated.
+  *
+  * @param mixed $columns Column name or an array of column names.
+  *
+  * @return mixed <code>true</code> if all columns pass validation
+  *               or an array of <code>ValidationFailed</code> objects for columns that fail.
+  */
+  function & validate($columns = null)
+  {
+    if ($columns)
+    {
+      return <?php echo $table->getPhpName()?>Peer::doValidate($this, $columns);
+    }
+
+<?php 
+  if (! $complexObjectModel) 
+  { 
+?>
+    return <?php echo $table->getPhpName()?>Peer::doValidate($this);
+<?php 
+  } else { 
+?>
+    return $this->doValidate();
+<?php 
+  } /* if (! $complexObjectModel) */ 
+?>
+  }
+
+<?php   
+  if ($complexObjectModel) 
+  { 
+?>
+  /**
+  * flag to prevent endless validation loop, if this object is referenced
+  * by another object which falls in this transaction.
+  * @var boolean
+  */
+  var $alreadyInValidation = false;
+
+  /**
+  * This function performs the validation work for complex object models.
+  *
+  * In addition to checking the current object, all related objects will
+  * also be validated.  If all pass then <code>true</code> is returned; otherwise
+  * an aggreagated array of ValidationFailed objects will be returned.
+  *
+  * @return mixed <code>true</code> if all validations pass; array of <code>ValidationFailed</code> objets otherwise.
+  */
+  function & doValidate()
+  {
+    if (! $this->alreadyInValidation)
+    {
+      $this->alreadyInValidation = true;
+      $retval = null;
+      $failureMap = array();
+
+<?php 
+    if (count($pVars) != 0) 
+    { 
+?>
+      // We call the validate method on the following object(s) if they
+      // were passed to this object by their coresponding set
+      // method.  This object relates to these object(s) by a
+      // foreign key reference.
+<?php
+      for($i=0,$_i=count($aVars); $i < $_i; $i++) 
+      {
+        $aVarName = $aVars[$i];
+?>
+      if ($this-><?php echo $aVarName ?> !== null) {
+        if (($retval = $this-><?php echo $aVarName ?>->validate()) !== true) {
+          $failureMap = array_merge($failureMap, $retval);
+        }
+      }
+<?php   
+      } /* for */ 
+    } /* if count(pVars) */ 
+?>
+
+      if (($retval = <?php echo $table->getPhpName()?>Peer::doValidate($this)) !== true) {
+        $failureMap = array_merge($failureMap, $retval);
+      }
+
+<?php
+    foreach ($table->getReferrers() as $fk) 
+    {
+      $tblFK = $fk->getTable();
+      if ( $tblFK->getName() != $table->getName() ) 
+      {
+        $className = $tblFK->getPhpName();
+        $relCol = "";
+        foreach ($fk->getLocalColumns() as $columnName) {
+          $column = $tblFK->getColumn($columnName);
+          if ($column->isMultipleFK()) {
+              $relCol .= $column->getPhpName();
+          }
+        }
+
+        if ($relCol == "") {
+          $relCol = $className . "s";
+        } else {
+          $relCol = $className . "sRelatedBy" . $relCol;
+        }
+
+        $collName = "coll" . $relCol;
+?>
+      if ($this-><?php echo $collName ?> !== null) {
+        for ($i=0,$size=count($this-><?php echo $collName ?>); $i < $size; $i++) {
+          if (($retval = $this-><?php echo $collName ?>[$i]->validate()) !== true) {
+            $failureMap = array_merge($failureMap, $retval);
+          }
+        }
+      }
+<?php    
+      } /* if tableFK !+ table */
+    } /* foreach getReferrers() */
+?>
+
+      $this->alreadyInValidation = false;
+      return (!empty($failureMap) ? $failureMap : true);
+    }
+
+    return true;
+  }
+
+<?php   
+  } /* complexObjectModel */ 
+} /* ! isAlias */ 
+
+// PrimaryKey methods
+if (!$table->isAlias()) 
+{
+  if (! $table->isReadOnly())
+  {
+    $throwsClause = "@throws PropelException";
+    if (count($table->getPrimaryKey()) == 1) 
+    {
+      $pkeys = $table->getPrimaryKey();
+      $col = $pkeys[0];
+      $clo=strtolower($col->getName());
+      $cptype= $col->getPhpNative();
+?>
+  /**
+  * Set the PrimaryKey.
+  *
+  * @param mixed <?php echo $clo ?> Primary key.
+  * @return void
+  * <?php echo $throwsClause ?>
+  */
+  function setPrimaryKey($key)
+  {
+    $this->set<?php echo $col->getPhpName() ?>($key);
+  }
+
+<?php     
+    } 
+    elseif (count($table->getPrimaryKey()) > 1) 
+    { 
+?>
+  var $pks = array();
+
+  /**
+  * Set the PrimaryKey.
+  *
+  * @param array $keys The elements of the composite key (order must match the order in XML file).
+  * @return void
+  * @throws PropelException
+  */
+  function setPrimaryKey($keys)
+  {
+<?php
+      $i = 0;
+      foreach ($table->getPrimaryKey() as $pk) 
+      {
+        $pktype = $pk->getPhpNative(); 
+?>
+    $this->set<?php echo $pk->getPhpName() ?>($keys[<?php echo $i ?>]);
+<?php
+        $i++;
+      } /* foreach ($table->getPrimaryKey() as $pk) */
+?>
+  }
+
+<?php 
+    } else { /* if (count($table->getPrimaryKey()) == 1) */ 
+?>
+
+  /**
+  * Dummy primary key setter.
+  * For now this function needs to exist because it's mandated in the Persistent
+  * interface, and because other methods will attempt to set the primary key.
+  *
+  * This should be removed in favor of more complex template work.
+  */
+  function setPrimaryKey($pk)
+  {
+    // do nothing, because this doesn't support primary keys
+  }
+<?php 
+    } /* if (count($table->getPrimaryKey()) == 1) */
+  } /* if ! $table->isReadOnly() */
+?>
+
+  /**
+  * Returns an id that differentiates this object from others
+  * of its class.
+  * @return <?php if (count($table->getPrimaryKey()) === 0) { echo "null"; } elseif (count($table->getPrimaryKey()) > 1) { echo "array"; } else { $pkeys = $table->getPrimaryKey(); echo $pkeys[0]->getPhpType(); } ?>
+  */
+  function getPrimaryKey()
+  {
+<?php 
+  if (count($table->getPrimaryKey()) == 1) { 
+?>
+    return $this->get<?php $pkeys = $table->getPrimaryKey(); echo $pkeys[0]->getPhpName()?>();
+<?php 
+  } 
+  elseif (count($table->getPrimaryKey()) > 1) {
+    $i = 0;
+    foreach ($table->getPrimaryKey() as $pk) { 
+?>
+    $this->pks[<?php echo $i ?>] = $this->get<?php echo $pk->getPhpName() ?>();
+<?php
+      $i++;
+    } /* foreach ($table->getPrimaryKey() as $pk) */
+?>
+    return $this->pks;
+<?php 
+  } else { 
+?>
+
+    return null;
+<?php 
+  } 
+?>
+  }
+
+<?php 
+  if (! $table->isAbstract()) 
+  { 
+?>
+  /**
+  * Makes a copy of this object.
+  * It creates a new object filling in the simple attributes, but skipping any primary
+  * keys that are defined for the table.
+  * 
+<?php 
+    if ($complexObjectModel) 
+    { 
+?>
+  * If desired, this method can also make copies of all associated (fkey referrers)
+  * objects.
+  *
+  * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row.
+  * 
+<?php 
+    } 
+?>
+  * @return <?php echo $table->getPhpName() ?> Clone of current object.
+  * @throws PropelException
+  */
+  function copy(<?php if ($complexObjectModel) { ?>$deepCopy = false<?php } ?>) 
+  {
+    $copyObj = new <?php echo $table->getPhpName() ?>();
+<?php
+
+    $pkcols = array();
+    foreach ($table->getColumns() as $pkcol) {
+      if ($pkcol->isPrimaryKey()) { 
+        $pkcols[] = $pkcol->getName(); 
+      }
+    }
+
+    foreach ($table->getColumns() as $col) 
+    {
+      if (!in_array($col->getName(), $pkcols)) {
+?>
+    $copyObj->set<?php echo $col->getPhpName()?>($this-><?php echo strtolower($col->getName()) ?>);
+<?php
+      }
+    }
+
+    if ($complexObjectModel) 
+    {
+      // Avoid useless code by checking to see if there are any referrers
+      // to this table:
+      if (count($table->getReferrers()) > 0) 
+      {
+?>
+
+    if ($deepCopy) {        
+      // important: setNew(false) because this affects the behavior of
+      // the getter/setter methods for fkey referrer objects.
+      $copyObj->setNew(false);
+<?php
+        foreach ($table->getReferrers() as $fk) 
+        {
+          $tblFK = $fk->getTable();
+          if ( $tblFK->getName() != $table->getName() ) 
+          {
+            $className = $tblFK->getPhpName();
+            $relCol = "";
+            foreach ($fk->getLocalColumns() as $columnName) {
+              $column = $tblFK->getColumn($columnName);
+              if ($column->isMultipleFK()) {
+                $relCol .= $column->getPhpName();
+              }
+            }
+
+            if ($relCol == "") {
+              $pCollName = $className . "s";
+              $pCollNameNoS = $className;
+            } else {
+              $pCollName = $className . "sRelatedBy".$relCol;
+              $pCollNameNoS = $className . "RelatedBy".$relCol;
+            }
+?>
+
+      foreach($this->get<?php echo $pCollName ?>() as $relObj) {
+        $copyObj->add<?php echo $pCollNameNoS ?>($relObj->copy());
+      }
+<?php
+          } /* if tblFK != table */
+        } /* foreach */ 
+?>
+    } /* if ($deepCopy) */
+<?php            
+      } /* if (count referrers > 0 ) */
+?>
+    
+    $copyObj->setNew(true);
+<?php 
+    } /* if complex object model */
+
+    // this is a little redundant, but it's clearer than re-using
+    // the $pkcols array  we created above
+    foreach ($table->getColumns() as $col) 
+    {
+      if ($col->isPrimaryKey()) 
+      {
+        $coldefval = $col->getDefaultValue();
+        // This seems to work pretty well for getting
+        // the right value (including NULL)
+        $coldefval = var_export($coldefval, true);
+?>
+    $copyObj->set<?php echo $col->getPhpName()?>(<?php echo $coldefval ?>); // this is a pkey column, so set to default value
+<?php
+      } // if col->isPrimaryKey
+    } // foreach
+?>
+
+    return $copyObj;
+  }
+
+<?php 
+  } /* if (! $table->isAbstract()) */ 
+?>
+  /**
+  * Returns a peer instance associated with this om.  Since Peer classes
+  * are not to have any instance attributes, this method returns the
+  * same instance for all member of this class. The method could therefore
+  * be static, but this would prevent one from overriding the behavior.
+  *
+  * @return <?php echo $table->getPhpName() ?>Peer
+  */
+  function & getPeer()
+  {
+    static $instance;
+
+    if ($instance === null) {
+      $instance = new <?php echo $table->getPhpName()?>Peer();
+    }
+
+    return $instance;
+  }
+<?php 
+} /* if !table->isAlias */ 
+?>
+
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Peer.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Peer.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php4/Peer.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1780 @@
+<?php
+
+// This is a [rather messy] template that builds a Peer class.
+//
+// These templates use the classes in propel.engine.database.model which represent the model (database).
+// These templates also use the propel.engine.builder classes (increasingly) to encapsulate some of the
+// repeating logic.
+//
+// These are based on velocity templates in original Torque.
+//
+// TODO:
+//      - move these into classes, perhaps, to further componentize the building of templates.
+//      - if these were classes it would also be easy to customize them through extension
+//
+// $Id: Peer.tpl,v 1.24 2005/03/29 16:35:52 micha Exp $
+
+include_once 'propel/engine/builder/om/PeerBuilder.php';
+include_once 'propel/engine/builder/om/ClassTools.php';
+include_once 'creole/CreoleTypes.php';
+
+$db = $table->getDatabase();
+if($table->getPackage()) {
+  $package = $table->getPackage();
+} else {
+  $package = $targetPackage;
+}
+
+echo '<' . '?' . 'php';
+
+$CLASS = $table->getPhpName() . 'Peer';
+$basePeerClass = ClassTools::getBasePeer($table);
+$basePeerClassname = ClassTools::classname($basePeerClass);
+?>
+
+require_once '<?php echo ClassTools::getFilePath($basePeerClass) ?>';
+
+// The object class -- needed for instanceof checks in this class.
+// actual class may be a subclass -- as returned by <?php echo $table->getPhpName() ?>Peer::getOMClass()
+include_once '<?php echo ClassTools::getFilePath($package, $table->getPhpName()) ?>';
+<?php 
+foreach ($table->getForeignKeys() as $fk) {
+    
+   $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+   $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package); 
+   
+   if (!$tblFK->isForReferenceOnly()) {
+?>   
+include_once '<?php echo ClassTools::getFilePath($tblFKPackage, $tblFK->getPhpName()) ?>';
+include_once '<?php echo ClassTools::getFilePath($tblFKPackage, $tblFK->getPhpName() . 'Peer') ?>';
+<?php 
+    } // if (!$tblFK->isForReferenceOnly()
+} // foreach
+?>
+
+/**
+ * Base static class for performing query and update operations on the '<?php echo $table->getName() ?>' table.
+ *
+ * <?php echo $table->getDescription() ?>
+ *
+<?php if ($addTimeStamp) { ?>
+ * This class was autogenerated by Propel on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * @package <?php echo $package ?>
+ */
+class <?php echo $basePrefix . $table->getPhpName() ?>Peer 
+{
+<?php if (!$table->isAlias()) { ?>
+
+  /** the default database name for this class */
+  function DATABASE_NAME() { return "<?php echo $table->getDatabase()->getName() ?>"; }
+
+  /** the table name for this class */
+  function TABLE_NAME() { return "<?php echo $table->getName() ?>"; }
+
+<?php foreach ($table->getColumns() as $col) { ?>
+  /** the column name for the <?php echo strtoupper($col->getName()) ?> field */
+  function <?php echo PeerBuilder::getColumnName($col) ?>() { return "<?php echo $table->getName() . '.' . strtoupper($col->getName()) ?>"; }
+<?php } ?>
+<?php } /* if (!$table->isAlias()) */ ?>
+
+  /** number of columns for this peer (static) */
+  function numColumns() { return <?php echo $table->getNumColumns() ?>; }
+
+  /** number of lazy load columns for this peer */
+  function numLazyLoadColumns() { return <?php echo $table->getNumLazyLoadColumns() ?>; }
+  
+  /** A class that can be returned by this peer. */
+  function CLASS_DEFAULT() { return "<?php echo $package . '.' . $table->getPhpName() ?>"; }
+
+  /** The PHP to DB Name Mapping (static) */
+  var $phpNameMap = null;
+
+  /**
+  * @access private static
+  */
+  function & getInstance()
+  {
+    static $instance;
+
+    if ($instance === null) {
+      $instance = new <?php echo $table->getPhpName()?>Peer();
+    }
+
+    return $instance;
+  }
+
+  /**
+   * @return MapBuilder the map builder for this peer
+   * @access public static
+   * @throws PropelException Any exceptions caught during processing will be
+   *         rethrown wrapped into a PropelException.
+   */
+  function & getMapBuilder()
+  {
+    include_once '<?php echo ClassTools::getFilePath($pkmap, $table->getPhpName() . 'MapBuilder') ?>';
+    return <?php echo $basePeerClassname ?>::getMapBuilder(<?php echo $table->getPhpName() ?>MapBuilder::CLASS_NAME());
+  }
+
+  /**
+   * Gets a map (hash) of PHP names to DB column names.
+   *
+   * @return array The PHP to DB name map for this peer
+   * @access public static
+   * @throws PropelException Any exceptions caught during processing will be
+   *         rethrown wrapped into a PropelException.
+   * @todo Consider having template build the array rather than doing it at runtime.
+   */
+  function getPhpNameMap()
+  {
+    $self =& <?php echo $table->getPhpName()?>Peer::getInstance();
+
+    if ($self->phpNameMap === null) {
+      $map = $self->getTableMap();
+      $columns = $map->getColumns();
+      $nameMap = array();
+      foreach ($columns as $column) {
+        $nameMap[$column->getPhpName()] = $column->getColumnName();
+      }
+      $self->phpNameMap = $nameMap;
+    }
+    return $self->phpNameMap;
+  }
+<?php
+
+if (!$table->isAlias()) {
+
+
+  if ($table->getChildrenColumn()) {
+
+    $col = $table->getChildrenColumn();
+    $tfc = $table->getPhpName();
+    $cfc = $col->getPhpName();
+
+    if ($col->isEnumeratedClasses()) {
+
+      if ($col->isPrimitiveNumeric()) $quote = "";
+      else $quote = '"';
+
+      foreach ($col->getChildren() as $child) {
+	    $childpkg = ($child->getPackage() ? $child->getPackage() : $package);
+?>
+  /** A key representing a particular subclass */
+  function CLASSKEY_<?php echo strtoupper($child->getKey()) ?>() { return <?php echo $quote . $child->getKey() . $quote ?>; }
+
+  /** A class that can be returned by this peer. */
+  function CLASSNAME_<?php echo strtoupper($child->getKey()) ?>() { return "<?php echo $childpkg . '.' . $child->getClassName() ?>"; }
+<?php
+      } /* foreach children */
+    } /* if col->isenumerated...() */
+  } /* if table->getchildrencolumn() */
+?>
+  /**
+   * Convenience method which changes table.column to alias.column.
+   *
+   * Using this method you can maintain SQL abstraction while using column aliases.
+   * <code>
+   *    $c->addAlias("alias1", TablePeer::TABLE_NAME);
+   *    $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN);
+   * </code>
+   * @param string $alias The alias for the current table.
+   * @param string $column The column name for current table. (i.e. <?php echo $table->getPhpName() ?>Peer::COLUMN_NAME).
+   * @return string
+   * @access public static
+   */
+  function alias($alias, $column)
+  {
+    return $alias . substr($column, strlen(<?php echo $table->getPhpName()?>Peer::TABLE_NAME()));
+  }
+
+  /**
+  * Add all the columns needed to create a new object.
+  *
+  * Note: any columns that were marked with lazyLoad="true" in the
+  * XML schema will not be added to the select list and only loaded
+  * on demand.
+  *
+  * @param criteria object containing the columns to add.
+  * @throws PropelException Any exceptions caught during processing will be
+  *         rethrown wrapped into a PropelException.
+  * @access public static
+  */
+  function addSelectColumns(/*Criteria*/ &$criteria)
+  {
+    Propel::typeHint($criteria, 'Criteria', '<?php echo $CLASS; ?>', 'addSelectColumns', 1);
+
+<?php
+    foreach ($table->getColumns() as $col) { 
+      if (! $col->isLazyLoad()) {
+?>
+    $criteria->addSelectColumn(<?php echo $table->getPhpName()?>Peer::<?php echo PeerBuilder::getColumnName($col) ?>());
+<?php 
+      } 
+    }
+?>
+  }
+
+<?php
+  $countColumn = "*";
+  if ($table->hasPrimaryKey()) {
+    $pk = $table->getPrimaryKey();
+    $countColumn = $table->getName() . "." . strtoupper($pk[0]->getName());
+  }
+?>
+
+  function COUNT() { return "COUNT(<?php echo $countColumn?>)"; }
+  function COUNT_DISTINCT() { return "COUNT(DISTINCT <?php echo $countColumn?>)"; }
+
+  /**
+  * Returns the number of rows matching criteria.
+  *
+  * @param Criteria $criteria a <code>Criteria</code> object.
+  * @param boolean $distinct Whether to select only distinct columns.
+  * @param Connection $con An optional Connection object.
+  *
+  * @return int Number of matching rows.
+  */
+  function doCount(/*Criteria*/ $criteria, $distinct = false, $con = null)
+  {
+    /* [MA] temporarily check */
+    Propel::assertParam($con, '<?php echo $CLASS; ?>', 'doCount', 3);
+    Propel::typeHint($criteria, 'Criteria', '<?php echo $CLASS; ?>', 'doCount', 1);
+
+    /*
+    * clear out anything that might confuse the ORDER BY clause. 
+    * Note: unlike php5 version $criteria is passed by value and has not to be cloned.
+    */
+    $criteria->clearSelectColumns();
+    $criteria->clearOrderByColumns();
+    
+    if ($distinct || in_array(Criteria::DISTINCT(), $criteria->getSelectModifiers())) {
+      $criteria->addSelectColumn(<?php echo $table->getPhpName()?>Peer::COUNT_DISTINCT());
+    } else {
+      $criteria->addSelectColumn(<?php echo $table->getPhpName()?>Peer::COUNT());
+    }
+    // just in case we're grouping: add those columns to the select statement
+    foreach($criteria->getGroupByColumns() as $column)
+    {
+      $criteria->addSelectColumn($column);
+    }
+
+    $rs =& <?php echo $table->getPhpName()?>Peer::doSelectRS($criteria, $con);
+    if (Propel::isError($rs)) { return $rs; }
+
+    if ($rs->next() === true) {
+      return $rs->getInt(1);
+    }
+
+    /* no rows returned; we infer that means 0 matches */
+    return 0;
+  }
+
+  /**
+  * Method to select one object from the DB.
+  * 
+  * @param Criteria $criteria Object used to create the SELECT statement.
+  * @param Connection $con An optional Connection object.
+  *
+  * @return mixed <?php echo $table->getPhpName() ?> on success, NULL on failure.
+  */
+  function & doSelectOne($criteria, $con = null)
+  {
+    /* [MA] temporarily check */
+    Propel::assertParam($con, '<?php echo $CLASS; ?>', 'doSelectOne', 2);
+
+    $criteria->setLimit(1);
+
+    $objects =& <?php echo $table->getPhpName()?>Peer::doSelect($criteria, $con);
+    if (Propel::isError($objects)) { return $objects; }
+
+    if ($objects) {
+      return $objects[0];
+    }
+
+    return null;
+  }
+
+  /**
+  * Method to do selects.
+  *
+  * @param Criteria $criteria Object used to create the SELECT statement.
+  * @param Connection $con An optional Connection object.
+  *
+  * @return array Array of selected Objects
+  * @throws PropelException Any exceptions caught during processing will be
+  *         rethrown wrapped into a PropelException.
+  */
+  function & doSelect($criteria, $con = null)
+  {
+    /* [MA] temporarily check */
+    Propel::assertParam($con, '<?php echo $CLASS; ?>', 'doSelect', 2);
+
+    $rs =& <?php echo $table->getPhpName()?>Peer::doSelectRS($criteria, $con);
+    if (Propel::isError($rs)) { return $rs; }
+
+    return <?php echo $table->getPhpName()?>Peer::populateObjects($rs);
+  }
+
+  /**
+  * Prepares the Criteria object and uses the parent doSelect()
+  * method to get a ResultSet.
+  *
+  * Use this method directly if you want to just get the resultset
+  * (instead of an array of objects).
+  *
+  * @param Criteria $criteria
+  * @param Connection $con An optional Connection object.
+  *
+  * @return ResultSet The resultset object with numerically-indexed fields.
+  *         PropelException Any exceptions caught during processing will be
+  *         rethrown wrapped into a PropelException.
+  * @see <?php echo $basePeerClassname ?>::doSelect()
+  */
+  function & doSelectRS($criteria, $con = null)
+  {
+    /* [MA] temporarily check */
+    Propel::assertParam($con, '<?php echo $CLASS; ?>', 'doSelectRS', 2);
+
+    /* [MA] do not retrieve connection here, BasePeer::doSelect will do */
+    
+    if (!$criteria->getSelectColumns()) {
+      <?php echo $table->getPhpName()?>Peer::addSelectColumns($criteria);
+    }
+
+    // Set the correct dbName
+    $criteria->setDbName(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());    
+
+    // BasePeer returns a Creole ResultSet, set to return
+    // rows indexed numerically.
+    return <?php echo $basePeerClassname ?>::doSelect($criteria, $con);
+  }
+
+  /**
+  * The returned array will contain objects of the default type or
+  * objects that inherit from the default.
+  *
+  * @return Array of <?php echo $table->getPhpName()?> objects on success OR
+  *         PropelException Any exceptions caught during processing will be
+  *         returned wrapped into a PropelException.
+  */
+  function & populateObjects(/*ResultSet*/ &$rs)
+  {
+    $results = array();
+
+    if (! is_a($rs, 'ResultSet')) {
+      return new PropelException(PROPEL_ERROR, "parameter not of type 'ResultSet'");
+    }
+
+<?php if (!$table->getChildrenColumn()) { ?>
+    // set the class once to avoid overhead in the loop
+    $cls = <?php echo $table->getPhpName() ?>Peer::getOMClass();
+
+    if (Propel::isError($cls =& Propel::import($cls))) {
+      return $cls;
+    }
+<?php } ?>
+
+    // populate the object(s)
+    while($rs->next())
+    {
+<?php if ($table->getChildrenColumn()) { ?>
+      // class must be set each time from the record row
+      $cls =& Propel::import(<?php echo $table->getPhpName() ?>Peer::getOMClass($rs, 1));
+      if (Propel::isError($cls)) {
+        return $cls;
+      }
+      $obj =& new $cls();
+
+      if (Propel::isError($e =& $obj->hydrate($rs))) {
+        return $e;
+      }
+
+      $results[] =& $obj;
+<?php } else { ?>
+      $obj =& new $cls();
+
+      if (Propel::isError($e =& $obj->hydrate($rs))) {
+        return $e;
+      }
+
+      $results[] =& $obj;
+<?php } ?>
+    }
+
+    return $results;
+  }
+
+<?php  } /* if !table->isAlias() */ ?>
+
+<?php if ($table->getChildrenColumn()) {
+
+  $col = $table->getChildrenColumn();
+?>
+
+  /**
+  * The returned Class will contain objects of the default type or
+  * objects that inherit from the default.
+  *
+  * @param ResultSet $rs ResultSet with pointer to record containing om class.
+  * @param int $colnum Column to examine for OM class information (first is 1).
+  *
+  * @throws PropelException Any exceptions caught during processing will be
+  *         rethrown wrapped into a PropelException.
+  */
+  function getOMClass(/*ResultSet*/ &$rs, $colnum)
+  {
+    $c = null;
+
+<?php if ($col->isEnumeratedClasses()) { ?>
+
+    $omClass = null;
+    $classKey = $rs->getString($colnum - 1 + <?php echo $col->getPosition() ?>);
+
+    switch($classKey)
+    {
+<?php
+      foreach ($col->getChildren() as $child) {
+?>
+      case <?php echo $table->getPhpName()?>Peer::CLASSKEY_<?php echo strtoupper($child->getKey()) ?>():
+        $omClass = <?php echo $table->getPhpName()?>Peer::CLASSNAME_<?php echo strtoupper($child->getKey()) ?>();
+        break;
+<?php } /* foreach */ ?>
+      default:
+<?php if ($table->isAbstract()) { ?>
+        $error = "You must implement the getOMClass method in your"
+            ." Peer object in order for things to work properly."
+            ." This method should return the proper Class that"
+            ." represents the Peer's Business Object.";
+
+        return new PropelException(PROPEL_ERROR, $error);
+<?php } else { ?>
+
+    $omClass = <?php echo $table->getPhpName()?>Peer::CLASS_DEFAULT();
+
+<?php } ?>
+
+    } // switch
+
+    $c = $omClass;
+
+<?php } else { /* if not enumerated */ ?>
+
+    $c =& Propel::import($rs->getString($colnum - 1 + <?php echo $col->getPosition() ?>));
+
+    if (Propel::isError($c)) {
+      return $c;
+    }
+  <?php } ?>
+
+    return $c;
+  }
+
+<?php } else { /* if table->getchildrencolumn */ ?>
+
+  /**
+   * The class that the Peer will make instances of.
+   * If the BO is abstract then you must implement this method
+   * in the BO.
+   *
+   * @throws PropelException Any exceptions caught during processing will be
+   *         rethrown wrapped into a PropelException.
+   */
+  function getOMClass()
+  {
+<?php if ($table->isAbstract()) { ?>
+    $error = "You must implement the getOMClass method in your"
+        ." Peer object in order for things to work properly."
+        ." This method should return the proper Class that"
+        ." represents the Peer's Business Object.";
+
+    return new PropelException(PROPEL_ERROR, $error);
+<?php } else { ?>
+    return <?php echo $table->getPhpName()?>Peer::CLASS_DEFAULT();
+<?php } ?>
+  }
+<?php }  /* if table->getchildrencolumn */
+
+if (!$table->isAlias() && ! $table->isReadOnly()) 
+{ 
+?>
+  /**
+  * Method to do inserts.  This method is to be used during a transaction,
+  * otherwise use the doInsert(Criteria) method.  It will take care of
+  * the connection details internally.
+  *
+  * @param mixed $values Criteria or <?php echo $table->getPhpName() ?> object containing data
+  *                      that is used to create the INSERT statement.
+  * @param Connection $con The connection to use
+  *
+  * @return mixed The new primary key.
+  * @throws PropelException Any exceptions caught during processing will be
+  *         rethrown wrapped into a PropelException.
+  */
+  function doInsert(&$values, $con = null)
+  {
+    /* [MA] temporarily check */
+    Propel::assertParam($con, '<?php echo $CLASS; ?>', 'doInsert', 2);
+
+    $con =& Param::get($con);
+
+    if ($con === null) {
+      $con =& Propel::getConnection(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+      if (Propel::isError($con)) { return $con; }
+    }
+
+    if (is_a($values, 'Criteria')) {
+        $criteria =& $values;
+    } else {
+        $criteria =& $values->buildCriteria();
+    }
+
+<?php 
+  foreach ($table->getColumns() as $col) 
+  {
+    $cfc = $col->getPhpName();
+    if ($col->isPrimaryKey() && $col->isAutoIncrement() && $table->getIdMethod() != "none") 
+    { 
+?>
+    $criteria->remove(<?php echo $table->getPhpName()?>Peer::<?php echo PeerBuilder::getColumnName($col) ?>()); // remove pkey col since this table uses auto-increment
+<?php
+    }
+  }
+?> 
+    // Set the correct dbName
+    $criteria->setDbName(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+
+    // use transaction because $criteria could contain info
+    // for more than one table (I guess, conceivably)
+    $e = $con->begin();
+    if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+
+    $pk = <?php echo $basePeerClassname ?>::doInsert($criteria, $con);
+    if (Propel::isError($pk)) { $con->rollback(); return $pk; }
+
+    $e = $con->commit();
+    if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+
+    return $pk;
+  }
+
+<?php
+  // Both UPDATE and DELETE can use cascade emulation if the DB driver
+  // doesn't natively support ON UPDATE CASCADE / ON DELETE CASCADE
+  //
+  // Support for ON UPDATE CASCADE emulation has been removed because
+  // it doesn't make any sense for Propel.  ON UPDATE CASCADE works by
+  // updating referring rows when the pkey is updated; pkeys can never be
+  // updated unless using the BasePeer class directly.  This behavior may
+  // change, but for now updateCascade has been removed.
+
+  // Check to see whether this table has any foreign keys that should be
+  // cascaded and set the $deleteCascadeRelevant
+
+  $deleteCascadeRelevant = false;
+  $deleteSetNullRelevant = false;
+
+  if (! $platform->supportsNativeDeleteTrigger() && count($table->getReferrers()) > 0) {
+    foreach ($table->getReferrers() as $fk) {
+      if ( $fk->getOnDelete() == ForeignKey::CASCADE ) {
+        $deleteCascadeRelevant = true;
+      } 
+      elseif ($fk->getOnDelete() == ForeignKey::SETNULL) {
+        $deleteSetNullRelevant = true;
+      }
+    }
+  } // if count(foreign keys)
+?>
+  /**
+  * Method perform an UPDATE on the database, given a <?php echo $table->getPhpName() ?> or Criteria object.
+  *
+  * @param mixed $values Criteria or <?php echo $table->getPhpName() ?> object containing data that is used to create the UPDATE statement.
+  * @param Connection $con The connection to use.
+  *
+  * @return mixed number of affected rows on success, any exceptions returned during processing
+  *         wrapped in a PropelException on failure.
+  */
+  function doUpdate(&$values, $con = null)
+  {
+    /* [MA] temporarily check */
+    Propel::assertParam($con, '<?php echo $CLASS; ?>', 'doUpdate', 2);
+
+    $con =& Param::get($con);
+
+    if ($con === null) {
+      $con =& Propel::getConnection(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+      if (Propel::isError($con)) { return $con; }
+    }
+
+    $selectCriteria =& new Criteria(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+
+    if (is_a($values, 'Criteria')) {
+      $criteria =& $values;
+<?php 
+  foreach ($table->getColumns() as $col) 
+  {
+    if($col->isPrimaryKey()) 
+    { 
+      $pn = $table->getPhpName() . 'Peer';
+      $cn = PeerBuilder::getColumnName($col);
+?>
+      $comparison = $criteria->getComparison(<?php echo $pn?>::<?php echo $cn?>());
+      $selectCriteria->add(<?php echo $pn?>::<?php echo $cn ?>(), $criteria->remove(<?php echo $pn ?>::<?php echo $cn ?>()), $comparison);
+<?php 
+    }  /* if col is prim key */
+  } /* foreach */
+?>
+    } else { // $values is <?php echo $table->getPhpName() ?> object
+        $criteria = $values->buildCriteria(); // gets full criteria
+        $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s)            
+    }	
+
+    // Set the correct dbName
+    $criteria->setDbName(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());    
+
+    return <?php echo $basePeerClassname ?>::doUpdate($selectCriteria, $criteria, $con);
+  }
+
+  /**
+  * Method to DELETE all rows from the <?php echo $table->getName() ?> table.
+  *
+  * <b>Note</b>: If you want to pass a Connection object as reference,
+  * use Param::set() :
+  *
+  * <code>
+  *  $con =& Propel::getConnection();
+  *  $e = BasePeer::doDeleteAll(Param::set($con));
+  * </code>
+  *
+  * @return mixed number of affected rows on success, PropelException on failure.
+  */
+  function doDeleteAll($con = null)
+  {
+    /* [MA] temporarily check */
+    Propel::assertParam($con, '<?php echo $CLASS; ?>', 'doDeleteAll', 2);
+
+    $con =& Param::get($con);
+
+    if ($con === null) {
+      $con =& Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+      if (Propel::isError($con)) { return $con; }
+    }
+
+    $affectedRows = 0; // initialize var to track total num of affected rows    
+    
+    // use transaction because $criteria could contain info
+    // for more than one table or we could emulating ON DELETE CASCADE, etc.
+    $e = $con->begin();
+    if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+<?php if ($deleteCascadeRelevant) { ?>
+
+    $e = <?php echo $table->getPhpName() ?>Peer::doOnDeleteCascade(new Criteria(), $con);
+    if (Propel::isError($e)) { $con->rollback(); return $e; }
+    $affectedRows += $e;
+<?php } elseif ($deleteSetNullRelevant) { ?>
+
+    $e = <?php echo $table->getPhpName() ?>Peer::doOnDeleteSetNull(new Criteria(), $con);
+    if (Propel::isError($e)) { $con->rollback(); return $e; }
+    $affectedRows += $e;
+<?php } ?>
+
+    $e = BasePeer::doDeleteAll(<?php echo $table->getPhpName() ?>Peer::TABLE_NAME(), $con);
+    if (Propel::isError($e)) { $con->rollback(); return $e; }
+    $affectedRows += $e;
+
+    $e = $con->commit();
+    if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+
+    return $affectedRows;
+  }
+
+  /**
+  * Method perform a DELETE on the database, given a <?php echo $table->getPhpName() ?> or Criteria object OR a primary key value.
+  *
+  * @param mixed $values Criteria or <?php echo $table->getPhpName() ?> object containing data that is used to create the DELETE statement.
+  * @param Connection $con the connection to use
+  *
+  * @return mixed number of affected rows on success, any exception returned during processing wrapped into a PropelException on failure.
+  */
+  function doDelete(&$values, $con = null)
+  {
+    /* [MA] temporarily check */
+    Propel::assertParam($con, '<?php echo $CLASS; ?>', 'doDelete', 2);
+
+    $con =& Param::get($con);
+
+    if ($con === null) {
+      $con =& Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME());
+      if (Propel::isError($con)) { return $con; }
+    }
+
+    if (is_a($values, 'Criteria')) {
+      $criteria =& $values;
+    } 
+    elseif (is_a($values, '<?php echo $table->getPhpName() ?>')) {
+<?php
+  $pkey_count = 0;
+  foreach ($table->getColumns() as $col) {
+    if($col->isPrimaryKey()) {
+      $pkey_count++;
+    }
+  }
+
+  if ($pkey_count > 0) { 
+?>
+      $criteria =& $values->buildPkeyCriteria();
+<?php  } else { ?>
+      $criteria =& $values->buildCriteria();
+<?php  } ?>
+    } 
+    else {
+      // it must be the primary key
+      $criteria =& new Criteria(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+<?php
+  if (count($table->getPrimaryKey()) == 1) { 
+    $col = array_shift($table->getPrimaryKey()); 
+?>
+      $criteria->add(<?php echo $table->getPhpName()?>Peer::<?php echo PeerBuilder::getColumnName($col) ?>(), $values);
+<?php  
+  } else { 
+?>
+      // primary key is composite; we therefore, expect
+      // the primary key passed to be an array of pkey
+      // values
+<?php
+    $i=0;
+    foreach($table->getPrimaryKey() as $col) { 
+?>
+      $criteria->add(<?php echo $table->getPhpName()?>Peer::<?php echo PeerBuilder::getColumnName($col)?>(), $values[<?php echo $i ?>]);
+<?php 
+      $i++; 
+    }
+  } /* if count(table.PrimaryKeys) */ 
+?>
+    }
+
+    // Set the correct dbName    
+    $criteria->setDbName(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+    
+    $affectedRows = 0; // initialize var to track total num of affected rows    
+
+    // use transaction because $criteria could contain info
+    // for more than one table or we could emulating ON DELETE CASCADE, etc.
+    $e = $con->begin();
+    if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+
+<?php
+  if ($deleteCascadeRelevant) { 
+?>
+    $e = <?php echo $table->getPhpName()?>Peer::doOnDeleteCascade($criteria, $con);
+    if (Propel::isError($e)) { $con->rollback(); return $e; }
+    $affectedRows += $e;
+<?php
+  } elseif ($deleteSetNullRelevant) { 
+?>
+    $e = <?php echo $table->getPhpName()?>Peer::doOnDeleteSetNull($criteria, $con);
+    if (Propel::isError($e)) { $con->rollback(); return $e; }
+    $affectedRows += $e;
+
+<?php
+  } 
+?>
+    $e = <?php echo $basePeerClassname ?>::doDelete($criteria, $con);
+    if (Propel::isError($e)) { $con->rollback(); return $e; }
+    $affectedRows += $e;
+
+    $e = $con->commit();
+    if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); }
+
+    return $affectedRows;
+  }
+
+<?php
+  if ($deleteCascadeRelevant) 
+  { 
+?>
+  /**
+  * This is a method for emulating ON DELETE CASCADE for DBs that don't support this
+  * feature (like MySQL or SQLite).
+  *
+  * This method is not very speedy because it must perform a query first to get
+  * the implicated records and then perform the deletes by calling those Peer classes.
+  *
+  * This method should be used within a transaction if possible.
+  *
+  * @param Criteria $criteria
+  * @param Connection $con
+  *
+  * @return number of affected rows on success, PropelException on failure.
+  */
+  function doOnDeleteCascade(/*Criteria*/ $criteria, /*Connection*/ &$con)
+  {
+    // initialize var to track total num of affected rows
+    $affectedRows = 0;
+
+    // first find the objects that are implicated by the $criteria
+    $objects =& <?php echo $table->getPhpName()?>Peer::doSelect($criteria, Param::set($con));
+    if (Propel::isError($objects)) { return $objects; }
+
+    for($i=0, $j=count($objects); $i < $j; $i++)
+    {
+      $obj =& $objects[$i];
+<?php
+    foreach ($table->getReferrers() as $fk) 
+    {
+      // $fk is the foreign key in the other table, so localTableName will
+      // actually be the table name of other table
+      $tblFK = $fk->getTable();
+      $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package);
+
+      if (!$tblFK->isForReferenceOnly()) 
+      {
+        // we can't perform operations on tables that are
+        // not within the schema (i.e. that we have no map for, etc.)
+        $fkClassName = $tblFK->getPhpName();
+
+        // i'm not sure whether we can allow delete cascade for foreign keys
+        // within the same table?  perhaps we can?
+        if ( $fk->getOnDelete() == ForeignKey::CASCADE && $fk->getTable()->getName() != $table->getName()) 
+        {
+          // backwards on purpose
+          $columnNamesF = $fk->getLocalColumns();
+          $columnNamesL = $fk->getForeignColumns(); // should be same num as foreign
+?>
+
+      include_once '<?php echo ClassTools::getFilePath($tblFKPackage, $tblFK->getPhpName()); ?>';
+
+      // delete related <?php echo $fkClassName ?> objects
+      $c =& new Criteria();
+<?php
+          for($x=0,$xlen=count($columnNamesF); $x < $xlen; $x++) {
+            $columnFK = $tblFK->getColumn($columnNamesF[$x]);
+            $columnL = $table->getColumn($columnNamesL[$x]);
+?>
+      $c->add(<?php echo PeerBuilder::getColumnName($columnFK, $fkClassName) ?>(), $obj->get<?php echo $columnL->getPhpName() ?>());
+
+<?php
+            //$delCmds[] = $fkClassName.'Peer::doDelete('.');
+          }
+?>
+      $e = <?php echo $fkClassName ?>Peer::doDelete($c, Param::set($con));
+      if (Propel::isError($e)) { return $e; }
+      $affectedRows += $e;
+<?php
+        } // if cascade && fkey table name != curr table name
+
+      } // if not for ref only
+    } // foreach foreign keys
+?>
+    }
+
+    return $affectedRows;
+  }
+
+<?php } elseif ($deleteSetNullRelevant) { ?>
+
+  /**
+  * This is a method for emulating ON DELETE SET NULL DBs that don't support this
+  * feature (like MySQL or SQLite).
+  *
+  * This method is not very speedy because it must perform a query first to get
+  * the implicated records and then perform the deletes by calling those Peer classes.
+  *
+  * This method should be used within a transaction if possible.
+  *
+  * @param Criteria $criteria
+  * @param Connection $con
+  *
+  * @return mixed number of affected rows on success, PropelException on failure.
+  */
+  function doOnDeleteSetNull(/*Criteria*/ $criteria, /*Connection*/ &$con)
+  {
+    // initialize var to track total num of affected rows
+    $affectedRows = 0;
+
+    // first find the objects that are implicated by the $criteria
+    $objects =& <?php echo $table->getPhpName()?>Peer::doSelect($criteria, Param::set($con));
+    if (Propel::isError($objects)) { return $objects; }
+
+    for($i=0, $j=count($objects); $i < $j; $i++)
+    {
+      $obj =& $objects[$i];
+<?php
+
+        // This logic is almost exactly the same as that in doOnDeleteCascade()
+        // it may make sense to refactor this, provided that thigns don't
+        // get too complicated.
+
+      foreach ($table->getReferrers() as $fk) {
+
+        // $fk is the foreign key in the other table, so localTableName will
+        // actually be the table name of other table
+        $tblFK = $fk->getTable();
+
+        if (!$tblFK->isForReferenceOnly()) {
+          // we can't perform operations on tables that are
+          // not within the schema (i.e. that we have no map for, etc.)
+
+          $fkClassName = $tblFK->getPhpName();
+
+          // i'm not sure whether we can allow delete setnull for foreign keys
+          // within the same table?  perhaps we can?
+          if ( $fk->getOnDelete() == ForeignKey::SETNULL &&
+              $fk->getTable()->getName() != $table->getName()) {
+
+            // backwards on purpose
+            $columnNamesF = $fk->getLocalColumns();
+            $columnNamesL = $fk->getForeignColumns(); // should be same num as foreign
+?>
+      // set fkey col in related <?php echo $fkClassName ?> rows to NULL
+      $selectCriteria =& new Criteria(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+      $updateValues =& new Criteria(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+<?php
+            for($x=0,$xlen=count($columnNamesF); $x < $xlen; $x++) {
+              $columnFK = $tblFK->getColumn($columnNamesF[$x]);
+              $columnL = $table->getColumn($columnNamesL[$x]);
+
+?>
+      $selectCriteria->add(<?php echo PeerBuilder::getColumnName($columnFK, $fkClassName) ?>(),
+                           $obj->get<?php echo $columnL->getPhpName() ?>());
+      $updateValues->add(<?php echo PeerBuilder::getColumnName($columnFK, $fkClassName) ?>(), null);
+<?php
+   }
+?>
+      // use BasePeer because generated Peer doUpdate() methods only update using pkey
+      $e = <?php echo $basePeerClassname ?>::doUpdate($selectCriteria, $updateValues, $con);
+      if (Propel::isError($e)) { return $e; }
+      $affectedRows += $e;
+<?php
+          } // if cascade && fkey table name != curr table name
+
+        } // if not for ref only
+      } // foreach foreign keys
+?>
+    }
+
+    return $affectedRows;
+  }
+
+<?php } /* if setnull relevant */ ?>
+
+
+  /**
+  * Validates all modified columns of given <?php echo $table->getPhpName()?> object.
+  * If parameter $columns is either a single column name or an array of column names
+  * than only those columns are validated.
+  *
+  * NOTICE: This does not apply to primary or foreign keys for now.
+  *
+  * @param <?php echo $table->getPhpName()?> $obj The object to validate.
+  * @param mixed $cols Column name or array of column names.
+  *
+  * @return mixed TRUE if all columns are valid or the error message of the first invalid column.
+  */
+  function doValidate(&$obj, $cols = null)
+  {
+    Propel::typeHint($obj, '<?php echo $table->getPhpName()?>', '<?php echo $CLASS; ?>', 'doValidate');
+
+    $dbName = <?php echo $table->getPhpName()?>Peer::DATABASE_NAME();
+    $tableName = <?php echo $table->getPhpName()?>Peer::TABLE_NAME();
+    $columns = array();
+
+    if ($cols)
+    {
+      $dbMap =& Propel::getDatabaseMap($dbName);
+      $tableMap =& $dbMap->getTable($tableName);
+
+      if (! is_array($cols)) {
+        $cols = array($cols);
+      }
+
+      foreach($cols as $colName)
+      {
+        if ($tableMap->containsColumn($colName))
+        {
+          $colMap =& $tableMap->getColumn($colName);
+          $get = 'get' . $colMap->getPhpName();
+          $columns[$colName] = $obj->$get();
+        }
+      }
+    }
+    else
+    {
+<?php
+  foreach ($table->getValidators() as $val) {
+    $col = $val->getColumn();
+    if (! $col->isAutoIncrement()) {
+      $cfc = $col->getPhpName();
+      $cup = strtoupper($col->getName());
+?>
+    if ($obj->isNew() || $obj->isColumnModified(<?php echo $table->getPhpName()?>Peer::<?php echo $cup?>()))
+      $columns[<?php echo $table->getPhpName()?>Peer::<?php echo $cup?>()] = $obj->get<?php echo $cfc?>();
+<?php
+    } // if
+  } // foreach
+?>
+    }
+
+    return <?php echo $basePeerClassname ?>::doValidate($dbName, $tableName, $columns);
+  }
+
+  /**
+   * Build a Criteria object from the data object for this peer or from primary key(s).
+   *
+   * @param mixed $obj <?php echo $table->getPhpName() ?> object or <?php if (count($table->getPrimaryKey()) == 1) { ?>scalar primary key<?php } else { ?>array primary keys<?php } ?>.
+   * @return Criteria The compiled Criteria object.
+   */
+  function buildCriteria(&$obj)
+  {
+    if (is_a($obj, '<?php echo $table->getPhpName() ?>' )) {
+      $criteria =& new Criteria(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+<?php
+        foreach ($table->getColumns() as $col) {
+          $cfc = $col->getPhpName();
+          if ($col->isPrimaryKey() && $table->getIdMethod() != "none") {
+?>
+      if (! $obj->isNew())
+        $criteria->add(<?php echo $table->getPhpName()?>Peer::<?php echo PeerBuilder::getColumnName($col) ?>(), $obj->get<?php echo $cfc ?>()); // primary key on tables w/ id generation is only added if not new
+<?php   } else { /* if col is not prim key */ ?>
+      if ($obj->isColumnModified(<?php echo $table->getPhpName()?>Peer::<?php echo PeerBuilder::getColumnName($col) ?>()))
+        $criteria->add(<?php echo $table->getPhpName()?>Peer::<?php echo PeerBuilder::getColumnName($col) ?>(), $obj->get<?php echo $cfc ?>());
+<?php
+          }
+        }
+?>
+
+    } else {
+      // it must be the primary key
+      $criteria =& new Criteria(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+      <?php if (count($table->getPrimaryKey()) == 1) {
+          $col = array_shift($table->getPrimaryKey()); ?>
+
+      $criteria->add(<?php echo $table->getPhpName()?>Peer::<?php echo PeerBuilder::getColumnName($col) ?>(), $obj);
+      <?php } else { ?>
+        // primary key is composite; we therefore, expect
+      // the primary key passed to be an array of pkey
+      // values
+    <?php
+        $i=0;
+          foreach($table->getPrimaryKey() as $col) { ?>
+      $criteria->add(<?php echo $table->getPhpName()?>Peer::<?php echo PeerBuilder::getColumnName($col)?>(), $obj[<?php echo $i ?>]);
+    <?php     $i++;
+        }
+      } /* if count(table.PrimaryKeys) */ ?>
+
+    }
+
+    return $criteria;
+  }
+<?php } /* if !table->isalias */ ?>
+
+<?php if (count($table->getPrimaryKey()) > 0) {
+
+  if ($table->isAlias()) {
+    $retrieveMethod = "retrieve" . $table->getPhpName() . "ByPK";
+  } else {
+    $retrieveMethod = "retrieveByPK";
+  }
+
+  $pks = $table->getPrimaryKey();
+
+if (count($table->getPrimaryKey()) === 1) {  ?>
+
+  /**
+  * Retrieve a single object by pkey or <em>NULL</em> if not found.
+  *
+  * @param mixed $pk The primary key.
+  * @param Connection $con The connection to use.
+  *
+  * @return mixed <?php echo $table->getPhpName(); ?> on success, NULL on failure
+  */
+  function & <?php echo $retrieveMethod ?>($pk, $con = null)
+  {
+    /* [MA] temporarily check */
+    Propel::assertParam($con, '<?php echo $CLASS; ?>', '<?php echo $retrieveMethod; ?>', 2);
+
+    $criteria =& new Criteria();
+<?php if (count($table->getPrimaryKey()) === 1) { 
+        $col = array_shift($table->getPrimaryKey());
+?>
+    $criteria->add(<?php echo $table->getPhpName() ?>Peer::<?php echo PeerBuilder::getColumnName($col) ?>(), $pk);
+<?php
+      } else {
+?>
+    // primary key is composite; we therefore, expect
+    // the primary key passed to be an array of pkey
+    // values
+<?php
+       $i=0;
+       foreach($table->getPrimaryKey() as $col) {
+?>
+    $criteria->add(<?php echo $table->getPhpName() ?>Peer::<?php echo PeerBuilder::getColumnName($col)?>, $pk[<?php echo $i ?>]);
+<?php
+          $i++; 
+       }
+     } /* if count(table.PrimaryKeys) */
+?>
+
+    $v = <?php echo $table->getPhpName() ?>Peer::doSelect($criteria, $con);
+    return count($v) > 0 ? $v[0] : null;
+  }
+
+  /**
+  * Retrieve multiple objects by pkey.
+  *
+  * @param array $pks List of primary keys
+  * @param Connection $con The connection to use.
+  *
+  * @throws PropelException Any exceptions caught during processing will be
+  *         rethrown wrapped into a PropelException.
+  */
+  function & <?php echo $retrieveMethod ?>s($pks, $con = null)
+  {
+    /* [MA] temporarily check */
+    Propel::assertParam($con, '<?php echo $CLASS; ?>', '<?php echo $retrieveMethod; ?>', 2);
+
+    $objs = null;
+    if (empty($pks)) {
+      $objs = array();
+    } else {
+      $criteria =& new Criteria();
+<?php if (count($table->getPrimaryKey()) == 1) { ?>
+
+      $criteria->add(<?php echo $table->getPhpName() ?>Peer::<?php $k1 = $table->getPrimaryKey(); echo strtoupper($k1[0]->getName()); ?>(), $pks, Criteria::IN());
+<?php } else { ?>
+
+      for($k=0,$size=count($pks); $k < $size; $k++) {
+        $pk = $pks[$k];
+        <?php $i = 0;
+          foreach($table->getPrimaryKey() as $col) { ?>
+
+        $c<?php echo $i ?> =& $criteria->getNewCriterion(<?php echo $table->getPhpName()?>Peer::<?php echo PeerBuilder::getColumnName($col) ?>(), $pk[<?php echo $i ?>], Criteria::EQUAL());
+        <?php
+        $j = $i - 1;
+        if ($i > 0) { ?>
+
+        $c<?php echo $j ?>->addAnd($c<?php echo $i ?>);
+          <?php } /* if $i > 0 */
+            $i++;
+          } /* foreach */ ?>
+
+        $criteria->addOr($c0);
+      }
+  <?php } /* if count prim keys == 1 */ ?>
+
+      $objs =& <?php echo $table->getPhpName()?>Peer::doSelect($criteria, $con);
+      if (Propel::isError($objs)) { return $objs; }
+    }
+    return $objs;
+  }
+
+<?php } else  {  // pkey count > 1
+
+$comma = false;
+?>
+  /**
+  * Retrieve object using pk values or <em>NULL</em> if not found.
+  *
+<?php foreach ($table->getPrimaryKey() as $col) {
+  $clo = strtolower($col->getName());
+  $cptype = $col->getPhpNative();
+?> 
+  * @param <?php echo $cptype ?> $<?php echo $clo ?>
+<?php } ?>
+  * @param Connection $con
+  *
+  * @return <?php echo $table->getPhpName() ?>
+  */
+  function <?php echo $retrieveMethod ?>(<?php foreach ($table->getPrimaryKey() as $col) { $clo = strtolower($col->getName()); ?><?php if ($comma) { ?>,<?php } ?> $<?php echo $clo ?><?php $comma = true; ?><?php } /* foreach */ ?>, $con = null)
+  {
+    /* [MA] temporarily check */
+    Propel::assertParam($con, '<?php echo $CLASS; ?>', '<?php echo $retrieveMethod ?>', -1);
+
+    $criteria = new Criteria();
+<?php foreach ($table->getPrimaryKey() as $col) {
+  $clo = strtolower($col->getName());
+?>
+    $criteria->add(<?php echo $table->getPhpName()?>Peer::<?php echo PeerBuilder::getColumnName($col) ?>(), $<?php echo $clo ?>);
+<?php } ?>
+
+    $v =& <?php echo $table->getPhpName()?>Peer::doSelect($criteria, $con);
+    return count($v) > 0 ? $v[0] : null;
+  }
+
+<?php } /* if pkey > 1 */
+
+}  /* if pkey > 0 */ ?>
+
+<?php
+
+if ($complexObjectModel) {
+
+ //
+ // setup joins
+ //
+ $className = $table->getPhpName();
+ $countFK = count($table->getForeignKeys());
+
+ if ($countFK >= 1) {
+  foreach ($table->getForeignKeys() as $fk) {
+    $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+    if (!$tblFK->isForReferenceOnly()) {
+    // want to cover this other case, but the code is not there yet.
+      if ( $fk->getForeignTableName() != $table->getName() ) {
+
+        $partJoinName = "";
+        foreach ($fk->getLocalColumns() as $columnName ) {
+          $column = $table->getColumn($columnName);
+          if ($column->isMultipleFK() || $fk->getForeignTableName() == $table->getName()) {
+            $partJoinName = $partJoinName . $column->getPhpName();
+          }
+        }
+
+        $joinTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+        $joinClassName = $joinTable->getPhpName();
+        $interfaceName = $joinTable->getPhpName();
+        if ($joinTable->getInterface()) {
+           $interfaceName = $joinTable->getInterface();
+        }
+
+        if ($partJoinName == "") {
+          $joinColumnId = $joinClassName;
+          $joinInterface = $interfaceName;
+          $collThisTable = $className . "s";
+          $collThisTableMs = $className;
+        } else {
+          $joinColumnId= $joinClassName . "RelatedBy" . $partJoinName;
+          $joinInterface= $interfaceName . "RelatedBy" . $partJoinName;
+          $collThisTable= $className . "sRelatedBy" . $partJoinName;
+          $collThisTableMs= $className . "RelatedBy" . $partJoinName;
+        }
+
+// ------------------------------------------------------------
+?>
+  /**
+  * Selects a collection of <?php echo $className ?> objects pre-filled with their
+  * <?php echo $joinClassName ?> objects.
+  *
+  * @return array Array of <?php echo $className ?> objects.
+  * @throws PropelException Any exceptions caught during processing will be
+  *         rethrown wrapped into a PropelException.
+  */
+  function & doSelectJoin<?php echo $joinColumnId ?>(/*Criteria*/ $c, $con = null)
+  {
+    /* [MA] temporarily check */
+    Propel::assertParam($con, '<?php echo $CLASS; ?>', 'doSelectJoin<?php echo $joinColumnId; ?>', 2);
+
+    // Set the correct dbName if it has not been overridden
+    if ($c->getDbName() == Propel::getDefaultDB()) {
+      $c->setDbName(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+    }
+
+    <?php echo $table->getPhpName() ?>Peer::addSelectColumns($c);
+    $startcol = <?php echo $table->getPhpName() ?>Peer::numColumns() - <?php echo $table->getPhpName() ?>Peer::numLazyLoadColumns() + 1;
+    <?php echo $joinClassName ?>Peer::addSelectColumns($c);
+
+<?php
+   $lfMap = $fk->getLocalForeignMapping();
+   foreach ($fk->getLocalColumns() as $columnName ) {
+    $column = $table->getColumn($columnName);
+    $columnFk = $joinTable->getColumn( $lfMap[$columnName]);
+?>
+    $c->addJoin(<?php echo PeerBuilder::getColumnName($column, $table->getPhpName()) ?>(), <?php echo PeerBuilder::getColumnName($columnFk,$joinClassName)?>());
+   <?php } ?>
+
+    $rs =& <?php echo $basePeerClassname ?>::doSelect($c, $con);
+    if (Propel::isError($rs)) { return $rs; }
+
+    $results = array();
+
+    while($rs->next())
+    {
+<?php if ($table->getChildrenColumn()) { ?>
+      $omClass = <?php echo $table->getPhpName() ?>Peer::getOMClass($rs, 1);
+<?php } else { ?>
+      $omClass = <?php echo $table->getPhpName() ?>Peer::getOMClass();
+<?php } ?>
+
+      $cls =& Propel::import($omClass);
+      if (Propel::isError($cls)) { return $cls; }
+
+      $obj1 =& new $cls();
+
+      $e =& $obj1->hydrate($rs);
+      if (Propel::isError($e)) { return $e; }
+
+<?php if ($joinTable->getChildrenColumn()) { ?>
+      $omClass = <?php echo $joinClassName ?>Peer::getOMClass($rs, $startcol);
+<?php } else { ?>
+      $omClass = <?php echo $joinClassName ?>Peer::getOMClass();
+<?php } ?>
+
+      $cls =& Propel::import($omClass);
+      if (Propel::isError($cls)) { return $cls; }
+
+      $obj2 =& new $cls();
+
+      $e =& $obj2->hydrate($rs, $startcol);
+      if (Propel::isError($e)) { return $e; }
+
+      $newObject = true;
+      foreach($results as $temp_obj1)
+      {
+        $temp_obj2 =& $temp_obj1->get<?php echo $joinInterface ?>();
+        if ($temp_obj2->getPrimaryKey() === $obj2->getPrimaryKey()) {
+          $newObject = false;
+          $temp_obj2->add<?php echo $collThisTableMs ?>($obj1);
+          break;
+        }
+      }
+      if ($newObject) {
+        $obj2->init<?php echo $collThisTable ?>();
+        $obj2->add<?php echo $collThisTableMs ?>($obj1);
+      }
+      $results[] =& $obj1;
+    }
+
+    return $results;
+  }
+<?php
+    } // if fk table name != this table name
+   } // if ! is reference only
+  } // foreach column
+ } // if count(fk) > 1
+
+// ===========================================================
+
+  if ($countFK > 1) {
+    $includeJoinAll = true;
+    foreach ($table->getForeignKeys() as $fk) {
+      $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+      if ($tblFK->isForReferenceOnly()) {
+        $includeJoinAll = false;
+      }
+    }
+
+    if ($includeJoinAll) {
+      // ------------------------------------------------------------------------
+      // doSelectJoinAll()
+      // ------------------------------------------------------------------------
+  
+      //1 ) create the master doSelectJoinAll() method
+      
+      $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+      
+      $relatedByCol = "";
+      foreach ($fk->getLocalColumns() as $columnName) {
+        $column = $table->getColumn($columnName);
+        if ($column->isMultipleFK()) {
+          $relatedByCol .= $column->getPhpName();
+        }
+      }
+    
+      if ($relatedByCol == "") {
+        $collThisTable = "${className}s";
+        $collThisTableMs = $className;
+      } else {
+        $collThisTable = $className . "sRelatedBy" . $relatedByCol;
+        $collThisTableMs = $className . "RelatedBy" . $relatedByCol;
+      }
+?>
+
+  /**
+  * Selects a collection of <?php echo $className ?> objects pre-filled with
+  * all related objects.
+  *
+  * @return array Array of <?php echo $className ?> objects.
+  * @throws PropelException Any exceptions caught during processing will be
+  *         rethrown wrapped into a PropelException.
+  */
+  function doSelectJoinAll(/*Criteria*/ &$c, $con = null)
+  {
+    /* [MA] temporarily check */
+    Propel::assertParam($con, '<?php echo $CLASS; ?>', 'doSelectJoinAll', 2);
+    
+    // Set the correct dbName if it has not been overridden
+    if ($c->getDbName() == Propel::getDefaultDB()) {
+      $c->setDbName(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+    }
+
+    <?php echo $table->getPhpName() ?>Peer::addSelectColumns($c);
+    $startcol2 = <?php echo $table->getPhpName() ?>Peer::numColumns() - <?php echo $table->getPhpName() ?>Peer::numLazyLoadColumns() + 1;
+<?php
+      $index = 2;
+      foreach ($table->getForeignKeys() as $fk) {
+        // want to cover this case, but the code is not there yet.
+        if ( $fk->getForeignTableName() != $table->getName() ) {
+          $joinTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+          $joinClassName = $joinTable->getPhpName();
+          $new_index = $index + 1;
+?> 
+    <?php echo $joinClassName ?>Peer::addSelectColumns($c);
+    $startcol<?php echo $new_index ?> = $startcol<?php echo $index?> + <?php echo $joinClassName ?>Peer::numColumns();
+<?php
+          $index = $new_index;
+      } // if fk->getForeignTableName != table->getName
+    } // foreach [sub] foreign keys
+    
+    foreach ($table->getForeignKeys() as $fk) {
+      // want to cover this case, but the code is not there yet.
+      if ( $fk->getForeignTableName() != $table->getName() ) {
+        $joinTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+        $joinClassName = $joinTable->getPhpName();
+        $lfMap = $fk->getLocalForeignMapping();
+        foreach ($fk->getLocalColumns() as $columnName ) {
+          $column = $table->getColumn($columnName);
+          $columnFk = $joinTable->getColumn( $lfMap[$columnName]);
+?>
+    $c->addJoin(<?php echo PeerBuilder::getColumnName($column, $table->getPhpName()) ?>(), <?php echo PeerBuilder::getColumnName($columnFk,$joinClassName)?>());
+<?php
+        } // foreach
+      } // if
+    } // foreach
+?>
+
+    $rs =& <?php echo $basePeerClassname ?>::doSelect($c, $con);
+    if (Propel::isError($rs)) { return $rs; }
+    $results = array();
+    
+    while($rs->next()) {
+<?php 
+    if ($table->getChildrenColumn()) { 
+?> 
+      $omClass = <?php echo $table->getPhpName() ?>Peer::getOMClass($rs, 1);
+<?php 
+    } else {
+?> 
+      $omClass = <?php echo $table->getPhpName() ?>Peer::getOMClass();
+<?php 
+    } 
+?>
+      
+      $cls = Propel::import($omClass);
+      if (Propel::isError($cls)) { return $cls; }
+      
+      $obj1 =& new $cls();
+      
+      $e =& $obj1->hydrate($rs);
+      if (Propel::isError($e)) { return $e; }
+<?php
+    $index = 1;
+    foreach ($table->getForeignKeys() as $fk ) {
+      // want to cover this case, but the code is not there yet.
+      if ( $fk->getForeignTableName() != $table->getName() ) {
+        $joinTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+        $joinClassName = $joinTable->getPhpName();
+        $interfaceName = $joinTable->getPhpName();
+        if($joinTable->getInterface()) {
+          $interfaceName = $joinTable->getInterface();
+        }
+        
+        $partJoinName = "";
+        foreach ($fk->getLocalColumns() as $columnName ) {
+          $column = $table->getColumn($columnName);
+          if ($column->isMultipleFK()) {
+            $partJoinName .= $column->getPhpName();
+          }
+        }
+        
+        if ($partJoinName == "") {
+          $joinString = $interfaceName;
+          $collThisTable = "${className}s";
+          $collThisTableMs = $className;
+        } else {
+          $joinString= $interfaceName."RelatedBy" . $partJoinName;
+          $collThisTable= $className . "sRelatedBy" . $partJoinName;
+          $collThisTableMs= $className . "RelatedBy" . $partJoinName;
+        }
+        
+        $index++;
+?> 
+      
+      // Add objects for joined <?php echo $joinClassName ?> rows
+<?php
+        if ($joinTable->getChildrenColumn()) {
+?> 
+      $omClass = <?php echo $joinClassName ?>Peer::getOMClass($rs, $startcol<?php echo $index ?>);
+<?php   } else { ?>
+      $omClass = <?php echo $joinClassName ?>Peer::getOMClass();
+<?php 
+        } /* $joinTable->getChildrenColumn() */
+?>
+  
+      $cls = Propel::import($omClass);
+      if (Propel::isError($cls)) { return $cls; }
+      
+      $obj<?php echo $index ?> =& new $cls();
+      
+      $e = $obj<?php echo $index ?>->hydrate($rs, $startcol<?php echo $index ?>);
+      if (Propel::isError($e)) { return $e; }
+      
+      $newObject = true;
+      for ($j=0, $resCount=count($results); $j < $resCount; $j++) {
+        $temp_obj1 =& $results[$j];
+        $temp_obj<?php echo $index ?> =& $temp_obj1->get<?php echo $joinString ?>();
+        if ($temp_obj<?php echo $index ?>->getPrimaryKey() === $obj<?php echo $index ?>->getPrimaryKey()) {
+          $newObject = false;
+          $temp_obj<?php echo $index ?>->add<?php echo $collThisTableMs ?>($obj1);
+          break;
+        }
+      }
+      
+      if ($newObject) {
+        $obj<?php echo $index ?>->init<?php echo $collThisTable ?>();
+        $obj<?php echo $index ?>->add<?php echo $collThisTableMs ?>($obj1);
+      }
+  <?php
+
+      } // $fk->getForeignTableName() != $table->getName()
+    } //foreach foreign key
+?>
+      $results[] =& $obj1;
+    }
+    
+    return $results;
+  }
+<?php   
+    
+    // ------------------------------------------------------------------------
+    // doSelectJoinAllExcept*()
+    // ------------------------------------------------------------------------
+    
+    // 2) create a bunch of doSelectJoinAllExcept*() methods
+    // -- these were existing in original Torque, so we should keep them for compatibility
+    
+    $fkeys = $table->getForeignKeys();  // this sep assignment is necessary otherwise sub-loops over 
+    foreach ($fkeys as $fk ) {          // getForeignKeys() will cause this to only execute one time.
+      $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+
+      $excludeTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+      $excludeClassName = $excludeTable->getPhpName();
+
+      $relatedByCol = "";
+      foreach ($fk->getLocalColumns() as $columnName) {
+        $column = $table->getColumn($columnName);
+        if ($column->isMultipleFK()) {
+          $relatedByCol .= $column->getPhpName();
+        }
+      }
+
+      if ($relatedByCol == "") {
+        $excludeString = $excludeClassName;
+        $collThisTable = "${className}s";
+        $collThisTableMs = $className;
+      } else {
+        $excludeString = $excludeClassName . "RelatedBy" . $relatedByCol;
+        $collThisTable = $className . "sRelatedBy" . $relatedByCol;
+        $collThisTableMs = $className . "RelatedBy" . $relatedByCol;
+      }
+?>
+
+  /**
+  * Selects a collection of <?php echo $className ?> objects pre-filled with
+  * all related objects except <?php echo $excludeString ?>.
+  *
+  * @return array Array of <?php echo $className ?> objects.
+  * @throws PropelException Any exceptions caught during processing will be
+  *     rethrown wrapped into a PropelException.
+  */
+  function doSelectJoinAllExcept<?php echo $excludeString ?>(/*Criteria*/ &$c, $con = null)
+  {
+    /* [MA] temporarily check */
+    Propel::assertParam($con, '<?php echo $CLASS; ?>', 'doSelectJoinAllExcept<?php echo $excludeString; ?>', 2);
+    
+    // Set the correct dbName if it has not been overridden
+    // $c->getDbName() will return the same object if not set to another value
+    // so == check is okay and faster
+    if ($c->getDbName() == Propel::getDefaultDB()) {
+      $c->setDbName(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+    }
+
+    <?php echo $table->getPhpName() ?>Peer::addSelectColumns($c);
+    $startcol2 = <?php echo $table->getPhpName() ?>Peer::numColumns() - <?php echo $table->getPhpName() ?>Peer::numLazyLoadColumns() + 1;
+<?php
+      $index = 2;
+      foreach ($table->getForeignKeys() as $subfk) {
+        // want to cover this case, but the code is not there yet.
+      if ( !($subfk->getForeignTableName() == $table->getName())) {
+        $joinTable = $table->getDatabase()->getTable($subfk->getForeignTableName());
+        $joinClassName = $joinTable->getPhpName();
+  
+        if ($joinClassName != $excludeClassName) {
+          $new_index = $index + 1;
+?> 
+    <?php echo $joinClassName ?>Peer::addSelectColumns($c);
+    $startcol<?php echo $new_index ?> = $startcol<?php echo $index?> + <?php echo $joinClassName ?>Peer::numColumns();
+<?php
+          $index = $new_index;
+        } 
+      }
+    } // foreach [sub] foreign keys    
+    
+    foreach ($table->getForeignKeys() as $subfk) {
+      // want to cover this case, but the code is not there yet.
+      if ( $subfk->getForeignTableName() != $table->getName() ) {
+        $joinTable = $table->getDatabase()->getTable($subfk->getForeignTableName());
+        $joinClassName = $joinTable->getPhpName();
+        if($joinClassName != $excludeClassName)
+        {
+          $lfMap = $subfk->getLocalForeignMapping();
+          foreach ($subfk->getLocalColumns() as $columnName ) {
+            $column = $table->getColumn($columnName);
+            $columnFk = $joinTable->getColumn( $lfMap[$columnName]);
+?>
+    $c->addJoin(<?php echo PeerBuilder::getColumnName($column, $table->getPhpName()) ?>(), <?php echo PeerBuilder::getColumnName($columnFk,$joinClassName)?>());
+<?php
+          }
+        }
+      }
+    }
+?>
+
+    $rs =& <?php echo $basePeerClassname ?>::doSelect($c, $con);
+    if (Propel::isError($rs)) { return $rs; }
+    
+    $results = array();
+    
+    while($rs->next()) {
+<?php
+    if ($table->getChildrenColumn()) {
+?> 
+      $omClass = <?php echo $table->getPhpName() ?>Peer::getOMClass($rs, 1);
+<?php
+    } else {
+?> 
+      $omClass = <?php echo $table->getPhpName() ?>Peer::getOMClass();
+<?php
+    }
+?>
+      
+      $cls = Propel::import($omClass);
+      if (Propel::isError($cls)) { return $cls; }
+      
+      $obj1 =& new $cls();
+      $e = $obj1->hydrate($rs);
+      if (Propel::isError($e)) { return $e; }
+      
+<?php
+    $index = 1;
+    foreach ($table->getForeignKeys() as $subfk ) {
+      // want to cover this case, but the code is not there yet.
+      if ( $subfk->getForeignTableName() != $table->getName() ) {
+        $joinTable = $table->getDatabase()->getTable($subfk->getForeignTableName());
+        $joinClassName = $joinTable->getPhpName();
+        $interfaceName = $joinTable->getPhpName();
+
+        if($joinTable->getInterface()) {
+          $interfaceName = $joinTable->getInterface();
+        }
+
+        if ($joinClassName != $excludeClassName) {
+          $partJoinName = "";
+          foreach ($subfk->getLocalColumns() as $columnName ) {
+            $column = $table->getColumn($columnName);
+            if ($column->isMultipleFK()) {
+              $partJoinName .= $column->getPhpName();
+            }
+          }
+
+          if ($partJoinName == "") {
+            $joinString = $interfaceName;
+            $collThisTable = "${className}s";
+            $collThisTableMs = $className;
+          } else {
+            $joinString= $interfaceName."RelatedBy" . $partJoinName;
+            $collThisTable= $className . "sRelatedBy" . $partJoinName;
+            $collThisTableMs= $className . "RelatedBy" . $partJoinName;
+          }
+
+          $index++;
+
+          if ($joinTable->getChildrenColumn()) {
+?>
+      $omClass = <?php echo $joinClassName ?>Peer::getOMClass($rs, $startcol<?php echo $index ?>);
+<?php     } else { ?>
+      $omClass = <?php echo $joinClassName ?>Peer::getOMClass();
+<?php 
+          } /* $joinTable->getChildrenColumn() */
+?>
+  
+      $cls = Propel::import($omClass);
+      if (Propel::isError($cls)) { return $cls; }
+      
+      $obj<?php echo $index ?>  =& new $cls();
+      
+      $e = $obj<?php echo $index ?>->hydrate($rs, $startcol<?php echo $index ?>);
+      if (Propel::isError($e)) { return $e; }
+      
+      $newObject = true;
+      for ($j=0, $resCount=count($results); $j < $resCount; $j++) {
+        $temp_obj1 =& $results[$j];
+        $temp_obj<?php echo $index ?> =& $temp_obj1->get<?php echo $joinString ?>();
+        if ($temp_obj<?php echo $index ?>->getPrimaryKey() === $obj<?php echo $index ?>->getPrimaryKey()) {
+          $newObject = false;
+          $temp_obj<?php echo $index ?>->add<?php echo $collThisTableMs ?>($obj1);
+          break;
+        }
+      }
+      
+      if ($newObject) {
+        $obj<?php echo $index ?>->init<?php echo $collThisTable ?>();
+        $obj<?php echo $index ?>->add<?php echo $collThisTableMs ?>($obj1);
+      }
+  <?php
+        } // if ($joinClassName != $excludeClassName) {
+      } // $subfk->getForeignTableName() != $table->getName()
+    } // foreach  
+?>
+      $results[] =& $obj1;
+    }
+    
+    return $results;
+  }
+<?php
+       } // foreach fk
+         // end of doSelectJoinAllExcept*() block
+     } // if includeJoinAll
+   } /* if count($fk) > 2 */
+ } /* if complex object model */
+
+ // two extra #end ...
+
+
+//------------------------------------------------------------
+
+if (!$table->isAlias()) {
+?>
+  /**
+   * Returns the TableMap related to this peer.  This method is not
+   * needed for general use but a specific application could have a need.
+   * @return TableMap
+   * @throws PropelException Any exceptions caught during processing will be
+   *         rethrown wrapped into a PropelException.
+   */
+  function & getTableMap()
+  {
+    $dbMap =& Propel::getDatabaseMap(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME());
+    if (Propel::isError($dbMap)) {
+      return $dbMap;
+    }
+    return $dbMap->getTable(<?php echo $table->getPhpName()?>Peer::TABLE_NAME());
+  }
+
+<?php } /* !table->isalias */ ?>
+}
+
+// static code to register the map builder for this Peer with the main Propel class
+if (Propel::isInit()) {
+  // the MapBuilder classes register themselves with Propel during initialization
+  // so we need to load them here.
+  if (Propel::isError($e = <?php echo $basePrefix . $table->getPhpName() ?>Peer::getMapBuilder())) {
+    Propel::log("Could not initialize Peer: " . $e->getMessage(), PROPEL_LOG_ERR);
+  }
+} else {
+  // even if Propel is not yet initialized, the map builder class can be registered
+  // now and then it will be loaded when Propel initializes.
+  require_once '<?php echo ClassTools::getFilePath($pkmap, $table->getPhpName() . 'MapBuilder') ?>';
+  Propel::registerMapBuilder(<?php echo $table->getPhpName()?>MapBuilder::CLASS_NAME());
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionNode.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionNode.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionNode.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+<?php
+
+// Create empty stub node class which extends the BaseNode class created in Node.tpl.
+//
+// $Id: ExtensionNode.tpl,v 1.2 2004/10/06 16:54:47 hlellelid Exp $
+
+echo '<' . '?' . 'php';
+
+$db = $table->getDatabase();
+if($table->getPackage()) {
+    $package = $table->getPackage();
+} else {
+    $package = $targetPackage;
+}
+
+?>
+
+
+require_once '<?php echo ClassTools::getFilePath($pkbase, $basePrefix . $table->getPhpName() . 'Node') ?>';
+
+/** 
+ * The skeleton for this class was autogenerated by Propel <?php if ($addTimeStamp) { ?> on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ *
+ * @package <?php echo $package ?> 
+ */
+class <?php echo $table->getPhpName() ?>Node extends <?php echo $basePrefix . $table->getPhpName() . 'Node' ?> {
+
+}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionNodePeer.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionNodePeer.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionNodePeer.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+<?php
+
+// Create empty stub node peer class which extends the BaseNodePeer class created in NodePeer.tpl.
+//
+// $Id: ExtensionNodePeer.tpl,v 1.2 2004/10/06 16:54:47 hlellelid Exp $
+
+echo '<' . '?' . 'php';
+
+$db = $table->getDatabase();
+if($table->getPackage()) {
+    $package = $table->getPackage();
+} else {
+    $package = $targetPackage;
+}
+
+?>
+
+
+require_once '<?php echo ClassTools::getFilePath($pkbase, $basePrefix . $table->getPhpName() . 'NodePeer') ?>';
+
+/** 
+ * The skeleton for this class was autogenerated by Propel <?php if ($addTimeStamp) { ?> on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ *
+ * @package <?php echo $package ?> 
+ */
+class <?php echo $table->getPhpName() ?>NodePeer extends <?php echo $basePrefix . $table->getPhpName() . 'NodePeer' ?> {
+
+}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionObject.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionObject.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionObject.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,49 @@
+<?php
+
+// Create empty stub object class which extends the Base class created in Object.tpl.
+//
+// $Id: ExtensionObject.tpl,v 1.5 2004/10/06 16:54:47 hlellelid Exp $
+
+echo '<' . '?' . 'php';
+
+
+$interface = ClassTools::getInterface($table);
+
+if (!empty($interface)) {
+?>
+
+require_once '<?php echo ClassTools::getFilePath($interface) ?>';
+
+<?php
+}
+
+$db = $table->getDatabase();
+if($table->getPackage()) {
+    $package = $table->getPackage();
+} else {
+    $package = $targetPackage;
+}
+
+$abstract = "";
+if ($table->isAbstract()) {
+    $abstract = "abstract ";
+}
+?>
+
+require_once '<?php echo ClassTools::getFilePath($pkbase, $basePrefix . $table->getPhpName()) ?>';
+
+/** 
+ * The skeleton for this class was autogenerated by Propel <?php if ($addTimeStamp) { ?> on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ *
+ * @package <?php echo $package ?> 
+ */
+<?php echo $abstract ?>class <?php echo $table->getPhpName() ?> extends <?php echo $basePrefix . $table->getPhpName() ?><?php if (!empty($interface)) { ?> implements <?php echo ClassTools::classname($interface) ?><?php } ?> {
+
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionPeer.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionPeer.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/ExtensionPeer.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,37 @@
+<?php
+
+//  Create empty stub Peer class which extends the Base class created in Peer.tpl.
+//
+// $Id: ExtensionPeer.tpl,v 1.2 2004/10/06 16:54:47 hlellelid Exp $
+
+echo '<' . '?' . 'php';
+	
+$db = $table->getDatabase();
+if($table->getPackage()) {
+    $package = $table->getPackage();
+} else {
+    $package = $targetPackage;
+}
+?>
+
+// The parent class
+require_once '<?php echo ClassTools::getFilePath($pkbase, $basePrefix . $table->getPhpName() . 'Peer') ?>';
+
+// The object class
+include_once '<?php echo ClassTools::getFilePath($package, $table->getPhpName()) ?>';
+
+/** 
+ * The skeleton for this class was autogenerated by Propel <?php if ($addTimeStamp) { ?>on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ *  You should add additional methods to this class to meet the
+ *  application requirements.  This class will only be generated as
+ *  long as it does not already exist in the output directory.
+ *
+ * @package <?php echo $package ?> 
+ */
+class <?php echo $table->getPhpName()?>Peer extends <?php echo $basePrefix . $table->getPhpName() ?>Peer {
+
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Interface.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Interface.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Interface.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,33 @@
+<?php
+
+// Create an empty interface.
+//
+// $Id: Interface.tpl,v 1.2 2004/10/06 16:54:47 hlellelid Exp $
+ 
+echo '<' . '?' . 'php';
+$db = $table->getDatabase();
+if($table->getPackage()) {
+    $package = $table->getPackage();
+} else {
+    $package = $targetPackage;
+}
+
+$interface = ClassTools::getInterface($table);
+
+?>
+
+
+/** 
+ * This is an interface that should be filled with the public api of the 
+ * <?php echo $table->getPhpName()?> objects.  
+ * The skeleton for this class was autogenerated by Propel <?php if ($addTimeStamp) { ?>on:
+ *
+ * [<?php echo $now ?>]
+ * <?php } ?> 
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory. 
+ */
+interface <?php echo ClassTools::classname($interface) ?> {
+
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/MapBuilder.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/MapBuilder.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/MapBuilder.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,135 @@
+<?php
+
+// Create a MapBuilder class for describing the current database at runtime.
+//
+// $Id: MapBuilder.tpl,v 1.2 2004/12/04 14:32:45 micha Exp $
+
+echo '<' . '?' . 'php';
+
+?>
+
+require_once 'propel/map/MapBuilder.php';
+include_once 'creole/CreoleTypes.php';
+
+/**
+ * This class adds structure of '<?php echo $table->getName() ?>' table to '<?php echo $table->getDatabase()->getName() ?>' DatabaseMap object.
+ *
+ * These statically-built map classes are used by Propel to do runtime db structure discovery.
+ * For example, the createSelectSql() method checks the type of a given column used in an 
+ * ORDER BY clause to know whether it needs to apply SQL to make the ORDER BY case-insensitive 
+ * (i.e. if it's a text column type).
+ *
+<?php if ($addTimeStamp) { ?>
+ *  This class was autogenerated by Propel on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * @see BasePeer
+ * @see DatabaseMap
+ * @package <?php echo $package ?>.map
+ */
+class <?php echo $table->getPhpName() ?>MapBuilder implements MapBuilder {
+
+    /**
+     * The name of this class
+     */
+    const CLASS_NAME = "<?php echo $pkmap . '.' . $table->getPhpName() ?>MapBuilder";
+	
+    /**
+     * The database map.
+     */
+    private $dbMap = null;
+
+    /**
+     * Tells us if this DatabaseMapBuilder is built so that we
+     * don't have to re-build it every time.
+     *
+     * @return true if this DatabaseMapBuilder is built
+     */
+    public function isBuilt()
+    {
+        return ($this->dbMap !== null);
+    }
+
+    /**
+     * Gets the databasemap this map builder built.
+     *
+     * @return the databasemap
+     */
+    public function getDatabaseMap()
+    {
+        return $this->dbMap;
+    }
+
+    /**
+     * The doBuild() method builds the DatabaseMap
+     *
+	 * @return void
+     * @throws PropelException
+     */
+    public function doBuild()
+    {
+		$this->dbMap = Propel::getDatabaseMap("<?php echo $table->getDatabase()->getName() ?>");
+		
+		$tMap = $this->dbMap->addTable("<?php echo $table->getName()?>");
+		$tMap->setPhpName("<?php echo $table->getPhpName()?>");
+		
+        <?php if ($table->getIdMethod() == "native") { ?> 
+		$tMap->setUseIdGenerator(true);
+		<?php } else { ?> 
+		$tMap->setUseIdGenerator(false);
+		<?php } ?> 
+						
+		<?php if ($table->getIdMethodParameters()) {
+			$params = $table->getIdMethodParameters();
+			$imp = $params[0]; ?> 
+		$tMap->setPrimaryKeyMethodInfo("<?php echo $imp->getValue() ?>");
+		<?php } elseif ($table->getIdMethod() == "native" && ($platform->getNativeIdMethod() == Platform::SEQUENCE)) { ?> 
+		$tMap->setPrimaryKeyMethodInfo("<?php echo $table->getSequenceName() ?>");
+		<?php } elseif ($table->getIdMethod() == "native" && ($platform->getNativeIdMethod() == Platform::SEQUENCE)) { ?> 
+		$tMap->setPrimaryKeyMethodInfo("<?php echo $table->getName() ?>");
+		<?php } ?> 
+		
+		// Add columns to map
+<?php foreach ($table->getColumns() as $col) {
+	$tfc=$table->getPhpName();
+	$cfc=$col->getPhpName();
+	$cup=strtoupper($col->getName());
+	if (!$col->getSize()) {
+		$size = "null";
+	} else {
+		$size = $col->getSize();
+	}
+	if($col->isPrimaryKey()) {
+		if($col->isForeignKey()) { ?>
+		$tMap->addForeignPrimaryKey("<?php echo $cup ?>", "<?php echo $cfc?>", "<?php echo $col->getPhpType() ?>" , CreoleTypes::<?php echo $col->getType() ?>, "<?php echo $col->getRelatedTableName()?>", "<?php echo strtoupper($col->getRelatedColumnName()) ?>", <?php echo $col->isNotNull() ? 'true' : 'false' ?>, <?php echo $size ?>);
+<?php	} else { ?>
+		$tMap->addPrimaryKey("<?php echo $cup ?>", "<?php echo $cfc?>", "<?php echo $col->getPhpType() ?>", CreoleTypes::<?php echo $col->getType() ?>, <?php echo $col->isNotNull() ? 'true' : 'false' ?>, <?php echo $size ?>);
+<?php } 
+
+	} else {
+		if($col->isForeignKey()) { ?>
+		$tMap->addForeignKey("<?php echo $cup ?>", "<?php echo $cfc?>", "<?php echo $col->getPhpType()?>", CreoleTypes::<?php echo $col->getType() ?>, "<?php echo $col->getRelatedTableName() ?>" , "<?php echo strtoupper($col->getRelatedColumnName()) ?>", <?php echo $col->isNotNull() ? 'true' : 'false' ?>, <?php echo $size ?>);
+<?php	} else { ?>
+		$tMap->addColumn("<?php echo $cup ?>", "<?php echo $cfc?>", "<?php echo $col->getPhpType()?>", CreoleTypes::<?php echo $col->getType() ?>, <?php echo $col->isNotNull() ? 'true' : 'false' ?>, <?php echo $size ?>);
+<?php 	} 
+	} // if col-is prim key
+} // foreach
+foreach($table->getValidators() as $val) {
+  $col = $val->getColumn();
+  $cup = strtoupper($col->getName());
+  foreach($val->getRules() as $rule) {
+    if ($val->getTranslate() !== Validator::TRANSLATE_NONE) {
+?>
+        $tMap->addValidator("<?php echo $cup ?>", "<?php echo $rule->getName() ?>", "<?php echo $rule->getClass() ?>", "<?php echo $rule->getValue()?>", <?php echo $val->getTranslate() ?>("<?php echo str_replace('"', '\"', $rule->getMessage()) ?>"));
+<?php } else { ?>
+        $tMap->addValidator("<?php echo $cup ?>", "<?php echo $rule->getName() ?>", "<?php echo $rule->getClass() ?>", "<?php echo $rule->getValue()?>", "<?php echo str_replace('"', '\"', $rule->getMessage()) ?>");
+<?php        
+    } // if ($rule->getTranslation() ...
+  } // foreach validator
+}
+?>
+				
+    }
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/MultiExtendObject.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/MultiExtendObject.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/MultiExtendObject.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,60 @@
+<?php
+
+// Create empty stub subclass which extends the parent stub om class created in ExtensionObject.tpl.
+//
+// $Id: MultiExtendObject.tpl,v 1.2 2004/10/06 16:54:47 hlellelid Exp $
+
+echo '<' . '?' . 'php';
+
+$db = $table->getDatabase();
+if($table->getPackage()) {
+    $package = $table->getPackage();
+} else {
+    $package = $targetPackage;
+}
+
+$packagePath = strtr($package, '.', '/');
+if ($packagePath != "") $packagePath .= '/';
+
+if ($child->getAncestor()) {
+    $parent = $child->getAncestor();
+?> 
+
+require_once '<?php echo strtr($parent, '.', '/') ?>.php';
+
+<?php
+	$parts = explode('.', $parent);
+	$parentClass = array_pop($parts);
+} else {
+	$parentClass = $table->getPhpName();
+?> 
+
+require_once '<?php echo $packagePath . $parentClass ?>.php';
+<?php
+}
+?>
+
+/** 
+<?php if ($addTimeStamp) { ?>
+
+ * The skeleton for this class was autogenerated by Propel on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ */
+class <?php echo $child->getClassName()?> extends <?php echo $parentClass ?> {
+
+    public function __construct()
+    {   <?php
+        $col = $child->getColumn();
+        $cfc=$col->getPhpName();
+        $table = $col->getTable();
+		?>		 
+        $this->set<?php echo $cfc ?>(<?php echo $table->getPhpName() ?>Peer::CLASSKEY_<?php echo strtoupper($child->getKey()) ?>);
+    }
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Node.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Node.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Node.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,801 @@
+<?php
+
+// Template for creating base node class on tree table.
+//
+// $Id: Node.tpl,v 1.6 2005/04/04 10:48:33 dlawson_mi Exp $
+
+
+require_once 'propel/engine/builder/om/ClassTools.php';
+
+$db = $table->getDatabase();
+if($table->getPackage()) {
+    $package = $table->getPackage();
+} else {
+    $package = $targetPackage;
+}
+
+echo '<' . '?' . 'php';
+
+?>
+
+
+require_once '<?php echo ClassTools::getFilePath($package, $table->getPhpName() . 'NodePeer') ?>';
+
+/**
+ * Base tree node class for manipulating a tree of <?php echo $table->getPhpName() ?> objects.
+ * This class will wrap these objects within a "node" interface. It provides a
+ * method overload mechanism which allows you to use a <?php echo $table->getPhpName() ?>Node
+ * object just like a <?php $table->getPhpName() ?> object.
+ * 
+ * To avoid tree corruption, you should always use this class to make changes to
+ * the tree and objects within it rather than using the <?php echo $table->getPhpName() ?> 
+ * class directly.
+ *
+<?php if (isset($addTimeStamp)) { ?>
+ * This class was autogenerated by Propel on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * @package <?php echo $package ?> 
+ *
+ */
+class <?php echo $basePrefix . $table->getPhpName() ?>Node implements IteratorAggregate
+{
+    /**
+     * @var <?php echo $table->getPhpName() ?> Object wrapped by this node.
+     */
+    protected $obj = null;
+    
+    /**
+     * The parent node for this node.
+     * @var <?php echo $table->getPhpName() ?>Node
+     */
+    protected $parentNode = null;
+
+    /**
+     * Array of child nodes for this node. Nodes indexes are one-based.
+     * @var array
+     */
+    protected $childNodes = array();
+
+    /**
+     * Constructor.
+     *
+     * @param <?php echo $table->getPhpName() ?> Object wrapped by this node.
+     */
+    public function __construct($obj = null) 
+    {
+        if ($obj !== null)
+        {
+            $this->obj = $obj;
+        }
+        else
+        {
+            $setNodePath = "set" . <?php echo $table->getPhpName() ?>NodePeer::NPATH_PHPNAME;
+            $this->obj = new <?php echo $table->getPhpName() ?>();
+            $this->obj->$setNodePath('0');
+        }
+    }
+
+    /**
+     * Convenience overload for wrapped object methods.
+     *
+     * @param string Method name to call on wrapped object.
+     * @param mixed Parameter accepted by wrapped object set method.
+     * @return mixed Return value of wrapped object method.
+     * @throws PropelException Fails if method is not defined for wrapped object.
+     */
+    public function __call($name, $parms)
+    {
+        if (method_exists($this->obj, $name))
+            return call_user_func_array(array($this->obj, $name), $parms);
+        else
+            throw new PropelException("get method not defined: $name");
+    }
+
+    /**
+     * Sets the default options for iterators created from this object.
+     * The options are specified in map format. The following options 
+     * are supported by all iterators. Some iterators may support other
+     * options:
+     *
+     *   "querydb" - True if nodes should be retrieved from database.
+     *   "con" - Connection to use if retrieving from database.
+     *
+     * @param string Type of iterator to use ("pre", "post", "level").
+     * @param array Map of option name => value.
+     * @return void
+     * @todo Implement other iterator types (i.e. post-order, level, etc.)
+     */ 
+    public function setIteratorOptions($type, $opts)
+    {
+        $this->itType = $type;
+        $this->itOpts = $opts;
+    }
+    
+    /**
+     * Returns a pre-order iterator for this node and its children.
+     *
+     * @param string Type of iterator to use ("pre", "post", "level")
+     * @param array Map of option name => value.
+     * @return NodeIterator
+     */
+    public function getIterator($type = null, $opts = null)
+    {
+        if ($type === null)
+            $type = (isset($this->itType) ? $this->itType : 'Pre');
+                
+        if ($opts === null)
+            $opts = (isset($this->itOpts) ? $this->itOpts : array());
+            
+        $itclass = ucfirst(strtolower($type)) . 'OrderNodeIterator';
+        
+        require_once('propel/om/' . $itclass . '.php');
+        return new $itclass($this, $opts);
+    }
+        
+    /**
+     * Returns the object wrapped by this class.
+     * @return <?php echo $table->getPhpName() . "\n" ?>
+     */
+    public function getNodeObj()
+    {
+        return $this->obj;
+    }
+        
+    /**
+     * Convenience method for retrieving nodepath.
+     * @return string
+     */
+    public function getNodePath()
+    {
+        $getNodePath = 'get' . <?php echo $table->getPhpName() ?>NodePeer::NPATH_PHPNAME;
+        return $this->obj->$getNodePath();
+    }
+
+    /**
+     * Returns one-based node index among siblings.
+     * @return int
+     */
+    public function getNodeIndex()
+    {
+        $npath =& $this->getNodePath();
+        $sep = strrpos($npath, <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP);
+        return (int) ($sep !== false ? substr($npath, $sep+1) : $npath);
+    }
+    
+    /**
+     * Returns one-based node level within tree (root node is level 1).
+     * @return int
+     */
+    public function getNodeLevel()
+    {
+        return (substr_count($this->getNodePath(), <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP) + 1);
+    }
+    
+    /** 
+     * Returns true if specified node is a child of this node. If recurse is
+     * true, checks if specified node is a descendant of this node.
+     *
+     * @param <?php echo $table->getPhpName() ?>Node Node to look for.
+     * @param boolean True if strict comparison should be used.
+     * @param boolean True if all descendants should be checked.
+     * @return boolean
+     */
+    public function hasChildNode($node, $strict = false, $recurse = false)
+    {
+        foreach ($this->childNodes as $childNode)
+        {
+            if ($childNode->equals($node, $strict))
+                return true;
+                
+            if ($recurse && $childNode->hasChildNode($node, $recurse))
+                return true;
+        }
+        
+        return false;
+    }
+
+    /**
+     * Returns child node at one-based index. Retrieves from database if not 
+     * loaded yet.
+     *
+     * @param int One-based child node index.
+     * @param boolean True if child should be retrieved from database.
+     * @param Connection Connection to use if retrieving from database.
+     * @return <?php echo $table->getPhpName() ?>Node
+     */
+    public function getChildNodeAt($i, $querydb = false, $con = null)
+    {
+        if ($querydb && 
+            !$this->obj->isNew() && 
+            !$this->obj->isDeleted() && 
+            !isset($this->childNodes[$i]))
+        {
+            $criteria = new Criteria(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME);
+            $criteria->add(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME, $this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP . $i, Criteria::EQUAL);
+
+            if ($childObj = <?php echo $table->getPhpName() ?>Peer::doSelectOne($criteria, $con))
+                $this->attachChildNode(new <?php echo $table->getPhpName() ?>Node($childObj));
+        }
+
+        return (isset($this->childNodes[$i]) ? $this->childNodes[$i] : null);
+    }
+
+    /**
+     * Returns first child node (if any). Retrieves from database if not loaded yet.
+     *
+     * @param boolean True if child should be retrieved from database.
+     * @param Connection Connection to use if retrieving from database.
+     * @return <?php echo $table->getPhpName() ?>Node
+     */
+    public function getFirstChildNode($querydb = false, $con = null)
+    {
+        return $this->getChildNodeAt(1, $querydb, $con);
+    }
+        
+    /**
+     * Returns last child node (if any). 
+     *
+     * @param boolean True if child should be retrieved from database.
+     * @param Connection Connection to use if retrieving from database.
+     */
+    public function getLastChildNode($querydb = false, $con = null)
+    {
+        $lastNode = null;
+
+        if ($this->obj->isNew() || $this->obj->isDeleted())
+        {
+            end($this->childNodes);
+            $lastNode = (count($this->childNodes) ? current($this->childNodes) : null);
+        }
+        else if ($querydb)
+        {
+            $db = Propel::getDb(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME);
+            $criteria = new Criteria(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME);
+            $criteria->add(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME, $this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP . '%', Criteria::LIKE);
+            $criteria->addAnd(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME, $this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP . '%' . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP . '%', Criteria::NOT_LIKE);
+            $criteria->addAsColumn('npathlen', $db->strLength(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME));
+            $criteria->addDescendingOrderByColumn('npathlen');
+            $criteria->addDescendingOrderByColumn(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME);
+          
+            $lastObj = <?php echo $table->getPhpName() ?>Peer::doSelectOne($criteria, $con);
+            
+            if ($lastObj !== null)
+            {
+                $lastNode = new <?php echo $table->getPhpName() ?>Node($lastObj);
+                
+                end($this->childNodes);
+                $endNode = (count($this->childNodes) ? current($this->childNodes) : null);
+                
+                if ($endNode)
+                {
+                    if ($endNode->getNodePath() > $lastNode->getNodePath())
+                        throw new PropelException('Cached child node inconsistent with database.');
+                    else if ($endNode->getNodePath() == $lastNode->getNodePath())
+                        $lastNode = $endNode;
+                    else
+                        $this->attachChildNode($lastNode);
+                }
+                else
+                {
+                    $this->attachChildNode($lastNode);
+                }
+            }
+        }
+
+        return $lastNode;
+    }
+
+    /**
+     * Returns next (or previous) sibling node or null. Retrieves from database if 
+     * not loaded yet.
+     *
+     * @param boolean True if previous sibling should be returned.
+     * @param boolean True if sibling should be retrieved from database.
+     * @param Connection Connection to use if retrieving from database.
+     * @return <?php echo $table->getPhpName() ?>Node
+     */
+    public function getSiblingNode($prev = false, $querydb = false, $con = null)
+    {
+        $nidx = $this->getNodeIndex();
+        
+        if ($this->isRootNode())
+        {
+            return null;
+        }
+        else if ($prev)
+        {
+            if ($nidx > 1 && ($parentNode = $this->getParentNode($querydb, $con)))
+                return $parentNode->getChildNodeAt($nidx-1, $querydb, $con);
+            else
+                return null;
+        }
+        else
+        {
+            if ($parentNode = $this->getParentNode($querydb, $con))
+                return $parentNode->getChildNodeAt($nidx+1, $querydb, $con);
+            else
+                return null;
+        }
+    }
+
+    /**
+     * Returns parent node. Loads from database if not cached yet.
+     *
+     * @param boolean True if parent should be retrieved from database.
+     * @param Connection Connection to use if retrieving from database.
+     * @return <?php echo $table->getPhpName() ?>Node
+     */
+    public function getParentNode($querydb = true, $con = null)
+    {
+        if ($querydb &&
+            $this->parentNode === null && 
+            !$this->isRootNode() &&
+            !$this->obj->isNew() && 
+            !$this->obj->isDeleted())
+        {
+            $npath =& $this->getNodePath();
+            $sep = strrpos($npath, <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP);
+            $ppath = substr($npath, 0, $sep);
+            
+            $criteria = new Criteria(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME);
+            $criteria->add(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME, $ppath, Criteria::EQUAL);
+            
+            if ($parentObj = <?php echo $table->getPhpName() ?>Peer::doSelectOne($criteria, $con))
+            {
+                $parentNode = new <?php echo $table->getPhpName() ?>Node($parentObj);
+                $parentNode->attachChildNode($this);
+            }
+        }
+        
+        return $this->parentNode;
+    }
+
+    /** 
+     * Returns an array of all ancestor nodes, starting with the root node 
+     * first.
+     *
+     * @param boolean True if ancestors should be retrieved from database.
+     * @param Connection Connection to use if retrieving from database.
+     * @return array
+     */
+    public function getAncestors($querydb = false, $con = null)
+    {
+        $ancestors = array();
+        $parentNode = $this;
+        
+        while ($parentNode = $parentNode->getParentNode($querydb, $con))
+            array_unshift($ancestors, $parentNode);
+        
+        return $ancestors;
+    }
+    
+    /**
+     * Returns true if node is the root node of the tree.
+     * @return boolean
+     */
+    public function isRootNode()
+    {
+        return ($this->getNodePath() === '1');
+    }
+
+    /**
+     * Changes the state of the object and its descendants to 'new'.
+     * Also changes the node path to '0' to indicate that it is not a 
+     * stored node.
+     *
+     * @param boolean
+     * @return void
+     */
+    public function setNew($b)
+    {
+        $this->adjustStatus('new', $b);
+        $this->adjustNodePath($this->getNodePath(), '0');
+    }
+    
+    /**
+     * Changes the state of the object and its descendants to 'deleted'.
+     *
+     * @param boolean
+     * @return void
+     */
+    public function setDeleted($b)
+    {
+        $this->adjustStatus('deleted', $b);
+    }
+     
+    /**
+     * Adds the specified node (and its children) as a child to this node. If a
+     * valid $beforeNode is specified, the node will be inserted in front of 
+     * $beforeNode. If $beforeNode is not specified the node will be appended to
+     * the end of the child nodes.
+     *
+     * @param <?php echo $table->getPhpName() ?>Node Node to add.
+     * @param <?php echo $table->getPhpName() ?>Node Node to insert before.
+     * @param Connection Connection to use.
+     */
+    public function addChildNode($node, $beforeNode = null, $con = null)
+    {
+        if ($this->obj->isNew() && !$node->obj->isNew())
+            throw new PropelException('Cannot add stored nodes to a new node.');
+            
+        if ($this->obj->isDeleted() || $node->obj->isDeleted())
+            throw new PropelException('Cannot add children in a deleted state.');
+        
+        if ($this->hasChildNode($node))
+            throw new PropelException('Node is already a child of this node.');
+
+        if ($beforeNode && !$this->hasChildNode($beforeNode))
+            throw new PropelException('Invalid beforeNode.');
+            
+        if ($con === null)
+            $con = Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME);
+            
+        try {
+                
+            if (!$this->obj->isNew()) $con->begin();
+                
+            if ($beforeNode)
+            {
+                // Inserting before a node.
+                $childIdx = $beforeNode->getNodeIndex();
+                $this->shiftChildNodes(1, $beforeNode->getNodeIndex(), $con);
+            }
+            else
+            {
+                // Appending child node.
+                if ($lastNode = $this->getLastChildNode(true, $con))
+                    $childIdx = $lastNode->getNodeIndex()+1;
+                else
+                    $childIdx = 1;
+            }
+
+            // Add the child (and its children) at the specified index.
+
+            if (!$this->obj->isNew() && $node->obj->isNew())
+            {
+                $this->insertNewChildNode($node, $childIdx, $con);
+            }
+            else
+            {
+                // $this->isNew() && $node->isNew() ||
+                // !$this->isNew() && !node->isNew()
+                
+                $srcPath = $node->getNodePath();
+                $dstPath = $this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP . $childIdx;
+                
+                if (!$node->obj->isNew())
+                {
+                    <?php echo $table->getPhpName() ?>NodePeer::moveNodeSubTree($srcPath, $dstPath, $con);
+                    $parentNode = $node->getParentNode(true, $con);
+                }
+                else
+                {
+                    $parentNode = $node->getParentNode();
+                }
+                
+                if ($parentNode)
+                {
+                    $parentNode->detachChildNode($node);
+                    $parentNode->shiftChildNodes(-1, $node->getNodeIndex()+1, $con);
+                }
+            
+                $node->adjustNodePath($srcPath, $dstPath);
+            }
+
+            if (!$this->obj->isNew()) $con->commit();
+
+            $this->attachChildNode($node);
+
+        } catch (SQLException $e) {
+            if (!$this->obj->isNew()) $con->rollback();
+            throw new PropelException($e);
+        }
+    }
+
+    /**
+     * Moves the specified child node in the specified direction.
+     *
+     * @param <?php $table->getPhpName() ?>Node Node to move.
+     * @param int Number of spaces to move among siblings (may be negative).
+     * @param Connection Connection to use.
+     * @throws PropelException
+     */
+    public function moveChildNode($node, $direction, $con = null)
+    {
+        throw new PropelException('moveChildNode() not implemented yet.');
+    }
+    
+    /**
+     * Saves modified object data to the datastore.
+     *
+     * @param boolean If true, descendants will be saved as well.
+     * @param Connection Connection to use.
+     */
+    public function save($recurse = false, $con = null)
+    {
+        if ($this->obj->isDeleted())
+            throw new PropelException('Cannot save deleted node.');
+            
+        if (substr($this->getNodePath(), 0, 1) == '0')
+            throw new PropelException('Cannot save unattached node.');
+
+        if ($this->obj->isColumnModified(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME))
+            throw new PropelException('Cannot save manually modified node path.');
+        
+        $this->obj->save($con);
+        
+        if ($recurse)
+        {
+            foreach ($this->childNodes as $childNode)
+                $childNode->save($recurse, $con);
+        }
+    }
+    
+    /**
+     * Removes this object and all descendants from datastore.
+     *
+     * @param Connection Connection to use.
+     * @return void
+     * @throws PropelException
+     */
+    public function delete($con = null)
+    {
+        if ($this->obj->isDeleted())
+            throw new PropelException('This node has already been deleted.');
+
+        if (!$this->obj->isNew())
+        {
+            <?php echo $table->getPhpName() ?>NodePeer::deleteNodeSubTree($this->getNodePath(), $con);
+        }
+        
+        if ($parentNode = $this->getParentNode(true, $con))
+        {
+            $parentNode->detachChildNode($this);
+            $parentNode->shiftChildNodes(-1, $this->getNodeIndex()+1, $con);
+        }
+        
+        $this->setDeleted(true);
+    }
+
+    /**
+     * Compares the object wrapped by this node with that of another node. Use 
+     * this instead of equality operators to prevent recursive dependency 
+     * errors.
+     *
+     * @param <?php echo $table->getPhpName() ?>Node Node to compare.
+     * @param boolean True if strict comparison should be used.
+     * @return boolean
+     */
+    public function equals($node, $strict = false)
+    {
+        if ($strict)
+            return ($this->obj === $node->obj);
+        else
+            return ($this->obj == $node->obj);
+    }
+
+    /**
+     * This method is used internally when constructing the tree structure 
+     * from the database. To set the parent of a node, you should call 
+     * addChildNode() on the parent.
+     *
+     * @param <?php echo $table->getPhpName() ?>Node Parent node to attach.
+     * @return void
+     * @throws PropelException
+     */
+    public function attachParentNode($node)
+    {
+        if (!$node->hasChildNode($this, true))
+            throw new PropelException('Failed to attach parent node for non-child.');
+
+        $this->parentNode = $node;
+    }
+
+    /**
+     * This method is used internally when constructing the tree structure 
+     * from the database. To add a child to a node you should call the 
+     * addChildNode() method instead. 
+     *
+     * @param <?php echo $table->getPhpName() ?>Node Child node to attach.
+     * @return void
+     * @throws PropelException
+     */
+    public function attachChildNode($node)
+    {
+        if ($this->hasChildNode($node))
+            throw new PropelException('Failed to attach child node. Node already exists.');
+        
+        if ($this->obj->isDeleted() || $node->obj->isDeleted())
+            throw new PropelException('Failed to attach node in deleted state.');
+            
+        if ($this->obj->isNew() && !$node->obj->isNew())
+            throw new PropelException('Failed to attach non-new child to new node.');
+
+        if (!$this->obj->isNew() && $node->obj->isNew())
+            throw new PropelException('Failed to attach new child to non-new node.');
+
+        if ($this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP . $node->getNodeIndex() != $node->getNodePath())
+            throw new PropelException('Failed to attach child node. Node path mismatch.');
+        
+        $this->childNodes[$node->getNodeIndex()] = $node;
+        ksort($this->childNodes);
+        
+        $node->attachParentNode($this);
+    }
+
+    /**
+     * This method is used internally when deleting nodes. It is used to break
+     * the link to this node's parent.
+     * @param <?php echo $table->getPhpName() ?>Node Parent node to detach from.
+     * @return void
+     * @throws PropelException
+     */
+    public function detachParentNode($node)
+    {
+        if (!$node->hasChildNode($this, true))
+            throw new PropelException('Failed to detach parent node from non-child.');
+
+        unset($node->childNodes[$this->getNodeIndex()]);
+        $this->parentNode = null;        
+    }
+    
+    /**
+     * This method is used internally when deleting nodes. It is used to break
+     * the link to this between this node and the specified child.
+     * @param <?php echo $table->getPhpName() ?>Node Child node to detach.
+     * @return void
+     * @throws PropelException
+     */
+    public function detachChildNode($node)
+    {
+        if (!$this->hasChildNode($node, true))
+            throw new PropelException('Failed to detach non-existent child node.');
+        
+        unset($this->childNodes[$node->getNodeIndex()]);
+        $node->parentNode = null;
+    }
+    
+    /**
+     * Shifts child nodes in the specified direction and offset index. This 
+     * method assumes that there is already space available in the 
+     * direction/offset indicated. 
+     *
+     * @param int Direction/# spaces to shift. 1=leftshift, 1=rightshift
+     * @param int Node index to start shift at.
+     * @param Connection The connection to be used.
+     * @return void
+     * @throws PropelException
+     */
+    protected function shiftChildNodes($direction, $offsetIdx, $con)
+    {
+        if ($this->obj->isDeleted())
+            throw new PropelException('Cannot shift nodes for deleted object');
+                    
+        $lastNode = $this->getLastChildNode(true, $con);
+        $lastIdx = ($lastNode !== null ? $lastNode->getNodeIndex() : 0);
+
+        if ($lastNode === null || $offsetIdx > $lastIdx)
+            return;
+
+        if ($con === null)
+            $con = Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME);
+            
+        if (!$this->obj->isNew())
+        {
+            // Shift nodes in database.
+            
+            try {
+                
+                $con->begin();
+                 
+                $n = $lastIdx - $offsetIdx + 1;
+                $i = $direction < 1 ? $offsetIdx : $lastIdx;
+                
+                while ($n--)
+                {
+                    $srcPath = $this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP . $i;              // 1.2.2
+                    $dstPath = $this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP . ($i+$direction); // 1.2.3
+
+                    <?php echo $table->getPhpName() ?>NodePeer::moveNodeSubTree($srcPath, $dstPath, $con);
+                    
+                    $i -= $direction;
+                }
+                
+                $con->commit();
+                
+            } catch (SQLException $e) {
+                $con->rollback();
+                throw new PropelException($e);
+            }
+        }
+        
+        // Shift the in-memory objects.
+        
+        $n = $lastIdx - $offsetIdx + 1;
+        $i = $direction < 1 ? $offsetIdx : $lastIdx;
+
+        while ($n--)
+        {
+            if (isset($this->childNodes[$i]))
+            {
+                $srcPath = $this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP . $i;              // 1.2.2
+                $dstPath = $this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP . ($i+$direction); // 1.2.3
+                
+                $this->childNodes[$i+$direction] = $this->childNodes[$i];
+                $this->childNodes[$i+$direction]->adjustNodePath($srcPath, $dstPath);
+
+                unset($this->childNodes[$i]);
+            }
+            
+            $i -= $direction;
+        }
+        
+        ksort($this->childNodes);
+    }
+    
+    /**
+     * Inserts the node and its children at the specified childIdx.
+     *
+     * @param <?php echo $table->getPhpName() ?>Node Node to insert.
+     * @param int One-based child index to insert at.
+     * @param Connection Connection to use.
+     * @param void
+     */
+    protected function insertNewChildNode($node, $childIdx, $con)
+    {
+        if (!$node->obj->isNew())
+            throw new PropelException('Failed to insert non-new node.');
+
+        $setNodePath = "set" . <?php echo $table->getPhpName() ?>NodePeer::NPATH_PHPNAME;
+
+        $node->obj->$setNodePath($this->getNodePath() . <?php echo $table->getPhpName() ?>NodePeer::NPATH_SEP . $childIdx);
+        $node->obj->save($con);
+        
+        $i = 1;
+        foreach ($node->childNodes as $childNode)
+            $node->insertNewChildNode($childNode, $i++, $con);        
+    }
+
+    /**
+     * Adjust new/deleted status of node and all children. 
+     *
+     * @param string Status to change ('New' or 'Deleted')
+     * @param boolean Value for status.
+     * @return void
+     */
+    protected function adjustStatus($status, $b)
+    {
+        $setStatus = 'set' . $status;
+        
+        $this->obj->$setStatus($b);
+        
+        foreach ($this->childNodes as $childNode)
+            $childNode->obj->$setStatus($b);            
+    }
+    
+    /**
+     * Adjust path of node and all children. This is used internally when 
+     * inserting/moving nodes.
+     *
+     * @param string Section of old path to change.
+     * @param string New section to replace old path with.
+     * @return void
+     */
+    protected function adjustNodePath($oldBasePath, $newBasePath)
+    {
+        $setNodePath = "set" . <?php echo $table->getPhpName() ?>NodePeer::NPATH_PHPNAME;
+        
+        $this->obj->$setNodePath($newBasePath . 
+                                 substr($this->getNodePath(), strlen($oldBasePath)));
+        $this->obj->resetModified(<?php echo $table->getPhpName() ?>NodePeer::NPATH_COLNAME);
+
+        foreach ($this->childNodes as $childNode)
+            $childNode->adjustNodePath($oldBasePath, $newBasePath);
+    }
+
+}
+
+?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/NodePeer.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/NodePeer.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/NodePeer.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,522 @@
+<?php
+
+// Template for creating base node Peer class on tree table.
+//
+// $Id: NodePeer.tpl,v 1.6 2004/11/24 13:09:52 kasparsj Exp $
+
+require_once 'propel/engine/builder/om/ClassTools.php';
+require_once 'propel/engine/builder/om/PeerBuilder.php';
+
+$npath_colname = '';
+$npath_phpname = '';
+$npath_len = 0;
+$npath_sep = '';
+
+foreach ($table->getColumns() as $col) {
+    if ($col->isNodeKey()) {
+        $npath_colname = $table->getName() . '.' . strtoupper($col->getName());
+        $npath_phpname = $col->getPhpName();
+        $npath_len = $col->getSize();
+		$npath_sep = $col->getNodeKeySep();
+        break;
+    }
+}
+
+$db = $table->getDatabase();
+if($table->getPackage()) {
+    $package = $table->getPackage();
+} else {
+    $package = $targetPackage;
+}
+
+echo '<' . '?' . 'php';
+
+?>
+
+
+require_once '<?php echo ClassTools::getFilePath($package, $table->getPhpName()) ?>';
+require_once '<?php echo ClassTools::getFilePath($package, $table->getPhpName() . 'Node') ?>';
+
+
+/**
+ * Base static class for performing query operations on the tree contained by the 
+ * '<?php echo $table->getPhpName() ?>' table.
+ *
+<?php if ($addTimeStamp) { ?>
+ * This class was autogenerated by Propel on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * @package <?php echo $package ?> 
+ */
+class <?php echo $basePrefix . $table->getPhpName() ?>NodePeer
+{
+    const NPATH_COLNAME = '<?php echo $npath_colname ?>';
+    const NPATH_PHPNAME = '<?php echo $npath_phpname ?>';
+	const NPATH_SEP		= '<?php echo $npath_sep ?>';
+
+    /** 
+     * Temp function for CodeBase hacks that will go away.
+     */
+    public static function isCodeBase($con = null)
+    {
+        if ($con === null)
+            $con = Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME);
+            
+        return (get_class($con) == 'ODBCConnection' && 
+                get_class($con->getAdapter()) == 'CodeBaseAdapter');
+    }
+    
+    /**
+     * Create a new Node at the top of tree. This method will destroy any 
+     * existing root node (along with its children). 
+     *
+     * Use at your own risk!
+     *
+     * @param <?php echo $table->getPhpName() ?> Object wrapped by new node.
+     * @param Connection Connection to use.
+     * @return <?php echo $table->getPhpName() ?>Node
+     * @throws PropelException
+     */
+    public static function createNewRootNode($obj, $con = null)
+    {
+        if ($con === null)
+            $con = Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME);
+        
+        try {
+
+            $con->begin();
+
+            self::deleteNodeSubTree('1', $con);
+            
+            $setNodePath = 'set' . self::NPATH_PHPNAME;
+
+            $obj->$setNodePath('1');
+            $obj->save($con);
+
+            $con->commit();
+            
+        } catch (PropelException $e) {
+            $con->rollback();
+            throw $e;
+        }            
+
+        return new <?php echo $table->getPhpName() ?>Node($obj);
+    }
+    
+    /**
+     * Inserts a new Node at the top of tree. Any existing root node (along with
+     * its children) will be made a child of the new root node. This is a 
+     * safer alternative to createNewRootNode().
+     *
+     * @param <?php echo $table->getPhpName() ?> Object wrapped by new node.
+     * @param Connection Connection to use.
+     * @return <?php echo $table->getPhpName() ?>Node
+     * @throws PropelException
+     */
+    public static function insertNewRootNode($obj, $con = null)
+    {
+        if ($con === null)
+            $con = Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME);
+        
+        try {
+            
+            $con->begin();
+            
+            // Move root tree to an invalid node path.
+            self::moveNodeSubTree('1', '0', $con);
+
+            $setNodePath = 'set' . self::NPATH_PHPNAME;
+            
+            // Insert the new root node.
+            $obj->$setNodePath('1');
+            $obj->save($con);
+
+            // Move the old root tree as a child of the new root.
+            self::moveNodeSubTree('0', '1' . self::NPATH_SEP . '1', $con);
+            
+            $con->commit();
+                        
+        } catch (PropelException $e) {
+            $con->rollback();
+            throw $e;
+        }            
+        
+        return new <?php echo $table->getPhpName() ?>Node($obj);
+    }
+
+    /**
+     * Retrieves an array of tree nodes based on specified criteria. Optionally 
+     * includes all parent and/or child nodes of the matching nodes.
+     *
+     * @param Criteria Criteria to use.
+     * @param boolean True if ancestors should also be retrieved.
+     * @param boolean True if descendants should also be retrieved.
+     * @param Connection Connection to use.
+     * @return array Array of root nodes.
+     */
+    public static function retrieveNodes($criteria, $ancestors = false, $descendants = false, $con = null)
+    {
+        $criteria = self::buildFamilyCriteria($criteria, $ancestors, $descendants);
+        $rs = <?php echo $table->getPhpName() ?>Peer::doSelectRS($criteria, $con);
+        return self::populateNodes($rs, $criteria);
+    }
+
+    /**
+     * Retrieves a tree node based on a primary key. Optionally includes all 
+     * parent and/or child nodes of the matching node.
+     *
+     * @param mixed <?php echo $table->getPhpName() ?> primary key (array for composite keys)
+     * @param boolean True if ancestors should also be retrieved.
+     * @param boolean True if descendants should also be retrieved.
+     * @param Connection Connection to use.
+     * @return <?php echo $table->getPhpName() ?>Node
+     */
+    public static function retrieveNodeByPK($pk, $ancestors = false, $descendants = false, $con = null)
+    {
+        throw new PropelException('retrieveNodeByPK() not implemented yet.');
+    }
+
+    /**
+     * Retrieves a tree node based on a node path. Optionally includes all 
+     * parent and/or child nodes of the matching node.
+     *
+     * @param string Node path to retrieve.
+     * @param boolean True if ancestors should also be retrieved.
+     * @param boolean True if descendants should also be retrieved.
+     * @param Connection Connection to use.
+     * @return <?php echo $table->getPhpName() ?>Node
+     */
+    public static function retrieveNodeByNP($np, $ancestors = false, $descendants = false, $con = null)
+    {
+        $criteria = new Criteria(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME);
+        $criteria->add(self::NPATH_COLNAME, $np, Criteria::EQUAL);
+        $criteria = self::buildFamilyCriteria($criteria, $ancestors, $descendants);
+        $rs = <?php echo $table->getPhpName() ?>Peer::doSelectRS($criteria, $con);
+        $nodes = self::populateNodes($rs, $criteria);
+        return (count($nodes) == 1 ? $nodes[0] : null);
+    }
+
+    /**
+     * Retrieves the root node.
+     *
+     * @param string Node path to retrieve.
+     * @param boolean True if descendants should also be retrieved.
+     * @param Connection Connection to use.
+     * @return <?php echo $table->getPhpName() ?>Node
+     */ 
+    public static function retrieveRootNode($descendants = false, $con = null)
+    {
+        return self::retrieveNodeByNP('1', false, $descendants, $con);
+    }
+
+    /**
+     * Moves the node subtree at srcpath to the dstpath. This method is intended
+     * for internal use by the BaseNode object. Note that it does not check for 
+     * preexisting nodes at the dstpath. It also does not update the  node path 
+     * of any Node objects that might currently be in memory. 
+     *
+     * Use at your own risk!
+     *
+     * @param string Source node path to move (root of the src subtree).
+     * @param string Destination node path to move to (root of the dst subtree).
+     * @param Connection Connection to use.
+     * @return void
+     * @throws PropelException
+     * @todo This is currently broken for simulated "onCascadeDelete"s. 
+     * @todo Need to abstract the SQL better. The CONCAT sql function doesn't 
+     *       seem to be standardized (i.e. mssql), so maybe it needs to be moved
+     *       to DBAdapter.
+     */    
+    public static function moveNodeSubTree($srcPath, $dstPath, $con = null)
+    {
+        if (substr($dstPath, 0, strlen($srcPath)) == $srcPath)
+            throw new PropelException('Cannot move a node subtree within itself.');
+    
+        if ($con === null)
+            $con = Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME);
+
+        /**
+         * Example:
+         * UPDATE table 
+         * SET npath = CONCAT('1.3', SUBSTRING(npath, 6, 74)) 
+         * WHERE npath = '1.2.2' OR npath LIKE '1.2.2.%'
+         */
+         
+        $npath = self::NPATH_COLNAME;
+		//the following dot isn`t mean`t a nodeKeySeperator
+        $setcol = substr($npath, strpos($npath, '.')+1);
+        $setcollen = <?php echo $npath_len ?>;
+        $db = Propel::getDb(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME);
+        
+        // <hack> 
+        if (<?php echo $table->getPhpName() ?>NodePeer::isCodeBase($con))
+        {
+            // This is a hack to get CodeBase working. It will eventually be removed.
+            // It is a workaround for the following CodeBase bug:
+            //   -Prepared statement parameters cannot be embedded in SQL functions (i.e. CONCAT)
+            $sql = "UPDATE " . <?php echo $table->getPhpName() ?>Peer::TABLE_NAME . " " .
+                   "SET $setcol=" . $db->concatString("'$dstPath'", $db->subString($npath, strlen($srcPath)+1, $setcollen)) . " " . 
+                   "WHERE $npath = '$srcPath' OR $npath LIKE '" . $srcPath . self::NPATH_SEP . "%'";
+
+            $con->executeUpdate($sql);
+        }
+        else
+        {
+        // </hack>
+            $sql = "UPDATE " . <?php echo $table->getPhpName() ?>Peer::TABLE_NAME . " " .
+                   "SET $setcol=" . $db->concatString('?', $db->subString($npath, '?', '?')) . " " . 
+                   "WHERE $npath = ? OR $npath LIKE ?";
+
+            $stmt = $con->prepareStatement($sql);
+            $stmt->setString(1, $dstPath);
+            $stmt->setInt(2, strlen($srcPath)+1);
+            $stmt->setInt(3, $setcollen);
+            $stmt->setString(4, $srcPath);
+            $stmt->setString(5, $srcPath . self::NPATH_SEP . '%');
+            $stmt->executeUpdate();
+        // <hack>
+        }
+        // </hack>
+    }
+
+    /**
+     * Deletes the node subtree at the specified node path from the database.
+     *
+     * @param string Node path to delete
+     * @param Connection Connection to use.
+     * @return void
+     * @throws PropelException
+     * @todo This is currently broken for simulated "onCascadeDelete"s. 
+     */
+    public static function deleteNodeSubTree($nodePath, $con = null)
+    {
+        if ($con === null)
+            $con = Propel::getConnection(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME);
+
+        /**
+         * DELETE FROM table
+         * WHERE npath = '1.2.2' OR npath LIKE '1.2.2.%'
+         */
+        
+        $criteria = new Criteria(<?php echo $table->getPhpName() ?>Peer::DATABASE_NAME);
+        $criteria->add(self::NPATH_COLNAME, $nodePath, Criteria::EQUAL);
+        $criteria->addOr(self::NPATH_COLNAME, $nodePath . self::NPATH_SEP . '%', Criteria::LIKE);
+// For now, we call BasePeer directly since <?php echo $table->getPhpName() ?>Peer tries to 
+// do a cascade delete.
+//          <?php echo $table->getPhpName() ?>Peer::doDelete($criteria, $con);
+        BasePeer::doDelete($criteria, $con);
+    }
+      
+    /** 
+     * Builds the criteria needed to retrieve node ancestors and/or descendants.
+     *
+     * @param Criteria Criteria to start with
+     * @param boolean True if ancestors should be retrieved.
+     * @param boolean True if descendants should be retrieved.
+     * @return Criteria
+     */
+    public static function buildFamilyCriteria($criteria, $ancestors = false, $descendants = false)
+    {
+        /*
+            Example SQL to retrieve nodepath '1.2.3' with both ancestors and descendants:
+            
+            SELECT L.NPATH, L.LABEL, test.NPATH, UCASE(L.NPATH) 
+            FROM test L, test 
+            WHERE test.NPATH='1.2.3' AND 
+                 (L.NPATH=SUBSTRING(test.NPATH, 1, LENGTH(L.NPATH)) OR 
+                  test.NPATH=SUBSTRING(L.NPATH, 1, LENGTH(test.NPATH))) 
+            ORDER BY UCASE(L.NPATH) ASC
+        */
+
+        if ($criteria === null)
+            $criteria = new Criteria(<?php echo $table->getPhpName() ?>::DATABASE_NAME);
+
+        if (!$criteria->getSelectColumns())
+            <?php echo $table->getPhpName() ?>Peer::addSelectColumns($criteria);
+
+        $db = Propel::getDb($criteria->getDbName());
+
+        if (($ancestors || $descendants) && $criteria->size())
+        {
+            // If we are retrieving ancestors/descendants, we need to do a 
+            // self-join to locate them. The exception to this is if no search
+            // criteria is specified. In this case we're retrieving all nodes 
+            // anyway, so there is no need to do a self-join. 
+            
+            // The left-side of the self-join will contain the columns we'll
+            // use to build node objects (target node records along with their
+            // ancestors and/or descendants). The right-side of the join will
+            // contain the target node records specified by the initial criteria.
+            // These are used to match the appropriate ancestor/descendant on
+            // the left. 
+
+            // Specify an alias for the left-side table to use.
+            $criteria->addAlias('L', <?php echo $table->getPhpName() ?>Peer::TABLE_NAME);
+            
+            // Make sure we have select columns to begin with.
+            if (!$criteria->getSelectColumns())
+                <?php echo $table->getPhpName() ?>Peer::addSelectColumns($criteria);
+            
+            // Replace any existing columns for the right-side table with the 
+            // left-side alias.
+            $selectColumns = $criteria->getSelectColumns();
+            $criteria->clearSelectColumns();
+            foreach ($selectColumns as $colName)
+                $criteria->addSelectColumn(str_replace(<?php echo $table->getPhpName() ?>Peer::TABLE_NAME, 'L', $colName));
+
+            $a = null;
+            $d = null;
+            
+            $npathL = <?php echo $table->getPhpName() ?>Peer::alias('L', self::NPATH_COLNAME);
+            $npathR = self::NPATH_COLNAME;
+            $npath_len = <?php echo $npath_len ?>;
+            
+            if ($ancestors)
+            {
+                // For ancestors, match left-side node paths which are contained 
+                // by right-side node paths.
+                $a = $criteria->getNewCriterion($npathL, 
+                                                "$npathL=" . $db->subString($npathR, 1, $db->strLength($npathL), $npath_len),
+                                                Criteria::CUSTOM);                                                        
+            }
+            
+            if ($descendants)
+            {
+                // For descendants, match left-side node paths which contain 
+                // right-side node paths.
+                $d = $criteria->getNewCriterion($npathR,
+                                                "$npathR=" . $db->subString($npathL, 1, $db->strLength($npathR), $npath_len),
+                                                Criteria::CUSTOM);
+            }
+
+            if ($a)
+            {
+                if ($d) $a->addOr($d);
+                $criteria->addAnd($a);
+            }
+            else if ($d)
+            {
+                $criteria->addAnd($d);
+            }
+            
+            // Add the target node path column. This is used by populateNodes().
+            $criteria->addSelectColumn($npathR);
+            
+            // Sort by node path to speed up tree construction in populateNodes()
+            $criteria->addAsColumn('npathlen', $db->strLength($npathL));
+            $criteria->addAscendingOrderByColumn('npathlen');
+            $criteria->addAscendingOrderByColumn($npathL);
+        }
+        else
+        {
+            // Add the target node path column. This is used by populateNodes().
+            $criteria->addSelectColumn(self::NPATH_COLNAME);
+
+            // Sort by node path to speed up tree construction in populateNodes()
+            $criteria->addAsColumn('npathlen', $db->strLength(self::NPATH_COLNAME));
+            $criteria->addAscendingOrderByColumn('npathlen');
+            $criteria->addAscendingOrderByColumn(self::NPATH_COLNAME);
+        }
+        
+        return $criteria;
+    }    
+    
+    /**
+     * This method reconstructs as much of the tree structure as possible from
+     * the given array of objects. Depending on how you execute your query, it 
+     * is possible for the ResultSet to contain multiple tree fragments (i.e.
+     * subtrees). The array returned by this method will contain one entry
+     * for each subtree root node it finds. The remaining subtree nodes are
+     * accessible from the <?php echo $table->getPhpName() ?>Node methods of the 
+     * subtree root nodes.
+     *
+     * @param array Array of <?php echo $table->getPhpName() ?>Node objects
+     * @return array Array of <?php echo $table->getPhpName() ?>Node objects
+     */
+    public static function buildTree($nodes)
+    {
+        // Subtree root nodes to return
+        $rootNodes = array();
+
+        // Build the tree relations
+        foreach ($nodes as $node)
+        {
+            $sep = strrpos($node->getNodePath(), self::NPATH_SEP);
+            $parentPath = ($sep !== false ? substr($node->getNodePath(), 0, $sep) : '');
+            $parentNode = null;
+
+            // Scan other nodes for parent.
+            foreach ($nodes as $pnode)
+            {
+                if ($pnode->getNodePath() == $parentPath)
+                {
+                    $parentNode = $pnode;
+                    break;
+                }
+            }
+
+            // If parent was found, attach as child, otherwise its a subtree root
+            if ($parentNode)
+                $parentNode->attachChildNode($node);
+            else
+                $rootNodes[] = $node;
+        }
+
+        return $rootNodes;
+    }
+
+    /**
+     * Populates the <?php echo $table->getPhpName() ?> objects from the 
+     * specified ResultSet, wraps them in <?php echo $table->getPhpName() ?>Node 
+     * objects and build the appropriate node relationships.
+     * The array returned by this method will only include the initial targets 
+     * of the query, even if ancestors/descendants were also requested. 
+     * The ancestors/descendants will be cached in memory and are accessible via
+     * the getNode() methods. 
+     *
+     * @param ResultSet 
+     * @param Criteria
+     * @return array Array of <?php $table->getPhpName() ?>Node objects.
+     */
+    public static function populateNodes($rs, $criteria)
+    {
+        $nodes = array();
+        $targets = array();
+        $targetfld = count($criteria->getSelectColumns());
+
+<?php if (!$table->getChildrenColumn()) { ?>
+        // set the class once to avoid overhead in the loop
+        $cls = Propel::import(<?php echo $table->getPhpName() ?>Peer::getOMClass());
+<?php } ?>
+        
+        // populate the object(s)
+        while($rs->next()) 
+        {
+            if (!isset($nodes[$rs->getString(1)]))
+            {
+<?php if ($table->getChildrenColumn()) { ?>
+				// class must be set each time from the record row
+				$cls = Propel::import(<?php echo $table->getPhpName() ?>Peer::getOMClass($rs, 1));
+<?php } ?>
+				$obj = new $cls();
+				$obj->hydrate($rs);
+
+                $nodes[$rs->getString(1)] = new <?php echo $table->getPhpName() ?>Node($obj);
+            }
+
+            $node = $nodes[$rs->getString(1)];
+            
+            if ($node->getNodePath() == $rs->getString($targetfld))
+                $targets[$node->getNodePath()] = $node;
+        }
+
+        self::buildTree($nodes);
+        
+        return array_values($targets);
+    }
+
+}
+
+?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Object.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Object.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Object.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1841 @@
+<?php
+
+// Template for creating an object class.
+//
+// This is based loosely on the Torque Object.vm Velocity template.
+//
+// $Id: Object.tpl,v 1.23 2005/03/17 01:16:42 hlellelid Exp $
+
+ // helper classes
+ include_once 'propel/engine/builder/om/PeerBuilder.php';
+ include_once 'propel/engine/builder/om/ClassTools.php';
+
+echo '<' . '?' . 'php';
+
+$db = $table->getDatabase();
+if ($table->getPackage()) {
+	$package = $table->getPackage();
+} else {
+	$package = $targetPackage;
+}
+
+$parentClass = ClassTools::getBaseClass($table);
+?>
+
+require_once '<?php echo ClassTools::getFilePath($parentClass) ?>';
+
+<?php
+$interface = ClassTools::getInterface($table);
+
+if (!empty($interface)) {
+?>
+require_once '<?php echo ClassTools::getFilePath($interface) ?>';
+
+<?php
+}
+
+if (!$table->isAlias()) {
+
+	// If any columns in table are BLOB or CLOB then we need to make
+	// sure those classes are included so we can do things like
+	// if ($v instanceof Lob) etc.
+
+	$includes_lobs = false;
+	foreach ($table->getColumns() as $col) {
+		if ($col->isLob()) {
+			$includes_lobs = true;
+			break;
+		}
+	}
+
+	if($includes_lobs) { ?>
+include_once 'creole/util/Clob.php';
+include_once 'creole/util/Blob.php';
+<?php
+	}
+}
+?>
+
+include_once 'propel/util/Criteria.php';
+<?php
+	foreach ($table->getForeignKeys() as $fk) {
+		$tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+		$className = $tblFK->getPhpName();
+		if ($tblFK->getInterface()) {
+			$className = $tblFK->getInterface();
+		}
+
+		$tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package);
+		$tblFKPackagePath = strtr($tblFKPackage, '.', '/');
+		if ($tblFKPackagePath != "") {
+			$tblFKPackagePath .= '/';
+		} ?>
+
+// (on-demand) include_once '<?php echo ClassTools::getFilePath($tblFKPackage, $className) ?>';
+// (on-demand) include_once '<?php echo ClassTools::getFilePath($tblFKPackage, $tblFK->getPhpName() . 'Peer') ?>';
+<?php } ?>
+
+include_once '<?php echo ClassTools::getFilePath($package, $table->getPhpName() . 'Peer') ?>';
+
+/**
+ * Base class that represents a row from the '<?php echo $table->getName() ?>' table.
+ *
+ * <?php echo $table->getDescription() ?> 
+ *
+<?php if ($addTimeStamp) { ?>
+ * This class was autogenerated by Propel on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * You should not use this class directly.  It should not even be
+ * extended; all references should be to <?php echo $table->getPhpName() ?> class.
+ *
+ * @package <?php echo $package ?> 
+ */
+abstract class <?php echo $basePrefix . $table->getPhpName() ?> extends <?php echo ClassTools::classname($parentClass) ?><?php if (!empty($interface)) { ?> implements <?php echo ClassTools::classname($interface) ?><?php } ?> {
+
+	/**
+	 * The Peer class.
+	 * Instance provides a convenient way of calling static methods on a class
+	 * that calling code may not be able to identify.
+	 * @var <?php echo $table->getPhpName() ?>Peer
+	 */
+	protected static $peer;
+<?php
+	if (!$table->isAlias()) {
+		foreach ($table->getColumns() as $col) {
+			$cptype = $col->getPhpNative();
+			$clo=strtolower($col->getName());
+			$defVal = "";
+			if (($val = $col->getPhpDefaultValue()) !== null) {
+				settype($val, $cptype);
+				$defaultValue = var_export($val, true);
+				$defVal = " = " . $defaultValue;
+			}
+?>
+
+	/**
+	 * The value for the <?php echo $clo ?> field.
+	 * @var <?php echo $cptype ?> 
+	 */
+	protected $<?php echo $clo . $defVal ?>;
+<?php		 if ($col->isLazyLoad()) { ?>
+
+	/**
+	 * Whether the lazy-loaded <?php echo $clo ?> value has been loaded from database.
+	 * This is necessary to avoid repeated lookups if <?php echo $clo ?> column is NULL.
+	 * @var boolean
+	 */
+	protected $<?php echo $clo ?>_isLoaded = false;
+<?php
+			}
+		}
+
+foreach ($table->getColumns() as $col) {
+
+	$cfc=$col->getPhpName();
+	$clo=strtolower($col->getName());
+	$cptype = $col->getPhpNative();
+
+	$defaultValue = null;
+	if (($val = $col->getPhpDefaultValue()) !== null) {
+		settype($val, $cptype);
+		$defaultValue = var_export($val, true);
+	}
+
+	if ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) {
+		// these default values are based on the Creole defaults
+		// the date and time default formats are locale-sensitive
+		if ($col->getType() === PropelTypes::DATE) {
+			$defaultfmt = '%x';
+		} elseif ($col->getType() === PropelTypes::TIME) {
+			$defaultfmt = '%X';
+		} elseif ($col->getType() === PropelTypes::TIMESTAMP) {
+			$defaultfmt = 'Y-m-d H:i:s';
+		}
+?>
+
+	/**
+	 * Get the [optionally formatted] `<?php echo $clo ?>` column value.
+	 * <?php echo $col->getDescription() ?> 
+	 * @param string $format The date/time format string (either date()-style or strftime()-style).
+	 *							If format is NULL, then the integer unix timestamp will be returned.
+	 * @return mixed Formatted date/time value as string or integer unix timestamp (if format is NULL).
+	 * @throws PropelException - if unable to convert the date/time to timestamp.
+	 */
+	public function get<?php echo $cfc ?>($format = '<?php echo $defaultfmt ?>'<?php if ($col->isLazyLoad()) echo ', $con = null'; ?>)
+	{
+<?php if ($col->isLazyLoad()) { ?>
+		if (!$this-><?php echo $clo ?>_isLoaded && $this-><?php echo $clo ?> === null && !$this->isNew()) {
+			$this->load<?php echo $cfc ?>($con);
+		}
+<?php } ?>
+		if ($this-><?php echo $clo ?> === null || $this-><?php echo $clo ?> === '') {
+			return null;
+		} elseif (!is_int($this-><?php echo $clo ?>)) {
+			// a non-timestamp value was set externally, so we convert it
+			$ts = strtotime($this-><?php echo $clo ?>);
+			if ($ts === -1) {
+				throw new PropelException("Unable to parse value of <?php echo $clo ?> as date/time value: " . var_export($this-><?php echo $clo ?>, true));
+			}
+		} else {
+			$ts = $this-><?php echo $clo ?>;
+		}
+		if ($format === null) {
+			return $ts;
+		} elseif (strpos($format, '%') !== false) {
+			return strftime($format, $ts);
+		} else {
+			return date($format, $ts);
+		}
+	}
+<?php } else { ?>
+	/**
+	 * Get the <?php echo $cfc ?> column value.
+	 * <?php echo $col->getDescription() ?> 
+	 * @return <?php echo $cptype ?> 
+	 */
+	public function get<?php echo $cfc ?>(<?php if ($col->isLazyLoad()) echo '$con = null'; ?>)
+	{
+<?php if ($col->isLazyLoad()) { ?>
+		if (!$this-><?php echo $clo ?>_isLoaded && $this-><?php echo $clo ?> === null && !$this->isNew()) {
+			$this->load<?php echo $cfc ?>($con);
+		}
+<?php } ?>
+		return $this-><?php echo $clo ?>;
+	}
+<?php } ?>
+
+<?php if ($col->isLazyLoad()) { ?>
+	/**
+	 * Load the value for the [lazy-load] `<?php echo $clo ?>` column.
+	 *
+	 * This method performs an additional query to return the value for
+	 * the `<?php echo $clo ?>` column, since it is not populated by
+	 * the hydrate() method.
+	 *
+	 * @param Connection
+	 * @return void
+	 * @throws PropelException - any underlying error will be wrapped and re-thrown.
+	 */
+	protected function load<?php echo $cfc ?>($con = null)
+	{
+		$c = $this->buildPkeyCriteria();
+		$c->addSelectColumn(<?php echo PeerBuilder::getColumnName($col, $table->getPhpName()) ?>);
+		try {
+			$rs = <?php echo $table->getPhpName()?>Peer::doSelectRS($c, $con);
+			$rs->next();
+<?php
+		$affix = CreoleTypes::getAffix(CreoleTypes::getCreoleCode($col->getType()));
+		 $clo = strtolower($col->getName());
+		 switch($col->getType()) {
+
+			 case PropelTypes::DATE:
+			 case PropelTypes::TIME:
+			 case PropelTypes::TIMESTAMP:
+			?>
+			$this-><?php echo $clo ?> = $rs->get<?php echo $affix ?>(1, null);
+<?php
+				break;
+			default:
+					?>
+			$this-><?php echo $clo?> = $rs->get<?php echo $affix ?>(1);
+<?php   } ?>
+			$this-><?php echo $clo ?>_isLoaded = true;
+		} catch (Exception $e) {
+			throw new PropelException("Error loading value for `<?php echo $clo ?>` column on demand.", $e);
+		}
+	}
+
+<?php } ?>
+<?php
+		if (!$table->isReadOnly()) {
+
+
+			$throwsClause = "";
+			if ($complexObjectModel) {
+				if ($col->isForeignKey()) {
+					$throwsClause = "@throws PropelException";
+				}
+				if (count($col->getReferrers()) > 0 ) {
+					if ($throwsClause == "") {
+						$throwsClause = "@throws PropelException";
+					}
+				}
+			}
+			if ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) {
+				$throwsClause = "@throws PropelException - If passed [not-null] date/time is in an invalid format.";
+			}
+
+	?>
+
+	/**
+	 * Set the value of `<?php echo $clo ?>` column.
+	 * <?php echo $col->getDescription() ?> 
+	 * @param <?php echo ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) ? 'mixed' : $cptype  ?> $v new value
+	 * @return void
+	 * <?php echo $throwsClause ?> 
+	 */
+	public function set<?php echo $cfc ?>($v)
+	{
+<?php if ($col->isLazyLoad()) { ?>
+		// explicitly set the is-loaded flag to true for this lazy load col;
+		// it doesn't matter if the value is actually set or not (logic below) as
+		// any attempt to set the value means that no db lookup should be performed
+		// when the get<?php echo $cfc ?>() method is called.
+		$this-><?php echo $clo ?>_isLoaded = true;
+<?php } ?>
+<?php
+	if ($addSaveMethod) {
+
+		if ($col->isLob()) {
+			// Setting of LOB columns gets some special handling
+
+			if ($col->getPropelType() === PropelTypes::BLOB || $col->getPropelType() === PropelTypes::LONGVARBINARY ) {
+				$lobClass = "Blob";
+			} else {
+				$lobClass = "Clob";
+			}
+		?>
+		// if the passed in parameter is the *same* object that
+		// is stored internally then we use the Lob->isModified()
+		// method to know whether contents changed.
+		if ($v instanceof Lob && $v === $this-><?php echo $clo ?>) {
+			$changed = $v->isModified();
+		} else {
+			$changed = ($this-><?php echo $clo ?> !== $v);
+		}
+		if ($changed) {
+			if ( !($v instanceof Lob) ) {
+				$obj = new <?php echo $lobClass ?>();
+				$obj->setContents($v);
+			} else {
+				$obj = $v;
+			}
+			$this-><?php echo $clo ?> = $obj;
+			$this->modifiedColumns[] = <?php echo PeerBuilder::getColumnName($col, $table->getPhpName()) ?>;
+		}
+<?php   } elseif ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) {
+		// Setting a DATE/TIME value gets some special handling.
+?>
+		if ($v !== null && !is_int($v)) {
+			$ts = strtotime($v);
+			if ($ts === -1) {
+				throw new PropelException("Unable to parse date/time value for <?php echo $clo ?> from input: " . var_export($v, true));
+			}
+		} else {
+			$ts = $v;
+		}
+		if ($this-><?php echo $clo ?> !== $ts<?php if ($defaultValue !== null) { ?> || $ts === <?php echo $defaultValue ?><?php } ?>) {
+			$this-><?php echo $clo ?> = $ts;
+			$this->modifiedColumns[] = <?php echo PeerBuilder::getColumnName($col, $table->getPhpName()) ?>;
+		}
+<?php   } else {
+		// NORMAL column
+?>
+		if ($this-><?php echo $clo ?> !== $v<?php if ($defaultValue !== null) { ?> || $v === <?php echo $defaultValue ?><?php } ?>) {
+			$this-><?php echo $clo ?> = $v;
+			$this->modifiedColumns[] = <?php echo PeerBuilder::getColumnName($col, $table->getPhpName()) ?>;
+		}
+		<?php }
+	} else { ?>
+		$this-><?php echo $clo ?> = $v;
+<?php
+	} // if (addSaveMethod)
+
+		if ($complexObjectModel) {
+			if ($col->isForeignKey()) {
+				$tblFK = $table->getDatabase()->getTable($col->getRelatedTableName());
+				$colFK = $tblFK->getColumn($col->getRelatedColumnName());
+				if ($col->isMultipleFK() || $col->getRelatedTableName() == $table->getName()) {
+					$relCol = "";
+					foreach ($col->getForeignKey()->getLocalColumns() as $columnName) {
+						$column = $table->getColumn($columnName);
+						$relCol .= $column->getPhpName();
+					}
+					if ($relCol != "") {
+						$relCol = "RelatedBy".$relCol;
+					}
+					$varName = "a".$tblFK->getPhpName() . $relCol;
+				} else {
+					$varName = "a".$tblFK->getPhpName();
+				}
+
+	?>
+
+		if ($this-><?php echo $varName ?> !== null && $this-><?php echo $varName ?>->get<?php echo $colFK->getPhpName() ?>() !== $v) {
+			$this-><?php echo $varName ?> = null;
+		}
+	<?php	 } /* if col is foreign key */
+
+		foreach ($col->getReferrers() as $fk) {
+			// used to be getLocalForeignMapping() which did not work.
+			$flmap = $fk->getForeignLocalMapping();
+			$fkColName = $flmap[$col->getName()];
+			$tblFK = $fk->getTable();
+			if ( $tblFK->getName() != $table->getName() ) {
+				$colFK = $tblFK->getColumn($fkColName);
+				if ($colFK->isMultipleFK()) {
+					$collName = "coll" . $tblFK->getPhpName() . "sRelatedBy" . $colFK->getPhpName();
+				} else {
+					$collName = "coll" . $tblFK->getPhpName() . "s";
+				}
+	?>
+
+		  // update associated <?php echo $tblFK->getPhpName() ?>
+
+		  if ($this-><?php echo $collName ?> !== null) {
+			  for ($i=0,$size=count($this-><?php echo $collName ?>); $i < $size; $i++) {
+				  $this-><?php echo $collName ?>[$i]->set<?php echo $colFK->getPhpName()?>($v);
+			  }
+		  }
+		<?php } /* if  $tblFk != $table */ ?>
+	  <?php } /* foreach referrers */ ?>
+	<?php } /* if complex object model */ ?>
+
+	}
+
+<?php
+		} /* if !table->isReadOnly() */
+	} /* foreach col */
+?>
+
+
+	/**
+	 * Hydrates (populates) the object variables with values from the database resultset.
+	 *
+	 * An offset (1-based "start column") is specified so that objects can be hydrated
+	 * with a subset of the columns in the resultset rows.  This is needed, for example,
+	 * for results of JOIN queries where the resultset row includes columns from two or
+	 * more tables.
+	 *
+	 * @param ResultSet $rs The ResultSet class with cursor advanced to desired record pos.
+	 * @param int $startcol 1-based offset column which indicates which restultset column to start with.
+	 * @return int next starting column
+	 * @throws PropelException  - Any caught Exception will be rewrapped as a PropelException.
+	 */
+	public function hydrate(ResultSet $rs, $startcol = 1)
+	{
+		try {
+<?php
+			$n = 0;
+			foreach($table->getColumns() as $col) {
+				if(!$col->isLazyLoad()) {
+					$affix = CreoleTypes::getAffix(CreoleTypes::getCreoleCode($col->getType()));
+					$clo = strtolower($col->getName());
+					switch($col->getType()) {
+
+						case PropelTypes::DATE:
+						case PropelTypes::TIME:
+						case PropelTypes::TIMESTAMP:
+					?>
+			$this-><?php echo $clo ?> = $rs->get<?php echo $affix ?>($startcol + <?php echo $n ?>, null);
+<?php
+							break;
+						default:
+					?>
+			$this-><?php echo $clo?> = $rs->get<?php echo $affix ?>($startcol + <?php echo $n ?>);
+<?php
+					}
+					$n++;
+				} // if col->isLazyLoad()
+			} /* foreach */
+		?>
+<?php	   if ($addSaveMethod) { ?>
+			$this->resetModified();
+<?php	   } ?>
+			$this->setNew(false);
+
+      return $startcol + <?php echo $n; ?>;
+
+		} catch (Exception $e) {
+			throw new PropelException("Error populating <?php echo $table->getPhpName()?> object", $e);
+		}
+
+	}
+
+	/**
+	 * Builds a Criteria object containing the primary key for this object.
+	 *
+	 * Unlike buildCriteria() this method includes the primary key values regardless
+	 * of whether or not they have been modified.
+	 *
+	 * @return Criteria The Criteria object containing value(s) for primary key(s).
+	 */
+	public function buildPkeyCriteria()
+	{
+		$criteria = new Criteria(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME);
+<?php
+				foreach ($table->getColumns() as $col) {
+					$clo = strtolower($col->getName());
+					if ($col->isPrimaryKey()) { ?>
+		$criteria->add(<?php echo PeerBuilder::getColumnName($col, $table->getPhpName()) ?>, $this-><?php echo $clo ?>);
+<?php
+					}
+				}
+			?>
+		return $criteria;
+	}
+
+	/**
+	 * Build a Criteria object containing the values of all modified columns in this object.
+	 *
+	 * @return Criteria The Criteria object containing all modified values.
+	 */
+	public function buildCriteria()
+	{
+		$criteria = new Criteria(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME);
+<?php
+				foreach ($table->getColumns() as $col) {
+					$clo = strtolower($col->getName());
+					?>
+		if ($this->isColumnModified(<?php echo PeerBuilder::getColumnName($col, $table->getPhpName()) ?>)) $criteria->add(<?php echo PeerBuilder::getColumnName($col, $table->getPhpName()) ?>, $this-><?php echo $clo ?>);
+<?php
+				}
+			?>
+		return $criteria;
+	}
+
+<?php } /* if !table->isAlias */ ?>
+
+<?php
+
+ // association code
+
+if ($complexObjectModel) {
+
+	$pVars = array();  // Array of object set method names for later reference.
+	$aVars = array();  // Array of object field names for later reference.
+	foreach ($table->getForeignKeys() as $fk) {
+
+		$tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+		$className = $tblFK->getPhpName();
+
+		$tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package);
+		$tblFKPackagePath = strtr($tblFKPackage, '.', '/');
+		if ($tblFKPackagePath != "") {
+			$tblFKPackagePath .= '/';
+		}
+
+		$relCol = "";
+		foreach ($fk->getLocalColumns() as $columnName) {
+			$column = $table->getColumn($columnName);
+			if ($column->isMultipleFK() || $fk->getForeignTableName() == $table->getName()) {
+				$relCol .= $column->getPhpName();
+			}
+		}
+
+		if ($relCol != "") {
+			$relCol = "RelatedBy" . $relCol;
+		}
+
+		$pVarName = $className . $relCol;
+		$varName = "a" . $pVarName;
+		$retVal = ($pVars[] = $pVarName);
+		$retVal = ($aVars[] = $varName);
+?>
+
+	/**
+	 * @var <?php echo $className ?> 
+	 */
+	protected $<?php echo $varName ?>;
+
+	/**
+	 * Declares an association between this object and a <?php echo $className ?> object
+	 *
+	 * @param <?php echo $className ?> $v
+	 * @return void
+	 * @throws PropelException
+	 */
+	public function set<?php echo $pVarName ?>($v)
+	{
+<?php
+		foreach ($fk->getLocalColumns() as $columnName) {
+			$column = $table->getColumn($columnName);
+			$lfmap = $fk->getLocalForeignMapping();
+			$colFKName = $lfmap[$columnName];
+			$colFK = $tblFK->getColumn($colFKName); ?>
+
+		if ($v === null) {
+			$this->set<?php echo $column->getPhpName() ?>(<?php var_export($column->getPhpDefaultValue()) ?>);
+		} else {
+			$this->set<?php echo $column->getPhpName() ?>($v->get<?php echo $colFK->getPhpName() ?>());
+		}
+<?php
+		} /* foreach local col */
+?>
+
+		$this-><?php echo $varName ?> = $v;
+	}
+
+<?php
+	$and = "";
+	$comma = "";
+	$conditional = "";
+	$arglist = "";
+	$argsize = 0;
+	foreach ($fk->getLocalColumns() as $columnName) {
+		$column = $table->getColumn($columnName);
+		$cptype = $column->getPhpNative();
+		$clo = strtolower($column->getName());
+		if ($cptype == "integer" || $cptype == "float" || $cptype == "double") {
+			$conditional .= $and . "\$this->". $clo ." > 0";
+		} elseif($cptype == "string") {
+			$conditional .= $and . "(\$this->" . $clo ." !== \"\" && \$this->".$clo." !== null)";
+		} else {
+			$conditional .= $and . "\$this->" . $clo ." !== null";
+		}
+		$arglist .= $comma . "\$this->" . $clo;
+		$and = " && ";
+		$comma = ", ";
+		$argsize = $argsize + 1;
+   }
+
+   $pCollName = $table->getPhpName() . 's' . $relCol;
+?>
+
+	/**
+	 * Get the associated <?php echo $className ?> object
+	 *
+	 * @param Connection Optional Connection object.
+	 * @return <?php echo $className ?> The associated <?php echo $className ?> object.
+	 * @throws PropelException
+	 */
+	public function get<?php echo $pVarName ?>($con = null)
+	{
+		// include the Peer class
+		include_once '<?php echo $tblFKPackagePath . $className ?>Peer.php';
+
+		if ($this-><?php echo $varName ?> === null && (<?php echo $conditional ?>)) {
+<?php
+		if ($tblFK->isAlias()) {
+			if ($argsize > 1) {
+?>
+
+			$this-><?php echo $varName ?> = <?php echo $className ?>Peer::retrieve<?php echo $className ?>ByPK(<?php echo $arglist ?>, $con);
+	<?php	} else { ?>
+
+			$this-><?php echo $varName ?> = <?php echo $className ?>Peer::retrieve<?php echo $className ?>ByPK(<?php echo $arglist ?>, $con);
+	<?php	}
+		} else {
+			if ($argsize > 1) { ?>
+
+			$this-><?php echo $varName ?> = <?php echo $className ?>Peer::retrieveByPK(<?php echo $arglist ?>, $con);
+	<?php	} else { ?>
+
+			$this-><?php echo $varName ?> = <?php echo $className ?>Peer::retrieveByPK(<?php echo $arglist ?>, $con);
+	<?php }
+		} // if tblFK->isAlias ?>
+
+			/* The following can be used instead of the line above to
+			   guarantee the related object contains a reference
+			   to this object, but this level of coupling
+			   may be undesirable in many circumstances.
+			   As it can lead to a db query with many results that may
+			   never be used.
+			   $obj = <?php echo $className ?>Peer::retrieveByPK(<?php echo $arglist ?>, $con);
+			   $obj->add<?php echo $pCollName ?>($this);
+			 */
+		}
+		return $this-><?php echo $varName ?>;
+	}
+
+	/**
+	 * Provides convenient way to set a relationship based on a
+	 * key.  e.g.
+	 * <code>$bar->setFooKey($foo->getPrimaryKey())</code>
+	 *
+<?php if (count($fk->getLocalColumns()) > 1) { ?>
+	 * Note: It is important that the xml schema used to create this class
+	 * maintains consistency in the order of related columns between
+	 * <?php echo $table->getName() ?> and <?php echo $tblFK->getName() ?>.
+	 * If for some reason this is impossible, this method should be
+	 * overridden in <code><?php echo $table->getPhpName() ?></code>.
+<?php } ?>
+	 * @return void
+	 * @throws PropelException
+	 */
+	public function set<?php echo $pVarName ?>Key($key)
+	{
+<?php if (count($fk->getLocalColumns()) > 1) {
+		$i = 0;
+		foreach ($fk->getLocalColumns() as $colName) {
+			$col = $table->getColumn($colName);
+			$fktype = $col->getPhpNative();
+?>
+
+			$this->set<?php echo $col->getPhpName() ?>( (<?php echo $fktype ?>) $key[<?php echo $i ?>] );
+<?php
+			$i++;
+		} /* foreach */
+	} else {
+		$lcols = $fk->getLocalColumns();
+		$colName = $lcols[0];
+		$col = $table->getColumn($colName);
+		$fktype = $col->getPhpNative();
+?>
+
+		$this->set<?php echo $col->getPhpName() ?>( (<?php echo $fktype ?>) $key);
+	<?php } ?>
+
+	}
+<?php } /*  end of foreach loop over foreign keys */
+
+ //
+ // setup foreign key associations
+ //
+	foreach ($table->getReferrers() as $fk) {
+		$tblFK = $fk->getTable();
+		$tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package);
+		$tblFKPackagePath = strtr($tblFKPackage, '.', '/');
+		if ($tblFKPackagePath != "") {
+			$tblFKPackagePath .= '/';
+		}
+
+		$className = $tblFK->getPhpName();
+		$relatedByCol = "";
+		foreach ($fk->getLocalColumns() as $columnName) {
+			$column = $tblFK->getColumn($columnName);
+			if ($column->isMultipleFK() || $tblFK->getName() == $table->getName()) {
+				// if there are seeral foreign keys that point to the same table
+				// then we need to generate methods like getAuthorRelatedByColName()
+				// instead of just getAuthor().  Currently we are doing the same
+				// for self-referential foreign keys, to avoid confusion.
+				$relatedByCol .= $column->getPhpName();
+			}
+		}
+
+		if ($relatedByCol == "") {
+			$suffix = "";
+			$relCol = $className . "s";
+			$relColMs = $className;
+		} else {
+			$suffix = "RelatedBy" . $relatedByCol;
+			$relCol= $className . "sRelatedBy" . $relatedByCol;
+			$relColMs= $className . "RelatedBy" . $relatedByCol;
+		}
+		$collName = "coll" . $relCol;
+?>
+
+	/**
+	 * Collection to store aggregation of <?php echo $collName ?> 
+	 * @var array
+	 */
+	protected $<?php echo $collName ?>;
+
+	/**
+	 * Temporary storage of <?php echo $collName ?> to save a possible db hit in
+	 * the event objects are add to the collection, but the
+	 * complete collection is never requested.
+	 * @return void
+	 */
+	public function init<?php echo $relCol ?>()
+	{
+		if ($this-><?php echo $collName ?> === null) {
+			$this-><?php echo $collName ?> = array();
+		}
+	}
+
+	/**
+	 * Method called to associate a <?php echo $tblFK->getPhpName() ?> object to this object
+	 * through the <?php echo $className ?> foreign key attribute
+	 *
+	 * @param <?php echo $className ?> $l $className
+	 * @return void
+	 * @throws PropelException
+	 */
+	public function add<?php echo $relColMs ?>(<?php echo $className ?> $l)
+	{
+		$this-><?php echo $collName ?>[] = $l;
+		$l->set<?php echo $table->getPhpName() . $suffix ?>($this);
+	}
+
+	/**
+	 * The criteria used to select the current contents of <?php echo $collName ?>.
+	 * @var Criteria
+	 */
+	private $last<?php echo $relCol ?>Criteria = null;
+
+	/**
+	 * Returns the number of related <?php echo $relCol ?> 
+	 *
+	 * @param Criteria $criteria
+	 * @param boolean $distinct
+	 * @param Connection $con
+	 * @throws PropelException
+	 */
+	public function count<?php echo $relCol ?>($criteria = null, $distinct = false, $con = null)
+	{
+		// include the Peer class
+		include_once '<?php echo $tblFKPackagePath . $className ?>Peer.php';
+		if ($criteria === null) {
+			$criteria = new Criteria();
+		}
+<?php
+	foreach ($fk->getForeignColumns() as $columnName) {
+		$column = $table->getColumn($columnName);
+		// used to be getLocalForeignMapping() but that didn't seem to work
+		// (maybe a problem in translation of HashTable code to PHP).
+		$flmap = $fk->getForeignLocalMapping();
+		$colFKName = $flmap[$columnName];
+		$colFK = $tblFK->getColumn($colFKName);
+?>
+		$criteria->add(<?php echo PeerBuilder::getColumnName($colFK, $className) ?>, $this->get<?php echo $column->getPhpName() ?>() );
+<?php
+	} // end foreach ($fk->getForeignColumns()
+?>
+		return <?php echo $className ?>Peer::doCount($criteria, $distinct, $con);
+	}
+
+	/**
+	 * If this collection has already been initialized with
+	 * an identical criteria, it returns the collection.
+	 * Otherwise if this <?php echo $table->getPhpName() ?> has previously
+	 * been saved, it will retrieve related <?php echo $relCol ?> from storage.
+	 * If this <?php echo $table->getPhpName() ?> is new, it will return
+	 * an empty collection or the current collection, the criteria
+	 * is ignored on a new object.
+	 *
+	 * @param Connection $con
+	 * @param Criteria $criteria
+	 * @throws PropelException
+	 */
+	public function get<?php echo $relCol ?>($criteria = null, $con = null)
+	{
+		// include the Peer class
+		include_once '<?php echo $tblFKPackagePath . $className ?>Peer.php';
+		if ($criteria === null) {
+			$criteria = new Criteria();
+		}
+
+		if ($this-><?php echo $collName ?> === null) {
+			if ($this->isNew()) {
+			   $this-><?php echo $collName ?> = array();
+			} else {
+<?php
+	foreach ($fk->getForeignColumns() as $columnName) {
+		$column = $table->getColumn($columnName);
+		// used to be getLocalForeignMapping() but that didn't seem to work
+		// (maybe a problem in translation of HashTable code to PHP).
+		$flmap = $fk->getForeignLocalMapping();
+		$colFKName = $flmap[$columnName];
+		$colFK = $tblFK->getColumn($colFKName);
+?>
+
+				$criteria->add(<?php echo PeerBuilder::getColumnName($colFK, $className) ?>, $this->get<?php echo $column->getPhpName() ?>() );
+<?php
+	} // end foreach ($fk->getForeignColumns()
+?>
+
+				$this-><?php echo $collName ?> = <?php echo $className ?>Peer::doSelect($criteria, $con);
+			}
+		} else {
+			// criteria has no effect for a new object
+			if (!$this->isNew()) {
+				// the following code is to determine if a new query is
+				// called for.  If the criteria is the same as the last
+				// one, just return the collection.
+<?php
+	foreach ($fk->getForeignColumns() as $columnName) {
+		$column = $table->getColumn($columnName);
+		$flmap = $fk->getForeignLocalMapping();
+		$colFKName = $flmap[$columnName];
+		$colFK = $tblFK->getColumn($colFKName);
+?>
+
+				$criteria->add(<?php echo PeerBuilder::getColumnName($colFK, $className) ?>, $this->get<?php echo $column->getPhpName() ?>());
+<?php
+	} // foreach ($fk->getForeignColumns()
+?>
+
+				if (!isset($this->last<?php echo $relCol ?>Criteria) || !$this->last<?php echo $relCol ?>Criteria->equals($criteria)) {
+					$this-><?php echo $collName ?> = <?php echo $className ?>Peer::doSelect($criteria, $con);
+				}
+			}
+		}
+		$this->last<?php echo $relCol ?>Criteria = $criteria;
+
+		return $this-><?php echo $collName ?>;
+	}
+
+<?php
+	$countFK = 0;
+	foreach ($tblFK->getForeignKeys() as $dummyFK) {
+		$countFK = $countFK + 1;
+	}
+
+// ------------------------------------------------------------
+//
+
+	if ($countFK >= 1) {
+		$lastTable = "";
+		foreach ($tblFK->getForeignKeys() as $fk2) {
+			// Add join methods if the fk2 table is not this table or
+			// the fk2 table references this table multiple times.
+
+			$doJoinGet = true;
+			if ( $fk2->getForeignTableName() == $table->getName() ) {
+				$doJoinGet = false;
+			}
+
+			foreach ($fk2->getLocalColumns() as $columnName) {
+				$column = $tblFK->getColumn($columnName);
+				if ($column->isMultipleFK()) {
+					$doJoinGet = true;
+				}
+			}
+
+			$tblFK2 = $table->getDatabase()->getTable($fk2->getForeignTableName());
+			$doJoinGet = !$tblFK2->isForReferenceOnly();
+			$relatedByCol2 = "";
+			foreach ($fk2->getLocalColumns() as $columnName) {
+				$column = $tblFK->getColumn($columnName);
+				if ($column->isMultipleFK()) {
+					$relatedByCol2 .= $column->getPhpName();
+				}
+			}
+
+			$fkClassName = $tblFK2->getPhpName();
+
+			// do not generate code for self-referencing fk's, it would be
+			// good to do, but it is just not implemented yet.
+			if ($className == $fkClassName) {
+				// $doJoinGet = false;  -- SELF REFERENCING FKs UNDER TESTING
+			}
+
+			if ($relatedByCol2 == "") {
+				$relCol2 = $fkClassName;
+			} else {
+				$relCol2 = $fkClassName . "RelatedBy". $relatedByCol2;
+			}
+
+			if ( $relatedByCol == "") {
+				// nothing?
+			} else {
+				if ( $relatedByCol == $relatedByCol2 ) {
+					$doJoinGet = false;
+				}
+			}
+
+			if ($doJoinGet) {
+?>
+
+	/**
+	 * If this collection has already been initialized with
+	 * an identical criteria, it returns the collection.
+	 * Otherwise if this <?php echo $table->getPhpName() ?> is new, it will return
+	 * an empty collection; or if this <?php echo $table->getPhpName() ?> has previously
+	 * been saved, it will retrieve related <?php echo $relCol ?> from storage.
+	 *
+	 * This method is protected by default in order to keep the public
+	 * api reasonable.  You can provide public methods for those you
+	 * actually need in <?php echo $table->getPhpName() ?>.
+	 */
+	public function get<?php echo $relCol ?>Join<?php echo $relCol2 ?>($criteria = null, $con = null)
+	{
+		// include the Peer class
+		include_once '<?php echo $tblFKPackagePath . $className ?>Peer.php';
+		if ($criteria === null) {
+			$criteria = new Criteria();
+		}
+
+		if ($this-><?php echo $collName ?> === null) {
+			if ($this->isNew()) {
+			   $this-><?php echo $collName ?> = array();
+			} else {
+<?php
+		foreach ($fk->getForeignColumns() as $columnName) {
+			$column = $table->getColumn($columnName);
+			$flMap = $fk->getForeignLocalMapping();
+			$colFKName = $flMap[$columnName];
+			$colFK = $tblFK->getColumn($colFKName);
+?>
+				$criteria->add(<?php echo PeerBuilder::getColumnName($colFK, $className) ?>, $this->get<?php echo $column->getPhpName() ?>());
+<?php
+		} // end foreach ($fk->getForeignColumns()
+?>
+				$this-><?php echo $collName ?> = <?php echo $className ?>Peer::doSelectJoin<?php echo $relCol2 ?>($criteria, $con);
+			}
+		} else {
+			// the following code is to determine if a new query is
+			// called for.  If the criteria is the same as the last
+			// one, just return the collection.
+<?php
+			foreach ($fk->getForeignColumns() as $columnName) {
+				$column = $table->getColumn($columnName);
+				$flMap = $fk->getForeignLocalMapping();
+				$colFKName = $flMap[$columnName];
+				$colFK = $tblFK->getColumn($colFKName);
+?>
+			$criteria->add(<?php echo PeerBuilder::getColumnName($colFK, $className) ?>, $this->get<?php echo $column->getPhpName() ?>());
+<?php
+			} /* end foreach ($fk->getForeignColumns() */
+?>
+			if (!isset($this->last<?php echo $relCol ?>Criteria) || !$this->last<?php echo $relCol ?>Criteria->equals($criteria)) {
+				$this-><?php echo $collName ?> = <?php echo $className ?>Peer::doSelectJoin<?php echo $relCol2 ?>($criteria, $con);
+			}
+		}
+		$this->last<?php echo $relCol ?>Criteria = $criteria;
+
+		return $this-><?php echo $collName ?>;
+	}
+<?php
+	} /* end if($doJoinGet) */
+
+	} /* end foreach ($tblFK->getForeignKeys() as $fk2) { */
+	} /* end if countFK >= 1 */
+
+	} /*ends foreach over table->getReferrers() */
+
+} /* the if(complexObjectModel) */
+
+//
+// add GenericAccessors or GenericMutators?
+//
+if (!$table->isAlias() && ($addGenericAccessors || ($addGenericMutators && !$table->isReadOnly())))
+{
+?>
+
+	/**
+	 * phpname type
+	 * e.g. 'AuthorId'
+	 */
+	const TYPE_PHPNAME = 'phpName';
+
+	/**
+	 * column (peer) name type
+	 * e.g. 'book.AUTHOR_ID'
+	 */
+	const TYPE_COLNAME = 'colName';
+
+	/**
+	 * column fieldname type
+	 * e.g. 'author_id'
+	 */
+	const TYPE_FIELDNAME = 'fieldName';
+
+	/**
+	 * num type
+	 * simply the numerical array index, e.g. 4
+	 */
+	const TYPE_NUM = 'num';
+<?php
+	$tableColumns = $table->getColumns();
+	$tablePhpname = $table->getPhpName();
+?>
+
+	/**
+	 * holds an array of fieldnames
+	 *
+	 * first dimension keys are the type constants
+	 * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id'
+	 */
+	private static $fieldNames = array (
+		<?php echo $basePrefix . $table->getPhpName() ?>::TYPE_PHPNAME => array (<?php foreach ($tableColumns as $col) { ?>'<?php echo $col->getPhpName(); ?>', <?php } ?>),
+		<?php echo $basePrefix . $table->getPhpName() ?>::TYPE_COLNAME => array (<?php foreach ($tableColumns as $col) { ?><?php echo PeerBuilder::getColumnName($col, $tablePhpname); ?>, <?php } ?>),
+		<?php echo $basePrefix . $table->getPhpName() ?>::TYPE_FIELDNAME => array (<?php foreach ($tableColumns as $col) { ?>'<?php echo $col->getName(); ?>', <?php } ?>),
+		<?php echo $basePrefix . $table->getPhpName() ?>::TYPE_NUM => array (<?php foreach ($tableColumns as $num => $col) { echo $num; ?>, <?php } ?>)
+	);
+
+	/**
+	 * holds an array of keys for quick access to the fieldnames array
+	 *
+	 * first dimension keys are the type constants
+	 * e.g. self::$fieldNames[self::TYPE_PHPNAME]['Id'] = 0
+	 */
+	private static $fieldKeys = array (
+		<?php echo $basePrefix . $table->getPhpName() ?>::TYPE_PHPNAME => array (<?php foreach ($tableColumns as $num => $col) { ?>'<?php echo $col->getPhpName(); ?>' => <?php echo $num; ?>, <?php } ?>),
+		<?php echo $basePrefix . $table->getPhpName() ?>::TYPE_COLNAME => array (<?php foreach ($tableColumns as $num => $col) { ?><?php echo PeerBuilder::getColumnName($col, $tablePhpname); ?> => <?php echo $num; ?>, <?php } ?>),
+		<?php echo $basePrefix . $table->getPhpName() ?>::TYPE_FIELDNAME => array (<?php foreach ($tableColumns as $num => $col) { ?>'<?php echo $col->getName(); ?>' => <?php echo $num; ?>, <?php } ?>),
+		<?php echo $basePrefix . $table->getPhpName() ?>::TYPE_NUM => array (<?php foreach ($tableColumns as $num => $col) { echo $num; ?>, <?php } ?>)
+	);
+
+	/**
+	 * Returns an array of of field names.
+	 *
+	 * @param  string $type The type of fieldnames to return:
+	 *                      One of the class type constants TYPE_PHPNAME,
+	 *                      TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM
+	 * @return array A list of field names
+	 */
+
+	static public function getFieldNames($type = self::TYPE_FIELDNAME)
+	{
+		if (!isset(self::$fieldNames[$type])) {
+			throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM. ' . $type . ' was given.');
+		}
+		return self::$fieldNames[$type];
+	}
+
+	/**
+	 * Translates a fieldname to another type
+	 *
+	 * @param string $name field name
+	 * @param string $fromType One of the class type constants TYPE_PHPNAME,
+	 *                         TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM
+	 * @param string $toType   One of the class type constants
+	 * @return string translated name of the field.
+	 */
+	static public function translateFieldName($name, $fromType, $toType)
+	{
+		$toNames = self::getFieldNames($toType);
+		$key = self::$fieldKeys[$fromType][$name];
+		if ($key === false) {
+			throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r($fromNames, true));
+		}
+		return $toNames[$key];
+	}
+<?php if ($addGenericAccessors) { ?>
+
+	/**
+	 * Retrieves a field from the object by name passed in as a string.
+	 *
+	 * @param string $name name
+	 * @param string $type The type of fieldname the $name is of:
+	 *                     one of the class type constants TYPE_PHPNAME,
+	 *                     TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM
+	 * @return mixed Value of field.
+	 */
+	public function getByName($name, $type = self::TYPE_COLNAME)
+	{
+		$names = self::getFieldNames($type);
+		$pos = self::translateFieldName($name, $type, self::TYPE_NUM);
+		return $this->getByPosition($pos);
+	}
+
+	/**
+	 * Retrieves a field from the object by Position as specified in the xml schema.
+	 * Zero-based.
+	 *
+	 * @param int $pos position in xml schema
+	 * @return mixed Value of field at $pos
+	 */
+	public function getByPosition($pos)
+	{
+		switch($pos) {
+<?php
+		$i = 0;
+		foreach ($table->getColumns() as $col) {
+			$cfc = $col->getPhpName();
+			$cptype = $col->getPhpNative();// not safe to use it because some methods may return objects (Blob)
+?>
+			case <?php echo $i ?>:
+				return $this->get<?php echo $cfc ?>();
+				break;
+<?php
+			$i++;
+		} /* foreach */
+?>
+			default:
+				return null;
+		} // switch()
+	}
+
+	/**
+	 * Exports the object as an array.
+	 *
+	 * You can specify the key type of the array by passing one of the class
+	 * type constants.
+	 *
+	 * @param string $keyType One of the class type constants TYPE_PHPNAME,
+	 *                        TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM
+	 * @return an associative array containing the field names (as keys) and field values
+	 */
+	public function toArray($keyType = self::TYPE_PHPNAME)
+	{
+		$keys = self::getFieldNames($keyType);
+		$result = array(
+<?php
+		foreach ($table->getColumns() as $num => $col) {
+?>
+			$keys[<?php echo $num; ?>] => $this->get<?php echo $col->getPhpName(); ?>(),
+<?php
+		} /* foreach */
+?>
+		);
+		return $result;
+	}
+<?php } /* ends the if($addGenericAccessors) */ ?>
+
+
+<?php if ($addGenericMutators && !$table->isReadOnly()) { ?>
+
+	/**
+	 * Sets a field from the object by name passed in as a string.
+	 *
+	 * @param string $name peer name
+	 * @param mixed $value field value
+	 * @param string $type The type of fieldname the $name is of:
+	 *                     one of the class type constants TYPE_PHPNAME,
+	 *                     TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM
+	 * @return void
+	 */
+	public function setByName($name, $value, $type = self::TYPE_COLNAME)
+	{
+		$names = $this->getFieldnames($type);
+		$pos = array_search($name, $names);
+		return $this->setByPosition($pos, $value);
+	}
+
+	/**
+	 * Sets a field from the object by Position as specified in the xml schema.
+	 * Zero-based.
+	 *
+	 * @param int $pos position in xml schema
+	 * @param mixed $value field value
+	 * @return void
+	 */
+	public function setByPosition($pos, $value)
+	{
+		switch($pos) {
+<?php
+		$i = 0;
+		foreach ($table->getColumns() as $col) {
+			$cfc = $col->getPhpName();
+			$cptype = $col->getPhpNative();
+?>
+			case <?php echo $i ?>:
+				$this->set<?php echo $cfc ?>($value);
+				break;
+<?php
+			$i++;
+		} /* foreach */
+?>
+		} // switch()
+	}
+
+	/**
+	 * Populates the object using an array.
+	 *
+	 * This method is just an alias for populateFromArray()
+	 *
+	 * @param array  $arr     An array to populate the object from.
+	 * @param string $keyType The type of keys the array uses:
+	 *                        one of the class type constants TYPE_PHPNAME,
+	 *                        TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM
+	 * @return void
+	 */
+	public function fromArray($arr, $keyType = self::TYPE_COLNAME)
+	{
+		return $this->populateFromArray($arr, $keyType);
+	}
+
+	/**
+	 * Populates the object using an array.
+	 *
+	 * This is particularly useful when populating an object from one of the
+	 * request arrays (e.g. $_POST).  This method goes through the column
+	 * names, checking to see whether a matching key exists in populated
+	 * array. If so the setByName() method is called for that column.
+	 *
+	 * You can specify the key type of the array by additionally passing one
+	 * of the class type constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME,
+	 * TYPE_NUM. The default key type is the (peer) column name (e.g.
+	 * 'book.AUTHOR_ID')
+	 *
+	 * @param array  $arr     An array to populate the object from.
+	 * @param string $keyType The type of keys the array uses.
+	 * @return void
+	 */
+	public function populateFromArray($arr, $keyType = self::TYPE_COLNAME)
+	{
+		$keys = self::getFieldNames($keyType);
+<?php
+		foreach ($table->getColumns() as $num => $col) {
+			$cfc = $col->getPhpName();
+	  		$cptype = $col->getPhpNative();
+?>
+		if (array_key_exists($keys[<?php echo $num ?>], $arr)) $this->set<?php echo $cfc ?>($arr[$keys[<?php echo $num ?>]]);
+<?php
+		} /* foreach */
+?>
+	}
+
+<?php } /* ends the if($addGenericMutators) */
+	} /* ends the if($addGenericAccessors || $addGenericMutators) */
+?>
+
+<?php if (!$table->isAlias() && isset($addSaveMethod) && $addSaveMethod && !$table->isReadOnly()) { ?>
+
+	/**
+	 * Removes this object from datastore and sets delete attribute.
+	 *
+	 * @param Connection $con
+	 * @return void
+	 * @throws PropelException
+	 * @see BaseObject::setDeleted()
+	 * @see BaseObject::isDeleted()
+	 */
+	public function delete($con = null)
+	{
+		if ($this->isDeleted()) {
+			throw new PropelException("This object has already been deleted.");
+		}
+
+		if ($con === null)
+			$con = Propel::getConnection(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME);
+
+		try {
+			$con->begin();
+			<?php echo $table->getPhpName() ?>Peer::doDelete($this, $con);
+			$this->setDeleted(true);
+			$con->commit();
+		} catch (PropelException $e) {
+			$con->rollback();
+			throw $e;
+		}
+	}
+
+<?php
+if ($complexObjectModel) {
+?>
+
+	/**
+	 * flag to prevent endless save loop, if this object is referenced
+	 * by another object which falls in this transaction.
+	 * @var boolean
+	 */
+	private $alreadyInSave = false;
+
+	/**
+	 * Stores the object in the database.  If the object is new,
+	 * it inserts it; otherwise an update is performed.  This method
+	 * wraps the doSave() worker method in a transaction.
+	 *
+	 * @param Connection $con
+	 * @return void
+	 * @throws PropelException
+	 */
+	public function save($con = null)
+	{
+		if ($this->isDeleted()) {
+			throw new PropelException("You cannot save an object that has been deleted.");
+		}
+
+		if ($con === null)
+			$con = Propel::getConnection(<?php echo $table->getPhpName()?>Peer::DATABASE_NAME);
+
+		try {
+			$con->begin();
+			$this->doSave($con);
+			$con->commit();
+		} catch (PropelException $e) {
+			$con->rollback();
+			throw $e;
+		}
+	}
+<?php
+} /* if ($complexObjectModel) */
+?>
+
+	/**
+	 * Stores the object in the database.  If the object is new,
+	 * it inserts it; otherwise an update is performed.
+	 *
+	 * @param Connection $con
+	 * @return void
+	 * @throws PropelException
+	 */
+<?php
+if($complexObjectModel) {
+?>
+		protected function doSave($con)<?php
+} else {
+?>
+		public function save($con = null)<?php
+}
+?>
+	{
+
+<?php
+if(!$complexObjectModel) {
+?>		if ($this->isDeleted()) {
+			throw new PropelException("You cannot save an object that has been deleted.");
+		}
+
+		if ($con === null) {
+			$con = Propel::getConnection(<?php echo $basePrefix . $table->getPhpName() ?>Peer::DATABASE_NAME);
+		}
+<?php
+}
+
+if ($complexObjectModel) {
+?>
+
+		if (!$this->alreadyInSave) {
+			$this->alreadyInSave = true;
+<?php
+	if (!empty($pVars)) {
+?>
+
+			// We call the save method on the following object(s) if they
+			// were passed to this object by their coresponding set
+			// method.  This object relates to these object(s) by a
+			// foreign key reference.
+<?php
+		for($i=0,$_i=count($aVars); $i < $_i; $i++) {
+			$aVarName = $aVars[$i];
+?>
+			if ($this-><?php echo $aVarName ?> !== null) {
+				if ($this-><?php echo $aVarName ?>->isModified()) $this-><?php echo $aVarName ?>->save($con);
+				$this->set<?php echo $pVars[$i] ?>($this-><?php echo $aVarName ?>);
+			}
+<?php
+		} /* foreach */
+	} /* if count(pVars) != 0 */
+} /* if complexObjectMode */
+?>
+
+			// If this object has been modified, then save it to the database.
+			if ($this->isModified()) {
+				if ($this->isNew()) {
+					$pk = <?php echo $table->getPhpName() ?>Peer::doInsert($this, $con);
+<?php
+	if ($table->getIdMethod() != "none") {
+
+		if (count($pks = $table->getPrimaryKey())) {
+			foreach ($pks as $pk) {
+				if ($pk->isAutoIncrement()) {
+?>
+					$this->set<?php echo $pk->getPhpName();?>( $pk );  //[IMV] update autoincrement primary key
+<?php
+				}
+			}
+		}
+	}
+?>
+					$this->setNew(false);
+				} else {
+					<?php echo $table->getPhpName() ?>Peer::doUpdate($this, $con);
+				}
+				$this->resetModified(); // [HL] After being saved an object is no longer 'modified'
+			}
+<?php
+	if ($complexObjectModel) {
+		foreach ($table->getReferrers() as $fk) {
+			$tblFK = $fk->getTable();
+			if ( $tblFK->getName() != $table->getName() ) {
+				$className = $tblFK->getPhpName();
+				$relCol = "";
+				foreach ($fk->getLocalColumns() as $columnName) {
+					$column = $tblFK->getColumn($columnName);
+					if ($column->isMultipleFK()) {
+						$relCol .= $column->getPhpName();
+					}
+				}
+
+				if ($relCol == "") {
+					$relCol = $className . "s";
+				} else {
+					$relCol = $className . "sRelatedBy" . $relCol;
+				}
+
+				$collName = "coll" . $relCol;
+?>
+			if ($this-><?php echo $collName ?> !== null) {
+				for ($i=0,$size=count($this-><?php echo $collName ?>); $i < $size; $i++) {
+					$this-><?php echo $collName ?>[$i]->save($con);
+				}
+			  }
+<?php
+			} /* if tableFK !+ table */
+		} /* foreach getReferrers() */
+	} /* if complexObjectModel */
+?>
+
+<?php
+	if ($complexObjectModel) {
+?>
+			$this->alreadyInSave = false;
+		}
+<?php
+	} /* if ($complexObjectModel) */
+?>
+	}
+<?php
+} /* if !table->isAlias && isset .... */
+?>
+
+<?php
+if (!$table->isAlias() && !$table->isReadOnly()) {
+?>
+	/**
+	 * Validates the objects modified field values.
+<?php
+	if ($complexObjectModel) {
+?>
+	 * This includes all objects related to this table.
+<?php
+	} /* if ($complexObjectModel) */
+?>
+	 *
+	 * If $columns is either a column name or an array of column names
+	 * only those columns are validated.
+	 *
+	 * @param mixed $columns Column name or an array of column names.
+	 *
+	 * @return mixed <code>true</code> if all columns pass validation
+	 *			  or an array of <code>ValidationFailed</code> objects for columns that fail.
+	 */
+	public function validate($columns = null)
+	{
+	  if ($columns)
+	  {
+		return <?php echo $table->getPhpName()?>Peer::doValidate($this, $columns);
+	  }
+
+<?php
+	if (!$complexObjectModel) {
+?>
+		return <?php echo $table->getPhpName()?>Peer::doValidate($this);
+<?php
+	} else {
+?>
+		return $this->doValidate();
+<?php
+	} /* if (!$complexObjectModel) */
+?>
+	}
+
+<?php
+	if ($complexObjectModel) {
+?>
+	/**
+	 * flag to prevent endless validation loop, if this object is referenced
+	 * by another object which falls in this transaction.
+	 * @var boolean
+	 */
+	protected $alreadyInValidation = false;
+
+	/**
+	 * This function performs the validation work for complex object models.
+	 *
+	 * In addition to checking the current object, all related objects will
+	 * also be validated.  If all pass then <code>true</code> is returned; otherwise
+	 * an aggreagated array of ValidationFailed objects will be returned.
+	 *
+	 * @return mixed <code>true</code> if all validations pass; array of <code>ValidationFailed</code> objets otherwise.
+	 */
+	protected function doValidate()
+	{
+		if (! $this->alreadyInValidation) {
+			$this->alreadyInValidation = true;
+			$retval = null;
+
+			$failureMap = array();
+<?php
+		if (count($pVars) != 0) {
+?>
+
+			// We call the validate method on the following object(s) if they
+			// were passed to this object by their coresponding set
+			// method.  This object relates to these object(s) by a
+			// foreign key reference.
+<?php
+			for($i=0,$_i=count($aVars); $i < $_i; $i++) {
+				$aVarName = $aVars[$i];
+?>
+			if ($this-><?php echo $aVarName ?> !== null) {
+				if (($retval = $this-><?php echo $aVarName ?>->validate()) !== true) {
+					$failureMap = array_merge($failureMap, $retval);
+				}
+			}
+<?php
+			} /* for() */
+		} /* if count(pVars) */
+?>
+
+			if (($retval = <?php echo $table->getPhpName()?>Peer::doValidate($this)) !== true) {
+				$failureMap = array_merge($failureMap, $retval);
+			}
+
+<?php
+		foreach ($table->getReferrers() as $fk) {
+			$tblFK = $fk->getTable();
+			if ( $tblFK->getName() != $table->getName() ) {
+				$className = $tblFK->getPhpName();
+				$relCol = "";
+				foreach ($fk->getLocalColumns() as $columnName) {
+					$column = $tblFK->getColumn($columnName);
+					if ($column->isMultipleFK()) {
+						$relCol .= $column->getPhpName();
+					}
+				}
+
+				if ($relCol == "") {
+					$relCol = $className . "s";
+				} else {
+					$relCol = $className . "sRelatedBy" . $relCol;
+				}
+
+				$collName = "coll" . $relCol;
+?>
+			if ($this-><?php echo $collName ?> !== null) {
+				for ($i=0,$size=count($this-><?php echo $collName ?>); $i < $size; $i++) {
+					if (($retval = $this-><?php echo $collName ?>[$i]->validate()) !== true) {
+						$failureMap = array_merge($failureMap, $retval);
+					}
+				}
+			}
+<?php
+			} /* if tableFK !+ table */
+		} /* foreach getReferrers() */
+?>
+
+			$this->alreadyInValidation = false;
+		}
+
+		return (!empty($failureMap) ? $failureMap : true);
+	}
+
+<?php
+	} /* complexObjectModel */
+} /* ! isAlias */
+?>
+
+<?php
+
+// PrimaryKey methods
+if (!$table->isAlias()) {
+
+	if (!$table->isReadOnly()) {
+
+		$throwsClause = "@throws PropelException";
+
+		if (count($table->getPrimaryKey()) == 1) {
+			$pkeys = $table->getPrimaryKey();
+			$col = $pkeys[0];
+			$clo=strtolower($col->getName());
+			$cptype= $col->getPhpNative();
+?>
+	/**
+	 * Set the PrimaryKey.
+	 *
+	 * @param mixed <?php echo $clo ?> Primary key.
+	 * @return void
+	 * <?php echo $throwsClause ?> 
+	 */
+	public function setPrimaryKey($key)
+	{
+		$this->set<?php echo $col->getPhpName() ?>($key);
+	}
+
+<?php
+		} elseif (count($table->getPrimaryKey()) > 1) { /* if(count($table->getPrimaryKey()) == 1) */
+?>
+
+	private $pks = array();
+
+	/**
+	 * Set the PrimaryKey.
+	 *
+	 * @param array $keys The elements of the composite key (order must match the order in XML file).
+	 * @return void
+	 * @throws PropelException
+	 */
+	public function setPrimaryKey($keys)
+	{
+<?php
+			$i = 0;
+			foreach ($table->getPrimaryKey() as $pk) {
+				$pktype = $pk->getPhpNative();
+?>
+
+		$this->set<?php echo $pk->getPhpName() ?>($keys[<?php echo $i ?>]);
+<?php
+				$i++;
+			} /* foreach ($table->getPrimaryKey() */
+?>
+
+	}
+
+<?php
+		} else { /* if(count($table->getPrimaryKey()) == 1) */
+?>
+
+	/**
+	 * Dummy primary key setter.
+	 * 
+	 * This function only exists to preserve backwards compatibility.  It is no longer
+	 * needed or required by the Persistent interface.  It will be removed in next BC-breaking
+	 * release of Propel.
+	 *
+	 * @deprecated
+	 */
+	 public function setPrimaryKey($pk)
+	 {
+		 // do nothing, because this object doesn't have any primary keys
+	 }
+<?php
+		} /* if(count($table->getPrimaryKey()) == 1) */
+
+	} /* !table->isReadOnly() */
+?>
+
+	/**
+	 * Returns an id that differentiates this object from others
+	 * of its class.
+	 * @return <?php if (count($table->getPrimaryKey()) === 0) { echo "null"; } elseif (count($table->getPrimaryKey()) > 1) { echo "array"; } else { $pkeys = $table->getPrimaryKey(); echo $pkeys[0]->getPhpType(); } ?> 
+	 */
+	public function getPrimaryKey()
+	{
+<?php
+	if (count($table->getPrimaryKey()) == 1) {
+?>
+
+		return $this->get<?php $pkeys = $table->getPrimaryKey(); echo $pkeys[0]->getPhpName()?>();
+<?php
+	} elseif (count($table->getPrimaryKey()) > 1) { /* if (count($table->getPrimaryKey()) == 1) { */
+		$i = 0;
+		foreach ($table->getPrimaryKey() as $pk) {
+?>
+		$this->pks[<?php echo $i ?>] = $this->get<?php echo $pk->getPhpName() ?>();
+<?php
+			$i++;
+		} /* foreach */
+?>
+		return $this->pks;
+<?php
+	} else { /*if (count($table->getPrimaryKey()) == 1) { */
+?>
+
+		return null;
+<?php
+	} /* if (count($table->getPrimaryKey()) == 1) { */
+?>
+
+	}
+
+<?php
+	if (!$table->isAbstract()) {
+?>
+
+	/**
+	 * Makes a copy of this object that will be inserted as a new row in table when saved.
+	 * It creates a new object filling in the simple attributes, but skipping any primary
+	 * keys that are defined for the table.
+	 * <?php if ($complexObjectModel) { ?>
+	 * If desired, this method can also make copies of all associated (fkey referrers)
+	 * objects.
+	 *
+	 * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row.
+	 * <?php } ?>
+	 * @return <?php echo $table->getPhpName() ?> Clone of current object.
+	 * @throws PropelException
+	 */
+	public function copy(<?php if ($complexObjectModel) { ?>$deepCopy = false<?php } ?>)
+	{
+		$clazz = get_class($this);
+		$copyObj = new $clazz();
+<?php
+
+		$pkcols = array();
+		foreach ($table->getColumns() as $pkcol) {
+			if ($pkcol->isPrimaryKey()) {
+				$pkcols[] = $pkcol->getName();
+			}
+		}
+
+		foreach ($table->getColumns() as $col) {
+
+			if (!in_array($col->getName(), $pkcols)) {
+?>
+		$copyObj->set<?php echo $col->getPhpName()?>($this-><?php echo strtolower($col->getName()) ?>);
+<?php
+		}
+	}
+
+		if ($complexObjectModel) {
+
+			// Avoid useless code by checking to see if there are any referrers
+			// to this table:
+			if (count($table->getReferrers()) > 0) {
+?>
+
+		if ($deepCopy) {
+			// important: setNew(false) because this affects the behavior of
+			// the getter/setter methods for fkey referrer objects.
+			$copyObj->setNew(false);
+<?php
+
+				foreach ($table->getReferrers() as $fk) {
+					$tblFK = $fk->getTable();
+					if ( $tblFK->getName() != $table->getName() ) {
+						$className = $tblFK->getPhpName();
+						$relCol = "";
+						foreach ($fk->getLocalColumns() as $columnName) {
+							$column = $tblFK->getColumn($columnName);
+							if ($column->isMultipleFK()) {
+								$relCol .= $column->getPhpName();
+							}
+						}
+
+						if ($relCol == "") {
+							$pCollName = $className . "s";
+							$pCollNameNoS = $className;
+						} else {
+							$pCollName = $className . "sRelatedBy".$relCol;
+							$pCollNameNoS = $className . "RelatedBy".$relCol;
+						}
+?>
+
+			foreach($this->get<?php echo $pCollName ?>() as $relObj) {
+				$copyObj->add<?php echo $pCollNameNoS ?>($relObj->copy());
+			}
+<?php
+					} /* if tblFK != table */
+				} /* foreach */
+?>
+		} // if ($deepCopy)
+<?php
+			} /* if (count referrers > 0 ) */
+?>
+
+		$copyObj->setNew(true);
+
+<?php
+		} /* if complex object model */
+
+// this is a little redundant, but it's clearer than re-using
+// the $pkcols array  we created above
+		foreach ($table->getColumns() as $col) {
+			if ($col->isPrimaryKey()) {
+					$coldefval = $col->getPhpDefaultValue();
+
+					// This seems to work pretty well for getting
+					// the right value (including NULL)
+					$coldefval = var_export($coldefval, true);
+?>
+		$copyObj->set<?php echo $col->getPhpName()?>(<?php echo $coldefval ?>); // this is a pkey column, so set to default value
+<?php
+			} // if col->isPrimaryKey
+		} // foreach
+?>
+
+		return $copyObj;
+	}
+
+<?php
+	} /* if (!$table->isAbstract()) */
+?>
+
+	/**
+	 * returns a peer instance associated with this om.  Since Peer classes
+	 * are not to have any instance attributes, this method returns the
+	 * same instance for all member of this class. The method could therefore
+	 * be static, but this would prevent one from overriding the behavior.
+	 * @return <?php echo $table->getPhpName() ?>Peer
+	 */
+	public function getPeer()
+	{
+		if (self::$peer === null) {
+			self::$peer = new <?php echo $table->getPhpName() ?>Peer();
+		}
+		return self::$peer;
+	}
+<?php
+} /* if !table->isAlias */
+?>
+
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Peer.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Peer.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/om/php5/Peer.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1501 @@
+<?php 
+
+// This is a [rather messy] template that builds a Peer class.
+// 
+// These templates use the classes in propel.engine.database.model which represent the model (database).
+// These templates also use the propel.engine.builder classes (increasingly) to encapsulate some of the
+// repeating logic.
+// 
+// These are based on velocity templates in original Torque.
+// 
+// TODO:
+//	  - move these into classes, perhaps, to further componentize the building of templates.
+//	  - if these were classes it would also be easy to customize them through extension
+// 
+// $Id: Peer.tpl,v 1.27 2005/03/25 16:15:43 dzuelke Exp $
+
+include_once 'propel/engine/builder/om/PeerBuilder.php';
+include_once 'propel/engine/builder/om/ClassTools.php';
+include_once 'creole/CreoleTypes.php';
+
+$db = $table->getDatabase();
+if($table->getPackage()) {
+	$package = $table->getPackage();
+} else {
+	$package = $targetPackage;
+}
+
+echo '<' . '?' . 'php';
+
+
+$basePeerClass = ClassTools::getBasePeer($table);
+$basePeerClassname = ClassTools::classname($basePeerClass);
+?>
+
+require_once '<?php echo ClassTools::getFilePath($basePeerClass) ?>';
+
+// The object class -- needed for instanceof checks in this class.
+// actual class may be a subclass -- as returned by <?php echo $table->getPhpName() ?>Peer::getOMClass()
+include_once '<?php echo ClassTools::getFilePath($package, $table->getPhpName()) ?>';
+<?php 
+foreach ($table->getForeignKeys() as $fk) {
+	
+   $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+   $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package); 
+   
+   if (!$tblFK->isForReferenceOnly()) {
+   ?>
+	
+include_once '<?php echo ClassTools::getFilePath($tblFKPackage, $tblFK->getPhpName()) ?>';
+include_once '<?php echo ClassTools::getFilePath($tblFKPackage, $tblFK->getPhpName() . 'Peer') ?>';
+<?php 
+	} // if (!$tblFK->isForReferenceOnly()
+} // foreach
+?>
+
+/**
+ * Base static class for performing query and update operations on the '<?php echo $table->getName() ?>' table.
+ *
+ * <?php echo $table->getDescription() ?> 
+ *
+<?php if ($addTimeStamp) { ?>
+ * This class was autogenerated by Propel on:
+ *
+ * [<?php echo $now ?>]
+ *
+<?php } ?>
+ * @package <?php echo $package ?> 
+ */
+abstract class <?php echo $basePrefix . $table->getPhpName() ?>Peer
+{
+<?php if (!$table->isAlias()) { ?>
+
+	/** the default database name for this class */
+	const DATABASE_NAME = "<?php echo $table->getDatabase()->getName() ?>";
+
+	/** the table name for this class */
+	const TABLE_NAME = "<?php echo $table->getName() ?>";
+
+<?php foreach ($table->getColumns() as $col) { ?> 
+	/** the column name for the <?php echo strtoupper($col->getName()) ?> field */
+	const <?php echo PeerBuilder::getColumnName($col) ?> = "<?php echo $table->getName() . '.' . strtoupper($col->getName()) ?>";
+<?php } ?>
+
+	
+<?php } /* if (!$table->isAlias()) */ ?>
+
+	/** number of columns for this peer */
+	public static $numColumns = <?php echo $table->getNumColumns() ?>;
+	
+	/** number of lazy load columns for this peer */
+	public static $numLazyLoadColumns = <?php echo $table->getNumLazyLoadColumns() ?>;
+	
+	/** A class that can be returned by this peer. */
+	const CLASS_DEFAULT = "<?php echo $package . '.' . $table->getPhpName() ?>";
+
+	/** The PHP to DB Name Mapping */
+	private static $phpNameMap = null;
+
+	/**
+	 * @return MapBuilder the map builder for this peer
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function getMapBuilder()		
+	{
+		include_once '<?php echo ClassTools::getFilePath($pkmap, $table->getPhpName() . 'MapBuilder') ?>';
+		return <?php echo $basePeerClassname ?>::getMapBuilder(<?php echo $table->getPhpName() ?>MapBuilder::CLASS_NAME);
+	}
+
+	/**
+	 * Gets a map (hash) of PHP names to DB column names.
+	 *
+	 * @return array The PHP to DB name map for this peer
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 * @todo Consider having template build the array rather than doing it at runtime.
+	 */
+	public static function getPhpNameMap()
+	{
+		if (self::$phpNameMap === null) {
+			$map = <?php echo $table->getPhpName() ?>Peer::getTableMap();
+			$columns = $map->getColumns();
+			$nameMap = array();
+			foreach ($columns as $column) {
+				$nameMap[$column->getPhpName()] = $column->getColumnName();
+			}
+			self::$phpNameMap = $nameMap;
+		}
+		return self::$phpNameMap;
+	}
+<?php
+
+if (!$table->isAlias()) { 
+
+
+	if ($table->getChildrenColumn()) { 
+
+		$col = $table->getChildrenColumn();
+		$tfc = $table->getPhpName();
+		$cfc = $col->getPhpName();
+	
+		if ($col->isEnumeratedClasses()) {	
+			
+			if ($col->isPrimitiveNumeric()) $quote = "";
+			else $quote = '"';
+			
+			foreach ($col->getChildren() as $child) {
+				$childpkg = ($child->getPackage() ? $child->getPackage() : $package);
+?> 
+	/** A key representing a particular subclass */
+	const CLASSKEY_<?php echo strtoupper($child->getKey()) ?> = <?php echo $quote . $child->getKey() . $quote ?>;
+
+	/** A class that can be returned by this peer. */
+	const CLASSNAME_<?php echo strtoupper($child->getKey()) ?> = "<?php echo $childpkg . '.' . $child->getClassName() ?>";
+<?php	
+			} /* foreach children */
+		} /* if col->isenumerated...() */
+	} /* if table->getchildrencolumn() */
+?>	
+	/**
+	 * Convenience method which changes table.column to alias.column.
+	 *
+	 * Using this method you can maintain SQL abstraction while using column aliases.
+	 * <code>
+	 *		$c->addAlias("alias1", TablePeer::TABLE_NAME);
+	 *		$c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN);
+	 * </code>
+	 * @param string $alias The alias for the current table.
+	 * @param string $column The column name for current table. (i.e. <?php echo $table->getPhpName() ?>Peer::COLUMN_NAME).
+	 * @return string
+	 */
+	public static function alias($alias, $column)
+	{
+		return $alias . substr($column, strlen(self::TABLE_NAME));
+	}
+	
+	/**
+	 * Add all the columns needed to create a new object.
+	 * 
+	 * Note: any columns that were marked with lazyLoad="true" in the
+	 * XML schema will not be added to the select list and only loaded
+	 * on demand.
+	 *
+	 * @param criteria object containing the columns to add.
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function addSelectColumns(Criteria $criteria)
+	{
+<?php 
+	foreach ($table->getColumns() as $col) { 
+		if (!$col->isLazyLoad()) {			
+	?>
+		$criteria->addSelectColumn(self::<?php echo PeerBuilder::getColumnName($col) ?>);
+<?php 
+		}
+	} ?>
+	}
+	
+<?php
+	$count_col = "*";
+	if ($table->hasPrimaryKey()) {
+		$pk = $table->getPrimaryKey();
+		$count_col = $table->getName() . "." . strtoupper($pk[0]->getName());
+	}
+?>
+	const COUNT = "COUNT(<?php echo $count_col?>)";
+	const COUNT_DISTINCT = "COUNT(DISTINCT <?php echo $count_col?>)";
+  
+	/**
+	 * Returns the number of rows matching criteria.
+	 *
+	 * @param Criteria $criteria
+	 * @param boolean $distinct Whether to select only distinct columns.
+	 * @param Connection $con
+	 * @return int Number of matching rows.
+	 */
+	public static function doCount(Criteria $criteria, $distinct = false, $con = null)
+	{   
+		// we're going to modify criteria, so copy it first
+		$criteria = clone $criteria;
+		
+		// clear out anything that might confuse the ORDER BY clause
+		$criteria->clearSelectColumns()->clearOrderByColumns();
+		if ($distinct || in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) {
+			$criteria->addSelectColumn(<?php echo $table->getPhpName()?>Peer::COUNT_DISTINCT);
+		} else {
+			$criteria->addSelectColumn(<?php echo $table->getPhpName()?>Peer::COUNT);	
+		}
+		// just in case we're grouping: add those columns to the select statement
+		foreach($criteria->getGroupByColumns() as $column)
+		{
+			$criteria->addSelectColumn($column);
+		}
+		
+		$rs = <?php echo $table->getPhpName()?>Peer::doSelectRS($criteria, $con);		
+		if ($rs->next()) {
+			return $rs->getInt(1);
+		} else {
+			// no rows returned; we infer that means 0 matches.
+			return 0;
+		}
+	}
+  
+	/**
+	 * Method to select one object from the DB.
+	 *
+	 * @param Criteria $criteria object used to create the SELECT statement.
+	 * @param Connection $con
+	 * @return <?php echo $table->getPhpName() ?>
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function doSelectOne(Criteria $criteria, $con = null)
+	{
+		$critcopy = clone $criteria;
+		$critcopy->setLimit(1);
+		$objects = <?php echo $table->getPhpName() ?>Peer::doSelect($critcopy, $con);
+		if ($objects) {
+			return $objects[0];
+		}
+		return null;
+	}
+
+	/**
+	 * Method to do selects.
+	 *
+	 * @param Criteria $criteria The Criteria object used to build the SELECT statement.
+	 * @param Connection $con
+	 * @return array Array of selected Objects
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function doSelect(Criteria $criteria, $con = null)
+	{
+		return <?php echo $table->getPhpName() ?>Peer::populateObjects(<?php echo $table->getPhpName() ?>Peer::doSelectRS($criteria, $con));
+	}
+	
+	/**
+	 * Prepares the Criteria object and uses the parent doSelect()
+	 * method to get a ResultSet.
+	 * 
+	 * Use this method directly if you want to just get the resultset
+	 * (instead of an array of objects).
+	 *
+	 * @param Criteria $criteria The Criteria object used to build the SELECT statement.
+	 * @param Connection $con the connection to use
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 * @return ResultSet The resultset object with numerically-indexed fields.
+	 * @see <?php echo $basePeerClassname ?>::doSelect()
+	 */
+	public static function doSelectRS(Criteria $criteria, $con = null)
+	{
+		if ($con === null) {
+			$con = Propel::getConnection(self::DATABASE_NAME);
+		}				
+
+		if (!$criteria->getSelectColumns()) {
+			<?php echo $table->getPhpName() ?>Peer::addSelectColumns($criteria);
+		}
+	
+		// Set the correct dbName
+		$criteria->setDbName(self::DATABASE_NAME);
+		
+		// BasePeer returns a Creole ResultSet, set to return
+		// rows indexed numerically.		   
+		return <?php echo $basePeerClassname ?>::doSelect($criteria, $con);
+	}
+
+	/**
+	 * The returned array will contain objects of the default type or
+	 * objects that inherit from the default.
+	 *
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function populateObjects(ResultSet $rs)
+	{
+		$results = array();
+		
+<?php if (!$table->getChildrenColumn()) { ?>
+		// set the class once to avoid overhead in the loop
+		$cls = <?php echo $table->getPhpName() ?>Peer::getOMClass();
+		$cls = Propel::import($cls);
+<?php } ?>
+
+		// populate the object(s)
+		while($rs->next()) {
+<?php if ($table->getChildrenColumn()) { ?>
+			// class must be set each time from the record row
+			$cls = Propel::import(<?php echo $table->getPhpName() ?>Peer::getOMClass($rs, 1));
+			$obj = new $cls();
+			$obj->hydrate($rs);
+			$results[] = $obj;
+<?php } else { ?>			
+			$obj = new $cls();
+			$obj->hydrate($rs);
+			$results[] = $obj;
+<?php } ?>
+		}
+		return $results;
+	}
+
+<?php  } /* if !table->isAlias() */ ?>
+
+<?php if ($table->getChildrenColumn()) { 
+
+	$col = $table->getChildrenColumn();
+?>
+
+	/**
+	 * The returned Class will contain objects of the default type or
+	 * objects that inherit from the default.
+	 *
+	 * @param ResultSet $rs ResultSet with pointer to record containing om class.
+	 * @param int $colnum Column to examine for OM class information (first is 1).
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function getOMClass(ResultSet $rs, $colnum)
+	{
+		$c = null;		
+		
+		try {
+	<?php if ($col->isEnumeratedClasses()) { ?>
+	
+			$omClass = null;
+			$classKey = $rs->getString($colnum - 1 + <?php echo $col->getPosition() ?>);
+			
+			switch($classKey) {
+		<?php			
+			foreach ($col->getChildren() as $child) {
+			?>
+			
+				case self::CLASSKEY_<?php echo strtoupper($child->getKey()) ?>:
+					$omClass = self::CLASSNAME_<?php echo strtoupper($child->getKey()) ?>;
+					break;
+			<?php } /* foreach */ ?>
+			
+				default:
+				
+			<?php if ($table->isAbstract()) { ?>
+				
+					$error = "You must implement the getOMClass method in your"
+							." Peer object in order for things to work properly."
+							." This method should return the proper Class that"
+							." represents the Peer's Business Object.";
+					
+					throw new PropelException($error);						
+			<?php } else { ?>
+			
+					$omClass = self::CLASS_DEFAULT;
+			<?php } ?>
+			
+			} // switch
+			
+			$c = $omClass;
+			
+	<?php } else { /* if not enumerated */ ?>
+
+			$c = Propel::import($rs->getString($colnum - 1 + <?php echo $col->getPosition() ?>));
+			
+	<?php } ?>
+		} catch (Exception $e) {
+			throw new PropelException("Unable to get OM class.", $e);
+		}
+		return $c;
+	}
+
+<?php } else { /* if table->getchildrencolumn */ ?>
+
+	/**
+	 * The class that the Peer will make instances of.
+	 * If the BO is abstract then you must implement this method
+	 * in the BO.
+	 *
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function getOMClass()
+	{<?php if ($table->isAbstract()) { ?> 
+		$error = "You must implement the getOMClass method in your"
+				." Peer object in order for things to work properly."
+				." This method should return the proper Class that"
+				." represents the Peer's Business Object.";
+		
+		throw new PropelException($error);						
+	<?php } else { ?> 
+		return self::CLASS_DEFAULT;
+	<?php } ?>	 
+	}
+<?php }  /* if table->getchildrencolumn */ 
+
+if (!$table->isAlias() && !$table->isReadOnly()) {
+
+?> 
+
+	/**
+	 * Method perform an INSERT on the database, given a <?php echo $table->getPhpName() ?> or Criteria object.
+	 *
+	 * @param mixed $values Criteria or <?php echo $table->getPhpName() ?> object containing data that is used to create the INSERT statement.
+	 * @param Connection $con the connection to use
+	 * @return mixed The new primary key.
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function doInsert($values, $con = null)
+	{		
+		if ($con === null)
+			$con = Propel::getConnection(self::DATABASE_NAME);
+
+		if ($values instanceof Criteria) {
+			$criteria = $values;
+		} else {
+			$criteria = $values->buildCriteria();
+		}
+		
+<?php 
+				foreach ($table->getColumns() as $col) {
+					$cfc = $col->getPhpName();
+					if ($col->isPrimaryKey() && $col->isAutoIncrement() && $table->getIdMethod() != "none") { ?>
+		
+		$criteria->remove(self::<?php echo PeerBuilder::getColumnName($col) ?>); // remove pkey col since this table uses auto-increment
+		<?php	   }
+		
+				}
+		?> 
+		
+		// Set the correct dbName
+		$criteria->setDbName(self::DATABASE_NAME);
+		
+		try {
+			// use transaction because $criteria could contain info
+			// for more than one table (I guess, conceivably)
+			$con->begin();
+			$pk = <?php echo $basePeerClassname ?>::doInsert($criteria, $con);
+			$con->commit();
+		} catch(PropelException $e) {
+			$con->rollback();
+			throw $e;
+		}
+		
+		return $pk;		
+	}
+<?php
+	
+	// Both UPDATE and DELETE can use cascade emulation if the DB driver
+	// doesn't natively support ON UPDATE CASCADE / ON DELETE CASCADE
+	//
+	// Support for ON UPDATE CASCADE emulation has been removed because
+	// it doesn't make any sense for Propel.  ON UPDATE CASCADE works by 
+	// updating referring rows when the pkey is updated; pkeys can never be 
+	// updated unless using the BasePeer class directly.  This behavior may 
+	// change, but for now updateCascade has been removed.
+	
+	// Check to see whether this table has any foreign keys that should be 
+	// cascaded and set the $deleteCascadeRelevant
+	
+	$deleteCascadeRelevant = false;
+	$deleteSetNullRelevant = false;
+	if (!$platform->supportsNativeDeleteTrigger() && count($table->getReferrers()) > 0) {		
+		foreach ($table->getReferrers() as $fk) {
+			if ( $fk->getOnDelete() == ForeignKey::CASCADE ) {
+				$deleteCascadeRelevant = true;
+			} elseif ($fk->getOnDelete() == ForeignKey::SETNULL) {
+				$deleteSetNullRelevant = true;
+			}
+		}
+	} // if count(foreign keys)
+?>
+
+	/**
+	 * Method perform an UPDATE on the database, given a <?php echo $table->getPhpName() ?> or Criteria object.
+	 *
+	 * @param mixed $values Criteria or <?php echo $table->getPhpName() ?> object containing data that is used to create the UPDATE statement.
+	 * @param Connection $con The connection to use (specify Connection object to exert more control over transactions).
+	 * @return int The number of affected rows (if supported by underlying database driver).
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function doUpdate($values, $con = null)
+	{			
+		if ($con === null) {
+			$con = Propel::getConnection(self::DATABASE_NAME);
+		}
+		
+		$selectCriteria = new Criteria(self::DATABASE_NAME);
+				
+		if ($values instanceof Criteria) {
+			$criteria = $values;
+<?php
+	foreach ($table->getColumns() as $col) {		 
+		if($col->isPrimaryKey()) { ?>
+			$comparison = $criteria->getComparison(self::<?php echo PeerBuilder::getColumnName($col) ?>);
+			$selectCriteria->add(self::<?php echo PeerBuilder::getColumnName($col) ?>, $criteria->remove(self::<?php echo PeerBuilder::getColumnName($col) ?>), $comparison);
+<?php 
+		}  /* if col is prim key */
+	 } /* foreach */
+?> 
+		} else { // $values is <?php echo $table->getPhpName() ?> object
+			$criteria = $values->buildCriteria(); // gets full criteria
+			$selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s)			
+		}	
+		
+		// set the correct dbName
+		$criteria->setDbName(self::DATABASE_NAME);
+		
+		return <?php echo $basePeerClassname ?>::doUpdate($selectCriteria, $criteria, $con);		
+	}   
+	
+	/**
+	 * Method to DELETE all rows from the <?php echo $table->getName() ?> table.
+	 *
+	 * @return int The number of affected rows (if supported by underlying database driver).
+	 */
+	public static function doDeleteAll($con = null) 
+	{
+		if ($con === null) $con = Propel::getConnection(self::DATABASE_NAME);
+		$affectedRows = 0; // initialize var to track total num of affected rows		
+		try {
+			// use transaction because $criteria could contain info
+			// for more than one table or we could emulating ON DELETE CASCADE, etc.
+			$con->begin();
+			<?php if ($deleteCascadeRelevant) { ?> 
+			$affectedRows += <?php echo $table->getPhpName() ?>Peer::doOnDeleteCascade(new Criteria(), $con);<?php } elseif ($deleteSetNullRelevant) { ?> 
+			<?php echo $table->getPhpName() ?>Peer::doOnDeleteSetNull(new Criteria(), $con);<?php } ?> 
+			$affectedRows += BasePeer::doDeleteAll(self::TABLE_NAME, $con);
+			$con->commit();
+			return $affectedRows;
+		} catch (PropelException $e) {
+			$con->rollback();
+			throw $e;
+		}
+	}
+	
+	/**
+	 * Method perform a DELETE on the database, given a <?php echo $table->getPhpName() ?> or Criteria object OR a primary key value.
+	 *
+	 * @param mixed $values Criteria or <?php echo $table->getPhpName() ?> object or primary key which is used to create the DELETE statement 
+	 * @param Connection $con the connection to use
+	 * @return int 	The number of affected rows (if supported by underlying database driver).  This includes CASCADE-related rows
+	 *				if supported by native driver or if emulated using Propel.
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	 public static function doDelete($values, $con = null)
+	 {		
+		if ($con === null)
+			$con = Propel::getConnection(self::DATABASE_NAME);
+
+		if ($values instanceof Criteria) {
+			$criteria = $values;
+		} elseif ($values instanceof <?php echo $table->getPhpName() ?>) {
+<?php
+			$pkey_count = 0;
+			foreach ($table->getColumns() as $col) {		 
+				if($col->isPrimaryKey()) $pkey_count++;
+			}
+			
+			if ($pkey_count > 0) {
+			?>
+			$criteria = $values->buildPkeyCriteria();
+<?php	   } else { ?>
+			$criteria = $values->buildCriteria();
+<?php	   } ?>
+		} else {
+			// it must be the primary key
+			$criteria = new Criteria(self::DATABASE_NAME);
+<?php	   if (count($table->getPrimaryKey()) == 1) { 
+					$pkey = $table->getPrimaryKey();
+					$col = array_shift($pkey); ?>
+			$criteria->add(self::<?php echo PeerBuilder::getColumnName($col) ?>, $values);
+<?php	   } else { ?>
+			// primary key is composite; we therefore, expect
+			// the primary key passed to be an array of pkey
+			// values
+<?php
+				$i=0;
+				foreach($table->getPrimaryKey() as $col) { ?>	 
+			$criteria->add(self::<?php echo PeerBuilder::getColumnName($col)?>, $values[<?php echo $i ?>]);
+<?php		 $i++; 
+				}
+			} /* if count(table.PrimaryKeys) */ ?>
+		}
+			 
+		// Set the correct dbName
+		$criteria->setDbName(self::DATABASE_NAME);
+		
+		$affectedRows = 0; // initialize var to track total num of affected rows		
+		
+		try {
+			// use transaction because $criteria could contain info
+			// for more than one table or we could emulating ON DELETE CASCADE, etc.
+			$con->begin();
+			<?php if ($deleteCascadeRelevant) { ?> 
+			$affectedRows += <?php echo $table->getPhpName() ?>Peer::doOnDeleteCascade($criteria, $con);<?php } elseif ($deleteSetNullRelevant) { ?> 
+			<?php echo $table->getPhpName() ?>Peer::doOnDeleteSetNull($criteria, $con);<?php } ?> 
+			$affectedRows += <?php echo $basePeerClassname ?>::doDelete($criteria, $con);
+			$con->commit();
+			return $affectedRows;
+		} catch (PropelException $e) {
+			$con->rollback();
+			throw $e;
+		}		
+	}	
+
+<?php if ($deleteCascadeRelevant) { ?>
+	
+	/**
+	 * This is a method for emulating ON DELETE CASCADE for DBs that don't support this 
+	 * feature (like MySQL or SQLite).
+	 *
+	 * This method is not very speedy because it must perform a query first to get
+	 * the implicated records and then perform the deletes by calling those Peer classes.
+	 * 
+	 * This method should be used within a transaction if possible.
+	 * 
+	 * @param Criteria $criteria
+	 * @param Connection $con
+	 * @return int The number of affected rows (if supported by underlying database driver).
+	 */
+	protected static function doOnDeleteCascade(Criteria $criteria, Connection $con)
+	{
+		// initialize var to track total num of affected rows
+		$affectedRows = 0;
+		
+		// first find the objects that are implicated by the $criteria
+		$objects = <?php echo $table->getPhpName() ?>Peer::doSelect($criteria, $con);
+		foreach($objects as $obj) {
+<?php
+			foreach ($table->getReferrers() as $fk) {
+
+				// $fk is the foreign key in the other table, so localTableName will
+				// actually be the table name of other table
+				$tblFK = $fk->getTable();
+ 		$tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package);
+				
+				if (!$tblFK->isForReferenceOnly()) {
+					// we can't perform operations on tables that are
+					// not within the schema (i.e. that we have no map for, etc.)
+					
+					$fkClassName = $tblFK->getPhpName();
+					
+					// i'm not sure whether we can allow delete cascade for foreign keys
+					// within the same table?  perhaps we can?
+					if ( $fk->getOnDelete() == ForeignKey::CASCADE && 
+							$fk->getTable()->getName() != $table->getName()) {
+						
+						// backwards on purpose
+						$columnNamesF = $fk->getLocalColumns();
+						$columnNamesL = $fk->getForeignColumns(); // should be same num as foreign
+?>
+
+			include_once '<?php echo ClassTools::getFilePath($tblFKPackage, $tblFK->getPhpName()); ?>';
+ 
+			// delete related <?php echo $fkClassName ?> objects
+			$c = new Criteria();
+			<?php
+						for($x=0,$xlen=count($columnNamesF); $x < $xlen; $x++) {
+							$columnFK = $tblFK->getColumn($columnNamesF[$x]);
+							$columnL = $table->getColumn($columnNamesL[$x]);
+														
+						?>$c->add(<?php echo PeerBuilder::getColumnName($columnFK, $fkClassName) ?>, $obj->get<?php echo $columnL->getPhpName() ?>());<?php
+							//$delCmds[] = $fkClassName.'Peer::doDelete('.');
+						} ?> 
+			$affectedRows += <?php echo $fkClassName ?>Peer::doDelete($c, $con);
+			<?php	 
+					} // if cascade && fkey table name != curr table name
+					
+				} // if not for ref only														
+			} // foreach foreign keys
+		?> 
+		}
+		return $affectedRows;
+	}
+
+<?php } elseif ($deleteSetNullRelevant) { ?>
+	
+	/**
+	 * This is a method for emulating ON DELETE SET NULL DBs that don't support this 
+	 * feature (like MySQL or SQLite).
+	 *
+	 * This method is not very speedy because it must perform a query first to get
+	 * the implicated records and then perform the deletes by calling those Peer classes.
+	 * 
+	 * This method should be used within a transaction if possible.
+	 * 
+	 * @param Criteria $criteria
+	 * @param Connection $con
+	 * @return void
+	 */
+	protected static function doOnDeleteSetNull(Criteria $criteria, Connection $con)
+	{
+		
+		// first find the objects that are implicated by the $criteria
+		$objects = <?php echo $table->getPhpName() ?>Peer::doSelect($criteria, $con);
+		foreach($objects as $obj) {
+	<?php
+	
+		// This logic is almost exactly the same as that in doOnDeleteCascade()
+		// it may make sense to refactor this, provided that thigns don't
+		// get too complicated.
+		
+			foreach ($table->getReferrers() as $fk) {
+
+				// $fk is the foreign key in the other table, so localTableName will
+				// actually be the table name of other table
+				$tblFK = $fk->getTable();
+				
+				if (!$tblFK->isForReferenceOnly()) {
+					// we can't perform operations on tables that are
+					// not within the schema (i.e. that we have no map for, etc.)
+					
+					$fkClassName = $tblFK->getPhpName();
+					
+					// i'm not sure whether we can allow delete setnull for foreign keys
+					// within the same table?  perhaps we can?
+					if ( $fk->getOnDelete() == ForeignKey::SETNULL && 
+							$fk->getTable()->getName() != $table->getName()) {
+						
+						// backwards on purpose
+						$columnNamesF = $fk->getLocalColumns();
+						$columnNamesL = $fk->getForeignColumns(); // should be same num as foreign
+					 ?> 
+			// set fkey col in related <?php echo $fkClassName ?> rows to NULL
+			$selectCriteria = new Criteria(self::DATABASE_NAME);
+			$updateValues = new Criteria(self::DATABASE_NAME);
+			<?php
+						for($x=0,$xlen=count($columnNamesF); $x < $xlen; $x++) {
+							$columnFK = $tblFK->getColumn($columnNamesF[$x]);
+							$columnL = $table->getColumn($columnNamesL[$x]);
+														
+						?>$selectCriteria->add(<?php echo PeerBuilder::getColumnName($columnFK, $fkClassName) ?>, $obj->get<?php echo $columnL->getPhpName() ?>());
+			$updateValues->add(<?php echo PeerBuilder::getColumnName($columnFK, $fkClassName) ?>, null);<?php
+						} ?> 
+			<?php echo $basePeerClassname ?>::doUpdate($selectCriteria, $updateValues, $con); // use BasePeer because generated Peer doUpdate() methods only update using pkey
+			<?php	 
+					} // if cascade && fkey table name != curr table name
+					
+				} // if not for ref only														
+			} // foreach foreign keys
+		?> 
+		}
+	}
+
+<?php } /* if setnull relevant */ ?>
+	
+	/**
+	 * Validates all modified columns of given <?php echo $table->getPhpName()?> object.
+	 * If parameter $columns is either a single column name or an array of column names
+	 * than only those columns are validated.
+	 *
+	 * NOTICE: This does not apply to primary or foreign keys for now.
+	 *
+	 * @param <?php echo $table->getPhpName()?> $obj The object to validate.
+	 * @param mixed $cols Column name or array of column names.
+	 *
+	 * @return mixed TRUE if all columns are valid or the error message of the first invalid column.
+	 */
+	public static function doValidate(<?php echo $table->getPhpName()?> $obj, $cols = null)
+	{
+		$columns = array();
+
+		if ($cols)
+		{
+		  $dbMap = Propel::getDatabaseMap(self::DATABASE_NAME);
+		  $tableMap = $dbMap->getTable(self::TABLE_NAME);
+
+		  if (! is_array($cols)) {
+			$cols = array($cols);
+		  }
+
+		  foreach($cols as $colName)
+		  {
+			if ($tableMap->containsColumn($colName))
+			{
+			  $get = 'get' . $tableMap->getColumn($colName)->getPhpName();
+			  $columns[$colName] = $obj->$get();
+			}
+		  }
+		}
+		else
+		{
+<?php
+  foreach ($table->getValidators() as $val) {
+	$col = $val->getColumn();
+	if (! $col->isAutoIncrement()) {
+	  $cfc = $col->getPhpName();
+?>
+		if ($obj->isNew() || $obj->isColumnModified(self::<?php echo PeerBuilder::getColumnName($col) ?>))
+			$columns[self::<?php echo PeerBuilder::getColumnName($col) ?>] = $obj->get<?php echo $cfc?>();
+<?php
+	} // if
+  } // foreach
+?>
+		}
+
+		return <?php echo $basePeerClassname ?>::doValidate(self::DATABASE_NAME, self::TABLE_NAME, $columns);
+	}
+	  
+<?php } /* if !table->isalias */ ?>
+
+<?php if (count($table->getPrimaryKey()) > 0) { 
+
+	if ($table->isAlias()) { 
+		$retrieveMethod = "retrieve" . $table->getPhpName() . "ByPK";
+	} else {
+		$retrieveMethod = "retrieveByPK";
+	}
+	
+	$pks = $table->getPrimaryKey(); 
+
+if (count($table->getPrimaryKey()) === 1) {  ?>
+
+	/**
+	 * Retrieve a single object by pkey or NULL if not found.
+	 *
+	 * @param mixed $pk the primary key.
+	 * @param Connection $con the connection to use
+         * @return <?php echo $table->getPhpName() . "\n" ?>
+	 */
+	public static function <?php echo $retrieveMethod ?>($pk, $con = null)
+	{		
+		if ($con === null) {
+			$con = Propel::getConnection(self::DATABASE_NAME);
+		}
+		
+		$criteria = new Criteria(self::DATABASE_NAME);
+<?php if (count($table->getPrimaryKey()) === 1) { 
+	$pkey = $table->getPrimaryKey();
+	$col = array_shift($pkey); ?>
+		$criteria->add(self::<?php echo PeerBuilder::getColumnName($col) ?>, $pk);
+<?php } else { ?>
+
+		// primary key is composite; we therefore, expect
+		// the primary key passed to be an array of pkey
+		// values
+<?php
+		$i=0;
+	   foreach($table->getPrimaryKey() as $col) { ?>
+		$criteria->add(self::<?php echo PeerBuilder::getColumnName($col)?>, $pk[<?php echo $i ?>]);
+<?php		 $i++; 
+		}
+	} /* if count(table.PrimaryKeys) */ ?>
+						
+		$v = <?php echo $table->getPhpName() ?>Peer::doSelect($criteria, $con);
+        return count($v) > 0 ? $v[0] : null;
+	}
+
+	/**
+	 * Retrieve multiple objects by pkey.
+	 *
+	 * @param array $pks List of primary keys
+	 * @param Connection $con the connection to use
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function <?php echo $retrieveMethod ?>s($pks, $con = null)
+	{
+		if ($con === null) {
+			$con = Propel::getConnection(self::DATABASE_NAME);
+		}
+		
+		$objs = null;
+		if (empty($pks)) {
+			$objs = array();
+		} else {
+			$criteria = new Criteria();
+<?php if (count($table->getPrimaryKey()) == 1) { ?>
+			$criteria->add(self::<?php $k1 = $table->getPrimaryKey(); echo PeerBuilder::getColumnName($k1[0]); ?>, $pks, Criteria::IN);
+<?php } else { ?>
+  
+			for($k=0,$size=count($pks); $k < $size; $k++) {
+				$pk = $pks[$k];
+				<?php $i = 0;
+					foreach($table->getPrimaryKey() as $col) { ?>
+				
+				$c<?php echo $i ?> = $criteria->getNewCriterion(self::<?php echo PeerBuilder::getColumnName($col) ?>, $pk[<?php echo $i ?>], Criteria::EQUAL);
+				<?php
+				$j = $i - 1;
+				if ($i > 0) { ?>
+					
+				$c<?php echo $j ?>->addAnd($c<?php echo $i ?>);
+					<?php } /* if $i > 0 */
+						$i++;
+					} /* foreach */ ?>
+					
+				$criteria->addOr($c0);
+			}
+  <?php } /* if count prim keys == 1 */ ?>
+  
+			$objs = <?php echo $table->getPhpName() ?>Peer::doSelect($criteria, $con);
+		}
+		return $objs;
+	}
+
+<?php } else  {  // pkey count > 1
+
+$comma = false;
+?>
+	/**
+	 * Retrieve object using using pk values or NULL if not found.
+	 *<?php foreach ($table->getPrimaryKey() as $col) { 
+	$clo = strtolower($col->getName());
+	$cptype = $col->getPhpNative(); ?> 
+	 * @param <?php echo $cptype ?> $<?php echo $clo ?>
+<?php } ?> 
+	 * @param Connection $con
+	 * @return <?php echo $table->getPhpName() ?> 
+	 */
+	public static function <?php echo $retrieveMethod ?>(<?php foreach ($table->getPrimaryKey() as $col) {
+	$clo = strtolower($col->getName()); ?><?php if ($comma) { ?>,<?php } ?> $<?php echo $clo ?><?php $comma = true; ?>
+<?php } /* foreach */ ?>, $con = null) {
+		if ($con === null) {
+			$con = Propel::getConnection(self::DATABASE_NAME);
+		}
+		$criteria = new Criteria();
+<?php foreach ($table->getPrimaryKey() as $col) {
+	$clo = strtolower($col->getName());
+?> 
+		$criteria->add(self::<?php echo PeerBuilder::getColumnName($col) ?>, $<?php echo $clo ?>);
+<?php } ?>
+
+		$v = <?php echo $table->getPhpName() ?>Peer::doSelect($criteria, $con);
+        return count($v) > 0 ? $v[0] : null;
+	}
+    
+<?php } /* if pkey > 1 */ 
+
+}  /* if pkey > 0 */ ?> 
+
+<?php 
+
+if ($complexObjectModel) {
+
+ //
+ // setup joins
+ //
+ $className = $table->getPhpName();
+ $countFK = count($table->getForeignKeys());
+
+ if ($countFK >= 1) {
+	foreach ($table->getForeignKeys() as $fk) {
+		$tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+		if (!$tblFK->isForReferenceOnly()) {
+		// want to cover this other case, but the code is not there yet.
+			if ( $fk->getForeignTableName() != $table->getName() ) {
+
+				$partJoinName = "";
+				foreach ($fk->getLocalColumns() as $columnName ) {
+					$column = $table->getColumn($columnName);
+					if ($column->isMultipleFK() || $fk->getForeignTableName() == $table->getName()) {
+						$partJoinName = $partJoinName . $column->getPhpName();
+					}
+				}
+
+				$joinTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+				$joinClassName = $joinTable->getPhpName();
+				$interfaceName = $joinTable->getPhpName();
+				if ($joinTable->getInterface()) {
+				   $interfaceName = $joinTable->getInterface();
+				}
+
+				if ($partJoinName == "") {
+					$joinColumnId = $joinClassName;
+					$joinInterface = $interfaceName;
+					$collThisTable = $className . "s";
+					$collThisTableMs = $className;
+				} else {
+					$joinColumnId= $joinClassName . "RelatedBy" . $partJoinName;
+					$joinInterface= $interfaceName . "RelatedBy" . $partJoinName;
+					$collThisTable= $className . "sRelatedBy" . $partJoinName;
+					$collThisTableMs= $className . "RelatedBy" . $partJoinName;
+				}
+
+// ------------------------------------------------------------
+?>
+	/**
+	 * Selects a collection of <?php echo $className ?> objects pre-filled with their
+	 * <?php echo $joinClassName ?> objects.
+	 *
+	 * @return array Array of <?php echo $className ?> objects.
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function doSelectJoin<?php echo $joinColumnId ?>(Criteria $c, $con = null)
+	{
+
+		// Set the correct dbName if it has not been overridden
+		if ($c->getDbName() == Propel::getDefaultDB()) {
+			$c->setDbName(self::DATABASE_NAME);
+		}
+
+		<?php echo $table->getPhpName() ?>Peer::addSelectColumns($c);
+		$startcol = (self::$numColumns - self::$numLazyLoadColumns) + 1;
+		<?php echo $joinClassName ?>Peer::addSelectColumns($c);
+
+	<?php
+	 $lfMap = $fk->getLocalForeignMapping();
+	 foreach ($fk->getLocalColumns() as $columnName ) {
+		$column = $table->getColumn($columnName);
+		$columnFk = $joinTable->getColumn( $lfMap[$columnName]);
+	?>
+		$c->addJoin(<?php echo PeerBuilder::getColumnName($column, $table->getPhpName()) ?>, <?php echo PeerBuilder::getColumnName($columnFk,$joinClassName)?>);
+	 <?php } ?>
+
+		$rs = <?php echo $basePeerClassname ?>::doSelect($c, $con);
+		$results = array();
+
+		while($rs->next()) {
+<?php if ($table->getChildrenColumn()) { ?>
+			$omClass = <?php echo $table->getPhpName() ?>Peer::getOMClass($rs, 1);
+<?php } else { ?>
+			$omClass = <?php echo $table->getPhpName() ?>Peer::getOMClass();
+<?php } ?>
+			$cls = Propel::import($omClass);
+			$obj1 = new $cls();
+			$obj1->hydrate($rs);
+
+<?php if ($joinTable->getChildrenColumn()) { ?>
+			$omClass = <?php echo $joinClassName ?>Peer::getOMClass($rs, $startcol);
+<?php } else { ?>
+			$omClass = <?php echo $joinClassName ?>Peer::getOMClass();
+<?php } ?>
+			$cls = Propel::import($omClass);
+			$obj2 = new $cls();
+			$obj2->hydrate($rs, $startcol);
+
+			$newObject = true;
+			foreach($results as $temp_obj1) {
+				$temp_obj2 = $temp_obj1->get<?php echo $joinInterface ?>();
+				if ($temp_obj2->getPrimaryKey() === $obj2->getPrimaryKey()) {
+					$newObject = false;
+					$temp_obj2->add<?php echo $collThisTableMs ?>($obj1);
+					break;
+				}
+			}
+			if ($newObject) {
+				$obj2->init<?php echo $collThisTable ?>();
+				$obj2->add<?php echo $collThisTableMs ?>($obj1);
+			}
+			$results[] = $obj1;
+		}
+		return $results;
+	}
+<?php
+	} // if fk table name != this table name
+   } // if ! is reference only
+  } // foreach column
+ } // if count(fk) > 1
+ 
+// ===========================================================
+
+  if ($countFK >= 2) {
+  
+	$includeJoinAll = true;
+	foreach ($table->getForeignKeys() as $fk) {
+		$tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+		if ($tblFK->isForReferenceOnly()) {
+		   $includeJoinAll = false;
+		}
+	}
+
+	if ($includeJoinAll) {
+	
+		// ------------------------------------------------------------------------
+		// doSelectJoinAll()
+		// ------------------------------------------------------------------------
+
+		//1 ) create the master doSelectJoinAll() method
+		
+		$tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+		
+		$relatedByCol = "";
+		foreach ($fk->getLocalColumns() as $columnName) {
+			$column = $table->getColumn($columnName);
+			if ($column->isMultipleFK()) {
+				$relatedByCol .= $column->getPhpName();
+			}
+		}
+		
+		if ($relatedByCol == "") {
+			$collThisTable = "${className}s";
+			$collThisTableMs = $className;
+		} else {
+			$collThisTable = $className . "sRelatedBy" . $relatedByCol;
+			$collThisTableMs = $className . "RelatedBy" . $relatedByCol;
+		}
+?>
+
+	/**
+	 * Selects a collection of <?php echo $className ?> objects pre-filled with
+	 * all related objects.
+	 *
+	 * @return array Array of <?php echo $className ?> objects.
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function doSelectJoinAll(Criteria $c, $con = null)
+	{
+		// Set the correct dbName if it has not been overridden
+		if ($c->getDbName() == Propel::getDefaultDB()) {
+			$c->setDbName(self::DATABASE_NAME);
+		}
+
+		<?php echo $table->getPhpName() ?>Peer::addSelectColumns($c);
+		$startcol2 = (self::$numColumns - self::$numLazyLoadColumns) + 1;
+<?php
+		$index = 2;
+		foreach ($table->getForeignKeys() as $fk) {
+			// want to cover this case, but the code is not there yet.
+			if ( $fk->getForeignTableName() != $table->getName() ) {
+				$joinTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+				$joinClassName = $joinTable->getPhpName();
+				$new_index = $index + 1;
+?> 
+		<?php echo $joinClassName ?>Peer::addSelectColumns($c);
+		$startcol<?php echo $new_index ?> = $startcol<?php echo $index?> + <?php echo $joinClassName ?>Peer::$numColumns;
+		<?php
+			$index = $new_index;
+			
+			} // if fk->getForeignTableName != table->getName		
+		} // foreach [sub] foreign keys
+
+
+		foreach ($table->getForeignKeys() as $fk) {
+			// want to cover this case, but the code is not there yet.
+			if ( $fk->getForeignTableName() != $table->getName() ) {
+				$joinTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+				$joinClassName = $joinTable->getPhpName();
+				$lfMap = $fk->getLocalForeignMapping();
+				foreach ($fk->getLocalColumns() as $columnName ) {
+					$column = $table->getColumn($columnName);
+					$columnFk = $joinTable->getColumn( $lfMap[$columnName]);
+?>
+		$c->addJoin(<?php echo PeerBuilder::getColumnName($column, $table->getPhpName()) ?>, <?php echo PeerBuilder::getColumnName($columnFk,$joinClassName)?>);
+	 <?php } } }?>
+
+		$rs = <?php echo $basePeerClassname ?>::doSelect($c, $con);
+		$results = array();
+		
+		while($rs->next()) {
+<?php 
+		if ($table->getChildrenColumn()) { 
+?> 
+			$omClass = <?php echo $table->getPhpName() ?>Peer::getOMClass($rs, 1);
+<?php 
+		} else {
+?> 
+			$omClass = <?php echo $table->getPhpName() ?>Peer::getOMClass();
+<?php 
+		} 
+?>
+			
+			$cls = Propel::import($omClass);
+			$obj1 = new $cls();
+			$obj1->hydrate($rs);
+			
+	<?php
+	$index = 1;
+	foreach ($table->getForeignKeys() as $fk ) {
+	
+	  // want to cover this case, but the code is not there yet.
+	  if ( $fk->getForeignTableName() != $table->getName() ) {
+	  
+			$joinTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+			$joinClassName = $joinTable->getPhpName();
+			$interfaceName = $joinTable->getPhpName();
+			if($joinTable->getInterface()) {
+				$interfaceName = $joinTable->getInterface();
+			}
+			
+			$partJoinName = "";
+			foreach ($fk->getLocalColumns() as $columnName ) {
+				$column = $table->getColumn($columnName);
+				if ($column->isMultipleFK()) {
+					$partJoinName .= $column->getPhpName();
+				}
+			}
+			
+			if ($partJoinName == "") {
+				$joinString = $interfaceName;
+				$collThisTable = "${className}s";
+				$collThisTableMs = $className;
+			} else {
+				$joinString= $interfaceName."RelatedBy" . $partJoinName;
+				$collThisTable= $className . "sRelatedBy" . $partJoinName;
+				$collThisTableMs= $className . "RelatedBy" . $partJoinName;
+			}
+			
+			$index++;
+?> 
+			
+			// Add objects for joined <?php echo $joinClassName ?> rows
+<?php
+			if ($joinTable->getChildrenColumn()) {
+?> 
+			$omClass = <?php echo $joinClassName ?>Peer::getOMClass($rs, $startcol<?php echo $index ?>);
+<?php
+				} else {
+?> 
+			$omClass = <?php echo $joinClassName ?>Peer::getOMClass();
+<?php 
+				} /* $joinTable->getChildrenColumn() */
+?>
+	
+			$cls = Propel::import($omClass);
+			$obj<?php echo $index ?> = new $cls();
+			$obj<?php echo $index ?>->hydrate($rs, $startcol<?php echo $index ?>);
+			
+			$newObject = true;
+			for ($j=0, $resCount=count($results); $j < $resCount; $j++) {
+				$temp_obj1 = $results[$j];
+				$temp_obj<?php echo $index ?> = $temp_obj1->get<?php echo $joinString ?>();
+				if ($temp_obj<?php echo $index ?>->getPrimaryKey() === $obj<?php echo $index ?>->getPrimaryKey()) {
+					$newObject = false;
+					$temp_obj<?php echo $index ?>->add<?php echo $collThisTableMs ?>($obj1);
+					break;
+				}
+			}
+			
+			if ($newObject) {
+				$obj<?php echo $index ?>->init<?php echo $collThisTable ?>();
+				$obj<?php echo $index ?>->add<?php echo $collThisTableMs ?>($obj1);
+			}
+	<?php
+
+	  } // $fk->getForeignTableName() != $table->getName()
+	} //foreach foreign key
+?>
+			$results[] = $obj1;
+		}
+		return $results;
+	}
+<?php		
+		
+		// ------------------------------------------------------------------------
+		// doSelectJoinAllExcept*()
+		// ------------------------------------------------------------------------
+		
+		// 2) create a bunch of doSelectJoinAllExcept*() methods
+		// -- these were existing in original Torque, so we should keep them for compatibility
+		
+		$fkeys = $table->getForeignKeys();  // this sep assignment is necessary otherwise sub-loops over 
+											// getForeignKeys() will cause this to only execute one time.
+		foreach ($fkeys as $fk ) {
+			
+			$tblFK = $table->getDatabase()->getTable($fk->getForeignTableName());
+
+			$excludeTable = $table->getDatabase()->getTable($fk->getForeignTableName());
+			$excludeClassName = $excludeTable->getPhpName();
+
+			$relatedByCol = "";
+			foreach ($fk->getLocalColumns() as $columnName) {
+				$column = $table->getColumn($columnName);
+				if ($column->isMultipleFK()) {
+					$relatedByCol .= $column->getPhpName();
+				}
+			}
+
+			if ($relatedByCol == "") {
+				$excludeString = $excludeClassName;
+				$collThisTable = "${className}s";
+				$collThisTableMs = $className;
+			} else {
+				$excludeString = $excludeClassName . "RelatedBy" . $relatedByCol;
+				$collThisTable = $className . "sRelatedBy" . $relatedByCol;
+				$collThisTableMs = $className . "RelatedBy" . $relatedByCol;
+			}
+?>
+
+	/**
+	 * Selects a collection of <?php echo $className ?> objects pre-filled with
+	 * all related objects except <?php echo $excludeString ?>.
+	 *
+	 * @return array Array of <?php echo $className ?> objects.
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function doSelectJoinAllExcept<?php echo $excludeString ?>(Criteria $c, $con = null)
+	{
+		// Set the correct dbName if it has not been overridden
+		// $c->getDbName() will return the same object if not set to another value
+		// so == check is okay and faster
+		if ($c->getDbName() == Propel::getDefaultDB()) {
+			$c->setDbName(self::DATABASE_NAME);
+		}
+
+		<?php echo $table->getPhpName() ?>Peer::addSelectColumns($c);
+		$startcol2 = (self::$numColumns - self::$numLazyLoadColumns) + 1;
+	<?php
+		$index = 2;
+		foreach ($table->getForeignKeys() as $subfk) {
+			// want to cover this case, but the code is not there yet.
+		if ( !($subfk->getForeignTableName() == $table->getName())) {
+			$joinTable = $table->getDatabase()->getTable($subfk->getForeignTableName());
+			$joinClassName = $joinTable->getPhpName();
+
+			if ($joinClassName != $excludeClassName) {
+				$new_index = $index + 1;
+?> 
+		<?php echo $joinClassName ?>Peer::addSelectColumns($c);
+		$startcol<?php echo $new_index ?> = $startcol<?php echo $index?> + <?php echo $joinClassName ?>Peer::$numColumns;
+		<?php
+			$index = $new_index;
+			} 
+		}
+		
+		} // foreach [sub] foreign keys
+				
+		foreach ($table->getForeignKeys() as $subfk) {
+			// want to cover this case, but the code is not there yet.
+			if ( $subfk->getForeignTableName() != $table->getName() ) {
+				$joinTable = $table->getDatabase()->getTable($subfk->getForeignTableName());
+				$joinClassName = $joinTable->getPhpName();
+				if($joinClassName != $excludeClassName)
+				{
+					$lfMap = $subfk->getLocalForeignMapping();
+					foreach ($subfk->getLocalColumns() as $columnName ) {
+						$column = $table->getColumn($columnName);
+						$columnFk = $joinTable->getColumn( $lfMap[$columnName]);
+?>
+		$c->addJoin(<?php echo PeerBuilder::getColumnName($column, $table->getPhpName()) ?>, <?php echo PeerBuilder::getColumnName($columnFk,$joinClassName)?>);
+	 <?php } } } }?>
+
+
+		$rs = <?php echo $basePeerClassname ?>::doSelect($c, $con);
+		$results = array();
+		
+		while($rs->next()) {
+	<?php if ($table->getChildrenColumn()) { ?>
+			$omClass = <?php echo $table->getPhpName() ?>Peer::getOMClass($rs, 1);
+	<?php } else { ?>
+			$omClass = <?php echo $table->getPhpName() ?>Peer::getOMClass();
+	<?php } ?>
+			
+			$cls = Propel::import($omClass);
+			$obj1 = new $cls();
+			$obj1->hydrate($rs);
+			
+	<?php
+	$index = 1;
+	foreach ($table->getForeignKeys() as $subfk ) {
+	  // want to cover this case, but the code is not there yet.
+	  if ( $subfk->getForeignTableName() != $table->getName() ) {
+	  
+			$joinTable = $table->getDatabase()->getTable($subfk->getForeignTableName());
+			$joinClassName = $joinTable->getPhpName();
+			$interfaceName = $joinTable->getPhpName();
+			if($joinTable->getInterface()) {
+				$interfaceName = $joinTable->getInterface();
+			}
+
+			if ($joinClassName != $excludeClassName) {
+			
+				$partJoinName = "";
+				foreach ($subfk->getLocalColumns() as $columnName ) {
+					$column = $table->getColumn($columnName);
+					if ($column->isMultipleFK()) {
+						$partJoinName .= $column->getPhpName();
+					}
+				}
+
+				if ($partJoinName == "") {
+					$joinString = $interfaceName;
+					$collThisTable = "${className}s";
+					$collThisTableMs = $className;
+				} else {
+					$joinString= $interfaceName."RelatedBy" . $partJoinName;
+					$collThisTable= $className . "sRelatedBy" . $partJoinName;
+					$collThisTableMs= $className . "RelatedBy" . $partJoinName;
+				}
+
+				$index++;
+			
+				if ($joinTable->getChildrenColumn()) {
+?>
+			$omClass = <?php echo $joinClassName ?>Peer::getOMClass($rs, $startcol<?php echo $index ?>);
+<?php
+				} else {
+?>
+			$omClass = <?php echo $joinClassName ?>Peer::getOMClass();
+<?php 
+				} /* $joinTable->getChildrenColumn() */
+?>
+	
+			$cls = Propel::import($omClass);
+			$obj<?php echo $index ?>  = new $cls();
+			$obj<?php echo $index ?>->hydrate($rs, $startcol<?php echo $index ?>);
+			
+			$newObject = true;
+			for ($j=0, $resCount=count($results); $j < $resCount; $j++) {
+				$temp_obj1 = $results[$j];
+				$temp_obj<?php echo $index ?> = $temp_obj1->get<?php echo $joinString ?>();
+				if ($temp_obj<?php echo $index ?>->getPrimaryKey() === $obj<?php echo $index ?>->getPrimaryKey()) {
+					$newObject = false;
+					$temp_obj<?php echo $index ?>->add<?php echo $collThisTableMs ?>($obj1);
+					break;
+				}
+			}
+			
+			if ($newObject) {
+				$obj<?php echo $index ?>->init<?php echo $collThisTable ?>();
+				$obj<?php echo $index ?>->add<?php echo $collThisTableMs ?>($obj1);
+			}
+	<?php
+		} // if ($joinClassName != $excludeClassName) {
+	  } // $subfk->getForeignTableName() != $table->getName()
+	} // foreach  
+?>
+			$results[] = $obj1;
+		}
+		return $results;
+	}
+<?php
+		} // foreach fk
+
+		// end of doSelectJoinAllExcept*() block
+		
+	} // if includeJoinAll
+  } // if count(fk) > 2
+ } /* if complex object model */
+
+ // two extra #end ... 
+
+
+//------------------------------------------------------------
+
+if (!$table->isAlias()) {
+?>
+	/**
+	 * Returns the TableMap related to this peer.  This method is not
+	 * needed for general use but a specific application could have a need.
+	 * @return TableMap
+	 * @throws PropelException Any exceptions caught during processing will be
+	 *		 rethrown wrapped into a PropelException.
+	 */
+	public static function getTableMap()
+	{
+		return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME);
+	}
+	
+<?php } /* !table->isalias */ ?>
+}
+
+// static code to register the map builder for this Peer with the main Propel class
+if (Propel::isInit()) {
+	// the MapBuilder classes register themselves with Propel during initialization
+	// so we need to load them here.
+	try {		
+		<?php echo $basePrefix . $table->getPhpName() ?>Peer::getMapBuilder();
+	} catch (Exception $e) {
+		Propel::log("Could not initialize Peer: " . $e->getMessage(), Propel::LOG_ERR);
+	}
+} else {
+	// even if Propel is not yet initialized, the map builder class can be registered
+	// now and then it will be loaded when Propel initializes.
+	require_once '<?php echo ClassTools::getFilePath($pkmap, $table->getPhpName() . 'MapBuilder') ?>';
+	Propel::registerMapBuilder(<?php echo $table->getPhpName()?>MapBuilder::CLASS_NAME);
+}

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/columns.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/columns.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/columns.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,20 @@
+<?php 
+	foreach ($table->getColumns() as $col) {
+		$type = $col->getDomain()->getSqlType();
+		if ($type == "INT" || $type == "TEXT") {
+		    $size = "";
+		} else {
+			$size = $col->printSize();
+		}
+		
+		$default = $col->getDefaultSetting();        
+        $entry = $col->getName() . ' ' . $type . ' ' . $size . ' ' . $default . ' ' . $col->getNotNullString() . ' ' . $col->getAutoIncrementString();
+
+		// collapse spaces
+		$entry = preg_replace('/[\s]+/', ' ', $entry);
+		
+		// ' ,' -> ','
+		$entry = preg_replace('/[\s]*,[\s]*/', ',', $entry);
+?> 
+	<?php echo $entry ?>,
+<?php } ?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/drop.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/drop.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/drop.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,42 @@
+<?php foreach ($table->getForeignKeys() as $fk) { ?>
+IF EXISTS (SELECT 1 FROM sysobjects WHERE type ='RI' AND name='<?php echo $fk->getName() ?>')
+    ALTER TABLE <?php echo $table->getName() ?> DROP CONSTRAINT <?php echo $fk->getName()?>;
+<?php } ?>
+<?php 
+	// this file is being included within another foreach() loop.
+	// we want to create a global var that is aware of what instance
+	// this is within that loop;
+	global $__mssql_drop_count;
+
+	if (!isset($__mssql_drop_count)) {
+	    $__mssql_drop_count = 0;
+	}
+	
+	$__mssql_drop_count++;	
+?>
+IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name = '<?php echo $table->getName() ?>')
+BEGIN
+     DECLARE @reftable_<?php echo $__mssql_drop_count ?> nvarchar(60), @constraintname_<?php echo $__mssql_drop_count ?> nvarchar(60)
+     DECLARE refcursor CURSOR FOR
+     select reftables.name tablename, cons.name constraintname
+      from sysobjects tables,
+           sysobjects reftables,
+           sysobjects cons,
+           sysreferences ref
+       where tables.id = ref.rkeyid
+         and cons.id = ref.constid
+         and reftables.id = ref.fkeyid
+         and tables.name = '<?php echo $table->getName() ?>'
+     OPEN refcursor
+     FETCH NEXT from refcursor into @reftable_<?php echo $__mssql_drop_count ?>, @constraintname_<?php echo $__mssql_drop_count ?>
+     while @@FETCH_STATUS = 0
+     BEGIN
+       exec ('alter table '+ en reftable_<?php echo $__mssql_drop_count ?>+' drop constraint '+ en constraintname_<?php echo $__mssql_drop_count ?>)
+       FETCH NEXT from refcursor into @reftable_<?php echo $__mssql_drop_count ?>, @constraintname_<?php echo $__mssql_drop_count ?>
+     END
+     CLOSE refcursor
+     DEALLOCATE refcursor
+     DROP TABLE <?php echo $table->getName() ?>
+	 
+END
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/foreignkey.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/foreignkey.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/foreignkey.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,17 @@
+<?php foreach ($tablefk->getForeignKeys() as $fk) { ?>
+
+BEGIN
+ALTER TABLE <?php echo $tablefk->getName() ?> 
+    ADD CONSTRAINT <?php echo $fk->getName() ?> FOREIGN KEY (<?php echo $fk->getLocalColumnNames() ?>)
+    REFERENCES <?php echo $fk->getForeignTableName() ?> (<?php echo $fk->getForeignColumnNames() ?>)
+<?php if ($fk->hasOnUpdate()) { ?>
+    ON UPDATE <?php echo $fk->getOnUpdate() ?> 
+<?php } ?>
+<?php if ($fk->hasOnDelete()) { ?>
+    ON DELETE <?php echo $fk->getOnDelete() ?> 
+<?php } ?>
+END    
+;
+
+<?php } ?>
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/index.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/index.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/index.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,4 @@
+<?php foreach ($table->getIndices() as $index) { ?> 
+CREATE <?php if($index->isUnique()) { ?>UNIQUE<?php } ?> INDEX <?php echo $index->getName() ?> ON <?php echo $table->getName() ?> (<?php echo $index->getColumnList()?>);
+<?php } ?> 
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/primarykey.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/primarykey.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/primarykey.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,3 @@
+<?php if ($table->hasPrimaryKey()) { ?>
+    CONSTRAINT <?php echo $table->getName() ?>_PK PRIMARY KEY(<?php echo $table->printPrimaryKey() ?>),
+<?php } ?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/table.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/table.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/table.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,38 @@
+
+/* ---------------------------------------------------------------------- */
+/* <?php echo $table->getName()  ?>                                                    */
+/* ---------------------------------------------------------------------- */
+
+<?php echo $generator->parse("$basepath/drop.tpl"); ?>
+CREATE TABLE <?php echo $table->getName()?>
+(
+<?php
+
+	$cols = $generator->parse("$basepath/columns.tpl");
+	$pk = $generator->parse("$basepath/primarykey.tpl");
+	
+	$unique = $generator->parse("$basepath/unique.tpl");
+	
+	if (empty($pk) && empty($unique)) {
+		echo preg_replace('/[ ,]+[\s]*$/', '', $cols);
+	} else {
+		echo $cols;
+	}
+	
+	if (!empty($pk) && empty($unique)) {
+		echo preg_replace('/[ ,]+[\s]*$/', '', $pk);
+	} else {
+		echo $pk;
+	}
+	
+	if (!empty($unique)) {
+		echo preg_replace('/[ ,]+[\s]*$/', '', $unique);
+	}
+?>
+);	
+<?php
+	$index = $generator->parse("$basepath/index.tpl");	
+	if (!empty($index)) {
+	    echo $index;
+	}
+?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/tablefk.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/tablefk.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/tablefk.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,11 @@
+
+/* ---------------------------------------------------------------------- */
+/* <?php echo $tablefk->getName() ?>                                                      */
+/* ---------------------------------------------------------------------- */
+
+<?php
+	$fk = $generator->parse("$basepath/foreignkey.tpl");
+	if (!empty($fk)) {
+		echo $fk;
+	}
+?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/unique.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/unique.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mssql/unique.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,3 @@
+<?php foreach ($table->getUnices() as $unique) { ?>
+    UNIQUE (<?php echo $unique->getColumnList() ?>),
+<?php } ?>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/columns.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/columns.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/columns.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,28 @@
+<?php
+		$firstIteration = true;
+    foreach ($table->getColumns() as $col) {
+        if(!$firstIteration): ?>, 
+<?php endif; $firstIteration = false;
+        //$entry = $col->getSqlString();
+        //using the following code instead of the above line
+        //for escaping column names:
+
+        $entry = "";
+        $entry .= "`" . $col->getName() . "` ";
+        $entry .= $col->getDomain()->getSqlType();
+        if ($col->getPlatform()->hasSize($col->getDomain()->getSqlType())) {
+            $entry .= $col->getDomain()->printSize();
+        }
+        $entry .= " ";
+        $entry .= $col->getDefaultSetting() . " ";
+        $entry .= $col->getNotNullString() . " ";
+        $entry .= $col->getAutoIncrementString();
+
+        // collapse spaces
+        $entry = preg_replace('/[\s]+/', ' ', $entry);
+
+        // ' ,' -> ','
+        $entry = preg_replace('/[\s]*,[\s]*/', ',', $entry);
+?>
+    <?php echo $entry ?><?php if ($col->getDescription()) { ?> COMMENT '<?php echo $platform->escapeText($col->getDescription()) ?>'<?php } ?>
+<?php } 
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/database-end.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/database-end.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/database-end.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,5 @@
+# This restores the fkey checks, after having unset them
+# in database-start.tpl
+
+SET FOREIGN_KEY_CHECKS = 1;
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/database-start.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/database-start.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/database-start.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,4 @@
+# This is a fix for InnoDB in MySQL >= 4.1.x
+# It "suspends judgement" for fkey relationships until are tables are set.
+
+SET FOREIGN_KEY_CHECKS = 0;

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/drop.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/drop.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/drop.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+DROP TABLE IF EXISTS <?php echo "`" . $table->getName() . "`" ?>;

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/foreignkey.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/foreignkey.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/foreignkey.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,86 @@
+<?php 
+
+	$_indices = array();
+	$_previousColumns = array();
+	// we're building an array of indices here which is smart about multi-column indices.
+	// for example, if we have to indices foo(ColA) and bar(ColB, ColC), we have actually three indices already defined:
+	// ColA, ColB+ColC, and ColB (but not ColC!). This is because of the way SQL multi-column indices work.
+	// we will later match found, defined foreign key and referenced column definitions against this array to know whether we should create a new index for mysql or not
+	foreach($table->getPrimaryKey() as $_primaryKeyColumn)
+	{
+		// do the above for primary keys
+		$_previousColumns[] = "`" . $_primaryKeyColumn->getName() . "`";
+		$_indices[] = implode(',', $_previousColumns);
+	}
+	$_tableIndices = array_merge($table->getIndices(), $table->getUnices());
+	foreach($_tableIndices as $_index)
+	{
+		// same procedure, this time for unices and indices
+		$_previousColumns = array();
+		$_indexColumns = $_index->getColumns();
+		foreach($_indexColumns as $_indexColumn)
+		{
+			$_previousColumns[] = "`" . $_indexColumn . "`";
+			$_indices[] = implode(',', $_previousColumns);
+		}
+	}
+
+	$_tables = $table->getDatabase()->getTables();
+	$counter = 0;
+	// we're determining which tables have foreign keys that point to this table, since MySQL needs an index on any column that is referenced by another table (yep, MySQL _is_ a PITA)
+	foreach($_tables as $_table)
+	{
+		foreach($_table->getForeignKeys() as $_foreignKey)
+		{
+			if($_foreignKey->getForeignTableName() == $table->getName())
+			{
+				$_foreignColumns = array();
+				foreach($_foreignKey->getForeignColumns() as $_foreignColumn)
+				{
+					$_foreignColumns[] = "`" . $_foreignColumn . "`";
+				}
+				if(!in_array(implode(',', $_foreignColumns), $_indices))
+				{
+					// no matching index defined in the schema, so we have to create one
+					$counter++;
+					if($counter > 1): ?>,<?php endif; 
+					?> 
+    INDEX `I_referenced_<?php echo $_foreignKey->getName(); ?>_<?php echo $counter; ?>` (<?php echo implode(',',$_foreignColumns); ?>)<?php
+				}
+			}
+		}
+	}
+
+			$hasReferencedColumns = $counter > 0;
+      $counter = 0;
+      foreach ($table->getForeignKeys() as $fk) {
+        if($counter > 0 || $hasReferencedColumns): ?>,<?php endif;
+        $counter++;
+        $fnames = array();
+        foreach ($fk->getForeignColumns() as $column) {
+            $fnames[] = "`" . $column . "`";
+        }
+
+        $lnames = array();
+        foreach ($fk->getLocalColumns() as $column) {
+            $lnames[] = "`" . $column . "`";
+        }
+
+        $constraintName = "`" . $fk->getName() . "`";
+				$indexName = "`" . substr_replace($fk->getName(), 'FI_',  strrpos($fk->getName(), 'FK_'), 3) . "`";
+				if(!in_array(implode(',', $lnames), $_indices))
+				{
+					// no matching index defined in the schema, so we have to create one. MySQL needs indices on any columns that serve as foreign keys. these are not auto-created prior to 4.1.2
+?> 
+    INDEX <?php echo $indexName; ?> (<?php echo implode(',', $lnames); ?>),<?php
+				}
+?> 
+    CONSTRAINT <?php echo $constraintName ?> 
+      FOREIGN KEY (<?php echo implode(',', $lnames); ?>)
+      REFERENCES <?php echo "`" . $fk->getForeignTableName() . "`" ?> (<?php echo implode(',', $fnames); ?>)
+<?php if ($fk->hasOnUpdate()) { ?>
+      ON UPDATE <?php echo $fk->getOnUpdate(); ?> 
+<?php } if ($fk->hasOnDelete()) { ?>
+      ON DELETE <?php echo $fk->getOnDelete();
+	}
+}
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/index.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/index.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/index.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,10 @@
+<?php $firstIteration = true; foreach ($table->getIndices() as $index ) {
+        $vendor = $index->getVendorSpecificInfo();
+        if(!$firstIteration): ?>,<?php endif; $firstIteration = false; ?> 
+    <?php echo ($vendor && $vendor['Index_type'] == 'FULLTEXT') ? 'FULLTEXT  ' : '' ?>KEY <?php echo "`" . $index->getName() . "`" ?> (<?php
+        $values = array();
+        foreach ($index->getColumns() as $column) {
+            $values[] = "`" . $column . "`";
+        }
+        echo implode(',', $values);
+    ?>)<?php } 
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/primarykey.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/primarykey.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/primarykey.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,7 @@
+<?php if ($table->hasPrimaryKey()) {
+            $values = array();
+            foreach ($table->getPrimaryKey() as $column) {
+                $values[] = "`" . $column->getName() . "`";
+            }
+?> 
+    PRIMARY KEY(<?php echo implode(',', $values) ?>)<?php } 
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/table.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/table.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/table.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,45 @@
+# -----------------------------------------------------------------------
+# <?php echo $table->getName() ?> 
+# -----------------------------------------------------------------------
+<?php echo $generator->parse("$basepath/drop.tpl") ?>
+
+CREATE TABLE <?php echo "`" . $table->getName() . "`" ?>
+(
+<?php
+    $cols = $generator->parse("$basepath/columns.tpl");
+    $pk = $generator->parse("$basepath/primarykey.tpl");
+    $fk = $generator->parse("$basepath/foreignkey.tpl");
+    $unique = $generator->parse("$basepath/unique.tpl");
+    $index = $generator->parse("$basepath/index.tpl");
+
+		$output = array();
+		if(!empty($cols)) {
+		  $output[] = $cols;
+		}
+		if(!empty($pk)) {
+		  $output[] = $pk;
+		}
+		if(!empty($unique)) {
+		  $output[] = $unique;
+		}
+		if(!empty($index)) {
+		  $output[] = $index;
+		}
+		if(!empty($fk)) {
+		  $output[] = $fk;
+		}
+
+		echo implode(", ", $output);
+
+?>
+)<?php if (!isset($mysqlTableType)) {
+            $vendorSpecific = $table->getVendorSpecificInfo();
+            if(isset($vendorSpecific['Type']))
+                $mysqlTableType = $vendorSpecific['Type'];
+            else
+                $mysqlTableType = 'MyISAM';
+       }
+?>
+
+Type=<?php echo $mysqlTableType ?>
+<?php if($table->getDescription()) { ?> COMMENT='<?php echo $platform->escapeText($table->getDescription()) ?>'<?php } ?>;

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/tablefk.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/tablefk.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/tablefk.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+  

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/unique.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/unique.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/mysql/unique.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,12 @@
+<?php 
+$firstIteration = true;
+foreach ($table->getUnices() as $index ) { 
+    if(!$firstIteration): ?>, <?php endif; $firstIteration = false;
+?> 
+    UNIQUE KEY <?php echo "`" . $index->getName() . "`" ?> (<?php
+        $values = array();
+        foreach ($index->getColumns() as $column) {
+            $values[] = "`" . $column . "`";
+        }
+        echo implode(',', $values);
+    ?>)<?php } 
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/columns.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/columns.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/columns.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,19 @@
+<?php
+        foreach ($table->getColumns() as $col) {
+                /*
+                $type = $col->getSqlType();
+                $size = $col->printSize();
+                $default = $col->getDefaultSetting();
+
+                $entry = $col->getName() . " $type $size $default ".$col->getNotNullString();
+                */
+                $entry = $col->getSqlString();
+                
+                // collapse spaces
+                $entry = preg_replace('/[\s]+/', ' ', $entry);
+
+
+                // ' ,' -> ','
+                $entry = preg_replace('/[\s]*,[\s]*/', ',', $entry);
+?> 
+	<?php echo $entry ?>,<?php	} ?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/drop.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/drop.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/drop.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,4 @@
+DROP TABLE <?php echo $table->getName() ?> CASCADE CONSTRAINTS;
+<?php if ($table->getIdMethod() == "native") { ?>
+DROP SEQUENCE <?php echo $table->getSequenceName() ?>;
+<?php } ?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/foreignkey.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/foreignkey.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/foreignkey.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,16 @@
+<?php foreach ($tablefk->getForeignKeys() as $fk) { ?>
+ALTER TABLE <?php echo $tablefk->getName()?>
+    ADD CONSTRAINT <?php echo $fk->getName() ?> FOREIGN KEY (<?php echo $fk->getLocalColumnNames()?>)
+    REFERENCES <?php echo $fk->getForeignTableName()?> (<?php echo $fk->getForeignColumnNames()?>)<?php
+ if ($fk->hasOnDelete()) {?>
+    ON DELETE <?php echo $fk->getOnDelete();
+}?>;
+
+<?php } ?>
+<?php
+  /*
+         -- TODO
+        ON UPDATE $fk.OnUpdate
+  */
+?>
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/index.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/index.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/index.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,3 @@
+<?php foreach ($table->getIndices() as $index) { ?>
+CREATE<?php if ($index->isUnique()) { ?> UNIQUE<?php } ?> INDEX <?php echo $index->getName(); ?> ON <?php echo $table->getName(); ?> (<?php echo $index->getColumnList(); ?>);
+<?php } ?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/primarykey.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/primarykey.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/primarykey.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,19 @@
+<?php
+	$tableName = $table->getName();
+	$length = strlen($tableName);
+	if ($length > 27) {
+		$length = 27;
+	}
+?>
+<?php if ( is_array($table->getPrimaryKey()) && count($table->getPrimaryKey()) ) { ?>
+ALTER TABLE <?php echo $table->getName() ?>
+
+    ADD CONSTRAINT <?php echo substr($tableName,0,$length)?>_PK
+PRIMARY KEY (<?php
+	$delim = "";
+	foreach ($table->getPrimaryKey() as $col) {
+		echo $delim . $col->getName();
+		$delim = ",";
+	}
+?>);
+<?php } ?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/sequence.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/sequence.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/sequence.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,3 @@
+<?php if ($table->getIdMethod() == "native") { ?>
+CREATE SEQUENCE <?php echo $table->getSequenceName()?> INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE NOCACHE ORDER;
+<?php } ?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/table.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/table.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/table.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,26 @@
+/* -----------------------------------------------------------------------
+   <?php echo $table->getName() ?> 
+   ----------------------------------------------------------------------- */
+<?php echo $generator->parse("$basepath/drop.tpl") ?>
+CREATE TABLE <?php echo $table->getName() ?> 
+(<?php
+
+	$cols    = $generator->parse("$basepath/columns.tpl");
+	$unique  = $generator->parse("$basepath/unique.tpl");
+
+        if (empty($unique)) {
+                echo preg_replace('/[ ,]+[\s]*$/', '', $cols);
+        } else {
+                echo $cols;
+        }
+
+        if (!empty($unique)) {
+                echo "\n" . preg_replace('/[ ,]+[\s]*$/', '', $unique);
+        }
+
+?> 
+);
+<?php echo $generator->parse("$basepath/primarykey.tpl")?>
+<?php echo $generator->parse("$basepath/index.tpl")?>
+<?php echo $generator->parse("$basepath/sequence.tpl")?>
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/tablefk.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/tablefk.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/tablefk.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,5 @@
+<?php
+	$entry = $generator->parse("$basepath/foreignkey.tpl");
+	echo $entry;
+?>
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/unique.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/unique.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/oracle/unique.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,3 @@
+<?php foreach ($table->getUnices() as $unique) { ?>
+    CONSTRAINT <?php echo $unique->getName(); ?> UNIQUE (<?php echo $unique->getColumnList(); ?>),
+<?php } ?>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/columns.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/columns.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/columns.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,13 @@
+<?php 
+
+	foreach ($table->getColumns() as $col) {
+		$entry = $col->getSqlString();
+
+		// collapse spaces
+		$entry = preg_replace('/[\s]+/', ' ', $entry);
+		
+		// ' ,' -> ','
+		$entry = preg_replace('/[\s]*,[\s]*/', ',', $entry);
+?> 
+	<?php echo $entry ?>,
+<?php } ?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/drop.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/drop.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/drop.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,4 @@
+DROP TABLE <?php echo $table->getName() ?> CASCADE;
+<?php if ($table->getIdMethod() == "native") { ?> 
+DROP SEQUENCE <?php echo $table->getSequenceName() ?>;
+<?php } ?> 

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/foreignkey.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/foreignkey.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/foreignkey.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,20 @@
+<?php
+
+//
+// The following will only work for non-circular references
+// if you have a dependancy chain, you will need to use
+// ADD CONSTRAINT syntax (with INITIALLY DEFERRED)
+// which is sticky and version dependant
+//
+foreach ($tablefk->getForeignKeys() as $fk) { ?> 
+ALTER TABLE <?php echo $tablefk->getName() ?> 
+    ADD CONSTRAINT <?php echo $fk->getName() ?> FOREIGN KEY (<?php echo $fk->getLocalColumnNames() ?>)
+    REFERENCES <?php echo $fk->getForeignTableName() ?> (<?php echo $fk->getForeignColumnNames() ?>)
+<?php if ($fk->hasOnUpdate()) { ?> 
+    ON UPDATE <?php echo $fk->getOnUpdate() ?> 
+<?php } ?>
+<?php if ($fk->hasOnDelete()) { ?> 
+    ON DELETE <?php echo $fk->getOnDelete() ?> 
+<?php } ?> 
+;
+<?php } ?> 

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/index.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/index.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/index.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,3 @@
+<?php foreach ($table->getIndices() as $index) { ?> 
+CREATE <?php if($index->getIsUnique()) { ?>UNIQUE<?php } ?> INDEX <?php echo $index->getName() ?> ON <?php echo $table->getName() ?> (<?php echo $index->getColumnList()?>);
+<?php } ?> 
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/primarykey.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/primarykey.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/primarykey.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,3 @@
+<?php if ($table->hasPrimaryKey()) { ?> 
+    PRIMARY KEY (<?php echo $table->printPrimaryKey() ?>), 
+<?php } ?> 

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/sequence.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/sequence.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/sequence.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,3 @@
+<?php if ($table->getIdMethod() == "native") { ?> 
+CREATE SEQUENCE <?php echo $table->getSequenceName() ?>;
+<?php } ?> 

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/table.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/table.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/table.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,55 @@
+
+-----------------------------------------------------------------------------
+-- <?php echo $table->getName() ?>
+-----------------------------------------------------------------------------
+<?php
+echo $generator->parse("$basepath/drop.tpl");
+$sequence = $generator->parse("$basepath/sequence.tpl");
+if (!empty($sequence)) {
+    echo $sequence;
+}
+?>
+
+CREATE TABLE <?php echo $table->getName() ?> 
+(
+	<?php
+	$cols = $generator->parse("$basepath/columns.tpl");
+	$pk = trim($generator->parse("$basepath/primarykey.tpl"));
+	$unique = $generator->parse("$basepath/unique.tpl");
+	$index = trim($generator->parse("$basepath/index.tpl"));	
+	
+	if ( empty($pk) && empty($unique)) {
+	    echo preg_replace('/[ ,]+[\s]*$/', '', $cols);
+	} else {
+		echo $cols;
+	}
+	
+	if (empty($unique) && !empty($pk)) {
+	    echo preg_replace('/[ ,]+[\s]*$/', '', $pk);
+	} else {
+		echo $pk;
+	}
+	
+	if (!empty($unique)) {
+	    echo preg_replace('/[ ,]+[\s]*$/', '', $unique);
+	}	
+?> 
+);
+<?php 
+	if(!empty($index)) { 
+		echo preg_replace('/[ ,]+[\s]*$/', '', $index); 
+	} 
+?>
+
+COMMENT ON TABLE <?php echo $table->getName() ?> IS '<?php echo $platform->escapeText($table->getDescription()) ?>';
+
+<?php
+  foreach ($table->getColumns() as $col) {
+    if( $col->getDescription() != '' ) {
+?>
+COMMENT ON COLUMN <?php echo $table->getName() ?>.<?php echo $col->getName() ?> IS '<?php echo $platform->escapeText($col->getDescription()) ?>';
+<?php
+    }
+  }
+?>
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/tablefk.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/tablefk.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/tablefk.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,14 @@
+
+----------------------------------------------------------------------
+-- <?php echo $tablefk->getName() ?> 
+----------------------------------------------------------------------
+
+<?php
+// for pgsql table = tablefk, because
+// foreignkey.tpl can be loaded by table.tpl also
+//$generator->put("table", $tablefk); 
+$fk = $generator->parse("$basepath/foreignkey.tpl");
+if ($fk != "") {
+    echo $fk;
+}
+?>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/unique.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/unique.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/pgsql/unique.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,3 @@
+<?php foreach ($table->getUnices() as $unique ) { ?> 
+    CONSTRAINT <?php echo $unique->getName() ?> UNIQUE (<?php echo $unique->getColumnList() ?>),
+<?php } ?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/columns.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/columns.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/columns.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,13 @@
+<?php 
+
+	foreach ($table->getColumns() as $col) {
+		$entry = $col->getSqlString();
+		
+		// collapse spaces
+		$entry = preg_replace('/[\s]+/', ' ', $entry);
+		
+		// ' ,' -> ','
+		$entry = preg_replace('/[\s]*,[\s]*/', ',', $entry);
+?> 
+	<?php echo $entry ?>,
+<?php } ?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/drop.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/drop.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/drop.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+drop table <?php echo $table->getName() ?>;

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/foreignkey.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/foreignkey.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/foreignkey.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,4 @@
+<?php foreach ($table->getForeignKeys() as $fk) { ?>
+	-- SQLite does not support foreign keys; this is just for reference
+    -- FOREIGN KEY (<?php echo $fk->getLocalColumnNames()?>) REFERENCES <?php echo $fk->getForeignTableName() ?> (<?php echo $fk->getForeignColumnNames() ?>),
+<?php } ?>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/index.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/index.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/index.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,3 @@
+<?php foreach ($table->getIndices() as $index ) { ?> 
+    CREATE INDEX <?php echo $index->getName()?> ON <?php echo $table->getName() ?> (<?php echo $index->getColumnList() ?>);
+<?php } ?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/table.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/table.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/table.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,33 @@
+-- -----------------------------------------------------------------------
+-- <?php echo $table->getName() ?>
+-- -----------------------------------------------------------------------
+<?php echo $generator->parse("$basepath/drop.tpl") ?>
+
+CREATE TABLE <?php echo $table->getName() ?>
+(
+<?php 
+		
+	$cols = $generator->parse("$basepath/columns.tpl");
+	$fk = $generator->parse("$basepath/foreignkey.tpl");
+	$unique = $generator->parse("$basepath/unique.tpl");
+	$index = $generator->parse("$basepath/index.tpl");	
+	
+	if (empty($unique)) {		
+		echo preg_replace('/[,]+\s*$/', '', $cols);
+	} else {
+		echo $cols;
+        echo preg_replace('/[,]+\s*$/', '', $unique);
+	}		
+	
+?> 
+);
+
+<?php
+	if (!empty($index)) {
+		echo $index;
+	}
+	
+	if (!empty($fk)) {
+		echo $fk;
+	}
+?>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/tablefk.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/tablefk.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/tablefk.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+  

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/unique.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/unique.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/base/sqlite/unique.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,3 @@
+<?php foreach ($table->getUnices() as $unique) { ?>
+    UNIQUE (<?php echo $unique->getColumnList() ?>),
+<?php } ?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/Control.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/Control.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/Control.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,13 @@
+<?php    
+    // build db names array    
+    $databaseNames = array();
+    foreach($dataModels as $dm) {
+        foreach($dm->getDatabases() as $db) {
+            $databaseNames[] = $db->getName();
+        }
+    }
+    $databaseNames = array_unique($databaseNames);
+    
+    $generator->put("databaseNames", $databaseNames);
+	$generator->display("sql/db-init/$targetDatabase/createdb.tpl");
+?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mssql/unix.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mssql/unix.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mssql/unix.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+#foreach ($databaseModel in $appData.Databases)
+dropdb $databaseModel.Name
+createdb $databaseModel.Name
+#end

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mssql/windows.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mssql/windows.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mssql/windows.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1 @@
+ECHO Not implemented

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mysql/createdb.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mysql/createdb.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/mysql/createdb.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,4 @@
+<?php foreach( $databaseNames as $databaseName) { ?>
+drop database if exists <?php echo $databaseName ?>;
+create database <?php echo $databaseName ?>;
+<?php } /* foreach */ ?>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/oracle/createdb.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/oracle/createdb.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/oracle/createdb.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,4 @@
+-- foreach ($databaseName in $databaseNames)
+--  drop database $databaseName;
+--  create database $databaseName;
+-- end

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/pgsql/createdb.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/pgsql/createdb.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/db-init/pgsql/createdb.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,4 @@
+<?php foreach( $databaseNames as $databaseName) { ?>
+drop database <?php echo $databaseName ?>;
+create database <?php echo $databaseName ?>;
+<?php } /* foreach */ ?>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mssql/row.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mssql/row.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mssql/row.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,14 @@
+INSERT INTO <?php echo $row->getTable()->getName() ?> (<?php
+$comma="";
+foreach($row->getColumnValues() as $col) { 
+    print $comma;
+    print $col->getColumn()->getName();
+    $comma = ',';
+}?>) VALUES (<?php 
+    $comma="";
+    foreach($row->getColumnValues() as $col) { 
+        print $comma;
+        $generator->put("column", $col);
+        $generator->display("sql/load/mssql/val.tpl");
+        $comma=',';
+    }?>);

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mssql/val.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mssql/val.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mssql/val.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,9 @@
+<?php
+
+if (in_array($column->getColumn()->getPropelType(), array('VARCHAR', 'LONGVARCHAR', 'DATE','CHAR'))) { 
+        echo "'" . str_replace("'", "''", $column->getValue()). "'"; 
+    } else { 
+        echo $column->getValue();
+    } 
+
+?>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mysql/row.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mysql/row.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mysql/row.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,14 @@
+INSERT INTO <?php echo "`" . $row->getTable()->getName() . "`" ?> (<?php
+$comma="";
+foreach($row->getColumnValues() as $col) {
+    print $comma;
+    print "`" . $col->getColumn()->getName() . "`";
+    $comma = ',';
+}?>) VALUES (<?php
+$comma="";
+foreach($row->getColumnValues() as $col) {
+    print $comma;
+    $generator->put("column", $col);
+    $generator->display("sql/load/mysql/val.tpl");
+    $comma=',';
+}?>);

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mysql/val.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mysql/val.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/mysql/val.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,7 @@
+<?php
+if (in_array($column->getColumn()->getPropelType(), array('VARCHAR', 'LONGVARCHAR', 'DATE', 'DATETIME','CHAR'))) { 
+    print "'" . mysql_escape_string($column->getValue()) . "'";
+} else {
+    print $column->getValue();
+}
+?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/oracle/row.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/oracle/row.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/oracle/row.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,14 @@
+INSERT INTO <?php echo $row->getTable()->getName() ?> (<?php
+$comma="";
+foreach($row->getColumnValues() as $col) { 
+    print $comma;
+    print $col->getColumn()->getName();
+    $comma = ',';
+}?>) VALUES (<?php 
+    $comma="";
+    foreach($row->getColumnValues() as $col) { 
+        print $comma;
+        $generator->put("column", $col);
+        $generator->display("sql/load/oracle/val.tpl");
+        $comma=',';
+    }?>);

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/oracle/val.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/oracle/val.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/oracle/val.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,9 @@
+<?php
+
+if (in_array($column->getColumn()->getPropelType(), array('VARCHAR', 'LONGVARCHAR', 'DATE','CHAR'))) { 
+        echo "'" . $column->getValue() . "'"; 
+    } else { 
+        echo $column->getValue();
+    } 
+
+?>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/pgsql/row.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/pgsql/row.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/pgsql/row.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,14 @@
+INSERT INTO <?php echo $row->getTable()->getName() ?> (<?php
+$comma="";
+foreach($row->getColumnValues() as $col) { 
+    print $comma;
+    print $col->getColumn()->getName();
+    $comma = ',';
+}?>) VALUES (<?php 
+    $comma="";
+    foreach($row->getColumnValues() as $col) { 
+        print $comma;
+        $generator->put("column", $col);
+        $generator->display("sql/load/pgsql/val.tpl");
+        $comma=',';
+    }?>);

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/pgsql/val.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/pgsql/val.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/pgsql/val.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,11 @@
+<?php
+
+if (in_array($column->getColumn()->getPropelType(), array('VARCHAR', 'LONGVARCHAR', 'DATE','CHAR', 'TIMESTAMP'))) { 
+        echo "'" . pg_escape_string($column->getValue()) . "'"; 
+    } elseif ($column->getColumn()->getPropelType() == 'BOOLEAN') { 
+        echo ($column->getValue() == 1 || $column->getValue() == 't' ? "'t'" : "'f'");
+    } else {
+        echo $column->getValue();
+    } 
+
+?>

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/sqlite/row.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/sqlite/row.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/sqlite/row.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,14 @@
+INSERT INTO <?php echo $row->getTable()->getName() ?> (<?php
+$comma="";
+foreach($row->getColumnValues() as $col) { 
+    print $comma;
+    print $col->getColumn()->getName();
+    $comma = ',';
+}?>) VALUES (<?php 
+    $comma="";
+    foreach($row->getColumnValues() as $col) { 
+        print $comma;
+        $generator->put("column", $col);
+        $generator->display("sql/load/sqlite/val.tpl");
+        $comma=',';
+    }?>);

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/sqlite/val.tpl
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/sqlite/val.tpl	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/vendor/propel-generator/templates/sql/load/sqlite/val.tpl	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,4 @@
+<?php
+    // SQLite is typeless, so we'll treat everything like string
+    print "'" . sqlite_escape_string($column->getValue()) . "'";
+?>
\ No newline at end of file

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaper.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaper.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaper.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,148 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Abstract class that provides an interface for escaping of output.
+ *
+ * @package    symfony
+ * @subpackage view
+ * @author     Mike Squire <mike en somosis.co.uk>
+ * @version    SVN: $Id: sfOutputEscaper.class.php 3232 2007-01-11 20:51:54Z fabien $
+ */
+abstract class sfOutputEscaper
+{
+  /**
+   * The value that is to be escaped.
+   *
+   * @var mixed
+   */
+  protected $value;
+
+  /**
+   * The escaping method that is going to be applied to the value and its
+   * children. This is actually the name of a PHP function.
+   *
+   * @var string
+   */
+  protected $escapingMethod;
+
+  /**
+   * Constructor stores the escaping method and value.
+   *
+   * Since sfOutputEscaper is an abstract class, instances cannot be created
+   * directly but the constructor will be inherited by sub-classes.
+   *
+   * @param string Escaping method
+   * @param string Escaping value
+   */
+  public function __construct($escapingMethod, $value)
+  {
+    $this->value          = $value;
+    $this->escapingMethod = $escapingMethod;
+  }
+
+  /**
+   * Decorates a PHP variable with something that will escape any data obtained
+   * from it.
+   *
+   * The following cases are dealt with:
+   *
+   *    - The value is null or false: null or false is returned.
+   *    - The value is scalar: the result of applying the escaping method is
+   *      returned.
+   *    - The value is an array or an object that implements the ArrayAccess
+   *      interface: the array is decorated such that accesses to elements yield
+   *      an escaped value.
+   *    - The value implements the Traversable interface (either an Iterator, an
+   *      IteratorAggregate or an internal PHP class that implements
+   *      Traversable): decorated much like the array.
+   *    - The value is another type of object: decorated such that the result of
+   *      method calls is escaped.
+   *
+   * The escaping method is actually the name of a PHP function. There are a set
+   * of standard escaping methods listed in the escaping helper
+   * (sfEscapingHelper.php).
+   *
+   * @param string $escapingMethod the escaping method (a PHP function) to apply to the value
+   * @param mixed $value the value to escape
+   * @param mixed the escaped value
+   *
+   * @return mixed Escaping value
+   *
+   * @throws <b>sfException</b> If the escaping fails
+   */
+  public static function escape($escapingMethod, $value)
+  {
+    if (is_null($value) || ($value === false) || ($escapingMethod === 'esc_raw'))
+    {
+      return $value;
+    }
+
+    // Scalars are anything other than arrays, objects and resources.
+    if (is_scalar($value))
+    {
+      return call_user_func($escapingMethod, $value);
+    }
+
+    if (is_array($value))
+    {
+      return new sfOutputEscaperArrayDecorator($escapingMethod, $value);
+    }
+
+    if (is_object($value))
+    {
+      if ($value instanceof sfOutputEscaper)
+      {
+        // avoid double decoration when passing values from action template to component/partial
+        $copy = clone $value;
+
+        $copy->escapingMethod = $escapingMethod;
+
+        return $copy;
+      }
+      elseif ($value instanceof Traversable)
+      {
+        return new sfOutputEscaperIteratorDecorator($escapingMethod, $value);
+      }
+      else
+      {
+        return new sfOutputEscaperObjectDecorator($escapingMethod, $value);
+      }
+    }
+
+    // it must be a resource; cannot escape that.
+    throw new sfException(sprintf('Unable to escape value "%s"', print_r($value, true)));
+  }
+
+  /**
+   * Returns the raw value associated with this instance.
+   *
+   * Concrete instances of sfOutputEscaper classes decorate a value which is
+   * stored by the constructor. This returns that original, unescaped, value.
+   *
+   * @return mixed The original value used to construct the decorator
+   */
+  public function getRawValue()
+  {
+    return $this->value;
+  }
+  
+  /**
+   * Gets a value from the escaper.
+   *
+   * @param string Value to get
+   *
+   * @return mixed Value
+   */
+  public function __get($var)
+  {
+    return $this->escape($this->escapingMethod, $this->value->$var);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaper.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperArrayDecorator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperArrayDecorator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperArrayDecorator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,173 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+// fix for PHP 5.0 (no Countable interface)
+if (!interface_exists('Countable', false))
+{
+  interface Countable
+  {
+    public function count();
+  }
+}
+
+/**
+ * Output escaping decorator class for arrays.
+ *
+ * @see        sfOutputEscaper
+ * @package    symfony
+ * @subpackage view
+ * @author     Mike Squire <mike en somosis.co.uk>
+ * @version    SVN: $Id: sfOutputEscaperArrayDecorator.class.php 3232 2007-01-11 20:51:54Z fabien $
+ */
+class sfOutputEscaperArrayDecorator extends sfOutputEscaperGetterDecorator implements Iterator, ArrayAccess, Countable
+{
+  /**
+   * Used by the iterator to know if the current element is valid.
+   *
+   * @var int
+   */
+  private $count;
+
+  /**
+   * Reset the array to the beginning (as required for the Iterator interface).
+   */
+  public function rewind()
+  {
+    reset($this->value);
+
+    $this->count = count($this->value);
+  }
+
+  /**
+   * Get the key associated with the current value (as required by the Iterator interface).
+   *
+   * @return string The key
+   */
+  public function key()
+  {
+    return key($this->value);
+  }
+
+  /**
+   * Escapes and return the current value (as required by the Iterator interface).
+   *
+   * This escapes the value using {@link sfOutputEscaper::escape()} with
+   * whatever escaping method is set for this instance.
+   *
+   * @return mixed The escaped value
+   */
+  public function current()
+  {
+    return sfOutputEscaper::escape($this->escapingMethod, current($this->value));
+  }
+
+  /**
+   * Moves to the next element (as required by the Iterator interface).
+   */
+  public function next()
+  {
+    next($this->value);
+
+    $this->count --;
+  }
+
+  /**
+   * Returns true if the current element is valid (as required by the Iterator interface).
+   *
+   * The current element will not be valid if {@link next()} has fallen off the
+   * end of the array or if there are no elements in the array and {@link
+   * rewind()} was called.
+   *
+   * @return boolean The validity of the current element; true if it is valid
+   */
+  public function valid()
+  {
+    return $this->count > 0;
+  }
+
+  /**
+   * Returns true if the supplied offset is set in the array (as required by the ArrayAccess interface).
+   *
+   * @param string The offset of the value to check existance of
+   *
+   * @return boolean true if the offset exists; false otherwise
+   */
+  public function offsetExists($offset)
+  {
+    return array_key_exists($offset, $this->value);
+  }
+
+  /**
+   * Returns the element associated with the offset supplied (as required by the ArrayAccess interface).
+   *
+   * @param string The offset of the value to get
+   *
+   * @return mixed The escaped value
+   */
+  public function offsetGet($offset)
+  {
+    return sfOutputEscaper::escape($this->escapingMethod, $this->value[$offset]);
+  }
+
+  /**
+   * Throws an exception saying that values cannot be set (this method is
+   * required for the ArrayAccess interface).
+   *
+   * This (and the other sfOutputEscaper classes) are designed to be read only
+   * so this is an illegal operation.
+   *
+   * @param string (ignored)
+   * @param string (ignored)
+   *
+   * @throws <b>sfException</b>
+   */
+  public function offsetSet($offset, $value)
+  {
+    throw new sfException('Cannot set values.');
+  }
+
+  /**
+   * Throws an exception saying that values cannot be unset (this method is
+   * required for the ArrayAccess interface).
+   *
+   * This (and the other sfOutputEscaper classes) are designed to be read only
+   * so this is an illegal operation.
+   *
+   * @param string (ignored)
+   *
+   * @throws sfException
+   */
+  public function offsetUnset($offset)
+  {
+    throw new sfException('Cannot unset values.');
+  }
+
+  /**
+   * Returns the size of the array (are required by the Countable interface).
+   *
+   * @return int The size of the array
+   */
+  public function count()
+  {
+    return count($this->value);
+  }
+
+  /**
+   * Returns the (unescaped) value from the array associated with the key supplied.
+   *
+   * @param string The key into the array to use
+   *
+   * @return mixed The value
+   */
+  public function getRaw($key)
+  {
+    return $this->value[$key];
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperArrayDecorator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperGetterDecorator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperGetterDecorator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperGetterDecorator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Abstract output escaping decorator class for "getter" objects.
+ *
+ * @see        sfOutputEscaper
+ * @package    symfony
+ * @subpackage view
+ * @author     Mike Squire <mike en somosis.co.uk>
+ * @version    SVN: $Id: sfOutputEscaperGetterDecorator.class.php 3232 2007-01-11 20:51:54Z fabien $
+ */
+abstract class sfOutputEscaperGetterDecorator extends sfOutputEscaper
+{
+  /**
+   * Returns the raw, unescaped value associated with the key supplied.
+   *
+   * The key might be an index into an array or a value to be passed to the 
+   * decorated object's get() method.
+   *
+   * @param string The key to retrieve
+   *
+   * @return mixed The value
+   */
+  public abstract function getRaw($key);
+
+  /**
+   * Returns the escaped value associated with the key supplied.
+   *
+   * Typically (using this implementation) the raw value is obtained using the
+   * {@link getRaw()} method, escaped and the result returned.
+   *
+   * @param string The key to retieve
+   * @param string The escaping method (a PHP function) to use
+   *
+   * @return mixed The escaped value
+   */
+  public function get($key, $escapingMethod = null)
+  {
+    if (!$escapingMethod)
+    {
+      $escapingMethod = $this->escapingMethod;
+    }
+
+    return sfOutputEscaper::escape($escapingMethod, $this->getRaw($key));
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperGetterDecorator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperIteratorDecorator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperIteratorDecorator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperIteratorDecorator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,170 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Output escaping iterator decorator.
+ *
+ * This takes an object that implements the Traversable interface and turns it
+ * into an iterator with each value escaped.
+ *
+ * Note: Prior to PHP 5.1, the IteratorIterator class was not implemented in the
+ * core of PHP. This means that although it will still work with classes that
+ * implement Iterator or IteratorAggregate, internal PHP classes that only
+ * implement the Traversable interface will cause the constructor to throw an
+ * exception.
+ *
+ * @see        sfOutputEscaper
+ * @package    symfony
+ * @subpackage view
+ * @author     Mike Squire <mike en somosis.co.uk>
+ * @version    SVN: $Id: sfOutputEscaperIteratorDecorator.class.php 3232 2007-01-11 20:51:54Z fabien $
+ */
+class sfOutputEscaperIteratorDecorator extends sfOutputEscaperObjectDecorator implements Iterator, Countable, ArrayAccess
+{
+  /**
+   * The iterator to be used.
+   *
+   * @var IteratorIterator
+   */
+  private $iterator;
+
+  /**
+   * Constructs a new escaping iteratoror using the escaping method and value supplied.
+   *
+   * @param string The escaping method to use
+   * @param Traversable The iterator to escape
+   */
+  public function __construct($escapingMethod, Traversable $value)
+  {
+    // Set the original value for __call(). Set our own iterator because passing
+    // it to IteratorIterator will lose any other method calls.
+
+    parent::__construct($escapingMethod, $value);
+
+    $this->iterator = new IteratorIterator($value);
+  }
+
+  /**
+   * Resets the iterator (as required by the Iterator interface).
+   *
+   * @return boolean true, if the iterator rewinds successfully otherwise false
+   */
+  public function rewind()
+  {
+    return $this->iterator->rewind();
+  }
+
+  /**
+   * Escapes and gets the current element (as required by the Iterator interface).
+   *
+   * @return mixed The escaped value
+   */
+  public function current()
+  {
+    return sfOutputEscaper::escape($this->escapingMethod, $this->iterator->current());
+  }
+
+  /**
+   * Gets the current key (as required by the Iterator interface).
+   *
+   * @return string Iterator key
+   */
+  public function key()
+  {
+    return $this->iterator->key();
+  }
+
+  /**
+   * Moves to the next element in the iterator (as required by the Iterator interface).
+   */
+  public function next()
+  {
+    return $this->iterator->next();
+  }
+
+  /**
+   * Returns whether the current element is valid or not (as required by the
+   * Iterator interface).
+   *
+   * @return boolean true if the current element is valid; false otherwise
+   */
+  public function valid()
+  {
+    return $this->iterator->valid();
+  }
+  
+  /**
+   * Returns true if the supplied offset is set in the array (as required by
+   * the ArrayAccess interface).
+   *
+   * @param string The offset of the value to check existance of
+   *
+   * @return boolean true if the offset exists; false otherwise
+   */
+  public function offsetExists($offset)
+  {
+    return array_key_exists($offset, $this->value);
+  }
+
+  /**
+   * Returns the element associated with the offset supplied (as required by the ArrayAccess interface).
+   *
+   * @param string The offset of the value to get
+   *
+   * @return mixed The escaped value
+   */
+  public function offsetGet($offset)
+  {
+    return sfOutputEscaper::escape($this->escapingMethod, $this->value[$offset]);
+  }
+
+  /**
+   * Throws an exception saying that values cannot be set (this method is
+   * required for the ArrayAccess interface).
+   *
+   * This (and the other sfOutputEscaper classes) are designed to be read only
+   * so this is an illegal operation.
+   *
+   * @param string (ignored)
+   * @param string (ignored)
+   *
+   * @throws <b>sfException</b>
+   */
+  public function offsetSet($offset, $value)
+  {
+    throw new sfException('Cannot set values.');
+  }
+
+  /**
+   * Throws an exception saying that values cannot be unset (this method is
+   * required for the ArrayAccess interface).
+   *
+   * This (and the other sfOutputEscaper classes) are designed to be read only
+   * so this is an illegal operation.
+   *
+   * @param string (ignored)
+   *
+   * @throws <b>sfException</b>
+   */
+  public function offsetUnset($offset)
+  {
+    throw new sfException('Cannot unset values.');
+  }
+
+  /**
+   * Returns the size of the array (are required by the Countable interface).
+   *
+   * @return int The size of the array
+   */
+  public function count()
+  {
+    return count($this->value);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperIteratorDecorator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperObjectDecorator.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperObjectDecorator.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperObjectDecorator.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,109 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Output escaping object decorator that intercepts all method calls and escapes
+ * their return values.
+ *
+ * @see        sfOutputEscaper
+ * @package    symfony
+ * @subpackage view
+ * @author     Mike Squire <mike en somosis.co.uk>
+ * @version    SVN: $Id: sfOutputEscaperObjectDecorator.class.php 3232 2007-01-11 20:51:54Z fabien $
+ */
+class sfOutputEscaperObjectDecorator extends sfOutputEscaperGetterDecorator
+{
+  /**
+   * Magic PHP method that intercepts method calls, calls them on the objects
+   * that is being escaped and escapes the result.
+   *
+   * The calling of the method is changed slightly to accommodate passing a
+   * specific escaping strategy. An additional parameter is appended to the
+   * argument list which is the escaping strategy. The decorator will remove
+   * and use this parameter as the escaping strategy if it begins with 'esc_'
+   * (the prefix all escaping helper functions have).
+   *
+   * For example if an object, $o, implements methods a() and b($arg):
+   *
+   *   $o->a()                // Escapes the return value of a()
+   *   $o->a(ESC_RAW)         // Uses the escaping method ESC_RAW with a()
+   *   $o->b('a')             // Escapes the return value of b('a')
+   *   $o->b('a', ESC_RAW);   // Uses the escaping method ESC_RAW with b('a')
+   *
+   * @param string The method on the object to be called
+   * @param array An array of arguments to be passed to the method
+   *
+   * @return mixed The escaped value returned by the method
+   */
+  public function __call($method, $args)
+  {
+    if (count($args) > 0)
+    {
+      $escapingMethod = $args[count($args) - 1];
+      if (is_string($escapingMethod) && substr($escapingMethod, 0, 4) === 'esc_')
+      {
+        array_pop($args);
+      }
+      else
+      {
+        $escapingMethod = $this->escapingMethod;
+      }
+    }
+    else
+    {
+      $escapingMethod = $this->escapingMethod;
+    }
+
+    $value = call_user_func_array(array($this->value, $method), $args);
+
+    return sfOutputEscaper::escape($escapingMethod, $value);
+  }
+
+  /**
+   * Returns the result of calling the get() method on the object, bypassing
+   * any escaping, if that method exists.
+   *
+   * If there is not a callable get() method this will throw an exception.
+   *
+   * @param string The parameter to be passed to the get() get method
+   *
+   * @return mixed The unescaped value returned
+   *
+   * @throws <b>sfException</b> if the object does not have a callable get() method
+   */
+  public function getRaw($key)
+  {
+    if (!is_callable(array($this->value, 'get')))
+    {
+      throw new sfException('Object does not have a callable get() method.');
+    }
+
+    return $this->value->get($key);
+  }
+
+  /**
+   * Try to call decorated object __toString() method if exists.
+   *
+   * @return string
+   *
+   * @throws <b>sfException</b>
+   */
+  public function __toString()
+  {
+    if (method_exists($this->value, '__toString'))
+    {
+      return $this->value->__toString();
+    }
+    else
+    {
+      throw new sfException(sprintf('Object of class "%s" cannot be converted to string (Please create a __toString() method)', get_class($this->value)));
+    }
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/escaper/sfOutputEscaperObjectDecorator.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfMailView.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfMailView.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfMailView.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,146 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage view
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfMailView.class.php 3232 2007-01-11 20:51:54Z fabien $
+ */
+class sfMailView extends sfPHPView
+{
+  /**
+   * Retrieves the template engine associated with this view.
+   *
+   * @return string sfMail
+   */
+  public function getEngine()
+  {
+    return 'sfMail';
+  }
+
+  /**
+   * Configures template for this view.
+   *
+   * @throws <b>sfActionException</b> If the configure fails
+   */
+  public function configure()
+  {
+    // view.yml configure
+    parent::configure();
+
+    // require our configuration
+    $moduleName = $this->moduleName;
+    require(sfConfigCache::getInstance()->checkConfig(sfConfig::get('sf_app_module_dir_name').'/'.$this->moduleName.'/'.sfConfig::get('sf_app_module_config_dir_name').'/mailer.yml'));
+  }
+
+  /**
+   * Renders the presentation and send the email to the client.
+   *
+   * @return mixed Raw data of the mail
+   */
+  public function render($templateVars = null)
+  {
+    $template         = $this->getDirectory().'/'.$this->getTemplate();
+    $actionStackEntry = $this->getContext()->getActionStack()->getLastEntry();
+    $actionInstance   = $actionStackEntry->getActionInstance();
+
+    $retval = null;
+
+    // execute pre-render check
+    $this->preRenderCheck();
+
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfView} render "'.$template.'"');
+    }
+
+    // get sfMail object from action
+    $mail = $actionInstance->getVarHolder()->get('mail');
+    if (!$mail)
+    {
+      $error = 'You must define a sfMail object named $mail ($this->mail) in your action to be able to use a sfMailView.';
+      throw new sfActionException($error);
+    }
+
+    // assigns some variables to the template
+    $this->attributeHolder->add($this->getGlobalVars());
+    $this->attributeHolder->add($actionInstance->getVarHolder()->getAll());
+
+    // render main template
+    $retval = $this->renderFile($template);
+
+    // render main and alternate templates
+    $all_template_dir  = dirname($template);
+    $all_template_regex = preg_replace('/\\.php$/', '\..+\.php', basename($template));
+    $all_templates = sfFinder::type('file')->name('/^'.$all_template_regex.'$/')->in($all_template_dir);
+    $all_retvals = array();
+    foreach ($all_templates as $templateFile)
+    {
+      if (preg_match('/\.([^.]+?)\.php$/', $templateFile, $matches))
+      {
+        $all_retvals[$matches[1]] = $this->renderFile($templateFile);
+      }
+    }
+
+    // send email
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfView} send email to client');
+    }
+
+    // configuration prefix
+    $config_prefix = 'sf_mailer_'.strtolower($this->moduleName).'_';
+
+    $vars = array(
+      'mailer',
+      'priority', 'content_type', 'charset', 'encoding', 'wordwrap',
+      'hostname', 'port', 'domain', 'username', 'password'
+    );
+    $defaultMail = new sfMail();
+
+    foreach ($vars as $var)
+    {
+      $setter = 'set'.sfInflector::camelize($var);
+      $getter = 'get'.sfInflector::camelize($var);
+      $value  = $mail->$getter() !== $defaultMail->$getter() ? $mail->$getter() : sfConfig::get($config_prefix.strtolower($var));
+      $mail->$setter($value);
+    }
+
+    $mail->setBody($retval);
+
+    // alternate bodies
+    $i = 0;
+    foreach ($all_retvals as $type => $retval)
+    {
+      if ($type == 'altbody' && !$mail->getAltBody())
+      {
+        $mail->setAltBody($retval);
+      }
+      else
+      {
+        ++$i;
+        $mail->addStringAttachment($retval, 'file'.$i, 'base64', 'text/'.$type);
+      }
+    }
+
+    // preparing email to be sent
+    $mail->prepare();
+
+    // send e-mail
+    if (sfConfig::get($config_prefix.'deliver'))
+    {
+      $mail->send();
+    }
+
+    return $mail->getRawHeader().$mail->getRawBody();
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfMailView.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfPHPView.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfPHPView.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfPHPView.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,284 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage view
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfPHPView.class.php 3308 2007-01-20 05:48:11Z fabien $
+ */
+class sfPHPView extends sfView
+{
+  /**
+   * Executes any presentation logic for this view.
+   */
+  public function execute()
+  {
+  }
+
+  /**
+   * Returns variables that will be accessible to the template.
+   *
+   * @return array Attributes from the template
+   */
+  protected function getGlobalVars()
+  {
+    $context = $this->getContext();
+
+    $shortcuts = array(
+      'sf_context' => $context,
+      'sf_params'  => $context->getRequest()->getParameterHolder(),
+      'sf_request' => $context->getRequest(),
+      'sf_user'    => $context->getUser(),
+      'sf_view'    => $this,
+    );
+
+    if (sfConfig::get('sf_use_flash'))
+    {
+      $sf_flash = new sfParameterHolder();
+      $sf_flash->add($context->getUser()->getAttributeHolder()->getAll('symfony/flash'));
+      $shortcuts['sf_flash'] = $sf_flash;
+    }
+
+    return $shortcuts;
+  }
+
+  /**
+   * Load core and standard helpers to be use in the template.
+   */
+  protected function loadCoreAndStandardHelpers()
+  {
+    static $coreHelpersLoaded = 0;
+
+    if ($coreHelpersLoaded)
+    {
+      return;
+    }
+
+    $coreHelpersLoaded = 1;
+    $core_helpers = array('Helper', 'Url', 'Asset', 'Tag', 'Escaping');
+    $standard_helpers = sfConfig::get('sf_standard_helpers');
+
+    $helpers = array_unique(array_merge($core_helpers, $standard_helpers));
+    sfLoader::loadHelpers($helpers);
+  }
+
+  /**
+   * Renders the presentation.
+   *
+   * @param string Filename
+   *
+   * @return string File content
+   */
+  protected function renderFile($_sfFile)
+  {
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfView} render "'.$_sfFile.'"');
+    }
+
+    $this->loadCoreAndStandardHelpers();
+
+    $_escaping = $this->getEscaping();
+    if ($_escaping === false || $_escaping === 'bc')
+    {
+      extract($this->attributeHolder->getAll());
+    }
+
+    if ($_escaping !== false)
+    {
+      $sf_data = sfOutputEscaper::escape($this->getEscapingMethod(), $this->attributeHolder->getAll());
+
+      if ($_escaping === 'both')
+      {
+        foreach ($sf_data as $_key => $_value)
+        {
+          ${$_key} = $_value;
+        }
+      }
+    }
+
+    // render
+    ob_start();
+    ob_implicit_flush(0);
+    require($_sfFile);
+
+    return ob_get_clean();
+  }
+
+  /**
+   * Retrieves the template engine associated with this view.
+   *
+   * Note: This will return null because PHP itself has no engine reference.
+   *
+   * @return null
+   */
+  public function getEngine()
+  {
+    return null;
+  }
+
+  /**
+   * Configures template.
+   *
+   * @return void
+   */
+  public function configure()
+  {
+    // store our current view
+    $actionStackEntry = $this->getContext()->getActionStack()->getLastEntry();
+    if (!$actionStackEntry->getViewInstance())
+    {
+      $actionStackEntry->setViewInstance($this);
+    }
+
+    // require our configuration
+    $viewConfigFile = $this->moduleName.'/'.sfConfig::get('sf_app_module_config_dir_name').'/view.yml';
+    require(sfConfigCache::getInstance()->checkConfig(sfConfig::get('sf_app_module_dir_name').'/'.$viewConfigFile));
+
+    // set template directory
+    if (!$this->directory)
+    {
+      $this->setDirectory(sfLoader::getTemplateDir($this->moduleName, $this->getTemplate()));
+    }
+  }
+
+  /**
+   * Loop through all template slots and fill them in with the results of
+   * presentation data.
+   *
+   * @param string A chunk of decorator content
+   *
+   * @return string A decorated template
+   */
+  protected function decorate($content)
+  {
+    $template = $this->getDecoratorDirectory().'/'.$this->getDecoratorTemplate();
+
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info('{sfView} decorate content with "'.$template.'"');
+    }
+
+    // set the decorator content as an attribute
+    $this->attributeHolder->set('sf_content', $content);
+
+    // for backwards compatibility with old layouts; remove at 0.8.0?
+    $this->attributeHolder->set('content', $content);
+
+    // render the decorator template and return the result
+    $retval = $this->renderFile($template);
+
+    return $retval;
+  }
+
+  /**
+   * Renders the presentation.
+   *
+   * When the controller render mode is sfView::RENDER_CLIENT, this method will
+   * render the presentation directly to the client and null will be returned.
+   *
+   * @return string A string representing the rendered presentation, if
+   *                the controller render mode is sfView::RENDER_VAR, otherwise null
+   */
+  public function render($templateVars = null)
+  {
+    $context = $this->getContext();
+
+    // get the render mode
+    $mode = $context->getController()->getRenderMode();
+
+    if ($mode == sfView::RENDER_NONE)
+    {
+      return null;
+    }
+
+    $retval = null;
+    $response = $context->getResponse();
+    if (sfConfig::get('sf_cache'))
+    {
+      $key   = $response->getParameterHolder()->remove('current_key', 'symfony/cache/current');
+      $cache = $response->getParameter($key, null, 'symfony/cache');
+      if ($cache !== null)
+      {
+        $cache  = unserialize($cache);
+        $retval = $cache['content'];
+        $vars   = $cache['vars'];
+        $response->mergeProperties($cache['response']);
+      }
+    }
+
+    // decorator
+    $layout = $response->getParameter($this->moduleName.'_'.$this->actionName.'_layout', null, 'symfony/action/view');
+    if (false === $layout)
+    {
+      $this->setDecorator(false);
+    }
+    else if (null !== $layout)
+    {
+      $this->setDecoratorTemplate($layout.$this->getExtension());
+    }
+
+    // template variables
+    if ($templateVars === null)
+    {
+      $actionInstance   = $context->getActionStack()->getLastEntry()->getActionInstance();
+      $templateVars     = $actionInstance->getVarHolder()->getAll();
+    }
+
+    // assigns some variables to the template
+    $this->attributeHolder->add($this->getGlobalVars());
+    $this->attributeHolder->add($retval !== null ? $vars : $templateVars);
+
+    // render template if no cache
+    if ($retval === null)
+    {
+      // execute pre-render check
+      $this->preRenderCheck();
+
+      // render template file
+      $template = $this->getDirectory().'/'.$this->getTemplate();
+      $retval = $this->renderFile($template);
+
+      if (sfConfig::get('sf_cache') && $key !== null)
+      {
+        $cache = array(
+          'content'   => $retval,
+          'vars'      => $templateVars,
+          'view_name' => $this->viewName,
+          'response'  => $context->getResponse(),
+        );
+        $response->setParameter($key, serialize($cache), 'symfony/cache');
+
+        if (sfConfig::get('sf_web_debug'))
+        {
+          $retval = sfWebDebug::getInstance()->decorateContentWithDebug($key, $retval, true);
+        }
+      }
+    }
+
+    // now render decorator template, if one exists
+    if ($this->isDecorator())
+    {
+      $retval = $this->decorate($retval);
+    }
+
+    // render to client
+    if ($mode == sfView::RENDER_CLIENT)
+    {
+      $context->getResponse()->setContent($retval);
+    }
+
+    return $retval;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfPHPView.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfPartialView.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfPartialView.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfPartialView.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * @package    symfony
+ * @subpackage view
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfPartialView.class.php 3232 2007-01-11 20:51:54Z fabien $
+ */
+class sfPartialView extends sfPHPView
+{
+  /**
+   * Executes any presentation logic for this view.
+   */
+  public function execute()
+  {
+  }
+
+  /**
+   * Configures template for this view.
+   */
+  public function configure()
+  {
+    $this->setDecorator(false);
+
+    $this->setTemplate($this->actionName.$this->getExtension());
+    if ('global' == $this->moduleName)
+    {
+      $this->setDirectory(sfConfig::get('sf_app_template_dir'));
+    }
+    else
+    {
+      $this->setDirectory(sfLoader::getTemplateDir($this->moduleName, $this->getTemplate()));
+    }
+  }
+
+  /**
+   * Renders the presentation.
+   *
+   * @param array Template attributes
+   *
+   * @return string Current template content
+   */
+  public function render($templateVars = array())
+  {
+    if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+    {
+      $timer = sfTimerManager::getTimer(sprintf('Partial "%s/%s"', $this->moduleName, $this->actionName));
+    }
+
+    // execute pre-render check
+    $this->preRenderCheck();
+
+    // assigns some variables to the template
+    $this->attributeHolder->add($this->getGlobalVars());
+    $this->attributeHolder->add($templateVars);
+
+    // render template
+    $retval = $this->renderFile($this->getDirectory().'/'.$this->getTemplate());
+
+    if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+    {
+      $timer->addTime();
+    }
+
+    return $retval;
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfPartialView.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfView.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfView.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfView.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,669 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ * (c) 2004-2006 Sean Kerr.
+ * 
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ *
+ * A view represents the presentation layer of an action. Output can be
+ * customized by supplying attributes, which a template can manipulate and
+ * display.
+ *
+ * @package    symfony
+ * @subpackage view
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @author     Sean Kerr <skerr en mojavi.org>
+ * @version    SVN: $Id: sfView.class.php 3250 2007-01-12 20:09:11Z fabien $
+ */
+abstract class sfView
+{
+  /**
+   * Show an alert view.
+   */
+  const ALERT = 'Alert';
+
+  /**
+   * Show an error view.
+   */
+  const ERROR = 'Error';
+
+  /**
+   * Show a form input view.
+   */
+  const INPUT = 'Input';
+
+  /**
+   * Skip view execution.
+   */
+  const NONE = 'None';
+
+  /**
+   * Show a success view.
+   */
+  const SUCCESS = 'Success';
+
+  /**
+    * Skip view rendering but output http headers
+    */
+  const HEADER_ONLY = 'Headers';
+
+  /**
+   * Render the presentation to the client.
+   */
+  const RENDER_CLIENT = 2;
+
+  /**
+   * Do not render the presentation.
+   */
+  const RENDER_NONE = 1;
+
+  /**
+   * Render the presentation to a variable.
+   */
+  const RENDER_VAR = 4;
+
+  protected
+    $context            = null,
+    $decorator          = false,
+    $decoratorDirectory = null,
+    $decoratorTemplate  = null,
+    $directory          = null,
+    $componentSlots     = array(),
+    $template           = null,
+    $escaping           = null,
+    $escapingMethod     = null,
+    $attributeHolder    = null,
+    $parameterHolder    = null,
+    $moduleName         = '',
+    $actionName         = '',
+    $viewName           = '',
+    $extension          = '.php';
+
+  /**
+   * Executes any presentation logic and set template attributes.
+   */
+  abstract function execute();
+
+  /**
+   * Configures template.
+   */
+  abstract function configure();
+
+  /**
+   * Retrieves the current application context.
+   *
+   * @return sfContext The current sfContext instance
+   */
+  public final function getContext()
+  {
+    return $this->context;
+  }
+
+  /**
+   * Retrieves this views decorator template directory.
+   *
+   * @return string An absolute filesystem path to this views decorator template directory
+   */
+  public function getDecoratorDirectory()
+  {
+    return $this->decoratorDirectory;
+  }
+
+  /**
+   * Retrieves this views decorator template.
+   *
+   * @return string A template filename, if a template has been set, otherwise null
+   */
+  public function getDecoratorTemplate()
+  {
+    return $this->decoratorTemplate;
+  }
+
+  /**
+   * Retrieves this view template directory.
+   *
+   * @return string An absolute filesystem path to this views template directory
+   */
+  public function getDirectory()
+  {
+    return $this->directory;
+  }
+
+  /**
+   * Retrieves the template engine associated with this view.
+   *
+   * Note: This will return null for PHPView instances.
+   *
+   * @return mixed A template engine instance
+   */
+  abstract function getEngine();
+
+  /**
+   * Retrieves this views template.
+   *
+   * @return string A template filename, if a template has been set, otherwise null
+   */
+  public function getTemplate()
+  {
+    return $this->template;
+  }
+
+  /**
+   * Gets the default escaping strategy associated with this view.
+   *
+   * The escaping strategy specifies how the variables get passed to the view.
+   *
+   * @return string the escaping strategy
+   */
+  public function getEscaping()
+  {
+    return null === $this->escaping ? sfConfig::get('sf_escaping_strategy') : $this->escaping;
+  }
+
+  /**
+   * Returns the name of the function that is to be used as the escaping method.
+   *
+   * If the escaping method is empty, then that is returned. The default value
+   * specified by the sub-class will be used. If the method does not exist (in
+   * the sense there is no define associated with the method) and exception is
+   * thrown.
+   *
+   * @return string The escaping method as the name of the function to use
+   *
+   * @throws <b>sfException</b> If the method does not exist
+   */
+  public function getEscapingMethod()
+  {
+    $method = null === $this->escapingMethod ? sfConfig::get('sf_escaping_method') : $this->escapingMethod;
+
+    if (empty($method))
+    {
+      return $method;
+    }
+
+    if (!defined($method))
+    {
+      throw new sfException(sprintf('Escaping method "%s" is not available; perhaps another helper needs to be loaded in?', $method));
+    }
+
+    return constant($method);
+  }
+
+  /**
+   * Imports parameter values and error messages from the request directly as view attributes.
+   *
+   * @param array An indexed array of file/parameter names
+   * @param boolean  Is this a list of files?
+   * @param boolean  Import error messages too?
+   * @param boolean  Run strip_tags() on attribute value?
+   * @param boolean  Run htmlspecialchars() on attribute value?
+   */
+  public function importAttributes($names, $files = false, $errors = true, $stripTags = true, $specialChars = true)
+  {
+    // alias $request to keep the code clean
+    $request = $this->context->getRequest();
+
+    // get our array
+    if ($files)
+    {
+      // file names
+      $array =& $request->getFiles();
+    }
+    else
+    {
+      // parameter names
+      $array =& $request->getParameterHolder()->getAll();
+    }
+
+    // loop through our parameter names and import them
+    foreach ($names as &$name)
+    {
+        if (preg_match('/^([a-z0-9\-_]+)\{([a-z0-9\s\-_]+)\}$/i', $name, $match))
+        {
+          // we have a parent
+          $parent  = $match[1];
+          $subname = $match[2];
+
+          // load the file/parameter value for this attribute if one exists
+          if (isset($array[$parent]) && isset($array[$parent][$subname]))
+          {
+            $value = $array[$parent][$subname];
+
+            if ($stripTags)
+              $value = strip_tags($value);
+
+            if ($specialChars)
+              $value = htmlspecialchars($value);
+
+            $this->setAttribute($name, $value);
+          }
+          else
+          {
+            // set an empty value
+            $this->setAttribute($name, '');
+          }
+        }
+        else
+        {
+          // load the file/parameter value for this attribute if one exists
+          if (isset($array[$name]))
+          {
+            $value = $array[$name];
+
+            if ($stripTags)
+              $value = strip_tags($value);
+
+            if ($specialChars)
+              $value = htmlspecialchars($value);
+
+            $this->setAttribute($name, $value);
+          }
+          else
+          {
+            // set an empty value
+            $this->setAttribute($name, '');
+          }
+        }
+
+        if ($errors)
+        {
+          if ($request->hasError($name))
+          {
+            $this->setAttribute($name.'_error', $request->getError($name));
+          }
+          else
+          {
+            // set empty error
+            $this->setAttribute($name.'_error', '');
+          }
+        }
+    }
+  }
+
+  /**
+   * Initializes this view.
+   *
+   * @param sfContext The current application context
+   * @param string The module name for this view
+   * @param string The action name for this view
+   * @param string The view name
+   *
+   * @return boolean true, if initialization completes successfully, otherwise false
+   */
+  public function initialize($context, $moduleName, $actionName, $viewName)
+  {
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $context->getLogger()->info(sprintf('{sfView} initialize view for "%s/%s"', $moduleName, $actionName));
+    }
+
+    $this->moduleName = $moduleName;
+    $this->actionName = $actionName;
+    $this->viewName   = $viewName;
+
+    $this->context = $context;
+    $this->attributeHolder = new sfParameterHolder();
+    $this->parameterHolder = new sfParameterHolder();
+
+    $this->parameterHolder->add(sfConfig::get('mod_'.strtolower($moduleName).'_view_param', array()));
+
+    $this->decoratorDirectory = sfConfig::get('sf_app_template_dir');
+
+    // include view configuration
+    $this->configure();
+
+    return true;
+  }
+
+  /**
+   * Retrieves attributes for the current view.
+   *
+   * @return sfParameterHolder The attribute parameter holder
+   */
+  public function getAttributeHolder()
+  {
+    return $this->attributeHolder;
+  }
+
+  /**
+   * Retrieves an attribute for the current view.
+   *
+   * @param string Name of the attribute
+   * @param string Value of the attribute
+   * @param string The current namespace
+   *
+   * @return mixed Attribute
+   */
+  public function getAttribute($name, $default = null, $ns = null)
+  {
+    return $this->attributeHolder->get($name, $default, $ns);
+  }
+
+  /**
+   * Returns true if the view have attributes.
+   *
+   * @param string Name of the attribute
+   * @param string Namespace for the current view
+   *
+   * @return mixed Attribute of the view
+   */
+  public function hasAttribute($name, $ns = null)
+  {
+    return $this->attributeHolder->has($name, $ns);
+  }
+
+  /**
+   * Sets an attribute of the view.
+   *
+   * @param string Attribute name
+   * @param string Value for the attribute
+   * @param string Namespace for the current
+   */
+  public function setAttribute($name, $value, $ns = null)
+  {
+    $this->attributeHolder->set($name, $value, $ns);
+  }
+
+  /**
+   * Retrieves the parameters for the current view.
+   *
+   * @return sfParameterHolder The parameter holder
+   */
+  public function getParameterHolder()
+  {
+    return $this->parameterHolder;
+  }
+
+  /**
+   * Retrieves a parameter from the current view.
+   *
+   * @param string Parameter name
+   * @param string Default parameter value
+   * @param string Namespace for the current view
+   *
+   * @return mixed A parameter value
+   */
+  public function getParameter($name, $default = null, $ns = null)
+  {
+    return $this->parameterHolder->get($name, $default, $ns);
+  }
+
+  /**
+   * Indicates whether or not a parameter exist for the current view.
+   *
+   * @param string Name of the paramater
+   * @param string Namespace for the current view
+   *
+   * @return boolean true, if the parameter exists otherwise false
+   */
+  public function hasParameter($name, $ns = null)
+  {
+    return $this->parameterHolder->has($name, $ns);
+  }
+
+  /**
+   * Sets a parameter for the view.
+   *
+   * @param string Name of the parameter
+   * @param string The parameter value
+   * @param string Namespace for the current view
+   */
+  public function setParameter($name, $value, $ns = null)
+  {
+    $this->parameterHolder->set($name, $value, $ns);
+  }
+
+  /**
+   * Indicates that this view is a decorating view.
+   *
+   * @return boolean true, if this view is a decorating view, otherwise false
+   */
+  public function isDecorator()
+  {
+    return $this->decorator;
+  }
+
+  /**
+   * Sets the decorating mode for the current view.
+   *
+   * @param boolean Set the decorating mode for the view
+   */
+  public function setDecorator($boolean)
+  {
+    $this->decorator = (boolean) $boolean;
+  }
+
+  /**
+   * Executes a basic pre-render check to verify all required variables exist
+   * and that the template is readable.
+   *
+   * @throws <b>sfRenderException</b> If the pre-render check fails
+   */
+  protected function preRenderCheck()
+  {
+    if ($this->template == null)
+    {
+      // a template has not been set
+      $error = 'A template has not been set';
+
+      throw new sfRenderException($error);
+    }
+
+    $template = $this->directory.'/'.$this->template;
+
+    if (!is_readable($template))
+    {
+      // the template isn't readable
+      throw new sfRenderException(sprintf('The template "%s" does not exist in: %s', $template, $this->directory));
+    }
+
+    // check to see if this is a decorator template
+    if ($this->decorator)
+    {
+      $template = $this->decoratorDirectory.'/'.$this->decoratorTemplate;
+
+      if (!is_readable($template))
+      {
+        // the decorator template isn't readable
+        $error = 'The decorator template "%s" does not exist or is unreadable';
+        $error = sprintf($error, $template);
+
+        throw new sfRenderException($error);
+      }
+    }
+  }
+
+  /**
+   * Renders the presentation.
+   *
+   * When the controller render mode is sfView::RENDER_CLIENT, this method will
+   * render the presentation directly to the client and null will be returned.
+   *
+   * @param  array  An array with variables that will be extracted for the template
+   *                If empty, the current actions var holder will be extracted
+   * @return string A string representing the rendered presentation, if
+   *                the controller render mode is sfView::RENDER_VAR, otherwise null
+   */
+  abstract function render($templateVars = null);
+
+  /**
+   * Sets the decorator template directory for this view.
+   *
+   * @param string An absolute filesystem path to a template directory
+   */
+  public function setDecoratorDirectory($directory)
+  {
+    $this->decoratorDirectory = $directory;
+  }
+
+  /**
+   * Sets the escape caracter mode.
+   *
+   * @param string Escape code
+   */
+  public function setEscaping($escaping)
+  {
+    $this->escaping = $escaping;
+  }
+
+  /**
+   * Sets the escaping method for the current view.
+   *
+   * @param string Method for escaping
+   */
+  public function setEscapingMethod($method)
+  {
+    $this->escapingMethod = $method;
+  }
+
+  /**
+   * Sets the decorator template for this view.
+   *
+   * If the template path is relative, it will be based on the currently
+   * executing module's template sub-directory.
+   *
+   * @param string An absolute or relative filesystem path to a template
+   */
+  public function setDecoratorTemplate($template)
+  {
+    if (sfToolkit::isPathAbsolute($template))
+    {
+      $this->decoratorDirectory = dirname($template);
+      $this->decoratorTemplate  = basename($template);
+    }
+    else
+    {
+      $this->decoratorTemplate = $template;
+    }
+
+    if (!strpos($this->decoratorTemplate, '.'))
+    {
+      $this->decoratorTemplate .= $this->getExtension();
+    }
+
+    // set decorator status
+    $this->decorator = true;
+  }
+
+  /**
+   * Sets the template directory for this view.
+   *
+   * @param string An absolute filesystem path to a template directory
+   */
+  public function setDirectory($directory)
+  {
+    $this->directory = $directory;
+  }
+
+  /**
+   * Sets the module and action to be executed in place of a particular template attribute.
+   *
+   * @param string A template attribute name
+   * @param string A module name
+   * @param string A component name
+   */
+  public function setComponentSlot($attributeName, $moduleName, $componentName)
+  {
+    $this->componentSlots[$attributeName]                   = array();
+    $this->componentSlots[$attributeName]['module_name']    = $moduleName;
+    $this->componentSlots[$attributeName]['component_name'] = $componentName;
+  }
+
+  /**
+   * Indicates whether or not a component slot exists.
+   *
+   * @param  string The component slot name
+   *
+   * @return boolean true, if the component slot exists, otherwise false
+   */
+  public function hasComponentSlot($name)
+  {
+    return isset($this->componentSlots[$name]);
+  }
+
+  /**
+   * Gets a component slot
+   *
+   * @param  string The component slot name
+   *
+   * @return array The component slot
+   */
+  public function getComponentSlot($name)
+  {
+    if (isset($this->componentSlots[$name]) && $this->componentSlots[$name]['module_name'] && $this->componentSlots[$name]['component_name'])
+    {
+      return array($this->componentSlots[$name]['module_name'], $this->componentSlots[$name]['component_name']);
+    }
+
+    return null;
+  }
+
+  /**
+   * Sets the template for this view.
+   *
+   * If the template path is relative, it will be based on the currently
+   * executing module's template sub-directory.
+   *
+   * @param string An absolute or relative filesystem path to a template
+   */
+  public function setTemplate($template)
+  {
+    if (sfToolkit::isPathAbsolute($template))
+    {
+      $this->directory = dirname($template);
+      $this->template  = basename($template);
+    }
+    else
+    {
+      $this->template = $template;
+    }
+  }
+
+  /**
+   * Retrieves the current view extension.
+   *
+   * @return string The extension for current view.
+   */
+  public function getExtension()
+  {
+    return $this->extension;
+  }
+
+  /**
+   * Sets an extension for the current view.
+   *
+   * @param string The extension name.
+   */
+  public function setExtension($ext)
+  {
+    $this->extension = $ext;
+  }
+
+  /**
+   * Overloads a given method
+   *
+   * @param string Method name
+   * @param string Method arguments
+   *
+   * @return mixed User function callback
+   *
+   * @throws <b>sfException</b> If the call fails
+   */
+  public function __call($method, $arguments)
+  {
+    if (!$callable = sfMixer::getCallable('sfView:'.$method))
+    {
+      throw new sfException(sprintf('Call to undefined method sfView::%s', $method));
+    }
+
+    array_unshift($arguments, $this);
+
+    return call_user_func_array($callable, $arguments);
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfView.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfViewCacheManager.class.php
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfViewCacheManager.class.php	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfViewCacheManager.class.php	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,515 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ * (c) 2004-2006 Fabien Potencier <fabien.potencier en symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Cache class to cache the HTML results for actions and templates.
+ *
+ * This class uses $cacheClass class to store cache.
+ * All cache files are stored in files in the [sf_root_dir].'/cache/'.[sf_app].'/html' directory.
+ * To disable all caching, you can set to false [sf_cache] constant.
+ *
+ * @package    symfony
+ * @subpackage view
+ * @author     Fabien Potencier <fabien.potencier en symfony-project.com>
+ * @version    SVN: $Id: sfViewCacheManager.class.php 3232 2007-01-11 20:51:54Z fabien $
+ */
+class sfViewCacheManager
+{
+  protected
+    $cache              = null,
+    $cacheConfig        = array(),
+    $context            = null,
+    $controller         = null,
+    $loaded             = array();
+
+  /**
+   * Initializes the cache manager.
+   *
+   * @param sfContext Current application context
+   * @param sfCache Type of the cache
+   * @param array Cache parameters
+   */
+  public function initialize($context, $cacheClass, $cacheParameters = array())
+  {
+    $this->context    = $context;
+    $this->controller = $context->getController();
+
+    // empty configuration
+    $this->cacheConfig = array();
+
+    // create cache instance
+    $this->cache = new $cacheClass();
+    $this->cache->initialize($cacheParameters);
+
+    // register a named route for our partial cache (at the end)
+    $r = sfRouting::getInstance();
+    if (!$r->hasRouteName('sf_cache_partial'))
+    {
+      $r->connect('sf_cache_partial', '/sf_cache_partial/:module/:action/:sf_cache_key.', array(), array());
+    }
+  }
+
+  /**
+   * Retrieves the current cache context.
+   *
+   * @return sfContext The sfContext instance
+   */
+  public function getContext()
+  {
+    return $this->context;
+  }
+
+  /**
+   * Retrieves the current cache type.
+   *
+   * @return sfCache The current cache type
+   */
+  public function getCache()
+  {
+    return $this->cache;
+  }
+
+  /**
+   * Generates namespaces for the cache manager
+   *
+   * @param string Internal unified resource identifier.
+   *
+   * @return array Path and filename for the current namespace
+   *
+   * @throws <b>sfException</b> if the generation fails
+   */
+  public function generateNamespace($internalUri)
+  {
+    if ($callable = sfConfig::get('sf_cache_namespace_callable'))
+    {
+      if (!is_callable($callable))
+      {
+        throw new sfException(sprintf('"%s" cannot be called as a function.', var_export($callable, true)));
+      }
+
+      return call_user_func($callable, $internalUri);
+    }
+
+    // generate uri
+    // we want our URL with / only
+    $oldUrlFormat = sfConfig::get('sf_url_format');
+    sfConfig::set('sf_url_format', 'PATH');
+    if ($this->isContextual($internalUri))
+    {
+      list($route_name, $params) = $this->controller->convertUrlStringToParameters($internalUri);
+      $uri = $this->controller->genUrl(sfRouting::getInstance()->getCurrentInternalUri()).sprintf('/%s/%s/%s', $params['module'], $params['action'], $params['sf_cache_key']);
+    }
+    else
+    {
+      $uri = $this->controller->genUrl($internalUri);
+    }
+    sfConfig::set('sf_url_format', $oldUrlFormat);
+
+    // prefix with vary headers
+    $varyHeaders = $this->getVary($internalUri);
+    if ($varyHeaders)
+    {
+      sort($varyHeaders);
+      $request = $this->getContext()->getRequest();
+      $vary = '';
+
+      foreach ($varyHeaders as $header)
+      {
+        $vary .= $request->getHttpHeader($header).'|';
+      }
+
+      $vary = $vary;
+    }
+    else
+    {
+      $vary = 'all';
+    }
+
+    // prefix with hostname
+    $request = $this->context->getRequest();
+    $hostName = $request->getHost();
+    $hostName = preg_replace('/[^a-z0-9]/i', '_', $hostName);
+    $hostName = strtolower(preg_replace('/_+/', '_', $hostName));
+
+    $uri = '/'.$hostName.'/'.$vary.'/'.$uri;
+
+    // replace multiple /
+    $uri = preg_replace('#/+#', '/', $uri);
+
+    return array(dirname($uri), basename($uri));
+  }
+
+  /**
+   * Adds a cache to the manager.
+   *
+   * @param string Module name
+   * @param string Action name
+   * @param array Options for the cache
+   */
+  public function addCache($moduleName, $actionName, $options = array())
+  {
+    // normalize vary headers
+    foreach ($options['vary'] as $key => $name)
+    {
+      $options['vary'][$key] = strtr(strtolower($name), '_', '-');
+    }
+
+    $options['lifeTime'] = isset($options['lifeTime']) ? $options['lifeTime'] : 0;
+    if (!isset($this->cacheConfig[$moduleName]))
+    {
+      $this->cacheConfig[$moduleName] = array();
+    }
+    $this->cacheConfig[$moduleName][$actionName] = array(
+      'withLayout'     => isset($options['withLayout']) ? $options['withLayout'] : false,
+      'lifeTime'       => $options['lifeTime'],
+      'clientLifeTime' => isset($options['clientLifeTime']) && $options['clientLifeTime'] ? $options['clientLifeTime'] : $options['lifeTime'],
+      'contextual'     => isset($options['contextual']) ? $options['contextual'] : false,
+      'vary'           => isset($options['vary']) ? $options['vary'] : array(),
+    );
+  }
+
+  /**
+   * Registers configuration options for the cache.
+   *
+   * @param string Module name
+   */
+  public function registerConfiguration($moduleName)
+  {
+    if (!isset($loaded[$moduleName]))
+    {
+      require(sfConfigCache::getInstance()->checkConfig(sfConfig::get('sf_app_module_dir_name').'/'.$moduleName.'/'.sfConfig::get('sf_app_module_config_dir_name').'/cache.yml'));
+      $loaded[$moduleName] = true;
+    }
+  }
+
+  /**
+   * Retrieves the layout from the cache option list.
+   *
+   * @param string Internal uniform resource identifier
+   *
+   * @return boolean true, if have layout otherwise false
+   */
+  public function withLayout($internalUri)
+  {
+    return $this->getCacheConfig($internalUri, 'withLayout', false);
+  }
+
+  /**
+   * Retrieves lifetime from the cache option list.
+   *
+   * @param string Internal uniform resource identifier
+   *
+   * @return int LifeTime
+   */
+  public function getLifeTime($internalUri)
+  {
+    return $this->getCacheConfig($internalUri, 'lifeTime', 0);
+  }
+
+  /**
+   * Retrieves client lifetime from the cache option list
+   *
+   * @param string Internal uniform resource identifier
+   *
+   * @return int Client lifetime
+   */
+  public function getClientLifeTime($internalUri)
+  {
+    return $this->getCacheConfig($internalUri, 'clientLifeTime', 0);
+  }
+
+  /**
+   * Retrieves contextual option from the cache option list.
+   *
+   * @param string Internal uniform resource identifier
+   *
+   * @return boolean true, if is contextual otherwise false
+   */
+  public function isContextual($internalUri)
+  {
+    return $this->getCacheConfig($internalUri, 'contextual', false);
+  }
+
+  /**
+   * Retrieves vary option from the cache option list.
+   *
+   * @param string Internal uniform resource identifier
+   *
+   * @return array Vary options for the cache
+   */
+  public function getVary($internalUri)
+  {
+    return $this->getCacheConfig($internalUri, 'vary', array());
+  }
+
+  /**
+   * Gets a config option from the cache.
+   *
+   * @param string Internal uniform resource identifier
+   * @param string Option name
+   * @param string Default value of the option
+   *
+   * @return mixed Value of the option
+   */
+  protected function getCacheConfig($internalUri, $key, $defaultValue = null)
+  {
+    list($route_name, $params) = $this->controller->convertUrlStringToParameters($internalUri);
+
+    $value = $defaultValue;
+    if (isset($this->cacheConfig[$params['module']][$params['action']][$key]))
+    {
+      $value = $this->cacheConfig[$params['module']][$params['action']][$key];
+    }
+    else if (isset($this->cacheConfig[$params['module']]['DEFAULT'][$key]))
+    {
+      $value = $this->cacheConfig[$params['module']]['DEFAULT'][$key];
+    }
+
+    return $value;
+  }
+
+  /**
+   * Returns true if the current content is cacheable.
+   *
+   * @param string Internal uniform resource identifier
+   *
+   * @return boolean true, if the content is cacheable otherwise false
+   */
+  public function isCacheable($internalUri)
+  {
+    list($route_name, $params) = $this->controller->convertUrlStringToParameters($internalUri);
+
+    if (isset($this->cacheConfig[$params['module']][$params['action']]))
+    {
+      return ($this->cacheConfig[$params['module']][$params['action']]['lifeTime'] > 0);
+    }
+    else if (isset($this->cacheConfig[$params['module']]['DEFAULT']))
+    {
+      return ($this->cacheConfig[$params['module']]['DEFAULT']['lifeTime'] > 0);
+    }
+
+    return false;
+  }
+
+  /**
+   * Retrieves namespace for the current cache.
+   *
+   * @param string Internal uniform resource identifier
+   *
+   * @return string The data of the cache
+   */
+  public function get($internalUri)
+  {
+    // no cache or no cache set for this action
+    if (!$this->isCacheable($internalUri) || $this->ignore())
+    {
+      return null;
+    }
+
+    list($namespace, $id) = $this->generateNamespace($internalUri);
+
+    $this->cache->setLifeTime($this->getLifeTime($internalUri));
+
+    $retval = $this->cache->get($id, $namespace);
+
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->getContext()->getLogger()->info(sprintf('{sfViewCacheManager} cache for "%s" %s', $internalUri, ($retval !== null ? 'exists' : 'does not exist')));
+    }
+
+    return $retval;
+  }
+
+  /**
+   * Returns true if there is a cache.
+   *
+   * @param string Internal uniform resource identifier
+   *
+   * @return boolean true, if there is a cache otherwise false
+   */
+  public function has($internalUri)
+  {
+    if (!$this->isCacheable($internalUri) || $this->ignore())
+    {
+      return null;
+    }
+
+    list($namespace, $id) = $this->generateNamespace($internalUri);
+
+    $this->cache->setLifeTime($this->getLifeTime($internalUri));
+
+    return $this->cache->has($id, $namespace);
+  }
+
+  /**
+   * Ignores the cache functionality.
+   *
+   * @return boolean true, if the cache is ignore otherwise false
+   */
+  protected function ignore()
+  {
+    // ignore cache parameter? (only available in debug mode)
+    if (sfConfig::get('sf_debug') && $this->getContext()->getRequest()->getParameter('_sf_ignore_cache', false, 'symfony/request/sfWebRequest') == true)
+    {
+      if (sfConfig::get('sf_logging_enabled'))
+      {
+        $this->getContext()->getLogger()->info('{sfViewCacheManager} discard cache');
+      }
+
+      return true;
+    }
+
+    return false;
+  }
+
+  /**
+   * Sets the cache content
+   *
+   * @param string Data to put in the cache
+   * @param string Internal uniform resource identifier
+   *
+   * @return boolean true, if the data get set successfully otherwise false
+   */
+  public function set($data, $internalUri)
+  {
+    if (!$this->isCacheable($internalUri))
+    {
+      return false;
+    }
+
+    list($namespace, $id) = $this->generateNamespace($internalUri);
+
+    try
+    {
+      $ret = $this->cache->set($id, $namespace, $data);
+    }
+    catch (Exception $e)
+    {
+      return false;
+    }
+
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->context->getLogger()->info(sprintf('{sfViewCacheManager} save cache for "%s"', $internalUri));
+    }
+
+    return true;
+  }
+
+  /**
+   * Removes the cache for the current namespace.
+   *
+   * @param string Internal uniform resource identifier
+   *
+   * @return boolean true, if the remove happend otherwise false
+   */
+  public function remove($internalUri)
+  {
+    list($namespace, $id) = $this->generateNamespace($internalUri);
+
+    if (sfConfig::get('sf_logging_enabled'))
+    {
+      $this->context->getLogger()->info(sprintf('{sfViewCacheManager} remove cache for "%s"', $internalUri));
+    }
+
+    if ($this->cache->has($id, $namespace))
+    {
+      $this->cache->remove($id, $namespace);
+    }
+  }
+
+  /**
+   * Retrieves the last modified time.
+   *
+   * @param string Internal uniform resource identifier
+   *
+   * @return string Last modified datetime for the current namespace
+   */
+  public function lastModified($internalUri)
+  {
+    if (!$this->isCacheable($internalUri))
+    {
+      return null;
+    }
+
+    list($namespace, $id) = $this->generateNamespace($internalUri);
+
+    return $this->cache->lastModified($id, $namespace);
+  }
+
+  /**
+   * Starts the fragment cache.
+   *
+   * @param string Unique fragment name
+   * @param string Life time for the cache
+   * @param string Client life time for the cache
+   * @param array Vary options for the cache
+   *
+   * @return boolean true, if success otherwise false
+   */
+  public function start($name, $lifeTime, $clientLifeTime = null, $vary = array())
+  {
+    $internalUri = sfRouting::getInstance()->getCurrentInternalUri();
+
+    if (!$clientLifeTime)
+    {
+      $clientLifeTime = $lifeTime;
+    }
+
+    // add cache config to cache manager
+    list($route_name, $params) = $this->controller->convertUrlStringToParameters($internalUri);
+    $this->addCache($params['module'], $params['action'], array('withLayout' => false, 'lifeTime' => $lifeTime, 'clientLifeTime' => $clientLifeTime, 'vary' => $vary));
+
+    // get data from cache if available
+    $data = $this->get($internalUri.(strpos($internalUri, '?') ? '&' : '?').'_sf_cache_key='.$name);
+    if ($data !== null)
+    {
+      return $data;
+    }
+    else
+    {
+      ob_start();
+      ob_implicit_flush(0);
+
+      return null;
+    }
+  }
+
+  /**
+   * Stops the fragment cache.
+   *
+   * @param string Unique fragment name
+   *
+   * @return boolean true, if success otherwise false
+   */
+  public function stop($name)
+  {
+    $data = ob_get_clean();
+
+    // save content to cache
+    $internalUri = sfRouting::getInstance()->getCurrentInternalUri();
+    try
+    {
+      $this->set($data, $internalUri.(strpos($internalUri, '?') ? '&' : '?').'_sf_cache_key='.$name);
+    }
+    catch (Exception $e)
+    {
+    }
+
+    return $data;
+  }
+
+  /**
+   * Executes the shutdown procedure.
+   */
+  public function shutdown()
+  {
+  }
+}


Property changes on: prosistem/alba/trunk/dist/symfony-1.0.0/lib/view/sfViewCacheManager.class.php
___________________________________________________________________
Name: svn:keywords
   + "Id Author URL Date Rev"

Added: prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.Creole
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.Creole	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.Creole	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,506 @@
+	GNU LESSER GENERAL PUBLIC LICENSE
+	Version 2.1, February 1999
+
+	Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+	59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+	Everyone is permitted to copy and distribute verbatim copies
+	of this license document, but changing it is not allowed.
+
+	[This is the first released version of the Lesser GPL.  It also counts
+	as the successor of the GNU Library Public License, version 2, hence
+	the version number 2.1.]
+
+	Preamble
+
+	The licenses for most software are designed to take away your
+	freedom to share and change it.  By contrast, the GNU General Public
+	Licenses are intended to guarantee your freedom to share and change
+	free software--to make sure the software is free for all its users.
+
+	This license, the Lesser General Public License, applies to some
+	specially designated software packages--typically libraries--of the
+	Free Software Foundation and other authors who decide to use it.  You
+	can use it too, but we suggest you first think carefully about whether
+	this license or the ordinary General Public License is the better
+	strategy to use in any particular case, based on the explanations below.
+
+	When we speak of free software, we are referring to freedom of use,
+	not price.  Our General Public Licenses are designed to make sure that
+	you have the freedom to distribute copies of free software (and charge
+	for this service if you wish); that you receive source code or can get
+	it if you want it; that you can change the software and use pieces of
+	it in new free programs; and that you are informed that you can do
+	these things.
+
+	To protect your rights, we need to make restrictions that forbid
+	distributors to deny you these rights or to ask you to surrender these
+	rights.  These restrictions translate to certain responsibilities for
+	you if you distribute copies of the library or if you modify it.
+
+	For example, if you distribute copies of the library, whether gratis
+	or for a fee, you must give the recipients all the rights that we gave
+	you.  You must make sure that they, too, receive or can get the source
+	code.  If you link other code with the library, you must provide
+	complete object files to the recipients, so that they can relink them
+	with the library after making changes to the library and recompiling
+	it.  And you must show them these terms so they know their rights.
+
+	We protect your rights with a two-step method: (1) we copyright the
+	library, and (2) we offer you this license, which gives you legal
+	permission to copy, distribute and/or modify the library.
+
+	To protect each distributor, we want to make it very clear that
+	there is no warranty for the free library.  Also, if the library is
+	modified by someone else and passed on, the recipients should know
+	that what they have is not the original version, so that the original
+	author's reputation will not be affected by problems that might be
+	introduced by others.
+
+	Finally, software patents pose a constant threat to the existence of
+	any free program.  We wish to make sure that a company cannot
+	effectively restrict the users of a free program by obtaining a
+	restrictive license from a patent holder.  Therefore, we insist that
+	any patent license obtained for a version of the library must be
+	consistent with the full freedom of use specified in this license.
+
+	Most GNU software, including some libraries, is covered by the
+	ordinary GNU General Public License.  This license, the GNU Lesser
+	General Public License, applies to certain designated libraries, and
+	is quite different from the ordinary General Public License.  We use
+	this license for certain libraries in order to permit linking those
+	libraries into non-free programs.
+
+	When a program is linked with a library, whether statically or using
+	a shared library, the combination of the two is legally speaking a
+	combined work, a derivative of the original library.  The ordinary
+	General Public License therefore permits such linking only if the
+	entire combination fits its criteria of freedom.  The Lesser General
+	Public License permits more lax criteria for linking other code with
+	the library.
+
+	We call this license the "Lesser" General Public License because it
+	does Less to protect the user's freedom than the ordinary General
+	Public License.  It also provides other free software developers Less
+	of an advantage over competing non-free programs.  These disadvantages
+	are the reason we use the ordinary General Public License for many
+	libraries.  However, the Lesser license provides advantages in certain
+	special circumstances.
+
+	For example, on rare occasions, there may be a special need to
+	encourage the widest possible use of a certain library, so that it
+	becomes a de-facto standard.  To achieve this, non-free programs must be
+	allowed to use the library.  A more frequent case is that a free
+	library does the same job as widely used non-free libraries.  In this
+	case, there is little to gain by limiting the free library to free
+	software only, so we use the Lesser General Public License.
+
+	In other cases, permission to use a particular library in non-free
+	programs enables a greater number of people to use a large body of
+	free software.  For example, permission to use the GNU C Library in
+	non-free programs enables many more people to use the whole GNU
+	operating system, as well as its variant, the GNU/Linux operating
+	system.
+
+	Although the Lesser General Public License is Less protective of the
+	users' freedom, it does ensure that the user of a program that is
+	linked with the Library has the freedom and the wherewithal to run
+	that program using a modified version of the Library.
+
+	The precise terms and conditions for copying, distribution and
+	modification follow.  Pay close attention to the difference between a
+	"work based on the library" and a "work that uses the library".  The
+	former contains code derived from the library, whereas the latter must
+	be combined with the library in order to run.
+
+	GNU LESSER GENERAL PUBLIC LICENSE
+	TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+	0. This License Agreement applies to any software library or other
+	program which contains a notice placed by the copyright holder or
+	other authorized party saying it may be distributed under the terms of
+	this Lesser General Public License (also called "this License").
+	Each licensee is addressed as "you".
+
+	A "library" means a collection of software functions and/or data
+	prepared so as to be conveniently linked with application programs
+	(which use some of those functions and data) to form executables.
+
+	The "Library", below, refers to any such software library or work
+	which has been distributed under these terms.  A "work based on the
+	Library" means either the Library or any derivative work under
+	copyright law: that is to say, a work containing the Library or a
+	portion of it, either verbatim or with modifications and/or translated
+	straightforwardly into another language.  (Hereinafter, translation is
+	included without limitation in the term "modification".)
+
+	"Source code" for a work means the preferred form of the work for
+	making modifications to it.  For a library, complete source code means
+	all the source code for all modules it contains, plus any associated
+	interface definition files, plus the scripts used to control compilation
+	and installation of the library.
+
+	Activities other than copying, distribution and modification are not
+	covered by this License; they are outside its scope.  The act of
+	running a program using the Library is not restricted, and output from
+	such a program is covered only if its contents constitute a work based
+	on the Library (independent of the use of the Library in a tool for
+	writing it).  Whether that is true depends on what the Library does
+	and what the program that uses the Library does.
+
+	1. You may copy and distribute verbatim copies of the Library's
+	complete source code as you receive it, in any medium, provided that
+	you conspicuously and appropriately publish on each copy an
+	appropriate copyright notice and disclaimer of warranty; keep intact
+	all the notices that refer to this License and to the absence of any
+	warranty; and distribute a copy of this License along with the
+	Library.
+
+	You may charge a fee for the physical act of transferring a copy,
+	and you may at your option offer warranty protection in exchange for a
+	fee.
+
+	2. You may modify your copy or copies of the Library or any portion
+	of it, thus forming a work based on the Library, and copy and
+	distribute such modifications or work under the terms of Section 1
+	above, provided that you also meet all of these conditions:
+
+	a) The modified work must itself be a software library.
+
+	b) You must cause the files modified to carry prominent notices
+	stating that you changed the files and the date of any change.
+
+	c) You must cause the whole of the work to be licensed at no
+	charge to all third parties under the terms of this License.
+
+	d) If a facility in the modified Library refers to a function or a
+	table of data to be supplied by an application program that uses
+	the facility, other than as an argument passed when the facility
+	is invoked, then you must make a good faith effort to ensure that,
+	in the event an application does not supply such function or
+	table, the facility still operates, and performs whatever part of
+	its purpose remains meaningful.
+
+	(For example, a function in a library to compute square roots has
+	a purpose that is entirely well-defined independent of the
+	application.  Therefore, Subsection 2d requires that any
+	application-supplied function or table used by this function must
+	be optional: if the application does not supply it, the square
+	root function must still compute square roots.)
+
+	These requirements apply to the modified work as a whole.  If
+	identifiable sections of that work are not derived from the Library,
+	and can be reasonably considered independent and separate works in
+	themselves, then this License, and its terms, do not apply to those
+	sections when you distribute them as separate works.  But when you
+	distribute the same sections as part of a whole which is a work based
+	on the Library, the distribution of the whole must be on the terms of
+	this License, whose permissions for other licensees extend to the
+	entire whole, and thus to each and every part regardless of who wrote
+	it.
+
+	Thus, it is not the intent of this section to claim rights or contest
+	your rights to work written entirely by you; rather, the intent is to
+	exercise the right to control the distribution of derivative or
+	collective works based on the Library.
+
+	In addition, mere aggregation of another work not based on the Library
+	with the Library (or with a work based on the Library) on a volume of
+	a storage or distribution medium does not bring the other work under
+	the scope of this License.
+
+	3. You may opt to apply the terms of the ordinary GNU General Public
+	License instead of this License to a given copy of the Library.  To do
+	this, you must alter all the notices that refer to this License, so
+	that they refer to the ordinary GNU General Public License, version 2,
+	instead of to this License.  (If a newer version than version 2 of the
+	ordinary GNU General Public License has appeared, then you can specify
+	that version instead if you wish.)  Do not make any other change in
+	these notices.
+
+	Once this change is made in a given copy, it is irreversible for
+	that copy, so the ordinary GNU General Public License applies to all
+	subsequent copies and derivative works made from that copy.
+
+	This option is useful when you wish to copy part of the code of
+	the Library into a program that is not a library.
+
+	4. You may copy and distribute the Library (or a portion or
+	derivative of it, under Section 2) in object code or executable form
+	under the terms of Sections 1 and 2 above provided that you accompany
+	it with the complete corresponding machine-readable source code, which
+	must be distributed under the terms of Sections 1 and 2 above on a
+	medium customarily used for software interchange.
+
+	If distribution of object code is made by offering access to copy
+	from a designated place, then offering equivalent access to copy the
+	source code from the same place satisfies the requirement to
+	distribute the source code, even though third parties are not
+	compelled to copy the source along with the object code.
+
+	5. A program that contains no derivative of any portion of the
+	Library, but is designed to work with the Library by being compiled or
+	linked with it, is called a "work that uses the Library".  Such a
+	work, in isolation, is not a derivative work of the Library, and
+	therefore falls outside the scope of this License.
+
+	However, linking a "work that uses the Library" with the Library
+	creates an executable that is a derivative of the Library (because it
+	contains portions of the Library), rather than a "work that uses the
+	library".  The executable is therefore covered by this License.
+	Section 6 states terms for distribution of such executables.
+
+	When a "work that uses the Library" uses material from a header file
+	that is part of the Library, the object code for the work may be a
+	derivative work of the Library even though the source code is not.
+	Whether this is true is especially significant if the work can be
+	linked without the Library, or if the work is itself a library.  The
+	threshold for this to be true is not precisely defined by law.
+
+	If such an object file uses only numerical parameters, data
+	structure layouts and accessors, and small macros and small inline
+	functions (ten lines or less in length), then the use of the object
+	file is unrestricted, regardless of whether it is legally a derivative
+	work.  (Executables containing this object code plus portions of the
+	Library will still fall under Section 6.)
+
+	Otherwise, if the work is a derivative of the Library, you may
+	distribute the object code for the work under the terms of Section 6.
+	Any executables containing that work also fall under Section 6,
+	whether or not they are linked directly with the Library itself.
+
+	6. As an exception to the Sections above, you may also combine or
+	link a "work that uses the Library" with the Library to produce a
+	work containing portions of the Library, and distribute that work
+	under terms of your choice, provided that the terms permit
+	modification of the work for the customer's own use and reverse
+	engineering for debugging such modifications.
+
+	You must give prominent notice with each copy of the work that the
+	Library is used in it and that the Library and its use are covered by
+	this License.  You must supply a copy of this License.  If the work
+	during execution displays copyright notices, you must include the
+	copyright notice for the Library among them, as well as a reference
+	directing the user to the copy of this License.  Also, you must do one
+	of these things:
+
+	a) Accompany the work with the complete corresponding
+	machine-readable source code for the Library including whatever
+	changes were used in the work (which must be distributed under
+	Sections 1 and 2 above); and, if the work is an executable linked
+	with the Library, with the complete machine-readable "work that
+	uses the Library", as object code and/or source code, so that the
+	user can modify the Library and then relink to produce a modified
+	executable containing the modified Library.  (It is understood
+	that the user who changes the contents of definitions files in the
+	Library will not necessarily be able to recompile the application
+	to use the modified definitions.)
+
+	b) Use a suitable shared library mechanism for linking with the
+	Library.  A suitable mechanism is one that (1) uses at run time a
+	copy of the library already present on the user's computer system,
+	rather than copying library functions into the executable, and (2)
+	will operate properly with a modified version of the library, if
+	the user installs one, as long as the modified version is
+	interface-compatible with the version that the work was made with.
+
+	c) Accompany the work with a written offer, valid for at
+	least three years, to give the same user the materials
+	specified in Subsection 6a, above, for a charge no more
+	than the cost of performing this distribution.
+
+	d) If distribution of the work is made by offering access to copy
+	from a designated place, offer equivalent access to copy the above
+	specified materials from the same place.
+
+	e) Verify that the user has already received a copy of these
+	materials or that you have already sent this user a copy.
+
+	For an executable, the required form of the "work that uses the
+	Library" must include any data and utility programs needed for
+	reproducing the executable from it.  However, as a special exception,
+	the materials to be distributed need not include anything that is
+	normally distributed (in either source or binary form) with the major
+	components (compiler, kernel, and so on) of the operating system on
+	which the executable runs, unless that component itself accompanies
+	the executable.
+
+	It may happen that this requirement contradicts the license
+	restrictions of other proprietary libraries that do not normally
+	accompany the operating system.  Such a contradiction means you cannot
+	use both them and the Library together in an executable that you
+	distribute.
+
+	7. You may place library facilities that are a work based on the
+	Library side-by-side in a single library together with other library
+	facilities not covered by this License, and distribute such a combined
+	library, provided that the separate distribution of the work based on
+	the Library and of the other library facilities is otherwise
+	permitted, and provided that you do these two things:
+
+	a) Accompany the combined library with a copy of the same work
+	based on the Library, uncombined with any other library
+	facilities.  This must be distributed under the terms of the
+	Sections above.
+
+	b) Give prominent notice with the combined library of the fact
+	that part of it is a work based on the Library, and explaining
+	where to find the accompanying uncombined form of the same work.
+
+	8. You may not copy, modify, sublicense, link with, or distribute
+	the Library except as expressly provided under this License.  Any
+	attempt otherwise to copy, modify, sublicense, link with, or
+	distribute the Library is void, and will automatically terminate your
+	rights under this License.  However, parties who have received copies,
+	or rights, from you under this License will not have their licenses
+	terminated so long as such parties remain in full compliance.
+
+	9. You are not required to accept this License, since you have not
+	signed it.  However, nothing else grants you permission to modify or
+	distribute the Library or its derivative works.  These actions are
+	prohibited by law if you do not accept this License.  Therefore, by
+	modifying or distributing the Library (or any work based on the
+	Library), you indicate your acceptance of this License to do so, and
+	all its terms and conditions for copying, distributing or modifying
+	the Library or works based on it.
+
+	10. Each time you redistribute the Library (or any work based on the
+	Library), the recipient automatically receives a license from the
+	original licensor to copy, distribute, link with or modify the Library
+	subject to these terms and conditions.  You may not impose any further
+	restrictions on the recipients' exercise of the rights granted herein.
+	You are not responsible for enforcing compliance by third parties with
+	this License.
+
+	11. If, as a consequence of a court judgment or allegation of patent
+	infringement or for any other reason (not limited to patent issues),
+	conditions are imposed on you (whether by court order, agreement or
+	otherwise) that contradict the conditions of this License, they do not
+	excuse you from the conditions of this License.  If you cannot
+	distribute so as to satisfy simultaneously your obligations under this
+	License and any other pertinent obligations, then as a consequence you
+	may not distribute the Library at all.  For example, if a patent
+	license would not permit royalty-free redistribution of the Library by
+	all those who receive copies directly or indirectly through you, then
+	the only way you could satisfy both it and this License would be to
+	refrain entirely from distribution of the Library.
+
+	If any portion of this section is held invalid or unenforceable under any
+	particular circumstance, the balance of the section is intended to apply,
+	and the section as a whole is intended to apply in other circumstances.
+
+	It is not the purpose of this section to induce you to infringe any
+	patents or other property right claims or to contest validity of any
+	such claims; this section has the sole purpose of protecting the
+	integrity of the free software distribution system which is
+	implemented by public license practices.  Many people have made
+	generous contributions to the wide range of software distributed
+	through that system in reliance on consistent application of that
+	system; it is up to the author/donor to decide if he or she is willing
+	to distribute software through any other system and a licensee cannot
+	impose that choice.
+
+	This section is intended to make thoroughly clear what is believed to
+	be a consequence of the rest of this License.
+
+	12. If the distribution and/or use of the Library is restricted in
+	certain countries either by patents or by copyrighted interfaces, the
+	original copyright holder who places the Library under this License may
+	add an explicit geographical distribution limitation excluding those
+	countries, so that distribution is permitted only in or among countries
+	not thus excluded.  In such case, this License incorporates the
+	limitation as if written in the body of this License.
+
+	13. The Free Software Foundation may publish revised and/or new
+	versions of the Lesser General Public License from time to time.
+	Such new versions will be similar in spirit to the present version,
+	but may differ in detail to address new problems or concerns.
+
+	Each version is given a distinguishing version number.  If the Library
+	specifies a version number of this License which applies to it and
+	"any later version", you have the option of following the terms and
+	conditions either of that version or of any later version published by
+	the Free Software Foundation.  If the Library does not specify a
+	license version number, you may choose any version ever published by
+	the Free Software Foundation.
+
+	14. If you wish to incorporate parts of the Library into other free
+	programs whose distribution conditions are incompatible with these,
+	write to the author to ask for permission.  For software which is
+	copyrighted by the Free Software Foundation, write to the Free
+	Software Foundation; we sometimes make exceptions for this.  Our
+	decision will be guided by the two goals of preserving the free status
+	of all derivatives of our free software and of promoting the sharing
+	and reuse of software generally.
+
+	NO WARRANTY
+
+	15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+	WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+	EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+	OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+	KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+	PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+	LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+	THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+	16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+	WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+	AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+	FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+	CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+	LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+	RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+	FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+	SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+	DAMAGES.
+
+	END OF TERMS AND CONDITIONS
+
+	How to Apply These Terms to Your New Libraries
+
+	If you develop a new library, and you want it to be of the greatest
+	possible use to the public, we recommend making it free software that
+	everyone can redistribute and change.  You can do so by permitting
+	redistribution under these terms (or, alternatively, under the terms of the
+	ordinary General Public License).
+
+	To apply these terms, attach the following notices to the library.  It is
+	safest to attach them to the start of each source file to most effectively
+	convey the exclusion of warranty; and each file should have at least the
+	"copyright" line and a pointer to where the full notice is found.
+
+	<one line to give the library's name and a brief idea of what it does.>
+	Copyright (C) <year>  <name of author>
+
+	This library is free software; you can redistribute it and/or
+	modify it under the terms of the GNU Lesser General Public
+	License as published by the Free Software Foundation; either
+	version 2.1 of the License, or (at your option) any later version.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+	Lesser General Public License for more details.
+
+	You should have received a copy of the GNU Lesser General Public
+	License along with this library; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+	Also add information on how to contact you by electronic and paper mail.
+
+	You should also get your employer (if you work as a programmer) or your
+	school, if any, to sign a "copyright disclaimer" for the library, if
+	necessary.  Here is a sample; alter the names:
+
+	Yoyodyne, Inc., hereby disclaims all copyright interest in the
+	library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+	<signature of Ty Coon>, 1 April 1990
+	Ty Coon, President of Vice
+
+	That's all there is to it!
+
+  --$Id: LICENSE,v 1.1 2004/03/20 03:53:46 hlellelid Exp $
+
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.ICU
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.ICU	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.ICU	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,35 @@
+ICU License - ICU 1.8.1 and later
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1995-2005 International Business Machines Corporation and others
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+--------------------------------------------------------------------------------
+All trademarks and registered trademarks mentioned herein are the property of their respective owners.
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.PHPMailer
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.PHPMailer	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.PHPMailer	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,504 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.Propel
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.Propel	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.Propel	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,506 @@
+	GNU LESSER GENERAL PUBLIC LICENSE
+	Version 2.1, February 1999
+
+	Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+	59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+	Everyone is permitted to copy and distribute verbatim copies
+	of this license document, but changing it is not allowed.
+
+	[This is the first released version of the Lesser GPL.  It also counts
+	as the successor of the GNU Library Public License, version 2, hence
+	the version number 2.1.]
+
+	Preamble
+
+	The licenses for most software are designed to take away your
+	freedom to share and change it.  By contrast, the GNU General Public
+	Licenses are intended to guarantee your freedom to share and change
+	free software--to make sure the software is free for all its users.
+
+	This license, the Lesser General Public License, applies to some
+	specially designated software packages--typically libraries--of the
+	Free Software Foundation and other authors who decide to use it.  You
+	can use it too, but we suggest you first think carefully about whether
+	this license or the ordinary General Public License is the better
+	strategy to use in any particular case, based on the explanations below.
+
+	When we speak of free software, we are referring to freedom of use,
+	not price.  Our General Public Licenses are designed to make sure that
+	you have the freedom to distribute copies of free software (and charge
+	for this service if you wish); that you receive source code or can get
+	it if you want it; that you can change the software and use pieces of
+	it in new free programs; and that you are informed that you can do
+	these things.
+
+	To protect your rights, we need to make restrictions that forbid
+	distributors to deny you these rights or to ask you to surrender these
+	rights.  These restrictions translate to certain responsibilities for
+	you if you distribute copies of the library or if you modify it.
+
+	For example, if you distribute copies of the library, whether gratis
+	or for a fee, you must give the recipients all the rights that we gave
+	you.  You must make sure that they, too, receive or can get the source
+	code.  If you link other code with the library, you must provide
+	complete object files to the recipients, so that they can relink them
+	with the library after making changes to the library and recompiling
+	it.  And you must show them these terms so they know their rights.
+
+	We protect your rights with a two-step method: (1) we copyright the
+	library, and (2) we offer you this license, which gives you legal
+	permission to copy, distribute and/or modify the library.
+
+	To protect each distributor, we want to make it very clear that
+	there is no warranty for the free library.  Also, if the library is
+	modified by someone else and passed on, the recipients should know
+	that what they have is not the original version, so that the original
+	author's reputation will not be affected by problems that might be
+	introduced by others.
+
+	Finally, software patents pose a constant threat to the existence of
+	any free program.  We wish to make sure that a company cannot
+	effectively restrict the users of a free program by obtaining a
+	restrictive license from a patent holder.  Therefore, we insist that
+	any patent license obtained for a version of the library must be
+	consistent with the full freedom of use specified in this license.
+
+	Most GNU software, including some libraries, is covered by the
+	ordinary GNU General Public License.  This license, the GNU Lesser
+	General Public License, applies to certain designated libraries, and
+	is quite different from the ordinary General Public License.  We use
+	this license for certain libraries in order to permit linking those
+	libraries into non-free programs.
+
+	When a program is linked with a library, whether statically or using
+	a shared library, the combination of the two is legally speaking a
+	combined work, a derivative of the original library.  The ordinary
+	General Public License therefore permits such linking only if the
+	entire combination fits its criteria of freedom.  The Lesser General
+	Public License permits more lax criteria for linking other code with
+	the library.
+
+	We call this license the "Lesser" General Public License because it
+	does Less to protect the user's freedom than the ordinary General
+	Public License.  It also provides other free software developers Less
+	of an advantage over competing non-free programs.  These disadvantages
+	are the reason we use the ordinary General Public License for many
+	libraries.  However, the Lesser license provides advantages in certain
+	special circumstances.
+
+	For example, on rare occasions, there may be a special need to
+	encourage the widest possible use of a certain library, so that it
+	becomes a de-facto standard.  To achieve this, non-free programs must be
+	allowed to use the library.  A more frequent case is that a free
+	library does the same job as widely used non-free libraries.  In this
+	case, there is little to gain by limiting the free library to free
+	software only, so we use the Lesser General Public License.
+
+	In other cases, permission to use a particular library in non-free
+	programs enables a greater number of people to use a large body of
+	free software.  For example, permission to use the GNU C Library in
+	non-free programs enables many more people to use the whole GNU
+	operating system, as well as its variant, the GNU/Linux operating
+	system.
+
+	Although the Lesser General Public License is Less protective of the
+	users' freedom, it does ensure that the user of a program that is
+	linked with the Library has the freedom and the wherewithal to run
+	that program using a modified version of the Library.
+
+	The precise terms and conditions for copying, distribution and
+	modification follow.  Pay close attention to the difference between a
+	"work based on the library" and a "work that uses the library".  The
+	former contains code derived from the library, whereas the latter must
+	be combined with the library in order to run.
+
+	GNU LESSER GENERAL PUBLIC LICENSE
+	TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+	0. This License Agreement applies to any software library or other
+	program which contains a notice placed by the copyright holder or
+	other authorized party saying it may be distributed under the terms of
+	this Lesser General Public License (also called "this License").
+	Each licensee is addressed as "you".
+
+	A "library" means a collection of software functions and/or data
+	prepared so as to be conveniently linked with application programs
+	(which use some of those functions and data) to form executables.
+
+	The "Library", below, refers to any such software library or work
+	which has been distributed under these terms.  A "work based on the
+	Library" means either the Library or any derivative work under
+	copyright law: that is to say, a work containing the Library or a
+	portion of it, either verbatim or with modifications and/or translated
+	straightforwardly into another language.  (Hereinafter, translation is
+	included without limitation in the term "modification".)
+
+	"Source code" for a work means the preferred form of the work for
+	making modifications to it.  For a library, complete source code means
+	all the source code for all modules it contains, plus any associated
+	interface definition files, plus the scripts used to control compilation
+	and installation of the library.
+
+	Activities other than copying, distribution and modification are not
+	covered by this License; they are outside its scope.  The act of
+	running a program using the Library is not restricted, and output from
+	such a program is covered only if its contents constitute a work based
+	on the Library (independent of the use of the Library in a tool for
+	writing it).  Whether that is true depends on what the Library does
+	and what the program that uses the Library does.
+
+	1. You may copy and distribute verbatim copies of the Library's
+	complete source code as you receive it, in any medium, provided that
+	you conspicuously and appropriately publish on each copy an
+	appropriate copyright notice and disclaimer of warranty; keep intact
+	all the notices that refer to this License and to the absence of any
+	warranty; and distribute a copy of this License along with the
+	Library.
+
+	You may charge a fee for the physical act of transferring a copy,
+	and you may at your option offer warranty protection in exchange for a
+	fee.
+
+	2. You may modify your copy or copies of the Library or any portion
+	of it, thus forming a work based on the Library, and copy and
+	distribute such modifications or work under the terms of Section 1
+	above, provided that you also meet all of these conditions:
+
+	a) The modified work must itself be a software library.
+
+	b) You must cause the files modified to carry prominent notices
+	stating that you changed the files and the date of any change.
+
+	c) You must cause the whole of the work to be licensed at no
+	charge to all third parties under the terms of this License.
+
+	d) If a facility in the modified Library refers to a function or a
+	table of data to be supplied by an application program that uses
+	the facility, other than as an argument passed when the facility
+	is invoked, then you must make a good faith effort to ensure that,
+	in the event an application does not supply such function or
+	table, the facility still operates, and performs whatever part of
+	its purpose remains meaningful.
+
+	(For example, a function in a library to compute square roots has
+	a purpose that is entirely well-defined independent of the
+	application.  Therefore, Subsection 2d requires that any
+	application-supplied function or table used by this function must
+	be optional: if the application does not supply it, the square
+	root function must still compute square roots.)
+
+	These requirements apply to the modified work as a whole.  If
+	identifiable sections of that work are not derived from the Library,
+	and can be reasonably considered independent and separate works in
+	themselves, then this License, and its terms, do not apply to those
+	sections when you distribute them as separate works.  But when you
+	distribute the same sections as part of a whole which is a work based
+	on the Library, the distribution of the whole must be on the terms of
+	this License, whose permissions for other licensees extend to the
+	entire whole, and thus to each and every part regardless of who wrote
+	it.
+
+	Thus, it is not the intent of this section to claim rights or contest
+	your rights to work written entirely by you; rather, the intent is to
+	exercise the right to control the distribution of derivative or
+	collective works based on the Library.
+
+	In addition, mere aggregation of another work not based on the Library
+	with the Library (or with a work based on the Library) on a volume of
+	a storage or distribution medium does not bring the other work under
+	the scope of this License.
+
+	3. You may opt to apply the terms of the ordinary GNU General Public
+	License instead of this License to a given copy of the Library.  To do
+	this, you must alter all the notices that refer to this License, so
+	that they refer to the ordinary GNU General Public License, version 2,
+	instead of to this License.  (If a newer version than version 2 of the
+	ordinary GNU General Public License has appeared, then you can specify
+	that version instead if you wish.)  Do not make any other change in
+	these notices.
+
+	Once this change is made in a given copy, it is irreversible for
+	that copy, so the ordinary GNU General Public License applies to all
+	subsequent copies and derivative works made from that copy.
+
+	This option is useful when you wish to copy part of the code of
+	the Library into a program that is not a library.
+
+	4. You may copy and distribute the Library (or a portion or
+	derivative of it, under Section 2) in object code or executable form
+	under the terms of Sections 1 and 2 above provided that you accompany
+	it with the complete corresponding machine-readable source code, which
+	must be distributed under the terms of Sections 1 and 2 above on a
+	medium customarily used for software interchange.
+
+	If distribution of object code is made by offering access to copy
+	from a designated place, then offering equivalent access to copy the
+	source code from the same place satisfies the requirement to
+	distribute the source code, even though third parties are not
+	compelled to copy the source along with the object code.
+
+	5. A program that contains no derivative of any portion of the
+	Library, but is designed to work with the Library by being compiled or
+	linked with it, is called a "work that uses the Library".  Such a
+	work, in isolation, is not a derivative work of the Library, and
+	therefore falls outside the scope of this License.
+
+	However, linking a "work that uses the Library" with the Library
+	creates an executable that is a derivative of the Library (because it
+	contains portions of the Library), rather than a "work that uses the
+	library".  The executable is therefore covered by this License.
+	Section 6 states terms for distribution of such executables.
+
+	When a "work that uses the Library" uses material from a header file
+	that is part of the Library, the object code for the work may be a
+	derivative work of the Library even though the source code is not.
+	Whether this is true is especially significant if the work can be
+	linked without the Library, or if the work is itself a library.  The
+	threshold for this to be true is not precisely defined by law.
+
+	If such an object file uses only numerical parameters, data
+	structure layouts and accessors, and small macros and small inline
+	functions (ten lines or less in length), then the use of the object
+	file is unrestricted, regardless of whether it is legally a derivative
+	work.  (Executables containing this object code plus portions of the
+	Library will still fall under Section 6.)
+
+	Otherwise, if the work is a derivative of the Library, you may
+	distribute the object code for the work under the terms of Section 6.
+	Any executables containing that work also fall under Section 6,
+	whether or not they are linked directly with the Library itself.
+
+	6. As an exception to the Sections above, you may also combine or
+	link a "work that uses the Library" with the Library to produce a
+	work containing portions of the Library, and distribute that work
+	under terms of your choice, provided that the terms permit
+	modification of the work for the customer's own use and reverse
+	engineering for debugging such modifications.
+
+	You must give prominent notice with each copy of the work that the
+	Library is used in it and that the Library and its use are covered by
+	this License.  You must supply a copy of this License.  If the work
+	during execution displays copyright notices, you must include the
+	copyright notice for the Library among them, as well as a reference
+	directing the user to the copy of this License.  Also, you must do one
+	of these things:
+
+	a) Accompany the work with the complete corresponding
+	machine-readable source code for the Library including whatever
+	changes were used in the work (which must be distributed under
+	Sections 1 and 2 above); and, if the work is an executable linked
+	with the Library, with the complete machine-readable "work that
+	uses the Library", as object code and/or source code, so that the
+	user can modify the Library and then relink to produce a modified
+	executable containing the modified Library.  (It is understood
+	that the user who changes the contents of definitions files in the
+	Library will not necessarily be able to recompile the application
+	to use the modified definitions.)
+
+	b) Use a suitable shared library mechanism for linking with the
+	Library.  A suitable mechanism is one that (1) uses at run time a
+	copy of the library already present on the user's computer system,
+	rather than copying library functions into the executable, and (2)
+	will operate properly with a modified version of the library, if
+	the user installs one, as long as the modified version is
+	interface-compatible with the version that the work was made with.
+
+	c) Accompany the work with a written offer, valid for at
+	least three years, to give the same user the materials
+	specified in Subsection 6a, above, for a charge no more
+	than the cost of performing this distribution.
+
+	d) If distribution of the work is made by offering access to copy
+	from a designated place, offer equivalent access to copy the above
+	specified materials from the same place.
+
+	e) Verify that the user has already received a copy of these
+	materials or that you have already sent this user a copy.
+
+	For an executable, the required form of the "work that uses the
+	Library" must include any data and utility programs needed for
+	reproducing the executable from it.  However, as a special exception,
+	the materials to be distributed need not include anything that is
+	normally distributed (in either source or binary form) with the major
+	components (compiler, kernel, and so on) of the operating system on
+	which the executable runs, unless that component itself accompanies
+	the executable.
+
+	It may happen that this requirement contradicts the license
+	restrictions of other proprietary libraries that do not normally
+	accompany the operating system.  Such a contradiction means you cannot
+	use both them and the Library together in an executable that you
+	distribute.
+
+	7. You may place library facilities that are a work based on the
+	Library side-by-side in a single library together with other library
+	facilities not covered by this License, and distribute such a combined
+	library, provided that the separate distribution of the work based on
+	the Library and of the other library facilities is otherwise
+	permitted, and provided that you do these two things:
+
+	a) Accompany the combined library with a copy of the same work
+	based on the Library, uncombined with any other library
+	facilities.  This must be distributed under the terms of the
+	Sections above.
+
+	b) Give prominent notice with the combined library of the fact
+	that part of it is a work based on the Library, and explaining
+	where to find the accompanying uncombined form of the same work.
+
+	8. You may not copy, modify, sublicense, link with, or distribute
+	the Library except as expressly provided under this License.  Any
+	attempt otherwise to copy, modify, sublicense, link with, or
+	distribute the Library is void, and will automatically terminate your
+	rights under this License.  However, parties who have received copies,
+	or rights, from you under this License will not have their licenses
+	terminated so long as such parties remain in full compliance.
+
+	9. You are not required to accept this License, since you have not
+	signed it.  However, nothing else grants you permission to modify or
+	distribute the Library or its derivative works.  These actions are
+	prohibited by law if you do not accept this License.  Therefore, by
+	modifying or distributing the Library (or any work based on the
+	Library), you indicate your acceptance of this License to do so, and
+	all its terms and conditions for copying, distributing or modifying
+	the Library or works based on it.
+
+	10. Each time you redistribute the Library (or any work based on the
+	Library), the recipient automatically receives a license from the
+	original licensor to copy, distribute, link with or modify the Library
+	subject to these terms and conditions.  You may not impose any further
+	restrictions on the recipients' exercise of the rights granted herein.
+	You are not responsible for enforcing compliance by third parties with
+	this License.
+
+	11. If, as a consequence of a court judgment or allegation of patent
+	infringement or for any other reason (not limited to patent issues),
+	conditions are imposed on you (whether by court order, agreement or
+	otherwise) that contradict the conditions of this License, they do not
+	excuse you from the conditions of this License.  If you cannot
+	distribute so as to satisfy simultaneously your obligations under this
+	License and any other pertinent obligations, then as a consequence you
+	may not distribute the Library at all.  For example, if a patent
+	license would not permit royalty-free redistribution of the Library by
+	all those who receive copies directly or indirectly through you, then
+	the only way you could satisfy both it and this License would be to
+	refrain entirely from distribution of the Library.
+
+	If any portion of this section is held invalid or unenforceable under any
+	particular circumstance, the balance of the section is intended to apply,
+	and the section as a whole is intended to apply in other circumstances.
+
+	It is not the purpose of this section to induce you to infringe any
+	patents or other property right claims or to contest validity of any
+	such claims; this section has the sole purpose of protecting the
+	integrity of the free software distribution system which is
+	implemented by public license practices.  Many people have made
+	generous contributions to the wide range of software distributed
+	through that system in reliance on consistent application of that
+	system; it is up to the author/donor to decide if he or she is willing
+	to distribute software through any other system and a licensee cannot
+	impose that choice.
+
+	This section is intended to make thoroughly clear what is believed to
+	be a consequence of the rest of this License.
+
+	12. If the distribution and/or use of the Library is restricted in
+	certain countries either by patents or by copyrighted interfaces, the
+	original copyright holder who places the Library under this License may
+	add an explicit geographical distribution limitation excluding those
+	countries, so that distribution is permitted only in or among countries
+	not thus excluded.  In such case, this License incorporates the
+	limitation as if written in the body of this License.
+
+	13. The Free Software Foundation may publish revised and/or new
+	versions of the Lesser General Public License from time to time.
+	Such new versions will be similar in spirit to the present version,
+	but may differ in detail to address new problems or concerns.
+
+	Each version is given a distinguishing version number.  If the Library
+	specifies a version number of this License which applies to it and
+	"any later version", you have the option of following the terms and
+	conditions either of that version or of any later version published by
+	the Free Software Foundation.  If the Library does not specify a
+	license version number, you may choose any version ever published by
+	the Free Software Foundation.
+
+	14. If you wish to incorporate parts of the Library into other free
+	programs whose distribution conditions are incompatible with these,
+	write to the author to ask for permission.  For software which is
+	copyrighted by the Free Software Foundation, write to the Free
+	Software Foundation; we sometimes make exceptions for this.  Our
+	decision will be guided by the two goals of preserving the free status
+	of all derivatives of our free software and of promoting the sharing
+	and reuse of software generally.
+
+	NO WARRANTY
+
+	15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+	WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+	EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+	OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+	KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+	PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+	LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+	THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+	16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+	WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+	AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+	FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+	CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+	LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+	RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+	FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+	SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+	DAMAGES.
+
+	END OF TERMS AND CONDITIONS
+
+	How to Apply These Terms to Your New Libraries
+
+	If you develop a new library, and you want it to be of the greatest
+	possible use to the public, we recommend making it free software that
+	everyone can redistribute and change.  You can do so by permitting
+	redistribution under these terms (or, alternatively, under the terms of the
+	ordinary General Public License).
+
+	To apply these terms, attach the following notices to the library.  It is
+	safest to attach them to the start of each source file to most effectively
+	convey the exclusion of warranty; and each file should have at least the
+	"copyright" line and a pointer to where the full notice is found.
+
+	<one line to give the library's name and a brief idea of what it does.>
+	Copyright (C) <year>  <name of author>
+
+	This library is free software; you can redistribute it and/or
+	modify it under the terms of the GNU Lesser General Public
+	License as published by the Free Software Foundation; either
+	version 2.1 of the License, or (at your option) any later version.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+	Lesser General Public License for more details.
+
+	You should have received a copy of the GNU Lesser General Public
+	License along with this library; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+	Also add information on how to contact you by electronic and paper mail.
+
+	You should also get your employer (if you work as a programmer) or your
+	school, if any, to sign a "copyright disclaimer" for the library, if
+	necessary.  Here is a sample; alter the names:
+
+	Yoyodyne, Inc., hereby disclaims all copyright interest in the
+	library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+	<signature of Ty Coon>, 1 April 1990
+	Ty Coon, President of Vice
+
+	That's all there is to it!
+
+  --$Id: LICENSE,v 1.1 2004/07/14 02:18:14 hlellelid Exp $
+
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.lime
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.lime	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.lime	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,7 @@
+Copyright (c) 2004-2006 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.pake
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.pake	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.pake	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,7 @@
+Copyright (c) 2004-2006 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.phing
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.phing	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.phing	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,1042 @@
+                         _________________________
+
+                         P     H     I     N     G
+
+
+
+
+
+  Please, be sure to read the license header on any one of the phing core
+
+  files. It explains the licensing scheme.
+
+
+
+  Some files in phing are Perl Artistic, Apache, BSD, or just free. See
+
+  "CREDITS" for a list.
+
+
+
+  We've included a copy of the LGPL for convenience.
+
+
+
+
+
+  LGPL LICENSE
+
+  ------------
+
+
+
+	GNU LESSER GENERAL PUBLIC LICENSE
+
+	Version 2.1, February 1999
+
+
+
+	Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+
+	59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+	Everyone is permitted to copy and distribute verbatim copies
+
+	of this license document, but changing it is not allowed.
+
+
+
+	[This is the first released version of the Lesser GPL.  It also counts
+
+	as the successor of the GNU Library Public License, version 2, hence
+
+	the version number 2.1.]
+
+
+
+	Preamble
+
+
+
+	The licenses for most software are designed to take away your
+
+	freedom to share and change it.  By contrast, the GNU General Public
+
+	Licenses are intended to guarantee your freedom to share and change
+
+	free software--to make sure the software is free for all its users.
+
+
+
+	This license, the Lesser General Public License, applies to some
+
+	specially designated software packages--typically libraries--of the
+
+	Free Software Foundation and other authors who decide to use it.  You
+
+	can use it too, but we suggest you first think carefully about whether
+
+	this license or the ordinary General Public License is the better
+
+	strategy to use in any particular case, based on the explanations below.
+
+
+
+	When we speak of free software, we are referring to freedom of use,
+
+	not price.  Our General Public Licenses are designed to make sure that
+
+	you have the freedom to distribute copies of free software (and charge
+
+	for this service if you wish); that you receive source code or can get
+
+	it if you want it; that you can change the software and use pieces of
+
+	it in new free programs; and that you are informed that you can do
+
+	these things.
+
+
+
+	To protect your rights, we need to make restrictions that forbid
+
+	distributors to deny you these rights or to ask you to surrender these
+
+	rights.  These restrictions translate to certain responsibilities for
+
+	you if you distribute copies of the library or if you modify it.
+
+
+
+	For example, if you distribute copies of the library, whether gratis
+
+	or for a fee, you must give the recipients all the rights that we gave
+
+	you.  You must make sure that they, too, receive or can get the source
+
+	code.  If you link other code with the library, you must provide
+
+	complete object files to the recipients, so that they can relink them
+
+	with the library after making changes to the library and recompiling
+
+	it.  And you must show them these terms so they know their rights.
+
+
+
+	We protect your rights with a two-step method: (1) we copyright the
+
+	library, and (2) we offer you this license, which gives you legal
+
+	permission to copy, distribute and/or modify the library.
+
+
+
+	To protect each distributor, we want to make it very clear that
+
+	there is no warranty for the free library.  Also, if the library is
+
+	modified by someone else and passed on, the recipients should know
+
+	that what they have is not the original version, so that the original
+
+	author's reputation will not be affected by problems that might be
+
+	introduced by others.
+
+
+
+	Finally, software patents pose a constant threat to the existence of
+
+	any free program.  We wish to make sure that a company cannot
+
+	effectively restrict the users of a free program by obtaining a
+
+	restrictive license from a patent holder.  Therefore, we insist that
+
+	any patent license obtained for a version of the library must be
+
+	consistent with the full freedom of use specified in this license.
+
+
+
+	Most GNU software, including some libraries, is covered by the
+
+	ordinary GNU General Public License.  This license, the GNU Lesser
+
+	General Public License, applies to certain designated libraries, and
+
+	is quite different from the ordinary General Public License.  We use
+
+	this license for certain libraries in order to permit linking those
+
+	libraries into non-free programs.
+
+
+
+	When a program is linked with a library, whether statically or using
+
+	a shared library, the combination of the two is legally speaking a
+
+	combined work, a derivative of the original library.  The ordinary
+
+	General Public License therefore permits such linking only if the
+
+	entire combination fits its criteria of freedom.  The Lesser General
+
+	Public License permits more lax criteria for linking other code with
+
+	the library.
+
+
+
+	We call this license the "Lesser" General Public License because it
+
+	does Less to protect the user's freedom than the ordinary General
+
+	Public License.  It also provides other free software developers Less
+
+	of an advantage over competing non-free programs.  These disadvantages
+
+	are the reason we use the ordinary General Public License for many
+
+	libraries.  However, the Lesser license provides advantages in certain
+
+	special circumstances.
+
+
+
+	For example, on rare occasions, there may be a special need to
+
+	encourage the widest possible use of a certain library, so that it
+
+	becomes a de-facto standard.  To achieve this, non-free programs must be
+
+	allowed to use the library.  A more frequent case is that a free
+
+	library does the same job as widely used non-free libraries.  In this
+
+	case, there is little to gain by limiting the free library to free
+
+	software only, so we use the Lesser General Public License.
+
+
+
+	In other cases, permission to use a particular library in non-free
+
+	programs enables a greater number of people to use a large body of
+
+	free software.  For example, permission to use the GNU C Library in
+
+	non-free programs enables many more people to use the whole GNU
+
+	operating system, as well as its variant, the GNU/Linux operating
+
+	system.
+
+
+
+	Although the Lesser General Public License is Less protective of the
+
+	users' freedom, it does ensure that the user of a program that is
+
+	linked with the Library has the freedom and the wherewithal to run
+
+	that program using a modified version of the Library.
+
+
+
+	The precise terms and conditions for copying, distribution and
+
+	modification follow.  Pay close attention to the difference between a
+
+	"work based on the library" and a "work that uses the library".  The
+
+	former contains code derived from the library, whereas the latter must
+
+	be combined with the library in order to run.
+
+
+
+	GNU LESSER GENERAL PUBLIC LICENSE
+
+	TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+
+
+	0. This License Agreement applies to any software library or other
+
+	program which contains a notice placed by the copyright holder or
+
+	other authorized party saying it may be distributed under the terms of
+
+	this Lesser General Public License (also called "this License").
+
+	Each licensee is addressed as "you".
+
+
+
+	A "library" means a collection of software functions and/or data
+
+	prepared so as to be conveniently linked with application programs
+
+	(which use some of those functions and data) to form executables.
+
+
+
+	The "Library", below, refers to any such software library or work
+
+	which has been distributed under these terms.  A "work based on the
+
+	Library" means either the Library or any derivative work under
+
+	copyright law: that is to say, a work containing the Library or a
+
+	portion of it, either verbatim or with modifications and/or translated
+
+	straightforwardly into another language.  (Hereinafter, translation is
+
+	included without limitation in the term "modification".)
+
+
+
+	"Source code" for a work means the preferred form of the work for
+
+	making modifications to it.  For a library, complete source code means
+
+	all the source code for all modules it contains, plus any associated
+
+	interface definition files, plus the scripts used to control compilation
+
+	and installation of the library.
+
+
+
+	Activities other than copying, distribution and modification are not
+
+	covered by this License; they are outside its scope.  The act of
+
+	running a program using the Library is not restricted, and output from
+
+	such a program is covered only if its contents constitute a work based
+
+	on the Library (independent of the use of the Library in a tool for
+
+	writing it).  Whether that is true depends on what the Library does
+
+	and what the program that uses the Library does.
+
+
+
+	1. You may copy and distribute verbatim copies of the Library's
+
+	complete source code as you receive it, in any medium, provided that
+
+	you conspicuously and appropriately publish on each copy an
+
+	appropriate copyright notice and disclaimer of warranty; keep intact
+
+	all the notices that refer to this License and to the absence of any
+
+	warranty; and distribute a copy of this License along with the
+
+	Library.
+
+
+
+	You may charge a fee for the physical act of transferring a copy,
+
+	and you may at your option offer warranty protection in exchange for a
+
+	fee.
+
+
+
+	2. You may modify your copy or copies of the Library or any portion
+
+	of it, thus forming a work based on the Library, and copy and
+
+	distribute such modifications or work under the terms of Section 1
+
+	above, provided that you also meet all of these conditions:
+
+
+
+	a) The modified work must itself be a software library.
+
+
+
+	b) You must cause the files modified to carry prominent notices
+
+	stating that you changed the files and the date of any change.
+
+
+
+	c) You must cause the whole of the work to be licensed at no
+
+	charge to all third parties under the terms of this License.
+
+
+
+	d) If a facility in the modified Library refers to a function or a
+
+	table of data to be supplied by an application program that uses
+
+	the facility, other than as an argument passed when the facility
+
+	is invoked, then you must make a good faith effort to ensure that,
+
+	in the event an application does not supply such function or
+
+	table, the facility still operates, and performs whatever part of
+
+	its purpose remains meaningful.
+
+
+
+	(For example, a function in a library to compute square roots has
+
+	a purpose that is entirely well-defined independent of the
+
+	application.  Therefore, Subsection 2d requires that any
+
+	application-supplied function or table used by this function must
+
+	be optional: if the application does not supply it, the square
+
+	root function must still compute square roots.)
+
+
+
+	These requirements apply to the modified work as a whole.  If
+
+	identifiable sections of that work are not derived from the Library,
+
+	and can be reasonably considered independent and separate works in
+
+	themselves, then this License, and its terms, do not apply to those
+
+	sections when you distribute them as separate works.  But when you
+
+	distribute the same sections as part of a whole which is a work based
+
+	on the Library, the distribution of the whole must be on the terms of
+
+	this License, whose permissions for other licensees extend to the
+
+	entire whole, and thus to each and every part regardless of who wrote
+
+	it.
+
+
+
+	Thus, it is not the intent of this section to claim rights or contest
+
+	your rights to work written entirely by you; rather, the intent is to
+
+	exercise the right to control the distribution of derivative or
+
+	collective works based on the Library.
+
+
+
+	In addition, mere aggregation of another work not based on the Library
+
+	with the Library (or with a work based on the Library) on a volume of
+
+	a storage or distribution medium does not bring the other work under
+
+	the scope of this License.
+
+
+
+	3. You may opt to apply the terms of the ordinary GNU General Public
+
+	License instead of this License to a given copy of the Library.  To do
+
+	this, you must alter all the notices that refer to this License, so
+
+	that they refer to the ordinary GNU General Public License, version 2,
+
+	instead of to this License.  (If a newer version than version 2 of the
+
+	ordinary GNU General Public License has appeared, then you can specify
+
+	that version instead if you wish.)  Do not make any other change in
+
+	these notices.
+
+
+
+	Once this change is made in a given copy, it is irreversible for
+
+	that copy, so the ordinary GNU General Public License applies to all
+
+	subsequent copies and derivative works made from that copy.
+
+
+
+	This option is useful when you wish to copy part of the code of
+
+	the Library into a program that is not a library.
+
+
+
+	4. You may copy and distribute the Library (or a portion or
+
+	derivative of it, under Section 2) in object code or executable form
+
+	under the terms of Sections 1 and 2 above provided that you accompany
+
+	it with the complete corresponding machine-readable source code, which
+
+	must be distributed under the terms of Sections 1 and 2 above on a
+
+	medium customarily used for software interchange.
+
+
+
+	If distribution of object code is made by offering access to copy
+
+	from a designated place, then offering equivalent access to copy the
+
+	source code from the same place satisfies the requirement to
+
+	distribute the source code, even though third parties are not
+
+	compelled to copy the source along with the object code.
+
+
+
+	5. A program that contains no derivative of any portion of the
+
+	Library, but is designed to work with the Library by being compiled or
+
+	linked with it, is called a "work that uses the Library".  Such a
+
+	work, in isolation, is not a derivative work of the Library, and
+
+	therefore falls outside the scope of this License.
+
+
+
+	However, linking a "work that uses the Library" with the Library
+
+	creates an executable that is a derivative of the Library (because it
+
+	contains portions of the Library), rather than a "work that uses the
+
+	library".  The executable is therefore covered by this License.
+
+	Section 6 states terms for distribution of such executables.
+
+
+
+	When a "work that uses the Library" uses material from a header file
+
+	that is part of the Library, the object code for the work may be a
+
+	derivative work of the Library even though the source code is not.
+
+	Whether this is true is especially significant if the work can be
+
+	linked without the Library, or if the work is itself a library.  The
+
+	threshold for this to be true is not precisely defined by law.
+
+
+
+	If such an object file uses only numerical parameters, data
+
+	structure layouts and accessors, and small macros and small inline
+
+	functions (ten lines or less in length), then the use of the object
+
+	file is unrestricted, regardless of whether it is legally a derivative
+
+	work.  (Executables containing this object code plus portions of the
+
+	Library will still fall under Section 6.)
+
+
+
+	Otherwise, if the work is a derivative of the Library, you may
+
+	distribute the object code for the work under the terms of Section 6.
+
+	Any executables containing that work also fall under Section 6,
+
+	whether or not they are linked directly with the Library itself.
+
+
+
+	6. As an exception to the Sections above, you may also combine or
+
+	link a "work that uses the Library" with the Library to produce a
+
+	work containing portions of the Library, and distribute that work
+
+	under terms of your choice, provided that the terms permit
+
+	modification of the work for the customer's own use and reverse
+
+	engineering for debugging such modifications.
+
+
+
+	You must give prominent notice with each copy of the work that the
+
+	Library is used in it and that the Library and its use are covered by
+
+	this License.  You must supply a copy of this License.  If the work
+
+	during execution displays copyright notices, you must include the
+
+	copyright notice for the Library among them, as well as a reference
+
+	directing the user to the copy of this License.  Also, you must do one
+
+	of these things:
+
+
+
+	a) Accompany the work with the complete corresponding
+
+	machine-readable source code for the Library including whatever
+
+	changes were used in the work (which must be distributed under
+
+	Sections 1 and 2 above); and, if the work is an executable linked
+
+	with the Library, with the complete machine-readable "work that
+
+	uses the Library", as object code and/or source code, so that the
+
+	user can modify the Library and then relink to produce a modified
+
+	executable containing the modified Library.  (It is understood
+
+	that the user who changes the contents of definitions files in the
+
+	Library will not necessarily be able to recompile the application
+
+	to use the modified definitions.)
+
+
+
+	b) Use a suitable shared library mechanism for linking with the
+
+	Library.  A suitable mechanism is one that (1) uses at run time a
+
+	copy of the library already present on the user's computer system,
+
+	rather than copying library functions into the executable, and (2)
+
+	will operate properly with a modified version of the library, if
+
+	the user installs one, as long as the modified version is
+
+	interface-compatible with the version that the work was made with.
+
+
+
+	c) Accompany the work with a written offer, valid for at
+
+	least three years, to give the same user the materials
+
+	specified in Subsection 6a, above, for a charge no more
+
+	than the cost of performing this distribution.
+
+
+
+	d) If distribution of the work is made by offering access to copy
+
+	from a designated place, offer equivalent access to copy the above
+
+	specified materials from the same place.
+
+
+
+	e) Verify that the user has already received a copy of these
+
+	materials or that you have already sent this user a copy.
+
+
+
+	For an executable, the required form of the "work that uses the
+
+	Library" must include any data and utility programs needed for
+
+	reproducing the executable from it.  However, as a special exception,
+
+	the materials to be distributed need not include anything that is
+
+	normally distributed (in either source or binary form) with the major
+
+	components (compiler, kernel, and so on) of the operating system on
+
+	which the executable runs, unless that component itself accompanies
+
+	the executable.
+
+
+
+	It may happen that this requirement contradicts the license
+
+	restrictions of other proprietary libraries that do not normally
+
+	accompany the operating system.  Such a contradiction means you cannot
+
+	use both them and the Library together in an executable that you
+
+	distribute.
+
+
+
+	7. You may place library facilities that are a work based on the
+
+	Library side-by-side in a single library together with other library
+
+	facilities not covered by this License, and distribute such a combined
+
+	library, provided that the separate distribution of the work based on
+
+	the Library and of the other library facilities is otherwise
+
+	permitted, and provided that you do these two things:
+
+
+
+	a) Accompany the combined library with a copy of the same work
+
+	based on the Library, uncombined with any other library
+
+	facilities.  This must be distributed under the terms of the
+
+	Sections above.
+
+
+
+	b) Give prominent notice with the combined library of the fact
+
+	that part of it is a work based on the Library, and explaining
+
+	where to find the accompanying uncombined form of the same work.
+
+
+
+	8. You may not copy, modify, sublicense, link with, or distribute
+
+	the Library except as expressly provided under this License.  Any
+
+	attempt otherwise to copy, modify, sublicense, link with, or
+
+	distribute the Library is void, and will automatically terminate your
+
+	rights under this License.  However, parties who have received copies,
+
+	or rights, from you under this License will not have their licenses
+
+	terminated so long as such parties remain in full compliance.
+
+
+
+	9. You are not required to accept this License, since you have not
+
+	signed it.  However, nothing else grants you permission to modify or
+
+	distribute the Library or its derivative works.  These actions are
+
+	prohibited by law if you do not accept this License.  Therefore, by
+
+	modifying or distributing the Library (or any work based on the
+
+	Library), you indicate your acceptance of this License to do so, and
+
+	all its terms and conditions for copying, distributing or modifying
+
+	the Library or works based on it.
+
+
+
+	10. Each time you redistribute the Library (or any work based on the
+
+	Library), the recipient automatically receives a license from the
+
+	original licensor to copy, distribute, link with or modify the Library
+
+	subject to these terms and conditions.  You may not impose any further
+
+	restrictions on the recipients' exercise of the rights granted herein.
+
+	You are not responsible for enforcing compliance by third parties with
+
+	this License.
+
+
+
+	11. If, as a consequence of a court judgment or allegation of patent
+
+	infringement or for any other reason (not limited to patent issues),
+
+	conditions are imposed on you (whether by court order, agreement or
+
+	otherwise) that contradict the conditions of this License, they do not
+
+	excuse you from the conditions of this License.  If you cannot
+
+	distribute so as to satisfy simultaneously your obligations under this
+
+	License and any other pertinent obligations, then as a consequence you
+
+	may not distribute the Library at all.  For example, if a patent
+
+	license would not permit royalty-free redistribution of the Library by
+
+	all those who receive copies directly or indirectly through you, then
+
+	the only way you could satisfy both it and this License would be to
+
+	refrain entirely from distribution of the Library.
+
+
+
+	If any portion of this section is held invalid or unenforceable under any
+
+	particular circumstance, the balance of the section is intended to apply,
+
+	and the section as a whole is intended to apply in other circumstances.
+
+
+
+	It is not the purpose of this section to induce you to infringe any
+
+	patents or other property right claims or to contest validity of any
+
+	such claims; this section has the sole purpose of protecting the
+
+	integrity of the free software distribution system which is
+
+	implemented by public license practices.  Many people have made
+
+	generous contributions to the wide range of software distributed
+
+	through that system in reliance on consistent application of that
+
+	system; it is up to the author/donor to decide if he or she is willing
+
+	to distribute software through any other system and a licensee cannot
+
+	impose that choice.
+
+
+
+	This section is intended to make thoroughly clear what is believed to
+
+	be a consequence of the rest of this License.
+
+
+
+	12. If the distribution and/or use of the Library is restricted in
+
+	certain countries either by patents or by copyrighted interfaces, the
+
+	original copyright holder who places the Library under this License may
+
+	add an explicit geographical distribution limitation excluding those
+
+	countries, so that distribution is permitted only in or among countries
+
+	not thus excluded.  In such case, this License incorporates the
+
+	limitation as if written in the body of this License.
+
+
+
+	13. The Free Software Foundation may publish revised and/or new
+
+	versions of the Lesser General Public License from time to time.
+
+	Such new versions will be similar in spirit to the present version,
+
+	but may differ in detail to address new problems or concerns.
+
+
+
+	Each version is given a distinguishing version number.  If the Library
+
+	specifies a version number of this License which applies to it and
+
+	"any later version", you have the option of following the terms and
+
+	conditions either of that version or of any later version published by
+
+	the Free Software Foundation.  If the Library does not specify a
+
+	license version number, you may choose any version ever published by
+
+	the Free Software Foundation.
+
+
+
+	14. If you wish to incorporate parts of the Library into other free
+
+	programs whose distribution conditions are incompatible with these,
+
+	write to the author to ask for permission.  For software which is
+
+	copyrighted by the Free Software Foundation, write to the Free
+
+	Software Foundation; we sometimes make exceptions for this.  Our
+
+	decision will be guided by the two goals of preserving the free status
+
+	of all derivatives of our free software and of promoting the sharing
+
+	and reuse of software generally.
+
+
+
+	NO WARRANTY
+
+
+
+	15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+
+	WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+
+	EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+
+	OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+
+	KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+
+	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+
+	PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+
+	LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+
+	THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+
+
+	16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+
+	WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+
+	AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+
+	FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+
+	CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+
+	LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+
+	RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+
+	FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+
+	SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+
+	DAMAGES.
+
+
+
+	END OF TERMS AND CONDITIONS
+
+
+
+	How to Apply These Terms to Your New Libraries
+
+
+
+	If you develop a new library, and you want it to be of the greatest
+
+	possible use to the public, we recommend making it free software that
+
+	everyone can redistribute and change.  You can do so by permitting
+
+	redistribution under these terms (or, alternatively, under the terms of the
+
+	ordinary General Public License).
+
+
+
+	To apply these terms, attach the following notices to the library.  It is
+
+	safest to attach them to the start of each source file to most effectively
+
+	convey the exclusion of warranty; and each file should have at least the
+
+	"copyright" line and a pointer to where the full notice is found.
+
+
+
+	<one line to give the library's name and a brief idea of what it does.>
+
+	Copyright (C) <year>  <name of author>
+
+
+
+	This library is free software; you can redistribute it and/or
+
+	modify it under the terms of the GNU Lesser General Public
+
+	License as published by the Free Software Foundation; either
+
+	version 2.1 of the License, or (at your option) any later version.
+
+
+
+	This library is distributed in the hope that it will be useful,
+
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+
+	Lesser General Public License for more details.
+
+
+
+	You should have received a copy of the GNU Lesser General Public
+
+	License along with this library; if not, write to the Free Software
+
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+
+	Also add information on how to contact you by electronic and paper mail.
+
+
+
+	You should also get your employer (if you work as a programmer) or your
+
+	school, if any, to sign a "copyright disclaimer" for the library, if
+
+	necessary.  Here is a sample; alter the names:
+
+
+
+	Yoyodyne, Inc., hereby disclaims all copyright interest in the
+
+	library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+
+
+	<signature of Ty Coon>, 1 April 1990
+
+	Ty Coon, President of Vice
+
+
+
+	That's all there is to it!
+
+
+
+  --$Id: LICENSE,v 1.3 2003/11/06 18:18:06 hlellelid Exp $
+
+
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.prado
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.prado	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.prado	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,28 @@
+Copyright 2004-2006, The PRADO Group (http://www.pradosoft.com)
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+- Neither the name of the PRADO Group nor the names of its contributors
+may be used to endorse or promote products derived from this software
+without specific prior written permission.
+
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Added: prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.prototype
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.prototype	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.prototype	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,17 @@
+Copyright (c) 2005 Sam Stephenson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+

Added: prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.script.aculo.us
===================================================================
--- prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.script.aculo.us	2007-02-26 20:19:57 UTC (rev 4310)
+++ prosistem/alba/trunk/dist/symfony-1.0.0/licenses/LICENSE.script.aculo.us	2007-02-26 20:16:50 UTC (rev 4311)
@@ -0,0 +1,20 @@
+Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file




Más información sobre la lista de distribución Alba-desarrollo